diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05f6972 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +*.a +libmsp430.so diff --git a/Bios/FET_Bios.ewd b/Bios/FET_Bios.ewd new file mode 100644 index 0000000..083d57f --- /dev/null +++ b/Bios/FET_Bios.ewd @@ -0,0 +1,739 @@ + + + + 2 + + eZ_FET_DCDC_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + MSP_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/FET_Bios.ewp b/Bios/FET_Bios.ewp new file mode 100644 index 0000000..dd1eda3 --- /dev/null +++ b/Bios/FET_Bios.ewp @@ -0,0 +1,2165 @@ + + + + 2 + + eZ_FET_DCDC_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetCore + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + MSP_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetCore + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + Bios + + $PROJ_DIR$\src\fw\fet\bios.c + + + $PROJ_DIR$\src\fw\fet\stream.c + + + $PROJ_DIR$\src\fw\fet\v3_0p.c + + + $PROJ_DIR$\src\fw\fet\v3_0p_hw_fet.c + + + + config + + $PROJ_DIR$\config\Bios_lnk430F5528.xcl + + MSP_FET_Debug + + + + $PROJ_DIR$\config\Bios_lnk430F6638.xcl + + eZ_FET_DCDC_Debug + + + + + FetIcc + + $PROJ_DIR$\src\fw\fet\FetIcc\eZ_FET_IccMonitor.c + + MSP_FET_Debug + + + + $PROJ_DIR$\src\fw\fet\FetIcc\MSP_FET_IccMonitor.c + + eZ_FET_DCDC_Debug + + + + + FetInit + + $PROJ_DIR$\src\fw\fet\FetInit\eZ_FET_init.c + + MSP_FET_Debug + + + + $PROJ_DIR$\src\fw\fet\FetInit\Fet_initClock.c + + + $PROJ_DIR$\src\fw\fet\FetInit\MSP_FET_init.c + + eZ_FET_DCDC_Debug + + + + + USB + + F5xx_F6xx_Core_Lib + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_FLASH.c + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_FLASH.h + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\hal_macros.h + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_PMAP.c + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_PMAP.h + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_PMM.c + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_PMM.h + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_TLV.c + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_TLV.h + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_UCS.c + + + $PROJ_DIR$\src\fw\fet\F5xx_F6xx_Core_Lib\HAL_UCS.h + + + + USB_Common + + USB_API + + USB_CDC_API + + $PROJ_DIR$\src\fw\fet\USB_API\USB_CDC_API\UsbCdc.c + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_CDC_API\UsbCdc.h + + + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\defMSP430USB.h + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\device.h + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\dma.c + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\types.h + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\usb.c + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\usb.h + + + $PROJ_DIR$\src\fw\fet\USB_API\USB_Common\UsbIsr.h + + + + USB_config + + $PROJ_DIR$\src\fw\fet\USB_config\descriptors.c + + + $PROJ_DIR$\src\fw\fet\USB_config\descriptors.h + + + $PROJ_DIR$\src\fw\fet\USB_config\UsbIsr.c + + + + $PROJ_DIR$\src\fw\fet\FetUsb.h + + + $PROJ_DIR$\src\fw\fet\usbConstructs.c + + + $PROJ_DIR$\src\fw\fet\usbConstructs.h + + + $PROJ_DIR$\src\fw\fet\usbEventHandling.c + + + $PROJ_DIR$\src\fw\fet\usbMain.c + + + + $PROJ_DIR$\src\fw\fet\Fet_cStartUp\cstartup.s43 + + + $PROJ_DIR$\src\fw\fet\cstartup_Hal.s43 + + MSP_FET_Debug + + + + $PROJ_DIR$\src\fw\fet\main.c + + + + diff --git a/Bios/FET_ComChannel.ewd b/Bios/FET_ComChannel.ewd new file mode 100644 index 0000000..03126b5 --- /dev/null +++ b/Bios/FET_ComChannel.ewd @@ -0,0 +1,739 @@ + + + + 2 + + MSP_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + eZ_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/FET_ComChannel.ewp b/Bios/FET_ComChannel.ewp new file mode 100644 index 0000000..bfa4ec6 --- /dev/null +++ b/Bios/FET_ComChannel.ewp @@ -0,0 +1,2038 @@ + + + + 2 + + MSP_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetComChannel + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + eZ_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetComChannel + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + ComChannel + + Bsl + + eZ_FET_Debug + + + I2C + + $PROJ_DIR$\src\uart\BSL\I2C\I2C.c + + + $PROJ_DIR$\src\uart\BSL\I2C\I2C.h + + + + $PROJ_DIR$\src\uart\BSL\FetBsl.c + + + $PROJ_DIR$\src\uart\BSL\FetBslI2c.c + + + + ComBase + + $PROJ_DIR$\src\uart\ComBase\COM_Base.c + + + + Uart + + $PROJ_DIR$\src\uart\Uart\FetUart.c + + + + + config + + $PROJ_DIR$\config\ComChannel_Ink430F5528.xcl + + MSP_FET_Debug + + + + $PROJ_DIR$\config\ComChannel_Ink430F6638.xcl + + eZ_FET_Debug + + + + + $PROJ_DIR$\src\uart\cstartup_uart.s43 + + + $PROJ_DIR$\src\uart\FetCom.h + + + + diff --git a/Bios/FET_DCDC.ewd b/Bios/FET_DCDC.ewd new file mode 100644 index 0000000..65bdaf9 --- /dev/null +++ b/Bios/FET_DCDC.ewd @@ -0,0 +1,739 @@ + + + + 2 + + MSP_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + eZ_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/FET_DCDC.ewp b/Bios/FET_DCDC.ewp new file mode 100644 index 0000000..797cb33 --- /dev/null +++ b/Bios/FET_DCDC.ewp @@ -0,0 +1,1991 @@ + + + + 2 + + MSP_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetDcdc + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + eZ_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetDcdc + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + config + + $PROJ_DIR$\config\Dcdc_lnk430F5528.xcl + + MSP_FET_Debug + + + + $PROJ_DIR$\config\Dcdc_lnk430F6638.xcl + + eZ_FET_Debug + + + + + DCDC + + $PROJ_DIR$\src\dcdc\FetDcdc.c + + + + $PROJ_DIR$\src\dcdc\cstartup_dcdc.s43 + + + + diff --git a/Bios/FET_Hal.ewd b/Bios/FET_Hal.ewd new file mode 100644 index 0000000..f0916bb --- /dev/null +++ b/Bios/FET_Hal.ewd @@ -0,0 +1,739 @@ + + + + 2 + + MSP_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + eZ_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/FET_Hal.ewp b/Bios/FET_Hal.ewp new file mode 100644 index 0000000..b376cc7 --- /dev/null +++ b/Bios/FET_Hal.ewp @@ -0,0 +1,2900 @@ + + + + 2 + + MSP_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetHal + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + eZ_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetHal + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + Config + + $PROJ_DIR$\config\hal_lnk430F5528.xcl + + MSP_FET_Debug + + + + $PROJ_DIR$\config\hal_lnk430F6638.xcl + + eZ_FET_Debug + + + + + Hal + + MSP430 + + $PROJ_DIR$\src\hal\macros\BitSequence.c + + + $PROJ_DIR$\src\hal\macros\BlowFuse.c + + + $PROJ_DIR$\src\hal\macros\Configure.c + + + $PROJ_DIR$\src\hal\macros\EemDataExchange.c + + + $PROJ_DIR$\src\hal\macros\EemDataExchangeAFE2xx.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFunclet.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFuncletJtag.c + + + $PROJ_DIR$\src\hal\macros\GetDcoFrequency.c + + + $PROJ_DIR$\src\hal\macros\GetDeviceIdPtr.c + + + $PROJ_DIR$\src\hal\macros\GetInterfaceMode.c + + + $PROJ_DIR$\src\hal\macros\GetJtagId.c + + + $PROJ_DIR$\src\hal\macros\GetNumOfDevices.c + + + $PROJ_DIR$\src\hal\macros\HilCommand.c + + + $PROJ_DIR$\src\hal\macros\IsJtagFuseBlown.c + + + $PROJ_DIR$\src\hal\macros\MagicPattern.c + + + $PROJ_DIR$\src\hal\macros\PollJStateReg430I.c + + + $PROJ_DIR$\src\hal\macros\Psa.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegs.c + + + $PROJ_DIR$\src\hal\macros\ReadMemBytes.c + + + $PROJ_DIR$\src\hal\macros\ReadMemQuick.c + + + $PROJ_DIR$\src\hal\macros\ReadMemWords.c + + + $PROJ_DIR$\src\hal\macros\Reset430I.c + + + $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtag.c + + + $PROJ_DIR$\src\hal\macros\SetChainConfiguration.c + + + $PROJ_DIR$\src\hal\macros\SetDeviceChainInfo.c + + + $PROJ_DIR$\src\hal\macros\SingleStep.c + + + $PROJ_DIR$\src\hal\macros\StartJtag.c + + + $PROJ_DIR$\src\hal\macros\StartJtagActivationCode.c + + + $PROJ_DIR$\src\hal\macros\StopJtag.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContext.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContext.c + + + $PROJ_DIR$\src\hal\macros\UnlockC092.c + + + $PROJ_DIR$\src\hal\macros\WaitForEem.c + + + $PROJ_DIR$\src\hal\macros\WaitForStorage.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegs.c + + + $PROJ_DIR$\src\hal\macros\WriteMemBytes.c + + + $PROJ_DIR$\src\hal\macros\WriteMemWords.c + + + + MSP430X + + $PROJ_DIR$\src\hal\macros\EemDataExchangeX.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFuncletX.c + + + $PROJ_DIR$\src\hal\macros\PsaX.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsX.c + + + $PROJ_DIR$\src\hal\macros\ReadMemBytesX.c + + + $PROJ_DIR$\src\hal\macros\ReadMemQuickX.c + + + $PROJ_DIR$\src\hal\macros\ReadMemWordsX.c + + + $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtagX.c + + + $PROJ_DIR$\src\hal\macros\SingleStepX.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContextX.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContextX.c + + + $PROJ_DIR$\src\hal\macros\WaitForStorageX.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsX.c + + + $PROJ_DIR$\src\hal\macros\WriteMemBytesX.c + + + $PROJ_DIR$\src\hal\macros\WriteMemWordsX.c + + + + MSP430Xv2 + + $PROJ_DIR$\src\hal\macros\BlowFuseFram.c + + + $PROJ_DIR$\src\hal\macros\BlowFuseXv2.c + + + $PROJ_DIR$\src\hal\macros\EemDataExchangeXv2.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFuncletXv2.c + + + $PROJ_DIR$\src\hal\macros\LeaSyncConditional.c + + + $PROJ_DIR$\src\hal\macros\PollJStateReg.c + + + $PROJ_DIR$\src\hal\macros\PollJStateRegFR57xx.c + + + $PROJ_DIR$\src\hal\macros\PsaXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadMemBytesXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadMemQuickXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadMemWordsXv2.c + + + $PROJ_DIR$\src\hal\macros\ResetXv2.c + + + $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtagXv2.c + + + $PROJ_DIR$\src\hal\macros\SendJtagMailboxXv2.c + + + $PROJ_DIR$\src\hal\macros\SingleStepJState.c + + + $PROJ_DIR$\src\hal\macros\SingleStepXv2.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContextXv2.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContextXv2.c + + + $PROJ_DIR$\src\hal\macros\UnlockDeviceXv2.c + + + $PROJ_DIR$\src\hal\macros\UssSyncConditional.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsXv2.c + + MSP_FET_Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\WriteFramQuickXv2.c + + + $PROJ_DIR$\src\hal\macros\WriteMemBytesXv2.c + + + $PROJ_DIR$\src\hal\macros\WriteMemWordsXv2.c + + + + MSP432 + + $PROJ_DIR$\src\hal\macros\DisableDebugArm.c + + + $PROJ_DIR$\src\hal\macros\EnableDebugArm.c + + + $PROJ_DIR$\src\hal\macros\GetCpuIdArm.c + + + $PROJ_DIR$\src\hal\macros\GetInterfaceModeArm.c + + + $PROJ_DIR$\src\hal\macros\GetJtagIdCodeArm.c + + + $PROJ_DIR$\src\hal\macros\HaltArm.c + + + $PROJ_DIR$\src\hal\macros\MemApTransactionArm.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsArm.c + + + $PROJ_DIR$\src\hal\macros\ResetArm.c + + + $PROJ_DIR$\src\hal\macros\RunArm.c + + + $PROJ_DIR$\src\hal\macros\ScanApArm.c + + + $PROJ_DIR$\src\hal\macros\SingleStepArm.c + + + $PROJ_DIR$\src\hal\macros\WaitForDebugHaltArm.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsArm.c + + + MSP_FET_Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hil\edt.c + + + $PROJ_DIR$\src\fw\fet\hal.c + + + $PROJ_DIR$\src\fw\fet\HalGlobalVars.c + + + $PROJ_DIR$\src\fw\fet\halMain.c + + + + $PROJ_DIR$\src\fw\fet\cstartup_Hal.s43 + + + + diff --git a/Bios/FetDcdcController.ewd b/Bios/FetDcdcController.ewd new file mode 100644 index 0000000..3354911 --- /dev/null +++ b/Bios/FetDcdcController.ewd @@ -0,0 +1,1471 @@ + + + + 2 + + eZ_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + MSP_FET_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + MSP_FET2x_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + eZ_FETV2x_Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/FetDcdcController.ewp b/Bios/FetDcdcController.ewp new file mode 100644 index 0000000..5c1e473 --- /dev/null +++ b/Bios/FetDcdcController.ewp @@ -0,0 +1,3950 @@ + + + + 2 + + eZ_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetDcdcController + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + MSP_FET_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetDcdcController + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + MSP_FET2x_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetDcdcControllerV2x + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + eZ_FETV2x_Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetDcdcControllerV2x + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\src\fw\fet\EnergyTrace_TSPA\VCC_Current.c + + + + diff --git a/Bios/MSP-FET_Bios.eww b/Bios/MSP-FET_Bios.eww new file mode 100644 index 0000000..4593fec --- /dev/null +++ b/Bios/MSP-FET_Bios.eww @@ -0,0 +1,43 @@ + + + + + $WS_DIR$\FET_Bios.ewp + + + $WS_DIR$\FET_ComChannel.ewp + + + $WS_DIR$\FET_DCDC.ewp + + + $WS_DIR$\FET_Hal.ewp + + + $WS_DIR$\FetDcdcController.ewp + + + $WS_DIR$\MSP-FET_Hil.ewp + + + + All + + eZ-FetHil + Debug + + + FetDCDC + Debug + + + NgUifBios + Debug + + + NgUifHal + Debug + + + + diff --git a/Bios/MSP-FET_FpgaUpdate.ewd b/Bios/MSP-FET_FpgaUpdate.ewd new file mode 100644 index 0000000..9e3e326 --- /dev/null +++ b/Bios/MSP-FET_FpgaUpdate.ewd @@ -0,0 +1,373 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/MSP-FET_FpgaUpdate.ewp b/Bios/MSP-FET_FpgaUpdate.ewp new file mode 100644 index 0000000..a5cb2ce --- /dev/null +++ b/Bios/MSP-FET_FpgaUpdate.ewp @@ -0,0 +1,1058 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetFpgaHal + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + config + + $PROJ_DIR$\config\hal_lnk430F6638.xcl + + Debug + + + + $PROJ_DIR$\config\hal_lnk430F6638fpga.xcl + + + + DirectC + + $PROJ_DIR$\src\fpga_update\DirectC\dpalg.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpchain.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpcom.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpcore.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpdef.h + + + $PROJ_DIR$\src\fpga_update\DirectC\dpfrom.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpjtag.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpnvm.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpsecurity.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpuser.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dpuser.h + + + $PROJ_DIR$\src\fpga_update\DirectC\dputil.c + + + $PROJ_DIR$\src\fpga_update\DirectC\dputil.h + + + + $PROJ_DIR$\src\fpga_update\cstartup_FpgaUpdate.s43 + + + $PROJ_DIR$\src\fpga_update\FpgaBitstream.h + + + $PROJ_DIR$\src\fpga_update\FpgaUpdate.c + + + + diff --git a/Bios/MSP-FET_Hil.ewd b/Bios/MSP-FET_Hil.ewd new file mode 100644 index 0000000..0ceb126 --- /dev/null +++ b/Bios/MSP-FET_Hil.ewd @@ -0,0 +1,373 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/MSP-FET_Hil.ewp b/Bios/MSP-FET_Hil.ewp new file mode 100644 index 0000000..504ea25 --- /dev/null +++ b/Bios/MSP-FET_Hil.ewp @@ -0,0 +1,1053 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ MSP_FetHil + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + config + + $PROJ_DIR$\config\Hil_lnk430F6638 .xcl + + + + Hil + + $PROJ_DIR$\src\hil\msp_fet\arch.h + + + $PROJ_DIR$\src\hil\msp_fet\archFpga.h + + + $PROJ_DIR$\src\hil\msp_fet\hil.c + + + $PROJ_DIR$\src\hil\fet_generic\hil_2wDma.c + + + $PROJ_DIR$\src\hil\fet_generic\hil_4w.c + + + $PROJ_DIR$\src\hil\fet_generic\hil_generic.c + + + $PROJ_DIR$\src\hil\fet_generic\hil_generic432.c + + + $PROJ_DIR$\src\hil\fet_generic\hil_Swd432.c + + + $PROJ_DIR$\src\hil\msp_fet\hilAdcControl.c + + + $PROJ_DIR$\src\hil\msp_fet\hilDacControl.c + + + $PROJ_DIR$\src\hil\msp_fet\hilDelays.c + + + $PROJ_DIR$\src\hil\msp_fet\hilDelays.h + + + $PROJ_DIR$\src\hil\msp_fet\hilFpgaAccess.c + + + + $EW_DIR$\430\inc\cfi.m43 + + + $PROJ_DIR$\src\hil\ez_fet\cstartup_hil.s43 + + + + diff --git a/Bios/SafeCore.ewd b/Bios/SafeCore.ewd index b460884..c0d512a 100644 --- a/Bios/SafeCore.ewd +++ b/Bios/SafeCore.ewd @@ -12,7 +12,7 @@ C-SPY 4 - 24 + 25 1 1 + + + + + + 430FET 1 - 21 + 23 1 1 + + @@ -290,10 +322,30 @@ $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin 1 + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin 0 + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin 0 @@ -311,16 +363,12 @@ 0 - $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin 1 - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 diff --git a/Bios/SafeCore.ewp b/Bios/SafeCore.ewp index 2c5ea21..0454f58 100644 --- a/Bios/SafeCore.ewp +++ b/Bios/SafeCore.ewp @@ -10,9 +10,9 @@ 1 General - 7 + 12 - 27 + 28 1 1 - + + ICC430 4 - 29 + 35 1 1 - + + + + + + + + + + + + + + + A430 - 4 + 5 - 13 + 14 1 1 + @@ -579,7 +643,7 @@ XLINK 4 - 22 + 23 1 1 + @@ -877,6 +946,36 @@ + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + BILINK 0 diff --git a/Bios/UifBiosCore.ewd b/Bios/UifBiosCore.ewd index c946b94..6af9579 100644 --- a/Bios/UifBiosCore.ewd +++ b/Bios/UifBiosCore.ewd @@ -12,7 +12,7 @@ C-SPY 4 - 24 + 25 1 1 - - - - 430FET - 1 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SIM430 - 1 - - 4 - 1 - 1 - - - - - - - - - - - $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - - - - - Release COM-IRQ - - MSP430 - - 0 - - C-SPY - 4 - - 24 - 1 - 0 - - - - - - - - - - - - - - - - - - - 430FET 1 - 21 + 23 1 - 0 + 1 + + @@ -584,7 +290,7 @@ 4 1 - 0 + 1 - BILINK - 0 - - - - - Release COM-IRQ - - MSP430 - - 0 - - General - 7 + ULP430 + 1 - 27 + 1 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 - - - - - ICC430 - 4 - - 29 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A430 - 4 - - 13 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - $PROJ_DIR$\tools\uifbioscorePostBuild.bat $PROJ_DIR$ - - - - XLINK - 4 - - 22 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - XAR - 4 - - 0 - 1 - 0 - - - - - BILINK 0 @@ -1786,15 +1004,18 @@ $PROJ_DIR$\src\fw\uifv1\main.c - $PROJ_DIR$\src\fw\stream.c + $PROJ_DIR$\src\fw\uifv1\stream.c - $PROJ_DIR$\src\fw\v3_0p.c + $PROJ_DIR$\src\fw\uifv1\v3_0p.c $PROJ_DIR$\src\fw\uifv1\v3_0p_hw_uif.c + + $PROJ_DIR$\src\fw\uifv1\uifVersion.h + diff --git a/Bios/UifHal.ewd b/Bios/UifHal.ewd index d4eb9ff..d5f1c32 100644 --- a/Bios/UifHal.ewd +++ b/Bios/UifHal.ewd @@ -12,7 +12,7 @@ C-SPY 4 - 24 + 25 1 1 - - - - 430FET - 1 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SIM430 - 1 - - 4 - 1 - 1 - - - - - - - - - $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin - 1 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - - - - - Release - - MSP430 - - 0 - - C-SPY - 4 - - 24 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - 430FET 1 - 21 + 23 1 - 0 + 1 + + @@ -584,7 +290,7 @@ 4 1 - 0 + 1 - - Release - - MSP430 - - 0 - - General - 7 - - 27 - 1 - 0 - - - - + + ICC430 4 - 29 + 35 1 - 0 + 1 - + + + + + + + + + + + + + + + A430 - 4 + 5 - 13 + 14 1 - 0 + 1 + @@ -1464,16 +645,16 @@ 1 - $PROJ_DIR$\tools\uifhalPostBuild.bat $PROJ_DIR$ + "$PROJ_DIR$\tools\convertEzFetTxt.bat" "$PROJ_DIR$" UifHal XLINK 4 - 22 + 23 1 - 0 + 1 + @@ -1754,7 +940,7 @@ 0 1 - 0 + 1 + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + BILINK 0 @@ -1784,1657 +1004,94 @@ Hal - MSP430 - - $PROJ_DIR$\src\hal\macros\BitSequence.c - - - $PROJ_DIR$\src\hal\macros\BlowFuse.c - - - $PROJ_DIR$\src\hal\macros\Configure.c - - - $PROJ_DIR$\src\hal\macros\EemDataExchange.c - - - $PROJ_DIR$\src\hal\macros\EemDataExchangeAFE2xx.c - - - $PROJ_DIR$\src\hal\macros\ExecuteFunclet.c - - - $PROJ_DIR$\src\hal\macros\ExecuteFuncletJtag.c - - - $PROJ_DIR$\src\hal\macros\GetDcoFrequency.c - - - $PROJ_DIR$\src\hal\macros\GetInterfaceMode.c - - - $PROJ_DIR$\src\hal\macros\GetJtagId.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\src\hal\macros\GetNumOfDevices.c - - - $PROJ_DIR$\src\hal\macros\HilCommand.c - - - $PROJ_DIR$\src\hal\macros\IsJtagFuseBlown.c - - - $PROJ_DIR$\src\hal\macros\MagicPattern.c - - - $PROJ_DIR$\src\hal\macros\Psa.c - - - $PROJ_DIR$\src\hal\macros\ReadAllCpuRegs.c - - - $PROJ_DIR$\src\hal\macros\ReadMemBytes.c - - - $PROJ_DIR$\src\hal\macros\ReadMemQuick.c - - - $PROJ_DIR$\src\hal\macros\ReadMemWords.c - - - $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtag.c - - - $PROJ_DIR$\src\hal\macros\SetChainConfiguration.c - - - $PROJ_DIR$\src\hal\macros\SetDeviceChainInfo.c - - - $PROJ_DIR$\src\hal\macros\SingleStep.c - - - $PROJ_DIR$\src\hal\macros\StartJtag.c - - - $PROJ_DIR$\src\hal\macros\StartJtagActivationCode.c - - - $PROJ_DIR$\src\hal\macros\StopJtag.c - - - $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContext.c - - - $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContext.c - - - $PROJ_DIR$\src\hal\macros\UnlockC092.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\src\hal\macros\WaitForEem.c - - - $PROJ_DIR$\src\hal\macros\WaitForStorage.c - - - $PROJ_DIR$\src\hal\macros\WriteAllCpuRegs.c - - - $PROJ_DIR$\src\hal\macros\WriteMemBytes.c - - - $PROJ_DIR$\src\hal\macros\WriteMemWords.c - - - - MSP430X + MSP432 - $PROJ_DIR$\src\hal\macros\EemDataExchangeX.c + $PROJ_DIR$\src\hal\macros\DisableDebugArm.c - $PROJ_DIR$\src\hal\macros\ExecuteFuncletX.c + $PROJ_DIR$\src\hal\macros\EnableDebugArm.c - $PROJ_DIR$\src\hal\macros\PsaX.c + $PROJ_DIR$\src\hal\macros\GetCpuIdArm.c - $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsX.c + $PROJ_DIR$\src\hal\macros\GetJtagIdCodeArm.c - $PROJ_DIR$\src\hal\macros\ReadMemBytesX.c + $PROJ_DIR$\src\hal\macros\HaltArm.c - $PROJ_DIR$\src\hal\macros\ReadMemQuickX.c + $PROJ_DIR$\src\hal\macros\MemApTransactionArm.c - $PROJ_DIR$\src\hal\macros\ReadMemWordsX.c + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsArm.c - $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtagX.c + $PROJ_DIR$\src\hal\macros\ResetArm.c - $PROJ_DIR$\src\hal\macros\SingleStepX.c + $PROJ_DIR$\src\hal\macros\RunArm.c - $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContextX.c + $PROJ_DIR$\src\hal\macros\ScanApArm.c - $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContextX.c + $PROJ_DIR$\src\hal\macros\SingleStepArm.c - $PROJ_DIR$\src\hal\macros\WaitForStorageX.c + $PROJ_DIR$\src\hal\macros\WaitForDebugHaltArm.c - $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsX.c - - - $PROJ_DIR$\src\hal\macros\WriteMemBytesX.c - - - $PROJ_DIR$\src\hal\macros\WriteMemWordsX.c + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsArm.c - MSP430Xv2 - - $PROJ_DIR$\src\hal\macros\BlowFuseFram.c - - - $PROJ_DIR$\src\hal\macros\BlowFuseXv2.c - - - $PROJ_DIR$\src\hal\macros\EemDataExchangeXv2.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\src\hal\macros\ExecuteFuncletXv2.c - - - $PROJ_DIR$\src\hal\macros\PollJStateReg.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\src\hal\macros\PollJStateRegFR57xx.c - + MSPGeneric - $PROJ_DIR$\src\hal\macros\PsaXv2.c - - - $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsXv2.c - - - $PROJ_DIR$\src\hal\macros\ReadMemBytesXv2.c - - - $PROJ_DIR$\src\hal\macros\ReadMemQuickXv2.c - - - $PROJ_DIR$\src\hal\macros\ReadMemWordsXv2.c - - - $PROJ_DIR$\src\hal\macros\ResetXv2.c - - - $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtagXv2.c - - - $PROJ_DIR$\src\hal\macros\SendJtagMailboxXv2.c - - - $PROJ_DIR$\src\hal\macros\SingleStepJState.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\src\hal\macros\SingleStepXv2.c + $PROJ_DIR$\src\hal\macros\BitSequence.c - $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContextXv2.c + $PROJ_DIR$\src\hal\macros\Configure.c - $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContextXv2.c + $PROJ_DIR$\src\hal\macros\DummyHal430.c - $PROJ_DIR$\src\hal\macros\UnlockDeviceXv2.c + $PROJ_DIR$\src\hal\macros\GetInterfaceMode.c - $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsXv2.c + $PROJ_DIR$\src\hal\macros\GetInterfaceModeArm.c - $PROJ_DIR$\src\hal\macros\WriteFramQuickXv2.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + $PROJ_DIR$\src\hal\macros\HilCommand.c - $PROJ_DIR$\src\hal\macros\WriteMemBytesXv2.c + $PROJ_DIR$\src\hal\macros\StartJtag.c - $PROJ_DIR$\src\hal\macros\WriteMemWordsXv2.c + $PROJ_DIR$\src\hal\macros\StopJtag.c - $PROJ_DIR$\src\hal\cstartup.s43 + $PROJ_DIR$\src\fw\uifv1\cstartup.s43 - $PROJ_DIR$\src\hal\hal.c + $PROJ_DIR$\src\hil\edt.c - $PROJ_DIR$\src\hal\HalGlobalVars.c + $PROJ_DIR$\src\fw\uifv1\hal432.c + + + $PROJ_DIR$\src\fw\uifv1\HalGlobalVars.h + + + $PROJ_DIR$\src\fw\uifv1\HalGlobalVars432.c + + + $PROJ_DIR$\src\fw\uifv1\halMain432.c + $PROJ_DIR$\src\fw\uifv1\HalGlobalVars.h - $PROJ_DIR$\src\hal\halMain.c @@ -3443,257 +1100,21 @@ $PROJ_DIR$\src\hil\uifv1\arch.h - $PROJ_DIR$\src\hil\uifv1\hil.c - - - $PROJ_DIR$\src\hil\uifv1\hil_2w.c + $PROJ_DIR$\src\hil\uifv1\hil432.c - $PROJ_DIR$\src\hil\uifv1\hil_4w.c + $PROJ_DIR$\src\hil\uifv1\hil_4w_432.c - $PROJ_DIR$\src\hil\uifv1\hil_jsbw.c + $PROJ_DIR$\src\hil\uifv1\hilDelays.c - $PROJ_DIR$\src\hil\uifv1\hilDelays.s43 + $PROJ_DIR$\src\hil\uifv1\hilGeneric.c - - Debug - - ICC430 - - 29 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + $PROJ_DIR$\src\fw\uifv1\uifVersion.h + diff --git a/Bios/UifHalMsp430.ewd b/Bios/UifHalMsp430.ewd new file mode 100644 index 0000000..eadec32 --- /dev/null +++ b/Bios/UifHalMsp430.ewd @@ -0,0 +1,373 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/UifHalMsp430.ewp b/Bios/UifHalMsp430.ewp new file mode 100644 index 0000000..e607983 --- /dev/null +++ b/Bios/UifHalMsp430.ewp @@ -0,0 +1,3389 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\tools\convertEzFetTxt.bat" "$PROJ_DIR$" UifHalMsp430 + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + Config + + $PROJ_DIR$\config\hal_lnk430F1612.xcl + + + + Hal + + MSP430 + + $PROJ_DIR$\src\hal\macros\BitSequence.c + + + $PROJ_DIR$\src\hal\macros\BlowFuse.c + + + $PROJ_DIR$\src\hal\macros\Configure.c + + + $PROJ_DIR$\src\hal\macros\DummyHal432.c + + + $PROJ_DIR$\src\hal\macros\EemDataExchange.c + + + $PROJ_DIR$\src\hal\macros\EemDataExchangeAFE2xx.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFunclet.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFuncletJtag.c + + + $PROJ_DIR$\src\hal\macros\GetDcoFrequency.c + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\GetDeviceIdPtr.c + + + $PROJ_DIR$\src\hal\macros\GetInterfaceMode.c + + + $PROJ_DIR$\src\hal\macros\GetJtagId.c + + + $PROJ_DIR$\src\hal\macros\GetNumOfDevices.c + + + $PROJ_DIR$\src\hal\macros\HilCommand.c + + + $PROJ_DIR$\src\hal\macros\IsJtagFuseBlown.c + + + $PROJ_DIR$\src\hal\macros\MagicPattern.c + + + $PROJ_DIR$\src\hal\macros\PollJStateReg430I.c + + + $PROJ_DIR$\src\hal\macros\Psa.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegs.c + + + $PROJ_DIR$\src\hal\macros\ReadMemBytes.c + + + $PROJ_DIR$\src\hal\macros\ReadMemQuick.c + + + $PROJ_DIR$\src\hal\macros\ReadMemWords.c + + + $PROJ_DIR$\src\hal\macros\Reset430I.c + + + $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtag.c + + + $PROJ_DIR$\src\hal\macros\SetChainConfiguration.c + + + $PROJ_DIR$\src\hal\macros\SetDeviceChainInfo.c + + + $PROJ_DIR$\src\hal\macros\SingleStep.c + + + $PROJ_DIR$\src\hal\macros\StartJtag.c + + + $PROJ_DIR$\src\hal\macros\StartJtagActivationCode.c + + + $PROJ_DIR$\src\hal\macros\StopJtag.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContext.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContext.c + + + $PROJ_DIR$\src\hal\macros\UnlockC092.c + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\WaitForEem.c + + + $PROJ_DIR$\src\hal\macros\WaitForStorage.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegs.c + + + $PROJ_DIR$\src\hal\macros\WriteMemBytes.c + + + $PROJ_DIR$\src\hal\macros\WriteMemWords.c + + + + MSP430X + + $PROJ_DIR$\src\hal\macros\EemDataExchangeX.c + + + $PROJ_DIR$\src\hal\macros\ExecuteFuncletX.c + + + $PROJ_DIR$\src\hal\macros\PsaX.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsX.c + + + $PROJ_DIR$\src\hal\macros\ReadMemBytesX.c + + + $PROJ_DIR$\src\hal\macros\ReadMemQuickX.c + + + $PROJ_DIR$\src\hal\macros\ReadMemWordsX.c + + + $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtagX.c + + + $PROJ_DIR$\src\hal\macros\SingleStepX.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContextX.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContextX.c + + + $PROJ_DIR$\src\hal\macros\WaitForStorageX.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsX.c + + + $PROJ_DIR$\src\hal\macros\WriteMemBytesX.c + + + $PROJ_DIR$\src\hal\macros\WriteMemWordsX.c + + + + MSP430Xv2 + + $PROJ_DIR$\src\hal\macros\BlowFuseFram.c + + + $PROJ_DIR$\src\hal\macros\BlowFuseXv2.c + + + $PROJ_DIR$\src\hal\macros\EemDataExchangeXv2.c + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\ExecuteFuncletXv2.c + + + $PROJ_DIR$\src\hal\macros\LeaSyncConditional.c + + + $PROJ_DIR$\src\hal\macros\PollJStateReg.c + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\PollJStateRegFR57xx.c + + + $PROJ_DIR$\src\hal\macros\PsaXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadAllCpuRegsXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadMemBytesXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadMemQuickXv2.c + + + $PROJ_DIR$\src\hal\macros\ReadMemWordsXv2.c + + + $PROJ_DIR$\src\hal\macros\ResetXv2.c + + + $PROJ_DIR$\src\hal\macros\RestoreContext_ReleaseJtagXv2.c + + + $PROJ_DIR$\src\hal\macros\SendJtagMailboxXv2.c + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\SingleStepJState.c + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\src\hal\macros\SingleStepXv2.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_AssertPor_SaveContextXv2.c + + + $PROJ_DIR$\src\hal\macros\SyncJtag_Conditional_SaveContextXv2.c + + + $PROJ_DIR$\src\hal\macros\UnlockDeviceXv2.c + + + $PROJ_DIR$\src\hal\macros\UssSyncConditional.c + + + $PROJ_DIR$\src\hal\macros\WriteAllCpuRegsXv2.c + + + $PROJ_DIR$\src\hal\macros\WriteFramQuickXv2.c + + + $PROJ_DIR$\src\hal\macros\WriteMemBytesXv2.c + + + $PROJ_DIR$\src\hal\macros\WriteMemWordsXv2.c + + + + $PROJ_DIR$\src\fw\uifv1\cstartup.s43 + + + $PROJ_DIR$\src\hil\edt.c + + + $PROJ_DIR$\src\fw\uifv1\hal430.c + + + $PROJ_DIR$\src\fw\uifv1\HalGlobalVars.h + + + $PROJ_DIR$\src\fw\uifv1\HalGlobalVars430.c + + + $PROJ_DIR$\src\fw\uifv1\halMain430.c + + + + Hil + + $PROJ_DIR$\src\hil\uifv1\arch.h + + + $PROJ_DIR$\src\hil\uifv1\hil430.c + + + $PROJ_DIR$\src\hil\uifv1\hil_2w.c + + + $PROJ_DIR$\src\hil\uifv1\hil_4w.c + + + $PROJ_DIR$\src\hil\uifv1\hil_jsbw.c + + + $PROJ_DIR$\src\hil\uifv1\hilDelays.c + + + $PROJ_DIR$\src\hil\uifv1\hilGeneric.c + + + Debug + + ICC430 + + 35 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bios/bios_coreOSS.eww b/Bios/bios_core.eww similarity index 75% rename from Bios/bios_coreOSS.eww rename to Bios/bios_core.eww index 99d8785..ed67cd2 100644 --- a/Bios/bios_coreOSS.eww +++ b/Bios/bios_core.eww @@ -10,5 +10,10 @@ $WS_DIR$\UifHal.ewp + + $WS_DIR$\UifHalMsp430.ewp + + + diff --git a/Bios/config/Bios_lnk430F1612.xcl b/Bios/config/Bios_lnk430F1612.xcl index 7c86332..39bca29 100644 --- a/Bios/config/Bios_lnk430F1612.xcl +++ b/Bios/config/Bios_lnk430F1612.xcl @@ -141,6 +141,7 @@ -Z(CONST)SAFECOREVERSION=FFDE-FFDF -Z(CONST)COREVERSION=FDD8-FDDA -Z(CONST)HALSIG=DFFE-DFFF +-Z(CODE)TOOLID=FDD6-FDD7 // --------------------------------------------------------- // The end // --------------------------------------------------------- diff --git a/Bios/config/Bios_lnk430F5528.xcl b/Bios/config/Bios_lnk430F5528.xcl new file mode 100644 index 0000000..cbd5af7 --- /dev/null +++ b/Bios/config/Bios_lnk430F5528.xcl @@ -0,0 +1,225 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F5528 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +-D_STACK_SIZE=120 +-D_DATA16_HEAP_SIZE=80 +-D_DATA20_HEAP_SIZE=210 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// +-QCODE_I=CODE_ID + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=3000-40FF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=3000-40FF +-Z(DATA)CSTACK+_STACK_SIZE# + +-Z(DATA)SHARED_VARIABLES=4100-41FF +// ----------------------------------------------- +// Read-only memory +// +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F + +-Z(CONST)COREVERSION=4404-4405 + +-Z(CODE)TOOLID=4400-4401 +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=4402-4403 +-Z(CONST)HILSIGNATURE=18FC-18FF +-Z(CONST)HILINIT=18F8-18FA + + +// ------------------------------------- +// Low memory 0-0FFFF +// +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=4406-89FF +-h(CODE)4400-89FF + +// --------------------------- +// Constant data +// +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------------------------------------- +// HAL Interrupt vectors +// --------------------------------------------------------- + + +// --------------------------- +// Code +// + +-P(CODE)CODE=4402-89FF +-Z(CODE)CODE_ID +-h(CODE)4402-89FF + +-Z(CONST)HALINTVEC=1900-1903 +-Z(CONST)HALSIGNATURE=197C-197F + +-Z(CONST)DCDCIVEC=1800-1803 +-Z(CONST)DCDCSIGNATURE=187C-187F + +-Z(CONST)COMINTVEC=1980-1983 // Information Memory A for UART +-Z(CONST)COMSIGNATURE=19FC-19FF // in Main memory + +// --------------------------- +// Constant data +// + +-Z(CONST)DATA20_C,DATA20_ID=4402-89FF + + +// ------------------------------------- +// BIOS Interrupt vectors +// + +-Z(CODE)INTVEC=FF80-FFFF +-Z(CODE)RESET=FFFE-FFFF +-h(CODE)FF80-FFFF +// ------------------------------------- +// Identfiers +// + + + diff --git a/Bios/config/Bios_lnk430F6638.xcl b/Bios/config/Bios_lnk430F6638.xcl new file mode 100644 index 0000000..e9b9975 --- /dev/null +++ b/Bios/config/Bios_lnk430F6638.xcl @@ -0,0 +1,222 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F6638 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +-D_STACK_SIZE=120 +-D_DATA16_HEAP_SIZE=80 +-D_DATA20_HEAP_SIZE=210 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// +-QCODE_I=CODE_ID + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=3100-48FF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=3100-48FF +-Z(DATA)CSTACK+_STACK_SIZE# + +-Z(DATA)SHARED_VARIABLES=4900-49FF +// ----------------------------------------------- +// Read-only memory +// +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F + +-Z(CONST)COREVERSION=8004-8005 + +-Z(CODE)TOOLID=8000-8001 +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=8002-8003,8004-CBFF + +-Z(CONST)HILSIGNATURE=18FC-18FF +-Z(CONST)HILINIT=18F8-18FA + +// ------------------------------------- +// Low memory 0-0FFFF +// +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=8006-CBFF +-h(CODE)8000-CBFF + +// --------------------------- +// Constant data +// +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------------------------------------- +// HAL Interrupt vectors +// --------------------------------------------------------- + + +// --------------------------- +// Code +// + +-P(CODE)CODE=8006-CBFF +-Z(CODE)CODE_ID +-h(CODE)8006-CBFF + +-Z(CONST)HALINTVEC=1900-1903 +-Z(CONST)HALSIGNATURE=197C-197F + +-Z(CONST)DCDCIVEC=1800-1803 +-Z(CONST)DCDCSIGNATURE=187C-187F + +-Z(CONST)COMINTVEC=1980-1983 // Information Memory A for UART +-Z(CONST)COMSIGNATURE=19FC-19FF // in Main memory + +// --------------------------- +// Constant data +// + +-Z(CONST)DATA20_C,DATA20_ID=8006-CBFF + + +// ------------------------------------- +// BIOS Interrupt vectors +// + +-Z(CODE)INTVEC=FF80-FFFF +-Z(CODE)RESET=FFFE-FFFF +-h(CODE)FE00-FFFF +// ------------------------------------- +// Identfiers +// diff --git a/Bios/config/ComChannel_Ink430F5528.xcl b/Bios/config/ComChannel_Ink430F5528.xcl new file mode 100644 index 0000000..b7b77c4 --- /dev/null +++ b/Bios/config/ComChannel_Ink430F5528.xcl @@ -0,0 +1,213 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F5528 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02430-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=4202-438F +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=4202-438F +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1980-19FF + +-Z(CONST)UARTLAYERVERSION=1984-1985 +-Z(CONST)UARTLAYERVERSIONCMP=1986-1987 + +-Z(CONST)UARTSIGNATURE=19FC-19FF // Signature == DC AC DC AC + + +-Z(DATA)UARTSEMAPHORE=4200-4201 // UART Semaphore + + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=21000-22FFF + + +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors and Core version +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=19FA-19FB + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +// Reserve space here for the BIOS's Interrupt vectors +-P(CODE)CODE=21000-22FFF +-Z(CODE)CODE_ID +-h(CODE)21000-22FFF +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors +-Z(CONST)DATA20_C,DATA20_ID=21000-22FFF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=1980-1983 diff --git a/Bios/config/ComChannel_Ink430F6638.xcl b/Bios/config/ComChannel_Ink430F6638.xcl new file mode 100644 index 0000000..1eae797 --- /dev/null +++ b/Bios/config/ComChannel_Ink430F6638.xcl @@ -0,0 +1,210 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F6638 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=4A02-4DFF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=4A02-4DFF +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1980-19FF + +-Z(CONST)UARTLAYERVERSION=1984-1985 +-Z(CONST)UARTLAYERVERSIONCMP=1986-1987 + +-Z(CONST)UARTSIGNATURE=19FC-19FF // Signature == DC AC DC AC + +-Z(DATA)UARTSEMAPHORE=4A00-4A01 // UART Semaphore + + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=46000-471FF + + +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors and Core version +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=19FA-19FB + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +-P(CODE)CODE=46000-471FF +-Z(CODE)CODE_ID +-h(CODE)46000-471FF +// --------------------------- +// Constant data +// + +-Z(CONST)DATA20_C,DATA20_ID=46000-471FF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=1980-1983 diff --git a/Bios/config/Dcdc_lnk430F5528.xcl b/Bios/config/Dcdc_lnk430F5528.xcl new file mode 100644 index 0000000..e4c4a6c --- /dev/null +++ b/Bios/config/Dcdc_lnk430F5528.xcl @@ -0,0 +1,208 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F5528 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02430-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=4390-43FF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=4390-43FF +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1800-187F + +-Z(CONST)DCDCLAYERVERSION=1804-1805 +-Z(CONST)DCDCLAYERVERSIONCMP=1806-1807 +-Z(CONST)DCDCSIGNATURE=187C-187F + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=23E84-243FF + + +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors and Core version +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=0x187A-0x187B + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +// Reserve space here for the BIOS's Interrupt vectors +-P(CODE)CODE=23000-243FF +-Z(CODE)CODE_ID +-h(CODE)23000-243FF +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors +-Z(CONST)DATA20_C,DATA20_ID=23000-243FF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=1800-1803 diff --git a/Bios/config/Dcdc_lnk430F6638.xcl b/Bios/config/Dcdc_lnk430F6638.xcl new file mode 100644 index 0000000..689cb6b --- /dev/null +++ b/Bios/config/Dcdc_lnk430F6638.xcl @@ -0,0 +1,209 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F6638 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=4E00-4E7F +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=4E00-4E7F +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1800-187F + +-Z(CONST)DCDCLAYERVERSION=1804-1805 +-Z(CONST)DCDCLAYERVERSIONCMP=1806-1807 + +-Z(CONST)DCDCSIGNATURE=187C-187F + + + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=47200-47FFF + + +// --------------------------- +// Constant data +// + +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=0x187A-0x187B + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +-P(CODE)CODE=47200-47FFF +-Z(CODE)CODE_ID +-h(CODE)47200-47FFF + +// --------------------------- +// Constant data +// + +-Z(CONST)DATA20_C,DATA20_ID=47200-47FFF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=1800-1803 diff --git a/Bios/config/Hil_lnk430F5528 .xcl b/Bios/config/Hil_lnk430F5528 .xcl new file mode 100644 index 0000000..64faebb --- /dev/null +++ b/Bios/config/Hil_lnk430F5528 .xcl @@ -0,0 +1,215 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F5528 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02430-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2D00-2FFF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=2D00-2FFF +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F + +-h(CONST)1880-18FF + +-Z(CODE)INFO_C_DISTINCT=1880-18A0 +-Z(CODE)INFO_C_COMMEN=18A0-18C0 + +-Z(CONST)HILVERSION=18F6-18F7 +-Z(CONST)HILVERSIONCMP=18F4-18F5 + +-Z(CONST)HILSIGNATURE=18FC-18FF + + + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=0x8A00-08AFF + +// --------------------------- +// Constant data +// + +-Z(CONST)DIFUNCT,CHECKSUM=0x18FA-0x18FB + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +-P(CODE)CODE=8A00-DFFF +-Z(CODE)CODE_ID + +-h(CODE)0x8A00-0xDFFF + +// --------------------------- +// Constant data +// + + +-Z(CONST)DATA16_C,DATA16_ID,DATA20_C,DATA20_ID=0x8A00-0xDFFF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)INTVEC=0x8B00-0x8B80 +-Z(CODE)RESET=0x18F8-0x18FA diff --git a/Bios/config/Hil_lnk430F6638 .xcl b/Bios/config/Hil_lnk430F6638 .xcl new file mode 100644 index 0000000..b5143bc --- /dev/null +++ b/Bios/config/Hil_lnk430F6638 .xcl @@ -0,0 +1,212 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F6638 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2E10-30FF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=2E10-30FF +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F + +-h(CONST)1880-18FF + +-Z(CODE)INFO_C_DISTINCT=1880-18A0 +-Z(CODE)INFO_C_COMMEN=18A0-18C0 + +-Z(CONST)HILVERSION=18F6-18F7 +-Z(CONST)HILVERSIONCMP=18F4-18F5 + +-Z(CONST)HILSIGNATURE=18FC-18FF + + + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=CC00-FDFF + +// --------------------------- +// Constant data +// +-Z(CONST)CHECKSUM=18FA-18FB +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=CC00-FDFF,10000-18DFF + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +-P(CODE)CODE=CC00-FDFF,10000-18DFF +-Z(CODE)CODE_ID + +-h(CODE)CC00-FDFF,10000-18DFF + +// --------------------------- +// Constant data +// + +-Z(CONST)DATA20_C,DATA20_ID=CC00-FDFF,10000-18DFF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=18F8-18FA diff --git a/Bios/config/hal_lnk430F5528.xcl b/Bios/config/hal_lnk430F5528.xcl new file mode 100644 index 0000000..be513eb --- /dev/null +++ b/Bios/config/hal_lnk430F5528.xcl @@ -0,0 +1,215 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F5528 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02430-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2400-2CFF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=2400-2CFF +-Z(DATA)CSTACK+_STACK_SIZE# + + +// --------------------------------------------------------- +// HAL Interrupt vectors +// --------------------------------------------------------- + +-Z(CONST)HILINIT=18F8-18FA + +-Z(CONST)HALSIGNATURE=197C-197F + +// HIL variable addresses +-Z(CONST)HILSIGNATURE=18FC-18FF +-Z(CONST)HILVERSIONCMP=18F4-18F5 +-Z(CONST)HILVERSION=18F6-18F7 + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1900-197F + + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=0E080-FDFF + +//-Z(CODE)ISR_CODE=0E080-FDFF +// --------------------------- +// Constant data +// +// Reserve space here for the BIOS's Interrupt vectors and Core version +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=0x197A-0x197B,10000-1DFFF + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +// Reserve space here for the hal +-P(CODE)CODE=0E080-FDFF,10000-1DFFF +-Z(CODE)CODE_ID + +-h(CODE)0E000-FDFF,10000-1DFFF + +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors +-Z(CONST)DATA20_C,DATA20_ID=0E080-FDFF,10000-1DFFF + +// ------------------------------------- +// Interrupt vectors +// +-Z(CODE)INTVEC=E000-E07f +-Z(CODE)RESET=1900-1903 + + + diff --git a/Bios/config/hal_lnk430F6638.xcl b/Bios/config/hal_lnk430F6638.xcl new file mode 100644 index 0000000..89ac3f3 --- /dev/null +++ b/Bios/config/hal_lnk430F6638.xcl @@ -0,0 +1,217 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F6638 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2400-2E0F +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=2400-2E0F +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1900-197F + +-Z(CONST)HILINIT=18F8-18FA + +-Z(CONST)HALSIGNATURE=197C-197F + +// This constant is used during FPGA update only +// It contains the FPGA bitstream version which is included in the update module +-Z(CONST)FPGAVERSION=1978-1979 + +// HIL variable addresses +-Z(CONST)HILSIGNATURE=18FC-18FF +-Z(CONST)HILVERSION=18F6-18F7 +-Z(CONST)HILVERSIONCMP=18F4-18F5 + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=18E00-30DFF + +// --------------------------- +// Constant data +// + +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=197A-197B,18E00-30DFF + + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +-P(CODE)CODE=18E00-30DFF +-Z(CODE)CODE_ID +-h(CODE)18E00-30DFF + +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors +-Z(CONST)DATA20_C,DATA20_ID=18E00-30DFF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=1900-1903 diff --git a/Bios/config/hal_lnk430F6638fpga.xcl b/Bios/config/hal_lnk430F6638fpga.xcl new file mode 100644 index 0000000..8565a0d --- /dev/null +++ b/Bios/config/hal_lnk430F6638fpga.xcl @@ -0,0 +1,216 @@ +// ************************************************ +// +// XLINK configuration file for MSP430F6638 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430f6638.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430X +// +// Interrupt vectors: 64 +// +// Peripheral units: 0-001FF +// +// Information memory (FLASH): 01800-019FF +// +// Read/write memory (RAM): 02400-063FF +// +// Read-only memory (FLASH): 08000-0FFFF +// 10000-47FFF +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_Z Data initialized to zero +// DATA_I Data initialized by copying from DATA_ID +// DATA_N Data defined using __no_init +// DATA_HEAP The heap used by 'malloc' and 'free' +// +// segment Usage +// ------- -------------------------- +// CSTACK Runtime stack +// + + +// ------------------------------------- +// Program and data read-only segments (FLASH) +// + +// +// The following segments are available for both +// the DATA16 and DATA20 segment groups. +// +// segment Usage +// ------- -------------------------- +// DATA_C Constant data, including string literals +// DATA_ID initializers for DATA_I +// +// segment Usage +// ------- -------------------------- +// INFO Information memory +// INFOA Information memory, bank A +// INFOB Information memory, bank B +// INFOC Information memory, bank C +// INFOD Information memory, bank D +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in +// the DATA16 segment group must be placed in in the range 0000-FFFD. +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=0 +//-D_DATA16_HEAP_SIZE=100 +//-D_DATA20_HEAP_SIZE=80 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2400-2CFF +-Z(DATA)CODE_I +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=2400-2CFF +-Z(DATA)CSTACK+_STACK_SIZE# + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1980-19FF +-Z(CONST)INFOB=1900-197F +-Z(CONST)INFOC=1880-18FF +-Z(CONST)INFOD=1800-187F +-h(CONST)1900-197F + +-Z(CONST)HILINIT=18F8-18FA + +-Z(CONST)HALSIGNATURE=197C-197F + +// This constant is used during FPGA update only +// It contains the FPGA bitstream version which is included in the update module +-Z(CONST)FPGAVERSION=1978-1979 + +// HIL variable addresses +-Z(CONST)HILSIGNATURE=18FC-18FF +-Z(CONST)HILVERSION=18F6-18F7 + +// ------------------------------------- +// Low memory 0-0FFFF +// + +// --------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE=18E00-45FFF + +// --------------------------- +// Constant data +//- + +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=197A-197B,18E00-45FFF + + +// ------------------------------------- +// All memory 0-FFFFF +// + +// --------------------------- +// Code +// + +-P(CODE)CODE=18E00-45FFF +-Z(CODE)CODE_ID +-h(CODE)18E00-45FFF + +// --------------------------- +// Constant data +// + +// Reserve space here for the BIOS's Interrupt vectors +-Z(CONST)DATA20_C,DATA20_ID=18E00-45FFF + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)RESET=1900-1903 diff --git a/Bios/eZ-FET_Bios.eww b/Bios/eZ-FET_Bios.eww new file mode 100644 index 0000000..9f0c903 --- /dev/null +++ b/Bios/eZ-FET_Bios.eww @@ -0,0 +1,43 @@ + + + + + $WS_DIR$\eZ-FET_Hil.ewp + + + $WS_DIR$\FET_Bios.ewp + + + $WS_DIR$\FET_ComChannel.ewp + + + $WS_DIR$\FET_DCDC.ewp + + + $WS_DIR$\FET_Hal.ewp + + + $WS_DIR$\FetDcdcController.ewp + + + + All + + eZ-FetHil + Debug + + + FetDCDC + Debug + + + NgUifBios + Debug + + + NgUifHal + Debug + + + + diff --git a/Bios/eZ-FET_Hil.ewd b/Bios/eZ-FET_Hil.ewd new file mode 100644 index 0000000..4306abc --- /dev/null +++ b/Bios/eZ-FET_Hil.ewd @@ -0,0 +1,373 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Bios/eZ-FET_Hil.ewp b/Bios/eZ-FET_Hil.ewp new file mode 100644 index 0000000..d76864d --- /dev/null +++ b/Bios/eZ-FET_Hil.ewp @@ -0,0 +1,1032 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertEzFetTxt.bat $PROJ_DIR$ eZ_FetHil + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + Debug + + + config + + $PROJ_DIR$\config\Hil_lnk430F5528 .xcl + + + + Hil + + $PROJ_DIR$\src\hil\ez_fet\arch.h + + + $PROJ_DIR$\src\hil\ez_fet\hil.c + + + $PROJ_DIR$\src\hil\fet_generic\hil_2wDma.c + + + $PROJ_DIR$\src\hil\ez_fet\hilDelays.c + + + $PROJ_DIR$\src\hil\ez_fet\hilDelays.h + + + + $EW_DIR$\430\inc\cfi.m43 + + + $PROJ_DIR$\src\hil\ez_fet\cstartup_hil.s43 + + + + diff --git a/Bios/include/ConfigureParameters.h b/Bios/include/ConfigureParameters.h index a958ea5..5dfe1c7 100644 --- a/Bios/include/ConfigureParameters.h +++ b/Bios/include/ConfigureParameters.h @@ -1,36 +1,36 @@ /* * ConfigureParameters.h * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -62,11 +62,25 @@ #define CONFIG_PARAM_JTAG_SPEED 0x000B -#define CONFIG_PARAM_SFLLDEH 0x000C - -#define CONFIG_NO_BSL 0x000D +#define CONFIG_PARAM_SFLLDEH 0x000C #define CONFIG_ALT_ROM_ADDR_FOR_CPU_READ 0x000E +#define CONFIG_ASSERT_BSL_VALID_BIT 0x000F + +#define CONFIG_PARAM_POWER_TESTREG_DEFAULT 0x0010 +#define CONFIG_PARAM_POWER_TESTREG3V_DEFAULT 0x0011 + +#define CONFIG_WDT_ADDRESS_5XX 0x0012 + +#define CONFIG_PARAM_SCS_BASE_ADDRESS 0x0013 +#define CONFIG_PARAM_FPB_BASE_ADDRESS 0x0014 + +#define CONFIG_PARAM_INTERRUPT_OPTIONS 0x0015 + +#define CONFIG_PARAM_ULP_MSP432 0x0016 + +#define CONFIG_PARAM_JTAG_LOCK_5XX 0x0017 + #endif diff --git a/Bios/include/Core.h b/Bios/include/Core.h deleted file mode 100644 index 09728e4..0000000 --- a/Bios/include/Core.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Core.h - * - * Copyright (C) 2007 - 2011 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. - */ - -/* http://srecord.sourceforge.net/ */ -const uint16_t coreImage[] = -{ -0xF57C, 0xE7A0, 0xFB2E, 0xEFBE, 0xFB3C, 0xFAF2, 0xF96C, 0xF466, 0xF948, -0xF9D2, 0xF836, 0xF5D6, 0xF30C, 0xFA30, 0xFAE0, 0xF9F2, 0xF9B2, 0xF990, -0xF85E, 0xF748, 0x1000, 0x18FF, 0x2500, 0xDFFF, 0xFDFA, 0xFDFF, 0x1000, -0x18FF, 0x2500, 0xDFFF, 0x1000, 0x10FF, 0x0200, 0x09FF, 0x1100, 0x18FF, -0x0100, 0x0080, 0x0040, 0x0001, 0x1C7C, 0x2142, 0x8205, 0x0000, 0x0000, -0x0101, 0x0101, 0x1C74, 0xDFFE, 0xFDDA, 0xFFFF, 0xFFFF, 0x0000, 0x0100, -0xFFFF, 0xFFFF, 0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0100, 0xFFFF, -0xFFFF, 0x0000, 0x0100, 0x1B90, 0x1C7C, 0x4031, 0x24E0, 0x403C, 0x1A2A, -0x403D, 0x0252, 0x12B0, 0xFABC, 0x403C, 0x1A00, 0x403D, 0xE05E, 0x403E, -0x002A, 0x12B0, 0xFB5E, 0x12B0, 0xF7E2, 0x12B0, 0xFB52, 0x120A, 0x120B, -0x120D, 0x120C, 0x120F, 0x120E, 0xD0F2, 0x0040, 0x0021, 0xD3D2, 0x1B5C, -0xB0F2, 0x00A0, 0x0072, 0x2002, 0x434E, 0x3C01, 0x435E, 0x934E, 0x2405, -0x403C, 0x8006, 0x12B0, 0xF8AE, 0x3D46, 0x425E, 0x0076, 0x4EC2, 0x1C73, -0x407F, 0x0010, 0x421D, 0x1B82, 0x4D6D, 0xF07D, 0x00FC, 0x9F4D, 0x2016, -0x907E, 0x0011, 0x2008, 0xB3E2, 0x1C74, 0x2802, 0x12B0, 0xFB12, 0x43C2, -0x1C74, 0x3D2E, 0x907E, 0x0013, 0x2003, 0x42F2, 0x1C74, 0x3D28, 0x9F4E, -0x200A, 0x4FC2, 0x1C78, 0x3D23, 0x9FC2, 0x1C78, 0x2004, 0xDFC2, 0x1C73, -0x43C2, 0x1C78, 0x403A, 0x1A2A, 0x4A6F, 0xB3DF, 0x1A30, 0x2805, 0x403C, -0x8009, 0x12B0, 0xF8AE, 0x3D11, 0x4A6F, 0x5F0F, 0x938F, 0x1A3A, 0x2015, -0x40B2, 0x000A, 0x1B5A, 0x4382, 0x1A44, 0x425E, 0x1C73, 0xB35E, 0x2806, -0x532E, 0x4A6F, 0x5F0F, 0x4E8F, 0x1A3E, 0x3C06, 0x503E, 0x0003, 0x4A6F, -0x5F0F, 0x4E8F, 0x1A3E, 0x4A6F, 0x5F0F, 0x90BF, 0x0104, 0x1A3A, 0x2C37, -0x425E, 0x1C73, 0x4E4D, 0x4A6F, 0x5F0F, 0xB39F, 0x1A3A, 0x2807, 0x108D, -0xDD82, 0x1B88, 0xE292, 0x1B88, 0x1A44, 0x3C02, 0x4D82, 0x1B88, 0x4A6F, -0x5F0F, 0x4F1D, 0x1A32, 0x4A6F, 0x5F0F, 0x4F1C, 0x1A3A, 0x4C0B, 0x531B, -0x4B8F, 0x1A3A, 0x5C0D, 0x4ECD, 0x0000, 0x4A6E, 0x5E0E, 0x4A6F, 0x5F0F, -0x9F9E, 0x1A3A, 0x1A3E, 0x2CC9, 0x4382, 0x1B5A, 0x93B2, 0x1A44, 0x20A0, -0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x0091, 0x0001, 0x203A, 0x434E, -0x3C06, 0x403C, 0x800A, 0x12B0, 0xF8AE, 0x3CB5, 0x435E, 0x934E, 0x20AC, -0xB3E2, 0x1A4C, 0x2BFA, 0x421F, 0x1B52, 0x4F5E, 0x0002, 0xF07E, 0x003F, -0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9F5E, 0x0002, 0x23ED, 0x421F, 0x1B52, -0x93CF, 0x0003, 0x2007, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x92EF, 0x0000, -0x2810, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, 0x0004, -0x0003, 0x23D7, 0xF0F2, 0x00F8, 0x1A4C, 0x4382, 0x1B5E, 0x3C80, 0xF0F2, -0x00F8, 0x1A4C, 0x3C7C, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x0092, -0x0001, 0x4A6F, 0x2039, 0x5F0F, 0x4F1F, 0x1A32, 0x93CF, 0x0002, 0x2010, -0x435C, 0x12B0, 0xF9F2, 0x434C, 0x12B0, 0xF9B2, 0x43C2, 0x1C70, 0x434C, -0x12B0, 0xF1E8, 0x12B0, 0xF27C, 0x12B0, 0xF886, 0x3C5D, 0x434E, 0x3C01, -0x435E, 0x934E, 0x2058, 0x425E, 0x1A4C, 0xF07E, 0x0003, 0x907E, 0x0003, -0x23F6, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, 0x0002, -0x0002, 0x23EC, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, -0x0004, 0x0003, 0x23E2, 0xC3E2, 0x1A4C, 0x3C3A, 0x5F0F, 0x4F1F, 0x1A32, -0x93CF, 0x0002, 0x200B, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x008B, -0x0001, 0x2003, 0x12B0, 0xF27C, 0x3C2F, 0x4A6F, 0xD3DF, 0x1A30, 0x53D2, -0x1A2A, 0x93E2, 0x1A2A, 0x2821, 0x43C2, 0x1A2A, 0x3C1E, 0x40B2, 0x8003, -0x1A42, 0x4A6F, 0x5F0F, 0x4F1B, 0x1A32, 0x4A6F, 0x5F0F, 0x5F1B, 0x1A3E, -0xEB92, 0xFFFF, 0x1A44, 0xE3B2, 0x1A44, 0x43A2, 0x1B84, 0x43D2, 0x1C75, -0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x4FD2, 0x0002, 0x1C76, 0x40B2, 0x1A42, -0x1B86, 0x4A6F, 0x5F0F, 0x438F, 0x1A3A, 0x4382, 0x1A44, 0xC0F2, 0x0040, -0x0021, 0xC3D2, 0x1B5C, 0x413E, 0x413F, 0x413C, 0x413D, 0x413B, 0x413A, -0x1300, 0x43C2, 0x0022, 0x43C2, 0x002A, 0x43C2, 0x001A, 0x43C2, 0x001E, -0x43C2, 0x0032, 0x43C2, 0x0036, 0x43C2, 0x0026, 0x43C2, 0x002E, 0x43C2, -0x001B, 0x43C2, 0x001F, 0x43C2, 0x0033, 0x43C2, 0x0037, 0x43C2, 0x0021, -0x43C2, 0x0029, 0x43C2, 0x0019, 0x43C2, 0x001D, 0x43C2, 0x0031, 0x43C2, -0x0035, 0xC0F2, 0x0080, 0x0057, 0x430F, 0x3C05, 0x4303, 0x533E, 0x930E, -0x23FC, 0x531F, 0x903F, 0x00FF, 0x2C07, 0xB3E2, 0x0002, 0x2804, 0xC3E2, -0x0002, 0x437E, 0x3FF3, 0xB3E2, 0x0002, 0x2C66, 0xD0F2, 0x0040, 0x001E, -0xC3E2, 0x0002, 0xD0F2, 0x0088, 0x0058, 0xD0F2, 0x0020, 0x0032, 0xD0F2, -0x0020, 0x0033, 0x40B2, 0x1B00, 0x1B76, 0x40B2, 0x00B7, 0x1B78, 0x43C2, -0x1C72, 0xC0F2, 0x0020, 0x0021, 0xD0F2, 0x0040, 0x0021, 0xD0F2, 0x0060, -0x0022, 0x43C2, 0x002A, 0xD0F2, 0x0030, 0x001B, 0xD0F2, 0x0010, 0x001A, -0xD0F2, 0x003F, 0x001D, 0xD0F2, 0x003F, 0x001E, 0xD0F2, 0x000B, 0x0032, -0x40B2, 0x1C71, 0x1B68, 0x43D2, 0x1B6A, 0x40B2, 0x1C71, 0x1B72, 0x43E2, -0x1B74, 0x430F, 0x3C02, 0x4303, 0x531F, 0x933F, 0x23FC, 0xC0F2, 0x0040, -0x001E, 0x40B2, 0x1C73, 0x1B82, 0x40B2, 0x1C74, 0x1A00, 0x40B2, 0xFF45, -0x1B7E, 0x40B2, 0x0200, 0x1B80, 0x40B2, 0x000C, 0x1B7A, 0x4382, 0x1B7C, -0x4382, 0x0182, 0x421C, 0x1B76, 0x421D, 0x1B78, 0x403E, 0x0320, 0x430F, -0x12B0, 0xF710, 0x533C, 0x4C82, 0x0192, 0x40B2, 0x02D6, 0x0180, 0x3C75, -0xC0F2, 0x0040, 0x0019, 0xD0F2, 0x0080, 0x0057, 0xD0F2, 0x0040, 0x0057, -0xC032, 0x0020, 0x430F, 0xC3E2, 0x0002, 0x437E, 0x3C02, 0x4303, 0x533E, -0x930E, 0x23FC, 0xB3E2, 0x0002, 0x2802, 0x430F, 0x3C01, 0x531F, 0x903F, -0x000A, 0x2BEF, 0xD3E2, 0x0000, 0xD0F2, 0x00C0, 0x0058, 0x40B2, 0x1200, -0x1B76, 0x40B2, 0x007A, 0x1B78, 0x40F2, 0x0057, 0x1C72, 0x40F2, 0x00FC, -0x0021, 0x40F2, 0x0003, 0x0022, 0xC0F2, 0x0020, 0x0021, 0xD0F2, 0x0040, -0x0021, 0xD0F2, 0x0060, 0x0022, 0xD0F2, 0x0060, 0x0029, 0xD0F2, 0x0060, -0x002A, 0xD0F2, 0x0030, 0x001B, 0xD0F2, 0x0010, 0x001A, 0xD0F2, 0x0015, -0x001D, 0xD0F2, 0x007D, 0x001E, 0xD0F2, 0x000B, 0x0032, 0x40B2, 0x0021, -0x1B68, 0x43D2, 0x1B6A, 0x40B2, 0x0021, 0x1B72, 0x43E2, 0x1B74, 0x40B2, -0x1C73, 0x1B82, 0x40B2, 0x1C74, 0x1A00, 0x40B2, 0xFF55, 0x1B7E, 0x40B2, -0x0140, 0x1B80, 0x40B2, 0x0007, 0x1B7A, 0x4382, 0x1B7C, 0x4382, 0x0182, -0x40B2, 0x270F, 0x0192, 0x40B2, 0x01D6, 0x0180, 0xD0F2, 0x0040, 0x0019, -0xD232, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C0A, 0x433B, -0x4306, 0x9CD2, 0x0001, 0x1A2B, 0x2003, 0x93C2, 0x1A2C, 0x380A, 0x4CD2, -0x0001, 0x1A2B, 0x4C5F, 0x0004, 0x4F82, 0x1A2E, 0xD392, 0x1B9C, 0x3C02, -0xC392, 0x1B9C, 0x93CC, 0x0002, 0x3803, 0xD3A2, 0x1B9C, 0x3C02, 0xC3A2, -0x1B9C, 0x4C08, 0x5328, 0x48E2, 0x1A2C, 0x93C2, 0x1C70, 0x2005, 0x434C, -0x12B0, 0xF9F2, 0x43D2, 0x1C70, 0x90FA, 0x0081, 0x0001, 0x2044, 0xB392, -0x1B9C, 0x2806, 0x4A19, 0x0004, 0x432C, 0x1292, 0xE01A, 0x3C02, 0x4219, -0x1A2E, 0x9309, 0x2004, 0x4A0C, 0x12B0, 0xE900, 0x4C06, 0x9306, 0x202F, -0x407D, 0x0093, 0x486C, 0x1292, 0xE000, 0x90B2, 0x0064, 0x1C66, 0x2802, -0x4382, 0x1C66, 0x421F, 0x1C66, 0x4F0E, 0x531E, 0x4E82, 0x1C66, 0x5F0F, -0x498F, 0x1B9E, 0x4982, 0x1C68, 0x421F, 0x1A26, 0x9F19, 0x0006, 0x2C6B, -0x421F, 0x1B9A, 0x5909, 0x5909, 0x590F, 0x4F1F, 0x0002, 0x930F, 0x2462, -0x421C, 0x1B9C, 0x128F, 0x4C0B, 0x930C, 0x205C, 0x1292, 0xE002, 0x403B, -0x8000, 0x3C57, 0x460B, 0x3C55, 0x4A5E, 0x0001, 0x807E, 0x0051, 0x2436, -0x835E, 0x2439, 0x835E, 0x2440, 0x835E, 0x2443, 0x835E, 0x2446, 0x807E, -0x002D, 0x2409, 0x826E, 0x2413, 0x826E, 0x240B, 0x836E, 0x2415, 0x835E, -0x241B, 0x3C3C, 0x435D, 0x4A0C, 0x12B0, 0xED38, 0x4C0B, 0x3C36, 0x434D, -0x4A0C, 0x12B0, 0xED38, 0x4C0B, 0x3C30, 0x4A5C, 0x0006, 0x12B0, 0xF1E8, -0x4C0B, 0x3C2A, 0x4A5C, 0x0006, 0xD07C, 0x0040, 0x12B0, 0xF8FC, 0x4C0B, -0x3C22, 0x4A5C, 0x0006, 0xD07C, 0x0040, 0x12B0, 0xF8D6, 0x4C0B, 0x3C1A, -0x4A0C, 0x12B0, 0xF6C8, 0x4C0B, 0x3C15, 0x4A0C, 0x12B0, 0xEA2A, 0x4C0B, -0x931C, 0x200F, 0x12B0, 0xF7B2, 0x3C0C, 0x4A0C, 0x12B0, 0xF07C, 0x4C0B, -0x3C07, 0x4A0C, 0x12B0, 0xF4C6, 0x4C0B, 0x3C02, 0x12B0, 0xF62C, 0x903B, -0x8000, 0x2423, 0x930B, 0x380B, 0x407D, 0x0091, 0x486C, 0x1292, 0xE000, -0x4B0C, 0x1292, 0xE008, 0x1292, 0xE002, 0x3C16, 0x407D, 0x0092, 0x486C, -0x1292, 0xE000, 0x4B0C, 0x1292, 0xE008, 0x903B, 0x8002, 0x2009, 0x425C, -0x1A2C, 0x535C, 0xF07C, 0x003F, 0x2001, 0x435C, 0x1292, 0xE008, 0x1292, -0xE002, 0x430C, 0x4030, 0xFAD4, 0x120A, 0x120B, 0x403E, 0x1A46, 0x4E6F, -0xB3DF, 0x1A4C, 0x2CA4, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x90FF, 0x0093, -0x0001, 0x4E6F, 0x2407, 0x5F0F, 0x4F1F, 0x1B52, 0xC0FF, 0x0080, 0x0002, -0x3C18, 0x5F0F, 0x4F1F, 0x1B52, 0x93CF, 0x0002, 0x3803, 0x93C2, 0x1C7A, -0x240F, 0x93F2, 0x1C7A, 0x2403, 0x53D2, 0x1C7A, 0x3C02, 0x43D2, 0x1C7A, -0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x42DF, 0x1C7A, 0x0003, 0x4E6F, 0x5F0F, -0x4F1D, 0x1A4E, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4DCF, 0x0000, 0x4E6F, -0x5F0F, 0x4F1F, 0x1B52, 0xB3DF, 0x0000, 0x2C0E, 0x4E6F, 0x5F0F, 0x4F1D, -0x1B52, 0x4E6F, 0x5F0F, 0x4F1C, 0x1A4E, 0x531C, 0x4C8F, 0x1A4E, 0x5C0D, -0x43CD, 0x0000, 0x430D, 0x430C, 0x3C11, 0x4C0A, 0x5A0A, 0x4E6F, 0x5F0F, -0x4F0B, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5B0F, -0x5F0A, 0xEA1D, 0x1A50, 0x531C, 0x4E6F, 0x5F0F, 0x4F1F, 0x1A4E, 0x531F, -0xC312, 0x100F, 0x9F0C, 0x2BE6, 0xE33D, 0x4E6F, 0x5F0F, 0x4F1B, 0x1A4E, -0x100B, 0x5B0B, 0x4E6F, 0x5F0F, 0x4F0A, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, -0x5F0F, 0x5F0F, 0x5F0F, 0x5A0F, 0x5F0B, 0x4D8B, 0x1A52, 0x4E6F, 0xD3DF, -0x1A4C, 0x4E6F, 0xC2FF, 0x1A4C, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x93CF, -0x0002, 0x3802, 0x43C2, 0x1C7A, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x90FF, -0x0093, 0x0001, 0x2003, 0x4E6F, 0xD3EF, 0x1A4C, 0x4E6F, 0x5F0F, 0x4F1C, -0x1A4E, 0x503C, 0x0003, 0x12B0, 0xFA12, 0x53D2, 0x1A46, 0x93C2, 0x1A46, -0x2402, 0x43C2, 0x1A46, 0x12B0, 0xFB12, 0x430C, 0x413B, 0x413A, 0x4130, -0x120A, 0x430A, 0x93CC, 0x0006, 0x2034, 0x407D, 0x0093, 0x4C5C, 0x0002, -0x1292, 0xE000, 0x930C, 0x3829, 0x421A, 0xE008, 0x421F, 0x1A26, 0x4F1C, -0x0002, 0x128A, 0x421F, 0x1A26, 0x4F1C, 0x0004, 0x128A, 0x421C, 0x1B7E, -0x128A, 0x421C, 0x1B80, 0x128A, 0x432D, 0x403C, 0xFDD8, 0x1292, 0xE006, -0x432D, 0x403C, 0xFDD8, 0x1292, 0xE006, 0x432C, 0x128A, 0x403C, 0x0102, -0x128A, 0x421C, 0x1B7A, 0x421D, 0x1B7C, 0x1292, 0xE00A, 0x431A, 0x3C56, -0x403A, 0xFFFD, 0x3C53, 0x93DC, 0x0006, 0x201B, 0x421F, 0x1A26, 0x938F, -0x0006, 0x2413, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, -0x3808, 0x421F, 0x1A26, 0x4F1C, 0x0006, 0x1292, 0xE008, 0x431A, 0x3C3B, -0x403A, 0xFFFC, 0x3C38, 0x403A, 0xFFFE, 0x3C35, 0x93EC, 0x0006, 0x2020, -0x407D, 0x0093, 0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, 0x3815, 0x3C0D, -0x4A0C, 0x1292, 0xE008, 0x421E, 0x1B9A, 0x4A0F, 0x5F0F, 0x5F0F, 0x5F0E, -0x4E2C, 0x1292, 0xE008, 0x531A, 0x421F, 0x1A26, 0x9F1A, 0x0006, 0x2BEE, -0x431A, 0x3C15, 0x403A, 0xFFFB, 0x3C12, 0x90FC, 0x0003, 0x0006, 0x200E, -0x407D, 0x0091, 0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, 0x3804, 0x1292, -0xE002, 0x403A, 0xFFFA, 0x12B0, 0xFA98, 0x931A, 0x2004, 0x403A, 0x8000, -0x1292, 0xE002, 0x4A0C, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x4C18, 0x0004, 0x4809, 0x5C19, 0x0008, 0x8329, 0x4336, 0x93D2, -0x1C7B, 0x2076, 0x403B, 0xF522, 0x480C, 0x128B, 0x834C, 0x2407, 0x835C, -0x2408, 0x835C, 0x2409, 0x835C, 0x240A, 0x3C0A, 0xF038, 0xFE00, 0x3C07, -0xF038, 0xFF00, 0x3C04, 0xF038, 0xFF80, 0x3C01, 0xC318, 0x490C, 0x128B, -0x834C, 0x2407, 0x835C, 0x2408, 0x835C, 0x2409, 0x835C, 0x240A, 0x3C0A, -0xF039, 0xFE00, 0x3C07, 0xF039, 0xFF00, 0x3C04, 0xF039, 0xFF80, 0x3C01, -0xC319, 0x490C, 0x128B, 0x4C4C, 0x5C0C, 0x4C1F, 0xE048, 0x5F0F, 0x5F09, -0x4036, 0xFFFE, 0xB318, 0x2C3E, 0x9908, 0x2C3C, 0xB392, 0x012C, 0x2FFD, -0x40B2, 0xA593, 0x012A, 0x40B2, 0xA500, 0x012C, 0x4316, 0x3C0A, 0x907A, -0x0003, 0x2002, 0x43B8, 0x0000, 0x5A0A, 0x4A1F, 0xE048, 0x5F0F, 0x5F08, -0x9908, 0x2C1F, 0x480C, 0x128B, 0x4C4A, 0x480C, 0x12B0, 0xF922, 0x934C, -0x240F, 0x934A, 0x2404, 0x935A, 0x2402, 0x936A, 0x23E6, 0x40B2, 0xA502, -0x0128, 0x43B8, 0x0000, 0xB392, 0x012C, 0x2FFD, 0x3FE2, 0x40B2, 0xA500, -0x0128, 0x40B2, 0xA510, 0x012C, 0x4036, 0xFFFE, 0x40B2, 0xA500, 0x0128, -0x40B2, 0xA510, 0x012C, 0x460C, 0x4030, 0xFAD4, 0x120A, 0x120B, 0x1208, -0x1209, 0x8031, 0x0010, 0x434A, 0xC0F2, 0x0040, 0x0021, 0xC3D2, 0x1B5C, -0x3C20, 0x535A, 0x936A, 0x2801, 0x434A, 0x9A4E, 0x241A, 0x4A4B, 0xB3DB, -0x1A30, 0x2BF6, 0x403D, 0x0014, 0x434C, 0x12B0, 0xF85E, 0x4A4D, 0x403C, -0x1A2A, 0x1292, 0xE00C, 0x4AC2, 0x1C79, 0x5B0B, 0x4B1C, 0x1A32, 0x12B0, -0xE5B6, 0x425A, 0x1C79, 0x4A4F, 0xC3DF, 0x1A30, 0x93C2, 0x1C75, 0x240F, -0x421E, 0x1B86, 0x421D, 0x1B84, 0x425C, 0x1C76, 0x12B0, 0xF67A, 0x43C2, -0x1C75, 0xC0F2, 0x0040, 0x0021, 0xC3D2, 0x1B5C, 0x434B, 0x3C3F, 0x4B48, -0x5808, 0x5808, 0x5808, 0x481F, 0x1A06, 0x421E, 0x1A26, 0x9E1F, 0x0006, -0x2C33, 0x421E, 0x1B9A, 0x5F0F, 0x5F0F, 0x5F0E, 0x4E19, 0x0002, 0x9309, -0x242A, 0x93C8, 0x1A0D, 0x2427, 0x485D, 0x1A0C, 0x485C, 0x1A0B, 0x1292, -0xE000, 0x930C, 0x381F, 0x481C, 0x1A08, 0x410F, 0x120F, 0x430F, 0x431E, -0x4C6D, 0x503D, 0xFFFD, 0x503C, 0x0006, 0x1292, 0xE00E, 0x403C, 0x0003, -0x1289, 0x5321, 0x931C, 0x2009, 0x1292, 0xE002, 0xB3D8, 0x1A0A, 0x2804, -0x485C, 0x1A0B, 0x12B0, 0xF1E8, 0x410C, 0x1292, 0xE010, 0x535B, 0x926B, -0x2BBF, 0x4A4E, 0x3F8F, 0x120A, 0x120B, 0x120D, 0x120C, 0x120F, 0x120E, -0x421F, 0x1A00, 0x93CF, 0x0000, 0x2404, 0x40F2, 0x000A, 0x1C74, 0x3C65, -0x403D, 0x1A47, 0x4D6C, 0x3C0A, 0x53D2, 0x1A47, 0x93C2, 0x1A47, 0x2402, -0x43C2, 0x1A47, 0x9CC2, 0x1A47, 0x2457, 0x4D6F, 0xB3DF, 0x1A4C, 0x2BF2, -0x4D6E, 0x5E0E, 0x4D6F, 0x5F0F, 0x9F9E, 0x1A4E, 0x1A48, 0x4D6F, 0x2C0F, -0x5F0F, 0x4F1E, 0x1B52, 0x4D6F, 0x5F0F, 0x4F1D, 0x1A48, 0x4D0A, 0x531A, -0x4A8F, 0x1A48, 0x5D0E, 0x4EE2, 0x0077, 0x3C3B, 0xC3DF, 0x1A4C, 0x4D6F, -0x5F0F, 0x438F, 0x1A48, 0x4D6C, 0x4D6F, 0xB3EF, 0x1A4C, 0x2C02, 0x4382, -0x1B5E, 0x53D2, 0x1A47, 0x93C2, 0x1A47, 0x2402, 0x43C2, 0x1A47, 0x4D6F, -0xB3DF, 0x1A4C, 0x281C, 0x4D6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F6E, 0x4D6F, -0x5F0F, 0x9F1E, 0x1A48, 0x2812, 0x4D6F, 0x5F0F, 0x4F1E, 0x1B52, 0x4D6F, -0x5F0F, 0x4F1A, 0x1A48, 0x4A0B, 0x531B, 0x4B8F, 0x1A48, 0x5A0E, 0x4EE2, -0x0077, 0x40B2, 0x0032, 0x1B5E, 0x4D6F, 0xB3DF, 0x1A4C, 0x2C03, 0x9CC2, -0x1A47, 0x23D2, 0x413E, 0x413F, 0x413C, 0x413D, 0x413B, 0x413A, 0x1300, -0x120A, 0x120B, 0x1208, 0x1209, 0x4C08, 0x4D4A, 0x4309, 0x3C01, 0x5319, -0x9229, 0x2C0C, 0x490F, 0x5F0F, 0x5F0F, 0x5F0F, 0x9C9F, 0x0004, 0x1A06, -0x23F5, 0x9CDF, 0x0002, 0x1A0B, 0x23F1, 0x4309, 0x3C01, 0x5319, 0x9229, -0x2C07, 0x490F, 0x5F0F, 0x5F0F, 0x5F0F, 0x93BF, 0x1A06, 0x23F6, 0x9229, -0x2C47, 0x5909, 0x5909, 0x5909, 0x90FC, 0x0006, 0x0000, 0x282B, 0x4C6B, -0x535B, 0x4B0C, 0x12B0, 0xF386, 0x4C89, 0x1A08, 0x930C, 0x241F, 0x430F, -0x3C08, 0x480E, 0x5F0E, 0x491D, 0x1A08, 0x5F0D, 0x4EED, 0x0000, 0x531F, -0x9B0F, 0x2BF6, 0xF35A, 0x4AC9, 0x1A0A, 0x485E, 0x0002, 0xD07E, 0x0040, -0x4EC9, 0x1A0B, 0x40F9, 0x0093, 0x1A0C, 0x4899, 0x0004, 0x1A06, 0x43D9, -0x1A0D, 0x431C, 0x3C1A, 0x403C, 0xFFFC, 0x3C17, 0x4389, 0x1A08, 0xF35A, -0x4AC9, 0x1A0A, 0x4C5E, 0x0002, 0xD07E, 0x0040, 0x4EC9, 0x1A0B, 0x40F9, -0x0093, 0x1A0C, 0x4C99, 0x0004, 0x1A06, 0x43D9, 0x1A0D, 0x431C, 0x3C02, -0x403C, 0xFFFD, 0x4030, 0xFAD6, 0x120D, 0x120C, 0x120F, 0x120E, 0x90B2, -0x000E, 0x011E, 0x205F, 0xD232, 0x93A2, 0x1B5A, 0x2806, 0xB3D2, 0x1B5C, -0x2C03, 0x53B2, 0x1B5A, 0x3C09, 0x9392, 0x1B5A, 0x2006, 0x4382, 0x1B5A, -0x403C, 0x8004, 0x12B0, 0xF8AE, 0x93A2, 0x1B5E, 0x2805, 0x93C2, 0x1C74, -0x2002, 0x53B2, 0x1B5E, 0x425E, 0x1B62, 0x421F, 0x1B64, 0xC312, 0x100F, -0x921F, 0x1B66, 0x7F4F, 0xF35F, 0xF35E, 0xEF4E, 0x421F, 0x1B68, 0x2404, -0xD2DF, 0x1B6A, 0x0000, 0x3C03, 0xC2DF, 0x1B6A, 0x0000, 0x9382, 0x1B66, -0x2403, 0x53B2, 0x1B66, 0x3C06, 0xB3E2, 0x1B62, 0x2803, 0x4292, 0x1B64, -0x1B66, 0x425E, 0x1B6C, 0x421F, 0x1B6E, 0xC312, 0x100F, 0x921F, 0x1B70, -0x7F4F, 0xF35F, 0xF35E, 0xEF4E, 0x421F, 0x1B72, 0x2404, 0xD2DF, 0x1B74, -0x0000, 0x3C03, 0xC2DF, 0x1B74, 0x0000, 0x9382, 0x1B70, 0x2403, 0x53B2, -0x1B70, 0x3C06, 0xB3E2, 0x1B6C, 0x2803, 0x4292, 0x1B6E, 0x1B70, 0x413E, -0x413F, 0x413C, 0x413D, 0x1300, 0x120A, 0x8031, 0x0006, 0x410C, 0x403E, -0xE054, 0x403D, 0x0006, 0x12B0, 0xFB02, 0x12B0, 0xF7B2, 0x90B2, 0x2520, -0x251E, 0x2852, 0x90B2, 0xFDDA, 0x251E, 0x2C4E, 0x421F, 0x1A02, 0x90BF, -0x5137, 0x0000, 0x201F, 0x434A, 0x3C0F, 0x4A4F, 0x5F0F, 0x421E, 0x1A04, -0x5F0E, 0x93BE, 0x0000, 0x2006, 0x93BF, 0x2500, 0x2403, 0x4F9F, 0x2500, -0x24E0, 0x535A, 0x907A, 0x0010, 0x2BEE, 0x421D, 0x251E, 0x421E, 0x1B7A, -0x421F, 0x1B7C, 0x403C, 0xE000, 0x128D, 0x4C82, 0x1A26, 0x421F, 0x1A26, -0x930F, 0x2423, 0x4F92, 0x0008, 0x1B9A, 0x9382, 0x1B9A, 0x241D, 0x434A, -0x3C16, 0x421F, 0x1B9A, 0x4A4E, 0x5E0E, 0x5E0E, 0x5E0F, 0x93BF, 0x0000, -0x240C, 0x90BF, 0xFF00, 0x0000, 0x2808, 0x4AC1, 0x0004, 0x43C1, 0x0005, -0x434D, 0x410C, 0x12B0, 0xED38, 0x535A, 0x421F, 0x1A26, 0x9F1A, 0x0006, -0x2BE5, 0x430C, 0x3C01, 0x433C, 0x5031, 0x0006, 0x413A, 0x4130, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x4C0B, 0x4D08, 0x430C, 0x9382, -0x1B54, 0x203B, 0x4309, 0x9809, 0x2C4E, 0x4036, 0x1A46, 0x466F, 0x5F0F, -0x90BF, 0x00FF, 0x1A4E, 0x281E, 0x466F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F5A, -0x0001, 0x466F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F57, 0x0002, 0x466F, 0x5F0F, -0x4F1F, 0x1B52, 0xD0FF, 0x0080, 0x0002, 0x403D, 0x0014, 0x434C, 0x12B0, -0xF85E, 0x12B0, 0xE7A0, 0x4A4D, 0x474C, 0x12B0, 0xF57C, 0x466F, 0x5F0F, -0x539F, 0x1A4E, 0x4B07, 0x5907, 0x466F, 0x5F0F, 0x4F1E, 0x1B52, 0x466F, -0x5F0F, 0x5F1E, 0x1A4E, 0x47EE, 0x0000, 0x5319, 0x3FC6, 0x93B2, 0x1B54, -0x2413, 0x4309, 0x3C0B, 0x4B0F, 0x590F, 0x4217, 0x1B54, 0x5217, 0x1B58, -0x4FE7, 0x0000, 0x5319, 0x5392, 0x1B58, 0x9D09, 0x2C04, 0x9292, 0x1B56, -0x1B58, 0x2BEF, 0x4030, 0xFAD2, 0x120A, 0x120B, 0x1208, 0x1209, 0x433F, -0x93D2, 0x1C7B, 0x2054, 0xB392, 0x1B9C, 0x2828, 0x4C92, 0x0004, 0x1C6C, -0x421D, 0x1C6C, 0x4D0A, 0x5C1A, 0x0008, 0x4A82, 0x1C6E, 0x4D82, 0x1C6A, -0x4C0B, 0x503B, 0x000C, 0x4C6E, 0x503E, 0xFFF5, 0xC312, 0x100E, 0x5E0E, -0x4B08, 0x5E08, 0xB31D, 0x2C0C, 0x9A0D, 0x2C0A, 0x40B2, 0xA593, 0x012A, -0x40B2, 0xA500, 0x012C, 0x40B2, 0xA540, 0x0128, 0x3C0D, 0x403F, 0xFFFD, -0x3C0A, 0x4C0B, 0x522B, 0x4C6E, 0x503E, 0xFFFD, 0xC312, 0x100E, 0x5E0E, -0x4B08, 0x5E08, 0x933F, 0x201D, 0x421C, 0x1C6A, 0x12B0, 0xF522, 0x3C07, -0x4BB9, 0x0000, 0x4A5F, 0xE05A, 0x5F0F, 0x5F82, 0x1C6A, 0x4219, 0x1C6A, -0x9219, 0x1C6E, 0x2C0B, 0x980B, 0x2C09, 0x490C, 0x12B0, 0xF522, 0x4C4A, -0x490C, 0x12B0, 0xF80C, 0x934C, 0x23E9, 0x431F, 0x4F0C, 0x4030, 0xFAD6, -0x120A, 0x120B, 0x1208, 0x1209, 0x4C0A, 0x4D0B, 0x4348, 0x3C11, 0x4849, -0x5909, 0x403C, 0x0102, 0x12B0, 0xF386, 0x4C89, 0x1A36, 0x9389, 0x1A36, -0x2002, 0x12B0, 0xFB20, 0x4999, 0x1A36, 0x1A32, 0x5358, 0x9368, 0x2BED, -0x4348, 0x3C04, 0x40B2, 0x1A50, 0x1B52, 0x4358, 0x9348, 0x27FA, 0x43C2, -0x0070, 0x43D2, 0x0070, 0xD0F2, 0x00C0, 0x0004, 0xD0F2, 0x0010, 0x0070, -0x93C2, 0x0057, 0x3803, 0x407E, 0x0020, 0x3C02, 0x407E, 0x0010, 0x4EC2, -0x0071, 0x421C, 0x1B76, 0x421D, 0x1B78, 0x4A0E, 0x4B0F, 0x12B0, 0xF710, -0x4CC2, 0x0074, 0x108C, 0x4CC2, 0x0075, 0x42D2, 0x1C72, 0x0073, 0xC3D2, -0x0070, 0x43C2, 0x1C74, 0xD0F2, 0x00C0, 0x0000, 0x93C2, 0x0076, 0xC0F2, -0x0040, 0x0021, 0xC3D2, 0x1B5C, 0x4030, 0xFAD6, 0x120A, 0x120B, 0x1208, -0x934C, 0x2024, 0x430A, 0x430B, 0x922B, 0x2C3E, 0x4B08, 0x5808, 0x5808, -0x5808, 0x481F, 0x1A06, 0x933F, 0x2416, 0x421E, 0x1B9A, 0x5F0F, 0x5F0F, -0x5F0E, 0x90BE, 0xFF00, 0x0000, 0x2C0D, 0x481C, 0x1A08, 0x930C, 0x2402, -0x12B0, 0xF3F8, 0x4388, 0x1A08, 0x43B8, 0x1A06, 0x43D8, 0x1A0D, 0x531A, -0x531B, 0x3FDE, 0x430B, 0x3C01, 0x531B, 0x922B, 0x2C07, 0x4B0F, 0x5F0F, -0x5F0F, 0x5F0F, 0x9CCF, 0x1A0B, 0x23F6, 0x922B, 0x2C0F, 0x5B0B, 0x5B0B, -0x5B0B, 0x4B1C, 0x1A08, 0x930C, 0x2402, 0x12B0, 0xF3F8, 0x438B, 0x1A08, -0x43BB, 0x1A06, 0x43DB, 0x1A0D, 0x431A, 0x4A0C, 0x4030, 0xFAD8, 0x434F, -0xB0F2, 0x0040, 0x0000, 0x2804, 0xC0F2, 0x0040, 0x0000, 0x435F, 0x43C2, -0x1A2A, 0x434E, 0x3C13, 0x4E4D, 0x43CD, 0x1A30, 0x43C2, 0x1A2B, 0x43C2, -0x1A2C, 0x5D0D, 0x4D1C, 0x1A32, 0x43CC, 0x0000, 0x438D, 0x1A42, 0x438D, -0x1A3A, 0x438D, 0x1A3E, 0x535E, 0x936E, 0x2BEB, 0x4382, 0x1B5A, 0x403D, -0x012C, 0x42D2, 0x0076, 0x1C77, 0x42D2, 0x0076, 0x1C77, 0x42D2, 0x0076, -0x1C77, 0xC0F2, 0x0040, 0x0002, 0xF0F2, 0x000E, 0x0072, 0x434E, 0x3C02, -0x4303, 0x535E, 0x937E, 0x23FC, 0x533D, 0x930D, 0x2404, 0xB0F2, 0x0040, -0x0002, 0x2FE4, 0x934F, 0x2403, 0xD0F2, 0x0040, 0x0000, 0x4130, 0x120A, -0x120B, 0x4C0A, 0x430C, 0x421E, 0x1B8E, 0xB35E, 0x2421, 0x438A, 0x0000, -0x438A, 0x0002, 0x403B, 0xF836, 0x4A0C, 0x128B, 0x930C, 0x2402, 0x433C, -0x3C26, 0x4A0C, 0x531C, 0x128B, 0x930C, 0x2403, 0x403C, 0xFFFE, 0x3C1E, -0x4A0C, 0x532C, 0x128B, 0x930C, 0x2403, 0x403C, 0xFFFD, 0x3C16, 0x503A, -0x0003, 0x4A0C, 0x128B, 0x3C11, 0x9E82, 0x1B8C, 0x2C03, 0x403C, 0xFFFB, -0x3C0B, 0x4EBA, 0x0000, 0x4EBA, 0x0002, 0x52A2, 0x1B8E, 0x9292, 0x1B8E, -0x1B8C, 0x2C01, 0x431C, 0x413B, 0x413A, 0x4130, 0x120A, 0x531C, 0xC31C, -0x421E, 0x1A28, 0x421D, 0xE052, 0x8E0D, 0x4C0F, 0x522F, 0x9F0D, 0x280F, -0x43DE, 0x0000, 0x421F, 0x1A28, 0x5C0F, 0x522F, 0x4F82, 0x1A28, 0x4F8E, -0x0002, 0x421F, 0x1A28, 0x8C0F, 0x4F0C, 0x3C1C, 0x421F, 0xE050, 0x3C02, -0x4F1F, 0x0002, 0x9E0F, 0x2C14, 0x93CF, 0x0000, 0x23F9, 0x4F1D, 0x0002, -0x8F0D, 0x822D, 0x9C0D, 0x2BF3, 0x4F0A, 0x522A, 0x43DF, 0x0000, 0x4A0D, -0x5C0D, 0x4F0C, 0x12B0, 0xFA4C, 0x4A0C, 0x3C01, 0x430C, 0x413A, 0x4130, -0x120A, 0x421E, 0xE050, 0x4E0D, 0x930C, 0x2004, 0x3C2E, 0x4E0D, 0x4E1E, -0x0002, 0x921E, 0x1A28, 0x2C28, 0x4E0F, 0x522F, 0x9F0C, 0x23F6, 0x93CE, -0x0000, 0x2421, 0x4E1F, 0x0002, 0x921F, 0x1A28, 0x2C02, 0x4F0C, 0x3C01, -0x4E0C, 0x4C6A, 0x93CD, 0x0000, 0x2008, 0x934A, 0x2002, 0x4C1F, 0x0002, -0x4F8D, 0x0002, 0x4D0E, 0x3C07, 0x934A, 0x2003, 0x4C9E, 0x0002, 0x0002, -0x43CE, 0x0000, 0x929E, 0x1A28, 0x0002, 0x2002, 0x4E82, 0x1A28, 0x413A, -0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C0A, 0x4D0B, 0x4E08, -0x4F09, 0x4116, 0x000C, 0x403E, 0x0006, 0x403D, 0x1B8A, 0x460C, 0x12B0, -0xFA80, 0x4296, 0x1B54, 0x000C, 0x4296, 0x1B56, 0x000E, 0x4A82, 0x1B8A, -0x4A0F, 0x5B0F, 0x4F82, 0x1B8C, 0x4A82, 0x1B8E, 0x9318, 0x240B, 0x9308, -0x2003, 0x43B2, 0x1B54, 0x3C02, 0x4882, 0x1B54, 0x4982, 0x1B56, 0x4382, -0x1B58, 0x430C, 0x4030, 0xFAD4, 0x120A, 0x120B, 0x1208, 0x4C0A, 0x4308, -0x430B, 0x90FA, 0x000B, 0x0000, 0x201A, 0x407D, 0x0093, 0x4A5C, 0x0002, -0x1292, 0xE000, 0x930C, 0x380F, 0x4A1B, 0x0004, 0x4B08, 0x5A18, 0x0008, -0x3C04, 0x4B2C, 0x1292, 0xE008, 0x532B, 0x980B, 0x2BFA, 0x403B, 0x8000, -0x3C05, 0x403B, 0x8007, 0x3C02, 0x403B, 0x800B, 0x903B, 0x8000, 0x2002, -0x1292, 0xE002, 0x4B0C, 0x4030, 0xFAD8, 0x434F, 0x434E, 0x3C01, 0x536E, -0x936E, 0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE03C, 0x2BF8, 0x9C8D, 0xE03E, -0x2BF5, 0x936E, 0x2C02, 0x436F, 0x3C11, 0x434E, 0x3C01, 0x536E, 0x926E, -0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE040, 0x2BF8, 0x9C8D, 0xE042, 0x2BF5, -0x926E, 0x2C02, 0x407F, 0x0003, 0x934F, 0x2006, 0x503C, 0xDB00, 0x903C, -0x00FF, 0x2C01, 0x435F, 0x4F4C, 0x4130, 0x403E, 0x1A46, 0x4E6F, 0xB0FF, -0x000B, 0x1A4C, 0x2403, 0x93A2, 0x1B5E, 0x2FF6, 0x4E6F, 0xB0FF, 0x000B, -0x1A4C, 0x2405, 0x12B0, 0xFB5A, 0x403C, 0x8007, 0x4130, 0x4E6F, 0x5F0F, -0x4F1F, 0x1B52, 0x4DCF, 0x0001, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4CCF, -0x0002, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x43CF, 0x0003, 0x4E6F, 0x5F0F, -0x40BF, 0x0003, 0x1A4E, 0x430C, 0x4130, 0x120A, 0x8321, 0x4C0A, 0x430C, -0x421E, 0x1B8E, 0xB35E, 0x2411, 0x410C, 0x12B0, 0xF836, 0x416D, 0x930C, -0x2007, 0x410C, 0x12B0, 0xF836, 0x416F, 0x108F, 0x5F0D, 0x3C01, 0x433C, -0x4D8A, 0x0000, 0x3C0F, 0x9E82, 0x1B8C, 0x2C03, 0x403C, 0xFFFE, 0x3C09, -0x4EAA, 0x0000, 0x53A2, 0x1B8E, 0x9292, 0x1B8E, 0x1B8C, 0x2C01, 0x431C, -0x5321, 0x413A, 0x4130, 0x120A, 0x430F, 0x403F, 0xFDFC, 0x40B2, 0xA593, -0x012A, 0x40B2, 0xA500, 0x012C, 0x40B2, 0xA502, 0x0128, 0x43BF, 0x0000, -0xB392, 0x012C, 0x2FFD, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA510, 0x012C, -0x430A, 0x3C06, 0x403D, 0x001E, 0x434C, 0x12B0, 0xF990, 0x531A, 0x903A, -0x0064, 0x2BF7, 0x4382, 0x0120, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, -0x4D0A, 0x4E0B, 0x407D, 0x0092, 0x1292, 0xE000, 0x930C, 0x3819, 0x930B, -0x2004, 0x4A0C, 0x1292, 0xE008, 0x3C0F, 0x4308, 0x3C08, 0x480E, 0x5E0E, -0x4B0F, 0x5E0F, 0x4F2C, 0x1292, 0xE008, 0x5318, 0x9A08, 0x2C03, 0x9038, -0x007E, 0x2BF3, 0x1292, 0xE002, 0x430C, 0x3C01, 0x433C, 0x4030, 0xFAD8, -0x433F, 0x93CC, 0x0004, 0x2012, 0x43C2, 0x1C7B, 0x40B2, 0xA510, 0x012C, -0x12B0, 0xEEF0, 0x430C, 0x12B0, 0xF748, 0x434C, 0x12B0, 0xF9B2, 0x435C, -0x12B0, 0xF9F2, 0x430F, 0x3C0C, 0x93DC, 0x0004, 0x2009, 0x43D2, 0x1C7B, -0x403C, 0x001E, 0x12B0, 0xF748, 0x12B0, 0xF77E, 0x431F, 0x4F0C, 0x4130, -0x1209, 0x120A, 0x120B, 0x430A, 0x430B, 0x4039, 0x0020, 0x5C0C, 0x6D0D, -0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, 0x5339, 0x23F6, 0x3C04, -0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, 0x413B, 0x413A, 0x4139, -0x4130, 0xC232, 0x4303, 0x4C0F, 0x5F0F, 0x4F82, 0x1B64, 0x4C82, 0x1B66, -0x4F82, 0x1B6E, 0x4C82, 0x1B70, 0x930C, 0x2406, 0x40F2, 0x0003, 0x1B62, -0x43E2, 0x1B6C, 0x3C04, 0x43C2, 0x1B62, 0x43C2, 0x1B6C, 0xD232, 0x430C, -0x4130, 0x120A, 0x120B, 0x430A, 0x3C11, 0x4A0B, 0x5B0B, 0x5B0B, 0x5B0B, -0x4B1C, 0x1A08, 0x930C, 0x2402, 0x12B0, 0xF3F8, 0x438B, 0x1A08, 0x43BB, -0x1A06, 0x43DB, 0x1A0D, 0x531A, 0x922A, 0x3BED, 0x413B, 0x413A, 0x4130, -0x40B2, 0x1B90, 0x1A26, 0x4382, 0x1B9A, 0x434E, 0x3C0C, 0x4E4F, 0x5F0F, -0x421D, 0x1A04, 0x5F0D, 0x93BD, 0x0000, 0x2003, 0x40BF, 0xFB62, 0x24E0, -0x535E, 0x907E, 0x0010, 0x2BF1, 0x430C, 0x4130, 0x434C, 0x12B0, 0xFB4A, -0x12B0, 0xE386, 0x403C, 0x0800, 0x403D, 0x0007, 0x12B0, 0xF13A, 0x12B0, -0xEEF0, 0x434C, 0x12B0, 0xF9B2, 0x435C, 0x12B0, 0xF9F2, 0x4030, 0xEB3A, -0x434F, 0x434E, 0x3C01, 0x536E, 0x907E, 0x0006, 0x2C08, 0x4E4D, 0x5D0D, -0x9D1C, 0xE028, 0x2BF7, 0x9C8D, 0xE02A, 0x2BF4, 0x907E, 0x0006, 0x2C01, -0x435F, 0x4F4C, 0x4130, 0x430F, 0x9292, 0x1B8E, 0x1B8C, 0x2C02, 0x433F, -0x3C0B, 0x421E, 0x1B8E, 0x4EEC, 0x0000, 0x5392, 0x1B8E, 0x9292, 0x1B8E, -0x1B8C, 0x2C01, 0x431F, 0x4F0C, 0x4130, 0x936C, 0x2C10, 0x4C4C, 0x5C0C, -0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x938C, 0x1B66, 0x2007, 0x5D0D, 0x4D8C, -0x1B64, 0x4D8C, 0x1B66, 0xC3EC, 0x1B62, 0x430C, 0x4130, 0x403E, 0x0114, -0x430D, 0x403C, 0x1A46, 0x12B0, 0xFA68, 0x4382, 0x1B5E, 0x43C2, 0x1C73, -0x434E, 0x3C04, 0x40B2, 0x1A50, 0x1B52, 0x435E, 0x934E, 0x27FA, 0x4130, -0x120A, 0x4C0A, 0xC0F2, 0x0040, 0x0000, 0x12B0, 0xF27C, 0x4A82, 0x1B84, -0x43D2, 0x1C75, 0x4382, 0x1B86, 0x43C2, 0x1C76, 0xD0F2, 0x0040, 0x0000, -0x413A, 0x4130, 0x907C, 0x0040, 0x240E, 0x430F, 0x3C01, 0x531F, 0x922F, -0x3409, 0x4F0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x9CCE, 0x1A0B, 0x23F6, 0x43DE, -0x1A0D, 0x431C, 0x4130, 0x907C, 0x0040, 0x240E, 0x430F, 0x3C01, 0x531F, -0x922F, 0x3409, 0x4F0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x9CCE, 0x1A0B, 0x23F6, -0x43CE, 0x1A0D, 0x431C, 0x4130, 0x434F, 0x434E, 0x3C01, 0x536E, 0x926E, -0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE034, 0x2BF8, 0x9C8D, 0xE036, 0x2BF5, -0x926E, 0x2C01, 0x435F, 0x4F4C, 0x4130, 0x120A, 0x4C0A, 0x403E, 0x0006, -0x4C0D, 0x403C, 0x1B8A, 0x12B0, 0xFA80, 0x4A92, 0x000C, 0x1B54, 0x4A92, -0x000E, 0x1B56, 0x430C, 0x413A, 0x4130, 0x4D4D, 0x5D0D, 0x5D0C, 0x4C1E, -0x0008, 0x4E82, 0x1B8A, 0x4E6F, 0x5F0E, 0x4E82, 0x1B8C, 0x421F, 0x1B8A, -0x522F, 0x4F82, 0x1B8E, 0x430C, 0x4130, 0x936C, 0x2C0D, 0x4C4C, 0x5C0C, -0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x5D0D, 0x4D8C, 0x1B64, 0x4D8C, 0x1B66, -0x43EC, 0x1B62, 0x430C, 0x4130, 0x936C, 0x2C0C, 0x4C4C, 0x5C0C, 0x4C0F, -0x5C0C, 0x5C0C, 0x5F0C, 0x43CC, 0x1B62, 0x438C, 0x1B64, 0x438C, 0x1B66, -0x430C, 0x4130, 0x425F, 0x1A46, 0x5F0F, 0x4F1F, 0x1B52, 0x4F5E, 0x0001, -0x425F, 0x1A46, 0x5F0F, 0x4F1F, 0x1B52, 0x4CCF, 0x0001, 0x4E4C, 0x4130, -0x936C, 0x2C0C, 0x4C4C, 0x5C0C, 0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x43DC, -0x1B62, 0x438C, 0x1B64, 0x438C, 0x1B66, 0x430C, 0x4130, 0x425F, 0x1A47, -0x5F0F, 0x438F, 0x1A48, 0x425F, 0x1A46, 0x5F0F, 0x4C8F, 0x1A4E, 0x425F, -0x1A46, 0xD3DF, 0x1A4C, 0x4130, 0x8321, 0x4C0D, 0x433C, 0x3C01, 0x533D, -0x930D, 0x2405, 0x410C, 0x12B0, 0xF836, 0x933C, 0x23F8, 0x5321, 0x4130, -0x4C1F, 0x0002, 0x4F0E, 0x8D0E, 0x903E, 0x0005, 0x2806, 0x4D8C, 0x0002, -0x43CD, 0x0000, 0x4F8D, 0x0002, 0x4130, 0x120A, 0x4C0A, 0x3C03, 0x4DCA, -0x0000, 0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, 0x4130, 0x120A, -0x4C0A, 0x3C03, 0x4DFA, 0x0000, 0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, -0x413A, 0x4130, 0x430F, 0x3C02, 0x4303, 0x531F, 0x933F, 0x23FC, 0x4382, -0x0120, 0x4130, 0x3C02, 0xC3E2, 0x0002, 0xB3E2, 0x0002, 0x2FFB, 0xD3E2, -0x0000, 0x1300, 0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, -0x23FB, 0x4130, 0x4135, 0x4134, 0x4137, 0x4136, 0x4139, 0x4138, 0x413B, -0x413A, 0x4130, 0x3C04, 0x4DFC, 0x0000, 0x531C, 0x533E, 0x930E, 0x23FA, -0x430C, 0x4130, 0x120D, 0x120C, 0x422D, 0x410C, 0x12B0, 0xEFBE, 0x5221, -0x4130, 0x120C, 0x4EFC, 0x0000, 0x531C, 0x831D, 0x23FB, 0x413C, 0x4130, -0x40B2, 0x0032, 0x1B5E, 0xD0F2, 0x0080, 0x0002, 0x4130, 0x434C, 0x12B0, -0xF9F2, 0x435C, 0x12B0, 0xF9B2, 0x3FFF, 0x124C, 0x431D, 0x410C, 0x12B0, -0xEFBE, 0x5321, 0x4130, 0x120C, 0x432D, 0x410C, 0x12B0, 0xEFBE, 0x5321, -0x4130, 0x40B2, 0x5A80, 0x0120, 0x4130, 0x4030, 0xFB56, 0x4030, 0xFB64, -0x4030, 0xF886, 0x4030, 0xFA80, 0x1300, 0x3FFF, 0x000B, 0xEC42, 0xE0B0, -0xEE18, 0xFAAA, 0xE088, 0x000F, 0x2112, 0xFEDF, -}; - -const uint32_t coreImage_address[] = -{ -0x0000E000, 0x0000FDD8, 0x0000FDEA, 0x0000FDF2, 0x0000FDF6, -}; -const uint32_t coreImage_length_of_sections[] = -{ -0x00000DB3, 0x00000001, 0x00000002, 0x00000001, 0x00000005, -}; -const uint32_t coreImage_sections = 0x00000005; -const uint32_t coreImage_termination = 0x00000000; -const uint32_t coreImage_start = 0x0000E000; -const uint32_t coreImage_finish = 0x0000FE00; -const uint32_t coreImage_length = 0x00001E00; - -#define COREIMAGE_TERMINATION 0x00000000 -#define COREIMAGE_START 0x0000E000 -#define COREIMAGE_FINISH 0x0000FE00 -#define COREIMAGE_LENGTH 0x00001E00 -#define COREIMAGE_SECTIONS 0x00000005 diff --git a/Bios/include/JtagId.h b/Bios/include/JtagId.h new file mode 100644 index 0000000..082bf7d --- /dev/null +++ b/Bios/include/JtagId.h @@ -0,0 +1,70 @@ +/* + * JtagId.h + * + * Encapsulate common Jtag ID queries. + * + * Copyright (C) 2007 - 2011 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 JTAG_ID_H_INCLUDED +#define JTAG_ID_H_INCLUDED + +#if defined(__cplusplus) +extern "C" { +#endif + +inline static int jtagIdIsValid(unsigned long id) +{ + return id == 0x89 || id == 0x8D || id == 0x91 || id == 0x95 || id == 0x98 || id == 0x99 || id == 0x4ba00477; +} + +inline static int jtagIdIsMSP432(unsigned long id) +{ + return id == 0x4ba00477; +} + +inline static int jtagIdIsMSP430(unsigned long id) +{ + return id == 0x89 || id == 0x8D || id == 0x91 || id == 0x95 || id == 0x98 || id == 0x99; +} + +inline static int jtagIdIsXv2(unsigned long id) +{ + return id == 0x91 || id == 0x95 || id == 0x98 || id == 0x99; +} + +#if defined(__cplusplus) +} + +#endif + +#endif diff --git a/Bios/include/MSP_FetComChannel.h b/Bios/include/MSP_FetComChannel.h new file mode 100644 index 0000000..358506d --- /dev/null +++ b/Bios/include/MSP_FetComChannel.h @@ -0,0 +1,288 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetComChannelImage[] = +{ +0x6000, 0x0004, 0x0009, 0x0009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8457, 0xACDC, +0xACDC, 0x4180, 0xEA00, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, +0x1840, 0x1207, 0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, +0x120B, 0x1840, 0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, +0x008C, 0x4A10, 0x403E, 0x0389, 0x403F, 0x0000, 0x13B4, 0x6E82, 0x008C, +0x4A04, 0x048D, 0x7022, 0x403E, 0x000B, 0x403F, 0x0000, 0x13B4, 0x701C, +0x1840, 0x413F, 0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, +0x413B, 0x1840, 0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, +0x1840, 0x4136, 0x1840, 0x4135, 0x1840, 0x4134, 0x1A00, 0x4070, 0x693C, +0x4011, 0xE972, 0x141B, 0x4C0A, 0x4D0B, 0x002F, 0x4A04, 0x438F, 0x0000, +0x1840, 0x4E82, 0x4AF2, 0x4A0E, 0x4B0F, 0x830F, 0x2016, 0x803E, 0x1F41, +0x2428, 0x803E, 0x0640, 0x2499, 0x831E, 0x2497, 0x803E, 0x0012, 0x2420, +0x831E, 0x2437, 0x831E, 0x2459, 0x831E, 0x2427, 0x831E, 0x241E, 0x831E, +0x242F, 0x3CF2, 0x831F, 0x2008, 0x803E, 0x86A0, 0x24B4, 0x831E, 0x24B2, +0x831E, 0x24B0, 0x3CE8, 0x803F, 0x0005, 0x20E5, 0x803E, 0x1A80, 0x24A9, +0x831E, 0x24A7, 0x831E, 0x24A5, 0x3CDD, 0x430C, 0x1380, 0x4AB6, 0x13B4, +0x6E4C, 0x3D1E, 0x430C, 0x1380, 0x4A56, 0x430C, 0x1380, 0x4A5A, 0x3D17, +0x403C, 0x0CE4, 0x1380, 0x4AD2, 0x403C, 0x0CE4, 0x1380, 0x4A56, 0x431C, +0x1380, 0x4A5A, 0x3D0B, 0x431C, 0x1380, 0x4AB6, 0x1A00, 0x40F2, 0x6C86, +0x4A22, 0x1A00, 0x40F2, 0x6350, 0x4A3E, 0x1A00, 0x40F2, 0x7014, 0x4A42, +0x1A00, 0x40F2, 0x7014, 0x4A46, 0x903A, 0x2599, 0x2008, 0x930B, 0x2006, +0x431D, 0x403C, 0x2595, 0x13B4, 0x6E0A, 0x3CED, 0x430D, 0x403C, 0x2595, +0x13B4, 0x6E0A, 0x3CE7, 0x431C, 0x1380, 0x4AB6, 0x1A00, 0x40F2, 0x6C86, +0x4A22, 0x1A00, 0x40F2, 0x6350, 0x4A3E, 0x1840, 0x90B2, 0xAAAC, 0x4AF2, +0x2405, 0x1840, 0x90B2, 0xAAAD, 0x4AF2, 0x200E, 0x1A00, 0x40F2, 0x7014, +0x4A42, 0x1A00, 0x40F2, 0x7014, 0x4A46, 0x430D, 0x403C, 0x2595, 0x13B4, +0x6E0A, 0x3CC4, 0x1A00, 0x40F2, 0x6F2E, 0x4A42, 0x1A00, 0x40F2, 0x6F1C, +0x4A46, 0x430D, 0x403C, 0x2596, 0x13B4, 0x6E0A, 0x1380, 0x4A42, 0x002F, +0x4A04, 0x4C8F, 0x0000, 0x3CB0, 0x1A00, 0x40F2, 0x7014, 0x4A42, 0x1A00, +0x40F2, 0x7014, 0x4A46, 0x1A00, 0x40F2, 0x7020, 0x4A4A, 0x13B4, 0x6FEE, +0x403C, 0x0CE4, 0x1380, 0x4AD2, 0x403C, 0x0CE4, 0x1380, 0x4A56, 0x431C, +0x1380, 0x4A5A, 0x432C, 0x1380, 0x4A62, 0x431C, 0x1380, 0x4AB6, 0x903A, +0x2582, 0x2002, 0x930B, 0x2403, 0x430C, 0x1380, 0x4A96, 0x1A00, 0x40F2, +0x6BD4, 0x4A22, 0x1A00, 0x40F2, 0x6714, 0x4A3E, 0x3C80, 0x1A00, 0x40F2, +0x7014, 0x4A42, 0x1A00, 0x40F2, 0x7014, 0x4A46, 0x1A00, 0x40F2, 0x7020, +0x4A4A, 0x403C, 0x0CE4, 0x1380, 0x4AD2, 0x403C, 0x0CE4, 0x1380, 0x4A56, +0x431C, 0x1380, 0x4A5A, 0x432C, 0x1380, 0x4A62, 0x430C, 0x1380, 0x4AB6, +0x432C, 0x1380, 0x4AB6, 0x903A, 0x86A2, 0x2002, 0x931B, 0x2409, 0x903A, +0x1A82, 0x2003, 0x903B, 0x0006, 0x2403, 0x430C, 0x1380, 0x4A96, 0x13B4, +0x6F52, 0x1A00, 0x40F2, 0x64C8, 0x4A22, 0x1A00, 0x40F2, 0x7018, 0x4A3E, +0x3C47, 0x903A, 0x1A80, 0x2003, 0x903B, 0x0006, 0x2441, 0x903A, 0x86A0, +0x2002, 0x931B, 0x243C, 0x903A, 0x2581, 0x2002, 0x930B, 0x2437, 0x903A, +0x2596, 0x2002, 0x930B, 0x2432, 0x903A, 0x2595, 0x2002, 0x930B, 0x242D, +0x903A, 0x2597, 0x2002, 0x930B, 0x2428, 0x903A, 0x2594, 0x2002, 0x930B, +0x2423, 0x903A, 0x2598, 0x2002, 0x930B, 0x241E, 0x903A, 0x86A1, 0x2002, +0x931B, 0x2419, 0x903A, 0x1A81, 0x2003, 0x903B, 0x0006, 0x2413, 0x903A, +0x86A2, 0x2002, 0x931B, 0x240E, 0x903A, 0x1A82, 0x2003, 0x903B, 0x0006, +0x2408, 0x903A, 0x2582, 0x2002, 0x930B, 0x2403, 0x431C, 0x1380, 0x4AB6, +0x161A, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x13B4, 0x6F1C, 0x1840, 0x921A, +0x4B92, 0x2004, 0x1840, 0x921B, 0x4B94, 0x24AA, 0xD3D2, 0x0600, 0xD0F2, +0x0080, 0x0600, 0x903A, 0x12C0, 0x200A, 0x930B, 0x2008, 0x40F2, 0x001E, +0x0606, 0x43D2, 0x0607, 0x40F2, 0x00C1, 0x0608, 0x903A, 0x2580, 0x200B, +0x930B, 0x2009, 0x40F2, 0x008F, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x00E1, +0x0608, 0x3C70, 0x903A, 0x3840, 0x200B, 0x930B, 0x2009, 0x40F2, 0x005F, +0x0606, 0x43C2, 0x0607, 0x40F2, 0x0091, 0x0608, 0x3C62, 0x903A, 0x4B00, +0x200B, 0x930B, 0x2009, 0x40F2, 0x0047, 0x0606, 0x43C2, 0x0607, 0x40F2, +0x00F1, 0x0608, 0x3C54, 0x903A, 0x7080, 0x200B, 0x930B, 0x2009, 0x40F2, +0x002F, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x0051, 0x0608, 0x3C46, 0x903A, +0x9600, 0x200B, 0x930B, 0x2009, 0x40F2, 0x0023, 0x0606, 0x43C2, 0x0607, +0x40F2, 0x0081, 0x0608, 0x3C38, 0x903A, 0xDAC0, 0x200B, 0x930B, 0x2009, +0x40F2, 0x0018, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x0041, 0x0608, 0x3C2A, +0x903A, 0xE100, 0x200B, 0x930B, 0x2009, 0x40F2, 0x0017, 0x0606, 0x43C2, +0x0607, 0x40F2, 0x00A1, 0x0608, 0x3C1C, 0x903A, 0xC200, 0x200B, 0x931B, +0x2009, 0x40F2, 0x000B, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x00D1, 0x0608, +0x3C0E, 0x903A, 0xE800, 0x200B, 0x903B, 0x0003, 0x2008, 0x40F2, 0x0005, +0x0606, 0x43C2, 0x0607, 0x40F2, 0x00E1, 0x0608, 0x1840, 0x9392, 0x4B96, +0x2004, 0xD0F2, 0x00C0, 0x0601, 0x3C08, 0xF0F2, 0x003F, 0x0601, 0x43C2, +0x0600, 0xD0F2, 0x0080, 0x0600, 0xC3D2, 0x0600, 0xD3D2, 0x061C, 0x1840, +0x4A82, 0x4B92, 0x1840, 0x4B82, 0x4B94, 0x13B4, 0x6F2E, 0x430C, 0x161A, +0x0110, 0x140A, 0x8031, 0x0412, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x435C, 0x1380, 0x4B04, 0x4C4A, 0x934A, 0x2478, 0x410C, 0x503C, 0x020A, +0x403E, 0x0208, 0x13B4, 0x6F08, 0x410C, 0x532C, 0x403E, 0x0208, 0x13B4, +0x6F08, 0x4381, 0x0000, 0x435E, 0x4A4D, 0x410C, 0x503C, 0x020A, 0x1380, +0x4B08, 0x1840, 0x9382, 0x4A08, 0x2426, 0x415E, 0x020B, 0x4E4E, 0x415F, +0x020C, 0x4F4F, 0xF03F, 0x00FF, 0x108F, 0xDE0F, 0x1840, 0x4F82, 0x4B82, +0x1840, 0x4382, 0x4A08, 0x403F, 0x0005, 0x1840, 0x521F, 0x4B82, 0x4A4A, +0x8A0F, 0x1840, 0x4F82, 0x4B82, 0x1253, 0x434F, 0x4A4E, 0x410D, 0x503D, +0x020C, 0x407C, 0x0048, 0x13B4, 0x6AEA, 0x5321, 0x3C0F, 0x4A4A, 0x1840, +0x8A82, 0x4B82, 0x1243, 0x434F, 0x4A4E, 0x410D, 0x503D, 0x020C, 0x407C, +0x0048, 0x13B4, 0x6AEA, 0x5321, 0x1840, 0x9382, 0x4B82, 0x2003, 0x1840, +0x4392, 0x4B80, 0x1840, 0x9382, 0x4B80, 0x241E, 0x430A, 0x432C, 0x1380, +0x4B34, 0x435F, 0x410E, 0x530E, 0x410D, 0x532D, 0x407C, 0x0048, 0x13B4, +0x65F4, 0x430A, 0x3C07, 0x4A0F, 0x510F, 0x4F5C, 0x0002, 0x13B4, 0x69E0, +0x531A, 0x912A, 0x2BF7, 0x1840, 0x4392, 0x4A08, 0x1840, 0x4382, 0x4B80, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x430C, 0x5031, 0x0412, 0x160A, 0x0110, 0x145B, 0x4C46, +0x0DCB, 0x0EC8, 0x434C, 0x430A, 0x4229, 0x934F, 0x2404, 0x435C, 0x13B4, +0x6832, 0x3C03, 0x434C, 0x13B4, 0x6832, 0x464C, 0x5C0C, 0xD35C, 0x13B4, +0x6C2E, 0x13B4, 0x6F40, 0x13B4, 0x6F40, 0x407C, 0x0003, 0x13B4, 0x6832, +0x934C, 0x2002, 0x430C, 0x3C6D, 0x435C, 0x13B4, 0x6A66, 0x0BCF, 0x0AEF, +0x4CCF, 0x0000, 0x531A, 0x435C, 0x13B4, 0x6A66, 0x0BCF, 0x0AEF, 0x4CCF, +0x0000, 0x0BCF, 0x0AEF, 0x90FF, 0x0080, 0x0000, 0x240D, 0x4398, 0x0000, +0x434C, 0x13B4, 0x6A66, 0x0AEB, 0x4CCB, 0x0000, 0x436C, 0x13B4, 0x6832, +0x431C, 0x3C4B, 0x531A, 0x435C, 0x13B4, 0x6A66, 0x0BCF, 0x0AEF, 0x4CCF, +0x0000, 0x531A, 0x435C, 0x13B4, 0x6A66, 0x0BCF, 0x0AEF, 0x4CCF, 0x0000, +0x4A0F, 0x533F, 0x0BCE, 0x0FEE, 0x4E6E, 0x4E4E, 0x0BCF, 0x0AEF, 0x4F69, +0x4949, 0xF039, 0x00FF, 0x1089, 0xDE09, 0x5039, 0x0006, 0x4A0F, 0x533F, +0x0BCE, 0x0FEE, 0x4E6E, 0x4E4E, 0x0BCF, 0x0AEF, 0x4F6F, 0x4F4F, 0xF03F, +0x00FF, 0x108F, 0xDE0F, 0x503F, 0x0006, 0x4F88, 0x0000, 0x531A, 0x3C09, +0x435C, 0x13B4, 0x6A66, 0x4A0F, 0x0BCE, 0x0FEE, 0x4CCE, 0x0000, 0x531A, +0x490F, 0x533F, 0x9F0A, 0x2BF3, 0x434C, 0x13B4, 0x6A66, 0x0AEB, 0x4CCB, +0x0000, 0x436C, 0x13B4, 0x6832, 0x431C, 0x1656, 0x0110, 0xC0F2, 0x0020, +0x0282, 0x1840, 0x921C, 0x4B00, 0x2004, 0x1840, 0x921D, 0x4B02, 0x2482, +0xD3D2, 0x0600, 0xD0F2, 0x0080, 0x0600, 0x903C, 0x2580, 0x200B, 0x930D, +0x2009, 0x40F2, 0x008F, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x00E1, 0x0608, +0x3C62, 0x903C, 0x4B00, 0x200B, 0x930D, 0x2009, 0x40F2, 0x0047, 0x0606, +0x43C2, 0x0607, 0x40F2, 0x00F1, 0x0608, 0x3C54, 0x903C, 0x7080, 0x200B, +0x930D, 0x2009, 0x40F2, 0x002B, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x0051, +0x0608, 0x3C46, 0x903C, 0x9600, 0x200B, 0x930D, 0x2009, 0x40F2, 0x0023, +0x0606, 0x43C2, 0x0607, 0x40F2, 0x0081, 0x0608, 0x3C38, 0x903C, 0xDAC0, +0x200B, 0x930D, 0x2009, 0x40F2, 0x0018, 0x0606, 0x43C2, 0x0607, 0x40F2, +0x0041, 0x0608, 0x3C2A, 0x903C, 0xE100, 0x200B, 0x930D, 0x2009, 0x40F2, +0x0017, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x00A1, 0x0608, 0x3C1C, 0x903C, +0xC200, 0x200B, 0x931D, 0x2009, 0x40F2, 0x000B, 0x0606, 0x43C2, 0x0607, +0x40F2, 0x00D1, 0x0608, 0x3C0E, 0x903C, 0xE800, 0x200B, 0x903D, 0x0003, +0x2008, 0x40F2, 0x0005, 0x0606, 0x43C2, 0x0607, 0x40F2, 0x00E1, 0x0608, +0x40F2, 0x00C0, 0x0601, 0xC3D2, 0x0600, 0xD3D2, 0x061C, 0x1840, 0x4C82, +0x4B00, 0x1840, 0x4D82, 0x4B02, 0x430C, 0x0110, 0x434E, 0x934C, 0x2014, +0xD2F2, 0x0265, 0xD0F2, 0x0010, 0x0202, 0xD0F2, 0x0020, 0x0282, 0x13B4, +0x6F40, 0xC2F2, 0x0263, 0x13B4, 0x6F40, 0xC0F2, 0x0020, 0x0282, 0x13B4, +0x6F40, 0x3C68, 0x935C, 0x201B, 0xD2F2, 0x0265, 0xD0F2, 0x0010, 0x0202, +0xC0F2, 0x0020, 0x0282, 0xD2F2, 0x0263, 0x13B4, 0x6F40, 0xD0F2, 0x0020, +0x0282, 0x13B4, 0x6F40, 0xC2F2, 0x0263, 0x13B4, 0x6F40, 0xC0F2, 0x0020, +0x0282, 0x13B4, 0x6F40, 0x3C4B, 0x936C, 0x2018, 0xD2F2, 0x0265, 0xD0F2, +0x0010, 0x0202, 0xC2F2, 0x0263, 0x13B4, 0x6F40, 0xC0F2, 0x0020, 0x0282, +0x13B4, 0x6F40, 0xD0F2, 0x0020, 0x0282, 0x13B4, 0x6F40, 0xD2F2, 0x0263, +0x13B4, 0x6F40, 0x3C31, 0x907C, 0x0003, 0x202E, 0xC2F2, 0x0263, 0xC2F2, +0x0265, 0xC0F2, 0x0010, 0x0202, 0xC0F2, 0x0020, 0x0282, 0x13B4, 0x6F40, +0xD0F2, 0x0020, 0x0282, 0x13B4, 0x6F40, 0x425E, 0x0261, 0xF27E, 0xD0F2, +0x0040, 0x0202, 0xC0F2, 0x0020, 0x0284, 0x13B4, 0x6F40, 0x3C02, 0x13B4, +0x6F40, 0xB0F2, 0x0020, 0x0280, 0x2BFA, 0xC0F2, 0x0020, 0x0282, 0x13B4, +0x6F40, 0xD0F2, 0x0020, 0x0284, 0xC0F2, 0x0040, 0x0202, 0x934E, 0x2002, +0x435C, 0x0110, 0x434C, 0x0110, 0x140A, 0x0CCA, 0x1A00, 0x40F2, 0x7008, +0x4A1A, 0x1A00, 0x40F2, 0x6CD2, 0x4A1E, 0x1A00, 0x40F2, 0x69E0, 0x4A26, +0x1A00, 0x40F2, 0x6EC8, 0x4A2E, 0x1A00, 0x40F2, 0x6FC4, 0x4A32, 0x1A00, +0x40F2, 0x6DBE, 0x4A36, 0x1A00, 0x40F2, 0x6B6A, 0x4A3A, 0x1A00, 0x40F2, +0x6E4C, 0x4A2A, 0x1A00, 0x40F2, 0x7014, 0x4A42, 0x1A00, 0x40F2, 0x7014, +0x4A46, 0x1A00, 0x40F2, 0x7000, 0x4A4A, 0x1A00, 0x40F2, 0x6C86, 0x4A22, +0x1A00, 0x40F2, 0x6350, 0x4A3E, 0x1A00, 0x40F2, 0x700E, 0x4A4E, 0x430D, +0x403C, 0x2595, 0x13B4, 0x6E0A, 0x1840, 0x4382, 0x4A10, 0x1800, 0x40F2, +0x4B98, 0x4A12, 0x1840, 0x43D2, 0x4A0E, 0x0ACC, 0x008E, 0x4A1A, 0x008D, +0x001C, 0x13B4, 0x6EB2, 0x160A, 0x0110, 0x140A, 0x4C4A, 0x1380, 0x4A46, +0x002F, 0x4A04, 0x4C8F, 0x0000, 0x1840, 0x90B2, 0x0100, 0x4A10, 0x240F, +0x002E, 0x4A12, 0x1840, 0x421F, 0x4A10, 0x0FEE, 0x4ACE, 0x0000, 0x1840, +0x5392, 0x4A10, 0x1840, 0x5392, 0x4AEE, 0x3C1E, 0x13B4, 0x6D0E, 0x002E, +0x4A12, 0x1840, 0x421F, 0x4A10, 0x0FEE, 0x4ACE, 0x0000, 0x1840, 0x5392, +0x4A10, 0x1840, 0x4392, 0x4AEE, 0x1840, 0x4382, 0x4AF0, 0x13B4, 0x6EDE, +0x1203, 0x1230, 0x000A, 0x435E, 0x403D, 0x0100, 0x1380, 0x4AEA, 0x5221, +0x1380, 0x4A42, 0x002F, 0x4A04, 0x4C8F, 0x0000, 0x430C, 0x160A, 0x0110, +0x434F, 0x434E, 0x434D, 0xC2F2, 0x0263, 0xC2F2, 0x0265, 0xC0F2, 0x0010, +0x0202, 0x13B4, 0x6F40, 0x434F, 0x3C02, 0x434D, 0x535F, 0x927F, 0x2C11, +0x13B4, 0x6F40, 0xC0F2, 0x0020, 0x0282, 0x13B4, 0x6F40, 0xD0F2, 0x0020, +0x0282, 0x5E4E, 0xB2F2, 0x0261, 0x2BEE, 0xD35E, 0x435D, 0x3FEC, 0x934D, +0x2402, 0xD2F2, 0x0263, 0xD2F2, 0x0265, 0xD0F2, 0x0010, 0x0202, 0xC0F2, +0x0020, 0x0282, 0x935C, 0x2003, 0xC2F2, 0x0263, 0x3C02, 0xD2F2, 0x0263, +0x13B4, 0x6F40, 0xD0F2, 0x0020, 0x0282, 0x13B4, 0x6F40, 0xC0F2, 0x0020, +0x0282, 0x4E4C, 0x0110, 0x145B, 0x8321, 0x4C46, 0x0DC9, 0x4E0B, 0x4F48, +0x415E, 0x001E, 0x43C1, 0x0000, 0x430A, 0x934E, 0x2412, 0x434C, 0x13B4, +0x6832, 0x5646, 0x464C, 0x13B4, 0x6C2E, 0x407C, 0x0003, 0x13B4, 0x6832, +0x4CC1, 0x0000, 0x93C1, 0x0000, 0x2002, 0x430C, 0x3C1E, 0x430A, 0x3C01, +0x531A, 0x9B0A, 0x2C13, 0x09CF, 0x0AEF, 0x4F6C, 0x13B4, 0x6C2E, 0x407C, +0x0003, 0x13B4, 0x6832, 0x4CC1, 0x0000, 0x93C1, 0x0000, 0x23EF, 0x436C, +0x13B4, 0x6832, 0x430C, 0x3C06, 0x9348, 0x2403, 0x436C, 0x13B4, 0x6832, +0x431C, 0x5321, 0x1656, 0x0110, 0x1380, 0x4A22, 0x1840, 0x9382, 0x4AEE, +0x242E, 0x1840, 0x5392, 0x4AF0, 0x1840, 0x90B2, 0x05DC, 0x4AF0, 0x2826, +0x1380, 0x4A46, 0x002F, 0x4A04, 0x4C8F, 0x0000, 0xC3D2, 0x061C, 0x1840, +0x421D, 0x4AEE, 0x1840, 0x4382, 0x4AEE, 0x13B4, 0x6D0E, 0x13B4, 0x6EDE, +0x1203, 0x1230, 0x000A, 0x435E, 0x1380, 0x4AEA, 0x5221, 0x934C, 0x2003, +0x1840, 0x4382, 0x4AF0, 0xD3D2, 0x061C, 0x1380, 0x4A42, 0x002F, 0x4A04, +0x4C8F, 0x0000, 0x0110, 0x141B, 0x8031, 0x0104, 0x435C, 0x1380, 0x4AF4, +0x4C4A, 0x934A, 0x241F, 0x434B, 0x410C, 0x530C, 0x403E, 0x0104, 0x13B4, +0x6F08, 0x435E, 0x4A4D, 0x410C, 0x530C, 0x1380, 0x4AF8, 0x3C0F, 0x13B4, +0x6F70, 0x930C, 0x240B, 0x13B4, 0x6FD2, 0x930C, 0x2407, 0x4B4F, 0x510F, +0x4F6C, 0x13B4, 0x6FF8, 0x535B, 0x537A, 0x934A, 0x23EF, 0x430C, 0x5031, +0x0104, 0x161A, 0x0110, 0x407F, 0x0080, 0xD2F2, 0x0265, 0xD0F2, 0x0010, +0x0202, 0x427E, 0x3C0C, 0xC2F2, 0x0263, 0x1940, 0x104F, 0x13B4, 0x6F40, +0xD0F2, 0x0020, 0x0282, 0x13B4, 0x6F40, 0x537E, 0x935E, 0x280A, 0xC0F2, +0x0020, 0x0282, 0x4C4D, 0xFF4D, 0x9F4D, 0x23EB, 0xD2F2, 0x0263, 0x3FEA, +0xC0F2, 0x0020, 0x0282, 0xC2F2, 0x0263, 0xC2F2, 0x0265, 0xC0F2, 0x0010, +0x0202, 0x0110, 0x8321, 0x435C, 0x1380, 0x4B86, 0x934C, 0x241D, 0x13B4, +0x6F8C, 0x930C, 0x2419, 0x13B4, 0x6F9A, 0x930C, 0x2415, 0x1840, 0x93C2, +0x4D98, 0x2411, 0x1840, 0x9392, 0x4B84, 0x2003, 0x1840, 0x43C2, 0x4D98, +0x43C1, 0x0000, 0x435E, 0x431D, 0x410C, 0x530C, 0x1380, 0x4B8A, 0x41E2, +0x060E, 0x430C, 0x5321, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x411E, 0x000C, +0x1840, 0x921A, 0x4A16, 0x2004, 0x1840, 0x921B, 0x4A18, 0x240E, 0x4A0C, +0x4B0D, 0x13B4, 0x6092, 0x4A0C, 0x4B0D, 0x1380, 0x4A3E, 0x1840, 0x4A82, +0x4A16, 0x1840, 0x4B82, 0x4A18, 0x430C, 0x161A, 0x0110, 0x1840, 0x4382, +0x4A10, 0x1840, 0x93D2, 0x4A0E, 0x2008, 0x1800, 0x40F2, 0x4C98, 0x4A12, +0x1840, 0x43C2, 0x4A0E, 0x0110, 0x1800, 0x40F2, 0x4B98, 0x4A12, 0x1840, +0x43D2, 0x4A0E, 0x0110, 0xF0F2, 0x00F3, 0x026B, 0xF0F2, 0x00F3, 0x0265, +0xC3E2, 0x0203, 0xC3E2, 0x0205, 0xC0F2, 0x0020, 0x0282, 0xC0F2, 0x0020, +0x0284, 0xC0F2, 0x0020, 0x0286, 0x43C2, 0x021D, 0x0110, 0xF0F2, 0x00F3, +0x026B, 0xF0F2, 0x00F3, 0x0265, 0xC3E2, 0x0203, 0xC3E2, 0x0205, 0xC0F2, +0x0020, 0x0282, 0xC0F2, 0x0020, 0x0284, 0xC0F2, 0x0020, 0x0286, 0x43C2, +0x021D, 0x0110, 0x1840, 0x4392, 0x4B84, 0x1840, 0x43C2, 0x4D98, 0x43C2, +0x0219, 0xC3E2, 0x0219, 0x43C2, 0x021B, 0xD3E2, 0x021B, 0x43C2, 0x021D, +0x43C2, 0x021D, 0xD3E2, 0x021D, 0x0110, 0x140A, 0x0CCA, 0x008C, 0x4AE2, +0x0ACE, 0x008D, 0x0006, 0x13B4, 0x6EB2, 0x0ACC, 0x13B4, 0x6FB6, 0x0ACC, +0x13B4, 0x6F62, 0x0ACC, 0x13B4, 0x6F7E, 0x160A, 0x0110, 0xD0F2, 0x0020, +0x0282, 0xD2F2, 0x0263, 0xD0F2, 0x0020, 0x0284, 0xD2F2, 0x0265, 0xC0F2, +0x0040, 0x0202, 0xD0F2, 0x0010, 0x0202, 0x0480, 0x6F40, 0x903C, 0x2595, +0x2002, 0x13B4, 0x6EF4, 0x903C, 0x2596, 0x2002, 0x13B4, 0x6D94, 0x13B4, +0x6E9A, 0xD3D2, 0x061C, 0x1840, 0x4D82, 0x4B96, 0x0110, 0x141B, 0x0CCA, +0x3C06, 0x4DFA, 0x0000, 0x00AA, 0x0001, 0x533E, 0x633F, 0x4E0B, 0xDF0B, +0x930B, 0x23F6, 0x161A, 0x0110, 0x1840, 0x4382, 0x4A10, 0x1800, 0x40F2, +0x4B98, 0x4A12, 0x1840, 0x43D2, 0x4A0E, 0x13B4, 0x6D3C, 0x0480, 0x6D68, +0xD0F2, 0x0020, 0x0284, 0xC0F2, 0x0020, 0x0282, 0xC3E2, 0x0205, 0xD2F2, +0x026B, 0xD2E2, 0x026B, 0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, 0x3C04, +0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, 0xD0F2, 0x0020, +0x0284, 0x13B4, 0x6F1C, 0xC3E2, 0x0205, 0xD2F2, 0x026B, 0xD2E2, 0x026B, +0x0110, 0x1800, 0x124C, 0x4EBC, 0x0000, 0x03EC, 0x00BD, 0x0001, 0x23FA, +0x1800, 0x417C, 0x0110, 0x0CCF, 0x008C, 0x4A52, 0x0FCE, 0x008D, 0x0038, +0x13B4, 0x6EB2, 0x0FCC, 0x0480, 0x6FE0, 0x434C, 0x1840, 0x93C2, 0x4A0E, +0x2003, 0x008C, 0x4B98, 0x0110, 0x008C, 0x4C98, 0x0110, 0x1840, 0x4382, +0x4B84, 0x1840, 0x43D2, 0x4D98, 0xC3E2, 0x021B, 0x0480, 0x6FA8, 0x1800, +0x124C, 0x43CC, 0x0000, 0x531C, 0x831E, 0x23FB, 0x1800, 0x417C, 0x0110, +0xC0F2, 0x0020, 0x0282, 0x002F, 0x4A0A, 0x438F, 0x0000, 0x430C, 0x0110, +0xD0F2, 0x0020, 0x0282, 0x002F, 0x4A0A, 0x439F, 0x0000, 0x431C, 0x0110, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0110, +0xC3E2, 0x021B, 0xC2F2, 0x026B, 0xC2E2, 0x026B, 0x0480, 0x6DE6, 0x0CCE, +0x008C, 0x4B04, 0x008D, 0x0006, 0x0480, 0x6EB2, 0xB3D2, 0x060A, 0x2802, +0x430C, 0x0110, 0x431C, 0x0110, 0x0CCE, 0x008C, 0x4AF4, 0x008D, 0x0006, +0x0480, 0x6EB2, 0xB3D2, 0x060A, 0x2802, 0x430C, 0x0110, 0x431C, 0x0110, +0xB3E2, 0x061D, 0x2802, 0x431C, 0x0110, 0x430C, 0x0110, 0xD3E2, 0x0207, +0xD3E2, 0x0203, 0xD3E2, 0x0205, 0x0110, 0x0CCE, 0x008C, 0x4B86, 0x008D, +0x0006, 0x0480, 0x6EB2, 0x0CCE, 0x008C, 0x4AC2, 0x008D, 0x0010, 0x0480, +0x6EB2, 0xB3E2, 0x061D, 0x2802, 0x431C, 0x0110, 0x430C, 0x0110, 0x0CCE, +0x008C, 0x4B10, 0x008D, 0x0038, 0x0480, 0x6EB2, 0x13B4, 0x6E68, 0xD3D2, +0x061C, 0x0110, 0x4CC2, 0x060E, 0x430C, 0x0110, 0x1840, 0x43D2, 0x4D98, +0x0110, 0x403C, 0x0009, 0x0110, 0x403C, 0x0009, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x0480, 0x6E2E, 0x0110, 0x4A00, 0x0000, 0x0001, 0x4A00, +0x0000, 0xFF01, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, +}; + +const uint32_t MSP_FetComChannelImage_address[] = +{ +0x00001980, 0x00046000, +}; +const uint32_t MSP_FetComChannelImage_length_of_sections[] = +{ +0x00000040, 0x00000900, +}; +const uint32_t MSP_FetComChannelImage_sections = 0x00000002; +const uint32_t MSP_FetComChannelImage_termination = 0x00000000; +const uint32_t MSP_FetComChannelImage_start = 0x00001980; +const uint32_t MSP_FetComChannelImage_finish = 0x00047200; +const uint32_t MSP_FetComChannelImage_length = 0x00045880; + +#define MSP_FETCOMCHANNELIMAGE_TERMINATION 0x00000000 +#define MSP_FETCOMCHANNELIMAGE_START 0x00001980 +#define MSP_FETCOMCHANNELIMAGE_FINISH 0x00047200 +#define MSP_FETCOMCHANNELIMAGE_LENGTH 0x00045880 +#define MSP_FETCOMCHANNELIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/MSP_FetCore.h b/Bios/include/MSP_FetCore.h new file mode 100644 index 0000000..56236ae --- /dev/null +++ b/Bios/include/MSP_FetCore.h @@ -0,0 +1,1134 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetCoreImage[] = +{ +0xFFFF, 0x7AAA, 0x001D, 0x40B2, 0x5A80, 0x015C, 0x4031, 0x4900, 0x008C, +0x31DC, 0x403E, 0x0E58, 0x403F, 0x0000, 0x13B0, 0xC21A, 0x008C, 0x3100, +0x403D, 0xC9CA, 0x403E, 0x00DA, 0x403F, 0x0000, 0x13B0, 0xC640, 0x13B0, +0xA5F8, 0x13B0, 0xC668, 0x143F, 0x421F, 0x070E, 0x903F, 0x000C, 0x2004, +0x1380, 0x3342, 0xC392, 0x0700, 0x163C, 0x1300, 0x145F, 0x434A, 0xB2E2, +0x093E, 0x2811, 0x13B0, 0xB458, 0x4C4A, 0xC0F2, 0x0080, 0x0920, 0xC0F2, +0x0080, 0x0922, 0xC2E2, 0x093E, 0xD0F2, 0x0080, 0x0920, 0xD0F2, 0x0080, +0x0922, 0x421F, 0x0932, 0xF03F, 0x003F, 0x0FE0, 0x3CA7, 0x3C1E, 0x3CA5, +0x3CA4, 0x3C1D, 0x3C24, 0x3C2D, 0x3CA0, 0x3C9F, 0x3C34, 0x3C36, 0x3C38, +0x3C41, 0x3C4B, 0x3C99, 0x3C98, 0x3C53, 0x3C96, 0x3C95, 0x3C59, 0x3C93, +0x3C5C, 0x3C91, 0x3C90, 0x3C8F, 0x3C8E, 0x3C5C, 0x3C8C, 0x3C73, 0x3C8A, +0x3C89, 0x3C88, 0x4303, 0x3C86, 0x1840, 0xB392, 0x3D84, 0x2882, 0x13B0, +0xC658, 0x4C4A, 0x3C7E, 0x13B0, 0xBA7E, 0x1840, 0xB3A2, 0x3D84, 0x2878, +0x13B0, 0xC3C4, 0x4C4A, 0x3C74, 0x13B0, 0xB740, 0x1840, 0xB2A2, 0x3D84, +0x286E, 0x13B0, 0xC5C6, 0x4C4A, 0x3C6A, 0x13B0, 0xC134, 0x3C67, 0x13B0, +0xB88A, 0x3C64, 0x13B0, 0x99FE, 0x1840, 0xB2B2, 0x3D84, 0x285E, 0x13B0, +0xC65C, 0x4C4A, 0x3C5A, 0x13B0, 0xBC08, 0x1840, 0xB0B2, 0x0010, 0x3D84, +0x2853, 0x13B0, 0xC5CE, 0x4C4A, 0x3C4F, 0x13B0, 0xC1B8, 0x1840, 0xB0B2, +0x0020, 0x3D84, 0x2802, 0x13B0, 0xC5D6, 0x435A, 0x3C44, 0x40F2, 0x0080, +0x0921, 0x40F2, 0x0080, 0x0923, 0x13B0, 0xB458, 0x3C3B, 0x434C, 0x13B0, +0x94BC, 0x4C4A, 0x3C36, 0x435C, 0x13B0, 0x94BC, 0x4C4A, 0x3C31, 0x434C, +0x13B0, 0xC0B8, 0x930C, 0x200F, 0x434C, 0x13B0, 0xA910, 0x934C, 0x240A, +0x1840, 0xB0B2, 0x0040, 0x3D84, 0x2822, 0x434C, 0x13B0, 0xBEF0, 0x4C4A, +0x3C1D, 0x434C, 0x13B0, 0x9B36, 0x4C4A, 0x3C18, 0x435C, 0x13B0, 0xC0B8, +0x930C, 0x200F, 0x435C, 0x13B0, 0xA910, 0x934C, 0x240A, 0x1840, 0xB0B2, +0x0040, 0x3D84, 0x2809, 0x435C, 0x13B0, 0xBEF0, 0x4C4A, 0x3C04, 0x435C, +0x13B0, 0x9B36, 0x4C4A, 0x934A, 0x2404, 0xC0B1, 0x00D0, 0x0018, 0x4303, +0x165A, 0x1300, 0x145F, 0x90B2, 0x000E, 0x03AE, 0x2060, 0x008A, 0x3512, +0x93AA, 0x0000, 0x2806, 0xB3DA, 0x0002, 0x2C03, 0x53BA, 0x0000, 0x3C09, +0x939A, 0x0000, 0x2006, 0x438A, 0x0000, 0x403C, 0x8004, 0x13B0, 0xBFEC, +0x93AA, 0x0004, 0x2806, 0x1840, 0x93C2, 0x3E8A, 0x2002, 0x53BA, 0x0004, +0x008F, 0x351A, 0x4F6E, 0x4F1D, 0x0002, 0x035D, 0x9F1D, 0x0004, 0x7D4D, +0xF35D, 0xF35E, 0xED4E, 0x0F3E, 0x0006, 0x2404, 0xDFDE, 0x000A, 0x0000, +0x3C03, 0xCFDE, 0x000A, 0x0000, 0x938F, 0x0004, 0x2403, 0x53BF, 0x0004, +0x3C06, 0xB3EF, 0x0000, 0x2803, 0x4F9F, 0x0002, 0x0004, 0x4F5E, 0x000C, +0x4F1D, 0x000E, 0x035D, 0x9F1D, 0x0010, 0x7D4D, 0xF35D, 0xF35E, 0xED4E, +0x0F3E, 0x0012, 0x2404, 0xDFDE, 0x0016, 0x0000, 0x3C03, 0xCFDE, 0x0016, +0x0000, 0x938F, 0x0010, 0x2403, 0x53BF, 0x0010, 0x3C06, 0xB3EF, 0x000C, +0x2803, 0x4F9F, 0x000E, 0x0010, 0x165A, 0x1300, 0x140F, 0x421F, 0x042E, +0x903F, 0x000E, 0x2002, 0x4303, 0x3C01, 0x4303, 0x160F, 0x1300, 0x4303, +0x1300, 0x4303, 0x1300, 0x143F, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x421F, 0x019A, 0x0FE0, 0x3C10, 0x3C0F, 0x3C02, 0x3C0D, 0x3C0E, 0xF0B2, +0xFFF4, 0x016E, 0xC3A2, 0x0102, 0x435C, 0x13B0, 0xBF14, 0x434C, 0x13B0, +0xBF14, 0x3C0C, 0x4303, 0x3C0A, 0x4382, 0x0198, 0x13B0, 0xBECA, 0x435C, +0x13B0, 0xBF14, 0x434C, 0x13B0, 0xBF14, 0x163C, 0x1300, 0x143F, 0x421F, +0x019A, 0x0FE0, 0x3C10, 0x3C0F, 0x3C02, 0x3C0D, 0x3C0E, 0xF0B2, 0xFFF4, +0x016E, 0xC3A2, 0x0102, 0x435C, 0x13B0, 0xBF14, 0x434C, 0x13B0, 0xBF14, +0x3C0C, 0x4303, 0x3C0A, 0x4382, 0x0198, 0x13B0, 0xBECA, 0x435C, 0x13B0, +0xBF14, 0x434C, 0x13B0, 0xBF14, 0x163C, 0x1300, 0x145F, 0x421F, 0x036E, +0x903F, 0x000E, 0x2012, 0x008A, 0x3D74, 0x0ACD, 0x403C, 0xAA04, 0x1380, +0x3162, 0x930C, 0x2409, 0x0A0F, 0x938F, 0x0000, 0x2002, 0x539F, 0x0000, +0x0A0F, 0x539F, 0x0000, 0x165A, 0x1300, 0x143F, 0x008D, 0x3D70, 0x403C, +0xAA02, 0x1380, 0x3162, 0x930C, 0x2404, 0x002F, 0x3D70, 0x539F, 0x0000, +0x163C, 0x1300, 0x143F, 0x421F, 0x03EE, 0x903F, 0x000E, 0x200C, 0x008D, +0x3D6C, 0x403C, 0xAA03, 0x1380, 0x3162, 0x930C, 0x2404, 0x002F, 0x3D6C, +0x539F, 0x0000, 0x163C, 0x1300, 0x143F, 0x425C, 0x060C, 0x1380, 0x3D92, +0x163C, 0x1300, 0x143F, 0xB3E2, 0x021D, 0x2804, 0x43C2, 0x021D, 0x1380, +0x3DB6, 0x163C, 0x1300, 0x143F, 0xC392, 0x0102, 0x407D, 0x0095, 0x434C, +0x1380, 0x310A, 0x903C, 0x8007, 0x2406, 0x403C, 0x0006, 0x1380, 0x311A, +0x1380, 0x310E, 0x431C, 0x1380, 0x3E36, 0x163C, 0x1300, 0x147B, 0x8231, +0x0CC9, 0x433B, 0x4305, 0x4C5E, 0x0001, 0x0087, 0x3E6E, 0x0086, 0x33B8, +0x9EC6, 0x003B, 0x2003, 0x93C6, 0x003C, 0x380A, 0x4EC6, 0x003B, 0x4C5F, +0x0004, 0x4F86, 0x0030, 0x07CF, 0xD397, 0x0000, 0x3C03, 0x07CF, 0xC397, +0x0000, 0x93CC, 0x0002, 0x3803, 0xD3AF, 0x0000, 0x3C02, 0xC3AF, 0x0000, +0x0CCA, 0x03EA, 0x4AE6, 0x003C, 0x1840, 0x93C2, 0x3E88, 0x2006, 0x434C, +0x13B0, 0xBF14, 0x1840, 0x43D2, 0x3E88, 0x495E, 0x0001, 0x907E, 0x0081, +0x2038, 0x0088, 0x310A, 0xB397, 0x0000, 0x2807, 0x4914, 0x0004, 0x432C, +0x083F, 0x0038, 0x134F, 0x3C02, 0x4614, 0x0030, 0x9304, 0x2004, 0x09CC, +0x13B0, 0x8D1C, 0x4C05, 0x9305, 0x2020, 0x407D, 0x0093, 0x4A6C, 0x080F, +0x134F, 0x002F, 0x31D6, 0x9F14, 0x0008, 0x2D55, 0x002F, 0x3E6A, 0x04E4, +0x04CE, 0x04E4, 0x0EE4, 0x04EF, 0x0F3F, 0x0002, 0x03DF, 0x254A, 0x472C, +0x134F, 0x4C0B, 0x930C, 0x2145, 0x083F, 0x0004, 0x134F, 0x403B, 0x8000, +0x3D3F, 0x450B, 0x3D3D, 0x807E, 0x0051, 0x2455, 0x835E, 0x2458, 0x835E, +0x245F, 0x835E, 0x2463, 0x835E, 0x2466, 0x835E, 0x246D, 0x835E, 0x2470, +0x835E, 0x2471, 0x835E, 0x2473, 0x807E, 0x0007, 0x2474, 0x835E, 0x2476, +0x835E, 0x245A, 0x835E, 0x248B, 0x835E, 0x2498, 0x835E, 0x24C5, 0x835E, +0x24D2, 0x807E, 0x001C, 0x240D, 0x826E, 0x2417, 0x826E, 0x240F, 0x836E, +0x241D, 0x835E, 0x2423, 0x835E, 0x2415, 0x835E, 0x2468, 0x3D0B, 0x435D, +0x09CC, 0x13B0, 0x9E7C, 0x4C0B, 0x3D05, 0x434D, 0x09CC, 0x13B0, 0x9E7C, +0x4C0B, 0x3CFF, 0x495C, 0x0006, 0x13B0, 0xA6A4, 0x4C0B, 0x3CF9, 0x13B0, +0xB7CE, 0x431B, 0x3CF5, 0x495C, 0x0006, 0xD07C, 0x0040, 0x13B0, 0xB9DE, +0x4C0B, 0x3CED, 0x495C, 0x0006, 0xD07C, 0x0040, 0x13B0, 0xBA14, 0x4C0B, +0x3CE5, 0x09CC, 0x13B0, 0x9C66, 0x4C0B, 0x3CE0, 0x09CC, 0x13B0, 0x9628, +0x4C0B, 0x931C, 0x20DA, 0x13B0, 0xC31E, 0x3CD7, 0x472D, 0x09CC, 0x13B0, +0x9776, 0x4C0B, 0x3CD1, 0x09CC, 0x13B0, 0xC68C, 0x4C0B, 0x3CCC, 0x13B0, +0xB2E2, 0x3CC9, 0x491C, 0x0004, 0x1380, 0x3DD2, 0x4C0B, 0x3CC3, 0x09CC, +0x13B0, 0xA212, 0x4C0B, 0x3CBE, 0x13B0, 0xB55E, 0x3CBB, 0x1380, 0x3DBE, +0x4C0B, 0x3CB7, 0x1380, 0x3DC2, 0x4C0B, 0x3CB3, 0x1380, 0x3DCA, 0x4C0B, +0x3CAF, 0x407D, 0x0093, 0x4A6C, 0x1380, 0x310A, 0x491C, 0x0006, 0x1380, +0x3DCE, 0x4C0B, 0x3CA4, 0x407D, 0x0093, 0x4A6C, 0x1380, 0x310A, 0x9389, +0x0006, 0x2403, 0x13B0, 0xC5F6, 0x3C99, 0x13B0, 0xC606, 0x3C96, 0x407D, +0x0093, 0x4A6C, 0x1380, 0x310A, 0x002F, 0x3DE2, 0x03DF, 0x248D, 0x491C, +0x0006, 0x1380, 0x3DE2, 0x4C0B, 0x3C87, 0x4381, 0x0004, 0x4381, 0x0006, +0x4381, 0x0000, 0x4381, 0x0002, 0x002F, 0x3DEA, 0x03DF, 0x2407, 0x410D, +0x530D, 0x410C, 0x522C, 0x1380, 0x3DEA, 0x4C0B, 0x0088, 0x310A, 0x407D, +0x0093, 0x4A6C, 0x080F, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, 0x13B0, +0xC58E, 0x083F, 0x0010, 0x134F, 0x412C, 0x411D, 0x0002, 0x13B0, 0xC58E, +0x083F, 0x0010, 0x134F, 0x083F, 0x0004, 0x134F, 0x3C58, 0x407D, 0x0093, +0x4A6C, 0x1380, 0x310A, 0x002F, 0x3DE6, 0x03DF, 0x2404, 0x491C, 0x0006, +0x1380, 0x3DE6, 0x430B, 0x3C49, 0x0088, 0x310A, 0x407D, 0x0093, 0x4A6C, +0x080F, 0x134F, 0x08CB, 0x00AB, 0x0010, 0x13B0, 0xC4CA, 0x903C, 0xBEEF, +0x2025, 0x903D, 0xBEEF, 0x2022, 0x13B0, 0xC3EA, 0x934C, 0x241E, 0x13B0, +0xC572, 0x903C, 0xF00D, 0x2019, 0x903D, 0xF00D, 0x2016, 0x13B0, 0xC468, +0x934C, 0x2412, 0x0087, 0x31D6, 0x070F, 0x4F1C, 0x0012, 0x0B0F, 0x134F, +0x070F, 0x4F1C, 0x0014, 0x0B0F, 0x134F, 0x070F, 0x4F1C, 0x0016, 0x0B0F, +0x134F, 0x3C09, 0x430C, 0x0B0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x1380, 0x3DDA, 0x0B0F, 0x134F, 0x1380, 0x319E, 0x0B0F, +0x134F, 0x083F, 0x0004, 0x134F, 0x430B, 0x903B, 0x8000, 0x242C, 0x0088, +0x310A, 0x930B, 0x380F, 0x407D, 0x0091, 0x4A6C, 0x080F, 0x134F, 0x930C, +0x3821, 0x4B0C, 0x083F, 0x0010, 0x134F, 0x083F, 0x0004, 0x134F, 0x3C19, +0x407D, 0x0092, 0x4A6C, 0x080F, 0x134F, 0x4B0C, 0x083F, 0x0010, 0x134F, +0x903B, 0x8002, 0x200A, 0x465C, 0x003C, 0x535C, 0xF07C, 0x003F, 0x2001, +0x435C, 0x083F, 0x0010, 0x134F, 0x083F, 0x0004, 0x134F, 0x430C, 0x5231, +0x1674, 0x0110, 0x147B, 0x434A, 0x4308, 0x13B0, 0xC580, 0x434C, 0x13B0, +0xA910, 0x4C4B, 0x934C, 0x254B, 0x434E, 0x4C4D, 0x008C, 0x31DC, 0x13B0, +0x8F7C, 0x3C13, 0x4E6F, 0x1840, 0xD3DF, 0x33F5, 0x53DD, 0x003A, 0x92ED, +0x003A, 0x2802, 0x43CD, 0x003A, 0x4E6F, 0x0FEF, 0x1840, 0x438F, 0x33D8, +0x438D, 0x0034, 0x4303, 0x934B, 0x252F, 0x4A4F, 0x1840, 0x4F59, 0x31DC, +0x1840, 0x49C2, 0x3E89, 0x008D, 0x33B8, 0x0DCE, 0x00AE, 0x003A, 0x4E6F, +0x1840, 0xB3DF, 0x33F5, 0x2807, 0x403C, 0x8009, 0x13B0, 0xBFEC, 0x4038, +0x8009, 0x3FE5, 0x4E6F, 0x0FEF, 0x1840, 0x938F, 0x33D8, 0x2015, 0x1840, +0x40B2, 0x0032, 0x3512, 0x438D, 0x0034, 0x1840, 0xB359, 0x2806, 0x4E6F, +0x0FEF, 0x1840, 0x498F, 0x33E0, 0x3C06, 0x5319, 0x4E6F, 0x0FEF, 0x1840, +0x498F, 0x33E0, 0x4E6F, 0x0FEF, 0x1840, 0x90BF, 0x0104, 0x33E0, 0x2C5C, +0x4E6F, 0x0FEF, 0x1840, 0x4F19, 0x33E0, 0x5359, 0x4E6F, 0x0FEF, 0x1840, +0x4F1F, 0x33D8, 0x8F49, 0x994B, 0x2C01, 0x4B49, 0x494C, 0x035C, 0x4E6F, +0x064F, 0x1800, 0x4F57, 0x33B8, 0x4E6F, 0x0FEF, 0x1840, 0x4F1F, 0x33D8, +0x0FE7, 0x4A4F, 0x00AF, 0x31DC, 0x4346, 0x3C04, 0x4FB7, 0x0000, 0x03E7, +0x5356, 0x9C46, 0x2BFA, 0x5C4C, 0x3C13, 0x4A46, 0x5C06, 0x4E6F, 0x064F, +0x1800, 0x4F57, 0x33B8, 0x4E64, 0x04E4, 0x4C4F, 0x1840, 0x541F, 0x33D8, +0x0FE7, 0x1840, 0x46D7, 0x31DC, 0x0000, 0x535C, 0x994C, 0x2BEB, 0x4E6F, +0x0FEF, 0x1840, 0x598F, 0x33D8, 0x594A, 0x894B, 0x4E67, 0x07E7, 0x4E6F, +0x0FEF, 0x1840, 0x9F97, 0x33D8, 0x33E0, 0x2F75, 0x1840, 0x4382, 0x3512, +0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x33B8, 0x90FF, 0x0091, 0x0001, 0x2042, +0x434F, 0x3C08, 0x403C, 0x800A, 0x13B0, 0xBFEC, 0x4038, 0x800A, 0x3F60, +0x435F, 0x934F, 0x2356, 0x0087, 0x33FA, 0xB3E7, 0x0006, 0x2BF8, 0x073F, +0x010C, 0x4F59, 0x0002, 0xF079, 0x003F, 0x4E6F, 0x064F, 0x1800, 0x4F5F, +0x33B8, 0x9F59, 0x0002, 0x23EA, 0x073F, 0x010C, 0x93CF, 0x0003, 0x2008, +0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x33B8, 0x92EF, 0x0000, 0x2812, 0x0739, +0x010C, 0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x33B8, 0x9FD9, 0x0004, 0x0003, +0x23D2, 0xF0F7, 0x00F8, 0x0006, 0x1840, 0x4382, 0x3516, 0x3F24, 0xF0F7, +0x00F8, 0x0006, 0x3F20, 0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x33B8, 0x90FF, +0x0092, 0x0001, 0x4E6F, 0x203A, 0x064F, 0x1800, 0x4F5F, 0x33B8, 0x93CF, +0x0002, 0x200C, 0x435C, 0x13B0, 0xBF14, 0x434C, 0x13B0, 0xBFC8, 0x1840, +0x43C2, 0x3E88, 0x4038, 0x0092, 0x3F03, 0x434F, 0x3C01, 0x435F, 0x934F, +0x22FE, 0x0087, 0x33FA, 0x475F, 0x0006, 0xF07F, 0x0003, 0x907F, 0x0003, +0x23F4, 0x0739, 0x010C, 0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x33B8, 0x9FD9, +0x0002, 0x0002, 0x23E9, 0x0739, 0x010C, 0x4E6F, 0x064F, 0x1800, 0x4F5F, +0x33B8, 0x9FD9, 0x0004, 0x0003, 0x23DE, 0xC3E7, 0x0006, 0x3EDC, 0x064F, +0x1800, 0x4F5F, 0x33B8, 0x93CF, 0x0002, 0x22CA, 0x4E6F, 0x064F, 0x1800, +0x4F5F, 0x33B8, 0x90FF, 0x008B, 0x0001, 0x22C1, 0x13B0, 0xB3FC, 0x4038, +0x008B, 0x3ECE, 0x13B0, 0xC548, 0x480C, 0x1674, 0x0110, 0x140A, 0x430F, +0x430F, 0x3C01, 0x532F, 0x932F, 0x2C1D, 0x4F0E, 0x064E, 0x1840, 0x9E1D, +0xC824, 0x2BF7, 0x2004, 0x1840, 0x9E1C, 0xC822, 0x2BF2, 0x4F0E, 0x531E, +0x064E, 0x1840, 0x9D8E, 0xC824, 0x2BEB, 0x2004, 0x1840, 0x9C8E, 0xC822, +0x2BE6, 0x1840, 0x425C, 0xC9C0, 0x4C4C, 0x430D, 0x3D12, 0x430F, 0x3C01, +0x532F, 0x932F, 0x2C1D, 0x4F0E, 0x064E, 0x1840, 0x9E1D, 0xC81C, 0x2BF7, +0x2004, 0x1840, 0x9E1C, 0xC81A, 0x2BF2, 0x4F0E, 0x531E, 0x064E, 0x1840, +0x9D8E, 0xC81C, 0x2BEB, 0x2004, 0x1840, 0x9C8E, 0xC81A, 0x2BE6, 0x1840, +0x425C, 0xC9C1, 0x4C4C, 0x430D, 0x3CF0, 0x430F, 0x3C01, 0x532F, 0x932F, +0x2C1D, 0x4F0E, 0x064E, 0x1840, 0x9E1D, 0xC834, 0x2BF7, 0x2004, 0x1840, +0x9E1C, 0xC832, 0x2BF2, 0x4F0E, 0x531E, 0x064E, 0x1840, 0x9D8E, 0xC834, +0x2BEB, 0x2004, 0x1840, 0x9C8E, 0xC832, 0x2BE6, 0x1840, 0x425C, 0xC9C2, +0x4C4C, 0x430D, 0x3CCE, 0x430F, 0x3C01, 0x532F, 0x932F, 0x2C1D, 0x4F0E, +0x064E, 0x1840, 0x9E1D, 0xC83C, 0x2BF7, 0x2004, 0x1840, 0x9E1C, 0xC83A, +0x2BF2, 0x4F0E, 0x531E, 0x064E, 0x1840, 0x9D8E, 0xC83C, 0x2BEB, 0x2004, +0x1840, 0x9C8E, 0xC83A, 0x2BE6, 0x1840, 0x425C, 0xC9C8, 0x4C4C, 0x430D, +0x3CAC, 0x430F, 0x3C01, 0x532F, 0x922F, 0x2C1D, 0x4F0E, 0x064E, 0x1840, +0x9E1D, 0xC844, 0x2BF7, 0x2004, 0x1840, 0x9E1C, 0xC842, 0x2BF2, 0x4F0E, +0x531E, 0x064E, 0x1840, 0x9D8E, 0xC844, 0x2BEB, 0x2004, 0x1840, 0x9C8E, +0xC842, 0x2BE6, 0x1840, 0x425C, 0xC9C3, 0x4C4C, 0x430D, 0x3C8A, 0x430F, +0x3C01, 0x532F, 0x932F, 0x2C1D, 0x4F0E, 0x064E, 0x1840, 0x9E1D, 0xC854, +0x2BF7, 0x2004, 0x1840, 0x9E1C, 0xC852, 0x2BF2, 0x4F0E, 0x531E, 0x064E, +0x1840, 0x9D8E, 0xC854, 0x2BEB, 0x2004, 0x1840, 0x9C8E, 0xC852, 0x2BE6, +0x1840, 0x425C, 0xC9C5, 0x4C4C, 0x430D, 0x3C68, 0x430F, 0x3C01, 0x532F, +0x932F, 0x2C1D, 0x4F0E, 0x064E, 0x1840, 0x9E1D, 0xC82C, 0x2BF7, 0x2004, +0x1840, 0x9E1C, 0xC82A, 0x2BF2, 0x4F0E, 0x531E, 0x064E, 0x1840, 0x9D8E, +0xC82C, 0x2BEB, 0x2004, 0x1840, 0x9C8E, 0xC82A, 0x2BE6, 0x1840, 0x425C, +0xC9C4, 0x4C4C, 0x430D, 0x3C46, 0x430F, 0x3C01, 0x532F, 0x932F, 0x2C1D, +0x4F0E, 0x064E, 0x1840, 0x9E1D, 0xC85C, 0x2BF7, 0x2004, 0x1840, 0x9E1C, +0xC85A, 0x2BF2, 0x4F0E, 0x531E, 0x064E, 0x1840, 0x9D8E, 0xC85C, 0x2BEB, +0x2004, 0x1840, 0x9C8E, 0xC85A, 0x2BE6, 0x1840, 0x425C, 0xC9C7, 0x4C4C, +0x430D, 0x3C24, 0x430F, 0x3C01, 0x532F, 0x932F, 0x2C1D, 0x4F0E, 0x064E, +0x1840, 0x9E1D, 0xC814, 0x2BF7, 0x2004, 0x1840, 0x9E1C, 0xC812, 0x2BF2, +0x4F0E, 0x531E, 0x064E, 0x1840, 0x9D8E, 0xC814, 0x2BEB, 0x2004, 0x1840, +0x9C8E, 0xC812, 0x2BE6, 0x1840, 0x425C, 0xC9C6, 0x4C4C, 0x430D, 0x3C02, +0x430C, 0x430D, 0x160A, 0x0110, 0x140A, 0x8221, 0x430A, 0x93CC, 0x0006, +0x20CA, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1380, 0x310A, 0x930C, 0x38BF, +0x13B0, 0xC61C, 0x430D, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x13B0, 0xC60E, +0x412E, 0x411F, 0x0002, 0x4E0F, 0x430E, 0x430D, 0x5C0E, 0x6D0F, 0x4E81, +0x0000, 0x4F81, 0x0002, 0x13B0, 0xC4CA, 0x903C, 0xBEEF, 0x2020, 0x903D, +0xBEEF, 0x201D, 0x13B0, 0xC3EA, 0x934C, 0x2419, 0x13B0, 0xC572, 0x903C, +0xF00D, 0x2014, 0x903D, 0xF00D, 0x2011, 0x13B0, 0xC468, 0x934C, 0x240D, +0x002F, 0x31D6, 0x4F1C, 0x0004, 0x1380, 0x311A, 0x002F, 0x31D6, 0x4F1C, +0x0006, 0x1380, 0x311A, 0x3C08, 0x13B0, 0xC60E, 0x1380, 0x311A, 0x13B0, +0xC60E, 0x1380, 0x311A, 0x13B0, 0xC5EE, 0x1380, 0x311A, 0x13B0, 0xC5E6, +0x1380, 0x311A, 0x422D, 0x410C, 0x530C, 0x1380, 0x3116, 0x002F, 0x31D6, +0x4F1C, 0x000E, 0x1380, 0x311A, 0x13B0, 0xC4E6, 0x903C, 0xABBA, 0x200C, +0x903D, 0xABBA, 0x2009, 0x13B0, 0xC420, 0x934C, 0x2405, 0x1380, 0x3DC2, +0x1380, 0x311A, 0x3C03, 0x433C, 0x1380, 0x311A, 0x13B0, 0xC4E6, 0x903C, +0xABBA, 0x2011, 0x903D, 0xABBA, 0x200E, 0x13B0, 0xC420, 0x934C, 0x240A, +0x13B0, 0xC60E, 0x903C, 0xAAAB, 0x2405, 0x1380, 0x3DBE, 0x1380, 0x311A, +0x3C03, 0x433C, 0x1380, 0x311A, 0x13B0, 0xC564, 0x903C, 0xACDC, 0x200C, +0x903D, 0xACDC, 0x2009, 0x13B0, 0xC3D8, 0x934C, 0x2405, 0x1380, 0x316A, +0x1380, 0x311A, 0x3C03, 0x433C, 0x1380, 0x311A, 0x13B0, 0xB900, 0x1380, +0x311A, 0x13B0, 0xBC92, 0x1380, 0x311A, 0x13B0, 0xBCBC, 0x1380, 0x311A, +0x13B0, 0xBD64, 0x1380, 0x311A, 0x13B0, 0xBD3A, 0x1380, 0x311A, 0x002F, +0x31D6, 0x4F1C, 0x0010, 0x1380, 0x311A, 0x422C, 0x1380, 0x311A, 0x403C, +0x0102, 0x1380, 0x311A, 0x430C, 0x430D, 0x1380, 0x311E, 0x13B0, 0xC2C2, +0x431A, 0x3C59, 0x403A, 0xFFFD, 0x3C56, 0x93DC, 0x0006, 0x201B, 0x002F, +0x31D6, 0x938F, 0x0008, 0x2413, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1380, +0x310A, 0x930C, 0x3808, 0x002F, 0x31D6, 0x4F1C, 0x0008, 0x1380, 0x311A, +0x431A, 0x3C3E, 0x403A, 0xFFFC, 0x3C3B, 0x403A, 0xFFFE, 0x3C38, 0x93EC, +0x0006, 0x2023, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1380, 0x310A, 0x930C, +0x3818, 0x430A, 0x3C0F, 0x4A0C, 0x1380, 0x311A, 0x002F, 0x3E6A, 0x4A0E, +0x0EEE, 0x0ECD, 0x0EEE, 0x0DEE, 0x0FEE, 0x4E2C, 0x1380, 0x311A, 0x531A, +0x002F, 0x31D6, 0x9F1A, 0x0008, 0x2BEC, 0x431A, 0x3C15, 0x403A, 0xFFFB, +0x3C12, 0x90FC, 0x0003, 0x0006, 0x200E, 0x407D, 0x0091, 0x4C5C, 0x0002, +0x1380, 0x310A, 0x930C, 0x3804, 0x1380, 0x310E, 0x403A, 0xFFFA, 0x13B0, +0xC48A, 0x931A, 0x2004, 0x403A, 0x8000, 0x1380, 0x310E, 0x4A0C, 0x5221, +0x160A, 0x0110, 0x147B, 0x0CC5, 0x4D07, 0x4E46, 0x4E48, 0x480E, 0x430F, +0x5E0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x151F, 0x160A, 0x1840, 0x4A54, 0xC6C0, +0x930D, 0x2402, 0x03DC, 0x2003, 0x407C, 0x0007, 0x3CF9, 0x444C, 0x13B0, +0xC24A, 0x4C0B, 0x1840, 0x93C2, 0x3EA0, 0x2004, 0x1840, 0x93D2, 0x3EA1, +0x2404, 0x13B0, 0xC628, 0x427C, 0x3CE9, 0x480C, 0x430D, 0x403E, 0x001A, +0x430F, 0x13B0, 0xC030, 0x151D, 0x1608, 0x1800, 0x485F, 0x3382, 0x03DF, +0x2406, 0x4B0C, 0x13B0, 0xC628, 0x407C, 0x0003, 0x3CD5, 0x1840, 0x4788, +0x338A, 0x1840, 0x4788, 0x338C, 0x1800, 0x45C8, 0x3382, 0x1840, 0x93C8, +0x339A, 0x2441, 0x08C7, 0x00A7, 0x338E, 0x464E, 0x070D, 0x1800, 0x485C, +0x3386, 0x13B0, 0xAC5E, 0x1840, 0x9388, 0x338C, 0x24A5, 0x444E, 0x0A5E, +0x4E0F, 0x503F, 0x238A, 0x1800, 0x485D, 0x338E, 0x0FDD, 0x200C, 0x503E, +0x238E, 0x1800, 0x4EC8, 0x338E, 0x1840, 0x4A1F, 0xC6C8, 0x1800, 0x4FC8, +0x3386, 0x3C09, 0x1800, 0x4FC8, 0x338E, 0x1840, 0x4A1F, 0xC6C6, 0x1800, +0x4FC8, 0x3386, 0x070F, 0x4F6F, 0x934F, 0x340C, 0xF07F, 0x007F, 0x1840, +0x4FC8, 0x339A, 0x464E, 0x070D, 0x1800, 0x485C, 0x3386, 0x13B0, 0xAC5E, +0x1840, 0x9388, 0x338C, 0x2472, 0x434F, 0x444E, 0x0A5E, 0x1840, 0x93C8, +0x339B, 0x201C, 0x93CE, 0x238A, 0x3434, 0x1840, 0x4A1F, 0xC6C6, 0x1800, +0x4FC8, 0x3386, 0x4E0F, 0x503F, 0x238A, 0x1800, 0x4FC8, 0x338E, 0x1840, +0x4A1F, 0xC6C8, 0x1800, 0x4FC8, 0x3396, 0x503E, 0x238E, 0x1800, 0x4EC8, +0x3392, 0x435F, 0x3C1B, 0x93CE, 0x238E, 0x3418, 0x1840, 0x4A1F, 0xC6C8, +0x1800, 0x4FC8, 0x3386, 0x4E0F, 0x503F, 0x238E, 0x1800, 0x4FC8, 0x338E, +0x1840, 0x4A1F, 0xC6C6, 0x1800, 0x4FC8, 0x3396, 0x503E, 0x238A, 0x1800, +0x4EC8, 0x3392, 0x435F, 0x934F, 0x242E, 0x08C7, 0x00A7, 0x338E, 0x070E, +0x4E6F, 0x934F, 0x27FE, 0x3426, 0xF07F, 0x007F, 0x1840, 0x4FC8, 0x339A, +0x464E, 0x070D, 0x1800, 0x485C, 0x3386, 0x13B0, 0xAC5E, 0x08C7, 0x00A7, +0x3392, 0x070F, 0x4F6F, 0x1840, 0x9388, 0x338C, 0x2411, 0x934F, 0x340F, +0xF07F, 0x007F, 0x1840, 0x4FC8, 0x339A, 0x464E, 0x070D, 0x1800, 0x485C, +0x3396, 0x13B0, 0xAC5E, 0x1800, 0x47E8, 0x338E, 0x1840, 0x9388, 0x338C, +0x2011, 0x1800, 0x43C8, 0x3382, 0x1840, 0xB0B2, 0x0100, 0x3D84, 0x2803, +0x464C, 0x13B0, 0xC69C, 0x4B0C, 0x13B0, 0xC628, 0x407C, 0x0005, 0x3C04, +0x4B0C, 0x13B0, 0xC628, 0x426C, 0x1674, 0x0110, 0x141B, 0x008A, 0x33FA, +0x4A6F, 0x1840, 0xB3DF, 0x3400, 0x2CBE, 0x4A6F, 0x064F, 0x1800, 0x4F5F, +0x3506, 0x90FF, 0x0093, 0x0001, 0x2409, 0x4A6F, 0x064F, 0x1800, 0x4F5F, +0x3506, 0xC0FF, 0x0080, 0x0002, 0x3C1C, 0x008E, 0x3E8B, 0x4A6F, 0x064F, +0x1800, 0x4F5F, 0x3506, 0x93CF, 0x0002, 0x3803, 0x93CE, 0x0000, 0x240F, +0x93FE, 0x0000, 0x2403, 0x53DE, 0x0000, 0x3C02, 0x43DE, 0x0000, 0x4A6F, +0x064F, 0x1800, 0x4F5F, 0x3506, 0x4EEF, 0x0003, 0x4A6F, 0x0FEF, 0x1840, +0x4F1E, 0x3402, 0x4A6F, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x4ECF, 0x0000, +0x4A6F, 0x064F, 0x1800, 0x4F5F, 0x3506, 0xB3DF, 0x0000, 0x2C11, 0x4A6F, +0x064F, 0x1800, 0x4F5E, 0x3506, 0x4A6D, 0x0DED, 0x431F, 0x1840, 0x5D1F, +0x3402, 0x1840, 0x4F8D, 0x3402, 0x0FEE, 0x43CE, 0x0000, 0x430D, 0x430F, +0x3C0D, 0x4F0C, 0x0CEC, 0x4A6E, 0x0EEE, 0x0ECB, 0x1806, 0x5E4E, 0x0BEE, +0x0EEC, 0x1840, 0xEC1D, 0x3404, 0x531F, 0x4A6E, 0x0EEE, 0x431B, 0x1840, +0x5E1B, 0x3402, 0x035B, 0x9B0F, 0x2BEA, 0xE33D, 0x4A6F, 0x0FEF, 0x1840, +0x4F1E, 0x3402, 0x035E, 0x531E, 0x0EEE, 0x4A6F, 0x0FEF, 0x0FCB, 0x1806, +0x5F4F, 0x0BEF, 0x0FEE, 0x1840, 0x4D8E, 0x3404, 0x4A6F, 0x1840, 0xD3DF, +0x3400, 0x4A6F, 0x1840, 0xC2FF, 0x3400, 0x4A6F, 0x064F, 0x1800, 0x4F5F, +0x3506, 0x93CF, 0x0002, 0x3803, 0x1840, 0x43C2, 0x3E8B, 0x4A6F, 0x064F, +0x1800, 0x4F5F, 0x3506, 0xB0FF, 0x0040, 0x0002, 0x4A6F, 0x2C0D, 0x064F, +0x1800, 0x4F5F, 0x3506, 0x90FF, 0x0093, 0x0001, 0x2008, 0x4A6F, 0x1840, +0xD3EF, 0x3400, 0x3C03, 0x1840, 0xC3EF, 0x3400, 0x4A6F, 0x0FEF, 0x403C, +0x0003, 0x1840, 0x5F1C, 0x3402, 0x13B0, 0xBFA4, 0x53DA, 0x0000, 0x93CA, +0x0000, 0x2402, 0x43CA, 0x0000, 0x13B0, 0xC5A6, 0x430C, 0x161A, 0x0110, +0x143B, 0x8031, 0x0006, 0x410C, 0x530C, 0x008E, 0xC9B9, 0x008D, 0x0006, +0x13B0, 0xC1D2, 0x13B0, 0xC31E, 0x13B0, 0xC2C2, 0x13B0, 0xC572, 0x903C, +0xF00D, 0x200B, 0x903D, 0xF00D, 0x2008, 0x13B0, 0xC5DE, 0x933C, 0x2404, +0x13B0, 0xC468, 0x934C, 0x2020, 0x008A, 0x3DDE, 0x1800, 0x40FA, 0xC650, +0x0000, 0x1800, 0x40FA, 0xC64C, 0x0004, 0x1800, 0x40FA, 0xC644, 0x000C, +0x1800, 0x40FA, 0xC6BA, 0x0058, 0x1800, 0x40FA, 0xC6B8, 0x0008, 0x1800, +0x40FA, 0xC6A0, 0x0054, 0x1800, 0x40FA, 0xC6B8, 0x006C, 0x433C, 0x3C82, +0x13B0, 0xC5DE, 0x134C, 0x1800, 0x40F2, 0x18A0, 0x3E4E, 0x008A, 0x3DDE, +0x0ACC, 0x13B0, 0x18A0, 0x13B0, 0xC53A, 0x933C, 0x2002, 0x930D, 0x240C, +0x13B0, 0xC4CA, 0x903C, 0xBEEF, 0x2007, 0x903D, 0xBEEF, 0x2004, 0x13B0, +0xC3EA, 0x934C, 0x2002, 0x433C, 0x3C62, 0x13B0, 0xC60E, 0x0A3F, 0x006C, +0x134F, 0x13B0, 0xC53A, 0x151D, 0x1608, 0x13B0, 0xC420, 0x4C49, 0x13B0, +0xC468, 0x4C4D, 0x008B, 0x31D6, 0x1249, 0x430E, 0x430F, 0x008C, 0x310A, +0x1348, 0x0C7B, 0x0000, 0x0088, 0x3E6A, 0x0B0F, 0x1800, 0x4FD8, 0x000A, +0x0000, 0x0ACC, 0x13B0, 0xC510, 0x0ACC, 0x1380, 0x317E, 0x080E, 0x5321, +0x03DE, 0x2437, 0x0B0F, 0x4F1F, 0x0008, 0x533F, 0x0FEF, 0x0FCD, 0x0FEF, +0x0DEF, 0x0EEF, 0x40BF, 0xFFFE, 0x0000, 0x080E, 0x0B0F, 0x4F1F, 0x0008, +0x533F, 0x0FEF, 0x0FCD, 0x0FEF, 0x0DEF, 0x0FEE, 0x1800, 0x40FE, 0xA546, +0x0002, 0x434E, 0x3C01, 0x535E, 0x0B0F, 0x9F1E, 0x0008, 0x2C16, 0x080F, +0x4E4D, 0x0DED, 0x0DCA, 0x0DED, 0x0AED, 0x0FED, 0x4D2F, 0x933F, 0x27F1, +0x903F, 0xFF00, 0x2BEE, 0x4EC1, 0x0004, 0x43C1, 0x0005, 0x434D, 0x410C, +0x530C, 0x13B0, 0x9E7C, 0x430C, 0x5031, 0x0006, 0x1638, 0x0110, 0x145B, +0x4C4A, 0x434B, 0x4A0C, 0x430D, 0x4A0E, 0x430F, 0x5E0E, 0x5E0E, 0x5E0E, +0x5E0E, 0x151F, 0x1607, 0x1840, 0x4759, 0xC6C0, 0x403E, 0x000C, 0x13B0, +0xC030, 0x151D, 0x1608, 0x1840, 0x9388, 0x336C, 0x202E, 0x1840, 0x93C8, +0x3373, 0x2095, 0x1840, 0x43D8, 0x3373, 0x1840, 0x90F8, 0x0040, 0x3374, +0x2016, 0x0A59, 0x1840, 0x93C8, 0x3372, 0x2009, 0x93C9, 0x23CA, 0x340E, +0x43C9, 0x23CA, 0x1840, 0x43D8, 0x3372, 0x3C08, 0x93C9, 0x23CE, 0x3405, +0x43C9, 0x23CE, 0x1840, 0x43C8, 0x3372, 0x1840, 0x4388, 0x336A, 0x1840, +0x93C2, 0x3D84, 0x3470, 0x4A4C, 0x13B0, 0xC664, 0x4C4B, 0x3C6B, 0x1840, +0x43C8, 0x3373, 0x1840, 0x4716, 0xC6CC, 0x0A59, 0x490F, 0x503F, 0x23CE, +0x5039, 0x23CA, 0x490E, 0x1840, 0x93C8, 0x3372, 0x2005, 0x1840, 0x471C, +0xC6CA, 0x0FC7, 0x3C06, 0x06CC, 0x0FC9, 0x1840, 0x4716, 0xC6CA, 0x0EC7, +0x1840, 0x481A, 0x336C, 0x903A, 0x0041, 0x2802, 0x407A, 0x0040, 0x93C9, +0x0000, 0x3444, 0x4A4E, 0x430F, 0x1800, 0x485D, 0x336E, 0x1380, 0x3D56, +0x4AC9, 0x0000, 0x435E, 0x1840, 0x585E, 0x3372, 0xF35E, 0x1840, 0x4EC8, +0x3372, 0x4A4A, 0x1840, 0x8A88, 0x336C, 0x1800, 0x5AC8, 0x336E, 0x1840, +0x4AC8, 0x3374, 0x1840, 0x481A, 0x336C, 0x930A, 0x2424, 0x93C7, 0x0000, +0x3421, 0x903A, 0x0041, 0x2802, 0x407A, 0x0040, 0x4A4E, 0x430F, 0x1800, +0x485D, 0x336E, 0x06CC, 0x1380, 0x3D56, 0x4AC7, 0x0000, 0x435E, 0x1840, +0x585E, 0x3372, 0xF35E, 0x1840, 0x4EC8, 0x3372, 0x4A4A, 0x1840, 0x8A88, +0x336C, 0x1800, 0x5AC8, 0x336E, 0x1840, 0x4AC8, 0x3374, 0x4B0C, 0x1656, +0x0110, 0x147B, 0x4C16, 0x0004, 0x4C17, 0x0006, 0xF336, 0xF037, 0x000F, +0x4C1E, 0x0008, 0x4C1F, 0x000A, 0xF33E, 0xF03F, 0x000F, 0x4604, 0x4705, +0x5E04, 0x6F05, 0x5034, 0xFFFE, 0x6335, 0x4308, 0x4309, 0x460C, 0x470D, +0x13B0, 0x8AAC, 0x120A, 0x4CC1, 0x0000, 0x413A, 0x1840, 0x925A, 0xC9BF, +0x2002, 0x433C, 0x3C7F, 0x1840, 0x925A, 0xC9C2, 0x2404, 0x1840, 0x925A, +0xC9C1, 0x2008, 0x1840, 0x4218, 0xC862, 0x4309, 0x002C, 0xC81E, 0x13B0, +0xBF38, 0x1840, 0x925A, 0xC9C3, 0x2404, 0x1840, 0x925A, 0xC9C0, 0x2008, +0x1840, 0x4218, 0xC862, 0x4309, 0x002C, 0xC822, 0x13B0, 0xBF38, 0x1840, +0x925A, 0xC9C4, 0x2404, 0x1840, 0x925A, 0xC9C5, 0x2008, 0x1840, 0x4218, +0xC862, 0x4309, 0x002C, 0xC82A, 0x13B0, 0xBF38, 0x1840, 0x925A, 0xC9C7, +0x2404, 0x1840, 0x925A, 0xC9C6, 0x200A, 0x1840, 0x4218, 0xC862, 0x4309, +0x13B0, 0xC34A, 0x002C, 0xC812, 0x13B0, 0xBF38, 0x460A, 0x470B, 0x3C13, +0x4A0C, 0x4B0D, 0x13B0, 0x8AAC, 0x1840, 0x425E, 0xC9BF, 0x4E4E, 0x430F, +0x9E0C, 0x2002, 0x9F0D, 0x2404, 0x151B, 0x160C, 0x13B0, 0xBF38, 0x580A, +0x690B, 0x950B, 0x2BEB, 0x2002, 0x940A, 0x2BE8, 0x460A, 0x470B, 0x3C17, +0x4A0C, 0x4B0D, 0x13B0, 0x8AAC, 0x1840, 0x425E, 0xC9BF, 0x4E4E, 0x430F, +0x9E0C, 0x2002, 0x9F0D, 0x2408, 0x480E, 0x490F, 0x531E, 0x630F, 0x151B, +0x160C, 0x13B0, 0xBC64, 0x580A, 0x690B, 0x950B, 0x2BE7, 0x2002, 0x940A, +0x2BE4, 0x13B0, 0xC2DA, 0x431C, 0x1674, 0x0110, 0x141B, 0x434A, 0x434B, +0xB31D, 0x2854, 0x4C1E, 0x0004, 0x4C1F, 0x0006, 0xF33E, 0xF03F, 0x000F, +0x1840, 0x4E82, 0x3E74, 0x1840, 0x4F82, 0x3E76, 0x4C1E, 0x0008, 0x4C1F, +0x000A, 0xF33E, 0xF03F, 0x000F, 0x1840, 0x521E, 0x3E74, 0x1840, 0x621F, +0x3E76, 0x1840, 0x4E82, 0x3E78, 0x1840, 0x4F82, 0x3E7A, 0x0CCA, 0x00AA, +0x000C, 0x4C6C, 0x4C4C, 0x503C, 0xFFF5, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, +0x035D, 0x100C, 0x432E, 0x430F, 0x13B0, 0xC030, 0x151D, 0x160F, 0x0ACB, +0x0FEB, 0x1840, 0x421C, 0x3E74, 0x1840, 0x421D, 0x3E76, 0x13B0, 0x8AAC, +0x1840, 0x925C, 0xC9BF, 0x2002, 0x433C, 0x3C58, 0x1840, 0x43A2, 0x3E7C, +0x1840, 0x4382, 0x3E7E, 0x1840, 0x4292, 0x3E74, 0x3E70, 0x1840, 0x4292, +0x3E76, 0x3E72, 0x13B0, 0xC34A, 0x3C39, 0x0CCA, 0x00AA, 0x0004, 0x4C6C, +0x4C4C, 0x503C, 0xFFFD, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, 0x035D, 0x100C, +0x432E, 0x430F, 0x13B0, 0xC030, 0x151D, 0x160F, 0x0ACB, 0x0FEB, 0x13B0, +0xC2DA, 0x3C21, 0x1840, 0x421C, 0x3E70, 0x1840, 0x421D, 0x3E72, 0x13B0, +0x8AAC, 0x1840, 0x425E, 0xC9BF, 0x4E4E, 0x430F, 0x9E0C, 0x2002, 0x9F0D, +0x2408, 0x431E, 0x430F, 0x002D, 0x3E70, 0x0ACC, 0x13B0, 0xB970, 0x03EA, +0x1840, 0x5292, 0x3E7C, 0x3E70, 0x1840, 0x6292, 0x3E7E, 0x3E72, 0x1840, +0x9292, 0x3E7A, 0x3E72, 0x2806, 0x2007, 0x1840, 0x9292, 0x3E78, 0x3E70, +0x2C02, 0x0BDA, 0x2BD2, 0x430C, 0x161A, 0x0110, 0x147B, 0x8031, 0x0032, +0x434A, 0x13B0, 0xC548, 0x13B0, 0xC47A, 0x930C, 0x241A, 0x410C, 0x503C, +0x0014, 0x13B0, 0xBCE6, 0x410C, 0x503C, 0x000A, 0x13B0, 0xBCE6, 0x410C, +0x530C, 0x13B0, 0xBCE6, 0x013E, 0x0016, 0x411D, 0x000A, 0x415C, 0x0006, +0x13B0, 0xB606, 0x13B0, 0xC232, 0x13B0, 0xC548, 0x4349, 0x3C51, 0x494F, +0x0FEF, 0x0FCB, 0x064F, 0x0BEF, 0x0FCB, 0x1840, 0x93CF, 0x31B7, 0x2446, +0x1840, 0x4B1F, 0x31AE, 0x0027, 0x31D6, 0x971F, 0x0008, 0x2C3E, 0x0027, +0x3E6A, 0x0FEF, 0x0FCE, 0x0FEF, 0x0EEF, 0x0FE7, 0x0737, 0x0002, 0x03D7, +0x2433, 0x0088, 0x310A, 0x1840, 0x4B5D, 0x31B6, 0x1840, 0x4B5C, 0x31B5, +0x080F, 0x134F, 0x930C, 0x3827, 0x1800, 0x4B5C, 0x31B0, 0x4106, 0x5036, +0x001E, 0x1406, 0x430F, 0x435E, 0x4C6D, 0x503D, 0xFFFD, 0x00AC, 0x0006, +0x0834, 0x001C, 0x1344, 0x403C, 0x0003, 0x1347, 0x5221, 0x931C, 0x200C, +0x083F, 0x0004, 0x134F, 0x1840, 0xB3DB, 0x31B4, 0x2805, 0x1840, 0x4B5C, +0x31B5, 0x13B0, 0xA6A4, 0x06CC, 0x083F, 0x0020, 0x134F, 0x5359, 0x9269, +0x2BAD, 0x4A0B, 0x1840, 0xB3DB, 0x33F5, 0x281A, 0x403D, 0x0014, 0x434C, +0x13B0, 0xBC36, 0x4A4D, 0x008C, 0x33B8, 0x1380, 0x3122, 0x1840, 0x4AC2, +0x3EA3, 0x064B, 0x1800, 0x4B5C, 0x33B8, 0x13B0, 0x8434, 0x1840, 0x425A, +0x3EA3, 0x1840, 0xC3DA, 0x33F5, 0x3C06, 0x535A, 0x926A, 0x2801, 0x434A, +0x934A, 0x23DB, 0x5031, 0x0032, 0x1674, 0x0110, 0x143B, 0x40B2, 0x9628, +0x0900, 0x1840, 0x43C2, 0x3EA1, 0x1840, 0x43C2, 0x3EA0, 0x1840, 0x43C2, +0x3EA2, 0x1840, 0x43C2, 0x3E8C, 0x1840, 0x43C2, 0x3E8D, 0x43C2, 0x093C, +0x1840, 0x43B2, 0x3D78, 0x1840, 0x43B2, 0x3D7A, 0x1840, 0x43C2, 0x3E9F, +0x43C2, 0x093F, 0x407D, 0x0080, 0x4DC2, 0x0921, 0x4DC2, 0x0923, 0x40F2, +0x008C, 0x0920, 0x40F2, 0x008C, 0x0922, 0x40F2, 0x0015, 0x092F, 0x40F2, +0x001F, 0x092E, 0x430F, 0x3C55, 0x4F0C, 0xE03C, 0x8000, 0x0E4C, 0x08AC, +0x0000, 0x1840, 0x4C5B, 0xC6C0, 0x0A5B, 0x40FB, 0x0094, 0x23C8, 0x4038, +0xE400, 0x480E, 0x1840, 0x5C1E, 0xC6CA, 0x0B5E, 0x4ECB, 0x23C9, 0x480E, +0x1840, 0x5C1E, 0xC6CC, 0x0B5E, 0x4ECB, 0x23CD, 0x4DCB, 0x23CA, 0x4DCB, +0x23CE, 0x4ACB, 0x23CF, 0x40FB, 0x0094, 0x2388, 0x480E, 0x1840, 0x5C1E, +0xC6C6, 0x0B5E, 0x4ECB, 0x2389, 0x480E, 0x1840, 0x5C1E, 0xC6C8, 0x0B5E, +0x4ECB, 0x238D, 0x43CB, 0x238A, 0x43CB, 0x238E, 0x4ACB, 0x238F, 0x1840, +0x93EC, 0xC6C1, 0x2016, 0x40FB, 0x0094, 0x23C0, 0x480E, 0x1840, 0x5C1E, +0xC6C2, 0x0B5E, 0x4ECB, 0x23C1, 0x1840, 0x5C18, 0xC6C4, 0x0B58, 0x48CB, +0x23C5, 0x4DCB, 0x23C2, 0x4DCB, 0x23C6, 0x4ACB, 0x23C7, 0x531F, 0x407A, +0x0040, 0x932F, 0x3BA7, 0x13B0, 0xB6F6, 0x4AC2, 0x093C, 0x43C2, 0x093E, +0x40F2, 0x00C4, 0x093D, 0x40B2, 0x9600, 0x0900, 0x434C, 0x1638, 0x0110, +0x145B, 0x4C4A, 0x434B, 0x4A0C, 0x430D, 0x4A0E, 0x430F, 0x5E0E, 0x5E0E, +0x5E0E, 0x5E0E, 0x151F, 0x1609, 0x1840, 0x4956, 0xC6C0, 0x403E, 0x001A, +0x13B0, 0xC030, 0x151D, 0x1608, 0x1840, 0x9388, 0x338C, 0x2005, 0x1800, +0x43C8, 0x3382, 0x430C, 0x3C77, 0x0A56, 0x465E, 0x238A, 0xD65E, 0x238E, +0xB07E, 0x0080, 0x246E, 0x1840, 0x491E, 0xC6C8, 0x460F, 0x503F, 0x238E, +0x5036, 0x238A, 0x1840, 0x93C8, 0x339B, 0x200D, 0x1840, 0x491C, 0xC6C6, +0x1800, 0x46C8, 0x338E, 0x1800, 0x4EC8, 0x3396, 0x1800, 0x4FC8, 0x3392, +0x3C0D, 0x0ECC, 0x1800, 0x4FC8, 0x338E, 0x1840, 0x491F, 0xC6C6, 0x1800, +0x4FC8, 0x3396, 0x1800, 0x46C8, 0x3392, 0x1800, 0x485F, 0x338E, 0x4F6E, +0x934E, 0x3425, 0xF07E, 0x007F, 0x1840, 0x4EC8, 0x339A, 0x4A4E, 0x1800, +0x485D, 0x338E, 0x13B0, 0xAC5E, 0x08C9, 0x00A9, 0x3392, 0x090F, 0x4F6E, +0x1840, 0x9388, 0x338C, 0x2411, 0x934E, 0x340F, 0xF07E, 0x007F, 0x1840, +0x4EC8, 0x339A, 0x4A4E, 0x090D, 0x1800, 0x485C, 0x3396, 0x13B0, 0xAC5E, +0x1800, 0x49E8, 0x338E, 0x1840, 0x9388, 0x338C, 0x2019, 0x1800, 0x43C8, +0x3382, 0x1840, 0xB0B2, 0x0100, 0x3D84, 0x2804, 0x4A4C, 0x13B0, 0xC69C, +0x4C4B, 0x1840, 0x93C8, 0x339A, 0x2409, 0x1840, 0xB0B2, 0x0040, 0x3D84, +0x2804, 0x4A4C, 0x13B0, 0xBEF0, 0xDC4B, 0x4B0C, 0x1656, 0x0110, 0x140A, +0x433A, 0x4C5E, 0x0004, 0x934E, 0x2015, 0x13B0, 0xB55E, 0x13B0, 0xC60E, +0x1380, 0x3DD2, 0x13B0, 0x9332, 0x13B0, 0xB152, 0x430C, 0x13B0, 0xBA4A, +0x434C, 0x13B0, 0xBFC8, 0x435C, 0x13B0, 0xBF14, 0x431A, 0x3C69, 0x935E, +0x2012, 0x13B0, 0xB7CE, 0x13B0, 0xC31E, 0x13B0, 0xC2C2, 0x1380, 0x3DCA, +0x13B0, 0xAE58, 0x13B0, 0xB84E, 0x403C, 0x001E, 0x13B0, 0xBA4A, 0x431A, +0x3C55, 0x936E, 0x200E, 0x13B0, 0xB7CE, 0x13B0, 0xC2C2, 0x1380, 0x3DCA, +0x13B0, 0xB84E, 0x403C, 0x001E, 0x13B0, 0xBA4A, 0x431A, 0x3C45, 0x907E, +0x0003, 0x2018, 0x13B0, 0xB7CE, 0x13B0, 0xC31E, 0x13B0, 0xC2C2, 0x1380, +0x3DCA, 0x13B0, 0xAE58, 0x13B0, 0xB84E, 0x13B0, 0xC51E, 0x403C, 0x0005, +0x13B0, 0xBA4A, 0x13B0, 0xBAE4, 0x930C, 0x202C, 0x431A, 0x3C2A, 0x926E, +0x200C, 0x13B0, 0xB7CE, 0x13B0, 0xC606, 0x13B0, 0xC51E, 0x403C, 0x001E, +0x13B0, 0xBA4A, 0x431A, 0x3C1C, 0x907E, 0x0005, 0x2019, 0x13B0, 0xC52C, +0x434C, 0x13B0, 0xBFC8, 0x435C, 0x13B0, 0xBF14, 0x403F, 0x967E, 0x403E, +0x0098, 0x533F, 0x633E, 0x2FFD, 0x13B0, 0xC5F6, 0x403F, 0x967E, 0x403E, +0x0098, 0x533F, 0x633E, 0x2FFD, 0x431A, 0x4A0C, 0x160A, 0x0110, 0x147B, +0x0CC9, 0x4307, 0x008A, 0x33FA, 0x0A3F, 0x0110, 0x03DF, 0x205F, 0x4D0B, +0x4A6F, 0x0FEF, 0x1840, 0x4F18, 0x3402, 0x480C, 0x531C, 0x4806, 0x5B06, +0x9036, 0x00FF, 0x283D, 0x4A6F, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x4F57, +0x0001, 0x4A6F, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x4F54, 0x0002, 0x4A6F, +0x064F, 0x1800, 0x4F5F, 0x3506, 0xD0FF, 0x0080, 0x0002, 0x4376, 0x8806, +0x460E, 0x430F, 0x1409, 0x4A6D, 0x064D, 0x1800, 0x4D55, 0x3506, 0x4C0D, +0x05CC, 0x0DEC, 0x160D, 0x13B0, 0xC116, 0x4A6F, 0x0FEF, 0x1840, 0x40BF, +0x00FF, 0x3402, 0x403D, 0x0014, 0x434C, 0x13B0, 0xBC36, 0x13B0, 0x91A0, +0x474D, 0x444C, 0x13B0, 0xAAC2, 0x4C07, 0x5038, 0xFF01, 0x580B, 0x06E9, +0x3C12, 0x4B0E, 0x430F, 0x09CD, 0x4A6B, 0x064B, 0x1800, 0x4B5B, 0x3506, +0x0CEB, 0x0BCC, 0x13B0, 0xC116, 0x4A6F, 0x0FEF, 0x1840, 0x468F, 0x3402, +0x430B, 0x930B, 0x23A3, 0x3C19, 0x0A3F, 0x0110, 0x009F, 0xFFFF, 0x2414, +0x430B, 0x3C0C, 0x0CCE, 0x0BEE, 0x0A38, 0x0110, 0x4A1F, 0x0116, 0x0FE8, +0x4EE8, 0x0000, 0x531B, 0x539A, 0x0116, 0x9D0B, 0x2C04, 0x9A9A, 0x0114, +0x0116, 0x2BEE, 0x470C, 0x1674, 0x0110, 0x143B, 0x430F, 0x3C01, 0x531F, +0x922F, 0x2C0F, 0x4F0A, 0x0AEA, 0x0ACE, 0x064A, 0x0EEA, 0x1840, 0x9C9A, +0x0004, 0x31AE, 0x23F3, 0x1840, 0x9CDA, 0x0002, 0x31B5, 0x23EE, 0x430F, +0x3C01, 0x531F, 0x922F, 0x2C09, 0x4F0E, 0x0EEE, 0x0ECA, 0x064E, 0x0AEE, +0x1840, 0x93BE, 0x31AE, 0x23F4, 0x922F, 0x2C56, 0x4F0E, 0x0EEE, 0x0ECA, +0x064E, 0x0AEE, 0x0ECA, 0x4C6E, 0x907E, 0x0006, 0x2831, 0x535E, 0x064F, +0x0FCB, 0x0A4F, 0x0FEB, 0x0FEF, 0x0BEF, 0x00AF, 0x3EA4, 0x1800, 0x4FCA, +0x31B0, 0x430F, 0x3C09, 0x0CCB, 0x0FEB, 0x1800, 0x4A58, 0x31B0, 0x0FE8, +0x4BE8, 0x0000, 0x531F, 0x9E0F, 0x2BF5, 0xF35D, 0x1840, 0x4DCA, 0x31B4, +0x4C5E, 0x0002, 0xD07E, 0x0040, 0x1840, 0x4ECA, 0x31B5, 0x1840, 0x40FA, +0x0093, 0x31B6, 0x1840, 0x4C9A, 0x0004, 0x31AE, 0x1840, 0x43DA, 0x31B7, +0x431C, 0x3C1D, 0x1800, 0x43CA, 0x31B0, 0xF35D, 0x1840, 0x4DCA, 0x31B4, +0x4C5E, 0x0002, 0xD07E, 0x0040, 0x1840, 0x4ECA, 0x31B5, 0x1840, 0x40FA, +0x0093, 0x31B6, 0x1840, 0x4C9A, 0x0004, 0x31AE, 0x1840, 0x43DA, 0x31B7, +0x431C, 0x3C02, 0x403C, 0xFFFD, 0x1638, 0x0110, 0x141B, 0x8321, 0x008A, +0x33FA, 0x0ACB, 0x00AB, 0x0001, 0x4B6E, 0x4B6F, 0x1840, 0xB3DF, 0x3400, +0x2C0B, 0x53DA, 0x0001, 0x93CA, 0x0001, 0x2402, 0x43CA, 0x0001, 0x9ECA, +0x0001, 0x23F1, 0x3C57, 0x4B6E, 0x0EEE, 0x4B6F, 0x0FEF, 0x1840, 0x9F9E, +0x3402, 0x33FC, 0x2C4E, 0x1203, 0x1230, 0x000A, 0x434E, 0x4B6F, 0x0FEF, +0x1840, 0x4F1D, 0x3402, 0x4B6F, 0x064F, 0x1800, 0x4F5C, 0x3506, 0x13B0, +0xB07E, 0x5221, 0x934C, 0x2405, 0x434D, 0x410C, 0x530C, 0x13B0, 0xB508, +0x4B6F, 0x1840, 0xC3DF, 0x3400, 0x4B6F, 0x0FEF, 0x1840, 0x438F, 0x33FC, +0x4B6E, 0x4B6F, 0x1840, 0xB3EF, 0x3400, 0x2C03, 0x1840, 0x4382, 0x3516, +0x53DA, 0x0001, 0x93CA, 0x0001, 0x2402, 0x43CA, 0x0001, 0x4B6F, 0x1840, +0xB3DF, 0x3400, 0x2810, 0x4B6F, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x4F6D, +0x4B6F, 0x0FEF, 0x1840, 0x9F1D, 0x33FC, 0x2804, 0x1840, 0x40B2, 0x0032, +0x3516, 0x4B6F, 0x1840, 0xB3DF, 0x3400, 0x2C03, 0x9ECA, 0x0001, 0x23DC, +0x5321, 0x161A, 0x0110, 0x140A, 0x430F, 0x420E, 0xF03E, 0x0040, 0xC032, +0x0040, 0x403A, 0x1000, 0x903C, 0x3E81, 0x2803, 0x035D, 0x431F, 0x3C05, +0x5C0C, 0x3C03, 0x503A, 0x1000, 0x035D, 0x903D, 0x0201, 0x2FFA, 0x4382, +0x0160, 0xF0B2, 0xFC00, 0x0164, 0x533D, 0xDD0A, 0x4A82, 0x0164, 0x903C, +0x0277, 0x2C03, 0x4382, 0x0162, 0x3C31, 0x903C, 0x04E2, 0x2C04, 0x40B2, +0x0010, 0x0162, 0x3C2A, 0x903C, 0x09C4, 0x2C04, 0x40B2, 0x0020, 0x0162, +0x3C23, 0x903C, 0x1388, 0x2C04, 0x40B2, 0x0030, 0x0162, 0x3C1C, 0x903C, +0x2710, 0x2C04, 0x40B2, 0x0040, 0x0162, 0x3C15, 0x903C, 0x4E20, 0x2C04, +0x40B2, 0x0050, 0x0162, 0x3C0E, 0x903C, 0x9C40, 0x7D0D, 0x0E5D, 0x503D, +0x0070, 0x4D82, 0x0162, 0x3C05, 0xF0B2, 0xFFF0, 0x016E, 0xC3A2, 0x0102, +0xB3A2, 0x0102, 0x2FF8, 0x931F, 0x421F, 0x0168, 0x2007, 0xF03F, 0xFF88, +0xD03F, 0x0033, 0x4F82, 0x0168, 0x3C06, 0xF03F, 0xFF88, 0xD03F, 0x0044, +0x4F82, 0x0168, 0xDE02, 0x160A, 0x0110, 0x141B, 0x8031, 0x0006, 0x1800, +0x43C1, 0x0002, 0x008B, 0x4034, 0x40FB, 0x0003, 0x0001, 0x436A, 0x410F, +0x532F, 0x410E, 0x530E, 0x434D, 0x427C, 0x13B0, 0xB340, 0x93C1, 0x0000, +0x2007, 0x42EB, 0x0000, 0x43CB, 0x0002, 0x43CB, 0x0003, 0x3C4A, 0x434E, +0x3C11, 0x507D, 0x0037, 0x1840, 0x4DCA, 0x4034, 0x4F4A, 0x1840, 0x43CF, +0x4034, 0x535A, 0x535E, 0x013F, 0x0002, 0x00AF, 0x0001, 0x0F71, 0x0002, +0x916E, 0x2C30, 0x927E, 0x2C2E, 0x013F, 0x0002, 0x4F6D, 0x1943, 0x104D, +0x4A4C, 0x535C, 0x4A4F, 0x907D, 0x000A, 0x2C07, 0x507D, 0x0030, 0x1840, +0x4DCF, 0x4034, 0x4C4A, 0x3C06, 0x507D, 0x0037, 0x1840, 0x4DCF, 0x4034, +0x4C4A, 0x4A4F, 0x1840, 0x43CF, 0x4034, 0x535A, 0x013F, 0x0002, 0x407D, +0x000F, 0xFF6D, 0x4A4F, 0x535F, 0x907D, 0x000A, 0x2FC4, 0x507D, 0x0030, +0x1840, 0x4DCA, 0x4034, 0x4F4A, 0x3FC3, 0x1841, 0x5E4E, 0x536E, 0x4ECB, +0x0000, 0x5031, 0x0006, 0x161A, 0x0110, 0x145B, 0x8031, 0x0012, 0x0CC8, +0x008A, 0x310A, 0x407D, 0x0093, 0x485C, 0x0002, 0x0A0F, 0x134F, 0x4819, +0x0004, 0x410C, 0x523C, 0x403E, 0x0005, 0x13B0, 0xC388, 0x430E, 0x403D, +0x0006, 0x3C07, 0x4E0F, 0x5F0F, 0x5F0B, 0x468B, 0x0000, 0x531E, 0x532D, +0x4D0F, 0xE03F, 0x8000, 0x08EF, 0x1FC0, 0x4F16, 0x8000, 0x410B, 0x523B, +0x990E, 0x2BEE, 0x460E, 0x490D, 0x4B0C, 0x1380, 0x3DC6, 0x930C, 0x2025, +0x4308, 0x3C1D, 0x410F, 0x530F, 0x140F, 0x522F, 0x490E, 0x480C, 0x5C0C, +0x4B0D, 0x5C0D, 0x4D2D, 0x460C, 0x1380, 0x3DD6, 0x411C, 0x0008, 0x411D, +0x000A, 0x0A3F, 0x0014, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, 0x0A3F, +0x0014, 0x134F, 0x5318, 0x5221, 0x9908, 0x2BE1, 0x0A3F, 0x0004, 0x134F, +0x3C0F, 0x403C, 0xDEAD, 0x430D, 0x0A3F, 0x0014, 0x134F, 0x403C, 0xBABE, +0x430D, 0x0A3F, 0x0014, 0x134F, 0x0A3F, 0x0004, 0x134F, 0x403C, 0x8000, +0x5031, 0x0012, 0x1656, 0x0110, 0x141B, 0x40F2, 0x00A5, 0x0121, 0x421F, +0x012E, 0xF0B2, 0xCC88, 0x012E, 0x421E, 0x0124, 0x421D, 0x0126, 0x4382, +0x012C, 0x4C4A, 0x4A0B, 0xD03B, 0x4400, 0x4B82, 0x0124, 0xB0B2, 0x0010, +0x012C, 0x2BFC, 0xC0B2, 0x0010, 0x012C, 0xB0B2, 0x0020, 0x012C, 0x2812, +0xC0B2, 0x0010, 0x012C, 0x4E82, 0x0124, 0xB0B2, 0x0010, 0x012C, 0x2BFC, +0xF0B2, 0xFF88, 0x012C, 0x4F82, 0x012E, 0x43C2, 0x0121, 0x431C, 0x3C34, +0x4A0B, 0x108B, 0xDB82, 0x0124, 0xB0B2, 0x0010, 0x012C, 0x2BFC, 0xC0B2, +0x0010, 0x012C, 0x4CC2, 0x0120, 0xDB0A, 0xD03A, 0x4400, 0x4A82, 0x0126, +0xB392, 0x012C, 0x2BFD, 0xC392, 0x012C, 0xF0B2, 0x0307, 0x0126, 0xF03D, +0xFCF8, 0xDD82, 0x0126, 0xF0B2, 0x0307, 0x0124, 0xF03E, 0xFCF8, 0xDE82, +0x0124, 0xB392, 0x012C, 0x2C04, 0xB0B2, 0x0010, 0x012C, 0x2BF9, 0xF0B2, +0xFF88, 0x012C, 0x4F82, 0x012E, 0x43C2, 0x0121, 0x430C, 0x161A, 0x0110, +0x147B, 0x0DC7, 0x0EC6, 0x4348, 0x438D, 0x0000, 0x438E, 0x0000, 0x4C4A, +0x430B, 0x151B, 0x160F, 0x0E4F, 0x1840, 0x4F59, 0xC6C0, 0x494C, 0x13B0, +0xC292, 0x4C05, 0x494C, 0x13B0, 0xC24A, 0x4C04, 0x4A0C, 0x430D, 0x403E, +0x000C, 0x430F, 0x13B0, 0xC030, 0x151D, 0x160F, 0x1840, 0x938F, 0x336C, +0x2409, 0x4358, 0x1840, 0x4F1E, 0x336A, 0x1840, 0x8F1E, 0x336C, 0x4E87, +0x0000, 0x4A0C, 0x430D, 0x403E, 0x001A, 0x430F, 0x13B0, 0xC030, 0x151D, +0x160F, 0x1800, 0x4F5B, 0x3382, 0x03DB, 0x240A, 0xD368, 0x1840, 0x4F1B, +0x338A, 0x1840, 0x8F1B, 0x338C, 0x4B86, 0x0000, 0x3C0D, 0x1840, 0x93C2, +0x3EA0, 0x2009, 0x0A59, 0x495E, 0x238A, 0xD95E, 0x238E, 0xB07E, 0x0080, +0x2401, 0xD268, 0x1840, 0x93C2, 0x3EA0, 0x2004, 0x1840, 0x93D2, 0x3EA1, +0x2401, 0x4278, 0x450C, 0x13B0, 0xC622, 0x440C, 0x13B0, 0xC628, 0x4303, +0x484C, 0x1674, 0x0110, 0x145B, 0x03DC, 0x245C, 0x00BC, 0x0004, 0x0CCA, +0x4C2E, 0x4C1F, 0x0002, 0x930F, 0x2002, 0x923E, 0x2852, 0xB31E, 0x2C50, +0x008B, 0x3E80, 0x0B36, 0x0004, 0x03D6, 0x2409, 0x140C, 0x171C, 0x1406, +0x1718, 0x990D, 0x2803, 0x2008, 0x980C, 0x2C06, 0x067A, 0x0004, 0x0A7B, +0x0004, 0x3C27, 0x07C6, 0x0637, 0x0004, 0x03D7, 0x2407, 0x1407, 0x1718, +0x9D09, 0x2BF7, 0x2002, 0x9C08, 0x2BF4, 0x060D, 0x06C7, 0x0DE7, 0x07DA, +0x282B, 0x0AD7, 0x2006, 0x5E86, 0x0000, 0x6F86, 0x0002, 0x06CA, 0x3C0E, +0x0637, 0x0004, 0x03D7, 0x2406, 0x151F, 0x160E, 0x0ACF, 0x0EEF, 0x0FD7, +0x2819, 0x077A, 0x0004, 0x0A76, 0x0004, 0x0A3F, 0x0004, 0x03DF, 0x2411, +0x0A07, 0x0ACE, 0x07EE, 0x0FDE, 0x200C, 0x1800, 0x43CB, 0x0000, 0x5FAA, +0x0000, 0x6F9A, 0x0002, 0x0002, 0x1800, 0x4FDA, 0x0004, 0x0004, 0x1656, +0x0110, 0x141B, 0x008F, 0x3100, 0x53BF, 0x0000, 0x2005, 0x13B0, 0xC616, +0x40BF, 0x03E8, 0x0000, 0x1840, 0x9382, 0x32E0, 0x2447, 0x008A, 0x3358, +0x4A2F, 0x4F0B, 0x531B, 0x4B8A, 0x0000, 0x008B, 0x3356, 0x903F, 0x0033, +0x3403, 0x938B, 0x0000, 0x2419, 0x1380, 0x3336, 0x13B0, 0xC616, 0x438A, +0x0000, 0x930C, 0x2411, 0x938B, 0x0000, 0x2004, 0x403C, 0x0005, 0x13B0, +0xB280, 0x439B, 0x0000, 0x435C, 0x13B0, 0xBFC8, 0x434C, 0x13B0, 0xBF14, +0x430C, 0x3C20, 0xB0F2, 0x0010, 0x0261, 0x435C, 0x2810, 0x13B0, 0xBFC8, +0x434C, 0x13B0, 0xBF14, 0x938B, 0x0000, 0x2004, 0x403C, 0x0005, 0x13B0, +0xB280, 0x439B, 0x0000, 0x430C, 0x3C0B, 0x13B0, 0xBF14, 0x938B, 0x0000, +0x2405, 0x438B, 0x0000, 0x434C, 0x13B0, 0xBFC8, 0x430C, 0x161A, 0x0110, +0x40B2, 0x5A80, 0x015C, 0x13B0, 0xC262, 0x930C, 0x2002, 0x4382, 0x015C, +0x13B0, 0xA746, 0x13B0, 0xB0E8, 0x434C, 0x13B0, 0xBFC8, 0x435C, 0x13B0, +0xBF14, 0x13B0, 0xB21E, 0x403C, 0x007E, 0x13B0, 0xC5BC, 0x13B0, 0xBAB2, +0xB35C, 0x282D, 0x13B0, 0xACDE, 0x934C, 0x2022, 0x13B0, 0x99FE, 0x13B0, +0xC184, 0x13B0, 0xB4B2, 0x13B0, 0xB39E, 0x13B0, 0xAE58, 0x13B0, 0xB84E, +0x13B0, 0xB55E, 0x13B0, 0x9332, 0x13B0, 0xB152, 0x13B0, 0xC5F6, 0xD232, +0x9382, 0x4A00, 0x2018, 0xC0F2, 0x0020, 0x0282, 0x13B0, 0xC616, 0x1380, +0x3106, 0x1380, 0x3102, 0x3FFB, 0x435C, 0x13B0, 0xBFC8, 0x434C, 0x13B0, +0xBF14, 0x3FFF, 0x435C, 0x13B0, 0xBFC8, 0x434C, 0x13B0, 0xBF14, 0x3FFF, +0xD0F2, 0x0020, 0x0282, 0x3FE7, 0x4303, 0x141B, 0x934C, 0x2026, 0x430C, +0x430E, 0x922E, 0x2C48, 0x4E0F, 0x0FEF, 0x0FCD, 0x064F, 0x0DEF, 0x0FCD, +0x1840, 0x4D1F, 0x31AE, 0x933F, 0x2415, 0x002A, 0x3E6A, 0x0FEF, 0x0FCB, +0x0FEF, 0x0BEF, 0x0AEF, 0x90BF, 0xFF00, 0x0000, 0x2C0A, 0x1800, 0x43CD, +0x31B0, 0x1840, 0x43BD, 0x31AE, 0x1840, 0x43CD, 0x31B7, 0x531C, 0x531E, +0x3FDC, 0x430E, 0x3C01, 0x531E, 0x922E, 0x2C09, 0x4E0F, 0x0FEF, 0x0FCB, +0x064F, 0x0BEF, 0x1840, 0x9CCF, 0x31B5, 0x23F4, 0x922E, 0x2C15, 0x0EEE, +0x0ECF, 0x064E, 0x0FEE, 0x0ECA, 0x1800, 0x4E5C, 0x31B0, 0x03DC, 0x2402, +0x13B0, 0xC690, 0x1800, 0x43CA, 0x31B0, 0x1840, 0x43BA, 0x31AE, 0x1840, +0x43CA, 0x31B7, 0x431C, 0x161A, 0x0110, 0x43C2, 0x0204, 0x43C2, 0x0205, +0x43C2, 0x0224, 0x43C2, 0x0225, 0x43C2, 0x0244, 0x43C2, 0x0245, 0x43C2, +0x0264, 0x43C2, 0x0265, 0x43C2, 0x0284, 0x43C2, 0x020A, 0x43C2, 0x020B, +0x43C2, 0x022A, 0x43C2, 0x022B, 0x43C2, 0x024A, 0x43C2, 0x024B, 0x43C2, +0x026A, 0x43C2, 0x026B, 0x43C2, 0x028A, 0x43C2, 0x0202, 0x43C2, 0x0203, +0x43C2, 0x0222, 0x43C2, 0x0223, 0x43C2, 0x0242, 0x43C2, 0x0243, 0x43C2, +0x0262, 0x43C2, 0x0263, 0x43C2, 0x0282, 0xD0F2, 0x00B8, 0x0244, 0x40F2, +0x0020, 0x0242, 0xC0F2, 0x0080, 0x0242, 0xD0F2, 0x0080, 0x0245, 0xD0F2, +0x0003, 0x0264, 0xD0F2, 0x00C0, 0x026A, 0xD2F2, 0x0265, 0xD0F2, 0x0081, +0x0265, 0x0110, 0x141B, 0x4E0A, 0x4F0B, 0x936C, 0x2044, 0x903E, 0x2581, +0x2002, 0x930F, 0x2426, 0x903E, 0x86A0, 0x2002, 0x931F, 0x2421, 0x903E, +0x1A80, 0x2003, 0x903F, 0x0006, 0x241B, 0x903E, 0x86A1, 0x2002, 0x931F, +0x2416, 0x903E, 0x1A81, 0x2003, 0x903F, 0x0006, 0x2410, 0x903E, 0x86A2, +0x2002, 0x931F, 0x240B, 0x903E, 0x1A82, 0x2003, 0x903F, 0x0006, 0x2405, +0x903E, 0x2582, 0x2005, 0x930F, 0x2003, 0x13B0, 0xBF80, 0x3C0A, 0x903E, +0x1F41, 0x2005, 0x930F, 0x2003, 0x13B0, 0xBF5C, 0x3C02, 0x13B0, 0xC19E, +0x13B0, 0xC60E, 0x120C, 0x403E, 0xB180, 0x403F, 0x014F, 0x4A0C, 0x4B0D, +0x13B0, 0xC444, 0x5321, 0x434C, 0x161A, 0x0110, 0x145B, 0x0CC6, 0x4D08, +0x4E4E, 0x4E0A, 0x430B, 0x151B, 0x160F, 0x0E4F, 0x1840, 0x4F59, 0xC6C0, +0x930D, 0x2003, 0x407C, 0x0007, 0x3C38, 0x494C, 0x13B0, 0xC292, 0x4C07, +0x1840, 0x93C2, 0x3EA0, 0x2004, 0x1840, 0x93D2, 0x3EA1, 0x2404, 0x13B0, +0xC622, 0x427C, 0x3C28, 0x4A0C, 0x430D, 0x403E, 0x000C, 0x430F, 0x13B0, +0xC030, 0x151D, 0x160F, 0x1840, 0x938F, 0x336C, 0x2406, 0x470C, 0x13B0, +0xC622, 0x407C, 0x0003, 0x3C15, 0x1840, 0x488F, 0x336A, 0x1840, 0x488F, +0x336C, 0x1800, 0x46CF, 0x336E, 0x431F, 0x5359, 0x8359, 0x3002, 0x18C9, +0x5F0F, 0xDFC2, 0x0930, 0x470C, 0x13B0, 0xC622, 0x435C, 0x1656, 0x0110, +0x145B, 0x434A, 0x4C48, 0x4309, 0x1519, 0x160F, 0x0E4F, 0x1840, 0x4F5B, +0xC6C0, 0x4B4C, 0x13B0, 0xC24A, 0x4C06, 0x1840, 0x93C2, 0x3EA0, 0x2004, +0x1840, 0x93D2, 0x3EA1, 0x2404, 0x13B0, 0xC628, 0x434C, 0x3C2E, 0x480C, +0x430D, 0x403E, 0x001A, 0x430F, 0x13B0, 0xC030, 0x151D, 0x160F, 0x1840, +0x4F5E, 0x339A, 0x934E, 0x240C, 0x4E4A, 0x1800, 0x4F5F, 0x3392, 0x93CF, +0x0000, 0x3415, 0x407E, 0x007F, 0xFF6E, 0x5E4A, 0x3C10, 0x0A5B, 0x93CB, +0x238A, 0x3404, 0x4B5A, 0x238A, 0xF07A, 0x007F, 0x93CB, 0x238E, 0x3405, +0x4B5E, 0x238E, 0xF07E, 0x007F, 0x5E4A, 0x460C, 0x13B0, 0xC628, 0x4A4C, +0x1656, 0x0110, 0x143B, 0x434C, 0x008F, 0xC6DE, 0x3C02, 0x00AF, 0x0006, +0x4F7E, 0x4F7D, 0x937E, 0x2002, 0x937D, 0x2408, 0x425A, 0x2380, 0x907A, +0x00C0, 0x2403, 0x907A, 0x0040, 0x2011, 0x03FF, 0xB3D2, 0x093E, 0x2C0B, +0x0F3A, 0x000A, 0x134A, 0x009A, 0xC0D8, 0x2005, 0x93C2, 0x093F, 0x2402, +0x13B0, 0xC660, 0x1638, 0x0110, 0x9A4E, 0x201C, 0x925D, 0x2381, 0x2019, +0x407E, 0x00C0, 0x407D, 0x0020, 0x436A, 0x3C09, 0x4A48, 0x9BC8, 0x2380, +0x2001, 0xDD4E, 0x00AF, 0x0001, 0x035D, 0x535A, 0x4F6B, 0x927A, 0x2BF4, +0x4B4D, 0xFE4D, 0x9B4D, 0x23C4, 0x00BF, 0x0008, 0x3FD2, 0x00AF, 0x000C, +0x3FC0, 0x4303, 0x425E, 0x2384, 0xF07E, 0x000F, 0x243E, 0x537E, 0x907E, +0x0007, 0x2C3C, 0x4E4F, 0x0A5F, 0x93C2, 0x2384, 0x341B, 0xF0FF, 0x00D7, +0x23C8, 0x434C, 0x3C01, 0x535C, 0x936C, 0x2C2D, 0x430D, 0x151D, 0x160F, +0x0E4F, 0x1840, 0x9ECF, 0xC6C0, 0x23F5, 0x403E, 0x001A, 0x430F, 0x13B0, +0xC030, 0x151D, 0x160F, 0x1840, 0x43CF, 0x339B, 0x3C1A, 0xF0FF, 0x00D7, +0x2388, 0x434C, 0x3C01, 0x535C, 0x936C, 0x2C12, 0x430D, 0x151D, 0x160F, +0x0E4F, 0x1840, 0x9ECF, 0xC6C0, 0x23F5, 0x403E, 0x000C, 0x430F, 0x13B0, +0xC030, 0x151D, 0x160F, 0x1840, 0x43CF, 0x3372, 0x13B0, 0xC40E, 0x434C, +0x0110, 0x008E, 0x33FA, 0x4E6F, 0x1840, 0x4F5F, 0x3400, 0xB07F, 0x000B, +0x2404, 0x1840, 0x93A2, 0x3516, 0x2FF3, 0x4E6F, 0x1840, 0x4F5F, 0x3400, +0xB07F, 0x000B, 0x2408, 0x907D, 0x0095, 0x2405, 0x13B0, 0xC648, 0x403C, +0x8007, 0x0110, 0x4E6F, 0x1840, 0x4F5F, 0x3400, 0xB07F, 0x000B, 0x2406, +0x907D, 0x0095, 0x2003, 0x403C, 0x8007, 0x0110, 0x4E6F, 0x064F, 0x1800, +0x4F5F, 0x3506, 0x4DCF, 0x0001, 0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x3506, +0x4CCF, 0x0002, 0x4E6F, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x43CF, 0x0003, +0x4E6F, 0x0FEF, 0x1840, 0x40BF, 0x0003, 0x3402, 0x430C, 0x0110, 0x141B, +0x40F2, 0x00A5, 0x0121, 0x421F, 0x012E, 0xF0B2, 0xCC88, 0x012E, 0x421E, +0x0124, 0x421D, 0x0126, 0xF0B2, 0xFFCC, 0x012C, 0x4C4A, 0x4A0B, 0x108B, +0xDB0A, 0xD03A, 0x4400, 0x4A82, 0x0124, 0x4A82, 0x0126, 0xB0B2, 0x0010, +0x012C, 0x2BFC, 0xB392, 0x012C, 0x2BF9, 0xF0B2, 0xFFEE, 0x012C, 0x4CC2, +0x0120, 0xF0B2, 0x0307, 0x0126, 0xF03D, 0xFCF8, 0xDD82, 0x0126, 0xF0B2, +0x0307, 0x0124, 0xF03E, 0xFCF8, 0xDE82, 0x0124, 0xB392, 0x012C, 0x2C04, +0xB0B2, 0x0010, 0x012C, 0x2BF9, 0xF0B2, 0xFF88, 0x012C, 0x4F82, 0x012E, +0x43C2, 0x0121, 0x430C, 0x161A, 0x0110, 0x140A, 0x0CCA, 0x430C, 0x008E, +0x3D60, 0x0E3D, 0x0008, 0xB35D, 0x2424, 0x438A, 0x0000, 0x438A, 0x0002, +0x0ACC, 0x13B0, 0xBB16, 0x930C, 0x2402, 0x433C, 0x3C2D, 0x0ACC, 0x00AC, +0x0001, 0x13B0, 0xBB16, 0x930C, 0x2403, 0x403C, 0xFFFE, 0x3C23, 0x0ACC, +0x03EC, 0x13B0, 0xBB16, 0x930C, 0x2403, 0x403C, 0xFFFD, 0x3C1A, 0x00AA, +0x0003, 0x0ACC, 0x13B0, 0xBB16, 0x3C14, 0x1800, 0x9DCE, 0x0004, 0x2C03, +0x403C, 0xFFFB, 0x3C0D, 0x4DBA, 0x0000, 0x4DBA, 0x0002, 0x1800, 0x52EE, +0x0008, 0x1800, 0x9EDE, 0x0008, 0x0004, 0x2C01, 0x431C, 0x160A, 0x0110, +0x145B, 0x0CCB, 0x0DC8, 0x4E4E, 0x0EEE, 0x0ECF, 0x064E, 0x0EEF, 0x0EEE, +0x0FEE, 0x0EC9, 0x0EC6, 0x00A6, 0x339A, 0x466F, 0x1840, 0x9E1F, 0x338C, +0x2C02, 0x4F4A, 0x3C03, 0x1840, 0x4E5A, 0x338C, 0x4A4E, 0x430F, 0x0CCD, +0x1800, 0x495C, 0x3382, 0x1380, 0x3D5A, 0x1840, 0x8A89, 0x338C, 0x4A0F, +0x1800, 0x5FC9, 0x3382, 0x966A, 0x200E, 0x435E, 0x1840, 0x595E, 0x339B, +0xF35E, 0x1840, 0x4EC9, 0x339B, 0x1840, 0x43C9, 0x339A, 0x43C8, 0x0000, +0x3C07, 0x1840, 0x8AC9, 0x339A, 0x0FEB, 0x1800, 0x4BC9, 0x3386, 0x1656, +0x0110, 0x8221, 0x4381, 0x0002, 0xB2B2, 0x0908, 0x2C02, 0x435C, 0x3C36, +0xB392, 0x0902, 0x2806, 0xB0B2, 0x0100, 0x0910, 0x2802, 0x434C, 0x3C2D, +0x40B2, 0x9628, 0x0900, 0x40B2, 0x0117, 0x0912, 0x40B2, 0x0300, 0x0910, +0x4382, 0x0914, 0x4381, 0x0000, 0x3C04, 0x412F, 0x531F, 0x4F81, 0x0000, +0x90B1, 0x0898, 0x0000, 0x2BF8, 0x411F, 0x0002, 0x4F0E, 0x531E, 0x4E81, +0x0002, 0x903F, 0x000B, 0x2805, 0x40B2, 0x9600, 0x0900, 0x435C, 0x3C09, +0x9382, 0x0914, 0x23E2, 0xD392, 0x0902, 0x40B2, 0x9600, 0x0900, 0x434C, +0x5221, 0x0110, 0x140A, 0x430E, 0x430E, 0x3C01, 0x532E, 0x903E, 0x0080, +0x3410, 0x4E0F, 0x0FEF, 0x1840, 0x9C8F, 0x4900, 0x23F6, 0x531E, 0xE03E, +0x8000, 0x0EEE, 0x0FAE, 0x4900, 0x0E7D, 0x0000, 0x431C, 0x3C25, 0x430E, +0x3C01, 0x532E, 0x903E, 0x0080, 0x341B, 0x4E0F, 0x0FEF, 0x1840, 0x938F, +0x4900, 0x23F6, 0x4E0F, 0x0FEF, 0x1840, 0x4C8F, 0x4900, 0x4E0F, 0x531F, +0xE03F, 0x8000, 0x0FEF, 0x0FAF, 0x4900, 0x0F7D, 0x0000, 0x531E, 0x0EEE, +0x1840, 0x438E, 0x4900, 0x431C, 0x3C04, 0x1800, 0x43CD, 0x0000, 0x430C, +0x160A, 0x0110, 0x425F, 0x2384, 0xF07F, 0x000F, 0x2011, 0x93C2, 0x2384, +0x3407, 0x425E, 0x0920, 0xF27E, 0x1840, 0x4EC2, 0x3E8F, 0x3C1C, 0x425E, +0x0922, 0xF27E, 0x1840, 0x4EC2, 0x3E8F, 0x3C15, 0x537F, 0x907F, 0x0007, +0x2C11, 0x0A5F, 0x93C2, 0x2384, 0x3407, 0x4F5E, 0x23C8, 0xF27E, 0x1840, +0x4EC2, 0x3E8F, 0x3C06, 0x4F5E, 0x2388, 0xF27E, 0x1840, 0x4EC2, 0x3E8F, +0x1840, 0x425E, 0x3E8F, 0x1942, 0x104E, 0x1840, 0x4EC2, 0x3E8F, 0x13B0, +0xC63A, 0x1840, 0x43A2, 0x3D78, 0x008C, 0x3E8F, 0x13B0, 0xBDE0, 0x434C, +0x0110, 0x008C, 0x316A, 0x1800, 0x40FC, 0xC688, 0x0000, 0x1800, 0x40FC, +0xC688, 0x0034, 0x1800, 0x40FC, 0xC680, 0x0004, 0x1800, 0x40FC, 0xC67C, +0x0008, 0x1800, 0x40FC, 0xC678, 0x000C, 0x1800, 0x40FC, 0xC6A4, 0x0010, +0x1800, 0x40FC, 0xC6A8, 0x0014, 0x1800, 0x40FC, 0xC6AA, 0x0018, 0x1800, +0x40FC, 0xC6AC, 0x001C, 0x1800, 0x40FC, 0xC6AE, 0x0020, 0x1800, 0x40FC, +0xC67C, 0x0028, 0x1800, 0x40FC, 0xC67C, 0x002C, 0x1800, 0x40FC, 0xC6A4, +0x0030, 0x0080, 0xC502, 0x008F, 0x3D78, 0x4F2E, 0x008D, 0x3E9F, 0x933E, +0x242D, 0x903E, 0x0009, 0x2806, 0x427E, 0x82BF, 0x0000, 0x43DD, 0x0000, +0x3C15, 0x923E, 0x2C05, 0x43BF, 0x0000, 0x43CD, 0x0000, 0x3C0E, 0x427E, +0x1840, 0x93D2, 0x3E8E, 0x2005, 0x438F, 0x0000, 0x43DD, 0x0000, 0x3C04, +0x43BF, 0x0000, 0x43CD, 0x0000, 0x434F, 0x3C08, 0x002D, 0x3D7C, 0x1800, +0x53D2, 0x3D7C, 0x4DEF, 0x2378, 0x535F, 0x9E4F, 0x2BF6, 0x4EC2, 0x0921, +0x0110, 0x43CD, 0x0000, 0x0110, 0x145B, 0x0CC8, 0x4D0A, 0x0EC9, 0x4F0B, +0x0086, 0x3D60, 0x0137, 0x001C, 0x403E, 0x000C, 0x430F, 0x06CD, 0x07CC, +0x13B0, 0xC116, 0x008F, 0x33FA, 0x1800, 0x4FD7, 0x0110, 0x000C, 0x4F97, +0x0114, 0x0010, 0x4F97, 0x0116, 0x0012, 0x0876, 0x0000, 0x0607, 0x0AE7, +0x0776, 0x0004, 0x0876, 0x0008, 0x0099, 0x0001, 0x240D, 0x03D9, 0x2005, +0x1800, 0x40FF, 0xFFFF, 0x0110, 0x3C02, 0x097F, 0x0110, 0x4B8F, 0x0114, +0x438F, 0x0116, 0x430C, 0x1656, 0x0110, 0x140A, 0xB392, 0x2384, 0x421F, +0x2384, 0x2803, 0x533F, 0x035F, 0x3C01, 0x035F, 0x4F4F, 0x0A4F, 0x008A, +0x3E8F, 0x1840, 0x4FDA, 0x335E, 0x0006, 0x1840, 0x4FDA, 0x3360, 0x0005, +0x1840, 0x4FDA, 0x335F, 0x0004, 0x1840, 0x4F1E, 0x335A, 0x1840, 0x4F1F, +0x335C, 0x4F0D, 0x108D, 0x4D4C, 0x4CCA, 0x0003, 0x4FCA, 0x0002, 0x4E0D, +0x108D, 0x4DCA, 0x0001, 0x4ECA, 0x0000, 0x1840, 0x40B2, 0x0007, 0x3D78, +0x0ACC, 0x13B0, 0xBDE0, 0x434C, 0x160A, 0x0110, 0x143B, 0x8321, 0xB392, +0x2384, 0x421E, 0x2384, 0x2805, 0x533E, 0x035E, 0x4EC1, 0x0000, 0x3C03, +0x035E, 0x4EC1, 0x0000, 0x008D, 0x3E97, 0x4D68, 0x4D5A, 0x0001, 0x108A, +0x4D5E, 0x0002, 0x4D5C, 0x0003, 0x108C, 0x4C0D, 0xDE0D, 0x4A0C, 0xD80C, +0x416F, 0x0A4F, 0x1840, 0x4C8F, 0x335A, 0x1840, 0x4D8F, 0x335C, 0x416F, +0x0A4F, 0x1840, 0x4F1E, 0x335A, 0x1840, 0x4F1F, 0x335C, 0x1840, 0x425C, +0x2384, 0x13B0, 0xA7E2, 0x5321, 0x1638, 0x0110, 0x147B, 0x8221, 0x0CC6, +0x4D07, 0x4E44, 0x430A, 0x430B, 0x4118, 0x0028, 0x4119, 0x002A, 0x410E, +0x530E, 0x410D, 0x532D, 0x444C, 0x13B0, 0xA3B8, 0xB35C, 0x280F, 0x480F, +0xD90F, 0x930F, 0x27F3, 0x4A0E, 0x4B0F, 0x531A, 0x630B, 0x9F09, 0x2803, +0x23EC, 0x9E08, 0x2FEA, 0x435C, 0x3C0F, 0x444E, 0x470D, 0x06CC, 0x13B0, +0xA87A, 0x931C, 0x2403, 0x923C, 0x2403, 0x3C04, 0x434C, 0x3C03, 0x436C, +0x3C01, 0x426C, 0x5221, 0x1674, 0x0110, 0x13B0, 0xC5FE, 0x407C, 0x0003, +0x13B0, 0xB812, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0xD0F2, 0x000C, +0x026A, 0x421F, 0x0166, 0xF03F, 0xFF8F, 0xD03F, 0x0020, 0x4F82, 0x0166, +0x421F, 0x0168, 0xF03F, 0xF8FF, 0xD03F, 0x0200, 0x4F82, 0x0168, 0x403D, +0x029F, 0x403C, 0x55F0, 0x13B0, 0xBBDA, 0x13B0, 0xC634, 0x403D, 0x4E20, +0x430C, 0x13B0, 0xB78A, 0x931C, 0x2007, 0x434C, 0x13B0, 0xBFC8, 0x435C, +0x13B0, 0xBF14, 0x3FFF, 0x0110, 0x140A, 0x13B0, 0xC4D8, 0x933C, 0x2002, +0x930D, 0x240C, 0x13B0, 0xC564, 0x903C, 0xACDC, 0x2007, 0x903D, 0xACDC, +0x2004, 0x13B0, 0xC3D8, 0x934C, 0x2004, 0x13B0, 0xAE58, 0x433C, 0x3C1B, +0x13B0, 0xC4D8, 0x151D, 0x160F, 0x008A, 0x316A, 0x0ACC, 0x134F, 0x0ACC, +0x13B0, 0xC502, 0x008C, 0x31A2, 0x0A3F, 0x001C, 0x134F, 0x008C, 0x3DDE, +0x0A3F, 0x0014, 0x134F, 0x008C, 0x3DBE, 0x0A3F, 0x0018, 0x134F, 0x430C, +0x160A, 0x0110, 0x143B, 0x8321, 0x0CCB, 0x430C, 0x008E, 0x3D60, 0x0E3D, +0x0008, 0xB35D, 0x2413, 0x4108, 0x5308, 0x08CC, 0x13B0, 0xBB16, 0x416A, +0x930C, 0x2007, 0x08CC, 0x13B0, 0xBB16, 0x416F, 0x108F, 0x5F0A, 0x3C01, +0x433C, 0x4A8B, 0x0000, 0x3C12, 0x1800, 0x9DCE, 0x0004, 0x2C03, 0x403C, +0xFFFE, 0x3C0B, 0x4DAB, 0x0000, 0x1800, 0x53EE, 0x0008, 0x1800, 0x9EDE, +0x0008, 0x0004, 0x2C01, 0x431C, 0x5321, 0x1638, 0x0110, 0x140A, 0x8321, +0x420A, 0xF23A, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x40B2, 0x9628, +0x0900, 0x4382, 0x0908, 0x40B2, 0x0080, 0x0904, 0x40B2, 0x0840, 0x0908, +0x4381, 0x0000, 0x3C04, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, 0x2AF8, +0x0000, 0x2BF8, 0x40B2, 0x0A40, 0x0908, 0x40B2, 0x9600, 0x0900, 0x1840, +0x4382, 0x3D84, 0x13B0, 0xA13A, 0x13B0, 0xBE30, 0xDA02, 0x434C, 0x5321, +0x160A, 0x0110, 0x143B, 0x4C0B, 0x008A, 0x3352, 0x4A2F, 0xDA1F, 0x0002, +0x930F, 0x2011, 0x0088, 0x310A, 0x407D, 0x0095, 0x434C, 0x080F, 0x134F, +0x903C, 0x8007, 0x2407, 0x4B0C, 0x083F, 0x0010, 0x134F, 0x083F, 0x0004, +0x134F, 0x4A2E, 0x4A1F, 0x0002, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x4C8A, +0x0000, 0x4D8A, 0x0002, 0x931F, 0x2808, 0x2003, 0x903E, 0x86A1, 0x2804, +0x438A, 0x0000, 0x438A, 0x0002, 0x1638, 0x0110, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x13B0, 0xBE58, 0xC3E2, 0x0242, 0x403F, 0x967E, 0x403E, +0x0098, 0x533F, 0x633E, 0x2FFD, 0x13B0, 0xBECA, 0x13B0, 0xC5FE, 0x008C, +0x197F, 0x13B0, 0xBF38, 0x008C, 0x18FF, 0x13B0, 0xBF38, 0x008C, 0x187F, +0x13B0, 0xBF38, 0x008C, 0xFFFE, 0x13B0, 0xBF38, 0x403F, 0x967E, 0x403E, +0x0098, 0x533F, 0x633E, 0x2FFD, 0x40B2, 0xA504, 0x0120, 0x0110, 0x143B, +0x0FCA, 0x008B, 0x1A08, 0x3C0C, 0x9C4F, 0x2001, 0x537D, 0x4B5F, 0x0001, +0x532F, 0x4F08, 0xE038, 0x8000, 0x00B8, 0x8000, 0x08EB, 0x4B6F, 0x140B, +0x1718, 0x9309, 0x2009, 0x9038, 0x1AFF, 0x2C06, 0x9C4F, 0x2002, 0x934D, +0x2402, 0x937F, 0x23E6, 0x9C4F, 0x2007, 0x4BDE, 0x0001, 0x0000, 0x03EB, +0x0B7A, 0x0000, 0x3C05, 0x43CE, 0x0000, 0x1800, 0x43CA, 0x0000, 0x1638, +0x0110, 0x141B, 0x434A, 0x3C1F, 0x4A0C, 0x430D, 0x4A0E, 0x430F, 0x5E0E, +0x5E0E, 0x151F, 0x160B, 0x403E, 0x0204, 0x13B0, 0xC030, 0x151D, 0x160F, +0x00AF, 0x3546, 0x1800, 0x4FCB, 0x33C8, 0x1800, 0x4B5F, 0x33C8, 0x03DF, +0x2002, 0x13B0, 0xC4BA, 0x1800, 0x4BDB, 0x33C8, 0x33B8, 0x535A, 0x926A, +0x2BDF, 0x434A, 0x3C05, 0x1800, 0x40F2, 0x3404, 0x3506, 0x435A, 0x934A, +0x27F9, 0x161A, 0x0110, 0x140A, 0x008C, 0x33B8, 0x43CC, 0x003A, 0x434D, +0x3C20, 0x4D4E, 0x430F, 0x151F, 0x160A, 0x1840, 0x43CA, 0x33F5, 0x43CC, +0x003B, 0x43CC, 0x003C, 0x151F, 0x160A, 0x064A, 0x1800, 0x4A5A, 0x33B8, +0x43CA, 0x0000, 0x5E0E, 0x151F, 0x160F, 0x1840, 0x438F, 0x33EA, 0x1840, +0x438F, 0x33D8, 0x1840, 0x438F, 0x33E0, 0x535D, 0x926D, 0x2BDE, 0x1840, +0x4382, 0x3512, 0x160A, 0x0110, 0xD0F2, 0x0010, 0x093C, 0x3C0F, 0xC0F2, +0x0080, 0x0920, 0xC0F2, 0x0080, 0x0922, 0xF0F2, 0x00FA, 0x093E, 0xD0F2, +0x0080, 0x0920, 0xD0F2, 0x0080, 0x0922, 0x93C2, 0x2380, 0x3403, 0xD3D2, +0x093C, 0x3C02, 0xC3D2, 0x093C, 0x1840, 0x43C2, 0x3E9F, 0x434E, 0x3C05, +0x4E4F, 0x1840, 0x43CF, 0x3E8F, 0x535E, 0x927E, 0x2BF9, 0x13B0, 0xA9A4, +0xB3D2, 0x093E, 0x2FD8, 0x0110, 0x40B2, 0x6B6B, 0x0392, 0x40B2, 0x02D6, +0x0380, 0x008F, 0x351A, 0x1800, 0x40FF, 0x0243, 0x0006, 0x40FF, 0x0080, +0x000A, 0x1800, 0x40FF, 0x0242, 0x0012, 0x42FF, 0x0016, 0x1800, 0x40F2, +0x3E89, 0x3536, 0xC0B2, 0x8000, 0x0182, 0x008F, 0x33B6, 0x429F, 0x100E, +0x0000, 0xD0B2, 0x8000, 0x0182, 0x1840, 0x4FA2, 0x3532, 0x1840, 0x4FA2, +0x3534, 0x0110, 0x143B, 0x0CC8, 0x4D4D, 0x4D0A, 0x430B, 0x151B, 0x160F, +0x0E4F, 0x1840, 0x4F5C, 0xC6C0, 0x13B0, 0xC292, 0x4C09, 0x4A0C, 0x430D, +0x403E, 0x000C, 0x430F, 0x13B0, 0xC030, 0x151D, 0x160F, 0x1840, 0x4F1B, +0x336A, 0x1840, 0x8F1B, 0x336C, 0x4B88, 0x0000, 0x1840, 0x438F, 0x336A, +0x1840, 0x438F, 0x336C, 0x490C, 0x13B0, 0xC622, 0x434C, 0x1638, 0x0110, +0x140A, 0x13B0, 0xC556, 0x933C, 0x2002, 0x930D, 0x240C, 0x13B0, 0xC4E6, +0x903C, 0xABBA, 0x2007, 0x903D, 0xABBA, 0x2004, 0x13B0, 0xC420, 0x934C, +0x2004, 0x13B0, 0xB84E, 0x433C, 0x3C11, 0x13B0, 0xC556, 0x151D, 0x160F, +0x008A, 0x3DBE, 0x0ACC, 0x134F, 0x0ACC, 0x1380, 0x3182, 0x13B0, 0xC60E, +0x0A3F, 0x0014, 0x134F, 0x430C, 0x160A, 0x0110, 0x1800, 0x1246, 0x1800, +0x1247, 0x4D06, 0xD07D, 0x0080, 0x6606, 0x6707, 0x1086, 0xF376, 0x8076, +0x007F, 0x2C03, 0x430C, 0x430D, 0x3C13, 0x8076, 0x0018, 0x2C07, 0xE376, +0x240E, 0x110D, 0x100C, 0x8356, 0x23FC, 0x3C09, 0x9236, 0x3803, 0x433C, +0x433D, 0x3C04, 0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x1800, 0x4177, +0x1800, 0x4176, 0x0110, 0x143B, 0x4D0B, 0x0EC8, 0x0089, 0x310A, 0x407D, +0x0092, 0x090F, 0x134F, 0x930C, 0x381C, 0x03D8, 0x2005, 0x4B0C, 0x093F, +0x0010, 0x134F, 0x3C10, 0x430A, 0x3C09, 0x4A0E, 0x0EEE, 0x08CF, 0x0EEF, +0x4F2C, 0x093F, 0x0010, 0x134F, 0x531A, 0x9B0A, 0x2C03, 0x903A, 0x007E, +0x2BF2, 0x093F, 0x0004, 0x134F, 0x430C, 0x3C01, 0x433C, 0x1638, 0x0110, +0x141B, 0x425E, 0x0923, 0xF07E, 0x007F, 0x4E4D, 0x008C, 0x3D7A, 0x9D8C, +0x0000, 0x2817, 0x434F, 0x3C0A, 0x4F5A, 0x2370, 0x002B, 0x3D80, 0x4ACB, +0x0000, 0x1800, 0x53D2, 0x3D80, 0x535F, 0x9E4F, 0x2BF4, 0x8D8C, 0x0000, +0x2406, 0x13B0, 0xC63A, 0x1840, 0x43E2, 0x3E9F, 0x3C05, 0x13B0, 0xC62E, +0x1840, 0x43C2, 0x3E9F, 0x161A, 0x0110, 0x425D, 0x2382, 0x13B0, 0xC63A, +0x907D, 0x0003, 0x200B, 0x1840, 0x425F, 0x4034, 0x1840, 0x4F82, 0x3D78, +0x008C, 0x4034, 0x13B0, 0xBDE0, 0x3C11, 0x430C, 0x3C01, 0x5F0C, 0x4D4E, +0x537D, 0x1840, 0x4C5F, 0xC903, 0x934E, 0x23F8, 0x1840, 0x4F82, 0x3D78, +0x00AC, 0xC903, 0x13B0, 0xBDE0, 0x434C, 0x0110, 0x403E, 0x0018, 0x430F, +0x430D, 0x008C, 0x336A, 0x13B0, 0xC0F8, 0x403E, 0x0034, 0x430F, 0x430D, +0x008C, 0x3382, 0x13B0, 0xC0F8, 0x403E, 0x0010, 0x430F, 0x430D, 0x008C, +0x335A, 0x13B0, 0xC0F8, 0x430F, 0x3C08, 0x4F0E, 0xE03E, 0x8000, 0x0A4E, +0x184C, 0x42FE, 0x335E, 0x531F, 0x932F, 0x3BF6, 0x0110, 0x8321, 0x4381, +0x0000, 0x3C04, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, 0x0898, 0x0000, +0x2BF8, 0xB2B2, 0x0908, 0x2C14, 0x40B2, 0x9628, 0x0900, 0x1840, 0x43C2, +0x3EA1, 0x1840, 0x43C2, 0x3EA0, 0x4382, 0x0902, 0xC0B2, 0x0100, 0x0910, +0xF0B2, 0xEBFB, 0x0908, 0x40B2, 0x9600, 0x0900, 0x5321, 0x0110, 0x421F, +0x016C, 0xF03F, 0xC000, 0x9C0F, 0x2405, 0xF0B2, 0x3FFF, 0x016C, 0xDC82, +0x016C, 0xC0B2, 0x0100, 0x016C, 0x3C05, 0xF0B2, 0xFFF0, 0x016E, 0xC3A2, +0x0102, 0xB3A2, 0x0102, 0x2805, 0x4D0F, 0x4F0D, 0x533D, 0x930F, 0x23F3, +0x930D, 0x2402, 0x430C, 0x0110, 0x431C, 0x0110, 0x141B, 0x430A, 0x3C1B, +0x4A0F, 0xE03F, 0x8000, 0x0FEF, 0x0FCB, 0x064F, 0x0BEF, 0x0FCB, 0x0BAB, +0x0000, 0x1800, 0x4B5C, 0x31B0, 0x03DC, 0x2402, 0x13B0, 0xC690, 0x1800, +0x43CB, 0x31B0, 0x1840, 0x43BB, 0x31AE, 0x1840, 0x43DB, 0x31B7, 0x531A, +0x922A, 0x3BE3, 0x161A, 0x0110, 0x141B, 0x4C4B, 0x430C, 0xF07B, 0x0003, +0x421A, 0x0120, 0xF03A, 0x0003, 0x3C04, 0x531A, 0x4A4C, 0x13B0, 0xA2E8, +0x4B4F, 0x9A0F, 0x2402, 0x930C, 0x2402, 0x9A0F, 0x2C07, 0x9F0A, 0x2BF3, +0x533A, 0x4A4C, 0x13B0, 0xAB4E, 0x3FF2, 0x161A, 0x0110, 0x008C, 0x3DBE, +0x008F, 0xC688, 0x0F7C, 0x0000, 0x0F7C, 0x0004, 0x1800, 0x40FC, 0xC674, +0x0008, 0x0F7C, 0x000C, 0x1800, 0x40FC, 0xC670, 0x0010, 0x1800, 0x40FC, +0xC66C, 0x0014, 0x1800, 0x40FC, 0xC6A6, 0x0018, 0x0F7C, 0x001C, 0x0020, +0x3182, 0x140A, 0x434A, 0xD0F2, 0x0010, 0x093C, 0x43C2, 0x0921, 0x1840, +0x93E2, 0x3E9F, 0x200E, 0x13B0, 0xB65A, 0x1840, 0x93C2, 0x3E9F, 0x200A, +0x90F2, 0x0020, 0x2381, 0x2006, 0x13B0, 0xB012, 0x4C4A, 0x3C02, 0xD2F2, +0x0922, 0x4A4C, 0x160A, 0x0110, 0x140A, 0x008A, 0x33FA, 0x403E, 0x0118, +0x430F, 0x430D, 0x0ACC, 0x13B0, 0xC0F8, 0x1840, 0x4382, 0x3516, 0x1840, +0x43C2, 0x3E89, 0x434E, 0x3C07, 0x1800, 0x40FA, 0x3404, 0x010C, 0x43CA, +0x0006, 0x435E, 0x934E, 0x27F7, 0x160A, 0x0110, 0x403E, 0x003D, 0x430F, +0x008D, 0x1880, 0x430C, 0x13B0, 0xC052, 0x432E, 0x430F, 0x008D, 0x18FC, +0x13B0, 0xC052, 0x403E, 0x1900, 0x430F, 0x008D, 0xCC00, 0x13B0, 0xC052, +0x403E, 0x4700, 0x430F, 0x018D, 0x0000, 0x0080, 0xC052, 0x9382, 0x2382, +0x2015, 0x425F, 0x2384, 0xF07F, 0x000F, 0x240D, 0x537F, 0x907F, 0x0007, +0x2C0E, 0x0A5F, 0x93C2, 0x2384, 0x3403, 0xD2FF, 0x23C8, 0x3C02, 0xD2FF, +0x2388, 0x13B0, 0xC40E, 0x3C02, 0x13B0, 0xC5B2, 0x434C, 0x0110, 0x140A, +0x40B2, 0xA500, 0x0144, 0x40B2, 0xA540, 0x0140, 0x3C08, 0xB392, 0x0144, +0x2FFD, 0x4CBD, 0x0000, 0x03ED, 0x533E, 0x633F, 0x4E0A, 0xDF0A, 0x930A, +0x23F4, 0x40B2, 0xA500, 0x0140, 0x40B2, 0xA510, 0x0144, 0x160A, 0x0110, +0x430F, 0x430F, 0x3C01, 0x532F, 0x903F, 0x0080, 0x3412, 0x4F0E, 0x0EEE, +0x1840, 0x9C8E, 0x4900, 0x23F6, 0x4F0E, 0x0EEE, 0x1840, 0x438E, 0x4900, +0x531F, 0x0FEF, 0x1840, 0x438F, 0x4900, 0x431C, 0x0110, 0x430C, 0x0110, +0x907C, 0x0040, 0x2416, 0x430F, 0x3C01, 0x531F, 0x922F, 0x3411, 0x4F0D, +0xE03D, 0x8000, 0x0DED, 0x0DCE, 0x064D, 0x0EED, 0x0DCE, 0x0BAE, 0x0000, +0x1840, 0x9CCE, 0x31B5, 0x23EF, 0x1840, 0x43CE, 0x31B7, 0x431C, 0x0110, +0x907C, 0x0040, 0x2416, 0x430F, 0x3C01, 0x531F, 0x922F, 0x3411, 0x4F0D, +0xE03D, 0x8000, 0x0DED, 0x0DCE, 0x064D, 0x0EED, 0x0DCE, 0x0BAE, 0x0000, +0x1840, 0x9CCE, 0x31B5, 0x23EF, 0x1840, 0x43DE, 0x31B7, 0x431C, 0x0110, +0x4C0F, 0x5F0F, 0x008E, 0x351A, 0x4F8E, 0x0002, 0x4C8E, 0x0004, 0x4F8E, +0x000E, 0x4C8E, 0x0010, 0x930C, 0x2406, 0x40FE, 0x0003, 0x0000, 0x43EE, +0x000C, 0x3C04, 0x43CE, 0x0000, 0x43CE, 0x000C, 0x430C, 0x0110, 0x8321, +0x4381, 0x0000, 0x3C04, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, 0x0898, +0x0000, 0x2BF8, 0x40B2, 0x9628, 0x0900, 0xD0B2, 0x0400, 0x0908, 0xF0B2, +0xFFF9, 0x0908, 0x40B2, 0x9600, 0x0900, 0x5321, 0x0110, 0x434C, 0xB2B2, +0x0908, 0x2801, 0x435C, 0x1840, 0x93D2, 0x3EA1, 0x2002, 0xD07C, 0x0020, +0xB3A2, 0x0902, 0x2802, 0xD07C, 0x0040, 0x1840, 0x93D2, 0x3EA0, 0x2002, +0xD27C, 0x0110, 0xD07C, 0x0010, 0x0110, 0x13B0, 0xC53A, 0x933C, 0x2002, +0x930D, 0x240C, 0x13B0, 0xC4CA, 0x903C, 0xADAC, 0x2007, 0x903D, 0xADAC, +0x2004, 0x13B0, 0xC432, 0x934C, 0x2002, 0x433C, 0x0110, 0x13B0, 0xC53A, +0x151D, 0x160F, 0x0FC0, 0x430F, 0x008E, 0x3D60, 0x1800, 0x9EDE, 0x0008, +0x0004, 0x2C02, 0x433F, 0x3C0D, 0x0E3D, 0x0008, 0x4DEC, 0x0000, 0x1800, +0x53DE, 0x0008, 0x1800, 0x9EDE, 0x0008, 0x0004, 0x2C01, 0x431F, 0x4F0C, +0x0110, 0x140A, 0x0CCA, 0x403E, 0x000C, 0x430F, 0x0CCD, 0x008C, 0x3D60, +0x13B0, 0xC116, 0x008F, 0x33FA, 0x1800, 0x4ADF, 0x000C, 0x0110, 0x4A9F, +0x0010, 0x0114, 0x4A9F, 0x0012, 0x0116, 0x430C, 0x160A, 0x0110, 0x008C, +0x3E8F, 0x1840, 0xB0F2, 0x0040, 0xC87D, 0x2802, 0x43DC, 0x0000, 0x1840, +0x93D2, 0x3EA2, 0x2002, 0xD3EC, 0x0000, 0x13B0, 0xC63A, 0x1840, 0x43A2, +0x3D78, 0x13B0, 0xBDE0, 0x434C, 0x0110, 0x140A, 0x4E0A, 0xDF0A, 0x930A, +0x2411, 0x0C60, 0x0516, 0x0D60, 0x0512, 0x4E82, 0x051A, 0xD0B2, 0x0010, +0x0510, 0xD392, 0x0510, 0xB2B2, 0x0510, 0x2BFD, 0xC0B2, 0x0010, 0x0510, +0x160A, 0x0110, 0x8321, 0x4D0F, 0x1844, 0x5F0F, 0x4F81, 0x0000, 0x13B0, +0xA05E, 0x3C05, 0x4303, 0x4303, 0x423F, 0x533F, 0x2FFE, 0x412F, 0x4F0E, +0x533E, 0x4E81, 0x0000, 0x930F, 0x23F4, 0x5321, 0x0110, 0x1840, 0x43D2, +0x3EA0, 0x40B2, 0x9628, 0x0900, 0xD0F2, 0x0010, 0x093C, 0xC0F2, 0x0040, +0x093E, 0xC0B2, 0x0100, 0x0910, 0x40F2, 0x0020, 0x093D, 0x40B2, 0x9600, +0x0900, 0x434C, 0x0110, 0x936C, 0x2C13, 0x4C4C, 0x064C, 0x0CCF, 0x0CEC, +0x0FEC, 0x1840, 0x938C, 0x351E, 0x200A, 0x5D0D, 0x1840, 0x4D8C, 0x351C, +0x1840, 0x4D8C, 0x351E, 0x1840, 0xC3EC, 0x351A, 0x430C, 0x0110, 0x143B, +0x430A, 0x430B, 0x3C02, 0x531A, 0x630B, 0x9F0B, 0x2803, 0x200B, 0x9E0A, +0x2C09, 0x151B, 0x160D, 0x0CC8, 0x0DE8, 0x93F8, 0x0000, 0x27F2, 0x435C, +0x3C01, 0x434C, 0x1638, 0x0110, 0x403E, 0x003D, 0x430F, 0x008D, 0x1900, +0x430C, 0x13B0, 0xC052, 0x432E, 0x430F, 0x008D, 0x197C, 0x13B0, 0xC052, +0x403E, 0xC000, 0x430F, 0x018D, 0x8E00, 0x0080, 0xC052, 0x403E, 0x003D, +0x430F, 0x008D, 0x1800, 0x430C, 0x13B0, 0xC052, 0x432E, 0x430F, 0x008D, +0x187C, 0x13B0, 0xC052, 0x403E, 0x0700, 0x430F, 0x048D, 0x7200, 0x0080, +0xC052, 0x8031, 0x000A, 0x4C0F, 0x410C, 0x530C, 0x008E, 0x353A, 0x008D, +0x0005, 0x13B0, 0xC2F2, 0x4F0C, 0x410E, 0x530E, 0x403D, 0x0005, 0x13B0, +0xC3B0, 0x5031, 0x000A, 0x0110, 0x008F, 0x3D60, 0x1800, 0x4FDC, 0x0008, +0x0000, 0x4F1E, 0x0004, 0x8F1E, 0x0008, 0x531E, 0x4E8D, 0x0000, 0x0F3E, +0x0004, 0x00AE, 0x0004, 0x0E7F, 0x0008, 0x431C, 0x0110, 0x403E, 0x003D, +0x430F, 0x008D, 0x1980, 0x430C, 0x13B0, 0xC052, 0x432E, 0x430F, 0x008D, +0x19FC, 0x13B0, 0xC052, 0x403E, 0x0900, 0x430F, 0x048D, 0x6000, 0x0080, +0xC052, 0x431E, 0x430F, 0x008D, 0x8000, 0x430C, 0x13B0, 0xC052, 0x403E, +0x25FE, 0x430F, 0x008D, 0x8004, 0x13B0, 0xC052, 0x403E, 0x0100, 0x430F, +0x008D, 0xFE00, 0x0080, 0xC052, 0x403E, 0x003D, 0x430F, 0x008D, 0x1900, +0x430C, 0x13B0, 0xC052, 0x432E, 0x430F, 0x008D, 0x197C, 0x13B0, 0xC052, +0x403E, 0x6900, 0x431F, 0x018D, 0x8E00, 0x0080, 0xC052, 0x1840, 0x425F, +0x33FA, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x4F5E, 0x0001, 0x1840, 0x425F, +0x33FA, 0x064F, 0x1800, 0x4F5F, 0x3506, 0x4CCF, 0x0001, 0x4E4C, 0x0110, +0x0C60, 0x3D7C, 0x421F, 0x2386, 0x1840, 0x9F82, 0x3D78, 0x2807, 0x1840, +0x4F82, 0x3D78, 0x1840, 0x43C2, 0x3E8E, 0x3C03, 0x1840, 0x43D2, 0x3E8E, +0x0080, 0xAEC8, 0x13B0, 0xC62E, 0x1840, 0x42D2, 0x2382, 0x3E8C, 0x13B0, +0xC40E, 0x1840, 0x93D2, 0x3E8C, 0x2402, 0x434E, 0x3C01, 0x435E, 0x1840, +0x4EC2, 0x3EA1, 0x434C, 0x0110, 0xF0B2, 0xFFE0, 0x0500, 0x4292, 0x0500, +0x0500, 0x40B2, 0x1FC0, 0x0510, 0xD392, 0x0508, 0x1800, 0x40F2, 0xBBAA, +0x3D56, 0x1800, 0x40F2, 0xBBAA, 0x3D5A, 0x0110, 0x40B2, 0x9628, 0x0900, +0xC3A2, 0x0902, 0xC0B2, 0x0400, 0x0908, 0x40B2, 0x9600, 0x0900, 0x1840, +0x43C2, 0x3EA1, 0x1840, 0x43C2, 0x3EA0, 0x434C, 0x0110, 0x936C, 0x2C0F, +0x4C4C, 0x064C, 0x0CCF, 0x0CEC, 0x0FEC, 0x5D0D, 0x1840, 0x4D8C, 0x351C, +0x1840, 0x4D8C, 0x351E, 0x1840, 0x43EC, 0x351A, 0x430C, 0x0110, 0x4D4D, +0x064D, 0x0CED, 0x0D0E, 0x008D, 0x3D60, 0x0E7D, 0x0000, 0x4E6F, 0x0FEE, +0x0E7D, 0x0004, 0x0D0F, 0x00AF, 0x0004, 0x0F7D, 0x0008, 0x430C, 0x0110, +0x40B2, 0x9628, 0x0900, 0x4382, 0x0902, 0xC0B2, 0x0100, 0x0910, 0x40B2, +0x9600, 0x0900, 0x1840, 0x43C2, 0x3EA1, 0x1840, 0x43C2, 0x3EA0, 0x434C, +0x0110, 0x934C, 0x200E, 0x13B0, 0x87F6, 0x903C, 0x0092, 0x2009, 0x434C, +0x13B0, 0xA6A4, 0x13B0, 0xB3FC, 0x13B0, 0xB8C6, 0x13B0, 0xB39E, 0x435C, +0x0110, 0x936C, 0x2C0E, 0x4C4C, 0x064C, 0x0CCF, 0x0CEC, 0x0FEC, 0x1840, +0x43DC, 0x351A, 0x1840, 0x438C, 0x351C, 0x1840, 0x438C, 0x351E, 0x430C, +0x0110, 0x40B2, 0xA500, 0x0144, 0x40B2, 0xA502, 0x0140, 0x438C, 0x0000, +0xB392, 0x0144, 0x2FFD, 0x40B2, 0xA500, 0x0140, 0x40B2, 0xA510, 0x0144, +0x0110, 0x1800, 0x40F2, 0x98BA, 0x3102, 0x1800, 0x40F2, 0xC6B0, 0x3106, +0xD3A2, 0x0380, 0xD3A2, 0x03C0, 0xD3A2, 0x0340, 0x1840, 0x4382, 0x3D5E, +0x0110, 0xC3A2, 0x0380, 0xC3A2, 0x03C0, 0xC3A2, 0x0340, 0x1800, 0x40F2, +0xC6B2, 0x3102, 0x1800, 0x40F2, 0xC694, 0x3106, 0x1840, 0x4392, 0x3D5E, +0x0110, 0x008E, 0x33FA, 0x4E5F, 0x0001, 0x0FEF, 0x1840, 0x438F, 0x33FC, +0x4E6F, 0x0FEF, 0x1840, 0x4C8F, 0x3402, 0x4E6F, 0x1840, 0xD3DF, 0x3400, +0x0110, 0x936C, 0x2C0E, 0x4C4C, 0x064C, 0x0CCF, 0x0CEC, 0x0FEC, 0x1840, +0x43CC, 0x351A, 0x1840, 0x438C, 0x351C, 0x1840, 0x438C, 0x351E, 0x430C, +0x0110, 0x140A, 0x4C0A, 0x13B0, 0xB3FC, 0x008F, 0x353A, 0x4A8F, 0x0000, +0x438F, 0x0006, 0x1800, 0x43CF, 0x0002, 0x439F, 0x0008, 0x160A, 0x0110, +0x13B0, 0xC63A, 0x1840, 0x43A2, 0x3D78, 0x008C, 0x3E8F, 0x43CC, 0x0000, +0x1840, 0x42DC, 0x3E8D, 0x0001, 0x13B0, 0xBDE0, 0x434C, 0x0110, 0x1202, +0xC232, 0x4303, 0x4C82, 0x04D0, 0x4D82, 0x04D2, 0x4E82, 0x04E0, 0x4F82, +0x04E2, 0x421C, 0x04E4, 0x421D, 0x04E6, 0x4132, 0x0110, 0x141B, 0x4C82, +0x0154, 0x3C02, 0x4DB2, 0x0152, 0x4E0C, 0x4F0B, 0x533E, 0x633F, 0xDB0C, +0x930C, 0x23F7, 0x421C, 0x0154, 0x161A, 0x0110, 0x140A, 0x8321, 0x4C0A, +0x433C, 0x3C01, 0x533A, 0x930A, 0x2406, 0x410C, 0x530C, 0x13B0, 0xBB16, +0x933C, 0x23F7, 0x5321, 0x160A, 0x0110, 0x13B0, 0xC63A, 0x1840, 0x43A2, +0x3D78, 0x008C, 0x3E8F, 0x43CC, 0x0000, 0x1840, 0x42DC, 0x3E8D, 0x0001, +0x13B0, 0xBDE0, 0x434C, 0x0110, 0x4C4C, 0x0CEC, 0x0CCF, 0x064C, 0x0CEF, +0x0CEC, 0x0FEC, 0x1800, 0x4C5F, 0x3382, 0x03DF, 0x2002, 0x434C, 0x0110, +0x435C, 0x0110, 0x13B0, 0xC62E, 0x90B2, 0x0080, 0x2382, 0x2C06, 0x42D2, +0x2382, 0x093F, 0x13B0, 0xC40E, 0x3C02, 0x13B0, 0xC5B2, 0x434C, 0x0110, +0x141B, 0x0CCA, 0x3C06, 0x4DCA, 0x0000, 0x00AA, 0x0001, 0x533E, 0x633F, +0x4E0B, 0xDF0B, 0x930B, 0x23F6, 0x161A, 0x0110, 0x141B, 0x0CCA, 0x3C06, +0x4DFA, 0x0000, 0x00AA, 0x0001, 0x533E, 0x633F, 0x4E0B, 0xDF0B, 0x930B, +0x23F6, 0x161A, 0x0110, 0xD0F2, 0x0010, 0x093C, 0x43C2, 0x0923, 0x1840, +0x93D2, 0x3E9F, 0x2002, 0x0080, 0xAEC8, 0xD2F2, 0x0920, 0x0110, 0x9392, +0x2382, 0x2006, 0x1840, 0x43C2, 0x3EA2, 0x13B0, 0xC40E, 0x3C02, 0x13B0, +0xC5B2, 0x434C, 0x0110, 0x9392, 0x2382, 0x2006, 0x1840, 0x43D2, 0x3EA2, +0x13B0, 0xC40E, 0x3C02, 0x13B0, 0xC5B2, 0x434C, 0x0110, 0x40B2, 0x9628, +0x0900, 0xD3A2, 0x0902, 0xD0B2, 0x0400, 0x0908, 0x40B2, 0x9600, 0x0900, +0x434C, 0x0110, 0x1840, 0x9382, 0x3D5E, 0x2008, 0x1800, 0x40F2, 0x98BA, +0x3102, 0x1800, 0x40F2, 0xC694, 0x3106, 0x0110, 0x13B0, 0xACDE, 0xF0F2, +0x009F, 0x093E, 0x40F2, 0x00C4, 0x093D, 0x1840, 0x43C2, 0x3EA0, 0x434C, +0x0110, 0x1800, 0x124C, 0x4EFC, 0x0000, 0x00AC, 0x0001, 0x00BD, 0x0001, +0x23F9, 0x1800, 0x417C, 0x0110, 0x13B0, 0xC63A, 0x1840, 0x40B2, 0x0012, +0x3D78, 0x008C, 0xC864, 0x13B0, 0xBDE0, 0x434C, 0x0110, 0x13B0, 0xC63A, +0x1840, 0x40B2, 0x008D, 0x3D78, 0x008C, 0xC876, 0x13B0, 0xBDE0, 0x434C, +0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, 0x3C04, 0x43CC, 0x0000, 0x00AC, +0x0001, 0x0EDC, 0x23FA, 0x0110, 0x008F, 0x353A, 0x438F, 0x0000, 0x438F, +0x0006, 0x1800, 0x43CF, 0x0002, 0x438F, 0x0008, 0x0110, 0x431F, 0x535C, +0x835C, 0x3002, 0x18CC, 0x5F0F, 0x425C, 0x092F, 0xFF0C, 0xCFC2, 0x092F, +0x0110, 0x13B0, 0xC39C, 0x934C, 0x2006, 0x008C, 0xFFFE, 0x13B0, 0xBF38, +0x430C, 0x0110, 0x431C, 0x0110, 0x140A, 0x8321, 0x4C0A, 0x4A81, 0x0000, +0x410D, 0x530D, 0x435C, 0x13B0, 0xC6BC, 0x3FF8, 0x4303, 0x431F, 0x535C, +0x835C, 0x3002, 0x18CC, 0x5F0F, 0x425C, 0x092E, 0xFF0C, 0xCFC2, 0x092E, +0x0110, 0x1840, 0x425D, 0x2382, 0x1840, 0x425C, 0x2384, 0x13B0, 0xC698, +0x13B0, 0xC40E, 0x434C, 0x0110, 0x430F, 0x3C06, 0x4F0E, 0x0EEE, 0x1840, +0x438E, 0x4900, 0x531F, 0x903F, 0x0080, 0x3BF7, 0x0110, 0xB0B2, 0x0040, +0x0144, 0x2804, 0x40B2, 0xA540, 0x0144, 0x0110, 0x40B2, 0xA580, 0x0146, +0x0110, 0x1800, 0x124C, 0x4EBC, 0x0000, 0x03EC, 0x00BD, 0x0001, 0x23FA, +0x1800, 0x417C, 0x0110, 0x13B0, 0xC63A, 0x1840, 0x4392, 0x3D78, 0x008C, +0x3E8C, 0x13B0, 0xBDE0, 0x434C, 0x0110, 0x13B0, 0xB7CE, 0x1800, 0x40F2, +0x3E52, 0x31D6, 0x1800, 0x43C2, 0x3E6A, 0x430C, 0x0110, 0x0C60, 0x3D80, +0x1840, 0x4292, 0x2386, 0x3D7A, 0x1840, 0x43E2, 0x3E9F, 0x0080, 0xC63A, +0x40B2, 0xA500, 0x0146, 0xB0B2, 0x0040, 0x0144, 0x2803, 0x40B2, 0xA540, +0x0144, 0x0110, 0x3C05, 0x4DFC, 0x0000, 0x00AC, 0x0001, 0x533E, 0x930E, +0x23F9, 0x430C, 0x0110, 0x13B0, 0xC62E, 0x1840, 0x42D2, 0x2384, 0x3E8D, +0x13B0, 0xC40E, 0x434C, 0x0110, 0x1800, 0x124C, 0x438C, 0x0000, 0x532C, +0x831E, 0x23FB, 0x1800, 0x417C, 0x0110, 0x13B0, 0xBD64, 0x1840, 0x921C, +0x8002, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x1800, 0x124C, 0x4EBC, +0x0000, 0x532C, 0x831D, 0x23FB, 0x1800, 0x417C, 0x0110, 0x13B0, 0xACDE, +0x934C, 0x2004, 0x13B0, 0x99FE, 0x13B0, 0xC184, 0x435C, 0x0110, 0x13B0, +0xBD3A, 0x921C, 0x19FA, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x13B0, +0xBC92, 0x921C, 0x197A, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x120D, +0x120C, 0x422D, 0x410C, 0x530C, 0x13B0, 0x9D74, 0x5221, 0x0110, 0x1840, +0x43B2, 0x3D78, 0x1840, 0x43C2, 0x3E9F, 0x43C2, 0x0921, 0x0110, 0x13B0, +0xBCBC, 0x921C, 0x187A, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x13B0, +0xBD8E, 0x921C, 0x197A, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x140A, +0x411A, 0x0008, 0x120A, 0x1380, 0x3D8A, 0x5321, 0x160A, 0x0110, 0x1203, +0x1230, 0x0003, 0x435E, 0x13B0, 0xB07E, 0x4C4C, 0x5221, 0x0110, 0x13B0, +0xB900, 0x921C, 0x18FA, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x1840, +0x9382, 0x3542, 0x2002, 0x430C, 0x0110, 0x431C, 0x0110, 0x13B0, 0xC2C2, +0x13B0, 0xB8C6, 0x13B0, 0xB3FC, 0x0080, 0xB39E, 0x124C, 0x431D, 0x410C, +0x530C, 0x13B0, 0x9D74, 0x5321, 0x0110, 0x120C, 0x432D, 0x410C, 0x530C, +0x13B0, 0x9D74, 0x5321, 0x0110, 0x434C, 0x13B0, 0xBF14, 0x435C, 0x13B0, +0xBFC8, 0x3FFF, 0x4303, 0x1840, 0x421C, 0x197C, 0x1840, 0x421D, 0x197E, +0x0110, 0x1840, 0x421C, 0x1980, 0x1840, 0x421D, 0x1982, 0x0110, 0x1840, +0x421C, 0x187C, 0x1840, 0x421D, 0x187E, 0x0110, 0xB3D2, 0x093E, 0x2C02, +0x13B0, 0xC5B2, 0x434C, 0x0110, 0x0CCE, 0x008C, 0x3D86, 0x008D, 0x001C, +0x0080, 0xC2F2, 0x0CCE, 0x008C, 0x32E2, 0x008D, 0x0038, 0x0080, 0xC2F2, +0xD0F2, 0x0080, 0x0244, 0xD0F2, 0x0080, 0x0242, 0x0110, 0xD0F2, 0x0080, +0x0244, 0xC0F2, 0x0080, 0x0242, 0x0110, 0x1840, 0x421C, 0x1900, 0x1840, +0x421D, 0x1902, 0x0110, 0x1840, 0x4392, 0x3544, 0x1840, 0xC3D2, 0x3514, +0x0110, 0x1840, 0x421C, 0x1800, 0x1840, 0x421D, 0x1802, 0x0110, 0x1840, +0x421C, 0x19FC, 0x1840, 0x421D, 0x19FE, 0x0110, 0x1840, 0x421C, 0x18FC, +0x1840, 0x421D, 0x18FE, 0x0110, 0x1840, 0x4382, 0x3544, 0x1840, 0xD3D2, +0x3514, 0x0110, 0x13B0, 0xB5B2, 0x2802, 0x430C, 0x430D, 0x0110, 0x008C, +0x3E97, 0x13B0, 0xC334, 0x434C, 0x0110, 0x1840, 0x40B2, 0x0032, 0x3516, +0x0080, 0x9F7A, 0xD2F2, 0x0920, 0xD2F2, 0x0922, 0x0110, 0x1840, 0x4C82, +0x3D84, 0x434C, 0x0110, 0x13B0, 0xC5FE, 0x435C, 0x0110, 0x13B0, 0xC6B4, +0x435C, 0x0110, 0x13B0, 0xC6B6, 0x435C, 0x0110, 0x1840, 0x421C, 0x18F8, +0x0110, 0x1840, 0x421C, 0x3534, 0x0110, 0x1840, 0x421C, 0x3532, 0x0110, +0x1840, 0x4392, 0x32E0, 0x0110, 0xD0B2, 0x0100, 0x016C, 0x0110, 0x1840, +0x4382, 0x32E0, 0x0110, 0x1840, 0x421C, 0x33B6, 0x0110, 0xD392, 0x0700, +0x0110, 0x403C, 0x001D, 0x0110, 0xDCC2, 0x092E, 0x0110, 0xDCC2, 0x092F, +0x0110, 0xD2F2, 0x0922, 0x0110, 0xD392, 0x016C, 0x0110, 0x43C2, 0x0923, +0x0110, 0x0080, 0xC116, 0x430C, 0x0110, 0x0080, 0xB8C6, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x435C, 0x0110, 0x435C, 0x0110, 0x435C, +0x0110, 0x434C, 0x0110, 0x0080, 0xC684, 0x430C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x0080, +0xC27A, 0x430C, 0x0110, 0x430C, 0x0110, 0x0080, 0xA484, 0x0020, 0x3DA6, +0x434C, 0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x0110, 0x0110, 0x0110, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, +0x0110, 0x0282, 0x0201, 0x1C80, 0x1CC0, 0x1D00, 0x1D40, 0x1D80, 0x1DC0, +0x0484, 0x0203, 0x1E80, 0x1EC0, 0x1F00, 0x1F40, 0x1F80, 0x1FC0, 0x21A1, +0x0000, 0x0000, 0x0007, 0x00FF, 0xAFA4, 0x0000, 0x2021, 0x0000, 0x0000, +0x0007, 0x00FF, 0xC59A, 0x0000, 0x2221, 0xFFFF, 0x0000, 0x0000, 0x00CF, +0xC2AA, 0x0000, 0x21A1, 0x0000, 0x0002, 0x0007, 0x00FF, 0xAFA4, 0x0000, +0x2021, 0x0000, 0x0002, 0x0007, 0x00FF, 0xC59A, 0x0000, 0x2221, 0xFFFF, +0x0002, 0x0000, 0x00CF, 0xC2AA, 0x0000, 0x0100, 0x0001, 0x0000, 0x0000, +0x00FF, 0xC150, 0x0000, 0x0102, 0x0000, 0x00FF, 0x0000, 0x00F7, 0xAA34, +0x0000, 0x0880, 0x0000, 0x0000, 0x0001, 0x00FF, 0xC308, 0x0000, 0x0680, +0x01FF, 0xFFFF, 0xFFFF, 0x00D0, 0xC1EA, 0x0000, 0x0680, 0x02FF, 0xFFFF, +0xFFFF, 0x00D0, 0xC202, 0x0000, 0x0680, 0x03FF, 0xFFFF, 0xFFFF, 0x00D0, +0xB6AC, 0x0000, 0x0A81, 0x0000, 0xFFFF, 0x0001, 0x00F3, 0xC096, 0x0000, +0x0080, 0x0000, 0x0000, 0x0002, 0x00FF, 0xBB7A, 0x0000, 0x0081, 0x0000, +0x00FF, 0x0002, 0x00F7, 0xC00E, 0x0000, 0x0082, 0x0000, 0x00FF, 0x0002, +0x00F7, 0xADDC, 0x0000, 0x0500, 0x00FF, 0x0000, 0x0000, 0x00DF, 0xC0D8, +0x0000, 0x0900, 0x00FF, 0x0000, 0x0000, 0x00DF, 0xBE08, 0x0000, 0x0300, +0x00FF, 0x0000, 0x0000, 0x00DF, 0xC16A, 0x0000, 0x0302, 0x00FF, 0x00FF, +0x0000, 0x00D7, 0xB938, 0x0000, 0x0B01, 0x00FF, 0x00FF, 0x0000, 0x00D7, +0xC374, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xC4F4, 0x0000, +0x1980, 0x0000, 0x19FF, 0x0000, 0x1900, 0x0000, 0x197F, 0x0000, 0x1880, +0x0000, 0x18FF, 0x0000, 0x1800, 0x0000, 0x187F, 0x0000, 0x8E00, 0x0001, +0x0DFF, 0x0003, 0x8E00, 0x0001, 0x5FFF, 0x0004, 0xCC00, 0x0000, 0xFDFF, +0x0000, 0x0000, 0x0001, 0x8DFF, 0x0001, 0x7200, 0x0004, 0x7FFF, 0x0004, +0x6000, 0x0004, 0x71FF, 0x0004, 0x0200, 0x0112, 0x0200, 0x02EF, 0x0801, +0x2047, 0x0014, 0x0200, 0x0201, 0x0103, 0x0209, 0x008D, 0x0104, 0x8004, +0x0832, 0x000B, 0x0202, 0x0102, 0x0905, 0x0004, 0x0100, 0x0202, 0x0501, +0x2405, 0x1000, 0x0501, 0x0124, 0x0100, 0x2404, 0x0202, 0x2405, 0x0006, +0x0701, 0x8105, 0x4003, 0xFF00, 0x0409, 0x0001, 0x0A02, 0x0000, 0x0700, +0x0205, 0x4002, 0xFF00, 0x0507, 0x0282, 0x0040, 0x08FF, 0x020B, 0x0202, +0x0102, 0x0906, 0x0204, 0x0100, 0x0202, 0x0601, 0x2405, 0x1000, 0x0501, +0x0124, 0x0300, 0x2404, 0x0202, 0x2405, 0x0206, 0x0703, 0x8305, 0x4003, +0xFF00, 0x0409, 0x0003, 0x0A02, 0x0000, 0x0700, 0x0405, 0x4002, 0xFF00, +0x0507, 0x0284, 0x0040, 0x04FF, 0x0903, 0x2404, 0x5403, 0x6500, 0x7800, +0x6100, 0x7300, 0x2000, 0x4900, 0x6E00, 0x7300, 0x7400, 0x7200, 0x7500, +0x6D00, 0x6500, 0x6E00, 0x7400, 0x7300, 0x2200, 0x4D03, 0x5300, 0x5000, +0x2000, 0x5400, 0x6F00, 0x6F00, 0x6C00, 0x7300, 0x2000, 0x4400, 0x7200, +0x6900, 0x7600, 0x6500, 0x7200, 0x0400, 0x3003, 0x1600, 0x4D03, 0x5300, +0x5000, 0x3400, 0x3300, 0x3000, 0x2000, 0x5500, 0x5300, 0x4200, 0x2800, +0x4D03, 0x5300, 0x5000, 0x2000, 0x4400, 0x6500, 0x6200, 0x7500, 0x6700, +0x2000, 0x4900, 0x6E00, 0x7400, 0x6500, 0x7200, 0x6600, 0x6100, 0x6300, +0x6500, 0x2A00, 0x4D03, 0x5300, 0x5000, 0x2000, 0x4100, 0x7000, 0x7000, +0x6C00, 0x6900, 0x6300, 0x6100, 0x7400, 0x6900, 0x6F00, 0x6E00, 0x2000, +0x5500, 0x4100, 0x5200, 0x5400, 0x0500, 0x0082, 0x0000, 0x0000, 0x0201, +0x0403, 0x0605, 0x0807, 0xFF09, 0x03E8, 0x98BA, 0x0000, 0xC6B0, 0x0000, +0xAAC2, 0x0000, 0x91A0, 0x0000, 0xC49A, 0x0000, 0x9D74, 0x0000, 0xC4AA, +0x0000, 0xC3FC, 0x0000, 0xBEA4, 0x0000, 0xAF36, 0x0000, 0xBB48, 0x0000, +0xBDB8, 0x0000, 0xBB16, 0x0000, 0xB1BA, 0x0000, 0xABD8, 0x0000, 0xBD10, +0x0000, 0xC074, 0x0000, 0xC360, 0x0000, 0xBF14, 0x0000, 0xBFC8, 0x0000, +0xBE7E, 0x0000, 0xBC36, 0x0000, 0xBA4A, 0x0000, 0xC456, 0x0000, 0xAD5E, +0x0000, 0xB9A8, 0x0000, 0xC688, 0x0000, 0xC680, 0x0000, 0xC67C, 0x0000, +0xC678, 0x0000, 0xC6A4, 0x0000, 0xC6A8, 0x0000, 0xC6AA, 0x0000, 0xC6AC, +0x0000, 0xC6AE, 0x0000, 0xC654, 0x0000, 0xC67C, 0x0000, 0xC67C, 0x0000, +0xC6A4, 0x0000, 0x0000, 0x0000, 0xA910, 0x0000, 0x8F7C, 0x0000, 0xB07E, +0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, +0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0100, 0xFFFF, 0xFFFF, +0x0000, 0x0000, 0x0100, 0x3E52, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x82B8, 0x83A0, 0xFFFF, 0xFFFF, +0xFFFF, 0x83F4, 0xFFFF, 0x83E6, 0xFFFF, 0x81EA, 0xFFFF, 0xFFFF, 0x8054, +0x836C, 0x82D2, 0x803C, 0xFFFF, 0xFFFF, 0x8408, 0x83BE, 0x82CE, 0xFFFF, +0x82D6, 0x8326, 0x8006, +}; + +const uint32_t MSP_FetCoreImage_address[] = +{ +0x00008000, 0x0000FE00, +}; +const uint32_t MSP_FetCoreImage_length_of_sections[] = +{ +0x00002600, 0x00000100, +}; +const uint32_t MSP_FetCoreImage_sections = 0x00000002; +const uint32_t MSP_FetCoreImage_termination = 0x00000000; +const uint32_t MSP_FetCoreImage_start = 0x00008000; +const uint32_t MSP_FetCoreImage_finish = 0x00010000; +const uint32_t MSP_FetCoreImage_length = 0x00008000; + +#define MSP_FETCOREIMAGE_TERMINATION 0x00000000 +#define MSP_FETCOREIMAGE_START 0x00008000 +#define MSP_FETCOREIMAGE_FINISH 0x00010000 +#define MSP_FETCOREIMAGE_LENGTH 0x00008000 +#define MSP_FETCOREIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/MSP_FetDcdc.h b/Bios/include/MSP_FetDcdc.h new file mode 100644 index 0000000..df32bc8 --- /dev/null +++ b/Bios/include/MSP_FetDcdc.h @@ -0,0 +1,231 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetDcdcImage[] = +{ +0x7200, 0x0004, 0x0005, 0x0005, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF66F, 0xABBA, +0xABBA, 0x4180, 0xDBFE, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, +0x1840, 0x1207, 0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, +0x120B, 0x1840, 0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, +0x008C, 0x4E02, 0x403E, 0x0068, 0x403F, 0x0000, 0x13B4, 0x79E0, 0x1840, +0x413F, 0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, 0x413B, +0x1840, 0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, 0x1840, +0x4136, 0x1840, 0x4135, 0x1840, 0x4134, 0x1A00, 0x4070, 0x78D0, 0x4011, +0xDB84, 0x140A, 0x4C0A, 0x1840, 0x4A82, 0x4E68, 0x903A, 0xAAAA, 0x2406, +0x903A, 0xAAAC, 0x2403, 0x903A, 0xAAAD, 0x2063, 0xC0F2, 0x0010, 0x0245, +0xD0F2, 0x0020, 0x0245, 0xC0F2, 0x0020, 0x0243, 0xC0F2, 0x0080, 0x0245, +0xC0F2, 0x0080, 0x0243, 0xD0F2, 0x0040, 0x0245, 0x403F, 0x49EE, 0x4303, +0x432E, 0x533F, 0x633E, 0x2FFD, 0xC0F2, 0x0040, 0x0243, 0x403F, 0x49EE, +0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, 0xD0F2, 0x0040, 0x0243, 0xC0F2, +0x0040, 0x0245, 0x40F2, 0x0003, 0x022A, 0x1800, 0x40F2, 0x05E0, 0x4E58, +0x1800, 0x40F2, 0x05FD, 0x4E5C, 0x1800, 0x40F2, 0x05EE, 0x4E60, 0x1800, +0x40F2, 0x05EC, 0x4E64, 0x002F, 0x4E58, 0xD3DF, 0x0000, 0x40F2, 0x000F, +0x05E1, 0x002F, 0x4E58, 0x40FF, 0x0081, 0x0000, 0x40F2, 0x00C8, 0x05E6, +0x43C2, 0x05E7, 0x40B2, 0x0048, 0x05F2, 0x002F, 0x4E58, 0xC3DF, 0x0000, +0x403F, 0x49EE, 0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, 0x1840, 0x4382, +0x4E22, 0x1840, 0x4382, 0x4E56, 0x4A0C, 0x3C8B, 0x903A, 0xAAAB, 0x2003, +0x403C, 0xAAAB, 0x3C85, 0x903A, 0xBBBB, 0x2403, 0x903A, 0xBBBC, 0x207E, +0xC0F2, 0x0010, 0x0264, 0xC0F2, 0x0010, 0x0262, 0xD0F2, 0x0020, 0x0264, +0x403F, 0x49EE, 0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, 0xC0F2, 0x0020, +0x0262, 0x403F, 0x49EE, 0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, 0xD0F2, +0x0020, 0x0262, 0xC0F2, 0x0020, 0x0264, 0xD0F2, 0x0060, 0x0265, 0xD0F2, +0x0060, 0x026B, 0x1800, 0x40F2, 0x0620, 0x4E58, 0x1800, 0x40F2, 0x063D, +0x4E5C, 0x1800, 0x40F2, 0x062E, 0x4E60, 0x1800, 0x40F2, 0x062C, 0x4E64, +0x002F, 0x4E58, 0xD3DF, 0x0000, 0x40F2, 0x000F, 0x0621, 0x002F, 0x4E58, +0x40FF, 0x0081, 0x0000, 0x40F2, 0x0014, 0x0626, 0x43C2, 0x0627, 0x40B2, +0x0048, 0x0632, 0x002F, 0x4E58, 0xC3DF, 0x0000, 0x403F, 0x49EE, 0x4303, +0x432E, 0x533F, 0x633E, 0x2FFD, 0xC3D2, 0x0205, 0xD3D2, 0x020B, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x40B2, 0x2D52, 0x01C0, 0xD3A2, 0x01C2, +0x43D2, 0x01D0, 0x4382, 0x01C0, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, +0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x403C, 0x0CE4, 0x13B4, +0x7A24, 0x1840, 0x4382, 0x4E22, 0x1840, 0x4382, 0x4E56, 0x4A0C, 0x3C01, +0x433C, 0x160A, 0x0110, 0x145B, 0x8031, 0x0010, 0x0CCB, 0x4D08, 0x430C, +0x4039, 0x000A, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0008, 0x4381, +0x000A, 0x430A, 0x1840, 0x9E82, 0x4E22, 0x2006, 0x1840, 0x9392, 0x4E56, +0x2002, 0x430C, 0x3CD3, 0x1840, 0x4E82, 0x4E22, 0x1840, 0x4382, 0x4E56, +0x430A, 0x3C16, 0x411E, 0x0004, 0x411F, 0x0006, 0x531E, 0x630F, 0x4E81, +0x0004, 0x4F81, 0x0006, 0x9381, 0x0006, 0x2BF3, 0x2004, 0x90B1, 0x4000, +0x0004, 0x2BEE, 0xC0F2, 0x0080, 0x0242, 0x531A, 0x980A, 0x2CA8, 0x4A0F, +0x0FEF, 0x0BEF, 0x4F26, 0x9306, 0x2002, 0x4039, 0x0032, 0x9226, 0x2002, +0x4039, 0x0014, 0xD0F2, 0x0080, 0x0242, 0x460D, 0x403C, 0x0003, 0x13B4, +0x781C, 0x930C, 0x2002, 0x433C, 0x3C9B, 0x4381, 0x0000, 0x4381, 0x0002, +0x3C09, 0x412E, 0x411F, 0x0002, 0x531E, 0x630F, 0x4E81, 0x0000, 0x4F81, +0x0002, 0x9381, 0x0002, 0x2BF4, 0x2004, 0x90B1, 0x4000, 0x0000, 0x2BEF, +0x4381, 0x0000, 0x4381, 0x0002, 0x3C09, 0x412E, 0x411F, 0x0002, 0x531E, +0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x9381, 0x0002, 0x2BF4, 0x2004, +0x90B1, 0x4000, 0x0000, 0x2BEF, 0x4381, 0x0000, 0x4381, 0x0002, 0x3C09, +0x412E, 0x411F, 0x0002, 0x531E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x9381, 0x0002, 0x2BF4, 0x2004, 0x90B1, 0x4000, 0x0000, 0x2BEF, 0x4381, +0x0000, 0x4381, 0x0002, 0x3C09, 0x412E, 0x411F, 0x0002, 0x531E, 0x630F, +0x4E81, 0x0000, 0x4F81, 0x0002, 0x9381, 0x0002, 0x2BF4, 0x2004, 0x90B1, +0x4000, 0x0000, 0x2BEF, 0x490E, 0x410D, 0x523D, 0x410C, 0x503C, 0x000C, +0x13B4, 0x765E, 0x411E, 0x000C, 0x411F, 0x000E, 0x4A0D, 0x0DED, 0x0DCC, +0x064D, 0x0CED, 0x1840, 0x4E8D, 0x4E28, 0x1840, 0x4F8D, 0x4E2A, 0x411E, +0x0008, 0x411F, 0x000A, 0x4A0D, 0x0DED, 0x0DCC, 0x064D, 0x0CED, 0x1840, +0x4E8D, 0x4E24, 0x1840, 0x4F8D, 0x4E26, 0x4A0F, 0x0FEF, 0x0FCE, 0x064F, +0x0EEF, 0x1840, 0x468F, 0x4E2C, 0x430D, 0x403C, 0x0003, 0x13B4, 0x781C, +0x4381, 0x0004, 0x4381, 0x0006, 0x3F4A, 0x930C, 0x2005, 0x1840, 0x4382, +0x4E56, 0x433C, 0x3C04, 0x1840, 0x4392, 0x4E56, 0x430C, 0x5031, 0x0010, +0x1656, 0x0110, 0x145B, 0x8221, 0x4306, 0x430A, 0x4309, 0x4308, 0x430F, +0x438C, 0x0000, 0x438C, 0x0002, 0x438D, 0x0000, 0x438D, 0x0002, 0x1840, +0x90B2, 0xAAAC, 0x4E68, 0x2414, 0x1840, 0x90B2, 0xAAAA, 0x4E68, 0x240F, +0x1840, 0x90B2, 0xBBBB, 0x4E68, 0x240A, 0x1840, 0x90B2, 0xBBBC, 0x4E68, +0x2405, 0x1840, 0x90B2, 0xAAAD, 0x4E68, 0x2052, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x430F, 0x3C22, 0x412A, 0x411B, 0x0002, 0x531A, 0x630B, +0x4A81, 0x0000, 0x4B81, 0x0002, 0x9381, 0x0002, 0x2BF4, 0x2004, 0x90B1, +0x4000, 0x0000, 0x2BEF, 0x421A, 0x03D0, 0x4218, 0x0350, 0x8908, 0x4309, +0x588D, 0x0000, 0x698D, 0x0002, 0x860A, 0x430B, 0x5A8C, 0x0000, 0x6B8C, +0x0002, 0x531F, 0x9E0F, 0x2C1C, 0xD0B2, 0x0026, 0x0340, 0x4216, 0x03D0, +0x4219, 0x0350, 0xC3A2, 0x0700, 0x40F2, 0x0011, 0x0710, 0xD3A2, 0x0700, +0xC392, 0x070A, 0xD392, 0x0700, 0xB392, 0x070A, 0x2BFD, 0xC392, 0x070A, +0x4381, 0x0000, 0x4381, 0x0002, 0x3FC9, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x5221, 0x1656, +0x0110, 0x8321, 0x403F, 0x2710, 0x002E, 0x4E58, 0xB2EE, 0x0000, 0x2803, +0x533F, 0x930F, 0x23F8, 0x930F, 0x2002, 0x430C, 0x3C51, 0x002F, 0x4E58, +0xC0FF, 0x0010, 0x0000, 0x002F, 0x4E58, 0xD3EF, 0x0000, 0x403F, 0x2710, +0x002E, 0x4E5C, 0xB3DE, 0x0000, 0x2C03, 0x533F, 0x930F, 0x23F8, 0x930F, +0x2002, 0x430C, 0x3C3A, 0x002F, 0x4E5C, 0xC3DF, 0x0000, 0x002F, 0x4E64, +0x1840, 0x4FE1, 0x0000, 0x002F, 0x4E58, 0xD2EF, 0x0000, 0x403F, 0x2710, +0x002E, 0x4E58, 0xB2EE, 0x0000, 0x2803, 0x533F, 0x930F, 0x23F8, 0x930F, +0x2002, 0x430C, 0x3C1F, 0x403F, 0x2710, 0x002E, 0x4E5C, 0xB3DE, 0x0000, +0x2C03, 0x533F, 0x930F, 0x23F8, 0x930F, 0x2002, 0x430C, 0x3C11, 0x002F, +0x4E64, 0x1840, 0x4FE1, 0x0001, 0x416E, 0x4E4E, 0xF03E, 0x00FF, 0x108E, +0x415F, 0x0001, 0x4F4F, 0x5F0E, 0x4E8C, 0x0000, 0x431C, 0x5321, 0x0110, +0x8221, 0x4CC1, 0x0000, 0x4D0F, 0x108F, 0xF03F, 0x00FF, 0x4FC1, 0x0001, +0x4DC1, 0x0002, 0x002F, 0x4E58, 0xD0FF, 0x0012, 0x0000, 0x403F, 0x0681, +0x533F, 0x2FFE, 0x002F, 0x4E5C, 0xB0FF, 0x0020, 0x0000, 0x2802, 0x430C, +0x3C3C, 0x416E, 0x002F, 0x4E60, 0x4ECF, 0x0000, 0x403F, 0x0681, 0x533F, +0x2FFE, 0x002F, 0x4E5C, 0xB0FF, 0x0020, 0x0000, 0x2802, 0x430C, 0x3C2B, +0x415E, 0x0001, 0x002F, 0x4E60, 0x4ECF, 0x0000, 0x403F, 0x0681, 0x533F, +0x2FFE, 0x002F, 0x4E5C, 0xB0FF, 0x0020, 0x0000, 0x2802, 0x430C, 0x3C19, +0x415E, 0x0002, 0x002F, 0x4E60, 0x4ECF, 0x0000, 0x403F, 0x2710, 0x002E, +0x4E5C, 0xB3EE, 0x0000, 0x2C03, 0x533F, 0x930F, 0x23F8, 0x930F, 0x2002, +0x430C, 0x3C05, 0x002F, 0x4E58, 0xD2EF, 0x0000, 0x431C, 0x5221, 0x0110, +0x1A00, 0x40F2, 0x747A, 0x4E0A, 0x1A00, 0x40F2, 0x7998, 0x4E02, 0x1A00, +0x40F2, 0x7A38, 0x4E06, 0x1A00, 0x40F2, 0x7A0E, 0x4E0E, 0x1A00, 0x40F2, +0x7A24, 0x4E12, 0x1A00, 0x40F2, 0x727E, 0x4E16, 0x1A00, 0x40F2, 0x793C, +0x4E1A, 0x1A00, 0x40F2, 0x7A3E, 0x4E1E, 0x008E, 0x4E02, 0x008D, 0x0010, +0x13B4, 0x79F8, 0x1800, 0x43C2, 0x4E58, 0x1800, 0x43C2, 0x4E5C, 0x1800, +0x43C2, 0x4E60, 0x1800, 0x43C2, 0x4E64, 0x1840, 0x4382, 0x4E68, 0x0110, +0x143B, 0x430C, 0x430C, 0x013A, 0x0014, 0x3C24, 0x4C0B, 0x0BEB, 0x0BC8, +0x064B, 0x08EB, 0x1840, 0x9D8B, 0x4E2C, 0x201A, 0x4C0B, 0x0BEB, 0x0BC8, +0x064B, 0x08EB, 0x1840, 0x4B9A, 0x4E24, 0x0000, 0x1840, 0x4B9A, 0x4E26, +0x0002, 0x4C0B, 0x0BEB, 0x0BC8, 0x064B, 0x08EB, 0x1840, 0x4B9F, 0x4E28, +0x0000, 0x1840, 0x4B9F, 0x4E2A, 0x0002, 0x531C, 0x9E0C, 0x2BDA, 0x1638, +0x0110, 0x8321, 0x4381, 0x0000, 0xD0F2, 0x0020, 0x0264, 0x403F, 0x49EE, +0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, 0xC0F2, 0x0020, 0x0262, 0x403F, +0x49EE, 0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, 0xD0F2, 0x0020, 0x0262, +0xC0F2, 0x0020, 0x0264, 0x410C, 0x530C, 0x13B4, 0x7758, 0x412C, 0x5321, +0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, 0x3C04, 0x43CC, 0x0000, 0x00AC, +0x0001, 0x0EDC, 0x23FA, 0x0110, 0x1800, 0x124C, 0x4EBC, 0x0000, 0x03EC, +0x00BD, 0x0001, 0x23FA, 0x1800, 0x417C, 0x0110, 0x403D, 0x5A5A, 0x422C, +0x13B4, 0x781C, 0x930C, 0x2002, 0x433C, 0x0110, 0x430C, 0x0110, 0x4C0D, +0x431C, 0x13B4, 0x781C, 0x930C, 0x2002, 0x433C, 0x0110, 0x430C, 0x0110, +0x403C, 0x0005, 0x0110, 0x403C, 0x0005, 0x0110, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, +}; + +const uint32_t MSP_FetDcdcImage_address[] = +{ +0x00001800, 0x00047200, +}; +const uint32_t MSP_FetDcdcImage_length_of_sections[] = +{ +0x00000040, 0x00000700, +}; +const uint32_t MSP_FetDcdcImage_sections = 0x00000002; +const uint32_t MSP_FetDcdcImage_termination = 0x00000000; +const uint32_t MSP_FetDcdcImage_start = 0x00001800; +const uint32_t MSP_FetDcdcImage_finish = 0x00048000; +const uint32_t MSP_FetDcdcImage_length = 0x00046800; + +#define MSP_FETDCDCIMAGE_TERMINATION 0x00000000 +#define MSP_FETDCDCIMAGE_START 0x00001800 +#define MSP_FETDCDCIMAGE_FINISH 0x00048000 +#define MSP_FETDCDCIMAGE_LENGTH 0x00046800 +#define MSP_FETDCDCIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/MSP_FetDcdcController.h b/Bios/include/MSP_FetDcdcController.h new file mode 100644 index 0000000..255d48f --- /dev/null +++ b/Bios/include/MSP_FetDcdcController.h @@ -0,0 +1,83 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetDcdcControllerImage[] = +{ +0x0011, 0x0390, 0x0302, 0x0302, 0x0302, 0x0402, 0x0402, 0x0502, 0x0502, +0x0502, 0x0502, 0x0502, 0x0502, 0x0602, 0x0602, 0x0603, 0x0603, 0x0703, +0x0703, 0x0703, 0x0803, 0x0803, 0x0803, 0x0803, 0x0903, 0x0903, 0xFF03, +0x4031, 0x0300, 0x403C, 0x0200, 0x403D, 0x0003, 0x12B0, 0xE3F6, 0x12B0, +0xE1AE, 0x12B0, 0xE40C, 0x120F, 0x120E, 0xB3E2, 0x0079, 0x2804, 0x43A2, +0x0204, 0x4382, 0x0206, 0x421F, 0x0204, 0x830F, 0x249C, 0x832F, 0x240F, +0x832F, 0x2419, 0x832F, 0x2434, 0x832F, 0x2437, 0x832F, 0x243D, 0x823F, +0x246B, 0x832F, 0x2474, 0x832F, 0x247A, 0x3C8B, 0x425E, 0x007B, 0xF07E, +0x00E0, 0x527E, 0x4EC2, 0x007B, 0xC3E2, 0x0079, 0x42A2, 0x0204, 0x3C7F, +0xD3E2, 0x0078, 0x425E, 0x007C, 0xF07E, 0x00FE, 0x925E, 0xE000, 0x200C, +0xB3D2, 0x007C, 0x2804, 0x40B2, 0x0012, 0x0204, 0x3C02, 0x42B2, 0x0204, +0x43C2, 0x007C, 0x3C05, 0x43F2, 0x007C, 0x40B2, 0x0006, 0x0204, 0xD3D2, +0x007B, 0x3C62, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C5D, 0xC3E2, 0x0078, +0xD2F2, 0x007B, 0x40B2, 0x000A, 0x0204, 0x3C55, 0xD3E2, 0x0078, 0x90B2, +0x0003, 0x0206, 0x2C07, 0x421F, 0x0206, 0x42DF, 0x007C, 0x020D, 0x5392, +0x0206, 0x43C2, 0x007C, 0x90B2, 0x0003, 0x0206, 0x2818, 0x425F, 0x020D, +0x4F4F, 0x4F82, 0x0208, 0x425F, 0x020E, 0x4F4F, 0xF03F, 0x00FF, 0x108F, +0x4F82, 0x020A, 0x425F, 0x020F, 0x4F4F, 0x5F82, 0x020A, 0x40B2, 0x0006, +0x0204, 0x4382, 0x0206, 0x3C02, 0x42B2, 0x0204, 0xD3D2, 0x007B, 0x3C25, +0xD3E2, 0x0078, 0x42D2, 0x1001, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0x3C1A, 0xC3E2, 0x0078, 0xD3D2, 0x007B, 0x40B2, 0x0016, 0x0204, +0x3C12, 0xB3D2, 0x007C, 0x2805, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C0A, +0xD3E2, 0x0078, 0x42D2, 0x1000, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0xC3D2, 0x0079, 0xC0B1, 0x00D0, 0x0004, 0x413E, 0x413F, 0x1300, +0x40B2, 0x5A80, 0x0120, 0xD2E2, 0x0026, 0xF0F2, 0x00F5, 0x0021, 0x40F2, +0x000E, 0x0022, 0xF0F2, 0x003F, 0x002E, 0xF0F2, 0x003F, 0x0042, 0x43C2, +0x0029, 0x43F2, 0x002A, 0x40F2, 0x0021, 0x005B, 0x40F2, 0x002C, 0x005A, +0x42F2, 0x0059, 0x42D2, 0x10F8, 0x0056, 0x42D2, 0x10F9, 0x0057, 0x40B2, +0x0060, 0x0164, 0x42B2, 0x0172, 0x43A2, 0x0174, 0x4034, 0x0224, 0x4305, +0xD0F2, 0x0020, 0x0053, 0x40B2, 0x5A3F, 0x0120, 0xD3D2, 0x0000, 0x43C2, +0x020C, 0x43B2, 0x0208, 0x4382, 0x0204, 0x4382, 0x0206, 0x40F2, 0x00C1, +0x0078, 0x40F2, 0x0070, 0x0079, 0x40F2, 0x00EE, 0x007A, 0xD0F2, 0x0020, +0x007B, 0xC3D2, 0x0078, 0xC3D2, 0x0079, 0xD232, 0x403C, 0x0BB8, 0x12B0, +0xE276, 0xB3D2, 0x005A, 0x2C04, 0x4482, 0x0160, 0x4303, 0x3C03, 0x42A2, +0x0160, 0x5315, 0x93B2, 0x0208, 0x27F3, 0x421C, 0x020A, 0x12B0, 0xE318, +0x3FEE, 0x120A, 0x4C0A, 0x430C, 0x4A0F, 0xF03F, 0x7FFF, 0x4F82, 0x0200, +0x4A0F, 0xE33F, 0x5F0F, 0x7F0F, 0xF35F, 0x4FC2, 0x0202, 0x90B2, 0x04B0, +0x0200, 0x3819, 0x90B2, 0x0E11, 0x0200, 0x3415, 0x421F, 0x0200, 0x503F, +0xFB50, 0x4F0C, 0x403E, 0x0064, 0x12B0, 0xE39A, 0x4C0E, 0x5E0E, 0x425F, +0x0202, 0x4F4F, 0x5F0E, 0x4E5F, 0xE001, 0x4F4F, 0x531F, 0x4F82, 0x0172, +0x413A, 0x4130, 0x120F, 0x120E, 0xB0F2, 0x0010, 0x0020, 0x2C19, 0x9305, +0x2013, 0x425E, 0x020C, 0x535E, 0x4EC2, 0x020C, 0x926E, 0x2810, 0xD2F2, +0x0021, 0x403F, 0x12CE, 0x403E, 0x0013, 0x533F, 0x633E, 0x2FFD, 0x43C2, +0x020C, 0x3C04, 0xC2F2, 0x0021, 0x43C2, 0x020C, 0x4305, 0x413E, 0x413F, +0x1300, 0x120A, 0x4C0A, 0x421F, 0x0208, 0x831F, 0x2407, 0x831F, 0x2409, +0x831F, 0x240B, 0x831F, 0x240D, 0x3C0F, 0x4A0C, 0x12B0, 0xE276, 0x3C0B, +0x4A0C, 0x12B0, 0xE3B2, 0x3C07, 0x4A0C, 0x12B0, 0xE358, 0x3C03, 0x4A0C, +0x12B0, 0xE3E0, 0x43B2, 0x0208, 0x413A, 0x4130, 0xD3E2, 0x0022, 0xD0F2, +0x00C0, 0x002A, 0xB31C, 0x2804, 0xD0F2, 0x0040, 0x0029, 0x3C03, 0xC0F2, +0x0040, 0x0029, 0xB32C, 0x2803, 0xD3E2, 0x0021, 0x3C02, 0xC3E2, 0x0021, +0xB22C, 0x2804, 0xD0F2, 0x0080, 0x0029, 0x4130, 0xC0F2, 0x0080, 0x0029, +0x4130, 0xF37C, 0xF37E, 0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, +0x9F0E, 0x2801, 0x8F0E, 0x6C0C, 0x2BF9, 0x4130, 0x930C, 0x2002, 0x4224, +0x4130, 0x903C, 0x000A, 0x3404, 0x4C82, 0x0172, 0x4034, 0x0224, 0x4130, +0x120A, 0x8321, 0x4C0A, 0x4A81, 0x0000, 0x410D, 0x530D, 0x435C, 0x12B0, +0xE410, 0x3FF8, 0x903C, 0x5A5A, 0x2007, 0xC3D2, 0x0000, 0xD032, 0x00D8, +0x4303, 0xD3D2, 0x0000, 0x4130, 0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, +0x531C, 0x9F0C, 0x23FB, 0x4130, 0x4030, 0xE3CA, 0x4030, 0xE408, 0x4130, +0xE04C, 0xE2D2, 0xE034, +}; + +const uint32_t MSP_FetDcdcControllerImage_address[] = +{ +0x00001000, 0x0000E000, 0x0000FFE8, 0x0000FFF4, 0x0000FFFE, +}; +const uint32_t MSP_FetDcdcControllerImage_length_of_sections[] = +{ +0x00000001, 0x00000209, 0x00000001, 0x00000001, 0x00000001, +}; +const uint32_t MSP_FetDcdcControllerImage_sections = 0x00000005; +const uint32_t MSP_FetDcdcControllerImage_termination = 0x00000000; +const uint32_t MSP_FetDcdcControllerImage_start = 0x00001000; +const uint32_t MSP_FetDcdcControllerImage_finish = 0x00010000; +const uint32_t MSP_FetDcdcControllerImage_length = 0x0000F000; + +#define MSP_FETDCDCCONTROLLERIMAGE_TERMINATION 0x00000000 +#define MSP_FETDCDCCONTROLLERIMAGE_START 0x00001000 +#define MSP_FETDCDCCONTROLLERIMAGE_FINISH 0x00010000 +#define MSP_FETDCDCCONTROLLERIMAGE_LENGTH 0x0000F000 +#define MSP_FETDCDCCONTROLLERIMAGE_SECTIONS 0x00000005 diff --git a/Bios/include/MSP_FetDcdcControllerV2x.h b/Bios/include/MSP_FetDcdcControllerV2x.h new file mode 100644 index 0000000..2816af7 --- /dev/null +++ b/Bios/include/MSP_FetDcdcControllerV2x.h @@ -0,0 +1,83 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetDcdcControllerV2xImage[] = +{ +0x0034, 0x0390, 0x0302, 0x0302, 0x0302, 0x0402, 0x0402, 0x0602, 0x0603, +0x0603, 0x0603, 0x0703, 0x0703, 0x0703, 0x0703, 0x0703, 0x0703, 0x0803, +0x0803, 0x0803, 0x0903, 0x0903, 0x0A03, 0x0B03, 0x0B03, 0x0B03, 0xFF03, +0x4031, 0x0300, 0x403C, 0x0200, 0x403D, 0x0003, 0x12B0, 0xE3F6, 0x12B0, +0xE1AE, 0x12B0, 0xE40C, 0x120F, 0x120E, 0xB3E2, 0x0079, 0x2804, 0x43A2, +0x0204, 0x4382, 0x0206, 0x421F, 0x0204, 0x830F, 0x249C, 0x832F, 0x240F, +0x832F, 0x2419, 0x832F, 0x2434, 0x832F, 0x2437, 0x832F, 0x243D, 0x823F, +0x246B, 0x832F, 0x2474, 0x832F, 0x247A, 0x3C8B, 0x425E, 0x007B, 0xF07E, +0x00E0, 0x527E, 0x4EC2, 0x007B, 0xC3E2, 0x0079, 0x42A2, 0x0204, 0x3C7F, +0xD3E2, 0x0078, 0x425E, 0x007C, 0xF07E, 0x00FE, 0x925E, 0xE000, 0x200C, +0xB3D2, 0x007C, 0x2804, 0x40B2, 0x0012, 0x0204, 0x3C02, 0x42B2, 0x0204, +0x43C2, 0x007C, 0x3C05, 0x43F2, 0x007C, 0x40B2, 0x0006, 0x0204, 0xD3D2, +0x007B, 0x3C62, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C5D, 0xC3E2, 0x0078, +0xD2F2, 0x007B, 0x40B2, 0x000A, 0x0204, 0x3C55, 0xD3E2, 0x0078, 0x90B2, +0x0003, 0x0206, 0x2C07, 0x421F, 0x0206, 0x42DF, 0x007C, 0x020D, 0x5392, +0x0206, 0x43C2, 0x007C, 0x90B2, 0x0003, 0x0206, 0x2818, 0x425F, 0x020D, +0x4F4F, 0x4F82, 0x0208, 0x425F, 0x020E, 0x4F4F, 0xF03F, 0x00FF, 0x108F, +0x4F82, 0x020A, 0x425F, 0x020F, 0x4F4F, 0x5F82, 0x020A, 0x40B2, 0x0006, +0x0204, 0x4382, 0x0206, 0x3C02, 0x42B2, 0x0204, 0xD3D2, 0x007B, 0x3C25, +0xD3E2, 0x0078, 0x42D2, 0x1001, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0x3C1A, 0xC3E2, 0x0078, 0xD3D2, 0x007B, 0x40B2, 0x0016, 0x0204, +0x3C12, 0xB3D2, 0x007C, 0x2805, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C0A, +0xD3E2, 0x0078, 0x42D2, 0x1000, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0xC3D2, 0x0079, 0xC0B1, 0x00D0, 0x0004, 0x413E, 0x413F, 0x1300, +0x40B2, 0x5A80, 0x0120, 0xD2E2, 0x0026, 0xF0F2, 0x00F5, 0x0021, 0x40F2, +0x000E, 0x0022, 0xF0F2, 0x003F, 0x002E, 0xF0F2, 0x003F, 0x0042, 0x43C2, +0x0029, 0x43F2, 0x002A, 0x40F2, 0x0021, 0x005B, 0x40F2, 0x002C, 0x005A, +0x42F2, 0x0059, 0x42D2, 0x10F8, 0x0056, 0x42D2, 0x10F9, 0x0057, 0x40B2, +0x0060, 0x0164, 0x42B2, 0x0172, 0x43A2, 0x0174, 0x4034, 0x0224, 0x4305, +0xD0F2, 0x0020, 0x0053, 0x40B2, 0x5A3F, 0x0120, 0xD3D2, 0x0000, 0x43C2, +0x020C, 0x43B2, 0x0208, 0x4382, 0x0204, 0x4382, 0x0206, 0x40F2, 0x00C1, +0x0078, 0x40F2, 0x0070, 0x0079, 0x40F2, 0x00EE, 0x007A, 0xD0F2, 0x0020, +0x007B, 0xC3D2, 0x0078, 0xC3D2, 0x0079, 0xD232, 0x403C, 0x0BB8, 0x12B0, +0xE276, 0xB3D2, 0x005A, 0x2C04, 0x4482, 0x0160, 0x4303, 0x3C03, 0x42A2, +0x0160, 0x5315, 0x93B2, 0x0208, 0x27F3, 0x421C, 0x020A, 0x12B0, 0xE318, +0x3FEE, 0x120A, 0x4C0A, 0x430C, 0x4A0F, 0xF03F, 0x7FFF, 0x4F82, 0x0200, +0x4A0F, 0xE33F, 0x5F0F, 0x7F0F, 0xF35F, 0x4FC2, 0x0202, 0x90B2, 0x04B0, +0x0200, 0x3819, 0x90B2, 0x0E11, 0x0200, 0x3415, 0x421F, 0x0200, 0x503F, +0xFB50, 0x4F0C, 0x403E, 0x0064, 0x12B0, 0xE39A, 0x4C0E, 0x5E0E, 0x425F, +0x0202, 0x4F4F, 0x5F0E, 0x4E5F, 0xE001, 0x4F4F, 0x531F, 0x4F82, 0x0172, +0x413A, 0x4130, 0x120F, 0x120E, 0xB0F2, 0x0010, 0x0020, 0x2C19, 0x9305, +0x2013, 0x425E, 0x020C, 0x535E, 0x4EC2, 0x020C, 0x926E, 0x2810, 0xD2F2, +0x0021, 0x403F, 0x12CE, 0x403E, 0x0013, 0x533F, 0x633E, 0x2FFD, 0x43C2, +0x020C, 0x3C04, 0xC2F2, 0x0021, 0x43C2, 0x020C, 0x4305, 0x413E, 0x413F, +0x1300, 0x120A, 0x4C0A, 0x421F, 0x0208, 0x831F, 0x2407, 0x831F, 0x2409, +0x831F, 0x240B, 0x831F, 0x240D, 0x3C0F, 0x4A0C, 0x12B0, 0xE276, 0x3C0B, +0x4A0C, 0x12B0, 0xE3B2, 0x3C07, 0x4A0C, 0x12B0, 0xE358, 0x3C03, 0x4A0C, +0x12B0, 0xE3E0, 0x43B2, 0x0208, 0x413A, 0x4130, 0xD3E2, 0x0022, 0xD0F2, +0x00C0, 0x002A, 0xB31C, 0x2804, 0xD0F2, 0x0040, 0x0029, 0x3C03, 0xC0F2, +0x0040, 0x0029, 0xB32C, 0x2803, 0xD3E2, 0x0021, 0x3C02, 0xC3E2, 0x0021, +0xB22C, 0x2804, 0xD0F2, 0x0080, 0x0029, 0x4130, 0xC0F2, 0x0080, 0x0029, +0x4130, 0xF37C, 0xF37E, 0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, +0x9F0E, 0x2801, 0x8F0E, 0x6C0C, 0x2BF9, 0x4130, 0x930C, 0x2002, 0x4224, +0x4130, 0x903C, 0x000A, 0x3404, 0x4C82, 0x0172, 0x4034, 0x0224, 0x4130, +0x120A, 0x8321, 0x4C0A, 0x4A81, 0x0000, 0x410D, 0x530D, 0x435C, 0x12B0, +0xE410, 0x3FF8, 0x903C, 0x5A5A, 0x2007, 0xC3D2, 0x0000, 0xD032, 0x00D8, +0x4303, 0xD3D2, 0x0000, 0x4130, 0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, +0x531C, 0x9F0C, 0x23FB, 0x4130, 0x4030, 0xE3CA, 0x4030, 0xE408, 0x4130, +0xE04C, 0xE2D2, 0xE034, +}; + +const uint32_t MSP_FetDcdcControllerV2xImage_address[] = +{ +0x00001000, 0x0000E000, 0x0000FFE8, 0x0000FFF4, 0x0000FFFE, +}; +const uint32_t MSP_FetDcdcControllerV2xImage_length_of_sections[] = +{ +0x00000001, 0x00000209, 0x00000001, 0x00000001, 0x00000001, +}; +const uint32_t MSP_FetDcdcControllerV2xImage_sections = 0x00000005; +const uint32_t MSP_FetDcdcControllerV2xImage_termination = 0x00000000; +const uint32_t MSP_FetDcdcControllerV2xImage_start = 0x00001000; +const uint32_t MSP_FetDcdcControllerV2xImage_finish = 0x00010000; +const uint32_t MSP_FetDcdcControllerV2xImage_length = 0x0000F000; + +#define MSP_FETDCDCCONTROLLERV2XIMAGE_TERMINATION 0x00000000 +#define MSP_FETDCDCCONTROLLERV2XIMAGE_START 0x00001000 +#define MSP_FETDCDCCONTROLLERV2XIMAGE_FINISH 0x00010000 +#define MSP_FETDCDCCONTROLLERV2XIMAGE_LENGTH 0x0000F000 +#define MSP_FETDCDCCONTROLLERV2XIMAGE_SECTIONS 0x00000005 diff --git a/Bios/include/MSP_FetFpgaHal.h b/Bios/include/MSP_FetFpgaHal.h new file mode 100644 index 0000000..98f7255 --- /dev/null +++ b/Bios/include/MSP_FetFpgaHal.h @@ -0,0 +1,10300 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetFpgaHalImage[] = +{ +0x8E00, 0x0001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0016, 0x15C2, 0xADAC, +0xADAC, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, 0x1840, 0x1207, +0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, 0x120B, 0x1840, +0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, 0x008C, 0x2406, +0x403E, 0x0065, 0x403F, 0x0000, 0x13B1, 0xAD68, 0x008C, 0x2400, 0x038D, +0xA872, 0x403E, 0x0005, 0x403F, 0x0000, 0x13B1, 0xADD0, 0x1840, 0x413F, +0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, 0x413B, 0x1840, +0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, 0x1840, 0x4136, +0x1840, 0x4135, 0x1840, 0x4134, 0x1880, 0x4070, 0xA77E, 0x1840, 0x43F2, +0x2458, 0x008C, 0x2436, 0x13B1, 0xAD02, 0x434D, 0x3C08, 0x4303, 0x1840, +0x40F2, 0x00C0, 0x2458, 0x13B1, 0xAD26, 0x435D, 0x436C, 0x0180, 0x99BC, +0x140A, 0x008A, 0x2458, 0x40FA, 0x00C0, 0x0000, 0x13B1, 0xAD26, 0x435D, +0x436C, 0x13B1, 0x99BC, 0x40FA, 0x00F9, 0x0000, 0x13B1, 0xAD26, 0x008F, +0x2436, 0x403E, 0x0003, 0x430C, 0x430D, 0x13B1, 0xA636, 0x435D, 0x436C, +0x13B1, 0x99BC, 0x40FA, 0x00BF, 0x0000, 0x13B1, 0xAD26, 0x407D, 0x0003, +0x436C, 0x13B1, 0x99BC, 0x403C, 0x014A, 0x430D, 0x13B1, 0xAC8E, 0x008E, +0x2437, 0x434D, 0x403C, 0x0080, 0x13B1, 0xA668, 0x160A, 0x0110, 0x143B, +0x430E, 0x430F, 0x1840, 0x4219, 0x2418, 0x494A, 0x035A, 0xF07A, 0x003C, +0x494D, 0xF07D, 0x0003, 0xDA4D, 0x008A, 0x2436, 0x4DCA, 0x0000, 0x1089, +0xF379, 0x1109, 0x1109, 0x0088, 0x241A, 0xB0B8, 0x0010, 0x0002, 0x7B4B, +0x535B, 0xF35B, 0xF35D, 0xBB4D, 0x2002, 0x403E, 0x3000, 0x481C, 0x0002, +0x035C, 0xF36C, 0xDC4B, 0xB3EA, 0x0000, 0x2802, 0xB36B, 0x2C02, 0x403F, +0x0003, 0x1840, 0x4E82, 0x2406, 0x1840, 0x4F82, 0x2408, 0x435D, 0x430E, +0x430F, 0x407C, 0x001D, 0x13B1, 0x96C6, 0x1840, 0x421F, 0x2422, 0x1840, +0xD21F, 0x2424, 0x930F, 0x2013, 0xFA6B, 0xFA69, 0xF079, 0x00C3, 0x994B, +0x2008, 0x1840, 0xB8B2, 0x2406, 0x2004, 0x1840, 0xB8B2, 0x2408, 0x240F, +0x1840, 0x40F2, 0x009A, 0x245E, 0x3C0A, 0x934B, 0x2408, 0xB0B8, 0x0100, +0x0002, 0x2C04, 0x1840, 0x40F2, 0x0023, 0x245E, 0x1638, 0x0110, 0x141B, +0x008B, 0x2458, 0x43DB, 0x0000, 0x008A, 0x2436, 0x0ACC, 0x13B1, 0xAD02, +0x435D, 0x430E, 0x430F, 0x436C, 0x13B1, 0x96C6, 0x1840, 0x421F, 0x2422, +0x1840, 0xD21F, 0x2424, 0x930F, 0x240C, 0x430E, 0x430F, 0x1840, 0x421D, +0x2412, 0x436C, 0x13B1, 0xA608, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x40FB, +0x00C0, 0x0000, 0x13B1, 0xAD26, 0x435D, 0x436C, 0x13B1, 0x99BC, 0x40FB, +0x0080, 0x0000, 0x13B1, 0xAD26, 0x434F, 0x403E, 0x0012, 0x430C, 0x430D, +0x13B1, 0xA636, 0x407D, 0x0003, 0x436C, 0x13B1, 0x99BC, 0x403C, 0x086D, +0x430D, 0x13B1, 0xAC8E, 0x008B, 0x2437, 0x0BCE, 0x434D, 0x403C, 0x0012, +0x13B1, 0xA668, 0x4B5E, 0x0002, 0xF07E, 0x0003, 0x907E, 0x0003, 0x2404, +0x1840, 0x40F2, 0x0019, 0x245E, 0x43CA, 0x0000, 0x13B1, 0x8EB2, 0x4BDB, +0x0001, 0x0000, 0x43DA, 0x0000, 0x008F, 0x2438, 0x4FDF, 0x0001, 0x0000, +0x435E, 0x5A6E, 0x4FDF, 0x0002, 0x0001, 0x535E, 0x4ECA, 0x0000, 0x4FDF, +0x0003, 0x0002, 0x53DA, 0x0000, 0x00AF, 0x0003, 0x90FA, 0x0007, 0x0000, +0x2BEA, 0x1840, 0x93C2, 0x245E, 0x2011, 0x435D, 0x430E, 0x430F, 0x407C, +0x001D, 0x13B1, 0x96C6, 0x1840, 0x421F, 0x2422, 0x1840, 0xD21F, 0x2424, +0x930F, 0x2402, 0x13B1, 0x9F6C, 0x161A, 0x0110, 0x143B, 0x008B, 0x241A, +0xB0BB, 0x0400, 0x0002, 0x2C0C, 0x1840, 0xB3D2, 0x2437, 0x2808, 0x1840, +0x90B2, 0x03FF, 0x242E, 0x2C03, 0x1840, 0x5392, 0x242E, 0x403E, 0x2000, +0x403F, 0x0200, 0xFB2E, 0xFB1F, 0x0002, 0x903E, 0x2000, 0x2006, 0x903F, +0x0200, 0x2003, 0xD0BB, 0x0800, 0x0002, 0x403F, 0x0C00, 0xFB1F, 0x0002, +0x903F, 0x0400, 0x2012, 0x13B1, 0xAC3C, 0x1840, 0x425E, 0x242E, 0x1845, +0x5E4E, 0x1840, 0xDEC2, 0x2453, 0x1840, 0x421E, 0x242E, 0x075E, 0x1840, +0x4EC2, 0x2454, 0x3C49, 0xB0BB, 0x0800, 0x0002, 0x2C45, 0x008A, 0x2436, +0x43CA, 0x0000, 0x435D, 0x4A6E, 0x430F, 0x426C, 0x13B1, 0x96C6, 0x4A6F, +0x503F, 0x000E, 0x1840, 0x4CCF, 0x2447, 0x53DA, 0x0000, 0x93EA, 0x0000, +0x2BEF, 0x43CA, 0x0000, 0x435D, 0x4A6E, 0x430F, 0x435C, 0x13B1, 0x96C6, +0x4A6F, 0x522F, 0x1840, 0x4CCF, 0x2447, 0x53DA, 0x0000, 0x90FA, 0x0009, +0x0000, 0x2BEF, 0x008B, 0x2447, 0x1840, 0x425E, 0x242E, 0x1845, 0x5E4E, +0xDECB, 0x000C, 0x1840, 0x421E, 0x242E, 0x075E, 0x4ECB, 0x000D, 0xD0FB, +0x0048, 0x0003, 0xD3DB, 0x0000, 0xD0FB, 0x0080, 0x0002, 0xD0FB, 0x0040, +0x0000, 0xD0FB, 0x0069, 0x0001, 0x434E, 0x008B, 0x2437, 0x0BCF, 0x43FF, +0x0000, 0x43FF, 0x0001, 0x536E, 0x03EF, 0x907E, 0x0010, 0x2BF7, 0x008A, +0x2436, 0x43CA, 0x0000, 0x0088, 0x2458, 0x40F8, 0x009F, 0x0000, 0x13B1, +0xAD26, 0x0ACF, 0x403E, 0x0003, 0x430C, 0x430D, 0x13B1, 0xA636, 0x435D, +0x436C, 0x13B1, 0x99BC, 0x40F8, 0x009B, 0x0000, 0x13B1, 0xAD26, 0x0BCF, +0x403E, 0x0080, 0x430C, 0x430D, 0x13B1, 0xA636, 0x407D, 0x0005, 0x436C, +0x13B1, 0x99BC, 0x403C, 0x2710, 0x430D, 0x13B1, 0xAC8E, 0x53DA, 0x0000, +0x92FA, 0x0000, 0x2BD5, 0x40F8, 0x00A7, 0x0000, 0x13B1, 0xAD26, 0x008F, +0x2447, 0x403E, 0x0080, 0x430C, 0x430D, 0x13B1, 0xA636, 0x407D, 0x000F, +0x436C, 0x13B1, 0x99BC, 0x13B1, 0xA704, 0x1840, 0x93C2, 0x245E, 0x2025, +0x40F8, 0x00C0, 0x0000, 0x13B1, 0xAD26, 0x435D, 0x436C, 0x13B1, 0x99BC, +0x40F8, 0x00A8, 0x0000, 0x13B1, 0xAD26, 0x407D, 0x0003, 0x436C, 0x13B1, +0x99BC, 0x403C, 0x014A, 0x430D, 0x13B1, 0xAC8E, 0x0BCE, 0x434D, 0x403C, +0x0080, 0x13B1, 0xA668, 0x43CA, 0x0000, 0x008F, 0x2447, 0x4B7E, 0x9F7E, +0x2405, 0x1840, 0x40F2, 0x0018, 0x245E, 0x3C0B, 0x53DA, 0x0000, 0x4B7E, +0x9F7E, 0x23F6, 0x53DA, 0x0000, 0x90FA, 0x0010, 0x0000, 0x2BED, 0x1638, +0x0110, 0x147B, 0x124E, 0x4C04, 0x4D05, 0x430A, 0x430B, 0x4349, 0x3C6D, +0x4166, 0x4307, 0x9F07, 0x2803, 0x2008, 0x9E06, 0x2C06, 0x1840, 0x4682, +0x2422, 0x1840, 0x4382, 0x2424, 0x434F, 0x1840, 0x93C2, 0x2422, 0x244F, +0x1840, 0x4256, 0x2422, 0x4647, 0xF077, 0x0003, 0x240F, 0x4F4E, 0x08EE, +0x4E6C, 0x430D, 0x494E, 0x1842, 0x5E4E, 0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, +0x5359, 0x535F, 0x5377, 0x23F1, 0x1941, 0x1046, 0x2436, 0x4F47, 0x08E7, +0x476C, 0x430D, 0x494E, 0x1842, 0x5E4E, 0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, +0x5359, 0x535F, 0x4F47, 0x08E7, 0x476C, 0x430D, 0x494E, 0x1842, 0x5E4E, +0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, 0x5359, 0x535F, 0x4F47, 0x08E7, 0x476C, +0x430D, 0x494E, 0x1842, 0x5E4E, 0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, 0x5359, +0x535F, 0x4F47, 0x08E7, 0x476C, 0x430D, 0x494E, 0x1842, 0x5E4E, 0x13B1, +0xA9FA, 0xDC0A, 0xDD0B, 0x5359, 0x535F, 0x5376, 0x23CA, 0x1840, 0x5214, +0x2422, 0x1840, 0x6215, 0x2424, 0x416E, 0x1840, 0x825E, 0x2422, 0x4EC1, +0x0000, 0x93C1, 0x0000, 0x2423, 0x1840, 0x4382, 0x242A, 0x1840, 0x4382, +0x242C, 0x4406, 0x4507, 0xF037, 0x1FFF, 0x1840, 0x421E, 0x2400, 0x1840, +0x421F, 0x2402, 0x840E, 0x770F, 0x1840, 0x4E82, 0x2422, 0x1840, 0x4F82, +0x2424, 0x0028, 0x241E, 0x1517, 0x1607, 0x07E8, 0x0860, 0x2432, 0x4E07, +0xDF07, 0x9307, 0x236D, 0x4A0C, 0x4B0D, 0x5321, 0x1674, 0x0110, 0x147B, +0x8321, 0x4C44, 0x0087, 0x245F, 0x94C7, 0x0000, 0x244C, 0x1840, 0x4382, +0x242A, 0x1840, 0x4382, 0x242C, 0x43C7, 0x0000, 0x934C, 0x2442, 0x435E, +0x403C, 0x0018, 0x430D, 0x13B1, 0x9322, 0x4C0A, 0x4D0B, 0x426E, 0x403C, +0x0019, 0x430D, 0x13B1, 0x9322, 0x1840, 0x4C82, 0x2400, 0x1840, 0x4D82, +0x2402, 0x435E, 0x4A0C, 0x4B0D, 0x533C, 0x633D, 0x13B1, 0x9322, 0x4C81, +0x0000, 0x4306, 0x930C, 0x2422, 0x460E, 0x0A5E, 0x560E, 0x4A08, 0x4B09, +0x5E08, 0x6309, 0x435E, 0x480C, 0x490D, 0x13B1, 0x9322, 0x4C45, 0x944C, +0x2010, 0x426E, 0x5318, 0x6309, 0x480C, 0x490D, 0x13B1, 0x9322, 0x1840, +0x4C82, 0x242A, 0x1840, 0x4D82, 0x242C, 0x45C7, 0x0000, 0x3C03, 0x5316, +0x9126, 0x2BDE, 0x3FA8, 0x4303, 0x143B, 0x008A, 0x2457, 0x4A6E, 0x907E, +0x0013, 0x2407, 0x907E, 0x0016, 0x2404, 0x936E, 0x2402, 0x13B1, 0x9C62, +0x008B, 0x245E, 0x93CB, 0x0000, 0x20C7, 0x90FA, 0x0016, 0x0000, 0x200C, +0x1840, 0x43F2, 0x2458, 0x008C, 0x2436, 0x13B1, 0xAD02, 0x434D, 0x436C, +0x13B1, 0x99BC, 0x3CB7, 0x13B1, 0x8FE2, 0x93CB, 0x0000, 0x20B2, 0x13B1, +0xA26C, 0x4A6E, 0x936E, 0x2449, 0x935E, 0x2447, 0x907E, 0x0012, 0x2444, +0x13B1, 0x8F1C, 0x93CB, 0x0000, 0x203F, 0x435D, 0x403E, 0x0043, 0x430F, +0x434C, 0x13B1, 0x96C6, 0x1840, 0x4CC2, 0x2436, 0x1840, 0x934C, 0x2411, +0x1840, 0xD0F2, 0x0020, 0x245D, 0x1840, 0xB0B2, 0x0400, 0x2418, 0x7E4E, +0x536E, 0x1840, 0x4EC2, 0x2459, 0x1840, 0xD0B2, 0x0400, 0x2418, 0x1840, +0x93D2, 0x2404, 0x201D, 0x008E, 0x2418, 0x403C, 0xFD00, 0xFE2C, 0x4E28, +0x1088, 0xF378, 0x1108, 0x1108, 0x4E6F, 0x035F, 0xF03F, 0x003C, 0x403D, +0x0003, 0xFE2D, 0xDF0D, 0xE80D, 0xDC0D, 0x4D0F, 0xE03F, 0x0003, 0xBF0D, +0x2404, 0x40FB, 0x0098, 0x0000, 0x3C62, 0x93CB, 0x0000, 0x205F, 0x4A6E, +0x807E, 0x0003, 0x2411, 0x836E, 0x2416, 0x835E, 0x2417, 0x836E, 0x2425, +0x835E, 0x242A, 0x835E, 0x242F, 0x835E, 0x2434, 0x835E, 0x2439, 0x835E, +0x243E, 0x3C47, 0x1840, 0xD0B2, 0x0400, 0x241C, 0x13B1, 0xAAB4, 0x3C43, +0x13B1, 0xA584, 0x3C40, 0x008E, 0x2418, 0xB39E, 0x0000, 0x2C08, 0x403F, +0x0802, 0xFE2F, 0x932F, 0x2403, 0x93CE, 0x0000, 0x3430, 0x13B1, 0xAB10, +0x3C30, 0x1840, 0xB392, 0x2418, 0x2829, 0x13B1, 0xA3BC, 0x3C29, 0x1840, +0xB392, 0x2418, 0x2822, 0x13B1, 0xA35A, 0x3C22, 0x1840, 0xB392, 0x2418, +0x281B, 0x13B1, 0xA336, 0x3C1B, 0x1840, 0xB3A2, 0x2418, 0x2814, 0x13B1, +0xAD94, 0x3C14, 0x1840, 0xB3A2, 0x2418, 0x280D, 0x13B1, 0xAC66, 0x3C0D, +0x403F, 0x0802, 0x1840, 0xF21F, 0x2418, 0x932F, 0x2003, 0x13B1, 0xADA6, +0x3C03, 0x40FB, 0x0096, 0x0000, 0x13B1, 0xA860, 0x1638, 0x0110, 0x147B, +0x124C, 0x124D, 0x4E04, 0x4F05, 0x430A, 0x430B, 0x4348, 0x3C72, 0x416E, +0x430F, 0x1840, 0x921F, 0x2424, 0x2805, 0x200A, 0x1840, 0x921E, 0x2422, +0x2C06, 0x1840, 0x4E82, 0x2422, 0x1840, 0x4382, 0x2424, 0x1840, 0x93C2, +0x2422, 0x2451, 0x1840, 0x4256, 0x2422, 0x4649, 0xF079, 0x0003, 0x0027, +0x2432, 0x240F, 0x4F4E, 0x07EE, 0x4E6C, 0x430D, 0x484E, 0x1842, 0x5E4E, +0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, 0x5358, 0x535F, 0x5379, 0x23F1, 0x1941, +0x1046, 0x2436, 0x4F4E, 0x07EE, 0x4E6C, 0x430D, 0x484E, 0x1842, 0x5E4E, +0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, 0x5358, 0x535F, 0x4F4E, 0x07EE, 0x4E6C, +0x430D, 0x484E, 0x1842, 0x5E4E, 0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, 0x5358, +0x535F, 0x4F4E, 0x07EE, 0x4E6C, 0x430D, 0x484E, 0x1842, 0x5E4E, 0x13B1, +0xA9FA, 0xDC0A, 0xDD0B, 0x5358, 0x535F, 0x4F4E, 0x07EE, 0x4E6C, 0x430D, +0x484E, 0x1842, 0x5E4E, 0x13B1, 0xA9FA, 0xDC0A, 0xDD0B, 0x5358, 0x535F, +0x5376, 0x23CA, 0x1840, 0x5214, 0x2422, 0x1840, 0x6215, 0x2424, 0x416E, +0x1840, 0x825E, 0x2422, 0x4EC1, 0x0000, 0x93C1, 0x0000, 0x2443, 0x4406, +0x4507, 0x5606, 0x6707, 0x5606, 0x6707, 0x5606, 0x6707, 0x4349, 0x415C, +0x0002, 0x13B1, 0x9462, 0x1840, 0x421F, 0x242A, 0x1840, 0xD21F, 0x242C, +0x930F, 0x2006, 0x93C1, 0x0002, 0x2403, 0x430E, 0x430F, 0x3C19, 0x0357, +0x1006, 0x1107, 0x1006, 0x1107, 0x1006, 0x1840, 0x5216, 0x242A, 0x1840, +0x6217, 0x242C, 0x1840, 0x421E, 0x2400, 0x1840, 0x421F, 0x2402, 0x860E, +0x770F, 0x0029, 0x241E, 0x1517, 0x1607, 0x07E9, 0x1840, 0x4E82, 0x2422, +0x1840, 0x4F82, 0x2424, 0x0960, 0x2432, 0x1840, 0x4E0F, 0x1840, 0xD21F, +0x2424, 0x930F, 0x2348, 0x4A0C, 0x4B0D, 0x5221, 0x1674, 0x0110, 0x143B, +0x008A, 0x2458, 0x40FA, 0x008D, 0x0000, 0x13B1, 0xAD26, 0x008F, 0x2460, +0x432E, 0x430C, 0x430D, 0x13B1, 0xA636, 0x4079, 0x0003, 0x494D, 0x436C, +0x13B1, 0x99BC, 0x403C, 0x0108, 0x430D, 0x13B1, 0xAC8E, 0x13B1, 0xA704, +0x008B, 0x245E, 0x93CB, 0x0000, 0x203B, 0x40FA, 0x008D, 0x0000, 0x13B1, +0xAD26, 0x0088, 0x2436, 0x08CE, 0x008D, 0x2437, 0x432C, 0x13B1, 0xA668, +0x486E, 0xB94E, 0x202B, 0x93CB, 0x0000, 0x202B, 0x40FA, 0x008E, 0x0000, +0x13B1, 0xAD26, 0x008F, 0x2460, 0x432E, 0x430C, 0x430D, 0x13B1, 0xA636, +0x494D, 0x436C, 0x13B1, 0x99BC, 0x403C, 0x0108, 0x430D, 0x13B1, 0xAC8E, +0x13B1, 0xA704, 0x93CB, 0x0000, 0x200E, 0x40FA, 0x008E, 0x0000, 0x13B1, +0xAD26, 0x08CE, 0x008D, 0x2437, 0x432C, 0x13B1, 0xA668, 0x486E, 0xB94E, +0x2403, 0x40FB, 0x000B, 0x0000, 0x1638, 0x0110, 0x143B, 0x0089, 0x2458, +0x40F9, 0x0087, 0x0000, 0x13B1, 0xAD26, 0x008A, 0x2436, 0x43EA, 0x0000, +0x0ACF, 0x432E, 0x430C, 0x430D, 0x13B1, 0xA636, 0x407B, 0x0003, 0x4B4D, +0x436C, 0x13B1, 0x99BC, 0x1840, 0x4382, 0x2414, 0x1840, 0x4382, 0x2416, +0x0088, 0x2430, 0x433F, 0x1840, 0x521F, 0x2410, 0x4F88, 0x0000, 0x3C13, +0x40F9, 0x0087, 0x0000, 0x13B1, 0xAD26, 0x4BCA, 0x0000, 0x0ACF, 0x432E, +0x430C, 0x430D, 0x13B1, 0xA636, 0x4B4D, 0x436C, 0x13B1, 0x99BC, 0x53B8, +0x0000, 0x9388, 0x0000, 0x3815, 0x13B1, 0xA688, 0x40F9, 0x0083, 0x0000, +0x13B1, 0xAD26, 0x4B4D, 0x436C, 0x13B1, 0x99BC, 0x13B1, 0xA704, 0x1840, +0x93C2, 0x245E, 0x27D9, 0x1840, 0x40F2, 0x000A, 0x245E, 0x1638, 0x0110, +0x145B, 0x4C4B, 0x4D4A, 0x4348, 0x4349, 0x1840, 0x425E, 0x2464, 0x9E4C, +0x2496, 0x4C4F, 0x835F, 0x2410, 0x835F, 0x243E, 0x835F, 0x2413, 0x835F, +0x2422, 0x807F, 0x0003, 0x2451, 0x835F, 0x244B, 0x835F, 0x2458, 0x836F, +0x2466, 0x3C6C, 0x13B1, 0xADB6, 0x4078, 0x0005, 0x4079, 0x001F, 0x3C69, +0x935E, 0x2402, 0x936E, 0x2003, 0x4268, 0x4369, 0x3C62, 0x927E, 0x2403, +0x907E, 0x0007, 0x205D, 0x4078, 0x0005, 0x4079, 0x0007, 0x3C58, 0x935E, +0x2402, 0x936E, 0x2005, 0x4078, 0x0005, 0x4079, 0x0006, 0x3C4F, 0x907E, +0x0007, 0x2402, 0x927E, 0x2005, 0x4078, 0x0006, 0x4079, 0x000F, 0x3C45, +0x907E, 0x0009, 0x2042, 0x4268, 0x3C32, 0x935E, 0x241B, 0x907E, 0x0006, +0x2403, 0x907E, 0x0005, 0x2002, 0x4368, 0x3C22, 0x907E, 0x0007, 0x2405, +0x927E, 0x2403, 0x907E, 0x000B, 0x202E, 0x4078, 0x0003, 0x4849, 0x3C2A, +0x907E, 0x0006, 0x2027, 0x3C03, 0x907E, 0x0005, 0x2002, 0x4358, 0x3C21, +0x936E, 0x201F, 0x4268, 0x4079, 0x0005, 0x3C1B, 0x907E, 0x0005, 0x2403, +0x907E, 0x0006, 0x2003, 0x4358, 0x4359, 0x3C12, 0x907E, 0x0007, 0x200F, +0x4368, 0x4079, 0x0003, 0x3C0B, 0x927E, 0x2009, 0x4078, 0x0005, 0x4079, +0x000E, 0x3C04, 0x1840, 0x40F2, 0x006E, 0x245E, 0x0086, 0x2465, 0x43C6, +0x0000, 0x9348, 0x240A, 0x494C, 0xF35C, 0x13B1, 0xACB6, 0x0359, 0x53D6, +0x0000, 0x98C6, 0x0000, 0x2BF6, 0x1840, 0x4BC2, 0x2464, 0x0086, 0x2465, +0x43C6, 0x0000, 0x934A, 0x2408, 0x434C, 0x13B1, 0xACB6, 0x53D6, 0x0000, +0x9AC6, 0x0000, 0x2BF8, 0x1656, 0x0110, 0x145B, 0x426D, 0x430E, 0x430F, +0x434C, 0x13B1, 0x96C6, 0x008A, 0x2406, 0x4C8A, 0x0000, 0x4D8A, 0x0002, +0x903C, 0x6544, 0x2003, 0x903D, 0x6973, 0x2406, 0x903C, 0x6341, 0x2087, +0x903D, 0x6574, 0x2084, 0x008B, 0x2426, 0x438B, 0x0000, 0x438B, 0x0002, +0x0088, 0x2400, 0x426D, 0x403E, 0x0019, 0x430F, 0x434C, 0x13B1, 0x96C6, +0x4C88, 0x0000, 0x4D88, 0x0002, 0x436D, 0x403E, 0xFFFE, 0x433F, 0x5C0E, +0x681F, 0x0002, 0x434C, 0x13B1, 0x96C6, 0x4C06, 0x482F, 0xD81F, 0x0002, +0x930F, 0x2461, 0x1840, 0x4382, 0x240A, 0x0089, 0x2414, 0x4389, 0x0000, +0x4389, 0x0002, 0x403E, 0xFFFE, 0x433F, 0x583E, 0x683F, 0x4E8B, 0x0000, +0x4F8B, 0x0002, 0x0088, 0x2422, 0x4E07, 0xDF07, 0x9307, 0x2445, 0x492E, +0x491F, 0x0002, 0x5E0E, 0x6F0F, 0x5E0E, 0x6F0F, 0x5E0E, 0x6F0F, 0x434C, +0x13B1, 0xA8CE, 0x0CC7, 0x0C60, 0x2432, 0x989B, 0x0002, 0x0002, 0x2804, +0x2008, 0x98AB, 0x0000, 0x2C05, 0x4BA8, 0x0000, 0x4B98, 0x0002, 0x0002, +0x438A, 0x0000, 0x438A, 0x0002, 0x482F, 0xD81F, 0x0002, 0x930F, 0x2411, +0x1840, 0x47F2, 0x2436, 0x13B1, 0xABFC, 0x539A, 0x0000, 0x638A, 0x0002, +0x989A, 0x0002, 0x0002, 0x2BF3, 0x2003, 0x98AA, 0x0000, 0x2BEF, 0x58A9, +0x0000, 0x6899, 0x0002, 0x0002, 0x88AB, 0x0000, 0x789B, 0x0002, 0x0002, +0x4B2F, 0xDB1F, 0x0002, 0x930F, 0x23BB, 0x1840, 0x9682, 0x240A, 0x2404, +0x1840, 0x40F2, 0x0064, 0x245E, 0x1656, 0x0110, 0x143B, 0x1840, 0x40F2, +0x000F, 0x2458, 0x13B1, 0xAD26, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x008B, +0x2437, 0x0BCE, 0x434D, 0x403C, 0x0020, 0x13B1, 0xA668, 0x434D, 0x436C, +0x13B1, 0x99BC, 0x4B5E, 0x0003, 0x108E, 0x4B58, 0x0002, 0x4B6A, 0x4B5C, +0x0001, 0x108C, 0xDA0C, 0x480D, 0xDE0D, 0x008A, 0x240C, 0x4C8A, 0x0000, +0x4D8A, 0x0002, 0x108D, 0x4D4C, 0x13B1, 0xADC6, 0x1840, 0x4CC2, 0x245A, +0x008B, 0x2414, 0x426D, 0x403E, 0x001F, 0x430F, 0x434C, 0x13B1, 0x96C6, +0x4C8B, 0x0000, 0x4D8B, 0x0002, 0x0088, 0x2406, 0x426D, 0x403E, 0x0039, +0x430F, 0x434C, 0x13B1, 0x96C6, 0x4C88, 0x0000, 0x4D88, 0x0002, 0xFC8A, +0x0000, 0xFD8A, 0x0002, 0xF8BB, 0x0000, 0xF8BB, 0x0002, 0x9BBA, 0x0000, +0x2036, 0x9BBA, 0x0002, 0x2033, 0x435D, 0x403E, 0x003D, 0x430F, 0x434C, +0x13B1, 0x96C6, 0x1840, 0x4CC2, 0x245C, 0x436D, 0x403E, 0x003E, 0x430F, +0x434C, 0x13B1, 0x96C6, 0x1840, 0x4C82, 0x2410, 0x435D, 0x403E, 0x0037, +0x430F, 0x434C, 0x13B1, 0x96C6, 0x1840, 0xDCC2, 0x245D, 0x436D, 0x403E, +0x0040, 0x430F, 0x434C, 0x13B1, 0x96C6, 0x1840, 0x4C82, 0x2412, 0x435D, +0x403E, 0x0038, 0x430F, 0x434C, 0x13B1, 0x96C6, 0x1840, 0x4CC2, 0x245B, +0x3C04, 0x1840, 0x40F2, 0x0006, 0x245E, 0x1638, 0x0110, 0x143B, 0x13B1, +0x8E9E, 0x0088, 0x2414, 0x4388, 0x0000, 0x4388, 0x0002, 0x008B, 0x240A, +0x40BB, 0x0080, 0x0000, 0x435D, 0x430E, 0x430F, 0x407C, 0x0007, 0x13B1, +0x96C6, 0x1840, 0x4CC2, 0x2463, 0x008A, 0x2462, 0x40FA, 0x0007, 0x0000, +0x0089, 0x2458, 0x1840, 0x425E, 0x2463, 0xFB6E, 0x2453, 0x1840, 0x4AE2, +0x2436, 0x40F9, 0x009F, 0x0000, 0x13B1, 0xAD26, 0x008F, 0x2436, 0x403E, +0x0003, 0x430C, 0x430D, 0x13B1, 0xA636, 0x434D, 0x407C, 0x0009, 0x13B1, +0x99BC, 0x40F9, 0x009C, 0x0000, 0x13B1, 0xAD26, 0x482E, 0x481F, 0x0002, +0x403D, 0x0080, 0x427C, 0x13B1, 0xA608, 0x407D, 0x0003, 0x436C, 0x13B1, +0x99BC, 0x403C, 0x009F, 0x430D, 0x13B1, 0xAC8E, 0x13B1, 0xA704, 0x1840, +0x93C2, 0x245E, 0x201F, 0x40F9, 0x009C, 0x0000, 0x13B1, 0xAD26, 0x008E, +0x2437, 0x434D, 0x403C, 0x0080, 0x13B1, 0xA668, 0x407E, 0x0003, 0x1840, +0xF25E, 0x2437, 0x907E, 0x0003, 0x2405, 0x1840, 0x40F2, 0x0014, 0x245E, +0x3C11, 0x50B8, 0x0080, 0x0000, 0x6388, 0x0002, 0x3C02, 0x43FA, 0x0000, +0x4B2F, 0x035F, 0x4F8B, 0x0000, 0x53FA, 0x0000, 0x93CA, 0x0000, 0x379F, +0x1638, 0x0110, 0x145B, 0x4C07, 0x0DCA, 0x0ECB, 0x0088, 0x2468, 0x43D8, +0x0000, 0x0089, 0x2466, 0x43C9, 0x0000, 0x43CE, 0x0000, 0x0086, 0x2467, +0x03DD, 0x2003, 0x43C6, 0x0000, 0x3C1A, 0x496F, 0x0DEF, 0x4FE6, 0x0000, +0x3C15, 0x496F, 0x0AEF, 0x4FE6, 0x0000, 0x435D, 0xF66D, 0x434C, 0x13B1, +0xA7F0, 0x934C, 0x2404, 0x496F, 0x0BEF, 0xD8EF, 0x0000, 0x58E8, 0x0000, +0x466E, 0x035E, 0x4EC6, 0x0000, 0x5337, 0x2410, 0x93C8, 0x0000, 0x23EA, +0x43D8, 0x0000, 0x53D9, 0x0000, 0x496F, 0x0BEF, 0x43CF, 0x0000, 0x03DA, +0x23DC, 0x43C6, 0x0000, 0x3FDD, 0x93C8, 0x0000, 0x2011, 0x43D8, 0x0000, +0x53D9, 0x0000, 0x496F, 0x0BEF, 0x43CF, 0x0000, 0x03DA, 0x2003, 0x43C6, +0x0000, 0x3C04, 0x496F, 0x0AEF, 0x4FE6, 0x0000, 0x435D, 0xF66D, 0x435C, +0x13B1, 0xA7F0, 0x934C, 0x2404, 0x496F, 0x0BEF, 0xD8EF, 0x0000, 0x008F, +0x2464, 0x92EF, 0x0000, 0x2004, 0x40FF, 0x0006, 0x0000, 0x3C07, 0x90FF, +0x0003, 0x0000, 0x2003, 0x40FF, 0x0005, 0x0000, 0x1656, 0x0110, 0x141B, +0x1840, 0x40F2, 0x0092, 0x2458, 0x13B1, 0xAD26, 0x407A, 0x001D, 0x430E, +0x430F, 0x403D, 0x0080, 0x4A4C, 0x13B1, 0xA608, 0x407D, 0x0003, 0x436C, +0x13B1, 0x99BC, 0x403C, 0x059E, 0x430D, 0x13B1, 0xAC8E, 0x008E, 0x2437, +0x434D, 0x403C, 0x0080, 0x13B1, 0xA668, 0x407E, 0x0003, 0x1840, 0xF25E, +0x2437, 0x935E, 0x2004, 0x1840, 0xD0B2, 0x0100, 0x241C, 0x1840, 0xB0B2, +0x0100, 0x2418, 0x2833, 0x008B, 0x2406, 0x426D, 0x430E, 0x430F, 0x4A4C, +0x13B1, 0x96C6, 0x4C8B, 0x0000, 0x4D8B, 0x0002, 0x426D, 0x422E, 0x430F, +0x4A4C, 0x13B1, 0x96C6, 0xDC8B, 0x0000, 0xDD8B, 0x0002, 0x426D, 0x423E, +0x430F, 0x4A4C, 0x13B1, 0x96C6, 0xDC8B, 0x0000, 0xDD8B, 0x0002, 0x426D, +0x403E, 0x000C, 0x430F, 0x4A4C, 0x13B1, 0x96C6, 0xDC8B, 0x0000, 0xDD8B, +0x0002, 0x4B3F, 0xDB3F, 0x930F, 0x2004, 0x1840, 0xD0B2, 0x0200, 0x241C, +0x161A, 0x0110, 0x143B, 0x0088, 0x2414, 0x4388, 0x0000, 0x4388, 0x0002, +0x008B, 0x240A, 0x40BB, 0x0080, 0x0000, 0x435D, 0x430E, 0x430F, 0x407C, +0x0007, 0x13B1, 0x96C6, 0x1840, 0x4CC2, 0x2463, 0x008A, 0x2462, 0x40FA, +0x0007, 0x0000, 0x1840, 0x425E, 0x2463, 0xFB6E, 0x2434, 0x1840, 0x4AE2, +0x2436, 0x1840, 0x40F2, 0x009F, 0x2458, 0x13B1, 0xAD26, 0x008F, 0x2436, +0x403E, 0x0003, 0x430C, 0x430D, 0x13B1, 0xA636, 0x434D, 0x407C, 0x0009, +0x13B1, 0x99BC, 0x1840, 0x40F2, 0x009B, 0x2458, 0x13B1, 0xAD26, 0x482E, +0x481F, 0x0002, 0x403D, 0x0080, 0x427C, 0x13B1, 0xA608, 0x407D, 0x0005, +0x436C, 0x13B1, 0x99BC, 0x50B8, 0x0080, 0x0000, 0x6388, 0x0002, 0x13B1, +0xA704, 0x1840, 0x93C2, 0x245E, 0x2009, 0x4B2F, 0x035F, 0x4F8B, 0x0000, +0x53FA, 0x0000, 0x93CA, 0x0000, 0x37BE, 0x1638, 0x0110, 0x145B, 0x4E0A, +0x0FCB, 0x4C4E, 0x1942, 0x104E, 0x0088, 0x2466, 0x4EC8, 0x0000, 0xF07C, +0x0007, 0x0089, 0x2468, 0x435F, 0x835C, 0x3002, 0x18CC, 0x5F4F, 0x535C, +0x4FC9, 0x0000, 0x03DB, 0x2002, 0x434F, 0x3C06, 0x0BEE, 0x4E6F, 0x835C, +0x3002, 0x18CC, 0x110F, 0x0086, 0x2467, 0x4FC6, 0x0000, 0x4157, 0x001C, +0x9347, 0x2004, 0x531A, 0x3C02, 0x43C6, 0x0000, 0x533A, 0x2417, 0x435D, +0xF66D, 0x434C, 0x13B1, 0xA832, 0x466E, 0x035E, 0x4EC6, 0x0000, 0x59E9, +0x0000, 0x23F2, 0x43D9, 0x0000, 0x53D8, 0x0000, 0x03DB, 0x27EA, 0x486F, +0x0BEF, 0x4FE6, 0x0000, 0x3FE7, 0x9347, 0x2415, 0x435D, 0xF66D, 0x435C, +0x13B1, 0xA832, 0x008F, 0x2464, 0x92EF, 0x0000, 0x2004, 0x40FF, 0x0006, +0x0000, 0x3C07, 0x90FF, 0x0003, 0x0000, 0x2003, 0x40FF, 0x0005, 0x0000, +0x1656, 0x0110, 0x147B, 0x124C, 0x8321, 0x4D07, 0x4E0A, 0x4F0B, 0x4E08, +0xF038, 0x0007, 0x480E, 0x430F, 0x5D0E, 0x630F, 0x503E, 0x0007, 0x630F, +0x035F, 0x100E, 0x110F, 0x100E, 0x110F, 0x100E, 0x0086, 0x2426, 0x4E86, +0x0000, 0x4F86, 0x0002, 0x43C1, 0x0000, 0x0085, 0x2422, 0x4E0D, 0xDF0D, +0x930D, 0x2436, 0x4A0E, 0x4B0F, 0x415C, 0x0002, 0x13B1, 0xA8CE, 0x0C60, +0x2432, 0x9695, 0x0002, 0x0002, 0x280D, 0x2003, 0x96A5, 0x0000, 0x2809, +0x46A5, 0x0000, 0x4695, 0x0002, 0x0002, 0x4704, 0x43D1, 0x0000, 0x3C04, +0x4564, 0x1842, 0x5444, 0x8844, 0x1251, 0x0002, 0x0CCF, 0x440E, 0x480C, +0x430D, 0x13B1, 0xA0F6, 0x85A6, 0x0000, 0x7596, 0x0002, 0x0002, 0x8407, +0x540A, 0x630B, 0x4A08, 0xF038, 0x0007, 0x5321, 0x462F, 0xD61F, 0x0002, +0x930F, 0x23CA, 0x5221, 0x1674, 0x0110, 0x145B, 0x1840, 0x425E, 0x245D, +0xB07E, 0x0006, 0x2003, 0x403F, 0x002C, 0x3C02, 0x403F, 0x0038, 0x1840, +0x4F82, 0x240A, 0x1840, 0x40F2, 0x00A4, 0x2458, 0x13B1, 0xAD26, 0x407D, +0x0003, 0x436C, 0x13B1, 0x99BC, 0x13B1, 0xAC3C, 0x008A, 0x241A, 0xF38A, +0x0000, 0xF0BA, 0xFF00, 0x0002, 0x008B, 0x2447, 0x0BCE, 0x434D, 0x1840, +0x421C, 0x240A, 0x13B1, 0xA668, 0x4A2E, 0x4A1F, 0x0002, 0x4B6C, 0x1840, +0x4258, 0x245D, 0xB078, 0x0006, 0x2409, 0x4B58, 0x0002, 0x4B56, 0x0001, +0x1086, 0xD60C, 0xDC0E, 0xD80F, 0x3C13, 0x4B58, 0x0001, 0xF038, 0x000F, +0x0E58, 0x4C4D, 0xEC0D, 0x108C, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, +0x6D0D, 0x5C0C, 0x6D0D, 0xD80D, 0xDC0E, 0xDD0F, 0x4E8A, 0x0000, 0x4F8A, +0x0002, 0x1656, 0x0110, 0x13B1, 0xAC5C, 0x008F, 0x2437, 0x43DF, 0x0000, +0x40FF, 0x0040, 0x0001, 0x43CF, 0x0002, 0x0180, 0xAB68, 0x1840, 0xB0B2, +0x0400, 0x2418, 0x2C06, 0x1840, 0x40F2, 0x0003, 0x2460, 0x13B1, 0xA470, +0x1840, 0x93C2, 0x245E, 0x2002, 0x13B1, 0x8E8A, 0x0110, 0x140A, 0x008A, +0x245E, 0x93CA, 0x0000, 0x200D, 0x13B1, 0xAC5C, 0x008F, 0x2437, 0x43DF, +0x0000, 0x40FF, 0x0040, 0x0001, 0x43CF, 0x0002, 0x13B1, 0xAB68, 0x93CA, +0x0000, 0x2019, 0x1840, 0xB0B2, 0x0400, 0x2418, 0x2C14, 0x13B1, 0x9914, +0x93CA, 0x0000, 0x200F, 0x1840, 0x43C2, 0x2460, 0x13B1, 0xA470, 0x93CA, +0x0000, 0x2007, 0x13B1, 0xA3C8, 0x93CA, 0x0000, 0x2002, 0x13B1, 0x8E8A, +0x160A, 0x0110, 0x1840, 0xD0B2, 0x0400, 0x241C, 0x3FAB, 0x4303, 0x143B, +0x008A, 0x2414, 0x438A, 0x0000, 0x438A, 0x0002, 0x1840, 0x40F2, 0x0089, +0x2458, 0x13B1, 0xAD26, 0x008B, 0x2461, 0x43DB, 0x0000, 0x0088, 0x2406, +0x1840, 0x93C2, 0x245C, 0x2426, 0x4398, 0x0000, 0x4388, 0x0002, 0x4A2E, +0x4A1F, 0x0002, 0x403D, 0x001A, 0x407C, 0x0006, 0x13B1, 0xA608, 0x407D, +0x0003, 0x436C, 0x13B1, 0x99BC, 0x50BA, 0x001A, 0x0000, 0x638A, 0x0002, +0x5398, 0x0000, 0x6388, 0x0002, 0x2004, 0x90B8, 0x0009, 0x0000, 0x2BE4, +0x53DB, 0x0000, 0x1840, 0x9BE2, 0x245C, 0x2FDA, 0x1840, 0x40F2, 0x008C, +0x2458, 0x13B1, 0xAD26, 0x407D, 0x0003, 0x436C, 0x13B1, 0x99BC, 0x13B1, +0xA704, 0x1840, 0x93C2, 0x245E, 0x2404, 0x1840, 0x40F2, 0x000A, 0x245E, +0x1638, 0x0110, 0x141B, 0x1840, 0x40F2, 0x0087, 0x2458, 0x13B1, 0xAD26, +0x008A, 0x2436, 0x43EA, 0x0000, 0x0ACF, 0x432E, 0x430C, 0x430D, 0x13B1, +0xA636, 0x407D, 0x0003, 0x436C, 0x13B1, 0x99BC, 0x1840, 0x4382, 0x2414, +0x1840, 0x4382, 0x2416, 0x008B, 0x2430, 0x433F, 0x1840, 0x521F, 0x2410, +0x4F8B, 0x0000, 0x3C16, 0x1840, 0x40F2, 0x0087, 0x2458, 0x13B1, 0xAD26, +0x40FA, 0x0003, 0x0000, 0x0ACF, 0x432E, 0x430C, 0x430D, 0x13B1, 0xA636, +0x407D, 0x0003, 0x436C, 0x13B1, 0x99BC, 0x53BB, 0x0000, 0x938B, 0x0000, +0x3808, 0x13B1, 0xA688, 0x13B1, 0x9852, 0x1840, 0x93C2, 0x245E, 0x27DF, +0x161A, 0x0110, 0x140A, 0x1840, 0x40F2, 0x0084, 0x2458, 0x13B1, 0xAD26, +0x434D, 0x436C, 0x13B1, 0x99BC, 0x008A, 0x2406, 0x438A, 0x0000, 0x438A, +0x0002, 0x403C, 0x03E8, 0x430D, 0x13B1, 0xAC8E, 0x008E, 0x2436, 0x434D, +0x403C, 0x0005, 0x13B1, 0xA668, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x1840, +0x425E, 0x2436, 0xB07E, 0x0003, 0x240D, 0x539A, 0x0000, 0x638A, 0x0002, +0x90BA, 0x0003, 0x0002, 0x2BE2, 0x2004, 0x90BA, 0xFFFD, 0x0000, 0x2BDD, +0x90BA, 0x0003, 0x0002, 0x2808, 0x2004, 0x90BA, 0xFFFD, 0x0000, 0x2803, +0x1840, 0x42F2, 0x245E, 0x160A, 0x0110, 0x140A, 0x008A, 0x245E, 0x93CA, +0x0000, 0x2002, 0x13B1, 0xAAB4, 0x93CA, 0x0000, 0x2024, 0x403F, 0x0401, +0x1840, 0xF21F, 0x2418, 0x931F, 0x2020, 0x13B1, 0x9914, 0x93CA, 0x0000, +0x2018, 0x1840, 0x43C2, 0x2460, 0x13B1, 0xA470, 0x93CA, 0x0000, 0x2010, +0x13B1, 0xA3C8, 0x93CA, 0x0000, 0x200B, 0x1840, 0x43F2, 0x2458, 0x008C, +0x2436, 0x13B1, 0xAD02, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x93CA, 0x0000, +0x200E, 0x403F, 0x0802, 0x1840, 0xF21F, 0x2418, 0x932F, 0x2007, 0x13B1, +0xA038, 0x93CA, 0x0000, 0x2002, 0x13B1, 0x9D84, 0x160A, 0x0110, 0x143B, +0x4C48, 0x4D09, 0x4E0A, 0x4F0B, 0x434D, 0x407C, 0x0003, 0x13B1, 0x99BC, +0x4A0E, 0x4B0F, 0x490D, 0x484C, 0x13B1, 0xA1B2, 0x434D, 0x407C, 0x0007, +0x13B1, 0x99BC, 0x1638, 0x0110, 0x143B, 0x4C0A, 0x4D0B, 0x4E08, 0x0FC9, +0x434D, 0x407C, 0x0003, 0x13B1, 0x99BC, 0x1253, 0x09CF, 0x480E, 0x4A0C, +0x4B0D, 0x13B1, 0xA0F6, 0x434D, 0x407C, 0x0007, 0x13B1, 0x99BC, 0x5321, +0x1638, 0x0110, 0x143B, 0x4C0A, 0x0DCB, 0x0EC8, 0x434D, 0x407C, 0x0003, +0x13B1, 0x99BC, 0x08CE, 0x0BCD, 0x4A0C, 0x13B1, 0x9E88, 0x3FD1, 0x4303, +0x141B, 0x1840, 0x40F2, 0x0089, 0x2458, 0x13B1, 0xAD26, 0x008A, 0x2461, +0x43DA, 0x0000, 0x008B, 0x2406, 0x1840, 0x93C2, 0x245C, 0x242B, 0x439B, +0x0000, 0x438B, 0x0002, 0x1840, 0x421E, 0x2414, 0x1840, 0x421F, 0x2416, +0x403D, 0x001A, 0x407C, 0x0005, 0x13B1, 0xA608, 0x407D, 0x0003, 0x436C, +0x13B1, 0x99BC, 0x1840, 0x50B2, 0x001A, 0x2414, 0x1840, 0x6382, 0x2416, +0x539B, 0x0000, 0x638B, 0x0002, 0x2004, 0x90BB, 0x0009, 0x0000, 0x2BDF, +0x53DA, 0x0000, 0x1840, 0x9AE2, 0x245C, 0x2FD5, 0x161A, 0x0110, 0x140A, +0x1840, 0x40F2, 0x0084, 0x2458, 0x13B1, 0xAD26, 0x434D, 0x436C, 0x13B1, +0x99BC, 0x008A, 0x2406, 0x438A, 0x0000, 0x438A, 0x0002, 0x403C, 0x0064, +0x430D, 0x13B1, 0xAC8E, 0x008E, 0x2436, 0x434D, 0x403C, 0x0005, 0x13B1, +0xA668, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x1840, 0x425E, 0x2436, 0xB07E, +0x000B, 0x2409, 0x539A, 0x0000, 0x638A, 0x0002, 0x2004, 0x90BA, 0x3FFD, +0x0000, 0x2BE1, 0x938A, 0x0002, 0x2004, 0x90BA, 0x3FFD, 0x0000, 0x2804, +0x1840, 0x40F2, 0x0007, 0x245E, 0x160A, 0x0110, 0x140A, 0x40F2, 0x0017, +0x0284, 0x1840, 0x43D2, 0x2404, 0x1840, 0x43C2, 0x2469, 0x1880, 0x40F2, +0xADD4, 0x241E, 0x008A, 0x2457, 0x40FA, 0x0006, 0x0000, 0x13B1, 0xA99A, +0x934C, 0x2415, 0x40FA, 0x0003, 0x0000, 0x13B1, 0xA99A, 0x934C, 0x2019, +0x40FA, 0x0005, 0x0000, 0x13B1, 0xA99A, 0x934C, 0x2012, 0x40FA, 0x0006, +0x0000, 0x13B1, 0xA99A, 0x934C, 0x200B, 0xD0F2, 0x0010, 0x0282, 0x3C00, +0x403F, 0x001F, 0x533F, 0x2FFE, 0xC0F2, 0x0010, 0x0282, 0x160A, 0x0110, +0x140A, 0x008A, 0x246A, 0xF0FA, 0x00F8, 0x0000, 0x934C, 0x2002, 0x434F, +0x3C01, 0x426F, 0x934D, 0x2002, 0x434E, 0x3C01, 0x436E, 0xDE4F, 0xDFCA, +0x0000, 0x4AE2, 0x0282, 0x407C, 0x0080, 0xB2F2, 0x0280, 0x2C01, 0x434C, +0xD3DA, 0x0000, 0x4AE2, 0x0282, 0x160A, 0x0110, 0x140A, 0x008A, 0x246A, +0xF0FA, 0x00F8, 0x0000, 0x934C, 0x2002, 0x434F, 0x3C01, 0x426F, 0x934D, +0x2002, 0x434E, 0x3C01, 0x436E, 0xDE4F, 0xDFCA, 0x0000, 0x4AE2, 0x0282, +0x3FE4, 0x4303, 0x140A, 0x008A, 0x2458, 0x40FA, 0x0081, 0x0000, 0x13B1, +0xAD26, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x403C, 0x0120, 0x430D, 0x13B1, +0xAC8E, 0x43FA, 0x0000, 0x008C, 0x2436, 0x13B1, 0xAD02, 0x1840, 0xB2E2, +0x2436, 0x2C0D, 0x40FA, 0x0007, 0x0000, 0x13B1, 0xAD26, 0x435D, 0x436C, +0x13B1, 0x99BC, 0x43FA, 0x0000, 0x13B1, 0xAD26, 0x434D, 0x436C, 0x13B1, +0x99BC, 0x403C, 0x0120, 0x430D, 0x13B1, 0xAC8E, 0x434D, 0x435C, 0x13B1, +0x99BC, 0x160A, 0x0110, 0x143B, 0x4C49, 0x4E0A, 0x4F0B, 0x4348, 0x13B1, +0x9462, 0x1840, 0x421F, 0x242A, 0x1840, 0xD21F, 0x242C, 0x930F, 0x2005, +0x9349, 0x2403, 0x430E, 0x430F, 0x3C19, 0x035B, 0x100A, 0x110B, 0x100A, +0x110B, 0x100A, 0x1840, 0x521A, 0x242A, 0x1840, 0x621B, 0x242C, 0x1840, +0x421E, 0x2400, 0x1840, 0x421F, 0x2402, 0x8A0E, 0x7B0F, 0x0028, 0x241E, +0x151B, 0x160B, 0x0BE8, 0x1840, 0x4E82, 0x2422, 0x1840, 0x4F82, 0x2424, +0x08CC, 0x1638, 0x0110, 0x140A, 0x1840, 0x40F2, 0x00C0, 0x2458, 0x13B1, +0xAD26, 0x435D, 0x436C, 0x13B1, 0x99BC, 0x1840, 0x40F2, 0x00A8, 0x2458, +0x13B1, 0xAD26, 0x407D, 0x0003, 0x436C, 0x13B1, 0x99BC, 0x403C, 0x014A, +0x430D, 0x13B1, 0xAC8E, 0x008A, 0x2447, 0x0ACE, 0x434D, 0x403C, 0x0080, +0x13B1, 0xA668, 0x4A5E, 0x000C, 0x1945, 0x104E, 0x4A5F, 0x000D, 0x065F, +0xDF0E, 0x1840, 0x4E82, 0x242E, 0x160A, 0x0110, 0x140A, 0x13B1, 0xAD80, +0x008A, 0x245E, 0x1840, 0x93D2, 0x2404, 0x2404, 0x40FA, 0x00AA, 0x0000, +0x3C20, 0x93CA, 0x0000, 0x201D, 0x1840, 0x425E, 0x2457, 0x907E, 0x0013, +0x2411, 0x907E, 0x0016, 0x240E, 0x936E, 0x240C, 0x13B1, 0x9B1C, 0x93CA, +0x0000, 0x2007, 0x13B1, 0xACDC, 0x93CA, 0x0000, 0x2002, 0x13B1, 0xAA58, +0x434D, 0x435C, 0x13B1, 0x99BC, 0x13B1, 0x950E, 0x4A6C, 0x160A, 0x0110, +0x907E, 0x0010, 0x2808, 0x4C0D, 0x430C, 0x807E, 0x0011, 0x3002, 0x18CE, +0x5D0D, 0x0110, 0xE37E, 0x507E, 0x0010, 0x065E, 0x0EE0, 0x5C0C, 0x6D0D, +0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, +0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, +0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, +0x6D0D, 0x0110, 0x141B, 0x008A, 0x240A, 0x439A, 0x0000, 0x1840, 0x4382, +0x2418, 0x008B, 0x2406, 0x438B, 0x0000, 0x438B, 0x0002, 0x435D, 0x403E, +0x0027, 0x430F, 0x5B2E, 0x6B1F, 0x0002, 0x434C, 0x13B1, 0x96C6, 0x1840, +0x4CC2, 0x2436, 0x1840, 0x934C, 0x2403, 0x1840, 0xDAA2, 0x2418, 0x5AAA, +0x0000, 0x539B, 0x0000, 0x638B, 0x0002, 0x2004, 0x90BB, 0x0010, 0x0000, +0x2BE2, 0x161A, 0x0110, 0x141B, 0x13B1, 0xAC5C, 0x008A, 0x2437, 0x43CA, +0x0000, 0x40FA, 0x0040, 0x0001, 0x43CA, 0x0002, 0x1840, 0xB392, 0x2418, +0x2802, 0x43DA, 0x0000, 0x1840, 0xB3A2, 0x2418, 0x2814, 0x008B, 0x2436, +0x435D, 0x430E, 0x430F, 0x407C, 0x0007, 0x13B1, 0x96C6, 0x4CCB, 0x0000, +0xB35C, 0x2803, 0xD0FA, 0x0080, 0x0001, 0x4C4E, 0x035E, 0xDECA, 0x0002, +0x13B1, 0xAB68, 0x161A, 0x0110, 0x140A, 0x008A, 0x2418, 0xB39A, 0x0000, +0x2819, 0xB0BA, 0x0400, 0x0000, 0x2C06, 0x1840, 0x40F2, 0x0003, 0x2460, +0x13B1, 0xA470, 0x1840, 0x93C2, 0x245E, 0x200B, 0x1840, 0x43F2, 0x2458, +0x008C, 0x2436, 0x13B1, 0xAD02, 0x434D, 0x436C, 0x13B1, 0x99BC, 0x1840, +0x93C2, 0x245E, 0x2007, 0x403F, 0x0802, 0xFA2F, 0x932F, 0x2002, 0x13B1, +0x9D84, 0x160A, 0x0110, 0x13B1, 0xA93A, 0x1840, 0x40F2, 0x0085, 0x2458, +0x13B1, 0xAD26, 0x008F, 0x2437, 0x403E, 0x0017, 0x430C, 0x430D, 0x13B1, +0xA636, 0x407D, 0x0003, 0x436C, 0x13B1, 0x99BC, 0x13B1, 0xA500, 0x1840, +0x93C2, 0x245E, 0x2404, 0x1840, 0x42F2, 0x245E, 0x0110, 0x1840, 0x93D2, +0x2404, 0x2002, 0x13B1, 0x90FE, 0x0110, 0x141B, 0x13B1, 0xAC5C, 0x008A, +0x2437, 0x43CA, 0x0000, 0x40FA, 0x0040, 0x0001, 0x43CA, 0x0002, 0x008B, +0x2436, 0x435D, 0x430E, 0x430F, 0x407C, 0x0007, 0x13B1, 0x96C6, 0x4CCB, +0x0000, 0xB35C, 0x2803, 0xD0FA, 0x0080, 0x0001, 0x4C4E, 0x035E, 0xDECA, +0x0002, 0x13B1, 0xAB68, 0x161A, 0x0110, 0x434F, 0x1840, 0x425E, 0x2436, +0x1840, 0x421D, 0x240A, 0x4E4C, 0xED0C, 0xF31C, 0x035D, 0xB31C, 0x2802, +0xE03D, 0x8408, 0x035E, 0x535F, 0x927F, 0x2BF4, 0x1840, 0x4D82, 0x240A, +0x1840, 0x4EC2, 0x2436, 0x1840, 0x4C82, 0x2410, 0x1840, 0x4FC2, 0x2465, +0x0110, 0x434E, 0x008F, 0x2447, 0x43CF, 0x0000, 0x43CF, 0x0001, 0x536E, +0x03EF, 0x907E, 0x0010, 0x2BF7, 0x1840, 0x4EC2, 0x2436, 0x0110, 0x434E, +0x008F, 0x2437, 0x3FEF, 0x4303, 0x13B1, 0xABB4, 0x1840, 0x93C2, 0x245E, +0x200D, 0x1840, 0xB0B2, 0x0800, 0x2418, 0x2C08, 0x13B1, 0xA038, 0x1840, +0x93C2, 0x245E, 0x2002, 0x13B1, 0x9D84, 0x0110, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x533C, 0x633D, 0x4C0F, 0xDD0F, 0x930F, 0x23ED, 0x0110, 0x008D, +0x246A, 0xF0FD, 0x00FA, 0x0000, 0x934C, 0x2002, 0x434E, 0x3C01, 0x426E, +0xDECD, 0x0000, 0x4DE2, 0x0282, 0xD3DD, 0x0000, 0x4DE2, 0x0282, 0x0110, +0x435D, 0x403E, 0x0018, 0x430F, 0x434C, 0x13B1, 0x96C6, 0x1840, 0x4CC2, +0x2436, 0x1840, 0x907C, 0x0038, 0x2004, 0x1840, 0x40F2, 0x00A0, 0x245E, +0x0110, 0x140A, 0x0CCA, 0x434D, 0x426C, 0x13B1, 0x99BC, 0x0ACE, 0x008D, +0x2458, 0x423C, 0x13B1, 0x9E88, 0x434D, 0x427C, 0x13B1, 0x99BC, 0x160A, +0x0110, 0x434D, 0x426C, 0x13B1, 0x99BC, 0x1253, 0x008F, 0x2458, 0x423E, +0x430C, 0x430D, 0x13B1, 0xA0F6, 0x434D, 0x427C, 0x13B1, 0x99BC, 0x5321, +0x0110, 0x141B, 0x0CCA, 0x3C06, 0x4DFA, 0x0000, 0x00AA, 0x0001, 0x533E, +0x633F, 0x4E0B, 0xDF0B, 0x930B, 0x23F6, 0x161A, 0x0110, 0x151F, 0x160F, +0x0CCE, 0x0FEE, 0x3C04, 0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, 0x23FA, +0x0110, 0x1840, 0x4382, 0x241A, 0x1840, 0x4382, 0x241C, 0x1840, 0x43C2, +0x245E, 0x0110, 0x1840, 0xD382, 0x241A, 0x1840, 0xD0B2, 0x0C00, 0x241C, +0x0180, 0xABB4, 0x1840, 0xB0B2, 0x0800, 0x2418, 0x2C02, 0x13B1, 0x9D84, +0x0110, 0x1840, 0x40F2, 0x0011, 0x246A, 0x40F2, 0x0011, 0x0282, 0x0110, +0x110C, 0x110C, 0x110C, 0x110C, 0x0110, 0x0180, 0xAD4A, 0x6544, 0x6973, +0x6E67, 0x7265, 0x3120, 0x2E31, 0x2E35, 0x2E33, 0x3031, 0x2020, 0x2020, +0x2020, 0x9D45, 0x01FA, 0x0000, 0xCF00, 0xA521, 0x0103, 0x0100, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0xFF00, +0xFBFF, 0x0406, 0x04DC, 0x0234, 0x0000, 0x0106, 0x007B, 0x0000, 0x0009, +0x0000, 0x8402, 0x0000, 0x4700, 0x0000, 0x0300, 0x00CB, 0x0000, 0x0004, +0x0000, 0xCF04, 0x0000, 0x0400, 0x0000, 0x0500, 0x00D3, 0x0000, 0xF960, +0x0001, 0x3306, 0x01FA, 0x6800, 0x0000, 0x8700, 0xA5FD, 0x9C3F, 0x661F, +0x0102, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, +0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, +0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, +0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, 0x9249, 0x4924, 0x2492, +0x0009, 0x0000, 0x9900, 0x00FF, 0x0000, 0x2080, 0x0000, 0x4001, 0x0400, +0x0000, 0x0008, 0x0002, 0x0040, 0x0040, 0x0010, 0x0208, 0x0000, 0x0000, +0x2080, 0x0000, 0x4001, 0x0400, 0x0000, 0x0008, 0x0002, 0x0040, 0x0040, +0x0010, 0x0208, 0x0000, 0x0000, 0x2080, 0x0000, 0x4001, 0x0400, 0x0000, +0x0008, 0x0002, 0x0040, 0x0040, 0x0010, 0x0208, 0x0000, 0x0000, 0x2080, +0x0000, 0x4001, 0x0400, 0x0000, 0x0008, 0x0002, 0x0040, 0x0040, 0x0010, +0x0208, 0x0000, 0x6D00, 0xB693, 0x0006, 0xCC00, 0xFFFF, 0x249F, 0x5249, +0xA493, 0x0649, 0x0000, 0xFFF8, 0x7FFF, 0x9249, 0x6DE4, 0xB6DB, 0x0000, +0xF000, 0xFFFF, 0x248F, 0x1249, 0xA6DA, 0x0069, 0x0000, 0xFFF0, 0x0FFF, +0x9249, 0x6D24, 0xA6DA, 0x0000, 0xF000, 0xFFFF, 0x248F, 0x1249, 0xA6DA, +0x006D, 0x0000, 0xFFF0, 0x0FFF, 0x9249, 0x6924, 0x2493, 0x0002, 0xFE00, +0xFFFF, 0x249F, 0x7249, 0x24DB, 0x0269, 0x0000, 0xFFF9, 0x1BFF, 0x9249, +0x0064, 0x0000, 0x2491, 0x6249, 0x2492, 0x0009, 0x0000, 0x0000, 0x2000, +0x9249, 0x2480, 0x0249, 0x0000, 0x0000, 0x0000, 0x2491, 0x4249, 0x2492, +0x0009, 0x0000, 0x0000, 0x2400, 0x9249, 0x2490, 0x0249, 0x0000, 0x0000, +0x0000, 0x2491, 0x4249, 0x2492, 0x0009, 0x0000, 0x0000, 0x2400, 0x9249, +0x2490, 0x0249, 0x0000, 0x0000, 0x8000, 0x2491, 0x4049, 0x2492, 0x0001, +0x0000, 0x0000, 0x2400, 0x9249, 0x2490, 0x0249, 0x0000, 0x2400, 0x9249, +0x0001, 0x2000, 0x0000, 0x0000, 0x0000, 0x9248, 0x0024, 0x0000, 0x0000, +0x0000, 0x0000, 0x2400, 0x9249, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x9249, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x9249, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x9249, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x9249, +0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x4D00, 0xB6D2, 0x2496, 0x0E4B, +0x9249, 0x0094, 0x4000, 0xB493, 0x2E6D, 0xB649, 0x9259, 0x7924, 0x0000, +0x6DC0, 0xB6DB, 0x2DB0, 0x22CB, 0x9249, 0x0004, 0x0000, 0xB6DB, 0x6C6D, +0xB6DB, 0x9241, 0x0924, 0x0000, 0x6D00, 0xB6DB, 0x2DB0, 0x22DB, 0x9249, +0x0004, 0x0000, 0xB6DB, 0x6C6D, 0x96D9, 0x9241, 0x0924, 0x0000, 0x6D00, +0x2493, 0x25B6, 0x2EC9, 0x9249, 0x001C, 0x6000, 0x26DB, 0x6669, 0x924B, +0x9249, 0x1924, 0x0000, 0x6960, 0x249B, 0x6DB7, 0x4ED9, 0xB6DB, 0x6D9D, +0x769B, 0x26DB, 0x6649, 0x92DB, 0xB6D8, 0x7B6D, 0x36DA, 0x49C9, 0x2492, +0x6495, 0x6259, 0xB6DB, 0x498D, 0x269A, 0x2492, 0x2449, 0x9249, 0xB6D0, +0x4B6D, 0x2492, 0x4909, 0x2492, 0x6495, 0x6249, 0xB6DB, 0x498D, 0x249A, +0x2492, 0x2449, 0xB24B, 0xB6D0, 0x4B6D, 0x24D2, 0x490D, 0x36DA, 0x6C93, +0x6E5B, 0xB6DB, 0x491D, 0x66DB, 0xB492, 0x2E4D, 0xB6D9, 0xB6D9, 0x5B6D, +0xB693, 0x006D, 0x0000, 0x4920, 0x2092, 0x0480, 0x0000, 0x0040, 0x0000, +0x4800, 0x2492, 0x2481, 0x0241, 0x8001, 0x0024, 0x0000, 0x4924, 0x0092, +0x0000, 0x2400, 0x1041, 0x0000, 0x4800, 0x2492, 0x0011, 0x0041, 0x9249, +0x0024, 0x0000, 0x4924, 0x0092, 0x0010, 0x2401, 0x1241, 0x0000, 0x4800, +0x2492, 0x0011, 0x0001, 0x9209, 0x0020, 0x8000, 0x4924, 0x4092, 0x2480, +0x2481, 0x1000, 0x0000, 0x4800, 0x2492, 0x2000, 0x0049, 0x0048, 0x0000, +0x0008, 0x2480, 0x0001, 0x0000, 0x2480, 0x1249, 0x0000, 0x2400, 0x9049, +0x0008, 0x0000, 0x9249, 0x0064, 0x0000, 0x0000, 0x0000, 0x0000, 0x2480, +0x1249, 0x0000, 0x0400, 0x1040, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, +0x0400, 0x0040, 0x0000, 0x2480, 0x1249, 0x0000, 0x0400, 0x0040, 0x0000, +0x0000, 0x9249, 0x0024, 0x0040, 0x2010, 0x0249, 0x0000, 0x2480, 0x1249, +0x1000, 0x0000, 0x1248, 0x0008, 0x0000, 0x9249, 0x0064, 0x0000, 0x4915, +0x4EDA, 0x2492, 0x0009, 0x0000, 0x0000, 0x0800, 0x2680, 0x2481, 0x4249, +0x0024, 0x0080, 0x0000, 0x6DB5, 0x42DB, 0x2492, 0x0009, 0x0000, 0x0000, +0x6800, 0xA69B, 0x2491, 0x0249, 0x0000, 0x0000, 0x0000, 0x69B5, 0x429B, +0x2492, 0x0009, 0x0000, 0x0000, 0x6800, 0xB69B, 0x2491, 0x0249, 0x0000, +0x0000, 0x0000, 0x4DA5, 0x4C92, 0x2492, 0x0001, 0x2124, 0x0000, 0x6C00, +0xA493, 0x2491, 0x0249, 0x4900, 0xDA02, 0x6DB6, 0xB278, 0x976D, 0x4924, +0xFF62, 0xFFFF, 0x6DB6, 0xF1DB, 0xDB7F, 0x4926, 0x8492, 0xFFDB, 0xDB3F, +0x6DB6, 0xB6D8, 0x936D, 0x4924, 0xFFC2, 0x3FFF, 0x6DB6, 0xB4DB, 0xDB6D, +0x4922, 0xC492, 0xFFFF, 0xDB3F, 0x6DB6, 0xB6D8, 0x936D, 0x4924, 0xFFC2, +0x3FFF, 0x6DB6, 0xB4DB, 0xDB6D, 0x4922, 0xC492, 0xFFFF, 0xDB3F, 0x6DB6, +0xB6D8, 0x956D, 0x4924, 0xFFE2, 0xDEDB, 0x6DB6, 0xB59B, 0xDB6D, 0x4926, +0xC492, 0xB6FF, 0xDA1D, 0x6DB6, 0xD6CD, 0xD9B6, 0x6DB6, 0x49FB, 0xEDB6, +0x6DF6, 0xDDDB, 0x6DA6, 0x6DAF, 0xC6DB, 0x6C92, 0xDBDB, 0x6DB6, 0xDB6D, +0xD1B6, 0x6DB6, 0xDB4B, 0x2DB6, 0x6DB6, 0xD8DB, 0x6DB6, 0x6DB3, 0xC6DB, +0x6DB6, 0xDB1B, 0x6DB6, 0xDB6D, 0xD1B6, 0x6DB6, 0xDB4B, 0x2DB6, 0x6DB6, +0xD8DB, 0x6DB6, 0x6DB3, 0xC6DB, 0x6DB6, 0xDB1B, 0x6DB6, 0x9B6D, 0xDBA4, +0x6DB6, 0xDB73, 0xEC92, 0x6DB6, 0xD99F, 0x4926, 0x6DBF, 0xC6DB, 0x24B6, +0x0079, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0240, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0400, 0x0002, 0x1200, 0x0000, 0x0240, +0x0000, 0x0000, 0x0018, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0080, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0080, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0030, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0920, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4020, 0x0090, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x9000, 0x4004, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0080, 0x1000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2410, 0x0001, +0x0000, 0x0000, 0x0400, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x2C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0003, 0x0400, 0x0001, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2500, 0x924B, 0x4124, 0x2892, 0x9248, 0x4904, 0x6492, 0x0049, 0x4A24, +0x2490, 0x9041, 0x7924, 0x2492, 0x2489, 0x9249, 0x4920, 0x6092, 0x9659, +0x4904, 0x2492, 0x9249, 0x482C, 0x2492, 0x9241, 0x4924, 0x2492, 0x2409, +0x9249, 0x4924, 0x2092, 0xB249, 0x490C, 0x2492, 0x924B, 0x4824, 0x2492, +0xB241, 0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, +0x6492, 0x8249, 0x4A20, 0x2492, 0x9241, 0x5964, 0x2492, 0x2509, 0x924B, +0x4120, 0x2892, 0x9249, 0x4904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, +0x7924, 0x2482, 0x2409, 0x9249, 0x4924, 0x6092, 0x9659, 0x0804, 0x2482, +0x9249, 0x482C, 0x0492, 0x9241, 0x4924, 0x2492, 0x2409, 0x9249, 0x4924, +0x2092, 0xB249, 0x490C, 0x0412, 0x924B, 0x4024, 0x2492, 0xB241, 0x4924, +0x2412, 0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x9249, +0x4A24, 0x2492, 0x9241, 0x5964, 0x2492, 0x0008, 0x0000, 0x0801, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x4820, 0x0082, 0x0000, 0x0800, 0x0080, 0x0000, 0x0000, 0x2092, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x4824, 0x0082, 0x0000, 0x0800, 0x0080, +0x0000, 0x0800, 0x0090, 0x0001, 0x0000, 0x0000, 0x0000, 0x1000, 0x0024, +0x0400, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x5820, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0200, 0x0080, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x1201, 0x0000, 0x0000, +0x1000, 0x0020, 0x0000, 0x0400, 0x8000, 0x0001, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0008, 0x0000, 0x0000, 0x0208, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x2000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0400, 0x9000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0001, 0x0000, 0x0040, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2400, 0x8208, 0x0904, 0x2812, 0x0249, 0x4904, 0x2090, +0x0249, 0x4800, 0x2402, 0x0240, 0x5924, 0x2482, 0x2489, 0x9241, 0x0100, +0x2010, 0x9209, 0x0104, 0x0412, 0x9249, 0x4824, 0x0400, 0x1240, 0x4924, +0x2492, 0x2409, 0x8249, 0x0100, 0x2010, 0x9249, 0x4104, 0x2412, 0x8248, +0x4024, 0x2400, 0x9240, 0x4924, 0x2492, 0x2408, 0x8249, 0x0100, 0x2890, +0x9249, 0x4104, 0x6412, 0x9249, 0x4224, 0x0080, 0x9241, 0x5924, 0x2492, +0x2409, 0x9200, 0x4924, 0x2892, 0x9249, 0x4900, 0x6492, 0x8048, 0x4804, +0x2492, 0x8241, 0x5904, 0x2400, 0x2081, 0x0249, 0x4924, 0x2092, 0x9249, +0x0804, 0x2492, 0x8249, 0x4820, 0x2492, 0x9241, 0x4924, 0x2492, 0x2409, +0x9241, 0x4924, 0x2092, 0x9241, 0x4904, 0x2412, 0x8041, 0x4824, 0x2492, +0x9241, 0x4904, 0x2490, 0x0409, 0x9209, 0x4924, 0x2892, 0x9249, 0x4904, +0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x0009, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2491, 0x0249, +0x0000, 0x2490, 0x5249, 0x0000, 0x2400, 0x9249, 0x000C, 0x1000, 0x9249, +0x0064, 0x0000, 0x2491, 0x0249, 0x0000, 0x2480, 0x1249, 0x0000, 0x2400, +0x9249, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, 0x2491, 0x0249, 0x0000, +0x2480, 0x1249, 0x0000, 0x2400, 0x9249, 0x0000, 0x0000, 0x9249, 0x0024, +0x0000, 0x2491, 0x0249, 0x0000, 0x2490, 0x5249, 0x0000, 0x2400, 0x9249, +0x000C, 0x1000, 0x9249, 0x0064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0100, 0x0010, +0x0000, 0x4000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0001, 0x0000, 0x0100, 0x2012, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, 0x0100, 0x2012, 0x0000, +0x4800, 0x0400, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0010, 0x1001, +0x0002, 0x4900, 0x2492, 0x0003, 0x4800, 0x2492, 0x0039, 0x8000, 0x2492, +0x0049, 0x0000, 0x2490, 0x2249, 0x0000, 0x4800, 0x2482, 0x0021, 0x0000, +0x2092, 0x0089, 0x0008, 0x2492, 0x0449, 0x0040, 0x2480, 0x0248, 0x0000, +0x4800, 0x0480, 0x0481, 0x004A, 0x2092, 0x2489, 0x0248, 0x2492, 0x2449, +0x9249, 0x2480, 0x0248, 0x0040, 0x4804, 0x0480, 0x04A3, 0x0048, 0x2092, +0x24B9, 0x0248, 0x2492, 0x2449, 0x9249, 0x2488, 0x0248, 0x0042, 0x0004, +0x0000, 0x2493, 0x0A49, 0x0000, 0x24A0, 0x1249, 0x0000, 0x2500, 0x9249, +0x0008, 0x1000, 0x9249, 0x0024, 0x0000, 0x2491, 0x0249, 0x0000, 0x2400, +0x1241, 0x0000, 0x2000, 0x9209, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, +0x2011, 0x0201, 0x0000, 0x0000, 0x1001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x9209, 0x0020, 0x0000, 0x2013, 0x0201, 0x0000, 0x0020, 0x1001, +0x0000, 0x0300, 0x0000, 0x0000, 0x1000, 0x9209, 0x2420, 0x9249, 0x0000, +0x2000, 0x9249, 0x0014, 0x0000, 0x9249, 0x0224, 0x0000, 0x9240, 0x1924, +0x0000, 0x2400, 0x92C9, 0x0000, 0x2000, 0x9249, 0x0004, 0x0000, 0x9249, +0x0024, 0x0000, 0x9240, 0x0924, 0x0000, 0x2400, 0x9249, 0x0000, 0x2000, +0x9249, 0x0004, 0x0000, 0x9249, 0x0024, 0x0000, 0x9240, 0x0924, 0x0000, +0x2C00, 0x92C9, 0x0000, 0x2000, 0x9249, 0x0014, 0x0000, 0x9249, 0x0024, +0x0000, 0x9240, 0x192C, 0x0000, 0x2400, 0x9249, 0x0001, 0x2000, 0x9249, +0x0004, 0x4000, 0x9249, 0x0024, 0x0000, 0x9244, 0x1924, 0x0000, 0x2400, +0x9249, 0x0001, 0x2000, 0x9249, 0x0004, 0x0000, 0x9249, 0x0024, 0x0000, +0x9240, 0x0924, 0x0000, 0x2400, 0x9249, 0x0001, 0x2000, 0x9249, 0x0004, +0x0000, 0x9249, 0x0024, 0x0000, 0x9240, 0x092C, 0x0000, 0x2400, 0x9249, +0x0001, 0x2000, 0x9249, 0x0004, 0x4000, 0x9249, 0x0024, 0x0000, 0x9244, +0x1924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0080, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0008, 0x0200, 0x0000, 0x0208, 0x0400, 0x0001, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0401, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0401, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0408, +0x0200, 0x0000, 0x0208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0400, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0448, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0080, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0100, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0400, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x2000, 0x0400, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0002, 0x2000, 0x0000, 0x0000, 0x0000, 0x8200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4100, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0100, 0x0020, 0x0000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0400, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0041, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2400, 0x9648, 0x4925, 0x2C92, 0x9249, 0x4904, 0x6412, +0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2489, 0x9248, 0x4924, +0x2092, 0x924B, 0x4904, 0x2492, 0x924B, 0x4824, 0x2492, 0x9241, 0x4904, +0x2492, 0x2409, 0x9649, 0x4924, 0x2092, 0xB649, 0x4904, 0x2492, 0xB249, +0x4824, 0x2492, 0x9241, 0x4925, 0x2492, 0x2409, 0x9049, 0x4924, 0x6C92, +0x1049, 0x4904, 0x6492, 0x9649, 0x4A24, 0x2482, 0x9251, 0x5920, 0x2092, +0x2409, 0x9649, 0x4924, 0x2882, 0x9249, 0x4984, 0x6492, 0x9249, 0x4A24, +0x2492, 0x9241, 0x5924, 0x2492, 0x2489, 0x9249, 0x4925, 0x2092, 0x924B, +0x4104, 0x2492, 0x924B, 0x4024, 0x2492, 0x9241, 0x4924, 0x2492, 0x2409, +0x9649, 0x4925, 0x2082, 0xB649, 0x4904, 0x2402, 0xA241, 0x4824, 0x2412, +0x9241, 0x4925, 0x2092, 0x2409, 0x9249, 0x4925, 0x6892, 0x9249, 0x4804, +0x6492, 0x9449, 0x4A24, 0x2482, 0x9251, 0x1924, 0x2492, 0x0009, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0400, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0800, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, +0x0800, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x9249, 0x4924, 0x2892, 0x9249, +0x4904, 0x4492, 0x9249, 0x4A04, 0x2492, 0x9241, 0x5924, 0x2492, 0x2489, +0x9249, 0x0920, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, 0x4824, 0x2492, +0x9241, 0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2092, 0x9249, 0x4904, +0x0492, 0x0249, 0x4824, 0x2492, 0x9201, 0x4924, 0x2492, 0x2409, 0x9241, +0x0920, 0x2092, 0x9249, 0x4904, 0x6482, 0x8241, 0x4A24, 0x2492, 0x9241, +0x5924, 0x2090, 0x2409, 0x9249, 0x4924, 0x2892, 0x1049, 0x4900, 0x4492, +0x9249, 0x4A04, 0x2492, 0x1241, 0x5920, 0x2492, 0x2489, 0x9249, 0x4904, +0x2092, 0x8049, 0x4904, 0x2492, 0x8249, 0x4824, 0x2492, 0x9241, 0x0924, +0x2492, 0x2409, 0x9249, 0x4920, 0x2090, 0x9249, 0x4804, 0x2492, 0x9241, +0x4824, 0x2492, 0x1340, 0x0930, 0x2492, 0x2409, 0x9241, 0x4904, 0x0892, +0x9241, 0x4904, 0x6492, 0x8249, 0x0A24, 0x2492, 0x9341, 0x5934, 0x2490, +0x0009, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0100, 0x0040, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x4004, 0x1000, +0x0180, 0x0040, 0x0004, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x4004, 0x1000, 0x0000, 0x2040, 0x0404, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0200, 0x0004, 0x0000, 0x0004, 0x0000, 0x0200, +0x2491, 0x0249, 0x0000, 0x2490, 0x5249, 0x0000, 0x2400, 0x9249, 0x000C, +0x1000, 0x9249, 0x0064, 0x0000, 0x2491, 0x0249, 0x0000, 0x2480, 0x1249, +0x0000, 0x2400, 0x9249, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, 0x2491, +0x0249, 0x0000, 0x2480, 0x1249, 0x0000, 0x2400, 0x9249, 0x0000, 0x0000, +0xB249, 0x0024, 0x0000, 0x2491, 0x0249, 0x0000, 0x2490, 0x5249, 0x0000, +0x2400, 0x9249, 0x0004, 0x1000, 0x9249, 0x0064, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0800, 0x0088, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0xA21A, 0x0001, +0x0000, 0x8200, 0x0020, 0x0000, 0x0800, 0x0080, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x2012, 0x0001, 0x0000, 0x0000, 0x0100, 0x0000, 0x0800, +0x0080, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x2012, 0x0001, 0x0000, +0x0008, 0x1000, 0x0000, 0x4900, 0x2492, 0x0003, 0x4800, 0x2492, 0x0039, +0x8000, 0x2492, 0x0049, 0x0000, 0x2498, 0x2249, 0x0000, 0x4100, 0x2412, +0x0491, 0x4049, 0xA492, 0x2009, 0x1200, 0x0480, 0x2048, 0x9201, 0x2490, +0x0249, 0x8208, 0x4104, 0xA412, 0x0491, 0x4249, 0x2492, 0x200D, 0x1000, +0x0480, 0x2048, 0x8201, 0x2490, 0x0249, 0x0008, 0x4104, 0x2413, 0x2093, +0x4009, 0x249A, 0x0039, 0x8001, 0x04C0, 0x2048, 0x0208, 0x3498, 0x0249, +0x8240, 0x0000, 0x0000, 0x2493, 0x0249, 0x0000, 0x24A0, 0x1249, 0x0000, +0x2500, 0x9249, 0x0000, 0x1000, 0x9249, 0x0024, 0x0000, 0x2001, 0x0200, +0x0000, 0x0480, 0x0049, 0x0000, 0x0400, 0x0048, 0x0000, 0x0000, 0x1041, +0x0020, 0x0080, 0x2021, 0x0000, 0x0000, 0x0480, 0x0249, 0x0000, 0x0400, +0x1048, 0x0000, 0x0000, 0x9241, 0x0020, 0x0000, 0x0403, 0x0A40, 0x0000, +0x24A0, 0x9248, 0x0000, 0x0500, 0x9061, 0x0000, 0x1000, 0x1009, 0x2424, +0x9249, 0x0000, 0x2000, 0x9249, 0x0014, 0x0000, 0x9249, 0x0024, 0x0000, +0x9240, 0x1924, 0x0000, 0x0400, 0x9049, 0x0000, 0x2000, 0x8248, 0x0004, +0x0000, 0x1241, 0x0024, 0x0000, 0x9240, 0x0924, 0x0000, 0x0400, 0x9049, +0x0000, 0x2000, 0x8248, 0x0004, 0x0000, 0x1241, 0x0024, 0x0000, 0x9240, +0x0924, 0x0002, 0x0400, 0x9049, 0x0000, 0x2000, 0x8248, 0x0014, 0x0000, +0x1241, 0x0224, 0x0000, 0x9240, 0x1924, 0x0000, 0x2400, 0x9249, 0x0001, +0x2000, 0x9249, 0x0004, 0x4000, 0x9249, 0x0024, 0x0000, 0x9244, 0x1924, +0x0000, 0x0400, 0x8040, 0x0001, 0x2000, 0x1201, 0x0000, 0x0000, 0x1001, +0x0000, 0x0000, 0x0040, 0x0804, 0x0000, 0x0400, 0x0040, 0x0001, 0x2000, +0x1201, 0x0000, 0x0000, 0x1001, 0x0000, 0x0000, 0x0040, 0x0004, 0x0002, +0x0400, 0x9040, 0x0001, 0x2000, 0x9201, 0x0004, 0x4000, 0x1001, 0x0024, +0x0000, 0x0044, 0x1904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0080, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8200, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x4100, 0x0010, 0x0200, 0x0008, 0x0000, 0x0000, +0x0000, 0x8200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0400, 0x0010, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0081, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x1000, 0x0800, 0x0001, +0x0000, 0x0900, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8041, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0400, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0400, 0x0001, 0x0000, 0x0000, 0x1000, 0x0000, 0x0040, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2001, 0x0C00, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0090, 0x0001, 0x8000, 0x0800, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x8400, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0090, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0200, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x4000, 0x2000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x1000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0C00, 0x0000, 0x0000, 0x0000, 0x0200, 0x0004, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x4020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0080, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0400, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x4020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x0410, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0080, 0x0001, 0x0000, 0x0001, +0x0001, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0100, 0x0000, 0x8000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0820, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x4000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0101, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0208, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x2400, 0x9249, 0x4125, 0x2C82, 0x9249, +0x4904, 0x6492, 0x1249, 0x4A2C, 0x2492, 0x9241, 0x5924, 0x2492, 0x2489, +0x9249, 0x4924, 0x2092, 0x9248, 0x4904, 0x2492, 0x9049, 0x4824, 0x2492, +0x1241, 0x4804, 0x2492, 0x2409, 0x9249, 0x4924, 0x2092, 0x90C9, 0x4904, +0x2692, 0x124B, 0x4824, 0x2492, 0x9241, 0x4124, 0x2492, 0x4409, 0x9249, +0x4824, 0x2892, 0x924B, 0x0904, 0x6492, 0x9249, 0x8A24, 0x2492, 0x12C1, +0x5924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, +0x9249, 0x4A2C, 0x0482, 0x9241, 0x5924, 0x2492, 0x2489, 0x9249, 0x4925, +0x2092, 0x9248, 0x4904, 0x2492, 0x9249, 0x4824, 0x2492, 0x9241, 0x4924, +0x2492, 0x2409, 0x9249, 0x4925, 0x2092, 0x92C9, 0x4904, 0x2490, 0x924B, +0x4024, 0x2492, 0x9241, 0x4904, 0x2492, 0x6409, 0x9249, 0x0825, 0x2892, +0x924B, 0x4104, 0x6490, 0x9248, 0x4A24, 0x2492, 0x92C1, 0x5924, 0x2490, +0x0009, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0040, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x1000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0002, +0x8000, 0x0000, 0x0001, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0800, 0x0100, 0x0010, 0x4004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0800, 0x0000, 0x0000, 0x4004, 0x0000, 0x1000, 0x0100, 0x0404, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x4004, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0049, 0x0000, 0x0400, 0x0008, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x2400, 0x9249, 0x4924, +0x2890, 0x1249, 0x4904, 0x6492, 0x9249, 0x4A20, 0x2492, 0x9241, 0x5924, +0x2492, 0x2489, 0xD269, 0x4804, 0x2092, 0x9249, 0x4904, 0x2492, 0xDA49, +0x4036, 0x2492, 0x9241, 0x4924, 0x2482, 0x2409, 0x9209, 0x4924, 0x2092, +0x9249, 0x4904, 0x2492, 0x9249, 0x4804, 0x2492, 0x9241, 0x4924, 0x0492, +0x0109, 0x9200, 0x4924, 0x2892, 0x9241, 0x4904, 0x6492, 0x8249, 0x4A24, +0x2492, 0x1241, 0x5904, 0x2492, 0x2409, 0x9049, 0x0920, 0x2892, 0x9249, +0x4904, 0x6492, 0x9249, 0x0A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2409, +0x9249, 0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, 0x4820, 0x2492, +0x9241, 0x4924, 0x2492, 0x2409, 0x9049, 0x0100, 0x2083, 0x9249, 0x4104, +0x0011, 0x9249, 0x4004, 0x0010, 0x1240, 0x4924, 0x6486, 0x2500, 0x8249, +0x4820, 0x2892, 0x9249, 0x4104, 0x6492, 0x9249, 0x4224, 0x2490, 0x9141, +0x5924, 0x6496, 0x0009, 0x0000, 0x6000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x4000, 0x0001, 0x0000, 0x0000, 0x2081, 0x0020, +0x0022, 0xA080, 0x0000, 0x0000, 0x1000, 0x0001, 0x0000, 0x0004, 0x0400, +0x0000, 0x0800, 0x0000, 0x0020, 0x0000, 0x0002, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0xB6D9, 0x036D, 0x0000, 0xB6D0, 0x5B6D, 0x0100, 0xB400, +0xDB6D, 0x400E, 0x9000, 0xDB6D, 0x0176, 0x44B2, 0xF699, 0x134F, 0xE4A1, +0xB2C1, 0x1949, 0xD810, 0xB412, 0xD92D, 0x0182, 0x8249, 0xDB6F, 0x8037, +0x0100, 0xB6D9, 0x036D, 0x0404, 0xB6C1, 0x1B6D, 0x4000, 0xB410, 0xDB6D, +0x0082, 0x8088, 0xDB6D, 0x2336, 0x0000, 0xB659, 0x136D, 0x0000, 0xB6D0, +0x5B6D, 0x0810, 0xF400, 0xDB6D, 0x001E, 0x9000, 0xDB69, 0xB676, 0xDB6D, +0x9248, 0xB124, 0xDB6D, 0x9246, 0x2924, 0xDA6D, 0x90B6, 0x4920, 0x9B60, +0x95B6, 0x4824, 0x9612, 0x9BDC, 0x9208, 0xA104, 0x094C, 0x9642, 0x0B00, +0x016C, 0x90A0, 0x4B66, 0x5AE2, 0x8CD2, 0x4904, 0x3612, 0xCA6C, 0x0148, +0xB104, 0xCB60, 0x0246, 0x0104, 0x9B2D, 0x90A6, 0x6926, 0xDB62, 0x8C32, +0x0114, 0x9410, 0xDB64, 0x4888, 0x8924, 0xD924, 0x1246, 0x8930, 0xC17C, +0x90B6, 0x4816, 0xDB62, 0x1DB2, 0x4C92, 0xDB12, 0x6DB6, 0x4927, 0xD892, +0x6DB6, 0x4933, 0xA492, 0x68B6, 0x485B, 0x2492, 0x2DB1, 0x66DB, 0x2492, +0xCA89, 0x2005, 0x01A1, 0xC080, 0x0016, 0x490A, 0x3008, 0x2526, 0x0CC9, +0x349A, 0x6431, 0x449A, 0x9290, 0x0B04, 0x5412, 0x4925, 0xD092, 0x659A, +0x4D09, 0x2082, 0x0DF6, 0x48CB, 0x2492, 0x61B1, 0x4608, 0x0490, 0x690D, +0x6D90, 0x4923, 0xC092, 0x6C96, 0x493B, 0x2492, 0x2526, 0x0CDB, 0x2492, +0x0419, 0x06DA, 0x2592, 0x0009, 0x0000, 0x4927, 0x0892, 0x0000, 0x4920, +0x2492, 0x0000, 0x4900, 0x2496, 0x1009, 0x5000, 0x2492, 0x00A9, 0x0091, +0x49A5, 0x0092, 0x0000, 0x4D00, 0x36DA, 0x0000, 0x4C00, 0x36DA, 0x0081, +0x4040, 0xB6B2, 0x000D, 0x1040, 0x4D25, 0x0092, 0x0000, 0x6D00, 0x24F2, +0x0000, 0x4800, 0x2493, 0x0001, 0x4000, 0x34B2, 0x000D, 0x0000, 0x49A7, +0x0092, 0x0000, 0x49A0, 0x2492, 0x0010, 0x4D00, 0x2492, 0x0001, 0x5000, +0x2492, 0xFF09, 0xFFFF, 0x2490, 0xF249, 0xFFEF, 0x2497, 0x1249, 0xFBFF, +0x267F, 0x9249, 0xEFF0, 0x3FFF, 0x9249, 0xEE04, 0xF36C, 0x2410, 0xF249, +0x527E, 0x208E, 0x0001, 0x6F6F, 0x20FF, 0x8001, 0xF770, 0x0DB6, 0x0049, +0x3F20, 0xCF3D, 0x2090, 0xF269, 0xFBFB, 0x008E, 0x1209, 0xDF7F, 0x24F6, +0x9248, 0xD370, 0x0F36, 0xC249, 0x4E22, 0xFFC9, 0xA450, 0xF249, 0xFA5F, +0x241F, 0x1249, 0xBB6D, 0x20FF, 0x9249, 0x9260, 0x9FFE, 0x9349, 0x0024, +0x0000, 0x6DB5, 0x02DB, 0x0000, 0x6D88, 0x76DB, 0x0400, 0x6C00, 0xB6DB, +0x0005, 0x5800, 0xB6DB, 0x31AD, 0x0C02, 0x2D35, 0x02D9, 0xBF81, 0x6985, +0x24D3, 0x9291, 0x6804, 0xA493, 0x8001, 0x4325, 0x24D9, 0x4028, 0x2081, +0xFDF5, 0x02DB, 0x1001, 0x6980, 0x36DB, 0x2000, 0x6C00, 0xB6DB, 0x0401, +0x4145, 0xB6DB, 0x0029, 0x000B, 0x6D35, 0x22DB, 0x0249, 0x6D80, 0x76DB, +0x1281, 0x2800, 0xB6FB, 0x2185, 0x5005, 0xB6DB, 0x002D, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0201, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0009, 0x0000, 0x0010, 0x0000, 0x0400, 0x0000, 0x0201, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0300, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x8000, 0x0400, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0401, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0440, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0010, 0x0080, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x2010, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0048, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0100, 0x0048, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0080, 0x0000, 0x0008, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x2000, 0x0000, 0x0000, 0x0041, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x8008, 0x0400, 0x0009, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0040, 0x0800, 0x0041, +0x8008, 0x0200, 0x0040, 0x9000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0401, +0x2400, 0x0000, 0x0000, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2800, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0400, 0x0010, 0x8008, 0x0400, 0x0009, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0001, 0x0400, 0x0040, 0x0000, 0x0041, 0x8008, 0x0200, +0x0040, 0x9000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0024, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0800, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1020, 0x0001, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0401, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0001, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x1100, 0x0001, 0x0002, 0x0000, +0x0000, 0x0000, 0xA000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0001, 0x0408, 0x0040, 0x0000, 0x8010, 0xC008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x2000, 0x0200, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x1040, 0x0000, 0x0000, 0x0000, 0x0010, 0x1004, +0x0000, 0x0000, 0x0004, 0x0042, 0x0000, 0x0000, 0x1010, 0x0000, 0x0800, +0x8080, 0x0000, 0x8000, 0x0000, 0x0400, 0x0000, 0x4004, 0x0000, 0x0000, +0x2800, 0x0082, 0x0008, 0x4000, 0x0080, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0820, 0x8002, 0x0040, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x2000, 0x0000, 0x0000, +0x0000, 0x1000, 0x1000, 0x0000, 0x0400, 0x0002, 0x0200, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0400, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x1000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0408, 0x1000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0200, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0800, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0090, 0x0001, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0090, 0x0101, 0x0000, 0x0000, 0x0210, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x1000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0100, 0x0000, 0x0200, 0x0001, 0x1000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0008, 0x0000, 0x0010, 0x0022, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000, 0x0000, 0x0900, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0082, 0x0000, 0x0000, 0x0000, 0x2080, 0x0400, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0201, 0x0000, 0x0000, +0x1008, 0x0000, 0x0010, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0040, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0020, 0x0001, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0102, +0x0000, 0x0000, 0x2000, 0x0000, 0x0040, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x8000, 0x0200, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x1000, +0x2208, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4020, 0x0001, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0024, 0x0001, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x2400, 0x9600, 0x4925, +0x2C92, 0x8209, 0x490C, 0x4492, 0x8649, 0x4A24, 0x2492, 0x9241, 0x1924, +0x2492, 0x2489, 0x1249, 0x4925, 0x00B2, 0x9249, 0x4904, 0x24B6, 0x9241, +0x4804, 0x0492, 0x92C1, 0x4924, 0xA492, 0x2409, 0x1249, 0x4985, 0x2091, +0xB2C8, 0x4904, 0x2C92, 0x9008, 0x482C, 0x0492, 0x1241, 0x4924, 0x64D2, +0x2409, 0x9649, 0xC905, 0x6490, 0x8409, 0x0114, 0x2490, 0x8649, 0x4A24, +0x2490, 0x9241, 0x592C, 0x0436, 0x2409, 0x9609, 0x4924, 0x2882, 0x1249, +0x490C, 0x4492, 0x0649, 0x4A04, 0x2482, 0x9241, 0x5924, 0x2492, 0x2489, +0x1241, 0x4924, 0x0092, 0x9249, 0x4904, 0x2492, 0x8209, 0x4824, 0x2492, +0x12C1, 0x4920, 0x2490, 0x2409, 0x8240, 0x4924, 0x2092, 0xB0C9, 0x4904, +0x2410, 0x8048, 0x482C, 0x0492, 0x1201, 0x4824, 0x2492, 0x2409, 0x9648, +0x4124, 0x6882, 0x9449, 0x4814, 0x2482, 0x0641, 0x4A24, 0x2482, 0x1041, +0x492C, 0x0402, 0x0008, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0001, 0x0400, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x2002, 0x0100, 0x0800, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x2000, 0x0000, 0x2002, 0x0100, 0x0800, 0x0080, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x4002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0010, 0x0080, 0x0000, 0x4480, 0x0002, 0x0200, +0x0400, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0100, 0x0012, 0x8004, +0x4208, 0x0080, 0x0000, 0x0001, 0x0480, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0090, 0x0000, 0x0801, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0004, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0480, 0x0000, 0x0000, 0x0401, 0x0000, +0x0000, 0x0010, 0x0000, 0x1008, 0x0100, 0x0012, 0x0000, 0x4000, 0x0081, +0x0000, 0x0000, 0x0480, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0090, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0600, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x2400, +0x92D9, 0x6924, 0x2892, 0x9249, 0x4904, 0x6492, 0xB249, 0x4A24, 0x24D2, +0x9241, 0x5924, 0x2482, 0x6481, 0x9249, 0x0924, 0x2092, 0x9249, 0x4904, +0x0490, 0x9249, 0x4064, 0x2412, 0x9241, 0x4924, 0x2412, 0x2409, 0x9249, +0x4120, 0x2092, 0x9249, 0x4905, 0x0491, 0xD249, 0x4024, 0x241A, 0x9241, +0x4925, 0x0492, 0x2409, 0x9249, 0x4924, 0x2092, 0x92C9, 0x4914, 0x0490, +0x92C9, 0x4224, 0x2492, 0x9241, 0x1925, 0x2492, 0x2409, 0x92D9, 0x4924, +0x2892, 0x9249, 0x4900, 0x4492, 0xB249, 0x4A24, 0x2492, 0x9241, 0x5924, +0x2492, 0x6489, 0x9249, 0x0924, 0x2090, 0x9249, 0x4904, 0x0490, 0x9248, +0x4864, 0x2492, 0x9241, 0x4924, 0x0492, 0x2408, 0x9249, 0x0100, 0x2010, +0x9248, 0x4D05, 0x0480, 0x9249, 0x4824, 0x0412, 0x9241, 0x4925, 0x0480, +0x2408, 0x9249, 0x0100, 0x2890, 0x12C9, 0x4914, 0x6493, 0x92C9, 0x4824, +0x24D2, 0x9241, 0x4925, 0x0480, 0x0009, 0x0000, 0x2000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2002, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4024, 0x0282, 0x0000, 0x0000, +0x2002, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x2012, 0x0001, 0x0000, +0x4824, 0x040A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x2012, 0x0000, 0x8014, 0xE6D8, 0x016D, 0x00C0, 0xB6D0, 0x5B68, +0x1000, 0xB440, 0xDB2D, 0x680F, 0x9040, 0xDBED, 0x0166, 0x2480, 0x36DD, +0x02F9, 0x1A10, 0xF68D, 0x0625, 0x0403, 0xB024, 0x0B69, 0x3022, 0x8309, +0xFF2D, 0x013A, 0x1494, 0xFCD8, 0x132D, 0x2888, 0x96C0, 0x1BE9, 0x3200, +0xB488, 0xF325, 0x0402, 0x8022, 0x5B7D, 0x0034, 0x0001, 0x22D9, 0x036D, +0x0250, 0xF6D0, 0x5B64, 0x0880, 0xB400, 0xDB6B, 0x3006, 0x9001, 0xDF8D, +0xB676, 0x5B71, 0x8248, 0xBB34, 0x5B2D, 0x9246, 0xA8A1, 0xCB6D, 0x90F2, +0x4164, 0x3360, 0x9596, 0x4804, 0x9302, 0xFF65, 0x1208, 0xB020, 0xC13C, +0x9203, 0x106C, 0x5B6C, 0xC492, 0x9920, 0xCB42, 0x86BF, 0x4962, 0xB616, +0xC938, 0x0148, 0xA144, 0xF325, 0x6A06, 0x0520, 0x492D, 0x103A, 0x046A, +0x4D60, 0x8C94, 0x8904, 0x9600, 0xD964, 0x4E48, 0xB924, 0xD93D, 0x1A46, +0x0929, 0xC1ED, 0x50B6, 0x4D10, 0xE96A, 0x9DB7, 0x0840, 0xDB12, 0x61AA, +0x0927, 0xD092, 0x0C36, 0x4933, 0x2490, 0x6536, 0x481D, 0x2492, 0x05B8, +0x6ADB, 0x2612, 0xCA88, 0x0816, 0x4971, 0x8000, 0x25A7, 0x0900, 0x0092, +0x6CA2, 0x404B, 0x2682, 0x6C11, 0x45D2, 0x0012, 0x5A21, 0x5780, 0x0121, +0xC081, 0x008A, 0x4901, 0x2410, 0x3496, 0x4C01, 0x1F12, 0x51B1, 0x4368, +0x2682, 0xDB09, 0x6D93, 0x4927, 0xD092, 0x6E44, 0x093B, 0xA492, 0x6416, +0x48DB, 0x2490, 0x14B9, 0x46CA, 0x2012, 0x0009, 0x0008, 0x4927, 0x0292, +0x0000, 0x4920, 0x2693, 0x0000, 0x4904, 0x34D2, 0x6001, 0x5800, 0xA692, +0x01A9, 0x2400, 0x69B5, 0x0092, 0x0011, 0x4D01, 0x34DB, 0x0000, 0x5C00, +0xB692, 0x0043, 0x4209, 0x24D2, 0x002D, 0x0214, 0x4525, 0x10D3, 0xA000, +0x6900, 0x2492, 0x0200, 0x4800, 0x36DB, 0x0401, 0x4100, 0xA6DA, 0x0009, +0x0000, 0x4D27, 0x0892, 0x0010, 0x4920, 0xA49B, 0x0080, 0x4900, 0x24B2, +0x2001, 0x5001, 0x24D2, 0xFF09, 0x7BF3, 0x2490, 0xF069, 0x9E3F, 0x2497, +0x1048, 0xEB7F, 0x2479, 0x8229, 0x9FF0, 0x33BF, 0x1049, 0xEE04, 0x9A5F, +0x0400, 0xA249, 0xADEE, 0x2080, 0x0200, 0xFAEC, 0x20CB, 0x0049, 0xCE30, +0x0CF6, 0x9209, 0x3E00, 0xC96B, 0x2890, 0xE208, 0x5A41, 0x0486, 0x1249, +0xCC5F, 0x24AC, 0x8000, 0xD3F0, 0x0E0E, 0x1001, 0xFF24, 0xFFC8, 0x2090, +0xF249, 0xFC0D, 0x249F, 0x1240, 0xFA4F, 0x26FE, 0x9249, 0x86F0, 0x1FEE, +0x9309, 0x0024, 0x8404, 0x2DB5, 0x00DB, 0xA1C0, 0x6D88, 0x76DA, 0x1080, +0x6C00, 0xB69B, 0x8004, 0x5420, 0xB45B, 0x24AD, 0x41A8, 0x6DA1, 0x524B, +0x5240, 0x2D8E, 0x2B93, 0x8111, 0x6834, 0x24DB, 0x1081, 0x4800, 0x929B, +0x8101, 0x2043, 0x25B5, 0x029A, 0x0550, 0x4D88, 0x365F, 0x8240, 0xE846, +0x8D97, 0xA201, 0x4081, 0x34CB, 0x202D, 0x022C, 0x69B4, 0x02DB, 0x0082, +0x2D80, 0x76D2, 0x1300, 0x6C00, 0xB6D9, 0x0A05, 0x5000, 0xF21B, 0x002D, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0004, 0x0008, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0003, 0x0000, 0x0820, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x4020, 0x0000, +0x1000, 0x4020, 0x0400, 0x0000, 0x4800, 0x0012, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x2000, 0x0040, 0x0042, 0x0000, 0x0000, 0x0008, 0x2001, 0x0010, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2004, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x008C, 0x0000, 0x0080, 0x0009, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x1201, 0x0001, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x1002, 0x0004, 0x0000, 0x0010, 0x0000, 0x0000, 0x8100, +0x0000, 0x0000, 0x8000, 0x0200, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0080, 0x0009, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x1201, 0x0000, 0x0100, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0004, 0x0000, 0x0010, 0x0400, 0x0000, 0x0000, 0x4000, 0x0400, +0x0000, 0x0200, 0x0800, 0x0000, 0x0002, 0x0040, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x2400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0009, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x9001, 0x0000, 0x0000, 0x0002, +0x0004, 0x0000, 0x0090, 0x0000, 0x0000, 0x2400, 0x0000, 0x0000, 0x0000, +0x8000, 0x0200, 0x0000, 0x0209, 0x0024, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x9001, 0x0000, 0x4000, 0x0000, 0x0004, 0x0000, +0x0090, 0x0000, 0x0000, 0x2400, 0x0000, 0x0000, 0x0000, 0x8000, 0x0200, +0x0000, 0x0209, 0x0026, 0x0000, 0x0401, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0400, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0100, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x2000, +0x0400, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x1000, +0x0000, 0x0080, 0x1001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0104, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2101, +0x0000, 0x0000, 0x1080, 0x0000, 0x0020, 0x0000, 0x0000, 0x2000, 0x0000, +0x0020, 0x0010, 0x0010, 0x8001, 0x0401, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0048, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0014, 0x0000, 0x1000, 0x0120, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, +0x0800, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0800, 0x0008, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0041, 0x2020, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0400, 0x0000, 0x4005, 0x0090, 0x0000, 0x0000, +0x0024, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x2010, 0x0000, 0x0100, +0x0200, 0x0020, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0080, 0x0002, 0x0000, 0x2000, 0x0000, 0x0000, 0x0040, 0x4482, +0x0000, 0x4000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x4004, 0x0090, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x2010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x4486, 0x0000, 0x4000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0020, 0x0000, +0x0000, 0x0002, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4124, 0x0000, +0x0000, 0x4000, 0x0002, 0x0000, 0x0300, 0x0000, 0x0000, 0x4120, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0902, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x2000, 0x0000, 0x8000, 0x8000, +0x0000, 0x0001, 0x0000, 0x0100, 0x0000, 0x0400, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0610, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x1000, 0x0000, 0x0800, 0x0000, 0x0200, 0x0000, +0x0401, 0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0084, 0x0240, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x1000, 0x3000, +0x0100, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x8000, 0x0000, 0x10C0, +0x0400, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x00C0, 0x0004, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0028, 0x0002, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x1000, 0x0200, 0x2400, +0x9641, 0x4924, 0x2C92, 0x9209, 0x4904, 0x6492, 0x9249, 0x4A28, 0x2492, +0x9241, 0x5824, 0x2492, 0x0489, 0x8009, 0x4904, 0x0096, 0x9249, 0x0904, +0x2492, 0x1289, 0x5800, 0x2492, 0x9201, 0x0824, 0x2491, 0x0009, 0x9249, +0x4924, 0x2092, 0x9240, 0x410E, 0x2492, 0x9249, 0x4804, 0x2492, 0x1001, +0x4020, 0x2492, 0x6009, 0x9648, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, +0x00C9, 0x4A24, 0x2492, 0x9241, 0x4924, 0x2492, 0x2409, 0x8609, 0x4925, +0x2882, 0x9249, 0x4904, 0x6492, 0x8249, 0x4A2C, 0x0492, 0x9241, 0x5124, +0x2492, 0x2489, 0x9249, 0x0921, 0x2002, 0x9249, 0x4904, 0x2492, 0x90C9, +0x4820, 0x26D0, 0x1201, 0x4920, 0x0482, 0x0409, 0x9249, 0x4925, 0x20D2, +0x9249, 0x490C, 0x0692, 0x9249, 0x4804, 0x0492, 0x9201, 0x4824, 0x2412, +0x6409, 0x9641, 0x4825, 0x2882, 0x9249, 0x4904, 0x2010, 0x92C9, 0x0E24, +0x2090, 0x8241, 0x5924, 0x2492, 0x0009, 0x1000, 0x0001, 0x0408, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x2800, 0x0001, 0x0000, 0x0900, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0100, 0x0000, 0x0000, 0x0000, +0x2001, 0x0400, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0400, 0x0000, 0x0000, 0x4004, 0x0000, 0x0004, 0x0400, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4024, 0x0002, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0402, 0x0000, 0x4000, 0x0480, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x4000, 0x0100, 0x0000, 0x0000, 0x0010, 0x2000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0110, 0x0000, +0x0000, 0x0400, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0008, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0402, 0x0000, 0x4000, 0x0480, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x8010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0010, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0410, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x4120, 0x0000, 0x1000, 0x4000, 0x0002, 0x0000, 0x0100, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0120, +0x0000, 0x0000, 0x0000, 0x0002, 0x1000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0024, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x1040, 0x4000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x9258, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0xB249, +0x4A2C, 0x2492, 0x9241, 0x5924, 0x2492, 0x2489, 0x9249, 0x0920, 0x2092, +0x9249, 0x4904, 0x24B2, 0x9248, 0x4824, 0x2492, 0x9241, 0x0924, 0x2012, +0x2409, 0xB24D, 0x0920, 0x2092, 0x9209, 0x4907, 0x2492, 0x9249, 0x4824, +0x3492, 0x9241, 0x0924, 0x2492, 0x2409, 0x9249, 0x0900, 0x2090, 0x9279, +0x4904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5926, 0x2492, 0x2409, +0x9A59, 0x4924, 0x2082, 0x9049, 0x4904, 0x6410, 0xAA49, 0x4A2C, 0x2492, +0x1241, 0x5924, 0x2492, 0x2089, 0x924C, 0x4824, 0x2002, 0x9249, 0x0106, +0x2012, 0x9A49, 0x0024, 0x2082, 0xD240, 0x4824, 0x0012, 0x2601, 0xB249, +0x4024, 0x2002, 0x920D, 0x0105, 0x0012, 0x1349, 0x0824, 0x2002, 0xD240, +0x0934, 0x0010, 0x2401, 0x9249, 0x4024, 0x3092, 0x9259, 0x0100, 0x6490, +0x9249, 0x0A00, 0x2492, 0x9241, 0x1924, 0x0010, 0x0009, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0800, 0x0480, 0x0000, +0x0000, 0x0400, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0091, +0x0000, 0x4800, 0x0480, 0x0000, 0x4000, 0x1410, 0x0001, 0x4000, 0x2482, +0x0008, 0x0000, 0x2900, 0x0400, 0x0000, 0x4800, 0x0002, 0x0000, 0x4000, +0x0000, 0x0000, 0x4000, 0x2482, 0x0000, 0x0200, 0xB6D8, 0x0345, 0x8020, +0xB6D0, 0x596F, 0x0D00, 0xB409, 0xDF6D, 0xC006, 0x9048, 0x996D, 0x2077, +0x2088, 0x9618, 0x03ED, 0x04C1, 0xB2C1, 0x136E, 0x0400, 0xF4E0, 0x5B5D, +0x8082, 0x8000, 0xD8EF, 0x4136, 0x4B0C, 0x97D1, 0x2365, 0x24A2, 0xE643, +0x1B6D, 0x4440, 0xB449, 0xDF7C, 0x1C12, 0xC202, 0x9A2D, 0x4136, 0x0004, +0xB7DD, 0x036D, 0x0090, 0xE690, 0x5B6D, 0x0041, 0xB000, 0xDB68, 0x101E, +0x9000, 0xDB2D, 0xB676, 0xC965, 0x8A48, 0xB90C, 0x4B0D, 0x1246, 0x0B00, +0xD06D, 0x90B7, 0x4900, 0x1B6A, 0x9DF6, 0x0BA4, 0x9612, 0x7B65, 0xE280, +0xB124, 0xDBAC, 0x9606, 0x0121, 0x4F6D, 0x8016, 0xC904, 0x5BE0, 0x0CB2, +0x4A20, 0xF612, 0x0060, 0xA040, 0x9108, 0x5B4D, 0x02C0, 0x2000, 0x9F2C, +0x90B7, 0x4921, 0x4170, 0x8490, 0x0044, 0xF713, 0xDB60, 0x4848, 0x9924, +0xD975, 0x0A06, 0x8920, 0xC92C, 0x14B6, 0x4933, 0x4962, 0x9DB6, 0x4454, +0xDB12, 0x64B2, 0x6927, 0xD0D2, 0x6416, 0x493B, 0xA4D0, 0x60B6, 0x48D2, +0x0082, 0x2DB9, 0x6603, 0x0492, 0xC888, 0x4DAA, 0x5925, 0x8210, 0x6076, +0x4908, 0x2080, 0x21A0, 0x084B, 0x2682, 0x8C00, 0x42DB, 0x2410, 0x180D, +0x0238, 0x4821, 0xC2D2, 0xA480, 0x2109, 0x3000, 0x0056, 0x4848, 0x0082, +0x01A0, 0x0A41, 0xB68A, 0x1805, 0x6D8A, 0x4823, 0xC092, 0x6C80, 0x09FB, +0x2490, 0x70D7, 0x48DB, 0x2492, 0x35B9, 0x06D9, 0x26B2, 0x0009, 0x0008, +0x4927, 0x08DA, 0x0000, 0x4920, 0xA6D0, 0x1000, 0x4900, 0x2492, 0x9001, +0x5040, 0x2692, 0x2489, 0x2000, 0x69A5, 0x2292, 0x0040, 0x4D00, 0x2493, +0x0000, 0x0800, 0xA692, 0x0041, 0x4800, 0x3612, 0xC00D, 0x0040, 0x6925, +0x03DA, 0x8040, 0x0980, 0x34B2, 0x0200, 0x4C00, 0x2493, 0x1811, 0x4800, +0xB6DA, 0x400D, 0x0008, 0xC927, 0x0092, 0x0010, 0x69A0, 0x2492, 0x1000, +0x4F00, 0x249B, 0x0001, 0x5000, 0x26D2, 0xFF09, 0xF561, 0x2490, 0xF201, +0x7FCF, 0xA49F, 0x100B, 0xE3FF, 0x26F7, 0x9249, 0x4FF0, 0x3FA7, 0x9049, +0xCA24, 0xDF63, 0x0418, 0x9049, 0xFABE, 0x2084, 0x1248, 0xF7FD, 0x649F, +0x1049, 0x3EA0, 0x07FF, 0x80C9, 0x3C20, 0xD125, 0x0690, 0xD021, 0x5B39, +0x6406, 0x0249, 0xDC3F, 0x2037, 0x9348, 0x83E0, 0x05A7, 0x0001, 0x3F20, +0xFFC5, 0x2490, 0xE249, 0xFE49, 0x041F, 0x1249, 0xCA1E, 0xA0FF, 0x9240, +0x83E0, 0x1FFE, 0x9009, 0x0024, 0x1A08, 0x4DB4, 0x0293, 0x90C0, 0x6D80, +0x7499, 0x0600, 0x6C08, 0xB2DB, 0x8005, 0x5018, 0xB4DB, 0x31AC, 0x8010, +0x4D35, 0x405B, 0x0401, 0x6983, 0x36D8, 0x9812, 0x2C20, 0x34CB, 0x6011, +0x4104, 0xB459, 0x0329, 0xB483, 0x4CBD, 0x2093, 0x0016, 0x0D04, 0x26DB, +0x2081, 0x6C00, 0xB2CA, 0xF601, 0x013C, 0x2493, 0x002B, 0x0011, 0x6CB1, +0x32DB, 0x020E, 0x2D00, 0x76DF, 0x0700, 0x6800, 0xB6DA, 0x8205, 0x5000, +0xB49B, 0x002D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0020, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0040, 0x0002, 0x0000, 0x0800, +0x0000, 0x0000, 0x4000, 0x0004, 0x0000, 0x0200, 0x0200, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0008, 0x0000, 0x2000, 0x0000, +0x0004, 0x0000, 0x0100, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x0080, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0C00, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0042, 0x0080, 0x0048, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x1000, 0x0000, 0x0000, 0x0201, 0x2404, 0x0041, 0x2000, 0x0401, +0x0000, 0x0100, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0081, 0x0401, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0048, 0x0000, 0x0000, 0x0002, 0x0000, 0x2000, 0x1000, +0x0000, 0x0100, 0x0201, 0x0004, 0x0008, 0x2000, 0x0001, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0200, 0x0000, 0x0040, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x1000, 0x0400, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0008, 0x0000, 0x0000, +0x0040, 0x0000, 0x8000, 0x0000, 0x0008, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0001, 0x0000, 0x2000, 0x0000, 0x1000, +0x0000, 0x0040, 0x0000, 0x2040, 0x0000, 0x0041, 0x0000, 0x0000, 0x0040, +0x0200, 0x0020, 0x8000, 0x0000, 0x0100, 0x8000, 0x0004, 0x0000, 0x2490, +0x0000, 0x0040, 0x0000, 0x0040, 0x1000, 0x0000, 0x0001, 0x0000, 0x4000, +0x1000, 0x0000, 0x0000, 0x2001, 0x0408, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x8000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0001, 0x0001, 0x0000, 0x2000, 0x0000, 0x1000, 0x0000, 0x0040, +0x0000, 0x0040, 0x0001, 0x0041, 0x0000, 0x0000, 0x0040, 0x0200, 0x0020, +0x8000, 0x0000, 0x0100, 0x8000, 0x0004, 0x0000, 0x2490, 0x0400, 0x0040, +0x0000, 0x0040, 0x1000, 0x0000, 0x0001, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0001, 0x0410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0002, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0120, +0x0001, 0x0004, 0x0004, 0x0000, 0x0004, 0x4004, 0x0002, 0x8100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2080, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0040, 0x0000, 0x0041, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0108, 0x0000, 0xA200, 0x4000, 0x0020, 0x4000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0020, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2001, 0x0400, 0x0000, 0x0000, 0x0020, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0001, 0x1000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0100, 0x0020, 0x0400, 0x0000, 0x0000, 0x0400, +0x0200, 0x0000, 0x0000, 0x1000, 0x0000, 0x0040, 0x0000, 0x0000, 0x2020, +0x0000, 0x0000, 0x0001, 0x0440, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x2000, 0x0000, 0x4000, 0x0002, 0x0000, 0x2001, 0x1000, 0x0800, +0x0000, 0x0000, 0x0004, 0x0800, 0x4000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0040, 0x1001, 0x0020, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, +0x0002, 0x0100, 0x0000, 0x0400, 0x0004, 0x0000, 0x0400, 0x0040, 0x0000, +0x0000, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0040, 0x2800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0020, 0x8000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0208, 0x0000, 0x0000, 0x0108, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0300, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0120, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x1040, 0x8000, 0x0004, 0x0004, +0x0000, 0x0000, 0x0040, 0x1080, 0x0000, 0x0000, 0x0110, 0x0000, 0x0400, +0x0010, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0040, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, +0x0040, 0x0000, 0x1000, 0x0000, 0x0000, 0x0040, 0x0800, 0x0200, 0x0200, +0x0000, 0x0000, 0x0000, 0x1040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0040, 0x0000, 0x4000, 0x0000, 0x0100, 0x0000, 0x0400, 0x0000, 0x0001, +0x0400, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0040, 0x0004, +0x0020, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x8002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0088, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0000, 0x2000, +0x0000, 0x0001, 0x0200, 0x2002, 0x0000, 0x0040, 0x0C20, 0x0000, 0x0000, +0x00A0, 0x0000, 0x0000, 0x4002, 0x0000, 0x0000, 0x5800, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0210, 0x0000, +0x2000, 0x0004, 0x0400, 0x0000, 0x0000, 0x0002, 0x0800, 0x0000, 0x0000, +0x0008, 0x0000, 0x0400, 0x1088, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x2000, 0x0000, 0x0001, +0x0000, 0x2002, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0008, 0x0840, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x4100, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, +0x1001, 0x0000, 0x0100, 0x1200, 0x0000, 0x2100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0100, 0x0000, 0x0008, 0x0002, 0x0008, 0x0004, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0900, 0x0000, 0x0004, 0x0000, 0x0002, +0x0000, 0x4000, 0x8000, 0x0100, 0x0800, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0110, +0x0000, 0x0000, 0x0800, 0x0000, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x0080, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0040, +0x2000, 0x2208, 0x0000, 0x0000, 0x1000, 0x8000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0008, 0x0001, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0A00, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x8080, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0200, 0x0004, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0011, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0801, 0x0000, 0x0000, 0x2100, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x1000, 0x0400, +0x0000, 0x0000, 0x0000, 0x8000, 0x0005, 0x0010, 0x0000, 0x4000, 0x0000, +0x0000, 0x0001, 0x1400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0800, 0x0080, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x1000, 0x2001, 0x0200, 0x0000, 0x0000, 0x0001, +0x0100, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0200, 0x0400, 0x9011, 0x4924, 0x2A92, 0x8249, 0x490C, 0x6412, 0x9259, +0x4865, 0x2492, 0xC2C1, 0x5904, 0x2492, 0x6589, 0x924D, 0x4824, 0x2092, +0x9209, 0x0104, 0x2C92, 0x9240, 0x4824, 0x2492, 0x8341, 0x4924, 0x0492, +0x0409, 0x8019, 0x4025, 0x2012, 0x8249, 0x4905, 0x2092, 0xB241, 0x4808, +0x0412, 0x1603, 0x4804, 0x2492, 0x0009, 0x9200, 0x0920, 0x6C92, 0x8649, +0x5804, 0x6482, 0x920B, 0x4224, 0x2492, 0x8241, 0x5921, 0x2412, 0x2409, +0x1259, 0x0921, 0x2892, 0x8209, 0x490C, 0x4490, 0x9259, 0x0A61, 0x2092, +0x92C0, 0x5924, 0x2090, 0x6501, 0x1049, 0x4821, 0x0092, 0x9201, 0x4904, +0x2492, 0x9248, 0x4824, 0x2492, 0x9240, 0x4920, 0x0492, 0x2009, 0x8058, +0x0924, 0x2098, 0x8248, 0x4905, 0x2092, 0xA049, 0x4C2C, 0x1412, 0x1641, +0x4906, 0x2480, 0x0409, 0x9249, 0x0125, 0x6892, 0x9649, 0x4804, 0x6482, +0x824B, 0x4224, 0x2490, 0x0201, 0x5905, 0x3082, 0x0009, 0x8000, 0x0001, +0x0440, 0x0180, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0400, +0x0002, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0080, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0024, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0180, 0x0000, +0x0000, 0x0800, 0x0000, 0x0200, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0400, 0x0001, 0x0001, 0x2000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x4204, 0x0001, 0x0800, 0x0040, +0x0000, 0x0000, 0x0000, 0x4000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x4004, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x2000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x2010, 0x0000, +0x0004, 0x0000, 0x0810, 0x0000, 0x0000, 0x0084, 0x0000, 0x0000, 0x0082, +0x0008, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x00B0, 0x0000, 0x0040, 0x0900, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x2010, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0082, 0x0008, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0400, 0x0000, 0x0000, 0x0040, 0x0000, 0x2000, 0x0040, 0x0000, +0x0010, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0100, 0x0400, 0x0004, 0x0000, 0x0040, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0104, 0x0100, 0x0040, 0x0900, 0x0000, 0x0000, +0x4004, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0200, 0x0200, 0x0020, +0x0000, 0x0000, 0x0802, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0400, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2400, 0x9649, 0x4904, 0x2890, 0x9249, 0x4904, +0x4490, 0x9249, 0x4A04, 0xA0BA, 0x9240, 0x592C, 0x0492, 0x0589, 0x9249, +0x1824, 0x2092, 0x9649, 0x4904, 0x2490, 0x9249, 0x08A5, 0x2482, 0x9651, +0x4904, 0x2490, 0x2401, 0x925B, 0x0920, 0x2092, 0xBA49, 0x4904, 0x2492, +0x9249, 0x4825, 0x2492, 0xD241, 0x492C, 0x2692, 0x2409, 0x9259, 0x0920, +0x6092, 0xB249, 0x5904, 0x649A, 0x9259, 0x4A24, 0x2496, 0x9241, 0x5924, +0x2492, 0x2409, 0x8641, 0x4924, 0x2892, 0x8249, 0x4904, 0x6492, 0x9269, +0x4A24, 0x2492, 0x1241, 0x59BC, 0x2492, 0x0589, 0x9249, 0x4934, 0x2012, +0x9649, 0x4404, 0x0492, 0x9249, 0x4825, 0x2492, 0x9651, 0x4924, 0x2492, +0x2409, 0x925B, 0x4925, 0x0010, 0xB249, 0x4904, 0x2482, 0x9249, 0x4825, +0x0490, 0x1241, 0x0928, 0x0492, 0x2408, 0x9259, 0x4824, 0x6892, 0xB34D, +0x4904, 0x6492, 0x9A59, 0x4A24, 0x2492, 0x9241, 0x5924, 0x3480, 0x0009, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0040, 0x0000, 0x2000, 0x1040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0408, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x100A, 0x0800, 0x1604, 0xB6D8, +0x0325, 0x6162, 0xBED0, 0x5B6E, 0x0400, 0x340B, 0xFF6D, 0x8A06, 0x9009, +0x99E5, 0x0274, 0x8000, 0xB6D9, 0x016D, 0x6C00, 0xB6C8, 0x1BFD, 0x0000, +0xB481, 0xD26D, 0x0183, 0x8226, 0x4B6D, 0x4036, 0x9690, 0x3FD8, 0x5121, +0x3E82, 0xE7C9, 0x3FB7, 0x2242, 0xA449, 0xB644, 0x9C51, 0x892D, 0x2D2C, +0x4000, 0x0110, 0xF7D1, 0x236D, 0x0480, 0xA650, 0x5B6B, 0x5040, 0xB401, +0xDB0C, 0xC016, 0xD002, 0xD96D, 0xB676, 0xC960, 0xC208, 0xB94C, 0x880F, +0x1246, 0x0921, 0xCB65, 0x10B9, 0x4906, 0x516A, 0x9D96, 0x0B0C, 0x9410, +0x596D, 0x1240, 0xB324, 0xB56C, 0x9242, 0x0800, 0xDB6D, 0xC036, 0x4004, +0xDA60, 0x0D90, 0xD020, 0xF602, 0x496D, 0x0268, 0xC348, 0xE5E5, 0x000F, +0x016C, 0x4925, 0x00FB, 0x0009, 0x4320, 0x049B, 0x9245, 0xF624, 0xD87C, +0x0844, 0x9930, 0xD9A5, 0x4A86, 0x0820, 0x892C, 0x10B2, 0x4943, 0x097A, +0x9DB0, 0x4694, 0xCB12, 0x6492, 0x6907, 0x5082, 0x2C54, 0x413B, 0xA458, +0x6116, 0xE8D0, 0x00A2, 0x05B9, 0x664B, 0x0012, 0xC989, 0x6D16, 0x4925, +0x9092, 0x0236, 0x4D03, 0x0402, 0x01A0, 0x4818, 0x2092, 0x2C10, 0x40EC, +0x2490, 0x1821, 0xD690, 0x0035, 0x0081, 0x0000, 0x2080, 0x0000, 0x0410, +0x4000, 0x1252, 0xA5D0, 0x0B64, 0x008A, 0x1909, 0x6C82, 0x082F, 0xE09A, +0x2A00, 0x493B, 0xA580, 0x1057, 0x48DA, 0x2092, 0x81A9, 0x06C9, 0x3492, +0x0009, 0x0008, 0x4927, 0x08DA, 0x0000, 0xC920, 0xA4D9, 0x0000, 0x6900, +0x34D2, 0x8001, 0x5000, 0xA61A, 0x0489, 0x8020, 0x49A5, 0x229A, 0x0200, +0x4D00, 0x3492, 0x8000, 0x4884, 0x2492, 0x0040, 0x4000, 0xB492, 0x4009, +0x0009, 0x4125, 0x42DA, 0xA440, 0x2981, 0x2CDA, 0x0220, 0x6841, 0x36DB, +0x1021, 0x400B, 0xB6D3, 0x402D, 0x0050, 0x4927, 0x089A, 0x0280, 0x49A0, +0xA493, 0x0001, 0x4900, 0x24DB, 0x0011, 0x5000, 0x3692, 0xF709, 0xE9E1, +0x2490, 0xF201, 0xDEFF, 0x249F, 0x1202, 0xF35F, 0x06FF, 0x8209, 0x7570, +0x3F26, 0x10C1, 0xFB24, 0x7B4F, 0x2410, 0x9041, 0xFD7F, 0x2087, 0x0349, +0x1BED, 0x3478, 0x9249, 0xFE21, 0x09DA, 0x0249, 0xB624, 0x4846, 0x2C98, +0x3001, 0x4999, 0x440E, 0x1201, 0x9019, 0x042C, 0x8000, 0x4B80, 0x8200, +0x0808, 0x3C00, 0xFB89, 0x2490, 0xC241, 0xB849, 0x241F, 0x1248, 0xC21E, +0x26FE, 0x9200, 0x53E0, 0x1FF6, 0x8049, 0x0024, 0x1209, 0x4DB4, 0x0293, +0x1280, 0x6580, 0x7690, 0x14A8, 0x4C04, 0x92DB, 0xA205, 0x50B0, 0xB453, +0x20AD, 0x8280, 0x6DBD, 0x40DB, 0x0081, 0x698C, 0x366B, 0x6412, 0x6C43, +0xB6FB, 0x0080, 0x4201, 0x26DB, 0x010D, 0x2122, 0x74A5, 0x2092, 0x121E, +0x0C00, 0x1201, 0xFACE, 0x6C96, 0x8892, 0x1000, 0x4490, 0x0092, 0x0219, +0x0201, 0x2EB5, 0x02D3, 0x055E, 0x6D40, 0x76D9, 0x2E80, 0xEC05, 0xB69A, +0x3605, 0x1004, 0xA4DB, 0x002D, 0x0100, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x2000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0004, 0x0000, +0x1000, 0x0090, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0001, 0x0000, 0x2000, 0x0800, 0x0090, 0x0000, 0x0000, +0x06B0, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0104, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0040, 0x0000, +0x0004, 0x0000, 0x0100, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0300, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0800, +0x0090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x8400, 0x0000, 0x0010, +0x0000, 0x0080, 0x1000, 0x0000, 0x1040, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2090, 0x0000, 0x0000, 0x0400, 0x0000, 0x1000, 0x2000, 0x8051, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0002, 0x0002, 0x0000, 0x0000, 0x0000, 0x0010, 0x2080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x1400, 0x0400, 0x0040, 0x0000, 0x0000, +0x0200, 0x0000, 0x3040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2090, +0x0000, 0x0000, 0x0400, 0x0080, 0x0000, 0x2000, 0x8041, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0804, 0x0000, 0x0000, 0x0000, 0x0100, 0x0400, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1000, 0x0008, 0x0040, +0x0000, 0x0000, 0x0001, 0x0400, 0x0041, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0041, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x2000, 0x8002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0009, 0x0080, 0x0000, 0x0408, 0x8000, 0x0000, 0x1240, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0002, 0x4000, 0x0040, 0x0800, 0x0008, 0x8010, +0x0400, 0x0144, 0x0000, 0x0804, 0x0000, 0x0001, 0x0900, 0x1010, 0x0020, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0280, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0009, 0x0000, 0x0000, 0x0008, 0x8000, 0x0000, 0x1240, 0x0000, 0x0000, +0x0001, 0x0008, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0100, 0x0000, 0x0000, 0x00C0, 0x0001, 0x0008, 0x8000, 0x0400, 0x0040, +0x0000, 0x0004, 0x0000, 0x0000, 0x0900, 0x1000, 0x0022, 0x0000, 0x0001, +0x0418, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0002, 0x0000, 0x0004, +0x0084, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x1000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0009, 0x0000, 0x4100, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0001, 0x0400, 0x0120, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x1408, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0900, 0x0000, 0x0000, 0x2100, 0x0000, 0x0000, 0x0001, 0x0100, +0x0000, 0x0000, 0x0200, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0080, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0004, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0001, 0x0404, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0800, +0x4000, 0x0000, 0x0010, 0x0000, 0x0001, 0x0001, 0x0000, 0x0208, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x4900, 0x0000, 0x0000, 0x0000, +0x0001, 0x2400, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x4020, 0x0000, 0x0000, 0x0041, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0010, +0x0A00, 0x0804, 0x0041, 0x0001, 0x0000, 0x0208, 0x0000, 0x0000, 0x0020, +0x0000, 0x0002, 0x0000, 0x8900, 0xC000, 0x0000, 0x0020, 0x0001, 0x2400, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4810, 0x4000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0400, 0x0008, 0x0000, +0x9000, 0x1000, 0x0000, 0x04C0, 0x0201, 0x0000, 0x0500, 0x0000, 0x0800, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x8000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0020, 0x0000, 0x0004, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x1000, 0x4000, 0x0001, 0x0000, 0x0000, +0x0000, 0x9000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1001, 0x0000, +0x0000, 0x0308, 0x0040, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0C80, +0x0000, 0x0200, 0x0000, 0x0200, 0x2000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0002, 0x0000, 0x0000, 0x1000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0001, 0x0000, 0x1020, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x1101, 0x0000, 0x0000, 0x0218, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x2000, 0x0800, 0x0800, 0x0000, +0x0000, 0x0000, 0x3400, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0008, 0x5000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0040, 0x0000, 0x4000, 0x4000, 0x0010, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0300, 0x0000, 0x0000, 0x9140, 0x0130, +0x0000, 0x8800, 0x4820, 0x0000, 0x4000, 0x0100, 0x0010, 0x0100, 0x120C, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x000C, 0x4000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0100, 0x0010, 0x0000, 0x0800, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0010, 0x0000, 0x0004, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0002, 0x0001, 0x0000, 0x0508, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0010, 0x0000, 0x0000, 0x0000, 0x0004, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x2000, 0x0200, 0x0000, +0x0000, 0x2008, 0x0002, 0x0000, 0x0000, 0x0003, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0004, 0x0008, 0x0000, 0x0008, 0x0000, 0x0008, 0x0100, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x8008, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x2000, 0x0000, 0x0008, +0x0000, 0x0041, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x1000, 0x2000, +0x0008, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x1000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1001, 0x0004, 0x0020, +0x1000, 0x0000, 0x2000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0104, 0x0081, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0002, 0x0000, 0x2400, 0x9648, 0x4925, 0x2882, 0x9009, 0x4905, +0x6490, 0x8049, 0x4A20, 0x2492, 0x0241, 0x5920, 0x2492, 0x4089, 0x9041, +0x4925, 0x2092, 0x9248, 0x4904, 0x2092, 0x8201, 0x4805, 0x2C82, 0x9241, +0x4924, 0x2490, 0x2419, 0x9049, 0x4925, 0x2082, 0x8248, 0xC90F, 0x0093, +0x92C9, 0x582C, 0x0510, 0x9641, 0x4161, 0x2182, 0x2408, 0x9059, 0x4925, +0x2892, 0x9249, 0x5904, 0x6492, 0x9209, 0x4A24, 0x2492, 0x0241, 0x1924, +0x2492, 0x2409, 0x9649, 0x0924, 0x2882, 0x9049, 0x4901, 0x60D2, 0x9249, +0x4A20, 0x2492, 0x8241, 0x5920, 0x2492, 0x4489, 0x0041, 0x4824, 0x2012, +0x9248, 0x4904, 0x2492, 0x9A09, 0x0C21, 0x208A, 0x9241, 0x4824, 0x2492, +0x2409, 0x8249, 0x4824, 0x2092, 0x8240, 0x480D, 0x1082, 0x90C9, 0x402C, +0x0490, 0x8641, 0x0945, 0x20C2, 0x240C, 0x9251, 0x0920, 0x2892, 0x9249, +0x4904, 0x6492, 0x9248, 0x4A24, 0x249A, 0x9241, 0x1924, 0x2492, 0x0009, +0x0010, 0x0001, 0x0400, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x4008, 0x0400, 0x0000, 0x0000, 0x0002, 0x0400, 0x1000, 0x0010, +0x0000, 0x0008, 0x0100, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0004, 0x4000, +0x1000, 0x0000, 0x0020, 0x8000, 0x0104, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x8000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0400, 0x0418, +0x0000, 0x0100, 0x0000, 0x8000, 0x0000, 0x0000, 0x0201, 0x0100, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0410, 0x0080, 0x0000, +0x0080, 0x0000, 0x0200, 0x0010, 0x0002, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0008, 0x0000, 0x0100, 0x0000, +0x0000, 0x0400, 0x0800, 0x0000, 0x0000, 0x0500, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0201, 0x0000, 0x0000, 0x0000, 0x0001, +0x0102, 0x0000, 0x0001, 0x0000, 0x0410, 0x0000, 0x0000, 0x0080, 0x0002, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0580, 0x0008, 0x0000, 0x0100, 0x0000, 0x0001, 0x0000, +0x0100, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0400, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x4000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x8000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x4100, 0x0020, 0x0004, 0x0000, 0x1400, 0x0000, 0x1040, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0002, 0x0000, 0x2400, 0x9649, 0x4924, 0x2892, +0x9241, 0x4904, 0x6412, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2612, +0x6488, 0x9649, 0x4924, 0x209A, 0x9209, 0x4004, 0x3402, 0x9249, 0x486D, +0x2692, 0x9240, 0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2092, 0xB259, +0xC904, 0x2492, 0x9249, 0x482C, 0x2497, 0x9241, 0x4934, 0x2492, 0x2409, +0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x9249, 0x4A20, 0x2492, +0x9241, 0x5924, 0x2492, 0x2409, 0x9641, 0x4924, 0x28D2, 0x9041, 0x4904, +0x6492, 0x9249, 0x4A20, 0x2492, 0x9041, 0x1924, 0x2492, 0x6489, 0x1449, +0x4924, 0x2090, 0x9249, 0x4904, 0x2592, 0x9249, 0x486D, 0x2492, 0x9241, +0x4900, 0x2492, 0x2409, 0x9209, 0x4824, 0x2092, 0xB059, 0x4904, 0x2402, +0x9249, 0x402C, 0x2490, 0x9241, 0x0924, 0x248A, 0x2408, 0x9249, 0x4824, +0x2892, 0x9249, 0x4904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, +0x2492, 0x0009, 0x0000, 0x0000, 0x0440, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x2686, 0xB6D8, 0x43E5, 0x2C22, 0xB7D9, 0x736D, 0x4400, 0xA428, 0x5F6D, +0x48C4, 0x9800, 0xDB6C, 0x4156, 0x078A, 0x8FDC, 0xC3C7, 0xE1D2, 0x2680, +0x194E, 0xC775, 0xB021, 0x5D54, 0xA822, 0x8643, 0x98ED, 0x3037, 0x049C, +0xDE59, 0x427D, 0x2408, 0x97C6, 0x0A79, 0x1392, 0xE445, 0xCA35, 0x0852, +0x824C, 0xCB78, 0x003E, 0x0016, 0xFED9, 0x136D, 0x2810, 0x76D0, 0x5B69, +0x1600, 0xB400, 0xDB21, 0x1026, 0x9001, 0xDB2D, 0xB676, 0xE969, 0x8248, +0xF92C, 0xD30C, 0x924E, 0x0104, 0x9965, 0x8092, 0xC904, 0x9128, 0x9492, +0x0885, 0xD332, 0xD8E7, 0xA000, 0x1008, 0x18A4, 0x0006, 0x0201, 0x1C08, +0x9C97, 0x8A0D, 0x6100, 0x40D4, 0x0216, 0x8602, 0x5D70, 0xA1AC, 0xD0A4, +0x4F24, 0x2000, 0x1000, 0xC834, 0x8092, 0x1048, 0xC320, 0x0FB2, 0x5823, +0xB210, 0xDB32, 0x8140, 0xA920, 0xD175, 0x0A06, 0x0902, 0xC92D, 0x18B6, +0x48CA, 0x494A, 0x1D96, 0x4154, 0xC312, 0x4FB2, 0x6107, 0x1040, 0x0516, +0x4430, 0x8802, 0x2192, 0x6868, 0x128A, 0x25B9, 0x6E4B, 0xB598, 0x008D, +0x0000, 0x4021, 0x0000, 0x245B, 0x0000, 0x3410, 0x02C3, 0x0848, 0x3082, +0x0411, 0x4080, 0xA01B, 0x0900, 0x2020, 0x0535, 0x0280, 0x0083, 0x5885, +0x2642, 0x3021, 0x0064, 0x2280, 0x0050, 0x0047, 0x8482, 0x1C00, 0x6CC0, +0x2127, 0xC092, 0x6480, 0x993B, 0xA41A, 0x3696, 0x48D9, 0x2482, 0x1189, +0x46D1, 0xA092, 0x0009, 0x2201, 0x4927, 0x08DA, 0x0800, 0x4D28, 0xA492, +0x0000, 0xE900, 0xF09A, 0x4001, 0x5000, 0xB49B, 0x00AD, 0xC081, 0x6BAD, +0x001A, 0x4089, 0x4900, 0x269B, 0x0400, 0xCCB1, 0xA69B, 0x0001, 0x4000, +0xA6DB, 0x0009, 0x0004, 0x65A5, 0x429A, 0x0C08, 0x6D80, 0x3EF2, 0x0311, +0x6822, 0x34CA, 0x8021, 0x4100, 0x3483, 0x0409, 0x0042, 0x692F, 0x0892, +0x1010, 0x4920, 0xA49A, 0x8000, 0x4900, 0x24DA, 0x0001, 0x5020, 0x2ED2, +0xF709, 0xD978, 0x2490, 0xF201, 0xD37D, 0x2094, 0x1249, 0xFB7B, 0x0657, +0x0641, 0x9F30, 0x37EF, 0x0260, 0x6500, 0x3162, 0x0410, 0xA2C1, 0x1300, +0x2484, 0x1044, 0x512C, 0x200E, 0x1040, 0x3B40, 0x8DE6, 0x1000, 0x0624, +0x9F7B, 0x0810, 0x2041, 0x9243, 0x0000, 0x0009, 0xAC68, 0x0490, 0x8A11, +0x1E02, 0x8EB3, 0x8258, 0x3A24, 0xFF3D, 0x0490, 0xF249, 0xCA49, 0x249F, +0x1241, 0x405D, 0x26FF, 0x9201, 0xC3C0, 0x9FD4, 0x9109, 0x0824, 0x1000, +0x4DB4, 0x0213, 0x20C1, 0x6A83, 0x56DB, 0x060C, 0x5C85, 0x20D3, 0x0245, +0x5124, 0x26D2, 0x2C89, 0x2E1C, 0x44B0, 0x7251, 0x8A24, 0x6DC9, 0x24D8, +0xA810, 0x6820, 0x28C2, 0xD2C1, 0x4B39, 0x3452, 0x602C, 0xC28B, 0x0124, +0x20EB, 0xF158, 0x4C08, 0x248B, 0x46CE, 0x2C09, 0xA483, 0x3581, 0x4008, +0x26CA, 0x4135, 0x0009, 0x15B4, 0x02DB, 0x032A, 0x2D80, 0x76D3, 0x0140, +0x6C00, 0xB693, 0xA615, 0x5028, 0x369B, 0x002D, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0001, 0x0000, +0x0002, 0x0200, 0x4000, 0x0410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x2000, 0x0040, 0x0020, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x4000, 0x0001, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x2002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0008, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0230, 0x0400, 0x0088, 0x0000, 0x4000, 0x2000, 0x0000, 0x0004, +0x1000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0300, 0x0000, 0x0008, 0x1000, +0x00C0, 0xC04C, 0x0002, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x1018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, +0x000C, 0x0000, 0x0000, 0x0000, 0x00A0, 0x2000, 0x0000, 0x0000, 0x0400, +0x0200, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0104, 0x0001, 0x0000, 0x0000, 0x0008, 0x0000, 0x4000, 0x8048, +0x0040, 0x0010, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x1408, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0004, 0x0000, +0x0000, 0x0400, 0x0000, 0x2100, 0x0000, 0x0000, 0x0400, 0x0200, 0x8000, +0x0000, 0x0610, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x6000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0001, 0x0400, 0x0400, +0x0004, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x2000, 0x0000, 0x1000, 0x0401, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0001, 0x0001, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0420, 0x0108, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0080, 0x000C, 0x0040, 0x0080, 0x0000, +0x0040, 0x0000, 0x0000, 0x8040, 0x0800, 0x0001, 0x0020, 0x0000, 0x2300, +0x0000, 0x1008, 0x0004, 0x0009, 0x8200, 0x0420, 0x804C, 0x0000, 0x0104, +0x0009, 0x0021, 0x0040, 0x0480, 0x0000, 0x0200, 0x8080, 0x0000, 0x0008, +0x2000, 0x0000, 0x9000, 0x0008, 0x0200, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0420, 0x2008, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0080, 0x0008, 0x0040, 0x0080, 0x0100, 0x0040, 0x0000, +0x0000, 0x8040, 0x0800, 0x0001, 0x0020, 0x0000, 0x2001, 0x0000, 0x1008, +0x1004, 0x0009, 0x8200, 0x0420, 0x80C8, 0x0000, 0x0104, 0x0009, 0x0020, +0x0040, 0x0481, 0x0400, 0x0200, 0x0080, 0x0000, 0x0008, 0x2000, 0x0020, +0xB000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0208, 0x0004, 0x0010, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0001, +0x0404, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x1080, 0x0000, 0x0020, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0800, 0x0100, 0x0040, 0x0008, 0x4000, +0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x8800, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x1001, 0x0000, 0x0001, 0x0000, +0x0010, 0x0000, 0x4000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0100, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x4000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0400, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0008, 0x4000, 0x0000, +0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x9000, 0x0000, 0x0000, 0x8008, +0x0020, 0x0000, 0x0040, 0x0020, 0x0800, 0x0000, 0x0200, 0x0000, 0x0000, +0x1004, 0x0000, 0x0000, 0x8140, 0x0004, 0x0000, 0x0000, 0x000C, 0x0000, +0x0000, 0x0040, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8380, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0004, 0x0020, 0x0000, +0x2100, 0x0000, 0x0004, 0x0004, 0x0000, 0x0000, 0x0000, 0x1008, 0x0200, +0x0002, 0x8800, 0x0004, 0x0100, 0x0000, 0x812C, 0x0080, 0x0000, 0x0060, +0x0009, 0x0400, 0x0800, 0x1000, 0x0000, 0x4008, 0x0000, 0x0002, 0x1000, +0x0000, 0x1000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x4020, 0x0800, 0x0000, 0x0120, 0x0004, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0010, 0xA020, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x1020, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0001, 0x0000, 0x4008, 0x0800, 0x0010, 0x0000, 0x0008, 0x0000, +0x4000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0020, +0x0000, 0x8001, 0x0000, 0x0000, 0x1000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x8200, 0x0001, 0x2000, 0x0800, +0x0000, 0x0200, 0x0800, 0x0020, 0x0010, 0x1000, 0x0020, 0x0420, 0x0000, +0x8000, 0x0008, 0x2000, 0x4000, 0x1000, 0x0800, 0x1008, 0x0024, 0x0000, +0x0200, 0x4060, 0x0000, 0x0002, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0080, 0x0800, 0x0000, 0x0000, 0x0000, 0x8001, +0x0000, 0x0400, 0x1000, 0x0004, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x8200, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x1000, 0x0020, 0x0000, 0x0000, 0x8000, 0x0000, +0x2000, 0x0100, 0x0200, 0x0022, 0x1008, 0x0024, 0x0000, 0x0200, 0x0020, +0x0080, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x1000, 0x0008, 0x0000, +0x0000, 0x0002, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x4000, +0x0412, 0x0041, 0x4000, 0x2002, 0x0001, 0x4200, 0x0820, 0x0092, 0x0000, +0x1840, 0x0804, 0x0000, 0x0000, 0x4100, 0x8003, 0x4000, 0x2000, 0x0008, +0x0001, 0x1000, 0x0004, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0094, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0008, +0x0001, 0x0000, 0x4020, 0x0000, 0x0080, 0x0100, 0x4000, 0x0412, 0x0041, +0x4000, 0x2002, 0x0001, 0x0200, 0x0821, 0x0092, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x8001, 0x4000, 0x2000, 0x0008, 0x0001, 0x0000, +0x0400, 0x0000, 0x0800, 0x0000, 0x0000, 0x8000, 0x0090, 0x0000, 0x0000, +0x0080, 0x0000, 0x0002, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0100, 0x0100, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x8110, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x2000, 0x8100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0006, 0x0002, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0480, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0024, 0x0000, 0x0040, 0x0820, 0x0002, +0x0000, 0x0800, 0x4800, 0x0000, 0x4820, 0x4410, 0x0000, 0x0200, 0x0104, +0x0000, 0x1000, 0x0000, 0x0002, 0x0000, 0x4900, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0400, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0001, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0220, 0x0100, 0x0020, 0x0000, 0x4000, 0x2000, 0x4200, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4820, 0x0080, 0x0000, 0x0800, +0x002C, 0x0020, 0x0000, 0x0000, 0x0001, 0x4000, 0x0000, 0x0008, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0420, 0x0000, 0x0000, 0x0011, 0x0000, 0x0040, 0x0000, 0x0000, +0x0001, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0202, 0x0001, +0x0000, 0x0000, 0x0000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4021, 0x0080, 0x0080, 0x0000, 0x2400, 0x0000, +0x0000, 0x0100, 0x0001, 0x4000, 0x1400, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0001, 0x0000, 0x0012, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0001, 0x4000, 0x0010, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0041, 0x0200, 0x0084, 0x0000, 0x0008, 0x0020, 0x0000, +0x0000, 0x0900, 0x0201, 0x0000, 0x0000, 0x0080, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0800, 0x2000, 0x0200, 0x0000, 0x0081, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, 0x0000, 0x1000, +0x0000, 0x0200, 0x0204, 0x0000, 0x5205, 0x0020, 0x0000, 0x0200, 0x0000, +0x1000, 0x0004, 0x0000, 0x0201, 0x0400, 0x0020, 0x0000, 0x0000, 0x2000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0020, 0x2400, 0xB249, 0x4924, 0x2812, +0x9048, 0x4905, 0x6492, 0x9048, 0x6A65, 0x2490, 0x9640, 0x5920, 0x0492, +0x0C81, 0xB089, 0x4C64, 0x4012, 0x9049, 0x080C, 0x0510, 0x804B, 0x4804, +0x0092, 0xC200, 0x0134, 0x2412, 0xE409, 0x9AD1, 0x0304, 0x2000, 0x9409, +0x4149, 0x3802, 0x8848, 0x580D, 0x64B2, 0x9000, 0x8005, 0x0482, 0x0401, +0x9248, 0x4904, 0x0892, 0x92C1, 0x0904, 0x6490, 0x16C0, 0x4A24, 0x2412, +0x1241, 0x5924, 0x2092, 0x2409, 0xB209, 0x4925, 0x2812, 0x9209, 0x4905, +0x609A, 0x9048, 0x4A65, 0x2092, 0x9640, 0x5824, 0x2482, 0x2889, 0xB0C9, +0x4905, 0x4010, 0x9249, 0x480C, 0x0412, 0x924B, 0x0020, 0x2080, 0x9240, +0x0824, 0x0490, 0x6408, 0x92D9, 0x0005, 0x2000, 0x9448, 0x4109, 0x0082, +0x9241, 0x480D, 0x0092, 0x1240, 0x0025, 0x0092, 0x2401, 0x9201, 0x4925, +0x2892, 0x92C1, 0x4104, 0x6490, 0x9689, 0x4A20, 0x2400, 0x1241, 0x5924, +0x2412, 0x0009, 0x0044, 0x0001, 0x0400, 0x0000, 0x0000, 0x0400, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0081, 0x2000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0042, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0122, 0x0001, 0x0000, 0x0024, 0x0000, 0x0000, 0x4904, 0x0492, +0x0000, 0x0000, 0x0490, 0x0000, 0x0220, 0x0000, 0x0401, 0x0400, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4040, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0020, 0x0008, 0x0000, 0x8110, 0x0000, 0x0000, 0x0000, +0x0104, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0500, 0x8000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0100, 0x4002, 0x0000, +0x0400, 0x4000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0xC001, 0x0805, 0x0000, 0x0000, 0x0001, 0x0020, 0x2000, 0x3000, 0x0000, +0x0880, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0200, 0x0000, +0x4000, 0x0000, 0x1000, 0x0400, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0420, 0x0010, 0x0000, 0x0100, 0x0002, 0x0000, 0x0080, 0x0000, +0x0000, 0x0400, 0x0200, 0x0004, 0x0000, 0x0000, 0x2100, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0080, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x4000, 0x0020, +0x0001, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x8804, 0x0000, +0x0000, 0x0820, 0x0002, 0x0000, 0x0800, 0x0000, 0x0000, 0x4000, 0x0010, +0x0000, 0x8000, 0x4008, 0x0000, 0x0000, 0x4120, 0x0000, 0x0000, 0x5004, +0x0000, 0x0000, 0x4100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0001, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0800, 0x0002, 0x0000, 0x1000, +0x0004, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0D00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x9249, +0x0924, 0x2812, 0x9249, 0x4905, 0x7492, 0xB249, 0x4A20, 0x2492, 0xB241, +0x5824, 0x2492, 0x2485, 0x9249, 0x4020, 0x2002, 0x9249, 0x0907, 0x24B2, +0x904B, 0x0824, 0x2096, 0x9251, 0x4924, 0x2412, 0x2C09, 0x9249, 0x4924, +0x2092, 0x9249, 0x490D, 0x2490, 0x9249, 0x0824, 0x2492, 0x12C1, 0x4025, +0x2492, 0x2409, 0x9648, 0x4924, 0x2892, 0x9269, 0x4904, 0x6432, 0xB649, +0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2409, 0x904D, 0x4924, 0x2802, +0xD309, 0x4905, 0x6092, 0xB049, 0x4A20, 0x2492, 0xB241, 0x5824, 0xA492, +0x2489, 0x1241, 0x0124, 0x2010, 0x9209, 0x4905, 0x2410, 0x524B, 0x4024, +0x2080, 0x8210, 0x4924, 0x2010, 0x2C09, 0x9A41, 0x0120, 0xA012, 0xDA69, +0x090D, 0x2480, 0xC249, 0x4824, 0x2482, 0xDAC1, 0x0D35, 0x0412, 0x2409, +0x9609, 0x4924, 0x2892, 0x9248, 0x4804, 0x6492, 0xB649, 0x4A24, 0x2690, +0x9241, 0x1924, 0x2492, 0x0009, 0x0000, 0x2000, 0x0400, 0x0000, 0x0400, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0004, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x4C06, 0xF6F9, 0x037D, 0x2C48, 0x96D1, 0x5E6C, 0x1888, +0x9484, 0x8B2D, 0x4086, 0x9148, 0xDBFD, 0x5E72, 0x2400, 0xB6C8, 0x536D, +0x6410, 0xB7C3, 0x1B7D, 0x01B2, 0xAC0A, 0xDA6D, 0x0842, 0x00C6, 0xCB6C, +0xC936, 0xA69B, 0x9AF8, 0x0157, 0x8490, 0x34C1, 0x185D, 0xA70C, 0x94CD, +0xCC77, 0x2013, 0x8044, 0x8A6D, 0x0127, 0x0334, 0xB6D9, 0x5365, 0x0100, +0xB6D0, 0x5B6D, 0x0000, 0xB41B, 0xDF6D, 0x4006, 0x9088, 0x9B6D, 0xB676, +0x8768, 0x8048, 0xB822, 0x5324, 0xB047, 0x0801, 0x4125, 0x3032, 0x3144, +0x9B68, 0x9CB2, 0x0824, 0x8014, 0xC96C, 0x8210, 0xE120, 0x1F6C, 0x9204, +0x2924, 0xDA07, 0x0090, 0x0824, 0xC320, 0x0510, 0x1127, 0x3E12, 0x4DA6, +0x3440, 0xB208, 0x4F25, 0x0106, 0x0A04, 0x4C61, 0xA053, 0x522C, 0x4B20, +0x8CF2, 0x3814, 0xB602, 0xC848, 0x0940, 0xA928, 0xDA65, 0x4246, 0x0924, +0xC92C, 0x90A5, 0x0002, 0x8B2A, 0x1D36, 0x0814, 0x0312, 0x3020, 0x0407, +0x5082, 0x045A, 0x493A, 0xA242, 0x2516, 0x4848, 0x24B9, 0x0139, 0x6643, +0x9400, 0xC588, 0x42B2, 0x4C85, 0x0042, 0x09B2, 0x0809, 0x2202, 0x0C90, +0x2040, 0x1491, 0x64D1, 0x4E09, 0xA492, 0x100C, 0xA018, 0x0001, 0x0061, +0x909A, 0x0981, 0x2081, 0xA23A, 0x4C0C, 0x8041, 0x21E0, 0x020D, 0x2612, +0x590C, 0x6C92, 0x0923, 0xC092, 0x4882, 0x483B, 0xA4D2, 0x2032, 0x4CC0, +0x00D2, 0x0589, 0x4642, 0x0493, 0x0009, 0x1508, 0x0D07, 0x0892, 0x0000, +0x6D20, 0xA693, 0x1008, 0x6902, 0x35DB, 0x8201, 0x5020, 0x3402, 0x008D, +0x0200, 0x4DBD, 0x40D2, 0x0040, 0x5900, 0x2692, 0x0002, 0x6810, 0xB493, +0x0201, 0x4810, 0xB4D3, 0x0A09, 0x0400, 0x6D25, 0x12DB, 0x1404, 0x6904, +0x2693, 0x0000, 0x6801, 0xB6D8, 0x0001, 0x4040, 0x36D3, 0x040D, 0x0000, +0x4927, 0x08DA, 0x1200, 0x4920, 0xA492, 0x0000, 0x4D00, 0x65FA, 0x8001, +0x5120, 0x2493, 0x3F09, 0xEA71, 0x60B0, 0x7369, 0x927D, 0x0097, 0x1048, +0xEB77, 0x06E0, 0x8200, 0x7D72, 0x3C17, 0x82D9, 0xA220, 0xD9FF, 0x2040, +0xB209, 0xDFAD, 0x2486, 0x1149, 0x9F69, 0x0466, 0x0248, 0xDD00, 0x07A3, +0x020C, 0x3424, 0x50E7, 0x0098, 0x2000, 0x034B, 0x1482, 0x1048, 0x1DF3, +0x04F2, 0x0003, 0x93E0, 0x09A2, 0x8008, 0x3A20, 0xFDED, 0x2490, 0xB201, +0xC94B, 0x24DE, 0x1249, 0xFA7D, 0x22F7, 0x9201, 0x53E0, 0x1EC6, 0x9348, +0x4824, 0x0093, 0x29D5, 0x02CF, 0xE081, 0x4D80, 0x709A, 0x92C8, 0x4C15, +0xA692, 0x2485, 0x510C, 0x264B, 0x28A9, 0x3401, 0x6925, 0x02BB, 0xA001, +0x6C80, 0x34CB, 0x604C, 0x442D, 0xA6DA, 0x1021, 0x4064, 0x26DA, 0x4129, +0x1A41, 0x4194, 0xC080, 0x6860, 0x6D08, 0x35CA, 0x5080, 0x4820, 0x2080, +0xD410, 0x4510, 0xE4DB, 0x0028, 0x1201, 0x6DB5, 0x02D3, 0x2418, 0x6D80, +0x769B, 0x16C1, 0x6808, 0xBA9B, 0x3055, 0x5019, 0xB6DA, 0x002F, 0x0082, +0x0000, 0x0000, 0x0000, 0x0004, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0240, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0440, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4040, 0x0000, 0x0480, 0x0200, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0030, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x8200, 0x0000, 0x0080, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0088, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0001, 0x0008, 0x0000, 0x0008, 0x0411, 0x0000, 0x0028, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, +0x0000, 0x0000, 0x0000, 0x0440, 0x0000, 0x0000, 0x0008, 0x0020, 0x0200, +0x0000, 0x4000, 0x0000, 0x0000, 0x1008, 0x0004, 0x00A0, 0x0040, 0x0000, +0x0000, 0x0050, 0x0000, 0x1000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0249, 0x0200, 0x0000, 0x0000, 0x0004, 0x0000, 0x0800, +0x0400, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0420, 0x0000, 0x0000, 0x2000, 0x0002, 0x2400, 0x0000, 0x0400, +0x0000, 0x0040, 0x0000, 0x0000, 0x4008, 0x0020, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x3008, 0x0000, 0x0000, 0x0040, 0x1000, 0x0000, 0x04C0, +0x0000, 0x0000, 0x4080, 0x0400, 0x0040, 0x0000, 0x0040, 0x0000, 0x0000, +0x0249, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0401, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4400, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0840, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0080, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x1008, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2240, 0x1000, 0x0000, 0x0000, +0x0000, 0x0041, 0x0080, 0x0009, 0x0000, 0x0400, 0x0001, 0x0000, 0x2000, +0x000A, 0x1000, 0x0020, 0x8000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0080, 0x0010, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x1000, 0x0400, +0x0000, 0x0000, 0x0008, 0x0000, 0x0100, 0x2001, 0x0040, 0x0000, 0x8000, +0x0000, 0x8000, 0x8021, 0x0000, 0x0000, 0x0000, 0x0040, 0x0240, 0x0000, +0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0041, +0x0081, 0x0409, 0x0000, 0x0400, 0x0001, 0x0000, 0x2000, 0x0008, 0x1000, +0x0020, 0x8000, 0x0000, 0x0000, 0x0011, 0x0000, 0x0000, 0x0080, 0x0800, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x1000, 0x0400, 0x0000, 0x0001, +0x0008, 0x0000, 0x0000, 0x0001, 0x0040, 0x0000, 0x8800, 0x0000, 0x0000, +0x8001, 0x0008, 0x0000, 0x0001, 0x0440, 0x0240, 0x0000, 0x0009, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0008, 0x0000, 0x0100, 0x0401, 0x0400, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0A00, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0001, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0080, +0x4000, 0x0000, 0x0010, 0x0000, 0x0002, 0x0004, 0x0001, 0x1100, 0x0004, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x0000, 0x0040, 0x0100, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x0020, 0x0000, 0x0020, 0x0000, +0x2000, 0x2000, 0x0000, 0x0000, 0x0040, 0x0400, 0x0000, 0x0040, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0100, 0x0020, 0x0000, 0x0001, +0x0000, 0x0040, 0x2080, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1000, 0x0040, 0x1000, +0x0000, 0x2020, 0x9000, 0x0120, 0x0000, 0x0000, 0x0020, 0x4000, 0x2004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0040, +0x0000, 0x0020, 0x0220, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0040, 0x0001, 0x0400, 0x1024, 0x0000, 0x0000, 0x0000, 0x8002, 0x0000, +0x2000, 0x0000, 0x0000, 0x0002, 0x1000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0802, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0008, 0x0000, 0x0000, 0x0242, 0x4801, +0x0400, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x2000, 0x0080, +0x0010, 0x0000, 0x0004, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x8000, 0x0200, 0x0000, 0x0000, 0x0001, 0x4000, +0x0000, 0x0000, 0x0004, 0x0040, 0x1000, 0x0100, 0x1000, 0x0000, 0x0000, +0x0000, 0x0100, 0x8000, 0x0400, 0x0000, 0x4040, 0x0000, 0x0000, 0x0002, +0x0004, 0x0000, 0x0008, 0x0000, 0x0000, 0x0002, 0x4200, 0x8020, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0008, 0x2000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0400, 0x8100, 0x0000, 0x4400, 0x0020, 0x0000, 0x1000, 0x0100, +0x0002, 0x0000, 0x4020, 0x0200, 0x0000, 0x0040, 0x4100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, +0x0009, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0500, 0x0000, +0x8008, 0x0000, 0x1002, 0x0200, 0x4040, 0x0000, 0x0020, 0x0800, 0x0000, +0x8000, 0x0002, 0x0000, 0x8000, 0x0000, 0x0080, 0x0000, 0x0000, 0x2040, +0x2000, 0x4008, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0011, 0x0000, 0x1800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x9000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x4800, 0x0400, 0x0000, 0x0000, 0x0800, 0x8000, 0x0000, +0x0120, 0x8000, 0x0080, 0x0010, 0x0000, 0x0000, 0x0000, 0x2000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0010, 0x0000, 0x4000, 0x0000, +0x0040, 0x0040, 0x0004, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0400, 0x0020, 0x4000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0041, 0x0000, 0x0090, 0x0200, 0x4000, 0x3002, 0x4002, +0x0000, 0x0020, 0x0000, 0x0400, 0x0040, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x4000, 0x0120, 0x0040, 0x0800, 0x2100, 0x0001, 0x0100, 0x0100, +0x0000, 0x0000, 0x0100, 0x0010, 0x0004, 0x0800, 0x0020, 0x4410, 0x0000, +0x0084, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x00A0, 0x0000, 0x0000, 0x0000, 0x0400, +0x0045, 0x0000, 0x0090, 0x0200, 0x4002, 0x2002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x4000, +0x0000, 0x0040, 0x0800, 0x2000, 0x0001, 0x0000, 0x0100, 0x0000, 0x0000, +0x0100, 0x0010, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0004, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0080, 0x8000, 0x0000, 0x0000, 0x0000, 0x4040, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0410, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0020, 0x8000, 0x0004, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0100, 0x0000, 0x0020, 0x0000, 0x0008, 0x0000, 0x0002, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4800, 0x0000, 0x8200, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0018, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0200, 0x0000, 0x0000, 0x0400, 0x3000, 0x0000, 0x0000, +0x0006, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0812, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0102, 0x0000, 0x0000, 0x0000, 0x0221, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0089, 0x8000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0200, 0x0000, 0x0000, 0xC000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0001, 0x0000, 0x4000, 0x0000, +0x0091, 0x1000, 0x0010, 0x0000, 0x0200, 0x0000, 0x0400, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0001, 0x0400, 0x4401, 0x0000, 0x0000, +0x0000, 0x0000, 0x1001, 0x2480, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0040, 0x0000, 0x8000, 0x0040, 0x0000, 0x2000, 0x8000, 0x0000, 0x0004, +0x0000, 0x0400, 0x0000, 0x2000, 0x0001, 0x0000, 0x0400, 0x0000, 0x0000, +0x2000, 0x0000, 0x0040, 0x0000, 0x0240, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0080, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x4010, 0x0000, 0x0400, 0x0081, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0209, 0x0000, 0x0000, +0x2080, 0x0000, 0x0000, 0x0000, 0x0100, 0x0110, 0x8084, 0x0000, 0x0000, +0x0000, 0x0041, 0x1000, 0x0004, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0200, 0x0800, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0C00, 0x9019, +0x4924, 0x2890, 0x9298, 0x0901, 0x6418, 0xA041, 0x4A24, 0x2010, 0x9241, +0x514C, 0x2492, 0x2089, 0x9249, 0x4924, 0x4092, 0x9240, 0x4904, 0x3492, +0x8649, 0x483D, 0x2492, 0x9C51, 0x0120, 0x2482, 0x2429, 0x9059, 0x4825, +0x2092, 0x9009, 0x0900, 0x2492, 0x824B, 0x6004, 0x2412, 0x8201, 0x4914, +0x24B2, 0x0409, 0x824B, 0x4924, 0x2892, 0x8019, 0x4905, 0x6492, 0x0109, +0x4A26, 0x2492, 0x9041, 0x5824, 0x3132, 0x2C09, 0x9259, 0x0905, 0x2892, +0x9298, 0x0901, 0x6000, 0xB249, 0x0A20, 0x0410, 0x9241, 0x596C, 0x0492, +0x2488, 0x9241, 0x4925, 0x6092, 0x1248, 0x4804, 0x2482, 0x9609, 0x082D, +0x0282, 0x9411, 0x0920, 0x0483, 0x200C, 0x9259, 0x0824, 0x2092, 0x9249, +0x4804, 0x2482, 0x924B, 0x4004, 0x2492, 0x9201, 0x4004, 0x2412, 0x0429, +0x924B, 0x4521, 0x2892, 0x8259, 0x0905, 0x6092, 0x1049, 0x4A24, 0x2492, +0x9241, 0x5924, 0x3412, 0x0009, 0x0000, 0x0001, 0x0400, 0x0000, 0x0006, +0x0010, 0x0084, 0x4080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x1000, 0x0005, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0040, +0x0040, 0x0200, 0x0020, 0x0000, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x2000, 0x0000, 0x0000, 0x0102, 0x0000, 0x0001, +0x0400, 0x0120, 0x0000, 0x0408, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x4000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0B00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0004, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0002, 0x0100, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0400, 0x0000, 0x0000, 0x2200, 0x0000, 0x0000, 0x0000, +0x2100, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0011, 0x1000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0009, 0x0000, 0x0000, 0x0000, 0x0804, 0x0020, +0x0400, 0x0000, 0x0000, 0x0080, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x4000, 0x0000, 0x0008, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0220, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0009, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x8000, 0x0000, 0x0000, 0x8400, 0x8000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0020, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0020, 0x0008, 0x8000, 0x00A0, 0x0008, 0x4000, 0x0020, 0x0000, 0x0020, +0x4108, 0x0000, 0x0124, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0900, +0x1000, 0x8100, 0x0040, 0x0080, 0x0004, 0x8000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2400, 0x9649, 0x5824, 0x2802, 0xD249, 0x4904, 0x4406, 0x9249, 0x4A24, +0x2092, 0x92C1, 0x5924, 0x2482, 0x64A9, 0x9249, 0x4924, 0x6092, 0x9643, +0x4004, 0x2442, 0xD641, 0x0824, 0x2492, 0x9241, 0x4944, 0x2482, 0x2409, +0xB249, 0x4925, 0x6092, 0x9849, 0x4904, 0x2492, 0x924B, 0x48A4, 0x2492, +0x9201, 0x4134, 0x2492, 0xA42D, 0x92CB, 0x4924, 0x2890, 0x9249, 0x4904, +0x6492, 0x9209, 0x4A24, 0x2492, 0x8241, 0x5924, 0x0492, 0x0409, 0x9649, +0x4904, 0x2890, 0x1200, 0x4906, 0x6482, 0x0249, 0x4A24, 0x2480, 0x12C1, +0x5900, 0x2402, 0x7688, 0x9249, 0x4924, 0x5092, 0x964B, 0x4004, 0x2682, +0x966D, 0x4804, 0x2412, 0x9A41, 0x4964, 0x2492, 0x2409, 0xB249, 0x4920, +0x6092, 0x9249, 0x4804, 0x2492, 0x924B, 0x4824, 0x2492, 0x9241, 0x4924, +0x2492, 0x2409, 0x92C3, 0x4924, 0x2892, 0x9249, 0x4904, 0x6412, 0x9249, +0x4A24, 0x2492, 0x9A41, 0x5936, 0x2492, 0x0009, 0x0000, 0x0020, 0x0402, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1000, +0x0001, 0x0000, 0x2000, 0x0200, 0x0000, 0x2100, 0x0210, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x1800, 0x6002, 0xB6D8, 0x03E9, 0x50B0, 0xB6D0, +0x53AD, 0x4984, 0xB4A1, 0x5B6D, 0x690E, 0x9478, 0x7B6D, 0x8176, 0x2A87, +0x3294, 0xE367, 0x0687, 0xBB0B, 0x3B45, 0xAC83, 0x2043, 0xDD6F, 0x22F0, +0xCA01, 0x9F46, 0x4D16, 0x30D1, 0xABCC, 0x03AC, 0x00D0, 0xA681, 0x176E, +0x22C3, 0xB82A, 0x3BC6, 0xA402, 0x0558, 0xD1CD, 0x1530, 0x0AC1, 0xB2C9, +0x1364, 0x2100, 0xB6D1, 0x5B6D, 0x6592, 0xBE01, 0xDFEF, 0x001E, 0x10C1, +0x934D, 0xA676, 0xA96C, 0x5108, 0xB020, 0x0B05, 0x0242, 0xA040, 0x8221, +0x8016, 0xE004, 0x8260, 0x918E, 0xC830, 0x1308, 0x51A0, 0x1500, 0x5118, +0xC92A, 0x8488, 0x080C, 0x51AC, 0x4491, 0x4304, 0xD990, 0x84B3, 0x2909, +0xF330, 0x6B2C, 0x8618, 0xB075, 0x4BA4, 0x0107, 0x2025, 0x69AE, 0x8498, +0x810D, 0x6B21, 0x00A6, 0x0206, 0x8204, 0xC124, 0x8D18, 0x8929, 0x5865, +0x4246, 0x8832, 0x38AE, 0x10B7, 0x6800, 0x4B62, 0x1C12, 0x0114, 0x0B10, +0x0412, 0x4107, 0x581A, 0x0402, 0x0939, 0x2411, 0x2062, 0x6871, 0x2098, +0x2031, 0x6263, 0x0652, 0x6888, 0x0011, 0x6131, 0x2010, 0x0391, 0x4000, +0x1081, 0x8513, 0x500C, 0xA008, 0x0640, 0x0200, 0x3210, 0x0605, 0x94F0, +0x0001, 0x4010, 0x0452, 0x2B08, 0x22D0, 0x4571, 0x6064, 0x0650, 0x8191, +0x4941, 0x0402, 0x0D08, 0x6611, 0x69A3, 0xC090, 0x0080, 0x49BB, 0x201A, +0x0014, 0x04C0, 0x2204, 0x2499, 0x0600, 0x2092, 0x000C, 0xB008, 0x4D27, +0x08DA, 0x0220, 0x6920, 0x2653, 0x0840, 0x6904, 0xA493, 0x0049, 0x5008, +0xA4D2, 0x2189, 0x1000, 0x6D35, 0x429B, 0x8002, 0x4D88, 0x349B, 0x0880, +0x4C05, 0xA6BA, 0x0081, 0x4000, 0x349B, 0x412D, 0xA000, 0x4535, 0x81D3, +0x0000, 0x6D00, 0x26D3, 0x2282, 0x4C0C, 0xA6DB, 0x2001, 0x4800, 0x26D3, +0x000D, 0x1000, 0x6DB7, 0x00DB, 0x1041, 0x49A0, 0x269E, 0x1080, 0x4D04, +0x2E9A, 0x0201, 0x5100, 0xB492, 0x3709, 0x0A65, 0x2090, 0xB321, 0xE84B, +0x0495, 0x1088, 0xF32F, 0x0610, 0x124C, 0xDB30, 0x3D36, 0x1209, 0x8434, +0xC8DC, 0x0080, 0x8140, 0x1178, 0xA006, 0x0240, 0x5348, 0x2032, 0x1841, +0xD030, 0x85A7, 0x8244, 0xA200, 0x4B2A, 0x2880, 0x2208, 0x9F8B, 0x0085, +0x1008, 0xD138, 0x2002, 0x1000, 0x5350, 0x0035, 0x9008, 0x3A30, 0xE92C, +0x8040, 0xF200, 0xCB08, 0x341E, 0x1041, 0xA26F, 0x20F3, 0x9041, 0xD140, +0x1E24, 0x0249, 0x4024, 0x1381, 0x7DB4, 0x0253, 0xB0D8, 0x6D86, 0x761A, +0x1498, 0x4C08, 0x36D3, 0x1485, 0x5800, 0x54BB, 0x16AD, 0xA66A, 0x4BA1, +0x12D1, 0x3C40, 0x6205, 0x06D2, 0x2264, 0xE8E0, 0x30D1, 0x2801, 0x095C, +0xA0D0, 0x080B, 0x0007, 0x72A0, 0x121E, 0xB00D, 0x4D82, 0x31B8, 0x9A00, +0x4011, 0x1410, 0x1C61, 0x428A, 0xB45B, 0x6029, 0x10CA, 0x5924, 0x22D2, +0xA61A, 0x6D00, 0x76D3, 0x8641, 0x6008, 0xB059, 0x9825, 0x517F, 0xB6DF, +0x0029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0800, 0x0200, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0080, 0x0400, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x2000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0101, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0002, 0x0400, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1200, 0x0000, 0x0001, 0x1000, 0x0000, 0x0000, 0x2000, 0x0024, 0x0800, +0x0000, 0x0A00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0800, 0x0010, 0x0400, 0x0000, 0x0082, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0012, +0x0820, 0x0012, 0x0000, 0x8000, 0x0400, 0x0001, 0x8002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x8000, 0x0000, +0x0000, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x8000, 0x0401, 0x0000, 0x0000, 0x2001, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0001, 0x2000, 0x0000, 0x1008, +0x0004, 0x0000, 0x4000, 0x8041, 0x0000, 0x0080, 0x0200, 0x0000, 0x0000, +0x0440, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0004, 0x0440, 0x0000, +0x0000, 0x0008, 0x0000, 0x0600, 0x0400, 0x0008, 0x1000, 0x1040, 0x0060, +0x0000, 0x4000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0200, 0x0000, 0x0A00, 0x0000, 0x0000, 0x0000, 0x0000, +0x1200, 0x0040, 0x0000, 0x0001, 0x0000, 0x0000, 0x1008, 0x0004, 0x1040, +0x0000, 0x2043, 0x0000, 0x0080, 0x0200, 0x0040, 0x0000, 0x2040, 0x0000, +0x0000, 0x0000, 0x0400, 0x0040, 0x0000, 0x0040, 0x0000, 0x0000, 0x000A, +0x0001, 0x0400, 0x0000, 0x0008, 0x0004, 0x1040, 0x0060, 0x0400, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x4010, 0x0000, +0x0000, 0x0000, 0x1000, 0x0200, 0x0000, 0x8000, 0x0000, 0x0000, 0x0400, +0x0004, 0x0040, 0x0000, 0x0400, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0800, 0x0000, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0200, 0x0000, 0x0040, 0x0001, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0020, 0x0002, 0x0000, 0x0004, 0x0040, 0x0400, 0x0000, +0x1000, 0x0200, 0x1001, 0x8000, 0x0000, 0x0000, 0x0020, 0x8008, 0x2000, +0x2008, 0x2000, 0x0000, 0x0000, 0x0008, 0x0000, 0x1080, 0x0000, 0x0000, +0x0200, 0x0000, 0x0080, 0x0010, 0x0041, 0x1000, 0x0200, 0x1002, 0x1000, +0x0000, 0x8101, 0x0000, 0x0000, 0x0400, 0x0004, 0x0000, 0x0010, 0x0003, +0x1000, 0x0080, 0x0000, 0x1000, 0x0004, 0x0204, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0005, 0x0400, 0x0040, 0x0400, 0x0000, 0x1000, 0x0200, +0x1001, 0x8000, 0x0000, 0x0010, 0x00A0, 0x8008, 0x2000, 0x2008, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x1000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0111, 0x0041, 0x1000, 0x0040, 0x1000, 0x1000, 0x0000, 0x8001, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0011, 0x0401, 0x1000, 0x0081, +0x0000, 0x1000, 0x0004, 0x0200, 0x8010, 0x0000, 0x0000, 0x8000, 0x0000, +0x0001, 0x0508, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x9100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0820, 0x0100, 0x0000, 0x0001, 0x0000, 0x0800, 0x0001, +0x0000, 0x4000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0400, +0x0000, 0x8200, 0x0000, 0x0001, 0x0400, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0400, 0x4000, 0x0080, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0011, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0208, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x8041, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x1000, 0x0040, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0004, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x8000, 0x0000, 0x0001, +0x1000, 0x0000, 0x0002, 0x0000, 0x0100, 0x0000, 0x8000, 0x0001, 0x0020, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0080, 0x0000, 0x0010, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x8041, 0x0400, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x8000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0001, 0x0400, 0x0044, 0x0000, 0x0000, 0x0000, 0x0280, 0x0006, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x4000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0801, 0x0000, 0x1000, 0x3000, 0x0000, 0x1000, 0x1800, 0x0000, 0x0002, +0x0000, 0x0000, 0x0010, 0x0800, 0x0001, 0x0400, 0x0800, 0x0800, 0x8000, +0x0000, 0x0000, 0x0080, 0x9000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0200, +0x0100, 0x0800, 0x0040, 0x0040, 0x0000, 0x0000, 0x1008, 0x0800, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x1002, 0x0000, 0x2000, 0x0320, 0x0000, +0x0080, 0x0800, 0x0000, 0x0082, 0x0000, 0x0000, 0x0000, 0x8010, 0x1000, +0x0000, 0x9000, 0x0008, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x4809, +0x0002, 0x0000, 0x0008, 0x0000, 0x0000, 0x9000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0008, 0x0080, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0100, 0x0000, 0x0900, 0x0100, 0x2000, +0x2000, 0x0008, 0x2002, 0x0009, 0x0000, 0x0800, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0010, 0x4000, 0x0000, 0x0002, +0x0000, 0x1004, 0x0090, 0x4020, 0x0000, 0x0002, 0x0000, 0x4000, 0x0024, +0x0000, 0x0000, 0x0002, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x1008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0520, 0x0800, 0x0000, 0x0000, +0x0000, 0x0004, 0x0002, 0x0000, 0x0900, 0x4000, 0x2000, 0x0004, 0x0000, +0x6041, 0x0009, 0x0000, 0x0000, 0x0008, 0x0010, 0x0000, 0x0000, 0x0002, +0x0000, 0x0008, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0800, 0x4000, 0x0000, 0x0080, 0x0001, 0x0000, 0x0800, 0x0000, 0x0400, +0x0000, 0x1800, 0x0000, 0x0000, 0x1000, 0x0080, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0002, 0x9000, 0x2080, 0x0000, 0x0000, +0x2080, 0x0002, 0x0000, 0x0000, 0x0080, 0x0040, 0x4008, 0x0000, 0x0010, +0x0040, 0x0010, 0x8000, 0x2000, 0x0410, 0x0001, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x4000, 0x0010, 0x1000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x6000, 0x0000, 0x0000, 0x4080, 0x0000, 0x0800, +0x0004, 0x0400, 0x0000, 0x0000, 0x2080, 0x0000, 0x0000, 0x2080, 0x0000, +0x0000, 0x0000, 0x0080, 0x0040, 0x4000, 0x0000, 0x0000, 0x0040, 0x0010, +0x8000, 0x0010, 0x1410, 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0100, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0001, 0x0000, 0x0100, 0x0000, +0x0000, 0x4820, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0400, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0004, 0x0000, 0x0800, 0x0000, 0x0000, 0x8000, 0x0410, +0x0000, 0x0004, 0x0000, 0x9000, 0x0041, 0x0000, 0x0400, 0x0000, 0x0000, +0x2000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x3004, 0x4000, 0x0000, 0x0004, 0x0001, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x1000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0040, 0x0000, 0x0400, 0x2000, 0x0000, 0x2000, 0x0000, +0x0080, 0x0000, 0x8000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x2000, 0x0000, 0x0000, 0x4000, 0x0000, 0x8000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0043, 0x0000, 0x0000, 0x1040, 0x0000, 0x0100, +0x0000, 0x0000, 0x0040, 0x0000, 0x0008, 0x0000, 0x0000, 0x0014, 0x0000, +0x0000, 0x0000, 0x8040, 0x0001, 0x0100, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0020, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4201, 0x0000, 0x0008, 0x1080, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0100, 0x0002, 0x0010, 0x0000, +0x2000, 0x0000, 0x0100, 0x0480, 0x0040, 0x0000, 0x0080, 0x4000, 0x0200, +0x8000, 0x0100, 0x0001, 0x0040, 0x0000, 0x1000, 0x0084, 0x0000, 0x0000, +0x0200, 0x4000, 0x0000, 0x2800, 0x0002, 0x0004, 0x0400, 0x0400, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0xA000, 0x1000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2200, 0x0000, 0x8000, +0x0048, 0x0000, 0x0000, 0x0200, 0x0002, 0x0008, 0x0000, 0x0000, 0x0000, +0x1002, 0x0408, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0800, 0x0001, 0x0210, 0x0000, 0x0000, 0x0000, +0x0100, 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x1041, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0001, 0x0004, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0140, 0x0000, 0x0000, 0x0001, 0x0000, +0x0010, 0x1000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0080, 0x0000, +0x2400, 0x9209, 0x0925, 0x2482, 0xD208, 0x4904, 0x4290, 0x8289, 0x4A60, +0x2C92, 0x1241, 0x5124, 0x2412, 0x3499, 0x9041, 0x4905, 0x20B2, 0x1249, +0x4B00, 0x2493, 0x9209, 0x0820, 0x2482, 0x1050, 0x0828, 0x2480, 0x2029, +0x8219, 0x0925, 0x0092, 0x1249, 0xC900, 0x2492, 0x8209, 0x4804, 0x2492, +0x9241, 0x4824, 0x04B2, 0x2009, 0x8209, 0x0925, 0x0C82, 0xB0CB, 0x0904, +0x6490, 0x1648, 0x4825, 0x2592, 0x8241, 0x4129, 0x4492, 0x2409, 0x1208, +0x4920, 0x2892, 0x9249, 0x4904, 0x4412, 0x02C9, 0x4A64, 0x0410, 0x0240, +0x5824, 0x2492, 0x2409, 0x9249, 0x0924, 0x2092, 0x9240, 0x4D04, 0x2482, +0x8241, 0x4824, 0x2282, 0x9010, 0x092C, 0x0492, 0x2009, 0x8259, 0x0924, +0x0002, 0x9249, 0x4904, 0x2492, 0x8248, 0x4824, 0x2492, 0x9241, 0x0924, +0x2C82, 0x2409, 0x1249, 0x4D24, 0x2892, 0xB2CB, 0x4104, 0x6410, 0x9649, +0x4A25, 0x008A, 0x9241, 0x5929, 0x0012, 0x0009, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0001, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x2400, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2000, 0x0600, 0x0000, 0x0000, +0x2004, 0x0000, 0x0000, 0x0808, 0x0000, 0x0000, 0x8000, 0x0028, 0x0000, +0x4004, 0x0000, 0x0000, 0x00C0, 0x0000, 0x0020, 0x0000, 0x0100, 0x0000, +0x0000, 0x0800, 0x0000, 0x0000, 0x4004, 0x0100, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, +0x0400, 0x0000, 0x2000, 0x4040, 0x0004, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0001, 0x0800, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0800, 0x0010, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x1004, 0x0002, 0x1000, 0x0482, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x4010, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0800, 0x0600, +0x0000, 0x0100, 0x1000, 0x0042, 0x0000, 0x0000, 0x0000, 0x5000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0001, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0800, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0100, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0048, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0C90, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x6080, 0x0000, 0x0000, 0x0000, 0x0800, +0x0104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0202, 0x0000, 0x1000, 0x0000, +0x8080, 0x8000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0020, 0x0100, 0x8000, +0x0120, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0108, 0x0010, 0x0104, +0x0000, 0x0400, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x4000, 0x2400, 0x92D9, 0x4904, 0x2002, 0x9251, 0x4804, 0x44D2, +0xA2C9, 0x4A64, 0x0412, 0x9041, 0x5924, 0x0492, 0x2480, 0x1249, 0x0920, +0x4092, 0x934B, 0x4904, 0x2090, 0x8249, 0x0824, 0x2492, 0x0240, 0x4D24, +0x2012, 0x2400, 0x1250, 0x0920, 0x209A, 0x9248, 0xC904, 0x2492, 0x9048, +0x482C, 0x2492, 0x9241, 0x4904, 0x2492, 0x2409, 0x9249, 0x0920, 0x2092, +0x1049, 0x4904, 0x2492, 0x8269, 0x4A24, 0x2492, 0x9041, 0x5924, 0x2492, +0x2409, 0x92D8, 0x0925, 0x2892, 0x9259, 0x4904, 0x4492, 0xB0C9, 0x4A64, +0x2592, 0x8241, 0x5924, 0x2480, 0x24A8, 0x9249, 0x4920, 0x6092, 0x924B, +0x4904, 0x2492, 0x9249, 0x4824, 0x2012, 0x9241, 0x4924, 0x2082, 0x240C, +0x9259, 0x4825, 0x2092, 0x8249, 0x4904, 0x2412, 0x9249, 0x482C, 0x2492, +0x9241, 0x4924, 0x2402, 0x2408, 0x9209, 0x4924, 0x2892, 0x9249, 0x4004, +0x6492, 0x9249, 0x4824, 0x2412, 0x8241, 0x5924, 0x0480, 0x0009, 0x0000, +0x0000, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x1000, +0x0000, 0x0200, 0x0001, 0x0000, 0x0404, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0001, 0x0000, 0x0000, 0x0408, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x2010, 0x0800, 0x6110, 0xB4D8, 0x134D, +0xA328, 0x96D0, 0x5965, 0x2902, 0xB4C9, 0xDB6D, 0x442E, 0x9652, 0xDF7D, +0x6877, 0x6010, 0xB418, 0x0369, 0x5889, 0x92C9, 0x1B2D, 0x0416, 0xF45A, +0xDB6D, 0x0492, 0x8608, 0xFB7B, 0x4C36, 0x85DA, 0xDDE8, 0x415C, 0xA49A, +0x04CA, 0x1879, 0x365A, 0x9C4E, 0xCAB4, 0x2403, 0x004D, 0xC27D, 0x7027, +0x1D18, 0x9470, 0x232D, 0x0D0E, 0x9750, 0x5B6D, 0x4D08, 0xD40B, 0xFB7D, +0x045E, 0xD001, 0xDA7C, 0xB274, 0x082D, 0x0040, 0xA910, 0x5845, 0x3202, +0x0A1C, 0xC265, 0x8012, 0x4800, 0x1F40, 0x99C0, 0x4820, 0x9210, 0x9B24, +0x008C, 0x9000, 0x8364, 0xBE06, 0x0844, 0xCB30, 0x0084, 0x00A6, 0x5DE2, +0x81BE, 0x0100, 0xFA00, 0x4E37, 0x2058, 0xB205, 0x4F65, 0x2044, 0x0600, +0xED27, 0x20F0, 0x1869, 0x5F62, 0x04D2, 0x1020, 0x8602, 0xC064, 0xA980, +0x9940, 0x5021, 0x20C6, 0x8906, 0x8425, 0xA0B8, 0x4102, 0x5D32, 0x9DB2, +0x4881, 0x5911, 0x2080, 0x0907, 0x025A, 0x0616, 0x4939, 0xB412, 0x24A0, +0x6054, 0x8012, 0x0888, 0x6204, 0xA282, 0x6180, 0x0013, 0x2815, 0x4252, +0x103B, 0x4980, 0x1090, 0x0503, 0x2001, 0x84C3, 0x2210, 0x0000, 0x0480, +0x1305, 0x8048, 0x0085, 0x10C0, 0xA080, 0x0009, 0x0449, 0x12D8, 0x000C, +0x0606, 0x0890, 0x410C, 0x824B, 0x2128, 0x640A, 0x0807, 0x3082, 0x00D8, +0x403B, 0x248A, 0x204A, 0x08D0, 0x1083, 0x0069, 0x060B, 0x208E, 0x2009, +0x1008, 0x4937, 0x2A9B, 0x1200, 0x6920, 0xBE9A, 0x8201, 0x6904, 0xB5D2, +0x9041, 0x58C4, 0xA092, 0x0089, 0x4001, 0x69B5, 0x0092, 0x0040, 0x6D80, +0x24D2, 0x0001, 0x6814, 0xA4F3, 0x0601, 0x45A4, 0x2692, 0x4829, 0x0036, +0x6935, 0x02D3, 0x0C00, 0x6900, 0x26D2, 0x2526, 0x7840, 0x34DB, 0x0501, +0x4140, 0xB696, 0x0029, 0x0000, 0x6D87, 0x00DA, 0x8040, 0x68A0, 0x269A, +0x8048, 0x2904, 0x24DA, 0x0451, 0x5020, 0x369B, 0x5609, 0xC345, 0x2480, +0x9144, 0x0967, 0x0497, 0x0041, 0x19EC, 0x06B2, 0x0209, 0x4FA0, 0x9533, +0x5649, 0x0624, 0x9A6E, 0x0400, 0xA249, 0xCB34, 0x0006, 0x1229, 0xDB5C, +0x04A2, 0x1308, 0xD0E0, 0x0818, 0x9049, 0x3304, 0x5701, 0x8480, 0x3008, +0x1241, 0x0486, 0x1009, 0x8881, 0x84A2, 0x8200, 0x9AD0, 0x08B0, 0x0049, +0x3D04, 0xE361, 0x0030, 0x5201, 0x5B01, 0x051F, 0x1045, 0x7733, 0x44FA, +0x9225, 0x9220, 0x1F16, 0x8040, 0x8424, 0x9E52, 0x6DBD, 0x4093, 0xA088, +0x4D84, 0x65D3, 0x101A, 0x5C29, 0x3EDB, 0xA015, 0x5029, 0x30CB, 0x9CAC, +0x25C8, 0x4D25, 0x209F, 0x2480, 0x4909, 0x269F, 0x30C8, 0x0C68, 0x369A, +0x8101, 0x4A41, 0x96ED, 0x843B, 0x3880, 0x0405, 0xC08A, 0x513E, 0x4D80, +0x3482, 0x4000, 0x4401, 0xA402, 0xE020, 0x4E23, 0x2482, 0xCA0C, 0x1291, +0x4F15, 0x429B, 0xA602, 0x4C00, 0x76F3, 0x1290, 0x0C05, 0x86CA, 0xE285, +0x10C4, 0xB6C2, 0x002D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0002, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0080, +0x0000, 0x0000, 0x0008, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x2000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0410, 0x0000, +0x0000, 0x0000, 0x0000, 0x0402, 0x0000, 0x0800, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0008, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0082, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0010, 0x0400, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0400, 0x0001, +0x0000, 0x0210, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x5010, 0x0100, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0008, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x1011, 0x0000, 0x0000, 0x4800, +0x0401, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0250, 0x0000, 0x0000, +0x0000, 0x0004, 0x0008, 0x0010, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0040, 0x0280, 0x0000, 0x0000, 0x0000, 0x0001, 0x0008, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x8410, 0x0000, 0x0000, 0x1000, +0x0400, 0x0001, 0x0000, 0x0100, 0x0208, 0x0000, 0x0008, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x1001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x4000, 0x0000, 0x0000, 0x0400, 0x0240, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0001, 0x0040, 0x0000, 0x0000, 0x0400, 0x0000, +0x0081, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x2000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0208, 0x0010, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1004, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0040, 0x0000, 0x1000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0208, 0x0000, 0x0001, 0x0000, 0x0000, 0x00A0, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0004, 0x0000, +0x0004, 0x0000, 0x0000, 0x4000, 0xA008, 0x2001, 0x0000, 0x0001, 0x2440, +0x0000, 0x2C90, 0x0008, 0x0000, 0x0400, 0x0000, 0x0001, 0x2000, 0x0001, +0x0400, 0x0100, 0x0200, 0x0000, 0x0000, 0x0490, 0x0000, 0x1040, 0x2000, +0x1001, 0x0010, 0x2000, 0x0048, 0x1040, 0x0100, 0x0000, 0x0000, 0x0000, +0x0010, 0x0008, 0x0000, 0x4000, 0x0100, 0x0401, 0x2400, 0x1000, 0x0000, +0x0100, 0x0000, 0x0001, 0x0000, 0x2000, 0x0400, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x8008, 0x0000, 0x0000, 0x0001, 0x2440, 0x0000, 0x2490, +0x0008, 0x0000, 0x0400, 0x0000, 0x0401, 0x2000, 0x0001, 0x0000, 0x0100, +0x0200, 0x0800, 0x0010, 0x0490, 0x0000, 0x1040, 0x2000, 0x1001, 0x0000, +0x2000, 0x0048, 0x1040, 0x0100, 0x0000, 0x0000, 0x0000, 0x0015, 0x0408, +0x0000, 0x0000, 0x0400, 0x0003, 0x2400, 0x1000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0020, 0x0400, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x2200, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x9040, 0x0100, 0x0000, 0x0000, 0x0000, 0x0020, +0x0001, 0x0000, 0x0040, 0x0002, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0011, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x8003, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0120, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0001, 0x0000, +0x0080, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0810, 0x0000, +0x0000, 0x0000, 0x8001, 0x0000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0020, 0x1000, 0x0000, 0x0000, 0x0011, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0200, 0x0000, 0x0000, 0x1400, 0x4100, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0240, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x1000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0041, +0x0400, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x8000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0020, 0x4008, 0x0000, 0x1000, 0x0400, 0x0000, 0x0241, 0x0180, +0x0400, 0x0002, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0004, 0x1000, 0x0000, 0x1640, 0x0000, 0x0004, 0x0102, 0x0000, +0x0000, 0x1000, 0x0100, 0x0040, 0x0004, 0x0000, 0x0001, 0x0404, 0x0000, +0x0000, 0x0000, 0x0080, 0x0002, 0x0200, 0x0000, 0x0001, 0x0000, 0x0000, +0x0004, 0x1000, 0x0020, 0x0020, 0x4000, 0x0000, 0x0000, 0x0000, 0x0104, +0x0800, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x8000, 0x0400, 0x0000, +0x0000, 0x0001, 0x0000, 0x0100, 0x0000, 0x0082, 0x0100, 0x8000, 0x0000, +0x0000, 0x8000, 0x0400, 0x0000, 0x0000, 0x0002, 0x8000, 0x4040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x3000, 0x0000, +0x0880, 0x0000, 0x6000, 0x0000, 0x8001, 0x0800, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0004, 0x0000, 0x8000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0001, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0801, 0x0000, 0x0000, +0x4200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x2000, 0x4000, 0x0000, 0x0000, 0x0002, 0x1000, 0x8001, 0x0400, 0x4000, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1009, 0x0080, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0020, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0400, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0402, 0x0000, 0x0000, 0x2004, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0004, 0x0002, 0x0004, 0x8800, +0x0000, 0x0000, 0x8040, 0x0500, 0x2000, 0x4000, 0x0000, 0x0000, 0x8010, +0x2002, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x4300, 0x0410, 0x0000, +0x0000, 0x4400, 0x0001, 0x0000, 0x0480, 0x3000, 0x0200, 0x0004, 0x0422, +0x0000, 0x0040, 0x0004, 0x0000, 0x4000, 0x0404, 0x0000, 0x0000, 0x0180, +0x0000, 0x0002, 0x0000, 0x0002, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x1400, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x2002, 0x0201, +0x0000, 0x0001, 0x0000, 0x0000, 0x4100, 0x0410, 0x0000, 0x0000, 0x0400, +0x0001, 0x0000, 0x0480, 0x2000, 0x0200, 0x0004, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, 0x0080, 0x0000, 0x8200, +0x0000, 0x0000, 0x0240, 0x0000, 0x0000, 0x0000, 0x0000, 0x0220, 0x0002, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0002, 0x0000, 0x0300, 0x0000, +0x0060, 0x0081, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x2000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0124, +0x0002, 0x0000, 0xC000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0408, 0x0000, 0x0020, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x2000, +0x0400, 0x0000, 0x0000, 0x0000, 0x1020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0100, 0x0200, 0x0000, 0x4000, 0x0040, 0x0000, 0x8200, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0200, 0x0000, 0x4000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8100, 0x0000, 0x0000, +0x0002, 0x0000, 0x1000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0300, 0x000C, 0x0000, 0x4000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x8011, 0x0200, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0101, 0x0000, 0x0200, 0x8001, 0x0001, 0x0005, 0x0440, +0x0000, 0x0080, 0x8000, 0x5000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0001, 0x0000, 0x0400, 0x0100, 0x0014, 0x2000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0001, 0x0000, 0x0000, 0x2100, 0x0000, 0x0004, 0x2001, +0x0404, 0x0020, 0x0000, 0x8020, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0011, 0x0001, 0x0040, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0040, 0x0000, 0x0100, +0x0400, 0x0000, 0x0040, 0x0400, 0x0000, 0x0000, 0x0000, 0x0010, 0x8001, +0x0208, 0x0000, 0x0000, 0x0200, 0x4000, 0x0000, 0x8000, 0x0400, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0001, 0x0800, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0080, 0x0040, 0x0800, 0x0104, +0x0000, 0x0000, 0x0000, 0x0008, 0x0040, 0x0004, 0x4000, 0x1000, 0x0804, +0x0001, 0x0000, 0x0002, 0x0000, 0x0000, 0x800D, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x9241, 0x4924, 0xA892, 0x9249, 0x4904, 0x6492, +0x1049, 0x4A44, 0x0492, 0x9201, 0x4B24, 0x2492, 0x0081, 0x10C0, 0x4921, +0x6092, 0xB248, 0x4904, 0x2092, 0x9201, 0x0004, 0x2492, 0x5241, 0x4920, +0x2490, 0x0009, 0x924A, 0x4924, 0x2092, 0x9001, 0x1A00, 0x2092, 0x8040, +0x4824, 0x6490, 0x9201, 0x4930, 0x0012, 0xA009, 0x9009, 0x49A0, 0x2CB2, +0x92C9, 0x4904, 0x6092, 0x0240, 0x4A20, 0x24B2, 0x9241, 0x582C, 0x2492, +0x2409, 0x1049, 0x4925, 0x2890, 0x9009, 0x4904, 0x4492, 0x8209, 0x4A64, +0x2492, 0x9240, 0x5B24, 0x3492, 0x0481, 0x90C8, 0x4124, 0x6090, 0xB248, +0x4804, 0x2012, 0x9201, 0x0824, 0x2492, 0x9241, 0x4924, 0x0490, 0x2408, +0x924B, 0x4125, 0x2092, 0x9249, 0x0804, 0x2082, 0x1249, 0x4824, 0x2092, +0x9200, 0x4924, 0x2012, 0x0009, 0x9249, 0x4921, 0x2890, 0x92C9, 0x4904, +0x6490, 0x1249, 0x0A24, 0x2092, 0x1241, 0x592C, 0x0412, 0x0009, 0x0100, +0x0001, 0x0402, 0x0000, 0x0000, 0x0200, 0x0040, 0x0002, 0x0000, 0x0000, +0x0000, 0x0040, 0x2000, 0x0022, 0x0001, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0080, 0x0010, 0x0000, 0x0000, 0x0004, 0x0081, +0x1000, 0x0024, 0x0002, 0x0000, 0x0800, 0x0011, 0x0000, 0x0820, 0x0082, +0x0000, 0x0000, 0x0080, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0010, +0x0001, 0x0000, 0x8020, 0x0000, 0x0000, 0x1000, 0x0000, 0x4200, 0x0400, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0xC034, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x1024, 0x0042, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0801, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0406, 0x0000, 0x8000, 0x0000, 0x0000, 0x0010, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x4081, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4400, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0080, 0x0000, +0x0000, 0x0084, 0x0000, 0x0000, 0x8010, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0820, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0800, +0x0000, 0x8002, 0x4124, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x4020, +0x0402, 0x0000, 0x0200, 0x0000, 0x0020, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0480, 0x0000, 0x0000, 0x0000, 0x0004, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x4000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x8000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0200, 0x0800, 0x00A0, 0x0040, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0800, 0x0000, 0x0000, 0x6400, 0x9259, 0x0924, 0x2812, 0x9249, +0x4104, 0x6492, 0x9249, 0x6A65, 0x2412, 0xB241, 0x5925, 0x2492, 0x6C89, +0x9248, 0x0900, 0x2090, 0x9249, 0x4104, 0x0492, 0x9AD9, 0x0C24, 0x2492, +0x1281, 0x4924, 0x0492, 0x2409, 0x9289, 0x0910, 0x62B0, 0x9249, 0x4904, +0x2492, 0x924D, 0x0804, 0x2492, 0x9241, 0x0920, 0x2592, 0x2019, 0x9249, +0x4D04, 0x2890, 0x9249, 0x4904, 0x6493, 0x106B, 0x4A24, 0x2492, 0x9241, +0x5924, 0x2592, 0x6409, 0xD279, 0x4924, 0x2892, 0x9269, 0x4904, 0x4492, +0x9208, 0x4A65, 0x0492, 0xB241, 0x5935, 0x2492, 0x6C89, 0x9A49, 0x4924, +0x2093, 0x5248, 0x4904, 0x2482, 0x82D9, 0x6824, 0x2492, 0x92C1, 0x4924, +0x0412, 0x2409, 0x93C9, 0x0024, 0x6000, 0x9A69, 0x4804, 0x2482, 0x9A49, +0x48B6, 0x2412, 0x9B41, 0x4D24, 0x2400, 0x8409, 0x9049, 0x4904, 0x2092, +0x9249, 0x4104, 0x6412, 0x924B, 0x4A24, 0x0492, 0x9041, 0x5924, 0x2490, +0x0009, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0040, 0x0000, 0x2000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0100, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x004A, 0x4000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0294, +0xBED8, 0x0245, 0x8680, 0xB6D4, 0x4975, 0x2302, 0xB491, 0xDE65, 0x000E, +0x964C, 0x8F6D, 0xDC7F, 0x4404, 0xBEE0, 0x235D, 0xAC02, 0xB440, 0x186D, +0x0A0E, 0x9CD4, 0xCB65, 0x2012, 0x40C2, 0xDB6D, 0x2037, 0xA09B, 0xDA58, +0x416B, 0x3492, 0x36CB, 0x3F8B, 0xB692, 0xF440, 0x9117, 0x8401, 0x8928, +0x7849, 0x2402, 0x0522, 0xAC69, 0x034D, 0xEC48, 0x17D0, 0x596C, 0x0A28, +0xDC12, 0xDB65, 0x6C46, 0x905B, 0xDBFC, 0xB277, 0x5929, 0x0248, 0xB09C, +0x4D6D, 0x1242, 0x122C, 0x4865, 0x9003, 0x0828, 0x5B61, 0x9BF2, 0x1824, +0x2A02, 0x1F28, 0x1014, 0x9002, 0x532D, 0x1086, 0x0A06, 0x5122, 0xA022, +0x198E, 0x5970, 0x0D50, 0x0004, 0x9210, 0x5BF6, 0xB6C8, 0xB320, 0xEBE5, +0x024D, 0x0940, 0x4DFD, 0x90D6, 0x0248, 0x5920, 0x849E, 0xC200, 0x9226, +0xD80F, 0x8098, 0xB904, 0x0124, 0x6046, 0x0B01, 0xD145, 0x20A0, 0x0588, +0xA72A, 0x9DE0, 0x0003, 0xD310, 0x2000, 0x0117, 0x5890, 0x2186, 0x4939, +0xA4C0, 0x02B6, 0x606A, 0x2212, 0x0D91, 0x6088, 0x0292, 0x0580, 0x2051, +0x4005, 0x6282, 0x2592, 0x410B, 0x2403, 0x0599, 0x4009, 0x2493, 0x0100, +0x0208, 0xF41A, 0x5B08, 0x6C24, 0x0125, 0x9011, 0x4000, 0x0000, 0x0000, +0x8200, 0x0009, 0xA500, 0xA090, 0x43F1, 0x14C3, 0x2309, 0x62D0, 0x4107, +0x1082, 0x00C0, 0x483A, 0xA40A, 0x0208, 0x00C8, 0x2492, 0x10D9, 0x4600, +0x9002, 0x0008, 0x0000, 0x4137, 0x089B, 0x0000, 0x4920, 0x36DA, 0x0200, +0x6921, 0x36DA, 0x0009, 0x5B00, 0x3292, 0x0089, 0x1641, 0x4135, 0x0292, +0x0200, 0x4984, 0x2693, 0x0003, 0x6800, 0x349B, 0x0001, 0x4900, 0xB4BA, +0x0009, 0x0092, 0x6DB5, 0x0292, 0x2080, 0x6900, 0x2CD2, 0x4590, 0x4800, +0xA6DA, 0x0001, 0x400A, 0xA69B, 0x002D, 0x1042, 0x4997, 0x089A, 0x0000, +0x6820, 0xA6DB, 0x8008, 0x2100, 0x3D9A, 0x3041, 0x5100, 0x3C93, 0xF709, +0x914F, 0x2C80, 0xF240, 0x3F4F, 0x2490, 0x0801, 0x99FD, 0x069E, 0x8001, +0xDFF0, 0xB0E3, 0x8449, 0xB824, 0xE13E, 0x2C80, 0x0149, 0x115D, 0x2442, +0x1048, 0xD374, 0x84B2, 0xC240, 0xD352, 0x04F4, 0x0241, 0x9F24, 0x5E64, +0x0000, 0xB049, 0xC24D, 0x048F, 0x1209, 0x006D, 0x246D, 0x1001, 0x32F0, +0x02D5, 0x1040, 0x2F00, 0xE329, 0x2420, 0x7241, 0x5B05, 0x059E, 0x1000, +0x5873, 0x4EF6, 0x8241, 0xCE10, 0x1EE4, 0x8248, 0x0C24, 0xCED2, 0x65A5, +0x02D3, 0x9210, 0x6D84, 0x6483, 0xF408, 0x4C04, 0xB0D3, 0xA005, 0x5015, +0xA0DB, 0x42A4, 0x8882, 0x6585, 0x80CB, 0xC040, 0x6D00, 0x34DA, 0xA240, +0x4444, 0xA6D2, 0xA6A1, 0x0025, 0x66D3, 0x242C, 0x8109, 0x0134, 0x40D8, +0x1D3A, 0x6D80, 0x121D, 0x3802, 0x2CB2, 0x3481, 0x4F42, 0x4C00, 0x059E, +0xCC09, 0x0C04, 0x6505, 0x42FB, 0xB63B, 0x4C81, 0x74D2, 0x2492, 0x0405, +0xB6F3, 0x0005, 0x500D, 0x264A, 0x002C, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0008, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, 0x0000, +0x0008, 0x0000, 0x1000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0001, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0010, 0x0000, 0x2000, 0x0800, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0010, 0x0200, 0x0000, 0x0001, 0x0001, +0x0100, 0x0000, 0x0002, 0x0820, 0x0000, 0x0000, 0x2800, 0x0082, 0x0000, +0x0900, 0x0420, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0004, 0x0400, 0x0000, 0x0020, +0x0100, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0001, 0x8000, 0x0008, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x2000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0408, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0090, 0x0040, 0x0000, 0x0000, 0x1081, 0x0000, 0x2000, +0x8001, 0x0000, 0x0000, 0x8200, 0x0824, 0x0000, 0x0000, 0x0008, 0x0000, +0x0080, 0x0000, 0x2000, 0x0000, 0x0140, 0x0000, 0x0004, 0x0800, 0x0000, +0x0000, 0x2400, 0x0000, 0x0000, 0x0000, 0x0240, 0x0000, 0x4000, 0x1000, +0x0000, 0x0000, 0x1200, 0x0000, 0x0082, 0x0001, 0x0000, 0x0000, 0x0400, +0x0010, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0890, 0x0040, 0x0000, 0x0000, 0x1001, 0x0000, 0x2020, 0x8001, 0x8040, +0x0000, 0xA200, 0x0024, 0x8200, 0x4001, 0x2008, 0x0000, 0x0080, 0x0400, +0x0000, 0x0022, 0x0040, 0x0000, 0x4020, 0x0000, 0x0000, 0x0001, 0x2400, +0x0400, 0x0000, 0x0000, 0x0240, 0x8000, 0x0000, 0x1400, 0x0000, 0x0000, +0x1200, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0020, +0x0000, 0x0200, 0x0800, 0x0000, 0x0000, 0x0090, 0x0040, 0x0000, 0x0000, +0x1001, 0x0000, 0x6000, 0x0000, 0x0080, 0x0000, 0x8000, 0x0024, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x8000, 0x0000, 0x1201, 0x0000, 0x2804, 0x0000, 0x0000, 0x0100, +0x0000, 0x0021, 0x0000, 0x2000, 0x0000, 0x0040, 0x0400, 0x0008, 0x0000, +0x0004, 0x0001, 0x8000, 0x0100, 0x0209, 0x0000, 0x0000, 0x0080, 0x0200, +0x8008, 0x0000, 0x1040, 0x8000, 0x0000, 0x8000, 0x0800, 0x0000, 0x9000, +0x0420, 0x0000, 0x0480, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0004, +0x0200, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0001, 0x0400, 0x8000, +0x0000, 0x1201, 0x0000, 0x2004, 0x0000, 0x0000, 0x0100, 0x0000, 0x0020, +0x0000, 0x2001, 0x0000, 0x0040, 0x0500, 0x0008, 0x0000, 0x0004, 0x0001, +0x8000, 0x0100, 0x0219, 0x0000, 0x0000, 0x0081, 0x0200, 0x8008, 0x0000, +0x1040, 0x8000, 0x0000, 0x8000, 0x0000, 0x0000, 0x9000, 0x0420, 0x0000, +0x0481, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0200, 0x0000, +0x0000, 0x0009, 0x0000, 0x0000, 0x0081, 0x0440, 0x0000, 0x0000, 0x0020, +0x0000, 0x0008, 0x0200, 0x0080, 0x0010, 0x4200, 0x0000, 0x0004, 0x0001, +0x0005, 0x0800, 0x0000, 0x0000, 0x0000, 0x0092, 0x1000, 0x1000, 0x0080, +0x0000, 0x1200, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002, 0x0000, 0x0004, +0x0000, 0x1000, 0x0800, 0x0092, 0x0000, 0x8200, 0x0000, 0x0000, 0x8400, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x4000, 0x0000, 0x0000, 0x0080, 0x0008, 0x0000, +0x0500, 0x0000, 0x0000, 0x0000, 0x4010, 0x0000, 0x0100, 0x0800, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0101, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0100, 0x2000, 0x0000, 0x0000, 0x0004, 0x0500, 0x0000, 0x0004, 0x0000, +0x0004, 0x0000, 0x0000, 0x1000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x4020, 0x0000, 0x0000, 0x4000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0004, 0x0000, 0x0100, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x8108, 0x0001, 0x0061, 0x8000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0200, 0x8000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0001, 0x2000, 0x900C, +0x0000, 0x0000, 0x8000, 0x0020, 0x0000, 0x0040, 0x0020, 0x0000, 0x0000, +0x0008, 0x0001, 0x0400, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0080, 0x0100, 0x0000, 0x0000, 0x0881, 0x0400, 0x8800, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0080, +0x0001, 0x0000, 0x0000, 0x1000, 0x0408, 0x0000, 0x0000, 0x0000, 0xC000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x8008, 0x0000, 0x0042, +0x8000, 0x0000, 0x0100, 0x0020, 0x0020, 0x0001, 0x0010, 0x0000, 0x0201, +0x0404, 0x4800, 0x0200, 0x0000, 0x0900, 0x1000, 0x0000, 0x8A00, 0x0000, +0x4002, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0100, 0x0082, 0x0000, 0x0200, 0x0080, 0x0200, 0x1000, +0x0004, 0x0000, 0x0000, 0x0020, 0x1080, 0x0000, 0x4020, 0x0000, 0x0100, +0x0001, 0x0100, 0x2000, 0x0000, 0x0000, 0x0100, 0x0008, 0x0000, 0x0002, +0x4100, 0x0000, 0x0000, 0x0000, 0x0400, 0x0124, 0x0000, 0x0022, 0x0004, +0xA800, 0x0020, 0x0000, 0x6000, 0x0020, 0x0000, 0x0000, 0x0020, 0x0000, +0x0002, 0x0040, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0100, 0x0000, 0x0000, 0x1000, 0x0000, 0x4000, 0x0040, +0x0000, 0x0004, 0x0000, 0x0000, 0x1000, 0x0000, 0x4000, 0x0001, 0x0200, +0x8000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0010, 0x0000, 0x8000, +0x0020, 0x0020, 0x0002, 0x0000, 0x0008, 0x0002, 0x0000, 0x0800, 0x0000, +0x0000, 0x4000, 0x0800, 0x8200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x4000, 0x0012, 0x0000, 0x0000, 0x0020, 0x0000, 0x0280, 0x0400, 0x0000, +0x0000, 0x0020, 0x1000, 0x0000, 0x0100, 0x0020, 0x0200, 0x0000, 0x0100, +0x0000, 0x0000, 0x0102, 0x0000, 0x0000, 0x0000, 0x8102, 0x0020, 0x0000, +0x0000, 0x0000, 0x1000, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8300, 0x0000, 0x0002, 0x0002, 0x0000, 0x0020, 0x0220, 0x0000, +0x8200, 0x0414, 0x0000, 0x2000, 0x2080, 0x0000, 0x8000, 0x0004, 0x0001, +0x8000, 0x0000, 0x0050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, +0x0000, 0x0000, 0x0080, 0x8001, 0x0000, 0x0200, 0x0096, 0x0800, 0x0000, +0x0040, 0x0000, 0x1000, 0x0000, 0x0000, 0xC000, 0x8090, 0x0000, 0x0000, +0x4800, 0x0020, 0x4086, 0x4300, 0x0014, 0x0000, 0x1000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0400, 0x0000, 0x0000, 0x0410, +0x0000, 0x0000, 0x2080, 0x0000, 0x0000, 0x0000, 0x0001, 0x8000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, +0x0080, 0x0001, 0x0000, 0x0000, 0x0092, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x4000, 0x0090, 0x0000, 0x0000, 0x4800, 0x0400, +0x0000, 0x4100, 0x0010, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0822, 0x1000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0040, 0x0000, 0x2000, 0x0200, 0x0200, 0x0000, 0x0800, 0x0000, 0x4120, +0x0000, 0x0400, 0x4000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x4020, 0x0080, 0x0000, 0x0000, 0x0080, 0x0040, +0x0000, 0x0090, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0820, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x000C, 0x1000, 0x0000, 0x1020, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0400, 0x0000, 0x0002, 0x0000, 0x0000, 0x0410, 0x0200, +0x0000, 0x0800, 0x0000, 0x0020, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0008, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0020, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0120, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0100, 0x2000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x8000, 0x0000, +0x0400, 0x0000, 0x0040, 0x0000, 0x0400, 0x0400, 0x0080, 0x0002, 0x0081, +0x0000, 0x0200, 0x0001, 0x0040, 0x2880, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1400, 0x0008, 0x0000, 0x0801, 0x0001, 0x0000, +0x0100, 0x0000, 0x0800, 0x0000, 0x0080, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0009, 0x0410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x1000, 0x0000, 0x0840, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0008, 0x2200, 0x0000, +0x0011, 0x0000, 0x0200, 0x0004, 0x0000, 0x0000, 0x0020, 0x0201, 0x0000, +0x0800, 0x4000, 0x0020, 0x0040, 0x5041, 0x0400, 0x0002, 0x2400, 0x0040, +0x0010, 0x0024, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0002, 0x0100, 0x0010, 0x0000, 0x0020, 0x2000, 0x0000, 0x0000, 0x0040, +0x0000, 0x8004, 0x1000, 0x2020, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0404, 0x8000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0040, 0x0010, 0x0040, 0x2400, 0x964B, 0xC924, 0x2C82, 0x1208, +0x4900, 0x6082, 0x92C1, 0x4A24, 0x2492, 0x9253, 0x5324, 0x2492, 0x0088, +0x8265, 0x4B34, 0x6083, 0x9088, 0x0901, 0x2090, 0x9201, 0x484C, 0x24B2, +0x1011, 0x4004, 0x2412, 0x0409, 0x1049, 0x4924, 0x4090, 0xA249, 0x4900, +0x2410, 0x8249, 0x4807, 0x2092, 0xB341, 0x4349, 0x2482, 0x0408, 0x9240, +0x4924, 0x2882, 0x02C9, 0xC304, 0x6490, 0x364B, 0x4220, 0x2496, 0x1081, +0x5920, 0xAC92, 0x240B, 0x964B, 0x4105, 0x2882, 0x8249, 0x4904, 0x6082, +0x92C9, 0x4A24, 0x0410, 0x0251, 0x1224, 0x2492, 0x0480, 0x1249, 0x4925, +0x6082, 0x9289, 0x4805, 0x2090, 0x9209, 0x486C, 0x0082, 0x9010, 0x0924, +0x2412, 0x0408, 0x9049, 0x4925, 0x4000, 0xB049, 0x6800, 0x2412, 0x9249, +0x4805, 0x2092, 0xB241, 0x034D, 0x0002, 0x2000, 0x9209, 0x0125, 0x2892, +0x02C1, 0x0804, 0x6480, 0xA64B, 0x4600, 0x2402, 0x10C1, 0x5920, 0x2490, +0x8009, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, +0x0000, 0x0000, 0x0100, 0x0000, 0x9000, 0x0000, 0x0001, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x1000, 0x8000, 0x0000, 0x0081, 0x8400, 0x0400, 0x0000, +0x0200, 0x0004, 0x0000, 0x0000, 0x4100, 0x0080, 0x0000, 0x0800, 0x0000, +0x0000, 0x0600, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0018, 0x0001, 0x0000, 0x0000, 0x4004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0010, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0100, 0x2000, 0x0000, +0x0800, 0x0004, 0x0000, 0x0000, 0x0000, 0x0010, 0x8200, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0020, 0x0600, 0x0400, 0x0000, 0x2000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0100, 0xA200, 0x0000, 0x0000, 0x0080, +0x0000, 0x2000, 0x8000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x1400, 0x0408, 0x0002, 0x0000, 0x0000, 0x6002, 0x0000, 0x0109, +0x0400, 0x0048, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x2000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x2000, +0x0000, 0x0002, 0x2000, 0x0000, 0x2002, 0x0000, 0x0000, 0x0400, 0x0048, +0x8000, 0x0000, 0x0800, 0x0000, 0x0401, 0x0000, 0x0008, 0x0000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0200, 0x0000, 0x0080, 0xC000, +0x0020, 0x0000, 0x0000, 0x0000, 0x2400, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0080, 0x0140, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x5000, 0x0800, 0x0000, 0x0000, 0x0804, 0x0000, 0x8400, 0x00A0, +0x0000, 0x0008, 0x0004, 0x4800, 0x0000, 0x8160, 0x0000, 0x0010, 0x0000, +0x0004, 0x0000, 0x0420, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0004, 0x0840, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0100, 0x0000, 0x0000, 0x0200, +0x0200, 0x0000, 0x0000, 0x9200, 0x0004, 0x0000, 0x0000, 0x0100, 0x0000, +0x8000, 0x0800, 0x0000, 0x0100, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0041, 0x0000, 0x0000, 0x0000, 0x0050, 0x1000, 0x2400, 0x9209, 0xC924, +0x2892, 0x92D9, 0xC90D, 0x6092, 0x9249, 0x4A24, 0x2492, 0x9241, 0x592C, +0x2482, 0x6488, 0x1249, 0x4924, 0x60D2, 0x920A, 0x4904, 0x2492, 0x9259, +0x4864, 0x2492, 0x2241, 0x4820, 0x2482, 0x2408, 0xB049, 0x4824, 0x2092, +0xB249, 0x480C, 0x2492, 0x9B59, 0x4084, 0x2492, 0x1251, 0x4B05, 0x2492, +0x2409, 0xBE49, 0x4924, 0x2892, 0x96C9, 0x4904, 0x6492, 0x922A, 0x0A24, +0x2492, 0x9241, 0x5924, 0x2492, 0x2409, 0xD249, 0x4924, 0x2882, 0x92D1, +0x490D, 0x4012, 0x9249, 0x4A24, 0x2090, 0x9240, 0x592C, 0x0092, 0xE481, +0x9249, 0x4824, 0x4082, 0x924B, 0x0104, 0x0092, 0x9279, 0x0864, 0x2082, +0xB240, 0x4924, 0x2092, 0x2400, 0x3029, 0x0024, 0x3000, 0xB20D, 0x4808, +0x0480, 0x9259, 0x0824, 0x2482, 0x8251, 0x0725, 0x2012, 0x0401, 0xB649, +0x4024, 0x2892, 0x96C9, 0x4104, 0x64D2, 0x924B, 0x0224, 0x2692, 0x1021, +0x5936, 0x2482, 0x0009, 0x0000, 0x0000, 0x0400, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0240, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0580, +0x0018, 0x0000, 0x4880, 0x0000, 0x0000, 0x6000, 0x0410, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0100, 0x0010, 0x0000, 0x0000, 0x2012, 0x0000, +0x4000, 0x0010, 0x0000, 0x4000, 0x0480, 0x0008, 0x0000, 0x0800, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x22C4, 0xB6D9, 0x0264, 0x0230, 0xB6D6, 0x4B67, 0x0510, 0xB601, +0xDFED, 0x818E, 0x9640, 0x9D6D, 0x117E, 0x31A2, 0xA4D9, 0x132F, 0x245E, +0x9EC9, 0x3FCC, 0x8480, 0x3408, 0xB16D, 0x2630, 0x8929, 0x5BF5, 0x0810, +0xB3D3, 0x3395, 0x61A4, 0x2611, 0xB340, 0x1365, 0x2CF1, 0xA029, 0x7FEE, +0x04D3, 0xC001, 0x974E, 0x0C34, 0x0EC2, 0xBCE1, 0x2364, 0x091A, 0x1450, +0x5B6D, 0x669A, 0x9C0B, 0xDFE5, 0x2416, 0x5000, 0x937D, 0xB676, 0xD929, +0x4A48, 0xB82D, 0x594C, 0x1040, 0x9938, 0x486D, 0x9097, 0x4800, 0x5A60, +0x9BB2, 0x0220, 0x8202, 0xCAC4, 0x0128, 0x8144, 0x6922, 0xA14F, 0x0901, +0x5924, 0x489E, 0x0304, 0xED00, 0x0492, 0x852A, 0x9625, 0x682C, 0x1600, +0xD369, 0xD964, 0x8686, 0x252C, 0x6184, 0x049F, 0x8105, 0xCBB0, 0x84B3, +0x0005, 0x9A00, 0xC126, 0x9114, 0x990D, 0x5224, 0x2086, 0x0930, 0x3926, +0xB0B1, 0x400C, 0xCD7A, 0x1DB2, 0x0126, 0xCB13, 0x2590, 0xE9A7, 0x5010, +0x6016, 0x0D35, 0x2490, 0x14B6, 0x085A, 0xA202, 0x0CB9, 0x60CC, 0x20D0, +0x6980, 0x4400, 0x4521, 0x0010, 0x4208, 0x0180, 0x004A, 0x819A, 0x4C40, +0x0488, 0x02D1, 0x0300, 0x1002, 0x0009, 0x4C04, 0x2081, 0x2010, 0x4000, +0x0809, 0x2402, 0x0002, 0x2800, 0x0208, 0x2020, 0x0240, 0xA0C0, 0x4109, +0x6160, 0x6507, 0x40C0, 0x0010, 0x013B, 0xA493, 0x0414, 0x00D8, 0x0000, +0x2089, 0x0609, 0x244A, 0x0009, 0x0040, 0x4927, 0x009B, 0x0200, 0x4D20, +0x3698, 0x1100, 0x4901, 0xA612, 0xD101, 0x5804, 0x2392, 0x2089, 0x8040, +0x6D25, 0x00D2, 0x0002, 0x7980, 0x26D3, 0x0008, 0x4C00, 0xA7BA, 0x2041, +0x4000, 0xB4DA, 0x002D, 0x8000, 0x4CA1, 0x02DB, 0x0000, 0x6D80, 0x249A, +0x20C9, 0xCC03, 0xA6DB, 0x4000, 0x4001, 0x35D3, 0x002D, 0x1001, 0x69B7, +0x089B, 0x8000, 0x6DA0, 0xA697, 0x0002, 0x6D00, 0x369B, 0x8001, 0x5000, +0x24DA, 0xF709, 0x9D0D, 0x2490, 0xF240, 0xF8CF, 0x2093, 0x0043, 0xA2EF, +0x24BE, 0x10C9, 0x0E70, 0x37A9, 0x944D, 0x0634, 0x4789, 0x00D0, 0x3209, +0xF321, 0x044F, 0x1008, 0x5B41, 0x202C, 0x1041, 0xDC00, 0x8616, 0x0A01, +0xE500, 0x6D0C, 0x2114, 0xC000, 0xD968, 0x0004, 0x1241, 0xDB22, 0x204C, +0x1000, 0xB3B1, 0x0B64, 0x8208, 0x2800, 0xE12E, 0x1400, 0x4240, 0x5B41, +0x001F, 0x1048, 0xB965, 0x02F7, 0x8040, 0x5F50, 0x1FAD, 0x9201, 0x0024, +0x4242, 0x4D34, 0x03D2, 0x8681, 0x6988, 0x66D1, 0xA200, 0x6C20, 0x315B, +0xA007, 0x5011, 0xB09B, 0x84A5, 0x301F, 0x69B5, 0x62B9, 0x9CD1, 0x4500, +0x1212, 0x2661, 0xE8B3, 0x94D3, 0x1001, 0x48ED, 0x2643, 0x7B09, 0x92F3, +0x4838, 0x0012, 0x269B, 0x6802, 0x3ED3, 0x965D, 0x4860, 0x1050, 0x1C40, +0x099E, 0x3298, 0xA62D, 0x1699, 0x4184, 0xA292, 0xA4EB, 0x4F00, 0x76DA, +0x82C9, 0x4404, 0xB253, 0x1225, 0x1056, 0xB683, 0x002D, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA800, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0001, 0x0020, 0x0020, 0x0000, 0x0050, 0x0000, +0x0000, 0x0000, 0x8020, 0x0880, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0020, 0x0012, 0x0008, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0004, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0020, +0x0800, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x4000, 0x0200, 0x0000, 0x0008, +0x2400, 0x0488, 0x0200, 0x8008, 0x0001, 0x0000, 0x0004, 0x0049, 0x0000, +0x0001, 0x0008, 0x0000, 0x8000, 0x00A0, 0x0049, 0x0000, 0x2800, 0x0000, +0x0000, 0x0000, 0x8040, 0x0000, 0x0004, 0x0000, 0x8000, 0x0000, 0x0020, +0x0200, 0x0200, 0x8000, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x00C0, 0x0000, 0x0000, 0x0020, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x4000, 0x0032, 0x0000, 0x0000, 0x2400, 0x0008, +0x0040, 0x0000, 0x4001, 0x0000, 0x0000, 0x0049, 0x0001, 0x0000, 0x0008, +0x0000, 0x0000, 0x0080, 0x2049, 0x0008, 0x2000, 0x0000, 0x0000, 0x0000, +0x8050, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0400, 0x1200, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0440, 0x0000, 0x0000, 0x0002, 0x0000, 0x0400, 0x0000, +0x1000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x2860, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x8208, 0x0000, 0x0000, +0x1200, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0810, 0x0000, 0x0000, 0x0000, 0x0009, 0x0040, 0x0004, 0x1000, +0x0000, 0x0000, 0x0208, 0x0008, 0x0208, 0x0000, 0x0200, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x1000, 0x2020, 0x0200, +0x2880, 0x000A, 0x0000, 0x0400, 0x0000, 0x0001, 0x2000, 0x0000, 0x0200, +0x0000, 0x0048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x1000, 0x0011, +0x0400, 0x0000, 0x0000, 0x0009, 0x0040, 0x0004, 0x1000, 0x0000, 0x0000, +0x0208, 0x0000, 0x0208, 0x0021, 0x0200, 0x0000, 0x0080, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x2020, 0x0200, 0x2081, 0x0008, +0x0000, 0x0400, 0x0000, 0x0001, 0x2000, 0x0000, 0x0200, 0x0000, 0x0048, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x1000, 0x4000, 0x0001, 0x0488, 0x0804, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0001, 0x0000, 0x0020, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0940, 0x0000, 0x0001, 0x0000, 0x0020, 0x2481, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0800, 0x0000, 0x0000, 0x0000, 0x0020, 0x0800, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x1000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0060, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0040, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x1080, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x2000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0800, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0024, 0x0000, 0x0000, 0x0008, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0xA300, 0x0201, +0x0000, 0x0000, 0x0100, 0x0004, 0x0000, 0x0020, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x1400, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x1000, 0x0040, 0x0080, 0x0001, 0x0000, 0x0004, 0x0000, +0x0000, 0x0908, 0x0401, 0x0000, 0x0100, 0x0000, 0x0022, 0x0000, 0x0000, +0x0800, 0x2000, 0x0000, 0x0200, 0x2000, 0x0200, 0x0001, 0x0000, 0x0008, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0004, 0x0100, 0x0800, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x8A48, 0x0004, 0x0000, 0x0000, 0x2044, 0x0004, 0x0000, 0x8100, 0x2000, +0x0000, 0x0004, 0x0020, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x1000, +0x0010, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x4010, 0x0000, 0x4000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0024, 0x8000, 0x0004, 0x0004, 0x0000, 0x0040, 0x0800, 0x0000, +0x0000, 0x0040, 0x2000, 0x0000, 0x0004, 0x4000, 0x1240, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0008, 0x1040, 0x0040, 0x0000, 0x0020, +0x0000, 0x0000, 0x4004, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0600, 0x0000, 0x0000, 0x0000, 0x0400, 0x0040, 0x0000, +0x8000, 0x0004, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0004, 0x0000, 0x1242, 0x8000, 0x0000, 0x1000, 0x0008, +0x0000, 0x0004, 0x0008, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0800, +0x0006, 0x0020, 0x0000, 0x1000, 0x0000, 0x0400, 0x0040, 0x8000, 0x0000, +0x0000, 0x0800, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0500, 0x0000, 0x0200, 0x4480, 0x0000, 0x0800, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0820, 0x0100, 0x0000, 0x0800, 0x0100, 0x0000, +0x5800, 0x4410, 0x0080, 0x0000, 0x0000, 0x0002, 0x0100, 0x0020, 0x0000, +0x0001, 0x8000, 0x0820, 0x0200, 0x0800, 0x0410, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x4480, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0820, 0x0000, 0x0000, 0x0800, 0x0040, 0x4000, 0x5800, 0x0410, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0001, 0x0000, +0x0000, 0x0200, 0x0800, 0x8410, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0120, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x0804, 0x0003, 0x0092, 0x0200, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x0800, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x0020, 0x0000, 0x0002, 0x0000, +0x0000, 0x0040, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0080, 0x0200, +0x0000, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0100, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0100, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x1400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x1000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0400, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0200, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x8000, 0x0040, 0x0200, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0880, 0x0800, 0x0000, 0x0002, 0x0200, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0100, 0x0001, 0x0010, 0x0000, 0x0000, 0x4000, 0x0000, +0x1000, 0x0008, 0x0000, 0x0000, 0x8000, 0x0000, 0x4020, 0x2002, 0x0000, +0x0000, 0x0000, 0x0880, 0x0C00, 0x0000, 0x0800, 0x0000, 0x0010, 0x0202, +0x0000, 0x0800, 0x2090, 0x0100, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x8000, 0x0000, 0x0000, 0x8008, 0x0000, 0x4400, 0x0000, +0x0802, 0x1000, 0x0008, 0x0000, 0x0040, 0x0000, 0x0004, 0x0000, 0x0400, +0x0000, 0x0000, 0xC030, 0x0000, 0x0000, 0x0000, 0x1010, 0x0020, 0x0001, +0x0028, 0x0000, 0x1400, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0400, 0x0080, 0x0000, 0x0200, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x4000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0280, 0x0000, 0x0000, 0x0880, 0x0000, 0x0001, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0400, 0x8400, 0x2040, +0x0000, 0x0000, 0x8402, 0x0000, 0x0000, 0x0100, 0x0000, 0x0020, 0x0000, +0x0800, 0x0001, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0001, 0x0049, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0009, 0x8800, 0x0000, 0x2000, +0x0001, 0x0000, 0x0000, 0x1000, 0x0000, 0x0114, 0x0010, 0x0020, 0x0000, +0x0400, 0x0000, 0x0000, 0x0800, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x2000, 0xB042, 0x4825, +0x2C8A, 0x9409, 0x4904, 0x6480, 0x8009, 0x4A61, 0x0492, 0x5041, 0x5B26, +0x2C92, 0x1489, 0x000D, 0x4925, 0x0082, 0x9251, 0x000C, 0x2492, 0xA269, +0x4804, 0x2022, 0xB241, 0x4328, 0x2C92, 0x0409, 0x3041, 0x4921, 0x2052, +0x904A, 0x4105, 0x2482, 0x9241, 0x0864, 0x2082, 0x8041, 0x4926, 0x2482, +0x2409, 0x8259, 0x4925, 0x2892, 0x9749, 0x4904, 0x6492, 0x92DA, 0x4A24, +0x0492, 0x8241, 0x5924, 0x2412, 0x2009, 0xB20B, 0x4124, 0x2812, 0x9649, +0x4904, 0x2002, 0x9049, 0x4261, 0x2092, 0x0240, 0x5B24, 0x2492, 0x0481, +0x0009, 0x4104, 0x0092, 0x1259, 0x010C, 0x0492, 0x3240, 0x0004, 0x2042, +0xB201, 0x4728, 0x0412, 0x2001, 0x3049, 0x4904, 0x2012, 0x9243, 0x4105, +0x20D2, 0x924D, 0x4040, 0x2082, 0x9240, 0x4904, 0x2492, 0x2409, 0x9059, +0x0804, 0x2892, 0x9609, 0x4904, 0x6482, 0x12DA, 0x0224, 0x24B0, 0x9241, +0x5924, 0x2492, 0x0009, 0x0000, 0x0001, 0x0420, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, +0x0040, 0x0002, 0x0080, 0x2000, 0x4012, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x2020, 0x0040, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0600, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x2002, 0x4000, 0x0202, 0x0000, 0x1010, 0x0000, 0x0134, 0x0200, 0x0000, +0x4000, 0x0000, 0x0000, 0x4002, 0x0402, 0x0000, 0x0008, 0x0130, 0x0005, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x0E80, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0001, 0x0004, 0x0000, +0x0400, 0x0000, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0440, +0x0000, 0x0000, 0x0080, 0x0000, 0x0005, 0x2002, 0x0004, 0x0080, 0x0000, +0x0000, 0x0000, 0x0900, 0x40A0, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x8010, 0x0000, 0x0000, 0x2400, 0x0001, +0x9000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, +0x0000, 0x8300, 0x1000, 0x0000, 0x0440, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x8000, 0x0004, 0x0000, 0x0441, 0x0000, 0x0000, +0x8080, 0x0000, 0x0000, 0x2002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0900, 0x0080, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x1008, 0x0000, +0x0000, 0x9200, 0x0800, 0x0000, 0x0000, 0x2400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0400, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x2000, 0x0009, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0004, 0x04A0, 0x0000, 0x0000, 0x0088, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0080, 0x0200, 0x4008, 0x0010, +0x0000, 0x0200, 0x0000, 0x0000, 0x0800, 0x8200, 0x0000, 0x8000, 0x0000, +0x0000, 0x0400, 0x4000, 0x8008, 0x0001, 0x0000, 0x0004, 0x4000, 0x0010, +0x4000, 0x0400, 0x0020, 0x0110, 0x1100, 0x0000, 0x1000, 0x0421, 0x0000, +0x8000, 0x0000, 0x0000, 0x4002, 0x0008, 0x0000, 0x0000, 0x0000, 0x2400, +0x920B, 0x4921, 0x2812, 0x9359, 0x4904, 0x6012, 0x9241, 0x0A20, 0x0410, +0x8241, 0x5924, 0x2492, 0x2509, 0xB049, 0x0800, 0x6080, 0x9248, 0x090C, +0x0042, 0xB279, 0x006D, 0x0090, 0x9211, 0x4964, 0x2482, 0x2428, 0x9049, +0x0900, 0x2090, 0xB248, 0x5944, 0x2490, 0x924B, 0x0064, 0x2012, 0x9241, +0x4904, 0x2482, 0x2419, 0x83CD, 0x4924, 0x2892, 0x9349, 0x4984, 0x6092, +0x9A49, 0x0225, 0x2412, 0x9241, 0x5924, 0x2492, 0x2409, 0x9202, 0x4920, +0x2092, 0x1259, 0x0900, 0x6490, 0x9049, 0x4A24, 0x2092, 0x9041, 0x5920, +0x2492, 0x2529, 0xB249, 0x4925, 0x6092, 0x8049, 0x490C, 0x0412, 0xA251, +0x086D, 0x24C2, 0x0050, 0x4164, 0x0412, 0x0401, 0x9249, 0x4124, 0x2010, +0xB249, 0x8100, 0x20B2, 0x120A, 0x0844, 0x2082, 0x1241, 0x0924, 0x2416, +0x2001, 0x9281, 0x4904, 0x2892, 0x9209, 0x4904, 0x6412, 0x9249, 0x0A25, +0x2092, 0x8241, 0x5904, 0x2492, 0x0009, 0x0008, 0x2400, 0x0600, 0x0000, +0x0004, 0x0000, 0x0200, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0080, 0x0000, 0x0800, +0x0400, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, 0x0080, 0x0008, 0x0040, +0x0020, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4800, 0x2084, 0xB798, 0x064F, 0x80A3, 0xA2D4, 0x094D, +0xA5C0, 0xB400, 0xD96C, 0x288A, 0x8642, 0xDB6F, 0xFA3F, 0x2217, 0x3A59, +0x42F1, 0x1604, 0x36CC, 0x23B7, 0x22B0, 0xF425, 0x4E67, 0xA020, 0x8A2D, +0x2D49, 0x001E, 0x3206, 0x36D8, 0x0225, 0x06B0, 0xF6CC, 0x2F75, 0x2C86, +0xB409, 0xFE61, 0x1400, 0x8B0D, 0x8D2D, 0x0118, 0x0108, 0x97BD, 0x275D, +0x8B0B, 0x9210, 0x19E5, 0x654F, 0x9004, 0xCB7C, 0x018A, 0xC062, 0x5E7F, +0xD637, 0xCBA0, 0x520A, 0xB804, 0x5B0C, 0x0642, 0x1B00, 0x4A25, 0xD096, +0x6B21, 0x51E0, 0x8BF4, 0x4920, 0x0400, 0xF92A, 0x1480, 0xB028, 0xCD29, +0x120A, 0x146C, 0xC995, 0x1093, 0x900C, 0x5B00, 0x069B, 0x9B00, 0xB222, +0x4920, 0x4308, 0xB06C, 0xCD15, 0x000A, 0x1908, 0xC328, 0x809F, 0x0800, +0xCB61, 0x86B3, 0x1960, 0xB724, 0xDA24, 0x2002, 0x9900, 0x4024, 0xA5A6, +0x4A08, 0x9E20, 0xA5B2, 0x5003, 0xD8A2, 0x0DD4, 0xE880, 0xAB12, 0x2502, +0x6805, 0x5010, 0x6490, 0x4125, 0xE491, 0x6496, 0x6953, 0xA400, 0x243D, +0x6019, 0x2418, 0x6880, 0x0881, 0x0005, 0x0002, 0x0A12, 0x4805, 0x0400, +0x0500, 0x2848, 0x2051, 0x6491, 0x40C4, 0x0013, 0x0A01, 0xAE90, 0x6535, +0x4013, 0x6042, 0x2900, 0x00C0, 0x1030, 0x4402, 0x8008, 0x2091, 0x4044, +0x0282, 0x0003, 0x6082, 0x4811, 0x0082, 0x0020, 0x510B, 0xA412, 0x00C8, +0x40DD, 0x2402, 0x2045, 0x16B0, 0x2080, 0x2008, 0x0000, 0x7D27, 0x0CD3, +0x0000, 0x4D30, 0xF693, 0x0000, 0x6900, 0xA6B3, 0x1005, 0x4A40, 0x269A, +0x00C9, 0xA002, 0x4DA5, 0x008B, 0x0000, 0x5B00, 0x3459, 0x0081, 0x6805, +0xB4DB, 0x8201, 0x4028, 0xB693, 0x042D, 0x0004, 0x6D25, 0x02DB, 0x0448, +0x4908, 0x30DA, 0x0201, 0x4801, 0xA4D3, 0x8001, 0x4101, 0x35D2, 0x042D, +0x0000, 0x6807, 0x2C83, 0x1008, 0x6D90, 0xE67B, 0x1008, 0x6C04, 0x3493, +0x004D, 0x0020, 0xA08B, 0xC749, 0x97ED, 0x8092, 0xF608, 0x7668, 0x20B3, +0x4048, 0x5B2F, 0x05B7, 0x1048, 0xCEFC, 0x253E, 0x9041, 0x9664, 0x1CCC, +0x2050, 0xB250, 0xADDD, 0x2488, 0x0282, 0x957C, 0x0408, 0x0200, 0x5060, +0x07C3, 0x0048, 0xB200, 0x8D49, 0x0090, 0xB000, 0xF833, 0x2483, 0x0601, +0x986C, 0x242E, 0x1208, 0x4B70, 0x0262, 0x8209, 0x6900, 0xF643, 0x05B2, +0x0658, 0x2B60, 0x001F, 0x5080, 0xCF60, 0x01F9, 0x8248, 0x97BC, 0xCFD7, +0x1650, 0x1064, 0x5859, 0x4CB5, 0x02D9, 0x8847, 0x6988, 0xA4FA, 0x9048, +0x4E28, 0x34DA, 0x8201, 0x5000, 0xB6D1, 0x01A4, 0x4770, 0x6135, 0x4243, +0x30E0, 0x6D82, 0x0E01, 0x724A, 0x1CA4, 0x2290, 0x8941, 0x4930, 0x00DA, +0x4505, 0x506B, 0x49A5, 0x0392, 0x1288, 0x0D85, 0x0283, 0x67C3, 0x68E0, +0x12D3, 0x9401, 0x4998, 0xA09B, 0x5801, 0x0C59, 0x5CC1, 0x72EB, 0xB6DB, +0x4920, 0xB553, 0x2013, 0x4A00, 0xA6CA, 0x4611, 0x1009, 0x33C9, 0x002C, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0001, +0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0080, 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x2400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0400, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0040, 0x0000, 0x2000, 0x0000, 0x0001, 0x0008, 0x0000, 0x0000, +0x2000, 0x0040, 0x0000, 0x2000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0008, +0x0000, 0x2400, 0x0000, 0x0000, 0x0402, 0x0000, 0x0800, 0x0080, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x0000, 0x8008, 0x0000, +0x0000, 0x0010, 0x0000, 0x0400, 0x0000, 0x0000, 0x0080, 0x0040, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1000, +0x0000, 0x0008, 0x0001, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0000, 0x0000, 0x0408, +0x0000, 0x0200, 0x0000, 0x0208, 0x0040, 0x0000, 0x1000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0100, 0x0000, 0x0004, 0x0008, 0x2100, 0x0000, 0x0000, +0x0080, 0x0000, 0x8000, 0x0400, 0x0000, 0x0040, 0x0000, 0x8609, 0x0000, +0x0000, 0x0090, 0x0000, 0x0000, 0x0400, 0x0000, 0x1000, 0x2400, 0x8240, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0608, 0x0000, 0x0000, 0x1000, 0x0000, 0x0004, 0x1000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x2000, 0x0000, 0x0000, 0x0180, 0x0402, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x8209, 0x0000, 0x8000, 0x0090, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2400, 0x8640, 0x0000, 0x0800, +0x3400, 0x0000, 0x0000, 0x2020, 0x0400, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x1200, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0800, 0x0000, 0x0001, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0040, 0x4000, 0x0000, +0x0200, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0880, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x8008, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x8000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0300, 0x0004, +0x0820, 0x0000, 0x0000, 0x2000, 0x0040, 0x0200, 0x2004, 0x1001, 0x4200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0200, 0x0000, 0x0000, 0x0081, +0x0000, 0x8040, 0x0080, 0x0200, 0x0000, 0x0000, 0x0001, 0x0008, 0x0000, +0x0409, 0x0040, 0x0000, 0x0200, 0x2020, 0x8008, 0x2000, 0x0000, 0x0480, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0100, 0x1249, 0x0040, +0x0000, 0x2000, 0x0440, 0x0200, 0x2004, 0x1001, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0081, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0200, 0x0000, 0x0000, 0x0001, 0x0000, 0x8040, +0x0081, 0x0200, 0x0000, 0x0000, 0x0001, 0x0008, 0x0000, 0x0109, 0x0040, +0x0000, 0x4200, 0x2028, 0x8008, 0x2001, 0x0400, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0100, 0x1249, 0x0040, 0x0000, 0x0000, +0x0408, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0201, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0001, 0x0000, 0x0001, 0x0041, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0001, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0100, 0x0200, +0x0000, 0x1004, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, 0x0000, +0x0002, 0x0000, 0x0008, 0x0010, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0022, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0100, 0x0804, 0x0000, 0x0000, +0x0804, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0400, 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0080, 0x8000, 0x0000, 0x0000, 0x0402, 0x0000, 0x0000, +0x1000, 0x0000, 0x0002, 0x0024, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0400, 0x0008, 0x0000, +0x0000, 0x8000, 0x8200, 0x0000, 0x0200, 0x0100, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0401, 0x1208, 0x0000, 0x0000, 0x0000, +0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0001, +0x0000, 0x0000, 0x0000, 0x1210, 0x0008, 0x3400, 0x0004, 0x0002, 0x0000, +0x0000, 0x2000, 0x8000, 0x0101, 0x0400, 0x0000, 0x0020, 0x0010, 0x0000, +0x0000, 0x0108, 0x0000, 0x0100, 0x0020, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x8002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x1010, 0x0100, 0x0000, 0x0400, 0x0000, 0x0080, 0x0000, +0x0000, 0x4000, 0x0000, 0x0004, 0x0000, 0x0000, 0x1220, 0x0128, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0200, 0x0800, 0x1000, 0x0020, +0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x1000, 0x0020, 0x0000, 0x0000, 0x0004, 0x0004, +0x0000, 0x0000, 0x0000, 0x8000, 0x0800, 0x9000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0402, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0420, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x1000, 0x0040, 0x0000, 0x0020, 0x0004, 0x0010, 0x0100, 0x1080, +0x0004, 0x8022, 0x0800, 0x0100, 0x0000, 0x0000, 0x0300, 0x0400, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0480, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0010, 0x2000, 0x8020, 0x0080, 0x0000, 0x0800, +0x0000, 0x0000, 0x0004, 0x0020, 0x0000, 0x0400, 0x2000, 0x2000, 0x0200, +0x0820, 0x0000, 0x0000, 0x0000, 0x2000, 0x0008, 0x0000, 0x2000, 0x0000, +0x0000, 0x4800, 0x2000, 0x0000, 0x0000, 0x0C02, 0x0000, 0x0840, 0x0400, +0x0060, 0x0000, 0x0000, 0x0000, 0x4000, 0x5110, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0080, 0x0000, 0x0800, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0200, 0x0820, 0x0000, +0x0000, 0x0000, 0x2000, 0x0008, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x3000, 0x0000, 0x0000, 0x0802, 0x0000, 0x0800, 0x0400, 0x0040, 0x0400, +0x0000, 0x0000, 0x4000, 0x0010, 0x2000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x8102, 0x8000, 0x0000, 0x0800, 0x1000, +0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0020, 0x0000, +0x1100, 0x0000, 0x0000, 0x0000, 0x0020, 0x0020, 0x0000, 0x0000, 0x8100, +0x0000, 0x0002, 0x0000, 0x0000, 0x0001, 0x0400, 0x0200, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0080, 0x0000, 0x0000, 0x0100, 0x0030, +0x0000, 0x0000, 0x0002, 0x0000, 0x0020, 0x0000, 0x0000, 0x0400, 0x4010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0000, +0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x8000, 0x0024, 0x8000, 0x0400, +0x4000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0008, 0x0000, 0x0400, 0x0400, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0400, 0x0008, 0x0000, 0x1000, 0x0000, 0x0000, 0x0004, 0x0080, +0x0000, 0x0000, 0x0010, 0x2000, 0x0010, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x2001, 0x1100, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2010, +0x0000, 0x0010, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0800, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0001, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0001, 0x0000, 0x4000, 0x0080, 0x0000, 0x0000, 0x1000, 0x0010, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x1001, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x2001, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x2000, 0x8000, 0x0014, 0x0401, 0x0008, 0x0000, 0x0008, 0x0000, +0x2090, 0x0000, 0x0000, 0x0800, 0x0008, 0x8000, 0x0000, 0x0000, 0x0011, +0x0400, 0x0800, 0x2004, 0x0040, 0x0010, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0018, 0x0000, 0x0000, 0x0000, +0x0100, 0x0400, 0x0000, 0x0000, 0x1002, 0x0000, 0x8000, 0x8000, 0x4000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0200, 0x0040, +0x0000, 0x0000, 0x0080, 0x0000, 0x0200, 0x0080, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08C0, 0x1000, 0x0000, 0x2400, +0x0041, 0x4124, 0x2892, 0x9AA1, 0x4900, 0x6492, 0x92C9, 0x4A20, 0x2492, +0x1341, 0x5824, 0x2092, 0x0481, 0x9241, 0x4924, 0x0012, 0x9249, 0x4906, +0x2492, 0x124A, 0x4824, 0x2492, 0x1911, 0x4904, 0x2492, 0x0019, 0x1649, +0x4904, 0x2092, 0x9288, 0x4804, 0x0490, 0x0000, 0x4844, 0x0412, 0x1242, +0x4320, 0x2492, 0x6401, 0x9241, 0xC934, 0x0892, 0x9249, 0x4904, 0x6094, +0x9679, 0x0A24, 0x2482, 0x0080, 0x4922, 0x2492, 0x0409, 0x9249, 0x4925, +0x2812, 0x90C9, 0x4900, 0x6410, 0x92C9, 0x4A24, 0x2490, 0x1240, 0x5824, +0x2492, 0x0089, 0x1241, 0x4905, 0x2012, 0x9249, 0x4104, 0x2492, 0x9243, +0x4024, 0x2492, 0x9211, 0x0924, 0x0492, 0x0409, 0x1641, 0x4105, 0x2082, +0x8089, 0x4904, 0x0490, 0x8209, 0x4864, 0x0492, 0x1240, 0x4B20, 0x2692, +0x6401, 0x9201, 0x4825, 0x0090, 0x9248, 0x4100, 0x6092, 0x9659, 0x0A24, +0x2482, 0x12C1, 0x1924, 0x2480, 0x0009, 0x2020, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0800, 0x0040, 0x0000, 0x0000, 0x0012, 0x0000, 0x0000, +0x0004, 0x0001, 0x0000, 0x0802, 0x0000, 0x0000, 0x0008, 0x0892, 0x0000, +0x0000, 0x0080, 0x0000, 0x1200, 0x0000, 0x0001, 0x0000, 0x0000, 0x000A, +0x0000, 0x0004, 0x0000, 0x0000, 0x8800, 0x0092, 0x0001, 0x8200, 0x0000, +0x0001, 0x8400, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x2000, 0x0000, 0x0001, +0x0100, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00D0, +0x2000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0020, 0x0000, 0x0000, 0x1040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0444, 0x0400, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0202, 0x0000, 0x0400, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0010, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0410, 0x0040, 0x0000, +0x6000, 0x0409, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x4080, 0x0000, +0x0001, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0040, 0x0000, 0x2000, 0x0009, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0400, +0x0000, 0x0000, 0x0202, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4120, 0x2000, 0x0000, 0x0000, 0x0002, 0x0000, 0x4000, 0x0080, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x4000, 0x0020, 0x0008, 0x0000, +0x0000, 0x0012, 0x4100, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x1000, +0x0000, 0x0000, 0x1400, 0x8000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0101, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x2040, 0x0009, 0x0000, 0x0000, 0x0000, 0x4000, +0x0400, 0x0000, 0x0000, 0x0000, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x9249, 0x4924, 0x2812, 0x92C8, 0x4905, 0x6492, 0x9059, +0x4A24, 0x2492, 0x9241, 0x5125, 0x24D2, 0x2888, 0x9249, 0x4924, 0x0092, +0x9249, 0x4904, 0x2492, 0x925B, 0x4804, 0x2412, 0x9241, 0x4904, 0x2492, +0x2409, 0x9259, 0x4904, 0x2090, 0x96C8, 0x4904, 0x2492, 0x9249, 0x4824, +0x2493, 0x9201, 0x4904, 0x0492, 0x8419, 0x9009, 0x09A0, 0x2892, 0x92C9, +0x4104, 0x6692, 0x1641, 0x1A24, 0x24B2, 0x92D1, 0x5B24, 0x2490, 0x2409, +0x9249, 0x4924, 0x2892, 0x92C9, 0x4925, 0x4490, 0x9259, 0x4A24, 0x0492, +0x9241, 0x5925, 0x2492, 0x2CA9, 0xD249, 0x4924, 0x2012, 0x9249, 0x4104, +0x2482, 0x925B, 0x4C24, 0x0090, 0x9241, 0x4924, 0x0492, 0x8401, 0x5A1C, +0x4904, 0xA010, 0x87C9, 0x4904, 0x0480, 0x8A49, 0x0826, 0x0000, 0x9340, +0x4126, 0x2492, 0x0409, 0x924D, 0x4124, 0x2882, 0x12C8, 0x4904, 0x6482, +0x1449, 0x0AA4, 0x0090, 0x92D1, 0x1B24, 0x2002, 0x0009, 0x0000, 0x0400, +0x0400, 0x0000, 0x0000, 0x2001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x2042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000A, +0x0000, 0x0000, 0x2008, 0x0000, 0x4000, 0x2402, 0x0001, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x240A, 0x0000, 0x0000, 0x1040, 0x0000, 0x7026, 0xB6DB, 0x072D, 0x00B0, +0xB6D3, 0x1F6D, 0x0D80, 0xB408, 0xBB6D, 0x6802, 0x8503, 0xDB6D, 0x4D30, +0x2213, 0xB2E9, 0x4267, 0x0228, 0x95CD, 0x0F65, 0x80AA, 0x8C48, 0x9D6F, +0x2142, 0x0348, 0xDF5C, 0x283A, 0x20D0, 0xE478, 0x624C, 0xA4D8, 0x944C, +0x0DEA, 0x3418, 0xD401, 0xD38D, 0xE402, 0xC361, 0x51F9, 0x0B3B, 0x0089, +0x83DB, 0x477F, 0x8552, 0xB6D0, 0x394C, 0x85C2, 0xB404, 0xC97E, 0x212A, +0x880A, 0xDACD, 0xB657, 0x8B08, 0xD248, 0xB844, 0x590D, 0x9245, 0x0920, +0xC06D, 0x909E, 0x0884, 0x8368, 0x88B4, 0x4024, 0x9A45, 0xC96C, 0x1410, +0xD00C, 0xC905, 0x3043, 0x1108, 0x5B86, 0x60B6, 0x0324, 0xDA22, 0x4696, +0x0901, 0x9A06, 0x4B35, 0x88C4, 0x9015, 0x79A5, 0x2082, 0x1A21, 0x6974, +0x3892, 0x2044, 0x2F23, 0x06D6, 0x8200, 0xB404, 0xDBE4, 0x2440, 0x9904, +0x4A2D, 0x0266, 0x0A03, 0x5EA4, 0x90B2, 0x5B05, 0x6800, 0x45B0, 0x4000, +0xDB32, 0x2590, 0x6125, 0xD032, 0xEC06, 0x0920, 0xE091, 0x10B6, 0x4943, +0x84A8, 0x05B5, 0x6319, 0x2212, 0x0589, 0x0401, 0x0001, 0x2270, 0x4492, +0x4804, 0x02D3, 0x6D18, 0x4440, 0x80D8, 0x4050, 0x4122, 0x8002, 0x5020, +0x2502, 0x2905, 0x4018, 0x0002, 0x0808, 0x0008, 0x0281, 0x0848, 0xA022, +0x0081, 0x8008, 0x3043, 0x1020, 0x6003, 0x4811, 0x2080, 0x2080, 0x0003, +0xC4C2, 0x0040, 0x615F, 0x2480, 0x0085, 0x4E91, 0x155A, 0x0008, 0x8000, +0x4D27, 0x0CD2, 0x8000, 0x4911, 0x669B, 0x1800, 0x4900, 0xA49A, 0x400D, +0x4004, 0x24D2, 0x08CD, 0x1200, 0x4D3D, 0x609C, 0x1329, 0x6901, 0x349B, +0x8282, 0x6C00, 0x2293, 0x0001, 0x4800, 0x2083, 0x000D, 0x0008, 0x49B5, +0x22D3, 0x0000, 0x6980, 0x329B, 0x4001, 0x6C00, 0xB6DA, 0x5001, 0x0910, +0xA693, 0x040D, 0x0040, 0x6C27, 0x0C82, 0x9000, 0x4990, 0xC693, 0x1008, +0x4D04, 0x3693, 0x000D, 0x4800, 0x36DB, 0xFF68, 0x47ED, 0xA090, 0xF609, +0x7A6F, 0x24B6, 0xD840, 0xC37F, 0x25AF, 0x1241, 0x9FFC, 0x2C38, 0x9209, +0x3060, 0x8DCC, 0x3080, 0x1243, 0xC4D4, 0x0482, 0x0240, 0x7D61, 0x00A7, +0x9448, 0xD602, 0x06A7, 0x9658, 0x1C20, 0x9331, 0x2400, 0x0008, 0x3A85, +0x0403, 0x0440, 0xA374, 0x00A4, 0x0001, 0x2ED0, 0x424C, 0x1048, 0xF020, +0xF7A0, 0x0192, 0xB659, 0x2329, 0x247F, 0xF048, 0x47E5, 0x217B, 0x8048, +0xB3EC, 0x07F6, 0x8800, 0x0045, 0x1043, 0x4DB6, 0x02BB, 0x02D0, 0x6D88, +0x32DA, 0x2600, 0x6E30, 0x16D3, 0x3001, 0x50C0, 0xB4DB, 0x60A9, 0x7292, +0x6984, 0x8091, 0x3248, 0x4C88, 0x2092, 0x8045, 0x5019, 0x3091, 0x2CA1, +0xC849, 0x32CA, 0xA503, 0xD8CC, 0x0D14, 0xA2D2, 0x8758, 0x4F05, 0x2050, +0x9C0A, 0x1C27, 0x361B, 0x9151, 0x8923, 0x240E, 0x4900, 0x041C, 0x48A5, +0x42C9, 0x9C52, 0x6D88, 0x159A, 0xA01B, 0x4E00, 0xA4C8, 0xDE51, 0x504C, +0xA613, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9009, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0021, 0x0000, 0x0000, 0xA000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0401, 0x0804, 0x2000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x4040, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x8000, 0x4804, 0x0000, 0x8000, +0x0100, 0x0800, 0x0000, 0x0800, 0x4003, 0x0000, 0x0100, 0x0002, 0x0200, +0x0000, 0x0004, 0x4000, 0x0401, 0x0200, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x8040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, 0x0020, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x2010, 0x0400, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x2000, 0x0000, +0x0000, 0x0001, 0x2000, 0x0000, 0x0080, 0x0000, 0x8009, 0x2000, 0x0000, +0x1000, 0x0000, 0x0040, 0x8000, 0x0020, 0x8200, 0x0000, 0x0080, 0x0004, +0x2000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0420, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0201, 0x0000, 0x2080, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0000, 0x0008, 0x2000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0880, 0x0410, 0x0000, 0x2000, 0x0000, 0x0100, 0x0000, +0x0040, 0x0000, 0x0000, 0x8200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0001, 0x0400, 0x1000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0201, 0x0048, 0x2080, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0001, 0x2000, 0x0200, 0x2000, 0x0408, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0400, 0x0240, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x2080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x8000, 0x0000, +0x0240, 0x0000, 0x0020, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0081, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x1000, +0x0000, 0x0000, 0x2000, 0x0000, 0x8200, 0x0400, 0x0000, 0x0000, 0x0400, +0x0200, 0x0000, 0x0000, 0x0000, 0x0080, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x2480, 0x0040, 0x0001, 0x0000, 0x8000, 0x0100, +0x0000, 0x0201, 0x0000, 0x0200, 0x2080, 0x0000, 0x0008, 0x0000, 0x0101, +0x0400, 0x0400, 0x0001, 0x0000, 0x0000, 0x0200, 0x0002, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x2200, 0x0000, 0x8200, 0x0401, 0x0400, 0x0000, 0x0400, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x8000, 0x2480, 0x0040, 0x0001, 0x0000, 0x8000, 0x0000, 0x0000, 0x0201, +0x0000, 0x0200, 0x2081, 0x0000, 0x0008, 0x0000, 0x0001, 0x0000, 0x0400, +0x0081, 0x0000, 0x0000, 0x0280, 0x0000, 0x0000, 0x0081, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0001, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0100, +0x0001, 0x0000, 0x4800, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0100, +0x0082, 0x0000, 0x0000, 0x0000, 0xA000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0200, 0x0000, 0x0000, 0x0600, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0800, +0x0800, 0x0000, 0x0000, 0x0080, 0x0080, 0x8000, 0x0000, 0x0000, 0x0001, +0x0000, 0x4000, 0x0000, 0x0000, 0x0020, 0x0004, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0100, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0004, +0x0000, 0x0001, 0x0000, 0x8000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0004, +0x0000, 0x0000, 0x4000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x5000, 0x0020, 0x0040, 0x0400, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0100, 0x0000, +0x0002, 0x0020, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0004, 0x4000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x1000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0400, 0x0004, +0x0000, 0x0000, 0x0010, 0x0000, 0x8100, 0x0200, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0008, 0x0004, +0x0000, 0x0200, 0x0001, 0x0400, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0101, 0x0000, 0x0000, +0x0242, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x8001, 0x0000, 0x0080, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0012, 0x0000, 0x0000, 0x0000, 0x0080, 0x0301, 0x4400, 0x0400, 0x0000, +0x0004, 0x0010, 0x0000, 0x0004, 0x0000, 0x0008, 0x0200, 0x0000, 0x0000, +0x0000, 0x8000, 0x0020, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0220, 0x0000, 0x0200, 0x0000, 0x0000, 0x0080, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0080, 0x9000, 0x0004, 0x0000, 0x4000, 0x0000, 0x0130, 0x0000, +0x080C, 0x0000, 0x0080, 0x2000, 0x4002, 0x0400, 0x1080, 0x0000, 0x0010, +0x0000, 0x0000, 0x0100, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0010, +0x0000, 0x0000, 0x0000, 0x0004, 0x8000, 0x0004, 0x0200, 0x8000, 0x0809, +0x0000, 0x0000, 0x0004, 0xC000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x1100, 0x0100, 0x0000, 0x1000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0400, 0x0020, 0x0000, 0x0000, 0x8000, 0x0000, 0x0009, 0x0600, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0804, 0x0000, 0x0000, 0x0100, +0x8400, 0x0004, 0x0000, 0x0000, 0x0020, 0x0000, 0x0804, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0510, 0x0000, 0x1000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0400, 0x0020, 0x4800, 0x0000, 0x0002, 0x0100, 0x4000, +0x0001, 0x0000, 0x1040, 0x0000, 0x0000, 0x0000, 0x0004, 0x1000, 0x0000, +0x0400, 0x4000, 0x0000, 0x01A0, 0x0000, 0x0000, 0x0000, 0x0404, 0x0000, +0x0040, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0400, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0400, 0x0020, 0x4800, 0x0000, 0x0000, 0x0100, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0420, 0x0000, 0x0420, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0408, 0x0000, 0x0100, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0208, 0x0024, 0x0000, 0x0000, +0x0100, 0x0800, 0x0000, 0x8900, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0020, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x4000, 0x0040, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0008, 0x0000, 0x0000, 0x0000, 0x0401, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0084, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x8000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0002, 0x0000, 0x0001, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x4800, +0x0000, 0x0000, 0x4010, 0x0000, 0x0001, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x4000, 0x0000, 0x0800, 0x0204, 0x0000, 0x0000, 0x0009, +0x0000, 0x0020, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x4000, 0x0082, 0x8001, 0x0000, 0x0100, 0x0000, 0x0000, 0x0010, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0209, 0x8200, 0x4104, 0x8000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0001, 0x0200, 0x0000, +0x0000, 0x0000, 0x0180, 0x0080, 0x0460, 0x0000, 0x0800, 0x000C, 0x0020, +0x0000, 0x0401, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0008, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0020, 0x0000, +0x0040, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0040, 0x4000, 0x0100, 0x2000, 0x0004, +0x0000, 0x0008, 0x0400, 0x4000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0020, 0x0400, 0x9248, 0x4924, 0x2992, 0x1240, 0x4804, 0x4492, 0x8249, +0x4A64, 0x2092, 0x1240, 0x5B04, 0x2592, 0x6589, 0x9249, 0xC928, 0x0092, +0x0240, 0x4904, 0x2492, 0x9248, 0x4800, 0x2492, 0x1201, 0x4B24, 0x2492, +0x0408, 0x1203, 0x4934, 0x4092, 0x9203, 0x4904, 0x2492, 0x1E08, 0x682C, +0x6092, 0x3681, 0x4924, 0x2C80, 0x0409, 0x9041, 0x4B24, 0x2892, 0x9AC9, +0x4904, 0x6492, 0x9219, 0x6A20, 0x2492, 0x1251, 0x5924, 0x2492, 0x2409, +0x9249, 0x4925, 0x2882, 0x1208, 0x4900, 0x4492, 0x9249, 0x4A64, 0x2492, +0x9240, 0x5B04, 0x2492, 0x6181, 0x9209, 0x4821, 0x209A, 0x9248, 0x6104, +0x2092, 0x9249, 0x0004, 0x2492, 0x9201, 0x4224, 0x2492, 0x2400, 0x924B, +0x41A5, 0x6092, 0x924A, 0x4404, 0x2492, 0x0648, 0x482C, 0x0082, 0xB6C1, +0x4124, 0x2400, 0x2409, 0x9249, 0x4925, 0x2892, 0x90C9, 0x4904, 0x6490, +0x9259, 0x0A24, 0x2493, 0x1211, 0x1924, 0x2492, 0x1009, 0x4000, 0x0001, +0x0400, 0x0804, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x4022, 0x0000, 0x1000, 0x0800, +0x0002, 0x0000, 0x0900, 0x0000, 0x0008, 0x0000, 0x0020, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0058, 0x0000, 0x0000, 0x0000, +0x8200, 0x0820, 0x0001, 0x8400, 0x4004, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0004, 0x0000, 0x0080, 0x0000, 0x0000, 0x0082, 0x0000, 0x8002, +0x0000, 0x2000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x0100, 0x0001, 0x0000, 0x4000, 0x0000, 0x0000, +0x1000, 0x0404, 0x0080, 0x0000, 0x0100, 0x4000, 0x0000, 0x0100, 0x0010, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x2000, 0x2000, 0x0001, +0x0800, 0x0000, 0x0000, 0x2000, 0x0200, 0x0000, 0x0000, 0x2100, 0x0000, +0x4004, 0x0000, 0x0000, 0x0000, 0x0002, 0x5400, 0x0000, 0x0080, 0x0400, +0x0000, 0x0300, 0x0800, 0x1000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0880, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0180, 0x0000, 0x0020, 0x0000, 0x0000, 0x0004, 0x0020, 0x0080, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0200, 0x0040, 0x0000, 0x2000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x1000, 0x0000, 0x2010, 0x0000, 0x0000, +0x0080, 0x0000, 0x8000, 0x0020, 0x0000, 0x8000, 0x0800, 0x0000, 0x0040, +0x0004, 0x0010, 0x0000, 0x0820, 0x0010, 0x0008, 0x0200, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0800, 0x0080, 0x0400, 0x4804, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0104, 0x0000, 0x0400, 0x0800, 0x0000, 0x0000, +0x0100, 0x0002, 0x0000, 0x4000, 0x0100, 0x0000, 0x0000, 0x1100, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0104, 0x4880, 0x0480, 0x4008, 0x0002, +0x0100, 0x0040, 0x4400, 0x0000, 0x00E0, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0400, 0x9249, 0x4924, 0x2492, 0x9249, 0x4904, +0x6492, 0x1241, 0x4A24, 0x249A, 0x92C1, 0x5964, 0x2492, 0x248D, 0x9249, +0x4824, 0x2092, 0x9249, 0x410D, 0x2492, 0xB20B, 0x0824, 0x2492, 0x90C1, +0x4926, 0x2492, 0x2409, 0x92D9, 0x0924, 0x2092, 0x9249, 0x0904, 0x2490, +0xD249, 0x4824, 0x2492, 0x9240, 0x0904, 0xA012, 0x0409, 0x9249, 0x6924, +0x2892, 0x8249, 0x4904, 0x6492, 0x1009, 0x4E24, 0x2482, 0x9241, 0x5925, +0x2492, 0xA409, 0x9249, 0x0924, 0x2C92, 0x9249, 0x4904, 0x6492, 0x9249, +0x4AA4, 0x2482, 0x92C1, 0x5964, 0x2492, 0x2689, 0x926D, 0x4924, 0x2092, +0xD24D, 0x4909, 0x2492, 0xB20B, 0x48A4, 0x2492, 0x93E1, 0x4924, 0xA492, +0x2601, 0x8AD8, 0x4934, 0x2012, 0x9249, 0x4906, 0x2490, 0x9349, 0x4824, +0x2412, 0x9201, 0x4D24, 0x2492, 0x3409, 0x9249, 0x4924, 0x2892, 0x9349, +0x4904, 0x6492, 0x904D, 0x4A24, 0x2492, 0x9261, 0x5925, 0x2492, 0x0009, +0x0000, 0x2400, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x2402, 0x0000, +0x4000, 0x0482, 0x0001, 0x0002, 0x3C12, 0x0008, 0x0060, 0xA080, 0x0241, +0x0200, 0x0800, 0x2402, 0x4000, 0x4000, 0x0482, 0x0001, 0x0002, 0x3C12, +0x0008, 0x0060, 0xA080, 0x0241, 0x0200, 0x0800, 0x2412, 0x4000, 0x4000, +0x0482, 0x0001, 0x0002, 0x3C12, 0x0008, 0x0060, 0xA080, 0x0241, 0x0200, +0x0800, 0x2412, 0x4000, 0x4000, 0x0482, 0x0001, 0x0002, 0x3C12, 0x0008, +0x0060, 0xA080, 0x0241, 0x0200, 0x0800, 0x2412, 0x4000, 0x4000, 0x0502, +0x0001, 0x0004, 0x2412, 0x0008, 0x0000, 0x2080, 0x0241, 0x0000, 0x0800, +0x2412, 0x0000, 0x4000, 0x0502, 0x0001, 0x0004, 0x2412, 0x0008, 0x0000, +0x2080, 0x0241, 0x0000, 0x0800, 0x2402, 0x0000, 0x4000, 0x0502, 0x0001, +0x0004, 0x2412, 0x0008, 0x0000, 0x2080, 0x0241, 0x0000, 0x0800, 0x2402, +0x0000, 0x4000, 0x0502, 0x0001, 0x0004, 0x2412, 0x0008, 0x0000, 0x2080, +0x0241, 0x0000, 0x0000, 0x4414, 0xB4D9, 0x036F, 0x0218, 0x96DA, 0x7B67, +0xE080, 0xB400, 0xD96D, 0xE40C, 0x9800, 0xDD7D, 0x2456, 0x2496, 0x3741, +0x637D, 0x2242, 0xB640, 0x3A64, 0x00F6, 0xFC04, 0xCB6C, 0x0812, 0x4803, +0xDFE9, 0x2016, 0x94C0, 0xB459, 0x61BA, 0x90AA, 0xDE40, 0x180D, 0xAC10, +0x74AD, 0x69ED, 0x7603, 0xC008, 0xF131, 0x0635, 0x0004, 0xF6C9, 0x436D, +0x0085, 0xB3D1, 0x7B6F, 0x7132, 0xAC00, 0xDB0D, 0x8C4E, 0x18C3, 0xD96E, +0xB656, 0x1B20, 0x0048, 0xB0A4, 0xD965, 0x324C, 0x819C, 0x0B6D, 0x9092, +0x4214, 0x0F61, 0x9592, 0x4AA4, 0x9222, 0x5F68, 0x0090, 0x9100, 0x4925, +0x40C6, 0x0829, 0x5B1B, 0x9092, 0x1921, 0xC131, 0x0495, 0x0130, 0x9623, +0x4DA5, 0xC880, 0x9341, 0x4B47, 0x22C6, 0x0650, 0x617D, 0x001A, 0x9A00, +0x8D60, 0x8CBA, 0x4048, 0x9000, 0xCB28, 0x8230, 0xF924, 0x59E0, 0x8C06, +0x8900, 0x8A47, 0x00B6, 0x6840, 0x5122, 0x1434, 0x4A05, 0x5B30, 0x2910, +0x0D27, 0xD881, 0x2406, 0x0931, 0x0491, 0x2436, 0x4859, 0x3450, 0x01B1, +0x6AF8, 0x2042, 0x2589, 0xE000, 0x0425, 0x7000, 0x14D0, 0x4000, 0x0452, +0x4C00, 0x000D, 0x66D8, 0x4001, 0x0BC0, 0xA01B, 0x490D, 0x4032, 0x6925, +0x900C, 0xA400, 0x0001, 0x2491, 0x1082, 0x0802, 0x0002, 0x10A0, 0x0201, +0x0603, 0x0108, 0x6502, 0x09A7, 0x0092, 0x6030, 0x4833, 0x0290, 0x2498, +0x0043, 0x2412, 0x2009, 0x4618, 0x2080, 0x000C, 0x0000, 0x5D27, 0x0891, +0x0240, 0x6920, 0x2498, 0x8000, 0x4900, 0x36D2, 0x8009, 0x5020, 0x22D2, +0x00A9, 0x8400, 0x4CB5, 0x0292, 0x0120, 0x4980, 0x069B, 0x9258, 0x4800, +0xB493, 0x0001, 0x4821, 0x241B, 0x0029, 0x8088, 0x59A5, 0x225B, 0x8040, +0x2980, 0x26D2, 0x0240, 0x4820, 0xB6DA, 0xC000, 0x0008, 0x34DA, 0x000C, +0x0000, 0x0BB7, 0x40D3, 0x0041, 0x6D20, 0x069A, 0x1002, 0x6900, 0x24D2, +0x0801, 0x5100, 0x26B1, 0x7F29, 0xDBC9, 0x2090, 0xF24A, 0xD1A7, 0x049D, +0x1A43, 0x137F, 0x263D, 0x8009, 0x1FF0, 0x31DF, 0x9409, 0x5104, 0x5349, +0x2140, 0x9049, 0x9CC9, 0x240E, 0x3040, 0x4C27, 0x243A, 0x0248, 0xFA50, +0x0396, 0x92C0, 0x1D04, 0x6625, 0x2410, 0x9080, 0x2217, 0x4404, 0x1009, +0x381F, 0x24CA, 0x0001, 0x1C71, 0x4B75, 0x8201, 0xA221, 0xFF7F, 0x6400, +0x3208, 0xFAAC, 0x009E, 0x3041, 0xC349, 0x0477, 0x9209, 0x5380, 0x1E3E, +0x904A, 0x8004, 0x84CB, 0x79B5, 0x02D8, 0x0298, 0x4D80, 0x56D0, 0x9080, +0x6CA4, 0xA49B, 0xB005, 0x5005, 0xB08B, 0x4A8D, 0x00B3, 0x6825, 0x02CB, +0xE20A, 0x6D09, 0x1792, 0xA0C0, 0x2460, 0xA492, 0x37E1, 0x0028, 0x3252, +0xA009, 0xB348, 0x4D34, 0x6000, 0x5898, 0x0508, 0x349A, 0x8620, 0x2C65, +0x445B, 0xA310, 0x01C6, 0xD482, 0x6C2C, 0x10D1, 0xAD25, 0x02DB, 0x860B, +0x6888, 0x54D9, 0x1804, 0x6408, 0xB69B, 0x86F5, 0x5941, 0xBCD8, 0x0009, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x2000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, +0x0000, 0x1000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0020, 0x0000, 0x2000, 0x4040, 0x0080, 0x0000, 0x2000, 0x0020, 0x0000, +0x0120, 0x4800, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8004, 0x0000, 0x0000, 0x8020, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x4000, 0x0000, 0x8000, 0x0020, 0x0000, +0x0000, 0x0800, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0200, 0x0000, 0x0001, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x8080, 0x0000, 0x0840, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0600, 0x0000, 0x0000, 0x1002, 0x0200, 0x0000, +0x0008, 0x1000, 0x0000, 0x0000, 0x0004, 0x0400, 0x2080, 0x0048, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x9040, 0x0001, 0x0000, 0x0088, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0040, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0800, 0x0441, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0280, 0x1000, 0x0000, 0x0241, 0x0040, 0x8000, +0x0400, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x000A, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x2080, 0x0048, 0x0002, 0x0000, 0x0000, +0x0000, 0x2004, 0x9040, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0050, 0x0000, 0x0000, 0x0000, 0x8000, 0x0020, +0x0000, 0x0004, 0x0000, 0x0000, 0x0041, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0241, 0x0040, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0004, 0x0000, +0x3000, 0x0048, 0x0000, 0x1000, 0x0124, 0x0000, 0x2000, 0x0050, 0x0000, +0x0000, 0x4008, 0x0010, 0x0000, 0x8000, 0x0000, 0x0000, 0x8000, 0x0024, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0010, 0x0004, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x1000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0201, 0x0000, 0x0404, 0x0000, 0x0000, 0x0000, 0x0201, +0x0021, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x8200, 0x0400, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0004, 0x0008, 0x0000, +0x8000, 0x0001, 0x0600, 0x0080, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x1000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0080, +0x0201, 0x0000, 0x0C04, 0x0000, 0x0000, 0x0000, 0x0201, 0x0020, 0x0000, +0x0001, 0x0009, 0x0000, 0x0000, 0x1002, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x8200, 0x0400, 0x1000, 0x0101, 0x0400, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0004, 0x0008, 0x0000, 0x0000, 0x0001, +0x0400, 0x4000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0400, +0x0000, 0x0020, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002, 0x1000, 0x0004, +0x0000, 0x0200, 0x4000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0011, 0x0400, 0x4000, 0x0000, 0x0000, 0x0100, 0x8010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0200, 0x0004, 0x0080, 0x0000, 0x0800, 0x0800, 0x0000, +0x0000, 0x8800, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x2004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x1000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0002, 0x8008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0004, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0800, 0x0100, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0010, 0x0000, 0x8005, 0x0000, 0x0100, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0040, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0080, 0x0008, 0x0000, 0x0080, +0x0001, 0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0400, 0x0000, 0x8000, 0x0000, 0x0001, 0x0000, 0x0802, 0x0800, 0x0004, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0010, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0001, 0x0400, 0x0002, 0x0000, 0x8010, 0x4100, +0x0000, 0x4000, 0x0002, 0x0004, 0x0000, 0x0000, 0x0080, 0x0000, 0x0300, +0x0020, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, 0x0000, 0x0002, 0x0040, +0x1000, 0x0000, 0x0200, 0x1030, 0x0022, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0124, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8040, 0x0102, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x4000, 0x0C00, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0010, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0020, 0x0800, 0x0000, 0x0100, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0040, +0x0000, 0x0000, 0x0000, 0x8000, 0x0804, 0x0000, 0x0020, 0x0100, 0x1000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0680, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x4004, 0x0000, 0x0800, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x8800, 0x0004, 0x0000, 0x0000, 0x4000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0004, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0012, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0010, 0x4000, 0x0000, 0x0200, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0xC000, 0x0000, 0x0100, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0200, 0x0044, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x2000, 0x4000, 0x8000, 0x0000, 0x0100, +0x0000, 0x0880, 0x0200, 0x0000, 0x0000, 0x0400, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x2000, 0x0022, 0x0000, 0x2000, 0x0000, 0x0000, 0x4000, +0x0400, 0x0000, 0x4000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0001, 0x0010, +0x0000, 0x0000, 0x0200, 0x0004, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x2000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0800, 0x0000, 0x0120, 0x0084, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0010, 0x0000, 0x0000, 0x0000, 0x0002, +0x0008, 0x0002, 0x0100, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0100, 0x0100, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x1000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0801, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0004, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0200, +0x0000, 0x1000, 0x0000, 0x0200, 0x0100, 0x0000, 0x0000, 0x0800, 0x0010, +0x0000, 0x0002, 0x0000, 0x0000, 0x8000, 0x0000, 0x0004, 0x0000, 0x4000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0080, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0001, 0x0000, 0x0002, 0x8000, 0x0001, 0x0000, 0x0000, +0x0004, 0x8000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000, 0x0800, +0x0000, 0x0000, 0x4000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0003, 0x0000, 0x0410, 0x0200, 0x0000, 0x0000, 0x1000, 0x2000, +0x0000, 0x0000, 0x0200, 0x8020, 0x0000, 0x0400, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x8000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0080, 0x0001, 0x0010, 0x1000, 0x0008, +0x0000, 0x0001, 0x0000, 0x0000, 0x0040, 0x0000, 0x0100, 0x1000, 0x0000, +0x0440, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0001, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0400, 0x0200, +0x0000, 0x0000, 0x0001, 0x0000, 0x0124, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0200, 0x0800, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x2400, +0x1648, 0x4125, 0x2C82, 0x92C9, 0x8900, 0x44B2, 0x9C49, 0x4A24, 0x2492, +0x8240, 0x5826, 0x2492, 0x0699, 0x8C41, 0x4925, 0x0082, 0x120F, 0x4904, +0x2492, 0x8240, 0x4802, 0x2492, 0x1001, 0x4164, 0x2492, 0x2409, 0x9009, +0x4925, 0x2092, 0x824C, 0x4900, 0x2C92, 0x1249, 0x4825, 0x65D2, 0x1241, +0x4805, 0x2493, 0x2409, 0x8609, 0x4925, 0x2C92, 0x9649, 0x4910, 0x2482, +0x1209, 0x4224, 0x0492, 0x40A1, 0x4924, 0x2492, 0x0409, 0x9649, 0x0924, +0x2882, 0x92C9, 0x0904, 0x6490, 0x9649, 0x4A24, 0x2482, 0x9240, 0x5924, +0x2492, 0x2489, 0x9649, 0x4920, 0x0002, 0x920B, 0x4504, 0x2492, 0x9249, +0x4800, 0x2492, 0x1241, 0x4164, 0x2492, 0x2408, 0x9249, 0x4124, 0x2092, +0x8249, 0x4904, 0x0492, 0x9049, 0x4825, 0x2092, 0x9241, 0x4925, 0x2052, +0x2409, 0x8609, 0x4924, 0x2882, 0x9669, 0x4814, 0x2482, 0x1249, 0x4A24, +0x0492, 0x12C1, 0x4924, 0x0490, 0x0009, 0x0010, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x2000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, 0x0100, 0x0404, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0200, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x4001, 0x0040, 0x0004, 0x0000, 0x0100, 0x0020, +0x8000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x4004, 0x0400, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0040, 0x0002, 0x0000, 0x2002, +0x0000, 0x0000, 0x2200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0020, 0x2000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0001, 0x2010, 0x0000, 0x0000, 0x0000, +0x4002, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0080, 0x0000, +0x0000, 0x0008, 0x0000, 0x8000, 0x0000, 0x0200, 0x0001, 0x0000, 0x0000, +0x0000, 0x2000, 0x0018, 0x0000, 0x0000, 0x0000, 0x0861, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2010, 0x0000, 0x0000, 0x0200, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0008, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x4000, 0x0000, 0x0002, 0x0000, 0x0002, 0x0800, +0x0004, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x1000, 0x4000, 0x0000, +0x8010, 0x0020, 0x0000, 0x0002, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0800, 0x0010, 0x0000, 0x0000, 0x0000, 0x0001, +0x1400, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0120, 0x2400, 0x9248, 0x4924, 0x2890, 0x9249, 0x4804, 0x6082, 0x1249, +0x4A24, 0x2092, 0x9241, 0x5924, 0x2492, 0x2489, 0xFE49, 0x5920, 0xA092, +0x92C9, 0x110C, 0x0492, 0x9241, 0x0824, 0x2492, 0x9043, 0x4924, 0x2492, +0x2409, 0x9249, 0x0928, 0x20B2, 0x924D, 0x4904, 0x2C9A, 0x9268, 0x4824, +0x24D6, 0x9241, 0x092C, 0x2492, 0x2419, 0x92C9, 0x0960, 0x2092, 0x92C9, +0x4914, 0x6496, 0x9249, 0x4824, 0x2492, 0x8241, 0x5920, 0x0490, 0x2409, +0x9249, 0x4924, 0x2892, 0x9249, 0x4104, 0x6492, 0x9249, 0x4A24, 0x2492, +0x9241, 0x5924, 0x2492, 0x2489, 0xB649, 0x4924, 0x2092, 0x92C9, 0x490C, +0x2492, 0x9209, 0x4824, 0x2692, 0x9241, 0x4924, 0x2492, 0x2429, 0x9049, +0x4924, 0x2090, 0x1249, 0x4904, 0x2492, 0x9249, 0x4824, 0x0092, 0x8241, +0x492C, 0x2492, 0x0409, 0x92C9, 0x0904, 0x2892, 0x92C9, 0x0914, 0x2492, +0x1248, 0x4A24, 0x2490, 0x9241, 0x5924, 0x2492, 0x0008, 0x0000, 0x0000, +0x0400, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x020A, 0x0000, 0x0000, 0x0000, 0x0000, 0xE610, 0xB6D9, 0x01F5, 0x0000, +0xB6D0, 0x526D, 0x2800, 0xB46C, 0x4F6D, 0x0007, 0x9001, 0xDB6D, 0x1066, +0xE308, 0xD7D9, 0x41F7, 0x2062, 0xB7C9, 0x136C, 0xBCC0, 0xA4A4, 0x4D3C, +0x0C63, 0x82C1, 0xDAEC, 0x4436, 0xC400, 0xFEC8, 0x017F, 0x2692, 0xB6C1, +0x1E67, 0x9610, 0xBC44, 0x8905, 0xC093, 0x8100, 0xDD6D, 0x4B22, 0x0492, +0xB6D8, 0x437D, 0x0F90, 0xF6D1, 0x5E65, 0x0420, 0xB40C, 0x8B69, 0x302E, +0x91C0, 0xDF2D, 0xB672, 0x2D2D, 0x9048, 0xBA2C, 0xD965, 0x9246, 0x0024, +0xC36D, 0x90D2, 0xD900, 0xDB6A, 0x9DB6, 0x0934, 0xA602, 0x3825, 0x2A00, +0xD328, 0x5B05, 0x0042, 0x0001, 0x452D, 0x8012, 0xDB41, 0xD102, 0x4416, +0x0805, 0x9200, 0x1F25, 0x1270, 0xB200, 0x49EC, 0x0143, 0x2808, 0x4965, +0x80F2, 0x1BC8, 0x1920, 0x0492, 0x6224, 0xB40F, 0xDF6C, 0x1000, 0xB924, +0x5034, 0x9247, 0x880C, 0xC904, 0x10B2, 0x1922, 0x4B02, 0x1C32, 0x4056, +0x5B14, 0x8B86, 0x0927, 0xD042, 0x2CBE, 0x4939, 0xAC92, 0x64B6, 0x48BA, +0x0012, 0x6DB8, 0x6248, 0x2092, 0x0189, 0x0008, 0x1C25, 0x3001, 0x0450, +0x4009, 0x023A, 0x6212, 0x4820, 0x2000, 0x01D0, 0xC000, 0x200A, 0x8100, +0x2004, 0x20A5, 0x1080, 0x1212, 0x0586, 0x2000, 0x9280, 0x0009, 0x2487, +0x2C00, 0x08D8, 0xB0D8, 0x0109, 0x6113, 0x2003, 0x00C0, 0x2400, 0x083A, +0x2080, 0x2490, 0x4CCB, 0x068B, 0x0589, 0x4718, 0x3212, 0x0008, 0x2200, +0x4927, 0x0ADB, 0x0008, 0x4920, 0xA49A, 0x0000, 0x4940, 0xB0D2, 0x1001, +0x5000, 0x2492, 0x0089, 0xA220, 0x2A2D, 0x2289, 0x8240, 0x6900, 0x3493, +0x9648, 0x4804, 0xF2DB, 0x1800, 0x4000, 0xA41B, 0x262D, 0x0008, 0x0135, +0x2291, 0x0001, 0x4900, 0x36DA, 0x0000, 0x6040, 0x36DA, 0x5001, 0x4000, +0xB29B, 0x042D, 0x0440, 0x4D27, 0x0092, 0x0A10, 0x5D21, 0x269B, 0x0041, +0x6900, 0x34DA, 0x4001, 0x5080, 0x3BD3, 0x7F0D, 0x5DEF, 0x2490, 0xF100, +0xBF67, 0x249D, 0x1241, 0xDFFF, 0x2693, 0x0609, 0xEBF0, 0x39EE, 0x9249, +0xF524, 0x5DD1, 0x45D0, 0xD052, 0x1409, 0x0484, 0x0248, 0x4931, 0x24D3, +0x0400, 0xA321, 0x09A6, 0x12C0, 0x9100, 0x36D7, 0x6C80, 0x104A, 0x92CC, +0x2487, 0x0001, 0xD3EB, 0x0C2B, 0x8005, 0x2F40, 0x08B5, 0x0440, 0x2200, +0xFB0D, 0x2090, 0xB249, 0xB16D, 0x209E, 0x1040, 0xDA3C, 0x94E3, 0x8201, +0x8360, 0x1E3F, 0x8408, 0x0020, 0x1050, 0xEDB4, 0x0003, 0x4200, 0x6D82, +0x76DB, 0x1000, 0x6C05, 0x22DB, 0x0004, 0x5401, 0xB6DB, 0x48AD, 0x86D2, +0x08B5, 0x0040, 0xA08A, 0x6C86, 0x34D2, 0x90C4, 0xEC4D, 0x208A, 0x6602, +0x4B69, 0xB652, 0x6C2D, 0x80DA, 0x0524, 0x40C9, 0xE401, 0x6908, 0x32D1, +0x2C1A, 0x6414, 0xA492, 0x82D0, 0x4725, 0x2093, 0x4839, 0x0080, 0x4DB4, +0x428B, 0xC2CB, 0x2DC0, 0x72D3, 0x134B, 0x6814, 0xA5D6, 0xB055, 0x5045, +0xA09B, 0x0029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0200, 0x0000, 0x0000, 0x0404, 0x0000, 0x8000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0xA000, 0x0000, 0x0000, 0x2000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0080, 0x0200, 0x0000, +0x0000, 0x2000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0800, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x1001, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x1020, 0x0000, 0x0000, 0x0901, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x2000, 0x0080, 0x0001, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0A00, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0080, 0x0000, 0x0000, 0x0000, 0x0404, 0x0001, 0x0000, 0x0000, 0x1008, +0x0040, 0x0000, 0x0241, 0x0800, 0x0000, 0x1040, 0x0080, 0x0000, 0x0400, +0x0040, 0x0000, 0x2000, 0x0008, 0x0000, 0x2000, 0x0041, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x2008, 0x0200, 0x0090, 0x0408, +0x0000, 0x0000, 0x0041, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x9080, +0x0000, 0x8000, 0x0400, 0x0401, 0x0000, 0x0000, 0x1008, 0x0000, 0x0000, +0x0241, 0x0000, 0x0004, 0x1040, 0x0100, 0x0000, 0x0C00, 0x0050, 0x0000, +0x2000, 0x0008, 0x1000, 0x2000, 0x0041, 0x1040, 0x4000, 0x0040, 0x0000, +0x0000, 0x0800, 0x0000, 0x0488, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0004, 0x0000, 0x4400, 0x0000, 0x0090, 0x0008, 0x0040, 0x0000, +0x0043, 0x0000, 0x6000, 0x0000, 0x0000, 0x0020, 0x9000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0600, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x4000, 0x0000, 0x0C00, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x2100, 0x0000, 0x1000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0140, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0008, 0x0400, 0x0250, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0001, 0x8000, 0x0080, 0x0200, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x2000, 0x0041, +0x0000, 0x0400, 0x0200, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0080, +0x0008, 0x0000, 0x0080, 0x0226, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0220, 0x0000, 0x0008, 0x0401, 0x0640, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0101, 0x0001, +0x8000, 0x0080, 0x0200, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x2000, 0x0041, 0x0000, 0x0400, +0x0200, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0081, 0x0408, 0x0000, +0x0080, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0800, 0x0002, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0200, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0011, 0x0000, 0x8000, 0x7400, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x1008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0201, 0x0008, 0x0000, 0x1000, 0x0000, 0x0008, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0001, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0100, 0x0000, 0x0000, +0x0040, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1002, 0x1000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0040, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0100, 0x0100, 0x0000, 0x0800, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x800C, 0x0000, 0x0000, 0x0000, 0x0000, 0x2020, 0x4041, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0042, 0x4000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0020, 0x2000, 0x0100, 0x0000, 0x0020, 0x0200, 0x0001, +0x0100, 0x2040, 0x0001, 0x0000, 0x0000, 0x0004, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0044, 0x0000, 0x0080, 0x0000, 0x0002, 0x0000, +0x0000, 0x0220, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0100, 0x0000, 0x0040, 0x0000, 0x0000, 0x5000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x8000, 0x0000, 0x0002, 0x0004, 0x0000, 0x0000, +0x1001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x8000, 0x0030, 0x0000, 0x0010, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0210, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0002, 0x0000, 0x0100, 0x0000, 0x0000, +0x4040, 0x0020, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0200, 0x0000, 0x0000, +0x8000, 0x0020, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0900, 0x0080, 0x0010, 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0180, 0x0004, 0x0000, 0x0102, 0x0000, +0x0000, 0x0010, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0808, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0010, 0x0010, 0x0001, 0xC000, 0x0000, +0x1001, 0x8000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0020, 0x0040, 0x0000, +0x0000, 0x4400, 0x0020, 0x2120, 0x0600, 0x0000, 0x0808, 0x0C00, 0x0000, +0x0000, 0x0000, 0x0004, 0x1000, 0x00A0, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0480, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0010, +0x0800, 0x4000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x4000, 0x0000, 0x0201, 0x8000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0020, 0x2000, 0x0400, 0x0000, 0x0800, 0x0800, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, +0x0000, 0x0000, 0x0008, 0x4000, 0x2000, 0x9000, 0x0002, 0x0000, 0x0401, +0x1000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0004, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4800, 0x0002, 0x0000, 0x1020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0400, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x4000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x4000, 0x2000, 0x0000, 0x0000, +0x0004, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x8000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2001, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0002, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0001, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x000A, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, +0x0000, 0x2002, 0x0000, 0x0010, 0x0800, 0x0001, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0010, 0x8000, +0x8040, 0x0000, 0x0000, 0x8083, 0x0000, 0x0000, 0x0080, 0x0100, 0x0000, +0x0400, 0x0000, 0x4000, 0x0000, 0x1028, 0x0004, 0x0000, 0x0401, 0x0400, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0800, 0x8000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0400, +0x0000, 0x0400, 0x0000, 0x0008, 0x0000, 0x0010, 0x0001, 0x0000, 0x2000, +0x0000, 0x0000, 0x4004, 0x0000, 0x0200, 0x0100, 0x0000, 0x1200, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0500, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x1000, 0x4000, +0x1001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0802, 0x0000, 0x0000, +0x0010, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04A0, 0x3001, 0x0000, +0x0100, 0x0000, 0x0000, 0x4000, 0x0600, 0x0040, 0x0000, 0x0002, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x0208, 0x4924, 0x2892, 0x9049, 0x4902, 0x6492, 0x020B, +0x4A24, 0x2482, 0x8241, 0x5920, 0x2490, 0x2489, 0x8618, 0x4925, 0x0090, +0x1841, 0x4904, 0x2492, 0x8221, 0x402D, 0x2492, 0x8201, 0x4924, 0x2492, +0x2508, 0x92D9, 0x4924, 0x2010, 0x8200, 0x4905, 0x2592, 0x1248, 0x4824, +0x2492, 0x1251, 0x4B20, 0x2892, 0x0119, 0x904D, 0x4924, 0x0492, 0x0219, +0x4914, 0x6492, 0x9241, 0x4A24, 0x24D6, 0x1251, 0x5900, 0x2492, 0x0409, +0x8249, 0x4925, 0x2812, 0x9049, 0x6904, 0x6490, 0x920B, 0x4224, 0x2482, +0x9041, 0x1924, 0x2492, 0x0489, 0x9650, 0x0124, 0x0082, 0x0248, 0x4904, +0x2492, 0x9248, 0x482D, 0x0082, 0x9240, 0x0124, 0x2492, 0x2508, 0x92D9, +0x0921, 0x2090, 0x9249, 0x4905, 0x2092, 0x1248, 0x4824, 0x2492, 0x8251, +0x0324, 0x0492, 0x0521, 0x9049, 0x4121, 0x0092, 0x9259, 0x0914, 0x2492, +0x9249, 0x4A24, 0x2412, 0x9251, 0x1924, 0x2492, 0x0009, 0x0020, 0x0001, +0x0400, 0x0880, 0x0000, 0x0000, 0x0800, 0x0000, 0x8000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0002, 0x0011, 0x0000, 0x0000, 0x0400, 0x0000, 0x0400, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0100, 0x0001, 0x0000, +0x4800, 0x0000, 0x0000, 0x8020, 0x0000, 0x0000, 0x0100, 0x0082, 0x0000, +0x0000, 0x0002, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x2800, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0000, +0x0802, 0x0000, 0x0000, 0x0100, 0x0010, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0200, 0x0000, 0x0000, 0x0800, +0x0044, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0400, 0x0002, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x000A, 0x0000, 0x0400, 0x1000, 0x0000, 0x0090, 0x8048, +0x0000, 0x0100, 0x0000, 0x0000, 0x0200, 0x4100, 0x0008, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0800, 0x0000, 0x0004, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0010, 0x1000, 0x0000, 0x0010, 0x0000, 0x0100, +0x4000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0008, 0x0000, 0x0400, 0x0000, 0x0000, 0x0090, 0x0048, 0x0000, 0x0100, +0x0000, 0x0020, 0x0000, 0x0000, 0x0008, 0x0000, 0x0001, 0x0000, 0x0000, +0x0240, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x8800, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0498, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x8000, +0x0000, 0x0010, 0x0400, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x2400, 0x8249, 0x4924, 0x2892, 0x9249, 0x4904, +0x6492, 0xC259, 0x4A04, 0x0090, 0x9241, 0x4925, 0x2492, 0xA589, 0x9249, +0x4924, 0x0012, 0x9349, 0x4904, 0x2492, 0x92D1, 0x4824, 0x2492, 0x8240, +0x4924, 0x2492, 0x2009, 0x92C9, 0x0924, 0x0192, 0x9259, 0x4B04, 0x2400, +0x9A49, 0x5024, 0x2492, 0x9243, 0x0824, 0x2492, 0x2409, 0x9249, 0x0920, +0x2892, 0x9249, 0x4904, 0x6492, 0x8249, 0x4825, 0x2492, 0x9251, 0x5924, +0x2492, 0x2409, 0x9269, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x9259, +0x4A24, 0x2492, 0x1261, 0x5925, 0x2492, 0x2589, 0x9249, 0x4924, 0x2092, +0x9241, 0x4904, 0x2092, 0xD299, 0x4824, 0x2412, 0x9241, 0x4924, 0x2492, +0x2409, 0x9BC9, 0x4904, 0x2092, 0xD259, 0x0900, 0x2482, 0x0248, 0x4826, +0x2492, 0x1001, 0x4880, 0x2492, 0x3408, 0x9249, 0x49A4, 0xA802, 0x9249, +0x4804, 0x6492, 0x9049, 0x4A25, 0x2492, 0x9251, 0x5824, 0x2482, 0x0001, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0C00, 0x2004, 0xBEC8, +0x03ED, 0x2200, 0xB6D1, 0x5765, 0x6280, 0xBC2A, 0x1B65, 0x2806, 0x9500, +0xDF6D, 0x4972, 0xA4D0, 0xB6F9, 0x016C, 0x1406, 0xB4C0, 0x1B2D, 0x00B8, +0x944A, 0xDBED, 0x4C23, 0x8200, 0xFB6D, 0x8026, 0x1400, 0xB7F8, 0x0311, +0xB2C0, 0xF7C0, 0x1CA4, 0x2C4A, 0x948D, 0xE36C, 0x5472, 0x8378, 0x7DAC, +0x4931, 0x1000, 0xAEBD, 0x03AD, 0x5155, 0xB890, 0x5B3E, 0x2299, 0x9028, +0x7B65, 0xEBA6, 0x9245, 0xE9E7, 0xB274, 0xEB28, 0x1358, 0xB824, 0xD92D, +0x0243, 0x012C, 0x9925, 0x9094, 0x882C, 0xD368, 0x9896, 0x4924, 0x9A0E, +0x4924, 0x8208, 0xB201, 0xCB20, 0x8146, 0x0564, 0x4B44, 0x28F0, 0x0114, +0x9302, 0x0CB2, 0x0026, 0x3202, 0xCF65, 0x4800, 0xB0C0, 0x6924, 0x0806, +0x0279, 0xC125, 0x201A, 0x1001, 0x8900, 0x8CCA, 0x8063, 0xBF04, 0xCB24, +0xC200, 0xB972, 0x0828, 0x1402, 0x0041, 0x4924, 0x249A, 0x8808, 0x30CA, +0x1DB2, 0x1A28, 0x9B10, 0x0D90, 0x4507, 0xD052, 0x6B92, 0x4934, 0xA013, +0x0DF4, 0x4029, 0x0410, 0x6599, 0x6258, 0x2012, 0x4389, 0x8272, 0x0881, +0x404C, 0x0030, 0x4109, 0x3482, 0x019A, 0x0C80, 0x9651, 0x0090, 0x4041, +0x0C8A, 0x0101, 0x0090, 0x6815, 0x008B, 0x0802, 0x2880, 0x3010, 0x10D0, +0x4020, 0x0002, 0x0A01, 0x0000, 0x0202, 0xC000, 0x0090, 0x4083, 0x4013, +0x2000, 0x0338, 0xB480, 0x3480, 0x08C2, 0x0411, 0x0409, 0x4601, 0x0050, +0x0000, 0xA000, 0x4537, 0x08D3, 0x0000, 0x4924, 0xA49B, 0x0240, 0x6100, +0xA49B, 0x0001, 0x5004, 0xA092, 0x088D, 0x1004, 0x4DA5, 0x0293, 0x1004, +0x6940, 0x25D2, 0x8060, 0x6C44, 0x2C52, 0x0201, 0x4000, 0x1492, 0xA20D, +0x8248, 0x4815, 0x00D2, 0x2248, 0x0C04, 0x22DB, 0x0009, 0x6800, 0xB4DB, +0xD041, 0x4100, 0xB05F, 0x050D, 0x0000, 0x4527, 0x2853, 0x1000, 0x4520, +0xB6C9, 0x1300, 0x6D28, 0xB49F, 0xC301, 0xD104, 0x169E, 0xB709, 0x1FDF, +0x2880, 0xF308, 0xDBDB, 0x2491, 0x1240, 0xDD3F, 0x0E87, 0x1A40, 0xDFD2, +0x3CFB, 0x1649, 0xA620, 0x4A6B, 0x2050, 0x3048, 0xCB79, 0x048E, 0x1229, +0x7B01, 0x10A2, 0x9289, 0x9950, 0x09BD, 0xA249, 0x4C20, 0x4481, 0x25A0, +0x7209, 0x0811, 0x6181, 0x1400, 0x9AC0, 0x04A8, 0x0300, 0x2B22, 0x0C5F, +0x0680, 0xAA30, 0xEA6B, 0x2890, 0x0288, 0xA68E, 0x289C, 0x0012, 0x8044, +0x02D6, 0x0240, 0x3CE0, 0x1C3A, 0xA041, 0x4424, 0x1043, 0x61A5, 0x021B, +0x0440, 0x6D8A, 0x72D2, 0x220A, 0x6450, 0x36D3, 0x0005, 0x5121, 0xB2DB, +0x24A9, 0x3489, 0x6D15, 0x8092, 0x34CB, 0x6D80, 0x269B, 0xB401, 0x480D, +0x2C1A, 0x2440, 0x470C, 0x96D3, 0x4C3F, 0x3B0A, 0x4E84, 0x4282, 0xD6D9, +0x0C09, 0x2012, 0x260A, 0x4C47, 0x86DA, 0xB4D1, 0x43A5, 0x101A, 0x1028, +0x344F, 0x6550, 0x921A, 0x96D3, 0x6185, 0x6688, 0x825B, 0x4825, 0x16D2, +0x8215, 0x50CC, 0x8C11, 0x002F, 0x0000, 0x0080, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0001, 0x0400, +0x0100, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0200, 0x0002, 0x0480, 0x0080, +0x0080, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, 0x0008, 0x0800, 0x4000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x8040, 0x0000, 0x0002, +0x0010, 0x0804, 0x1010, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x8040, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0080, 0x2008, 0x0000, 0x0080, 0x0202, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0141, 0x0000, 0x0000, +0x0048, 0x0000, 0x0400, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2401, 0x0000, 0x0000, 0x0000, 0x0002, 0x8000, +0x0000, 0x0200, 0x0004, 0x0000, 0x0800, 0x0440, 0x0000, 0x0000, 0x2200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0200, 0x0080, +0x0008, 0x0000, 0x4080, 0x0200, 0x0040, 0x0000, 0x0401, 0x0000, 0x0000, +0x0000, 0x0001, 0x1000, 0x0000, 0x0041, 0x0000, 0x0004, 0x0048, 0x0009, +0x0400, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x2500, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0004, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0004, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0410, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0880, 0x0000, 0x0000, 0x0000, 0x0200, +0x0040, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0040, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x2000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x1200, 0x0000, 0x0048, 0x0000, 0x0000, 0x0008, 0x0001, 0x0000, +0x0040, 0x0000, 0x0000, 0x1000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1800, 0x0000, 0x2000, 0x0000, 0x0100, 0x4024, 0xA000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x1200, 0x0000, 0x0000, 0x2000, 0x0000, 0x0181, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x1200, +0x0001, 0x0048, 0x0000, 0x0000, 0x0008, 0x0001, 0x0000, 0x0040, 0x0000, +0x0000, 0x1000, 0x0004, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0024, 0x8000, 0x0000, 0x0000, 0x0001, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x1200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x8000, 0x0800, 0x0001, 0x0000, 0x4000, 0x0000, 0x0000, 0x0800, 0x0002, +0x0000, 0x0100, 0x0000, 0x4001, 0x0004, 0x0004, 0x0008, 0x8500, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0100, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0800, 0x0000, 0x0000, 0x1200, 0x0001, 0x0008, 0x0010, 0x0800, +0x0008, 0x0001, 0x0000, 0x0008, 0x0000, 0x0100, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0004, 0x0000, 0x0800, +0x0010, 0x0000, 0x1210, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x1001, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x2000, 0x0086, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0400, +0x4000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0080, 0x0004, 0x0000, 0x0000, +0x0084, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0020, 0x0000, 0x0000, 0x2000, +0x0140, 0x0000, 0x0100, 0x0000, 0x0000, 0x0001, 0x4000, 0x0020, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x1001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1200, +0x0002, 0x0000, 0x0000, 0x2000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0002, 0x0000, 0x1300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0001, 0x4020, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0800, 0x0000, 0x0020, 0x0200, 0x0102, 0x0000, 0x0001, 0x0400, +0x0004, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x1210, 0x0000, 0x6008, +0x8000, 0x2000, 0x2000, 0x0000, 0x0000, 0x1000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0120, 0x0000, 0x1000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x4120, 0x0000, 0x2000, 0x0040, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x8000, 0x0100, 0x0000, 0x1800, 0x8020, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0800, 0x2200, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0200, 0x0002, 0x0000, 0x0000, 0x0A20, +0x0200, 0x0000, 0x0010, 0x2880, 0x1000, 0x0000, 0x0601, 0x8000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x4000, 0x0C20, 0x0800, 0x0000, +0x4000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x8002, 0x2000, 0x0800, 0x0040, 0x0024, 0x0000, 0x0000, 0x0000, +0x2100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0092, 0x4400, +0x0004, 0x0180, 0x8000, 0x8500, 0x0800, 0x0000, 0x4000, 0x2400, 0x0000, +0x0020, 0x0030, 0x0000, 0x0000, 0x0000, 0x0004, 0x0240, 0x0000, 0x2000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0900, 0x0106, 0x0000, 0x8000, 0x4000, 0x0090, 0x0000, +0x0080, 0x0000, 0x0040, 0x0024, 0x0440, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0004, 0x0080, +0x8000, 0x0100, 0x1000, 0x0000, 0x4000, 0xA400, 0x0000, 0x0020, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0A40, 0x0000, 0x2000, 0x0004, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0400, 0x0000, +0x0900, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0004, +0x0000, 0x0100, 0x0000, 0x0024, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0004, 0x0000, +0x0000, 0x0020, 0x0000, 0x1000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0204, 0x0104, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x8200, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x1000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0001, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0200, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0804, 0x0050, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0104, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x4030, 0x0000, 0x0001, 0x0200, 0x0002, +0x0400, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0001, 0x0008, 0x2000, 0x0300, 0x2000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0081, 0x0000, 0x0C00, 0x0000, +0x0000, 0x0000, 0x0400, 0x0120, 0x4000, 0x0008, 0x0000, 0x0002, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x1001, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x1000, 0x0000, 0x0001, 0x0004, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x8C00, 0x0000, 0x0200, 0x0000, 0x0040, 0x0000, 0x2000, 0x0005, +0x0000, 0x0020, 0x0000, 0x0009, 0x0400, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x0048, 0x0000, 0x0100, 0x2000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0020, 0x0000, 0x0010, 0x8000, 0x0028, 0x0000, +0x0000, 0x0000, 0x0100, 0x0080, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0800, 0x0080, 0x1400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0010, 0x8200, 0x4400, 0x8249, 0x6924, 0x2892, 0x1249, 0x490C, +0x4492, 0x9249, 0x0A24, 0x6492, 0x9241, 0x5824, 0x2492, 0x0489, 0x8449, +0x4920, 0x0092, 0x1049, 0x4904, 0x2092, 0xA209, 0x5C24, 0x0092, 0x9241, +0x4820, 0x2412, 0x2419, 0x8219, 0x4124, 0x6092, 0x8049, 0x5900, 0x0C02, +0x9240, 0x0824, 0x2492, 0x9341, 0x4904, 0x2492, 0x2409, 0x9249, 0x4924, +0x2896, 0x9250, 0x8104, 0x6492, 0x9248, 0xCA24, 0x2492, 0x1241, 0x5824, +0x6492, 0x6409, 0x9249, 0x4801, 0x2892, 0x9241, 0x490C, 0x4492, 0x9249, +0x4A04, 0xB492, 0x9241, 0x5924, 0x2492, 0x2409, 0x9649, 0x4921, 0x2002, +0x9249, 0x4804, 0x2492, 0xB249, 0x0824, 0x0012, 0x8241, 0x4924, 0x2482, +0x2409, 0x1219, 0x0925, 0x6092, 0x1249, 0x4800, 0x0492, 0x9049, 0x4824, +0x2492, 0x8241, 0x4920, 0x2492, 0x0401, 0x9249, 0x4925, 0x2892, 0x9251, +0x0004, 0x6691, 0x1049, 0x4A24, 0x2492, 0x1201, 0x5920, 0x2412, 0x0009, +0x0000, 0x0001, 0x0400, 0x4000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x2004, 0x0001, 0x0000, 0x4904, 0x0002, +0x0000, 0x0014, 0x0000, 0x0008, 0x4400, 0x0410, 0x0000, 0x0000, 0x0020, +0x0001, 0x0000, 0x0920, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0020, +0x0600, 0x0000, 0x0000, 0x0020, 0x0001, 0x0400, 0x4000, 0x0000, 0x0000, +0x0100, 0x0010, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0400, 0x0000, 0x0002, +0x0000, 0x2000, 0x0100, 0x4004, 0x0000, 0x0000, 0x0000, 0x0800, 0x2000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0080, +0x1008, 0x0000, 0x0040, 0x4000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0800, 0x0000, 0x2000, 0x8000, 0x0400, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x4002, 0x0000, 0x0004, 0x0410, 0x8000, +0x0000, 0x2000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0800, 0x8000, 0x0082, +0x8000, 0x4400, 0x0480, 0x1000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x2000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, 0x2000, +0x0040, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x0000, 0x4000, +0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0020, 0x0002, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0402, 0x0000, 0x0000, +0x0024, 0x0000, 0x8001, 0x0004, 0x0000, 0x0002, 0x010C, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0104, 0x0000, 0x1400, 0x0020, 0x0002, +0x0000, 0x4820, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x2000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0402, 0x2000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0400, 0x0100, 0x0000, 0x0000, 0x5020, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x2400, 0x1249, 0xC024, 0x2892, +0x9249, 0x4900, 0x6492, 0x8241, 0x4A24, 0x2092, 0xD641, 0xD124, 0x0492, +0x0489, 0x9249, 0x0820, 0x2092, 0x9259, 0x4104, 0x2492, 0x9209, 0x0824, +0x2492, 0x9040, 0x4924, 0x2492, 0x2421, 0x9249, 0x4920, 0x2090, 0x9249, +0x4804, 0x24D2, 0x9249, 0x4024, 0x2482, 0x9241, 0x43D4, 0x2412, 0x2401, +0x924B, 0x4924, 0x2892, 0x8249, 0x4904, 0x6492, 0x9359, 0x4A24, 0x2492, +0x9641, 0x1920, 0x0412, 0x2409, 0x9A01, 0x4924, 0xA892, 0x9248, 0x4906, +0x6092, 0x9249, 0x4A24, 0x2492, 0x9741, 0x59A4, 0x2492, 0xA489, 0x9349, +0x4924, 0x3090, 0x9A39, 0x4904, 0x2482, 0x9249, 0x4802, 0x2492, 0xD341, +0x4922, 0x2493, 0x2409, 0x5249, 0x4824, 0x2092, 0x9009, 0x4804, 0x04D0, +0x8241, 0x4824, 0x2492, 0x1241, 0x4B60, 0x2482, 0xA609, 0x9243, 0x4924, +0x2892, 0x9249, 0x4806, 0x6492, 0x925D, 0x4A24, 0x2492, 0x9441, 0x5924, +0x2492, 0x0009, 0x0008, 0x0000, 0x0400, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0100, 0x2008, 0x0000, 0x0000, +0x0200, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, +0x3000, 0xB679, 0x038D, 0x8010, 0xB6D0, 0x516D, 0x2188, 0xD4A8, 0x7B6D, +0x0096, 0x9643, 0xDB6D, 0x6175, 0x0068, 0x9E5C, 0x836E, 0x341A, 0x968A, +0x1BAD, 0xAEB5, 0xF080, 0xD1F5, 0x0022, 0x8020, 0x7279, 0x6136, 0x2592, +0x9458, 0x025D, 0xA98E, 0x96CC, 0x08EF, 0x2430, 0xF485, 0xC14D, 0xE412, +0x8279, 0x5971, 0x193F, 0x2D38, 0x86F0, 0x63ED, 0x01C8, 0x9550, 0x536C, +0x25B8, 0x8470, 0x5B7D, 0x217E, 0xD00B, 0xDAFC, 0x1676, 0xEB2C, 0x90C8, +0x9944, 0x596C, 0x8042, 0x2324, 0xDA65, 0xB01E, 0xC924, 0xCB68, 0x91F4, +0x4820, 0x9700, 0xC904, 0x3088, 0x3001, 0x6964, 0x3100, 0x0040, 0x7518, +0x8412, 0x470C, 0xC902, 0x0592, 0x8422, 0x9619, 0xCC6C, 0x8088, 0x9000, +0x60E0, 0x6242, 0x1A14, 0xCB1C, 0x1012, 0x7002, 0x0F60, 0x8FC2, 0x8202, +0x8E00, 0x7244, 0xA100, 0xD802, 0xC825, 0x2086, 0x8105, 0x4E05, 0x2082, +0x8920, 0x6812, 0x1DB4, 0x2025, 0x6110, 0x0596, 0x4D07, 0x5013, 0x6DB2, +0x0939, 0xB49A, 0x6CA6, 0x0873, 0x0410, 0x20B9, 0x2218, 0x20D0, 0x2A80, +0x320C, 0x4021, 0x40D0, 0x0201, 0x0109, 0x0402, 0x0103, 0x0855, 0x3400, +0x2891, 0x4641, 0x148A, 0x0829, 0x2001, 0x2021, 0xC009, 0x0400, 0x4189, +0x0451, 0x0086, 0x0818, 0xA20B, 0x0021, 0x0005, 0x000A, 0x0020, 0x0412, +0x1D03, 0x0003, 0x3480, 0x4838, 0x24D0, 0xE000, 0x0C82, 0x3440, 0x0088, +0x0001, 0x0A02, 0x2009, 0x0008, 0x4D87, 0x08D3, 0x0008, 0x4DA0, 0xB69A, +0x0000, 0x2900, 0xA492, 0x0001, 0x5000, 0x24D2, 0x0189, 0x0000, 0x65A5, +0x0099, 0x3009, 0x6902, 0x3EDA, 0xB408, 0x4C00, 0x269B, 0x0001, 0x4004, +0x84CA, 0x0029, 0x830C, 0x4DA5, 0x00D2, 0x1004, 0x6D80, 0x369A, 0x8240, +0x4CA0, 0x34D2, 0x0203, 0x4A12, 0xB6D2, 0x0009, 0x3000, 0x6DA7, 0x4292, +0x1001, 0xF9A4, 0x249B, 0x0121, 0x6900, 0xB6D2, 0x0011, 0x5002, 0x2683, +0x9F0B, 0xE7F7, 0x2078, 0x7308, 0x7FE7, 0x2015, 0x0041, 0xDB7F, 0x461F, +0x1249, 0xFA60, 0x3D7E, 0x9209, 0x0634, 0x9287, 0x0810, 0xA242, 0xC344, +0x0485, 0x0005, 0x4B70, 0x20F4, 0x9040, 0xBE72, 0x8D88, 0x3211, 0x0E04, +0x1461, 0x3058, 0xF209, 0x2BE1, 0x0043, 0x0041, 0x103F, 0x2010, 0x820D, +0x5460, 0x0544, 0x0009, 0x3C24, 0xCA61, 0x0050, 0x1069, 0xE728, 0x0458, +0x1240, 0xDE40, 0x0496, 0x0009, 0xBF20, 0x1DB4, 0x9058, 0x0824, 0x1841, +0x6915, 0x223A, 0x8201, 0x6D86, 0x64D3, 0x0018, 0x0C00, 0x16DB, 0x1405, +0x5881, 0xB69B, 0x40AE, 0x04D3, 0x4530, 0x1298, 0x949A, 0x4D84, 0x361B, +0x82C0, 0x282A, 0xAC63, 0x5741, 0x482E, 0x06C3, 0xE10D, 0x5A9A, 0x4D34, +0x22C2, 0xD21B, 0x4D04, 0x2418, 0xBC41, 0x2C67, 0x25D2, 0xB391, 0x4028, +0x34E3, 0x6304, 0x808D, 0x4995, 0xA25A, 0x025A, 0x4C03, 0x769A, 0x10DE, +0xC86D, 0x268B, 0xD645, 0x1248, 0xB44A, 0x002D, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0040, 0x0410, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0400, 0x0000, 0x1000, 0x0001, +0x0000, 0x0040, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0001, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x4100, 0x0002, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x2000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0812, 0x0000, 0x0404, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0080, 0x8020, 0x0000, 0x2400, 0x0000, 0x0000, 0x0000, +0x0201, 0x0004, 0x0000, 0x0000, 0x0100, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x1008, 0x0000, 0x0000, 0x1200, 0x0002, 0x0000, 0x0000, 0x0026, +0x0010, 0x8000, 0x0004, 0x0004, 0x0000, 0x8104, 0x0030, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0108, 0x0000, 0x0000, 0x0060, 0x0483, 0x0000, +0x4822, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0018, 0x0200, 0x0000, 0x1000, 0x0018, +0x0400, 0x1240, 0x8200, 0x0810, 0x0208, 0x1022, 0x0000, 0x0000, 0x4000, +0x0000, 0x2004, 0x0011, 0x0000, 0x0820, 0x8000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0440, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0020, 0x0002, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0008, 0x0000, 0x0000, 0x1000, 0x0001, 0x0400, 0x1240, +0x0000, 0x0000, 0x0208, 0x0020, 0x0000, 0x0004, 0x0000, 0x0008, 0x2000, +0x0001, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0400, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x2000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0084, 0x0402, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0001, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x000C, 0x0000, +0x0800, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x4000, +0x0000, 0x1040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, +0x0002, 0x0000, 0x0020, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0040, +0x0020, 0x0000, 0x8000, 0x0020, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x2000, 0x0400, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0009, 0x0004, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x000A, +0x0000, 0x2400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0410, 0x0000, 0x1040, 0x0000, 0x2002, 0x0200, 0x0000, 0x0000, +0x0200, 0x0020, 0x0000, 0x0080, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, +0x0000, 0x0010, 0x0000, 0x0001, 0x8240, 0x0000, 0x0000, 0x0401, 0x0400, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0019, +0x0004, 0x0000, 0x0001, 0x0040, 0x0000, 0x0000, 0x0008, 0x0000, 0x2400, +0x2004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0041, 0x0000, 0x0000, +0x0000, 0x10C0, 0x0000, 0x2000, 0x0200, 0x0000, 0x0000, 0x0200, 0x0020, +0x0000, 0x0081, 0x0400, 0x0001, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8240, 0x0000, 0x4000, 0x0141, 0x0400, 0x0000, 0x0002, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0800, 0x0200, 0x0000, +0x0001, 0x0100, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x1001, 0x0041, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0001, +0x0400, 0x0002, 0x8000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0100, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0020, 0x8001, 0x0000, 0x0000, 0x0000, 0x0010, 0x4000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0200, 0x0000, 0x4000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x3000, 0x0200, 0x4000, 0x8000, 0x0000, 0x0404, 0x0000, 0x8000, 0x0081, +0x0400, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8002, 0x0000, +0x0000, 0x4000, 0x8000, 0x2041, 0x8000, 0x0000, 0x1000, 0x0000, 0x0820, +0x0000, 0x0100, 0x8002, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, 0x0000, +0x0100, 0x1002, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4100, +0x0000, 0x0000, 0x0001, 0x0400, 0x4000, 0x0040, 0x0000, 0x8000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x8000, 0x0001, 0x0400, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x4000, 0x0000, 0x4011, +0x0200, 0x0001, 0x0020, 0x0000, 0x0000, 0x0840, 0x0000, 0x8000, 0x8000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0201, 0x0100, 0x0000, 0x0000, 0x0010, 0x0000, 0x0100, +0x0000, 0x0100, 0x0000, 0x0004, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0080, 0x0400, 0x4000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0100, 0x0000, 0x1000, 0x0010, 0x0820, 0x0000, +0x0A00, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0080, 0x0000, +0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0800, 0x4008, 0x8000, 0x0000, +0x0000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0820, 0x0010, 0x0000, +0x0001, 0x0800, 0x0000, 0x0400, 0x0000, 0x0200, 0x0000, 0x0080, 0x0000, +0x0002, 0x0000, 0xA000, 0x0000, 0x0010, 0x0000, 0x0020, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0180, 0x0022, 0x0000, 0x0000, +0x0200, 0x0000, 0x4000, 0x0008, 0x0000, 0x1000, 0x0000, 0x4200, 0x0000, +0x8000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8020, +0x0000, 0x0400, 0x0000, 0x1200, 0x0000, 0x0100, 0x0000, 0x0800, 0x0000, +0x4000, 0x0000, 0x0001, 0x0200, 0x0000, 0x0000, 0x0004, 0x0000, 0x0008, +0xC000, 0x0000, 0x0000, 0x0000, 0x0022, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0200, 0x0300, 0x0000, 0x1004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x0000, +0x4008, 0x0400, 0x0804, 0x0000, 0x0000, 0x0800, 0x0002, 0x0000, 0xC000, +0x0030, 0x0001, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0008, +0x0800, 0x0110, 0x0000, 0x8000, 0x0190, 0x0000, 0x8400, 0x2000, 0x0000, +0x0000, 0x8000, 0x0402, 0x8000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0082, +0x0020, 0x0000, 0x0000, 0x0000, 0x0041, 0x0000, 0x0400, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0008, 0x0000, +0x0804, 0x0000, 0x0000, 0x0800, 0x0002, 0x0000, 0x4000, 0x1010, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0800, 0x0010, +0x0000, 0x0000, 0x0090, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0002, 0x8000, 0x0800, 0x0000, 0x0000, 0x0002, 0x0082, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1040, 0x0010, 0x0000, +0x0004, 0x0002, 0x0000, 0x8400, 0x0000, 0x8400, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0402, +0x0802, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x4080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0100, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0400, 0x0020, 0x0022, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0004, 0x8080, 0x4000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0040, 0x0000, 0x0000, 0x0400, 0x0100, 0x0010, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, +0x0000, 0x0100, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0401, 0x0000, 0x1000, 0x2800, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0041, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0208, 0x0000, 0x0000, 0x0041, 0x0001, +0x0000, 0x0000, 0x0801, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0600, 0x0000, 0x1000, 0x0000, 0x2400, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x2000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x2020, 0x0000, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, +0x0000, 0x8080, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0080, +0x4000, 0x0010, 0x4000, 0x0000, 0x2000, 0x0000, 0x4400, 0x4000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0400, +0x0001, 0x0400, 0x0010, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0201, +0x0000, 0x0010, 0x0040, 0x0000, 0x4000, 0x8000, 0x4080, 0x2800, 0x0000, +0x0000, 0x0000, 0x0010, 0x0001, 0x8000, 0x0000, 0x0082, 0x0000, 0x0800, +0x1000, 0x4000, 0x4000, 0x0400, 0x0000, 0x2400, 0x9248, 0x4B25, 0x2892, +0x9241, 0x4904, 0x6492, 0x8249, 0x4A64, 0x2492, 0x9002, 0x58A4, 0x2496, +0xA489, 0xC0C9, 0x4925, 0x3090, 0x9049, 0xCB00, 0x2412, 0x0240, 0x4821, +0x2892, 0x1041, 0x4124, 0x2C92, 0x2609, 0x9259, 0x4925, 0x2092, 0x8203, +0x4100, 0x2492, 0x12C1, 0x4804, 0x2412, 0x1241, 0x4124, 0x64B2, 0x0409, +0x8259, 0x0927, 0x2C92, 0x9299, 0x4904, 0x6492, 0x9349, 0x4A34, 0x2492, +0x0241, 0x5904, 0x2090, 0x2409, 0x9248, 0x4924, 0x2892, 0x1249, 0x4904, +0x6490, 0x9249, 0x4A44, 0x2493, 0x9040, 0x5920, 0x2492, 0x2481, 0x0289, +0x4120, 0x2095, 0x9249, 0x4104, 0x2490, 0x0240, 0x0825, 0x2082, 0x8040, +0x4924, 0x6492, 0x2409, 0x9259, 0x0924, 0x2092, 0x924B, 0x4100, 0x2482, +0x12C9, 0x4804, 0x2400, 0x9241, 0x4924, 0x0492, 0x2009, 0x9251, 0x0926, +0x2090, 0x9299, 0x0104, 0x6490, 0x9249, 0x4A24, 0x2410, 0x9241, 0x5904, +0xA492, 0x0009, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x1000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x2080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0200, 0x0000, +0x1001, 0x0100, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0020, 0x0020, +0x0012, 0x0000, 0x0000, 0x0000, 0x0028, 0x0402, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0002, 0x2000, 0x0200, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0010, 0x0020, 0x0012, 0x0000, 0x0000, 0x0000, +0x0048, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0004, +0x0000, 0x0100, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0002, 0x4020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0012, 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x8000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0800, 0x0100, 0x0000, +0x4001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0200, 0x0000, 0xC000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0400, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x2402, 0xB248, +0x4924, 0x2892, 0x9449, 0x4B04, 0x6492, 0x92C9, 0x4A24, 0x2492, 0x9241, +0x5964, 0x2496, 0x0D89, 0x9259, 0x4A24, 0x2016, 0x9249, 0xC904, 0x24B2, +0x3209, 0x4804, 0x2492, 0x9201, 0x4924, 0x2692, 0xA409, 0x32E9, 0x4924, +0x2292, 0x9249, 0x4904, 0x2410, 0x9269, 0x4824, 0x2492, 0x9241, 0x4B24, +0x2492, 0x2609, 0x9249, 0x4B04, 0x2880, 0xB249, 0x4904, 0x6412, 0x964B, +0x4A24, 0x2492, 0x5249, 0x5924, 0x3492, 0x2409, 0xB200, 0x4924, 0x2892, +0x9441, 0x4104, 0x6412, 0x92C9, 0x0A20, 0x2092, 0x8041, 0x5964, 0x2492, +0x2D89, 0x1219, 0x4915, 0x2092, 0x9249, 0x4104, 0x2492, 0xB249, 0x4804, +0x2082, 0x9241, 0x4924, 0x2492, 0x2409, 0x30C9, 0x4924, 0x2092, 0x9209, +0x4904, 0x0492, 0x9249, 0x0824, 0x2492, 0x8241, 0x4B04, 0x2492, 0x2401, +0x9049, 0x6524, 0x2012, 0xB249, 0x4904, 0x6492, 0x864B, 0x4A04, 0x0492, +0x9201, 0x5924, 0x2482, 0x0009, 0x0000, 0x0000, 0x0400, 0x0008, 0x0000, +0x0080, 0x0000, 0x0000, 0x0401, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0208, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2CA0, 0xBED9, 0x02ED, 0x0C04, 0xB6DD, 0x476D, 0x2200, +0xB428, 0x1B65, 0x0006, 0x93C1, 0xDB6D, 0x547A, 0x6490, 0xB6C1, 0x237D, +0x310C, 0x9640, 0x1A2D, 0x6006, 0xBC0D, 0xCB6D, 0x0092, 0x4041, 0xFB7D, +0xCA36, 0x0183, 0xB3D8, 0x936F, 0x0053, 0x82C0, 0x3B1E, 0x8170, 0xB402, +0xD96E, 0x8512, 0x8E0D, 0xC9EF, 0x2216, 0x0460, 0xA65D, 0x036A, 0x3058, +0x9EDB, 0x7B2E, 0x8013, 0xF002, 0xD9ED, 0xA20C, 0x9819, 0xF9F1, 0xB656, +0xE30D, 0x8048, 0xB824, 0x5129, 0x0243, 0x1124, 0x596D, 0x9092, 0x8828, +0xDB6A, 0x9632, 0x49A4, 0xA216, 0x8D2D, 0x9050, 0x9000, 0xC860, 0xB2C6, +0x0064, 0x0B2B, 0x00B2, 0x5804, 0x5B72, 0x0D96, 0x4920, 0x5412, 0xD8E4, +0x440C, 0x0180, 0x5B2C, 0x8602, 0x0001, 0x4804, 0x1094, 0x4611, 0x5860, +0x81B2, 0x1200, 0x9023, 0xD904, 0xC8E0, 0x9801, 0x4925, 0x210C, 0x8041, +0x4974, 0x04B4, 0x4F16, 0x6920, 0xD48E, 0x0208, 0x1B23, 0x0512, 0x4127, +0xD041, 0x2582, 0x493C, 0x828A, 0x2CB6, 0x484B, 0x1612, 0x49B9, 0x645C, +0x3092, 0x4DA0, 0x0006, 0x0825, 0xD149, 0x00B2, 0x4D09, 0x261A, 0x2590, +0x40D4, 0x8212, 0x6881, 0x0600, 0x0280, 0x0908, 0x0609, 0x4085, 0x4090, +0x2000, 0x2181, 0x14C8, 0x0406, 0x2879, 0x2494, 0x8031, 0x0AC4, 0x0048, +0x7801, 0x0402, 0x4923, 0x2080, 0x2410, 0x0130, 0x0018, 0x4400, 0x0009, +0x3412, 0x80C9, 0x40C0, 0x8042, 0x0009, 0x0002, 0x4327, 0x08D3, 0x0000, +0x4920, 0xB6BB, 0x4200, 0x4900, 0xB69A, 0x1001, 0x5200, 0x2492, 0x00AF, +0x1640, 0x4935, 0x0092, 0x1208, 0x6D82, 0x24F2, 0x8002, 0x4800, 0x34D3, +0x8001, 0x4000, 0xC482, 0x2009, 0x0040, 0x6D25, 0x009A, 0x1249, 0x4DC4, +0x0681, 0x0020, 0x6824, 0xA6D9, 0x1301, 0x4800, 0x3610, 0x0029, 0x0040, +0x69B3, 0x0091, 0x4008, 0x61AC, 0x24D9, 0x8001, 0x6D00, 0x265A, 0x0241, +0x5008, 0xA6CB, 0xBF2D, 0xBB79, 0x2C90, 0xF208, 0xFBCF, 0x2491, 0x0040, +0x9DFF, 0x26C7, 0x0141, 0xCBF0, 0x3CBE, 0x9249, 0x3900, 0xC82F, 0x2480, +0x9249, 0x8975, 0x000D, 0x1209, 0x5FED, 0x24F2, 0x8208, 0x7F50, 0x0DBE, +0x3259, 0xC624, 0xD3A9, 0x0090, 0xE241, 0xC4A0, 0x2209, 0x315A, 0x138F, +0x041A, 0x1002, 0xA0E0, 0x05A6, 0x80CF, 0x1504, 0xD2A9, 0x8404, 0x224A, +0x8687, 0x1C12, 0x1302, 0x7358, 0x003E, 0xD081, 0xB4A0, 0x15A4, 0x1010, +0x4000, 0x50C0, 0x65B5, 0x021A, 0x8250, 0x6D82, 0x60D3, 0x8200, 0x6C34, +0x24D3, 0x2405, 0x5901, 0xA6DB, 0x0283, 0x32D0, 0x6DA5, 0x2382, 0x7609, +0x4900, 0x3493, 0x9040, 0x6409, 0x24DB, 0x8421, 0x0069, 0x94CB, 0x202D, +0x2012, 0x6834, 0x22DD, 0x9CDF, 0x490C, 0x0680, 0xB2D9, 0x4C00, 0xB4D8, +0x2681, 0x4009, 0xA411, 0x050D, 0x23DD, 0x6D30, 0x42D8, 0x92CA, 0x4781, +0x5690, 0xB28B, 0x28C0, 0xA45B, 0x1715, 0x5B21, 0x1403, 0x001D, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0044, 0x0200, 0x0400, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x2000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x2000, 0x0000, 0x0000, 0x0860, 0x8800, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x2800, 0x0000, 0x0400, 0x0020, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, +0x0012, 0x0000, 0x0400, 0x2000, 0x0000, 0x0000, 0x1000, 0x8000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0880, 0x1000, 0x1880, 0x0002, 0x0040, 0x0100, +0x0840, 0x0000, 0x2020, 0x0000, 0x0080, 0x0400, 0x0001, 0x0400, 0x1082, +0x8000, 0x0000, 0x0002, 0x0000, 0x4000, 0x0010, 0x0000, 0x0000, 0x0100, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0041, 0x0000, 0x0200, +0x0000, 0x0080, 0x1000, 0x0000, 0x0000, 0x0040, 0x0080, 0x0000, 0x0000, +0x0020, 0x0000, 0x0080, 0x0000, 0x0000, 0x0400, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0401, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0004, 0x0280, +0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0002, 0x0500, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0002, 0x0000, 0x1000, 0x0004, 0x0000, 0x0000, 0x0080, +0x0002, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x1100, 0x0000, 0x0000, 0x0100, 0x1002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0208, 0x1000, 0x0000, 0x1000, 0x0004, +0x0001, 0x0410, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x1000, 0x0000, 0x1600, 0x0000, 0x2008, 0x0080, 0x0001, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0204, 0x0280, 0x0008, 0x0000, 0x0000, 0x0000, +0x0001, 0x0401, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0208, 0x1000, 0x0000, 0x1000, 0x0004, 0x0001, 0x0411, +0x0011, 0x0000, 0x1000, 0x0020, 0x0001, 0x0400, 0x0000, 0x1001, 0x0000, +0x1200, 0x0000, 0x0008, 0x0081, 0x0401, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0200, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x8001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1001, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0091, 0x0000, 0x0000, 0x0004, 0x0100, 0x0000, 0x0400, 0x8200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x1000, 0x0000, 0x0000, 0x8000, 0x0001, +0x0000, 0x0000, 0x0008, 0x3000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0040, 0x0000, 0x0000, 0x0408, 0x0008, 0x0400, +0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0420, 0x0001, 0x0000, +0x0004, 0x0000, 0x0420, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0009, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, +0x0000, 0x0020, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0804, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x8102, 0x0000, 0x0000, 0x8006, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0400, 0x00C0, 0x0000, 0x0080, +0x0040, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x2000, 0x0001, +0x0500, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, +0x0800, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0800, 0x0000, 0x0010, +0x4002, 0x0020, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0200, +0x0000, 0x0000, 0x8001, 0x0420, 0x0080, 0x8808, 0x0000, 0x0040, 0x0000, +0x0004, 0x0200, 0x0000, 0x0100, 0x0000, 0x2000, 0x0400, 0x0000, 0x0000, +0x4000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x4000, 0x0101, 0x0000, 0x0000, 0x0008, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0140, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0080, 0x0010, 0x0000, +0x0000, 0x0000, 0x0080, 0x0008, 0x0000, 0x0800, 0x0000, 0x0080, 0x0000, +0x0010, 0x3000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0004, 0x0004, 0x0000, 0x0000, 0x0800, 0x8000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, 0x0000, 0x0800, 0x0001, +0x1000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0120, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0008, 0x0080, 0x0000, 0x0000, 0x2000, +0x0000, 0x2000, 0x0000, 0x0400, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0804, 0x0000, 0x0000, 0x4000, 0x0000, 0x8000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0040, 0x0000, 0x0021, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4010, 0x0000, 0x0008, 0x0604, 0x0000, 0x0800, +0x0000, 0x0000, 0x1080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0500, 0x0040, 0x0016, +0x4040, 0x0002, 0x0002, 0x0000, 0x0000, 0x4424, 0x0000, 0x0040, 0x8000, +0x0010, 0x0000, 0x0000, 0x0010, 0x0000, 0x4800, 0x0410, 0x0001, 0x0000, +0x0000, 0x0002, 0x0000, 0x0040, 0x0400, 0x1000, 0x0000, 0x0980, 0x0000, +0x0000, 0x0010, 0x0200, 0x8000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2000, 0x0001, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0040, 0x0000, +0x0002, 0x0000, 0x0000, 0x0400, 0x0000, 0x0040, 0x0000, 0x0010, 0x0000, +0x0000, 0x0010, 0x4000, 0x4800, 0x0410, 0x0001, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x1000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0010, +0x0200, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x4200, 0x0100, 0x0002, 0x0000, 0x0001, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0008, 0x0100, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0008, 0x4000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x1400, 0x0000, 0x2080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0800, 0x0200, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0201, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0020, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0010, 0x0000, 0x0000, 0x0000, 0x2000, 0x0001, 0x0000, 0x0040, +0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x8000, 0x0000, 0x0080, 0x0110, 0x0212, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x4004, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0208, 0x0001, 0x0000, 0x0040, 0x0000, 0x0000, +0x0201, 0x0000, 0x0081, 0x8000, 0x0000, 0x0800, 0x0000, 0x0210, 0x0000, +0x0400, 0x0040, 0x0000, 0x0000, 0x0000, 0x0400, 0x4000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0200, 0x0000, 0x0020, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x2080, +0x8000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x1041, 0x0800, 0x0080, 0x8000, +0x0000, 0x0000, 0x0001, 0x0420, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0001, 0x0000, 0x0000, +0x6000, 0x0000, 0x0000, 0x0002, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8800, 0x0000, 0x8000, 0x0004, 0x1002, 0x0000, 0x0001, 0x0002, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0800, 0x0001, 0x0000, 0x0000, 0x0000, +0x0001, 0x0020, 0x0000, 0x0000, 0x0000, 0x0402, 0x0000, 0xA400, 0x9209, +0x5924, 0x2A9A, 0x9249, 0x4904, 0x6492, 0x9209, 0x4A20, 0x2492, 0x9241, +0x5924, 0x2492, 0x2489, 0x8249, 0x4925, 0x0092, 0x9649, 0x0904, 0x2490, +0x1048, 0x4824, 0x2492, 0x9241, 0x48A8, 0x2492, 0x2001, 0x1208, 0x4920, +0x0092, 0x9A49, 0x0900, 0x2496, 0x82C8, 0xC8A4, 0x24B0, 0x1243, 0x4120, +0x2492, 0x4409, 0x9209, 0x482C, 0x2CB2, 0x924A, 0x4100, 0x6492, 0x1259, +0x4A24, 0x2482, 0xB241, 0x5927, 0x2492, 0x2409, 0x9249, 0x4925, 0x2892, +0x9209, 0x4904, 0x6092, 0x9249, 0x4A04, 0x0492, 0x9240, 0x5924, 0x2492, +0x2489, 0x9249, 0x4924, 0x0092, 0x9649, 0x4904, 0x2488, 0x9048, 0x4804, +0x2490, 0x9241, 0x492C, 0x0092, 0x2409, 0x0249, 0x4925, 0x2082, 0x9249, +0x4900, 0x2482, 0x92C9, 0x0024, 0x2080, 0x9240, 0x4120, 0x3492, 0x4409, +0x9240, 0x4825, 0x2892, 0x124A, 0x4104, 0x6452, 0x9259, 0x0A04, 0x2482, +0xB241, 0x5925, 0x2010, 0x0009, 0x0000, 0x0001, 0x0401, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0080, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0001, 0x2000, 0x8000, 0x0800, 0x0001, 0x0040, 0x4400, 0x0000, 0x0000, +0x0802, 0x4002, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0004, 0x0001, +0x8400, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4080, 0x0000, +0x0040, 0x8000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0008, 0x8000, 0x0000, 0x0000, 0x0000, 0x000A, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x1000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0020, 0x0100, 0x0000, 0x0008, 0x0000, 0x0000, 0x0002, 0x0020, 0x0000, +0x0400, 0x0800, 0x0000, 0x0800, 0x0000, 0x0000, 0x0028, 0x0502, 0x0000, +0x1000, 0x0060, 0x0000, 0x1000, 0x0000, 0x0800, 0x8000, 0x1000, 0x0000, +0x0100, 0x8000, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0002, 0x0000, 0x0000, 0x2002, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0400, 0x0000, 0x0000, 0x0000, +0x8010, 0x0000, 0x0800, 0x0008, 0x0000, 0x8000, 0x0000, 0x0000, 0x0020, +0x0200, 0x0000, 0x0000, 0x2004, 0x0200, 0x0004, 0x0000, 0x0000, 0x0000, +0x0C90, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x2002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0200, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0490, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0804, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x000C, +0x0010, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0202, 0x0000, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0280, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0010, 0x0000, 0x0000, 0x0008, 0x0000, 0x0400, +0x0100, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x2400, 0xA209, 0x4924, 0x2882, 0x9249, 0x4900, 0x6492, 0x9249, 0x4A04, +0x2492, 0x9241, 0x5824, 0x2492, 0x0181, 0x9A49, 0x0924, 0x0012, 0x9249, +0x4D04, 0x0492, 0x9249, 0x0824, 0x2692, 0x9241, 0x4924, 0x2412, 0x0409, +0x9249, 0x4924, 0x2092, 0x9649, 0x4904, 0x0C80, 0x1209, 0x486C, 0x2012, +0x9241, 0x4924, 0x2490, 0x2409, 0x9241, 0x490C, 0x0890, 0x9249, 0x4904, +0x6C92, 0x9249, 0x1A24, 0x2492, 0x1241, 0x5964, 0x0492, 0x2409, 0xB249, +0x4924, 0xA892, 0x9249, 0x4904, 0x6482, 0x9049, 0x4A24, 0x2492, 0x9241, +0x5924, 0x2492, 0x2589, 0x9249, 0x0924, 0x2092, 0x9249, 0x4804, 0x2492, +0x9249, 0x4824, 0x2492, 0x9241, 0x4924, 0xA492, 0x2409, 0x9208, 0x0920, +0x2092, 0x9649, 0x4904, 0x0492, 0x9249, 0x48FC, 0x2482, 0x9240, 0x4DA4, +0x2492, 0x2409, 0x9241, 0x4920, 0xA092, 0x9269, 0x4904, 0x6492, 0x9349, +0x4A24, 0x2492, 0x9241, 0x5964, 0x2490, 0x0009, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, 0x0000, 0x0000, +0x0000, 0x0049, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, +0x0000, 0x0400, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0xB582, 0xB6F8, 0x003D, 0x0400, 0xB6DD, +0x6A6D, 0x4008, 0x940C, 0xE96D, 0x2005, 0x9A03, 0xDB6D, 0x9D5C, 0x04A0, +0xBEE9, 0x5369, 0x1012, 0xB5C1, 0x3F2F, 0x461A, 0x8C03, 0x9B65, 0xA4D2, +0x0948, 0xF96C, 0x2712, 0xB202, 0xF668, 0x01A5, 0x800A, 0xD6CD, 0x25EF, +0x742E, 0xDC68, 0x3F2D, 0xB001, 0x0929, 0x5935, 0x1909, 0x0C92, 0xBEF8, +0x036D, 0x2252, 0x7DDB, 0x5B66, 0x420A, 0x1400, 0xDB61, 0x9646, 0x9002, +0xDDA4, 0xB676, 0x4E2D, 0x9248, 0xBA60, 0xC92D, 0x904A, 0x1804, 0x9965, +0xB09A, 0x59A0, 0xCB68, 0x96B0, 0x6104, 0x0A20, 0xCB45, 0x0358, 0xC020, +0x4B64, 0x0047, 0x0160, 0x0926, 0xA090, 0x200C, 0x4920, 0x04BE, 0x0325, +0x9024, 0x692C, 0x1190, 0x924A, 0x5B24, 0x204B, 0x1210, 0x0B02, 0x20DE, +0x8042, 0x4B60, 0x4492, 0x8A42, 0x8A24, 0xD32E, 0x0200, 0xB880, 0x5936, +0x0044, 0x013D, 0x0964, 0x6092, 0x480A, 0x492A, 0x9490, 0x034B, 0xD301, +0xA8D2, 0x4107, 0x5000, 0x3186, 0x4931, 0x808A, 0xAC3E, 0x4803, 0x869A, +0x45B8, 0x6059, 0x3052, 0x4085, 0x1410, 0x4101, 0x0088, 0x1002, 0x2480, +0x0091, 0x20C8, 0x0068, 0xA2C2, 0x4C91, 0x0240, 0x0440, 0x4108, 0x0601, +0x2101, 0x2013, 0x8408, 0x0104, 0x0158, 0x2048, 0x0400, 0x000A, 0xA000, +0x4000, 0x000A, 0x4010, 0x2001, 0x0103, 0x0080, 0x2000, 0x0030, 0x8010, +0x0480, 0x4009, 0x36D2, 0x4259, 0x4040, 0xA002, 0x0029, 0x0040, 0x4907, +0x0AD2, 0x1200, 0x4920, 0xB493, 0x0000, 0x6900, 0xB59A, 0x1000, 0x5004, +0x2C92, 0x08AD, 0x0004, 0x61B5, 0x00D2, 0x0040, 0x6D85, 0x06D0, 0x9240, +0x6C00, 0x349B, 0x8001, 0x4808, 0x26DB, 0x202D, 0x2128, 0x0DD5, 0x22DB, +0x8020, 0x2D04, 0x3611, 0x1000, 0x2C00, 0xA2D3, 0x1241, 0x4020, 0xA6C2, +0x0024, 0x8201, 0x49B7, 0x0996, 0x0242, 0x6C64, 0xA499, 0x8000, 0x6D00, +0x34DA, 0x8041, 0x5002, 0xB25B, 0xFF2D, 0x8E3D, 0x24B0, 0x7009, 0xA9EF, +0x249A, 0x0248, 0xDF7F, 0x067B, 0x4241, 0xCFF1, 0x3370, 0x9249, 0xB200, +0xDA6B, 0x0C40, 0x7209, 0xCB89, 0x000A, 0x300B, 0x41A3, 0x0026, 0x8240, +0x5B00, 0x0436, 0x9000, 0x0800, 0x0255, 0x6020, 0x1000, 0x72D9, 0x4089, +0x00CA, 0x827F, 0x404D, 0x1408, 0xC400, 0x0246, 0x1019, 0xAE09, 0x514A, +0x2400, 0x7249, 0xD99D, 0x0190, 0x1242, 0x1441, 0x02B6, 0x8201, 0x6020, +0x1DB5, 0x0480, 0x0800, 0x5000, 0x6D95, 0x008B, 0x4650, 0x6D84, 0x46D3, +0x0280, 0x4CE4, 0x04D3, 0x3004, 0x5984, 0xA69B, 0x2581, 0x218A, 0xE584, +0xA2D3, 0xA499, 0x4808, 0x1298, 0x9615, 0x4415, 0x3493, 0xB261, 0xC901, +0x949E, 0x2C0B, 0x90D2, 0x0D04, 0x4012, 0x20D3, 0x1D82, 0x0011, 0x9491, +0x00B1, 0x1293, 0x16B0, 0x4FED, 0x3483, 0x2500, 0x04D0, 0x6594, 0xC3DB, +0x86E9, 0x2489, 0x76D4, 0xB33B, 0x4C64, 0xAC93, 0xB485, 0x5B2D, 0x7816, +0x000D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0000, 0x4000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0008, 0x2090, 0x8000, 0x0000, 0x0480, 0x0000, 0x0000, +0x0008, 0x0000, 0x8000, 0x0020, 0x0008, 0x0000, 0x0110, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0008, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0001, +0x0800, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0400, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0010, 0x0008, 0x0000, 0x2000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x2C05, 0x0000, 0x0040, 0x2000, 0x0042, 0x0000, 0x0000, 0x0008, +0x0000, 0x1000, 0x0410, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x2000, +0x100A, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0401, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0001, 0x0000, 0x0000, 0x2000, 0x0000, 0x4080, 0x0002, 0x1000, 0x2400, +0x0000, 0x0000, 0x2000, 0x0040, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, +0x0C10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x2020, 0x1008, 0x0000, +0x0024, 0x0000, 0x0000, 0x0000, 0x4001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x9000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0400, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0004, 0x0000, +0x0000, 0x0040, 0x0000, 0x0400, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0200, 0x0004, 0x0000, +0x0000, 0x0001, 0x0010, 0x9000, 0x2400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0400, 0x0410, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0004, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0004, 0x4000, 0x0000, 0x0008, 0x0000, +0x2000, 0x0000, 0x0080, 0x1041, 0x0001, 0x0000, 0x0001, 0x0200, 0x4001, +0x8000, 0x0000, 0x0000, 0x0008, 0x2041, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x8200, 0x1000, 0x0000, 0x9201, 0x0000, 0x0000, 0x2010, 0x0008, +0x0200, 0x0000, 0x0000, 0x0800, 0x0000, 0x0040, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0008, 0x0000, 0x2000, 0x0000, +0x00C1, 0x1041, 0x0001, 0x0000, 0x0011, 0x2200, 0x0000, 0x8000, 0x0000, +0x0000, 0x0001, 0x2041, 0x0000, 0x4000, 0x0000, 0x0200, 0x0000, 0x8200, +0x1000, 0x0001, 0x9201, 0x0000, 0x0000, 0x2011, 0x0408, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x0001, +0x0000, 0x0000, 0x0000, 0x0068, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0004, 0x0008, 0x0400, 0x0000, 0x0000, 0x0001, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0040, 0x0020, +0x0000, 0x0004, 0x1020, 0x0000, 0x0004, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x0002, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0201, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x0004, +0x0000, 0x0000, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x4009, 0x0000, 0x0000, 0x0004, 0x0000, 0x0001, 0x0000, 0x0000, 0x0040, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0001, 0x0400, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0020, 0x0008, 0x0000, +0x0000, 0x0200, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0082, 0x0000, +0x0000, 0x0001, 0x0001, 0x0000, 0x2200, 0x0000, 0x0000, 0x0200, 0x0000, +0x0002, 0x0810, 0x0000, 0x0400, 0x8200, 0x0001, 0x2001, 0x0400, 0x0108, +0x0000, 0x0800, 0x4000, 0x0000, 0x0000, 0x0100, 0x0020, 0x0000, 0x0002, +0x0020, 0x0001, 0x0400, 0x0000, 0x0000, 0x2020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0208, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x4000, 0x0008, +0x0402, 0x0040, 0x0000, 0x0000, 0x0200, 0x0000, 0x0102, 0x0800, 0x2000, +0x0001, 0x0000, 0x2000, 0x0000, 0x0010, 0x0200, 0x0000, 0x0000, 0x0200, +0x0000, 0x0020, 0x0000, 0x0000, 0x0001, 0x2400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0002, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0208, +0x0800, 0x0010, 0x0000, 0x1004, 0x0008, 0x0000, 0x0108, 0x0220, 0x0800, +0x0000, 0x4000, 0x0000, 0x0080, 0x4010, 0x0A00, 0x2000, 0x8080, 0x0100, +0x2000, 0x0040, 0x1000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x5001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0044, 0x0000, 0x0400, 0x0100, 0x0800, 0x0040, 0x0000, 0x0000, +0x0100, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0200, 0x0100, 0x0000, +0x0000, 0x0110, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0xA000, 0x0020, 0x0000, 0x0000, 0x0000, 0x1002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0402, 0x0040, 0x0000, 0x0000, 0x0000, 0x8000, +0x0002, 0x0000, 0x0000, 0x0008, 0x0020, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2404, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0012, 0x0000, 0x8000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0800, 0x0200, 0x0000, 0x0009, 0x0000, 0x884C, 0x0000, 0x0000, +0x1000, 0x0010, 0x0000, 0x4000, 0x2000, 0x0000, 0x0800, 0x0000, 0x0008, +0x0040, 0x0800, 0x0002, 0x0020, 0x4080, 0x0004, 0x1000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0100, 0x0010, 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, +0x0084, 0x0000, 0x0000, 0x0402, 0x0000, 0x4000, 0x0410, 0x0000, 0x0000, +0x0000, 0x0412, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0009, 0x0000, 0x0804, 0x0000, 0x0004, 0x0000, 0x0010, +0x0000, 0x4000, 0x2000, 0x0000, 0x0800, 0x0000, 0x1008, 0x0040, 0x0800, +0x0002, 0x0000, 0x4000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x004C, 0x0000, 0x0080, 0x0000, +0x0000, 0x0402, 0x0000, 0x4000, 0x0410, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x4000, 0x0001, 0x1002, 0x0000, 0x0000, 0x0008, 0x0100, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0010, 0x4000, 0x0000, 0x0000, 0x1020, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0040, +0x0010, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x8000, 0x0080, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0800, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0040, 0x0800, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0001, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0004, 0x0000, 0x0000, 0x1010, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0010, 0x8040, 0x0000, 0x8000, 0x0000, 0x0000, 0x0004, 0x4100, 0x0002, +0x4000, 0x0020, 0x0002, 0x0200, 0x0000, 0x0000, 0x0080, 0x0200, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0001, 0x4004, 0x0040, 0x8000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0580, 0x0048, 0x0200, 0x0000, 0x0000, 0x0001, 0x0202, +0x0000, 0x2000, 0x0204, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x8040, +0x0000, 0x0200, 0x0041, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x4400, 0x0000, 0x0020, 0x0001, 0x0402, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0002, 0x1000, 0x0100, +0x0008, 0x0001, 0x0000, 0x0000, 0x0000, 0x0040, 0x0100, 0x1000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0020, 0x2000, 0x0001, 0x0000, 0x0410, 0x0000, +0x1841, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x1000, 0x0004, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x8400, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x1000, 0x2000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0100, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, +0x0000, 0x0000, 0x8000, 0x0490, 0x0200, 0x0400, 0x0800, 0x0000, 0x0400, +0x0100, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0004, +0x2400, 0x9209, 0x4924, 0x2882, 0xD249, 0x4904, 0x6482, 0x1249, 0x4A24, +0x2492, 0x9251, 0x5924, 0x2492, 0x0481, 0x92C9, 0x4820, 0x4092, 0x8200, +0x4100, 0x249A, 0xA221, 0x4824, 0x64A2, 0x9043, 0x090C, 0x2492, 0x2009, +0x8208, 0x4324, 0x2092, 0x9649, 0x0104, 0x2492, 0x10C1, 0x4800, 0x2492, +0x1211, 0x0903, 0x249E, 0x2029, 0x9041, 0x4924, 0x2892, 0xD249, 0x4904, +0x6492, 0x8209, 0x4A24, 0x2492, 0x9641, 0x1920, 0x2092, 0x2409, 0x9249, +0x4925, 0x2881, 0x9209, 0x4904, 0x6492, 0x1249, 0x4A24, 0x2492, 0x9251, +0x1824, 0x2492, 0x2480, 0x92C1, 0x4121, 0x6090, 0x9209, 0x4800, 0x2482, +0xB249, 0x0824, 0x0613, 0x9241, 0x492C, 0x0492, 0x2401, 0x8249, 0x4125, +0x2090, 0x9649, 0x0904, 0x3482, 0x12C1, 0x4804, 0x2490, 0x8251, 0x0921, +0x2092, 0x2409, 0x9041, 0x4925, 0x2892, 0x9249, 0x4904, 0x6452, 0x9249, +0x4A24, 0x2090, 0x9641, 0x1920, 0x2082, 0x0009, 0x4000, 0x0001, 0x0400, +0x0020, 0x0002, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0040, 0x0000, +0x8200, 0x0100, 0x0001, 0x0000, 0x4000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0080, 0x0020, 0x0000, 0x2000, 0x1000, 0x0004, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x4800, 0x00A0, 0x0000, 0x0800, 0x0000, 0x0000, 0x8000, +0x0100, 0x0001, 0x1400, 0x0800, 0x0000, 0x0000, 0x0820, 0x0080, 0x0400, +0x0110, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0040, 0x0020, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0400, +0x4020, 0x0000, 0x0184, 0x0000, 0x0400, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0022, 0x0060, 0x8000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0400, 0x0000, 0x0800, 0x2000, 0x0200, 0x8000, +0x0000, 0x2080, 0x1000, 0x0000, 0x0010, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0920, 0x8000, 0x0000, 0x0000, 0x0400, 0x0C20, +0x1080, 0x0008, 0x4400, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x2000, 0x0200, 0x0000, 0x0000, 0x2080, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0400, 0x4000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0480, +0x0000, 0x0000, 0x0100, 0x0000, 0x8000, 0x0020, 0x0000, 0x0000, 0x0804, +0x0090, 0x0000, 0x0020, 0x0000, 0x0000, 0x8000, 0x4800, 0x2000, 0x8001, +0x0500, 0x0002, 0x0000, 0x0900, 0x0002, 0x0000, 0x0120, 0x0010, 0x0000, +0x0000, 0x0024, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0824, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0200, 0x0040, 0x0000, 0x0000, 0x0004, 0x1000, +0x0020, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0010, 0x0000, 0x2400, 0x9249, 0x4924, 0x2892, 0x9248, 0x4B00, 0x6492, +0x9249, 0x4A24, 0x2492, 0x9241, 0x5126, 0x248A, 0x2489, 0xD209, 0x4820, +0x2092, 0x0240, 0x0904, 0x2092, 0x9249, 0x4824, 0x2492, 0x1201, 0x4934, +0x3490, 0x2C01, 0x9229, 0x49A4, 0x2092, 0x9659, 0x4906, 0x2482, 0xD249, +0x402C, 0x2492, 0x9241, 0x4924, 0x3480, 0x2408, 0x9249, 0x4824, 0x2892, +0x9049, 0x4904, 0x6492, 0x9249, 0x4A25, 0x2492, 0x1241, 0x5924, 0x2482, +0xA409, 0x9249, 0x4924, 0x2892, 0x924D, 0x4904, 0x449A, 0x9349, 0x4AB4, +0x2692, 0x9260, 0x5924, 0x2492, 0x2489, 0x9A69, 0x4920, 0x2092, 0x934D, +0x4904, 0x0492, 0x9B68, 0x4824, 0x2492, 0x9341, 0x0926, 0x2292, 0xBC09, +0x9349, 0x4904, 0x2092, 0xD659, 0x4904, 0x2492, 0x9249, 0x441E, 0x2412, +0x8261, 0x0920, 0x2082, 0x2408, 0x9A49, 0x4924, 0x3892, 0x9A49, 0x4906, +0x6490, 0x9269, 0x4235, 0x0492, 0x9241, 0x1926, 0x2492, 0x0009, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x0000, 0x0000, 0x2000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0080, 0x0000, 0x4000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0408, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x8000, 0x3400, 0x68A0, 0xB748, 0xC36D, +0x100A, 0xD6D9, 0x7F3D, 0x0060, 0xFC48, 0x9B6C, 0x1084, 0x9BD7, 0xEB3D, +0xB352, 0x20C0, 0x7758, 0x436C, 0xAE00, 0xFEC1, 0x1967, 0x10C2, 0xF408, +0xDBAC, 0xF632, 0x8401, 0xDD25, 0x0C37, 0x00B2, 0xB6C8, 0x025D, 0x900B, +0x92C4, 0x0DAD, 0x6486, 0xBC04, 0xCB6D, 0x2012, 0x0360, 0x7B7F, 0x4B3B, +0x20D0, 0xA6DC, 0x03CE, 0xA556, 0xFE91, 0x554C, 0x8883, 0x3068, 0x19E9, +0x3A8E, 0x9558, 0xDBA5, 0x8273, 0x014C, 0x08D8, 0x3920, 0x4B24, 0x304B, +0x0964, 0x5905, 0x9096, 0x0C23, 0xC928, 0x1420, 0x1140, 0x0036, 0x492C, +0x1088, 0x9005, 0x512C, 0x8246, 0x0A28, 0x4B2C, 0x1092, 0x4D41, 0x0900, +0x8893, 0x026A, 0x9202, 0x490D, 0x1018, 0x9080, 0x4B24, 0x6602, 0x3256, +0x8B63, 0x4092, 0x3400, 0x4B61, 0x06D2, 0x8800, 0xB504, 0xEBA4, 0x8840, +0xB805, 0x4A32, 0x1303, 0x0201, 0x5124, 0x0496, 0x8A10, 0xE122, 0x18C6, +0x007C, 0x230E, 0x2690, 0x4827, 0x1250, 0x71D0, 0x0030, 0x828B, 0x2C42, +0x204B, 0x8692, 0x4098, 0x6040, 0x0081, 0x0980, 0x8182, 0x0C31, 0xC010, +0x2221, 0x2080, 0x2001, 0x1402, 0x0405, 0x9410, 0x0011, 0x0208, 0xB003, +0x450C, 0x2000, 0x2505, 0x0080, 0x0400, 0xC180, 0x2012, 0x0080, 0x604C, +0x260C, 0x2011, 0x0900, 0x0408, 0x0800, 0x0422, 0x0C13, 0x0210, 0xA480, +0x0538, 0xA002, 0x8492, 0x70E0, 0x0450, 0x0588, 0x4201, 0x9C10, 0x2408, +0x0260, 0x4CB7, 0x0ADA, 0x0218, 0x2D20, 0xB6C2, 0x800A, 0x0100, 0xA49B, +0x1041, 0x5004, 0x14CA, 0xA0AD, 0x8040, 0x0CB5, 0x00DB, 0x8001, 0x0180, +0x2699, 0x1040, 0x0C20, 0x2653, 0x9001, 0x4D05, 0xA6DB, 0x0008, 0x0000, +0x49B5, 0x02CB, 0x1009, 0x6D80, 0x3253, 0x820B, 0x4800, 0xB4D2, 0x4801, +0x4920, 0x86C0, 0x012D, 0x20C0, 0x6D27, 0x08D3, 0x0102, 0x4D21, 0xA6D3, +0x4000, 0x6D04, 0xA71B, 0x0021, 0x5440, 0xA4FA, 0x531D, 0xDC1D, 0x2100, +0xB121, 0xFDC1, 0x409F, 0x0019, 0x1E75, 0x6E26, 0x1240, 0xC610, 0x34AA, +0xA211, 0x4E00, 0x531F, 0x6140, 0xB200, 0x58FA, 0x6C06, 0x1842, 0xE21D, +0x6096, 0x9088, 0x4A60, 0x00E8, 0x1000, 0x2225, 0x966D, 0x2400, 0xB010, +0x2B64, 0x0001, 0x0488, 0x1064, 0x2424, 0x0209, 0x96C0, 0x024E, 0x301B, +0x3600, 0x9329, 0x0090, 0xA208, 0x521D, 0x209C, 0x1108, 0x3A58, 0x0282, +0x10C0, 0xA940, 0x18B5, 0x1201, 0x4C20, 0x9003, 0x6C25, 0x409B, 0x840B, +0x0D84, 0x5082, 0x8298, 0x04B0, 0x34DA, 0x3645, 0xDB0D, 0x868A, 0x6489, +0x3671, 0x2825, 0x22DA, 0x84D2, 0x0509, 0x34D0, 0xA0D1, 0x2868, 0x261A, +0xB6C1, 0x4164, 0x2092, 0x2828, 0xDED2, 0x49A5, 0x62CB, 0xB0DB, 0x4B0D, +0x281B, 0x3418, 0x4421, 0xA4D3, 0x94A1, 0x402D, 0x16C1, 0x4020, 0x185D, +0x69A1, 0x5078, 0x1849, 0x2186, 0x70DA, 0x2369, 0x4819, 0x741F, 0x1255, +0x5128, 0x2613, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0001, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0420, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x1000, 0x0800, 0x4802, 0x0000, 0x0020, +0x4010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0100, 0x0000, 0x0800, 0x00C0, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4800, 0x0000, 0x8200, 0x8100, +0x0000, 0x3000, 0x0900, 0x0002, 0x0000, 0x0100, 0x0010, 0x0400, 0x2000, +0x0024, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0804, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8040, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0480, 0x0003, 0x0000, 0x0000, 0x0000, 0x0040, 0x0400, 0x8641, 0x0002, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0048, 0x0000, 0x0002, 0x0024, +0x0410, 0x0000, 0x0500, 0x0200, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x9001, 0x0004, 0x0040, 0x0000, 0x0400, 0x0000, 0x0000, 0x0400, 0x0000, +0x0040, 0x8040, 0x0000, 0x0000, 0x4001, 0x0000, 0x0001, 0x0484, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0420, 0x8241, 0x0000, 0x0000, 0x0008, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0200, 0x0000, 0x0000, 0x0400, 0x0000, 0x0100, 0x9001, 0x0004, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x2000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x1000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0040, 0x0000, 0x0004, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x1000, 0x0001, 0x0000, 0x0000, 0x0110, 0x0000, +0x0000, 0x0264, 0x0000, 0x0000, 0x0028, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0800, 0x0000, 0x1000, 0x8200, 0x0200, 0x8000, 0x0000, +0x0024, 0x0000, 0x0004, 0x8004, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, +0x2001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0024, 0x0000, +0x8000, 0x0800, 0x0000, 0x0020, 0x0101, 0x2400, 0x0000, 0x8000, 0x008C, +0x0000, 0x0000, 0x0000, 0x0048, 0x0000, 0x4000, 0x8000, 0x0000, 0x0002, +0x2000, 0x0000, 0x0041, 0x0000, 0x1001, 0x1200, 0x0420, 0x8040, 0x0000, +0x0900, 0x0200, 0x0004, 0x0000, 0x0011, 0x0401, 0x0000, 0x6000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0024, 0x0000, 0x8000, 0x0800, +0x0002, 0x0020, 0x0001, 0x2401, 0x0000, 0x8000, 0x0084, 0x0000, 0x0000, +0x0000, 0x0048, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x2001, 0x0400, +0x0041, 0x0000, 0x1005, 0x1200, 0x0420, 0x8040, 0x0000, 0x0900, 0x0600, +0x0004, 0x4000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, +0x0000, 0x0002, 0x0080, 0x0000, 0x0000, 0x0020, 0x0001, 0x1000, 0x0800, +0x0000, 0x0000, 0x0004, 0x2000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2001, 0x1000, 0x0000, 0x8400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0008, 0x0000, 0x0800, 0x0101, 0x0404, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0800, 0x0000, 0x0002, 0x0000, 0x0002, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0820, 0x0000, 0x0000, 0x0800, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0800, +0x0000, 0x8000, 0x0000, 0x8000, 0x0000, 0x1000, 0x0000, 0x0001, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0108, 0x0000, 0x0800, 0x0020, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x8000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0004, 0x0000, 0x0020, 0x0000, +0x2000, 0x8000, 0x0000, 0x0100, 0x0000, 0x0001, 0x0000, 0x0004, 0x0800, +0x0000, 0x0000, 0x0000, 0x1000, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0800, 0x0800, 0x0002, 0x0000, 0x0001, 0x0400, 0x0020, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8020, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0880, +0x0800, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0100, 0x0010, 0x0000, 0x0000, 0x0000, 0x0001, +0x0400, 0x0001, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x1040, 0x0100, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0800, 0x0000, 0x0000, +0x0040, 0x0000, 0x1000, 0x0000, 0x0000, 0x0008, 0x0000, 0x4001, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0002, 0x0000, 0x0800, 0x0008, +0x0000, 0x0000, 0x0001, 0x0000, 0x8000, 0x0404, 0x0018, 0x0000, 0x0800, +0x0040, 0x2800, 0x0000, 0x2000, 0x0000, 0x0000, 0x0201, 0x0600, 0x0005, +0x0000, 0x0880, 0x0280, 0x0020, 0x0010, 0x1000, 0x0100, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0040, 0x0004, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0040, 0x0004, 0x0800, 0x0000, +0x1040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0022, 0x0000, 0x1400, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x1000, 0x8000, +0x0020, 0x0000, 0x4004, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0180, 0x8000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0840, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0048, 0x0002, 0x0800, 0x0000, 0x0004, 0x0200, 0x0008, +0x0000, 0x1000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0008, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0008, +0x0000, 0x4000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4002, +0x0000, 0x0080, 0x0000, 0x0200, 0x0000, 0x0400, 0x0000, 0x0000, 0x0040, +0x0010, 0x0000, 0x0801, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0440, 0x0000, 0x0000, 0x0080, 0x0200, 0x0000, 0x0010, 0x1000, +0x0000, 0x0020, 0x0004, 0x0020, 0x0000, 0x0000, 0x0800, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x2000, 0x1000, +0x0080, 0x0000, 0x1800, 0x0002, 0x0020, 0x1000, 0x0200, 0x0000, 0x4020, +0x0400, 0x0008, 0x0020, 0x0048, 0x0000, 0x1800, 0x0000, 0x2000, 0x0000, +0x0080, 0x4008, 0x0003, 0x0024, 0x0000, 0x000A, 0x0000, 0x0040, 0x0480, +0x0008, 0xC040, 0x0400, 0x0021, 0x0000, 0x0000, 0x0040, 0x8000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0800, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x4020, 0x0400, 0x0008, +0x0000, 0x0000, 0x0000, 0x1004, 0x0200, 0x2000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0026, 0x0000, 0x0008, 0x0000, 0x0000, 0x0080, 0x0008, 0x4000, +0x0400, 0x0001, 0x0000, 0x0000, 0x0040, 0x0000, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0002, 0x0000, 0x0020, 0x0001, 0x9000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0200, 0x0000, 0x0080, 0x0000, 0x4000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0020, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0010, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x4000, 0x0200, 0x0000, 0x4014, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1010, 0x0800, 0x0000, +0x8400, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0002, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x2100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0011, 0x0000, 0x0020, 0x0010, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0080, +0x0004, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x4000, 0x0001, 0x0000, 0x0000, 0x0008, 0x1000, 0x0000, 0x0000, 0x0100, +0x0002, 0x0002, 0x0020, 0x1000, 0x0000, 0x0001, 0x0000, 0x1000, 0x1000, +0x0104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0100, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0003, 0x4000, 0x0000, 0x2000, 0x0100, +0x0020, 0x0220, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0004, +0x0000, 0x0004, 0x0080, 0x1000, 0x1100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2400, 0x0000, 0x0200, 0x0002, 0x0002, 0x0000, 0x0000, 0x0000, 0x0001, +0x0220, 0x0000, 0x0000, 0x0400, 0x1400, 0x0080, 0x0800, 0x0000, 0x2000, +0x0000, 0x0000, 0x0004, 0x000C, 0x0400, 0x0020, 0x0001, 0x0500, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0002, 0x0040, 0x0002, +0x0000, 0x0001, 0x0000, 0x0040, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0100, 0x0000, 0x0000, +0x0000, 0x0004, 0x1000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x8001, 0x1504, 0x0061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0840, +0x0004, 0x0000, 0x2000, 0x9309, 0x4B25, 0x2892, 0x9243, 0x0904, 0x6492, +0x8249, 0x4A04, 0x6496, 0x9201, 0x5924, 0x2486, 0x0489, 0x9608, 0x4925, +0x2002, 0x9209, 0x490E, 0x0490, 0x43A8, 0x4804, 0x2492, 0x9041, 0x4374, +0x2496, 0x2409, 0x9240, 0xC925, 0x0092, 0x9649, 0x4944, 0x2492, 0x80C9, +0x4824, 0x6490, 0x8041, 0x490C, 0x2492, 0x2400, 0x9241, 0x0125, 0x6812, +0x1208, 0x0949, 0x4092, 0x8248, 0x4A1C, 0x2492, 0x3201, 0x5E00, 0x2410, +0x2409, 0x9249, 0x4924, 0x28D2, 0x924B, 0x0104, 0x6492, 0x9349, 0x4A24, +0xA492, 0x9001, 0x5920, 0x2492, 0x248D, 0x9649, 0x4924, 0x0002, 0x8249, +0x410C, 0x04D1, 0x92C9, 0x4824, 0x2491, 0x9241, 0x0B40, 0x2092, 0x2400, +0x9249, 0x4924, 0x2092, 0x1649, 0x4904, 0x0482, 0x90C9, 0x4824, 0x2490, +0x9240, 0x492E, 0x0492, 0x0405, 0x9249, 0x4924, 0x6812, 0x0249, 0x080D, +0x4292, 0x9249, 0x480C, 0x0492, 0xB041, 0x5320, 0x2410, 0x0001, 0x0004, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0010, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0010, 0x8C01, 0x0000, 0x0000, 0x0000, 0x4084, 0x0000, 0x0000, +0x0100, 0x0010, 0x0000, 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x0000, +0x0000, 0x400C, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x4400, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0060, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x1800, 0x0000, 0x0000, 0x0000, 0x0040, 0x0800, 0x0000, 0x1000, 0x0000, +0x0000, 0x0002, 0x000A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0048, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0500, 0x0002, 0x0000, 0x0100, 0x0024, 0x0000, 0x0000, 0x0002, 0x0400, +0x0000, 0x0002, 0x0000, 0x0000, 0x0004, 0x0040, 0x0200, 0x0000, 0x0000, +0x1000, 0x4000, 0x0010, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0004, 0x0000, 0x0000, 0x0000, 0x8080, 0x0000, +0x0200, 0x0000, 0x0001, 0x0C00, 0x0120, 0x0000, 0x0000, 0x8000, 0x8000, +0x0000, 0x4000, 0x0040, 0x0008, 0x2400, 0x9249, 0x4B24, 0x2892, 0x9649, +0x5104, 0x6492, 0x9249, 0x8A24, 0x2492, 0x9241, 0x5526, 0x2492, 0x0488, +0x9249, 0x0924, 0x00B2, 0xB609, 0x5904, 0x2416, 0x9249, 0xC804, 0x24B6, +0x9241, 0x412C, 0x2E96, 0x2409, 0x924B, 0x0A60, 0xA096, 0x9249, 0x4804, +0x2582, 0x8249, 0x4824, 0x6C12, 0x9241, 0x4924, 0x2480, 0x2409, 0xE249, +0x0922, 0x2092, 0x9649, 0x4804, 0x6492, 0x1259, 0x4824, 0x2492, 0x1201, +0x5924, 0x2C92, 0x2409, 0x9249, 0x5924, 0x2892, 0x9649, 0x4804, 0x6492, +0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2481, 0x9249, 0x4924, +0x2090, 0xB649, 0x4904, 0x2412, 0x1249, 0x4824, 0x2492, 0x9241, 0x492C, +0x3412, 0x2001, 0x924B, 0x4925, 0x2092, 0x9249, 0x4804, 0x2082, 0x9249, +0x4824, 0x2492, 0x9240, 0x0900, 0x0012, 0x2401, 0xB249, 0x4906, 0x2880, +0x9649, 0x4804, 0x6082, 0x9259, 0x4A24, 0x2092, 0x9241, 0x5920, 0x2490, +0x0008, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1080, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0480, 0x0008, 0x0000, 0x0000, 0x0440, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2C04, 0x3020, +0xBF49, 0x022D, 0x2C00, 0xBFDF, 0x6F6D, 0x22C0, 0xFC4A, 0xBB64, 0x02C4, +0x9B03, 0xDB64, 0x8B58, 0x0193, 0x32DC, 0xC37F, 0x2240, 0xF78A, 0x1B46, +0xE023, 0xA004, 0xC96F, 0x91D2, 0x8053, 0xDDAC, 0x4D36, 0x0480, 0xBFCC, +0x027D, 0x0413, 0xA28D, 0x0E6F, 0x2643, 0xB805, 0x8B64, 0xA402, 0x0309, +0xD96F, 0xE23A, 0x0050, 0xAE38, 0x134C, 0xEC43, 0xF2D2, 0x596E, 0x222A, +0xD441, 0xDBE5, 0xB08E, 0x9641, 0xD1AF, 0x9277, 0x4B4C, 0x12D8, 0xB864, +0xD36C, 0x0249, 0x1904, 0xD925, 0x009C, 0x0929, 0xD928, 0x1690, 0x4129, +0x3134, 0xD8EC, 0x0448, 0x5020, 0x592C, 0x8200, 0x000D, 0x0944, 0x04B2, +0x1E00, 0x4A22, 0x8481, 0x0241, 0xF310, 0xDF24, 0x4210, 0xB080, 0x5B64, +0x0603, 0x10A0, 0x4926, 0x8492, 0x110B, 0x5962, 0x0692, 0x0B04, 0x1017, +0xD92C, 0x8080, 0x8905, 0x1124, 0x1400, 0x0201, 0xF905, 0xB0B6, 0x090A, +0x69E2, 0xD9D2, 0x4350, 0x8300, 0x2D16, 0x4007, 0x1213, 0x6180, 0x4030, +0x800A, 0x0C92, 0x2041, 0x8410, 0x6CD8, 0x6058, 0xA090, 0x4881, 0x0200, +0x0111, 0x0081, 0x0720, 0x0C84, 0x1510, 0xA402, 0x6049, 0x2510, 0x0091, +0x0508, 0xE030, 0x042C, 0x2080, 0x4001, 0x0188, 0x8402, 0x2108, 0x00C9, +0x2411, 0x4048, 0x6002, 0x0111, 0x44C0, 0x4048, 0x6021, 0x0141, 0x0007, +0x4292, 0x8408, 0x0138, 0xB408, 0x0404, 0x00C0, 0x2052, 0x4018, 0x4008, +0xB010, 0x2400, 0x0062, 0x44B7, 0x0AD2, 0x0200, 0x4420, 0xB492, 0x0252, +0x2100, 0xA49B, 0x0201, 0x5000, 0xB49B, 0x20AD, 0x00C1, 0x4F35, 0x00AA, +0x1048, 0x0D80, 0x2699, 0x4040, 0x6C04, 0x76D8, 0x0201, 0x4023, 0x2657, +0x0129, 0x0004, 0x6535, 0x0093, 0x1209, 0x4D00, 0x3690, 0x0302, 0x6C00, +0xB6DB, 0x8001, 0x4810, 0xB698, 0x000D, 0x1001, 0x4597, 0x009B, 0x0108, +0x0D20, 0x3699, 0x3209, 0x2904, 0x249B, 0x9001, 0x5540, 0xB6DA, 0xD309, +0x8F1D, 0x2900, 0xF009, 0xD9CB, 0x299B, 0x0249, 0xDD09, 0x4E2F, 0x1A40, +0xFC50, 0x367E, 0x0240, 0x9700, 0xDF08, 0x2080, 0xE251, 0x81B5, 0x6006, +0x1042, 0x12A8, 0x00F2, 0x8003, 0xF120, 0x0D84, 0x9088, 0xE204, 0x976B, +0x0880, 0xA248, 0x88C0, 0x2081, 0x004B, 0xD03C, 0x00E8, 0x0004, 0x53C0, +0x06A6, 0x0043, 0x2C20, 0xC32A, 0x2820, 0x7240, 0x5A94, 0x709E, 0x0842, +0xC474, 0x44B2, 0x9240, 0x62E0, 0x18BC, 0x0001, 0x6C34, 0xD081, 0x6425, +0x409A, 0x0413, 0x6484, 0x42D3, 0x2248, 0x04B0, 0x16D2, 0x0205, 0x59A5, +0x36D2, 0x0481, 0x2433, 0x69A1, 0x32C8, 0xA8D3, 0x2849, 0x26D0, 0x129D, +0x4804, 0xA4D9, 0xB441, 0x4A64, 0x301A, 0x0809, 0x405B, 0x64A0, 0x52C3, +0x609D, 0x4984, 0x2A94, 0x92C8, 0x6035, 0xAED2, 0xA6A1, 0x492D, 0xB491, +0x1D01, 0x2E96, 0x6514, 0x20DA, 0x22D3, 0x29C5, 0x64D0, 0x02DA, 0x0C09, +0xB613, 0x9605, 0x5227, 0x2419, 0x002C, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x2000, 0x0000, 0x0040, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2100, 0x0000, 0x0001, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0004, 0x0120, 0x0000, 0x0001, 0x0001, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0060, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0800, 0x0011, 0x0080, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0080, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0480, 0x0008, 0x0140, 0x0104, +0x8000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4200, +0x0000, 0x0100, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0040, 0x8000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x2000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0080, +0x0000, 0x0001, 0x0000, 0x0000, 0x8000, 0x8000, 0x0120, 0x8000, 0x0004, +0x0000, 0x0000, 0x0400, 0x0000, 0x0400, 0x2208, 0x0000, 0x0000, 0x8000, +0x0400, 0x0000, 0x0000, 0x0008, 0x0040, 0x0000, 0x0401, 0x8000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0040, 0x1000, 0x0800, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2002, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0004, 0x2000, 0x0000, 0x0000, 0x1080, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x8004, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000, +0x0000, 0x8300, 0x0400, 0x0208, 0x1000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0600, 0x0004, 0x0004, 0x0000, 0x0020, +0x0000, 0x8000, 0x1000, 0x0800, 0x0000, 0x0000, 0x1000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0004, 0x0000, +0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0004, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x2002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0800, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0044, 0x0000, 0x0400, 0x0008, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0200, 0x8000, 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0200, 0x0020, 0x0040, 0x0000, 0x0008, 0x0200, 0x2000, 0x2040, 0x0000, +0x0400, 0x0001, 0x0000, 0x0100, 0x1000, 0x0000, 0x0000, 0x0080, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0001, 0x0000, 0x1200, +0x0005, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0600, 0x8000, +0x0000, 0x0200, 0x0000, 0x0000, 0x8000, 0x0000, 0x4000, 0x0200, 0x4020, +0x0040, 0x0000, 0x0028, 0x0200, 0x2000, 0x0040, 0x0000, 0x0400, 0x0001, +0x0000, 0x0100, 0x1000, 0x0000, 0x0000, 0x0081, 0x0001, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x1200, 0x0004, 0x0000, +0x0401, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0200, 0x0000, 0x2000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x8001, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0100, 0x0000, 0x8000, 0x4000, 0x0000, 0x0000, 0x0011, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x1000, 0x1001, 0x0000, 0x8000, 0x8000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0040, 0x0001, 0x0001, 0x0200, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1200, 0x0024, 0x0000, 0x0800, 0x0280, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x4000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0002, 0x0000, 0x1000, +0x0001, 0x0000, 0x8000, 0x0200, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2200, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0004, +0x4000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0800, 0x0200, 0x0000, 0x0001, +0x8000, 0x0000, 0x0000, 0x0004, 0x0100, 0x0000, 0x1000, 0x0000, 0x0000, +0x4002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x4020, 0x1000, 0x0000, 0x0000, 0x8400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x1000, 0x0010, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0800, 0x0002, 0x0102, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x8000, 0x0000, 0x4000, 0x0000, 0x8000, 0x0000, +0x8400, 0x0001, 0x0400, 0x4100, 0x0000, 0x0000, 0x0000, 0x0000, 0x4010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0001, 0x8000, 0x0000, 0x1000, 0x0000, 0x0012, 0x4000, 0x2000, 0x0000, +0x0101, 0x4000, 0x0100, 0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0400, 0x0001, +0x0400, 0x0080, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x1000, 0x0000, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0080, 0x0400, 0x0000, 0x0080, 0x0000, 0x0000, +0x4000, 0x0040, 0x0011, 0x0012, 0x0010, 0x0000, 0x0000, 0x0481, 0x0000, +0x0120, 0x0000, 0x0020, 0x0010, 0x0004, 0x0000, 0x0000, 0x0020, 0x0000, +0x0001, 0x0000, 0x8000, 0x8004, 0x1000, 0x0400, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x2004, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x8000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0010, 0x0000, 0x0000, 0x0000, 0x0800, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x8000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x4001, 0x2000, 0x0020, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0008, +0x0800, 0x1000, 0x0000, 0x0800, 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x1000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2004, 0x0000, 0x0000, 0x0000, 0x0201, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x4000, 0x0000, 0x0000, +0x0002, 0x0004, 0x0100, 0x0400, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x2004, 0x0004, 0x0000, 0x0120, 0x0000, 0x0000, 0x0000, 0x0012, 0x0020, +0x100C, 0x0500, 0x0000, 0x0100, 0x0000, 0x0020, 0x0000, 0x0000, 0x1000, +0x0000, 0x4120, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0201, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x2000, 0x0000, 0x0000, 0x4020, 0x0080, 0x0000, 0x0000, +0x0000, 0x0008, 0x1000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0002, 0x0000, 0x0020, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x4000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0000, 0x0012, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0002, +0x0000, 0x1004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0008, 0x0100, +0x0004, 0x0000, 0x0000, 0x0020, 0x0000, 0x0028, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0080, 0x0001, 0x8000, 0x0002, 0x0000, 0x0000, 0x0010, +0x1008, 0x4005, 0x0800, 0x8200, 0x0000, 0x0000, 0x0000, 0x8280, 0x0000, +0x0000, 0x1000, 0x0000, 0x0090, 0x1000, 0x0024, 0x0820, 0x0000, 0x0000, +0x0100, 0x0000, 0x0081, 0x0001, 0x0000, 0x0000, 0x0800, 0x0020, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0001, 0x1000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0010, 0x0000, 0x0004, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x1000, 0x0400, 0x0000, +0x0040, 0x0002, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0201, 0x0000, 0x0020, 0x0000, 0x0100, 0x0002, 0x0000, 0x8000, 0x0100, +0x8000, 0x0000, 0x0000, 0x0000, 0x0008, 0x8501, 0x0000, 0x2000, 0x0001, +0x2000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0404, +0x0400, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0080, 0x0000, 0x0001, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000, 0x0040, 0x0000, 0x0420, +0x0000, 0x0000, 0x0000, 0x0100, 0x6400, 0x1209, 0x4920, 0x2892, 0x1249, +0x4904, 0x64B2, 0x8241, 0x4A04, 0x0492, 0x0243, 0x5124, 0x2492, 0x2408, +0xD05B, 0x4924, 0x30D0, 0x8241, 0x4905, 0x2892, 0x921C, 0x482C, 0x3412, +0x9241, 0x4B20, 0xA192, 0x4409, 0x9209, 0x4924, 0x20B2, 0x9209, 0xC904, +0x2492, 0x124B, 0x4804, 0x2492, 0x1241, 0x4800, 0xA492, 0x2C09, 0x92C8, +0x4924, 0xAC92, 0x1048, 0x4904, 0x6492, 0x8A49, 0x4E44, 0x6496, 0x9451, +0x5924, 0x04D2, 0x6409, 0x9249, 0x4825, 0x2892, 0x9249, 0x4904, 0x6492, +0x9241, 0x4A24, 0x0492, 0x9241, 0x5924, 0x2492, 0x2488, 0x901B, 0x0125, +0x2092, 0x9249, 0x4905, 0x2082, 0x8259, 0x0C2C, 0x0492, 0x9241, 0x4B24, +0x2492, 0x6401, 0x9209, 0x48A5, 0x2092, 0x9249, 0x4904, 0x1492, 0x124A, +0x4004, 0x2492, 0x9201, 0x4820, 0x3492, 0x2C09, 0x92C8, 0x4901, 0x2890, +0x9249, 0x4804, 0x6493, 0x9009, 0x4A64, 0x2492, 0x9450, 0x1924, 0x2482, +0x0009, 0x0100, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x6001, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4840, 0x0101, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0100, 0x0004, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x4000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0002, 0x4044, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0900, 0x1080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4004, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x4000, 0x0000, 0x0080, 0x4000, 0x0800, 0x0000, 0x0040, 0x0400, +0x4000, 0x0000, 0x0000, 0x4000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0040, 0x0200, 0x0000, 0x1000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x8001, 0x0000, 0x6080, 0x0000, 0x4000, 0x0400, +0x0200, 0x0100, 0x3000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0102, 0x0000, 0x0020, 0x4080, 0x0000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2080, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x4004, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0x0004, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0080, 0x0400, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0201, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0021, 0x0000, +0x0400, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x8249, 0x0924, +0x2892, 0x9249, 0x4900, 0x6492, 0x1209, 0x4A24, 0x2492, 0x8141, 0x5924, +0x2492, 0x0489, 0x9258, 0x0920, 0x2092, 0x9849, 0x4904, 0x2492, 0xB24D, +0x4025, 0x0482, 0x9241, 0x0926, 0x2492, 0x2508, 0x92C9, 0x4920, 0x2082, +0x9649, 0x4905, 0x2492, 0xA248, 0x4824, 0x2492, 0x9241, 0x0124, 0x24B2, +0x6609, 0x924B, 0x0920, 0x0192, 0x9A49, 0x0904, 0x6CB2, 0x9249, 0x4A24, +0x2C92, 0x1241, 0x59A4, 0x2492, 0x2409, 0x8249, 0x4924, 0x2892, 0x9A49, +0x4904, 0x6492, 0xD249, 0x6A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2089, +0x9259, 0x4924, 0x2092, 0x9269, 0x4904, 0x2486, 0x3349, 0x4825, 0x2012, +0x9241, 0x4920, 0x0492, 0x2109, 0x92C9, 0x4924, 0x2092, 0x964D, 0x4905, +0x2492, 0xB341, 0x0824, 0x20D2, 0x9241, 0x4924, 0x0490, 0x6409, 0x920B, +0x4124, 0x2892, 0x9249, 0x4904, 0x6492, 0x9249, 0x0A24, 0x2092, 0xD241, +0x5924, 0x2492, 0x0009, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0440, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, 0x0000, +0x5000, 0x2501, 0xB2D9, 0xC27F, 0x0026, 0xF6D6, 0x4A7D, 0xA0B0, 0xB444, +0xC96F, 0x3006, 0x924C, 0xCB0D, 0x0B7E, 0x2F98, 0x9E9C, 0xC365, 0x2841, +0xF281, 0x1B6C, 0x0217, 0xB001, 0xDF75, 0x10B2, 0x8200, 0x9BAF, 0x4B36, +0x3C90, 0xBFD8, 0x132D, 0x6292, 0xE6C4, 0x0975, 0x2642, 0xB401, 0xFB60, +0x30B2, 0x804C, 0xCF2D, 0x053E, 0x0808, 0x97CD, 0x0369, 0x3152, 0xB691, +0x5FAC, 0x45E3, 0xB809, 0x937C, 0x0416, 0x113B, 0x7AED, 0x8672, 0x5E6C, +0x9E00, 0x3824, 0x4B08, 0x1040, 0x1804, 0x5985, 0x9092, 0x5A20, 0xC92A, +0x9FB2, 0x5144, 0x9112, 0xC025, 0x2208, 0x1108, 0xD32C, 0x1602, 0x2905, +0xC960, 0x9493, 0x6028, 0xCB80, 0x84B2, 0x0064, 0xF010, 0xC36D, 0x1048, +0x8044, 0x893C, 0x0242, 0x1C08, 0xD924, 0x8092, 0x0029, 0x4942, 0x8CB2, +0x1040, 0xB300, 0xC324, 0xA278, 0x9900, 0x6825, 0x8107, 0x0043, 0x9E06, +0x04B6, 0x0085, 0x4B2A, 0x1C8C, 0x8024, 0x8117, 0x2031, 0x4827, 0x5201, +0x2192, 0x0439, 0xA6C2, 0xAE12, 0x28DB, 0xA411, 0x7438, 0x60DD, 0x0413, +0xC080, 0x00C8, 0x0191, 0x4001, 0x04C6, 0x0880, 0x3012, 0x2AB2, 0x2048, +0xA2C2, 0x1C11, 0x0405, 0xB411, 0x0805, 0x3000, 0x2001, 0x4009, 0x0000, +0x050C, 0x2600, 0x0090, 0x6080, 0x9246, 0x0481, 0x0108, 0x8018, 0x1800, +0x4002, 0x4823, 0x00DA, 0x00A0, 0x21B8, 0xA01A, 0x2011, 0x40C1, 0x0080, +0x05C9, 0x0620, 0x414A, 0x0009, 0x0000, 0x5DA7, 0x2A90, 0x0011, 0x0920, +0xB6C3, 0x0008, 0x4900, 0xB69B, 0x0001, 0x5000, 0x34DB, 0x0089, 0x0000, +0x61B5, 0x00DA, 0x0A00, 0x0D84, 0x2493, 0x8200, 0x6C21, 0x34CA, 0x1001, +0x4120, 0x2453, 0x2009, 0x9248, 0x5135, 0x00D2, 0xC300, 0x4D84, 0x34CB, +0x8200, 0x6C26, 0x0C9B, 0x0201, 0x4104, 0x32D2, 0x0105, 0x0000, 0x6C37, +0x08D2, 0x2040, 0x69A1, 0xADDB, 0x8062, 0x6D24, 0x2493, 0x1241, 0x501C, +0xA633, 0xB70D, 0x9FFC, 0x2010, 0x904B, 0xB7CC, 0x649B, 0x0018, 0x9EE7, +0x36BB, 0x0040, 0xD760, 0x3FB7, 0x8200, 0xE734, 0xD96B, 0x8C00, 0xA201, +0xD1DE, 0x6002, 0x1248, 0x5CEC, 0x0056, 0x8211, 0xAFE0, 0x0C06, 0x928C, +0xD624, 0x0907, 0x2C88, 0xB209, 0x1C59, 0x204A, 0x0210, 0x182D, 0x0088, +0xB240, 0xC960, 0x8E33, 0x842D, 0xF228, 0xD263, 0x0380, 0x2209, 0xCB29, +0x041E, 0x1200, 0x5718, 0x02C0, 0x9248, 0xA980, 0x1E80, 0x10C8, 0x6820, +0xC082, 0x69B5, 0x00C8, 0xD441, 0x2984, 0x658B, 0x0048, 0x4C24, 0x24D8, +0x0AC5, 0x5000, 0xA6BA, 0x3CA5, 0x3612, 0x4521, 0x32D2, 0x2011, 0x2B0D, +0x2EDA, 0x1409, 0x4824, 0x3083, 0x2041, 0x4B58, 0x6618, 0x052B, 0x0492, +0x44B4, 0x2292, 0xB6C7, 0x2981, 0x24C3, 0x274B, 0x4C6D, 0x04B2, 0xB211, +0x4245, 0x2293, 0x4435, 0x35D9, 0x4CA0, 0x7293, 0x965A, 0x4F00, 0x7316, +0x00C8, 0x601A, 0xB6CA, 0xF035, 0x5141, 0x1613, 0x0029, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0009, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0040, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0220, 0x0008, 0x2000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0140, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x4010, 0x0000, 0x0000, +0x0000, 0x0040, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, +0x0000, 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0010, 0x2000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0048, +0x2000, 0x0040, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0009, 0x0040, 0x0000, 0x1040, +0x0000, 0x2424, 0x9200, 0x0000, 0x0000, 0x8000, 0x0004, 0x4080, 0x0000, +0x0001, 0x0240, 0x0200, 0x1009, 0x0088, 0x6000, 0x8000, 0x8000, 0x0004, +0x1200, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0201, 0x0000, 0x0008, 0x0000, 0x0002, 0x2000, 0x0440, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x000B, 0x0000, 0x0004, 0x1040, 0x4008, 0x2400, +0x9200, 0x0000, 0x0000, 0x8000, 0x0004, 0x0040, 0x0001, 0x0001, 0x0000, +0x0800, 0x1009, 0x0200, 0x2000, 0x8000, 0x0000, 0x0000, 0x1200, 0x0000, +0x0000, 0x0000, 0x0440, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8010, +0x0000, 0x0000, 0x0088, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0200, 0x0000, 0x0000, 0x0040, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0408, 0x0000, 0x0100, 0x0000, 0x0040, 0x0000, 0x0240, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0200, 0x0000, 0x0000, +0x1000, 0x0008, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0010, 0x0009, +0x0000, 0x0000, 0x0040, 0x0009, 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, +0x0004, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x2400, 0x0201, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x8009, 0x0000, +0x0800, 0x0000, 0x0003, 0x0008, 0x2000, 0x0008, 0x0000, 0x0200, 0x0040, +0x0200, 0x0800, 0x0245, 0x8008, 0x0000, 0x0200, 0x0000, 0x0000, 0x0001, +0x0401, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x8000, 0x2401, 0x0201, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x8009, 0x0000, 0x0800, 0x0000, +0x0000, 0x0008, 0x2000, 0x0408, 0x0000, 0x0000, 0x0440, 0x0200, 0x0000, +0x0241, 0x8008, 0x0000, 0x0200, 0x0000, 0x0000, 0x0001, 0x0424, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0021, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0004, 0x0004, 0x0800, 0x0001, 0x0010, 0x0024, 0x0000, +0x0000, 0x0000, 0x9000, 0x0801, 0x0000, 0x0080, 0x2000, 0x0000, 0x0000, +0x0000, 0x8400, 0x0000, 0x0000, 0x0001, 0x0900, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0001, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0104, 0x2000, 0x0000, 0x4100, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0020, 0x0000, 0x1000, 0x0404, 0x0000, 0x0010, 0x0000, 0x0000, +0x0008, 0x0800, 0x0100, 0x0100, 0x0000, 0x0004, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x080A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0020, 0x0000, 0x8000, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0040, 0x0000, 0x0100, 0x0001, 0x2050, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0001, +0x0000, 0x0000, 0x0040, 0x2000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x2020, 0x0000, 0x0201, 0x0420, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0000, 0x1800, 0x0000, 0x0100, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0xC000, 0x0009, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0002, 0x0000, 0x0000, 0x0000, 0x8000, 0x0841, 0x0000, 0x0000, +0x0000, 0x0020, 0x0002, 0x0800, 0x0000, 0x0000, 0x0000, 0x1000, 0x0004, +0x0000, 0x0001, 0x0400, 0x0400, 0x0000, 0x0000, 0x0000, 0x0400, 0x4000, +0x0400, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x8000, 0x0010, +0x0002, 0x0000, 0x0028, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0004, +0x1000, 0x0400, 0x8000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x4100, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0004, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0800, 0x4000, 0x0000, 0x4000, +0x0000, 0x0900, 0x0000, 0x0000, 0x0040, 0x0004, 0x0010, 0x4000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0040, 0x0004, 0x0008, 0x0120, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x1400, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x2004, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x1000, 0x0080, 0x0000, 0x0000, 0x4400, 0x0001, 0x0004, 0x0002, +0x0009, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x4008, +0x0010, 0x0000, 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0480, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0080, 0x0000, 0x0000, 0x0408, 0x0001, 0x0004, 0x0002, 0x0009, 0x0000, +0x0000, 0x0400, 0x0000, 0x1000, 0x0000, 0x0000, 0x4000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0240, 0x0000, +0x8000, 0x0000, 0x0000, 0x0010, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x8200, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0400, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0005, 0x0000, 0x0080, 0x0000, 0x0000, 0x0008, 0x0100, 0x0000, +0x1000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0004, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, +0x0001, 0x8000, 0x0010, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0006, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0120, 0x0000, 0x2001, +0x0000, 0x0000, 0x0001, 0x0000, 0x0002, 0x8000, 0x4010, 0x0400, 0x8010, +0x8008, 0x0000, 0x0000, 0x0001, 0x9540, 0x0020, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x2001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x2000, +0x0400, 0x0000, 0x8000, 0x1008, 0x8008, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0020, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0100, 0x0000, 0x0000, 0x1002, 0x2000, +0x0000, 0x0000, 0x4000, 0x0000, 0x2000, 0x0800, 0x0002, 0x0000, 0x0000, +0x0000, 0x0080, 0x0008, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0040, 0x2400, 0x8201, 0x4924, +0x2912, 0x9258, 0x4904, 0x6092, 0x9049, 0x4A24, 0x2492, 0x9241, 0x5926, +0x2492, 0x2089, 0xD009, 0xC924, 0x20B2, 0x8609, 0x4900, 0x2492, 0x1240, +0x4810, 0x2492, 0x9240, 0x4A06, 0x2492, 0x2C09, 0x1200, 0xC924, 0x2092, +0x8009, 0x4900, 0x0492, 0x9403, 0x4804, 0x6492, 0x1240, 0x4960, 0x2432, +0x2401, 0x8041, 0x4124, 0x6896, 0x82C9, 0x5904, 0x6590, 0x0209, 0x4804, +0x2482, 0x1041, 0x5924, 0x2492, 0x2409, 0x9209, 0x4925, 0x2812, 0x9259, +0x0904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2489, +0x9009, 0x4925, 0x2092, 0x9649, 0x4904, 0x2482, 0x9249, 0x4824, 0x2492, +0x9241, 0x0B24, 0x0492, 0x2C01, 0x9248, 0x4905, 0x2092, 0x9249, 0x4900, +0x2413, 0x960B, 0x4024, 0x2082, 0x1240, 0x4160, 0x2490, 0x2404, 0x9241, +0x4925, 0x6892, 0x92C9, 0x4804, 0x6490, 0x9209, 0x0A24, 0x2482, 0x1041, +0x5924, 0x2492, 0x0009, 0x4000, 0x0001, 0x0400, 0x0024, 0x0000, 0x0000, +0x0020, 0x0090, 0x0000, 0x0120, 0x0080, 0x0000, 0x0000, 0x0024, 0x0081, +0x1000, 0x4800, 0x0000, 0x0000, 0x0904, 0x0000, 0x0000, 0x0800, 0x0008, +0x0000, 0x1000, 0x0000, 0x0001, 0x1000, 0x2020, 0x0000, 0x0001, 0x0800, +0x0000, 0x0000, 0x00A0, 0x0000, 0x0000, 0x0000, 0x0800, 0x0001, 0x8400, +0x0020, 0x0000, 0x0000, 0x0900, 0x0000, 0x0000, 0x0100, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0008, 0x0000, 0x0000, 0x00C0, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0042, 0x0000, 0x8000, 0x0000, 0x0200, 0x4020, 0x0800, 0x0200, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0800, 0x0000, 0x0000, +0x0000, 0x0500, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x1000, 0x8000, 0x0000, 0x8200, 0x0000, +0x0004, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x4002, 0x0000, 0x0000, +0x0000, 0x0000, 0x000A, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x1000, 0x0404, 0x0102, 0x0002, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0401, 0x4000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x1000, 0x0004, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0010, 0x0000, 0x0020, 0x4020, 0x0000, 0x0000, 0x0020, 0x0000, 0x1000, +0x4000, 0x0000, 0x0400, 0x0001, 0x0080, 0x0000, 0x0000, 0x0104, 0x0000, +0x1400, 0x0004, 0x0800, 0x0000, 0x0000, 0x0012, 0x0000, 0x0020, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8000, 0x0800, 0x0000, 0x0100, 0x0000, 0x1000, 0x0100, 0x0000, 0x0000, +0x4440, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x1040, 0x0400, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x2400, +0x9248, 0x4924, 0x2892, 0x9269, 0x4904, 0x64B2, 0x9249, 0x4A24, 0x2592, +0x9241, 0x5824, 0x2492, 0x2489, 0x9249, 0x4904, 0x2093, 0x9049, 0x8904, +0x2492, 0xB249, 0x4824, 0x2696, 0x8241, 0x4924, 0x2492, 0x2409, 0x924D, +0x4924, 0x2092, 0x86C9, 0x4904, 0x2492, 0x90C9, 0x4824, 0x2092, 0x9241, +0x4B26, 0x2492, 0xE009, 0x9249, 0x4924, 0x2892, 0x9AC3, 0x4904, 0x6492, +0x964C, 0x4A24, 0x2492, 0x9261, 0x5824, 0x2492, 0x2409, 0x9249, 0x4924, +0x2892, 0x9249, 0x4804, 0x6492, 0x9269, 0x4A24, 0x2492, 0x9241, 0x5D24, +0x2492, 0x2688, 0x9B49, 0x4924, 0xA092, 0x9349, 0x4906, 0x2492, 0xB245, +0x4826, 0x2092, 0x9341, 0x4924, 0x2492, 0x3409, 0x9349, 0x4924, 0x2092, +0x96C9, 0x4906, 0x2492, 0x92C9, 0x4886, 0x20D2, 0x9340, 0x4B24, 0x2492, +0x7409, 0x9249, 0x4924, 0x2892, 0x93CB, 0x4104, 0x6492, 0xD649, 0x4A24, +0x2092, 0x9241, 0x5924, 0x2492, 0x0009, 0x0000, 0x0000, 0x0401, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1008, 0x0000, 0x0000, 0x1040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x3000, 0xC080, 0xB679, 0x116D, 0x0C10, 0xBFD0, 0x5B6D, +0x6108, 0xD440, 0xDB6D, 0x06CF, 0x920A, 0xDB64, 0x3866, 0x04B2, 0xF671, +0x63C9, 0xBC30, 0xB540, 0x19A9, 0x3118, 0xC429, 0x532D, 0x20D2, 0xC068, +0x7B68, 0x6037, 0x3482, 0xBF19, 0x038D, 0xD511, 0x22C9, 0x31AD, 0x2A44, +0xF429, 0x7B64, 0x0080, 0x8A60, 0x7B6F, 0xCA15, 0x0000, 0xF6F9, 0x436D, +0x0497, 0xF0D3, 0x5B7F, 0x30BA, 0x940A, 0xDA09, 0xB136, 0x900E, 0xC92F, +0x8676, 0x1B2D, 0x90CC, 0xAB20, 0xD36C, 0x0002, 0x0904, 0x9864, 0x20F6, +0x4924, 0xC922, 0x9DB0, 0x4909, 0x8E82, 0xD91D, 0x12C0, 0xD100, 0x630C, +0x90C6, 0x0360, 0x4875, 0xA092, 0x8164, 0xCB32, 0x8CDA, 0xC921, 0xD210, +0x692E, 0x02A0, 0x9140, 0x082C, 0x0C0A, 0x0240, 0xD121, 0x089A, 0x800F, +0xC9E1, 0x45D6, 0xCC80, 0x1820, 0xC96C, 0x1804, 0xB904, 0x4DB0, 0x0404, +0x0080, 0xC944, 0xB0B4, 0x4440, 0x480A, 0x9C90, 0x1774, 0x4313, 0x2C34, +0x4B07, 0x0091, 0x6190, 0x203B, 0xB4C2, 0x2C82, 0x089B, 0x261A, 0x66B8, +0x62D9, 0x14E0, 0xC181, 0x4480, 0x0105, 0x1040, 0x9096, 0x0C08, 0x2403, +0x3CA2, 0x08C0, 0x021A, 0x6CA1, 0x0701, 0x0410, 0x800C, 0x8000, 0x4025, +0x2000, 0x0000, 0x0900, 0x0002, 0x0402, 0x0801, 0x1212, 0x0411, 0x4200, +0x14D0, 0x4004, 0x4002, 0x0C17, 0x4093, 0x2002, 0x00B9, 0xA181, 0x2410, +0x00C9, 0x0411, 0x6009, 0x0641, 0x0419, 0x8009, 0x0000, 0x4987, 0x0393, +0x0008, 0x4420, 0x3492, 0x8200, 0x2900, 0x2592, 0x0201, 0x5000, 0x34DB, +0x0089, 0x0010, 0x49A5, 0x001B, 0x2200, 0x4D80, 0x26D3, 0x0000, 0x6820, +0xB6DA, 0x0001, 0x4048, 0xB4D3, 0x2009, 0xA000, 0x4DA5, 0x22DB, 0x5800, +0x4F08, 0x365B, 0x4001, 0x0804, 0xA4BB, 0x10C1, 0xC120, 0xC49A, 0x0229, +0x0040, 0x0DB7, 0x08D2, 0x0405, 0x4D20, 0xA4D3, 0x9041, 0x6D00, 0x24DA, +0x0041, 0x5002, 0x3ED8, 0x3E0D, 0x7F7D, 0x2430, 0x6048, 0xFBE7, 0x29DF, +0x0249, 0x5D5B, 0x44FF, 0x9249, 0xF870, 0x19F7, 0x8220, 0xDD24, 0xF26D, +0x2410, 0x52C0, 0x48EF, 0x200C, 0x1028, 0xCFF3, 0x04D4, 0x0005, 0xDE30, +0x0F96, 0x0208, 0xC426, 0x424B, 0x2010, 0x1000, 0x2348, 0x2084, 0x0080, +0x991C, 0x6418, 0x1240, 0xC600, 0x005E, 0x3241, 0x2C04, 0xD31D, 0x6000, +0x2209, 0xDAD8, 0x209E, 0x1208, 0x0624, 0x02F4, 0x9201, 0x4BA0, 0x1FA0, +0x8023, 0x2820, 0x80C2, 0x6D14, 0x40DA, 0x0403, 0x4484, 0x669B, 0x0219, +0x0C00, 0xB4D3, 0x1044, 0x5404, 0xA692, 0x22BD, 0x2B42, 0x2D15, 0xA21B, +0x0541, 0x6801, 0x341E, 0x820C, 0x0C2F, 0x3493, 0x1141, 0x0024, 0x16DA, +0x3D28, 0x1ED1, 0x6434, 0x421B, 0xB6F7, 0x7987, 0x141B, 0x22D8, 0x2CE4, +0x04D2, 0x3201, 0x48A9, 0x0699, 0x2508, 0x3691, 0x2985, 0x82DA, 0x9249, +0x2900, 0x76C8, 0x5B8B, 0x4C00, 0xB79A, 0x96D5, 0x512C, 0xA494, 0x002D, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0004, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0200, +0x0900, 0x4800, 0x8000, 0x0100, 0x0000, 0x0000, 0x0004, 0x0002, 0x0000, +0x0100, 0x0000, 0x8000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0002, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0040, 0x0001, 0x0000, 0x0208, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0200, 0x0000, 0x0000, 0x0000, 0x0044, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0020, 0x0000, 0x4000, 0x0000, +0x0000, 0x0000, 0xC020, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x4000, +0x0000, 0x0010, 0x1000, 0x0080, 0x0000, 0x0000, 0x0004, 0x0000, 0x0040, +0x0004, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0041, 0x0000, 0x0400, 0x0200, 0x0000, 0x0000, 0x0000, 0x000C, +0x1040, 0x0000, 0x0000, 0x0010, 0x0000, 0x8000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x8200, 0x0018, 0x0001, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0020, 0x9008, 0x0008, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0001, 0x1000, 0x0000, 0x0400, +0x0000, 0x0000, 0x2200, 0x0000, 0x0804, 0x0000, 0x0000, 0x0040, 0x0110, +0x0001, 0x0000, 0x0000, 0x0000, 0x1000, 0x0800, 0x0040, 0x0200, 0x0800, +0x9008, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x2100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0xB000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1001, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0020, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0101, 0x9000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0800, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x4000, 0x0200, 0x0000, 0x0480, 0x0001, 0x0000, 0x2000, 0x0008, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0008, 0x0004, 0x0000, 0x0000, 0x0200, +0x0000, 0x0004, 0x0040, 0x0000, 0x0000, 0x1080, 0x0000, 0x0000, 0x9000, +0x2020, 0x0000, 0x0090, 0x0208, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x1001, 0x8000, 0x0000, 0x1200, 0x0021, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1001, 0x0020, +0x0000, 0x0481, 0x0401, 0x0000, 0x2000, 0x0008, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0008, 0x0004, 0x0000, 0x0001, 0x0200, 0x0000, 0x0004, +0x0040, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x9000, 0x2020, 0x0000, +0x0091, 0x0208, 0x0000, 0x0200, 0x0001, 0x0000, 0x8000, 0x1001, 0x8000, +0x0000, 0x1220, 0x0020, 0x0000, 0x0001, 0x0408, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x1001, 0x0220, 0x0000, 0x0041, +0x0400, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x2041, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0001, 0x0000, +0x0000, 0x0002, 0x0010, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8009, 0x0402, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x8040, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x8000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0020, +0x0000, 0x0020, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0002, 0x0401, 0x0400, 0x0000, 0x0000, 0x8020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0021, 0x0000, 0x4000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0100, 0x0000, 0x0010, 0x0800, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x1000, 0x0000, +0x0800, 0x0008, 0x0000, 0x0200, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x4000, 0x0000, 0x8000, 0x0000, +0x0201, 0x0404, 0x0004, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0020, 0x2000, 0x0000, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0001, 0x0000, 0x1001, +0x0080, 0x0000, 0x0000, 0x2008, 0x0000, 0x0010, 0x0000, 0x0002, 0x8008, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0001, 0x0200, 0x0800, 0x0000, 0x0000, +0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0090, +0x0000, 0x0000, 0x0000, 0x6800, 0x1000, 0x0000, 0x0040, 0x0020, 0x4000, +0x0200, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0408, 0x0002, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x0000, +0x0000, 0x0000, 0x8000, 0x0100, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0100, 0x1000, 0x0000, 0x0000, 0x0002, 0x0880, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0002, 0x0000, 0x0000, 0x0000, +0x8000, 0x0000, 0x1200, 0x0010, 0x4004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0001, 0x0000, 0x0000, 0x4000, +0x1000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0080, 0x4000, 0x0000, 0x2000, 0x0000, 0x0010, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0401, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2310, 0x0000, 0x0000, 0x4680, 0x0001, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x1000, 0x0000, 0x0004, 0x4000, 0x0004, 0x0000, +0x0440, 0x0022, 0x8004, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, +0x0000, 0x0800, 0x0020, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x2010, 0x0000, +0x0000, 0x0480, 0x0001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0010, 0x0002, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0020, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0040, 0x0100, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0008, 0x0000, 0x0400, 0x0000, 0x0020, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x8000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x000C, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0002, +0x0020, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x02B0, 0x0000, 0x0028, 0x0000, 0x0000, 0x0004, 0x1010, 0x0000, +0x4000, 0x2000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0008, 0x0000, +0x224A, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1104, 0x0000, +0x0000, 0x8001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0001, +0x2000, 0x0000, 0x0800, 0x2000, 0x0000, 0x0840, 0x0400, 0x0000, 0x0220, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0044, 0x0000, 0x8000, 0x2000, 0x0010, 0x0000, 0x0004, 0x0000, +0x0000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0080, 0x0000, +0x0000, 0x4000, 0x0000, 0x0020, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0040, 0x0000, 0x0000, 0x0800, 0x0000, 0x0100, 0x0002, +0x0000, 0xA000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0601, 0x0000, 0x0000, 0x2000, 0x0002, 0x0000, 0x5000, +0x0000, 0x0800, 0x0090, 0x0000, 0x0000, 0x0000, 0x1001, 0x0400, 0x0004, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x0400, +0x920A, 0x4925, 0x2C92, 0x9041, 0x4904, 0x6492, 0xA0E9, 0x4A20, 0x2492, +0x9141, 0x5C24, 0x2490, 0x2499, 0x1F09, 0x4925, 0x2092, 0x8249, 0x4904, +0x2492, 0x124D, 0x4820, 0x2492, 0x9241, 0x4100, 0x2492, 0x0001, 0x1009, +0x4925, 0x2096, 0x9289, 0x4904, 0x2490, 0x8609, 0x0820, 0x2492, 0x1043, +0x4101, 0x2492, 0x2409, 0x9049, 0x4925, 0x28B2, 0x9249, 0x4906, 0x6492, +0x8249, 0x4A24, 0x2C92, 0x9601, 0x5120, 0x2492, 0x0409, 0x9203, 0x4124, +0x2893, 0x9041, 0x4904, 0x6492, 0xB089, 0x4A24, 0x2410, 0x9041, 0x5924, +0x2492, 0x2489, 0x9409, 0x4924, 0x208A, 0x9249, 0x4904, 0x0482, 0x0249, +0x4804, 0x2012, 0x9240, 0x4124, 0x0492, 0x0409, 0x1249, 0x4924, 0x2092, +0x92C9, 0x4D04, 0x2490, 0x9649, 0x0824, 0x2683, 0x8241, 0x4925, 0x2090, +0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x8249, 0x4224, +0x2492, 0x9641, 0x5920, 0x2482, 0x0009, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0001, 0x0010, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x1000, 0x0000, 0x0000, 0x8400, 0x0000, 0x0000, 0x0020, +0x0080, 0x2800, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x4044, +0x0000, 0x4000, 0x0000, 0x0000, 0x2000, 0x0C00, 0x1980, 0x0000, 0x0080, +0x0800, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x1000, 0x0000, +0x0C00, 0x0180, 0x0000, 0x0001, 0x2002, 0x0000, 0x0000, 0x0001, 0x0020, +0x0000, 0x0000, 0x0020, 0x0100, 0x0800, 0x0820, 0x0000, 0x0000, 0x0000, +0x0000, 0x0042, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x7010, 0x0020, +0x1000, 0x0C00, 0x0001, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000, 0x0000, +0x0008, 0x0100, 0x0000, 0x1004, 0x0004, 0x0000, 0x0000, 0x0000, 0x0404, +0x0004, 0x0000, 0x0100, 0x0010, 0x0000, 0x0080, 0x0810, 0x0000, 0x0800, +0x0000, 0x0000, 0x8000, 0x0000, 0x0010, 0x0000, 0x0440, 0x0400, 0x0080, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, +0x0000, 0x0000, 0x0002, 0x2080, 0x0020, 0x2010, 0x0000, 0x0001, 0x0400, +0x0001, 0x0000, 0x0000, 0x0090, 0x0001, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0410, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x2000, 0x0200, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0500, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0088, 0x0000, 0x0000, 0x0020, 0x0008, 0x0000, +0x0040, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0104, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0404, 0x0020, 0x0040, 0x0000, 0x0000, 0x0000, 0x4880, 0x0000, 0x8000, +0x0000, 0xE400, 0x9209, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x8649, +0xC204, 0x2412, 0x9241, 0x5924, 0x2412, 0x0481, 0xA249, 0x0120, 0x2092, +0xD209, 0x4904, 0x2892, 0x2249, 0x4021, 0x2412, 0x9241, 0x4934, 0x2492, +0x2009, 0xD249, 0x4820, 0x2096, 0x9249, 0x4904, 0x2412, 0x9249, 0x0064, +0x2812, 0x9241, 0x4124, 0x0494, 0x2409, 0x8249, 0x4964, 0x2892, 0x9209, +0x4904, 0x6496, 0x9249, 0x4224, 0x2412, 0x9241, 0x5924, 0x2490, 0x6409, +0x9249, 0x4925, 0x2092, 0x1249, 0x4904, 0x4490, 0x9649, 0x4A24, 0x2492, +0x9241, 0x5924, 0x2492, 0x0489, 0xB249, 0x4924, 0x2092, 0x9249, 0x4904, +0x0490, 0xB249, 0x4825, 0x2492, 0x9241, 0x4124, 0x2492, 0x2409, 0x9249, +0x4925, 0x2092, 0x9249, 0x4904, 0x0490, 0x9249, 0x4864, 0x2492, 0x9241, +0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6490, +0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x0009, 0x0000, 0x0000, +0x0400, 0x8000, 0x0000, 0x2002, 0x0000, 0x0000, 0x0208, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202, 0x0000, +0x0000, 0x8200, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x2002, 0x0000, 0x2400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0401, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0008, 0xC804, 0x0080, 0xB7D1, 0xA36D, 0x0C02, +0xA650, 0x5B6D, 0x0040, 0xB400, 0xDB6C, 0x081E, 0xD000, 0xDB6D, 0x0976, +0x2420, 0xB6F1, 0x636D, 0x0850, 0xF444, 0x0B6C, 0x2008, 0x9400, 0xDB69, +0x1092, 0xC04B, 0xDBAD, 0x193E, 0x24B3, 0xBAD0, 0x73CD, 0xA000, 0x3648, +0x316D, 0x2602, 0xB471, 0x5B67, 0x0090, 0xCA49, 0xDB6D, 0x8817, 0x0280, +0xB6F9, 0x4365, 0x0012, 0xD5D1, 0x5B6D, 0x008A, 0x8410, 0xDF69, 0x1CCE, +0x9000, 0xDB2C, 0x7676, 0xDB6D, 0x9040, 0x1124, 0xD36D, 0x02C6, 0x8924, +0x5B25, 0x90B6, 0x4825, 0xD172, 0x9DB6, 0x4904, 0xBE12, 0xD90D, 0x8240, +0x9020, 0x513C, 0x90C2, 0x1985, 0xDB64, 0xB092, 0x4520, 0xCB32, 0x8D94, +0x0964, 0xA612, 0x6B46, 0x0640, 0x8100, 0x5B2C, 0x128A, 0x0624, 0x4965, +0x9086, 0xA80C, 0xDB30, 0x04D6, 0x0184, 0x1A30, 0xD96C, 0x914C, 0xF128, +0xDB7C, 0x8006, 0x0924, 0x5B24, 0xE0A6, 0x4820, 0xC122, 0x9CB6, 0x0161, +0x1912, 0x6D36, 0x4807, 0x5890, 0x6192, 0x413B, 0x2482, 0x2DF6, 0x48DB, +0x2692, 0x65A1, 0x26DB, 0x3492, 0xC189, 0x0412, 0x4901, 0x4003, 0x25A6, +0x0C09, 0x24D2, 0x4CB2, 0x4CD9, 0xB412, 0x5DA1, 0x04A0, 0x0011, 0xC800, +0x0000, 0x0111, 0x6209, 0x0496, 0x4800, 0x055A, 0x0130, 0x6448, 0x3000, +0x2500, 0x0300, 0x0091, 0x2300, 0x6C36, 0x4D07, 0x0890, 0x61A8, 0x243A, +0xA092, 0x0CC2, 0x40CA, 0x2094, 0x6099, 0x46C9, 0x2480, 0x0009, 0x0001, +0x4927, 0x0892, 0x0008, 0x49A0, 0x2492, 0x4200, 0x6900, 0x2693, 0x0009, +0x5000, 0x249A, 0x0089, 0x0000, 0x4925, 0x009F, 0x1050, 0x4D84, 0x369B, +0x0000, 0x6C24, 0x2492, 0x0001, 0x4000, 0xA453, 0x0401, 0xA101, 0x6D25, +0x10D2, 0x0200, 0x4D80, 0x3693, 0x0001, 0x6800, 0xAED8, 0x0031, 0x4102, +0xA493, 0x202D, 0x0200, 0x4D77, 0x009A, 0x0000, 0x4D20, 0x2492, 0x0000, +0x6F00, 0x2293, 0x0001, 0x5004, 0x24DB, 0xF50D, 0xFF7C, 0x2490, 0xD249, +0xFBF1, 0x241F, 0x1249, 0xBD3F, 0x06FF, 0x9048, 0xFBF0, 0x3FFF, 0x9241, +0xFC24, 0x9B7B, 0xA490, 0x1240, 0xCFAF, 0x200B, 0x0040, 0xDEF7, 0x00D8, +0x9249, 0xEF70, 0x0FA6, 0x1A88, 0xF02C, 0x526A, 0x8090, 0x8209, 0x595F, +0x200C, 0x004C, 0xD9FC, 0x0406, 0x1003, 0xD740, 0x0474, 0x1248, 0x9E00, +0xFD7F, 0x2080, 0x6241, 0xFBF9, 0x209E, 0x1249, 0xDE61, 0x00FF, 0x9448, +0xEA30, 0x1FE3, 0x9200, 0x0220, 0x0080, 0x6CB4, 0x22DB, 0x0404, 0x6D00, +0x76DB, 0x8008, 0x6C00, 0xB4DA, 0x0205, 0x1000, 0xA6DB, 0x02AD, 0x22C0, +0x6D9D, 0xA2FA, 0x8241, 0x2B04, 0x269A, 0x2109, 0x4824, 0x26DB, 0x2041, +0x0249, 0xB61A, 0x0325, 0x9C99, 0x61A5, 0x0052, 0xA061, 0xED07, 0x1493, +0xB68A, 0x58A1, 0x26D1, 0x00C1, 0x0829, 0xB6DA, 0x440E, 0x0281, 0x6995, +0x82D3, 0x0403, 0x08C1, 0x76DB, 0xA11D, 0x4C01, 0xF2DB, 0x1645, 0x5100, +0xB69A, 0x002D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x1000, 0x0000, +0x0000, 0x8200, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0200, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x4000, 0x0002, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x8001, 0x0000, 0x0841, 0x0000, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x8050, 0x2000, 0x0000, 0x1008, 0x0000, 0x0008, 0x0000, 0x0440, +0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x1000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0001, +0x0400, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x8001, 0x0008, +0x0200, 0x0020, 0x0200, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x8040, +0x0000, 0x0004, 0x1008, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0240, 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, +0x0002, 0x0200, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x4000, +0x0000, 0x0000, 0x0200, 0x0008, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0010, 0x0040, 0x0000, 0x0400, 0x0200, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x8008, 0x0000, 0x8001, 0x0400, 0x0009, 0x0040, 0x0000, 0x0242, +0x8200, 0x0000, 0x1200, 0x0000, 0x0000, 0x9200, 0x2000, 0x1000, 0x2000, +0x0001, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0041, 0x0004, 0x0000, 0x0009, 0x0400, 0x0000, 0x2000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0011, 0x0040, +0x0000, 0x0400, 0x0200, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x8008, +0x0000, 0x8001, 0x0401, 0x0009, 0x0040, 0x0000, 0x0240, 0x8200, 0x0800, +0x1200, 0x0000, 0x0000, 0x9200, 0x2000, 0x1000, 0x2001, 0x0401, 0x0000, +0x0500, 0x0010, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0041, 0x0004, +0x0000, 0x0000, 0x0400, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0011, 0x0002, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0200, 0x0000, +0x0000, 0x0800, 0x0010, 0x0000, 0x0001, 0x0404, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0100, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0201, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8012, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0001, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0044, 0x0000, 0x0000, 0x0800, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, 0x0280, 0x0000, +0x0000, 0x0000, 0x0020, 0x0010, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, +0x0000, 0x8002, 0x0080, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0800, 0x0000, 0x0004, 0x4000, 0x0000, 0x0120, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, +0x1000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x8000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0100, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x8000, 0x0082, 0x0000, 0x0004, 0x0000, 0x0000, 0x4000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0200, 0x0400, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0082, 0x0000, 0x0004, 0x0000, 0x0000, 0x4000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0008, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2008, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x1000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0104, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0800, 0x0000, 0x1000, 0x0000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0004, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0800, 0x0020, 0x0081, 0x0000, 0x4000, 0x0000, 0x0000, +0x0000, 0x0010, 0x8000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, +0x0002, 0x0400, 0x0000, 0x0000, 0x0000, 0x2010, 0x2200, 0x0010, 0x0000, +0x0008, 0x0000, 0x0000, 0x0201, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0080, 0x0002, 0x0800, 0x0000, 0x0000, 0x0401, +0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x3000, 0x0001, 0x0000, 0x0400, +0x0000, 0x0000, 0xC000, 0x4002, 0x0000, 0x4010, 0x0000, 0x0200, 0x0100, +0x0000, 0x0048, 0x0400, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0004, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0002, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2001, 0x0082, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0005, 0x8080, 0x0000, 0x0004, 0x4000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2400, 0x9249, 0x4924, 0x2C92, 0x9241, 0x5904, 0x6492, 0x8249, +0x4A24, 0x2492, 0x82D1, 0x5924, 0x2492, 0x2089, 0x8249, 0x492C, 0x2092, +0x1248, 0x4B04, 0x2492, 0x1249, 0x4824, 0x2492, 0x9001, 0x490C, 0x2492, +0x3409, 0x1008, 0x4124, 0x2090, 0x0249, 0x4900, 0x2C92, 0x0249, 0x4800, +0x2490, 0x3040, 0x4900, 0x2412, 0x2409, 0x8201, 0x4924, 0x2C92, 0x9248, +0x6D44, 0x6492, 0x9249, 0x0824, 0x0492, 0x8281, 0x5834, 0x2492, 0x2409, +0x9249, 0x4925, 0x2892, 0x9249, 0x4904, 0x6492, 0x9049, 0x4A24, 0x2492, +0x92D1, 0x1924, 0x2480, 0x2489, 0x9249, 0x4925, 0x2092, 0x9249, 0x4904, +0x2492, 0x1249, 0x4824, 0x2412, 0x9241, 0x492C, 0x0492, 0x2409, 0x8249, +0x4925, 0x2010, 0x9249, 0x4900, 0x2492, 0x1241, 0x0824, 0x0492, 0xB241, +0x4920, 0x2412, 0x0401, 0x9249, 0x4925, 0x2892, 0x9248, 0x4904, 0x6492, +0x9249, 0x4A24, 0x0492, 0x92C1, 0x5924, 0x2490, 0x0009, 0x0000, 0x0001, +0x8400, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0001, 0x0500, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0001, 0x0000, +0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0084, 0x1000, +0x0000, 0x0000, 0x0001, 0x8400, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000, +0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0xC004, 0x0004, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, 0x0000, 0x0000, 0x0004, +0x0004, 0x0000, 0x0000, 0x0008, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, +0x4014, 0x0400, 0x0000, 0x0082, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, +0x0000, 0x0020, 0x0000, 0x0000, 0x8008, 0x0080, 0x0002, 0x0000, 0x0000, +0x2000, 0x0000, 0x0001, 0x0800, 0x8400, 0x0000, 0x0000, 0x0000, 0x0104, +0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x1004, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, +0x0000, 0x0000, 0x0000, 0x2400, 0x924B, 0x4924, 0x2892, 0x9249, 0x4904, +0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2482, 0x2489, 0x82C9, +0x0920, 0x0092, 0x9249, 0x4904, 0x2492, 0x9241, 0x4824, 0x0492, 0x9241, +0x4924, 0x2492, 0x2C09, 0x82C9, 0x0920, 0x0092, 0x9649, 0x4900, 0x2492, +0x9249, 0x482C, 0x6410, 0x1241, 0x4920, 0x2492, 0x2409, 0x9249, 0x0900, +0x2092, 0x9249, 0x4904, 0x6492, 0x9259, 0x4A04, 0x2492, 0x9241, 0x5924, +0x2C92, 0x2409, 0x924B, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x9241, +0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2489, 0x92C9, 0x4924, 0x0090, +0x8249, 0x4904, 0x2492, 0x9241, 0x4824, 0x2492, 0x9241, 0x4924, 0x2492, +0x0C09, 0x92C9, 0x4904, 0x0090, 0x8609, 0x4904, 0x2492, 0x1241, 0x4C0C, +0x0490, 0x9241, 0x4920, 0x0490, 0x2409, 0x9248, 0x4104, 0x3890, 0x9249, +0x4904, 0x6492, 0x9258, 0x4A24, 0x2092, 0x9241, 0x5924, 0x2492, 0x0009, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0402, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0002, 0xBED9, +0x036D, 0x0000, 0x36D0, 0x5B6D, 0x0300, 0xB400, 0xDB65, 0x040E, 0x9000, +0xDB6D, 0x2076, 0x0000, 0xB659, 0x036D, 0x0000, 0xB6C0, 0x1B6D, 0x0010, +0xF400, 0xDB6D, 0x0002, 0x8000, 0xDB69, 0x0036, 0x10D8, 0x96D8, 0x032C, +0x1000, 0xB6C0, 0x1BAD, 0x4000, 0xB400, 0xFBFD, 0x0002, 0x8020, 0x7B6D, +0x2536, 0x0000, 0xB74D, 0x036D, 0x0002, 0xB690, 0x5B6D, 0x4041, 0xF800, +0xDB6C, 0x0016, 0x9000, 0xDB6D, 0x3676, 0xDB6F, 0x9248, 0xB124, 0xDB65, +0x5246, 0x0924, 0xD86D, 0x90B6, 0x4928, 0xCB62, 0x9DB6, 0x4924, 0x9612, +0xDB6D, 0x92C8, 0xB124, 0xDB6D, 0x9246, 0x0924, 0xDB7D, 0x90B6, 0x4924, +0xDB62, 0x8DB6, 0x4920, 0xB612, 0xC925, 0x3248, 0xB161, 0xC96D, 0x9246, +0x0964, 0x0B6D, 0x90B6, 0x4404, 0xDB62, 0x8D96, 0x8424, 0x9310, 0xDB6D, +0x92D8, 0x9924, 0xDB6D, 0x8306, 0x0924, 0x9B2C, 0x84B6, 0x4825, 0xD92A, +0x1DB6, 0x4920, 0x5B12, 0x6DB4, 0x4127, 0xD892, 0x6D96, 0x693B, 0xA492, +0x6CB6, 0x48DB, 0x2492, 0x6DB9, 0x66DB, 0x2482, 0xDB89, 0x6DB6, 0x4925, +0xD092, 0x6DB6, 0x490B, 0x2492, 0x6DA6, 0x08DB, 0x2492, 0x6CB1, 0x46DB, +0x2492, 0xDB09, 0x7C06, 0x0925, 0xD090, 0x4036, 0x490B, 0x2412, 0x01B6, +0x48D0, 0x0422, 0x2DB1, 0x4640, 0x0492, 0xB809, 0x6DB6, 0x4823, 0xC092, +0x69B2, 0x41BB, 0xA492, 0x2D80, 0x00DB, 0x2492, 0x6C99, 0x06DB, 0x249A, +0x0009, 0x0000, 0x4927, 0x0092, 0x0000, 0x6920, 0x2492, 0x0000, 0x4B00, +0x249A, 0x0001, 0x5000, 0x2492, 0x0089, 0x0000, 0x49A5, 0x0092, 0x0000, +0x4900, 0x2492, 0x0000, 0x4800, 0x2492, 0x0001, 0x4000, 0x2492, 0x0009, +0x1048, 0x6925, 0x00DB, 0x1000, 0x4900, 0x245A, 0x0000, 0x4800, 0x0642, +0x0001, 0x4020, 0x8492, 0x0409, 0x0000, 0x48B7, 0x0892, 0x0000, 0x49A0, +0xA492, 0x0040, 0x0500, 0x2493, 0x0001, 0x5004, 0x249B, 0xFF09, 0xFFFF, +0x2690, 0xF249, 0xFFCF, 0x049F, 0x1249, 0xFCFF, 0x24FF, 0x9241, 0xFBF0, +0x3FFF, 0x9249, 0xDF24, 0xFFFF, 0x2410, 0xF249, 0xFFFF, 0x248F, 0x1249, +0xFFFF, 0x24FF, 0x9249, 0xFEF0, 0x0FFF, 0x9249, 0xFF24, 0xEE07, 0x0490, +0xF200, 0xEB7F, 0x248F, 0x12A5, 0xFFFF, 0x24FC, 0xB099, 0xBFF0, 0x0F4C, +0x3249, 0xFB24, 0xFFFF, 0x2500, 0xA249, 0xFBF9, 0x241F, 0x1249, 0xFFBA, +0xEAFF, 0x9248, 0xFEC0, 0x1FFB, 0x9240, 0x0024, 0x0000, 0x65B5, 0x02DB, +0x0028, 0x4D80, 0x76DB, 0x0200, 0x6C00, 0xB6D3, 0x1005, 0x5000, 0xB6DB, +0x20AD, 0x0000, 0x6D35, 0x02DB, 0x0000, 0x6D80, 0x36DB, 0x0000, 0x2C00, +0xB6DB, 0x0101, 0x4000, 0xB6DB, 0x002D, 0x02D8, 0xCDB5, 0x029A, 0x3680, +0x6D80, 0x361B, 0xB400, 0x6C09, 0x964B, 0x0001, 0x4029, 0x16DB, 0x442D, +0x0000, 0x6C21, 0x32DB, 0x0400, 0x6D00, 0x76DB, 0x0053, 0x2000, 0xB6DA, +0x0245, 0x5000, 0xB6D3, 0x002D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1008, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, +0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2080, 0x0040, 0x1000, 0x0004, 0x1000, 0x0000, 0x0000, +0x2000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0200, 0x0000, +0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0040, 0x0000, 0x0000, 0x1400, 0x0000, 0x0000, 0x2000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x1000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0800, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1240, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x1000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1240, 0x0000, 0x0008, 0x0001, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0008, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0008, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0008, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0001, 0x0000, 0x0000, 0x0000, +0x0060, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0009, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0040, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x0000, 0x1020, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x4000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, +0x0200, 0x0000, 0x0000, 0x0400, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0040, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0040, +0x0000, 0x0000, 0x4000, 0x5000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0040, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0001, 0x0400, 0x0200, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0xA400, 0x9249, 0x4924, 0x2C92, 0x9249, 0x4904, +0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x2089, 0x9049, +0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9248, 0x4824, 0x2492, 0x9241, +0x4920, 0x2492, 0x2009, 0x9269, 0x4924, 0x2092, 0x9209, 0x4904, 0x2492, +0x8241, 0x4824, 0x2492, 0x0241, 0x4930, 0x2412, 0x2409, 0x9241, 0x4924, +0x2892, 0x9249, 0x4904, 0x6492, 0x9049, 0x4A24, 0x2482, 0x8241, 0x5924, +0x2492, 0x2409, 0x9249, 0x4925, 0x2892, 0x9249, 0x4904, 0x6492, 0x9249, +0x4A24, 0x2482, 0x9241, 0x5924, 0x2492, 0x2489, 0x1249, 0x4925, 0x2092, +0x9249, 0x4904, 0x2492, 0x9249, 0x4824, 0x2492, 0x9241, 0x4924, 0x2492, +0x2409, 0x9249, 0x4925, 0x2092, 0x9209, 0x4904, 0x2492, 0x9249, 0x4824, +0x2492, 0x9241, 0x4924, 0x2492, 0x2409, 0x9249, 0x4925, 0x2892, 0x9049, +0x4104, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x0209, +0x0000, 0x0001, 0x0400, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0200, 0x4004, 0x0001, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, +0x0001, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0040, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0100, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2040, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x4000, 0x0082, 0x0000, 0x0000, 0x0008, 0x0800, 0x0400, 0x0004, 0x0000, +0x0000, 0x0000, 0x0220, 0x0000, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0020, 0x0000, 0x8000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0002, 0x0010, +0x0000, 0x0000, 0x0008, 0x0000, 0x0400, 0x0000, 0x0200, 0x0000, 0x0000, +0x1000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0400, 0x9209, 0x4924, 0x2892, +0x9249, 0x4904, 0x6492, 0x8249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, +0x0489, 0x9249, 0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, 0x4824, +0x2492, 0x9241, 0x4924, 0x2492, 0x2409, 0x1209, 0x4924, 0x2092, 0x9249, +0x4904, 0x2492, 0x9241, 0x4824, 0x2482, 0x3241, 0x4924, 0x0492, 0x2409, +0x9241, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x9209, 0x4A24, 0x2492, +0x9241, 0x5924, 0x2492, 0x2409, 0x9249, 0x0920, 0x2892, 0x9249, 0x4904, +0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, 0x2492, 0x0409, 0x9249, +0x0920, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, 0x4824, 0x2492, 0x9241, +0x4924, 0x2492, 0x2409, 0x9240, 0x0920, 0x2092, 0x9249, 0x4904, 0x2492, +0x9209, 0x4824, 0x2482, 0xB240, 0x4924, 0x2492, 0x2409, 0x9241, 0x0120, +0x2892, 0x9249, 0x4904, 0x6492, 0x9209, 0x4804, 0x2492, 0x9241, 0x1924, +0x2492, 0x0009, 0x0000, 0x4000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x4004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x4004, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4D00, +0xB6DA, 0x0006, 0xCC00, 0xFFFF, 0x249F, 0x5249, 0xA6DB, 0x066D, 0x0000, +0xFFF8, 0x7FFF, 0x9249, 0x6DE4, 0xB6DA, 0x0000, 0xF000, 0xFFFF, 0x248F, +0x1249, 0xB6DB, 0x006D, 0x0000, 0xFFF0, 0x0FFF, 0x9249, 0x6D24, 0xB6DB, +0x0000, 0xF000, 0xFFFF, 0x248F, 0x1249, 0xB6DB, 0x006D, 0x0000, 0xFFF0, +0x0FFF, 0x9249, 0x0D24, 0x0000, 0x0002, 0xFE00, 0x0001, 0x0498, 0x6000, +0x000B, 0x0240, 0x0000, 0x00F9, 0x1800, 0x0001, 0x0060, 0x0000, 0x2491, +0x6249, 0x2492, 0x0009, 0x0000, 0x0000, 0x2000, 0x9249, 0x2480, 0x0249, +0x0000, 0x0000, 0x0000, 0x2491, 0x4249, 0x2492, 0x0009, 0x0000, 0x0000, +0x2400, 0x9249, 0x2490, 0x0249, 0x0000, 0x0000, 0x0000, 0x2491, 0x4249, +0x2492, 0x0009, 0x0000, 0x0000, 0x2400, 0x9249, 0x2490, 0x0249, 0x0000, +0x0000, 0x8000, 0x0011, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, +0x0000, 0x0090, 0x0000, 0x0000, 0x2400, 0x9249, 0x0001, 0x2000, 0x0000, +0x0000, 0x0000, 0x9248, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, +0x9249, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, +0x0000, 0x0000, 0x0000, 0x2400, 0x9249, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x9249, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x8000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4D00, 0xB6DA, 0x2496, 0x0EDB, 0x9249, 0x0094, 0x4000, +0xA493, 0x2E6D, 0xB6D9, 0x9259, 0x7924, 0x0000, 0x6DC0, 0xB6DB, 0x6DB4, +0x22DB, 0x9249, 0x0004, 0x0000, 0xB6DB, 0x6C6D, 0xB6D9, 0x9241, 0x0924, +0x0000, 0x6D00, 0xB6DB, 0x6DB4, 0x22DB, 0x9249, 0x0004, 0x0000, 0xB6DB, +0x6C6D, 0xB6DB, 0x9241, 0x0924, 0x0000, 0x0D00, 0x0000, 0x0036, 0x2E00, +0x0001, 0x0018, 0x6000, 0x000B, 0x2E40, 0x0000, 0x0049, 0x1800, 0x0000, +0x6960, 0x2493, 0x6DB7, 0x4E49, 0xB6DB, 0x6D9D, 0x76DB, 0x36DB, 0x6649, +0x924B, 0xB6D8, 0x7B6D, 0xB6DB, 0x49ED, 0x2492, 0x2491, 0x6249, 0xB6DB, +0x6D8D, 0x36DB, 0x2492, 0x2449, 0x924B, 0xB6D0, 0x4B6D, 0xB6DB, 0x492D, +0x2492, 0x2491, 0x6249, 0xB6DB, 0x6D8D, 0x36DB, 0x2492, 0x2449, 0x9249, +0xB6D0, 0x4B6D, 0xB6DB, 0x092D, 0x0000, 0x0013, 0x6E00, 0x0001, 0x0598, +0x6000, 0x0002, 0x2640, 0x0000, 0x00D9, 0x5800, 0x0003, 0x0060, 0x0000, +0x4920, 0x2092, 0x0012, 0x0000, 0x0000, 0x0000, 0x4800, 0x2492, 0x0001, +0x0001, 0x0000, 0x0000, 0x0000, 0x4924, 0x0092, 0x0010, 0x0000, 0x0000, +0x0000, 0x4800, 0x2492, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x4924, +0x0092, 0x0000, 0x0000, 0x0000, 0x0000, 0x4800, 0x2492, 0x0001, 0x0000, +0x0000, 0x0000, 0x8000, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0480, 0x0000, +0x0000, 0x2480, 0x1249, 0x0000, 0x2400, 0x0049, 0x0008, 0x0000, 0x9249, +0x0064, 0x0000, 0x0400, 0x0000, 0x0000, 0x2480, 0x1249, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x9249, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, +0x2480, 0x1249, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9249, 0x0024, +0x0000, 0x2480, 0x0249, 0x0000, 0x2480, 0x1249, 0x0000, 0x0000, 0x9249, +0x0008, 0x0000, 0x9249, 0x0064, 0x0000, 0x2015, 0x4EDB, 0x2492, 0x8009, +0x0000, 0x0000, 0x0800, 0xB692, 0x2481, 0x4249, 0x0000, 0x0080, 0x0000, +0x69B5, 0x42DB, 0x2492, 0x0009, 0x0000, 0x0000, 0x6C00, 0xB6DB, 0x2491, +0x0249, 0x0000, 0x0000, 0x0000, 0x6DB5, 0x42DB, 0x2492, 0x0009, 0x0000, +0x0000, 0x6C00, 0xB6DB, 0x2491, 0x0249, 0x0000, 0x0000, 0x0000, 0x4935, +0x4C92, 0x0000, 0x4800, 0x2492, 0x0000, 0x6C00, 0x2492, 0x0091, 0x0000, +0x2490, 0xDA09, 0x6DB6, 0xFFF8, 0x976D, 0x4924, 0x7F62, 0xFFFF, 0x6DB6, +0xD1DB, 0xDB64, 0x4926, 0x8492, 0xFFFF, 0xDB3F, 0x6DB6, 0xB6D8, 0x936D, +0x4924, 0xFFC2, 0x3FFF, 0x6DB6, 0xB4DB, 0xDB6D, 0x4922, 0xC492, 0xFFFF, +0xDB3F, 0x6DB6, 0xB6D9, 0x936D, 0x4924, 0xFFC2, 0x3FFF, 0x6DB6, 0xB4DB, +0xDB6D, 0x4922, 0xC492, 0xFFFF, 0x9B3F, 0x4924, 0x9258, 0x9524, 0x4924, +0x97E2, 0xC924, 0x4926, 0xB592, 0x4924, 0x4926, 0xC492, 0x4927, 0xDA12, +0x6DB6, 0x9B6D, 0xD9B6, 0x6DB6, 0x49FB, 0xEDB2, 0x7DB6, 0xBDDB, 0x6DBD, +0x6DAF, 0xC6DB, 0x6D92, 0xDBDB, 0x6DB6, 0xDB6D, 0xD1B6, 0x6DB6, 0xDB4B, +0x2DB6, 0x6DB6, 0xD8DB, 0x6DB6, 0x6DB3, 0xC6DB, 0x6DB6, 0xDB1B, 0x6DB6, +0xDB6C, 0xD1B6, 0x6DB6, 0xDB4B, 0x2DB6, 0x6DB6, 0xD8DB, 0x6DB6, 0x6DB3, +0xC6DB, 0x6DB6, 0x9B1B, 0x4924, 0xDB6D, 0xDBB6, 0x4924, 0xDB72, 0xEDB6, +0x4926, 0xD992, 0x6DB6, 0x49BF, 0xC492, 0x6DB6, 0x007B, 0x0008, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0100, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, +0x4000, 0x0082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2001, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, +0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0081, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0400, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, +0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, +0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0400, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0010, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0402, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0402, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x9241, 0x4924, +0x2892, 0x9249, 0x4904, 0x6492, 0x8249, 0x4A24, 0x2492, 0x9241, 0x5924, +0x2482, 0x2489, 0x9249, 0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, +0x4824, 0x2412, 0x9241, 0x4924, 0x2492, 0x0409, 0x9249, 0x4924, 0x2092, +0x9249, 0x4900, 0x2492, 0x9249, 0x4824, 0x2492, 0xB241, 0x4924, 0x2492, +0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x8249, 0x0A24, +0x2492, 0x9241, 0x5924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2892, 0x9249, +0x4904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x8241, 0x5924, 0x2482, 0x2489, +0x9249, 0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, 0x4824, 0x2492, +0x9241, 0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2092, 0x9249, 0x4904, +0x2492, 0x9249, 0x4824, 0x2482, 0xB241, 0x4924, 0x2412, 0x2409, 0x9249, +0x4924, 0x2890, 0x9249, 0x4904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, +0x5924, 0x2492, 0x0009, 0x0000, 0x0001, 0x0400, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0020, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, 0x8000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, +0x0000, 0x1000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, +0x9248, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x8249, 0x4A24, 0x2492, +0x9241, 0x5924, 0x2492, 0x2489, 0x9249, 0x4924, 0x2092, 0x9249, 0x4904, +0x2492, 0x9249, 0x4824, 0x2492, 0x9241, 0x4924, 0x2492, 0x2409, 0x8249, +0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, 0x4824, 0x2092, 0x9241, +0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, +0x9249, 0x4A04, 0x2492, 0x9201, 0x5924, 0x2492, 0x2409, 0x9249, 0x4924, +0x2892, 0x9249, 0x4904, 0x6492, 0x9249, 0x4A24, 0x2492, 0x9241, 0x5924, +0x2492, 0x2489, 0x9249, 0x4924, 0x2092, 0x9249, 0x4904, 0x2492, 0x9249, +0x4824, 0x0490, 0x9241, 0x4924, 0x2492, 0x2409, 0x9249, 0x4924, 0x2092, +0x9209, 0x4904, 0x2492, 0x9249, 0x4824, 0x2490, 0x9241, 0x4924, 0x2492, +0x2409, 0x9249, 0x4924, 0x2892, 0x9249, 0x4904, 0x6492, 0x9249, 0x4A24, +0x2492, 0x9241, 0x5924, 0x2492, 0x0009, 0x0000, 0x0001, 0x0400, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0001, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x2080, 0x0000, 0x4001, 0x0400, 0x0000, 0x0008, +0x0002, 0x0040, 0x0040, 0x0010, 0x0208, 0x0000, 0x0000, 0x2080, 0x0000, +0x4001, 0x0400, 0x0000, 0x0008, 0x0002, 0x0040, 0x0040, 0x0010, 0x0208, +0x0000, 0x0000, 0x2080, 0x0000, 0x4001, 0x0400, 0x0000, 0x0008, 0x0002, +0x0040, 0x0040, 0x0010, 0x0208, 0x0000, 0x0000, 0x2080, 0x0000, 0x4001, +0x0400, 0x0000, 0x0008, 0x0002, 0x0040, 0x0040, 0x0010, 0x0208, 0x0000, +0xFF00, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFD, 0xF3FF, 0xFFFF, +0xFFCF, 0x3FFF, 0xFFFF, 0xFCFF, 0xFFFF, 0xFFF3, 0xCFFF, 0xFFFF, 0xFF3F, +0xFFFF, 0xFFFD, 0xF3FF, 0xFFFF, 0xFFCF, 0x3FFF, 0xFFFF, 0xFCFF, 0xFFFF, +0xFFF3, 0xCFFF, 0xFFFF, 0xFF3F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFEF, +0xBFFF, 0xFFFF, 0xFEFF, 0xFFFF, 0xFFFB, 0xCFFF, 0xFFFF, 0x0C7F, 0xFFD6, +0x0038, 0x0000, 0xFF01, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +}; + +const uint32_t MSP_FetFpgaHalImage_address[] = +{ +0x00001900, 0x00018E00, +}; +const uint32_t MSP_FetFpgaHalImage_length_of_sections[] = +{ +0x00000040, 0x00016900, +}; +const uint32_t MSP_FetFpgaHalImage_sections = 0x00000002; +const uint32_t MSP_FetFpgaHalImage_termination = 0x00000000; +const uint32_t MSP_FetFpgaHalImage_start = 0x00001900; +const uint32_t MSP_FetFpgaHalImage_finish = 0x00046000; +const uint32_t MSP_FetFpgaHalImage_length = 0x00044700; + +#define MSP_FETFPGAHALIMAGE_TERMINATION 0x00000000 +#define MSP_FETFPGAHALIMAGE_START 0x00001900 +#define MSP_FETFPGAHALIMAGE_FINISH 0x00046000 +#define MSP_FETFPGAHALIMAGE_LENGTH 0x00044700 +#define MSP_FETFPGAHALIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/MSP_FetHal.h b/Bios/include/MSP_FetHal.h new file mode 100644 index 0000000..b310f71 --- /dev/null +++ b/Bios/include/MSP_FetHal.h @@ -0,0 +1,5493 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetHalImage[] = +{ +0x8E00, 0x0001, 0x383E, 0x0002, 0x8C00, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF70B, 0xBEEF, +0xBEEF, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, 0x1840, 0x1207, +0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, 0x120B, 0x1840, +0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, 0x008C, 0x2706, +0x403E, 0x061B, 0x403F, 0x0000, 0x13B2, 0x9890, 0x008C, 0x2400, 0x028D, +0x9AB6, 0x403E, 0x0306, 0x403F, 0x0000, 0x13B2, 0x998E, 0x1840, 0x413F, +0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, 0x413B, 0x1840, +0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, 0x1840, 0x4136, +0x1840, 0x4135, 0x1840, 0x4134, 0x1900, 0x4070, 0x383E, 0x147B, 0x120C, +0x8031, 0x0048, 0x4381, 0x0006, 0x4381, 0x000E, 0x4381, 0x000C, 0x40B1, +0x0BB8, 0x0004, 0xB31C, 0x2C02, 0x0180, 0x9A1C, 0x410C, 0x503C, 0x000E, +0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFE, +0x0180, 0xA4F6, 0x008C, 0x27C2, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2404, 0x403C, 0xFFFD, 0x0180, 0xA4F6, 0x008C, 0x27C8, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFC, 0x0180, +0xA4F6, 0x008C, 0x27BE, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFB, 0x0180, 0xA4F6, 0x008C, 0x27B8, 0x002F, 0x2C4E, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFA, 0x0180, 0xA4F6, +0x008C, 0x27C6, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFF9, 0x0180, 0xA4F6, 0x008C, 0x27C4, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2412, 0x008C, 0x27CC, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2409, 0x008C, 0x27CA, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFF8, 0x0180, 0xA4F6, 0x0086, +0x2BFA, 0x06CA, 0x00AA, 0x0008, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x06CB, +0x00AB, 0x0014, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x4079, 0x0082, 0x494C, +0x0A0F, 0x134F, 0x06C8, 0x00A8, 0x0030, 0x435C, 0x080F, 0x134F, 0x403C, +0x0560, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4035, 0x00FC, 0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x06C4, 0x00A4, 0x0010, 0x407C, 0x0024, 0x040F, +0x134F, 0x435C, 0x080F, 0x134F, 0x0087, 0x27CE, 0x412E, 0x411F, 0x0002, +0x4E87, 0x0000, 0x4F87, 0x0002, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x403C, +0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x403C, 0x0660, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, +0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, +0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x411E, 0x0002, 0x412F, 0x4E87, 0x0004, 0x4F87, 0x0006, 0x407C, 0x0088, +0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x0960, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, +0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, +0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x4E87, 0x0008, 0x4F87, +0x000A, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0860, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, +0x0000, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, +0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0002, 0x412F, +0x4E87, 0x000C, 0x4F87, 0x000E, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x403C, +0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x403C, 0x0A60, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, +0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x412E, 0x411F, 0x0002, 0x4E87, 0x0010, 0x4F87, 0x0012, 0x407C, 0x0088, +0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x0B60, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, +0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, +0x435C, 0x080F, 0x134F, 0x411E, 0x0002, 0x412F, 0x4E87, 0x0014, 0x4F87, +0x0016, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0C60, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C05, +0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, +0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x450F, 0x4E87, 0x0018, +0x4F87, 0x001A, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x4077, 0x00C8, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x00A6, 0x0018, 0x403C, 0x0128, 0x430D, +0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x4075, 0x0021, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412F, +0x1840, 0x4F82, 0x27EA, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x430D, 0x060F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27EC, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x27EE, 0x1840, 0xE0B2, 0x3300, 0x27EA, 0x1840, 0xE0B2, 0x3300, +0x27EC, 0x1840, 0xE0B2, 0x3300, 0x27EE, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x430D, 0x060F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x403C, 0xA544, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, +0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, +0x4291, 0x27C4, 0x0000, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x412C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x416E, 0x1840, 0x9EC2, 0x27C4, +0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, 0x27C4, 0x4F81, 0x0000, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, +0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, +0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x410C, 0x503C, 0x0018, 0x403E, 0x000E, 0x13B2, 0x98D4, 0x1840, +0x4291, 0x27BE, 0x0018, 0x1840, 0x4291, 0x27C0, 0x001A, 0x1840, 0x4291, +0x27B8, 0x001C, 0x1840, 0x4291, 0x27BA, 0x001E, 0x1840, 0x421E, 0x27C6, +0x4E81, 0x0020, 0x4381, 0x0022, 0x1840, 0x421E, 0x27C4, 0x4E81, 0x0024, +0x4381, 0x0026, 0x1840, 0x421E, 0x27CC, 0x4E81, 0x002C, 0x4381, 0x002E, +0x1840, 0x421E, 0x27CA, 0x4E81, 0x0030, 0x4381, 0x0032, 0x410C, 0x503C, +0x0018, 0x13B2, 0x0162, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, +0x040F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x490C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, +0x080F, 0x134F, 0x1840, 0x421E, 0x27C8, 0x4E81, 0x0008, 0x4381, 0x000A, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, 0xEF4E, +0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0080, 0x4E0C, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, +0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x0401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x00A8, 0x0A0F, +0x134F, 0x431C, 0x1380, 0x2BAE, 0x454C, 0x0A0F, 0x134F, 0x430C, 0x430D, +0x060F, 0x134F, 0x411F, 0x0004, 0x533F, 0x4F81, 0x0004, 0x403E, 0x0022, +0x1840, 0x521E, 0x27C8, 0x430F, 0x930D, 0x2002, 0x9E0C, 0x280A, 0x403E, +0x002C, 0x1840, 0x521E, 0x27C8, 0x9D0F, 0x2803, 0x2005, 0x9C0E, 0x2C03, +0x9381, 0x0004, 0x23DA, 0x1840, 0x421F, 0x27B8, 0x1840, 0xD21F, 0x27BA, +0x930F, 0x2002, 0x0180, 0x9E5A, 0x9381, 0x0006, 0x2402, 0x0180, 0x9E5A, +0x9381, 0x0004, 0x2002, 0x0180, 0x9E5A, 0x4037, 0x006C, 0x1840, 0x5217, +0x27C8, 0x1840, 0x421E, 0x27B8, 0x1840, 0x421F, 0x27BA, 0x5E0E, 0x6F0F, +0x1840, 0x421A, 0x27C2, 0x2002, 0x9A0E, 0x2802, 0x1840, 0x4A0E, 0x470F, +0x5E0F, 0x4F81, 0x0000, 0x403E, 0x0068, 0x1840, 0x521E, 0x27C8, 0x4E81, +0x0008, 0x4381, 0x000A, 0x0086, 0x2BFA, 0x06CA, 0x00AA, 0x0008, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x06C4, 0x00A4, 0x0010, 0x407C, 0x0034, 0x040F, +0x134F, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x06CB, 0x00AB, 0x0014, +0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, +0x0F00, 0xD03E, 0x0080, 0x4E0C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0030, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4075, 0x0021, +0x454C, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, +0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C8, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, +0x423C, 0x0B0F, 0x134F, 0x3C22, 0x410C, 0x503C, 0x000C, 0x002F, 0x2C4E, +0x0F3F, 0x002C, 0x134F, 0x4C81, 0x0006, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x470C, 0x430D, 0x063F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x411C, 0x000C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x5327, 0x9127, 0x2C03, 0x9381, 0x0006, 0x27D9, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C8, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x8217, 0x27C8, +0x5037, 0xFF94, 0x0357, 0x4781, 0x0008, 0x4381, 0x000A, 0x407C, 0x0088, +0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0086, 0x4E0C, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x403C, 0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x1840, 0x4291, 0x27BE, 0x0008, 0x1840, 0x4291, 0x27C0, 0x000A, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0008, 0x411F, 0x000A, +0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0085, 0x4E0C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x411C, 0x0008, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, +0x435C, 0x080F, 0x134F, 0x470E, 0x5E0E, 0x1840, 0x5E82, 0x27BE, 0x1840, +0x6382, 0x27C0, 0x1840, 0x8782, 0x27B8, 0x1840, 0x7382, 0x27BA, 0x403E, +0x002E, 0x1840, 0x521E, 0x27C8, 0x4E81, 0x0008, 0x4381, 0x000A, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, 0xEF4E, 0xEF0E, +0xF03E, 0x0F00, 0xD03E, 0x0080, 0x4E0C, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, +0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A8, 0x0A0F, 0x134F, 0x40B1, +0x0BB8, 0x0004, 0x431C, 0x1380, 0x2BAE, 0x454C, 0x0A0F, 0x134F, 0x430C, +0x430D, 0x063F, 0x0018, 0x134F, 0x411F, 0x0004, 0x533F, 0x4F81, 0x0004, +0x403E, 0x0068, 0x1840, 0x521E, 0x27C8, 0x9E0C, 0x2004, 0x930D, 0x2002, +0x0180, 0x9A1C, 0x930F, 0x23E3, 0x0180, 0x9A1C, 0x0027, 0x2C4E, 0xB3A1, +0x0048, 0x29A1, 0x410C, 0x503C, 0x0010, 0x028E, 0x9A0A, 0x427D, 0x13B2, +0x98A8, 0x410B, 0x503B, 0x0034, 0x140B, 0x430F, 0x434E, 0x423D, 0x410C, +0x503C, 0x0014, 0x0737, 0x001C, 0x1347, 0x403C, 0x0003, 0x002F, 0x29B6, +0x134F, 0x0BCC, 0x002F, 0x2C4E, 0x0F3F, 0x0020, 0x134F, 0x008C, 0x27CE, +0x13B2, 0x0162, 0x1840, 0x4215, 0x27EA, 0x0086, 0x2BFA, 0x06CA, 0x00AA, +0x0008, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x06CB, 0x00AB, 0x0014, +0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0030, 0x434C, 0x080F, +0x134F, 0x4077, 0x00C8, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, +0x0A0F, 0x134F, 0x06C4, 0x00A4, 0x0010, 0x427C, 0x040F, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x00A6, 0x0018, 0x403C, 0x0128, 0x430D, 0x060F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2401, 0x0B0F, 0x134F, 0x4075, 0x0021, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x1840, 0x4291, 0x27EC, 0x0004, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x430D, 0x060F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x1840, 0x4291, 0x27EE, 0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x411C, 0x0004, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0004, +0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x415E, 0x0004, +0x5221, 0x1840, 0x9EC2, 0x27EE, 0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, +0x27EE, 0x4F81, 0x0000, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x412C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x421C, 0x27BC, 0x002F, +0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x3DA6, 0x9391, 0x0006, 0x2008, 0x407C, +0x0091, 0x073F, 0x0024, 0x134F, 0x4381, 0x0006, 0x3D9B, 0x410C, 0x503C, +0x0010, 0x028E, 0x9A12, 0x427D, 0x13B2, 0x98A8, 0x410B, 0x503B, 0x0034, +0x140B, 0x430F, 0x434E, 0x423D, 0x410C, 0x503C, 0x0014, 0x0737, 0x001C, +0x1347, 0x403C, 0x0003, 0x002F, 0x29B6, 0x134F, 0x0BCC, 0x002F, 0x2C4E, +0x0F3F, 0x0020, 0x134F, 0x008C, 0x27CE, 0x13B2, 0x0162, 0x1840, 0x4215, +0x27EA, 0x0086, 0x2BFA, 0x06CA, 0x00AA, 0x0008, 0x4079, 0x0082, 0x494C, +0x0A0F, 0x134F, 0x06CB, 0x00AB, 0x0014, 0x403C, 0x3FFF, 0x0B0F, 0x134F, +0x06C8, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x4077, 0x00C8, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x06C4, 0x00A4, +0x0010, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x00A6, +0x0018, 0x403C, 0x0128, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x450C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x4075, +0x0021, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x4291, +0x27EC, 0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, +0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x403C, 0x012A, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x411C, 0x0004, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x4291, 0x27EE, 0x0004, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, +0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0004, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0004, 0x434C, 0x080F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x415E, 0x0004, 0x5221, 0x1840, 0x9EC2, 0x27EE, +0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, 0x27EE, 0x4F81, 0x0000, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, +0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, +0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x40B1, 0xFFF6, 0x0006, 0x411C, 0x0006, 0x5031, 0x004A, 0x1674, +0x0110, 0x147B, 0x120C, 0x8031, 0x0034, 0x4381, 0x0004, 0x4381, 0x0008, +0x4381, 0x0006, 0x40B1, 0x0BB8, 0x0002, 0xB31C, 0x2C02, 0x0180, 0xAF42, +0x410C, 0x523C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFFE, 0x0180, 0xB910, 0x008C, 0x2710, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFD, 0x0180, 0xB910, 0x008C, +0x2716, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, +0xFFFC, 0x0180, 0xB910, 0x008C, 0x270C, 0x002F, 0x2C4E, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x2404, 0x403C, 0xFFFB, 0x0180, 0xB910, 0x008C, 0x2706, +0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFA, +0x0180, 0xB910, 0x008C, 0x2714, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2404, 0x403C, 0xFFF9, 0x0180, 0xB910, 0x008C, 0x2712, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2412, 0x008C, 0x271A, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2409, 0x008C, 0x2718, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFF8, 0x0180, +0xB910, 0x0087, 0x2BFA, 0x07CA, 0x00AA, 0x0008, 0x407B, 0x00C8, 0x4B4C, +0x0A0F, 0x134F, 0x07C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, 0x134F, +0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4582, 0x080F, 0x134F, +0x07C6, 0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x4075, 0x0042, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x4034, 0x2401, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x271C, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4682, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x271E, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x4982, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, +0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x2720, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x4882, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x2722, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4A82, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x2724, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x4B82, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, +0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x2726, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x4C82, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x2728, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x0128, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x272A, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x272C, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x272E, 0x1840, 0xE0B2, 0x3300, 0x272A, +0x1840, 0xE0B2, 0x3300, 0x272C, 0x1840, 0xE0B2, 0x3300, 0x272E, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, +0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x403C, 0xA544, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x1840, 0x4291, 0x2712, 0x0000, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x416E, 0x1840, +0x9EC2, 0x2712, 0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, 0x2712, 0x4F81, +0x0000, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x410C, 0x503C, 0x0012, 0x403E, 0x0007, 0x13B2, +0x98D4, 0x1840, 0x4291, 0x270C, 0x0012, 0x1840, 0x4291, 0x2706, 0x0014, +0x1840, 0x4291, 0x2714, 0x0016, 0x1840, 0x4291, 0x2712, 0x0018, 0x1840, +0x4291, 0x271A, 0x001C, 0x1840, 0x4291, 0x2718, 0x001E, 0x410C, 0x503C, +0x0012, 0x13B2, 0x17DA, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4032, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x1840, 0x421F, 0x28B8, +0x1840, 0xD21F, 0x28BA, 0x930F, 0x240F, 0x1840, 0x9382, 0x28BC, 0x240B, +0x407C, 0x0090, 0x0A0F, 0x134F, 0x403C, 0x0088, 0x080F, 0x134F, 0x431C, +0x080F, 0x134F, 0x1840, 0x4217, 0x2716, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x470C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x0401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x407C, 0x00A8, 0x0A0F, 0x134F, 0x431C, 0x1380, 0x2BAE, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x411F, 0x0002, 0x533F, +0x4F81, 0x0002, 0x403F, 0x0020, 0x1840, 0x521F, 0x2716, 0x9F0C, 0x2807, +0x403F, 0x0026, 0x1840, 0x521F, 0x2716, 0x9C0F, 0x2C03, 0x9381, 0x0002, +0x23E0, 0x1840, 0x421F, 0x2706, 0x1840, 0xD21F, 0x2708, 0x930F, 0x25A7, +0x9381, 0x0004, 0x21A4, 0x9381, 0x0002, 0x25A1, 0x4035, 0x0060, 0x1840, +0x5215, 0x2716, 0x1840, 0x421E, 0x2706, 0x1840, 0x421F, 0x2708, 0x5E0E, +0x6F0F, 0x1840, 0x421A, 0x2710, 0x2002, 0x9A0E, 0x2802, 0x1840, 0x4A0E, +0x450F, 0x5E0F, 0x4F81, 0x0000, 0x4034, 0x005C, 0x1840, 0x5214, 0x2716, +0x0086, 0x2BFA, 0x06CA, 0x00AA, 0x0008, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, +0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, 0x134F, 0x4079, +0x0082, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x00A6, +0x0030, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x440C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x4034, +0x2401, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2408, 0x080F, +0x134F, 0x3C20, 0x410C, 0x503C, 0x0006, 0x002F, 0x2C4E, 0x0F3F, 0x002C, +0x134F, 0x4C81, 0x0004, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0006, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x5325, 0x9125, 0x2C03, +0x9381, 0x0004, 0x27DB, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x1840, 0x8215, 0x2716, 0x5035, 0xFFA0, 0x0355, 0x4507, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x4036, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4075, 0x0042, +0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x470C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x1840, 0x4291, 0x270C, 0x0000, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x4035, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x412C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x470E, 0x5E0E, 0x1840, 0x5E82, 0x270C, 0x1840, 0x6382, +0x270E, 0x1840, 0x8782, 0x2706, 0x1840, 0x7382, 0x2708, 0x4037, 0x0028, +0x1840, 0x5217, 0x2716, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x470C, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x407C, 0x00A8, 0x0A0F, 0x134F, 0x40B1, 0x0BB8, +0x0002, 0x431C, 0x1380, 0x2BAE, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x430C, +0x080F, 0x134F, 0x411F, 0x0002, 0x533F, 0x4F81, 0x0002, 0x403F, 0x005C, +0x1840, 0x521F, 0x2716, 0x9F0C, 0x2655, 0x9381, 0x0002, 0x23E7, 0x3E51, +0x0027, 0x2C4E, 0xB3A1, 0x0034, 0x2996, 0x410C, 0x503C, 0x000A, 0x028E, +0x99F2, 0x427D, 0x13B2, 0x98A8, 0x410B, 0x503B, 0x0020, 0x140B, 0x430F, +0x434E, 0x423D, 0x410C, 0x503C, 0x000E, 0x0737, 0x001C, 0x1347, 0x403C, +0x0003, 0x002F, 0x2938, 0x134F, 0x0BCC, 0x002F, 0x2C4E, 0x0F3F, 0x0020, +0x134F, 0x008C, 0x271C, 0x13B2, 0x17DA, 0x1840, 0x4214, 0x272A, 0x0087, +0x2BFA, 0x07CA, 0x00AA, 0x0008, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, +0x07C8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x07C6, 0x00A6, +0x0030, 0x434C, 0x060F, 0x134F, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x0128, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x4034, 0x2401, 0x440C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x1840, 0x4215, 0x272C, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x0085, 0x272E, 0x1840, 0x45A1, +0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, +0x0004, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0004, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x415E, 0x0004, 0x5221, 0x9EC5, 0x0000, 0x2445, +0x403F, 0x0040, 0xD52F, 0x4F05, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x1840, 0x421C, 0x270A, +0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x3D9B, 0x9391, 0x0004, 0x2008, +0x407C, 0x0091, 0x073F, 0x0024, 0x134F, 0x4381, 0x0004, 0x3D90, 0x410C, +0x503C, 0x000A, 0x028E, 0x99FA, 0x427D, 0x13B2, 0x98A8, 0x410B, 0x503B, +0x0020, 0x140B, 0x430F, 0x434E, 0x423D, 0x410C, 0x503C, 0x000E, 0x0737, +0x001C, 0x1347, 0x403C, 0x0003, 0x002F, 0x2938, 0x134F, 0x0BCC, 0x002F, +0x2C4E, 0x0F3F, 0x0020, 0x134F, 0x008C, 0x271C, 0x13B2, 0x17DA, 0x1840, +0x4214, 0x272A, 0x0087, 0x2BFA, 0x07CA, 0x00AA, 0x0008, 0x4079, 0x0082, +0x494C, 0x0A0F, 0x134F, 0x07C8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x07C6, 0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x407B, 0x00C8, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, +0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x0128, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x4034, 0x2401, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x1840, 0x4215, 0x272C, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x0085, +0x272E, 0x1840, 0x45A1, 0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x411C, 0x0004, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0004, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x415E, 0x0004, 0x5221, +0x9EC5, 0x0000, 0x2445, 0x403F, 0x0040, 0xD52F, 0x4F05, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, +0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x40B1, 0xFFF6, 0x0004, 0x411C, 0x0004, 0x5031, 0x0036, 0x1674, 0x0110, +0x147B, 0x120C, 0x8031, 0x0034, 0x4381, 0x0004, 0x4381, 0x0008, 0x4381, +0x0006, 0x40B1, 0x0BB8, 0x0002, 0x4304, 0xB31C, 0x2C02, 0x0180, 0xC640, +0x008B, 0x2C4E, 0x410C, 0x523C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFE, 0x0180, 0xCA42, 0x008C, 0x2798, 0x0B0F, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFD, 0x0180, 0xCA42, 0x008C, +0x279E, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFC, +0x0180, 0xCA42, 0x008C, 0x2794, 0x0B0F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFB, 0x0180, 0xCA42, 0x008C, 0x2790, 0x0B0F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFA, 0x0180, 0xCA42, 0x008C, +0x279C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFF9, +0x0180, 0xCA42, 0x008C, 0x279A, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, +0x2410, 0x008C, 0x27A2, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2408, +0x008C, 0x27A0, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2004, 0x403C, +0xFFF8, 0x0180, 0xCA42, 0x0087, 0x2BFA, 0x07CA, 0x00AA, 0x0008, 0x407B, +0x0082, 0x4B4C, 0x0A0F, 0x134F, 0x07C8, 0x00A8, 0x0014, 0x403C, 0x4030, +0x080F, 0x134F, 0x07C9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x403C, 0x0C04, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x3C4B, 0x440F, 0x5F0F, 0x1840, 0x521F, 0x279E, +0x4F81, 0x0000, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x440E, 0x0EEE, 0x1840, 0x4F8E, 0x2730, 0x5314, 0x4035, 0x2401, +0x4076, 0x00C8, 0x9034, 0x0030, 0x3BAE, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4582, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x4074, 0x0042, 0x444C, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27A4, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x4682, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27A6, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4982, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27A8, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x4882, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27AA, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x4A82, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27AC, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4B82, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27AE, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x4C82, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27B0, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x0128, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27B2, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27B4, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27B6, 0x1840, 0xE0B2, 0x3300, 0x27B2, 0x1840, 0xE0B2, 0x3300, 0x27B4, +0x1840, 0xE0B2, 0x3300, 0x27B6, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x403C, 0xA544, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1840, 0x4291, +0x279A, 0x0000, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, +0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x412C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x416E, 0x1840, 0x9EC2, 0x279A, 0x2448, 0x403F, +0x0040, 0x1840, 0xD21F, 0x279A, 0x4F81, 0x0000, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x410C, +0x503C, 0x000A, 0x403E, 0x0007, 0x13B2, 0x98D4, 0x1840, 0x4291, 0x2794, +0x000A, 0x1840, 0x4291, 0x2790, 0x000C, 0x1840, 0x4291, 0x279C, 0x000E, +0x1840, 0x4291, 0x279A, 0x0010, 0x1840, 0x4291, 0x27A2, 0x0014, 0x1840, +0x4291, 0x27A0, 0x0016, 0x410C, 0x503C, 0x000A, 0x13B2, 0x1BCA, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x4032, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x430C, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x1840, 0x421F, 0x28B8, 0x1840, 0xD21F, 0x28BA, 0x930F, +0x240F, 0x1840, 0x9382, 0x28BC, 0x240B, 0x407C, 0x0090, 0x0A0F, 0x134F, +0x403C, 0x0088, 0x080F, 0x134F, 0x431C, 0x080F, 0x134F, 0x1840, 0x4217, +0x279E, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x470C, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00A8, 0x0A0F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x431C, 0x1380, 0x2BAE, 0x430C, 0x080F, 0x134F, 0x411F, 0x0002, +0x533F, 0x4F81, 0x0002, 0x403F, 0x0020, 0x1840, 0x521F, 0x279E, 0x9F0C, +0x2807, 0x403F, 0x0026, 0x1840, 0x521F, 0x279E, 0x9C0F, 0x2C03, 0x9381, +0x0002, 0x23E4, 0x1840, 0x421C, 0x279E, 0x13B2, 0x59CA, 0x3D22, 0x410C, +0x503C, 0x0006, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x4C81, 0x0004, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x411C, 0x0006, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x5324, 0x9504, 0x2C03, 0x9381, 0x0004, 0x27DB, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, +0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1840, +0x8214, 0x279E, 0x5034, 0xFFA0, 0x0354, 0x4407, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4036, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x4074, 0x0042, 0x444C, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x470C, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x1840, 0x4215, 0x2794, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4035, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x470E, 0x5E0E, 0x1840, 0x5E82, 0x2794, 0x1840, 0x6382, 0x2796, +0x1840, 0x8782, 0x2790, 0x1840, 0x7382, 0x2792, 0x4037, 0x0028, 0x1840, +0x5217, 0x279E, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x470C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x00A8, 0x0A0F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x40B1, 0x0BB8, 0x0002, 0x431C, 0x1380, 0x2BAE, 0x430C, +0x080F, 0x134F, 0x411F, 0x0002, 0x533F, 0x4F81, 0x0002, 0x403F, 0x005C, +0x1840, 0x521F, 0x279E, 0x9F0C, 0x2403, 0x9381, 0x0002, 0x23EB, 0x1840, +0x421C, 0x279E, 0x13B2, 0x59CA, 0x9381, 0x0002, 0x2003, 0x40B1, 0xFFF7, +0x0004, 0x1840, 0x421F, 0x2790, 0x1840, 0xD21F, 0x2792, 0x930F, 0x244A, +0x9381, 0x0004, 0x2047, 0x9381, 0x0002, 0x2444, 0x4034, 0x0060, 0x1840, +0x5214, 0x279E, 0x1840, 0x421E, 0x2790, 0x1840, 0x421F, 0x2792, 0x5E0E, +0x6F0F, 0x1840, 0x421A, 0x2798, 0x2002, 0x9A0E, 0x2802, 0x1840, 0x4A0E, +0x4405, 0x5E05, 0x0089, 0x2BFA, 0x09CA, 0x00AA, 0x0008, 0x407B, 0x0082, +0x4B4C, 0x0A0F, 0x134F, 0x09C8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x4076, 0x00C8, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2408, 0x080F, +0x134F, 0x3EAC, 0xB3A1, 0x0034, 0x2C03, 0x9391, 0x0004, 0x258D, 0x410C, +0x503C, 0x0018, 0x028E, 0x9A02, 0x427D, 0x13B2, 0x98A8, 0x410B, 0x503B, +0x0020, 0x140B, 0x430F, 0x434E, 0x423D, 0x410C, 0x503C, 0x001C, 0x0027, +0x2C4E, 0x0737, 0x001C, 0x1347, 0x403C, 0x0003, 0x002F, 0x2938, 0x134F, +0x0BCC, 0x002F, 0x2C4E, 0x0F3F, 0x0020, 0x134F, 0x008C, 0x27A4, 0x13B2, +0x1BCA, 0x1840, 0x4214, 0x27B2, 0x0087, 0x2BFA, 0x07CA, 0x00AA, 0x0008, +0x407B, 0x0082, 0x4B4C, 0x0A0F, 0x134F, 0x07C8, 0x00A8, 0x0014, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x07C9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, +0x4076, 0x00C8, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x00A7, 0x0010, 0x427C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x0128, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x4035, 0x2401, 0x450C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1840, 0x4214, 0x27B4, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, +0x427C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x0084, 0x27B6, 0x1840, 0x44A1, 0x0004, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x070F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0004, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x415E, 0x0004, +0x5221, 0x9EC4, 0x0000, 0x2444, 0x403F, 0x0040, 0xD42F, 0x4F04, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, +0x070F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0xB3A1, 0x0034, 0x2807, 0x430C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, +0x3C10, 0x9391, 0x0004, 0x200A, 0x407C, 0x0091, 0x002F, 0x2C4E, 0x0F3F, +0x0024, 0x134F, 0x4381, 0x0004, 0x3C03, 0x40B1, 0xFFF6, 0x0004, 0x411C, +0x0004, 0x5031, 0x0036, 0x1674, 0x0110, 0x147B, 0x8031, 0x002E, 0x4381, +0x0016, 0x4381, 0x0018, 0x4381, 0x0004, 0x4381, 0x0000, 0x4381, 0x001A, +0x4381, 0x001C, 0x410D, 0x503D, 0x0006, 0x403C, 0xAA01, 0x002F, 0x2C4E, +0x0F3F, 0x0058, 0x134F, 0x930C, 0x2403, 0x013F, 0x0006, 0x3C01, 0x434F, +0x03DF, 0x2402, 0x438F, 0x0000, 0x0085, 0x2BFA, 0x05CA, 0x00AA, 0x0014, +0x05CB, 0x00AB, 0x0008, 0x0088, 0x28A0, 0x9388, 0x0010, 0x2412, 0x407C, +0x00F4, 0x0B0F, 0x134F, 0x481C, 0x0012, 0x0A0F, 0x134F, 0xC81C, 0x0010, +0xD81C, 0x0016, 0x0A0F, 0x134F, 0x403C, 0x0014, 0x1380, 0x2BAE, 0x482F, +0xD81F, 0x0002, 0x930F, 0x2416, 0x407C, 0x0054, 0x0B0F, 0x134F, 0x481C, +0x0004, 0x481D, 0x0006, 0x053F, 0x001C, 0x134F, 0x481C, 0x000C, 0x481D, +0x000E, 0x053F, 0x001C, 0x134F, 0x403C, 0x0014, 0x1380, 0x2BAE, 0x407C, +0x00D0, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4074, 0x0028, 0x934C, +0x38CB, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0xB03C, 0x0020, +0x2CC2, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x05C8, 0x00A8, 0x001C, 0x431C, +0x430D, 0x080F, 0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x4C81, 0x0006, +0x4D81, 0x0008, 0x403C, 0x0003, 0x430D, 0x080F, 0x134F, 0x430C, 0x430D, +0x080F, 0x134F, 0x4C81, 0x002A, 0x4D81, 0x002C, 0x403C, 0x0005, 0x430D, +0x080F, 0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x4C81, 0x0026, 0x4D81, +0x0028, 0x403C, 0x0007, 0x430D, 0x080F, 0x134F, 0x430C, 0x430D, 0x080F, +0x134F, 0x4C81, 0x0022, 0x4D81, 0x0024, 0x403C, 0x0081, 0x430D, 0x080F, +0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x4C81, 0x001E, 0x4D81, 0x0020, +0x432C, 0x430D, 0x080F, 0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x422C, +0x430D, 0x080F, 0x134F, 0x433C, 0x403D, 0x000F, 0x080F, 0x134F, 0x403C, +0x0006, 0x430D, 0x080F, 0x134F, 0x431C, 0x430D, 0x080F, 0x134F, 0x403C, +0x0080, 0x430D, 0x080F, 0x134F, 0x431C, 0x430D, 0x080F, 0x134F, 0x403C, +0x0088, 0x430D, 0x080F, 0x134F, 0x403C, 0x000E, 0x430D, 0x080F, 0x134F, +0x407C, 0x0030, 0x0B0F, 0x134F, 0x403C, 0x0007, 0x0A0F, 0x134F, 0x4309, +0x407C, 0x00D0, 0x0B0F, 0x134F, 0x5319, 0x430C, 0x0A0F, 0x134F, 0x934C, +0x3803, 0x9039, 0x0BB8, 0x3BF3, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x430C, +0x430D, 0x080F, 0x134F, 0x411C, 0x0006, 0x411D, 0x0008, 0x080F, 0x134F, +0x432C, 0x430D, 0x080F, 0x134F, 0x411C, 0x002A, 0x411D, 0x002C, 0x080F, +0x134F, 0x422C, 0x430D, 0x080F, 0x134F, 0x411C, 0x0026, 0x411D, 0x0028, +0x080F, 0x134F, 0x403C, 0x0006, 0x430D, 0x080F, 0x134F, 0x411C, 0x0022, +0x411D, 0x0024, 0x080F, 0x134F, 0x403C, 0x0080, 0x430D, 0x080F, 0x134F, +0x411C, 0x001E, 0x411D, 0x0020, 0x080F, 0x134F, 0x407C, 0x0030, 0x0B0F, +0x134F, 0x403C, 0x0005, 0x0A0F, 0x134F, 0x4038, 0x0032, 0x4079, 0x00C8, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x1501, 0x0A0F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x430C, 0x0A0F, 0x134F, 0x5338, 0x933C, 0x2403, 0xB03C, 0x0200, +0x2C02, 0x9308, 0x23F5, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x403C, 0x0007, +0x0A0F, 0x134F, 0x403C, 0x0006, 0x0A0F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x1501, 0x0A0F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0x05C8, 0x00A8, 0x0030, 0xB23C, 0x2C0D, 0x3C1F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0xB23C, 0x2811, 0x411C, 0x001A, 0x411D, 0x001C, 0x4C0E, 0x4D0F, +0x531E, 0x630F, 0x4E81, 0x001A, 0x4F81, 0x001C, 0x930D, 0x2003, 0x903C, +0x7530, 0x2BE1, 0x444C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x430C, +0x0A0F, 0x134F, 0xB03C, 0x0100, 0x7646, 0x5356, 0x435C, 0x080F, 0x134F, +0x411E, 0x0016, 0x411F, 0x0018, 0x531E, 0x630F, 0x4E81, 0x0016, 0x4F81, +0x0018, 0x9346, 0x2005, 0x930F, 0x2003, 0x903E, 0x2710, 0x2BE2, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x00A5, 0x0018, +0x430C, 0x430D, 0x050F, 0x134F, 0x4C06, 0x4D07, 0x444C, 0x0B0F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x4C0F, 0xF22F, 0x4F81, 0x000A, 0xB03C, 0x0020, +0x2804, 0x5036, 0xFFFE, 0x6337, 0x3C03, 0x5036, 0xFFFC, 0x6337, 0x9036, +0xFFFE, 0x2028, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, +0x403C, 0xFFFE, 0x430D, 0x050F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x4C07, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4781, 0x000E, 0x4381, 0x0010, 0x3C04, 0x4681, 0x000E, 0x4781, +0x0010, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x403C, 0x000E, 0x0A0F, 0x134F, +0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x410C, 0x522C, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x4116, 0x0004, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, +0x0B0F, 0x134F, 0x460C, 0x430D, 0x050F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0x4C07, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4781, 0x000C, 0x474F, 0xD12F, 0x4F81, 0x0000, 0x4F81, +0x0002, 0x4116, 0x0004, 0x434C, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x0500, 0x0A0F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x460C, +0x430D, 0x050F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0B0F, +0x134F, 0x411C, 0x0002, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, +0x4C4C, 0x903C, 0x0098, 0x2403, 0x4036, 0x018C, 0x3C02, 0x4036, 0x014C, +0x434C, 0x080F, 0x134F, 0x4074, 0x0082, 0x444C, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x0260, 0x0A0F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x1401, 0x0A0F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x0087, 0x2B66, 0x9387, 0x0000, 0x2405, +0x403C, 0x0FF6, 0x0A0F, 0x134F, 0x3C03, 0x460C, 0x0A0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x0A0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x9387, 0x0000, 0x2407, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x0501, 0x0A0F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C06, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0002, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x9387, +0x0000, 0x2007, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4681, 0x0012, 0x434C, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x440C, 0x0A0F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x1401, 0x0A0F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x460C, 0xF03C, 0xFFE7, 0x0A0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x0A0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x050F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4191, +0x000A, 0x0014, 0x403D, 0x000A, 0x410C, 0x503C, 0x000C, 0x002F, 0x2C4E, +0x0F3F, 0x000C, 0x134F, 0x430C, 0x5031, 0x002E, 0x1674, 0x0110, 0x147B, +0x8031, 0x003C, 0x4C05, 0x4381, 0x0012, 0x4381, 0x0014, 0x4381, 0x0016, +0x4381, 0x0010, 0x4381, 0x000E, 0x4304, 0xB31C, 0x290A, 0x0088, 0x2C4E, +0x410C, 0x503C, 0x0012, 0x080F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFFE, 0x0180, 0xD7E6, 0x432C, 0x080F, 0x0F3F, 0x0038, 0x134F, +0x410C, 0x503C, 0x000C, 0x080F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFFC, 0x0180, 0xD7E6, 0x410C, 0x503C, 0x0014, 0x080F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFB, 0x0180, 0xD7E6, 0x0087, +0x27F0, 0x07CC, 0x080F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, 0x403C, +0xFFFA, 0x0180, 0xD7E6, 0x410C, 0x503C, 0x000E, 0x080F, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x2404, 0x403C, 0xFFF9, 0x0180, 0xD7E6, 0x410C, 0x503C, +0x0010, 0x080F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2407, 0x422C, 0x080F, +0x0F3F, 0x0038, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFF8, 0x0180, 0xD7E6, +0x4191, 0x0014, 0x0018, 0x4191, 0x0016, 0x001A, 0x1840, 0x47A1, 0x001C, +0x1840, 0x4791, 0x0002, 0x001E, 0x4191, 0x000E, 0x0020, 0x4381, 0x0022, +0x4191, 0x0010, 0x0024, 0x4381, 0x0026, 0x410C, 0x503C, 0x0018, 0x13B2, +0x26B2, 0x4118, 0x000C, 0x0086, 0x2BFA, 0x06CB, 0x00AB, 0x0008, 0x407C, +0x0028, 0x0B0F, 0x134F, 0x06CA, 0x00AA, 0x0014, 0x430C, 0x0A0F, 0x134F, +0x06C9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x0080, 0x0A0F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x0A0F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x480C, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x4303, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x063F, 0x0018, 0x134F, +0x435C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0401, +0x0A0F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x407C, 0x00A8, 0x0B0F, +0x134F, 0x430A, 0x430B, 0x403C, 0x0005, 0x1380, 0x2BAE, 0x531A, 0x630B, +0x13B2, 0x93B0, 0x903C, 0xBABE, 0x2003, 0x903D, 0xABAD, 0x2405, 0x930B, +0x2003, 0x903A, 0x012C, 0x2BED, 0x930B, 0x2003, 0x903A, 0x012C, 0x2802, +0x4034, 0xFFF7, 0xB397, 0x0000, 0x2810, 0x53B7, 0x0000, 0x63B7, 0x0002, +0x1840, 0x4392, 0x2806, 0x3C08, 0x008C, 0x2808, 0x134F, 0x4C04, 0x53B7, +0x0000, 0x63B7, 0x0002, 0x0087, 0x27F0, 0x472F, 0xD71F, 0x0002, 0x930F, +0x2417, 0x9304, 0x2015, 0x0088, 0x2C4E, 0x080F, 0x0F3F, 0x002C, 0xB397, +0x0000, 0x2BE7, 0x008C, 0x280A, 0x134F, 0x4C04, 0x1840, 0x421D, 0x280A, +0x1840, 0x421C, 0x2808, 0x13B2, 0x7E8C, 0x3FDE, 0x1840, 0x9382, 0x2806, +0x241F, 0x9304, 0x201D, 0x473F, 0xD73F, 0x930F, 0x2019, 0xB325, 0x2817, +0x008C, 0x2808, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x4C04, 0x403D, +0xAAAA, 0x1840, 0x421C, 0x2808, 0x13B2, 0x7E8C, 0x935C, 0x2003, 0x403C, +0xFFBF, 0x3DF7, 0x1840, 0x4382, 0x2806, 0xB325, 0x29BC, 0x430A, 0x430B, +0x403C, 0x000A, 0x1380, 0x2BAE, 0x531A, 0x630B, 0x13B2, 0x93B0, 0x903C, +0xBABE, 0x2003, 0x903D, 0xCAFE, 0x2405, 0x930B, 0x2003, 0x903A, 0x012C, +0x2BED, 0x4105, 0x5035, 0x0028, 0x0088, 0x2C4E, 0x930B, 0x2003, 0x903A, +0x012C, 0x2970, 0x4034, 0xFFBF, 0x410C, 0x522C, 0x028E, 0x9A1A, 0x427D, +0x13B2, 0x98A8, 0x1840, 0x42D1, 0x2470, 0x0004, 0x008F, 0x2470, 0x4FD1, +0x0001, 0x0005, 0x1405, 0x430F, 0x434E, 0x423D, 0x410C, 0x523C, 0x080B, +0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2A28, 0x134F, 0x05CC, +0x080F, 0x0F3F, 0x0020, 0x134F, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, +0x407C, 0x0028, 0x0B0F, 0x134F, 0x4C4C, 0x5221, 0x903C, 0x0098, 0x2403, +0x403F, 0x018C, 0x3C02, 0x403F, 0x014C, 0x4F81, 0x0000, 0x0AC9, 0x00A9, +0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x00AA, 0x0014, 0x403C, 0x0A60, 0x0A0F, 0x134F, 0x4076, +0x00C8, 0x464C, 0x0B0F, 0x134F, 0x403C, 0x1401, 0x0A0F, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x0087, 0x2B66, 0x9387, 0x0000, 0x2405, 0x403C, 0x0FF6, 0x0A0F, 0x134F, +0x3C03, 0x412C, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x403C, 0x3FFD, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x9387, +0x0000, 0x2407, 0x464C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x9387, 0x0000, 0x2007, 0x464C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412E, 0x411F, +0x0002, 0x1840, 0x4E82, 0x27F6, 0x1840, 0x4F82, 0x27F8, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x4C4C, 0x903C, 0x0098, 0x2403, 0x403F, 0x018C, 0x3C02, +0x403F, 0x014C, 0x4F81, 0x0000, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x0B60, 0x0A0F, 0x134F, +0x464C, 0x0B0F, 0x134F, 0x403C, 0x1401, 0x0A0F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x9387, +0x0000, 0x2405, 0x403C, 0x0FF6, 0x0A0F, 0x134F, 0x3C03, 0x412C, 0x0A0F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x3FFD, +0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x9387, 0x0000, 0x2407, 0x464C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x4C81, 0x0002, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x9387, 0x0000, 0x2007, 0x464C, 0x0B0F, 0x134F, 0x403C, +0x0501, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, +0x27FA, 0x1840, 0x4F82, 0x27FC, 0x4E0B, 0xDF0B, 0x930B, 0x240B, 0x1840, +0x90B2, 0xFFFE, 0x27F6, 0x2004, 0x1840, 0x9382, 0x27F8, 0x2402, 0x4034, +0xFFF6, 0x410C, 0x522C, 0x028E, 0x9A22, 0x427D, 0x13B2, 0x98A8, 0x1840, +0x42D1, 0x2470, 0x0004, 0x008F, 0x2470, 0x4FD1, 0x0001, 0x0005, 0x1405, +0x430F, 0x434E, 0x423D, 0x410C, 0x523C, 0x080B, 0x0B3B, 0x001C, 0x134B, +0x403C, 0x0003, 0x002F, 0x2A28, 0x134F, 0x05CC, 0x080F, 0x0F3F, 0x0020, +0x134F, 0x1840, 0x421C, 0x27F4, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x5221, +0x3C35, 0x0088, 0x2C4E, 0x080B, 0x9314, 0x2007, 0x407C, 0x0091, 0x0B3F, +0x0024, 0x134F, 0x4304, 0x3C29, 0x410C, 0x522C, 0x028E, 0x9A2A, 0x427D, +0x13B2, 0x98A8, 0x1840, 0x42D1, 0x2470, 0x0004, 0x008F, 0x2470, 0x4FD1, +0x0001, 0x0005, 0x4105, 0x5035, 0x0028, 0x1405, 0x430F, 0x434E, 0x423D, +0x410C, 0x523C, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2A28, +0x134F, 0x05CC, 0x080F, 0x0F3F, 0x0020, 0x134F, 0x4034, 0xFFF6, 0x5221, +0x440C, 0x5031, 0x003C, 0x1674, 0x0110, 0x147B, 0x8031, 0x0012, 0x4305, +0x4381, 0x0004, 0x434B, 0x410C, 0x532C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x2404, 0x403C, 0xFFDA, 0x0180, 0xDE28, 0x410C, 0x530C, +0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFD9, +0x0180, 0xDE28, 0x410D, 0x503D, 0x0006, 0x403C, 0xAA01, 0x002F, 0x2C4E, +0x0F3F, 0x0058, 0x134F, 0x930C, 0x2402, 0x013B, 0x0006, 0x03DB, 0x2402, +0x438B, 0x0000, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, 0x4077, 0x00C8, +0x474C, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, 0x2401, 0x080F, +0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x907C, 0x0089, 0x2404, 0x403C, +0xFFD0, 0x0180, 0xDE28, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C04, 0x0AC9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0xB034, +0x0200, 0x2C5C, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, 0x0A3F, +0x0010, 0x134F, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x0AC6, 0x00A6, 0x001C, +0x403C, 0x0089, 0x430D, 0x060F, 0x134F, 0x430C, 0x430D, 0x060F, 0x134F, +0x4C04, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x403C, 0x0088, 0x430D, 0x060F, +0x134F, 0xD034, 0x0040, 0x440C, 0x430D, 0x060F, 0x134F, 0x4C04, 0x407C, +0x00B0, 0x0B0F, 0x134F, 0x403C, 0x0088, 0x430D, 0x060F, 0x134F, 0xF034, +0xFFBF, 0x440C, 0x430D, 0x060F, 0x134F, 0x4036, 0x0032, 0x474C, 0x0B0F, +0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, +0x430C, 0x080F, 0x134F, 0x5336, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, +0x9306, 0x23F5, 0x9306, 0x2402, 0x4C81, 0x0004, 0x9381, 0x0004, 0x2004, +0x403C, 0xFFDB, 0x0180, 0xDE28, 0xB3A1, 0x0004, 0x280E, 0x434C, 0x090F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x3C07, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4306, 0x407C, 0x0048, 0x0B0F, 0x134F, +0x0AC4, 0x00A4, 0x0010, 0x435C, 0x040F, 0x134F, 0x435C, 0x090F, 0x134F, +0x3C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x5316, 0x9036, +0x000A, 0x2C13, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, +0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, +0x23E5, 0x430F, 0x3C01, 0x433F, 0x930F, 0x20D2, 0x1840, 0x93A2, 0x28B8, +0x2023, 0x1840, 0x9382, 0x28BA, 0x201F, 0x407C, 0x00B0, 0x0B0F, 0x134F, +0x0AC6, 0x00A6, 0x001C, 0x403C, 0x0082, 0x430D, 0x060F, 0x134F, 0x403C, +0x000F, 0x430D, 0x060F, 0x134F, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x403C, +0x0082, 0x430D, 0x060F, 0x134F, 0x403C, 0x000C, 0x430D, 0x060F, 0x134F, +0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2C01, 0x080F, +0x134F, 0x435C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x2C01, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x403C, 0x2401, 0x080F, 0x134F, 0x403C, 0x0401, 0x080F, 0x134F, 0x407C, +0x0098, 0x0B0F, 0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x403C, 0x0880, +0x080F, 0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x403C, 0x0880, 0x080F, +0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, +0x3C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x5315, 0x9035, +0x000A, 0x2C0F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, +0x0018, 0x134F, 0x903C, 0xFFFE, 0x2403, 0x903C, 0x0F00, 0x23E7, 0x9035, +0x000A, 0x2446, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x4075, +0x0021, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4306, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x435C, 0x040F, 0x134F, +0x435C, 0x090F, 0x134F, 0x3C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x5316, 0x9036, 0x000A, 0x2C13, 0x407C, 0x0028, 0x0B0F, 0x134F, +0x430C, 0x080F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, +0x3C01, 0x433F, 0x930F, 0x23E5, 0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, +0x403C, 0xFFD1, 0x3D30, 0x4191, 0x0002, 0x0006, 0x4381, 0x0008, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, +0x411C, 0x0006, 0x411D, 0x0008, 0xF03D, 0x000F, 0x0A3F, 0x0018, 0x134F, +0x407C, 0x00A1, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C06, 0x434C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x454C, 0x0B0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4681, 0x000A, 0x464F, 0xD12F, 0x4F81, 0x0000, +0x4F06, 0x4191, 0x0002, 0x0006, 0x4381, 0x0008, 0x407C, 0x0082, 0x0B0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x427C, 0x040F, +0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x411C, 0x0006, 0x411D, 0x0008, +0xF03D, 0x000F, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, +0x460C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x454C, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x430D, +0x0A3F, 0x0018, 0x134F, 0x4C81, 0x000C, 0x4D81, 0x000E, 0x407C, 0x0088, +0x0B0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x407C, 0x0082, 0x0B0F, +0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x0C04, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, +0x090F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x403C, 0x0034, 0x080F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x0260, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x00FC, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, +0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4781, 0x0010, +0x423D, 0x410C, 0x503C, 0x000A, 0x002F, 0x2C4E, 0x0F3F, 0x000C, 0x134F, +0x430C, 0x5031, 0x0012, 0x1674, 0x0110, 0x147B, 0x8031, 0x0014, 0x4381, +0x0000, 0x4305, 0x434B, 0x410C, 0x522C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x2404, 0x403C, 0xFFDA, 0x0180, 0xE450, 0x410C, 0x532C, +0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFD9, +0x0180, 0xE450, 0x410D, 0x503D, 0x0010, 0x403C, 0xAA01, 0x002F, 0x2C4E, +0x0F3F, 0x0058, 0x134F, 0x930C, 0x2402, 0x013B, 0x0010, 0x03DB, 0x2402, +0x438B, 0x0000, 0x0084, 0x2BFA, 0x04CB, 0x00AB, 0x0008, 0x4078, 0x00C8, +0x484C, 0x0B0F, 0x134F, 0x04C9, 0x00A9, 0x0014, 0x4036, 0x2401, 0x460C, +0x090F, 0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x907C, 0x0089, 0x2404, +0x403C, 0xFFD0, 0x0180, 0xE450, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, +0x090F, 0x134F, 0x4C0A, 0x04C7, 0x00A7, 0x0030, 0x435C, 0x070F, 0x134F, +0xB03A, 0x0200, 0x2C50, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, +0x043F, 0x0010, 0x134F, 0x407C, 0x0090, 0x0B0F, 0x134F, 0x403C, 0x0089, +0x090F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C0A, 0x407C, 0x0090, 0x0B0F, +0x134F, 0x403C, 0x0088, 0x090F, 0x134F, 0xD03A, 0x0040, 0x4A0C, 0x090F, +0x134F, 0x4C0A, 0x407C, 0x0090, 0x0B0F, 0x134F, 0x403C, 0x0088, 0x090F, +0x134F, 0xF03A, 0xFFBF, 0x4A0C, 0x090F, 0x134F, 0x403A, 0x0032, 0x484C, +0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, +0x430C, 0x090F, 0x134F, 0x533A, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, +0x930A, 0x23F5, 0x930A, 0x2401, 0x4C05, 0xB325, 0x2C04, 0x403C, 0xFFDB, +0x0180, 0xE450, 0xB325, 0x280D, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, +0x134F, 0x460C, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x3C06, 0x484C, +0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x00A4, 0x0010, 0x1840, 0x9382, +0x28BE, 0x2411, 0x407C, 0x0054, 0x0B0F, 0x134F, 0x434C, 0x040F, 0x134F, +0x4C4A, 0x407C, 0x0054, 0x0B0F, 0x134F, 0x4A4C, 0xD07C, 0x0080, 0x040F, +0x134F, 0x4075, 0x0082, 0x454C, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, +0x403C, 0x4303, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, +0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, 0x430A, 0x407C, 0x0048, 0x0B0F, +0x134F, 0x435C, 0x040F, 0x134F, 0x435C, 0x070F, 0x134F, 0x3C07, 0x434C, +0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x531A, 0x903A, 0x000A, 0x2C13, +0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, +0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E5, 0x430F, +0x3C01, 0x433F, 0x930F, 0x20E2, 0x1840, 0x93A2, 0x28B8, 0x201A, 0x1840, +0x9382, 0x28BA, 0x2016, 0x407C, 0x0090, 0x0B0F, 0x134F, 0x450C, 0x090F, +0x134F, 0x403C, 0x000F, 0x090F, 0x134F, 0x407C, 0x0090, 0x0B0F, 0x134F, +0x450C, 0x090F, 0x134F, 0x403C, 0x000C, 0x090F, 0x134F, 0x1840, 0x90B2, +0x0003, 0x28B8, 0x200E, 0x1840, 0x9382, 0x28BA, 0x200A, 0x407C, 0x0090, +0x0B0F, 0x134F, 0x450C, 0x090F, 0x134F, 0x423C, 0x090F, 0x134F, 0x434C, +0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x2C01, 0x090F, 0x134F, +0x435C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, +0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x2C01, 0x090F, +0x134F, 0x435C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, +0x134F, 0x403C, 0x0401, 0x090F, 0x134F, 0x407C, 0x0098, 0x0B0F, 0x134F, +0x403C, 0x0080, 0x090F, 0x134F, 0x403C, 0x0880, 0x090F, 0x134F, 0x403C, +0x0080, 0x090F, 0x134F, 0x403C, 0x0880, 0x090F, 0x134F, 0x407C, 0x0088, +0x0B0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x3C0A, 0x434C, 0x070F, +0x134F, 0x435C, 0x070F, 0x134F, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, +0x000A, 0x0000, 0x2C0D, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x090F, +0x134F, 0x903C, 0xFFFE, 0x2403, 0x903C, 0x0F00, 0x23E5, 0x90B1, 0x000A, +0x0000, 0x244B, 0x434C, 0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, +0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407A, +0x0021, 0x4A4C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x435C, 0x070F, +0x134F, 0x4381, 0x0000, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x435C, 0x040F, +0x134F, 0x435C, 0x070F, 0x134F, 0x3C0A, 0x434C, 0x070F, 0x134F, 0x435C, +0x070F, 0x134F, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, 0x000A, 0x0000, +0x2C13, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, +0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E1, +0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, 0x403C, 0xFFD1, 0x3D0C, 0x4191, +0x0004, 0x0000, 0x454C, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, +0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x090F, +0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C1, +0x0B0F, 0x134F, 0x412C, 0x090F, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x430C, 0x090F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, +0x090F, 0x134F, 0x4A4C, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, 0x41A1, +0x0008, 0x415F, 0x0008, 0xD11F, 0x0002, 0x4F81, 0x0002, 0x4F81, 0x0006, +0x4191, 0x0004, 0x0000, 0x454C, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x090F, +0x134F, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x2409, +0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, +0x0048, 0x0B0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0B0F, +0x134F, 0x412C, 0x090F, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, 0x411C, +0x0006, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, +0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x4A4C, 0x0B0F, 0x134F, +0x435C, 0x070F, 0x134F, 0x4A4C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, +0x4C81, 0x000A, 0x4381, 0x000C, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x3401, +0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x403C, 0x4030, 0x090F, 0x134F, +0x434C, 0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x403C, 0x0C04, 0x090F, +0x134F, 0x434C, 0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x4A4C, 0x0B0F, +0x134F, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, +0x134F, 0x435C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x3401, +0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x403C, 0x4282, 0x090F, 0x134F, +0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x070F, +0x134F, 0x454C, 0x0B0F, 0x134F, 0x403C, 0x00FE, 0x090F, 0x134F, 0x434C, +0x070F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, +0x434C, 0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x430C, 0x090F, 0x134F, +0x4C0A, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, +0x134F, 0x435C, 0x070F, 0x134F, 0x4A81, 0x000E, 0x423D, 0x410C, 0x523C, +0x002F, 0x2C4E, 0x0F3F, 0x000C, 0x134F, 0x430C, 0x5031, 0x0014, 0x1674, +0x0110, 0x147B, 0x8031, 0x0016, 0x0089, 0x2BFA, 0x09CA, 0x00AA, 0x0008, +0x407C, 0x0028, 0x0A0F, 0x134F, 0x4C44, 0x09CB, 0x00AB, 0x0014, 0x9034, +0x0099, 0x2011, 0x407C, 0x00F4, 0x0A0F, 0x134F, 0x403C, 0x40A0, 0x0B0F, +0x134F, 0x407C, 0x0054, 0x0A0F, 0x134F, 0x430C, 0x431D, 0x093F, 0x001C, +0x134F, 0x407C, 0x00B0, 0x0A0F, 0x134F, 0x403C, 0x0088, 0x430D, 0x093F, +0x001C, 0x134F, 0x403C, 0x6D8E, 0x430D, 0x093F, 0x001C, 0x134F, 0x407C, +0x0030, 0x0A0F, 0x134F, 0x403C, 0x0005, 0x0B0F, 0x134F, 0x4076, 0x00C8, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x1501, 0x0B0F, 0x134F, 0x4307, 0x407C, +0x0028, 0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0xB03C, 0x0200, 0x2C05, +0x470F, 0x5317, 0x903F, 0x0032, 0x2BF5, 0x9037, 0x0032, 0x7F0F, 0xF31F, +0x2002, 0x0180, 0xEA5E, 0x09C8, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0C01, 0x0B0F, +0x134F, 0x403C, 0x0028, 0x1380, 0x2BAE, 0x403C, 0x0401, 0x0B0F, 0x134F, +0x9034, 0x0091, 0x2406, 0x9034, 0x0099, 0x2403, 0x9034, 0x0098, 0x2027, +0x407C, 0x0082, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x422C, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x9034, 0x0091, +0x2006, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x3C12, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x0501, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x407C, 0x0030, 0x0A0F, 0x134F, 0x403C, 0x000E, 0x0B0F, 0x134F, +0x407C, 0x0028, 0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x410C, 0x503C, +0x0006, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x522C, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x4191, 0x0006, 0x0012, 0x4381, 0x0014, +0x434C, 0x080F, 0x134F, 0x4075, 0x00C1, 0x454C, 0x0A0F, 0x134F, 0x09C7, +0x00A7, 0x0018, 0x411C, 0x0012, 0x411D, 0x0014, 0xF03D, 0x000F, 0x070F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x41A1, 0x0008, +0x415F, 0x0008, 0xD11F, 0x0004, 0x4F81, 0x0004, 0x4F81, 0x0000, 0x4191, +0x0006, 0x0012, 0x4381, 0x0014, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x0500, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x411C, +0x0012, 0x411D, 0x0014, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x412C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x430C, 0x430D, 0x070F, 0x134F, 0x903C, 0xFFFE, 0x2409, +0x9034, 0x0091, 0x2406, 0x9034, 0x0099, 0x2403, 0x9034, 0x0098, 0x2028, +0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, 0xFFFE, 0x430D, +0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x41A1, +0x000A, 0x4381, 0x000C, 0x3C07, 0x503C, 0xFFFC, 0x633D, 0x4C81, 0x000A, +0x4D81, 0x000C, 0x4381, 0x000E, 0x431C, 0x002F, 0x2C4E, 0x0F3F, 0x0038, +0x134F, 0x4381, 0x0002, 0x3C90, 0x411C, 0x0002, 0xE03C, 0x8000, 0x0FAC, +0xAD00, 0x002F, 0x2C4E, 0x0F3F, 0x0028, 0x134F, 0x411F, 0x0002, 0x1840, +0x93CF, 0x2D00, 0x247A, 0x4F4C, 0x13B2, 0x97B4, 0x1840, 0xF21C, 0x28C0, +0x1840, 0xF21D, 0x28C2, 0x4C0F, 0xDD0F, 0x930F, 0x2002, 0x430F, 0x3C01, +0x431F, 0x4F81, 0x0010, 0x411F, 0x0002, 0x1840, 0x4F5F, 0x2D00, 0x503F, +0x9600, 0x4F81, 0x0000, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x0500, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, 0x0110, +0x430D, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x412C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x0500, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x403C, 0x011E, 0x430D, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0010, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411F, +0x0002, 0x531F, 0x4F81, 0x0002, 0x90B1, 0x0020, 0x0002, 0x3B6C, 0x407C, +0x00B0, 0x0A0F, 0x134F, 0x403C, 0x0088, 0x430D, 0x093F, 0x001C, 0x134F, +0x403C, 0x000E, 0x430D, 0x093F, 0x001C, 0x134F, 0x9034, 0x0091, 0x20A8, +0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, 0x0102, 0x430D, +0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C09, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4981, 0x0000, +0xB2B1, 0x0000, 0x2881, 0x407C, 0x0028, 0x0A0F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x0080, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x1400, 0x0B0F, 0x134F, 0x407C, 0x0082, +0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x422C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, +0x4303, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x430C, 0x430D, 0x070F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0xC2B1, 0x0000, 0x4129, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x0500, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, +0x0102, 0x430D, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x490C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x423D, 0x410C, 0x523C, +0x002F, 0x2C4E, 0x0F3F, 0x000C, 0x134F, 0x430C, 0x3C01, 0x433C, 0x5031, +0x0016, 0x1674, 0x0110, 0x147B, 0x8031, 0x0016, 0x4381, 0x0000, 0x4305, +0x410C, 0x523C, 0x403E, 0x0005, 0x13B2, 0x98D4, 0x4381, 0x0006, 0x434B, +0x410C, 0x522C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFD3, 0x0180, 0xF062, 0x410C, 0x532C, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFD2, 0x0180, 0xF062, 0x410D, +0x503D, 0x0012, 0x403C, 0xAA01, 0x002F, 0x2C4E, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2402, 0x013B, 0x0012, 0x03DB, 0x2402, 0x438B, 0x0000, 0x008A, +0x2BFA, 0x0ACB, 0x00AB, 0x0030, 0x435C, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, +0x0008, 0x4074, 0x0028, 0x444C, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0014, +0x430C, 0x090F, 0x134F, 0x4076, 0x00C8, 0xB03C, 0x0200, 0x2C25, 0x407C, +0x0088, 0x080F, 0x134F, 0x407C, 0x0034, 0x0A3F, 0x0010, 0x134F, 0x4037, +0x0032, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x444C, +0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0x5337, 0x933C, 0x2403, 0xB03C, +0x0200, 0x2C02, 0x9307, 0x23F5, 0x9307, 0x2401, 0x4C05, 0x9305, 0x2550, +0xB325, 0x280E, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, +0x3400, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x3C07, 0x464C, 0x080F, +0x134F, 0x403C, 0x3400, 0x090F, 0x134F, 0x0087, 0x28B8, 0x9387, 0x0006, +0x2413, 0x407C, 0x0054, 0x080F, 0x134F, 0x434C, 0x0A3F, 0x0010, 0x134F, +0x4C45, 0x407C, 0x0054, 0x080F, 0x134F, 0x454C, 0xD07C, 0x0080, 0x0A3F, +0x0010, 0x134F, 0x4305, 0x407C, 0x0048, 0x080F, 0x134F, 0x435C, 0x0A3F, +0x0010, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x3C07, 0x434C, 0x0B0F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x5315, 0x9035, 0x000A, 0x2C12, 0x444C, 0x080F, +0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, +0x430F, 0x3C01, 0x433F, 0x930F, 0x23E6, 0x430F, 0x3C01, 0x433F, 0x930F, +0x211F, 0x4075, 0x0021, 0x454C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, +0x4C81, 0x000A, 0x4381, 0x000C, 0x407C, 0x0030, 0x080F, 0x134F, 0x403C, +0x0003, 0x090F, 0x134F, 0x430C, 0x090F, 0x134F, 0x93A7, 0x0000, 0x201B, +0x9387, 0x0002, 0x2018, 0x407C, 0x0090, 0x080F, 0x134F, 0x403C, 0x0082, +0x090F, 0x134F, 0x403C, 0x000F, 0x090F, 0x134F, 0x407C, 0x0090, 0x080F, +0x134F, 0x403C, 0x0082, 0x090F, 0x134F, 0x403C, 0x000C, 0x090F, 0x134F, +0x90B7, 0x0003, 0x0000, 0x200E, 0x9387, 0x0002, 0x200B, 0x407C, 0x0090, +0x080F, 0x134F, 0x403C, 0x0082, 0x090F, 0x134F, 0x423C, 0x090F, 0x134F, +0x472F, 0xD71F, 0x0002, 0x930F, 0x241C, 0x9387, 0x0004, 0x2419, 0x407C, +0x0090, 0x080F, 0x134F, 0x403C, 0x0089, 0x090F, 0x134F, 0x430C, 0x090F, +0x134F, 0x4C07, 0x407C, 0x0090, 0x080F, 0x134F, 0x403C, 0x0088, 0x090F, +0x134F, 0xD037, 0x0010, 0x470C, 0x090F, 0x134F, 0x4077, 0x0082, 0x474C, +0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0xD034, 0x090F, 0x134F, +0x13B2, 0x83C4, 0x4C0F, 0xDD0F, 0x930F, 0x207B, 0x444C, 0x080F, 0x134F, +0x430C, 0x090F, 0x134F, 0x934C, 0x3410, 0x474C, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x403C, 0xD034, 0x090F, 0x134F, 0x13B2, 0x83C4, 0x4C0F, +0xDD0F, 0x930F, 0x2063, 0x474C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x430C, 0x090F, 0x134F, 0x13B2, 0x83C4, 0x4C0F, 0xDD0F, 0x930F, 0x2054, +0x444C, 0x080F, 0x134F, 0x3C0A, 0x13B2, 0x83C4, 0x4C0F, 0xDD0F, 0x930F, +0x204A, 0x412F, 0x531F, 0x4F81, 0x0000, 0x430C, 0x090F, 0x134F, 0x934C, +0x3804, 0x90B1, 0x000A, 0x0000, 0x2BED, 0x90B1, 0x000A, 0x0000, 0x2439, +0x454C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0x822C, 0x4C81, 0x000A, +0x4381, 0x000C, 0x9381, 0x0000, 0x2032, 0x444C, 0x080F, 0x134F, 0x430C, +0x090F, 0x134F, 0xB03C, 0x0020, 0x2835, 0x53A1, 0x000A, 0x474C, 0x080F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0xC032, 0x090F, 0x134F, 0x13B2, +0x83C4, 0x4C0F, 0xDD0F, 0x930F, 0x2010, 0x474C, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x403C, 0x0010, 0x090F, 0x134F, 0x13B2, 0x83C4, 0x4C0F, +0xDD0F, 0x930F, 0x2403, 0x403C, 0xFFD4, 0x3D2F, 0x40B1, 0x0010, 0x0006, +0x3C0C, 0x454C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C81, 0x000A, +0x4381, 0x000C, 0x4391, 0x0010, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, +0x090F, 0x134F, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, +0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, +0x403C, 0xFFD1, 0x3D05, 0x4114, 0x0004, 0x474C, 0x080F, 0x134F, 0x403C, +0x3FFF, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, +0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, 0x440C, 0x090F, 0x134F, 0x407C, +0x00A1, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x430C, 0x090F, 0x134F, 0x4C04, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, +0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x454C, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x4481, 0x0008, 0x444F, 0xD11F, 0x0002, 0x4F81, 0x0002, +0x4F81, 0x0000, 0x4114, 0x0004, 0x474C, 0x080F, 0x134F, 0x403C, 0x3FFF, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, +0x2409, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x0048, 0x080F, 0x134F, 0x427C, 0x0A3F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x080F, 0x134F, 0x440C, 0x090F, 0x134F, 0x407C, 0x00A1, 0x080F, +0x134F, 0x412C, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x454C, +0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, +0x3401, 0x090F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x4030, 0x090F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x0C04, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x454C, +0x080F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, +0x2401, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, +0x403C, 0x3401, 0x090F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x4282, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x00FE, 0x090F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x430C, +0x090F, 0x134F, 0x4C07, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, +0x403C, 0x2401, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0xD117, 0x0006, +0x4781, 0x000E, 0x403D, 0x000A, 0x410C, 0x523C, 0x002F, 0x2C4E, 0x0F3F, +0x000C, 0x134F, 0x430C, 0x5031, 0x0016, 0x1674, 0x0110, 0x147B, 0x8031, +0x001E, 0xB31C, 0x288A, 0x008B, 0x2824, 0x438B, 0x0000, 0x438B, 0x0002, +0x438B, 0x0004, 0x438B, 0x0006, 0x008A, 0x2C4E, 0x0BCC, 0x0A0F, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2422, 0x008C, 0x282C, 0x0A0F, 0x0F3F, 0x002C, +0x134F, 0x933C, 0x241A, 0x0084, 0x282E, 0x04CC, 0x0A0F, 0x0F3F, 0x002C, +0x134F, 0x933C, 0x2411, 0x008C, 0x2830, 0x0A0F, 0x0F3F, 0x0030, 0x134F, +0x933C, 0x2409, 0x0087, 0x2834, 0x07CC, 0x0A0F, 0x0F3F, 0x0030, 0x134F, +0x933C, 0x2003, 0x433C, 0x0180, 0xF636, 0x472F, 0xD71F, 0x0002, 0x930F, +0x2003, 0x430C, 0x0180, 0xF636, 0x4BDB, 0x0004, 0x0007, 0x4BDB, 0x0003, +0x0006, 0x4BDB, 0x0002, 0x0005, 0x4BDB, 0x0001, 0x0004, 0x4BEB, 0x0003, +0x43CB, 0x0002, 0x438B, 0x0000, 0x472C, 0x471D, 0x0002, 0x446E, 0x13B2, +0x8D1E, 0x4C87, 0x0000, 0x4D87, 0x0002, 0x13B2, 0x7FE8, 0x473E, 0x473F, +0x831E, 0x730F, 0xDF0E, 0x930E, 0x430F, 0x2403, 0x403E, 0x0010, 0x3C01, +0x430E, 0x4038, 0x0003, 0x4309, 0xFB28, 0x1519, 0x160B, 0x064B, 0x1840, +0xDB1E, 0x2B6A, 0x1840, 0xDB1F, 0x2B6C, 0xD42E, 0x4E81, 0x0000, 0x4F81, +0x0002, 0x430F, 0x410E, 0x530E, 0x430C, 0x430D, 0x1380, 0x2C3E, 0x430F, +0x008E, 0x2830, 0x422C, 0x430D, 0x1380, 0x2C3E, 0x1840, 0x9382, 0x282C, +0x20D3, 0x008A, 0x2C4E, 0x407C, 0x0091, 0x0A0F, 0x0F3F, 0x0024, 0x134F, +0x0A0F, 0x0F3F, 0x0004, 0x134F, 0x410D, 0x522D, 0x410C, 0x503C, 0x000E, +0x0A0F, 0x0F3F, 0x0034, 0x134F, 0x410F, 0x503F, 0x0006, 0x0F71, 0x0012, +0x0F71, 0x0016, 0x0087, 0x2834, 0x0085, 0x2830, 0x0084, 0x282E, 0x472F, +0xD71F, 0x0002, 0x930F, 0x2002, 0x0180, 0xF61C, 0x9381, 0x0004, 0x2002, +0x0180, 0xF618, 0x442F, 0x830F, 0x2403, 0x831F, 0x2407, 0x3C0D, 0x013F, +0x000E, 0x4F6E, 0x4E81, 0x0000, 0x3C04, 0x013F, 0x000E, 0x4FA1, 0x0000, +0x4381, 0x0002, 0x3C09, 0x013F, 0x000E, 0x1840, 0x4FA1, 0x0000, 0x1840, +0x4F91, 0x0002, 0x0002, 0x412C, 0x411D, 0x0002, 0x407E, 0x0003, 0xF56E, +0x1842, 0x5E4E, 0x13B2, 0x8CC0, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x4C08, +0x4D09, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x5808, +0x6909, 0x6A0A, 0x4076, 0x0028, 0x480C, 0x490D, 0x4A0E, 0xD03C, 0x0006, +0x4C81, 0x0006, 0x4D81, 0x0008, 0x4E81, 0x000A, 0x4381, 0x000C, 0x013C, +0x0016, 0x1380, 0x2C1A, 0xF07C, 0x0007, 0x936C, 0x2402, 0x5376, 0x23E9, +0x431E, 0x446F, 0x835F, 0x3002, 0x18CF, 0x5E0E, 0x013F, 0x000E, 0x4E0B, +0xE03B, 0x8000, 0x00BB, 0x8000, 0x0BEF, 0x0F71, 0x000E, 0x4E0F, 0xE33F, +0x5F0F, 0x7F0F, 0x5E85, 0x0000, 0x6F85, 0x0002, 0x9E81, 0x0004, 0x2806, +0x411F, 0x0004, 0x8E0F, 0x4F81, 0x0004, 0x3C02, 0x4381, 0x0004, 0x53B7, +0x0000, 0x63B7, 0x0002, 0x472F, 0xD71F, 0x0002, 0x930F, 0x259D, 0x452F, +0xB03F, 0x0FFF, 0x237C, 0x4F08, 0x4519, 0x0002, 0x430A, 0x5808, 0x6909, +0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x4076, 0x0028, +0x480C, 0x490D, 0x4A0E, 0xD32C, 0x4C81, 0x0006, 0x4D81, 0x0008, 0x4E81, +0x000A, 0x4381, 0x000C, 0x013C, 0x0012, 0x1380, 0x2C1A, 0xF07C, 0x0007, +0x936C, 0x2752, 0x5376, 0x2750, 0x3FE9, 0x4381, 0x0000, 0x4381, 0x0002, +0x407A, 0x0028, 0x410B, 0x503B, 0x0006, 0x40B1, 0x0007, 0x0006, 0x4381, +0x0008, 0x4381, 0x000A, 0x4381, 0x000C, 0x0BCC, 0x1380, 0x2C1A, 0xB31C, +0x2802, 0x537A, 0x23F0, 0x4104, 0x5304, 0x035F, 0x100E, 0x100D, 0x100C, +0x110F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x4C84, +0x0000, 0x4D84, 0x0002, 0x410F, 0x503F, 0x0006, 0x0F71, 0x0016, 0x0F71, +0x0012, 0x0F71, 0x001A, 0x0087, 0x2834, 0x0085, 0x2830, 0x3C7D, 0x002F, +0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x472F, 0xD71F, 0x0002, 0x930F, 0x2473, +0x431E, 0x1840, 0x425F, 0x282E, 0x835F, 0x3002, 0x18CF, 0x5E0E, 0x4E0F, +0xE33F, 0x5F0F, 0x7F0F, 0x5E85, 0x0000, 0x6F85, 0x0002, 0x452F, 0xB03F, +0x0FFF, 0x205F, 0x13B2, 0x7FE8, 0x407C, 0x000B, 0x1380, 0x2C06, 0x4528, +0x4519, 0x0002, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, +0x5808, 0x6909, 0x6A0A, 0x4076, 0x0028, 0x480C, 0x490D, 0x4A0E, 0xD32C, +0x4C81, 0x0006, 0x4D81, 0x0008, 0x4E81, 0x000A, 0x4381, 0x000C, 0x013C, +0x0012, 0x1380, 0x2C1A, 0xF07C, 0x0007, 0x936C, 0x2402, 0x5376, 0x23EA, +0x4428, 0x4419, 0x0002, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, +0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x4076, 0x0028, 0x480C, 0x490D, 0x4A0E, +0xD03C, 0x0007, 0x4C81, 0x0006, 0x4D81, 0x0008, 0x4E81, 0x000A, 0x4381, +0x000C, 0x013C, 0x0016, 0x1380, 0x2C1A, 0xB31C, 0x2802, 0x5376, 0x23EB, +0x035F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x110F, +0x100E, 0x100D, 0x100C, 0x4C84, 0x0000, 0x4D84, 0x0002, 0x53B7, 0x0000, +0x63B7, 0x0002, 0x472F, 0xD71F, 0x0002, 0x930F, 0x2451, 0x4428, 0x4419, +0x0002, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x5808, +0x6909, 0x6A0A, 0x4076, 0x0028, 0x480C, 0x490D, 0x4A0E, 0xD03C, 0x0007, +0x4C81, 0x0006, 0x4D81, 0x0008, 0x4E81, 0x000A, 0x4381, 0x000C, 0x013C, +0x001A, 0x1380, 0x2C1A, 0xB31C, 0x2802, 0x5376, 0x23EB, 0x035F, 0x100E, +0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, +0x100C, 0x407E, 0x0003, 0xF56E, 0x1842, 0x5E4E, 0x13B2, 0x8D1E, 0x4C81, +0x0000, 0x4D81, 0x0002, 0x1840, 0x421F, 0x282E, 0x830F, 0x2405, 0x831F, +0x2409, 0x831F, 0x2736, 0x3F3A, 0x002F, 0x2C4E, 0x0F3F, 0x0008, 0x134F, +0x3F34, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x3F2E, 0x407C, 0x000A, +0x1380, 0x2C06, 0x4438, 0x4439, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, +0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x4076, 0x0028, 0x4104, 0x5034, +0x0006, 0x480C, 0x490D, 0x4A0E, 0xD03C, 0x0007, 0x4C81, 0x0006, 0x4D81, +0x0008, 0x4E81, 0x000A, 0x4381, 0x000C, 0x04CC, 0x1380, 0x2C1A, 0xB31C, +0x2802, 0x5376, 0x23EC, 0x035F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, +0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x407E, 0x0003, 0x1840, +0xF25E, 0x2830, 0x1842, 0x5E4E, 0x13B2, 0x8D1E, 0x4C81, 0x0000, 0x4D81, +0x0002, 0x1840, 0x421F, 0x282E, 0x830F, 0x2405, 0x831F, 0x2409, 0x831F, +0x240D, 0x3C11, 0x002F, 0x2C4E, 0x0F3F, 0x0008, 0x134F, 0x3C0B, 0x002F, +0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x3C05, 0x002F, 0x2C4E, 0x0F3F, 0x0014, +0x134F, 0x473F, 0xD73F, 0x930F, 0x2402, 0x431C, 0x3C0D, 0x4381, 0x0000, +0x4381, 0x0002, 0x431E, 0x410D, 0x530D, 0x407C, 0x000C, 0x1380, 0x2C3A, +0x13B2, 0x7FE8, 0x5031, 0x001E, 0x1674, 0x0110, 0x147B, 0x120C, 0x8031, +0x003C, 0x4308, 0x4309, 0x430A, 0x430B, 0x4381, 0x0014, 0x4381, 0x0016, +0x4381, 0x0006, 0x4381, 0x0012, 0x4381, 0x0010, 0x4381, 0x000E, 0x4347, +0x410C, 0x503C, 0x0006, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x410C, +0x503C, 0x0012, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, +0x0010, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, 0x000E, +0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x432C, 0x002F, 0x2C4E, 0x0F3F, +0x0038, 0x134F, 0x933C, 0x240E, 0x410D, 0x530D, 0x403C, 0xAA01, 0x002F, +0x2C4E, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2401, 0x0107, 0x03D7, 0x2003, +0x433C, 0x0180, 0xFBE6, 0x1380, 0x2C36, 0x907C, 0x0046, 0x2404, 0x407C, +0x0046, 0x1380, 0x2C02, 0x472F, 0x930F, 0x2555, 0x9381, 0x000E, 0x2552, +0x4381, 0x0008, 0x4381, 0x000A, 0x4381, 0x001C, 0x4381, 0x001E, 0x0086, +0x2856, 0x462F, 0x0FCE, 0x0FEF, 0x0FEE, 0x0A4F, 0x0EEF, 0x1840, 0x40FF, +0x0007, 0x2CA1, 0x3C04, 0x403C, 0x0003, 0x1380, 0x2BAA, 0x90B2, 0xFFA1, +0x0350, 0x2FF8, 0x93A2, 0x0350, 0x2BF5, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x4214, 0x0350, 0x421F, 0x0350, 0x1800, 0x43C1, 0x0000, 0x940F, +0x2C01, 0x4F04, 0x410D, 0x530D, 0x403C, 0xAA04, 0x002F, 0x2C4E, 0x0F3F, +0x0058, 0x134F, 0x010F, 0x4F25, 0x462F, 0x0FCE, 0x0FEF, 0x0FEE, 0x0A4F, +0x0EEF, 0x1840, 0x44CF, 0x2CA2, 0x1084, 0x1840, 0x44CF, 0x2CA3, 0x1840, +0x45CF, 0x2CA4, 0x1085, 0x1840, 0x45CF, 0x2CA5, 0x4214, 0x03D0, 0x421F, +0x03D0, 0x1800, 0x43C1, 0x0018, 0x940F, 0x2C01, 0x4F04, 0x410D, 0x503D, +0x0018, 0x403C, 0xAA03, 0x002F, 0x2C4E, 0x0F3F, 0x0058, 0x134F, 0x013F, +0x0018, 0x4F25, 0x462F, 0x0FCE, 0x0FEF, 0x0FEE, 0x0A4F, 0x0EEF, 0x1840, +0x44CF, 0x2CAE, 0x1084, 0x1840, 0x44CF, 0x2CAF, 0x1840, 0x45CF, 0x2CB0, +0x1085, 0x1840, 0x45CF, 0x2CB1, 0x410D, 0x503D, 0x001C, 0x410C, 0x523C, +0x1380, 0x2B96, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x9381, 0x003C, 0x2046, 0x4104, 0x5034, +0x0014, 0x1213, 0x04CD, 0x403E, 0x101C, 0x403F, 0xE000, 0x430C, 0x1380, +0x2C42, 0x411E, 0x0016, 0x411F, 0x0018, 0x462D, 0x0DC5, 0x0DED, 0x0DE5, +0x0A4D, 0x05ED, 0x1840, 0x4ECD, 0x2CA6, 0x108E, 0x1840, 0x4ECD, 0x2CA7, +0x1840, 0x4FCD, 0x2CA8, 0x108F, 0x1840, 0x4FCD, 0x2CA9, 0x1213, 0x04CD, +0x430E, 0x403F, 0x4001, 0x430C, 0x1380, 0x2C42, 0x411E, 0x0018, 0x411F, +0x001A, 0x462D, 0x0DC4, 0x0DED, 0x0DE4, 0x0A4D, 0x04ED, 0x1840, 0x4ECD, +0x2CAA, 0x108E, 0x1840, 0x4ECD, 0x2CAB, 0x1840, 0x4FCD, 0x2CAC, 0x108F, +0x1840, 0x4FCD, 0x2CAD, 0x5221, 0x3C33, 0x1211, 0x003E, 0x1230, 0x001E, +0x433C, 0x433D, 0x433E, 0x433F, 0x1380, 0x2C22, 0x4C08, 0x4D09, 0x4E0A, +0x4F0B, 0x462C, 0x0CC4, 0x0CEC, 0x0CE4, 0x0A4C, 0x04EC, 0x1840, 0x48CC, +0x2CA6, 0x480D, 0x108D, 0x1840, 0x4DCC, 0x2CA7, 0x1840, 0x49CC, 0x2CA8, +0x490D, 0x108D, 0x1840, 0x4DCC, 0x2CA9, 0x1840, 0x4ECC, 0x2CAA, 0x108E, +0x1840, 0x4ECC, 0x2CAB, 0x1840, 0x4FCC, 0x2CAC, 0x108F, 0x1840, 0x4FCC, +0x2CAD, 0x5221, 0x430E, 0x430F, 0x411C, 0x0008, 0x411D, 0x000A, 0x13B2, +0x9906, 0x930C, 0x2407, 0x411C, 0x0008, 0x411D, 0x000A, 0x13B2, 0x9912, +0x3C06, 0x411C, 0x001C, 0x411D, 0x001E, 0x13B2, 0x9912, 0x462F, 0x0FCE, +0x0FEF, 0x0FEE, 0x0A4F, 0x0EEF, 0x1840, 0x4CCF, 0x2CB2, 0x108C, 0x1840, +0x4CCF, 0x2CB3, 0x5396, 0x0000, 0x90B6, 0x0005, 0x0000, 0x2046, 0x4386, +0x0000, 0x423C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x407C, 0x0005, +0x002F, 0x2C4E, 0x0F3F, 0x0008, 0x134F, 0x407C, 0x0013, 0x002F, 0x2C4E, +0x0F3F, 0x0008, 0x134F, 0x403D, 0x005F, 0x008C, 0x2CA1, 0x002F, 0x2C4E, +0x0F3F, 0x000C, 0x134F, 0x431C, 0x3D25, 0x930F, 0x2019, 0x9381, 0x0006, +0x251F, 0x422C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x430D, +0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x430D, 0x002F, 0x2C4E, +0x0F3F, 0x0014, 0x134F, 0x430C, 0x3D0A, 0x433C, 0x433D, 0x433E, 0x433F, +0x1380, 0x2C1E, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, 0x9387, 0x0000, 0x2435, +0x9381, 0x0012, 0x2432, 0x4346, 0xB03B, 0x4000, 0x2C29, 0xB03B, 0x0400, +0x2826, 0x431C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x480C, 0x490D, +0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x4A0C, 0x4B0D, 0x002F, 0x2C4E, +0x0F3F, 0x0014, 0x134F, 0x410D, 0x530D, 0x403C, 0xAA01, 0x002F, 0x2C4E, +0x0F3F, 0x0058, 0x134F, 0x930C, 0x2401, 0x0106, 0x03D6, 0x2402, 0x4386, +0x0000, 0x431F, 0x3C01, 0x432F, 0x931F, 0x2002, 0x431C, 0x3CC8, 0x9387, +0x0000, 0x2003, 0x9381, 0x0006, 0x24C1, 0x9381, 0x0010, 0x24BE, 0x4B0F, +0x108F, 0x4F4C, 0xF07C, 0x00C0, 0x907C, 0x0040, 0x24B6, 0x4191, 0x0006, +0x0004, 0x4381, 0x000C, 0x1800, 0x43C1, 0x0008, 0xB03B, 0x4000, 0x2C1D, +0x930B, 0x3806, 0x4B07, 0xF037, 0x8300, 0x9037, 0x8300, 0x2015, 0x407C, +0x0086, 0x1380, 0x2C02, 0x907C, 0x0099, 0x200E, 0x422C, 0x1380, 0x2C0E, +0x903C, 0x1207, 0x2008, 0x430C, 0x1380, 0x2C0E, 0x903C, 0xA55A, 0x2002, +0x4391, 0x000C, 0x9381, 0x0004, 0x2015, 0x008F, 0x284E, 0x4304, 0x4305, +0x4306, 0x4037, 0x4000, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0x4B0F, 0xF03F, +0x4000, 0x9F07, 0x2005, 0x9381, 0x000C, 0x2002, 0x432C, 0x3C61, 0x422C, +0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x480C, 0x490D, 0x002F, 0x2C4E, +0x0F3F, 0x0014, 0x134F, 0x4A0C, 0x4B0D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, +0x134F, 0xB03B, 0x4000, 0x2C03, 0x9381, 0x0004, 0x2406, 0x9381, 0x000C, +0x2443, 0x9381, 0x0004, 0x2040, 0x410C, 0x503C, 0x0020, 0x028E, 0x9A3A, +0x427D, 0x13B2, 0x98A8, 0x1840, 0x42D1, 0x2470, 0x0020, 0x008F, 0x2470, +0x4FD1, 0x0001, 0x0021, 0x4107, 0x5037, 0x0028, 0x1407, 0x430F, 0x434E, +0x423D, 0x410C, 0x503C, 0x0024, 0x0026, 0x2C4E, 0x0636, 0x001C, 0x1346, +0x403C, 0x0003, 0x002F, 0x2A28, 0x134F, 0x07CC, 0x002F, 0x2C4E, 0x0F3F, +0x0020, 0x134F, 0x410D, 0x522D, 0x403C, 0xAA01, 0x002F, 0x2C4E, 0x0F3F, +0x0058, 0x134F, 0x5221, 0x930C, 0x2403, 0x1800, 0x41E1, 0x0008, 0x013F, +0x0008, 0x03DF, 0x2402, 0x438F, 0x0000, 0x431C, 0x9381, 0x0004, 0x2402, +0x430C, 0x3C0C, 0x1840, 0x4882, 0x284E, 0x1840, 0x4982, 0x2850, 0x1840, +0x4A82, 0x2852, 0x1840, 0x4B82, 0x2854, 0x931C, 0x2403, 0x930C, 0x2401, +0x432C, 0x5031, 0x003E, 0x1674, 0x0110, 0x147B, 0x8031, 0x0016, 0x4381, +0x0000, 0x4305, 0x410C, 0x523C, 0x403E, 0x0005, 0x13B2, 0x98D4, 0x4381, +0x0006, 0x434B, 0x410C, 0x522C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2404, 0x403C, 0xFFD3, 0x0280, 0x015A, 0x410C, 0x532C, 0x002F, +0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFD2, 0x0280, +0x015A, 0x410D, 0x503D, 0x0012, 0x403C, 0xAA01, 0x002F, 0x2C4E, 0x0F3F, +0x0058, 0x134F, 0x930C, 0x2402, 0x013B, 0x0012, 0x03DB, 0x2402, 0x438B, +0x0000, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0030, 0x435C, 0x0B0F, 0x134F, +0x0AC8, 0x00A8, 0x0008, 0x4074, 0x0028, 0x444C, 0x080F, 0x134F, 0x0AC9, +0x00A9, 0x0014, 0x430C, 0x090F, 0x134F, 0x4077, 0x00C8, 0xB03C, 0x0200, +0x2C27, 0x407C, 0x0088, 0x080F, 0x134F, 0x407C, 0x0034, 0x0A3F, 0x0010, +0x134F, 0x4036, 0x0032, 0x474C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, +0x134F, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0x5336, 0x933C, +0x2403, 0xB03C, 0x0200, 0x2C02, 0x9306, 0x23F5, 0x9306, 0x2402, 0x4C81, +0x0000, 0x9381, 0x0000, 0x24EF, 0xB3A1, 0x0000, 0x280E, 0x434C, 0x0B0F, +0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x3400, 0x090F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x3C07, 0x474C, 0x080F, 0x134F, 0x403C, 0x3400, 0x090F, +0x134F, 0x4306, 0x407C, 0x0048, 0x080F, 0x134F, 0x435C, 0x0A3F, 0x0010, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x3C07, 0x434C, 0x0B0F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x5316, 0x9036, 0x000A, 0x2C12, 0x444C, 0x080F, 0x134F, +0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, +0x3C01, 0x433F, 0x930F, 0x23E6, 0x430F, 0x3C01, 0x433F, 0x930F, 0x20D8, +0x407C, 0x0021, 0x080F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, +0x4C81, 0x000A, 0x4D81, 0x000C, 0x407C, 0x0030, 0x080F, 0x134F, 0x403C, +0x0003, 0x090F, 0x134F, 0x430C, 0x090F, 0x134F, 0x1840, 0x93A2, 0x28B8, +0x2023, 0x1840, 0x9382, 0x28BA, 0x201F, 0x407C, 0x00B0, 0x080F, 0x134F, +0x0AC6, 0x00A6, 0x001C, 0x403C, 0x0082, 0x430D, 0x060F, 0x134F, 0x403C, +0x000F, 0x430D, 0x060F, 0x134F, 0x407C, 0x00B0, 0x080F, 0x134F, 0x403C, +0x0082, 0x430D, 0x060F, 0x134F, 0x403C, 0x000C, 0x430D, 0x060F, 0x134F, +0x4076, 0x0082, 0x464C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, +0x4303, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x444C, 0x080F, 0x134F, 0x3C0A, 0x13B2, +0x845C, 0x4C0F, 0xDD0F, 0x930F, 0x204C, 0x5315, 0x430C, 0x090F, 0x134F, +0x430C, 0x090F, 0x134F, 0x934C, 0x3803, 0x9035, 0x000A, 0x2BEE, 0x9035, +0x000A, 0x243D, 0x407C, 0x0021, 0x080F, 0x134F, 0x430C, 0x430D, 0x0A3F, +0x0018, 0x134F, 0x503C, 0xFFFE, 0x633D, 0x4C81, 0x000A, 0x4D81, 0x000C, +0x9305, 0x2032, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xB03C, +0x0020, 0x2838, 0x53A1, 0x000A, 0x464C, 0x080F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x403C, 0xC032, 0x090F, 0x134F, 0x13B2, 0x845C, 0x4C0F, 0xDD0F, +0x930F, 0x2010, 0x464C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, +0x0010, 0x090F, 0x134F, 0x13B2, 0x845C, 0x4C0F, 0xDD0F, 0x930F, 0x2403, +0x403C, 0xFFD4, 0x3D47, 0x40B1, 0x0010, 0x0006, 0x3C0F, 0x407C, 0x0021, +0x080F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x4C81, 0x000A, +0x4D81, 0x000C, 0x4391, 0x0010, 0x474C, 0x080F, 0x134F, 0x403C, 0x2401, +0x090F, 0x134F, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, +0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, +0x403C, 0xFFD1, 0x3D1A, 0x4114, 0x0004, 0x464C, 0x080F, 0x134F, 0x403C, +0x3FFF, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, +0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, 0x440C, 0x430D, 0x0A3F, 0x0018, +0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C04, 0x434C, 0x0B0F, 0x134F, +0x474C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x407C, 0x0021, +0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x4481, 0x0008, 0x444F, 0xD11F, +0x0002, 0x4F81, 0x0002, 0x4F81, 0x0000, 0x4114, 0x0004, 0x464C, 0x080F, +0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, +0x080F, 0x134F, 0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x407C, 0x0048, 0x080F, 0x134F, 0x427C, 0x0A3F, +0x0010, 0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, 0x440C, 0x430D, 0x0A3F, +0x0018, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, +0x403C, 0x2401, 0x090F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x4077, 0x0088, 0x474C, 0x080F, 0x134F, 0x407C, 0x0034, +0x0A3F, 0x0010, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x0080, 0x090F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x0C04, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, +0x0021, 0x080F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, +0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x474C, +0x080F, 0x134F, 0x403C, 0x0034, 0x090F, 0x134F, 0x464C, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x403C, 0x0260, 0x090F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x464C, +0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x00FC, 0x090F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x4C06, 0x434C, 0x0B0F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, +0x080F, 0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x0B0F, +0x134F, 0xD116, 0x0006, 0x4681, 0x000E, 0x403D, 0x000A, 0x410C, 0x523C, +0x002F, 0x2C4E, 0x0F3F, 0x000C, 0x134F, 0x430C, 0x5031, 0x0016, 0x1674, +0x0110, 0x147B, 0x8221, 0x0CC4, 0x1840, 0x4CA1, 0x0000, 0x1840, 0x4C91, +0x0002, 0x0002, 0x0089, 0x2BFA, 0x09CA, 0x00AA, 0x0008, 0x4075, 0x0088, +0x454C, 0x0A0F, 0x134F, 0x09C7, 0x00A7, 0x0010, 0x407C, 0x0034, 0x070F, +0x134F, 0x407B, 0x0082, 0x4B4C, 0x0A0F, 0x134F, 0x09C8, 0x00A8, 0x0030, +0x435C, 0x080F, 0x134F, 0x00A9, 0x0014, 0x412E, 0x411F, 0x0002, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0085, 0x4E0C, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x4076, 0x0042, 0x464C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4491, +0x0004, 0x0000, 0x4491, 0x0006, 0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, +0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x412E, 0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, +0xD03E, 0x0086, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4491, 0x0008, 0x0000, 0x4491, 0x000A, 0x0002, 0x454C, 0x0A0F, +0x134F, 0x407C, 0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, +0xF03E, 0x0F00, 0xD03E, 0x0089, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4491, 0x000C, 0x0000, 0x4491, 0x000E, 0x0002, +0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD50E, 0x4E0C, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, +0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4491, 0x0010, 0x0000, 0x4491, 0x0012, +0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x070F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x008A, 0x4E0C, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412C, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, +0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4491, 0x0014, 0x0000, +0x4491, 0x0016, 0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x070F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x411F, +0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x008B, +0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4491, +0x0018, 0x0000, 0x4491, 0x001A, 0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, +0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x412E, 0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, +0xD03E, 0x008C, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, +0x134F, 0x5221, 0x1674, 0x0110, 0x147B, 0x8031, 0x000C, 0x4381, 0x000A, +0xB31C, 0x28B1, 0x008B, 0x2838, 0x438B, 0x0000, 0x438B, 0x0002, 0x438B, +0x0004, 0x438B, 0x0006, 0x008A, 0x2C4E, 0x0BCC, 0x0A0F, 0x0F3F, 0x002C, +0x134F, 0x933C, 0x2542, 0x008C, 0x2840, 0x0A0F, 0x0F3F, 0x002C, 0x134F, +0x933C, 0x253A, 0x008C, 0x2842, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x933C, +0x2532, 0x008C, 0x2844, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x252A, +0x0087, 0x2848, 0x07CC, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x2521, +0x472F, 0xD71F, 0x0002, 0x930F, 0x2002, 0x430C, 0x3DFC, 0x472C, 0x471D, +0x0002, 0x1840, 0x425E, 0x2842, 0x13B2, 0x8D1E, 0x4C87, 0x0000, 0x4D87, +0x0002, 0x0086, 0x2BFA, 0x4105, 0x5305, 0x431E, 0x05CD, 0x426C, 0x063F, +0x0040, 0x134F, 0xD391, 0x0000, 0x430E, 0x05CD, 0x426C, 0x063F, 0x0040, +0x134F, 0x473E, 0x473F, 0x831E, 0x730F, 0xDF0E, 0x930E, 0x430F, 0x2403, +0x403E, 0x0010, 0x3C01, 0x430E, 0x4038, 0x0003, 0x4309, 0xFB28, 0x1519, +0x160B, 0x064B, 0x1840, 0xDB1E, 0x2B6A, 0x1840, 0xDB1F, 0x2B6C, 0x1840, +0xD21E, 0x2842, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430F, 0x05CE, 0x430C, +0x430D, 0x063B, 0x0044, 0x134B, 0x430F, 0x008E, 0x2844, 0x422C, 0x430D, +0x063B, 0x0044, 0x134B, 0x1840, 0x9392, 0x2840, 0x2025, 0x4308, 0x430A, +0x430B, 0x435E, 0x05CD, 0x407C, 0x000F, 0x063F, 0x0050, 0x134F, 0x4C47, +0x13B2, 0x8A2C, 0x5318, 0x6309, 0x630A, 0x630B, 0x200A, 0x930A, 0x2008, +0x9309, 0x2006, 0x9038, 0x0028, 0x2C03, 0x9357, 0x23E8, 0x3C09, 0x9038, +0x0028, 0x2006, 0x9309, 0x2004, 0x930A, 0x2002, 0x930B, 0x24A4, 0x0087, +0x2848, 0x1840, 0x9382, 0x2840, 0x210A, 0x410D, 0x522D, 0x410C, 0x503C, +0x0006, 0x002F, 0x2C4E, 0x0F3F, 0x0034, 0x134F, 0x4105, 0x5305, 0x0084, +0x2844, 0x3C17, 0x4381, 0x0004, 0x53B7, 0x0000, 0x63B7, 0x0002, 0x472F, +0xD71F, 0x0002, 0x930F, 0x251E, 0x442F, 0xB03F, 0x0FFF, 0x200D, 0x430F, +0x04CE, 0x422C, 0x430D, 0x1380, 0x2C3E, 0x13B2, 0x8A2C, 0x472F, 0xD71F, +0x0002, 0x930F, 0x250D, 0x9381, 0x0004, 0x2507, 0x4308, 0x4309, 0x430A, +0x430B, 0x1840, 0x421F, 0x2842, 0x830F, 0x2403, 0x831F, 0x2407, 0x3C0D, +0x013F, 0x0006, 0x4F6E, 0x4E81, 0x0000, 0x3C04, 0x013F, 0x0006, 0x4FA1, +0x0000, 0x4381, 0x0002, 0x3C09, 0x013F, 0x0006, 0x1840, 0x4FA1, 0x0000, +0x1840, 0x4F91, 0x0002, 0x0002, 0x412C, 0x411D, 0x0002, 0x407E, 0x0003, +0xF46E, 0x1842, 0x5E4E, 0x13B2, 0x8CC0, 0x4C81, 0x0000, 0x4D81, 0x0002, +0x434E, 0x05CD, 0x407C, 0x000D, 0x1380, 0x2C4A, 0x5318, 0x6309, 0x630A, +0x630B, 0x202C, 0x930A, 0x202A, 0x9309, 0x2028, 0x9038, 0x0028, 0x2C25, +0x935C, 0x23EC, 0x431E, 0x1840, 0x425F, 0x2842, 0x835F, 0x3002, 0x18CF, +0x5E0E, 0x013F, 0x0006, 0x4E0B, 0xE03B, 0x8000, 0x00BB, 0x8000, 0x0BEF, +0x0F71, 0x0006, 0x4E0F, 0xE33F, 0x5F0F, 0x7F0F, 0x5E84, 0x0000, 0x6F84, +0x0002, 0x9E81, 0x0004, 0x2B80, 0x411F, 0x0004, 0x8E0F, 0x4F81, 0x0004, +0x3F7C, 0x9038, 0x0028, 0x23DA, 0x9309, 0x23D8, 0x930A, 0x23D6, 0x930B, +0x23D4, 0x433C, 0x3CE0, 0x9038, 0x0028, 0x200A, 0x9309, 0x2008, 0x930A, +0x2006, 0x930B, 0x2004, 0x4381, 0x0000, 0x4381, 0x0002, 0x0084, 0x2844, +0x412C, 0x411D, 0x0002, 0x407E, 0x0003, 0xF46E, 0x1842, 0x5E4E, 0x13B2, +0x8D1E, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x1840, 0x421F, 0x2842, 0x830F, +0x2405, 0x831F, 0x2409, 0x831F, 0x240D, 0x3C11, 0x002F, 0x2C4E, 0x0F3F, +0x0008, 0x134F, 0x3C0B, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x3C05, +0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x472F, 0xD71F, 0x0002, 0x930F, +0x242D, 0x431E, 0x1840, 0x425F, 0x2842, 0x835F, 0x3002, 0x18CF, 0x5E0E, +0x4E0F, 0xE33F, 0x5F0F, 0x7F0F, 0x5E84, 0x0000, 0x6F84, 0x0002, 0x442F, +0xB03F, 0x0FFF, 0x2019, 0x13B2, 0x8A2C, 0x430F, 0x04CE, 0x422C, 0x430D, +0x063B, 0x0044, 0x134B, 0x4074, 0x0028, 0x435E, 0x05CD, 0x407C, 0x000F, +0x063F, 0x0050, 0x134F, 0x4C48, 0x13B2, 0x8A2C, 0x5374, 0x2402, 0x9318, +0x23F2, 0x53B7, 0x0000, 0x63B7, 0x0002, 0x472F, 0xD71F, 0x0002, 0x930F, +0x2425, 0x4308, 0x4309, 0x430A, 0x430B, 0x4381, 0x0000, 0x4381, 0x0002, +0x0086, 0x2BFA, 0x4105, 0x5305, 0x435E, 0x05CD, 0x407C, 0x000F, 0x063F, +0x0050, 0x134F, 0x5318, 0x6309, 0x630A, 0x630B, 0x2375, 0x930A, 0x2373, +0x9309, 0x2371, 0x9038, 0x0028, 0x2F6E, 0x935C, 0x23EB, 0x3F78, 0x4391, +0x000A, 0x3C46, 0x0086, 0x2BFA, 0x4105, 0x5305, 0x431E, 0x05CD, 0x407C, +0x000C, 0x063F, 0x0040, 0x134F, 0x412C, 0x411D, 0x0002, 0x407E, 0x0003, +0x1840, 0xF25E, 0x2844, 0x1842, 0x5E4E, 0x13B2, 0x8D1E, 0x4C81, 0x0000, +0x4D81, 0x0002, 0x1840, 0x421F, 0x2842, 0x830F, 0x2405, 0x831F, 0x2409, +0x831F, 0x240D, 0x3C11, 0x002F, 0x2C4E, 0x0F3F, 0x0008, 0x134F, 0x3C0B, +0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x3C05, 0x002F, 0x2C4E, 0x0F3F, +0x0014, 0x134F, 0x13B2, 0x8A2C, 0x431E, 0x05CD, 0x426C, 0x063F, 0x0040, +0x134F, 0xC391, 0x0000, 0x430E, 0x05CD, 0x426C, 0x063F, 0x0040, 0x134F, +0x411C, 0x000A, 0x5031, 0x000C, 0x1674, 0x0110, 0x147B, 0x8031, 0x001E, +0x4381, 0x000C, 0x4381, 0x0006, 0x4381, 0x0004, 0x1800, 0x43C1, 0x001A, +0x0086, 0x2C4E, 0x410C, 0x503C, 0x0010, 0x060F, 0x0F3F, 0x002C, 0x134F, +0x410C, 0x503C, 0x000E, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x523C, +0x060F, 0x0F3F, 0x0030, 0x134F, 0x410C, 0x532C, 0x060F, 0x0F3F, 0x002C, +0x134F, 0x410C, 0x503C, 0x000C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x410C, +0x530C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, 0x0006, 0x060F, +0x0F3F, 0x002C, 0x134F, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x002C, 0x134F, +0x4115, 0x0002, 0x008A, 0x2BFA, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, +0x134F, 0x0ACB, 0x00AB, 0x0008, 0x4074, 0x0082, 0x444C, 0x0B0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x440C, 0x080F, 0x134F, +0x4077, 0x00C8, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x1401, 0x080F, 0x134F, +0x444C, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, +0x430D, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4115, 0x000E, 0x4191, 0x0010, 0x0012, 0x4381, +0x0014, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x0500, +0x080F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x411C, 0x0012, 0x411D, +0x0014, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x00A1, +0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0xB0B1, 0x0010, 0x0002, +0x280B, 0x411E, 0x0008, 0x411F, 0x000A, 0x503E, 0xFFFE, 0x633F, 0x4E81, +0x0008, 0x4F81, 0x000A, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0x503E, 0x0080, 0x4E81, 0x0018, 0x4191, +0x0008, 0x0016, 0x4075, 0x0028, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x411C, 0x0018, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x411C, 0x0016, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x4303, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, +0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x9381, 0x0000, 0x2427, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x0401, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x080F, +0x134F, 0xB32C, 0x2828, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x0403, 0x080F, +0x134F, 0x3C20, 0x435C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x0401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x454C, 0x0B0F, +0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0xB32C, 0x2807, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x0403, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x411C, 0x000C, 0x080F, 0x134F, +0x0089, 0x28A0, 0x9381, 0x0004, 0x2434, 0x9389, 0x0010, 0x2412, 0x407C, +0x00F4, 0x0B0F, 0x134F, 0x491C, 0x0012, 0x080F, 0x134F, 0xC91C, 0x0010, +0xD91C, 0x0014, 0x080F, 0x134F, 0x403C, 0x0014, 0x1380, 0x2BAE, 0x492F, +0xD91F, 0x0002, 0x930F, 0x245C, 0x407C, 0x0054, 0x0B0F, 0x134F, 0x491C, +0x0004, 0x491D, 0x0006, 0x0A3F, 0x001C, 0x134F, 0x09CF, 0xC93C, 0xC93D, +0xDF1C, 0x0008, 0xDF1D, 0x000A, 0x0A3F, 0x001C, 0x134F, 0x403C, 0x0014, +0x1380, 0x2BAE, 0x3C42, 0x454C, 0x0B0F, 0x134F, 0x4C47, 0x9389, 0x0010, +0x2412, 0x407C, 0x00F4, 0x0B0F, 0x134F, 0x491C, 0x0012, 0x080F, 0x134F, +0xC91C, 0x0010, 0xD91C, 0x0016, 0x080F, 0x134F, 0x403C, 0x0014, 0x1380, +0x2BAE, 0x492F, 0xD91F, 0x0002, 0x930F, 0x2416, 0x407C, 0x0054, 0x0B0F, +0x134F, 0x491C, 0x0004, 0x491D, 0x0006, 0x0A3F, 0x001C, 0x134F, 0x491C, +0x000C, 0x491D, 0x000E, 0x0A3F, 0x001C, 0x134F, 0x403C, 0x0014, 0x1380, +0x2BAE, 0x9037, 0x0099, 0x200B, 0x407C, 0x00F4, 0x0B0F, 0x134F, 0x430C, +0x080F, 0x134F, 0xF03C, 0xFF7F, 0x080F, 0x134F, 0x410D, 0x503D, 0x0012, +0x403C, 0xAA01, 0x060F, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2404, 0x1800, +0x41D1, 0x0012, 0x001A, 0x013F, 0x001A, 0x03DF, 0x2402, 0x439F, 0x0000, +0x407C, 0x00A8, 0x0B0F, 0x134F, 0x9381, 0x0006, 0x2402, 0x1380, 0x2BA6, +0x430C, 0x5031, 0x001E, 0x1674, 0x0110, 0x147B, 0x8031, 0x0022, 0x4381, +0x001E, 0x4381, 0x0020, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x001A, +0x4381, 0x001C, 0x40B1, 0x0010, 0x0008, 0x4381, 0x000A, 0x4381, 0x000C, +0x4381, 0x0004, 0x3C02, 0x1380, 0x2BFA, 0x9381, 0x000C, 0x2402, 0x0280, +0x13D0, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0012, 0x4381, 0x0014, +0x410C, 0x503C, 0x001E, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x3403, 0x403C, 0xFFC6, 0x3DEF, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x380E, 0x410F, 0x503F, 0x001A, 0x0F71, 0x0016, +0x013C, 0x0016, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, +0x403C, 0xFFC4, 0x3DD5, 0x410C, 0x523C, 0x002F, 0x2C4E, 0x0F3F, 0x0030, +0x134F, 0x4C81, 0x000C, 0x930C, 0x3403, 0x403C, 0xFFC3, 0x3DC7, 0x4124, +0x4115, 0x0002, 0x4116, 0x001A, 0x4117, 0x001C, 0x92A1, 0x001E, 0x202F, +0x9381, 0x0020, 0x202C, 0x42B1, 0x0008, 0x4381, 0x000A, 0x43C1, 0x0006, +0x92F1, 0x0006, 0x2C2B, 0x440C, 0x450D, 0x460E, 0x470F, 0x415B, 0x0006, +0x13B2, 0x978E, 0xF31C, 0x410B, 0x503B, 0x000E, 0x4B38, 0x4B39, 0x4B3A, +0x4B3B, 0x5808, 0x6909, 0x6A0A, 0x6B0B, 0xDC08, 0x4881, 0x000E, 0x4981, +0x0010, 0x4A81, 0x0012, 0x4B81, 0x0014, 0x415E, 0x0006, 0x535E, 0x4EC1, +0x0006, 0x3FDA, 0x4481, 0x000E, 0x4581, 0x0010, 0x4681, 0x0012, 0x4781, +0x0014, 0x411E, 0x001E, 0x411F, 0x0020, 0x930F, 0x2179, 0x903E, 0x0014, +0x2D76, 0x065E, 0x1900, 0x4E50, 0x10E2, 0x0FBE, 0x0002, 0x1138, 0x0002, +0x1138, 0x0002, 0x114E, 0x0002, 0x1164, 0x0002, 0x11B0, 0x0002, 0x1282, +0x0002, 0x1298, 0x0002, 0x12AA, 0x0002, 0x12E4, 0x0002, 0x131A, 0x0002, +0x1338, 0x0002, 0x1140, 0x0002, 0x1132, 0x0002, 0x118A, 0x0002, 0x1348, +0x0002, 0x1368, 0x0002, 0x138A, 0x0002, 0x1148, 0x0002, 0x12DC, 0x0002, +0x1380, 0x2BFE, 0x3F45, 0x444C, 0x1380, 0x2BA2, 0x3F41, 0x431C, 0x1380, +0x2BCE, 0x3F3D, 0x1380, 0x2BF2, 0x3F3A, 0x1380, 0x2BA6, 0x412F, 0xD11F, +0x0002, 0x930F, 0x2733, 0x430C, 0x1380, 0x2B8E, 0x3F2F, 0x415C, 0x000E, +0x1380, 0x2C02, 0x4C4C, 0x430D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, +0x430C, 0x430D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x3F1C, 0x415C, +0x000E, 0x1380, 0x2C06, 0x4C4C, 0x430D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, +0x134F, 0x430C, 0x430D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x3F09, +0x411E, 0x0008, 0x411F, 0x000A, 0x830F, 0x2060, 0x823E, 0x240E, 0x823E, +0x2423, 0x822E, 0x242A, 0x803E, 0x000C, 0x2434, 0x803E, 0x0003, 0x244A, +0x803E, 0x001D, 0x2439, 0x3C50, 0x415C, 0x000E, 0x1380, 0x2C0A, 0x4C48, +0x4309, 0x430A, 0x430B, 0x480C, 0x490D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, +0x134F, 0x4A0C, 0x4B0D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x3EDC, +0x411C, 0x000E, 0x1380, 0x2C0E, 0x4C08, 0x4309, 0x430A, 0x430B, 0x3FE8, +0x411C, 0x000E, 0x411D, 0x0010, 0xF03D, 0x000F, 0x1380, 0x2C12, 0x4C08, +0x4D09, 0x430A, 0x430B, 0x3FDB, 0x411C, 0x000E, 0x411D, 0x0010, 0x1380, +0x2C16, 0x4C08, 0x4D09, 0x430A, 0x430B, 0x3FD0, 0x410F, 0x503F, 0x000E, +0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x1380, 0x2C1E, 0x4C08, 0x4D09, 0x4E0A, +0x4F0B, 0x3FC2, 0x410C, 0x503C, 0x000E, 0x1380, 0x2C1A, 0x4C08, 0x4D09, +0x4E0A, 0x4F0B, 0x3FB8, 0x403C, 0xFFC2, 0x3CA9, 0x407C, 0x0054, 0x1380, +0x2C02, 0x411C, 0x000E, 0x411D, 0x0010, 0x1380, 0x2C16, 0x3E95, 0x407C, +0x00F4, 0x1380, 0x2C02, 0x411C, 0x000E, 0x1380, 0x2C0E, 0x3E8C, 0x407C, +0x0046, 0x1380, 0x2C02, 0x430C, 0x430D, 0x430E, 0x430F, 0x1380, 0x2C1E, +0x4E0A, 0x4F0B, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x4A0C, 0x4B0D, +0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x3E73, 0x444C, 0x1380, 0x2C2A, +0x3E6F, 0x90B1, 0x0010, 0x0008, 0x2007, 0x9381, 0x000A, 0x2004, 0x440C, +0x13B2, 0x832A, 0x3C0B, 0x90B1, 0x0020, 0x0008, 0x2009, 0x9381, 0x000A, +0x2006, 0x450D, 0x440C, 0x13B2, 0x7E8C, 0x935C, 0x2257, 0x403C, 0xFFCF, +0x3C5D, 0x13B2, 0x93B0, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x430C, +0x430D, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x3E45, 0x440C, 0x1380, +0x2B9A, 0x008C, 0x2BFA, 0x13B0, 0x1880, 0x3E3D, 0x411E, 0x0008, 0x013D, +0x0016, 0x444C, 0x1380, 0x2C3A, 0x931C, 0x3403, 0x403F, 0xFFBA, 0x3C01, +0x430F, 0x4F81, 0x0004, 0x3C24, 0x411F, 0x0008, 0x013E, 0x0016, 0x440C, +0x450D, 0x1380, 0x2C3E, 0x931C, 0x3403, 0x403F, 0xFFBA, 0x3C01, 0x430F, +0x4F81, 0x0004, 0x3C13, 0x1211, 0x000A, 0x013D, 0x0018, 0x440E, 0x450F, +0x411C, 0x000C, 0x1380, 0x2C42, 0x5321, 0x931C, 0x3403, 0x403F, 0xFFBA, +0x3C01, 0x430F, 0x4F81, 0x0004, 0x411C, 0x001A, 0x411D, 0x001C, 0x002F, +0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x0280, 0x0FC2, 0x40B1, 0xFFC5, 0x0004, +0x0280, 0x0FC2, 0x411C, 0x0004, 0x5031, 0x0022, 0x1674, 0x0110, 0x147B, +0x8031, 0x0020, 0x1800, 0x43C1, 0x0014, 0x008A, 0x2C4E, 0x410C, 0x503C, +0x000C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE8, +0x3DE7, 0x410C, 0x503C, 0x000A, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFE7, 0x3DDB, 0x410C, 0x503C, 0x001C, 0x0A0F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3DCF, 0x410C, 0x523C, +0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE5, 0x3DC4, +0x410C, 0x503C, 0x0006, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, +0x403C, 0xFFE4, 0x3DB8, 0x410C, 0x522C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2403, 0x403C, 0xFFE3, 0x3DAD, 0x410C, 0x532C, 0x0A0F, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2002, 0x4381, 0x0002, 0x432C, 0x0A0F, 0x0F3F, +0x0038, 0x134F, 0x4115, 0x0008, 0x0086, 0x2BFA, 0x06CB, 0x00AB, 0x0008, +0x4077, 0x00C8, 0x474C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, +0x3401, 0x080F, 0x134F, 0x4074, 0x0082, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x4032, 0x080F, 0x134F, 0x06C9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4191, +0x000A, 0x0000, 0x4115, 0x000C, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0048, 0x0B0F, 0x134F, 0x427C, 0x063F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0B0F, +0x134F, 0x412C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x4075, +0x0021, 0x454C, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4116, 0x001C, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x460C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0012, 0x4076, 0x0090, 0x464C, +0x0B0F, 0x134F, 0x403C, 0x0003, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x000E, 0x403C, 0x000B, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0010, 0x403C, 0x0013, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C07, 0x4781, 0x0012, 0x432C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, +0x403C, 0x000A, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x403C, 0x0012, +0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x432C, 0x080F, 0x134F, 0x411C, +0x000E, 0x080F, 0x134F, 0x403C, 0x000A, 0x080F, 0x134F, 0x411C, 0x0010, +0x080F, 0x134F, 0x403C, 0x0012, 0x080F, 0x134F, 0x470C, 0x080F, 0x134F, +0x0087, 0x28B8, 0x472F, 0xD71F, 0x0002, 0x930F, 0x241B, 0x9387, 0x0004, +0x2418, 0x464C, 0x0B0F, 0x134F, 0x403C, 0x0089, 0x080F, 0x134F, 0x430C, +0x080F, 0x134F, 0x4C81, 0x0000, 0x464C, 0x0B0F, 0x134F, 0x403C, 0x0088, +0x080F, 0x134F, 0x412C, 0xF03C, 0xFFEF, 0x080F, 0x134F, 0x93A7, 0x0000, +0x200D, 0x9387, 0x0002, 0x200A, 0x464C, 0x0B0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x403C, 0x000F, 0x080F, 0x134F, 0x90B7, 0x0003, 0x0000, 0x200C, +0x9387, 0x0002, 0x2009, 0x464C, 0x0B0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x423C, 0x080F, 0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x411C, 0x0006, +0x080F, 0x134F, 0x9381, 0x0004, 0x2411, 0x444C, 0x0B0F, 0x134F, 0x411C, +0x0004, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x3C03, 0x454C, 0x0B0F, 0x134F, 0x410D, 0x503D, +0x0018, 0x403C, 0xAA01, 0x0A0F, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2404, +0x1800, 0x41D1, 0x0018, 0x0014, 0x013F, 0x0014, 0x03DF, 0x2402, 0x439F, +0x0000, 0x407C, 0x00A8, 0x0B0F, 0x134F, 0x9381, 0x0002, 0x2402, 0x1380, +0x2BA6, 0x430C, 0x5031, 0x0020, 0x1674, 0x0110, 0x147B, 0x8321, 0x0CCA, +0x4C25, 0x0086, 0x2BFA, 0x06CB, 0x00AB, 0x0008, 0x4074, 0x00C8, 0x444C, +0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, 0x134F, +0x4079, 0x0082, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4035, 0x080F, 0x134F, +0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x4077, 0x0042, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x4035, 0x2401, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0002, 0x0000, 0x444C, 0x0B0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, +0x4036, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x4A91, 0x0004, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4039, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0006, +0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x4038, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0008, 0x0000, 0x444C, 0x0B0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, +0x403A, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x4A91, 0x000A, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x403B, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A1A, 0x000C, +0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x403C, 0x403C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x4A0C, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x5321, 0x1674, 0x0110, 0x147B, 0x8321, 0x0CCA, +0x4C25, 0x0086, 0x2BFA, 0x06CB, 0x00AB, 0x0008, 0x4074, 0x00C8, 0x444C, +0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, 0x134F, +0x4079, 0x0082, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4035, 0x080F, 0x134F, +0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x4077, 0x0042, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x4035, 0x2401, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0002, 0x0000, 0x444C, 0x0B0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, +0x4036, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x4A91, 0x0004, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4039, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0006, +0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x4038, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0008, 0x0000, 0x444C, 0x0B0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, +0x403A, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x4A91, 0x000A, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x403B, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A1A, 0x000C, +0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x403C, 0x403C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x4A0C, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x5321, 0x1674, 0x0110, 0x147B, 0x8231, 0x4C07, +0x4304, 0x0086, 0x2C4E, 0xB31C, 0x2892, 0x0088, 0x286A, 0x08CC, 0x060F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3DC0, 0x008C, +0x2866, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFFA, +0x3DB5, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0028, 0x0B0F, +0x134F, 0x4C4C, 0x1840, 0x4C82, 0x2872, 0x482E, 0x481F, 0x0002, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0x4E05, 0xF035, 0x0F00, 0x5035, 0x0080, 0x1840, +0x4582, 0x286E, 0x48A8, 0x0000, 0x4388, 0x0002, 0x1840, 0x48A1, 0x0002, +0x407C, 0x0028, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x430C, 0x080F, +0x134F, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x450C, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x411C, 0x0002, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x403C, 0x4303, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0500, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x407C, 0x00C2, 0x0B0F, 0x134F, 0xB327, 0x2C0A, +0x407C, 0x0091, 0x060F, 0x0F3F, 0x0024, 0x134F, 0x060F, 0x0F3F, 0x0004, +0x134F, 0x410D, 0x530D, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x0034, 0x134F, +0x3C1B, 0x008A, 0x2BFA, 0x435C, 0x0A3F, 0x0030, 0x134F, 0x013F, 0x0004, +0x1800, 0x53E1, 0x0004, 0x4F2C, 0x0A3F, 0x0014, 0x134F, 0x412F, 0x832F, +0x4F81, 0x0000, 0x434C, 0x0A3F, 0x0030, 0x134F, 0x53BB, 0x0000, 0x63BB, +0x0002, 0x008B, 0x2866, 0x4B2F, 0xDB1F, 0x0002, 0x930F, 0x2403, 0x9381, +0x0000, 0x23DB, 0xB327, 0x287C, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, 0x0501, +0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x1840, +0x421F, 0x2872, 0x903F, 0x0091, 0x2406, 0x903F, 0x0099, 0x2403, 0x903F, +0x0098, 0x2052, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x422C, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x1840, 0x421C, 0x2870, 0x060F, 0x0F3F, 0x0010, +0x134F, 0x3C81, 0x4B3F, 0xDB3F, 0x930F, 0x2407, 0x407C, 0x0091, 0x060F, +0x0F3F, 0x0024, 0x134F, 0x3C76, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, 0x0501, +0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x1840, +0x421F, 0x2872, 0x903F, 0x0091, 0x2406, 0x903F, 0x0099, 0x2403, 0x903F, +0x0098, 0x2052, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x422C, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x4034, 0xFFF6, 0x440C, 0x5231, 0x1674, 0x0110, +0x147B, 0x8031, 0x001A, 0x1800, 0x43C1, 0x000E, 0x0086, 0x2C4E, 0x410C, +0x503C, 0x000A, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFE8, 0x3D8D, 0x410C, 0x523C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFE7, 0x3D82, 0x410C, 0x503C, 0x0016, 0x060F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3D76, 0x410C, 0x503C, +0x0006, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE5, +0x3D6A, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, +0x403C, 0xFFE4, 0x3D5F, 0x410C, 0x532C, 0x060F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2403, 0x403C, 0xFFE3, 0x3D54, 0x410C, 0x530C, 0x060F, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2002, 0x4381, 0x0000, 0x432C, 0x060F, 0x0F3F, +0x0038, 0x134F, 0x4114, 0x0006, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, +0x407C, 0x0088, 0x0B0F, 0x134F, 0x0AC7, 0x00A7, 0x0010, 0x407C, 0x0034, +0x070F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0030, +0x435C, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0014, 0x403C, 0x0082, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x440C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4191, 0x0008, 0x000C, 0x4114, 0x000A, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x090F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0B0F, +0x134F, 0x427C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x440C, +0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, 0x411C, +0x000C, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4114, 0x0016, 0x4115, +0x0018, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, 0x070F, 0x134F, +0x407C, 0x0082, 0x0B0F, 0x134F, 0x440C, 0x450F, 0x108C, 0x108F, 0xEF4C, +0xEF0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x440C, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x070F, +0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x93A2, 0x28B8, 0x2014, 0x1840, +0x9382, 0x28BA, 0x2010, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x403C, 0x0082, +0x430D, 0x0A3F, 0x001C, 0x134F, 0x403C, 0x000F, 0x430D, 0x0A3F, 0x001C, +0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x090F, 0x134F, +0x9381, 0x0002, 0x2413, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x411C, 0x0002, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x3C04, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x410D, +0x503D, 0x0012, 0x403C, 0xAA01, 0x060F, 0x0F3F, 0x0058, 0x134F, 0x930C, +0x2404, 0x1800, 0x41D1, 0x0012, 0x000E, 0x013F, 0x000E, 0x03DF, 0x2402, +0x439F, 0x0000, 0x407C, 0x00A8, 0x0B0F, 0x134F, 0x9381, 0x0000, 0x2402, +0x1380, 0x2BA6, 0x430C, 0x5031, 0x001A, 0x1674, 0x0110, 0x147B, 0x0CC5, +0x4C2A, 0x4C1B, 0x0002, 0x0084, 0x2BFA, 0x04C8, 0x00A8, 0x0030, 0x434C, +0x080F, 0x134F, 0x04C9, 0x00A9, 0x0008, 0x407C, 0x0082, 0x090F, 0x134F, +0x435C, 0x080F, 0x134F, 0x04C6, 0x00A6, 0x0014, 0x4A0C, 0x4B0F, 0x108C, +0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, 0x503C, 0x0085, 0x060F, 0x134F, +0x4077, 0x00C8, 0x474C, 0x090F, 0x134F, 0x403C, 0x1401, 0x060F, 0x134F, +0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, +0x00A4, 0x0018, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x451A, 0x0004, 0x451B, 0x0006, +0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, +0x503C, 0x0086, 0x060F, 0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x1401, +0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, +0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x451A, 0x0008, 0x451B, 0x000A, +0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, +0x503C, 0x0089, 0x060F, 0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x1401, +0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, +0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x451A, 0x000C, 0x451B, 0x000E, +0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x435C, 0x080F, +0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, +0x503C, 0x0088, 0x060F, 0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x1401, +0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, +0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1674, 0x0110, 0x147B, 0x8031, +0x0024, 0x028F, 0x9A4A, 0x1840, 0x4FF1, 0x000C, 0x1840, 0x4FF1, 0x000D, +0x1840, 0x4FF1, 0x000E, 0x1840, 0x4FF1, 0x000F, 0x008A, 0x2BFA, 0x0ACC, +0x13B0, 0x1880, 0x0086, 0x2C4E, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x2403, 0x403C, 0xFFDD, 0x3D36, 0x410C, 0x523C, 0x060F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFDC, 0x3D2B, 0x4104, +0x5034, 0x0010, 0x1404, 0x430F, 0x434E, 0x422D, 0x410C, 0x503C, 0x0010, +0x060B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2932, 0x134F, +0x4C0B, 0x04CC, 0x060F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x930B, 0x3402, +0x4B0C, 0x3D0D, 0x4307, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0048, 0x0B0F, +0x134F, 0x435C, 0x0A3F, 0x0010, 0x134F, 0x0AC8, 0x00A8, 0x0030, 0x435C, +0x080F, 0x134F, 0x3C07, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x5317, 0x0AC9, 0x00A9, 0x0014, 0x9037, 0x000A, 0x2C11, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, +0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E2, 0x4077, 0x0082, 0x1840, +0x9382, 0x2B68, 0x2458, 0x4125, 0x8225, 0x407C, 0x00C8, 0x0B0F, 0x134F, +0x403C, 0x3401, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x4030, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x41A1, +0x0004, 0x4191, 0x0002, 0x0006, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x3FFF, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, +0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x832C, 0x090F, 0x134F, +0x3C30, 0x41A1, 0x0004, 0x4191, 0x0002, 0x0006, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x4030, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0004, 0x832C, 0x090F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x407C, 0x0022, 0x0B0F, 0x134F, 0x411C, +0x0008, 0x411D, 0x000A, 0x0A3F, 0x0034, 0x134F, 0x407C, 0x0062, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x060F, 0x0F3F, 0x0010, 0x134F, 0x435C, +0x080F, 0x134F, 0x1840, 0x9382, 0x2B68, 0x2419, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0028, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x1404, 0x430F, 0x434E, 0x422D, 0x410C, +0x503C, 0x0010, 0x060B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, +0x2932, 0x134F, 0x4C0B, 0x04CC, 0x060F, 0x0F3F, 0x0020, 0x134F, 0x4B0C, +0x5221, 0x5031, 0x0024, 0x1674, 0x0110, 0x147B, 0x8031, 0x003E, 0x430A, +0x4307, 0x4305, 0x3C08, 0x410C, 0x503C, 0x0018, 0x5A0C, 0x0F3F, 0x0028, +0x134F, 0x531A, 0x0089, 0x2C4E, 0x090F, 0x903A, 0x0012, 0x2BF2, 0x432C, +0x0F3F, 0x0038, 0x134F, 0x430A, 0x3C08, 0x410C, 0x530C, 0x5A0C, 0x090F, +0x0F3F, 0x0028, 0x134F, 0x531A, 0x922A, 0x2BF6, 0x0086, 0x2BFA, 0x06C8, +0x00A8, 0x0008, 0xB0F1, 0x0010, 0x0020, 0x280C, 0x4227, 0x407C, 0x0028, +0x080F, 0x134F, 0x430C, 0x063F, 0x0014, 0x134F, 0xB22C, 0x2C01, 0x4315, +0x407C, 0x00B0, 0x080F, 0x134F, 0x06CB, 0x00AB, 0x001C, 0x403C, 0x0003, +0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, 0x134F, 0x4C81, 0x0014, +0x4D81, 0x0016, 0x403C, 0x0005, 0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, +0x0B0F, 0x134F, 0x4C81, 0x0010, 0x4D81, 0x0012, 0x403C, 0x0007, 0x430D, +0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, 0x134F, 0x4C81, 0x000C, 0x4D81, +0x000E, 0x403C, 0x0081, 0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, +0x134F, 0x4C81, 0x0008, 0x4D81, 0x000A, 0x431C, 0x430D, 0x0B0F, 0x134F, +0x430C, 0x430D, 0x0B0F, 0x134F, 0x4C81, 0x0004, 0x4D81, 0x0006, 0x407C, +0x00B0, 0x080F, 0x134F, 0x432C, 0x430D, 0x0B0F, 0x134F, 0x470C, 0x430D, +0x0B0F, 0x134F, 0x422C, 0x430D, 0x0B0F, 0x134F, 0x433C, 0x433D, 0x0B0F, +0x134F, 0x403C, 0x0006, 0x430D, 0x0B0F, 0x134F, 0x431C, 0x430D, 0x0B0F, +0x134F, 0x403C, 0x0080, 0x430D, 0x0B0F, 0x134F, 0x431C, 0x430D, 0x0B0F, +0x134F, 0x4107, 0x5037, 0x002A, 0x1407, 0x430F, 0x434E, 0x403D, 0x0012, +0x410C, 0x503C, 0x001C, 0x0904, 0x0434, 0x001C, 0x1344, 0x403C, 0x0003, +0x002F, 0x29BC, 0x134F, 0x4C04, 0x07CC, 0x090F, 0x0F3F, 0x0020, 0x134F, +0x5221, 0x9304, 0x206E, 0x3C09, 0x4305, 0x407C, 0x0021, 0x080F, 0x134F, +0x407C, 0x00A8, 0x080F, 0x134F, 0x407C, 0x00D0, 0x080F, 0x134F, 0x531A, +0x430C, 0x063F, 0x0014, 0x134F, 0x934C, 0x3803, 0x903A, 0x0064, 0x2BF6, +0x903A, 0x0064, 0x2803, 0x403C, 0xFFCC, 0x3C51, 0x9305, 0x23E1, 0x407C, +0x00B0, 0x080F, 0x134F, 0x432C, 0x430D, 0x0B0F, 0x134F, 0x411C, 0x0014, +0x411D, 0x0016, 0x0B0F, 0x134F, 0x422C, 0x430D, 0x0B0F, 0x134F, 0x411C, +0x0010, 0x411D, 0x0012, 0x0B0F, 0x134F, 0x403C, 0x0006, 0x430D, 0x0B0F, +0x134F, 0x411C, 0x000C, 0x411D, 0x000E, 0x0B0F, 0x134F, 0x403C, 0x0080, +0x430D, 0x0B0F, 0x134F, 0x411C, 0x0008, 0x411D, 0x000A, 0x0B0F, 0x134F, +0x430C, 0x430D, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, 0x0B0F, +0x134F, 0x1407, 0x430F, 0x435E, 0x422D, 0x410C, 0x522C, 0x090B, 0x0B3B, +0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x29B6, 0x134F, 0x4C04, 0x07CC, +0x090F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x440C, 0x5031, 0x003E, 0x1674, +0x0110, 0x147B, 0x8031, 0x0062, 0x4334, 0x430A, 0x410C, 0x503C, 0x001C, +0x028E, 0x9A77, 0x008D, 0x001F, 0x13B2, 0x98A8, 0x4381, 0x0000, 0x3C08, +0x410C, 0x503C, 0x003C, 0x5A0C, 0x0F3F, 0x0028, 0x134F, 0x531A, 0x008B, +0x2C4E, 0x0B0F, 0x903A, 0x0012, 0x2BF2, 0x410C, 0x530C, 0x0F3F, 0x002C, +0x134F, 0x430A, 0x3C08, 0x410C, 0x532C, 0x5A0C, 0x0B0F, 0x0F3F, 0x0028, +0x134F, 0x531A, 0x922A, 0x2BF6, 0x4108, 0x5038, 0x004E, 0x0086, 0x28C4, +0x4037, 0x0003, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2819, +0x1408, 0x403F, 0x0016, 0x410E, 0x503E, 0x000A, 0x403D, 0x001F, 0x410C, +0x503C, 0x0020, 0x0B09, 0x0939, 0x001C, 0x1349, 0x470C, 0x063F, 0x0182, +0x134F, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x1408, 0x430F, +0x434E, 0x403D, 0x0012, 0x410C, 0x503C, 0x0040, 0x0B09, 0x0939, 0x001C, +0x1349, 0x470C, 0x063F, 0x016A, 0x134F, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, +0x134F, 0x0089, 0x2BFA, 0x407C, 0x0046, 0x093F, 0x0008, 0x134F, 0x430C, +0x430D, 0x430E, 0x430F, 0x0935, 0x0024, 0x1345, 0x5221, 0xB03F, 0x4000, +0x2802, 0x430C, 0x3CAB, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, +0x288D, 0x407C, 0x0046, 0x093F, 0x0008, 0x134F, 0x531A, 0x430C, 0x430D, +0x430E, 0x430F, 0x0935, 0x0024, 0x1345, 0xB03F, 0x0400, 0x2C03, 0x903A, +0x01F4, 0x2BF2, 0x903A, 0x01F4, 0x2C8D, 0x1408, 0x430F, 0x435E, 0x422D, +0x410C, 0x503C, 0x0006, 0x0B0A, 0x0A3A, 0x001C, 0x134A, 0x470C, 0x063F, +0x0164, 0x134F, 0x4C04, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, 0x134F, 0x40F1, +0x0005, 0x0020, 0x43C1, 0x0021, 0x41D1, 0x000A, 0x0022, 0x41D1, 0x000B, +0x0023, 0x41D1, 0x000C, 0x0024, 0x41D1, 0x000D, 0x0025, 0x43E1, 0x0026, +0x41D1, 0x000E, 0x0027, 0x41D1, 0x000F, 0x0028, 0x41D1, 0x0010, 0x0029, +0x41D1, 0x0011, 0x002A, 0x42E1, 0x002B, 0x41D1, 0x0012, 0x002C, 0x41D1, +0x0013, 0x002D, 0x41D1, 0x0014, 0x002E, 0x41D1, 0x0015, 0x002F, 0x40F1, +0x0006, 0x0030, 0x41D1, 0x0016, 0x0031, 0x41D1, 0x0017, 0x0032, 0x41D1, +0x0018, 0x0033, 0x41D1, 0x0019, 0x0034, 0x40F1, 0x0080, 0x0035, 0x41D1, +0x001A, 0x0036, 0x41D1, 0x001B, 0x0037, 0x41D1, 0x001C, 0x0038, 0x41D1, +0x001D, 0x0039, 0x1408, 0x430F, 0x434E, 0x403D, 0x001F, 0x410C, 0x503C, +0x0024, 0x0B0A, 0x0A3A, 0x001C, 0x134A, 0x470C, 0x063F, 0x0182, 0x134F, +0x08CC, 0x0B0F, 0x0F3F, 0x0020, 0x134F, 0x5231, 0x3C16, 0x1408, 0x430F, +0x435E, 0x422D, 0x410C, 0x503C, 0x0006, 0x0B0A, 0x0A3A, 0x001C, 0x134A, +0x470C, 0x063F, 0x0164, 0x134F, 0x4C04, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, +0x134F, 0x5221, 0x440C, 0x5031, 0x0062, 0x1674, 0x0110, 0x147B, 0x8031, +0x000C, 0x0086, 0x2BFA, 0x06CA, 0x00AA, 0x0008, 0x407C, 0x0028, 0x0A0F, +0x134F, 0x4C4C, 0x4C81, 0x0000, 0x4319, 0x3CC4, 0x411C, 0x0006, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x9387, 0x0000, 0x2407, 0x444C, +0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0004, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, +0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x9387, 0x0000, 0x2007, 0x444C, 0x0A0F, 0x134F, 0x403C, +0x0501, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0004, 0x411F, 0x0002, 0x4E81, +0x0008, 0x4F81, 0x000A, 0x403D, 0x0003, 0x410C, 0x523C, 0x002F, 0x2C4E, +0x0F3F, 0x000C, 0x134F, 0x90B1, 0x0091, 0x0000, 0x2408, 0x90B1, 0x0099, +0x0000, 0x2404, 0x90B1, 0x0098, 0x0000, 0x204E, 0x407C, 0x0028, 0x0A0F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0080, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x403C, 0x1400, 0x0B0F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x422C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x403C, 0x4303, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x430C, 0x430D, 0x063F, 0x0018, 0x134F, 0x444C, 0x0A0F, +0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x5319, 0x9039, 0x0010, 0x2C48, 0x9329, 0x2001, +0x4229, 0x4947, 0x1087, 0xF037, 0x0F00, 0x5037, 0x0060, 0x407C, 0x0028, +0x0A0F, 0x134F, 0x4C4C, 0x903C, 0x0098, 0x2403, 0x403F, 0x018C, 0x3C02, +0x403F, 0x014C, 0x4F81, 0x0006, 0x06C8, 0x00A8, 0x0030, 0x434C, 0x080F, +0x134F, 0x4075, 0x0082, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x06CB, 0x00AB, 0x0014, 0x470C, 0x0B0F, 0x134F, 0x4074, 0x00C8, 0x444C, +0x0A0F, 0x134F, 0x403C, 0x1401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x0087, 0x2B66, 0x9387, +0x0000, 0x26F6, 0x403C, 0x0FF6, 0x0B0F, 0x134F, 0x3EF5, 0x13B2, 0x93B0, +0x4C81, 0x0008, 0x4D81, 0x000A, 0x430C, 0x5031, 0x000C, 0x1674, 0x0110, +0x147B, 0x8031, 0x0062, 0x4336, 0x4309, 0x410C, 0x503C, 0x001C, 0x028E, +0x9A96, 0x008D, 0x001F, 0x13B2, 0x98A8, 0x4381, 0x0000, 0x3C08, 0x410C, +0x503C, 0x003C, 0x590C, 0x0F3F, 0x0028, 0x134F, 0x5319, 0x008A, 0x2C4E, +0x0A0F, 0x9039, 0x0012, 0x2BF2, 0x410C, 0x530C, 0x0F3F, 0x002C, 0x134F, +0x4309, 0x3C08, 0x410C, 0x532C, 0x590C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, +0x5319, 0x9229, 0x2BF6, 0x410B, 0x503B, 0x004E, 0x0088, 0x28C4, 0x4037, +0x0003, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2819, 0x140B, +0x403F, 0x0016, 0x410E, 0x503E, 0x000A, 0x403D, 0x001F, 0x410C, 0x503C, +0x0020, 0x0A04, 0x0434, 0x001C, 0x1344, 0x470C, 0x083F, 0x0182, 0x134F, +0x0BCC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x140B, 0x430F, 0x434E, +0x403D, 0x0012, 0x410C, 0x503C, 0x0040, 0x0A04, 0x0434, 0x001C, 0x1344, +0x470C, 0x083F, 0x016A, 0x134F, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, +0x5221, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2887, 0x407C, +0x00D0, 0x1380, 0x2C02, 0x5319, 0x430C, 0x1380, 0x2C0E, 0x934C, 0x3803, +0x9039, 0x01F4, 0x2BF7, 0x9039, 0x01F4, 0x2C99, 0x140B, 0x430F, 0x435E, +0x422D, 0x410C, 0x503C, 0x0006, 0x0A09, 0x0939, 0x001C, 0x1349, 0x470C, +0x083F, 0x0164, 0x134F, 0x4C06, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, +0x40F1, 0x0005, 0x0020, 0x43C1, 0x0021, 0x41D1, 0x000A, 0x0022, 0x41D1, +0x000B, 0x0023, 0x41D1, 0x000C, 0x0024, 0x41D1, 0x000D, 0x0025, 0x43E1, +0x0026, 0x41D1, 0x000E, 0x0027, 0x41D1, 0x000F, 0x0028, 0x41D1, 0x0010, +0x0029, 0x41D1, 0x0011, 0x002A, 0x42E1, 0x002B, 0x41D1, 0x0012, 0x002C, +0x41D1, 0x0013, 0x002D, 0x41D1, 0x0014, 0x002E, 0x41D1, 0x0015, 0x002F, +0x40F1, 0x0006, 0x0030, 0x41D1, 0x0016, 0x0031, 0x41D1, 0x0017, 0x0032, +0x41D1, 0x0018, 0x0033, 0x41D1, 0x0019, 0x0034, 0x40F1, 0x0080, 0x0035, +0x41D1, 0x001A, 0x0036, 0x41D1, 0x001B, 0x0037, 0x41D1, 0x001C, 0x0038, +0x41D1, 0x001D, 0x0039, 0x140B, 0x430F, 0x434E, 0x403D, 0x001F, 0x410C, +0x503C, 0x0024, 0x0A09, 0x0939, 0x001C, 0x1349, 0x470C, 0x083F, 0x0182, +0x134F, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5231, 0x3C22, 0x407C, +0x0028, 0x1380, 0x2C02, 0x4C4C, 0x430D, 0x13B2, 0x9142, 0x930C, 0x2417, +0x140B, 0x430F, 0x435E, 0x422D, 0x410C, 0x503C, 0x0006, 0x0A09, 0x0939, +0x001C, 0x1349, 0x470C, 0x083F, 0x0164, 0x134F, 0x4C06, 0x0BCC, 0x0A0F, +0x0F3F, 0x0020, 0x134F, 0x5221, 0x3C01, 0x4306, 0x460C, 0x5031, 0x0062, +0x1674, 0x0110, 0x147B, 0x8031, 0x000C, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, +0x0008, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x4C47, 0x0084, 0x2C4E, 0x410C, +0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x410C, 0x523C, 0x040F, 0x0F3F, +0x0030, 0x134F, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x9037, +0x0091, 0x2406, 0x9037, 0x0099, 0x2403, 0x9037, 0x0098, 0x2004, 0x42A1, +0x0000, 0x4381, 0x0002, 0x4116, 0x0004, 0x4117, 0x0006, 0x1086, 0x1087, +0xE746, 0xE706, 0xF036, 0x0F00, 0x5036, 0x0080, 0x4117, 0x0004, 0x407C, +0x0028, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x430C, 0x080F, 0x134F, +0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x460C, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, +0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x470C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x403C, 0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x4075, +0x0021, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x407C, 0x00C2, 0x0B0F, 0x134F, +0x4306, 0x4307, 0x3C0F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, 0x5316, 0x6307, +0x9117, 0x000A, 0x2BEE, 0x2003, 0x9116, 0x0008, 0x2BEA, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0x4E06, 0xF036, 0x0F00, 0x5036, 0x0080, 0x4127, +0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x460C, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, +0x403C, 0x1400, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x470C, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x4303, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, +0x0018, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, +0x134F, 0x435C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x5031, +0x000C, 0x1674, 0x0110, 0x143B, 0x0CCA, 0x4D49, 0x415B, 0x0014, 0x13B2, +0x8B18, 0x0088, 0x2C52, 0x403E, 0x0018, 0x430F, 0x008D, 0x1904, 0x08CC, +0x13B2, 0x9766, 0x0A60, 0x2C4E, 0x13B2, 0x9374, 0x40B8, 0x8B00, 0x0012, +0x4398, 0x0014, 0x1840, 0x90B2, 0xF00D, 0x18FC, 0x2029, 0x1840, 0x90B2, +0xF00D, 0x18FE, 0x2024, 0x1840, 0x93B2, 0x18F8, 0x2420, 0x9349, 0x241E, +0x008A, 0x2B8A, 0x0ACC, 0x13B0, 0x18A0, 0x1840, 0x4298, 0x18F6, 0x000E, +0x1840, 0x4298, 0x18F4, 0x0016, 0x0A3F, 0x005C, 0x134F, 0x4C88, 0x0010, +0x934B, 0x24C6, 0x403C, 0x0CE4, 0x0A3F, 0x0004, 0x134F, 0x431C, 0x0A3F, +0x0008, 0x134F, 0x3CBC, 0x4388, 0x000E, 0x4388, 0x0010, 0x008A, 0x2B8A, +0x1900, 0x40FA, 0x99AE, 0x0000, 0x1900, 0x40FA, 0x99AA, 0x0004, 0x1900, +0x40FA, 0x9996, 0x000C, 0x1900, 0x40FA, 0x9992, 0x0010, 0x1900, 0x40FA, +0x99EC, 0x0014, 0x1900, 0x40FA, 0x9986, 0x0018, 0x1900, 0x40FA, 0x996A, +0x001C, 0x1900, 0x40FA, 0x99D6, 0x0020, 0x1900, 0x40FA, 0x99D6, 0x0024, +0x1900, 0x40FA, 0x996E, 0x0028, 0x1900, 0x40FA, 0x99E8, 0x002C, 0x1900, +0x40FA, 0x99E6, 0x0030, 0x1900, 0x40FA, 0x99E4, 0x0034, 0x1900, 0x40FA, +0x99E2, 0x0048, 0x1900, 0x40FA, 0x99E0, 0x0050, 0x1900, 0x40FA, 0x99DE, +0x004C, 0x1900, 0x40FA, 0x99DC, 0x0038, 0x1900, 0x40FA, 0x99DA, 0x003C, +0x1900, 0x40FA, 0x99D8, 0x0040, 0x1900, 0x40FA, 0x9966, 0x0054, 0x1900, +0x40FA, 0x99C6, 0x005C, 0x1900, 0x40FA, 0x99D0, 0x0044, 0x1900, 0x40FA, +0x99EA, 0x0008, 0x1900, 0x40FA, 0x99CA, 0x0058, 0x1900, 0x40FA, 0x9966, +0x0054, 0x1900, 0x40FA, 0x99CE, 0x0060, 0x1900, 0x40FA, 0x99CC, 0x0064, +0x008F, 0x2BFA, 0x1900, 0x40FF, 0x9972, 0x0000, 0x1900, 0x40FF, 0x9976, +0x0004, 0x1900, 0x40FF, 0x997A, 0x0008, 0x1900, 0x40FF, 0x997E, 0x0010, +0x1900, 0x40FF, 0x9982, 0x0014, 0x1900, 0x40FF, 0x9952, 0x0018, 0x1900, +0x40FF, 0x994C, 0x001C, 0x1900, 0x40FF, 0x9932, 0x0024, 0x1900, 0x40FF, +0x991E, 0x0028, 0x1900, 0x40FF, 0x99D4, 0x0030, 0x1900, 0x40FF, 0x99D2, +0x0034, 0x1900, 0x40FF, 0x999E, 0x0038, 0x1900, 0x40FF, 0x99A6, 0x003C, +0x1900, 0x40FF, 0x9928, 0x002C, 0x1900, 0x40FF, 0x99B6, 0x000C, 0x1900, +0x40FF, 0x99BA, 0x0040, 0x1900, 0x40FF, 0x99BE, 0x0044, 0x1900, 0x40FF, +0x99C2, 0x0048, 0x1840, 0x40B2, 0x040F, 0x28C0, 0x1840, 0x4382, 0x28C2, +0x40B8, 0x0070, 0x0008, 0x1800, 0x40F8, 0x28C4, 0x000A, 0x08CC, 0x1638, +0x0110, 0x147B, 0x8231, 0x4381, 0x0004, 0x4381, 0x0006, 0x4036, 0x4E20, +0x4381, 0x0000, 0x4381, 0x0002, 0x0085, 0x2C4E, 0x410C, 0x522C, 0x050F, +0x0F3F, 0x0030, 0x134F, 0x411A, 0x0004, 0x411B, 0x0006, 0xD23A, 0x0087, +0x2BFA, 0x07C8, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x07C9, 0x00A9, +0x0008, 0x407C, 0x00C1, 0x090F, 0x134F, 0x07C4, 0x00A4, 0x0018, 0xF03B, +0x000F, 0x4A0C, 0x4B0D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x00A7, 0x0014, 0x07CB, +0x430C, 0x070F, 0x134F, 0x4C07, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0xB317, 0x2C08, 0xF317, 0x470C, 0x050F, +0x0F3F, 0x0010, 0x134F, 0x430C, 0x3CAF, 0x407C, 0x0028, 0x090F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0080, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x1400, 0x0B0F, +0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x422C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x4303, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0021, 0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x407C, +0x00C8, 0x090F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x407C, 0x0021, 0x090F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, +0x403C, 0x1501, 0x0B0F, 0x134F, 0x3C06, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x460F, 0x5336, 0x930F, 0x23F6, 0x407C, 0x0021, 0x090F, +0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x4C81, 0x0000, 0x4D81, 0x0002, +0x92A1, 0x0000, 0x2003, 0x9381, 0x0002, 0x2409, 0x90B1, 0x0006, 0x0000, +0x2003, 0x9381, 0x0002, 0x2402, 0x433C, 0x3C30, 0x4116, 0x0004, 0x4117, +0x0006, 0xD236, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x090F, 0x134F, +0xF037, 0x000F, 0x460C, 0x470D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x4C0B, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0xF31B, 0x4B0C, 0x050F, 0x0F3F, 0x0010, 0x134F, 0x430C, +0x5231, 0x1674, 0x0110, 0x147B, 0x8031, 0x0020, 0x028F, 0x9A4E, 0x1840, +0x4FF1, 0x0008, 0x1840, 0x4FF1, 0x0009, 0x1840, 0x4FF1, 0x000A, 0x1840, +0x4FF1, 0x000B, 0x008A, 0x2BFA, 0x0ACC, 0x13B0, 0x1880, 0x0086, 0x2C4E, +0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFDD, 0x3CDF, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x3403, 0x403C, 0xFFDC, 0x3CD4, 0x4107, 0x5037, 0x000C, 0x1407, 0x430F, +0x434E, 0x422D, 0x410C, 0x503C, 0x000C, 0x060B, 0x0B3B, 0x001C, 0x134B, +0x403C, 0x0003, 0x002F, 0x29B0, 0x134F, 0x4C0B, 0x07CC, 0x060F, 0x0F3F, +0x0020, 0x134F, 0x5221, 0x930B, 0x3402, 0x4B0C, 0x3CB6, 0x4124, 0x4115, +0x0002, 0x5034, 0xFFFC, 0x6335, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0088, +0x0B0F, 0x134F, 0x407C, 0x0034, 0x0A3F, 0x0010, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x440C, 0x450F, 0x108C, 0x108F, +0xEF4C, 0xEF0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x080F, 0x134F, 0x0AC9, +0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x440C, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0088, 0x0B0F, +0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x090F, 0x134F, +0x4124, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x440C, 0x832C, 0x080F, 0x134F, 0x407C, 0x0022, +0x0B0F, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, 0x0A3F, 0x0034, 0x134F, +0x407C, 0x0062, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x060F, 0x0F3F, +0x0010, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0021, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, +0x430C, 0x080F, 0x134F, 0x1407, 0x430F, 0x434E, 0x422D, 0x410C, 0x503C, +0x000C, 0x060B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x29B0, +0x134F, 0x4C0B, 0x07CC, 0x060F, 0x0F3F, 0x0020, 0x134F, 0x4B0C, 0x5221, +0x5031, 0x0020, 0x1674, 0x0110, 0x147B, 0x8031, 0x0032, 0x430B, 0x4306, +0x4307, 0x3C08, 0x410C, 0x503C, 0x000C, 0x5B0C, 0x0F3F, 0x0028, 0x134F, +0x531B, 0x008A, 0x2C4E, 0x0A0F, 0x903B, 0x0012, 0x2BF2, 0x432C, 0x0F3F, +0x0038, 0x134F, 0x430B, 0x3C08, 0x410C, 0x523C, 0x5B0C, 0x0A0F, 0x0F3F, +0x0028, 0x134F, 0x531B, 0x922B, 0x2BF6, 0x0088, 0x2C0E, 0x0089, 0x2C02, +0xB0F1, 0x0010, 0x0014, 0x280B, 0x4226, 0x407C, 0x0028, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0xB22C, 0x2C01, 0x4317, 0x407C, 0x0090, 0x090F, +0x134F, 0x403C, 0x0003, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0006, 0x403C, 0x0005, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0004, 0x403C, 0x0007, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0002, 0x403C, 0x0081, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0000, 0x431C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C05, 0x407C, +0x0090, 0x090F, 0x134F, 0x432C, 0x080F, 0x134F, 0x460C, 0x080F, 0x134F, +0x422C, 0x080F, 0x134F, 0x433C, 0x080F, 0x134F, 0x403C, 0x0006, 0x080F, +0x134F, 0x431C, 0x080F, 0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x431C, +0x080F, 0x134F, 0x4106, 0x5036, 0x001E, 0x1406, 0x430F, 0x434E, 0x403D, +0x0012, 0x410C, 0x503C, 0x0010, 0x0A04, 0x0434, 0x001C, 0x1344, 0x403C, +0x0003, 0x002F, 0x293E, 0x134F, 0x4C04, 0x06CC, 0x0A0F, 0x0F3F, 0x0020, +0x134F, 0x5221, 0x9304, 0x205D, 0x3C09, 0x4307, 0x407C, 0x0021, 0x090F, +0x134F, 0x407C, 0x00A8, 0x090F, 0x134F, 0x407C, 0x00D0, 0x090F, 0x134F, +0x531B, 0x430C, 0x080F, 0x134F, 0x934C, 0x3803, 0x903B, 0x0032, 0x2BF7, +0x903B, 0x0032, 0x2803, 0x403C, 0xFFCC, 0x3C41, 0x9307, 0x23E2, 0x407C, +0x0090, 0x090F, 0x134F, 0x432C, 0x080F, 0x134F, 0x411C, 0x0006, 0x080F, +0x134F, 0x422C, 0x080F, 0x134F, 0x411C, 0x0004, 0x080F, 0x134F, 0x403C, +0x0006, 0x080F, 0x134F, 0x411C, 0x0002, 0x080F, 0x134F, 0x403C, 0x0080, +0x080F, 0x134F, 0x412C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x450C, +0x080F, 0x134F, 0x1406, 0x430F, 0x435E, 0x422D, 0x410C, 0x503C, 0x000C, +0x0A0B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2938, 0x134F, +0x4C04, 0x06CC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x440C, 0x5031, +0x0032, 0x1674, 0x0110, 0x143B, 0x8031, 0x0012, 0x4381, 0x0006, 0x4381, +0x0008, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0004, 0x434B, 0x008A, +0x2C4E, 0x423C, 0x0A0F, 0x0F3F, 0x0038, 0x134F, 0x933C, 0x241E, 0x410C, +0x522C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x9381, 0x0004, 0x2417, 0x410D, +0x530D, 0x403C, 0xAA01, 0x0A0F, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2401, +0x010B, 0x03DB, 0x2408, 0x938B, 0x0000, 0x2007, 0x1840, 0x4382, 0x284C, +0x432C, 0x3CCB, 0x433C, 0x3CC9, 0x008B, 0x284C, 0x4B2F, 0x0FCE, 0x0FEF, +0x0FEE, 0x064F, 0x0EEF, 0x1840, 0x42FF, 0x2C6A, 0x3C04, 0x403C, 0x0003, +0x1380, 0x2BAA, 0x90B2, 0xFFA1, 0x0350, 0x2FF8, 0x93A2, 0x0350, 0x2BF5, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x4218, 0x0350, 0x421F, 0x0350, +0x1800, 0x43C1, 0x0000, 0x980F, 0x2C01, 0x4F08, 0x410D, 0x530D, 0x403C, +0xAA04, 0x0A0F, 0x0F3F, 0x0058, 0x134F, 0x010F, 0x4F29, 0x4B2F, 0x0FCE, +0x0FEF, 0x0FEE, 0x064F, 0x0EEF, 0x1840, 0x48CF, 0x2C6B, 0x1088, 0x1840, +0x48CF, 0x2C6C, 0x1840, 0x49CF, 0x2C6D, 0x1089, 0x1840, 0x49CF, 0x2C6E, +0x4218, 0x03D0, 0x421F, 0x03D0, 0x1800, 0x43C1, 0x000A, 0x980F, 0x2C01, +0x4F08, 0x410D, 0x503D, 0x000A, 0x403C, 0xAA03, 0x0A0F, 0x0F3F, 0x0058, +0x134F, 0x013F, 0x000A, 0x4F29, 0x4B2F, 0x0FCE, 0x0FEF, 0x0FEE, 0x064F, +0x0EEF, 0x1840, 0x48CF, 0x2C6F, 0x1088, 0x1840, 0x48CF, 0x2C70, 0x1840, +0x49CF, 0x2C71, 0x1089, 0x1840, 0x49CF, 0x2C72, 0x410D, 0x503D, 0x000E, +0x410C, 0x503C, 0x0006, 0x1380, 0x2B96, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x430E, 0x430F, +0x411C, 0x0006, 0x411D, 0x0008, 0x13B2, 0x9906, 0x930C, 0x2407, 0x411C, +0x0006, 0x411D, 0x0008, 0x13B2, 0x9912, 0x3C06, 0x411C, 0x000E, 0x411D, +0x0010, 0x13B2, 0x9912, 0x4B2F, 0x0FCE, 0x0FEF, 0x0FEE, 0x064F, 0x0EEF, +0x1840, 0x4CCF, 0x2C73, 0x108C, 0x1840, 0x4CCF, 0x2C74, 0x539B, 0x0000, +0x90BB, 0x0005, 0x0000, 0x201D, 0x438B, 0x0000, 0x423C, 0x0A0F, 0x0F3F, +0x0010, 0x134F, 0x407C, 0x0005, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x407C, +0x000B, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x403D, 0x0037, 0x008C, 0x2C6A, +0x0A0F, 0x0F3F, 0x000C, 0x134F, 0x431C, 0x3C01, 0x432C, 0x5031, 0x0012, +0x1638, 0x0110, 0x147B, 0x8031, 0x0048, 0x410C, 0x503C, 0x0022, 0x028E, +0x9A52, 0x008D, 0x0025, 0x13B2, 0x98A8, 0x1840, 0x42D1, 0x2470, 0x0022, +0x008F, 0x2470, 0x4FD1, 0x0001, 0x0023, 0x008A, 0x2BFA, 0x0ACC, 0x13B0, +0x1880, 0x0086, 0x2C4E, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, 0x134F, +0x410C, 0x503C, 0x000A, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x430B, 0x3C07, +0x4B0F, 0x5B07, 0x1840, 0x4FD7, 0x2D00, 0x0005, 0x531B, 0x4107, 0x5037, +0x0022, 0x903B, 0x0020, 0x3BF3, 0x0771, 0x0006, 0x4104, 0x5034, 0x000E, +0x1404, 0x430F, 0x434E, 0x403D, 0x0025, 0x013C, 0x000A, 0x060B, 0x0B3B, +0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2A22, 0x134F, 0x04CC, 0x060F, +0x0F3F, 0x0020, 0x134F, 0x411E, 0x0004, 0x411F, 0x0006, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0x4E05, 0xF035, 0x0F00, 0x5035, 0x0080, 0x4191, 0x0004, +0x0008, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x0AC8, +0x00A8, 0x0014, 0x430C, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x434C, +0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x411C, 0x0008, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x4303, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, +0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x411C, 0x0004, 0x832C, 0x080F, 0x134F, 0x407C, 0x0022, +0x0B0F, 0x134F, 0x411C, 0x000E, 0x411D, 0x0010, 0x0A3F, 0x0034, 0x134F, +0x407C, 0x0062, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x060F, 0x0F3F, +0x0010, 0x134F, 0x430B, 0x5221, 0x3C08, 0x4B0E, 0x470F, 0x5B0F, 0x1840, +0x4EDF, 0x2D00, 0x0005, 0x531B, 0x903B, 0x0020, 0x3BF5, 0x1404, 0x430F, +0x434E, 0x403D, 0x0025, 0x013C, 0x000A, 0x060B, 0x0B3B, 0x001C, 0x134B, +0x403C, 0x0003, 0x002F, 0x2A22, 0x134F, 0x04CC, 0x060F, 0x0F3F, 0x0020, +0x134F, 0x430C, 0x5031, 0x004C, 0x1674, 0x0110, 0x140A, 0x8031, 0x000C, +0x008A, 0x2C4E, 0x410C, 0x523C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x3403, 0x403C, 0xFFCB, 0x3C40, 0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x3892, 0x411E, 0x0008, 0x411F, 0x000A, 0x830F, 0x20DD, +0x831E, 0x242B, 0x831E, 0x2432, 0x831E, 0x242B, 0x831E, 0x243C, 0x831E, +0x244E, 0x831E, 0x2456, 0x831E, 0x245E, 0x831E, 0x2466, 0x831E, 0x2469, +0x831E, 0x2426, 0x831E, 0x246A, 0x831E, 0x247D, 0x832E, 0x2480, 0x831E, +0x2488, 0x831E, 0x2430, 0x831E, 0x2451, 0x831E, 0x247D, 0x831E, 0x2485, +0x831E, 0x248D, 0x831E, 0x2495, 0x831E, 0x249F, 0x831E, 0x24A7, 0x3CB0, +0x412F, 0x1840, 0x4F82, 0x2B68, 0x430C, 0x5031, 0x000C, 0x160A, 0x0110, +0x412C, 0x1380, 0x2B9E, 0x3FF7, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, +0x28B8, 0x1840, 0x4F82, 0x28BA, 0x3FED, 0x412E, 0x411F, 0x0002, 0x1840, +0x4E82, 0x28A0, 0x1840, 0x4F82, 0x28A2, 0x3FE3, 0x412E, 0x411F, 0x0002, +0x1840, 0x4E82, 0x28A4, 0x1840, 0x4F82, 0x28A6, 0x3FD9, 0x412E, 0x411F, +0x0002, 0x1840, 0x4E82, 0x28A8, 0x1840, 0x4F82, 0x28AA, 0x3FCF, 0x412E, +0x411F, 0x0002, 0x1840, 0x4E82, 0x28AC, 0x1840, 0x4F82, 0x28AE, 0x3FC5, +0x412F, 0x1840, 0x4F82, 0x28B0, 0x3FC0, 0x412F, 0x1840, 0x4F82, 0x28B2, +0x3FBB, 0x412F, 0x1840, 0x4F82, 0x28B4, 0x3FB6, 0x412F, 0x1840, 0x4F82, +0x28B6, 0x3FB1, 0x4381, 0x0004, 0x4381, 0x0006, 0x410C, 0x522C, 0x0A0F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFCA, 0x3FA3, 0x411D, +0x0004, 0x412C, 0x1380, 0x2BC2, 0x3F9C, 0x412F, 0x1840, 0x4F82, 0x28BC, +0x3F97, 0x412F, 0x1840, 0x4F82, 0x2B66, 0x3F92, 0x412F, 0x1840, 0x4F82, +0x2470, 0x3F8D, 0x412F, 0x1840, 0x4F82, 0x28BE, 0x3F88, 0x412E, 0x411F, +0x0002, 0x1840, 0x4E82, 0x2B7A, 0x1840, 0x4F82, 0x2B7C, 0x3F7E, 0x412E, +0x411F, 0x0002, 0x1840, 0x4E82, 0x2B7E, 0x1840, 0x4F82, 0x2B80, 0x3F74, +0x412E, 0x411F, 0x0002, 0xD03E, 0x0080, 0x1840, 0x4E82, 0x2B82, 0x1840, +0x4F82, 0x2B84, 0x3F68, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, 0x2B86, +0x1840, 0x4F82, 0x2B88, 0x3F5E, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, +0x2400, 0x1840, 0x4F82, 0x2402, 0x3F54, 0x403C, 0xFFC9, 0x3F52, 0x4303, +0x145B, 0x4328, 0x0089, 0x2BFA, 0x407C, 0x0028, 0x093F, 0x0008, 0x134F, +0x4C4C, 0x430D, 0x13B2, 0x8F3E, 0x930C, 0x2002, 0x432C, 0x3CDF, 0x407C, +0x00B0, 0x093F, 0x0008, 0x134F, 0x00A9, 0x001C, 0x403C, 0x009F, 0x430D, +0x090F, 0x134F, 0x430C, 0x430D, 0x090F, 0x134F, 0x4C0A, 0xB03C, 0x0100, +0x28CA, 0x4C4E, 0xF07E, 0x0006, 0x926E, 0x203C, 0x430B, 0x0088, 0x2C4E, +0x403C, 0x0010, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x403C, 0x009E, 0x430D, +0x090F, 0x134F, 0xD03A, 0x0040, 0x4A0C, 0x430D, 0x090F, 0x134F, 0x923B, +0x2CAE, 0x403C, 0x009A, 0x430D, 0x090F, 0x134F, 0x4B0C, 0x065C, 0x430D, +0x090F, 0x134F, 0x403C, 0x009D, 0x430D, 0x090F, 0x134F, 0x430C, 0x430D, +0x090F, 0x134F, 0x080F, 0x0F3F, 0x0014, 0x134F, 0x403C, 0x009D, 0x430D, +0x090F, 0x134F, 0x430C, 0x430D, 0x090F, 0x134F, 0x080F, 0x0F3F, 0x0010, +0x134F, 0x531B, 0x3FD8, 0x4306, 0x403C, 0x009B, 0x430D, 0x090F, 0x134F, +0x430C, 0x430D, 0x090F, 0x134F, 0x13B2, 0x98C0, 0x4C0B, 0x0087, 0x2860, +0xB23A, 0x2819, 0xB03A, 0x0200, 0x2C02, 0x930C, 0x200F, 0x403C, 0x009E, +0x430D, 0x090F, 0x134F, 0xC31A, 0xD03A, 0x0040, 0x4A0C, 0x430D, 0x090F, +0x134F, 0x4236, 0x8726, 0x3C18, 0x972B, 0x2416, 0x4C06, 0x8726, 0x3C13, +0x008F, 0x2864, 0x972B, 0x2403, 0x438F, 0x0000, 0x3C0C, 0x539F, 0x0000, +0x90BF, 0x0014, 0x0000, 0x2006, 0xB03A, 0x0200, 0x2802, 0x4236, 0x3C01, +0x4C06, 0x4B87, 0x0000, 0x9316, 0x3848, 0x4B0A, 0x860A, 0xF03A, 0x0007, +0x0088, 0x2C4E, 0x432C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x460C, 0x080F, +0x0F3F, 0x0010, 0x134F, 0x403C, 0x009A, 0x430D, 0x090F, 0x134F, 0x4A0C, +0x065C, 0x430D, 0x090F, 0x134F, 0x403C, 0x009D, 0x430D, 0x090F, 0x134F, +0x430C, 0x430D, 0x090F, 0x134F, 0x080F, 0x0F3F, 0x0014, 0x134F, 0x403C, +0x009D, 0x430D, 0x090F, 0x134F, 0x430C, 0x430D, 0x090F, 0x134F, 0x080F, +0x0F3F, 0x0010, 0x134F, 0x403C, 0x009D, 0x430D, 0x090F, 0x134F, 0x430C, +0x430D, 0x090F, 0x134F, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x531A, 0x923A, +0x2801, 0x430A, 0x9B0A, 0x23C9, 0x4318, 0x480C, 0x1656, 0x0110, 0x145B, +0x4328, 0x008A, 0x2BFA, 0x407C, 0x0028, 0x0A3F, 0x0008, 0x134F, 0x4C4C, +0x430D, 0x13B2, 0x9096, 0x930C, 0x2002, 0x432C, 0x3CCD, 0x407C, 0x0090, +0x0A3F, 0x0008, 0x134F, 0x00AA, 0x0014, 0x403C, 0x009F, 0x0A0F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x4C06, 0xB03C, 0x0100, 0x28BA, 0x4C4E, 0xF07E, +0x0006, 0x926E, 0x2035, 0x430B, 0x0089, 0x2C4E, 0x403C, 0x0010, 0x090F, +0x0F3F, 0x0010, 0x134F, 0x403C, 0x009E, 0x0A0F, 0x134F, 0xD036, 0x0040, +0x460C, 0x0A0F, 0x134F, 0x923B, 0x2CA0, 0x403C, 0x009A, 0x0A0F, 0x134F, +0x4B0C, 0x065C, 0x0A0F, 0x134F, 0x403C, 0x009D, 0x0A0F, 0x134F, 0x430C, +0x0A0F, 0x134F, 0x430D, 0x090F, 0x0F3F, 0x0014, 0x134F, 0x403C, 0x009D, +0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x090F, 0x0F3F, 0x0010, 0x134F, +0x531B, 0x3FDD, 0x4307, 0x403C, 0x009B, 0x0A0F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0x4C0B, 0x108B, 0xF37B, 0x110B, 0x110B, 0x0089, 0x2860, 0xB236, +0x2817, 0xB036, 0x0200, 0x2C02, 0x930B, 0x200D, 0x403C, 0x009E, 0x0A0F, +0x134F, 0xC316, 0xD036, 0x0040, 0x460C, 0x0A0F, 0x134F, 0x4237, 0x8927, +0x3C18, 0x992B, 0x2416, 0x4B07, 0x8927, 0x3C13, 0x008F, 0x2862, 0x992B, +0x2403, 0x438F, 0x0000, 0x3C0C, 0x539F, 0x0000, 0x90BF, 0x0014, 0x0000, +0x2006, 0xB036, 0x0200, 0x2802, 0x4237, 0x3C01, 0x4B07, 0x4B89, 0x0000, +0x9317, 0x3841, 0x4B08, 0x8708, 0xF038, 0x0007, 0x0089, 0x2C4E, 0x432C, +0x090F, 0x0F3F, 0x0010, 0x134F, 0x470C, 0x090F, 0x0F3F, 0x0010, 0x134F, +0x403C, 0x009A, 0x0A0F, 0x134F, 0x480C, 0x065C, 0x0A0F, 0x134F, 0x403C, +0x009D, 0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x430D, 0x090F, 0x0F3F, +0x0014, 0x134F, 0x403C, 0x009D, 0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x090F, 0x0F3F, 0x0010, 0x134F, 0x403C, 0x009D, 0x0A0F, 0x134F, 0x430C, +0x0A0F, 0x134F, 0x090F, 0x0F3F, 0x0010, 0x134F, 0x5318, 0x9238, 0x2801, +0x4308, 0x9B08, 0x23D0, 0x4318, 0x480C, 0x1656, 0x0110, 0x147B, 0x8231, +0x0084, 0x2C4E, 0x410C, 0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x410C, +0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x430B, 0x0087, 0x2BFA, 0x07C8, +0x00A8, 0x0008, 0x407C, 0x0048, 0x080F, 0x134F, 0x435C, 0x073F, 0x0010, +0x134F, 0x07C9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x3C07, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x531B, 0x07C6, 0x00A6, 0x0014, +0x903B, 0x000A, 0x2C11, 0x407C, 0x0028, 0x080F, 0x134F, 0x430C, 0x060F, +0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, +0x930F, 0x23E2, 0x411A, 0x0004, 0x411B, 0x0006, 0x503A, 0xFFFE, 0x633B, +0x407C, 0x0088, 0x080F, 0x134F, 0x407C, 0x0034, 0x073F, 0x0010, 0x134F, +0x407C, 0x0082, 0x080F, 0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, +0xEF0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x060F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0088, 0x080F, 0x134F, 0x407C, 0x0024, 0x073F, +0x0010, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0082, 0x080F, 0x134F, +0x403C, 0x3FFF, 0x060F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, +0x080F, 0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x00C2, 0x080F, 0x134F, 0x430A, 0x430B, 0x3C0F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x060F, 0x134F, 0x040F, 0x0F3F, +0x0010, 0x134F, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BEE, 0x2002, 0x912A, +0x2BEB, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, +0x080F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, 0x080F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x5231, 0x1674, 0x0110, 0x147B, +0x8231, 0x0084, 0x2C4E, 0x410C, 0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, +0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x411A, 0x0004, 0x832A, +0x430B, 0x0087, 0x2BFA, 0x07C8, 0x00A8, 0x0008, 0x407C, 0x0048, 0x080F, +0x134F, 0x435C, 0x073F, 0x0010, 0x134F, 0x07C9, 0x00A9, 0x0030, 0x435C, +0x090F, 0x134F, 0x3C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x531B, 0x07C6, 0x00A6, 0x0014, 0x903B, 0x000A, 0x2C11, 0x407C, 0x0028, +0x080F, 0x134F, 0x430C, 0x060F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, +0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E2, 0x4077, 0x00C8, 0x474C, +0x080F, 0x134F, 0x403C, 0x3401, 0x060F, 0x134F, 0x407C, 0x0082, 0x080F, +0x134F, 0x403C, 0x4030, 0x060F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x474C, 0x080F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x435C, 0x090F, +0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x403C, 0x3FFF, 0x060F, 0x134F, +0x434C, 0x090F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x2409, 0x060F, +0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x00C2, 0x080F, 0x134F, 0x430A, +0x430B, 0x3C0F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, +0x060F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, 0x531A, 0x630B, 0x911B, +0x0002, 0x2BEE, 0x2002, 0x912A, 0x2BEB, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, +0x407C, 0x0021, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x5231, +0x1674, 0x0110, 0x143B, 0x8321, 0x4C0A, 0x4308, 0xB31C, 0x2844, 0x008C, +0x2880, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFF5, 0x3CA4, 0x008C, 0x287C, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, +0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C98, 0x0089, 0x2BFA, 0x407C, 0x0082, +0x093F, 0x0008, 0x134F, 0x403C, 0x3FFF, 0x093F, 0x0014, 0x134F, 0x434C, +0x093F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x093F, 0x0008, 0x134F, 0x403C, +0x2409, 0x093F, 0x0014, 0x134F, 0x435C, 0x093F, 0x0030, 0x134F, 0x434C, +0x093F, 0x0030, 0x134F, 0x407C, 0x0048, 0x093F, 0x0008, 0x134F, 0x403C, +0x0018, 0x093F, 0x0014, 0x134F, 0x008B, 0x287C, 0x5BAB, 0x0000, 0x6B9B, +0x0002, 0x0002, 0x3C33, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x0028, +0x134F, 0x4C08, 0x0089, 0x2BFA, 0x407C, 0x00C1, 0x093F, 0x0008, 0x134F, +0x1840, 0x421C, 0x2880, 0x1840, 0x421D, 0x2882, 0x093F, 0x0018, 0x134F, +0x407C, 0x00A1, 0x093F, 0x0008, 0x134F, 0x416C, 0x093F, 0x0010, 0x134F, +0x435C, 0x093F, 0x0030, 0x134F, 0x434C, 0x093F, 0x0030, 0x134F, 0x1840, +0x5392, 0x2880, 0x1840, 0x6382, 0x2882, 0x53BB, 0x0000, 0x63BB, 0x0002, +0x4B2F, 0xDB1F, 0x0002, 0x930F, 0x2402, 0x9308, 0x27C6, 0xB32A, 0x281A, +0x0089, 0x2BFA, 0x434C, 0x093F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x093F, +0x0008, 0x134F, 0x403C, 0x2401, 0x093F, 0x0014, 0x134F, 0x407C, 0x0021, +0x093F, 0x0008, 0x134F, 0x435C, 0x093F, 0x0030, 0x134F, 0x3C0D, 0x9318, +0x2009, 0x407C, 0x0091, 0x002F, 0x2C4E, 0x0F3F, 0x0024, 0x134F, 0x4308, +0x3C02, 0x4038, 0xFFF3, 0x480C, 0x5321, 0x1638, 0x0110, 0x143B, 0x8321, +0x4C0A, 0x430B, 0xB31C, 0x2844, 0x008C, 0x2878, 0x002F, 0x2C4E, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3CA1, 0x008C, 0x2874, +0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x2003, 0x403C, 0xFFF4, +0x3C95, 0x0088, 0x2BFA, 0x407C, 0x0082, 0x083F, 0x0008, 0x134F, 0x403C, +0x3FFF, 0x083F, 0x0014, 0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, +0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, 0x2409, 0x083F, 0x0014, 0x134F, +0x435C, 0x083F, 0x0030, 0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, +0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, 0x2418, 0x083F, 0x0014, 0x134F, +0x0089, 0x2874, 0x59A9, 0x0000, 0x6999, 0x0002, 0x0002, 0x3C30, 0x410C, +0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x0028, 0x134F, 0x4C0B, 0x0088, 0x2BFA, +0x407C, 0x00C1, 0x083F, 0x0008, 0x134F, 0x1840, 0x421C, 0x2878, 0x083F, +0x0014, 0x134F, 0x407C, 0x00A1, 0x083F, 0x0008, 0x134F, 0x416C, 0x083F, +0x0010, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x434C, 0x083F, 0x0030, +0x134F, 0x1840, 0x5392, 0x2878, 0x1840, 0x6382, 0x287A, 0x53B9, 0x0000, +0x63B9, 0x0002, 0x492F, 0xD91F, 0x0002, 0x930F, 0x2402, 0x930B, 0x27C9, +0xB32A, 0x281A, 0x0088, 0x2BFA, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, +0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, 0x2401, 0x083F, 0x0014, 0x134F, +0x407C, 0x0021, 0x083F, 0x0008, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, +0x3C0D, 0x931B, 0x2009, 0x407C, 0x0091, 0x002F, 0x2C4E, 0x0F3F, 0x0024, +0x134F, 0x430B, 0x3C02, 0x403B, 0xFFF3, 0x4B0C, 0x5321, 0x1638, 0x0110, +0x143B, 0x8321, 0x4C0A, 0x430B, 0xB31C, 0x2879, 0x008C, 0x2890, 0x002F, +0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3CA1, +0x008C, 0x288C, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x2003, +0x403C, 0xFFF4, 0x3C95, 0x0088, 0x2BFA, 0x407C, 0x0082, 0x083F, 0x0008, +0x134F, 0x403C, 0x3FFF, 0x083F, 0x0014, 0x134F, 0x434C, 0x083F, 0x0030, +0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, 0x2409, 0x083F, +0x0014, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x434C, 0x083F, 0x0030, +0x134F, 0x407C, 0x0048, 0x083F, 0x0008, 0x134F, 0x423C, 0x083F, 0x0014, +0x134F, 0x3C35, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, +0x4C0B, 0x0088, 0x2BFA, 0x407C, 0x00C1, 0x083F, 0x0008, 0x134F, 0x1840, +0x421C, 0x2890, 0x1840, 0x421D, 0x2892, 0x083F, 0x0018, 0x134F, 0x407C, +0x00A1, 0x083F, 0x0008, 0x134F, 0x412C, 0x083F, 0x0014, 0x134F, 0x435C, +0x083F, 0x0030, 0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x1840, 0x53A2, +0x2890, 0x1840, 0x6382, 0x2892, 0x1840, 0x53B2, 0x288C, 0x1840, 0x63B2, +0x288E, 0x1840, 0x421F, 0x288C, 0x1840, 0xD21F, 0x288E, 0x930F, 0x2402, +0x930B, 0x27C1, 0xB32A, 0x281A, 0x0088, 0x2BFA, 0x434C, 0x083F, 0x0030, +0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, 0x2401, 0x083F, +0x0014, 0x134F, 0x407C, 0x0021, 0x083F, 0x0008, 0x134F, 0x435C, 0x083F, +0x0030, 0x134F, 0x3C0D, 0x931B, 0x2009, 0x407C, 0x0091, 0x002F, 0x2C4E, +0x0F3F, 0x0024, 0x134F, 0x430B, 0x3C02, 0x403B, 0xFFF3, 0x4B0C, 0x5321, +0x1638, 0x0110, 0x143B, 0x8321, 0x4C0A, 0x430B, 0xB31C, 0x2877, 0x008C, +0x2888, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFF5, 0x3C9F, 0x008C, 0x2884, 0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, +0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C93, 0x0088, 0x2BFA, 0x407C, 0x0082, +0x083F, 0x0008, 0x134F, 0x403C, 0x3FFF, 0x083F, 0x0014, 0x134F, 0x434C, +0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, +0x2409, 0x083F, 0x0014, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x434C, +0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, +0x2408, 0x083F, 0x0014, 0x134F, 0x3C32, 0x410C, 0x530C, 0x002F, 0x2C4E, +0x0F3F, 0x002C, 0x134F, 0x4C0B, 0x0088, 0x2BFA, 0x407C, 0x00C1, 0x083F, +0x0008, 0x134F, 0x1840, 0x421C, 0x2888, 0x083F, 0x0014, 0x134F, 0x407C, +0x00A1, 0x083F, 0x0008, 0x134F, 0x412C, 0x083F, 0x0014, 0x134F, 0x435C, +0x083F, 0x0030, 0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x1840, 0x53A2, +0x2888, 0x1840, 0x6382, 0x288A, 0x1840, 0x53B2, 0x2884, 0x1840, 0x63B2, +0x2886, 0x1840, 0x421F, 0x2884, 0x1840, 0xD21F, 0x2886, 0x930F, 0x2402, +0x930B, 0x27C4, 0xB32A, 0x281A, 0x0088, 0x2BFA, 0x434C, 0x083F, 0x0030, +0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, 0x2401, 0x083F, +0x0014, 0x134F, 0x407C, 0x0021, 0x083F, 0x0008, 0x134F, 0x435C, 0x083F, +0x0030, 0x134F, 0x3C0D, 0x931B, 0x2009, 0x407C, 0x0091, 0x002F, 0x2C4E, +0x0F3F, 0x0024, 0x134F, 0x430B, 0x3C02, 0x403B, 0xFFF3, 0x4B0C, 0x5321, +0x1638, 0x0110, 0x147B, 0x8031, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, +0x4381, 0x0004, 0x4037, 0x0028, 0x410C, 0x522C, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x43A1, 0x0000, 0x4381, 0x0002, 0x0086, 0x2C42, 0x0088, +0x2B7A, 0x4109, 0x5309, 0x1203, 0x09CD, 0x481E, 0x0004, 0x481F, 0x0006, +0x430C, 0x060B, 0x134B, 0x5321, 0x933C, 0x2488, 0x93C8, 0x0008, 0x341B, +0x403A, 0x0014, 0xB3A8, 0x0008, 0x4A0E, 0x430F, 0x09CC, 0x2805, 0x13B2, +0x8AA2, 0xD391, 0x0000, 0x3C04, 0x13B2, 0x8AA2, 0xC391, 0x0000, 0x4A0E, +0x430F, 0x412C, 0x411D, 0x0002, 0x13B2, 0x883A, 0xC0B8, 0x0080, 0x0008, +0x40B1, 0x000B, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x403A, 0xEDF0, 0x403B, +0xE000, 0x1203, 0x09CD, 0x4A0E, 0x4B0F, 0x430C, 0x0604, 0x1344, 0x5321, +0x933C, 0x2456, 0xC3A1, 0x0000, 0xD2A1, 0x0000, 0x1203, 0x09CD, 0x4A0E, +0x4B0F, 0x430C, 0x0604, 0x1344, 0x5321, 0x933C, 0x2448, 0x1213, 0x09CD, +0x4A0E, 0x4B0F, 0x430C, 0x0604, 0x1344, 0x5321, 0x933C, 0x243E, 0xB3A1, +0x0002, 0x2C02, 0x5337, 0x23F1, 0x40B1, 0x0003, 0x0000, 0x40B1, 0xA05F, +0x0002, 0x1203, 0x09CD, 0x4A0E, 0x4B0F, 0x430C, 0x060B, 0x134B, 0x5321, +0x933C, 0x2429, 0x40B1, 0x0003, 0x0000, 0x4381, 0x0002, 0x1203, 0x09CD, +0x481E, 0x0004, 0x481F, 0x0006, 0x430C, 0x060B, 0x134B, 0x5321, 0x933C, +0x2418, 0x481F, 0x000C, 0xD81F, 0x000E, 0x930F, 0x240E, 0x13B2, 0x777E, +0x930C, 0x200E, 0x9381, 0x0004, 0x2402, 0x1380, 0x2BA6, 0x430C, 0x5031, +0x0006, 0x1674, 0x0110, 0x13B2, 0x8140, 0x930C, 0x27F2, 0x433C, 0x3FF6, +0x4303, 0x145B, 0x8031, 0x002E, 0x4307, 0x4306, 0x008A, 0x2BFA, 0x0AC8, +0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x0ACB, 0x00AB, 0x0008, 0x407C, +0x00C8, 0x0B0F, 0x134F, 0x0AC9, 0x00A9, 0x0014, 0x403C, 0x0500, 0x090F, +0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x403C, 0x0182, 0x430D, 0x0A3F, +0x0018, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, +0x403C, 0x0003, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C1, 0x0B0F, 0x134F, 0x403C, 0x0182, 0x430D, 0x0A3F, 0x0018, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C09, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x9309, 0x340A, 0x4337, +0x470C, 0x5031, 0x002E, 0x1656, 0x0110, 0x083F, 0x0028, 0x134F, 0x5316, +0x410C, 0x530C, 0x560C, 0x0028, 0x2C4E, 0x9036, 0x0016, 0x2BF4, 0x1840, +0x421E, 0x2400, 0x1840, 0x421F, 0x2402, 0x4ECC, 0x0000, 0x4E0D, 0x108D, +0x4DCC, 0x0001, 0x4FCC, 0x0002, 0x108F, 0x4F4E, 0x4ECC, 0x0003, 0x4109, +0x5039, 0x001A, 0x1409, 0x430F, 0x435E, 0x403D, 0x001A, 0x410C, 0x522C, +0x0838, 0x001C, 0x1348, 0x403C, 0x0003, 0x002F, 0x2A64, 0x134F, 0x09CC, +0x002F, 0x2C4E, 0x0F3F, 0x0020, 0x134F, 0x407C, 0x0054, 0x0B0F, 0x134F, +0x403C, 0x0200, 0x430D, 0x0A3F, 0x001C, 0x134F, 0x5221, 0x3FB9, 0x4303, +0x147B, 0x8321, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0008, 0x4074, 0x0088, +0x444C, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, 0x0034, 0x080F, +0x134F, 0x4079, 0x0082, 0x494C, 0x0B0F, 0x134F, 0x0AC6, 0x00A6, 0x0030, +0x435C, 0x060F, 0x134F, 0x403C, 0x0960, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x4077, 0x0042, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x403C, 0x00FC, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, +0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C05, 0x434C, 0x060F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, +0x435C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x0034, 0x080F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x403C, 0x0A60, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x403C, +0x00FC, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C07, 0x434C, 0x060F, +0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, +0x435C, 0x060F, 0x134F, 0x4124, 0x470D, 0x440C, 0xD50D, 0x5321, 0x1674, +0x0110, 0x147B, 0x8231, 0x0084, 0x2C4E, 0x410C, 0x530C, 0x040F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C9A, 0x410C, 0x522C, +0x040F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C8F, +0x0088, 0x2BFA, 0x08C9, 0x00A9, 0x0008, 0x407C, 0x0082, 0x090F, 0x134F, +0x08C6, 0x00A6, 0x0014, 0x403C, 0x3FFF, 0x060F, 0x134F, 0x08C7, 0x00A7, +0x0030, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, +0x2409, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, +0x430A, 0x430B, 0x3C23, 0x407C, 0x00C1, 0x090F, 0x134F, 0x412C, 0x060F, +0x134F, 0x407C, 0x00A1, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, +0x070F, 0x134F, 0x430C, 0x060F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, +0x412E, 0x411F, 0x0002, 0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x531A, 0x630B, 0x911B, 0x0006, 0x2BDA, 0x2003, 0x911A, 0x0004, 0x2BD6, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, +0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, +0x435C, 0x070F, 0x134F, 0x430B, 0x407C, 0x0048, 0x090F, 0x134F, 0x435C, +0x083F, 0x0010, 0x134F, 0x435C, 0x070F, 0x134F, 0x3C07, 0x434C, 0x070F, +0x134F, 0x435C, 0x070F, 0x134F, 0x531B, 0x903B, 0x000A, 0x2C11, 0x407C, +0x0028, 0x090F, 0x134F, 0x430C, 0x060F, 0x134F, 0xF07C, 0x0081, 0x907C, +0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E5, 0x430C, 0x5231, +0x1674, 0x0110, 0x145B, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x4318, +0x3C6F, 0x412A, 0x411B, 0x0002, 0x0089, 0x2BFA, 0x09C6, 0x00A6, 0x0008, +0x407C, 0x0088, 0x060F, 0x134F, 0x407C, 0x0034, 0x093F, 0x0010, 0x134F, +0x407C, 0x0082, 0x060F, 0x134F, 0x09C7, 0x00A7, 0x0030, 0x435C, 0x070F, +0x134F, 0x4A0E, 0x4B0F, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, +0x480C, 0xDE0C, 0xD03C, 0x0080, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, +0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x407C, +0x0082, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x4A0C, 0x093F, 0x0014, +0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, +0x070F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, +0x403C, 0x3FFD, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, +0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x0088, 0x060F, 0x134F, 0x407C, 0x0024, 0x093F, 0x0010, 0x134F, +0x435C, 0x070F, 0x134F, 0x5318, 0x9038, 0x0010, 0x2C26, 0x9328, 0x2001, +0x4228, 0x0087, 0x2C4E, 0x410B, 0x530B, 0x0BCC, 0x070F, 0x0F3F, 0x0028, +0x134F, 0x0BCC, 0x00AC, 0x0001, 0x070F, 0x0F3F, 0x0028, 0x134F, 0x03EB, +0x0BCC, 0x070F, 0x0F3F, 0x0028, 0x134F, 0x9038, 0x000F, 0x2402, 0x930C, +0x2005, 0x9038, 0x000F, 0x236D, 0x930C, 0x376B, 0x403C, 0xFFD8, 0x3C01, +0x430C, 0x5221, 0x1656, 0x0110, 0x147B, 0x4C04, 0x430A, 0x008B, 0x2BFA, +0x0BC8, 0x00A8, 0x0008, 0x407C, 0x0088, 0x080F, 0x134F, 0x407C, 0x0034, +0x0B3F, 0x0010, 0x134F, 0x4039, 0x0032, 0x4076, 0x00C8, 0x464C, 0x080F, +0x134F, 0x0BC7, 0x00A7, 0x0014, 0x403C, 0x2401, 0x070F, 0x134F, 0x407C, +0x0028, 0x080F, 0x134F, 0x430C, 0x070F, 0x134F, 0x5339, 0x933C, 0x2403, +0xB03C, 0x0200, 0x2C02, 0x9309, 0x23F5, 0x407C, 0x0082, 0x080F, 0x134F, +0x403C, 0x4030, 0x070F, 0x134F, 0x00AB, 0x0030, 0x435C, 0x0B0F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x403C, 0x0C04, 0x070F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x403C, +0x3FFF, 0x070F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, +0x403C, 0x2409, 0x070F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2408, 0x070F, 0x134F, 0x3C1C, +0x407C, 0x00C1, 0x080F, 0x134F, 0x4A0F, 0x5F0F, 0x440C, 0x5F0C, 0x070F, +0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x4A0F, 0x0FEF, 0x1840, 0x4F1C, +0x2730, 0x070F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x531A, 0x903A, 0x0030, 0x3BE1, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, +0x134F, 0x403C, 0x2401, 0x070F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x1674, 0x0110, 0x147B, 0x120C, 0x8031, 0x0040, +0x40B1, 0x0007, 0x0002, 0x430A, 0x403B, 0x0006, 0x4381, 0x0000, 0x0086, +0x2C4E, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3403, +0x403C, 0xFFFE, 0x3C82, 0x410C, 0x532C, 0x060F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x3403, 0x403C, 0xFFBE, 0x3C77, 0x90B1, 0x000F, 0x0002, 0x2002, +0x403B, 0x0009, 0x403C, 0x0C04, 0x430D, 0x1380, 0x2814, 0x4034, 0x0018, +0x440E, 0x410D, 0x522D, 0x412C, 0x1380, 0x281C, 0x0085, 0x2818, 0x440E, +0x008D, 0x2404, 0x412C, 0x050F, 0x134F, 0x4037, 0x0028, 0x4B0E, 0xD03E, +0x0080, 0x4A0D, 0x1844, 0x5D0D, 0x412C, 0x13B2, 0x67D6, 0x4C08, 0x4D09, +0x9381, 0x0040, 0x2406, 0x440E, 0x008D, 0x2404, 0x412C, 0x050F, 0x134F, +0x480F, 0xD90F, 0x930F, 0x242C, 0x9039, 0x0020, 0x280F, 0x2003, 0x9038, +0xA761, 0x280B, 0x4A0F, 0x533A, 0x930F, 0x2016, 0x403A, 0x0007, 0x4B0F, +0x533B, 0x930F, 0x2010, 0x3C1A, 0x9039, 0x0015, 0x2804, 0x200E, 0x9038, +0x83D0, 0x2C0B, 0x531A, 0x923A, 0x2805, 0x430A, 0x531B, 0x9B81, 0x0002, +0x280B, 0x5337, 0x9317, 0x37C4, 0x440E, 0x410D, 0x522D, 0x412C, 0x050F, +0x134F, 0x9317, 0x3402, 0x433C, 0x3C14, 0x1844, 0x5A0A, 0x4A0C, 0x060F, +0x0F3F, 0x0010, 0x134F, 0xD03B, 0x0080, 0x4B0C, 0x060F, 0x0F3F, 0x0010, +0x134F, 0x430C, 0x060F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x5031, 0x0042, +0x1674, 0x0110, 0x145B, 0x8321, 0x4391, 0x0000, 0x008A, 0x2C4E, 0x410C, +0x530C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x008B, 0x2B8A, 0x412C, 0x0B3F, +0x0010, 0x134F, 0x0088, 0x2BFA, 0x08CC, 0x13B0, 0x1880, 0x0B3F, 0x001C, +0x134F, 0x0B3F, 0x0054, 0x134F, 0x435C, 0x0B3F, 0x0018, 0x134F, 0x080F, +0x134F, 0x083F, 0x0004, 0x134F, 0x403C, 0xA55A, 0x13B2, 0x832A, 0x931C, +0x2003, 0x403C, 0xFFCF, 0x3C69, 0x434C, 0x0B3F, 0x0018, 0x134F, 0x080F, +0x134F, 0x083F, 0x0004, 0x134F, 0x13B2, 0x9676, 0x903C, 0xC3C3, 0x2003, +0x403C, 0xFFBB, 0x3C58, 0x08C9, 0x00A9, 0x0008, 0x407C, 0x0028, 0x090F, +0x134F, 0x4C46, 0x460C, 0x430D, 0x13B2, 0x9532, 0x930C, 0x2448, 0x9036, +0x0098, 0x2009, 0x407C, 0x00F4, 0x090F, 0x134F, 0x403C, 0x4020, 0x083F, +0x0014, 0x134F, 0x9036, 0x0099, 0x2012, 0x407C, 0x00F4, 0x090F, 0x134F, +0x403C, 0x40A0, 0x083F, 0x0014, 0x134F, 0x407C, 0x0054, 0x090F, 0x134F, +0x430C, 0x431D, 0x083F, 0x001C, 0x134F, 0x435C, 0x0A0F, 0x0F3F, 0x0008, +0x134F, 0x464C, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x90B1, 0x0006, 0x0000, +0x2012, 0x43A1, 0x0000, 0x432C, 0x0B3F, 0x0010, 0x134F, 0x08CC, 0x13B0, +0x1880, 0x434C, 0x0B3F, 0x0018, 0x134F, 0x080F, 0x134F, 0x083F, 0x0004, +0x134F, 0x416C, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x3C02, 0x403C, +0xFFBC, 0x5321, 0x1656, 0x0110, 0x147B, 0x8221, 0x431A, 0x3C90, 0x932A, +0x2001, 0x422A, 0x0087, 0x2C4E, 0x410B, 0x530B, 0x0BCC, 0x070F, 0x0F3F, +0x0028, 0x134F, 0x0BCC, 0x00AC, 0x0001, 0x070F, 0x0F3F, 0x0028, 0x134F, +0x0BCC, 0x03EC, 0x070F, 0x0F3F, 0x0028, 0x134F, 0x43CB, 0x0003, 0x4124, +0x4115, 0x0002, 0x1084, 0x1085, 0xE344, 0xE504, 0xF034, 0x0F00, 0x5034, +0x0080, 0x4127, 0x0086, 0x2BFA, 0x06CB, 0x00AB, 0x0030, 0x434C, 0x0B0F, +0x134F, 0x06C8, 0x00A8, 0x0008, 0x407C, 0x0082, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x06C9, 0x00A9, 0x0014, 0x4A0F, 0xF03F, 0x000F, 0x5F04, +0x440C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x1401, +0x090F, 0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x470C, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0021, +0x080F, 0x134F, 0x430C, 0x430D, 0x063F, 0x0018, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x0501, 0x090F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x531A, 0x903A, +0x0010, 0x2B6D, 0x430C, 0x5221, 0x1674, 0x0110, 0x147B, 0x120C, 0x8031, +0x0040, 0x4309, 0x4037, 0x001B, 0x4381, 0x0000, 0x430A, 0x430B, 0x0088, +0x2C4E, 0x410C, 0x530C, 0x080F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3403, +0x403C, 0xFFFE, 0x3C7D, 0x403C, 0x0C04, 0x430D, 0x1380, 0x2814, 0x4105, +0x5225, 0x403E, 0x001D, 0x05CD, 0x412C, 0x1380, 0x281C, 0x0084, 0x2818, +0x403E, 0x001D, 0x008D, 0x2434, 0x412C, 0x040F, 0x134F, 0x3C03, 0x4607, +0x4391, 0x0002, 0x490F, 0x531F, 0x970F, 0x2C24, 0x4706, 0x5906, 0x0356, +0x4381, 0x0002, 0x430E, 0x460D, 0x0A5D, 0x412C, 0x13B2, 0x67D6, 0x4C0A, +0x4D0B, 0x9381, 0x0040, 0x2407, 0x403E, 0x001D, 0x008D, 0x2434, 0x412C, +0x040F, 0x134F, 0x4A0F, 0xDB0F, 0x930F, 0x2409, 0x903B, 0x0020, 0x2804, +0x23DA, 0x903A, 0xA761, 0x2FD7, 0x4609, 0x3FD8, 0x9381, 0x0002, 0x2408, +0x430E, 0x490D, 0x0A5D, 0x412C, 0x13B2, 0x67D6, 0x4C0A, 0x4D0B, 0x403E, +0x0018, 0x05CD, 0x412C, 0x040F, 0x134F, 0x503A, 0x6478, 0x603B, 0xFFEC, +0x903B, 0x0010, 0x2806, 0x2003, 0x903A, 0xB559, 0x2802, 0x433C, 0x3C1D, +0x430C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x0A59, 0x490C, 0x080F, 0x0F3F, +0x0010, 0x134F, 0x403C, 0x0080, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x403C, +0x0080, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x080F, 0x0F3F, 0x0010, +0x134F, 0x430C, 0x5031, 0x0042, 0x1674, 0x0110, 0x147B, 0x8231, 0x0084, +0x2C4E, 0x410C, 0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, +0x403C, 0xFFF2, 0x3C87, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C7C, 0x0087, 0x2BFA, 0x07C8, 0x00A8, +0x0008, 0x407C, 0x0082, 0x080F, 0x134F, 0x07C6, 0x00A6, 0x0014, 0x403C, +0x3FFF, 0x060F, 0x134F, 0x07C9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x080F, 0x134F, +0x403C, 0x0019, 0x060F, 0x134F, 0x412E, 0x411F, 0x0002, 0x5E0E, 0x6F0F, +0x4E81, 0x0000, 0x4F81, 0x0002, 0x430A, 0x430B, 0x3C28, 0x407C, 0x00C1, +0x080F, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, 0x073F, 0x0018, 0x134F, +0x407C, 0x00A1, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x430C, 0x060F, 0x134F, 0x040F, 0x0F3F, 0x0008, 0x134F, 0x411E, +0x0004, 0x411F, 0x0006, 0x531E, 0x630F, 0x4E81, 0x0004, 0x4F81, 0x0006, +0x531A, 0x630B, 0x911B, 0x0002, 0x2BD5, 0x2002, 0x912A, 0x2BD2, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, +0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x430C, 0x5231, 0x1674, 0x0110, 0x147B, 0x0086, 0x2BFA, +0x06CA, 0x00AA, 0x0008, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, 0x134F, 0x06C8, +0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, 0x134F, 0x4079, 0x0082, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x4982, 0x080F, 0x134F, 0x00A6, 0x0030, 0x434C, +0x060F, 0x134F, 0x4077, 0x0042, 0x474C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x430C, +0x080F, 0x134F, 0x4C04, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x4A82, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C07, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x440C, 0x470D, 0x1674, 0x0110, 0x143B, 0x8031, 0x0006, 0x008A, 0x2C4E, +0xB31C, 0x2816, 0x008C, 0x2894, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFD7, 0x3C80, 0x008C, 0x2898, 0x0A0F, 0x0F3F, 0x0030, +0x134F, 0x933C, 0x2003, 0x403C, 0xFFD6, 0x3C75, 0x407C, 0x0091, 0x0A0F, +0x0F3F, 0x0024, 0x134F, 0x0A0F, 0x0F3F, 0x0004, 0x134F, 0x410D, 0x530D, +0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x0034, 0x134F, 0x3C56, 0x008A, 0x2BFA, +0x0ACB, 0x00AB, 0x0030, 0x434C, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0008, +0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x0500, 0x0A3F, 0x0014, 0x134F, +0x407C, 0x00C1, 0x080F, 0x134F, 0x1840, 0x421C, 0x2894, 0x1840, 0x421D, +0x2896, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x00A1, +0x080F, 0x134F, 0x013F, 0x0002, 0x1800, 0x53E1, 0x0002, 0x4F2C, 0x0A3F, +0x0014, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, +0x403C, 0x0501, 0x0A3F, 0x0014, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x1840, 0x53A2, 0x2894, 0x1840, +0x6382, 0x2896, 0x412F, 0x832F, 0x4F81, 0x0000, 0x1840, 0x53B2, 0x2898, +0x1840, 0x63B2, 0x289A, 0x1840, 0x421F, 0x2898, 0x1840, 0xD21F, 0x289A, +0x930F, 0x2403, 0x9381, 0x0000, 0x239F, 0x430C, 0x5031, 0x0006, 0x1638, +0x0110, 0x147B, 0x8231, 0x4304, 0x0088, 0x2C4E, 0x410C, 0x522C, 0x080F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x4034, 0xFFDF, 0x3C7F, 0x410C, +0x530C, 0x080F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x4034, 0xFFDE, +0x3C74, 0x0087, 0x2BFA, 0x07C9, 0x00A9, 0x0008, 0x407C, 0x0082, 0x090F, +0x134F, 0x07C6, 0x00A6, 0x0014, 0x403C, 0x3FFF, 0x060F, 0x134F, 0x00A7, +0x0030, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, +0x2409, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2419, 0x060F, 0x134F, 0x412E, +0x411F, 0x0002, 0x5E0E, 0x6F0F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430A, +0x430B, 0x3C25, 0x407C, 0x00C1, 0x090F, 0x134F, 0x411C, 0x0004, 0x060F, +0x134F, 0x407C, 0x00A1, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, +0x070F, 0x134F, 0x430C, 0x060F, 0x134F, 0x080F, 0x0F3F, 0x0008, 0x134F, +0x411E, 0x0004, 0x411F, 0x0006, 0x531E, 0x630F, 0x4E81, 0x0004, 0x4F81, +0x0006, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BD8, 0x2002, 0x912A, 0x2BD5, +0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2401, +0x060F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, +0x440C, 0x5231, 0x1674, 0x0110, 0x141B, 0x8231, 0x008A, 0x2C4E, 0x410C, +0x522C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x930C, 0x3411, 0x403C, 0xFFC8, +0x3C7B, 0x434C, 0x0B3F, 0x0050, 0x134F, 0x415E, 0x0004, 0x537E, 0x4EC1, +0x0004, 0x411C, 0x0006, 0x0B3F, 0x0024, 0x134F, 0x93C1, 0x0004, 0x2469, +0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3811, 0x410C, +0x530C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3809, 0x410C, 0x503C, +0x0006, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFC7, +0x3C4E, 0x008B, 0x2B8A, 0xB0B1, 0x0040, 0x0000, 0x280D, 0xB0B1, 0x0040, +0x0002, 0x2805, 0x435C, 0x0B3F, 0x0030, 0x134F, 0x3C04, 0x434C, 0x0B3F, +0x0030, 0x134F, 0xB0B1, 0x0100, 0x0000, 0x280D, 0xB0B1, 0x0100, 0x0002, +0x2805, 0x435C, 0x0B3F, 0x0034, 0x134F, 0x3C04, 0x434C, 0x0B3F, 0x0034, +0x134F, 0xB391, 0x0000, 0x280C, 0xB391, 0x0002, 0x2805, 0x435C, 0x0B3F, +0x0048, 0x134F, 0x3C04, 0x434C, 0x0B3F, 0x0048, 0x134F, 0xB2B1, 0x0000, +0x280C, 0xB2B1, 0x0002, 0x2805, 0x435C, 0x0B3F, 0x004C, 0x134F, 0x3C04, +0x434C, 0x0B3F, 0x004C, 0x134F, 0xB3A1, 0x0000, 0x2B92, 0xB3A1, 0x0002, +0x2B8B, 0x435C, 0x0B3F, 0x0050, 0x134F, 0x3F8A, 0x430C, 0x5231, 0x161A, +0x0110, 0x145B, 0x8221, 0x1940, 0x4291, 0x99EE, 0x0000, 0x1940, 0x4291, +0x99F0, 0x0002, 0x008A, 0x2BFA, 0x0ACB, 0x00AB, 0x0030, 0x434C, 0x0B0F, +0x134F, 0x0AC8, 0x00A8, 0x0008, 0x4076, 0x00C8, 0x464C, 0x080F, 0x134F, +0x0AC9, 0x00A9, 0x0014, 0x403C, 0x0500, 0x090F, 0x134F, 0x407C, 0x00C1, +0x080F, 0x134F, 0x403C, 0xFF80, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x0501, 0x090F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x0500, +0x090F, 0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, 0x403C, 0xFF82, 0x430D, +0x0A3F, 0x0018, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x00A1, 0x080F, +0x134F, 0x411C, 0x0002, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, +0x080F, 0x134F, 0x403C, 0x0501, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x0054, 0x080F, +0x134F, 0x403C, 0x0200, 0x430D, 0x0A3F, 0x001C, 0x134F, 0x430C, 0x5221, +0x1656, 0x0110, 0x147B, 0x8231, 0x0084, 0x2C4E, 0x410C, 0x530C, 0x040F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C75, 0x410C, +0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFF1, +0x3C6A, 0x0086, 0x2BFA, 0x06C8, 0x00A8, 0x0008, 0x407C, 0x0082, 0x080F, +0x134F, 0x06C7, 0x00A7, 0x0014, 0x403C, 0x3FFF, 0x070F, 0x134F, 0x06C9, +0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, +0x403C, 0x2409, 0x070F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x430A, 0x430B, 0x3C26, 0x407C, 0x00C1, 0x080F, 0x134F, 0x412C, +0x411D, 0x0002, 0x063F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x070F, 0x134F, +0x040F, 0x0F3F, 0x0010, 0x134F, 0x412E, 0x411F, 0x0002, 0x532E, 0x630F, +0x4E81, 0x0000, 0x4F81, 0x0002, 0x531A, 0x630B, 0x911B, 0x0006, 0x2BD7, +0x2003, 0x911A, 0x0004, 0x2BD3, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2401, 0x070F, 0x134F, +0x407C, 0x0021, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x5231, +0x1674, 0x0110, 0x147B, 0x8031, 0x0020, 0x4C0A, 0x4E0B, 0x1800, 0x43C1, +0x0000, 0x4D0E, 0x430F, 0x403C, 0x0005, 0x1380, 0x2810, 0x4B0E, 0x430F, +0x403C, 0x0006, 0x1380, 0x2810, 0x430B, 0x4A0C, 0x430D, 0x1380, 0x2814, +0x407C, 0x00A8, 0x1380, 0x2C02, 0x0086, 0x2C4E, 0x410D, 0x530D, 0x403C, +0xAA02, 0x060F, 0x0F3F, 0x0058, 0x134F, 0x13B2, 0x97D6, 0x010F, 0x4F28, +0x4309, 0x403F, 0x0D3E, 0x403B, 0x0003, 0x533F, 0x633B, 0x2FFD, 0x010F, +0x4F2A, 0x430B, 0x13B2, 0x98F8, 0x410C, 0x522C, 0x028E, 0x9A32, 0x427D, +0x13B2, 0x98A8, 0x4107, 0x5037, 0x000C, 0x1407, 0x430F, 0x434E, 0x423D, +0x410C, 0x523C, 0x0604, 0x0434, 0x001C, 0x1344, 0x403C, 0x0003, 0x1380, +0x2820, 0x07CC, 0x060F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x9309, 0x2007, +0x9A08, 0x2C05, 0x880A, 0x790B, 0x4A08, 0x4B09, 0x3C02, 0x8A08, 0x7309, +0x1380, 0x280C, 0x4C0A, 0x4D0B, 0x403C, 0xAA02, 0x060F, 0x0F3F, 0x005C, +0x134F, 0x4A0C, 0x4B0D, 0x403E, 0x0003, 0x430F, 0x13B2, 0x97F8, 0x503C, +0x001F, 0x630D, 0x403E, 0x03E8, 0x430F, 0x13B2, 0x97F8, 0x480E, 0x490F, +0x13B2, 0x9330, 0x5031, 0x0020, 0x1674, 0x0110, 0x145B, 0x8221, 0x4381, +0x0000, 0x4381, 0x0002, 0x435A, 0x3C71, 0x936A, 0x2001, 0x426A, 0x0089, +0x2BFA, 0x09C6, 0x00A6, 0x0008, 0x407C, 0x0088, 0x060F, 0x134F, 0x09CB, +0x00AB, 0x0014, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x407C, 0x0082, 0x060F, +0x134F, 0x09C7, 0x00A7, 0x0030, 0x435C, 0x070F, 0x134F, 0x4A4C, 0x108C, +0xF03C, 0x0F00, 0xD03C, 0x0060, 0x0B0F, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x407C, 0x0082, +0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x403C, 0x00FC, 0x0B0F, 0x134F, +0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C08, 0x434C, 0x070F, 0x134F, 0x435C, +0x070F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C0B, 0x434C, 0x070F, 0x134F, +0x407C, 0x0088, 0x060F, 0x134F, 0x407C, 0x0024, 0x093F, 0x0010, 0x134F, +0x435C, 0x070F, 0x134F, 0x480E, 0x4B0F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x403D, 0x0003, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x000C, 0x134F, +0x535A, 0x907A, 0x0010, 0x2B8C, 0x430C, 0x5221, 0x1656, 0x0110, 0x143B, +0x8031, 0x001E, 0x43C1, 0x0000, 0x435A, 0x403C, 0x0005, 0x1380, 0x2BAE, +0x008B, 0x2BFA, 0x407C, 0x0028, 0x0B3F, 0x0008, 0x134F, 0x008F, 0x2858, +0x4C4C, 0x430D, 0x13B2, 0x945A, 0x930C, 0x2403, 0x438F, 0x0000, 0x3C03, +0x539F, 0x0000, 0x436A, 0x93AF, 0x0000, 0x3859, 0x438F, 0x0000, 0x434C, +0x1380, 0x2BB6, 0x0B0F, 0x134F, 0x407C, 0x0028, 0x0B3F, 0x0008, 0x134F, +0x4CC1, 0x0000, 0x416C, 0x430D, 0x13B2, 0x945A, 0x930C, 0x2445, 0x407C, +0x0086, 0x0B3F, 0x0008, 0x134F, 0x916C, 0x203E, 0x435A, 0x422C, 0x0B3F, +0x0014, 0x134F, 0x903C, 0x1207, 0x2036, 0x430C, 0x0B3F, 0x0014, 0x134F, +0x903C, 0xA55A, 0x202C, 0x410C, 0x532C, 0x028E, 0x9A42, 0x427D, 0x13B2, +0x98A8, 0x1840, 0x42D1, 0x2470, 0x0002, 0x008F, 0x2470, 0x4FD1, 0x0001, +0x0003, 0x410B, 0x503B, 0x000A, 0x140B, 0x430F, 0x434E, 0x423D, 0x410C, +0x503C, 0x0006, 0x0028, 0x2C4E, 0x0838, 0x001C, 0x1348, 0x403C, 0x0003, +0x002F, 0x2A28, 0x134F, 0x0BCC, 0x002F, 0x2C4E, 0x0F3F, 0x0020, 0x134F, +0x5221, 0x3C03, 0x43F1, 0x0000, 0x436A, 0x4A4C, 0x5031, 0x001E, 0x1638, +0x0110, 0x147B, 0x8221, 0x4038, 0x0028, 0x43A1, 0x0000, 0x4381, 0x0002, +0x0089, 0x2C42, 0x0087, 0x2B7A, 0x4106, 0x5306, 0x1203, 0x06CD, 0x471E, +0x0004, 0x471F, 0x0006, 0x430C, 0x090B, 0x134B, 0x5321, 0x933C, 0x245D, +0x40B1, 0x0003, 0x0000, 0x40B1, 0xA05F, 0x0002, 0xB397, 0x0008, 0x2806, +0x40B1, 0x000B, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x403A, 0xEDF0, 0x403B, +0xE000, 0x1203, 0x06CD, 0x4A0E, 0x4B0F, 0x430C, 0x0904, 0x1344, 0x5321, +0x933C, 0x2440, 0xC3A1, 0x0000, 0xD2A1, 0x0000, 0x1203, 0x06CD, 0x4A0E, +0x4B0F, 0x430C, 0x0904, 0x1344, 0x5321, 0x933C, 0x2432, 0x1213, 0x06CD, +0x4A0E, 0x4B0F, 0x430C, 0x0904, 0x1344, 0x5321, 0x933C, 0x2428, 0xB3A1, +0x0002, 0x2C02, 0x5338, 0x23F1, 0x40B1, 0x0003, 0x0000, 0x40B1, 0xA05F, +0x0002, 0x1203, 0x06CD, 0x4A0E, 0x4B0F, 0x430C, 0x090B, 0x134B, 0x5321, +0x933C, 0x2413, 0x40B1, 0x0003, 0x0000, 0x4381, 0x0002, 0x1203, 0x06CD, +0x471E, 0x0004, 0x471F, 0x0006, 0x430C, 0x090B, 0x134B, 0x5321, 0x933C, +0x2402, 0x9308, 0x2002, 0x433C, 0x3C01, 0x430C, 0x5221, 0x1674, 0x0110, +0x145B, 0x8321, 0x431A, 0x3C58, 0x412B, 0x0088, 0x2BFA, 0x08C9, 0x00A9, +0x0008, 0x407C, 0x00C8, 0x090F, 0x134F, 0x08C6, 0x00A6, 0x0014, 0x403C, +0x3401, 0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x4A0C, 0xD03C, +0x4030, 0x060F, 0x134F, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, +0x134F, 0x4B0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, +0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x00C8, 0x090F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x435C, 0x080F, +0x134F, 0x531A, 0x903A, 0x0010, 0x2C17, 0x932A, 0x2001, 0x422A, 0x410C, +0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x903A, 0x000F, 0x2402, +0x930C, 0x2005, 0x903A, 0x000F, 0x2393, 0x930C, 0x3791, 0x403C, 0xFFD8, +0x3C01, 0x430C, 0x5321, 0x1656, 0x0110, 0x141B, 0x8031, 0x0006, 0x43C1, +0x0000, 0x43C1, 0x0001, 0x4381, 0x0002, 0x4381, 0x0004, 0x008A, 0x2C4E, +0x410C, 0x531C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x008B, 0x2BFA, 0x407C, +0x00B0, 0x0B3F, 0x0008, 0x134F, 0x3C1C, 0x90F1, 0x009E, 0x0000, 0x2007, +0xB0B1, 0x0040, 0x0002, 0x2803, 0x1840, 0x4382, 0x2860, 0x416C, 0x430D, +0x0B3F, 0x001C, 0x134F, 0x411C, 0x0002, 0x411D, 0x0004, 0x0B3F, 0x001C, +0x134F, 0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x243A, +0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0xB3D1, 0x0000, 0x281B, +0x416E, 0xC35E, 0x907E, 0x008A, 0x2007, 0x1840, 0x421C, 0x28C0, 0x1840, +0x421D, 0x28C2, 0x3C0A, 0x416C, 0x430D, 0x0B3F, 0x001C, 0x134F, 0x430C, +0x430D, 0x0B3F, 0x001C, 0x134F, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x3FD4, +0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x416E, 0xC35E, 0x907E, +0x008A, 0x23B2, 0x411E, 0x0002, 0x411F, 0x0004, 0x1840, 0x4E82, 0x28C0, +0x1840, 0x4F82, 0x28C2, 0x3FBE, 0x430C, 0x5031, 0x0006, 0x161A, 0x0110, +0x143B, 0x8031, 0x000A, 0x4381, 0x0000, 0x430A, 0x4381, 0x0002, 0x4381, +0x0004, 0x4381, 0x0006, 0x4381, 0x0008, 0x410C, 0x530C, 0x002F, 0x2C4E, +0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFC1, 0x3C5B, 0x531A, +0x912A, 0x2C0F, 0x410C, 0x532C, 0x4A0F, 0x5F0F, 0x5F0C, 0x002F, 0x2C4E, +0x0F3F, 0x002C, 0x134F, 0x930C, 0x37F1, 0x403C, 0xFFC0, 0x3C49, 0x008A, +0x2B8A, 0x430C, 0x0A3F, 0x0010, 0x134F, 0x0088, 0x2BFA, 0x08CC, 0x13B0, +0x1880, 0x0ACB, 0x00AB, 0x0030, 0x434C, 0x0B0F, 0x134F, 0x434C, 0x0A3F, +0x0018, 0x134F, 0x080F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x083F, 0x0004, +0x134F, 0x411D, 0x0004, 0x411C, 0x0002, 0x13B2, 0x7E8C, 0x931C, 0x241D, +0x90B1, 0x0003, 0x0000, 0x2810, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x00C8, +0x0A3F, 0x0024, 0x134F, 0x411D, 0x0008, 0x411C, 0x0006, 0x13B2, 0x7E8C, +0x931C, 0x2409, 0x407C, 0x0028, 0x083F, 0x0008, 0x134F, 0x4C4C, 0x903C, +0x0095, 0x2403, 0x403C, 0xFFCE, 0x3C04, 0x435C, 0x0B0F, 0x134F, 0x430C, +0x5031, 0x000A, 0x1638, 0x0110, 0x141B, 0x8031, 0x007C, 0x4381, 0x0000, +0x430A, 0x410C, 0x522C, 0x403E, 0x003C, 0x13B2, 0x98D4, 0x008B, 0x2C4E, +0x410C, 0x532C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3403, 0x403C, +0xFFEB, 0x3C57, 0x410C, 0x530C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFC1, 0x3C4C, 0x531A, 0x912A, 0x2C0E, 0x410C, 0x522C, +0x4A0F, 0x5F0F, 0x5F0C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x37F2, +0x403C, 0xFFC0, 0x3C3B, 0x008B, 0x2B8A, 0x411C, 0x0002, 0x0B3F, 0x0010, +0x134F, 0x008A, 0x2BFA, 0x0ACC, 0x13B0, 0x1880, 0x434C, 0x0B3F, 0x0018, +0x134F, 0x0A0F, 0x134F, 0x0B3F, 0x001C, 0x134F, 0x435C, 0x0B3F, 0x0018, +0x134F, 0x0A0F, 0x134F, 0x403D, 0x1E1E, 0x403C, 0xA55A, 0x13B2, 0x7E8C, +0x931C, 0x2414, 0x434C, 0x0B3F, 0x0018, 0x134F, 0x0A0F, 0x134F, 0x430A, +0x3C01, 0x531A, 0x912A, 0x2C0C, 0x4A0F, 0x5F0F, 0x510F, 0x4F1C, 0x0004, +0x13B2, 0x832A, 0x931C, 0x23F4, 0x403C, 0xFFCE, 0x3C01, 0x430C, 0x5031, +0x007C, 0x161A, 0x0110, 0x145B, 0x8031, 0x0006, 0x434B, 0x4338, 0x0089, +0x2C4E, 0x410C, 0x522C, 0x090F, 0x0F3F, 0x0028, 0x134F, 0x930C, 0x3403, +0x403C, 0xFFEB, 0x3C5D, 0x431C, 0x090F, 0x0F3F, 0x0038, 0x134F, 0x410C, +0x530C, 0x090F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFCD, +0x3C4D, 0x43C1, 0x0004, 0x0086, 0x2B8A, 0x430C, 0x063F, 0x0010, 0x134F, +0x930C, 0x2403, 0x403C, 0xFFEA, 0x3C40, 0x008C, 0x2BFA, 0x13B0, 0x1880, +0x90B1, 0xA55A, 0x0000, 0x2004, 0x90B1, 0xA55A, 0x0002, 0x2408, 0x90B1, +0x5AA5, 0x0000, 0x2027, 0x90B1, 0x5AA5, 0x0002, 0x2023, 0x434C, 0x063F, +0x0030, 0x134F, 0x435C, 0x063F, 0x0018, 0x134F, 0x1380, 0x2BFA, 0x434C, +0x063F, 0x0030, 0x134F, 0x435B, 0x412D, 0x411C, 0x0002, 0x13B2, 0x7E8C, +0x4C4A, 0x435C, 0x063F, 0x0030, 0x134F, 0x403C, 0x0BB8, 0x063F, 0x0024, +0x134F, 0x935A, 0x2003, 0x403C, 0xFFCE, 0x3C09, 0x4B4C, 0x090F, 0x0F3F, +0x0008, 0x134F, 0x934B, 0x2401, 0x4308, 0x480C, 0x5031, 0x0006, 0x1656, +0x0110, 0x145B, 0x4C08, 0x4E0A, 0x4F0B, 0x0089, 0x2BFA, 0x09C6, 0x00A6, +0x0008, 0x407C, 0x0088, 0x060F, 0x134F, 0x407C, 0x0034, 0x093F, 0x0010, +0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x09C7, 0x00A7, 0x0030, 0x435C, +0x070F, 0x134F, 0x4A0E, 0x4B0F, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, +0x0F00, 0xDE08, 0xD038, 0x0080, 0x480C, 0x093F, 0x0014, 0x134F, 0x434C, +0x070F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, +0x407C, 0x0082, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x4A0C, 0x093F, +0x0014, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x435C, 0x070F, +0x134F, 0x403C, 0x3FFD, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, +0x134F, 0x407C, 0x0088, 0x060F, 0x134F, 0x407C, 0x0024, 0x093F, 0x0010, +0x134F, 0x435C, 0x070F, 0x134F, 0x1656, 0x0110, 0x143B, 0x8221, 0x433B, +0x43E1, 0x0000, 0x1840, 0x4218, 0x246E, 0x4381, 0x0002, 0x008A, 0x2C4E, +0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x13B2, 0x69DA, 0x4CC1, +0x0000, 0x9381, 0x0002, 0x2425, 0x0A0F, 0x0F3F, 0x0010, 0x93D1, 0x0000, +0x422C, 0x200E, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, +0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x3C0E, 0x134F, 0x430C, +0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x403D, 0x4000, 0x0A0F, +0x0F3F, 0x0014, 0x134F, 0x430B, 0x3C2A, 0x416E, 0x1840, 0x4E82, 0x246E, +0x9E08, 0x2424, 0x931E, 0x422C, 0x0A0F, 0x0F3F, 0x0010, 0x200F, 0x134F, +0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x430D, 0x0A0F, +0x0F3F, 0x0014, 0x134F, 0x431B, 0x3C0F, 0x134F, 0x430C, 0x430D, 0x0A0F, +0x0F3F, 0x0014, 0x134F, 0x430C, 0x403D, 0x4000, 0x0A0F, 0x0F3F, 0x0014, +0x134F, 0x431B, 0x4B0C, 0x5221, 0x1638, 0x0110, 0x145B, 0x435A, 0x3C5C, +0x936A, 0x2001, 0x426A, 0x008B, 0x2BFA, 0x0BC8, 0x00A8, 0x0008, 0x407C, +0x00C8, 0x080F, 0x134F, 0x0BC9, 0x00A9, 0x0014, 0x403C, 0x3401, 0x090F, +0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x4A4C, 0x108C, 0xF03C, 0x0F00, +0xD03C, 0x4082, 0x090F, 0x134F, 0x00AB, 0x0030, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x0082, +0x080F, 0x134F, 0x403C, 0x00FE, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C06, 0x434C, +0x0B0F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x460C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, +0x134F, 0x535A, 0x907A, 0x0010, 0x2BA1, 0x430C, 0x1656, 0x0110, 0x147B, +0x4304, 0x430A, 0x430B, 0x4306, 0x4307, 0x0088, 0x2BFA, 0x407C, 0x0028, +0x083F, 0x0008, 0x134F, 0x4C49, 0x490C, 0x430D, 0x13B2, 0x8F94, 0x930C, +0x2002, 0x433C, 0x3C4B, 0x490C, 0x430D, 0x13B2, 0x959E, 0x930C, 0x242F, +0x407C, 0x00E8, 0x083F, 0x0008, 0x134F, 0x430C, 0x083F, 0x0014, 0x134F, +0x4C04, 0x9039, 0x0095, 0x2004, 0x403C, 0x05DC, 0x1380, 0x2BAE, 0x407C, +0x00E1, 0x083F, 0x0008, 0x134F, 0x430C, 0x430D, 0x083F, 0x0018, 0x134F, +0x4C0A, 0x5A0A, 0x6B0B, 0x5A0A, 0x6B0B, 0x5A0A, 0x6B0B, 0x5A0A, 0x6B0B, +0x5D0A, 0x630B, 0x4A0F, 0xDB0F, 0x930F, 0x2407, 0x4A06, 0x4B07, 0x5226, +0x6307, 0x3C02, 0x4036, 0x0FF0, 0x0088, 0x2C4E, 0x4A0C, 0x4B0D, 0x080F, +0x0F3F, 0x0014, 0x134F, 0x460C, 0x470D, 0x080F, 0x0F3F, 0x0014, 0x134F, +0x440C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x1674, 0x0110, 0x143B, +0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x430A, 0x430B, 0x0089, 0x2C4E, +0x4108, 0x5308, 0x08CC, 0x090F, 0x0F3F, 0x0030, 0x134F, 0x4A0E, 0x4B0F, +0x412C, 0x411D, 0x0002, 0x13B2, 0x883A, 0x930C, 0x2442, 0x531A, 0x630B, +0x2003, 0x903A, 0x0010, 0x2BEC, 0x08CC, 0x090F, 0x0F3F, 0x0030, 0x134F, +0x403E, 0x0010, 0x430F, 0x412C, 0x411D, 0x0002, 0x13B2, 0x883A, 0x930C, +0x242D, 0x08CC, 0x090F, 0x0F3F, 0x0030, 0x134F, 0x403E, 0x0014, 0x430F, +0x412C, 0x411D, 0x0002, 0x13B2, 0x883A, 0x930C, 0x241E, 0x08CC, 0x090F, +0x0F3F, 0x0030, 0x134F, 0x403E, 0x0011, 0x430F, 0x412C, 0x411D, 0x0002, +0x13B2, 0x883A, 0x930C, 0x240F, 0x08CC, 0x090F, 0x0F3F, 0x0030, 0x134F, +0x403E, 0x0012, 0x430F, 0x412C, 0x411D, 0x0002, 0x13B2, 0x883A, 0x930C, +0x2002, 0x433C, 0x3C01, 0x430C, 0x5221, 0x1638, 0x0110, 0x143B, 0x8221, +0x4381, 0x0000, 0x4381, 0x0002, 0x13B2, 0x8BF4, 0x930C, 0x2402, 0x433C, +0x3C53, 0x008B, 0x2C3E, 0x410A, 0x530A, 0x431F, 0x0ACE, 0x403C, 0x00FC, +0x430D, 0x0B08, 0x1348, 0x0088, 0x2C4E, 0x412F, 0xD11F, 0x0002, 0x930F, +0x2439, 0x412C, 0x411D, 0x0002, 0x080F, 0x0F3F, 0x0014, 0x134F, 0x431F, +0x0ACE, 0x403C, 0x00F8, 0x430D, 0x0B09, 0x1349, 0x412C, 0x411D, 0x0002, +0x080F, 0x0F3F, 0x0014, 0x134F, 0x431F, 0x0ACE, 0x403C, 0x00F4, 0x430D, +0x0B09, 0x1349, 0x412C, 0x411D, 0x0002, 0x080F, 0x0F3F, 0x0014, 0x134F, +0x434C, 0x080F, 0x0F3F, 0x0008, 0x134F, 0x431F, 0x0ACE, 0x430C, 0x430D, +0x0B0B, 0x134B, 0x412E, 0x411F, 0x0002, 0xF03E, 0xFFC0, 0x1840, 0x4E82, +0x2B6A, 0x1840, 0x4F82, 0x2B6C, 0x412C, 0x411D, 0x0002, 0x080F, 0x0F3F, +0x0014, 0x134F, 0x430C, 0x5221, 0x1638, 0x0110, 0x143B, 0x8221, 0x4381, +0x0000, 0x4381, 0x0002, 0x430A, 0x008B, 0x2C4E, 0x4108, 0x5308, 0x4A0E, +0x430F, 0x08CC, 0x13B2, 0x8AA2, 0x930C, 0x2440, 0x412C, 0x411D, 0x0002, +0x0B0F, 0x0F3F, 0x0014, 0x134F, 0x531A, 0x903A, 0x0010, 0x2BEE, 0x403E, +0x0010, 0x430F, 0x08CC, 0x13B2, 0x8AA2, 0x930C, 0x242D, 0x412C, 0x411D, +0x0002, 0x0B0F, 0x0F3F, 0x0014, 0x134F, 0x403E, 0x0014, 0x430F, 0x08CC, +0x13B2, 0x8AA2, 0x930C, 0x241E, 0x412C, 0x411D, 0x0002, 0x0B0F, 0x0F3F, +0x0014, 0x134F, 0x403E, 0x0011, 0x430F, 0x08CC, 0x13B2, 0x8AA2, 0x930C, +0x240F, 0x412C, 0x411D, 0x0002, 0x0B0F, 0x0F3F, 0x0014, 0x134F, 0x403E, +0x0012, 0x430F, 0x08CC, 0x13B2, 0x8AA2, 0x930C, 0x2002, 0x433C, 0x3C08, +0x412C, 0x411D, 0x0002, 0x0B0F, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x5221, +0x1638, 0x0110, 0x147B, 0x4C06, 0x0DC5, 0x4E07, 0x3C53, 0x4534, 0x008A, +0x2BFA, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x0AC8, +0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x0048, 0x0B0F, 0x134F, 0x427C, 0x0A3F, 0x0010, 0x134F, 0x407C, 0x00C1, +0x0B0F, 0x134F, 0x460C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00A1, +0x0B0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, +0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x5326, +0x470F, 0x5337, 0x930F, 0x23A9, 0x1674, 0x0110, 0x143B, 0x8221, 0x430B, +0x410D, 0x530D, 0x403C, 0xAA01, 0x002F, 0x2C4E, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2405, 0x010F, 0x03DF, 0x2402, 0x438F, 0x0000, 0x13B2, 0x8BF4, +0x930C, 0x2402, 0x433C, 0x3C40, 0x13B2, 0x8C5C, 0x930C, 0x2401, 0x433B, +0x4078, 0x0028, 0x40B1, 0x0003, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x410A, +0x530A, 0x1203, 0x0ACD, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1380, +0x2C42, 0x5321, 0x1213, 0x0ACD, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, +0x1380, 0x2C42, 0x5321, 0xB3A1, 0x0002, 0x2C03, 0x5378, 0x2403, 0x3FF0, +0x9348, 0x2001, 0x433B, 0x1213, 0x0ACD, 0x403E, 0xED30, 0x403F, 0xE000, +0x430C, 0x1380, 0x2C42, 0x411C, 0x0002, 0x411D, 0x0004, 0x002F, 0x2C4E, +0x0F3F, 0x0014, 0x134F, 0x4B0C, 0x5321, 0x5221, 0x1638, 0x0110, 0x143B, +0x8031, 0x000C, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0008, 0x4381, +0x000A, 0x410D, 0x522D, 0x403C, 0xAA01, 0x002F, 0x2C4E, 0x0F3F, 0x0058, +0x134F, 0x930C, 0x2403, 0x0138, 0x0004, 0x3C01, 0x4348, 0x008A, 0x2BFA, +0x410B, 0x530B, 0x431E, 0x0BCD, 0x426C, 0x0A3F, 0x0040, 0x134F, 0xC0B1, +0x4000, 0x0002, 0xD0B1, 0x1000, 0x0002, 0x430E, 0x0BCD, 0x426C, 0x0A3F, +0x0040, 0x134F, 0x03D8, 0x2402, 0x4398, 0x0000, 0x4391, 0x0008, 0x40B1, +0xA05F, 0x000A, 0x1203, 0x410D, 0x503D, 0x000A, 0x403E, 0xEDF0, 0x403F, +0xE000, 0x430C, 0x0A38, 0x0048, 0x1348, 0x5321, 0x933C, 0x2002, 0x433C, +0x3C0E, 0xC0B1, 0x1000, 0x0002, 0x430E, 0x0BCD, 0x426C, 0x0A3F, 0x0040, +0x134F, 0x403C, 0x00C8, 0x1380, 0x2BAE, 0x430C, 0x5031, 0x000C, 0x1638, +0x0110, 0x147B, 0x4C07, 0x0DC6, 0x4E04, 0x3C51, 0x008A, 0x2BFA, 0x0ACB, +0x00AB, 0x0008, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0B0F, +0x134F, 0x470C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C0A, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, +0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x4A86, 0x0000, 0x5327, 0x03E6, 0x440F, 0x5334, 0x930F, +0x23AB, 0x1674, 0x0110, 0x147B, 0x4C0A, 0x0DC5, 0x4E0B, 0x3C51, 0x4534, +0x0088, 0x2BFA, 0x08C9, 0x00A9, 0x0008, 0x407C, 0x0082, 0x090F, 0x134F, +0x08C6, 0x00A6, 0x0014, 0x403C, 0x3FFF, 0x060F, 0x134F, 0x08C7, 0x00A7, +0x0030, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, +0x2409, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x0048, 0x090F, 0x134F, 0x427C, 0x083F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x090F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x407C, 0x00A1, 0x090F, +0x134F, 0x440C, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, +0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, +0x407C, 0x0021, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x532A, 0x4B0F, +0x533B, 0x930F, 0x23AB, 0x1674, 0x0110, 0x143B, 0x8221, 0x403B, 0x00C8, +0x4381, 0x0000, 0x4381, 0x0002, 0x0088, 0x2C4E, 0x410C, 0x530C, 0x080F, +0x0F3F, 0x0030, 0x134F, 0x008A, 0x2BFA, 0x0AC9, 0x00A9, 0x0030, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C1, 0x0A3F, 0x0008, 0x134F, 0x403C, 0x0EC4, +0x430D, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0042, 0x0A3F, 0x0008, 0x134F, 0x430C, 0x0A3F, 0x0014, +0x134F, 0x4C0A, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0xB22A, 0x2C0E, 0xF22A, 0x4A0C, 0x080F, 0x0F3F, 0x0010, +0x134F, 0x430C, 0x3C13, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4B0F, 0x533B, 0x930F, 0x23F6, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x0F3F, 0x0010, 0x134F, 0x430C, 0x5221, 0x1638, 0x0110, 0x143B, 0x008B, +0x2C4E, 0x008C, 0x285A, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x204D, +0x008A, 0x285C, 0x0ACC, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2044, +0x008C, 0x285E, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x243C, 0x008B, +0x2B8A, 0x435C, 0x0B3F, 0x002C, 0x134F, 0x0088, 0x2BFA, 0x080F, 0x134F, +0x1840, 0x90B2, 0x0011, 0x285A, 0x2007, 0x1840, 0x421D, 0x285E, 0x4A2C, +0x13B2, 0x7E8C, 0x3C03, 0x4A2C, 0x13B2, 0x832A, 0x934C, 0x2021, 0x435C, +0x0B3F, 0x0030, 0x134F, 0x403C, 0x0028, 0x0B3F, 0x0024, 0x134F, 0x434C, +0x0B3F, 0x002C, 0x134F, 0x403C, 0x00C8, 0x0B3F, 0x0024, 0x134F, 0x080F, +0x134F, 0x407C, 0x0028, 0x083F, 0x0008, 0x134F, 0x4C4C, 0x430D, 0x13B2, +0x94C6, 0x930C, 0x2402, 0x430C, 0x3C01, 0x433C, 0x1638, 0x0110, 0x145B, +0x4C08, 0x4E0A, 0x0089, 0x2BFA, 0x09C6, 0x00A6, 0x0008, 0x407C, 0x00C8, +0x060F, 0x134F, 0x09C7, 0x00A7, 0x0014, 0x403C, 0x3401, 0x070F, 0x134F, +0x407C, 0x0082, 0x060F, 0x134F, 0xD038, 0x4030, 0x480C, 0x070F, 0x134F, +0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, +0x435C, 0x090F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x4A0C, 0x070F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, +0x090F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x403C, 0x3FFD, 0x070F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x060F, 0x134F, +0x403C, 0x2401, 0x070F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1656, 0x0110, +0x147B, 0x4C0A, 0x0DCB, 0x4E08, 0x3C4E, 0x0087, 0x2BFA, 0x07C9, 0x00A9, +0x0008, 0x407C, 0x0082, 0x090F, 0x134F, 0x07C6, 0x00A6, 0x0014, 0x403C, +0x3FFF, 0x060F, 0x134F, 0x00A7, 0x0030, 0x434C, 0x070F, 0x134F, 0x407C, +0x00C8, 0x090F, 0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, 0x070F, +0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x090F, 0x134F, 0x4A0C, +0x060F, 0x134F, 0x407C, 0x00A1, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, +0x434C, 0x070F, 0x134F, 0x430C, 0x060F, 0x134F, 0x4C04, 0x434C, 0x070F, +0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, +0x407C, 0x0021, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x448B, 0x0000, +0x532A, 0x03EB, 0x480F, 0x5338, 0x930F, 0x23AE, 0x1674, 0x0110, 0x145B, +0x8231, 0x0086, 0x2C4E, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, 0x134F, +0x410C, 0x522C, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x0088, 0x2BFA, 0x08C9, +0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x430A, 0x430B, 0x3C29, 0x407C, +0x00C1, 0x083F, 0x0008, 0x134F, 0x412C, 0x411D, 0x0002, 0x083F, 0x0018, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, +0x083F, 0x0008, 0x134F, 0x430C, 0x083F, 0x0014, 0x134F, 0x060F, 0x0F3F, +0x0010, 0x134F, 0x412E, 0x411F, 0x0002, 0x532E, 0x630F, 0x4E81, 0x0000, +0x4F81, 0x0002, 0x531A, 0x630B, 0x911B, 0x0006, 0x2BD4, 0x2003, 0x911A, +0x0004, 0x2BD0, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x430C, 0x5231, 0x1656, 0x0110, 0x143B, 0x430A, 0x430B, +0x3C01, 0x531A, 0x903A, 0x0007, 0x2C40, 0x930A, 0x2403, 0x903A, 0x0003, +0x2002, 0x430B, 0x3C0F, 0x932A, 0x2403, 0x903A, 0x0005, 0x2002, 0x431B, +0x3C08, 0x931A, 0x2405, 0x922A, 0x2403, 0x903A, 0x0006, 0x2001, 0x432B, +0x4B0C, 0x1380, 0x2B9A, 0x0088, 0x2BFA, 0x08CC, 0x13B0, 0x1880, 0x434C, +0x1380, 0x2BA2, 0x080F, 0x134F, 0x083F, 0x0004, 0x134F, 0x407C, 0x0028, +0x083F, 0x0008, 0x134F, 0x4C4F, 0x4F0C, 0x430D, 0x13B2, 0x8FEA, 0x930C, +0x27CA, 0x4F0C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x4B0C, 0x002F, +0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x3C0E, 0x433C, 0x002F, 0x2C4E, +0x0F3F, 0x0010, 0x134F, 0x403C, 0xAAAA, 0x002F, 0x2C4E, 0x0F3F, 0x0010, +0x134F, 0x433C, 0x1638, 0x0110, 0x141B, 0x8031, 0x0006, 0x43C1, 0x0001, +0x43C1, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x008A, 0x2C4E, 0x410C, +0x531C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x407C, 0x00B0, 0x1380, 0x2C02, +0x3C20, 0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x416C, 0x430D, +0x0B0F, 0x134F, 0x411C, 0x0002, 0x411D, 0x0004, 0x0B0F, 0x134F, 0x90F1, +0x009E, 0x0000, 0x2007, 0xB0B1, 0x0040, 0x0002, 0x2803, 0x1840, 0x4382, +0x2860, 0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x2418, +0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x008B, 0x2C16, 0xB3D1, +0x0000, 0x2BD2, 0x416C, 0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, +0x134F, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x3FE0, 0x430C, 0x5031, 0x0006, +0x161A, 0x0110, 0x140A, 0x8031, 0x000C, 0x40B1, 0x0011, 0x0006, 0x4381, +0x0004, 0x4381, 0x0002, 0x4381, 0x0000, 0x4381, 0x0008, 0x4381, 0x000A, +0x4C81, 0x0004, 0x4D81, 0x0002, 0x407C, 0x0086, 0x1380, 0x2C02, 0x008A, +0x2C0E, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0000, 0x411E, 0x0008, 0x411F, +0x000A, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x4C81, 0x0008, 0x4D81, 0x000A, +0x930F, 0x2003, 0x903E, 0x0BB8, 0x2802, 0x431C, 0x3C21, 0xB3A1, 0x0000, +0x2C07, 0x9381, 0x000A, 0x2004, 0x90B1, 0x0BB8, 0x0008, 0x2BDC, 0x9381, +0x000A, 0x2013, 0x90B1, 0x0BB8, 0x0008, 0x2C0F, 0x40B1, 0x0011, 0x0006, +0x411C, 0x0006, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x0A0F, 0x134F, 0x411C, +0x0002, 0x0A0F, 0x134F, 0x430C, 0x5031, 0x000C, 0x160A, 0x0110, 0x143B, +0x8231, 0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, +0x4038, 0x0014, 0x410B, 0x530B, 0x410A, 0x522A, 0x1213, 0x0ACD, 0x403E, +0x100C, 0x403F, 0x0020, 0x430C, 0x1380, 0x2C42, 0x4C09, 0x1213, 0x0BCD, +0x403E, 0x1010, 0x403F, 0x0020, 0x430C, 0x1380, 0x2C42, 0x5221, 0x930C, +0x242D, 0x9309, 0x242B, 0x411F, 0x0004, 0xD11F, 0x0006, 0x930F, 0x2405, +0x412F, 0xD11F, 0x0002, 0x930F, 0x2008, 0x5338, 0x23DB, 0x411F, 0x0004, +0xD11F, 0x0006, 0x930F, 0x2418, 0x412F, 0xD11F, 0x0002, 0x930F, 0x2413, +0x411C, 0x0004, 0x411D, 0x0006, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, +0x412C, 0x411D, 0x0002, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x430C, +0x3C01, 0x433C, 0x5231, 0x1638, 0x0110, 0x143B, 0x8231, 0x430B, 0x4381, +0x0004, 0x4381, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, 0x0088, 0x2C3A, +0x410A, 0x522A, 0x431E, 0x0ACD, 0x426C, 0x080F, 0x134F, 0x431E, 0x0ACD, +0x426C, 0x080F, 0x134F, 0x4191, 0x0004, 0x0000, 0x4191, 0x0006, 0x0002, +0xB0B1, 0x0010, 0x0004, 0x2803, 0xD0B1, 0x0010, 0x0000, 0xB0B1, 0x0020, +0x0004, 0x2803, 0xD0B1, 0x0020, 0x0000, 0x93C1, 0x0004, 0x3403, 0xD0B1, +0x0080, 0x0000, 0xB3A1, 0x0004, 0x2802, 0xD3A1, 0x0000, 0x412F, 0xD11F, +0x0002, 0x930F, 0x2415, 0x430E, 0x410D, 0x530D, 0x426C, 0x080F, 0x134F, +0x431E, 0x0ACD, 0x426C, 0x080F, 0x134F, 0x431E, 0x0ACD, 0x426C, 0x080F, +0x134F, 0xB0F1, 0x00B2, 0x0004, 0x2401, 0x433B, 0x4B0C, 0x5231, 0x1638, +0x0110, 0x141B, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x410C, 0x530C, +0x002F, 0x2C4E, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFCD, +0x3C41, 0x90B1, 0xA55A, 0x0000, 0x2004, 0x90B1, 0xA55A, 0x0002, 0x2408, +0x90B1, 0x5AA5, 0x0000, 0x2034, 0x90B1, 0x5AA5, 0x0002, 0x2030, 0x008B, +0x2B8A, 0x434C, 0x0B3F, 0x0030, 0x134F, 0x435C, 0x0B3F, 0x0018, 0x134F, +0x1380, 0x2BFA, 0x434C, 0x0B3F, 0x0030, 0x134F, 0x412D, 0x411C, 0x0002, +0x13B2, 0x7E8C, 0x4C4A, 0x435C, 0x0B3F, 0x0030, 0x134F, 0x403C, 0x0BB8, +0x0B3F, 0x0024, 0x134F, 0x935A, 0x2003, 0x403C, 0xFFCE, 0x3C0D, 0x407C, +0x0028, 0x1380, 0x2C02, 0x4C4C, 0x430D, 0x13B2, 0x9424, 0x930C, 0x2402, +0x430C, 0x3C01, 0x433C, 0x5221, 0x161A, 0x0110, 0x141B, 0x8231, 0x4381, +0x0000, 0x4381, 0x0002, 0x410D, 0x522D, 0x403C, 0xAA01, 0x002F, 0x2C4E, +0x0F3F, 0x0058, 0x134F, 0x930C, 0x2403, 0x013B, 0x0004, 0x3C01, 0x434B, +0x13B2, 0x8BF4, 0x930C, 0x2034, 0x410A, 0x530A, 0x1213, 0x0ACD, 0x403E, +0xED10, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2426, +0xB3A1, 0x0000, 0x280E, 0xC3A1, 0x0000, 0x1203, 0x0ACD, 0x403E, 0xED10, +0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2415, 0x03DB, +0x2402, 0x439B, 0x0000, 0x4391, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x1203, +0x0ACD, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, +0x933C, 0x2002, 0x433C, 0x3C01, 0x430C, 0x5231, 0x161A, 0x0110, 0x143B, +0x8231, 0x4381, 0x0004, 0x4381, 0x0006, 0x434A, 0x008B, 0x2C4E, 0x410C, +0x522C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x410D, 0x530D, 0x403C, 0xAA01, +0x0B0F, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2401, 0x010A, 0x03DA, 0x2412, +0x938A, 0x0000, 0x240D, 0x0088, 0x2BFA, 0x407C, 0x0028, 0x083F, 0x0008, +0x134F, 0x4C4C, 0x430D, 0x13B2, 0x90EC, 0x930C, 0x2004, 0x432C, 0x3C20, +0x433C, 0x3C1E, 0x407C, 0x00D0, 0x083F, 0x0008, 0x134F, 0x430C, 0x083F, +0x0014, 0x134F, 0x4C08, 0xB118, 0x0004, 0x2410, 0x03DA, 0x2402, 0x438A, +0x0000, 0x431C, 0x0B0F, 0x0F3F, 0x0010, 0x134F, 0x480C, 0x0B0F, 0x0F3F, +0x0010, 0x134F, 0x431C, 0x3C01, 0x432C, 0x5231, 0x1638, 0x0110, 0x141B, +0x8321, 0x433B, 0x4381, 0x0000, 0x008A, 0x2C4E, 0x410C, 0x530C, 0x0A0F, +0x0F3F, 0x002C, 0x134F, 0x9381, 0x0000, 0x243D, 0x008B, 0x2BFA, 0x407C, +0x0028, 0x0B3F, 0x0008, 0x134F, 0x4C4C, 0x903C, 0x0089, 0x240E, 0x434C, +0x1380, 0x2BA2, 0x0B0F, 0x134F, 0x0B3F, 0x0004, 0x134F, 0x407C, 0x0028, +0x0B3F, 0x0008, 0x134F, 0x4C4C, 0x0A0F, 0x0F3F, 0x0010, 0x903C, 0x0089, +0x422C, 0x200E, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, +0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x3C0E, 0x134F, 0x430C, +0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x403D, 0xC000, 0x0A0F, +0x0F3F, 0x0014, 0x134F, 0x430B, 0x4B0C, 0x5321, 0x161A, 0x0110, 0x140A, +0x8031, 0x000A, 0x4391, 0x0008, 0x4C81, 0x0006, 0x4381, 0x0000, 0x4381, +0x0002, 0x4381, 0x0004, 0x008A, 0x2BFA, 0x407C, 0x0086, 0x0A3F, 0x0008, +0x134F, 0x430C, 0x0A3F, 0x0014, 0x134F, 0x4C81, 0x0000, 0x411E, 0x0002, +0x411F, 0x0004, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x4C81, 0x0002, 0x4D81, +0x0004, 0x930F, 0x2003, 0x903E, 0x0BB8, 0x2802, 0x431C, 0x3C1C, 0xB391, +0x0000, 0x2C07, 0x9381, 0x0004, 0x2004, 0x90B1, 0x0BB8, 0x0002, 0x2BDD, +0x9381, 0x0004, 0x200E, 0x90B1, 0x0BB8, 0x0002, 0x2C0A, 0x411C, 0x0008, +0x0A3F, 0x0014, 0x134F, 0x411C, 0x0006, 0x0A3F, 0x0014, 0x134F, 0x430C, +0x5031, 0x000A, 0x160A, 0x0110, 0x145B, 0x4308, 0x430A, 0x430B, 0x0089, +0x2BFA, 0x434C, 0x093F, 0x0030, 0x134F, 0x407C, 0x0028, 0x093F, 0x0008, +0x134F, 0x430C, 0x093F, 0x0014, 0x134F, 0x4C06, 0x9318, 0x380C, 0xB32C, +0x2C0A, 0x407C, 0x00C8, 0x093F, 0x0008, 0x134F, 0x403C, 0x3400, 0x093F, +0x0014, 0x134F, 0x9308, 0x200D, 0xB326, 0x280B, 0x407C, 0x00C8, 0x093F, +0x0008, 0x134F, 0x403C, 0x3402, 0x093F, 0x0014, 0x134F, 0x4318, 0x435C, +0x093F, 0x0030, 0x134F, 0x531A, 0x630B, 0x9038, 0x000A, 0x3408, 0xB326, +0x2806, 0x930B, 0x3BC6, 0x2003, 0x903A, 0x1388, 0x2BC2, 0x9038, 0x000A, +0x3803, 0x433C, 0x433D, 0x3C02, 0x430C, 0x430D, 0x1656, 0x0110, 0x145B, +0x4308, 0x430A, 0x430B, 0x0089, 0x2BFA, 0x434C, 0x093F, 0x0030, 0x134F, +0x407C, 0x0028, 0x093F, 0x0008, 0x134F, 0x430C, 0x093F, 0x0014, 0x134F, +0x4C06, 0x9318, 0x380C, 0xB32C, 0x2C0A, 0x407C, 0x00C8, 0x093F, 0x0008, +0x134F, 0x403C, 0x3400, 0x093F, 0x0014, 0x134F, 0x9308, 0x200D, 0xB326, +0x280B, 0x407C, 0x00C8, 0x093F, 0x0008, 0x134F, 0x403C, 0x3402, 0x093F, +0x0014, 0x134F, 0x4318, 0x435C, 0x093F, 0x0030, 0x134F, 0x531A, 0x630B, +0x9038, 0x000A, 0x3408, 0xB326, 0x2806, 0x930B, 0x3BC6, 0x2003, 0x903A, +0x1388, 0x2BC2, 0x9038, 0x000A, 0x3803, 0x433C, 0x433D, 0x3C02, 0x430C, +0x430D, 0x1656, 0x0110, 0x145B, 0x4C0A, 0x4D0B, 0x0088, 0x2BFA, 0x08C9, +0x00A9, 0x0008, 0x407C, 0x0088, 0x090F, 0x134F, 0x407C, 0x0034, 0x083F, +0x0010, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x4A0C, 0x4B0D, 0x108C, +0x108D, 0xED4C, 0xED0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x083F, 0x0014, +0x134F, 0x08C6, 0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, +0x134F, 0x4A0C, 0x083F, 0x0014, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, 0x434C, 0x060F, 0x134F, +0x407C, 0x0088, 0x090F, 0x134F, 0x407C, 0x0024, 0x083F, 0x0010, 0x134F, +0x435C, 0x060F, 0x134F, 0x1656, 0x0110, 0x141B, 0x8221, 0x008A, 0x2C4E, +0x410C, 0x531C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x407C, 0x0090, 0x1380, +0x2C02, 0x3C1D, 0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x416C, +0x0B0F, 0x134F, 0x411C, 0x0002, 0x0B0F, 0x134F, 0x90F1, 0x009E, 0x0000, +0x2007, 0xB0B1, 0x0040, 0x0002, 0x2803, 0x1840, 0x4382, 0x2860, 0x415E, +0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x2416, 0x410C, 0x530C, +0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x008B, 0x2C0E, 0xB3D1, 0x0000, 0x2BD5, +0x416C, 0x0B0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x0A0F, 0x0F3F, 0x0010, +0x134F, 0x3FE2, 0x430C, 0x5221, 0x161A, 0x0110, 0x141B, 0x8031, 0x0010, +0x40B1, 0x695A, 0x000C, 0x4381, 0x000E, 0x4391, 0x0008, 0x4381, 0x000A, +0x4381, 0x0004, 0x4381, 0x0006, 0x40B1, 0x6902, 0x0000, 0x4381, 0x0002, +0x008A, 0x2C42, 0x1203, 0x410D, 0x503D, 0x000E, 0x403E, 0x4000, 0x403F, +0xE004, 0x430C, 0x0A0B, 0x134B, 0x1203, 0x410D, 0x503D, 0x000C, 0x403E, +0x4004, 0x403F, 0xE004, 0x430C, 0x0A0B, 0x134B, 0x1203, 0x410D, 0x503D, +0x000A, 0x403E, 0x4008, 0x403F, 0xE004, 0x430C, 0x0A0B, 0x134B, 0x1203, +0x410D, 0x523D, 0x403E, 0x4010, 0x403F, 0xE004, 0x430C, 0x0A0B, 0x134B, +0x430C, 0x5031, 0x0018, 0x161A, 0x0110, 0x140A, 0x8031, 0x0006, 0x4381, +0x0000, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x933C, +0x2430, 0x9381, 0x0000, 0x2002, 0x431E, 0x3C01, 0x422E, 0x403F, 0x05FA, +0x4E81, 0x0002, 0x4F81, 0x0004, 0x410A, 0x532A, 0x1203, 0x0ACD, 0x403E, +0xED0C, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2416, +0x1213, 0x0ACD, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, +0x5321, 0x933C, 0x240A, 0x9381, 0x0000, 0x2009, 0x411F, 0x0004, 0xF03F, +0xFF00, 0x903F, 0x0200, 0x2402, 0x433C, 0x3C01, 0x430C, 0x5031, 0x0006, +0x160A, 0x0110, 0x143B, 0x430A, 0x008B, 0x2BFA, 0x3C09, 0x931A, 0x240A, +0x903A, 0x0003, 0x2407, 0x930A, 0x2402, 0x932A, 0x2004, 0x4038, 0x0007, +0x3C01, 0x4238, 0x480C, 0x1380, 0x2B9A, 0x0BCC, 0x13B0, 0x1880, 0x434C, +0x1380, 0x2BA2, 0x0B0F, 0x134F, 0x0B3F, 0x004C, 0x134F, 0x903C, 0xFFFE, +0x2002, 0x933D, 0x240D, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x480C, +0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x3C11, 0x531A, 0x922A, +0x2BD0, 0x433C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x403C, 0xAAAA, +0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x433C, 0x1638, 0x0110, 0x145B, +0x4C0A, 0x0088, 0x2BFA, 0x08C9, 0x00A9, 0x0008, 0x407C, 0x00C8, 0x090F, +0x134F, 0x08C6, 0x00A6, 0x0014, 0x403C, 0x3401, 0x060F, 0x134F, 0x407C, +0x0082, 0x090F, 0x134F, 0x403C, 0x4030, 0x060F, 0x134F, 0x00A8, 0x0030, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, +0x2401, 0x060F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1656, 0x0110, 0x143B, +0x120D, 0x120C, 0x8221, 0x4E0A, 0x4F0B, 0x4079, 0x0028, 0x4381, 0x0000, +0x4381, 0x0002, 0x4108, 0x5228, 0x1203, 0x08CD, 0x403E, 0xEDF8, 0x403F, +0xE000, 0x430C, 0x1380, 0x2C42, 0xD31B, 0x4A81, 0x0006, 0x4B81, 0x0008, +0x1203, 0x08CD, 0x403E, 0xEDF4, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, +0x410B, 0x522B, 0x5221, 0x1213, 0x0BCD, 0x403E, 0xEDF0, 0x403F, 0xE000, +0x430C, 0x1380, 0x2C42, 0x5379, 0x5321, 0x9349, 0x2407, 0xB391, 0x0002, +0x2BF0, 0x431C, 0x5231, 0x1638, 0x0110, 0x430C, 0x3FFB, 0x4303, 0x140A, +0x8321, 0x4381, 0x0000, 0x008A, 0x2B8A, 0x431C, 0x0A3F, 0x0044, 0x134F, +0x403C, 0x01F4, 0x0A3F, 0x0024, 0x134F, 0x434C, 0x0A3F, 0x0018, 0x134F, +0x008A, 0x2BFA, 0x0A0F, 0x134F, 0x0A3F, 0x0004, 0x134F, 0x407C, 0x0028, +0x0A3F, 0x0008, 0x134F, 0x4C4C, 0x4C81, 0x0000, 0x90B1, 0x0089, 0x0000, +0x2014, 0x008A, 0x2C4E, 0x435C, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x407C, +0x0089, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x436C, 0x0A0F, 0x0F3F, 0x0008, +0x134F, 0x430C, 0x3C01, 0x433C, 0x5321, 0x160A, 0x0110, 0x140A, 0x8231, +0x4381, 0x0000, 0x4381, 0x0002, 0x410D, 0x522D, 0x403C, 0xAA01, 0x002F, +0x2C4E, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2416, 0x013A, 0x0004, 0x03DA, +0x2403, 0x938A, 0x0000, 0x2422, 0x1213, 0x410D, 0x532D, 0x403E, 0xEDF0, +0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2004, 0x433C, +0x3C14, 0x434A, 0x3FEF, 0xB3A1, 0x0002, 0x280E, 0x412C, 0x411D, 0x0002, +0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x03DA, 0x2402, 0x438A, 0x0000, +0x431C, 0x3C01, 0x432C, 0x5231, 0x160A, 0x0110, 0x140A, 0x8221, 0x4391, +0x0000, 0x40B1, 0xA05F, 0x0002, 0x410A, 0x530A, 0x1203, 0x0ACD, 0x403E, +0xEDF0, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2423, +0x40B1, 0x0401, 0x0000, 0x40B1, 0x0100, 0x0002, 0x1203, 0x0ACD, 0x403E, +0xEDFC, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2411, +0x40B1, 0x001F, 0x0000, 0x4381, 0x0002, 0x1203, 0x0ACD, 0x403E, 0xED30, +0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x933C, 0x2002, 0x433C, +0x3C01, 0x430C, 0x5221, 0x160A, 0x0110, 0x140A, 0x8231, 0x4381, 0x0004, +0x4381, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, 0x410A, 0x522A, 0x431E, +0x0ACD, 0x434C, 0x1380, 0x2C3A, 0x431E, 0x0ACD, 0x426C, 0x1380, 0x2C3A, +0xB0B1, 0x0010, 0x0004, 0x2802, 0xD3A1, 0x0000, 0xB0B1, 0x0020, 0x0004, +0x2802, 0xD2A1, 0x0000, 0x93C1, 0x0004, 0x3402, 0xD2B1, 0x0000, 0xB3A1, +0x0004, 0x2803, 0xD0B1, 0x0010, 0x0000, 0x412F, 0xD11F, 0x0002, 0x930F, +0x2406, 0x430E, 0x410D, 0x530D, 0x434C, 0x1380, 0x2C3A, 0x5231, 0x160A, +0x0110, 0x143B, 0x120F, 0x120E, 0x8221, 0x0CCB, 0x1203, 0x410D, 0x503D, +0x0006, 0x403E, 0xEDF4, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x4078, +0x0028, 0x4381, 0x0002, 0x4381, 0x0004, 0x410A, 0x532A, 0x5321, 0x1213, +0x0ACD, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5378, +0x5321, 0x9348, 0x2403, 0xB391, 0x0002, 0x2BF0, 0x1213, 0x0BCD, 0x403E, +0xEDF8, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, 0x9348, 0x2002, +0x430C, 0x3C01, 0x431C, 0x5231, 0x1638, 0x0110, 0x403E, 0x0018, 0x430F, +0x430D, 0x008C, 0x2C52, 0x13B2, 0x981A, 0x403E, 0x0020, 0x430F, 0x430D, +0x008C, 0x2D00, 0x13B2, 0x981A, 0x403E, 0x0010, 0x430F, 0x430D, 0x008C, +0x2B6A, 0x13B2, 0x981A, 0x1840, 0x40B2, 0xE000, 0x2B7A, 0x1840, 0x40B2, +0xE000, 0x2B7C, 0x1840, 0x4382, 0x289C, 0x1840, 0x43C2, 0x2D20, 0x1840, +0x4382, 0x289E, 0x1840, 0x40B2, 0x0417, 0x28C0, 0x1840, 0x4382, 0x28C2, +0x403E, 0x0018, 0x430F, 0x430D, 0x008C, 0x28A0, 0x0280, 0x981A, 0x141B, +0x430A, 0x430B, 0x3C10, 0x403C, 0xAAAA, 0x1380, 0x2C0E, 0x4C0B, 0x903C, +0x5555, 0x2007, 0x403C, 0x5555, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, +0x531A, 0x903A, 0x0003, 0x2C16, 0x407C, 0x0028, 0x1380, 0x2C02, 0x4C4C, +0x903C, 0x0099, 0x27E5, 0x903C, 0x0098, 0x27E2, 0x903C, 0x0095, 0x27DF, +0x903C, 0x0091, 0x27DC, 0x903C, 0x0089, 0x27D9, 0x433C, 0x3C07, 0x4B0C, +0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x161A, 0x0110, 0x141B, +0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x403B, 0x00C8, 0x410A, 0x530A, +0x431E, 0x0ACD, 0x426C, 0x1380, 0x2C3A, 0x412E, 0x411F, 0x0002, 0xD03F, +0x5000, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430E, 0x0ACD, 0x426C, 0x1380, +0x2C3A, 0x431E, 0x0ACD, 0x426C, 0x1380, 0x2C3A, 0x533B, 0x411F, 0x0002, +0xF03F, 0xA000, 0x903F, 0xA000, 0x2402, 0x930B, 0x23F1, 0x930B, 0x2002, +0x433C, 0x3C01, 0x430C, 0x5221, 0x161A, 0x0110, 0x140A, 0x8231, 0x40B1, +0x695A, 0x0004, 0x4381, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, 0x403A, +0x0064, 0x1203, 0x410D, 0x503D, 0x0006, 0x403E, 0x4000, 0x403F, 0xE004, +0x430C, 0x1380, 0x2C42, 0x5321, 0x1213, 0x410D, 0x532D, 0x403E, 0x4020, +0x403F, 0xE004, 0x430C, 0x1380, 0x2C42, 0x533A, 0x5321, 0xB2B1, 0x0000, +0x2802, 0x533A, 0x23EF, 0x930A, 0x2002, 0x433C, 0x3C01, 0x430C, 0x5231, +0x160A, 0x0110, 0x907E, 0x0010, 0x2808, 0x4C0D, 0x430C, 0x807E, 0x0011, +0x3002, 0x18CE, 0x5D0D, 0x0110, 0xE37E, 0x507E, 0x0010, 0x065E, 0x0EE0, +0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, +0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, +0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, +0x6D0D, 0x5C0C, 0x6D0D, 0x0110, 0x907E, 0x0010, 0x2808, 0x4D0C, 0x430D, +0x807E, 0x0011, 0x3002, 0x19CE, 0x100C, 0x0110, 0xE37E, 0x507E, 0x0010, +0x065E, 0x0EE0, 0x035D, 0x100C, 0x035D, 0x100C, 0x035D, 0x100C, 0x035D, +0x100C, 0x035D, 0x100C, 0x035D, 0x100C, 0x035D, 0x100C, 0x035D, 0x100C, +0x035D, 0x100C, 0x035D, 0x100C, 0x035D, 0x100C, 0x035D, 0x100C, 0x035D, +0x100C, 0x035D, 0x100C, 0x035D, 0x100C, 0x0110, 0x141B, 0x008A, 0x2B8A, +0x008B, 0x28A0, 0x938B, 0x0010, 0x240D, 0x407C, 0x00F4, 0x1380, 0x2C02, +0x4B1C, 0x0012, 0x1380, 0x2C0E, 0x403C, 0x0014, 0x0A3F, 0x0024, 0x134F, +0x4B2F, 0xDB1F, 0x0002, 0x930F, 0x240F, 0x407C, 0x0054, 0x1380, 0x2C02, +0x4B1C, 0x0004, 0x4B1D, 0x0006, 0x1380, 0x2C16, 0x403C, 0x0014, 0x0A3F, +0x0024, 0x134F, 0x0A3F, 0x001C, 0x134F, 0x430C, 0x161A, 0x0110, 0x140A, +0x8321, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, 0x0028, 0x134F, 0x930C, +0x3403, 0x403C, 0xFFEB, 0x3C1C, 0x416C, 0x1380, 0x2B9A, 0x930C, 0x2403, +0x403C, 0xFFEA, 0x3C14, 0x008A, 0x2BFA, 0x0ACC, 0x13B0, 0x1880, 0x434C, +0x1380, 0x2BA2, 0x0A0F, 0x134F, 0x0A3F, 0x0004, 0x134F, 0x435C, 0x002F, +0x2C4E, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x5321, 0x160A, 0x0110, 0x140A, +0x8221, 0x43A1, 0x0000, 0x4381, 0x0002, 0x410A, 0x530A, 0x1203, 0x0ACD, +0x1840, 0x421E, 0x2B7E, 0x1840, 0x421F, 0x2B80, 0x430C, 0x1380, 0x2C42, +0x5321, 0x933C, 0x2411, 0x4381, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x1203, +0x0ACD, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1380, 0x2C42, 0x5321, +0x933C, 0x2002, 0x433C, 0x3C01, 0x430C, 0x5221, 0x160A, 0x0110, 0x8231, +0x4381, 0x0000, 0x4381, 0x0002, 0x40B1, 0x695A, 0x0004, 0x4381, 0x0006, +0x1203, 0x410D, 0x503D, 0x0006, 0x403E, 0x4000, 0x403F, 0xE004, 0x430C, +0x1380, 0x2C42, 0x1213, 0x410D, 0x522D, 0x403E, 0x4020, 0x403F, 0xE004, +0x430C, 0x1380, 0x2C42, 0x411C, 0x0004, 0x411D, 0x0006, 0x002F, 0x2C4E, +0x0F3F, 0x0014, 0x134F, 0x430C, 0x5031, 0x000C, 0x0110, 0x143B, 0x4C0A, +0x0088, 0x2BFA, 0x407C, 0x0082, 0x083F, 0x0008, 0x134F, 0x403C, 0x4030, +0x083F, 0x0014, 0x134F, 0x08C9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x4A0C, 0x083F, 0x0014, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x1638, 0x0110, 0x903C, 0x0089, 0x2002, +0x930D, 0x2424, 0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, +0x2002, 0x930D, 0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, +0x0098, 0x2002, 0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, +0x803C, 0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, +0x435C, 0x0110, 0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, 0x2424, +0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, 0x930D, +0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, 0x2002, +0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, 0x0477, +0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, +0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, 0x2424, 0x903C, 0x008D, +0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, 0x930D, 0x241A, 0x903C, +0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, 0x2002, 0x930D, 0x2410, +0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, 0x0477, 0x703D, 0x4BA0, +0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x435C, 0x0110, +0x903C, 0x0089, 0x2002, 0x930D, 0x2424, 0x903C, 0x008D, 0x2002, 0x930D, +0x241F, 0x903C, 0x0091, 0x2002, 0x930D, 0x241A, 0x903C, 0x0095, 0x2002, +0x930D, 0x2415, 0x903C, 0x0098, 0x2002, 0x930D, 0x2410, 0x903C, 0x0099, +0x2002, 0x930D, 0x240B, 0x803C, 0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x435C, 0x0110, 0x903C, 0x0089, +0x2002, 0x930D, 0x2424, 0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, +0x0091, 0x2002, 0x930D, 0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, +0x903C, 0x0098, 0x2002, 0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, +0x240B, 0x803C, 0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, +0x0110, 0x435C, 0x0110, 0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, +0x2424, 0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, +0x930D, 0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, +0x2002, 0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, +0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, 0x2424, 0x903C, +0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, 0x930D, 0x241A, +0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, 0x2002, 0x930D, +0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, 0x0477, 0x703D, +0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x435C, +0x0110, 0x140A, 0x008A, 0x2B8A, 0x434C, 0x0A3F, 0x0030, 0x134F, 0x403C, +0x0028, 0x0A3F, 0x0024, 0x134F, 0x434C, 0x0A3F, 0x0034, 0x134F, 0x403C, +0x0028, 0x0A3F, 0x0024, 0x134F, 0x434C, 0x0A3F, 0x002C, 0x134F, 0x1380, +0x2BFA, 0x407C, 0x0028, 0x1380, 0x2C02, 0x4C4C, 0x430D, 0x13B2, 0x9424, +0x930C, 0x2002, 0x433C, 0x3C01, 0x430C, 0x160A, 0x0110, 0x140A, 0x8221, +0x433A, 0x4381, 0x0000, 0x4381, 0x0002, 0x1840, 0x421F, 0x2B86, 0x1840, +0xD21F, 0x2B88, 0x930F, 0x2414, 0x431E, 0x410D, 0x530D, 0x426C, 0x1380, +0x2C3A, 0xB0B1, 0x2000, 0x0002, 0x280D, 0x13B2, 0x8BF4, 0x930C, 0x2004, +0x13B2, 0x8C5C, 0x930C, 0x2402, 0x432C, 0x3C04, 0x13B2, 0x8934, 0x4C0A, +0x4A0C, 0x5221, 0x160A, 0x0110, 0x1800, 0x1246, 0x1800, 0x1247, 0x4D06, +0xD07D, 0x0080, 0x6606, 0x6707, 0x1086, 0xF376, 0x8076, 0x007F, 0x2C03, +0x430C, 0x430D, 0x3C13, 0x8076, 0x0018, 0x2C07, 0xE376, 0x240E, 0x110D, +0x100C, 0x8356, 0x23FC, 0x3C09, 0x9236, 0x3803, 0x433C, 0x433D, 0x3C04, +0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x1800, 0x4177, 0x1800, 0x4176, +0x0110, 0x140A, 0x008A, 0x2B8A, 0x435C, 0x0A3F, 0x002C, 0x134F, 0x1380, +0x2BFA, 0x403C, 0xA55A, 0x13B2, 0x832A, 0x931C, 0x2415, 0x403C, 0x0028, +0x0A3F, 0x0024, 0x134F, 0x435C, 0x0A3F, 0x0030, 0x134F, 0x407C, 0x0028, +0x1380, 0x2C02, 0x4C4C, 0x430D, 0x13B2, 0x9424, 0x930C, 0x2402, 0x430C, +0x3C01, 0x433C, 0x160A, 0x0110, 0x8231, 0x4381, 0x0004, 0x4381, 0x0006, +0x4381, 0x0000, 0x4381, 0x0002, 0x410D, 0x530D, 0x410C, 0x522C, 0x1380, +0x2B96, 0x411C, 0x0004, 0x411D, 0x0006, 0x13B2, 0x9912, 0x002F, 0x2C4E, +0x0F3F, 0x0010, 0x134F, 0x412C, 0x411D, 0x0002, 0x13B2, 0x9912, 0x002F, +0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x5231, 0x0110, 0x1800, 0x1249, +0x1800, 0x124A, 0x1800, 0x124B, 0x430A, 0x430B, 0x4039, 0x0020, 0x5C0C, +0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, 0x5339, 0x23F6, +0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, 0x1800, 0x417B, +0x1800, 0x417A, 0x1800, 0x4179, 0x0110, 0x434E, 0x3C07, 0x1840, 0x43BD, +0x28C4, 0x1800, 0x43CD, 0x28C6, 0x535E, 0x907E, 0x0070, 0x2C11, 0x4E4D, +0x0DED, 0x0DCF, 0x0DED, 0x0FED, 0x907E, 0x006E, 0x2FEE, 0x1840, 0x4D9D, +0x2472, 0x28C4, 0x1800, 0x4DDD, 0x2474, 0x28C6, 0x3FEB, 0x0110, 0x141B, +0x407C, 0x0086, 0x1380, 0x2C02, 0x008B, 0x2C0E, 0x430C, 0x0B0F, 0x134F, +0xB23C, 0x280E, 0x403C, 0x0014, 0x0B0F, 0x134F, 0x430C, 0x0B0F, 0x134F, +0x4C0A, 0x430C, 0x0B0F, 0x134F, 0x4C0D, 0x4A0C, 0x3C02, 0x430C, 0x430D, +0x161A, 0x0110, 0x140A, 0x430A, 0x3C01, 0x531A, 0x922A, 0x3413, 0x407C, +0x0028, 0x1380, 0x2C02, 0x4C4F, 0x4F0C, 0x430D, 0x13B2, 0x9040, 0x930C, +0x27F2, 0x4F0C, 0x002F, 0x2C4E, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x3C01, +0x433C, 0x160A, 0x0110, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1900, 0x40F2, 0x611E, 0x280C, 0x1900, 0x40F2, +0x7B14, 0x2810, 0x1900, 0x40F2, 0x87BC, 0x2814, 0x1900, 0x40F2, 0x78EE, +0x2818, 0x1900, 0x40F2, 0x7BCA, 0x281C, 0x002F, 0x2938, 0x0F60, 0x2820, +0x430C, 0x0280, 0x5B10, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1900, 0x40F2, 0x55D2, 0x280C, 0x1900, 0x40F2, +0x707A, 0x2810, 0x1900, 0x40F2, 0x84F4, 0x2814, 0x1900, 0x40F2, 0x760A, +0x2818, 0x1900, 0x40F2, 0x7836, 0x281C, 0x002F, 0x29B6, 0x0F60, 0x2820, +0x430C, 0x0280, 0x5EBA, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1900, 0x40F2, 0x55D2, 0x280C, 0x1900, 0x40F2, +0x707A, 0x2810, 0x1900, 0x40F2, 0x84F4, 0x2814, 0x1900, 0x40F2, 0x760A, +0x2818, 0x1900, 0x40F2, 0x7836, 0x281C, 0x002F, 0x29B6, 0x0F60, 0x2820, +0x430C, 0x0280, 0x5B10, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1900, 0x40F2, 0x611E, 0x280C, 0x1900, 0x40F2, +0x7B14, 0x2810, 0x1900, 0x40F2, 0x8EE6, 0x2814, 0x1900, 0x40F2, 0x78EE, +0x2818, 0x1900, 0x40F2, 0x7BCA, 0x281C, 0x002F, 0x2938, 0x0F60, 0x2820, +0x431C, 0x0280, 0x5EBA, 0x1900, 0x40F2, 0x611E, 0x280C, 0x1900, 0x40F2, +0x7B14, 0x2810, 0x1900, 0x40F2, 0x8EE6, 0x2814, 0x1900, 0x40F2, 0x78EE, +0x2818, 0x1900, 0x40F2, 0x7BCA, 0x281C, 0x002F, 0x2938, 0x0F60, 0x2820, +0x431C, 0x0280, 0x5B10, 0x1900, 0x40F2, 0x611E, 0x280C, 0x1900, 0x40F2, +0x7B14, 0x2810, 0x1900, 0x40F2, 0x87BC, 0x2814, 0x1900, 0x40F2, 0x78EE, +0x2818, 0x1900, 0x40F2, 0x7BCA, 0x281C, 0x002F, 0x2938, 0x0F60, 0x2820, +0x430C, 0x0280, 0x5EBA, 0x140A, 0x008A, 0x2BFA, 0x407C, 0x0086, 0x0A3F, +0x0008, 0x134F, 0x430C, 0x0A3F, 0x0014, 0x134F, 0xB22C, 0x2809, 0x422C, +0x0A3F, 0x0014, 0x134F, 0x430C, 0x0A3F, 0x0014, 0x134F, 0x3C01, 0x430C, +0x160A, 0x0110, 0x1800, 0x1246, 0x4D06, 0x5606, 0x9036, 0xFF01, 0x2C05, +0x4F06, 0x5606, 0x9036, 0xFF01, 0x2802, 0xC322, 0x3C09, 0xB03D, 0x7FFF, +0x2003, 0xB03F, 0x7FFF, 0x3C03, 0x9D0F, 0x2001, 0x9C0E, 0x1800, 0x4176, +0x0110, 0x8321, 0x4381, 0x0000, 0x410C, 0x530C, 0x002F, 0x2C4E, 0x0F3F, +0x002C, 0x134F, 0x9381, 0x0000, 0x2404, 0x431C, 0x1380, 0x2B92, 0x3C03, +0x430C, 0x1380, 0x2B92, 0x430C, 0x5321, 0x0110, 0x1840, 0x4392, 0x246E, +0x1840, 0x4382, 0x2858, 0x1840, 0x4382, 0x284E, 0x1840, 0x4382, 0x2850, +0x1840, 0x4382, 0x2852, 0x1840, 0x4382, 0x2854, 0x1840, 0x4382, 0x2860, +0x430C, 0x0110, 0x140A, 0x8321, 0x433A, 0x43C1, 0x0000, 0x410C, 0x530C, +0x002F, 0x2C4E, 0x0F3F, 0x0028, 0x134F, 0x933C, 0x2404, 0x416C, 0x1380, +0x2C32, 0x430A, 0x4A0C, 0x5321, 0x160A, 0x0110, 0x143B, 0x4E0A, 0x4F0B, +0x0CC8, 0x3C06, 0x4DE8, 0x0000, 0x00A8, 0x0001, 0x00AD, 0x0001, 0x4A09, +0x4B0F, 0x533A, 0x633B, 0xDF09, 0x9309, 0x23F3, 0x1638, 0x0110, 0x907B, +0x0010, 0x2807, 0x4D0C, 0x4E0D, 0x4F0E, 0x430F, 0x807B, 0x0010, 0x3FF6, +0x934B, 0x2406, 0x035F, 0x100E, 0x100D, 0x100C, 0x835B, 0x23FA, 0x0110, +0x4C0D, 0x4C0E, 0xF03E, 0x000F, 0x431C, 0x835E, 0x3002, 0x18CE, 0x5C0C, +0x907D, 0x0010, 0x2803, 0x4C0D, 0x430C, 0x0110, 0x430D, 0x0110, 0x4382, +0x0400, 0x40B2, 0x02C0, 0x0400, 0x40B2, 0x07D8, 0x0412, 0xC392, 0x0402, +0xD0B2, 0x0010, 0x0402, 0xD0B2, 0x0014, 0x0400, 0x0110, 0x1202, 0xC232, +0x4303, 0x4C82, 0x04D0, 0x4D82, 0x04D2, 0x4E82, 0x04E0, 0x4F82, 0x04E2, +0x421C, 0x04E4, 0x421D, 0x04E6, 0x4132, 0x0110, 0x143B, 0x0CC8, 0x3C04, +0x4DC8, 0x0000, 0x00A8, 0x0001, 0x4E09, 0x4F0B, 0x533E, 0x633F, 0xDB09, +0x9309, 0x23F5, 0x1638, 0x0110, 0x1380, 0x2C46, 0x4C0F, 0xDD0F, 0x930F, +0x2407, 0x002F, 0x2C4E, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x0110, 0x433C, +0x0110, 0x407C, 0x0094, 0x1380, 0x2C02, 0x434C, 0x1380, 0x2C0A, 0x002F, +0x2C4E, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x0110, 0x8321, 0x410C, 0x530C, +0x002F, 0x2C4E, 0x0F3F, 0x002C, 0x134F, 0x412C, 0x1380, 0x2B8E, 0x430C, +0x5321, 0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, 0x3C04, 0x43CC, 0x0000, +0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, 0x1800, 0x124C, 0x4EFC, 0x0000, +0x00AC, 0x0001, 0x00BD, 0x0001, 0x23F9, 0x1800, 0x417C, 0x0110, 0x035D, +0x100C, 0x035D, 0x100C, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF37D, 0x0110, +0x1800, 0x124C, 0x438C, 0x0000, 0x532C, 0x831E, 0x23FB, 0x1800, 0x417C, +0x0110, 0x435C, 0x002F, 0x2C4E, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x0110, +0xC0B2, 0x0010, 0x0400, 0x4382, 0x0400, 0x0020, 0x2BCA, 0x13B2, 0x96AA, +0x430C, 0x2401, 0x531C, 0x0110, 0x13B2, 0x9240, 0x2802, 0x430C, 0x430D, +0x0110, 0x430C, 0x430D, 0x430E, 0x430F, 0x0110, 0x430C, 0x430D, 0x430E, +0x430F, 0x0110, 0x430C, 0x430D, 0x430E, 0x430F, 0x0110, 0x403C, 0x0021, +0x0180, 0xF63E, 0x403C, 0x0020, 0x0180, 0xF63E, 0x430C, 0x430D, 0x0110, +0x430C, 0x430D, 0x0110, 0x430C, 0x0180, 0xF63E, 0x430C, 0x0110, 0x430C, +0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x434C, 0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x430C, +0x0110, 0x430C, 0x0110, 0x0280, 0x9766, 0x430C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x434C, 0x0110, 0x430C, +0x0110, 0x430C, 0x0110, 0x433C, 0x0110, 0x434C, 0x0110, 0x433C, 0x0110, +0x433C, 0x0110, 0x433C, 0x0110, 0x430C, 0x0110, 0x0110, 0x0110, 0x0110, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x5555, 0x5555, 0x0120, +0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, +0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, +0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, +0x0000, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0000, +0x5A80, 0x0000, 0x0000, 0x0000, 0x5A83, 0x0000, 0x0000, 0x0120, 0x5A80, +0x0120, 0x5A80, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0900, 0x0301, 0x0705, 0x0281, 0x0000, 0x0000, 0xFF04, +0x0FFF, 0x0600, 0x0001, 0x0000, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, +0x0109, 0x0503, 0x8107, 0x0002, 0x0000, 0x0400, 0xFFFF, 0x000F, 0x0106, +0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0xFF00, 0xCACA, 0xCACA, +0x40B2, 0x5A80, 0x0120, 0xC232, 0xC0F2, 0x003F, 0x0057, 0xD0F2, 0x0007, +0x0057, 0x45C2, 0x0056, 0x46C2, 0x0057, 0x43C2, 0x0058, 0xEA0A, 0xE909, +0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x40B2, 0x5A80, 0x0120, +0xC232, 0xD072, 0x0040, 0x4032, 0x0040, 0x40F2, 0x0080, 0x0052, 0x43C2, +0x0050, 0x45C2, 0x0051, 0xD0F2, 0x0080, 0x0053, 0xC0F2, 0x005F, 0x0054, +0xEA0A, 0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x0001, +0x015C, 0x0000, 0x9962, 0x0002, 0x0001, 0x995E, 0x0002, 0x0002, 0x9874, +0x0002, 0x0003, 0x92E2, 0x0002, 0x0004, 0x8DDA, 0x0002, 0x0005, 0x6F94, +0x0002, 0x0006, 0x8D7C, 0x0002, 0x0007, 0x4492, 0x0002, 0x0008, 0x9858, +0x0002, 0x0009, 0x973A, 0x0002, 0x000A, 0x81E6, 0x0002, 0x000B, 0x649E, +0x0002, 0x000C, 0x93EC, 0x0002, 0x000D, 0x99A2, 0x0002, 0x000E, 0x999A, +0x0002, 0x000F, 0x98E8, 0x0002, 0x0010, 0x7D2C, 0x0002, 0x0011, 0x72FE, +0x0002, 0x0012, 0xDE30, 0x0001, 0x0013, 0xEA68, 0x0001, 0x0014, 0x13DC, +0x0002, 0x0015, 0x6378, 0x0002, 0x0016, 0x572A, 0x0002, 0x0017, 0x4BD4, +0x0002, 0x0018, 0x4EC6, 0x0002, 0x0019, 0x519E, 0x0002, 0x001A, 0x8588, +0x0002, 0x001B, 0x998A, 0x0002, 0x001C, 0x3E82, 0x0002, 0x001D, 0x7234, +0x0002, 0x001E, 0x6BD4, 0x0002, 0x001F, 0x29EE, 0x0002, 0x0020, 0xA4FE, +0x0001, 0x0021, 0xB918, 0x0001, 0x0022, 0x9490, 0x0002, 0x0023, 0x960A, +0x0002, 0x0024, 0x9640, 0x0002, 0x0025, 0x95D4, 0x0002, 0x0026, 0x4874, +0x0002, 0x0027, 0xD7EE, 0x0001, 0x0028, 0xFBEE, 0x0001, 0x0029, 0x2368, +0x0002, 0x002A, 0x5FEC, 0x0002, 0x002B, 0x66C8, 0x0002, 0x002C, 0x4A34, +0x0002, 0x002D, 0x4D54, 0x0002, 0x002E, 0x5032, 0x0002, 0x002F, 0x7DDC, +0x0002, 0x0030, 0x2CA8, 0x0002, 0x0031, 0x68DA, 0x0002, 0x0032, 0x5882, +0x0002, 0x0033, 0x3C76, 0x0002, 0x0034, 0x8E8A, 0x0001, 0x0035, 0x9568, +0x0002, 0x0036, 0x94FC, 0x0002, 0x0037, 0x4690, 0x0002, 0x0038, 0x546C, +0x0002, 0x0039, 0x65B8, 0x0002, 0x003A, 0xE458, 0x0001, 0x003B, 0xCA4A, +0x0001, 0x003C, 0x0B20, 0x0002, 0x003D, 0x7C7C, 0x0002, 0x003E, 0x360E, +0x0002, 0x003F, 0x624C, 0x0002, 0x0040, 0x6CC8, 0x0002, 0x0041, 0x33CA, +0x0002, 0x0042, 0x3174, 0x0002, 0x0043, 0x5D84, 0x0002, 0x0044, 0x4292, +0x0002, 0x0045, 0xD146, 0x0001, 0x0046, 0x6EAC, 0x0002, 0x0047, 0x5C4E, +0x0002, 0x0048, 0x6DBA, 0x0002, 0x0049, 0x0F8C, 0x0002, 0x004A, 0x993C, +0x0002, 0x004B, 0x715C, 0x0002, 0x004C, 0x8B88, 0x0002, 0x004D, 0x9294, +0x0002, 0x004E, 0x1FBA, 0x0002, 0x004F, 0x7A5E, 0x0002, 0x0050, 0x2F16, +0x0002, 0x0051, 0x408A, 0x0002, 0x0052, 0x970C, 0x0002, 0x0053, 0x88B8, +0x0002, 0x0054, 0x8288, 0x0002, 0x0055, 0x9944, 0x0002, 0x0056, 0x96DE, +0x0002, 0x0057, 0x8094, 0x0002, 0x0058, 0x99B2, 0x0002, 0x0059, 0x9198, +0x0002, 0x005A, 0x3A68, 0x0002, 0x005B, 0x983A, 0x0002, 0x005C, 0x7488, +0x0002, 0x005D, 0xF06A, 0x0001, 0x005E, 0x754C, 0x0002, 0x005F, 0x73C4, +0x0002, 0x0060, 0x89B0, 0x0002, 0x0061, 0x8E34, 0x0002, 0x0062, 0x5306, +0x0002, 0x0063, 0x76C6, 0x0002, 0x0064, 0x86A8, 0x0002, 0x0065, 0x6ADA, +0x0002, 0x0066, 0x91EC, 0x0002, 0x0067, 0x069C, 0x0002, 0x0068, 0x8732, +0x0002, 0x0069, 0x9958, 0x0002, 0x006A, 0x7F3A, 0x0002, 0x006B, 0x8E8E, +0x0002, 0x006C, 0x861A, 0x0002, 0x006D, 0x79A6, 0x0002, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +}; + +const uint32_t MSP_FetHalImage_address[] = +{ +0x00001900, 0x00018E00, +}; +const uint32_t MSP_FetHalImage_length_of_sections[] = +{ +0x00000040, 0x0000C000, +}; +const uint32_t MSP_FetHalImage_sections = 0x00000002; +const uint32_t MSP_FetHalImage_termination = 0x00000000; +const uint32_t MSP_FetHalImage_start = 0x00001900; +const uint32_t MSP_FetHalImage_finish = 0x00030E00; +const uint32_t MSP_FetHalImage_length = 0x0002F500; + +#define MSP_FETHALIMAGE_TERMINATION 0x00000000 +#define MSP_FETHALIMAGE_START 0x00001900 +#define MSP_FETHALIMAGE_FINISH 0x00030E00 +#define MSP_FETHALIMAGE_LENGTH 0x0002F500 +#define MSP_FETHALIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/MSP_FetHil.h b/Bios/include/MSP_FetHil.h new file mode 100644 index 0000000..4c3b69f --- /dev/null +++ b/Bios/include/MSP_FetHil.h @@ -0,0 +1,2762 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP_FetHilImage[] = +{ +0x03DC, 0x2406, 0x008E, 0x2E8E, 0x008D, 0x002A, 0x13B1, 0x4E36, 0x0110, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03DC, 0x2406, +0x008E, 0x2E1E, 0x008D, 0x0038, 0x13B1, 0x4E36, 0x0110, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0010, 0x0012, 0xCC00, 0x6153, 0xF00D, +0xF00D, 0x4180, 0x620E, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, +0x1840, 0x1207, 0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, +0x120B, 0x1840, 0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, +0x008C, 0x2E12, 0x403E, 0x02E0, 0x403F, 0x0000, 0x13B1, 0x4DDA, 0x1840, +0x413F, 0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, 0x413B, +0x1840, 0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, 0x1840, +0x4136, 0x1840, 0x4135, 0x1840, 0x4134, 0x1880, 0x4070, 0x4EAA, 0x4011, +0x6194, 0x145B, 0x120F, 0x120E, 0x120D, 0x120C, 0x8031, 0x0010, 0x0086, +0x2F60, 0x1840, 0x425E, 0x30EF, 0xB65E, 0x000C, 0x2405, 0x1800, 0x40F2, +0x2F9F, 0x0522, 0x3C04, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x06CC, +0x00AC, 0x000E, 0x06CD, 0x00AD, 0x000C, 0x0C0F, 0xCDEF, 0x0000, 0x06CF, +0x00AF, 0x000D, 0x06CE, 0x00AE, 0x0008, 0x0E0B, 0xCFEB, 0x0000, 0x4303, +0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, +0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x4381, 0x0008, 0x4381, 0x000A, +0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, +0x0004, 0x40B1, 0x8000, 0x0006, 0x410B, 0x530B, 0xBBB1, 0x0010, 0x2029, +0xBBB1, 0x0012, 0x2026, 0xBBB1, 0x0014, 0x2023, 0xBBB1, 0x0016, 0x2416, +0x3C1F, 0xB318, 0x2BEF, 0x410B, 0x530B, 0xBBB1, 0x0010, 0x2009, 0xBBB1, +0x0012, 0x2006, 0xBBB1, 0x0014, 0x2003, 0xBBB1, 0x0016, 0x240B, 0x1800, +0x40F2, 0x2F9F, 0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0x3C09, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x063B, 0x0004, 0x1840, +0x4BE2, 0x2F9E, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E0B, +0xDFEB, 0x0000, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x410B, 0x523B, +0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x5808, 0x6909, 0x6A0A, 0x6B0B, 0x4881, +0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, 0x1840, 0x425A, +0x2F9E, 0xB65A, 0x000C, 0x2002, 0x4347, 0x3C01, 0x4357, 0x410B, 0x523B, +0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0xD708, 0x4881, 0x0008, 0x4981, 0x000A, +0x4A81, 0x000C, 0x4B81, 0x000E, 0x410B, 0x530B, 0x4B38, 0x4B39, 0x4B3A, +0x4B3B, 0x035B, 0x100A, 0x1009, 0x1008, 0x4881, 0x0000, 0x4981, 0x0002, +0x4A81, 0x0004, 0x4B81, 0x0006, 0x480B, 0xD90B, 0xDA0B, 0xD11B, 0x0006, +0x930B, 0x236F, 0x1840, 0x425A, 0x30EF, 0xB65A, 0x000C, 0x2438, 0x1800, +0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, +0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, +0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0x3C33, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0C0F, 0xDDEF, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x410F, +0x523F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x0080, 0xD474, 0x145B, 0x8031, +0x0018, 0x4C08, 0x4D09, 0x0086, 0x2F60, 0x1840, 0x425E, 0x30EF, 0xB65E, +0x000C, 0x2405, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C04, 0x1800, 0x40F2, +0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x06CC, 0x00AC, 0x000E, 0x06CD, 0x00AD, 0x000C, +0x0C0F, 0xCDEF, 0x0000, 0x06CF, 0x00AF, 0x000D, 0x06CE, 0x00AE, 0x0008, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, +0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, +0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, +0x4881, 0x0010, 0x4981, 0x0012, 0x4381, 0x0014, 0x4381, 0x0016, 0x4381, +0x0008, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0000, +0x40B1, 0x8000, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x410B, 0x530B, +0xBBB1, 0x0010, 0x2029, 0xBBB1, 0x0012, 0x2026, 0xBBB1, 0x0014, 0x2023, +0xBBB1, 0x0016, 0x2416, 0x3C1F, 0xB318, 0x2BEF, 0x410B, 0x530B, 0xBBB1, +0x0010, 0x2009, 0xBBB1, 0x0012, 0x2006, 0xBBB1, 0x0014, 0x2003, 0xBBB1, +0x0016, 0x240B, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C0A, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x063B, 0x0004, 0x1840, 0x4BE2, 0x2F9E, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x0C0B, 0xDDEB, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x5808, 0x6909, +0x6A0A, 0x6B0B, 0x4881, 0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, +0x000E, 0x1840, 0x425A, 0x2F9E, 0xB65A, 0x000C, 0x2002, 0x4347, 0x3C01, +0x4357, 0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0xD708, 0x4881, +0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, 0x410B, 0x530B, +0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x035B, 0x100A, 0x1009, 0x1008, 0x4881, +0x0000, 0x4981, 0x0002, 0x4A81, 0x0004, 0x4B81, 0x0006, 0x480B, 0xD90B, +0xDA0B, 0xD11B, 0x0006, 0x930B, 0x236F, 0x1840, 0x425A, 0x30EF, 0xB65A, +0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, +0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, +0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0F, 0xDDEF, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x411C, 0x0008, 0x411D, 0x000A, 0x3C0E, 0x4303, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x415C, 0x0008, 0x5031, 0x0018, 0x1656, 0x0110, 0x145B, 0x8031, +0x0018, 0x4C08, 0x4D09, 0x0086, 0x2F60, 0x1840, 0x425E, 0x30EF, 0xB65E, +0x000C, 0x2405, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C04, 0x1800, 0x40F2, +0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x06CC, 0x00AC, 0x000E, 0x06CD, 0x00AD, 0x000C, +0x0C0F, 0xCDEF, 0x0000, 0x06CF, 0x00AF, 0x000D, 0x06CE, 0x00AE, 0x0008, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, +0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, +0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, +0x4881, 0x0010, 0x4981, 0x0012, 0x4381, 0x0014, 0x4381, 0x0016, 0x4381, +0x0008, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0000, +0x42B1, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x410B, 0x530B, 0xBBB1, +0x0010, 0x2029, 0xBBB1, 0x0012, 0x2026, 0xBBB1, 0x0014, 0x2023, 0xBBB1, +0x0016, 0x2416, 0x3C1F, 0xB318, 0x2BEF, 0x410B, 0x530B, 0xBBB1, 0x0010, +0x2009, 0xBBB1, 0x0012, 0x2006, 0xBBB1, 0x0014, 0x2003, 0xBBB1, 0x0016, +0x240B, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, +0xD392, 0x0530, 0x3C09, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, +0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x063B, +0x0004, 0x1840, 0x4BE2, 0x2F9E, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, +0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, +0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x5808, 0x6909, 0x6A0A, +0x6B0B, 0x4881, 0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, +0x1840, 0x425A, 0x2F9E, 0xB65A, 0x000C, 0x2002, 0x4347, 0x3C01, 0x4357, +0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0xD708, 0x4881, 0x0008, +0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, 0x410B, 0x530B, 0x4B38, +0x4B39, 0x4B3A, 0x4B3B, 0x035B, 0x100A, 0x1009, 0x1008, 0x4881, 0x0000, +0x4981, 0x0002, 0x4A81, 0x0004, 0x4B81, 0x0006, 0x480B, 0xD90B, 0xDA0B, +0xD11B, 0x0006, 0x930B, 0x236F, 0x1840, 0x425A, 0x30EF, 0xB65A, 0x000C, +0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, +0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, +0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, +0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, +0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0F, 0xDDEF, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x411C, 0x0008, 0x411D, 0x000A, 0x4C0F, 0x035D, 0x100C, 0x110D, +0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, 0xF03D, 0x000F, 0x0080, +0xD474, 0x145B, 0x8031, 0x0018, 0x4C08, 0x0086, 0x2F60, 0x1840, 0x425E, +0x30EF, 0xB65E, 0x000C, 0x2405, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C04, +0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x06CC, 0x00AC, 0x000E, 0x06CD, +0x00AD, 0x000C, 0x0C0F, 0xCDEF, 0x0000, 0x06CF, 0x00AF, 0x000D, 0x06CE, +0x00AE, 0x0008, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, +0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, +0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x4881, 0x0010, 0x4381, 0x0012, 0x4381, 0x0014, 0x4381, +0x0016, 0x4381, 0x0008, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, 0x000E, +0x40B1, 0x8000, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, +0x410B, 0x530B, 0xBBB1, 0x0010, 0x2029, 0xBBB1, 0x0012, 0x2026, 0xBBB1, +0x0014, 0x2023, 0xBBB1, 0x0016, 0x2416, 0x3C1F, 0xB318, 0x2BEF, 0x410B, +0x530B, 0xBBB1, 0x0010, 0x2009, 0xBBB1, 0x0012, 0x2006, 0xBBB1, 0x0014, +0x2003, 0xBBB1, 0x0016, 0x240B, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C0A, +0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, 0x40F2, 0x2FF3, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, +0x4303, 0x4303, 0x063B, 0x0004, 0x1840, 0x4BE2, 0x2F9E, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x0C0B, 0xDDEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, +0x5808, 0x6909, 0x6A0A, 0x6B0B, 0x4881, 0x0008, 0x4981, 0x000A, 0x4A81, +0x000C, 0x4B81, 0x000E, 0x1840, 0x425A, 0x2F9E, 0xB65A, 0x000C, 0x2002, +0x4347, 0x3C01, 0x4357, 0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, +0xD708, 0x4881, 0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, +0x410B, 0x530B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x035B, 0x100A, 0x1009, +0x1008, 0x4881, 0x0000, 0x4981, 0x0002, 0x4A81, 0x0004, 0x4B81, 0x0006, +0x480B, 0xD90B, 0xDA0B, 0xD11B, 0x0006, 0x930B, 0x236F, 0x1840, 0x425A, +0x30EF, 0xB65A, 0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, +0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, +0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, +0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0F, +0xDDEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x411C, 0x0008, 0x0080, 0xD474, 0x145B, +0x8031, 0x0018, 0x4C48, 0x0086, 0x2F60, 0x1840, 0x425E, 0x30EF, 0xB65E, +0x000C, 0x2405, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C04, 0x1800, 0x40F2, +0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x06CC, 0x00AC, 0x000E, 0x06CD, 0x00AD, 0x000C, +0x0C0F, 0xCDEF, 0x0000, 0x06CF, 0x00AF, 0x000D, 0x06CE, 0x00AE, 0x0008, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, +0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, +0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, +0x4881, 0x0010, 0x4381, 0x0012, 0x4381, 0x0014, 0x4381, 0x0016, 0x4381, +0x0008, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, 0x000E, 0x40B1, 0x0080, +0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x410B, 0x530B, +0xBBB1, 0x0010, 0x2029, 0xBBB1, 0x0012, 0x2026, 0xBBB1, 0x0014, 0x2023, +0xBBB1, 0x0016, 0x2416, 0x3C1F, 0xB318, 0x2BEF, 0x410B, 0x530B, 0xBBB1, +0x0010, 0x2009, 0xBBB1, 0x0012, 0x2006, 0xBBB1, 0x0014, 0x2003, 0xBBB1, +0x0016, 0x240B, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x3C0A, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x063B, 0x0004, 0x1840, 0x4BE2, 0x2F9E, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0x0C0B, 0xDDEB, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x5808, 0x6909, +0x6A0A, 0x6B0B, 0x4881, 0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, +0x000E, 0x1840, 0x425A, 0x2F9E, 0xB65A, 0x000C, 0x2002, 0x4347, 0x3C01, +0x4357, 0x410B, 0x523B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0xD708, 0x4881, +0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, 0x410B, 0x530B, +0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x035B, 0x100A, 0x1009, 0x1008, 0x4881, +0x0000, 0x4981, 0x0002, 0x4A81, 0x0004, 0x4B81, 0x0006, 0x480B, 0xD90B, +0xDA0B, 0xD11B, 0x0006, 0x930B, 0x236F, 0x1840, 0x425A, 0x30EF, 0xB65A, +0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, +0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0B, 0xDDEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0C0B, 0xCDEB, 0x0000, 0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0C0B, 0xDDEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, +0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0C0B, 0xCDEB, 0x0000, +0x0E0B, 0xCFEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0C0F, 0xDDEF, 0x0000, +0x0080, 0xD45A, 0x145B, 0x8031, 0x0018, 0x4C48, 0x1840, 0x4CC2, 0x30F1, +0x0086, 0x2F60, 0x06CC, 0x00AC, 0x000D, 0x06CD, 0x00AD, 0x0008, 0x06CF, +0x00AF, 0x000E, 0x06CE, 0x00AE, 0x000C, 0x1840, 0x425A, 0x30EF, 0xB65A, +0x000C, 0x242F, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0F0B, 0xCEEB, +0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F0B, 0xDEEB, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C36, +0xC0F2, 0x0020, 0x0282, 0x3C32, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0F0B, 0xDEEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x2F9F, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0F0B, 0xDEEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, +0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0F0B, 0xDEEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0F0B, +0xCEEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D0B, +0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F0B, +0xDEEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x4881, 0x0010, 0x4381, 0x0012, 0x4381, +0x0014, 0x4381, 0x0016, 0x4381, 0x0008, 0x4381, 0x000A, 0x4381, 0x000C, +0x4381, 0x000E, 0x40B1, 0x0080, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, +0x4381, 0x0006, 0x410B, 0x530B, 0xBBB1, 0x0010, 0x2029, 0xBBB1, 0x0012, +0x2026, 0xBBB1, 0x0014, 0x2023, 0xBBB1, 0x0016, 0x2416, 0x3C1F, 0xB318, +0x2BEF, 0x410B, 0x530B, 0xBBB1, 0x0010, 0x2009, 0xBBB1, 0x0012, 0x2006, +0xBBB1, 0x0014, 0x2003, 0xBBB1, 0x0016, 0x240B, 0x1800, 0x40F2, 0x2F9F, +0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, +0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x063B, 0x0004, 0x1840, 0x4BE2, 0x2F9E, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, +0x0F0B, 0xDEEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x410B, 0x523B, 0x4B38, 0x4B39, +0x4B3A, 0x4B3B, 0x5808, 0x6909, 0x6A0A, 0x6B0B, 0x4881, 0x0008, 0x4981, +0x000A, 0x4A81, 0x000C, 0x4B81, 0x000E, 0x1840, 0x425A, 0x2F9E, 0xB65A, +0x000C, 0x2002, 0x4347, 0x3C01, 0x4357, 0x410B, 0x523B, 0x4B38, 0x4B39, +0x4B3A, 0x4B3B, 0xD708, 0x4881, 0x0008, 0x4981, 0x000A, 0x4A81, 0x000C, +0x4B81, 0x000E, 0x410B, 0x530B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x035B, +0x100A, 0x1009, 0x1008, 0x4881, 0x0000, 0x4981, 0x0002, 0x4A81, 0x0004, +0x4B81, 0x0006, 0x480B, 0xD90B, 0xDA0B, 0xD11B, 0x0006, 0x930B, 0x236F, +0x1840, 0x425A, 0x30EF, 0xB65A, 0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0F0B, 0xDEEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, +0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, +0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, +0x0000, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0F0B, 0xDEEB, 0x0000, 0xD232, 0x9382, +0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, +0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x0F0B, 0xCEEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, +0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0F0F, 0xDEEF, 0x0000, 0x0080, 0xD45A, 0x147B, 0x120F, 0x120E, +0x120D, 0x120C, 0x8031, 0x001E, 0x411F, 0x004A, 0x4F81, 0x0002, 0x035F, +0x4F81, 0x001C, 0x0087, 0x2F60, 0x07C9, 0x00A9, 0x000D, 0x07C8, 0x00A8, +0x0008, 0x07CA, 0x00AA, 0x000E, 0x07CB, 0x00AB, 0x000C, 0x0084, 0x30EF, +0x4191, 0x004C, 0x004C, 0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0008, +0x4381, 0x000A, 0x4381, 0x0014, 0x4381, 0x0016, 0x4381, 0x0018, 0x40B1, +0x8000, 0x001A, 0x4346, 0x446E, 0xB75E, 0x000C, 0x2405, 0x1800, 0x40F2, +0x2F9F, 0x0522, 0x3C04, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, +0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, +0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, +0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, +0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2413, 0xD0F2, 0x0020, 0x0282, 0x410F, 0x503F, +0x0014, 0xBFB1, 0x001E, 0x202E, 0xBFB1, 0x0020, 0x202B, 0xBFB1, 0x0022, +0x2028, 0xBFB1, 0x0024, 0x241B, 0x3C24, 0xC0F2, 0x0020, 0x0282, 0x3FEC, +0xB31C, 0x2BEA, 0x410F, 0x503F, 0x0014, 0xBFB1, 0x001E, 0x2009, 0xBFB1, +0x0020, 0x2006, 0xBFB1, 0x0022, 0x2003, 0xBFB1, 0x0024, 0x240B, 0x1800, +0x40F2, 0x2F9F, 0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0x3C09, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, +0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x073F, 0x0004, 0x1840, +0x4FE2, 0x2F9E, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x080F, +0xD9EF, 0x0000, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x410F, 0x522F, +0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x5C0C, 0x6D0D, 0x6E0E, 0x6F0F, 0x4C81, +0x0004, 0x4D81, 0x0006, 0x4E81, 0x0008, 0x4F81, 0x000A, 0x1840, 0x425E, +0x2F9E, 0xB75E, 0x000C, 0x2002, 0x4345, 0x3C01, 0x4355, 0x410F, 0x522F, +0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0xD50C, 0x4C81, 0x0004, 0x4D81, 0x0006, +0x4E81, 0x0008, 0x4F81, 0x000A, 0xB0B1, 0x0100, 0x001A, 0x2C02, 0x0080, +0xF164, 0x4C46, 0xF076, 0x00C7, 0xB266, 0x28C8, 0x1800, 0x40F2, 0x2F9F, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x446E, 0xB75E, +0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, +0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, +0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, +0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x407C, 0x0046, 0x13B0, 0xE042, 0x0080, 0xF13E, 0x9076, +0x0083, 0x20C9, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, +0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x446E, 0xB75E, 0x000C, 0x2438, 0x1800, 0x40F2, +0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, +0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, +0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, +0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x410F, 0x530F, +0x40FF, 0x002A, 0x0000, 0x0080, 0xF12C, 0xB076, 0x0040, 0x28CF, 0x464E, +0xF07E, 0x00C0, 0x907E, 0x00C0, 0x24C9, 0x1800, 0x40F2, 0x2F9F, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, +0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, +0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x446E, 0xB75E, 0x000C, +0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, +0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, +0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, +0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, +0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, +0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x410F, 0x530F, 0x40FF, 0x004A, 0x0000, 0x0080, 0xF148, 0x9076, +0x0081, 0x20C7, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, +0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x446E, 0xB75E, 0x000C, 0x2438, 0x1800, 0x40F2, +0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, +0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, +0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, +0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x407C, 0x0046, +0x13B0, 0xE042, 0x3CDA, 0x464E, 0xF07E, 0x00C3, 0x935E, 0x24DB, 0x934E, +0x24D9, 0x936E, 0x24D7, 0x9076, 0x0003, 0x25BB, 0x9076, 0x0082, 0x25B8, +0x9076, 0x0080, 0x25B5, 0x464E, 0xF07E, 0x00C0, 0x907E, 0x00C0, 0x25AF, +0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, +0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x446E, 0xB75E, 0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, +0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, +0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, +0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x410F, 0x530F, 0x40FF, 0x003A, +0x0000, 0x3CCB, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, +0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x446E, 0xB75E, 0x000C, 0x2438, 0x1800, 0x40F2, +0x2F9F, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, +0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, +0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, +0x1800, 0x40F2, 0x2FF3, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, +0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x90B1, 0x0021, +0x004C, 0x280E, 0x410F, 0x530F, 0x40FF, 0x005A, 0x0000, 0x4381, 0x000C, +0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0012, 0x3CDF, 0x410F, 0x530F, +0x40FF, 0x001A, 0x0000, 0x522F, 0x4F3C, 0xF37C, 0x108C, 0x4C0F, 0x4381, +0x000C, 0x4381, 0x000E, 0x4381, 0x0010, 0x4F81, 0x0012, 0x3CCC, 0x410F, +0x503F, 0x0014, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x035F, 0x100E, 0x100D, +0x100C, 0x4C81, 0x0014, 0x4D81, 0x0016, 0x4E81, 0x0018, 0x4F81, 0x001A, +0x4C0F, 0xDD0F, 0xDE0F, 0xD11F, 0x001A, 0x930F, 0x2402, 0x0080, 0xE66E, +0x446E, 0xB75E, 0x000C, 0x2438, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, +0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x1800, 0x40F2, 0x3047, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C33, 0x1800, 0x40F2, 0x2FF3, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0A0F, 0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, +0x4303, 0x4303, 0x080F, 0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0A0F, 0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, +0xCBEF, 0x0000, 0x080F, 0xC9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x080F, +0xD9EF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, +0xDBEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x9076, 0x0082, 0x2407, 0x9076, 0x0080, +0x2404, 0x9346, 0x2402, 0x9366, 0x2004, 0x407C, 0x0046, 0x13B0, 0xE042, +0x410F, 0x530F, 0x40FF, 0x001A, 0x0000, 0x522F, 0x4FB1, 0x000C, 0x4FB1, +0x000E, 0x4FB1, 0x0010, 0x4FB1, 0x0012, 0x9381, 0x0002, 0x2436, 0x411F, +0x0002, 0x533F, 0x4F81, 0x0002, 0x90F1, 0x005A, 0x0000, 0x2021, 0x9381, +0x001C, 0x242A, 0x90B1, 0x0021, 0x004C, 0x2826, 0x407C, 0x0054, 0x13B0, +0xE042, 0x430C, 0x430D, 0x13B0, 0xD068, 0x4C0A, 0x4D0B, 0xD03B, 0x0200, +0x4B0D, 0x13B0, 0xD068, 0xF03B, 0xFDFF, 0x4A0C, 0x4B0D, 0x13B0, 0xD068, +0x407C, 0x0046, 0x13B0, 0xE042, 0x3C0C, 0x90F1, 0x003A, 0x0000, 0x2002, +0x0080, 0xE50C, 0x90F1, 0x002A, 0x0000, 0x2002, 0x0080, 0xE50C, 0x410F, +0x503F, 0x000C, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x5031, 0x0026, 0x1674, +0x0110, 0x143B, 0x4C0A, 0x4D0B, 0x0028, 0x0532, 0x1800, 0x40F2, 0x2F9F, +0x0522, 0x1800, 0x40F2, 0x3047, 0x0532, 0x1840, 0x90B2, 0x0005, 0x2F72, +0x2402, 0x13B1, 0x4024, 0x4A0F, 0xDB0F, 0x930F, 0x2515, 0x533A, 0x633B, +0x435C, 0x13B1, 0x3976, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x008D, 0x2F60, 0x0DCF, 0x00AF, 0x000C, +0x0DCE, 0x00AE, 0x000E, 0x0E0C, 0xCFEC, 0x0000, 0x0DCC, 0x00AC, 0x000D, +0x00AD, 0x0008, 0x0D09, 0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, +0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, +0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, +0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, +0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, +0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, +0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, +0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D0D, 0xDCED, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E0E, 0xDFEE, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x434C, 0x13B1, +0x3976, 0x4A0F, 0xDB0F, 0x930F, 0x22EB, 0x0860, 0x0532, 0x1840, 0x90B2, +0x0005, 0x2F72, 0x2402, 0x13B1, 0x48D6, 0x1638, 0x0110, 0x143B, 0x4C0A, +0x4D0B, 0x0028, 0x0532, 0x1800, 0x40F2, 0x2FF3, 0x0522, 0x1800, 0x40F2, +0x309B, 0x0532, 0x1840, 0x90B2, 0x0005, 0x2F72, 0x2402, 0x13B1, 0x4024, +0x4A0F, 0xDB0F, 0x930F, 0x2515, 0x533A, 0x633B, 0x435C, 0x13B1, 0x3976, +0x434C, 0x13B1, 0x3976, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x008D, 0x2F60, 0x0DCF, 0x00AF, 0x000C, +0x0DCE, 0x00AE, 0x000E, 0x0E0C, 0xCFEC, 0x0000, 0x0DCC, 0x00AC, 0x000D, +0x00AD, 0x0008, 0x0D09, 0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, +0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, +0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, +0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, +0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, +0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, +0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, +0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D0D, 0xDCED, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E0E, 0xDFEE, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x4A0F, 0xDB0F, +0x930F, 0x22EB, 0x3EC7, 0x4303, 0x143B, 0x4C0A, 0x4D0B, 0x0028, 0x0532, +0x1800, 0x40F2, 0x2FF3, 0x0522, 0x1800, 0x40F2, 0x309B, 0x0532, 0x1840, +0x90B2, 0x0005, 0x2F72, 0x2402, 0x13B1, 0x4024, 0x4A0F, 0xDB0F, 0x930F, +0x2515, 0x533A, 0x633B, 0x434C, 0x13B1, 0x3976, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x008D, 0x2F60, +0x0DCF, 0x00AF, 0x000C, 0x0DCE, 0x00AE, 0x000E, 0x0E0C, 0xCFEC, 0x0000, +0x0DCC, 0x00AC, 0x000D, 0x00AD, 0x0008, 0x0D09, 0xCCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, +0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, +0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, +0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, +0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, +0x4303, 0x4303, 0x0D09, 0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E09, 0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, +0xCFE9, 0x0000, 0x0D09, 0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D09, +0xDCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E09, +0xDFE9, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E09, 0xCFE9, 0x0000, 0x0D09, +0xCCE9, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D0D, 0xDCED, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E0E, 0xDFEE, 0x0000, 0xD232, +0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, +0x0282, 0x435C, 0x13B1, 0x3976, 0x4A0F, 0xDB0F, 0x930F, 0x22EB, 0x0080, +0xF5DE, 0x145B, 0x1840, 0x90B2, 0x0005, 0x2F72, 0x259E, 0x4078, 0x0024, +0x407C, 0x0044, 0x13B1, 0x4CFA, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x1840, 0x43D2, 0x2F9D, 0x1840, 0x43D2, 0x2F9C, 0x13B1, 0x4024, 0x13B1, +0x4BFE, 0x13B1, 0x4C56, 0x008E, 0x2F60, 0x0ECA, 0x00AA, 0x000C, 0x0ECD, +0x00AD, 0x000E, 0x0D0F, 0xCAEF, 0x0000, 0x0ECC, 0x00AC, 0x000D, 0x0ECB, +0x00AB, 0x0008, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x0B0F, +0xDCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0D0F, 0xDAEF, 0x0000, 0x13B1, 0x4BFE, 0x13B1, 0x4C56, +0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, 0x4303, +0x0B0F, 0xDCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0D0F, 0xDAEF, 0x0000, 0x13B1, 0x4BD2, 0x13B1, +0x4C56, 0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, +0x4303, 0x0B0F, 0xDCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0D0F, 0xDAEF, 0x0000, 0x13B1, 0x4BD2, +0x13B1, 0x4C56, 0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, +0x4303, 0x4303, 0x0B0F, 0xDCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0D0F, 0xDAEF, 0x0000, 0x4279, +0x3C21, 0x13B1, 0x4BD2, 0x13B1, 0x4C56, 0x0D0F, 0xCAEF, 0x0000, 0x0B0F, +0xCCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x070F, 0x4FE6, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0B0F, +0xDCEF, 0x0000, 0x0D0F, 0xDAEF, 0x0000, 0x5848, 0x5379, 0x0EC7, 0x00A7, +0x0004, 0x0086, 0x2F9E, 0x9369, 0x2822, 0x9348, 0x3BD6, 0x13B1, 0x4BD2, +0x13B1, 0x4BA6, 0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, +0x4303, 0x4303, 0x070F, 0x4FE6, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0B0F, 0xDCEF, 0x0000, 0x0D0F, +0xDAEF, 0x0000, 0x3FD5, 0x9348, 0x3820, 0x13B1, 0x4BFE, 0x13B1, 0x4BA6, +0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, 0x4303, +0x070F, 0x4FE6, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0B0F, 0xDCEF, 0x0000, 0x0D0F, 0xDAEF, 0x0000, +0x3C1F, 0x13B1, 0x4BFE, 0x13B1, 0x4C56, 0x0D0F, 0xCAEF, 0x0000, 0x0B0F, +0xCCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x070F, 0x4FE6, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0B0F, +0xDCEF, 0x0000, 0x0D0F, 0xDAEF, 0x0000, 0x13B1, 0x4BFE, 0x13B1, 0x4BA6, +0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, 0x4303, +0x0B0F, 0xDCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0D0F, 0xDAEF, 0x0000, 0x13B1, 0x4BD2, 0x13B1, +0x4BA6, 0x0D0F, 0xCAEF, 0x0000, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, +0x4303, 0x0B0F, 0xDCEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0D0F, 0xDAEF, 0x0000, 0x0B0F, 0xCAEF, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0B0F, 0xCCEF, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0B0F, 0xDCEF, 0x0000, 0x431C, 0x13B1, 0x4D82, 0x431C, 0x430D, +0x13B1, 0x3B82, 0x0B0F, 0xDAEF, 0x0000, 0x431C, 0x13B1, 0x4D82, 0x430C, +0x430D, 0x13B1, 0x3B82, 0x13B1, 0x48D6, 0x407C, 0x0054, 0x13B1, 0x4CFA, +0x403C, 0x0200, 0x430D, 0x13B1, 0x4B7A, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x430C, 0x1656, +0x0110, 0x0110, 0x803C, 0x100A, 0x2002, 0x0180, 0x04FA, 0x803C, 0x1000, +0x24DD, 0x803C, 0x2000, 0x2402, 0x0180, 0x0A6A, 0x40B2, 0x0018, 0x052A, +0x40B2, 0x0018, 0x053A, 0x008F, 0x2F60, 0x0FCE, 0x00AE, 0x000D, 0x00AF, +0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2F9F, 0x4DCC, 0x0000, 0x4DCC, 0x0001, +0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4FEC, 0x0004, 0x4FEC, 0x0005, 0x4FEC, +0x0006, 0x4FEC, 0x0007, 0x4DCC, 0x0008, 0x4DCC, 0x0009, 0x4DCC, 0x000A, +0x4DCC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, 0x4DCC, 0x000E, 0x4DCC, +0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, 0x0012, 0x4FEC, 0x0013, +0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, 0x008C, +0x2FF3, 0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, +0x4FEC, 0x0004, 0x4FEC, 0x0005, 0x4FEC, 0x0006, 0x4FEC, 0x0007, 0x4DCC, +0x0008, 0x4DCC, 0x0009, 0x4DCC, 0x000A, 0x4DCC, 0x000B, 0x4EEC, 0x000C, +0x4EEC, 0x000D, 0x4EEC, 0x000E, 0x4EEC, 0x000F, 0x43CC, 0x0010, 0x43CC, +0x0011, 0x43CC, 0x0012, 0x43CC, 0x0013, 0x4EEC, 0x0014, 0x4EEC, 0x0015, +0x4EEC, 0x0016, 0x4EEC, 0x0017, 0x008C, 0x3047, 0x4EEC, 0x0000, 0x4EEC, +0x0001, 0x4EEC, 0x0002, 0x4EEC, 0x0003, 0x43CC, 0x0004, 0x43CC, 0x0005, +0x43CC, 0x0006, 0x43CC, 0x0007, 0x4EEC, 0x0008, 0x4EEC, 0x0009, 0x4EEC, +0x000A, 0x4EEC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, 0x4DCC, 0x000E, +0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, 0x0012, 0x4FEC, +0x0013, 0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, +0x008F, 0x309B, 0x4EEF, 0x0000, 0x4EEF, 0x0001, 0x4EEF, 0x0002, 0x4EEF, +0x0003, 0x43CF, 0x0004, 0x43CF, 0x0005, 0x43CF, 0x0006, 0x43CF, 0x0007, +0x4EEF, 0x0008, 0x4EEF, 0x0009, 0x4EEF, 0x000A, 0x4EEF, 0x000B, 0x4EEF, +0x000C, 0x4EEF, 0x000D, 0x4EEF, 0x000E, 0x4EEF, 0x000F, 0x43CF, 0x0010, +0x43CF, 0x0011, 0x43CF, 0x0012, 0x43CF, 0x0013, 0x4EEF, 0x0014, 0x4EEF, +0x0015, 0x4EEF, 0x0016, 0x4EEF, 0x0017, 0x0110, 0x40B2, 0x0030, 0x052A, +0x40B2, 0x0030, 0x053A, 0x008F, 0x2F60, 0x0FCE, 0x00AE, 0x000D, 0x00AF, +0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2F9F, 0x4DCC, 0x0000, 0x4DCC, 0x0001, +0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, 0x4DCC, 0x0005, 0x4DCC, +0x0006, 0x4DCC, 0x0007, 0x4FEC, 0x0008, 0x4FEC, 0x0009, 0x4FEC, 0x000A, +0x4FEC, 0x000B, 0x4FEC, 0x000C, 0x4FEC, 0x000D, 0x4FEC, 0x000E, 0x4FEC, +0x000F, 0x4DCC, 0x0010, 0x4DCC, 0x0011, 0x4DCC, 0x0012, 0x4DCC, 0x0013, +0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, 0x4DCC, +0x0018, 0x4DCC, 0x0019, 0x4DCC, 0x001A, 0x4DCC, 0x001B, 0x4DCC, 0x001C, +0x4DCC, 0x001D, 0x4DCC, 0x001E, 0x4DCC, 0x001F, 0x4FEC, 0x0020, 0x4FEC, +0x0021, 0x4FEC, 0x0022, 0x4FEC, 0x0023, 0x4FEC, 0x0024, 0x4FEC, 0x0025, +0x4FEC, 0x0026, 0x4FEC, 0x0027, 0x4DCC, 0x0028, 0x4DCC, 0x0029, 0x4DCC, +0x002A, 0x4DCC, 0x002B, 0x4DCC, 0x002C, 0x4DCC, 0x002D, 0x4DCC, 0x002E, +0x4DCC, 0x002F, 0x008C, 0x2FF3, 0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4DCC, +0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, 0x4DCC, 0x0005, 0x4DCC, 0x0006, +0x4DCC, 0x0007, 0x4FEC, 0x0008, 0x4FEC, 0x0009, 0x4FEC, 0x000A, 0x4FEC, +0x000B, 0x4FEC, 0x000C, 0x4FEC, 0x000D, 0x4FEC, 0x000E, 0x4FEC, 0x000F, +0x4DCC, 0x0010, 0x4DCC, 0x0011, 0x4DCC, 0x0012, 0x4DCC, 0x0013, 0x4DCC, +0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, 0x4EEC, 0x0018, +0x4EEC, 0x0019, 0x4EEC, 0x001A, 0x4EEC, 0x001B, 0x4EEC, 0x001C, 0x4EEC, +0x001D, 0x4EEC, 0x001E, 0x4EEC, 0x001F, 0x43CC, 0x0020, 0x43CC, 0x0021, +0x43CC, 0x0022, 0x43CC, 0x0023, 0x43CC, 0x0024, 0x43CC, 0x0025, 0x43CC, +0x0026, 0x43CC, 0x0027, 0x4EEC, 0x0028, 0x4EEC, 0x0029, 0x4EEC, 0x002A, +0x4EEC, 0x002B, 0x4EEC, 0x002C, 0x4EEC, 0x002D, 0x4EEC, 0x002E, 0x4EEC, +0x002F, 0x008C, 0x3047, 0x4EEC, 0x0000, 0x4EEC, 0x0001, 0x4EEC, 0x0002, +0x4EEC, 0x0003, 0x4EEC, 0x0004, 0x4EEC, 0x0005, 0x4EEC, 0x0006, 0x4EEC, +0x0007, 0x43CC, 0x0008, 0x43CC, 0x0009, 0x43CC, 0x000A, 0x43CC, 0x000B, +0x43CC, 0x000C, 0x43CC, 0x000D, 0x43CC, 0x000E, 0x43CC, 0x000F, 0x4EEC, +0x0010, 0x4EEC, 0x0011, 0x4EEC, 0x0012, 0x4EEC, 0x0013, 0x4EEC, 0x0014, +0x4EEC, 0x0015, 0x4EEC, 0x0016, 0x4EEC, 0x0017, 0x4DCC, 0x0018, 0x4DCC, +0x0019, 0x4DCC, 0x001A, 0x4DCC, 0x001B, 0x4DCC, 0x001C, 0x4DCC, 0x001D, +0x4DCC, 0x001E, 0x4DCC, 0x001F, 0x4FEC, 0x0020, 0x4FEC, 0x0021, 0x4FEC, +0x0022, 0x4FEC, 0x0023, 0x4FEC, 0x0024, 0x4FEC, 0x0025, 0x4FEC, 0x0026, +0x4FEC, 0x0027, 0x4DCC, 0x0028, 0x4DCC, 0x0029, 0x4DCC, 0x002A, 0x4DCC, +0x002B, 0x4DCC, 0x002C, 0x4DCC, 0x002D, 0x4DCC, 0x002E, 0x4DCC, 0x002F, +0x008F, 0x309B, 0x4EEF, 0x0000, 0x4EEF, 0x0001, 0x4EEF, 0x0002, 0x4EEF, +0x0003, 0x4EEF, 0x0004, 0x4EEF, 0x0005, 0x4EEF, 0x0006, 0x4EEF, 0x0007, +0x43CF, 0x0008, 0x43CF, 0x0009, 0x43CF, 0x000A, 0x43CF, 0x000B, 0x43CF, +0x000C, 0x43CF, 0x000D, 0x43CF, 0x000E, 0x43CF, 0x000F, 0x4EEF, 0x0010, +0x4EEF, 0x0011, 0x4EEF, 0x0012, 0x4EEF, 0x0013, 0x4EEF, 0x0014, 0x4EEF, +0x0015, 0x4EEF, 0x0016, 0x4EEF, 0x0017, 0x4EEF, 0x0018, 0x4EEF, 0x0019, +0x4EEF, 0x001A, 0x4EEF, 0x001B, 0x4EEF, 0x001C, 0x4EEF, 0x001D, 0x4EEF, +0x001E, 0x4EEF, 0x001F, 0x43CF, 0x0020, 0x43CF, 0x0021, 0x43CF, 0x0022, +0x43CF, 0x0023, 0x43CF, 0x0024, 0x43CF, 0x0025, 0x43CF, 0x0026, 0x43CF, +0x0027, 0x4EEF, 0x0028, 0x4EEF, 0x0029, 0x4EEF, 0x002A, 0x4EEF, 0x002B, +0x4EEF, 0x002C, 0x4EEF, 0x002D, 0x4EEF, 0x002E, 0x4EEF, 0x002F, 0x0110, +0x40B2, 0x0054, 0x052A, 0x40B2, 0x0054, 0x053A, 0x008F, 0x2F60, 0x0FCE, +0x00AE, 0x000D, 0x00AF, 0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2F9F, 0x4DCC, +0x0000, 0x4DCC, 0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, +0x4DCC, 0x0005, 0x4DCC, 0x0006, 0x4DCC, 0x0007, 0x4DCC, 0x0008, 0x4DCC, +0x0009, 0x4DCC, 0x000A, 0x4DCC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, +0x4DCC, 0x000E, 0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, +0x0012, 0x4FEC, 0x0013, 0x4FEC, 0x0014, 0x4FEC, 0x0015, 0x4FEC, 0x0016, +0x4FEC, 0x0017, 0x4FEC, 0x0018, 0x4FEC, 0x0019, 0x4DCC, 0x001A, 0x4DCC, +0x001B, 0x4DCC, 0x001C, 0x4DCC, 0x001D, 0x4DCC, 0x001E, 0x4DCC, 0x001F, +0x4DCC, 0x0020, 0x4DCC, 0x0021, 0x4DCC, 0x0022, 0x4DCC, 0x0023, 0x4DCC, +0x0024, 0x4DCC, 0x0025, 0x4DCC, 0x0026, 0x4DCC, 0x0027, 0x4DCC, 0x0028, +0x4DCC, 0x0029, 0x4DCC, 0x002A, 0x4DCC, 0x002B, 0x4DCC, 0x002C, 0x4DCC, +0x002D, 0x4DCC, 0x002E, 0x4DCC, 0x002F, 0x4DCC, 0x0030, 0x4DCC, 0x0031, +0x4DCC, 0x0032, 0x4DCC, 0x0033, 0x4DCC, 0x0034, 0x4DCC, 0x0035, 0x4DCC, +0x0036, 0x4DCC, 0x0037, 0x4DCC, 0x0038, 0x4DCC, 0x0039, 0x4FEC, 0x003A, +0x4FEC, 0x003B, 0x4FEC, 0x003C, 0x4FEC, 0x003D, 0x4FEC, 0x003E, 0x4FEC, +0x003F, 0x4FEC, 0x0040, 0x4FEC, 0x0041, 0x4FEC, 0x0042, 0x4FEC, 0x0043, +0x4DCC, 0x0044, 0x4DCC, 0x0045, 0x4DCC, 0x0046, 0x4DCC, 0x0047, 0x4DCC, +0x0048, 0x4DCC, 0x0049, 0x4DCC, 0x004A, 0x4DCC, 0x004B, 0x4DCC, 0x004C, +0x4DCC, 0x004D, 0x4DCC, 0x004E, 0x4DCC, 0x004F, 0x4DCC, 0x0050, 0x4DCC, +0x0051, 0x4DCC, 0x0052, 0x4DCC, 0x0053, 0x008C, 0x2FF3, 0x4DCC, 0x0000, +0x4DCC, 0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, 0x4DCC, +0x0005, 0x4DCC, 0x0006, 0x4DCC, 0x0007, 0x4DCC, 0x0008, 0x4DCC, 0x0009, +0x4DCC, 0x000A, 0x4DCC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, 0x4DCC, +0x000E, 0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, 0x0012, +0x4FEC, 0x0013, 0x4FEC, 0x0014, 0x4FEC, 0x0015, 0x4FEC, 0x0016, 0x4FEC, +0x0017, 0x4FEC, 0x0018, 0x4FEC, 0x0019, 0x4DCC, 0x001A, 0x4DCC, 0x001B, +0x4DCC, 0x001C, 0x4DCC, 0x001D, 0x4DCC, 0x001E, 0x4DCC, 0x001F, 0x4DCC, +0x0020, 0x4DCC, 0x0021, 0x4DCC, 0x0022, 0x4DCC, 0x0023, 0x4DCC, 0x0024, +0x4DCC, 0x0025, 0x4DCC, 0x0026, 0x4DCC, 0x0027, 0x4DCC, 0x0028, 0x4DCC, +0x0029, 0x4EEC, 0x002A, 0x4EEC, 0x002B, 0x4EEC, 0x002C, 0x4EEC, 0x002D, +0x4EEC, 0x002E, 0x4EEC, 0x002F, 0x4EEC, 0x0030, 0x4EEC, 0x0031, 0x4EEC, +0x0032, 0x4EEC, 0x0033, 0x4EEC, 0x0034, 0x4EEC, 0x0035, 0x4EEC, 0x0036, +0x4EEC, 0x0037, 0x4EEC, 0x0038, 0x4EEC, 0x0039, 0x43CC, 0x003A, 0x43CC, +0x003B, 0x43CC, 0x003C, 0x43CC, 0x003D, 0x43CC, 0x003E, 0x43CC, 0x003F, +0x43CC, 0x0040, 0x43CC, 0x0041, 0x43CC, 0x0042, 0x43CC, 0x0043, 0x4EEC, +0x0044, 0x4EEC, 0x0045, 0x4EEC, 0x0046, 0x4EEC, 0x0047, 0x4EEC, 0x0048, +0x4EEC, 0x0049, 0x4EEC, 0x004A, 0x4EEC, 0x004B, 0x4EEC, 0x004C, 0x4EEC, +0x004D, 0x4EEC, 0x004E, 0x4EEC, 0x004F, 0x4EEC, 0x0050, 0x4EEC, 0x0051, +0x4EEC, 0x0052, 0x4EEC, 0x0053, 0x008C, 0x3047, 0x4EEC, 0x0000, 0x4EEC, +0x0001, 0x4EEC, 0x0002, 0x4EEC, 0x0003, 0x4EEC, 0x0004, 0x4EEC, 0x0005, +0x4EEC, 0x0006, 0x4EEC, 0x0007, 0x4EEC, 0x0008, 0x4EEC, 0x0009, 0x4EEC, +0x000A, 0x4EEC, 0x000B, 0x4EEC, 0x000C, 0x4EEC, 0x000D, 0x4EEC, 0x000E, +0x4EEC, 0x000F, 0x43CC, 0x0010, 0x43CC, 0x0011, 0x43CC, 0x0012, 0x43CC, +0x0013, 0x43CC, 0x0014, 0x43CC, 0x0015, 0x43CC, 0x0016, 0x43CC, 0x0017, +0x43CC, 0x0018, 0x43CC, 0x0019, 0x4EEC, 0x001A, 0x4EEC, 0x001B, 0x4EEC, +0x001C, 0x4EEC, 0x001D, 0x4EEC, 0x001E, 0x4EEC, 0x001F, 0x4EEC, 0x0020, +0x4EEC, 0x0021, 0x4EEC, 0x0022, 0x4EEC, 0x0023, 0x4EEC, 0x0024, 0x4EEC, +0x0025, 0x4EEC, 0x0026, 0x4EEC, 0x0027, 0x4EEC, 0x0028, 0x4EEC, 0x0029, +0x4DCC, 0x002A, 0x4DCC, 0x002B, 0x4DCC, 0x002C, 0x4DCC, 0x002D, 0x4DCC, +0x002E, 0x4DCC, 0x002F, 0x4DCC, 0x0030, 0x4DCC, 0x0031, 0x4DCC, 0x0032, +0x4DCC, 0x0033, 0x4DCC, 0x0034, 0x4DCC, 0x0035, 0x4DCC, 0x0036, 0x4DCC, +0x0037, 0x4DCC, 0x0038, 0x4DCC, 0x0039, 0x4FEC, 0x003A, 0x4FEC, 0x003B, +0x4FEC, 0x003C, 0x4FEC, 0x003D, 0x4FEC, 0x003E, 0x4FEC, 0x003F, 0x4FEC, +0x0040, 0x4FEC, 0x0041, 0x4FEC, 0x0042, 0x4FEC, 0x0043, 0x4DCC, 0x0044, +0x4DCC, 0x0045, 0x4DCC, 0x0046, 0x4DCC, 0x0047, 0x4DCC, 0x0048, 0x4DCC, +0x0049, 0x4DCC, 0x004A, 0x4DCC, 0x004B, 0x4DCC, 0x004C, 0x4DCC, 0x004D, +0x4DCC, 0x004E, 0x4DCC, 0x004F, 0x4DCC, 0x0050, 0x4DCC, 0x0051, 0x4DCC, +0x0052, 0x4DCC, 0x0053, 0x008F, 0x309B, 0x4EEF, 0x0000, 0x4EEF, 0x0001, +0x4EEF, 0x0002, 0x4EEF, 0x0003, 0x4EEF, 0x0004, 0x4EEF, 0x0005, 0x4EEF, +0x0006, 0x4EEF, 0x0007, 0x4EEF, 0x0008, 0x4EEF, 0x0009, 0x4EEF, 0x000A, +0x4EEF, 0x000B, 0x4EEF, 0x000C, 0x4EEF, 0x000D, 0x4EEF, 0x000E, 0x4EEF, +0x000F, 0x43CF, 0x0010, 0x43CF, 0x0011, 0x43CF, 0x0012, 0x43CF, 0x0013, +0x43CF, 0x0014, 0x43CF, 0x0015, 0x43CF, 0x0016, 0x43CF, 0x0017, 0x43CF, +0x0018, 0x43CF, 0x0019, 0x4EEF, 0x001A, 0x4EEF, 0x001B, 0x4EEF, 0x001C, +0x4EEF, 0x001D, 0x4EEF, 0x001E, 0x4EEF, 0x001F, 0x4EEF, 0x0020, 0x4EEF, +0x0021, 0x4EEF, 0x0022, 0x4EEF, 0x0023, 0x4EEF, 0x0024, 0x4EEF, 0x0025, +0x4EEF, 0x0026, 0x4EEF, 0x0027, 0x4EEF, 0x0028, 0x4EEF, 0x0029, 0x4EEF, +0x002A, 0x4EEF, 0x002B, 0x4EEF, 0x002C, 0x4EEF, 0x002D, 0x4EEF, 0x002E, +0x4EEF, 0x002F, 0x4EEF, 0x0030, 0x4EEF, 0x0031, 0x4EEF, 0x0032, 0x4EEF, +0x0033, 0x4EEF, 0x0034, 0x4EEF, 0x0035, 0x4EEF, 0x0036, 0x4EEF, 0x0037, +0x4EEF, 0x0038, 0x4EEF, 0x0039, 0x43CF, 0x003A, 0x43CF, 0x003B, 0x43CF, +0x003C, 0x43CF, 0x003D, 0x43CF, 0x003E, 0x43CF, 0x003F, 0x43CF, 0x0040, +0x43CF, 0x0041, 0x43CF, 0x0042, 0x43CF, 0x0043, 0x4EEF, 0x0044, 0x4EEF, +0x0045, 0x4EEF, 0x0046, 0x4EEF, 0x0047, 0x4EEF, 0x0048, 0x4EEF, 0x0049, +0x4EEF, 0x004A, 0x4EEF, 0x004B, 0x4EEF, 0x004C, 0x4EEF, 0x004D, 0x4EEF, +0x004E, 0x4EEF, 0x004F, 0x4EEF, 0x0050, 0x4EEF, 0x0051, 0x4EEF, 0x0052, +0x4EEF, 0x0053, 0x0110, 0x42B2, 0x052A, 0x42B2, 0x053A, 0x008F, 0x2F60, +0x0FCE, 0x00AE, 0x000D, 0x00AF, 0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2F9F, +0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4FEC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, +0x0004, 0x4DCC, 0x0005, 0x4FEC, 0x0006, 0x4DCC, 0x0007, 0x008C, 0x2FF3, +0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4FEC, 0x0002, 0x4DCC, 0x0003, 0x4EEC, +0x0004, 0x4EEC, 0x0005, 0x43CC, 0x0006, 0x4EEC, 0x0007, 0x008C, 0x3047, +0x4EEC, 0x0000, 0x4EEC, 0x0001, 0x43CC, 0x0002, 0x4EEC, 0x0003, 0x4DCC, +0x0004, 0x4DCC, 0x0005, 0x4FEC, 0x0006, 0x4DCC, 0x0007, 0x008F, 0x309B, +0x4EEF, 0x0000, 0x4EEF, 0x0001, 0x43CF, 0x0002, 0x4EEF, 0x0003, 0x4EEF, +0x0004, 0x4EEF, 0x0005, 0x43CF, 0x0006, 0x4EEF, 0x0007, 0x0110, 0x143B, +0x8231, 0x0DCA, 0x434B, 0x1940, 0x104C, 0x4C48, 0xF038, 0x0006, 0xF31E, +0x5E08, 0x4D2C, 0x4A1D, 0x0002, 0x430E, 0x5C0C, 0x6D0D, 0x6E0E, 0x5C0C, +0x6D0D, 0x6E0E, 0x5C0C, 0x6D0D, 0x6E0E, 0xD80C, 0x4C81, 0x0000, 0x4D81, +0x0002, 0x4E81, 0x0004, 0x4381, 0x0006, 0x407C, 0x000A, 0x1380, 0x2E9A, +0x935C, 0x201F, 0x410C, 0x530C, 0x1380, 0x2EAE, 0x4C48, 0xF078, 0x0003, +0x9368, 0x2012, 0x035F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, +0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x4C8A, 0x0000, 0x4D8A, 0x0002, +0x432C, 0x3C05, 0x535B, 0x907B, 0x0028, 0x2BE1, 0x433C, 0x5231, 0x1638, +0x0110, 0x145B, 0x8031, 0x000C, 0x4C0A, 0x4D0B, 0x0EC6, 0x4F09, 0x4348, +0x4E2C, 0x4E1D, 0x0002, 0x430E, 0x5C0C, 0x6D0D, 0x6E0E, 0x5C0C, 0x6D0D, +0x6E0E, 0x5C0C, 0x6D0D, 0x6E0E, 0x4C81, 0x0004, 0x4D81, 0x0006, 0x4E81, +0x0008, 0x4381, 0x000A, 0x4A0E, 0x4B0F, 0xF03E, 0x00F0, 0xF03F, 0xFF00, +0x4E81, 0x0000, 0x4F81, 0x0002, 0x430E, 0x410D, 0x530D, 0x427C, 0x13B1, +0x0B16, 0x932C, 0x2029, 0x1940, 0x104A, 0xF03A, 0x0006, 0x490E, 0xF31E, +0x5E0A, 0x410F, 0x522F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0xDA0C, 0x4C81, +0x0004, 0x4D81, 0x0006, 0x4E81, 0x0008, 0x4F81, 0x000A, 0x407C, 0x000B, +0x1380, 0x2E9A, 0x935C, 0x200D, 0x410C, 0x522C, 0x1380, 0x2EAE, 0xB31C, +0x2804, 0x5358, 0x9078, 0x0028, 0x2BF6, 0x9078, 0x0028, 0x2002, 0x433C, +0x3C0A, 0x9319, 0x2007, 0x431E, 0x06CD, 0x407C, 0x000C, 0x13B1, 0x0B16, +0x3C01, 0x432C, 0x5031, 0x000C, 0x1656, 0x0110, 0x147B, 0x8221, 0x4E06, +0x4F07, 0x0DC4, 0x4119, 0x0028, 0x4381, 0x0000, 0x4381, 0x0002, 0x4C4B, +0x108B, 0x4108, 0x5308, 0x431F, 0x08CE, 0x430C, 0x4B0D, 0x13B1, 0x0BAA, +0x932C, 0x201E, 0x412E, 0x411F, 0x0002, 0xF03E, 0xFFC0, 0xD32E, 0x4E81, +0x0000, 0x4F81, 0x0002, 0x430F, 0x08CE, 0x430C, 0x4B0D, 0x13B1, 0x0BAA, +0x932C, 0x200C, 0x4681, 0x0000, 0x4781, 0x0002, 0x430F, 0x08CE, 0x4B0D, +0x422C, 0x13B1, 0x0BAA, 0x932C, 0x2402, 0x433C, 0x3C07, 0x490F, 0x04CE, +0x403C, 0x000C, 0x4B0D, 0x13B1, 0x0BAA, 0x5221, 0x1674, 0x0110, 0x143B, +0x0DCB, 0x4E4A, 0x4348, 0xF07C, 0x000C, 0x4E49, 0x5949, 0xDC49, 0x4A4E, +0x0BCD, 0x494C, 0x13B1, 0x1E9A, 0x936C, 0x2006, 0x5358, 0x9078, 0x0028, +0x2BF5, 0x433C, 0x3C01, 0x431C, 0x1638, 0x0110, 0x147B, 0x140E, 0x8231, +0x4C4A, 0x4F05, 0x4346, 0x4381, 0x0004, 0x4381, 0x0006, 0x4C0E, 0x4D0F, +0xF03E, 0x00F0, 0xF03F, 0xFF00, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430E, +0x410D, 0x530D, 0x427C, 0x13B1, 0x0CFC, 0x931C, 0x2035, 0xF07A, 0x000C, +0x4544, 0x5444, 0xDA44, 0xD354, 0x4077, 0x0028, 0x454E, 0x013D, 0x0008, +0x444C, 0x13B1, 0x1E9A, 0x4C48, 0x464E, 0x5356, 0x974E, 0x2C02, 0x9318, +0x23F3, 0x9746, 0x241E, 0x9305, 0x200E, 0x435E, 0x410D, 0x522D, 0x407C, +0x000E, 0x13B1, 0x1E9A, 0x464E, 0x5356, 0x974E, 0x2C0F, 0x935C, 0x23F3, +0x3C0C, 0x454E, 0x013D, 0x0008, 0x444C, 0x13B1, 0x1E9A, 0x464E, 0x5356, +0x974E, 0x2002, 0x9318, 0x23F4, 0x9746, 0x2002, 0x433C, 0x3C01, 0x431C, +0x5031, 0x000C, 0x1674, 0x0110, 0x147B, 0x8221, 0x4E06, 0x4F07, 0x0DC4, +0x4119, 0x0028, 0x4381, 0x0000, 0x4381, 0x0002, 0x4C0A, 0x4108, 0x5308, +0x431F, 0x08CE, 0x430D, 0x13B1, 0x0D2E, 0x931C, 0x201F, 0x412E, 0x411F, +0x0002, 0xF03E, 0xFFC0, 0xD32E, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430F, +0x08CE, 0x4A0C, 0x430D, 0x13B1, 0x0D2E, 0x931C, 0x200D, 0x4681, 0x0000, +0x4781, 0x0002, 0x430F, 0x08CE, 0x4A0C, 0x430D, 0xD22C, 0x13B1, 0x0D2E, +0x931C, 0x2402, 0x433C, 0x3C08, 0x490F, 0x04CE, 0xD03A, 0x000C, 0x4A0C, +0x430D, 0x13B1, 0x0D2E, 0x3F4D, 0x4303, 0x407C, 0x000E, 0x1380, 0x2E9A, +0x4C4C, 0x430D, 0x935C, 0x2003, 0x430C, 0x1380, 0x2EAA, 0x0110, 0x8031, +0x0006, 0x43C1, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x410D, 0x530D, +0x423C, 0x13B1, 0x478A, 0x431E, 0x410D, 0x532D, 0x434C, 0x1380, 0x2ECE, +0x931C, 0x2403, 0x433C, 0x430D, 0x3C04, 0x411C, 0x0002, 0x411D, 0x0004, +0x5031, 0x0006, 0x0110, 0x140A, 0x8231, 0x410A, 0x530A, 0x4A0E, 0x43FE, +0x0000, 0x43FE, 0x0001, 0x532E, 0x4A0F, 0x523F, 0x9F0E, 0x23F7, 0x0ACD, +0x403C, 0x0033, 0x13B1, 0x488A, 0x40F1, 0x003C, 0x0000, 0x40F1, 0x00E7, +0x0001, 0x0ACD, 0x403C, 0x0010, 0x13B1, 0x488A, 0x43F1, 0x0000, 0x0ACD, +0x423C, 0x13B1, 0x488A, 0x5231, 0x160A, 0x0110, 0x141B, 0x8231, 0x410A, +0x530A, 0x4A0E, 0x43FE, 0x0000, 0x43FE, 0x0001, 0x532E, 0x4A0F, 0x523F, +0x9F0E, 0x23F7, 0x4A0B, 0x0BCD, 0x403C, 0x0038, 0x13B1, 0x478A, 0x40F1, +0x009E, 0x0000, 0x40F1, 0x00E7, 0x0001, 0x0BCD, 0x403C, 0x0010, 0x13B1, +0x478A, 0x4A0E, 0x43FE, 0x0000, 0x43FE, 0x0001, 0x532E, 0x4A0F, 0x523F, +0x9F0E, 0x23F7, 0x0BCD, 0x403C, 0x0038, 0x13B1, 0x478A, 0x5231, 0x161A, +0x0110, 0x140A, 0x4C4A, 0x13B1, 0x4024, 0x008F, 0x2EE2, 0x934A, 0x0F3E, +0x0008, 0x2403, 0xDFEE, 0x0000, 0x3C02, 0xCFEE, 0x0000, 0x3C25, 0x4303, +0x140A, 0x4C4A, 0x13B1, 0x4024, 0x008F, 0x2EE2, 0x934A, 0x0F3E, 0x0008, +0x2404, 0xDFDE, 0x0002, 0x0000, 0x3C03, 0xCFDE, 0x0002, 0x0000, 0x3C12, +0x4303, 0x140A, 0x4C4A, 0x13B1, 0x4024, 0x008F, 0x2EE2, 0x934A, 0x0F3E, +0x0008, 0x2404, 0xDFDE, 0x0001, 0x0000, 0x3C03, 0xCFDE, 0x0001, 0x0000, +0x403C, 0x0005, 0x13B1, 0x4D82, 0x13B1, 0x48D6, 0x160A, 0x0110, 0x140A, +0x4C4A, 0x13B1, 0x4024, 0x008F, 0x2EE2, 0x934A, 0x0F3E, 0x0008, 0x2404, +0xDFDE, 0x000D, 0x0000, 0x3C03, 0xCFDE, 0x000D, 0x0000, 0x3FE6, 0x4303, +0x140A, 0x4C4A, 0x13B1, 0x4024, 0x008F, 0x2EE2, 0x934A, 0x0F3E, 0x0008, +0x2404, 0xDFDE, 0x000C, 0x0000, 0x3C03, 0xCFDE, 0x000C, 0x0000, 0x3FD3, +0x4303, 0x934C, 0x240D, 0x430E, 0x435D, 0x434C, 0x13B1, 0x243C, 0x430E, +0x407D, 0x000D, 0x434C, 0x13B1, 0x243C, 0x434E, 0x3C0D, 0x403E, 0x0003, +0x435D, 0x434C, 0x13B1, 0x243C, 0x430E, 0x407D, 0x000D, 0x434C, 0x13B1, +0x243C, 0x435E, 0x1840, 0x4EC2, 0x2F9A, 0x0110, 0x143B, 0x8231, 0x403A, +0x0FA0, 0x430B, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, +0x0006, 0x434D, 0x0088, 0x2EF4, 0x083F, 0x000A, 0xD8DF, 0x0008, 0x0000, +0x3C00, 0x403F, 0x000B, 0x533F, 0x2FFE, 0x083F, 0x000A, 0xC8DF, 0x0008, +0x0000, 0x1848, 0x100F, 0x4D49, 0x13B1, 0x4594, 0x490F, 0x5F0F, 0x510F, +0x4C8F, 0x0000, 0x5319, 0x490C, 0x422E, 0x13B1, 0x4AAC, 0x120D, 0x4EC1, +0x0000, 0x413D, 0x412F, 0x511F, 0x0002, 0x511F, 0x0004, 0x511F, 0x0006, +0x075F, 0x903F, 0x1A90, 0x2C08, 0x4A0E, 0x4B0F, 0x533A, 0x633B, 0x4E09, +0xDF09, 0x9309, 0x23CB, 0x0180, 0x0BA4, 0x141B, 0x4C0A, 0x430B, 0x931A, +0x2026, 0x1840, 0x4392, 0x2F02, 0x008C, 0x2EE2, 0x018E, 0x4F9E, 0x008D, +0x0009, 0x13B1, 0x4E36, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4C82, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4E6E, 0x13B1, 0x4F1A, 0x403C, 0x100A, 0x13B1, 0x0000, +0x5031, 0x0024, 0x3C9A, 0x932A, 0x2405, 0x930A, 0x2403, 0x903A, 0x0007, +0x2022, 0x1840, 0x4A82, 0x2F02, 0x008C, 0x2EE2, 0x018E, 0x4FB0, 0x008D, +0x0009, 0x13B1, 0x4E36, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4E5E, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4E6E, 0x13B1, 0x4F1A, 0x5031, 0x0024, 0x3C71, 0x923A, +0x2022, 0x1840, 0x4A82, 0x2F02, 0x008C, 0x2EE2, 0x018E, 0x4FB0, 0x008D, +0x0009, 0x13B1, 0x4E36, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4E7E, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4E6E, 0x13B1, 0x4F1A, 0x5031, 0x0024, 0x3C4D, 0x903A, +0x0005, 0x2020, 0x008C, 0x2EE2, 0x018E, 0x4F8C, 0x008D, 0x0009, 0x13B1, +0x4E36, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, 0x23FB, 0x13B1, +0x4C82, 0x1840, 0x40B2, 0x0005, 0x2F02, 0x403C, 0x0005, 0x13B1, 0x4F22, +0x403C, 0x600A, 0x13B1, 0x0000, 0x5031, 0x0012, 0x3C2A, 0x903A, 0x0006, +0x2026, 0x1840, 0x4A82, 0x2F02, 0x008C, 0x2EE2, 0x018E, 0x4FB0, 0x008D, +0x0009, 0x13B1, 0x4E36, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4C82, 0x008F, 0x0012, 0x1840, 0x121F, 0x2EE0, 0x03FF, +0x23FB, 0x13B1, 0x4E6E, 0x13B1, 0x4F1A, 0x403C, 0x100A, 0x13B1, 0x0000, +0x5031, 0x0024, 0x3C01, 0x433B, 0x931A, 0x2406, 0x903A, 0x0005, 0x2403, +0x903A, 0x0006, 0x20BE, 0x40B2, 0x13C0, 0x0520, 0x1800, 0x42D2, 0x2EEA, +0x0526, 0x40B2, 0x13C0, 0x0530, 0x1800, 0x42D2, 0x2EEA, 0x0536, 0x1880, +0x40F2, 0x1DAC, 0x2E8E, 0x1880, 0x40F2, 0x1AB6, 0x2E92, 0x903A, 0x0005, +0x2041, 0x1800, 0x40F2, 0xE042, 0x2E96, 0x1800, 0x40F2, 0xDC70, 0x2E9E, +0x1800, 0x40F2, 0xD884, 0x2EA2, 0x1800, 0x40F2, 0xD47C, 0x2EA6, 0x1800, +0x40F2, 0xD068, 0x2EAA, 0x1800, 0x40F2, 0xCC7E, 0x2EB2, 0x1800, 0x40F2, +0xE4CA, 0x2EB6, 0x1880, 0x40F2, 0x3976, 0x2EBE, 0x1880, 0x40F2, 0x4F2A, +0x2ECA, 0x1880, 0x40F2, 0x4E0E, 0x2EBA, 0x1880, 0x40F2, 0x4F7C, 0x2E9A, +0x1880, 0x40F2, 0x4F4C, 0x2ECE, 0x1880, 0x40F2, 0x4F50, 0x2ED2, 0x1880, +0x40F2, 0x4F5C, 0x2ED6, 0x1880, 0x40F2, 0x4E0A, 0x2EAE, 0x1880, 0x40F2, +0x4F6C, 0x2EDE, 0x3C45, 0x931A, 0x2403, 0x903A, 0x0006, 0x2040, 0x1880, +0x40F2, 0x4CFA, 0x2E96, 0x1880, 0x40F2, 0x4DBE, 0x2E9E, 0x1880, 0x40F2, +0x4D42, 0x2EA2, 0x1880, 0x40F2, 0x49EC, 0x2EA6, 0x1880, 0x40F2, 0x4B7A, +0x2EAA, 0x1880, 0x40F2, 0x4AE0, 0x2EB2, 0x1880, 0x40F2, 0x279A, 0x2EB6, +0x1880, 0x40F2, 0x4F32, 0x2ECA, 0x1880, 0x40F2, 0x4E4C, 0x2EBE, 0x1880, +0x40F2, 0x4E0E, 0x2EBA, 0x1880, 0x40F2, 0x4F7C, 0x2E9A, 0x1880, 0x40F2, +0x4F4C, 0x2ECE, 0x1880, 0x40F2, 0x4F50, 0x2ED2, 0x1880, 0x40F2, 0x4F5C, +0x2ED6, 0x1880, 0x40F2, 0x4E0A, 0x2EAE, 0x1880, 0x40F2, 0x4F6C, 0x2EDE, +0x1840, 0x9392, 0x2E12, 0x2005, 0x1800, 0x40F2, 0xF384, 0x2EC2, 0x3C0D, +0x1840, 0x93A2, 0x2E12, 0x2005, 0x1800, 0x40F2, 0xF852, 0x2EC2, 0x3C04, +0x1800, 0x40F2, 0xF5F4, 0x2EC2, 0x1800, 0x40F2, 0xFAB0, 0x2EC6, 0x1800, +0x40F2, 0x309B, 0x0532, 0x3D18, 0x932A, 0x2402, 0x930A, 0x205E, 0x1880, +0x40F2, 0x3C7A, 0x2E8E, 0x1880, 0x40F2, 0x46CC, 0x2E92, 0x1880, 0x40F2, +0x4CFA, 0x2E96, 0x1880, 0x40F2, 0x4DBE, 0x2E9E, 0x1880, 0x40F2, 0x4D42, +0x2EA2, 0x1880, 0x40F2, 0x49EC, 0x2EA6, 0x1880, 0x40F2, 0x4B7A, 0x2EAA, +0x1880, 0x40F2, 0x4AE0, 0x2EB2, 0x1880, 0x40F2, 0x279A, 0x2EB6, 0x1880, +0x40F2, 0x4F32, 0x2ECA, 0x1880, 0x40F2, 0x4E4C, 0x2EBE, 0x1880, 0x40F2, +0x4F7C, 0x2E9A, 0x1880, 0x40F2, 0x4F4C, 0x2ECE, 0x1880, 0x40F2, 0x4F50, +0x2ED2, 0x1880, 0x40F2, 0x4F5C, 0x2ED6, 0x1880, 0x40F2, 0x4E0E, 0x2EBA, +0x1880, 0x40F2, 0x4E0A, 0x2EAE, 0x1880, 0x40F2, 0x4F6C, 0x2EDE, 0x1840, +0x9382, 0x2E12, 0x2404, 0x1840, 0x93A2, 0x2E12, 0x2005, 0x1880, 0x40F2, +0x30F0, 0x2EC2, 0x3C04, 0x1880, 0x40F2, 0x301C, 0x2EC2, 0x1880, 0x40F2, +0x4444, 0x2EC6, 0x3CB6, 0x903A, 0x0007, 0x2059, 0x1880, 0x40F2, 0x4F60, +0x2E92, 0x1880, 0x40F2, 0x4F64, 0x2E96, 0x1880, 0x40F2, 0x4F06, 0x2EA6, +0x1880, 0x40F2, 0x4F54, 0x2ECA, 0x1880, 0x40F2, 0x4F8A, 0x2EBE, 0x1880, +0x40F2, 0x4E12, 0x2EB6, 0x1880, 0x40F2, 0x4F88, 0x2EC2, 0x1880, 0x40F2, +0x4F58, 0x2EC6, 0x1880, 0x40F2, 0x3C7A, 0x2E8E, 0x1880, 0x40F2, 0x4F74, +0x2E9E, 0x1880, 0x40F2, 0x4F68, 0x2EA2, 0x1880, 0x40F2, 0x4B18, 0x2EAA, +0x1880, 0x40F2, 0x4ED0, 0x2EB2, 0x1880, 0x40F2, 0x4D62, 0x2E9A, 0x1880, +0x40F2, 0x0B16, 0x2ECE, 0x1880, 0x40F2, 0x0BAA, 0x2ED2, 0x1880, 0x40F2, +0x0C7A, 0x2ED6, 0x1880, 0x40F2, 0x0E5E, 0x2EDA, 0x1880, 0x40F2, 0x4A30, +0x2EAE, 0x1880, 0x40F2, 0x4E0E, 0x2EBA, 0x1880, 0x40F2, 0x4F06, 0x2EA6, +0x1880, 0x40F2, 0x4F6C, 0x2EDE, 0x3C5A, 0x923A, 0x2058, 0x1880, 0x40F2, +0x4F60, 0x2E92, 0x1880, 0x40F2, 0x4F64, 0x2E96, 0x1880, 0x40F2, 0x4F06, +0x2EA6, 0x1880, 0x40F2, 0x4F54, 0x2ECA, 0x1880, 0x40F2, 0x4F8A, 0x2EBE, +0x1880, 0x40F2, 0x4E12, 0x2EB6, 0x1880, 0x40F2, 0x4F88, 0x2EC2, 0x1880, +0x40F2, 0x4F58, 0x2EC6, 0x1880, 0x40F2, 0x4F84, 0x2E8E, 0x1880, 0x40F2, +0x4F80, 0x2E9E, 0x1880, 0x40F2, 0x4F78, 0x2EA2, 0x1880, 0x40F2, 0x4F06, +0x2EA6, 0x1880, 0x40F2, 0x4F00, 0x2EAA, 0x1880, 0x40F2, 0x4E1C, 0x2EB2, +0x1880, 0x40F2, 0x4F7C, 0x2E9A, 0x1880, 0x40F2, 0x0CFC, 0x2ECE, 0x1880, +0x40F2, 0x0D2E, 0x2ED2, 0x1880, 0x40F2, 0x0DDE, 0x2ED6, 0x1880, 0x40F2, +0x0E76, 0x2EDA, 0x1880, 0x40F2, 0x4E0A, 0x2EAE, 0x1880, 0x40F2, 0x4E0E, +0x2EBA, 0x1880, 0x40F2, 0x1E9A, 0x2EDE, 0x1840, 0x4382, 0x2E1A, 0x4B0C, +0x161A, 0x0110, 0x145B, 0x4C4A, 0x008B, 0x2F02, 0x1840, 0x9382, 0x2E1A, +0x2403, 0x4B2C, 0x13B1, 0x10F8, 0x13B1, 0x4024, 0x4B2F, 0x934A, 0x20DF, +0x903F, 0x0007, 0x24DC, 0x923F, 0x24DA, 0x931F, 0x2403, 0x903F, 0x0006, +0x2065, 0x403C, 0x000A, 0x13B1, 0x4D82, 0x008A, 0x2EE2, 0x0AC8, 0x00A8, +0x000C, 0x0AC9, 0x00A9, 0x0008, 0x090F, 0xD8EF, 0x0000, 0x0AC6, 0x00A6, +0x000D, 0x090F, 0xC6EF, 0x0000, 0x0A3F, 0x000E, 0x466E, 0x586E, 0xDECF, +0x0000, 0x403C, 0x001E, 0x13B1, 0x4D82, 0x090F, 0xC6EF, 0x0000, 0x403A, +0x0005, 0x4A0C, 0x13B1, 0x4D82, 0x431C, 0x13B1, 0x4D82, 0x090F, 0xD8EF, +0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x090F, 0xD6EF, 0x0000, 0x4A0C, 0x13B1, +0x4D82, 0x403C, 0x0064, 0x13B1, 0x4D82, 0x090F, 0xD8EF, 0x0000, 0x4A0C, +0x13B1, 0x4D82, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x090F, 0xC6EF, 0x0000, 0x431C, 0x13B1, 0x4E9C, 0x090F, +0xD6EF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0x4A0C, +0x13B1, 0x4D82, 0x3DAD, 0x403C, 0x000A, 0x13B1, 0x4D82, 0x008A, 0x2EE2, +0x4A5F, 0x0001, 0x5A6F, 0x5A5F, 0x0002, 0x0AC8, 0x00A8, 0x000C, 0x0AC9, +0x00A9, 0x0008, 0x090D, 0x4F4E, 0x586E, 0xDECD, 0x0000, 0x0AC6, 0x00A6, +0x000D, 0x090E, 0xC6EE, 0x0000, 0x0A3E, 0x000E, 0xDFCE, 0x0000, 0x466F, +0x586F, 0xDFCE, 0x0000, 0xCADE, 0x0003, 0x0000, 0x403C, 0x001E, 0x13B1, +0x4D82, 0x403A, 0x0005, 0x93AB, 0x0000, 0x090F, 0x2039, 0xC6EF, 0x0000, +0x4A0C, 0x13B1, 0x4D82, 0x431C, 0x13B1, 0x4D82, 0x090F, 0xD8EF, 0x0000, +0x4A0C, 0x13B1, 0x4D82, 0x090F, 0xD6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, +0x403C, 0x0064, 0x13B1, 0x4D82, 0x090F, 0xC8EF, 0x0000, 0x4A0C, 0x13B1, +0x4D82, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0x090F, 0xC6EF, 0x0000, 0x431C, +0x13B1, 0x4E9C, 0x090F, 0xD6EF, 0x0000, 0x403C, 0x0028, 0x13B1, 0x4E9C, +0x090F, 0xD8EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x4A0C, 0x13B1, 0x4D82, +0x3D43, 0xD6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x3D3D, 0x935A, 0x20DB, +0x903F, 0x0007, 0x24D8, 0x923F, 0x24D6, 0x931F, 0x2403, 0x903F, 0x0006, +0x2059, 0x008A, 0x2EE2, 0x0AC8, 0x00A8, 0x000C, 0x0AC9, 0x00A9, 0x0008, +0x090F, 0xD8EF, 0x0000, 0x0AC6, 0x00A6, 0x000D, 0x090F, 0xC6EF, 0x0000, +0x0A3F, 0x000E, 0x466E, 0x586E, 0xDECF, 0x0000, 0x431C, 0x13B1, 0x4D82, +0x090F, 0xC6EF, 0x0000, 0x403A, 0x0005, 0x4A0C, 0x13B1, 0x4D82, 0x431C, +0x13B1, 0x4D82, 0x090F, 0xC8EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x090F, +0xD6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x403C, 0x0064, 0x13B1, 0x4D82, +0x090F, 0xD8EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x403C, 0x0028, 0x13B1, +0x4E9C, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x090F, 0xC6EF, 0x0000, +0x431C, 0x13B1, 0x4E9C, 0x090F, 0xD6EF, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3F27, 0xC0F2, 0x0020, 0x0282, 0x3F23, +0x008A, 0x2EE2, 0x4A5F, 0x0001, 0x5A6F, 0x5A5F, 0x0002, 0x0AC8, 0x00A8, +0x000C, 0x0AC9, 0x00A9, 0x0008, 0x090D, 0x4F4E, 0x586E, 0xDECD, 0x0000, +0x0AC6, 0x00A6, 0x000D, 0x090E, 0xC6EE, 0x0000, 0x0A3E, 0x000E, 0xDFCE, +0x0000, 0x466F, 0x586F, 0xDFCE, 0x0000, 0xCADE, 0x0003, 0x0000, 0x431C, +0x13B1, 0x4D82, 0x403A, 0x0005, 0x93AB, 0x0000, 0x2040, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x090F, 0xC6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, +0x422C, 0x13B1, 0x4D82, 0x090F, 0xC8EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, +0x090F, 0xD6EF, 0x0000, 0x403C, 0x0032, 0x13B1, 0x4D82, 0x090F, 0xC8EF, +0x0000, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0x090F, 0xC6EF, 0x0000, 0x432C, +0x13B1, 0x4E9C, 0x090F, 0xC8EF, 0x0000, 0x432C, 0x13B1, 0x4E9C, 0x090F, +0xD6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C71, 0xC0F2, 0x0020, 0x0282, 0x3C6D, 0x090F, +0xC8EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x090F, 0xD6EF, 0x0000, 0x4A0C, +0x13B1, 0x4D82, 0x3C60, 0x903F, 0x0007, 0x2034, 0x403C, 0x000A, 0x13B1, +0x4D82, 0x008A, 0x2EE2, 0x4A5F, 0x0001, 0x5A6F, 0x5A5F, 0x0002, 0x0A3D, +0x0008, 0x4F4E, 0x5A5E, 0x000C, 0xDECD, 0x0000, 0x0A3E, 0x0008, 0xCADE, +0x000D, 0x0000, 0x0A3E, 0x000E, 0xDFCE, 0x0000, 0x4A5F, 0x000D, 0x5A5F, +0x000C, 0xDFCE, 0x0000, 0xCADE, 0x0003, 0x0000, 0x403C, 0x001E, 0x13B1, +0x4D82, 0x13B1, 0x0EB4, 0x0A3F, 0x0008, 0xDADF, 0x000C, 0x0000, 0x403C, +0x0005, 0x13B1, 0x4D82, 0x3C29, 0x923F, 0x2027, 0x403C, 0x000A, 0x13B1, +0x4D82, 0x008A, 0x2EE2, 0x0A3F, 0x0008, 0xDAEF, 0x0000, 0x0A3F, 0x0008, +0xCADF, 0x0001, 0x0000, 0x0A3F, 0x000E, 0x4A5E, 0x0001, 0x5A6E, 0xDECF, +0x0000, 0x403C, 0x001E, 0x13B1, 0x4D82, 0x13B1, 0x0F02, 0x0A3F, 0x0008, +0xDADF, 0x000C, 0x0000, 0x403C, 0x0005, 0x13B1, 0x4D82, 0x13B1, 0x0E76, +0x92BB, 0x0000, 0x2402, 0x13B1, 0x48D6, 0x1840, 0x4382, 0x2E1A, 0x1656, +0x0110, 0x141B, 0x002A, 0x0532, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x1800, +0x40F2, 0x3047, 0x0532, 0x1840, 0x90B2, 0x0005, 0x2F72, 0x2402, 0x13B1, +0x4024, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, +0xC232, 0x4303, 0x008D, 0x2F60, 0x0DCF, 0x00AF, 0x000C, 0x0DCE, 0x00AE, +0x000E, 0x0E0C, 0xCFEC, 0x0000, 0x0DCC, 0x00AC, 0x000D, 0x00AD, 0x0008, +0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0E0B, 0xCFEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0E0B, 0xCFEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E0B, 0xCFEB, 0x0000, +0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0E0B, 0xCFEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, +0x0E0B, 0xCFEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0E0B, 0xDFEB, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, +0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0E0B, 0xCFEB, 0x0000, +0x0D0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0E0B, 0xCFEB, 0x0000, 0x0D0B, 0xCCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x0D0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0E0B, 0xDFEB, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x0A60, +0x0532, 0x1840, 0x90B2, 0x0005, 0x2F72, 0x2402, 0x13B1, 0x48D6, 0x430C, +0x161A, 0x0110, 0x141B, 0x1800, 0x40F2, 0x2F9F, 0x0522, 0x1840, 0x90B2, +0x0005, 0x2F72, 0x2402, 0x13B1, 0x4024, 0x407E, 0x0006, 0x008D, 0x2F60, +0x0DCC, 0x00AC, 0x000D, 0x0DCA, 0x00AA, 0x0008, 0x0DCF, 0x00AF, 0x000C, +0x00AD, 0x000E, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x0D0B, 0xCFEB, 0x0000, 0x0A0B, 0xCCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x0A0B, 0xDCEB, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0D0B, 0xDFEB, 0x0000, 0xD232, 0x9382, 0x4A00, +0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x537E, +0x23D4, 0x1800, 0x40F2, 0x3047, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0D0B, 0xCFEB, 0x0000, +0x0A0B, 0xCCEB, 0x0000, 0x4303, 0x4303, 0x4303, 0x0A0B, 0xDCEB, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0D0B, 0xDFEB, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x3F80, 0x4303, 0x147B, 0x140D, 0x8031, 0x0006, 0x4C46, +0x4E45, 0x42F1, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x435C, 0x13B1, +0x4B4C, 0x4648, 0x464C, 0x13B1, 0x4B4C, 0x464A, 0x0358, 0x484C, 0x13B1, +0x4B4C, 0x584A, 0x4648, 0x1941, 0x1048, 0x484C, 0x13B1, 0x4B4C, 0x584A, +0x1942, 0x1046, 0x464C, 0x13B1, 0x4B4C, 0x4A4C, 0x564C, 0x13B1, 0x4B4C, +0x434C, 0x13B1, 0x4B4C, 0x435C, 0x13B1, 0x4B4C, 0x0086, 0x2F86, 0x06C7, +0x00A7, 0x0001, 0x476E, 0xE37E, 0x06CC, 0x00AC, 0x000E, 0x0C0F, 0xFECF, +0x0000, 0xFEC2, 0x0223, 0x06C4, 0x00A4, 0x0008, 0x040F, 0xC6EF, 0x0000, +0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x434E, 0x040F, 0xC6EF, 0x0000, +0x4303, 0x4303, 0x06CD, 0x00AD, 0x0004, 0x0D0F, 0x4F6F, 0xB65F, 0x0001, +0x2401, 0x435E, 0x040F, 0xD6EF, 0x0000, 0xD232, 0x4EC1, 0x0000, 0x434E, +0x040F, 0xC6EF, 0x0000, 0x4303, 0x4303, 0x0D0F, 0x4F6F, 0xB65F, 0x0001, +0x2401, 0x435E, 0x040F, 0xD6EF, 0x0000, 0xD232, 0x5E4E, 0xD16E, 0x4EC1, +0x0000, 0x434E, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x4303, 0x0D0F, 0x4F6F, +0xB65F, 0x0001, 0x2401, 0x435E, 0x040F, 0xD6EF, 0x0000, 0xD232, 0x1841, +0x5E4E, 0xD16E, 0x4EC1, 0x0000, 0x93D1, 0x0000, 0x20C5, 0x9345, 0x2459, +0x430A, 0x430B, 0x4075, 0x0020, 0x4348, 0x040F, 0xC6EF, 0x0000, 0x4303, +0x4303, 0x0D0F, 0x4F6E, 0xB65E, 0x0001, 0x2401, 0x4358, 0x040F, 0xD6EF, +0x0000, 0xD232, 0x4309, 0x580A, 0x630B, 0x1008, 0x1009, 0x411E, 0x0002, +0x411F, 0x0004, 0x035F, 0x100E, 0xD90F, 0x4E81, 0x0002, 0x4F81, 0x0004, +0x5375, 0x23DE, 0x434E, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x4303, 0x0D0F, +0x4F6F, 0xB65F, 0x0001, 0x2401, 0x435E, 0x040F, 0xD6EF, 0x0000, 0xD232, +0xF35A, 0xEE4A, 0x2402, 0x42F1, 0x0000, 0x013F, 0x0006, 0x03DF, 0x240C, +0x411E, 0x0002, 0x411F, 0x0004, 0x013B, 0x0006, 0x4E8B, 0x0000, 0x4F8B, +0x0002, 0x43D1, 0x0000, 0x0C0F, 0xD7EF, 0x0000, 0xD7E2, 0x0223, 0x040F, +0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x3CB9, 0x0C0F, +0xD7EF, 0x0000, 0xD7E2, 0x0223, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, +0xD6EF, 0x0000, 0x4303, 0x013F, 0x0006, 0x1840, 0x4FA1, 0x0002, 0x1840, +0x4F91, 0x0002, 0x0004, 0x430A, 0x4078, 0x0020, 0x415C, 0x0002, 0x13B1, +0x4B4C, 0x511A, 0x0002, 0x411E, 0x0002, 0x411F, 0x0004, 0x035F, 0x100E, +0x4E81, 0x0002, 0x4F81, 0x0004, 0x5378, 0x23EE, 0x4A4C, 0x13B1, 0x4B4C, +0x040F, 0xC7EF, 0x0000, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, +0x0000, 0x4303, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, +0x4303, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, +0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x040F, +0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x040F, 0xC6EF, +0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x040F, 0xC6EF, 0x0000, +0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x3C4C, 0x93E1, 0x0000, 0x2403, +0x92E1, 0x0000, 0x202D, 0x9345, 0x240C, 0x407E, 0x0021, 0x040F, 0xC6EF, +0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x537E, 0x23F6, 0x0C0F, +0xD7EF, 0x0000, 0xD7E2, 0x0223, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, +0xD6EF, 0x0000, 0x4303, 0x9345, 0x2029, 0x040F, 0xC7EF, 0x0000, 0x407E, +0x0021, 0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, +0x537E, 0x23F6, 0x3C19, 0x0C0F, 0xD7EF, 0x0000, 0xD7E2, 0x0223, 0x040F, +0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x407E, 0x0022, +0x040F, 0xC6EF, 0x0000, 0x4303, 0x040F, 0xD6EF, 0x0000, 0x4303, 0x537E, +0x23F6, 0x040F, 0xD7EF, 0x0000, 0x416C, 0x5031, 0x000A, 0x1674, 0x0110, +0x008F, 0x2F4A, 0x1841, 0x5C4C, 0xF07C, 0x003C, 0x4F5E, 0x0001, 0xF07E, +0x00C3, 0xDC4E, 0x4ECF, 0x0001, 0x4DCF, 0x0000, 0xE0FF, 0x0040, 0x0001, +0x1840, 0x4382, 0x2F5E, 0x40B2, 0x5A19, 0x015C, 0xD392, 0x0100, 0xC392, +0x0102, 0xB0F2, 0x0040, 0x0240, 0x2C04, 0x1840, 0x9382, 0x2F5E, 0x27F8, +0x40B2, 0x5A80, 0x015C, 0xC392, 0x0100, 0xC392, 0x0102, 0x4FA2, 0x0202, +0x0110, 0x434D, 0x407C, 0x000D, 0x13B1, 0x21E0, 0x4382, 0x0224, 0xC3E2, +0x0263, 0xB0F2, 0x0040, 0x0240, 0x2BFC, 0x421C, 0x0220, 0x008F, 0x2F4A, +0xF0FF, 0x00C3, 0x0001, 0x43CF, 0x0000, 0x4FA2, 0x0202, 0xD3E2, 0x0263, +0x43B2, 0x0224, 0x0110, 0x4382, 0x0224, 0xC3E2, 0x0263, 0x934C, 0x2005, +0x3C29, 0xE3E2, 0x0263, 0xE3E2, 0x0263, 0x1840, 0x4382, 0x2F5E, 0x40B2, +0x5A19, 0x015C, 0xD392, 0x0100, 0xC392, 0x0102, 0xB0F2, 0x0040, 0x0240, +0x2C04, 0x1840, 0x9382, 0x2F5E, 0x27F8, 0x40B2, 0x5A80, 0x015C, 0xC392, +0x0100, 0xC392, 0x0102, 0x4C4F, 0x533F, 0xE03F, 0x8000, 0x0FEF, 0x0DEF, +0x184F, 0x429F, 0x0220, 0x0000, 0x537C, 0x23D7, 0x3FCA, 0x4303, 0x141B, +0xD3E2, 0x0263, 0x43B2, 0x0224, 0x008A, 0x2F4A, 0x1841, 0x5C4C, 0xF07C, +0x003C, 0x4A5B, 0x0001, 0xF07B, 0x00C3, 0xDC4B, 0x4BCA, 0x0001, 0x4DCA, +0x0000, 0x1840, 0x4382, 0x2F5E, 0x40B2, 0x5A19, 0x015C, 0xD392, 0x0100, +0xC392, 0x0102, 0xB0F2, 0x0040, 0x0240, 0x2C04, 0x1840, 0x9382, 0x2F5E, +0x27F8, 0x40B2, 0x5A80, 0x015C, 0xC392, 0x0100, 0xC392, 0x0102, 0x4F4F, +0x4F0D, 0x0DED, 0x0DEE, 0x03FE, 0x4EA2, 0x0222, 0xE0FA, 0x0040, 0x0001, +0x4AA2, 0x0202, 0x537F, 0x03FE, 0x934F, 0x23F5, 0x161A, 0x0110, 0x4382, +0x0224, 0xC3E2, 0x0263, 0x934C, 0x2005, 0x3C11, 0xE3E2, 0x0263, 0xE3E2, +0x0263, 0xB0F2, 0x0040, 0x0240, 0x2BFC, 0x537C, 0x4C4F, 0x0FEF, 0x0DEF, +0x429F, 0x0220, 0x0000, 0x934C, 0x23EF, 0x3F71, 0x4303, 0x143B, 0xD3E2, +0x0263, 0x43B2, 0x0224, 0x008A, 0x2F4A, 0x1841, 0x5C4C, 0xF07C, 0x003C, +0x4A5B, 0x0001, 0xF07B, 0x00C3, 0xDC4B, 0x4BCA, 0x0001, 0x4DCA, 0x0000, +0x434D, 0x934F, 0x243F, 0x4F4C, 0xF07C, 0x0003, 0x407B, 0x0040, 0x240C, +0x4D48, 0x08E8, 0x0EE8, 0x48A2, 0x0222, 0x535D, 0xEBCA, 0x0001, 0x4AA2, +0x0202, 0x537C, 0x23F4, 0x1941, 0x104F, 0x242A, 0x4D48, 0x08E8, 0x0EE8, +0x48A2, 0x0222, 0x535D, 0xEBCA, 0x0001, 0x4AA2, 0x0202, 0x4D48, 0x08E8, +0x0EE8, 0x48A2, 0x0222, 0x535D, 0xEBCA, 0x0001, 0x4AA2, 0x0202, 0x4D48, +0x08E8, 0x0EE8, 0x48A2, 0x0222, 0x535D, 0xEBCA, 0x0001, 0x4AA2, 0x0202, +0x4D48, 0x08E8, 0x0EE8, 0x48A2, 0x0222, 0x535D, 0xEBCA, 0x0001, 0x4AA2, +0x0202, 0x537F, 0x23D6, 0x1638, 0x0110, 0x140A, 0xD3E2, 0x0263, 0x43B2, +0x0224, 0x008F, 0x2F4A, 0x1841, 0x5C4C, 0xF07C, 0x003C, 0x4F5A, 0x0001, +0xF07A, 0x00C3, 0xDC4A, 0x4ACF, 0x0001, 0x4DCF, 0x0000, 0xE0FF, 0x0040, +0x0001, 0x1840, 0x4382, 0x2F5E, 0x40B2, 0x5A19, 0x015C, 0xD392, 0x0100, +0xC392, 0x0102, 0xB0F2, 0x0040, 0x0240, 0x2C04, 0x1840, 0x9382, 0x2F5E, +0x27F8, 0x40B2, 0x5A80, 0x015C, 0xC392, 0x0100, 0xC392, 0x0102, 0x4E82, +0x0222, 0x4FA2, 0x0202, 0x160A, 0x0110, 0x008F, 0x2F4A, 0x1841, 0x5C4C, +0xF07C, 0x003C, 0x4F5E, 0x0001, 0xF07E, 0x00C3, 0xDC4E, 0x4ECF, 0x0001, +0x4DCF, 0x0000, 0xE0FF, 0x0040, 0x0001, 0xB0F2, 0x0040, 0x0240, 0x2BFC, +0x3EB0, 0x4303, 0x145B, 0x4C49, 0x4308, 0x403A, 0x0005, 0x008B, 0x2F02, +0x9A8B, 0x0000, 0x2007, 0x422E, 0x435D, 0x434C, 0x13B1, 0x243C, 0x439B, +0x0000, 0x13B1, 0x4024, 0x4B2F, 0x831F, 0x2409, 0x831F, 0x2475, 0x822F, +0x2405, 0x831F, 0x2502, 0x831F, 0x2509, 0x3D0D, 0x9359, 0x2016, 0x0089, +0x2EE2, 0x09C6, 0x00A6, 0x000D, 0x09C7, 0x00A7, 0x0008, 0x070F, 0xC6EF, +0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x431C, 0x13B1, 0x4D82, 0x070F, 0xC9DF, +0x000C, 0x0000, 0x3C17, 0x9349, 0x204D, 0x0089, 0x2EE2, 0x09C6, 0x00A6, +0x000D, 0x09C7, 0x00A7, 0x0008, 0x070F, 0xC6EF, 0x0000, 0x4A0C, 0x13B1, +0x4D82, 0x431C, 0x13B1, 0x4D82, 0x070F, 0xD9DF, 0x000C, 0x0000, 0x4A0C, +0x13B1, 0x4D82, 0x070F, 0xD6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x403C, +0x0064, 0x13B1, 0x4D82, 0x070F, 0xD9DF, 0x000C, 0x0000, 0x4A0C, 0x13B1, +0x4D82, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x070F, 0xC6EF, 0x0000, 0x431C, 0x13B1, 0x4E9C, 0x070F, 0xD6EF, +0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, +0xC0F2, 0x0020, 0x0282, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0x4A0C, 0x13B1, +0x4D82, 0x939B, 0x0000, 0x2002, 0x4318, 0x3CC1, 0x4328, 0x3CBC, 0x9359, +0x204B, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0089, 0x2EE2, 0x09C6, +0x00A6, 0x000D, 0x09C7, 0x00A7, 0x0008, 0x070F, 0xC6EF, 0x0000, 0x4A0C, +0x13B1, 0x4D82, 0x422C, 0x13B1, 0x4D82, 0x070F, 0xC9DF, 0x000C, 0x0000, +0x4A0C, 0x13B1, 0x4D82, 0x070F, 0xD6EF, 0x0000, 0x403C, 0x0032, 0x13B1, +0x4D82, 0x070F, 0xC9DF, 0x000C, 0x0000, 0x403C, 0x0028, 0x13B1, 0x4E9C, +0x070F, 0xC6EF, 0x0000, 0x432C, 0x13B1, 0x4E9C, 0x070F, 0xC9DF, 0x000C, +0x0000, 0x432C, 0x13B1, 0x4E9C, 0x070F, 0xD6EF, 0x0000, 0x4A0C, 0x13B1, +0x4D82, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C73, +0xC0F2, 0x0020, 0x0282, 0x3C6F, 0x9349, 0x2070, 0x0089, 0x2EE2, 0x09C6, +0x00A6, 0x000D, 0x09C7, 0x00A7, 0x0008, 0x070F, 0xC6EF, 0x0000, 0x4A0C, +0x13B1, 0x4D82, 0x431C, 0x13B1, 0x4D82, 0x070F, 0xD9DF, 0x000C, 0x0000, +0x4A0C, 0x13B1, 0x4D82, 0x070F, 0xD6EF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, +0x403C, 0x0064, 0x13B1, 0x4D82, 0x070F, 0xC9DF, 0x000C, 0x0000, 0x4A0C, +0x13B1, 0x4D82, 0x403C, 0x0028, 0x13B1, 0x4E9C, 0x070F, 0xC6EF, 0x0000, +0x431C, 0x13B1, 0x4E9C, 0x070F, 0xD6EF, 0x0000, 0x403C, 0x0028, 0x13B1, +0x4E9C, 0x070F, 0xD9DF, 0x000C, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x3C28, +0x13B1, 0x0EB4, 0x002F, 0x2EEA, 0x1840, 0xD2DF, 0x2EEE, 0x0000, 0x3C1F, +0x13B1, 0x0F02, 0x13B1, 0x4E8E, 0x3C1D, 0x9359, 0x2010, 0x0089, 0x2EE2, +0x093F, 0x0008, 0xC9DF, 0x000C, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x093F, +0x0008, 0xD9DF, 0x000D, 0x0000, 0x3C08, 0x9349, 0x2009, 0x002F, 0x2EEA, +0x1840, 0xD2DF, 0x2EEF, 0x0000, 0x4A0C, 0x13B1, 0x4D82, 0x92BB, 0x0000, +0x2413, 0x13B1, 0x48D6, 0x480E, 0x435D, 0x434C, 0x13B1, 0x243C, 0x90BB, +0x0007, 0x0000, 0x2002, 0x431E, 0x3C01, 0x430E, 0x407D, 0x000D, 0x434C, +0x13B1, 0x243C, 0x1656, 0x0110, 0x147B, 0x120F, 0x120E, 0x120D, 0x120C, +0x8031, 0x0058, 0x411F, 0x0084, 0x4F07, 0x43C1, 0x0002, 0x035F, 0x4F81, +0x0004, 0x410F, 0x530F, 0x0F71, 0x0044, 0x503F, 0x0006, 0x0F71, 0x0040, +0x503F, 0x0032, 0x0F71, 0x003C, 0x823F, 0x0F71, 0x0034, 0x823F, 0x0F71, +0x002C, 0x503F, 0xFFDE, 0x0F71, 0x0024, 0x503F, 0x0016, 0x0F71, 0x0020, +0x503F, 0xFFEE, 0x0F71, 0x0018, 0x503F, 0xFFF6, 0x0F71, 0x0014, 0x503F, +0x0048, 0x0F71, 0x0010, 0x523F, 0x0F71, 0x000C, 0x4191, 0x0086, 0x0086, +0x410F, 0x503F, 0x0058, 0x4FB1, 0x0050, 0x4FB1, 0x0052, 0x4FB1, 0x0054, +0x4FB1, 0x0056, 0x426F, 0x013E, 0x000C, 0x407D, 0x0040, 0x407C, 0x0007, +0x13B1, 0x22DA, 0x013D, 0x0010, 0x426C, 0x13B1, 0x2276, 0x410F, 0x503F, +0x0048, 0x4F38, 0x4F39, 0x4F3A, 0x4F3B, 0x4B0F, 0x108F, 0x4F46, 0xF036, +0x00C7, 0xB226, 0x2CC6, 0x9076, 0x0083, 0x2004, 0x40F1, 0x002A, 0x0002, +0x3CAA, 0xB036, 0x0040, 0x2806, 0x464E, 0xF07E, 0x00C0, 0x907E, 0x00C0, +0x20C4, 0x9076, 0x0081, 0x2012, 0x407D, 0x0046, 0x435C, 0x13B1, 0x21E0, +0x013D, 0x0014, 0x435C, 0x13B1, 0x2276, 0x1840, 0x40B2, 0x0046, 0x2F98, +0x40F1, 0x003A, 0x0002, 0x3C8C, 0x464E, 0xF07E, 0x00C3, 0x935E, 0x2404, +0x934E, 0x2402, 0x936E, 0x2069, 0x9381, 0x0004, 0x24A3, 0x90B1, 0x0021, +0x0086, 0x289F, 0x407D, 0x0054, 0x435C, 0x13B1, 0x21E0, 0x013D, 0x0018, +0x435C, 0x13B1, 0x2276, 0x1840, 0x40B2, 0x0054, 0x2F98, 0x4381, 0x001C, +0x4381, 0x001E, 0x436F, 0x013E, 0x0020, 0x407D, 0x0020, 0x407C, 0x0007, +0x13B1, 0x22DA, 0x013D, 0x0024, 0x436C, 0x13B1, 0x2276, 0x4114, 0x0006, +0x4115, 0x0008, 0xD035, 0x0200, 0x4481, 0x0028, 0x4581, 0x002A, 0x436F, +0x013E, 0x002C, 0x407D, 0x0020, 0x407C, 0x0007, 0x13B1, 0x22DA, 0x013D, +0x0034, 0x436C, 0x13B1, 0x2276, 0xF035, 0xFDFF, 0x4481, 0x0038, 0x4581, +0x003A, 0x436F, 0x013E, 0x003C, 0x407D, 0x0020, 0x407C, 0x0007, 0x13B1, +0x22DA, 0x013D, 0x0040, 0x436C, 0x13B1, 0x2276, 0x407D, 0x0046, 0x435C, +0x13B1, 0x21E0, 0x013D, 0x0044, 0x435C, 0x13B1, 0x2276, 0x1840, 0x40B2, +0x0046, 0x2F98, 0x411F, 0x0004, 0x533F, 0x4F81, 0x0004, 0x5037, 0x0005, +0x3C1A, 0x9076, 0x0003, 0x2414, 0x9076, 0x0082, 0x2411, 0x9076, 0x0080, +0x240E, 0x464E, 0xF07E, 0x00C0, 0x907E, 0x00C0, 0x2003, 0x407E, 0x001A, +0x3C02, 0x407E, 0x003A, 0x4EC1, 0x0002, 0x3C03, 0x40F1, 0x001A, 0x0002, +0x9307, 0x2421, 0x5337, 0x90F1, 0x003A, 0x0002, 0x2721, 0x90F1, 0x002A, +0x0002, 0x271D, 0x9076, 0x0082, 0x2407, 0x9076, 0x0080, 0x2404, 0x9346, +0x2402, 0x9366, 0x200E, 0x407D, 0x0046, 0x435C, 0x13B1, 0x21E0, 0x410D, +0x530D, 0x435C, 0x13B1, 0x2276, 0x1840, 0x40B2, 0x0046, 0x2F98, 0x480C, +0x490D, 0x4A0E, 0x4B0F, 0x5031, 0x0060, 0x1674, 0x0110, 0x140A, 0x8221, +0x4381, 0x0000, 0x4381, 0x0002, 0xB2B2, 0x070A, 0x2BFD, 0x4291, 0x0720, +0x0000, 0x4381, 0x0002, 0x421F, 0x1A16, 0x1202, 0xC232, 0x4303, 0x4F82, +0x04C0, 0x4192, 0x0002, 0x04C8, 0x4F82, 0x04C4, 0x421C, 0x04CA, 0x4292, +0x04CC, 0x04CA, 0x4192, 0x0004, 0x04C8, 0x421D, 0x04CA, 0x4132, 0x403E, +0x8000, 0x430F, 0x13B1, 0x4964, 0x421E, 0x1A18, 0x4E0F, 0xE33F, 0x5F0F, +0x7F0F, 0x5E0C, 0x6F0D, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x008A, 0x2F44, +0x412C, 0x411D, 0x0002, 0x403E, 0x09C4, 0x430F, 0x13B1, 0x4D20, 0x403E, +0x1000, 0x430F, 0x13B1, 0x4964, 0x403E, 0x01B8, 0x430F, 0x13B1, 0x4D20, +0x403E, 0x00DC, 0x430F, 0x13B1, 0x4964, 0x4A2F, 0x0FEF, 0x1840, 0x4C8F, +0x2F12, 0x431F, 0x5A2F, 0x923F, 0x2001, 0x430F, 0x4F8A, 0x0000, 0x4291, +0x0722, 0x0000, 0x4381, 0x0002, 0x421F, 0x1A16, 0x1202, 0xC232, 0x4303, +0x4F82, 0x04C0, 0x4192, 0x0002, 0x04C8, 0x4F82, 0x04C4, 0x421C, 0x04CA, +0x4292, 0x04CC, 0x04CA, 0x4192, 0x0004, 0x04C8, 0x421D, 0x04CA, 0x4132, +0x403E, 0x8000, 0x430F, 0x13B1, 0x4964, 0x421E, 0x1A18, 0x4E0F, 0xE33F, +0x5F0F, 0x7F0F, 0x5E0C, 0x6F0D, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x1840, +0x421A, 0x2F48, 0x0AEA, 0x9381, 0x0002, 0x381F, 0x2003, 0x9391, 0x0000, +0x281B, 0x412C, 0x411D, 0x0002, 0x403E, 0x09C4, 0x430F, 0x13B1, 0x4D20, +0x403E, 0x1000, 0x430F, 0x13B1, 0x4964, 0x403E, 0x012C, 0x430F, 0x13B1, +0x4D20, 0x403E, 0x0096, 0x430F, 0x13B1, 0x4964, 0x1840, 0x4C8A, 0x2F34, +0x3C03, 0x1840, 0x438A, 0x2F34, 0x431F, 0x1840, 0x521F, 0x2F48, 0x923F, +0x2001, 0x430F, 0x1840, 0x4F82, 0x2F48, 0x4291, 0x0724, 0x0000, 0x4381, +0x0002, 0x421F, 0x1A16, 0x1202, 0xC232, 0x4303, 0x4F82, 0x04C0, 0x4192, +0x0002, 0x04C8, 0x4F82, 0x04C4, 0x421C, 0x04CA, 0x4292, 0x04CC, 0x04CA, +0x4192, 0x0004, 0x04C8, 0x421D, 0x04CA, 0x4132, 0x403E, 0x8000, 0x430F, +0x13B1, 0x4964, 0x421E, 0x1A18, 0x4E0F, 0xE33F, 0x5F0F, 0x7F0F, 0x5E0C, +0x6F0D, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x008A, 0x2F46, 0x412C, 0x411D, +0x0002, 0x403E, 0x09C4, 0x430F, 0x13B1, 0x4D20, 0x403E, 0x1000, 0x430F, +0x13B1, 0x4964, 0x403E, 0x012C, 0x430F, 0x13B1, 0x4D20, 0x403E, 0x0096, +0x430F, 0x13B1, 0x4964, 0x4A2F, 0x0FEF, 0x1840, 0x4C8F, 0x2F24, 0x431F, +0x5A2F, 0x923F, 0x2001, 0x430F, 0x4F8A, 0x0000, 0x421C, 0x0726, 0x430D, +0x13B1, 0x43BC, 0x430E, 0x403F, 0x447A, 0x13B1, 0x35E4, 0x430E, 0x403F, +0x4020, 0x13B1, 0x35E4, 0x430E, 0x403F, 0x4580, 0x13B1, 0x34A4, 0x13B1, +0x4EE0, 0x1840, 0x4C82, 0x2F22, 0x5221, 0x160A, 0x0110, 0x143B, 0x430A, +0x403B, 0x0190, 0x430F, 0x1840, 0x4C82, 0x2E14, 0x903C, 0x0960, 0x2C02, +0x403B, 0x0320, 0x4382, 0x070C, 0x1840, 0x421C, 0x2E14, 0x430D, 0x13B1, +0x43BC, 0x430E, 0x403F, 0x447A, 0x13B1, 0x34A4, 0x430E, 0x403F, 0x444D, +0x13B1, 0x35E4, 0x13B1, 0x4EE0, 0x13B1, 0x4F46, 0x90B2, 0x0C11, 0x0794, +0x2804, 0x40B2, 0x0C10, 0x0794, 0x3C0E, 0x90B2, 0x0551, 0x0794, 0x2C0A, +0x40B2, 0x0552, 0x0794, 0x3C06, 0x421C, 0x0794, 0x503C, 0x0064, 0x13B1, +0x4F46, 0x903A, 0x0003, 0x34AC, 0x4B0F, 0x4F0B, 0x533B, 0x931F, 0x38A7, +0x430C, 0x430F, 0x4308, 0x3C0A, 0xD392, 0x0700, 0x13B1, 0x2A16, 0xC392, +0x0700, 0x403C, 0x0014, 0x13B1, 0x4E9C, 0x480F, 0x4F08, 0x5318, 0x903F, +0x002B, 0x3BF0, 0x13B1, 0x45EC, 0x403F, 0xFFF6, 0x1840, 0x521F, 0x2E14, +0x9F0C, 0x2C3D, 0x430A, 0x1840, 0x421F, 0x2E14, 0x8C0F, 0x903F, 0x01F5, +0x3807, 0x421E, 0x0794, 0x503E, 0x0064, 0x903E, 0x0C11, 0x2BC6, 0x903F, +0x0065, 0x380E, 0x421E, 0x0794, 0x503E, 0x001E, 0x903E, 0x0C11, 0x2C07, +0x421C, 0x0794, 0x503C, 0x001E, 0x13B1, 0x4F46, 0x3FBB, 0x903F, 0x0015, +0x380E, 0x421F, 0x0794, 0x503F, 0x0005, 0x903F, 0x0C11, 0x2C07, 0x421C, +0x0794, 0x503C, 0x0005, 0x13B1, 0x4F46, 0x3FAA, 0x421F, 0x0794, 0x531F, +0x903F, 0x0C11, 0x2FA4, 0x421C, 0x0794, 0x531C, 0x13B1, 0x4F46, 0x3F9E, +0x403F, 0x000A, 0x1840, 0x521F, 0x2E14, 0x9C0F, 0x2C44, 0x4C0F, 0x1840, +0x821F, 0x2E14, 0x430A, 0x903F, 0x01F5, 0x380E, 0x421E, 0x0794, 0x503E, +0xFF9C, 0x903E, 0x0551, 0x2807, 0x421C, 0x0794, 0x503C, 0xFF9C, 0x13B1, +0x4F46, 0x3F81, 0x903F, 0x0065, 0x380E, 0x421E, 0x0794, 0x503E, 0xFFE2, +0x903E, 0x0551, 0x2807, 0x421C, 0x0794, 0x503C, 0xFFE2, 0x13B1, 0x4F46, +0x3F70, 0x903F, 0x0015, 0x380E, 0x421F, 0x0794, 0x503F, 0xFFFB, 0x903F, +0x0551, 0x2807, 0x421C, 0x0794, 0x503C, 0xFFFB, 0x13B1, 0x4F46, 0x3F5F, +0x421F, 0x0794, 0x533F, 0x903F, 0x0551, 0x2B59, 0x421C, 0x0794, 0x533C, +0x13B1, 0x4F46, 0x3F53, 0x531A, 0x3F51, 0x42B2, 0x070C, 0x903A, 0x0003, +0x3802, 0x431C, 0x3C01, 0x430C, 0x1638, 0x0110, 0x143B, 0x430A, 0x403B, +0x0190, 0x430F, 0x903C, 0x0898, 0x2C02, 0x403B, 0x0320, 0x4382, 0x070C, +0x1840, 0x421C, 0x2E14, 0x430D, 0x13B1, 0x43BC, 0x430E, 0x403F, 0x447A, +0x13B1, 0x34A4, 0x403E, 0x6000, 0x403F, 0xC4D5, 0x13B1, 0x35E4, 0x403E, +0x0800, 0x403F, 0x45C0, 0x13B1, 0x31C4, 0x13B1, 0x4EE0, 0x13B1, 0x4F3A, +0x90B2, 0x0D01, 0x0784, 0x280A, 0x40B2, 0x0D00, 0x0784, 0x3C06, 0x421C, +0x0784, 0x503C, 0xFF9C, 0x13B1, 0x4F3A, 0x903A, 0x0003, 0x34A6, 0x4B0F, +0x4F0B, 0x533B, 0x931F, 0x38A1, 0x430C, 0x430F, 0x4308, 0x3C0A, 0xD392, +0x0700, 0x13B1, 0x2A16, 0xC392, 0x0700, 0x403C, 0x0014, 0x13B1, 0x4E9C, +0x480F, 0x4F08, 0x5318, 0x903F, 0x002B, 0x3BF0, 0x13B1, 0x456A, 0x403F, +0xFFF6, 0x1840, 0x521F, 0x2E14, 0x9F0C, 0x2C38, 0x1840, 0x421F, 0x2E14, +0x8C0F, 0x903F, 0x01F5, 0x3806, 0x421E, 0x0784, 0x503E, 0xFF9C, 0x930E, +0x23C8, 0x903F, 0x0065, 0x380D, 0x421E, 0x0784, 0x503E, 0xFFE2, 0x930E, +0x2407, 0x421C, 0x0784, 0x503C, 0xFFE2, 0x13B1, 0x4F3A, 0x3FBE, 0x903F, +0x0015, 0x380D, 0x421F, 0x0784, 0x503F, 0xFFFB, 0x930F, 0x2407, 0x421C, +0x0784, 0x503C, 0xFFFB, 0x13B1, 0x4F3A, 0x3FAE, 0x421F, 0x0784, 0x533F, +0x930F, 0x27A9, 0x421C, 0x0784, 0x533C, 0x13B1, 0x4F3A, 0x3FA3, 0x403F, +0x000A, 0x1840, 0x521F, 0x2E14, 0x9C0F, 0x2C43, 0x4C0F, 0x1840, 0x821F, +0x2E14, 0x903F, 0x01F5, 0x380E, 0x421E, 0x0784, 0x503E, 0x0064, 0x903E, +0x0D01, 0x2C07, 0x421C, 0x0784, 0x503C, 0x0064, 0x13B1, 0x4F3A, 0x3F87, +0x903F, 0x0065, 0x380E, 0x421E, 0x0784, 0x503E, 0x001E, 0x903E, 0x0D01, +0x2C07, 0x421C, 0x0784, 0x503C, 0x001E, 0x13B1, 0x4F3A, 0x3F76, 0x903F, +0x0015, 0x380E, 0x421F, 0x0784, 0x503F, 0x0005, 0x903F, 0x0D01, 0x2C07, +0x421C, 0x0784, 0x503C, 0x0005, 0x13B1, 0x4F3A, 0x3F65, 0x421F, 0x0784, +0x531F, 0x903F, 0x0D01, 0x2F5F, 0x421C, 0x0784, 0x531C, 0x13B1, 0x4F3A, +0x3F59, 0x531A, 0x3F57, 0x42B2, 0x070C, 0x903A, 0x0003, 0x3802, 0x431C, +0x3C01, 0x430C, 0x1638, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x13B1, 0x4024, +0x4A0F, 0xDB0F, 0x930F, 0x245D, 0x008F, 0x2F74, 0x0FCE, 0x00AE, 0x0001, +0x0FCD, 0x00AD, 0x0008, 0x0D0C, 0xDFDC, 0x0002, 0x0000, 0x4303, 0x0D0C, +0xCFEC, 0x0000, 0x4303, 0x0D0C, 0xDEEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, +0x0000, 0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, 0x0D0C, 0xCEEC, 0x0000, +0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, +0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, 0x0D0C, +0xDEEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, 0xCFEC, +0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, 0xCEEC, 0x0000, +0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0D0C, 0xCFDC, 0x0002, 0x0000, +0x4303, 0x533A, 0x633B, 0x4A0C, 0xDB0C, 0x930C, 0x23AB, 0x13B1, 0x48D6, +0x161A, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x13B1, 0x4024, 0x4A0F, 0xDB0F, +0x930F, 0x245D, 0x008F, 0x2F74, 0x0FCE, 0x00AE, 0x0001, 0x0FCD, 0x00AD, +0x0008, 0x0D0C, 0xDFDC, 0x0002, 0x0000, 0x4303, 0x0D0C, 0xCFDC, 0x0002, +0x0000, 0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, 0x0D0C, 0xDEEC, 0x0000, +0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, +0x0D0C, 0xCEEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, +0xCFEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, 0x0D0C, 0xCFEC, +0x0000, 0x4303, 0x0D0C, 0xDEEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, +0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, 0x0D0C, 0xDFEC, 0x0000, 0x4303, +0x0D0C, 0xCEEC, 0x0000, 0x4303, 0x0D0C, 0xCFEC, 0x0000, 0x4303, 0x0D0C, +0xDFEC, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x533A, +0x633B, 0x4A0C, 0xDB0C, 0x930C, 0x23AB, 0x3F95, 0x4303, 0xE03F, 0x8000, +0x1800, 0x1246, 0x4D06, 0x5606, 0x9036, 0xFF01, 0x2CAD, 0x4F06, 0x5606, +0x9036, 0xFF01, 0x2C0E, 0x4D06, 0x5606, 0x9036, 0xFF00, 0x200B, 0x4F06, +0x5606, 0x9036, 0xFF00, 0x209E, 0x4D06, 0xEF06, 0x5606, 0x289A, 0x433D, +0x3C98, 0x4F06, 0x5606, 0x9036, 0xFF00, 0x2407, 0xB03F, 0x7FFF, 0x2007, +0x4D06, 0x5606, 0x208D, 0x288C, 0x4E0C, 0x4F0D, 0x3C89, 0xB03D, 0x7FFF, +0x27FA, 0x1800, 0x1249, 0x1800, 0x1248, 0x1800, 0x1247, 0x4D06, 0x4F07, +0x5606, 0x5707, 0x9607, 0x2809, 0x2002, 0x9C0E, 0x2806, 0xED0F, 0xEF0D, +0xED0F, 0xEC0E, 0xEE0C, 0xEC0E, 0x4F06, 0x5606, 0x6909, 0x1086, 0xD07F, +0x0080, 0x4D08, 0x5808, 0x6909, 0x1088, 0xF378, 0xD07D, 0x0080, 0x4307, +0x8846, 0x2415, 0x9076, 0xFFF1, 0x2C0D, 0x9076, 0xFFE8, 0x2846, 0x4E07, +0x4F0E, 0x430F, 0x5076, 0x0010, 0x2409, 0x9347, 0x2402, 0xD037, 0x0100, +0x110F, 0x100E, 0x1007, 0x5356, 0x23FB, 0x4906, 0x1106, 0xE906, 0xB316, +0x242F, 0xE337, 0x5317, 0x7E0C, 0x7F4D, 0x2010, 0x930C, 0x2007, 0x9307, +0x2438, 0x1087, 0x474D, 0x8038, 0x0018, 0x3C06, 0x108C, 0x4C4D, 0xED0C, +0x1087, 0xD70C, 0x8238, 0x4307, 0x5707, 0x6C0C, 0x6D4D, 0x2C09, 0x8318, +0x5707, 0x6C0C, 0x6D4D, 0x2C04, 0x8318, 0x5C0C, 0x6D4D, 0x2BFC, 0x9318, +0x3411, 0x430D, 0x3C05, 0x5358, 0x9378, 0x200C, 0x403D, 0xFF00, 0x430C, +0x1009, 0x100D, 0x3C12, 0x5E0C, 0x6F4D, 0x2FF4, 0x5707, 0x6C0C, 0x6D4D, +0x1088, 0xD80D, 0x1009, 0x100D, 0x100C, 0x2806, 0x9307, 0x2002, 0xB31C, +0x2402, 0x531C, 0x630D, 0x1800, 0x4177, 0x1800, 0x4178, 0x1800, 0x4179, +0x1800, 0x4176, 0x0110, 0x140A, 0x8031, 0x0006, 0x4381, 0x0002, 0x4381, +0x0004, 0x4381, 0x0000, 0x13B1, 0x4CD4, 0x4C81, 0x0002, 0x13B1, 0x456A, +0x4C81, 0x0004, 0x008A, 0x2F08, 0x938A, 0x0000, 0x2408, 0xD3D2, 0x0263, +0x403C, 0x01F4, 0x13B1, 0x4D82, 0x438A, 0x0000, 0x13B1, 0x4F0A, 0x903C, +0x0119, 0x280A, 0xC3D2, 0x0263, 0x439A, 0x0000, 0x403C, 0x03E8, 0x13B1, +0x4D82, 0x431C, 0x3C88, 0x90B1, 0x0640, 0x0002, 0x2804, 0x90B1, 0x0ED9, +0x0002, 0x2808, 0x1840, 0x9382, 0x2E16, 0x2404, 0x1840, 0x4382, 0x2E16, +0x3C77, 0x90B1, 0x0641, 0x0002, 0x2813, 0x90B1, 0x0ED8, 0x0002, 0x2C0F, +0x430C, 0x13B1, 0x4F46, 0x411F, 0x0002, 0x1840, 0x4F82, 0x2E14, 0x1840, +0x4392, 0x2E16, 0x1840, 0x4392, 0x2E18, 0x3C08, 0x1840, 0x9382, 0x2E18, +0x245C, 0x1840, 0x9382, 0x2E16, 0x2458, 0x1840, 0x421E, 0x2E14, 0x4E0F, +0x503F, 0xFFF6, 0x9F81, 0x0004, 0x2C23, 0x811E, 0x0004, 0x4E81, 0x0000, +0x9382, 0x0784, 0x2448, 0x403F, 0x0784, 0x90B1, 0x01F5, 0x0000, 0x3804, +0x4F2C, 0x503C, 0xFF9C, 0x3C3C, 0x90B1, 0x0065, 0x0000, 0x3804, 0x4F2C, +0x503C, 0xFFF6, 0x3C34, 0x90B1, 0x0015, 0x0000, 0x4F2C, 0x3803, 0x503C, +0xFFFB, 0x3C2C, 0x533C, 0x3C2A, 0x4E0F, 0x503F, 0x000A, 0x911F, 0x0004, +0x2C26, 0x411F, 0x0004, 0x8E0F, 0x4F81, 0x0000, 0x90B2, 0x0D01, 0x0784, +0x2C1D, 0x403F, 0x0784, 0x90B1, 0x01F5, 0x0000, 0x3804, 0x4F2C, 0x503C, +0x0064, 0x3C11, 0x90B1, 0x0065, 0x0000, 0x3804, 0x4F2C, 0x503C, 0x000A, +0x3C09, 0x90B1, 0x0015, 0x0000, 0x4F2C, 0x3803, 0x503C, 0x0005, 0x3C01, +0x531C, 0x13B1, 0x4F3A, 0x430C, 0x5031, 0x0006, 0x160A, 0x0110, 0x1800, +0x1246, 0x4D06, 0x5606, 0x9036, 0xFF01, 0x2C96, 0x4F06, 0x5606, 0x9036, +0xFF01, 0x2C0A, 0x4F06, 0xF036, 0x8000, 0xE60D, 0xB03D, 0x7FFF, 0x2005, +0xB03F, 0x7FFF, 0x2087, 0x433D, 0x3C85, 0xB03F, 0x7FFF, 0x2006, 0x430C, +0xF03D, 0x8000, 0xD03D, 0x7F80, 0x3C7C, 0x4F06, 0x5606, 0x9036, 0xFF00, +0x2009, 0x4D06, 0x5606, 0x9036, 0xFF00, 0x27EB, 0xC03D, 0x7FFF, 0x430C, +0x3C6E, 0x4D06, 0x5606, 0x9036, 0xFF00, 0x2469, 0x1800, 0x124A, 0x1800, +0x124B, 0x1800, 0x1248, 0x4D0B, 0x4C0A, 0x5F0F, 0x5D0D, 0x4F08, 0x100F, +0x108D, 0x1088, 0xF37D, 0xF378, 0x8038, 0x007F, 0x880D, 0x3026, 0x4D08, +0xD03F, 0x0080, 0xD07B, 0x0080, 0x431C, 0x430D, 0x8E0A, 0x7F4B, 0x2C2C, +0x8318, 0x301A, 0x5A0A, 0x6B4B, 0x5E0A, 0x6F4B, 0x5A0A, 0x6B4B, 0x2825, +0x8E0A, 0x7F4B, 0xD312, 0x6C0C, 0x6D4D, 0x2BF7, 0x9038, 0x00FF, 0x3803, +0x403D, 0xFF00, 0x3C08, 0x9308, 0x2027, 0xD31C, 0x933C, 0x2002, 0x937D, +0x2422, 0x430D, 0x430C, 0x6F0F, 0x100D, 0x3C24, 0x6C0C, 0x6D4D, 0x2808, +0x930A, 0x23E9, 0x934B, 0x23E7, 0xB32C, 0x23E5, 0xC31C, 0x3FE3, 0x5A0A, +0x6B4B, 0x3004, 0x6C0C, 0x6D4D, 0x2BFA, 0x3FDC, 0x8E0A, 0x7F4B, 0x2FEB, +0x6C0C, 0x6D4D, 0x2FD6, 0x5A0A, 0x6B4B, 0x5E0A, 0x6F4B, 0x3FCD, 0x1088, +0xD80D, 0x6F0F, 0x100D, 0x100C, 0x630C, 0x630D, 0x1800, 0x4178, 0x1800, +0x417B, 0x1800, 0x417A, 0x1800, 0x4176, 0x0110, 0x1800, 0x1246, 0x4D06, +0x5606, 0x9036, 0xFF01, 0x2C93, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0E, +0x4F06, 0xF036, 0x8000, 0xE60D, 0x4D06, 0x5606, 0x9036, 0xFF00, 0x2008, +0x4F06, 0x5606, 0x2082, 0x433D, 0x3C80, 0x4F0D, 0x4E0C, 0x3C7D, 0x4F06, +0x5606, 0x9036, 0xFF00, 0x4036, 0x7FFF, 0x2007, 0xB60D, 0x27F2, 0xC60D, +0xD03D, 0x7F80, 0x430C, 0x3C6F, 0xB60D, 0x246D, 0xB60F, 0x2002, 0xC60D, +0x3FF8, 0x1800, 0x1248, 0x4D08, 0x5808, 0x1088, 0xF378, 0x4F06, 0x5606, +0x1086, 0xF376, 0x5608, 0x4D06, 0x8038, 0x007E, 0x303C, 0x1202, 0xC232, +0xD03D, 0x0080, 0xD03F, 0x0080, 0x4E82, 0x04C0, 0x4C82, 0x04C8, 0x4E82, +0x04C4, 0x421E, 0x04CA, 0x4292, 0x04CC, 0x04CA, 0x4382, 0x04CC, 0x4DC2, +0x04C8, 0x4C82, 0x04C4, 0x4FC2, 0x04C8, 0x4FC2, 0x04C4, 0x421F, 0x04CA, +0x4292, 0x04CC, 0x04CA, 0x4DC2, 0x04C8, 0x421C, 0x04CA, 0x4132, 0x5E0E, +0x6F0F, 0x6C0C, 0x2C04, 0x5E0E, 0x6F0F, 0x6C0C, 0x8318, 0x9038, 0x00FF, +0x340E, 0x9308, 0x2012, 0x933C, 0x2008, 0xF03F, 0xFE00, 0x903F, 0xFE00, +0x2003, 0x403D, 0x0100, 0x3C04, 0x430D, 0x3C02, 0x403D, 0xFF00, 0x5606, +0x100D, 0x430C, 0x3C14, 0x33F7, 0x484D, 0xEC4D, 0xEC0D, 0x108D, 0xEF4C, +0xEF0C, 0x108C, 0x5606, 0x100D, 0x100C, 0x2808, 0x934F, 0x2004, 0x930E, +0x2002, 0xB31C, 0x2402, 0x531C, 0x630D, 0x1800, 0x4178, 0x1800, 0x4176, +0x0110, 0x145B, 0x4C0A, 0x13B1, 0x4024, 0x008B, 0x2EE2, 0x0BC8, 0x00A8, +0x000D, 0x0BC9, 0x00A9, 0x000C, 0x0BC6, 0x00A6, 0x0008, 0x1840, 0x9392, +0x2F02, 0x200D, 0x060F, 0xD9EF, 0x0000, 0x060F, 0xC8EF, 0x0000, 0x0B3F, +0x000E, 0x486E, 0x596E, 0xDECF, 0x0000, 0x3C18, 0x4B5F, 0x0001, 0x5B6F, +0x5B5F, 0x0002, 0x0607, 0x4F4E, 0x596E, 0xDEC7, 0x0000, 0x0607, 0xC8E7, +0x0000, 0x0B37, 0x000E, 0xDFC7, 0x0000, 0x486E, 0x596E, 0xDEC7, 0x0000, +0xCBD7, 0x0003, 0x0000, 0x060F, 0xC9EF, 0x0000, 0x4037, 0x0005, 0x470C, +0x13B1, 0x4D82, 0x060F, 0xC8EF, 0x0000, 0x470C, 0x13B1, 0x4D82, 0x403C, +0x0064, 0x13B1, 0x4D82, 0x060F, 0xD8EF, 0x0000, 0x470C, 0x13B1, 0x4D82, +0x403C, 0x0064, 0x13B1, 0x4D82, 0x060F, 0xC8EF, 0x0000, 0x930A, 0x200B, +0x060F, 0xCBEF, 0x0000, 0x470C, 0x13B1, 0x4E9C, 0x060F, 0xDBEF, 0x0000, +0x470C, 0x3C02, 0x403C, 0x000A, 0x13B1, 0x4E9C, 0x060F, 0xD8EF, 0x0000, +0x470C, 0x13B1, 0x4D82, 0x403C, 0x0032, 0x13B1, 0x4D82, 0x930A, 0x2006, +0x060F, 0xCBEF, 0x0000, 0x470C, 0x13B1, 0x4D82, 0x060F, 0xD9EF, 0x0000, +0x470C, 0x13B1, 0x4D82, 0x403C, 0x0032, 0x13B1, 0x4D82, 0x930A, 0x2006, +0x060F, 0xDBEF, 0x0000, 0x470C, 0x13B1, 0x4D82, 0x060F, 0xC8EF, 0x0000, +0x470C, 0x13B1, 0x4D82, 0x403C, 0x0032, 0x13B1, 0x4D82, 0x930A, 0x2402, +0x13B1, 0x48D6, 0x1656, 0x0110, 0x145B, 0x13B1, 0x4024, 0x008A, 0x2EE2, +0x0ACB, 0x00AB, 0x000D, 0x0AC8, 0x00A8, 0x000C, 0x0AC9, 0x00A9, 0x0008, +0x1840, 0x9392, 0x2F02, 0x200D, 0x090F, 0xD8EF, 0x0000, 0x090F, 0xCBEF, +0x0000, 0x0A3F, 0x000E, 0x4B6E, 0x586E, 0xDECF, 0x0000, 0x3C18, 0x4A5F, +0x0001, 0x5A6F, 0x5A5F, 0x0002, 0x090D, 0x4F4E, 0x586E, 0xDECD, 0x0000, +0x090E, 0xCBEE, 0x0000, 0x0A3E, 0x000E, 0xDFCE, 0x0000, 0x4B6F, 0x586F, +0xDFCE, 0x0000, 0xCADE, 0x0003, 0x0000, 0x090F, 0xC8EF, 0x0000, 0x4036, +0x0005, 0x460C, 0x13B1, 0x4D82, 0x090F, 0xCBEF, 0x0000, 0x460C, 0x13B1, +0x4D82, 0x403C, 0x0064, 0x13B1, 0x4D82, 0x090F, 0xDBEF, 0x0000, 0x460C, +0x13B1, 0x4D82, 0x403C, 0x0064, 0x13B1, 0x4D82, 0x090F, 0xCBEF, 0x0000, +0x090F, 0xCAEF, 0x0000, 0x460C, 0x13B1, 0x4E9C, 0x090F, 0xDAEF, 0x0000, +0x460C, 0x13B1, 0x4E9C, 0x090F, 0xDBEF, 0x0000, 0x460C, 0x13B1, 0x4D82, +0x403C, 0x0032, 0x13B1, 0x4D82, 0x090F, 0xCAEF, 0x0000, 0x460C, 0x13B1, +0x4D82, 0x090F, 0xD8EF, 0x0000, 0x460C, 0x13B1, 0x4D82, 0x403C, 0x0032, +0x13B1, 0x4D82, 0x090F, 0xDAEF, 0x0000, 0x460C, 0x13B1, 0x4D82, 0x090F, +0xCBEF, 0x0000, 0x460C, 0x13B1, 0x4D82, 0x403C, 0x0032, 0x13B1, 0x4D82, +0x13B1, 0x48D6, 0x1656, 0x0110, 0x141B, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x008E, 0x2F60, 0x1840, 0x425F, 0x30EF, 0xBE5F, 0x000C, 0x2403, +0x13B1, 0x4A70, 0x3C02, 0x13B1, 0x4BD2, 0x0ECD, 0x00AD, 0x000D, 0x0ECA, +0x00AA, 0x000E, 0x0ECB, 0x00AB, 0x0008, 0x00AE, 0x000C, 0x934C, 0x0B0F, +0x242B, 0xDEEF, 0x0000, 0x13B1, 0x4C56, 0xC0F2, 0x0020, 0x0282, 0xC232, +0x4303, 0x0A0F, 0xCEEF, 0x0000, 0x0B0F, 0xCDEF, 0x0000, 0x4303, 0x4303, +0x4303, 0x0B0F, 0xDDEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0A0F, 0xDEEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, +0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x4E6E, 0x3C2B, 0xCEEF, +0x0000, 0x13B1, 0x4BA6, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x0A0F, +0xCEEF, 0x0000, 0x0B0F, 0xCDEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x0B0F, +0xDDEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0A0F, +0xDEEF, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, +0x3C03, 0xC0F2, 0x0020, 0x0282, 0x4E6E, 0xE37E, 0x1840, 0x4EC2, 0x30EF, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x161A, 0x0110, 0x93C2, 0x0204, 0x43F2, 0x0204, 0x93C2, +0x020A, 0x43C2, 0x020A, 0xD0F2, 0x00FC, 0x0205, 0xF0F2, 0x0003, 0x020B, +0x93C2, 0x0224, 0x43F2, 0x0224, 0x93C2, 0x022A, 0x43C2, 0x022A, 0x93C2, +0x0225, 0x43F2, 0x0225, 0x93C2, 0x022B, 0x43C2, 0x022B, 0xD0F2, 0x0036, +0x0244, 0xC0F2, 0x0040, 0x0244, 0xD0F2, 0x0020, 0x0242, 0xF0F2, 0x00EB, +0x0242, 0xD3E2, 0x0263, 0xD3E2, 0x0265, 0xD0F2, 0x0017, 0x0282, 0xC2F2, +0x0282, 0xD0F2, 0x0097, 0x0284, 0xC2F2, 0x0284, 0xD2F2, 0x0286, 0xC0F2, +0x0020, 0x0282, 0xC232, 0x4303, 0x40B2, 0x2D52, 0x01C0, 0x43A2, 0x01C2, +0x40F2, 0x0011, 0x01D7, 0x4382, 0x01C0, 0xD232, 0x9382, 0x4A00, 0x2404, +0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0xD3E2, 0x0242, +0x3C00, 0x403F, 0x001F, 0x533F, 0x2FFE, 0xC3E2, 0x0242, 0x008F, 0x2F4A, +0x438F, 0x0000, 0x40FF, 0x003C, 0x0001, 0x4FA2, 0x0202, 0x3C00, 0x403F, +0x001F, 0x533F, 0x2FFE, 0xD0F2, 0x0080, 0x020B, 0x3C00, 0x403F, 0x0D03, +0x533F, 0x2FFE, 0xD3E2, 0x0242, 0x1840, 0x43C2, 0x2F9C, 0x1840, 0x43D2, +0x2F9D, 0x1840, 0x4382, 0x2F5E, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x13B1, +0x44DA, 0x4A0F, 0xDB0F, 0x930F, 0x2441, 0x13B1, 0x106A, 0x13B1, 0x4594, +0x903C, 0x189C, 0x2FFB, 0x008B, 0x2EF4, 0x1840, 0x93C2, 0x2F9A, 0x240B, +0x0B3F, 0x0004, 0xCBDF, 0x0002, 0x0000, 0xCBEF, 0x0000, 0xDBDF, 0x0001, +0x0000, 0x3C24, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x425E, 0x0223, +0xF07E, 0x0020, 0x1840, 0x4EC2, 0x2F9B, 0x0B3F, 0x0004, 0xCBDF, 0x0001, +0x0000, 0xDBDF, 0x0002, 0x0000, 0xC0F2, 0x0020, 0x0223, 0xDBEF, 0x0000, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x403C, 0x0003, 0x13B1, 0x4D82, 0x3C2C, 0xC0F2, 0x0020, +0x0282, 0xC232, 0x4303, 0x008B, 0x2EF4, 0x0B3F, 0x0004, 0xCBDF, 0x0001, +0x0000, 0x0B3F, 0x0004, 0xCBEF, 0x0000, 0x1840, 0x93C2, 0x2F9A, 0x2008, +0x403C, 0x0003, 0x13B1, 0x4E9C, 0x1840, 0xD2D2, 0x2F9B, 0x0223, 0x0B3F, +0x0004, 0xDBDF, 0x0002, 0x0000, 0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, +0x0020, 0x0282, 0x3C03, 0xC0F2, 0x0020, 0x0282, 0x13B1, 0x451A, 0x42B2, +0x070C, 0x161A, 0x0110, 0x13B1, 0x4024, 0x008F, 0x2F74, 0x0FCE, 0x00AE, +0x0008, 0x0E0D, 0xDFDD, 0x0002, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0D, +0xDFDD, 0x0001, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0D, 0xDFED, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0D, 0xCFED, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0D, 0xDFED, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0D, 0xCFED, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0D, 0xDFED, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0D, 0xCFED, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0D, 0xDFED, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0D, 0xCFED, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0D, 0xDFED, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0D, 0xCFED, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0D, 0xDFED, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E0D, 0xCFED, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0D, 0xDFED, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E0D, 0xCFDD, 0x0001, 0x0000, 0x4303, 0x4303, +0x4303, 0x0E0D, 0xCFED, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E0E, 0xDFEE, +0x0000, 0x4303, 0x4303, 0x4303, 0x13B1, 0x48D6, 0x430C, 0x0110, 0x1840, +0x9392, 0x2F02, 0x2003, 0x403E, 0x0005, 0x3C07, 0x1840, 0x92B2, 0x2F02, +0x2002, 0x13B1, 0x48D6, 0x422E, 0x435D, 0x434C, 0x13B1, 0x243C, 0x430E, +0x407D, 0x000D, 0x434C, 0x13B1, 0x243C, 0x1840, 0x43C2, 0x2F9C, 0x008F, +0x2E8E, 0x1880, 0x40FF, 0x4F84, 0x0000, 0x1880, 0x40FF, 0x4F60, 0x0004, +0x1880, 0x40FF, 0x4F64, 0x0008, 0x1880, 0x40FF, 0x4F80, 0x0010, 0x1880, +0x40FF, 0x4F78, 0x0014, 0x1880, 0x40FF, 0x4F06, 0x0018, 0x1880, 0x40FF, +0x4F00, 0x001C, 0x1880, 0x40FF, 0x4E1C, 0x0024, 0x1880, 0x40FF, 0x4E12, +0x0028, 0x1880, 0x40FF, 0x4F8A, 0x0030, 0x1880, 0x40FF, 0x4F54, 0x003C, +0x1880, 0x40FF, 0x4F88, 0x0034, 0x1880, 0x40FF, 0x4F58, 0x0038, 0x1880, +0x40FF, 0x4E0E, 0x002C, 0x1880, 0x40FF, 0x4F7C, 0x000C, 0x1880, 0x40FF, +0x4F4C, 0x0040, 0x1880, 0x40FF, 0x4F50, 0x0044, 0x1880, 0x40FF, 0x4F5C, +0x0048, 0x1880, 0x40FF, 0x4F40, 0x004C, 0x1880, 0x40FF, 0x4E0A, 0x0020, +0x1880, 0x40FF, 0x4F6C, 0x0050, 0x1840, 0x4392, 0x2E1A, 0x0110, 0x140A, +0x831C, 0x245B, 0x831C, 0x2455, 0x832C, 0x244F, 0x822C, 0x2448, 0x823C, +0x2441, 0x803C, 0x0010, 0x2434, 0x803C, 0x0020, 0x242C, 0x803C, 0x0040, +0x2433, 0x803C, 0x0F8A, 0x240D, 0x803C, 0x1000, 0x240F, 0x803C, 0x2000, +0x2411, 0x803C, 0x2000, 0x2413, 0x803C, 0x2000, 0x2415, 0x3C3F, 0x403E, +0x012A, 0x403A, 0x004B, 0x3C3E, 0x403E, 0x015E, 0x403A, 0x004B, 0x3C39, +0x403E, 0x0089, 0x403A, 0x001E, 0x3C34, 0x403E, 0x0058, 0x403A, 0x0015, +0x3C2F, 0x403E, 0x0030, 0x403A, 0x000C, 0x3C2A, 0x403E, 0x00EE, 0x403A, +0x00EE, 0x3C25, 0x403E, 0x0076, 0x403A, 0x001C, 0x3C20, 0x403E, 0x0058, +0x403A, 0x0015, 0x3C1B, 0x403E, 0x003A, 0x403A, 0x000E, 0x3C16, 0x403E, +0x001C, 0x403A, 0x0007, 0x3C11, 0x403E, 0x000D, 0x422A, 0x3C0D, 0x403E, +0x0005, 0x432A, 0x3C09, 0x403E, 0x0003, 0x403A, 0x0003, 0x3C04, 0x403E, +0x0076, 0x403A, 0x0076, 0x407D, 0x0006, 0x434C, 0x13B1, 0x243C, 0x4A0E, +0x407D, 0x000A, 0x434C, 0x13B1, 0x243C, 0x160A, 0x0110, 0x008F, 0x2E1E, +0x1880, 0x40FF, 0x4198, 0x0000, 0x1880, 0x40FF, 0x4250, 0x0004, 0x1880, +0x40FF, 0x45F4, 0x0008, 0x1880, 0x40FF, 0x42FC, 0x000C, 0x1880, 0x40FF, +0x10F8, 0x0010, 0x1880, 0x40FF, 0x4666, 0x0014, 0x1880, 0x40FF, 0x40E0, +0x0018, 0x1880, 0x40FF, 0x4EB8, 0x001C, 0x1880, 0x40FF, 0x4E9C, 0x0020, +0x1880, 0x40FF, 0x4D82, 0x0024, 0x1800, 0x43CF, 0x0028, 0x1880, 0x40FF, +0x24D8, 0x002C, 0x1880, 0x40FF, 0x1004, 0x0030, 0x1880, 0x40FF, 0x0FDE, +0x0034, 0x1880, 0x40FF, 0x0FAC, 0x0048, 0x1880, 0x40FF, 0x0F64, 0x004C, +0x1880, 0x40FF, 0x0F86, 0x0050, 0x1880, 0x40FF, 0x4E20, 0x0038, 0x1880, +0x40FF, 0x4F12, 0x003C, 0x1880, 0x40FF, 0x4DF2, 0x0040, 0x1880, 0x40FF, +0x371E, 0x0044, 0x1880, 0x40FF, 0x3856, 0x0068, 0x1800, 0x40FF, 0xFDFE, +0x006C, 0x1880, 0x40FF, 0x3332, 0x0054, 0x1880, 0x40FF, 0x4920, 0x0058, +0x1880, 0x40FF, 0x223C, 0x005C, 0x1880, 0x40FF, 0x4F70, 0x0060, 0x1880, +0x40FF, 0x4ED4, 0x0064, 0x0110, 0x143B, 0x40F2, 0x003F, 0x0225, 0x008F, +0x2F4C, 0x0FCE, 0x00AE, 0x000D, 0x0FCD, 0x00AD, 0x0008, 0x1840, 0x93C2, +0x2F9C, 0x0D0B, 0x2403, 0xDEEB, 0x0000, 0x3C02, 0xCEEB, 0x0000, 0x0FCC, +0x00AC, 0x000C, 0x1840, 0x93C2, 0x2F9D, 0x0D0B, 0x2403, 0xDCEB, 0x0000, +0x3C02, 0xCCEB, 0x0000, 0x008A, 0x2F02, 0x939A, 0x0000, 0x2404, 0x90BA, +0x0006, 0x0000, 0x2008, 0x4E6B, 0x5C6B, 0x0F38, 0x000E, 0x4BC8, 0x0000, +0x4BC2, 0x0223, 0x4A2B, 0x932B, 0x2407, 0x930B, 0x2405, 0x903B, 0x0007, +0x2402, 0x923B, 0x2013, 0x0D0B, 0x4F5D, 0x0002, 0x5F6D, 0xDDCB, 0x0000, +0x4E6B, 0x5C6B, 0x5F5B, 0x0002, 0x5F5B, 0x0001, 0x5F6B, 0x0F3F, 0x000E, +0x4BCF, 0x0000, 0x4BC2, 0x0223, 0x435D, 0x407C, 0x000A, 0x13B1, 0x21E0, +0xC3E2, 0x0263, 0x403C, 0x000A, 0x13B1, 0x4D82, 0x1638, 0x0110, 0x140A, +0x4C4A, 0x1840, 0x421F, 0x2F02, 0x903F, 0x0006, 0x2004, 0x13B1, 0x164A, +0x432E, 0x3C05, 0x931F, 0x2011, 0x13B1, 0x164A, 0x431E, 0x435D, 0x434C, +0x13B1, 0x243C, 0x430E, 0x407D, 0x000D, 0x434C, 0x13B1, 0x243C, 0x1840, +0x421C, 0x2F04, 0x3C20, 0x932F, 0x2402, 0x930F, 0x2009, 0x13B1, 0x164A, +0x430E, 0x435D, 0x434C, 0x13B1, 0x243C, 0x430E, 0x3C0B, 0x903F, 0x0007, +0x2013, 0x13B1, 0x164A, 0x430E, 0x435D, 0x434C, 0x13B1, 0x243C, 0x431E, +0x407D, 0x000D, 0x434C, 0x13B1, 0x243C, 0x1840, 0x421C, 0x2F06, 0x13B1, +0x3E58, 0x3C17, 0x903F, 0x0005, 0x2010, 0x422E, 0x435D, 0x434C, 0x13B1, +0x243C, 0x430E, 0x407D, 0x000D, 0x434C, 0x13B1, 0x243C, 0x1840, 0x4392, +0x2F02, 0x4A4C, 0x3C02, 0x923F, 0x2002, 0x13B1, 0x164A, 0x430C, 0x160A, +0x0110, 0x4382, 0x0340, 0x40B2, 0x02C0, 0x0340, 0x4392, 0x0360, 0xD0B2, +0x0026, 0x0340, 0x4382, 0x0400, 0x40B2, 0x02C0, 0x0400, 0x40B2, 0x08A0, +0x0412, 0xC0B2, 0x0010, 0x0402, 0x4382, 0x03C0, 0x40B2, 0x0022, 0x03C0, +0x13B1, 0x4CAC, 0x13B1, 0x4C2A, 0x13B1, 0x451A, 0x4382, 0x0504, 0x4382, +0x0502, 0x1840, 0x4382, 0x2E16, 0x1840, 0x4382, 0x2E18, 0x1840, 0x4382, +0x2F08, 0x1840, 0x4382, 0x2E12, 0x13B1, 0x3A84, 0x1840, 0x43A2, 0x2F02, +0x1840, 0x4382, 0x2E12, 0x432C, 0x13B1, 0x10F8, 0x1840, 0x4392, 0x2E1A, +0x008C, 0x2EF4, 0x018E, 0x4FC2, 0x008D, 0x0007, 0x13B1, 0x4E36, 0x403E, +0x0023, 0x407D, 0x0006, 0x434C, 0x13B1, 0x243C, 0x403E, 0x0023, 0x407D, +0x000A, 0x434C, 0x13B1, 0x243C, 0x430E, 0x407D, 0x0007, 0x434C, 0x13B1, +0x243C, 0x430C, 0x0110, 0x140A, 0x4C0A, 0x4382, 0x070C, 0x4A0F, 0x803F, +0x0640, 0x903F, 0x0899, 0x2812, 0x431C, 0x13B1, 0x4D82, 0x13B1, 0x3D6E, +0x1840, 0x4382, 0x2E14, 0x1840, 0x4382, 0x2E16, 0x1840, 0x4382, 0x2E18, +0x42B2, 0x070C, 0x430C, 0x3C38, 0x1840, 0x9A82, 0x2F0E, 0x2012, 0x1840, +0x9392, 0x2F10, 0x200E, 0x1840, 0x421C, 0x2F0C, 0x13B1, 0x4F46, 0x1840, +0x421C, 0x2F0A, 0x13B1, 0x4F3A, 0x42B2, 0x070C, 0x430C, 0x3C22, 0x4A0C, +0x13B1, 0x2C68, 0x930C, 0x2405, 0x4A0C, 0x13B1, 0x2E4C, 0x930C, 0x2006, +0x4A0C, 0x13B1, 0x2C68, 0x4A0C, 0x13B1, 0x2E4C, 0x1840, 0x4292, 0x0784, +0x2F0A, 0x1840, 0x4292, 0x0794, 0x2F0C, 0x1840, 0x4A82, 0x2F0E, 0x1840, +0x4392, 0x2F10, 0x1840, 0x4382, 0x2E16, 0x430C, 0x160A, 0x0110, 0x145B, +0x0CC7, 0x0DC6, 0x13B1, 0x4CD4, 0x430D, 0x13B1, 0x43BC, 0x4C0A, 0x4D0B, +0x13B1, 0x45EC, 0x430D, 0x13B1, 0x43BC, 0x4C08, 0x4D09, 0x403E, 0x4000, +0x403F, 0x44CE, 0x4A0C, 0x4B0D, 0x13B1, 0x4EF6, 0x930C, 0x242C, 0x403E, +0x8000, 0x403F, 0x456D, 0x4A0C, 0x4B0D, 0x13B1, 0x4EEC, 0x930C, 0x2422, +0x4A0C, 0x4B0D, 0x13B1, 0x4EE0, 0x1840, 0x4C82, 0x2E14, 0x1840, 0x4392, +0x2E16, 0x1840, 0x4392, 0x2E18, 0x1840, 0x92B2, 0x2F02, 0x2402, 0x13B1, +0x4024, 0xD3D2, 0x0265, 0xD3D2, 0x0263, 0x403C, 0x000A, 0x13B1, 0x4D82, +0x1840, 0x92B2, 0x2F02, 0x2406, 0x13B1, 0x48D6, 0x3C03, 0x1840, 0x4382, +0x2E16, 0x4887, 0x0000, 0x4987, 0x0002, 0x4A86, 0x0000, 0x4B86, 0x0002, +0x430C, 0x1656, 0x0110, 0x930D, 0x3409, 0x1800, 0x1248, 0xE33C, 0xE33D, +0x531C, 0x630D, 0x4038, 0x0197, 0x3C04, 0x1800, 0x1248, 0x4038, 0x0097, +0x903D, 0x0100, 0x2C1D, 0x930D, 0x200F, 0x903C, 0x0100, 0x2806, 0x108C, +0x4C4D, 0xC03C, 0x00FF, 0x8238, 0x3C06, 0x930C, 0x240D, 0x4C0D, 0x430C, +0x8038, 0x0010, 0x8318, 0x5C0C, 0x6D4D, 0x2BFC, 0x1108, 0x104D, 0x100C, +0x1088, 0xD80D, 0x1800, 0x4178, 0x0110, 0x1800, 0x1247, 0x4347, 0x903D, +0x0200, 0x2808, 0xC312, 0x100D, 0x100C, 0x1047, 0x5318, 0x903D, 0x0200, +0x2FF8, 0x1108, 0x104D, 0x100C, 0x1088, 0xD80D, 0x6747, 0x2806, 0xC312, +0x1047, 0x2001, 0x2802, 0x531C, 0x630D, 0x1800, 0x4177, 0x1800, 0x4178, +0x0110, 0xC0F2, 0x0020, 0x0282, 0xC232, 0x4303, 0x934C, 0x200B, 0x407C, +0x00C8, 0x13B1, 0x4CFA, 0x403C, 0x7401, 0x13B1, 0x4D42, 0x434C, 0x13B1, +0x102A, 0x407C, 0x0044, 0x13B1, 0x4CFA, 0x431C, 0x13B1, 0x4D82, 0x1840, +0x43D2, 0x2F9D, 0x1840, 0x43D2, 0x2F9C, 0x13B1, 0x4024, 0x431C, 0x430D, +0x13B1, 0x3B82, 0x13B1, 0x48D6, 0x407C, 0x0024, 0x13B1, 0x4CFA, 0x431C, +0x13B1, 0x4D82, 0x430C, 0x430D, 0x13B1, 0x3B82, 0x435C, 0x13B1, 0x102A, +0x407C, 0x0054, 0x13B1, 0x4CFA, 0x403C, 0x0200, 0x430D, 0x13B1, 0x4B7A, +0xD232, 0x9382, 0x4A00, 0x2404, 0xD0F2, 0x0020, 0x0282, 0x3C03, 0xC0F2, +0x0020, 0x0282, 0x430C, 0x0110, 0x4382, 0x070C, 0x43C2, 0x0710, 0x43C2, +0x0711, 0x43C2, 0x0712, 0x43C2, 0x0713, 0xF0F2, 0x00AC, 0x0243, 0xD0F2, +0x0053, 0x024B, 0xC3A2, 0x0700, 0x40B2, 0x0270, 0x0700, 0x40B2, 0x0208, +0x0702, 0x4303, 0x403F, 0x01C0, 0x533F, 0x2FFE, 0xD3A2, 0x0700, 0x0110, +0x1840, 0x4382, 0x2F44, 0x1840, 0x4382, 0x2F46, 0x1840, 0x4382, 0x2F48, +0x1840, 0x4382, 0x2F22, 0xF0F2, 0x00A5, 0x0243, 0xD0F2, 0x005A, 0x024B, +0xC3A2, 0x0700, 0x40B2, 0x09F0, 0x0700, 0x40B2, 0x02FA, 0x0702, 0x40F2, +0x0011, 0x0710, 0x40F2, 0x0013, 0x0711, 0x40F2, 0x0014, 0x0712, 0x40F2, +0x0096, 0x0713, 0x3FD1, 0x4303, 0x008F, 0x2F24, 0x4F1C, 0x0002, 0x5F2C, +0x5F1C, 0x0004, 0x5F1C, 0x0006, 0x5F1C, 0x0008, 0x5F1C, 0x000A, 0x5F1C, +0x000C, 0x5F1C, 0x000E, 0x0B5C, 0x503C, 0xFFEC, 0x0110, 0xC3A2, 0x0700, +0x40F2, 0x0012, 0x0710, 0xD3A2, 0x0700, 0xD392, 0x0700, 0xB392, 0x070A, +0x2BFD, 0x421C, 0x0720, 0x430D, 0x13B1, 0x43BC, 0x430E, 0x403F, 0x4020, +0x13B1, 0x35E4, 0x430E, 0x403F, 0x3980, 0x13B1, 0x35E4, 0x430E, 0x403F, +0x43D2, 0x13B1, 0x35E4, 0x430E, 0x403F, 0x4316, 0x13B1, 0x34A4, 0x430E, +0x403F, 0x447A, 0x13B1, 0x35E4, 0x0180, 0x4EE0, 0x008F, 0x2F12, 0x3FBE, +0x4303, 0x140A, 0x930C, 0x2431, 0x13B1, 0x4024, 0x008A, 0x2EE2, 0x0A3F, +0x0008, 0xCADF, 0x000D, 0x0000, 0x403C, 0x0005, 0x13B1, 0x4D82, 0x0A3F, +0x0008, 0xCAEF, 0x0000, 0x0A3F, 0x000E, 0xDAEF, 0x0000, 0x4A5E, 0x0002, +0x5A5E, 0x0001, 0xE37E, 0x0A3F, 0x0008, 0xFECF, 0x0000, 0x0A3F, 0x000E, +0xFECF, 0x0000, 0xFEC2, 0x0223, 0xD0F2, 0x0081, 0x0265, 0xD0F2, 0x0081, +0x0263, 0x403C, 0x000A, 0x13B1, 0x4D82, 0x13B1, 0x48D6, 0x3C03, 0xF0F2, +0x007E, 0x0263, 0x160A, 0x0110, 0x008F, 0x2E12, 0x4C8F, 0x0000, 0x1840, +0x421E, 0x2F02, 0x931E, 0x2406, 0x903E, 0x0005, 0x2403, 0x903E, 0x0006, +0x2014, 0x008D, 0x2E8E, 0x931C, 0x2005, 0x1800, 0x40FD, 0xF384, 0x0034, +0x3C0B, 0x932C, 0x2005, 0x1800, 0x40FD, 0xF852, 0x0034, 0x3C04, 0x1800, +0x40FD, 0xF5F4, 0x0034, 0x932E, 0x2402, 0x930E, 0x200B, 0x931C, 0x2005, +0x1880, 0x40F2, 0x301C, 0x2EC2, 0x0110, 0x1880, 0x40F2, 0x30F0, 0x2EC2, +0x0110, 0x141B, 0x13B1, 0x4024, 0x008A, 0x2F75, 0x008B, 0x2F7C, 0x0B0F, +0xDAEF, 0x0000, 0x4303, 0x4303, 0x4303, 0x0B0F, 0xCAEF, 0x0000, 0x4303, +0x4303, 0x4303, 0x403C, 0x000F, 0x13B1, 0x4E9C, 0x0B0F, 0xDAEF, 0x0000, +0x4303, 0x4303, 0x4303, 0x0B0F, 0xCAEF, 0x0000, 0x4303, 0x4303, 0x4303, +0x403C, 0x000F, 0x13B1, 0x4E9C, 0x0B0F, 0xDAEF, 0x0000, 0x4303, 0x4303, +0x4303, 0x13B1, 0x48D6, 0x430C, 0x161A, 0x0110, 0x1800, 0x1246, 0x4D06, +0x5606, 0x9036, 0xFF01, 0x2C05, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2802, +0xC312, 0x3C1C, 0xB03D, 0x7FFF, 0x2415, 0x4F06, 0x5606, 0x2003, 0xFD0D, +0x33F6, 0x3C12, 0x2807, 0xFD0D, 0x340F, 0x9D0F, 0x200E, 0x9C0E, 0x200C, +0x3C0A, 0xFD0D, 0x33EB, 0x9F0D, 0x2007, 0x9E0C, 0x2005, 0x3C03, 0x4F06, +0x5606, 0x2001, 0xD312, 0x1800, 0x4176, 0x0110, 0x143B, 0x008F, 0x2F86, +0x930C, 0x241F, 0x0FCE, 0x00AE, 0x0008, 0x533C, 0x3C03, 0x533C, 0x930A, +0x2002, 0x4D7B, 0x423A, 0xB35B, 0x0E08, 0x2804, 0xDFD8, 0x0001, 0x0000, +0x3C03, 0xCFD8, 0x0001, 0x0000, 0x0E08, 0xCFE8, 0x0000, 0x4303, 0x0E08, +0xDFE8, 0x0000, 0x035B, 0x533A, 0x930C, 0x23E6, 0x0F3B, 0x0008, 0xDFDB, +0x0001, 0x0000, 0x1638, 0x0110, 0x1800, 0x1246, 0x4D06, 0x5606, 0x9036, +0xFF01, 0x2C20, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C1B, 0xB03F, 0x7FFF, +0x2415, 0x4D06, 0x5606, 0x2003, 0xFF0F, 0x3013, 0x3C13, 0x2807, 0xFF0F, +0x3410, 0x9F0D, 0x200E, 0x9E0C, 0x240B, 0x3C0B, 0xFF0F, 0x3008, 0x9D0F, +0x2007, 0x9C0E, 0x2404, 0x3C04, 0x4D06, 0x5606, 0x2001, 0xC312, 0x1800, +0x4176, 0x0110, 0x1800, 0x1246, 0x1800, 0x1247, 0x4D06, 0xD07D, 0x0080, +0x6606, 0x6707, 0x1086, 0xF376, 0x8076, 0x007F, 0x2C03, 0x430C, 0x430D, +0x3C13, 0x8076, 0x0018, 0x2C07, 0xE376, 0x240E, 0x110D, 0x100C, 0x8356, +0x23FC, 0x3C09, 0x9236, 0x3803, 0x433C, 0x433D, 0x3C04, 0x5C0C, 0x6D0D, +0x8356, 0x2FFC, 0x1007, 0x1800, 0x4177, 0x1800, 0x4176, 0x0110, 0x143B, +0x930C, 0x2421, 0x008F, 0x2F74, 0x0FCE, 0x00AE, 0x0008, 0x533C, 0x3C03, +0x533C, 0x930A, 0x2002, 0x4D7B, 0x423A, 0xB35B, 0x0E08, 0x2804, 0xDFD8, +0x0001, 0x0000, 0x3C03, 0xCFD8, 0x0001, 0x0000, 0x0E08, 0xCFE8, 0x0000, +0x4303, 0x0E08, 0xDFE8, 0x0000, 0x035B, 0x533A, 0x930C, 0x23E6, 0x1638, +0x0110, 0x008F, 0x2F4C, 0x0F3E, 0x0008, 0x4E6E, 0xBF5E, 0x000D, 0x2002, +0x434E, 0x3C01, 0x435E, 0x1840, 0x4EC2, 0x2F9C, 0x0F3E, 0x0008, 0x4E6E, +0xBF5E, 0x000C, 0x2002, 0x434E, 0x3C01, 0x435E, 0x1840, 0x4EC2, 0x2F9D, +0xD3E2, 0x0263, 0x434D, 0x407C, 0x000A, 0x13B1, 0x21E0, 0x403C, 0x000A, +0x0180, 0x4E9C, 0x1840, 0x4C82, 0x2F5E, 0xD3E2, 0x0242, 0x3C00, 0x403F, +0x001F, 0x533F, 0x2FFE, 0xC3E2, 0x0242, 0x3C00, 0x403F, 0x001F, 0x533F, +0x2FFE, 0xD0F2, 0x0080, 0x020B, 0x3C00, 0x403F, 0x0D03, 0x533F, 0x2FFE, +0xD3E2, 0x0242, 0x1840, 0x43C2, 0x2F9C, 0x1840, 0x43D2, 0x2F9D, 0x0110, +0x1800, 0x1249, 0x4309, 0x930F, 0x3405, 0xE33E, 0xE33F, 0x531E, 0x630F, +0xD319, 0x930D, 0x3405, 0xE33C, 0xE33D, 0x531C, 0x630D, 0xE339, 0x13B1, +0x49A8, 0xB319, 0x2404, 0xE33C, 0xE33D, 0x531C, 0x630D, 0xB329, 0x2404, +0xE33E, 0xE33F, 0x531E, 0x630F, 0x1800, 0x4179, 0x0110, 0x1800, 0x1249, +0x1800, 0x124A, 0x1800, 0x124B, 0x430A, 0x430B, 0x4039, 0x0020, 0x5C0C, +0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, 0x5339, 0x23F6, +0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, 0x1800, 0x417B, +0x1800, 0x417A, 0x1800, 0x4179, 0x0110, 0x120D, 0x120C, 0x8221, 0x436F, +0x410E, 0x522E, 0x407D, 0x0014, 0x407C, 0x0007, 0x13B1, 0x22DA, 0x410D, +0x530D, 0x436C, 0x13B1, 0x2276, 0x412E, 0xF03E, 0x000F, 0x412C, 0x411D, +0x0002, 0x035D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, +0xDE0D, 0x5231, 0x0110, 0x8231, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, +0x0004, 0x4381, 0x0006, 0x407F, 0x0003, 0x0CCE, 0x407D, 0x0023, 0x407C, +0x0007, 0x13B1, 0x238C, 0x410D, 0x530D, 0x407C, 0x0003, 0x13B1, 0x2358, +0x410F, 0x530F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x5231, 0x0110, 0x002F, +0x2F68, 0x1840, 0xC2DF, 0x2F6C, 0x0000, 0x002F, 0x2F68, 0x1840, 0xC2DF, +0x2F6D, 0x0000, 0x4303, 0x4303, 0x4303, 0x002F, 0x2F68, 0x1840, 0xD2DF, +0x2F6C, 0x0000, 0x002F, 0x2F68, 0x1840, 0xD2DF, 0x2F6D, 0x0000, 0x0110, +0x118C, 0x118E, 0x1800, 0x1249, 0x4309, 0x930E, 0x3403, 0xE33E, 0x531E, +0xD319, 0x930C, 0x3403, 0xE33C, 0x531C, 0xE339, 0x13B1, 0x4DA6, 0xB319, +0x2402, 0xE33C, 0x531C, 0xB329, 0x2402, 0xE33E, 0x531E, 0x1800, 0x4179, +0x0110, 0x120F, 0x120E, 0x120D, 0x120C, 0x8231, 0x426F, 0x410E, 0x523E, +0x407D, 0x0040, 0x407C, 0x0007, 0x13B1, 0x22DA, 0x410D, 0x530D, 0x426C, +0x13B1, 0x2276, 0x410F, 0x530F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x5031, +0x0010, 0x0110, 0x120D, 0x120C, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, +0x436F, 0x410E, 0x522E, 0x407D, 0x0020, 0x407C, 0x0007, 0x13B1, 0x238C, +0x410D, 0x530D, 0x436C, 0x13B1, 0x2358, 0x412C, 0x411D, 0x0002, 0x5231, +0x0110, 0x008F, 0x2F86, 0x0FCE, 0x00AE, 0x0008, 0xB35C, 0x0E0D, 0x2804, +0xDFDD, 0x0001, 0x0000, 0x3C03, 0xCFDD, 0x0001, 0x0000, 0x0E0D, 0xCFED, +0x0000, 0x4303, 0x0E0E, 0xDFEE, 0x0000, 0x0110, 0x120D, 0x120C, 0x8221, +0x436F, 0x410E, 0x522E, 0x407D, 0x0020, 0x407C, 0x0007, 0x13B1, 0x22DA, +0x410D, 0x530D, 0x436C, 0x13B1, 0x2276, 0x412C, 0x411D, 0x0002, 0x5231, +0x0110, 0x002F, 0x2F68, 0x1840, 0xC2DF, 0x2F6C, 0x0000, 0x002F, 0x2F68, +0x1840, 0xC2DF, 0x2F6D, 0x0000, 0x4303, 0x4303, 0x4303, 0x002F, 0x2F68, +0x1840, 0xD2DF, 0x2F6D, 0x0000, 0x0110, 0x002F, 0x2F68, 0x1840, 0xC2DF, +0x2F6C, 0x0000, 0x002F, 0x2F68, 0x1840, 0xC2DF, 0x2F6D, 0x0000, 0x4303, +0x4303, 0x4303, 0x002F, 0x2F68, 0x1840, 0xD2DF, 0x2F6D, 0x0000, 0x0110, +0x002F, 0x2F68, 0x1840, 0xD2DF, 0x2F6C, 0x0000, 0x002F, 0x2F68, 0x1840, +0xC2DF, 0x2F6D, 0x0000, 0x4303, 0x4303, 0x4303, 0x002F, 0x2F68, 0x1840, +0xD2DF, 0x2F6D, 0x0000, 0x0110, 0xD0B2, 0x0080, 0x01B0, 0xD0B2, 0x0020, +0x01B0, 0xD392, 0x01B0, 0x40B2, 0x02A0, 0x0790, 0xD0B2, 0x0100, 0x0790, +0xD0B2, 0x8000, 0x0790, 0xD3A2, 0x0790, 0x4382, 0x0794, 0x0110, 0x002F, +0x2F68, 0x1840, 0xD2DF, 0x2F6C, 0x0000, 0x002F, 0x2F68, 0x1840, 0xC2DF, +0x2F6D, 0x0000, 0x4303, 0x4303, 0x4303, 0x002F, 0x2F68, 0x1840, 0xD2DF, +0x2F6D, 0x0000, 0x0110, 0x008C, 0x2F60, 0x410E, 0x522E, 0x008D, 0x0009, +0x13B1, 0x4E36, 0x1840, 0x43C2, 0x30EF, 0x1840, 0x43C2, 0x30F0, 0x1840, +0x43C2, 0x30F1, 0x1840, 0x4382, 0x2F72, 0x0110, 0xD0B2, 0x0080, 0x01B0, +0xD0B2, 0x0020, 0x01B0, 0xD392, 0x01B0, 0x40B2, 0x02A0, 0x0780, 0xD0B2, +0x0100, 0x0780, 0xD0B2, 0x8000, 0x0780, 0xD3A2, 0x0780, 0x0110, 0x008F, +0x2F34, 0x4F1C, 0x0002, 0x5F2C, 0x5F1C, 0x0004, 0x5F1C, 0x0006, 0x5F1C, +0x0008, 0x5F1C, 0x000A, 0x5F1C, 0x000C, 0x5F1C, 0x000E, 0x0B5C, 0x0110, +0x140A, 0x8321, 0x4C4A, 0x4C4D, 0x435C, 0x13B1, 0x21E0, 0x410D, 0x530D, +0x435C, 0x13B1, 0x2276, 0x1840, 0x4A82, 0x2F98, 0x416C, 0x5321, 0x160A, +0x0110, 0x1202, 0xC232, 0x4303, 0x4C82, 0x04D0, 0x4D82, 0x04D2, 0x4E82, +0x04E0, 0x4F82, 0x04E2, 0x421C, 0x04E4, 0x421D, 0x04E6, 0x4132, 0x0110, +0x8321, 0x4C0E, 0x407D, 0x0010, 0x407C, 0x0007, 0x13B1, 0x243C, 0x410D, +0x530D, 0x435C, 0x13B1, 0x2276, 0x412C, 0x5321, 0x0110, 0x8321, 0x4381, +0x0000, 0x4C4D, 0x407C, 0x0003, 0x13B1, 0x24A8, 0x410D, 0x530D, 0x435C, +0x13B1, 0x2358, 0x416C, 0x5321, 0x0110, 0x930C, 0x240D, 0xC392, 0x0402, +0xD0B2, 0x0014, 0x0400, 0xB392, 0x0402, 0x2BFD, 0xC0B2, 0x0010, 0x0400, +0x533C, 0x23F3, 0x0110, 0xF37C, 0xF37E, 0x4E0F, 0x4C0D, 0x430E, 0x431C, +0x5D0D, 0x6E0E, 0x9F0E, 0x2801, 0x8F0E, 0x6C0C, 0x2BF9, 0x0110, 0x8321, +0x4C4D, 0x407C, 0x0005, 0x13B1, 0x21E0, 0x410D, 0x530D, 0x435C, 0x13B1, +0x2276, 0x416C, 0x5321, 0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, 0x3C04, +0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, 0x4382, 0x0400, +0x40B2, 0x02C0, 0x0400, 0x40B2, 0x08A0, 0x0412, 0xC0B2, 0x0010, 0x0402, +0x0110, 0x3C03, 0x4303, 0x3C01, 0x4303, 0x430C, 0x430D, 0x430E, 0x430F, +0x0110, 0x3FFA, 0x4303, 0x930D, 0x2403, 0x1840, 0x4D82, 0x2F04, 0x930C, +0x2403, 0x1840, 0x4C82, 0x2F06, 0x0110, 0x1800, 0x124C, 0x4EBC, 0x0000, +0x03EC, 0x00BD, 0x0001, 0x23FA, 0x1800, 0x417C, 0x0110, 0x934C, 0x2403, +0x407D, 0x0009, 0x3C01, 0x427D, 0x434C, 0x0180, 0x21E0, 0x008C, 0x2F74, +0x410E, 0x522E, 0x008D, 0x0009, 0x0180, 0x4E36, 0x008C, 0x2F4C, 0x410E, +0x522E, 0x008D, 0x0009, 0x0180, 0x4E36, 0x008C, 0x2F86, 0x410E, 0x522E, +0x008D, 0x0009, 0x0180, 0x4E36, 0x002F, 0x2F8E, 0x1840, 0xD2DF, 0x2F86, +0x0000, 0x0110, 0x3C02, 0x184C, 0x100F, 0x533C, 0x930C, 0x23FB, 0x0110, +0x13B1, 0x3F40, 0x1380, 0x2E1E, 0xD2A2, 0x0508, 0x0110, 0x1840, 0x4382, +0x2E16, 0x13B1, 0x3D6E, 0x430C, 0x0110, 0x430C, 0x430D, 0x430E, 0x430F, +0x0110, 0x3FFA, 0x4303, 0x4C0E, 0x407D, 0x0007, 0x434C, 0x0180, 0x243C, +0x13B1, 0x4836, 0x2802, 0x430C, 0x430D, 0x0110, 0x13B1, 0x47E0, 0x430C, +0x630C, 0x0110, 0x13B1, 0x4730, 0x430C, 0x630C, 0x0110, 0x430C, 0x430D, +0x0110, 0x3FFC, 0x4303, 0x1840, 0x421C, 0x2F22, 0x0110, 0x1840, 0x4C82, +0x2E1C, 0x0110, 0x1840, 0x4382, 0x2F98, 0x0110, 0x1840, 0x4C82, 0x2F72, +0x0110, 0x1840, 0x425C, 0x30F1, 0x0110, 0x1840, 0x425C, 0x2F98, 0x0110, +0x4C82, 0x0784, 0x0110, 0x433C, 0x433D, 0x0110, 0x4C82, 0x0794, 0x0110, +0x433C, 0x0110, 0x433C, 0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x433C, +0x0110, 0x430C, 0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x437C, 0x0110, +0x0180, 0x2A16, 0x434C, 0x0110, 0x430C, 0x0110, 0x434C, 0x0110, 0x434C, +0x0110, 0x430C, 0x0110, 0x0110, 0x0110, 0x0000, 0x0000, 0x0260, 0x0000, +0x0262, 0x0000, 0x1020, 0x0264, 0x0000, 0x0000, 0x0000, 0x0220, 0x0000, +0x0222, 0x0000, 0x0108, 0x0224, 0x0000, 0x0201, 0x0804, 0x0220, 0x0000, +0x0222, 0x0000, 0x2010, 0x0224, 0x0000, 0x1004, 0x0020, 0x0242, 0x0000, +0x0080, 0x0282, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +}; + +const uint32_t MSP_FetHilImage_address[] = +{ +0x00001880, 0x0000CC00, 0x00010000, +}; +const uint32_t MSP_FetHilImage_length_of_sections[] = +{ +0x00000040, 0x00001900, 0x00004700, +}; +const uint32_t MSP_FetHilImage_sections = 0x00000003; +const uint32_t MSP_FetHilImage_termination = 0x00000000; +const uint32_t MSP_FetHilImage_start = 0x00001880; +const uint32_t MSP_FetHilImage_finish = 0x00018E00; +const uint32_t MSP_FetHilImage_length = 0x00017580; + +#define MSP_FETHILIMAGE_TERMINATION 0x00000000 +#define MSP_FETHILIMAGE_START 0x00001880 +#define MSP_FETHILIMAGE_FINISH 0x00018E00 +#define MSP_FETHILIMAGE_LENGTH 0x00017580 +#define MSP_FETHILIMAGE_SECTIONS 0x00000003 diff --git a/Bios/include/UifBiosCore.h b/Bios/include/UifBiosCore.h new file mode 100644 index 0000000..e7a4660 --- /dev/null +++ b/Bios/include/UifBiosCore.h @@ -0,0 +1,411 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t UifBiosCoreImage[] = +{ +0xF556, 0xE6E8, 0xFAB4, 0xEF40, 0xFAC4, 0xFA5A, 0xF8F6, 0xF3E0, 0xF7BA, +0xF97E, 0xF834, 0xF4FC, 0xF286, 0xF93C, 0xF9BE, 0xFA90, 0xF95E, 0xF99E, +0xF91A, 0xF85C, 0xF6CC, 0x1000, 0x18FF, 0x2500, 0xDFFF, 0xFDFA, 0xFDFF, +0x1000, 0x18FF, 0x2500, 0xDFFF, 0x1000, 0x10FF, 0x0200, 0x09FF, 0x1100, +0x18FF, 0x0100, 0x0080, 0x0040, 0x0001, 0x1C7E, 0x2144, 0x8205, 0x0000, +0x0000, 0x0101, 0x0101, 0x1C75, 0xDFFE, 0xFDDA, 0xFFFF, 0xFFFF, 0x0000, +0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0100, +0xFFFF, 0xFFFF, 0x0000, 0x0100, 0x1B90, 0x1C7E, 0x4031, 0x24E0, 0x403C, +0x1A2A, 0x403D, 0x0253, 0x12B0, 0xFA48, 0x403C, 0x1A00, 0x403D, 0xE060, +0x403E, 0x002A, 0x12B0, 0xFB10, 0x12B0, 0xF766, 0x12B0, 0xFB14, 0x120A, +0x120B, 0x120D, 0x120C, 0x120F, 0x120E, 0xD0F2, 0x0040, 0x0021, 0xD3D2, +0x1B5C, 0xB0F2, 0x00A0, 0x0072, 0x2002, 0x434E, 0x3C01, 0x435E, 0x934E, +0x2405, 0x403C, 0x8006, 0x12B0, 0xF7E4, 0x3D46, 0x425E, 0x0076, 0x4EC2, +0x1C74, 0x407F, 0x0010, 0x421D, 0x1B82, 0x4D6D, 0xF07D, 0x00FC, 0x9F4D, +0x2016, 0x907E, 0x0011, 0x2008, 0xB3E2, 0x1C75, 0x2802, 0x12B0, 0xFAE4, +0x43C2, 0x1C75, 0x3D2E, 0x907E, 0x0013, 0x2003, 0x42F2, 0x1C75, 0x3D28, +0x9F4E, 0x200A, 0x4FC2, 0x1C79, 0x3D23, 0x9FC2, 0x1C79, 0x2004, 0xDFC2, +0x1C74, 0x43C2, 0x1C79, 0x403A, 0x1A2A, 0x4A6F, 0xB3DF, 0x1A30, 0x2805, +0x403C, 0x8009, 0x12B0, 0xF7E4, 0x3D11, 0x4A6F, 0x5F0F, 0x938F, 0x1A3A, +0x2015, 0x40B2, 0x000A, 0x1B5A, 0x4382, 0x1A44, 0x425E, 0x1C74, 0xB35E, +0x2806, 0x532E, 0x4A6F, 0x5F0F, 0x4E8F, 0x1A3E, 0x3C06, 0x503E, 0x0003, +0x4A6F, 0x5F0F, 0x4E8F, 0x1A3E, 0x4A6F, 0x5F0F, 0x90BF, 0x0104, 0x1A3A, +0x2C37, 0x425E, 0x1C74, 0x4E4D, 0x4A6F, 0x5F0F, 0xB39F, 0x1A3A, 0x2807, +0x108D, 0xDD82, 0x1B88, 0xE292, 0x1B88, 0x1A44, 0x3C02, 0x4D82, 0x1B88, +0x4A6F, 0x5F0F, 0x4F1D, 0x1A32, 0x4A6F, 0x5F0F, 0x4F1C, 0x1A3A, 0x4C0B, +0x531B, 0x4B8F, 0x1A3A, 0x5C0D, 0x4ECD, 0x0000, 0x4A6E, 0x5E0E, 0x4A6F, +0x5F0F, 0x9F9E, 0x1A3A, 0x1A3E, 0x2CC9, 0x4382, 0x1B5A, 0x93B2, 0x1A44, +0x20A0, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x0091, 0x0001, 0x203A, +0x434E, 0x3C06, 0x403C, 0x800A, 0x12B0, 0xF7E4, 0x3CB5, 0x435E, 0x934E, +0x20AC, 0xB3E2, 0x1A4C, 0x2BFA, 0x421F, 0x1B52, 0x4F5E, 0x0002, 0xF07E, +0x003F, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9F5E, 0x0002, 0x23ED, 0x421F, +0x1B52, 0x93CF, 0x0003, 0x2007, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x92EF, +0x0000, 0x2810, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, +0x0004, 0x0003, 0x23D7, 0xF0F2, 0x00F8, 0x1A4C, 0x4382, 0x1B5E, 0x3C80, +0xF0F2, 0x00F8, 0x1A4C, 0x3C7C, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, +0x0092, 0x0001, 0x4A6F, 0x2039, 0x5F0F, 0x4F1F, 0x1A32, 0x93CF, 0x0002, +0x2010, 0x435C, 0x12B0, 0xF95E, 0x434C, 0x12B0, 0xF99E, 0x43C2, 0x1C72, +0x434C, 0x12B0, 0xF164, 0x12B0, 0xF1F8, 0x12B0, 0xF80C, 0x3C5D, 0x434E, +0x3C01, 0x435E, 0x934E, 0x2058, 0x425E, 0x1A4C, 0xF07E, 0x0003, 0x907E, +0x0003, 0x23F6, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, +0x0002, 0x0002, 0x23EC, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, +0x9FDB, 0x0004, 0x0003, 0x23E2, 0xC3E2, 0x1A4C, 0x3C3A, 0x5F0F, 0x4F1F, +0x1A32, 0x93CF, 0x0002, 0x200B, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, +0x008B, 0x0001, 0x2003, 0x12B0, 0xF1F8, 0x3C2F, 0x4A6F, 0xD3DF, 0x1A30, +0x53D2, 0x1A2A, 0x93E2, 0x1A2A, 0x2821, 0x43C2, 0x1A2A, 0x3C1E, 0x40B2, +0x8003, 0x1A42, 0x4A6F, 0x5F0F, 0x4F1B, 0x1A32, 0x4A6F, 0x5F0F, 0x5F1B, +0x1A3E, 0xEB92, 0xFFFF, 0x1A44, 0xE3B2, 0x1A44, 0x43A2, 0x1B84, 0x43D2, +0x1C76, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x4FD2, 0x0002, 0x1C77, 0x40B2, +0x1A42, 0x1B86, 0x4A6F, 0x5F0F, 0x438F, 0x1A3A, 0x4382, 0x1A44, 0xC0F2, +0x0040, 0x0021, 0xC3D2, 0x1B5C, 0x413E, 0x413F, 0x413C, 0x413D, 0x413B, +0x413A, 0x1300, 0x120A, 0x120B, 0x1208, 0x1209, 0x4C0A, 0x433B, 0x4308, +0x4C5E, 0x0001, 0x9EC2, 0x1A2B, 0x2003, 0x93C2, 0x1A2C, 0x3809, 0x4EC2, +0x1A2B, 0x4C5F, 0x0004, 0x4F82, 0x1A2E, 0xD392, 0x1B9E, 0x3C02, 0xC392, +0x1B9E, 0x93CC, 0x0002, 0x3803, 0xD3A2, 0x1B9E, 0x3C02, 0xC3A2, 0x1B9E, +0x4CD2, 0x0002, 0x1A2C, 0x93C2, 0x1C72, 0x2005, 0x434C, 0x12B0, 0xF95E, +0x43D2, 0x1C72, 0x4A5E, 0x0001, 0x907E, 0x0081, 0x2045, 0xB392, 0x1B9E, +0x2806, 0x4A19, 0x0004, 0x432C, 0x1292, 0xE01C, 0x3C02, 0x4219, 0x1A2E, +0x9309, 0x2004, 0x4A0C, 0x12B0, 0xE572, 0x4C08, 0x9308, 0x2030, 0x407D, +0x0093, 0x4A5C, 0x0002, 0x1292, 0xE000, 0x90B2, 0x0064, 0x1C68, 0x2802, +0x4382, 0x1C68, 0x421F, 0x1C68, 0x4F0E, 0x531E, 0x4E82, 0x1C68, 0x5F0F, +0x498F, 0x1BA0, 0x4982, 0x1C6A, 0x421F, 0x1A26, 0x9F19, 0x0008, 0x2C69, +0x421F, 0x1B9C, 0x5909, 0x5909, 0x590F, 0x4F1F, 0x0002, 0x930F, 0x2460, +0x421C, 0x1B9E, 0x128F, 0x4C0B, 0x930C, 0x205A, 0x1292, 0xE002, 0x403B, +0x8000, 0x3C55, 0x480B, 0x3C53, 0x807E, 0x0051, 0x2436, 0x835E, 0x2439, +0x835E, 0x2440, 0x835E, 0x2443, 0x835E, 0x2446, 0x807E, 0x002D, 0x2409, +0x826E, 0x2413, 0x826E, 0x240B, 0x836E, 0x2415, 0x835E, 0x241B, 0x3C3C, +0x435D, 0x4A0C, 0x12B0, 0xECB8, 0x4C0B, 0x3C36, 0x434D, 0x4A0C, 0x12B0, +0xECB8, 0x4C0B, 0x3C30, 0x4A5C, 0x0006, 0x12B0, 0xF164, 0x4C0B, 0x3C2A, +0x4A5C, 0x0006, 0xD07C, 0x0040, 0x12B0, 0xF8D0, 0x4C0B, 0x3C22, 0x4A5C, +0x0006, 0xD07C, 0x0040, 0x12B0, 0xF8AA, 0x4C0B, 0x3C1A, 0x4A0C, 0x12B0, +0xF64C, 0x4C0B, 0x3C15, 0x4A0C, 0x12B0, 0xE9A6, 0x4C0B, 0x931C, 0x200F, +0x12B0, 0xF736, 0x3C0C, 0x4A0C, 0x12B0, 0xEFFE, 0x4C0B, 0x3C07, 0x4A0C, +0x12B0, 0xF446, 0x4C0B, 0x3C02, 0x12B0, 0xF5B0, 0x903B, 0x8000, 0x2425, +0x4A5C, 0x0002, 0x930B, 0x380C, 0x407D, 0x0091, 0x1292, 0xE000, 0x930C, +0x381B, 0x4B0C, 0x1292, 0xE008, 0x1292, 0xE002, 0x3C15, 0x407D, 0x0092, +0x1292, 0xE000, 0x4B0C, 0x1292, 0xE008, 0x903B, 0x8002, 0x2009, 0x425C, +0x1A2C, 0x535C, 0xF07C, 0x003F, 0x2001, 0x435C, 0x1292, 0xE008, 0x1292, +0xE002, 0x430C, 0x4030, 0xFAAA, 0x120A, 0x120B, 0x8221, 0x430A, 0x4C5E, +0x0006, 0x934E, 0x2057, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1292, 0xE000, +0x930C, 0x384C, 0x421A, 0xFDD6, 0x421F, 0xFDD8, 0x4A81, 0x0000, 0x4F81, +0x0002, 0x421B, 0xE008, 0x421F, 0x1A26, 0x903F, 0x1B90, 0x2409, 0x4F1C, +0x0002, 0x128B, 0x421F, 0x1A26, 0x4F1C, 0x0004, 0x128B, 0x3C04, 0x4A0C, +0x128B, 0x4A0C, 0x128B, 0x421C, 0x1B7E, 0x128B, 0x421C, 0x1B80, 0x128B, +0x422D, 0x410C, 0x530C, 0x1292, 0xE006, 0x421C, 0xFFDE, 0x128B, 0x430C, +0x128B, 0x430C, 0x128B, 0x430C, 0x128B, 0x430C, 0x128B, 0x430C, 0x128B, +0x430C, 0x128B, 0x430C, 0x128B, 0x430C, 0x128B, 0x421F, 0x1A26, 0x4F5C, +0x0006, 0x128B, 0x432C, 0x128B, 0x403C, 0x0102, 0x128B, 0x421C, 0x1B7A, +0x421D, 0x1B7C, 0x1292, 0xE00A, 0x431A, 0x3C54, 0x403A, 0xFFFD, 0x3C51, +0x935E, 0x201B, 0x421F, 0x1A26, 0x938F, 0x0008, 0x2413, 0x407D, 0x0093, +0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, 0x3808, 0x421F, 0x1A26, 0x4F1C, +0x0008, 0x1292, 0xE008, 0x431A, 0x3C3A, 0x403A, 0xFFFC, 0x3C37, 0x403A, +0xFFFE, 0x3C34, 0x936E, 0x2021, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1292, +0xE000, 0x930C, 0x3816, 0x430B, 0x3C0D, 0x4B0C, 0x1292, 0xE008, 0x421E, +0x1B9C, 0x4B0F, 0x5F0F, 0x5F0F, 0x5F0E, 0x4E2C, 0x1292, 0xE008, 0x531B, +0x421F, 0x1A26, 0x9F1B, 0x0008, 0x2BEE, 0x431A, 0x3C14, 0x403A, 0xFFFB, +0x3C11, 0x907E, 0x0003, 0x200E, 0x407D, 0x0091, 0x4C5C, 0x0002, 0x1292, +0xE000, 0x930C, 0x3804, 0x1292, 0xE002, 0x403A, 0xFFFA, 0x12B0, 0xFA7E, +0x931A, 0x2004, 0x403A, 0x8000, 0x1292, 0xE002, 0x4A0C, 0x5221, 0x413B, +0x413A, 0x4130, 0x120A, 0x120B, 0x403E, 0x1A46, 0x4E6F, 0xB3DF, 0x1A4C, +0x2CA4, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x90FF, 0x0093, 0x0001, 0x4E6F, +0x2407, 0x5F0F, 0x4F1F, 0x1B52, 0xC0FF, 0x0080, 0x0002, 0x3C18, 0x5F0F, +0x4F1F, 0x1B52, 0x93CF, 0x0002, 0x3803, 0x93C2, 0x1C7B, 0x240F, 0x93F2, +0x1C7B, 0x2403, 0x53D2, 0x1C7B, 0x3C02, 0x43D2, 0x1C7B, 0x4E6F, 0x5F0F, +0x4F1F, 0x1B52, 0x42DF, 0x1C7B, 0x0003, 0x4E6F, 0x5F0F, 0x4F1D, 0x1A4E, +0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4DCF, 0x0000, 0x4E6F, 0x5F0F, 0x4F1F, +0x1B52, 0xB3DF, 0x0000, 0x2C0E, 0x4E6F, 0x5F0F, 0x4F1D, 0x1B52, 0x4E6F, +0x5F0F, 0x4F1C, 0x1A4E, 0x531C, 0x4C8F, 0x1A4E, 0x5C0D, 0x43CD, 0x0000, +0x430D, 0x430C, 0x3C11, 0x4C0A, 0x5A0A, 0x4E6F, 0x5F0F, 0x4F0B, 0x5F0F, +0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5B0F, 0x5F0A, 0xEA1D, +0x1A50, 0x531C, 0x4E6F, 0x5F0F, 0x4F1F, 0x1A4E, 0x531F, 0xC312, 0x100F, +0x9F0C, 0x2BE6, 0xE33D, 0x4E6F, 0x5F0F, 0x4F1B, 0x1A4E, 0x100B, 0x5B0B, +0x4E6F, 0x5F0F, 0x4F0A, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, +0x5F0F, 0x5A0F, 0x5F0B, 0x4D8B, 0x1A52, 0x4E6F, 0xD3DF, 0x1A4C, 0x4E6F, +0xC2FF, 0x1A4C, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x93CF, 0x0002, 0x3802, +0x43C2, 0x1C7B, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x90FF, 0x0093, 0x0001, +0x2003, 0x4E6F, 0xD3EF, 0x1A4C, 0x4E6F, 0x5F0F, 0x4F1C, 0x1A4E, 0x503C, +0x0003, 0x12B0, 0xF9DC, 0x53D2, 0x1A46, 0x93C2, 0x1A46, 0x2402, 0x43C2, +0x1A46, 0x12B0, 0xFAE4, 0x430C, 0x413B, 0x413A, 0x4130, 0x43C2, 0x0022, +0x43C2, 0x002A, 0x43C2, 0x001A, 0x43C2, 0x001E, 0x43C2, 0x0032, 0x43C2, +0x0036, 0x43C2, 0x0026, 0x43C2, 0x002E, 0x43C2, 0x001B, 0x43C2, 0x001F, +0x43C2, 0x0033, 0x43C2, 0x0037, 0x43C2, 0x0021, 0x43C2, 0x0029, 0x43C2, +0x0019, 0x43C2, 0x001D, 0x43C2, 0x0031, 0x43C2, 0x0035, 0xC0F2, 0x0080, +0x0057, 0x430F, 0x3C05, 0x4303, 0x533E, 0x930E, 0x23FC, 0x531F, 0x903F, +0x00FF, 0x2C07, 0xB3E2, 0x0002, 0x2804, 0xC3E2, 0x0002, 0x437E, 0x3FF3, +0xC0F2, 0x0040, 0x0019, 0xD0F2, 0x0080, 0x0057, 0xD0F2, 0x0040, 0x0057, +0xC032, 0x0020, 0x430F, 0xC3E2, 0x0002, 0x437E, 0x3C02, 0x4303, 0x533E, +0x930E, 0x23FC, 0xB3E2, 0x0002, 0x2802, 0x430F, 0x3C01, 0x531F, 0x903F, +0x000A, 0x2BEF, 0xD3E2, 0x0000, 0xD0F2, 0x00C0, 0x0058, 0x40B2, 0x1200, +0x1B76, 0x40B2, 0x007A, 0x1B78, 0x40F2, 0x0057, 0x1C73, 0x40F2, 0x00FC, +0x0021, 0x40F2, 0x0003, 0x0022, 0xC0F2, 0x0020, 0x0021, 0xD0F2, 0x0040, +0x0021, 0xD0F2, 0x0060, 0x0022, 0xD0F2, 0x0060, 0x0029, 0xD0F2, 0x0060, +0x002A, 0xD0F2, 0x0030, 0x001B, 0xD0F2, 0x0010, 0x001A, 0xD0F2, 0x0015, +0x001D, 0xD0F2, 0x007D, 0x001E, 0xD0F2, 0x000B, 0x0032, 0x40B2, 0x0021, +0x1B68, 0x43D2, 0x1B6A, 0x40B2, 0x0021, 0x1B72, 0x43E2, 0x1B74, 0x40B2, +0x1C74, 0x1B82, 0x40B2, 0x1C75, 0x1A00, 0x40B2, 0xFF55, 0x1B7E, 0x40B2, +0x0140, 0x1B80, 0x40B2, 0x0007, 0x1B7A, 0x4382, 0x1B7C, 0x4382, 0x0182, +0x40B2, 0x270F, 0x0192, 0x40B2, 0x01D6, 0x0180, 0xD0F2, 0x0040, 0x0019, +0xD232, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C18, 0x0004, +0x4809, 0x5C19, 0x0008, 0x8329, 0x4336, 0x93D2, 0x1C7C, 0x2076, 0x403B, +0xF4A2, 0x480C, 0x128B, 0x834C, 0x2407, 0x835C, 0x2408, 0x835C, 0x2409, +0x835C, 0x240A, 0x3C0A, 0xF038, 0xFE00, 0x3C07, 0xF038, 0xFF00, 0x3C04, +0xF038, 0xFF80, 0x3C01, 0xC318, 0x490C, 0x128B, 0x834C, 0x2407, 0x835C, +0x2408, 0x835C, 0x2409, 0x835C, 0x240A, 0x3C0A, 0xF039, 0xFE00, 0x3C07, +0xF039, 0xFF00, 0x3C04, 0xF039, 0xFF80, 0x3C01, 0xC319, 0x490C, 0x128B, +0x4C4C, 0x5C0C, 0x4C1F, 0xE04A, 0x5F0F, 0x5F09, 0x4036, 0xFFFE, 0xB318, +0x2C3E, 0x9908, 0x2C3C, 0xB392, 0x012C, 0x2FFD, 0x40B2, 0xA593, 0x012A, +0x40B2, 0xA500, 0x012C, 0x4316, 0x3C0A, 0x907A, 0x0003, 0x2002, 0x43B8, +0x0000, 0x5A0A, 0x4A1F, 0xE04A, 0x5F0F, 0x5F08, 0x9908, 0x2C1F, 0x480C, +0x128B, 0x4C4A, 0x480C, 0x12B0, 0xF884, 0x934C, 0x240F, 0x934A, 0x2404, +0x935A, 0x2402, 0x936A, 0x23E6, 0x40B2, 0xA502, 0x0128, 0x43B8, 0x0000, +0xB392, 0x012C, 0x2FFD, 0x3FE2, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA510, +0x012C, 0x4036, 0xFFFE, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA510, 0x012C, +0x460C, 0x4030, 0xFAA8, 0x120A, 0x120B, 0x1208, 0x1209, 0x8031, 0x0012, +0x434A, 0xC0F2, 0x0040, 0x0021, 0xC3D2, 0x1B5C, 0x3C16, 0x403D, 0x0014, +0x434C, 0x12B0, 0xF85C, 0x4A4D, 0x403C, 0x1A2A, 0x1292, 0xE00C, 0x4AC2, +0x1C7A, 0x5B0B, 0x4B1C, 0x1A32, 0x12B0, 0xE388, 0x425A, 0x1C7A, 0x4A4F, +0xC3DF, 0x1A30, 0x93C2, 0x1C76, 0x240F, 0x421E, 0x1B86, 0x421D, 0x1B84, +0x425C, 0x1C77, 0x12B0, 0xF5FE, 0x43C2, 0x1C76, 0xC0F2, 0x0040, 0x0021, +0xC3D2, 0x1B5C, 0x434B, 0x3C41, 0x4B48, 0x5808, 0x5808, 0x5808, 0x481F, +0x1A06, 0x421E, 0x1A26, 0x9E1F, 0x0008, 0x2C35, 0x421E, 0x1B9C, 0x5F0F, +0x5F0F, 0x5F0E, 0x4E19, 0x0002, 0x9309, 0x242C, 0x93C8, 0x1A0D, 0x2429, +0x485D, 0x1A0C, 0x485C, 0x1A0B, 0x1292, 0xE000, 0x930C, 0x3821, 0x481C, +0x1A08, 0x410F, 0x530F, 0x120F, 0x430F, 0x431E, 0x4C6D, 0x503D, 0xFFFD, +0x503C, 0x0006, 0x1292, 0xE00E, 0x403C, 0x0003, 0x1289, 0x5321, 0x931C, +0x2009, 0x1292, 0xE002, 0xB3D8, 0x1A0A, 0x2804, 0x485C, 0x1A0B, 0x12B0, +0xF164, 0x410C, 0x530C, 0x1292, 0xE010, 0x535B, 0x926B, 0x2BBD, 0x4A4E, +0x4A4B, 0xB3DB, 0x1A30, 0x2F8E, 0x535A, 0x936A, 0x2801, 0x434A, 0x9A4E, +0x23F6, 0x3F9D, 0x120A, 0x120B, 0x120D, 0x120C, 0x120F, 0x120E, 0x421F, +0x1A00, 0x93CF, 0x0000, 0x2404, 0x40F2, 0x000A, 0x1C75, 0x3C65, 0x403D, +0x1A47, 0x4D6C, 0x4D6F, 0xB3DF, 0x1A4C, 0x2C0B, 0x53D2, 0x1A47, 0x93C2, +0x1A47, 0x2402, 0x43C2, 0x1A47, 0x9CC2, 0x1A47, 0x23F2, 0x3C53, 0x4D6E, +0x5E0E, 0x4D6F, 0x5F0F, 0x9F9E, 0x1A4E, 0x1A48, 0x4D6F, 0x2C0F, 0x5F0F, +0x4F1E, 0x1B52, 0x4D6F, 0x5F0F, 0x4F1D, 0x1A48, 0x4D0A, 0x531A, 0x4A8F, +0x1A48, 0x5D0E, 0x4EE2, 0x0077, 0x3C3B, 0xC3DF, 0x1A4C, 0x4D6F, 0x5F0F, +0x438F, 0x1A48, 0x4D6C, 0x4D6F, 0xB3EF, 0x1A4C, 0x2C02, 0x4382, 0x1B5E, +0x53D2, 0x1A47, 0x93C2, 0x1A47, 0x2402, 0x43C2, 0x1A47, 0x4D6F, 0xB3DF, +0x1A4C, 0x281C, 0x4D6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F6E, 0x4D6F, 0x5F0F, +0x9F1E, 0x1A48, 0x2812, 0x4D6F, 0x5F0F, 0x4F1E, 0x1B52, 0x4D6F, 0x5F0F, +0x4F1A, 0x1A48, 0x4A0B, 0x531B, 0x4B8F, 0x1A48, 0x5A0E, 0x4EE2, 0x0077, +0x40B2, 0x0032, 0x1B5E, 0x4D6F, 0xB3DF, 0x1A4C, 0x2C03, 0x9CC2, 0x1A47, +0x23D2, 0x413E, 0x413F, 0x413C, 0x413D, 0x413B, 0x413A, 0x1300, 0x120A, +0x120B, 0x1208, 0x1209, 0x4C08, 0x4D4A, 0x4309, 0x3C01, 0x5319, 0x9229, +0x2C0C, 0x490F, 0x5F0F, 0x5F0F, 0x5F0F, 0x9C9F, 0x0004, 0x1A06, 0x23F5, +0x9CDF, 0x0002, 0x1A0B, 0x23F1, 0x4309, 0x3C01, 0x5319, 0x9229, 0x2C07, +0x490F, 0x5F0F, 0x5F0F, 0x5F0F, 0x93BF, 0x1A06, 0x23F6, 0x9229, 0x2C46, +0x5909, 0x5909, 0x5909, 0x4C6B, 0x907B, 0x0006, 0x282A, 0x535B, 0x4B0C, +0x12B0, 0xF300, 0x4C89, 0x1A08, 0x930C, 0x241F, 0x430F, 0x3C08, 0x480E, +0x5F0E, 0x491D, 0x1A08, 0x5F0D, 0x4EED, 0x0000, 0x531F, 0x9B0F, 0x2BF6, +0xF35A, 0x4AC9, 0x1A0A, 0x485E, 0x0002, 0xD07E, 0x0040, 0x4EC9, 0x1A0B, +0x40F9, 0x0093, 0x1A0C, 0x4899, 0x0004, 0x1A06, 0x43D9, 0x1A0D, 0x431C, +0x3C1A, 0x403C, 0xFFFC, 0x3C17, 0x4389, 0x1A08, 0xF35A, 0x4AC9, 0x1A0A, +0x4C5E, 0x0002, 0xD07E, 0x0040, 0x4EC9, 0x1A0B, 0x40F9, 0x0093, 0x1A0C, +0x4C99, 0x0004, 0x1A06, 0x43D9, 0x1A0D, 0x431C, 0x3C02, 0x403C, 0xFFFD, +0x4030, 0xFAAA, 0x120D, 0x120C, 0x120F, 0x120E, 0x90B2, 0x000E, 0x011E, +0x205F, 0xD232, 0x93A2, 0x1B5A, 0x2806, 0xB3D2, 0x1B5C, 0x2C03, 0x53B2, +0x1B5A, 0x3C09, 0x9392, 0x1B5A, 0x2006, 0x4382, 0x1B5A, 0x403C, 0x8004, +0x12B0, 0xF7E4, 0x93A2, 0x1B5E, 0x2805, 0x93C2, 0x1C75, 0x2002, 0x53B2, +0x1B5E, 0x425E, 0x1B62, 0x421F, 0x1B64, 0xC312, 0x100F, 0x921F, 0x1B66, +0x7F4F, 0xF35F, 0xF35E, 0xEF4E, 0x421F, 0x1B68, 0x2404, 0xD2DF, 0x1B6A, +0x0000, 0x3C03, 0xC2DF, 0x1B6A, 0x0000, 0x9382, 0x1B66, 0x2403, 0x53B2, +0x1B66, 0x3C06, 0xB3E2, 0x1B62, 0x2803, 0x4292, 0x1B64, 0x1B66, 0x425E, +0x1B6C, 0x421F, 0x1B6E, 0xC312, 0x100F, 0x921F, 0x1B70, 0x7F4F, 0xF35F, +0xF35E, 0xEF4E, 0x421F, 0x1B72, 0x2404, 0xD2DF, 0x1B74, 0x0000, 0x3C03, +0xC2DF, 0x1B74, 0x0000, 0x9382, 0x1B70, 0x2403, 0x53B2, 0x1B70, 0x3C06, +0xB3E2, 0x1B6C, 0x2803, 0x4292, 0x1B6E, 0x1B70, 0x413E, 0x413F, 0x413C, +0x413D, 0x1300, 0x120A, 0x8031, 0x0006, 0x410C, 0x530C, 0x403E, 0xE056, +0x403D, 0x0006, 0x12B0, 0xFAD4, 0x12B0, 0xF736, 0x90B2, 0x2520, 0x251E, +0x2853, 0x90B2, 0xFDDA, 0x251E, 0x2C4F, 0x421F, 0x1A02, 0x90BF, 0x5137, +0x0000, 0x201F, 0x434A, 0x3C0F, 0x4A4F, 0x5F0F, 0x421E, 0x1A04, 0x5F0E, +0x93BE, 0x0000, 0x2006, 0x93BF, 0x2500, 0x2403, 0x4F9F, 0x2500, 0x24E0, +0x535A, 0x907A, 0x0010, 0x2BEE, 0x421D, 0x251E, 0x421E, 0x1B7A, 0x421F, +0x1B7C, 0x403C, 0xE000, 0x128D, 0x4C82, 0x1A26, 0x421F, 0x1A26, 0x903F, +0x1B90, 0x2423, 0x4F92, 0x000A, 0x1B9C, 0x9382, 0x1B9C, 0x241D, 0x434A, +0x3C16, 0x421F, 0x1B9C, 0x4A4E, 0x5E0E, 0x5E0E, 0x5E0F, 0x4F2F, 0x933F, +0x240C, 0x903F, 0xFF00, 0x2809, 0x4AC1, 0x0004, 0x43C1, 0x0005, 0x434D, +0x410C, 0x530C, 0x12B0, 0xECB8, 0x535A, 0x421F, 0x1A26, 0x9F1A, 0x0008, +0x2BE5, 0x430C, 0x3C01, 0x433C, 0x5031, 0x0006, 0x413A, 0x4130, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x4C0B, 0x4D08, 0x430C, 0x9382, +0x1B54, 0x203B, 0x4309, 0x9809, 0x2C4E, 0x4036, 0x1A46, 0x466F, 0x5F0F, +0x90BF, 0x00FF, 0x1A4E, 0x281E, 0x466F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F5A, +0x0001, 0x466F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F57, 0x0002, 0x466F, 0x5F0F, +0x4F1F, 0x1B52, 0xD0FF, 0x0080, 0x0002, 0x403D, 0x0014, 0x434C, 0x12B0, +0xF85C, 0x12B0, 0xE6E8, 0x4A4D, 0x474C, 0x12B0, 0xF556, 0x466F, 0x5F0F, +0x539F, 0x1A4E, 0x4B07, 0x5907, 0x466F, 0x5F0F, 0x4F1E, 0x1B52, 0x466F, +0x5F0F, 0x5F1E, 0x1A4E, 0x47EE, 0x0000, 0x5319, 0x3FC6, 0x93B2, 0x1B54, +0x2413, 0x4309, 0x3C0B, 0x4B0F, 0x590F, 0x4217, 0x1B54, 0x5217, 0x1B58, +0x4FE7, 0x0000, 0x5319, 0x5392, 0x1B58, 0x9D09, 0x2C04, 0x9292, 0x1B56, +0x1B58, 0x2BEF, 0x4030, 0xFAA6, 0x120A, 0x120B, 0x1208, 0x1209, 0x4C0B, +0x433C, 0x93D2, 0x1C7C, 0x2051, 0x4B6E, 0xB392, 0x1B9E, 0x2826, 0x4B92, +0x0004, 0x1C6E, 0x421F, 0x1C6E, 0x4F0D, 0x5B1D, 0x0008, 0x4D82, 0x1C70, +0x4F82, 0x1C6C, 0x503B, 0x000C, 0x503E, 0xFFF5, 0xC312, 0x100E, 0x5E0E, +0x4B08, 0x5E08, 0xB31F, 0x2C0C, 0x9D0F, 0x2C0A, 0x40B2, 0xA593, 0x012A, +0x40B2, 0xA500, 0x012C, 0x40B2, 0xA540, 0x0128, 0x3C0B, 0x403C, 0xFFFD, +0x3C08, 0x522B, 0x503E, 0xFFFD, 0xC312, 0x100E, 0x5E0E, 0x4B08, 0x5E08, +0x933C, 0x201D, 0x421C, 0x1C6C, 0x12B0, 0xF4A2, 0x3C07, 0x4BB9, 0x0000, +0x4A5F, 0xE05C, 0x5F0F, 0x5F82, 0x1C6C, 0x4219, 0x1C6C, 0x9219, 0x1C70, +0x2C0B, 0x980B, 0x2C09, 0x490C, 0x12B0, 0xF4A2, 0x4C4A, 0x490C, 0x12B0, +0xF790, 0x934C, 0x23E9, 0x431C, 0x4030, 0xFAAA, 0x120A, 0x120B, 0x1208, +0x1209, 0x4C0A, 0x4D0B, 0x4348, 0x3C11, 0x4849, 0x5909, 0x403C, 0x0102, +0x12B0, 0xF300, 0x4C89, 0x1A36, 0x9389, 0x1A36, 0x2002, 0x12B0, 0xFAF2, +0x4999, 0x1A36, 0x1A32, 0x5358, 0x9368, 0x2BED, 0x4348, 0x3C04, 0x40B2, +0x1A50, 0x1B52, 0x4358, 0x9348, 0x27FA, 0x43C2, 0x0070, 0x43D2, 0x0070, +0xD0F2, 0x00C0, 0x0004, 0xD0F2, 0x0010, 0x0070, 0x93C2, 0x0057, 0x3803, +0x407E, 0x0020, 0x3C02, 0x407E, 0x0010, 0x4EC2, 0x0071, 0x421C, 0x1B76, +0x421D, 0x1B78, 0x4A0E, 0x4B0F, 0x12B0, 0xF694, 0x4CC2, 0x0074, 0x108C, +0x4CC2, 0x0075, 0x42D2, 0x1C73, 0x0073, 0xC3D2, 0x0070, 0x43C2, 0x1C75, +0xD0F2, 0x00C0, 0x0000, 0x93C2, 0x0076, 0xC0F2, 0x0040, 0x0021, 0xC3D2, +0x1B5C, 0x4030, 0xFAAA, 0x120A, 0x120B, 0x1208, 0x934C, 0x2024, 0x430A, +0x430B, 0x922B, 0x2C3E, 0x4B08, 0x5808, 0x5808, 0x5808, 0x481F, 0x1A06, +0x933F, 0x2416, 0x421E, 0x1B9C, 0x5F0F, 0x5F0F, 0x5F0E, 0x90BE, 0xFF00, +0x0000, 0x2C0D, 0x481C, 0x1A08, 0x930C, 0x2402, 0x12B0, 0xF372, 0x4388, +0x1A08, 0x43B8, 0x1A06, 0x43D8, 0x1A0D, 0x531A, 0x531B, 0x3FDE, 0x430B, +0x3C01, 0x531B, 0x922B, 0x2C07, 0x4B0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x9CCF, +0x1A0B, 0x23F6, 0x922B, 0x2C0F, 0x5B0B, 0x5B0B, 0x5B0B, 0x4B1C, 0x1A08, +0x930C, 0x2402, 0x12B0, 0xF372, 0x438B, 0x1A08, 0x43BB, 0x1A06, 0x43DB, +0x1A0D, 0x431A, 0x4A0C, 0x4030, 0xFAAC, 0x434F, 0xB0F2, 0x0040, 0x0000, +0x2804, 0xC0F2, 0x0040, 0x0000, 0x435F, 0x43C2, 0x1A2A, 0x434E, 0x3C13, +0x4E4D, 0x43CD, 0x1A30, 0x43C2, 0x1A2B, 0x43C2, 0x1A2C, 0x5D0D, 0x4D1C, +0x1A32, 0x43CC, 0x0000, 0x438D, 0x1A42, 0x438D, 0x1A3A, 0x438D, 0x1A3E, +0x535E, 0x936E, 0x2BEB, 0x4382, 0x1B5A, 0x403D, 0x012C, 0x42D2, 0x0076, +0x1C78, 0x42D2, 0x0076, 0x1C78, 0x42D2, 0x0076, 0x1C78, 0xC0F2, 0x0040, +0x0002, 0xF0F2, 0x000E, 0x0072, 0x434E, 0x3C02, 0x4303, 0x535E, 0x937E, +0x23FC, 0x533D, 0x2404, 0xB0F2, 0x0040, 0x0002, 0x2FE5, 0x934F, 0x2403, +0xD0F2, 0x0040, 0x0000, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x430C, 0x421E, +0x1B8E, 0xB35E, 0x2421, 0x438A, 0x0000, 0x438A, 0x0002, 0x403B, 0xF834, +0x4A0C, 0x128B, 0x930C, 0x2402, 0x433C, 0x3C26, 0x4A0C, 0x531C, 0x128B, +0x930C, 0x2403, 0x403C, 0xFFFE, 0x3C1E, 0x4A0C, 0x532C, 0x128B, 0x930C, +0x2403, 0x403C, 0xFFFD, 0x3C16, 0x503A, 0x0003, 0x4A0C, 0x128B, 0x3C11, +0x9E82, 0x1B8C, 0x2C03, 0x403C, 0xFFFB, 0x3C0B, 0x4EBA, 0x0000, 0x4EBA, +0x0002, 0x52A2, 0x1B8E, 0x9292, 0x1B8E, 0x1B8C, 0x2C01, 0x431C, 0x413B, +0x413A, 0x4130, 0x120A, 0x531C, 0xC31C, 0x421E, 0x1A28, 0x421D, 0xE054, +0x8E0D, 0x4C0F, 0x522F, 0x9F0D, 0x280F, 0x43DE, 0x0000, 0x421F, 0x1A28, +0x5C0F, 0x522F, 0x4F82, 0x1A28, 0x4F8E, 0x0002, 0x421F, 0x1A28, 0x8C0F, +0x4F0C, 0x3C1C, 0x421F, 0xE052, 0x3C01, 0x4D0F, 0x9E0F, 0x2C15, 0x4F1D, +0x0002, 0x93CF, 0x0000, 0x23F8, 0x4D0A, 0x8F0A, 0x822A, 0x9C0A, 0x2BF3, +0x4F0A, 0x522A, 0x43DF, 0x0000, 0x4A0D, 0x5C0D, 0x4F0C, 0x12B0, 0xF9FA, +0x4A0C, 0x3C01, 0x430C, 0x413A, 0x4130, 0x120A, 0x421E, 0xE052, 0x4E0D, +0x930C, 0x2004, 0x3C2E, 0x4E0D, 0x4E1E, 0x0002, 0x921E, 0x1A28, 0x2C28, +0x4E0F, 0x522F, 0x9F0C, 0x23F6, 0x93CE, 0x0000, 0x2421, 0x4E1F, 0x0002, +0x921F, 0x1A28, 0x2C02, 0x4F0C, 0x3C01, 0x4E0C, 0x4C6A, 0x93CD, 0x0000, +0x2008, 0x934A, 0x2002, 0x4C1F, 0x0002, 0x4F8D, 0x0002, 0x4D0E, 0x3C07, +0x934A, 0x2003, 0x4C9E, 0x0002, 0x0002, 0x43CE, 0x0000, 0x929E, 0x1A28, +0x0002, 0x2002, 0x4E82, 0x1A28, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x4C0A, 0x4D0B, 0x4E08, 0x4F09, 0x4116, 0x000C, 0x403E, +0x0006, 0x403D, 0x1B8A, 0x460C, 0x12B0, 0xFA16, 0x4296, 0x1B54, 0x000C, +0x4296, 0x1B56, 0x000E, 0x4296, 0x1B58, 0x0010, 0x4A82, 0x1B8A, 0x4A0F, +0x5B0F, 0x4F82, 0x1B8C, 0x4A82, 0x1B8E, 0x9318, 0x240B, 0x9308, 0x2003, +0x43B2, 0x1B54, 0x3C02, 0x4882, 0x1B54, 0x4982, 0x1B56, 0x4382, 0x1B58, +0x430C, 0x4030, 0xFAA8, 0x120A, 0x120B, 0x1208, 0x4C0A, 0x4308, 0x430B, +0x90FA, 0x000B, 0x0000, 0x201A, 0x407D, 0x0093, 0x4A5C, 0x0002, 0x1292, +0xE000, 0x930C, 0x380F, 0x4A1B, 0x0004, 0x4B08, 0x5A18, 0x0008, 0x3C04, +0x4B2C, 0x1292, 0xE008, 0x532B, 0x980B, 0x2BFA, 0x403B, 0x8000, 0x3C05, +0x403B, 0x8007, 0x3C02, 0x403B, 0x800B, 0x903B, 0x8000, 0x2002, 0x1292, +0xE002, 0x4B0C, 0x4030, 0xFAAC, 0x434F, 0x434E, 0x3C01, 0x536E, 0x936E, +0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE03E, 0x2BF8, 0x9C8D, 0xE040, 0x2BF5, +0x936E, 0x2C02, 0x436F, 0x3C11, 0x434E, 0x3C01, 0x536E, 0x926E, 0x2C08, +0x4E4D, 0x5D0D, 0x9D1C, 0xE042, 0x2BF8, 0x9C8D, 0xE044, 0x2BF5, 0x926E, +0x2C02, 0x407F, 0x0003, 0x934F, 0x2006, 0x503C, 0xDB00, 0x903C, 0x00FF, +0x2C01, 0x435F, 0x4F4C, 0x4130, 0x120A, 0x8321, 0x4C0A, 0x430C, 0x421E, +0x1B8E, 0xB35E, 0x2413, 0x410C, 0x530C, 0x12B0, 0xF834, 0x416D, 0x930C, +0x2008, 0x410C, 0x530C, 0x12B0, 0xF834, 0x416F, 0x108F, 0x5F0D, 0x3C01, +0x433C, 0x4D8A, 0x0000, 0x3C0F, 0x9E82, 0x1B8C, 0x2C03, 0x403C, 0xFFFE, +0x3C09, 0x4EAA, 0x0000, 0x53A2, 0x1B8E, 0x9292, 0x1B8E, 0x1B8C, 0x2C01, +0x431C, 0x5321, 0x413A, 0x4130, 0x403E, 0x1A46, 0x4E6F, 0xB0FF, 0x000B, +0x1A4C, 0x2403, 0x93A2, 0x1B5E, 0x2FF6, 0x4E6F, 0xB0FF, 0x000B, 0x1A4C, +0x2405, 0x12B0, 0xFB08, 0x403C, 0x8007, 0x4130, 0x4E6F, 0x5F0F, 0x4F1F, +0x1B52, 0x4DCF, 0x0001, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4CCF, 0x0002, +0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x43CF, 0x0003, 0x4E6F, 0x5F0F, 0x40BF, +0x0003, 0x1A4E, 0x430C, 0x4130, 0x120A, 0x430F, 0x403F, 0xFDFC, 0x40B2, +0xA593, 0x012A, 0x40B2, 0xA500, 0x012C, 0x40B2, 0xA502, 0x0128, 0x43BF, +0x0000, 0xB392, 0x012C, 0x2FFD, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA510, +0x012C, 0x430A, 0x3C06, 0x403D, 0x001E, 0x434C, 0x12B0, 0xF91A, 0x531A, +0x903A, 0x0064, 0x2BF7, 0x4382, 0x0120, 0x413A, 0x4130, 0x120A, 0x120B, +0x1208, 0x4D0A, 0x4E0B, 0x407D, 0x0092, 0x1292, 0xE000, 0x930C, 0x3819, +0x930B, 0x2004, 0x4A0C, 0x1292, 0xE008, 0x3C0F, 0x4308, 0x3C08, 0x480E, +0x5E0E, 0x4B0F, 0x5E0F, 0x4F2C, 0x1292, 0xE008, 0x5318, 0x9A08, 0x2C03, +0x9038, 0x007E, 0x2BF3, 0x1292, 0xE002, 0x430C, 0x3C01, 0x433C, 0x4030, +0xFAAC, 0x433F, 0x4C5E, 0x0004, 0x934E, 0x2012, 0x43C2, 0x1C7C, 0x40B2, +0xA510, 0x012C, 0x12B0, 0xEE6E, 0x430C, 0x12B0, 0xF6CC, 0x434C, 0x12B0, +0xF99E, 0x435C, 0x12B0, 0xF95E, 0x430F, 0x3C0B, 0x935E, 0x2009, 0x43D2, +0x1C7C, 0x403C, 0x001E, 0x12B0, 0xF6CC, 0x12B0, 0xF702, 0x431F, 0x4F0C, +0x4130, 0x1209, 0x120A, 0x120B, 0x430A, 0x430B, 0x4039, 0x0020, 0x5C0C, +0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, 0x5339, 0x23F6, +0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, 0x413B, 0x413A, +0x4139, 0x4130, 0xC232, 0x4303, 0x4C0F, 0x5F0F, 0x4F82, 0x1B64, 0x4C82, +0x1B66, 0x4F82, 0x1B6E, 0x4C82, 0x1B70, 0x930C, 0x2406, 0x40F2, 0x0003, +0x1B62, 0x43E2, 0x1B6C, 0x3C04, 0x43C2, 0x1B62, 0x43C2, 0x1B6C, 0xD232, +0x430C, 0x4130, 0x120A, 0x120B, 0x430A, 0x3C11, 0x4A0B, 0x5B0B, 0x5B0B, +0x5B0B, 0x4B1C, 0x1A08, 0x930C, 0x2402, 0x12B0, 0xF372, 0x438B, 0x1A08, +0x43BB, 0x1A06, 0x43DB, 0x1A0D, 0x531A, 0x922A, 0x3BED, 0x413B, 0x413A, +0x4130, 0x40B2, 0x1B90, 0x1A26, 0x4382, 0x1B9C, 0x434E, 0x3C0C, 0x4E4F, +0x5F0F, 0x421D, 0x1A04, 0x5F0D, 0x93BD, 0x0000, 0x2003, 0x40BF, 0xFB18, +0x24E0, 0x535E, 0x907E, 0x0010, 0x2BF1, 0x430C, 0x4130, 0x434C, 0x12B0, +0xFB00, 0x12B0, 0xE848, 0x403C, 0x0800, 0x403D, 0x0007, 0x12B0, 0xF0B6, +0x12B0, 0xEE6E, 0x434C, 0x12B0, 0xF99E, 0x435C, 0x12B0, 0xF95E, 0x4030, +0xEAB6, 0x434F, 0x434E, 0x3C01, 0x536E, 0x907E, 0x0006, 0x2C08, 0x4E4D, +0x5D0D, 0x9D1C, 0xE02A, 0x2BF7, 0x9C8D, 0xE02C, 0x2BF4, 0x907E, 0x0006, +0x2C01, 0x435F, 0x4F4C, 0x4130, 0x120A, 0x4C0A, 0x403E, 0x0006, 0x4C0D, +0x403C, 0x1B8A, 0x12B0, 0xFA16, 0x4A92, 0x000C, 0x1B54, 0x4A92, 0x000E, +0x1B56, 0x4A92, 0x0010, 0x1B58, 0x430C, 0x413A, 0x4130, 0x120A, 0x4C0A, +0xC0F2, 0x0040, 0x0000, 0x12B0, 0xF1F8, 0x4A82, 0x1B84, 0x43D2, 0x1C76, +0x4382, 0x1B86, 0x43C2, 0x1C77, 0xD0F2, 0x0040, 0x0000, 0x413A, 0x4130, +0x403E, 0x0114, 0x430D, 0x403C, 0x1A46, 0x12B0, 0xFA30, 0x4382, 0x1B5E, +0x43C2, 0x1C74, 0x434E, 0x3C04, 0x40B2, 0x1A50, 0x1B52, 0x435E, 0x934E, +0x27FA, 0x4130, 0x430F, 0x9292, 0x1B8E, 0x1B8C, 0x2C02, 0x433F, 0x3C0B, +0x421E, 0x1B8E, 0x4EEC, 0x0000, 0x5392, 0x1B8E, 0x9292, 0x1B8E, 0x1B8C, +0x2C01, 0x431F, 0x4F0C, 0x4130, 0x936C, 0x2C10, 0x4C4C, 0x5C0C, 0x4C0F, +0x5C0C, 0x5C0C, 0x5F0C, 0x938C, 0x1B66, 0x2007, 0x5D0D, 0x4D8C, 0x1B64, +0x4D8C, 0x1B66, 0xC3EC, 0x1B62, 0x430C, 0x4130, 0x434F, 0x434E, 0x3C01, +0x536E, 0x926E, 0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE036, 0x2BF8, 0x9C8D, +0xE038, 0x2BF5, 0x926E, 0x2C01, 0x435F, 0x4F4C, 0x4130, 0x907C, 0x0040, +0x240E, 0x430F, 0x3C01, 0x531F, 0x922F, 0x3409, 0x4F0E, 0x5E0E, 0x5E0E, +0x5E0E, 0x9CCE, 0x1A0B, 0x23F6, 0x43DE, 0x1A0D, 0x431C, 0x4130, 0x907C, +0x0040, 0x240E, 0x430F, 0x3C01, 0x531F, 0x922F, 0x3409, 0x4F0E, 0x5E0E, +0x5E0E, 0x5E0E, 0x9CCE, 0x1A0B, 0x23F6, 0x43CE, 0x1A0D, 0x431C, 0x4130, +0x4D4D, 0x5D0D, 0x5D0C, 0x4C1E, 0x0008, 0x4E82, 0x1B8A, 0x4E6F, 0x5F0E, +0x4E82, 0x1B8C, 0x421F, 0x1B8A, 0x522F, 0x4F82, 0x1B8E, 0x430C, 0x4130, +0x936C, 0x2C0D, 0x4C4C, 0x5C0C, 0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x5D0D, +0x4D8C, 0x1B64, 0x4D8C, 0x1B66, 0x43EC, 0x1B62, 0x430C, 0x4130, 0x429C, +0x1B8E, 0x0000, 0x421F, 0x1B8C, 0x821F, 0x1B8E, 0x531F, 0x4F8D, 0x0000, +0x421F, 0x1B8C, 0x522F, 0x4F82, 0x1B8E, 0x431C, 0x4130, 0x936C, 0x2C0C, +0x4C4C, 0x5C0C, 0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x43DC, 0x1B62, 0x438C, +0x1B64, 0x438C, 0x1B66, 0x430C, 0x4130, 0x425F, 0x1A46, 0x5F0F, 0x4F1F, +0x1B52, 0x4F5E, 0x0001, 0x425F, 0x1A46, 0x5F0F, 0x4F1F, 0x1B52, 0x4CCF, +0x0001, 0x4E4C, 0x4130, 0x936C, 0x2C0C, 0x4C4C, 0x5C0C, 0x4C0F, 0x5C0C, +0x5C0C, 0x5F0C, 0x43CC, 0x1B62, 0x438C, 0x1B64, 0x438C, 0x1B66, 0x430C, +0x4130, 0x8321, 0x4C0D, 0x433C, 0x3C01, 0x533D, 0x930D, 0x2406, 0x410C, +0x530C, 0x12B0, 0xF834, 0x933C, 0x23F7, 0x5321, 0x4130, 0x425F, 0x1A47, +0x5F0F, 0x438F, 0x1A48, 0x425F, 0x1A46, 0x5F0F, 0x4C8F, 0x1A4E, 0x425F, +0x1A46, 0xD3DF, 0x1A4C, 0x4130, 0x4C1F, 0x0002, 0x4F0E, 0x8D0E, 0x903E, +0x0005, 0x2806, 0x4D8C, 0x0002, 0x43CD, 0x0000, 0x4F8D, 0x0002, 0x4130, +0x120A, 0x4C0A, 0x3C04, 0x4DEA, 0x0000, 0x531A, 0x531D, 0x4E0F, 0x533E, +0x930F, 0x23F8, 0x413A, 0x4130, 0x120A, 0x4C0A, 0x3C03, 0x4DCA, 0x0000, +0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, 0x4130, 0x4C0F, 0x5D0F, +0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, 0x4130, 0x120D, 0x120C, +0x422D, 0x410C, 0x530C, 0x12B0, 0xEF40, 0x5221, 0x4130, 0x3C02, 0xC3E2, +0x0002, 0xB3E2, 0x0002, 0x2FFB, 0xD3E2, 0x0000, 0x1300, 0x430F, 0x3C02, +0x4303, 0x531F, 0x933F, 0x23FC, 0x4382, 0x0120, 0x4130, 0x3C04, 0x4DFC, +0x0000, 0x531C, 0x533E, 0x930E, 0x23FA, 0x430C, 0x4130, 0x4135, 0x4134, +0x4137, 0x4136, 0x4139, 0x4138, 0x413B, 0x413A, 0x4130, 0x124C, 0x431D, +0x410C, 0x530C, 0x12B0, 0xEF40, 0x5321, 0x4130, 0x120C, 0x432D, 0x410C, +0x530C, 0x12B0, 0xEF40, 0x5321, 0x4130, 0x120C, 0x4EFC, 0x0000, 0x531C, +0x831D, 0x23FB, 0x413C, 0x4130, 0x40B2, 0x0032, 0x1B5E, 0xD0F2, 0x0080, +0x0002, 0x4130, 0x434C, 0x12B0, 0xF95E, 0x435C, 0x12B0, 0xF99E, 0x3FFF, +0x40B2, 0x5A80, 0x0120, 0x4130, 0x4030, 0xF80C, 0x4030, 0xFB1A, 0x4030, +0xFA16, 0x4030, 0xFB0C, 0x1300, 0x3FFF, 0xCCCC, 0x0016, 0xEBC2, 0xE0B2, +0xED96, 0xFA6C, 0xE08A, 0x000F, 0x2112, 0xFEDF, +}; + +const uint32_t UifBiosCoreImage_address[] = +{ +0x0000E000, 0x0000FDD6, 0x0000FDEA, 0x0000FDF2, 0x0000FDF6, +}; +const uint32_t UifBiosCoreImage_length_of_sections[] = +{ +0x00000D8E, 0x00000002, 0x00000002, 0x00000001, 0x00000005, +}; +const uint32_t UifBiosCoreImage_sections = 0x00000005; +const uint32_t UifBiosCoreImage_termination = 0x00000000; +const uint32_t UifBiosCoreImage_start = 0x0000E000; +const uint32_t UifBiosCoreImage_finish = 0x0000FE00; +const uint32_t UifBiosCoreImage_length = 0x00001E00; + +#define UIFBIOSCOREIMAGE_TERMINATION 0x00000000 +#define UIFBIOSCOREIMAGE_START 0x0000E000 +#define UIFBIOSCOREIMAGE_FINISH 0x0000FE00 +#define UIFBIOSCOREIMAGE_LENGTH 0x00001E00 +#define UIFBIOSCOREIMAGE_SECTIONS 0x00000005 diff --git a/Bios/include/UifHal.h b/Bios/include/UifHal.h index 269d068..0be5695 100644 --- a/Bios/include/UifHal.h +++ b/Bios/include/UifHal.h @@ -1,2623 +1,718 @@ -/* - * UifHal.h - * - * Copyright (C) 2007 - 2011 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. - */ - -/* http://srecord.sourceforge.net/ */ -const uint16_t halImage[] = -{ -0xD75E, 0x45DE, 0x2918, 0xC48C, 0x8205, 0x0004, 0x0000, 0x0000, 0x0000, -0xDA36, 0x0001, 0xD92C, 0x0002, 0xD15A, 0x0003, 0xCE0E, 0x0004, 0xCBBE, -0x0005, 0x9C78, 0x0006, 0xD994, 0x0007, 0xAAE4, 0x0008, 0xD126, 0x0009, -0xCEEE, 0x000A, 0xBABA, 0x000B, 0xAF0E, 0x000C, 0x95DC, 0x000D, 0xD4A4, -0x000E, 0xD8CC, 0x000F, 0xD5E8, 0x0010, 0xB8CA, 0x0011, 0x6676, 0x0012, -0x4F68, 0x0013, 0x5F3A, 0x0014, 0xAD68, 0x0015, 0xA18C, 0x0016, 0x9942, -0x0017, 0x9F8E, 0x0018, 0xA474, 0x0019, 0xC50C, 0x001A, 0xC5FC, 0x001B, -0x8222, 0x001C, 0xC060, 0x001D, 0xBE36, 0x001E, 0xA566, 0x001F, 0x3838, -0x0020, 0x2F0E, 0x0021, 0xC960, 0x0022, 0xC946, 0x0023, 0x8D64, 0x0024, -0x8D5C, 0x0025, 0x910C, 0x0026, 0x5CB6, 0x0027, 0x54EC, 0x0028, 0x7102, -0x0029, 0xAA04, 0x002A, 0xB178, 0x002B, 0x9248, 0x002C, 0x9B6C, 0x002D, -0xA658, 0x002E, 0xBEC2, 0x002F, 0x7BA2, 0x0030, 0xB972, 0x0031, 0xB610, -0x0032, 0x8FCC, 0x0033, 0x33D4, 0x0034, 0xC916, 0x0035, 0x8D52, 0x0036, -0x8BF4, 0x0037, 0xA748, 0x0038, 0xC588, 0x0039, 0x6CF6, 0x003A, 0x40B0, -0x003B, 0x68C8, 0x003C, 0xBFD6, 0x003D, 0xB3D4, 0x003E, 0xB30C, 0x003F, -0xB81C, 0x0040, 0x74AC, 0x0041, 0xA380, 0x0042, 0xB0AC, 0x0043, 0x8944, -0x0044, 0x485A, 0x0045, 0x9A5A, 0x0046, 0x9D84, 0x0047, 0x79EE, 0x0048, -0x523E, 0x0049, 0x5790, 0x004A, 0xAE3C, 0x004B, 0xCAE6, 0x004C, 0xBA1A, -0x004D, 0x7EFE, 0x004E, 0xA920, 0x004F, 0x6F06, 0xAFDE, 0x46F0, 0x406E, -0x3F54, 0x3F34, 0x3EFC, 0x3DC2, 0xD8C4, 0xD1EA, 0xD1BA, 0x4762, 0x8678, -0x4534, 0x452C, 0x4526, 0x4520, 0x4516, 0x450E, 0x44CA, 0x448E, 0xDA10, -0x5555, 0x5555, 0x1711, 0x1711, 0x1B16, 0x1711, 0x0108, 0x0402, 0x0030, -0x0031, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, -0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, -0x5A80, 0x0000, 0x0000, 0x015C, 0x5A80, 0x0000, 0x0000, 0x015C, 0x5A80, -0x0000, 0x0000, 0x015C, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, -0x0000, 0x015C, 0x5A80, 0x0000, 0x0000, 0x015C, 0x5A83, 0x0000, 0x0000, -0x0120, 0x5A80, 0x0120, 0x5A80, 0x015C, 0x5A80, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0301, 0x0705, 0x0281, -0x0000, 0x0000, 0xFF04, 0x0FFF, 0x0600, 0x0001, 0x0000, 0x0180, 0x0000, -0x0000, 0x0000, 0x0000, 0x0109, 0x0503, 0x8107, 0x0002, 0x0000, 0x0400, -0xFFFF, 0x000F, 0x0106, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, -0x0A00, 0x0A02, 0x020A, 0x0A0A, 0x0A02, 0x0008, 0x0808, 0x0800, 0x020A, -0x080A, 0x0800, 0x0008, 0x0108, 0x0109, 0x0009, 0x0008, 0x0308, 0x030B, -0x020B, 0x020A, 0x010A, 0x0009, 0x0008, 0x0308, 0x020B, 0x020A, 0x010A, -0x0009, 0x0308, 0x020B, 0xFF0A, 0x40B2, 0x5A80, 0x0120, 0xC232, 0x40F2, -0x0087, 0x0057, 0x45C2, 0x0056, 0x46C2, 0x0057, 0x43C2, 0x0058, 0xEA0A, -0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x40B2, 0x5A80, -0x0120, 0xC232, 0xD072, 0x0040, 0x4032, 0x0040, 0x40F2, 0x0080, 0x0052, -0x43C2, 0x0050, 0x45C2, 0x0051, 0x40F2, 0x0080, 0x0053, 0x43C2, 0x0054, -0xEA0A, 0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x0001, -0x0A00, 0x401E, 0x8B60, 0x8D8C, 0x8F8E, 0x8890, 0x9291, 0x9493, 0x9695, -0x7574, 0x7776, 0x9897, 0x9A99, 0x9C9B, 0x9E9D, 0x289F, 0x2A29, 0x2C2B, -0x2E2D, 0x302F, 0x8A8A, 0xA8A8, 0xB5B0, 0xBDBC, 0xBFBE, 0xC1C0, 0xD5D4, -0xD6D6, 0x8ED8, 0x318F, 0xFF01, 0x1204, 0x1205, 0x1206, 0x1207, 0x1208, -0x1209, 0x120A, 0x120B, 0x120C, 0x120D, 0x120E, 0x120F, 0x403C, 0x139A, -0x403D, 0x017A, 0x12B0, 0xD346, 0x403C, 0x128E, 0x403D, 0x2876, 0x403E, -0x00A1, 0x12B0, 0xDA32, 0x413F, 0x413E, 0x413D, 0x413C, 0x413B, 0x413A, -0x4139, 0x4138, 0x4137, 0x4136, 0x4135, 0x4134, 0x4030, 0xC48C, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8221, 0xB2D2, -0x2780, 0x1100, 0x2404, 0x40B2, 0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x403A, 0x150C, 0x403B, -0x1504, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0x4259, 0x277E, 0x4946, -0xE376, 0x4218, 0x2784, 0xF6C8, 0x0000, 0xD9C8, 0x0000, 0xD232, 0x4B27, -0xEAE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B27, 0xEAE7, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B27, 0xEAE7, 0x0000, 0x4C81, 0x0000, 0x4D81, 0x0002, -0x4304, 0x4305, 0x430C, 0x430D, 0x430E, 0x403F, 0x8000, 0xBC81, 0x0000, -0x2019, 0xBD81, 0x0002, 0x240D, 0x3C15, 0xB31C, 0x2BF7, 0xBC81, 0x0000, -0x2003, 0xBD81, 0x0002, 0x240A, 0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, -0x0010, 0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, -0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, -0xF6C8, 0x0000, 0x5404, 0x6505, 0x4217, 0x2782, 0xB2D7, 0x2781, 0x0000, -0x2002, 0x4347, 0x3C01, 0x4357, 0xD704, 0xD9C8, 0x0000, 0xD232, 0x4B27, -0xEAE7, 0x0000, 0xC312, 0x100F, 0x100E, 0x100D, 0x100C, 0x4C07, 0xDD07, -0xDE07, 0xDF07, 0x9307, 0x23C2, 0xB2D2, 0x2780, 0x1100, 0x241E, 0x40B2, -0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, -0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, 0x0000, 0xD232, 0x4B2F, -0xEAEF, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4B2F, 0xEAEF, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, -0x01F0, 0x4B2F, 0xEAEF, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0x440C, 0x450D, 0x430E, 0x430F, -0x5221, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x120D, 0x120C, 0xB2D2, 0x2780, 0x1100, 0x2404, 0x40B2, -0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x403A, 0x150C, 0x403B, 0x1504, 0x4B2F, 0xEAEF, 0x0000, -0xC232, 0x4303, 0x4258, 0x277E, 0x4846, 0xE376, 0x4219, 0x2784, 0xF6C9, -0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0x40B2, 0x2845, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, -0xC232, 0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, -0xC232, 0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, -0x0000, 0x4304, 0x4305, 0x430C, 0x403D, 0x8000, 0xBC81, 0x0000, 0x2019, -0xBD81, 0x0002, 0x240D, 0x3C15, 0xB31C, 0x2BF7, 0xBC81, 0x0000, 0x2003, -0xBD81, 0x0002, 0x240A, 0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, 0x0010, -0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0xF6C9, -0x0000, 0x5404, 0x6505, 0x4217, 0x2782, 0xB2D7, 0x2781, 0x0000, 0x2002, -0x4347, 0x3C01, 0x4357, 0xD704, 0xD8C9, 0x0000, 0xD232, 0x4B27, 0xEAE7, -0x0000, 0xC312, 0x100D, 0x100C, 0x4C07, 0xDD07, 0x9307, 0x23C6, 0xB2D2, -0x2780, 0x1100, 0x241E, 0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, 0xC232, 0x4303, 0xF6C9, 0x0000, -0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0x40B2, 0x2845, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, 0xC232, -0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, -0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4B2F, 0xEAEF, 0x0000, 0xC232, -0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, -0x440C, 0x450D, 0x3F13, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x120D, 0x120C, 0xB2D2, 0x2780, 0x1100, 0x2404, 0x40B2, -0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x403F, 0x150C, 0x403E, 0x1504, 0x4E2B, 0xEFEB, 0x0000, -0xC232, 0x4303, 0x425A, 0x277E, 0x421B, 0x2784, 0xCACB, 0x0000, 0xDACB, -0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, -0x0010, 0x01E8, 0xD392, 0x01E8, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, -0xCACB, 0x0000, 0xDACB, 0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0xD0B2, -0x0010, 0x01E8, 0xD392, 0x01E8, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, -0xCACB, 0x0000, 0xDACB, 0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0x430C, -0x430D, 0x4304, 0x4235, 0xB481, 0x0000, 0x2019, 0xB581, 0x0002, 0x240D, -0x3C15, 0xB314, 0x2BF7, 0xB481, 0x0000, 0x2003, 0xB581, 0x0002, 0x240A, -0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, -0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4E28, 0xEFE8, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, 0x5C0C, 0x6D0D, -0x4218, 0x2782, 0xB2D8, 0x2781, 0x0000, 0x2002, 0x4348, 0x3C01, 0x4358, -0xD80C, 0xDACB, 0x0000, 0xD232, 0x4E28, 0xEFE8, 0x0000, 0xC312, 0x1005, -0x1004, 0x4408, 0xD508, 0x9308, 0x23C6, 0xB2D2, 0x2780, 0x1100, 0x241E, -0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4E27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, 0xDACB, 0x0000, 0xD232, -0x4E27, 0xEFE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, -0xDACB, 0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, -0xDACB, 0x0000, 0xD232, 0x4E2B, 0xEFEB, 0x0000, 0x4C0F, 0xC312, 0x100D, -0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, 0xF03D, -0x000F, 0x3E21, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x120C, 0x8031, 0x0034, 0x4381, 0x0006, 0x4381, 0x000C, 0x4381, -0x000A, 0x40B1, 0x0BB8, 0x0004, 0x403A, 0x1360, 0x403B, 0x1358, 0x4038, -0x1354, 0x4074, 0x0042, 0x4075, 0x0021, 0x4037, 0x2401, 0x4079, 0x00C8, -0x4076, 0x0082, 0xB31C, 0x29A9, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD8BC, -0x2404, 0x403C, 0xFFFE, 0x4030, 0x33CC, 0x403C, 0x142C, 0x12B0, 0xD8BC, -0x2404, 0x403C, 0xFFFD, 0x4030, 0x33CC, 0x403C, 0x1432, 0x12B0, 0xD8BC, -0x2404, 0x403C, 0xFFFC, 0x4030, 0x33CC, 0x403C, 0x1428, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2404, 0x403C, 0xFFFB, 0x4030, 0x33CC, 0x403C, -0x1424, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2404, 0x403C, 0xFFFA, -0x4030, 0x33CC, 0x403C, 0x1430, 0x12B0, 0xD8BC, 0x2403, 0x403C, 0xFFF9, -0x3DFD, 0x403C, 0x142E, 0x12B0, 0xD8E4, 0x2003, 0x403C, 0xFFF8, 0x3DF5, -0x403C, 0x1436, 0x12B0, 0xD8E4, 0x27F8, 0x403C, 0x1434, 0x12B0, 0xD8E4, -0x27F3, 0x464C, 0x12A8, 0x403C, 0x4030, 0x12B0, 0x8E8E, 0x403C, 0x0C04, -0x12B0, 0x8E8E, 0x12B0, 0x8F56, 0x435C, 0x12AA, 0x4381, 0x0000, 0x412F, -0x5F0F, 0x4F81, 0x0002, 0x421F, 0x1432, 0x511F, 0x0002, 0x4F81, 0x0008, -0x12B0, 0x8E8A, 0x12B0, 0x8F96, 0x411C, 0x0008, 0x12B0, 0x8F1A, 0x411F, -0x0002, 0x4C8F, 0x13C4, 0x12B0, 0xD8EC, 0x5391, 0x0000, 0x90B1, 0x0030, -0x0000, 0x3BE2, 0x12B0, 0x8EEE, 0x403C, 0x4582, 0x12B0, 0x8F26, 0x4C82, -0x1438, 0x12B0, 0x8EE6, 0x403C, 0x4682, 0x12B0, 0x8F26, 0x4C82, 0x143A, -0x12B0, 0x8EE6, 0x403C, 0x4982, 0x12B0, 0x8F26, 0x4C82, 0x143C, 0x12B0, -0x8EE6, 0x403C, 0x4882, 0x12B0, 0x8F26, 0x4C82, 0x143E, 0x12B0, 0x8EE6, -0x403C, 0x4A82, 0x12B0, 0x8F26, 0x4C82, 0x1440, 0x12B0, 0x8EE6, 0x403C, -0x4B82, 0x12B0, 0x8F26, 0x4C82, 0x1442, 0x12B0, 0x8EE6, 0x403C, 0x4C82, -0x12B0, 0x8F26, 0x4C82, 0x1444, 0x12B0, 0x8EDA, 0x12B0, 0x8EB8, 0x403C, -0x0128, 0x12B0, 0x8F1A, 0x4C82, 0x1446, 0x12B0, 0x8EDA, 0x454C, 0x12A8, -0x12B0, 0x8EB8, 0x403C, 0x012A, 0x12B0, 0x8F1A, 0x4C82, 0x1448, 0x12B0, -0x8F02, 0x4C82, 0x144A, 0x12B0, 0xD8EC, 0xE0B2, 0x3300, 0x1446, 0xE0B2, -0x3300, 0x1448, 0xE0B2, 0x3300, 0x144A, 0x12B0, 0x8F5E, 0x403C, 0xA544, -0x12B0, 0x8EC8, 0x12B0, 0x8FA6, 0x12B0, 0x8EFC, 0x4C81, 0x0000, 0x12B0, -0xD8EC, 0x91E2, 0x142E, 0x2404, 0x12B0, 0x8FA6, 0x12B0, 0x8EC4, 0x410C, -0x503C, 0x000E, 0x403E, 0x0007, 0x12B0, 0xD494, 0x4291, 0x1428, 0x000E, -0x4291, 0x1424, 0x0010, 0x4291, 0x1430, 0x0012, 0x4291, 0x142E, 0x0014, -0x4291, 0x1436, 0x0018, 0x4291, 0x1434, 0x001A, 0x410C, 0x503C, 0x000E, -0x12B0, 0xA096, 0x12B0, 0x8EEE, 0x403C, 0x4032, 0x12B0, 0xD6D6, 0x430C, -0x12B0, 0x8EA8, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, 0x240B, 0x9382, -0x1380, 0x2408, 0x407C, 0x0090, 0x12A8, 0x403C, 0x0088, 0x12AB, 0x431C, -0x12AB, 0x12B0, 0x8F42, 0x12B0, 0x8E94, 0x12B0, 0xD8A8, 0x53B1, 0x0004, -0x421E, 0x1432, 0x4E0F, 0x503F, 0x0020, 0x9F0C, 0x2805, 0x4E0F, 0x503F, -0x0026, 0x9C0F, 0x2C03, 0x9381, 0x0004, 0x23ED, 0x4E0C, 0x12B0, 0xABBC, -0x3C68, 0x410C, 0x503C, 0x000A, 0x12B0, 0xD8D4, 0x4C81, 0x0006, 0x12B0, -0x8F96, 0x411C, 0x0002, 0x12B0, 0x8FBC, 0x411C, 0x000A, 0x12B0, 0x8E8E, -0x53A1, 0x0002, 0x9191, 0x0008, 0x0002, 0x2C03, 0x9381, 0x0006, 0x27E6, -0x12B0, 0xD8EC, 0x411F, 0x0002, 0x821F, 0x1432, 0x503F, 0xFFA0, 0xC312, -0x100F, 0x4F81, 0x0000, 0x12B0, 0x8EEE, 0x403C, 0x4036, 0x12B0, 0xD6D6, -0x412C, 0x12B0, 0xD6D6, 0x12B0, 0xD5A2, 0x435C, 0x12AA, 0x12B0, 0x8EE6, -0x403C, 0x4035, 0x12B0, 0xD6D6, 0x421C, 0x1428, 0x12B0, 0x8EA8, 0x412E, -0x5E0E, 0x5E82, 0x1428, 0x6382, 0x142A, 0x412E, 0x8E82, 0x1424, 0x7382, -0x1426, 0x12B0, 0x8F42, 0x503C, 0x0028, 0x12B0, 0x8E94, 0x40B1, 0x0BB8, -0x0004, 0x12B0, 0xD8A8, 0x53B1, 0x0004, 0x421F, 0x1432, 0x503F, 0x005C, -0x9F0C, 0x2403, 0x9381, 0x0004, 0x23F3, 0x421C, 0x1432, 0x12B0, 0xABBC, -0x9381, 0x0004, 0x2003, 0x40B1, 0xFFF7, 0x0006, 0x421F, 0x1424, 0xD21F, -0x1426, 0x930F, 0x2424, 0x9381, 0x0006, 0x2021, 0x9381, 0x0004, 0x241E, -0x421F, 0x1432, 0x503F, 0x0060, 0x4F81, 0x0002, 0x421C, 0x1424, 0x421D, -0x1426, 0x5C0C, 0x6D0D, 0x421E, 0x142C, 0x930D, 0x2003, 0x9E0C, 0x2C01, -0x4C0E, 0x5F0E, 0x4E81, 0x0008, 0x12B0, 0x8E8A, 0x494C, 0x12A8, 0x403C, -0x2408, 0x12AB, 0x3F81, 0xB3A1, 0x0034, 0x2C03, 0x9391, 0x0006, 0x2452, -0x410C, 0x503C, 0x001C, 0x403E, 0x2796, 0x423D, 0x12B0, 0xD454, 0x410F, -0x503F, 0x0024, 0x120F, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x001E, -0x4214, 0x1112, 0x1294, 0x000E, 0x403C, 0x0003, 0x1292, 0x1190, 0x410C, -0x503C, 0x0026, 0x421F, 0x1112, 0x129F, 0x0010, 0x403C, 0x1438, 0x12B0, -0xA096, 0x12B0, 0x8E8A, 0x12B0, 0x8F8A, 0x403C, 0x0128, 0x12B0, 0x8FBC, -0x421C, 0x1446, 0x12B0, 0x8EC8, 0x12B0, 0x8F5E, 0x421C, 0x1448, 0x12B0, -0x8EC8, 0x12B0, 0x8F9C, 0x12B0, 0x8EFC, 0x4C44, 0x12B0, 0xD8EC, 0x5321, -0x94C2, 0x144A, 0x2404, 0x12B0, 0x8F9C, 0x12B0, 0x8EC4, 0xB3A1, 0x0034, -0x2806, 0x430C, 0x421F, 0x1112, 0x129F, 0x0008, 0x3C0F, 0x9391, 0x0006, -0x2009, 0x407C, 0x0091, 0x421F, 0x1112, 0x129F, 0x0012, 0x4381, 0x0006, -0x3C03, 0x40B1, 0xFFF6, 0x0006, 0x411C, 0x0006, 0x5031, 0x0036, 0x4030, -0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, -0x120C, 0x8031, 0x0042, 0x4381, 0x0006, 0x4381, 0x000C, 0x4381, 0x000A, -0x40B1, 0x0BB8, 0x0004, 0x4037, 0x1356, 0x403A, 0x1360, 0x403B, 0x1358, -0x4038, 0x1354, 0x4075, 0x0021, 0x4079, 0x00C8, 0x4076, 0x0082, 0x4074, -0x0088, 0xB31C, 0x2931, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD94C, 0x2403, -0x403C, 0xFFFE, 0x3DFF, 0x403C, 0x1456, 0x12B0, 0xD94C, 0x2403, 0x403C, -0xFFFD, 0x3DF7, 0x403C, 0x145C, 0x12B0, 0xD94C, 0x2403, 0x403C, 0xFFFC, -0x3DEF, 0x403C, 0x1452, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFFB, 0x3DE4, 0x403C, 0x144C, 0x421F, 0x1112, 0x129F, 0x0018, -0x930C, 0x2403, 0x403C, 0xFFFA, 0x3DD9, 0x403C, 0x145A, 0x12B0, 0xD94C, -0x2403, 0x403C, 0xFFF9, 0x3DD1, 0x403C, 0x1458, 0x12B0, 0xD924, 0x2003, -0x403C, 0xFFF8, 0x3DC9, 0x403C, 0x1460, 0x12B0, 0xD924, 0x27F8, 0x403C, -0x145E, 0x12B0, 0xD924, 0x27F3, 0x12B0, 0x5A32, 0x403C, 0x0560, 0x12B0, -0x5A9C, 0x4E82, 0x1462, 0x4F82, 0x1464, 0x12B0, 0x5A32, 0x403C, 0x0660, -0x12B0, 0x5A7E, 0x4E82, 0x1466, 0x4F82, 0x1468, 0x12B0, 0x5A32, 0x403C, -0x0960, 0x12B0, 0x5A9C, 0x4E82, 0x146A, 0x4F82, 0x146C, 0x12B0, 0x5A32, -0x403C, 0x0860, 0x12B0, 0x5A7E, 0x4E82, 0x146E, 0x4F82, 0x1470, 0x12B0, -0x5A32, 0x403C, 0x0A60, 0x12B0, 0x5A9C, 0x4E82, 0x1472, 0x4F82, 0x1474, -0x12B0, 0x5A32, 0x403C, 0x0B60, 0x12B0, 0x5A7E, 0x4E82, 0x1476, 0x4F82, -0x1478, 0x12B0, 0x5A32, 0x403C, 0x0C60, 0x12B0, 0x5A9C, 0x4E82, 0x147A, -0x4F82, 0x147C, 0x12B0, 0x5A42, 0x12B0, 0x5A24, 0x403C, 0x0128, 0x12B0, -0x5A4A, 0x4C82, 0x147E, 0x12B0, 0x5B48, 0x12B0, 0x5A24, 0x403C, 0x012A, -0x12B0, 0x5A4A, 0x4C82, 0x1480, 0x12B0, 0x5BC2, 0x4C82, 0x1482, 0x12B0, -0x5B38, 0xE0B2, 0x3300, 0x147E, 0xE0B2, 0x3300, 0x1480, 0xE0B2, 0x3300, -0x1482, 0x12B0, 0x5A5C, 0x403C, 0x012A, 0x12B0, 0x5C46, 0x403C, 0xA544, -0x12B0, 0x5B32, 0x12B0, 0x5B48, 0x12B0, 0x5C60, 0x12B0, 0x5A24, 0x12B0, -0x5A2A, 0x421C, 0x1458, 0x12B0, 0x5B32, 0x12B0, 0x5BC2, 0x4C81, 0x0000, -0x12B0, 0x5B38, 0x91E2, 0x1458, 0x2408, 0x12B0, 0x5A5C, 0x12B0, 0x5A2A, -0x421C, 0x1458, 0x12B0, 0x5B26, 0x410C, 0x503C, 0x0016, 0x403E, 0x000E, -0x12B0, 0xD494, 0x4291, 0x1452, 0x0016, 0x4291, 0x1454, 0x0018, 0x4291, -0x144C, 0x001A, 0x4291, 0x144E, 0x001C, 0x4291, 0x145A, 0x001E, 0x4381, -0x0020, 0x4291, 0x1458, 0x0022, 0x4381, 0x0024, 0x4291, 0x1460, 0x002A, -0x4381, 0x002C, 0x4291, 0x145E, 0x002E, 0x4381, 0x0030, 0x410C, 0x503C, -0x0016, 0x12B0, 0x9702, 0x12B0, 0x5AE2, 0x460C, 0x12B0, 0x5A56, 0x430C, -0x12B0, 0x5A66, 0x4291, 0x145C, 0x0000, 0x12B0, 0x5B76, 0x494C, 0x12A8, -0x403C, 0x0401, 0x12AB, 0x454C, 0x12A8, 0x407C, 0x00A8, 0x12A8, 0x12B0, -0x5AFA, 0x503E, 0x0022, 0x430F, 0x930D, 0x2002, 0x9E0C, 0x2809, 0x421E, -0x145C, 0x503E, 0x002C, 0x9D0F, 0x2803, 0x2005, 0x9C0E, 0x2C03, 0x9381, -0x0004, 0x23EB, 0x421F, 0x144C, 0xD21F, 0x144E, 0x930F, 0x2492, 0x9381, -0x0006, 0x208F, 0x9381, 0x0004, 0x248C, 0x421F, 0x145C, 0x503F, 0x006C, -0x4F81, 0x0008, 0x421C, 0x144C, 0x421D, 0x144E, 0x5C0C, 0x6D0D, 0x421E, -0x1456, 0x930D, 0x2003, 0x9E0C, 0x2C01, 0x4C0E, 0x5F0E, 0x4E81, 0x0002, -0x421F, 0x145C, 0x503F, 0x0068, 0x12B0, 0x5B72, 0x12B0, 0x5A42, 0x407C, -0x0048, 0x12A8, 0x423C, 0x12AB, 0x3C13, 0x410C, 0x503C, 0x000A, 0x12B0, -0xD944, 0x4C81, 0x0006, 0x12B0, 0x5A24, 0x411C, 0x0008, 0x12B0, 0x5C46, -0x411C, 0x000A, 0x12B0, 0x5B6C, 0x53A1, 0x0008, 0x9191, 0x0002, 0x0008, -0x2C03, 0x9381, 0x0006, 0x27E6, 0x12B0, 0x5B38, 0x411F, 0x0008, 0x821F, -0x145C, 0x503F, 0xFF94, 0xC312, 0x100F, 0x4F81, 0x0002, 0x12B0, 0x5AE2, -0x403C, 0x0086, 0x12B0, 0x5A56, 0x411C, 0x0002, 0x12B0, 0x5A66, 0x421C, -0x1452, 0x421D, 0x1454, 0x12B0, 0x5B3E, 0xD03C, 0x0085, 0x4C81, 0x0000, -0x12B0, 0x5AE2, 0x412C, 0x12B0, 0x5A56, 0x421C, 0x1452, 0x12B0, 0x5A66, -0x411E, 0x0002, 0x5E0E, 0x5E82, 0x1452, 0x6382, 0x1454, 0x411E, 0x0002, -0x8E82, 0x144C, 0x7382, 0x144E, 0x421F, 0x145C, 0x503F, 0x002E, 0x12B0, -0x5B72, 0x407C, 0x00A8, 0x12A8, 0x40B1, 0x0BB8, 0x0004, 0x12B0, 0x5AFA, -0x503E, 0x0068, 0x9E0C, 0x2002, 0x930D, 0x276C, 0x9381, 0x0004, 0x23F5, -0x3F68, 0xB3A1, 0x0042, 0x2819, 0x410C, 0x503C, 0x000E, 0x403E, 0x279E, -0x12B0, 0xD586, 0x120F, 0x12B0, 0xD298, 0x12B0, 0x5BC8, 0x5321, 0x91E2, -0x1482, 0x2402, 0x12B0, 0x5B16, 0x421C, 0x1450, 0x421F, 0x1112, 0x129F, -0x0008, 0x3C21, 0x9391, 0x0006, 0x2009, 0x407C, 0x0091, 0x421F, 0x1112, -0x129F, 0x0012, 0x4381, 0x0006, 0x3C15, 0x410C, 0x503C, 0x000E, 0x403E, -0x27A6, 0x12B0, 0xD586, 0x120F, 0x12B0, 0xD298, 0x12B0, 0x5BC8, 0x5321, -0x91E2, 0x1482, 0x2402, 0x12B0, 0x5B16, 0x40B1, 0xFFF6, 0x0006, 0x411C, -0x0006, 0x5031, 0x0044, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x120C, 0x8031, 0x0032, 0x4381, 0x0004, -0x4381, 0x000A, 0x4381, 0x0008, 0x40B1, 0x0BB8, 0x0000, 0x403A, 0x1360, -0x403B, 0x1358, 0x4038, 0x1354, 0x4074, 0x0021, 0x4037, 0x2401, 0x4075, -0x0042, 0x4079, 0x0082, 0x4076, 0x00C8, 0xB31C, 0x2926, 0x410C, 0x503C, -0x000A, 0x12B0, 0x80B0, 0x2403, 0x403C, 0xFFFE, 0x3DFA, 0x403C, 0x13A4, -0x12B0, 0x80B0, 0x2403, 0x403C, 0xFFFD, 0x3DF2, 0x403C, 0x13AA, 0x12B0, -0x80B0, 0x2403, 0x403C, 0xFFFC, 0x3DEA, 0x403C, 0x13A0, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3DDF, 0x403C, 0x139A, -0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, 0x3DD4, -0x403C, 0x13A8, 0x12B0, 0x80B0, 0x2403, 0x403C, 0xFFF9, 0x3DCC, 0x403C, -0x13A6, 0x12B0, 0x80A0, 0x2003, 0x403C, 0xFFF8, 0x3DC4, 0x403C, 0x13AE, -0x12B0, 0x80A0, 0x27F8, 0x403C, 0x13AC, 0x12B0, 0x80A0, 0x27F3, 0x12B0, -0xD314, 0x403C, 0x4582, 0x12B0, 0x8100, 0x4C82, 0x13B0, 0x12B0, 0xD310, -0x403C, 0x4682, 0x12B0, 0x8100, 0x4C82, 0x13B2, 0x12B0, 0xD310, 0x403C, -0x4982, 0x12B0, 0x8100, 0x4C82, 0x13B4, 0x12B0, 0xD310, 0x403C, 0x4882, -0x12B0, 0x8100, 0x4C82, 0x13B6, 0x12B0, 0xD310, 0x403C, 0x4A82, 0x12B0, -0x8100, 0x4C82, 0x13B8, 0x12B0, 0xD310, 0x403C, 0x4B82, 0x12B0, 0x8100, -0x4C82, 0x13BA, 0x12B0, 0xD310, 0x403C, 0x4C82, 0x12B0, 0x8100, 0x4C82, -0x13BC, 0x12B0, 0x812C, 0x12B0, 0x809A, 0x403C, 0x0128, 0x12B0, 0x80B8, -0x4C82, 0x13BE, 0x12B0, 0x8174, 0x12B0, 0x8130, 0x12B0, 0x809A, 0x403C, -0x012A, 0x12B0, 0x80B8, 0x4C82, 0x13C0, 0x12B0, 0x815E, 0x4C82, 0x13C2, -0x12B0, 0x8174, 0xE0B2, 0x3300, 0x13BE, 0xE0B2, 0x3300, 0x13C0, 0xE0B2, -0x3300, 0x13C2, 0x12B0, 0x8130, 0x12B0, 0xD646, 0x12B0, 0x809A, 0x403C, -0x012A, 0x12B0, 0x8184, 0x403C, 0xA544, 0x12B0, 0x8146, 0x12B0, 0x8154, -0x12B0, 0x814E, 0x12B0, 0x815E, 0x4C81, 0x0002, 0x12B0, 0x8174, 0x91D2, -0x0002, 0x13A6, 0x2406, 0x12B0, 0x8154, 0xD03C, 0x0040, 0x12B0, 0x8146, -0x410C, 0x503C, 0x0014, 0x403E, 0x0007, 0x12B0, 0xD494, 0x4291, 0x13A0, -0x0014, 0x4291, 0x139A, 0x0016, 0x4291, 0x13A8, 0x0018, 0x4291, 0x13A6, -0x001A, 0x4291, 0x13AE, 0x001E, 0x4291, 0x13AC, 0x0020, 0x410C, 0x503C, -0x0014, 0x12B0, 0xB49C, 0x12B0, 0xD314, 0x403C, 0x4032, 0x12B0, 0x80F8, -0x430C, 0x12B0, 0x8114, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, 0x240B, -0x9382, 0x1380, 0x2408, 0x407C, 0x0090, 0x12A8, 0x403C, 0x0088, 0x12AB, -0x431C, 0x12AB, 0x12B0, 0xD2AC, 0x12AB, 0x9382, 0x1506, 0x2402, 0x12B0, -0x80DC, 0x12B0, 0x80E4, 0x12B0, 0x811C, 0x435C, 0x12B0, 0x8200, 0x403C, -0x0401, 0x12AB, 0x444C, 0x12A8, 0x407C, 0x00A8, 0x12A8, 0x12B0, 0x80C4, -0x503F, 0x0020, 0x9F0C, 0x2806, 0x421F, 0x13AA, 0x503F, 0x0026, 0x9C0F, -0x2C03, 0x9381, 0x0000, 0x23F1, 0x421F, 0x139A, 0xD21F, 0x139C, 0x930F, -0x2498, 0x9381, 0x0004, 0x2095, 0x9381, 0x0000, 0x2492, 0x421F, 0x13AA, -0x503F, 0x0060, 0x4F81, 0x0006, 0x421C, 0x139A, 0x421D, 0x139C, 0x5C0C, -0x6D0D, 0x421E, 0x13A4, 0x930D, 0x2003, 0x9E0C, 0x2C01, 0x4C0E, 0x5F0E, -0x4E81, 0x0002, 0x12B0, 0xD2AC, 0x503C, 0x005C, 0x12AB, 0x9382, 0x1506, -0x2402, 0x12B0, 0x80DC, 0x12B0, 0x80E4, 0x12B0, 0x812C, 0x464C, 0x12A8, -0x403C, 0x2408, 0x12AB, 0x3C14, 0x410C, 0x523C, 0x12B0, 0x80A8, 0x4C81, -0x0004, 0x12B0, 0x809A, 0x411C, 0x0006, 0x12B0, 0x8184, 0x411C, 0x0008, -0x12B0, 0x814E, 0x434C, 0x12AA, 0x53A1, 0x0006, 0x9191, 0x0002, 0x0006, -0x2C03, 0x9381, 0x0004, 0x27E5, 0x12B0, 0x8174, 0x411F, 0x0006, 0x821F, -0x13AA, 0x503F, 0xFFA0, 0xC312, 0x100F, 0x4F81, 0x0002, 0x12B0, 0xD314, -0x403C, 0x4036, 0x12B0, 0x80F8, 0x411C, 0x0002, 0x12B0, 0x80F8, 0x12B0, -0xD36A, 0x12B0, 0xD310, 0x403C, 0x4035, 0x12B0, 0x80F8, 0x421C, 0x13A0, -0x12B0, 0x8114, 0x411E, 0x0002, 0x5E0E, 0x5E82, 0x13A0, 0x6382, 0x13A2, -0x411E, 0x0002, 0x8E82, 0x139A, 0x7382, 0x139C, 0x12B0, 0xD2AC, 0x503C, -0x0028, 0x12AB, 0x9382, 0x1506, 0x2402, 0x12B0, 0x80DC, 0x12B0, 0x80E4, -0x12B0, 0x811C, 0x407C, 0x00A8, 0x12A8, 0x40B1, 0x0BB8, 0x0000, 0x12B0, -0x80C4, 0x503F, 0x005C, 0x9F0C, 0x2766, 0x9381, 0x0000, 0x23F7, 0x3F62, -0xB3A1, 0x0032, 0x2819, 0x410C, 0x503C, 0x000C, 0x403E, 0x2786, 0x12B0, -0xD5DA, 0x120F, 0x12B0, 0xD2D4, 0x12B0, 0x818C, 0x5321, 0x91E2, 0x13C2, -0x2402, 0x12B0, 0x8164, 0x421C, 0x139E, 0x421F, 0x1112, 0x129F, 0x0008, -0x3C21, 0x9391, 0x0004, 0x2009, 0x407C, 0x0091, 0x421F, 0x1112, 0x129F, -0x0012, 0x4381, 0x0004, 0x3C15, 0x410C, 0x503C, 0x000C, 0x403E, 0x278E, -0x12B0, 0xD5DA, 0x120F, 0x12B0, 0xD2D4, 0x12B0, 0x818C, 0x5321, 0x91E2, -0x13C2, 0x2402, 0x12B0, 0x8164, 0x40B1, 0xFFF6, 0x0004, 0x411C, 0x0004, -0x5031, 0x0034, 0x4030, 0xD41E, 0x120A, 0x120B, 0x425E, 0x2780, 0x421A, -0x2784, 0x403F, 0x150C, 0x403B, 0x1504, 0x934C, 0x204F, 0x9392, 0x14FE, -0x201E, 0x4B2D, 0xD3DD, 0x0000, 0xDECA, 0x0000, 0xB2B2, 0x136C, 0x4B2B, -0x2803, 0xDFEB, 0x0000, 0x3C02, 0xCFEB, 0x0000, 0x431C, 0x12B0, 0xD1BA, -0xC2DA, 0x277E, 0x0000, 0xC0F2, 0x0020, 0x0029, 0x431C, 0x12B0, 0xD1BA, -0x436C, 0x12B0, 0x8678, 0x3DDF, 0x425D, 0x277E, 0x525D, 0x277F, 0x5E4D, -0xDDCA, 0x0000, 0xB2B2, 0x136C, 0x4B2E, 0x2803, 0xCFEE, 0x0000, 0x3C02, -0xDFEE, 0x0000, 0xD0F2, 0x0040, 0x0029, 0xC0F2, 0x0020, 0x0029, 0x431C, -0x12B0, 0xD1BA, 0x93A2, 0x14FE, 0x2003, 0x407C, 0x0003, 0x3FDE, 0x9392, -0x14FE, 0x2004, 0xD2DA, 0x277E, 0x0000, 0x3C03, 0x4B2F, 0xC3DF, 0x0000, -0x403C, 0x0005, 0x12B0, 0xD1BA, 0x3FD1, 0x9392, 0x14FE, 0x201C, 0x4B2D, -0xD3DD, 0x0000, 0xDECA, 0x0000, 0xB2B2, 0x136C, 0x4B2B, 0x2803, 0xDFEB, -0x0000, 0x3C02, 0xCFEB, 0x0000, 0x431C, 0x12B0, 0xD1BA, 0xC2DA, 0x277E, -0x0000, 0xC0F2, 0x0020, 0x0029, 0x431C, 0x12B0, 0xD1BA, 0x434C, 0x3FB0, -0x425D, 0x277E, 0x525D, 0x277F, 0x5E4D, 0xDDCA, 0x0000, 0xB2B2, 0x136C, -0x4B2E, 0x2803, 0xCFEE, 0x0000, 0x3C02, 0xDFEE, 0x0000, 0xD0F2, 0x0040, -0x0029, 0xC0F2, 0x0020, 0x0029, 0x431C, 0x12B0, 0xD1BA, 0x93A2, 0x14FE, -0x23B6, 0x435C, 0x3F92, 0x12B0, 0x3C92, 0x430C, 0x4130, 0x434C, 0x1292, -0x1360, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x2401, 0x1292, 0x1358, -0x407C, 0x0021, 0x1292, 0x1354, 0x435C, 0x1292, 0x1360, 0x407C, 0x0028, -0x1292, 0x1354, 0x430C, 0x4210, 0x1358, 0x4130, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x4C0A, 0x4038, 0x1354, 0x407C, 0x00C8, 0x12A8, 0x4039, -0x1358, 0x403C, 0x3401, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, -0x12A9, 0x4036, 0x1360, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x4A0C, 0x822C, -0x12A9, 0x9382, 0x1506, 0x2404, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x434C, -0x12A6, 0x407C, 0x0021, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A6, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x435C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, 0x12A9, 0x434C, 0x12A6, -0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A6, 0x434C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x4A0C, 0x832C, 0x12A9, 0x4030, 0xD424, -0x120A, 0x120B, 0x1208, 0x4C0A, 0x407C, 0x0082, 0x1292, 0x1354, 0x4038, -0x1360, 0x435C, 0x12A8, 0x403C, 0x4030, 0x1292, 0x1358, 0x434C, 0x12A8, -0x435C, 0x12A8, 0x4A0C, 0x832C, 0x1292, 0x1358, 0x434C, 0x12A8, 0x435C, -0x12A8, 0x434C, 0x12A8, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x407C, 0x0021, -0x1292, 0x1354, 0x430C, 0x1292, 0x1358, 0x4030, 0xD428, 0x930C, 0x2002, -0x430F, 0x3C01, 0x431F, 0x4F82, 0x1500, 0x9392, 0x14FE, 0x2008, 0x930F, -0x2403, 0x403F, 0x6418, 0x3C0A, 0x403F, 0x654A, 0x3C07, 0x930F, 0x2403, -0x403F, 0x937E, 0x3C02, 0x403F, 0x941A, 0x4F82, 0x1364, 0x4130, 0x930C, -0x2405, 0x403F, 0x3DFE, 0x403E, 0x3DCA, 0x3C04, 0x403F, 0x3EA6, 0x403E, -0x3DFC, 0x4E82, 0x1366, 0x4F82, 0x1362, 0x4130, 0x430F, 0xB3A2, 0x136C, -0x2805, 0x930C, 0x2003, 0x4382, 0x14FE, 0x3C11, 0xB2A2, 0x136C, 0x2805, -0x931C, 0x2003, 0x4392, 0x14FE, 0x3C09, 0xB3A2, 0x136C, 0x2805, 0x932C, -0x2003, 0x43A2, 0x14FE, 0x3C01, 0x433F, 0xB2B2, 0x136C, 0x2804, 0x403E, -0x0032, 0x436D, 0x3C03, 0x403E, 0x001D, 0x426D, 0x4DC2, 0x150C, 0x4E82, -0x1504, 0x9392, 0x14FE, 0x2032, 0x40B2, 0x7434, 0x134E, 0x40B2, 0x72E0, -0x1350, 0x40B2, 0xDA2E, 0x1352, 0x40B2, 0x6AE4, 0x1354, 0x40B2, 0x7838, -0x1356, 0x40B2, 0x7D52, 0x1358, 0x40B2, 0x2D2A, 0x135A, 0x40B2, 0x2B56, -0x135C, 0x40B2, 0x2968, 0x135E, 0x40B2, 0xB6C0, 0x1360, 0x9382, 0x1500, -0x2003, 0x403E, 0x654A, 0x3C02, 0x403E, 0x6418, 0x403D, 0xC6DC, 0x40B2, -0x0006, 0x01EE, 0x40B2, 0x0006, 0x01F6, 0x40B2, 0x284B, 0x01F2, 0x3C2A, -0x40B2, 0xCA04, 0x134E, 0x40B2, 0xCEC6, 0x1350, 0x40B2, 0x9824, 0x1352, -0x40B2, 0xC40A, 0x1354, 0x40B2, 0xC1FA, 0x1356, 0x40B2, 0xB76E, 0x1358, -0x40B2, 0x850C, 0x135A, 0x40B2, 0xAC92, 0x135C, 0x40B2, 0x94B2, 0x135E, -0x40B2, 0xD4C4, 0x1360, 0x9382, 0x1500, 0x2003, 0x403E, 0x941A, 0x3C02, -0x403E, 0x937E, 0x403D, 0xC7A6, 0x42A2, 0x01F6, 0x4D82, 0x1368, 0x4E82, -0x1364, 0x4F0C, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0xB2B2, 0x136C, -0x2807, 0x429C, 0x1502, 0x0000, 0x429D, 0x1502, 0x0000, 0x3C0F, 0xB2F2, -0x001D, 0x2804, 0x431C, 0x12B0, 0x4620, 0x3C01, 0x430C, 0x4C8A, 0x0000, -0x430C, 0x12B0, 0x4620, 0x4C8B, 0x0000, 0x430C, 0x413B, 0x413A, 0x4130, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, -0x0020, 0x4381, 0x000C, 0x4381, 0x000E, 0x4038, 0x1358, 0x4039, 0x1354, -0x9382, 0x138E, 0x2412, 0x407C, 0x00F4, 0x12B0, 0xD3AC, 0x4C0B, 0x407C, -0x00F4, 0x12A9, 0xC21B, 0x138E, 0xD21B, 0x1392, 0x4B0C, 0x12A8, 0x403C, -0x0014, 0x1292, 0x275A, 0x4037, 0x135C, 0x421F, 0x1382, 0xD21F, 0x1384, -0x930F, 0x2419, 0x407C, 0x0054, 0x12A9, 0x12B0, 0xBFBC, 0x4C0A, 0x4D0B, -0x407C, 0x0054, 0x12A9, 0xC21A, 0x1382, 0xC21B, 0x1384, 0xD21A, 0x138A, -0xD21B, 0x138C, 0x4A0C, 0x4B0D, 0x12A7, 0x403C, 0x0014, 0x1292, 0x275A, -0x407C, 0x00D0, 0x12B0, 0xD3AC, 0x4074, 0x0028, 0x934C, 0x3882, 0x444C, -0x12B0, 0xD3AC, 0xB03C, 0x0020, 0x2C7C, 0x407C, 0x00B0, 0x12A9, 0x431C, -0x12B0, 0xBFB8, 0x4C81, 0x001C, 0x4D81, 0x001E, 0x403C, 0x0003, 0x12B0, -0xBFB8, 0x4C81, 0x0018, 0x4D81, 0x001A, 0x403C, 0x0005, 0x12B0, 0xBFB8, -0x4C81, 0x0014, 0x4D81, 0x0016, 0x403C, 0x0007, 0x12B0, 0xBFB8, 0x4C81, -0x0010, 0x4D81, 0x0012, 0x403C, 0x0081, 0x12B0, 0xBFB8, 0x4C0A, 0x4D0B, -0x432C, 0x12B0, 0xBFB8, 0x422C, 0x430D, 0x12A7, 0x433C, 0x403D, 0x000F, -0x12A7, 0x403C, 0x0006, 0x12B0, 0xBF66, 0x403C, 0x0080, 0x12B0, 0xBF66, -0x403C, 0x0088, 0x430D, 0x12A7, 0x403C, 0x000E, 0x430D, 0x12A7, 0x12B0, -0xBF7E, 0x403C, 0x0007, 0x12A8, 0x4306, 0x407C, 0x00D0, 0x12B0, 0xD3AC, -0x5316, 0x934C, 0x3803, 0x9036, 0x0BB8, 0x3BF6, 0x407C, 0x00B0, 0x12A9, -0x12B0, 0xBFBC, 0x411C, 0x001C, 0x411D, 0x001E, 0x12A7, 0x432C, 0x430D, -0x12A7, 0x411C, 0x0018, 0x411D, 0x001A, 0x12A7, 0x422C, 0x430D, 0x12A7, -0x411C, 0x0014, 0x411D, 0x0016, 0x12A7, 0x403C, 0x0006, 0x430D, 0x12A7, -0x411C, 0x0010, 0x411D, 0x0012, 0x12A7, 0x403C, 0x0080, 0x430D, 0x12A7, -0x4A0C, 0x4B0D, 0x12A7, 0x12B0, 0xBF7E, 0x403C, 0x0005, 0x12A8, 0x4077, -0x00C8, 0x12B0, 0xBF5C, 0x444C, 0x12A9, 0x403A, 0x0032, 0x430B, 0x430C, -0x12A8, 0x533A, 0x633B, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C04, 0x4A0F, -0xDB0F, 0x930F, 0x23F3, 0x12B0, 0xBF7E, 0x403C, 0x0007, 0x12A8, 0x403C, -0x0006, 0x12A8, 0x12B0, 0xBF5C, 0x444C, 0x12B0, 0xD3AC, 0x4036, 0x1360, -0xB23C, 0x2C06, 0x3C18, 0x12B0, 0xBFB0, 0x444C, 0x12B0, 0xD3AC, 0xB23C, -0x2811, 0x411C, 0x000C, 0x411D, 0x000E, 0x4C0E, 0x4D0F, 0x531E, 0x630F, -0x4E81, 0x000C, 0x4F81, 0x000E, 0x930D, 0x2003, 0x903C, 0x7530, 0x2BE8, -0x444C, 0x12A9, 0x434C, 0x12A6, 0x430C, 0x12A8, 0xB03C, 0x0100, 0x2002, -0x4345, 0x3C01, 0x4355, 0x435C, 0x12A6, 0x531A, 0x630B, 0x9345, 0x2005, -0x930B, 0x2003, 0x903A, 0x2710, 0x2BEB, 0x12B0, 0xBFA6, 0x407C, 0x0021, -0x12A9, 0x4035, 0x135A, 0x430C, 0x430D, 0x12A5, 0x4C0A, 0x4D0B, 0x444C, -0x12B0, 0xD3AC, 0xB03C, 0x0020, 0x2803, 0x503A, 0xFFFE, 0x3C02, 0x503A, -0xFFFC, 0x633B, 0x903A, 0xFFFE, 0x2010, 0x930B, 0x200E, 0x12B0, 0xBF84, -0x403C, 0xFFFE, 0x12B0, 0xD3A0, 0x4C0B, 0x12B0, 0xBF4C, 0x4B81, 0x0006, -0x4381, 0x0008, 0x3C04, 0x4A81, 0x0006, 0x4B81, 0x0008, 0x12B0, 0xBF7E, -0x403C, 0x000E, 0x12A8, 0x444C, 0x12B0, 0xD3AC, 0x410C, 0x532C, 0x421F, -0x1112, 0x129F, 0x0016, 0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x12B0, -0xBF84, 0x411C, 0x0002, 0x12B0, 0xD3A0, 0x4C81, 0x0004, 0x12B0, 0xBF4C, -0x415F, 0x0004, 0xDF81, 0x0000, 0x434C, 0x12A6, 0x474C, 0x12A9, 0x403C, -0x0500, 0x12A8, 0x12B0, 0xBF88, 0x411C, 0x0002, 0x12B0, 0xD9E4, 0x407C, -0x00A1, 0x12A9, 0x412C, 0xD03C, 0x0080, 0x12A8, 0x434C, 0x12A6, 0x12B0, -0xBF9C, 0x435C, 0x12A6, 0x12B0, 0xBF54, 0x4074, 0x0082, 0x444C, 0x12B0, -0xBF96, 0x403C, 0x0260, 0x12B0, 0xBFC2, 0x9382, 0x1398, 0x2403, 0x403C, -0x0FF6, 0x3C02, 0x403C, 0x018C, 0x12B0, 0xBF70, 0x9382, 0x1398, 0x2402, -0x12B0, 0xBF9C, 0x12B0, 0xBF92, 0x430C, 0x12A8, 0x4C0A, 0x12B0, 0xBFB0, -0x430C, 0x12A8, 0x12B0, 0xBF54, 0x12B0, 0xBF4C, 0x9382, 0x1398, 0x2002, -0x12B0, 0xBF9C, 0x12B0, 0xBF8E, 0x4A81, 0x000A, 0x434C, 0x12A6, 0x444C, -0x12B0, 0xBF96, 0x440C, 0x12B0, 0xBFC2, 0x4A0C, 0xF03C, 0xFFEF, 0x12B0, -0xBF70, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0021, 0x12A9, 0x430C, -0x12B0, 0xD9E4, 0x12B0, 0xBFA6, 0x12B0, 0xBF8E, 0x423D, 0x410C, 0x522C, -0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, 0x0020, 0x4030, 0xD41E, -0x934C, 0x240E, 0x9392, 0x14FE, 0x2006, 0x421F, 0x2784, 0xD2DF, 0x277E, -0x0000, 0x3C04, 0x421F, 0x1504, 0xC3DF, 0x0000, 0x3DD2, 0x9392, 0x14FE, -0x2006, 0x421F, 0x2784, 0xC2DF, 0x277E, 0x0000, 0x3FF6, 0x421F, 0x1504, -0xD3DF, 0x0000, 0x3FF1, 0x934C, 0x2410, 0x9392, 0x14FE, 0x2006, 0x421F, -0x2784, 0xD2DF, 0x2780, 0x0000, 0x3C06, 0xC0F2, 0x0020, 0x0029, 0xD0F2, -0x0040, 0x0029, 0x3DB2, 0x9392, 0x14FE, 0x2006, 0x421F, 0x2784, 0xC2DF, -0x2780, 0x0000, 0x3FF6, 0xC0F2, 0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, -0x3FEF, 0x421F, 0x1504, 0x4F6C, 0x4130, 0x421F, 0x1504, 0x4CCF, 0x0000, -0x4130, 0x425C, 0x0029, 0x4130, 0x4CC2, 0x0029, 0x4130, 0x421F, 0x2784, -0x4F6C, 0x4130, 0x421F, 0x2784, 0x3FF0, 0x934C, 0x2407, 0xD2E2, 0x001D, -0xD0F2, 0x0010, 0x001D, 0x434E, 0x3C06, 0xC0F2, 0x0010, 0x001D, 0xC2E2, -0x001D, 0x435E, 0x4EC2, 0x150E, 0x4130, 0x403E, 0xBAEC, 0x403F, 0x0041, -0x43D2, 0x150D, 0xD0F2, 0x0080, 0x002A, 0xD0F2, 0x0080, 0x002E, 0x40B2, -0x0028, 0x0172, 0x40B2, 0x0090, 0x0162, 0x40B2, 0x0114, 0x0160, 0x3C02, -0x533E, 0x633F, 0x93C2, 0x150D, 0x2404, 0x4E0D, 0xDF0D, 0x930D, 0x23F7, -0x4382, 0x0162, 0xC0F2, 0x0080, 0x002E, 0xC0F2, 0x0080, 0x002A, 0x4130, -0x4C0F, 0xDD0F, 0x930F, 0x2410, 0x12B0, 0x455E, 0x93C2, 0x150E, 0x2404, -0xD0F2, 0x0020, 0x001D, 0x3C03, 0xD0F2, 0x0040, 0x001D, 0x403C, 0x000A, -0x4030, 0xD1BA, 0xF0F2, 0x009F, 0x001D, 0x4130, 0x53D2, 0x1512, 0x90F2, -0x000A, 0x1512, 0x201A, 0x43C2, 0x1512, 0x4382, 0x0160, 0xC3A2, 0x01A0, -0x40F2, 0x0012, 0x0080, 0xD3A2, 0x01A0, 0xD392, 0x01A0, 0xB392, 0x01A4, -0x2BFD, 0x90B2, 0x0FFF, 0x0140, 0x3404, 0x40B2, 0x0114, 0x0160, 0x1300, -0x43C2, 0x150D, 0x1300, 0x4C0F, 0x430C, 0x922F, 0x2C14, 0x5F0F, 0x4F1C, -0x0140, 0x5F1C, 0x0148, 0x5F1C, 0x0150, 0x5F1C, 0x0158, 0x4F1E, 0x2776, -0x12B0, 0xD08A, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF37D, 0x12B0, 0xD0D8, -0x4130, 0x120A, 0x120B, 0x1208, 0x4C0A, 0x9A82, 0x1508, 0x242C, 0x4A0C, -0x430D, 0x12B0, 0xBC0C, 0x403E, 0x41A3, 0x403F, 0xC4D6, 0x12B0, 0x87E6, -0x4C0E, 0x4D0F, 0x403C, 0xF000, 0x403D, 0x457F, 0x12B0, 0x87E2, 0x12B0, -0xD712, 0x4C08, 0x5038, 0x0055, 0x4A0C, 0x403E, 0x0014, 0x12B0, 0xD036, -0x8C08, 0x9038, 0x1000, 0x3802, 0x4038, 0x0FFF, 0x9308, 0x3401, 0x4308, -0x4882, 0x01C8, 0xD3A2, 0x01C0, 0x4A82, 0x1508, 0x3C1A, 0x431C, 0x12B0, -0x4620, 0x4C0B, 0x4A0F, 0x503F, 0x000A, 0x9B0F, 0x2C07, 0x90B2, 0x0FFF, -0x01C8, 0x2C0D, 0x5392, 0x01C8, 0x3C0A, 0x4A0F, 0x503F, 0xFFF6, 0x9F0B, -0x2C05, 0x9382, 0x01C8, 0x2402, 0x53B2, 0x01C8, 0x4030, 0xD428, 0x120A, -0x4C0A, 0x930A, 0x2428, 0x93C2, 0x132E, 0x2419, 0xC2F2, 0x0031, 0xC0F2, -0x0020, 0x0029, 0x4A82, 0x1502, 0x4A0C, 0x503C, 0x0032, 0x12B0, 0x4652, -0x421F, 0x1504, 0xD2FF, 0x0000, 0x431C, 0x12B0, 0xD1BA, 0xD0F2, 0x0020, -0x0029, 0x43C2, 0x132E, 0x3C16, 0x4A82, 0x1502, 0x4A0C, 0x503C, 0x0032, -0x12B0, 0x4652, 0x421F, 0x1504, 0xD2FF, 0x0000, 0x3C0A, 0x421F, 0x1504, -0xC2FF, 0x0000, 0x1292, 0x2756, 0x4382, 0x1502, 0x43D2, 0x132E, 0x430C, -0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x430C, 0x12B0, 0x4620, 0x4C0A, -0x431C, 0x12B0, 0x4620, 0x4C0B, 0x403C, 0x0003, 0x12B0, 0x4620, 0x4C08, -0x903A, 0x06A4, 0x3813, 0x421F, 0x150A, 0x503F, 0xFFF6, 0x9F0A, 0x3806, -0x421F, 0x150A, 0x503F, 0x000A, 0x9A0F, 0x3402, 0x4A82, 0x150A, 0x421C, -0x150A, 0x12B0, 0x4652, 0x3C07, 0x9382, 0x1502, 0x2422, 0x421C, 0x1502, -0x12B0, 0x46F0, 0x9382, 0x1502, 0x241B, 0x93C2, 0x150F, 0x2418, 0x8B08, -0x9038, 0x0097, 0x3814, 0x53D2, 0x1511, 0x90F2, 0x000B, 0x1511, 0x2810, -0x43D2, 0x1510, 0x12B0, 0xD8C4, 0xC2F2, 0x001D, 0x4382, 0x1502, 0x435C, -0x421F, 0x1112, 0x129F, 0x0020, 0x3C02, 0x43C2, 0x1511, 0x430C, 0x4030, -0xD428, 0x9392, 0x14FE, 0x2016, 0x421F, 0x2784, 0xD2DF, 0x2780, 0x0000, -0x421F, 0x1504, 0xD2DF, 0x150C, 0x0000, 0x431C, 0x12B0, 0xD1BA, 0x421F, -0x2784, 0xC2DF, 0x277E, 0x0000, 0xD0F2, 0x0020, 0x0029, 0x3C0F, 0x421F, -0x1504, 0xD2DF, 0x150C, 0x0000, 0xD0F2, 0x0020, 0x0029, 0x431C, 0x12B0, -0xD1BA, 0x421F, 0x1504, 0xD3DF, 0x0000, 0x403C, 0x0005, 0x4030, 0xD1BA, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x120C, -0x8031, 0x003A, 0x4381, 0x000C, 0x4381, 0x0016, 0x4381, 0x0018, 0x4381, -0x000A, 0x4381, 0x0008, 0x430A, 0x403B, 0x1360, 0x4038, 0x1358, 0x4039, -0x1354, 0x4036, 0x1112, 0xB31C, 0x28B3, 0x410C, 0x503C, 0x000C, 0x12B0, -0xD768, 0x2403, 0x403C, 0xFFFE, 0x3DA5, 0x432C, 0x462F, 0x129F, 0x001A, -0x410C, 0x503C, 0x0006, 0x12B0, 0xD768, 0x2403, 0x403C, 0xFFFC, 0x3D98, -0x410C, 0x503C, 0x0016, 0x462F, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, -0xFFFB, 0x3D8D, 0x403C, 0x1484, 0x462F, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFFA, 0x3D83, 0x410C, 0x523C, 0x12B0, 0xD768, 0x2403, 0x403C, -0xFFF9, 0x3D7B, 0x410C, 0x503C, 0x000A, 0x462F, 0x129F, 0x0016, 0x933C, -0x2003, 0x403C, 0xFFF8, 0x3D70, 0x422C, 0x462F, 0x129F, 0x001A, 0x933C, -0x27F7, 0x4191, 0x0016, 0x001A, 0x4191, 0x0018, 0x001C, 0x4291, 0x1484, -0x001E, 0x4291, 0x1486, 0x0020, 0x4191, 0x0008, 0x0022, 0x4381, 0x0024, -0x4191, 0x000A, 0x0026, 0x4381, 0x0028, 0x410C, 0x503C, 0x001A, 0x12B0, -0xC388, 0x407C, 0x0028, 0x12A9, 0x430C, 0x12A8, 0x12B0, 0xC966, 0x403C, -0x0080, 0x12A8, 0x434C, 0x12B0, 0xD9BC, 0x403C, 0x1400, 0x12B0, 0xD0FE, -0x411C, 0x0006, 0x12A8, 0x12B0, 0xD106, 0x403C, 0x4303, 0x12A8, 0x434C, -0x12AB, 0x12B0, 0xD430, 0x12B0, 0xD9BC, 0x403C, 0x0401, 0x12A8, 0x407C, -0x0021, 0x12A9, 0x407C, 0x00A8, 0x12A9, 0x4381, 0x0002, 0x4381, 0x0004, -0x4304, 0x4305, 0x403C, 0x0005, 0x12B0, 0xCDD8, 0x2004, 0x90B1, 0xABAD, -0x0004, 0x2405, 0x9305, 0x2003, 0x9034, 0x012C, 0x2BF2, 0x9305, 0x2003, -0x9034, 0x012C, 0x2802, 0x403A, 0xFFF7, 0xB392, 0x1484, 0x280E, 0x53B2, -0x1484, 0x63B2, 0x1486, 0x4392, 0x149A, 0x3C07, 0x470C, 0x128F, 0x4C0A, -0x53B2, 0x1484, 0x63B2, 0x1486, 0x4624, 0x4037, 0x149C, 0x421F, 0x1484, -0xD21F, 0x1486, 0x930F, 0x2426, 0x930A, 0x2024, 0x441F, 0x0016, 0xB392, -0x1484, 0x2BE9, 0x403C, 0x149E, 0x128F, 0x4C0A, 0x4304, 0x4305, 0x47A1, -0x0000, 0x4217, 0x149E, 0x407C, 0x0086, 0x12A9, 0x430C, 0x12A8, 0x5314, -0x6305, 0x23DA, 0x9034, 0x0BB8, 0x2FD7, 0xB32C, 0x2BF6, 0x403C, 0x0011, -0x12A8, 0x412C, 0x12A8, 0x470C, 0x12A8, 0x3FCD, 0x9382, 0x149A, 0x242D, -0x930A, 0x202B, 0x421F, 0x1484, 0xD21F, 0x1486, 0x930F, 0x2025, 0xB3A1, -0x003A, 0x28AC, 0x470C, 0x1294, 0x0016, 0x4C0A, 0x4304, 0x4305, 0x4727, -0x407C, 0x0086, 0x12A9, 0x430C, 0x12A8, 0x5314, 0x6305, 0x2003, 0x9034, -0x0BB8, 0x2803, 0x403C, 0xFFBF, 0x3CA9, 0xB32C, 0x2BF3, 0x403C, 0x0011, -0x12A8, 0x470C, 0x12A8, 0x403C, 0xAAAA, 0x12A8, 0x4382, 0x149A, 0x3C03, -0xB3A1, 0x003A, 0x287F, 0x4304, 0x4305, 0x4381, 0x0002, 0x4381, 0x0004, -0x403C, 0x000A, 0x12B0, 0xCDD8, 0x2004, 0x90B1, 0xCAFE, 0x0004, 0x2405, -0x9305, 0x2003, 0x9034, 0x012C, 0x2BF2, 0x9305, 0x2003, 0x9034, 0x012C, -0x2851, 0x403A, 0xFFBF, 0x410C, 0x503C, 0x000E, 0x403E, 0x27AE, 0x12B0, -0xD540, 0x120F, 0x12B0, 0xD578, 0x4627, 0x1297, 0x000E, 0x12B0, 0xD25C, -0x12B0, 0xC966, 0x403C, 0x0A60, 0x12B0, 0xD0F2, 0x5321, 0x12B0, 0xD37C, -0x12B0, 0xD38E, 0x4034, 0x0501, 0x9382, 0x1398, 0x2404, 0x12B0, 0xD9BE, -0x440C, 0x12A8, 0x4077, 0x0042, 0x12B0, 0xC974, 0x41A2, 0x148A, 0x4582, -0x148C, 0x12B0, 0xC966, 0x403C, 0x0B60, 0x12B0, 0xD0F2, 0x12B0, 0xD37C, -0x12B0, 0xD38E, 0x9382, 0x1398, 0x2404, 0x12B0, 0xD9BE, 0x440C, 0x12A8, -0x12B0, 0xC974, 0x412F, 0x4F82, 0x148E, 0x4582, 0x1490, 0xD50F, 0x930F, -0x2409, 0x90B2, 0xFFFE, 0x148A, 0x2003, 0x9382, 0x148C, 0x2402, 0x403A, -0xFFF6, 0x410C, 0x503C, 0x000E, 0x403E, 0x27B6, 0x12B0, 0xD540, 0x120F, -0x12B0, 0xD578, 0x462B, 0x129B, 0x000E, 0x12B0, 0xD25C, 0x421C, 0x1488, -0x462F, 0x129F, 0x0008, 0x3C18, 0x931A, 0x2006, 0x407C, 0x0091, 0x1294, -0x0012, 0x430A, 0x3C11, 0x410C, 0x503C, 0x000E, 0x403E, 0x27BE, 0x12B0, -0xD540, 0x120F, 0x12B0, 0xD578, 0x1294, 0x000E, 0x12B0, 0xD25C, 0x403A, -0xFFF6, 0x5321, 0x4A0C, 0x5031, 0x003C, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x407A, 0x0006, 0x403B, 0x150C, 0x4038, 0x1504, -0x4039, 0x0190, 0xD0F2, 0x0040, 0x0029, 0x4216, 0x2758, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, -0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0x537A, 0x23CE, 0xC0F2, 0x0040, -0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xD0F2, -0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, -0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, -0xC0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, -0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, -0x0000, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, -0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xCBEF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, -0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xCBEF, 0x0000, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xCBEF, 0x0000, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, -0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x490C, -0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0x403C, 0x000A, 0x1292, -0x275A, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x0010, 0x410C, 0x503C, 0x0006, 0x403E, 0x0005, -0x12B0, 0xD494, 0x4381, 0x0004, 0x410C, 0x532C, 0x421F, 0x1112, 0x129F, -0x0016, 0x930C, 0x2403, 0x403C, 0xFFD3, 0x3D49, 0x410C, 0x421F, 0x1112, -0x129F, 0x0016, 0x933C, 0x2003, 0x403C, 0xFFD2, 0x3D3F, 0x403A, 0x1360, -0x435C, 0x12AA, 0x403B, 0x1354, 0x4074, 0x0028, 0x444C, 0x12AB, 0x4038, -0x1358, 0x430C, 0x12A8, 0x4079, 0x00C8, 0xB03C, 0x0200, 0x2C1D, 0x407C, -0x0088, 0x12AB, 0x407C, 0x0034, 0x1292, 0x1356, 0x12B0, 0xD5FA, 0x444C, -0x12AB, 0x4036, 0x0032, 0x3C02, 0x9306, 0x240A, 0x430C, 0x12A8, 0x5336, -0x933C, 0x27F9, 0xB03C, 0x0200, 0x2BF6, 0x9306, 0x2003, 0x403C, 0xFFD4, -0x3D0F, 0xB32C, 0x2807, 0x434C, 0x12AA, 0x12B0, 0xCAB0, 0x435C, 0x12AA, -0x3C02, 0x12B0, 0xCAB0, 0x407C, 0x0048, 0x12AB, 0x435C, 0x1292, 0x1356, -0x435C, 0x12AA, 0x4307, 0x12B0, 0xC2A6, 0x2406, 0x12B0, 0xC2C8, 0x5317, -0x9037, 0x000A, 0x2BF7, 0x9037, 0x000A, 0x2003, 0x403C, 0xFFD1, 0x3CEC, -0x12B0, 0xC292, 0x407C, 0x0030, 0x12AB, 0x403C, 0x0003, 0x12A8, 0x430C, -0x12A8, 0x4076, 0x0090, 0x93A2, 0x137C, 0x200D, 0x9382, 0x137E, 0x200A, -0x12B0, 0xCAA6, 0x403C, 0x000F, 0x12A8, 0x12B0, 0xCAA6, 0x403C, 0x000C, -0x12A8, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, 0x2414, 0x9382, 0x1380, -0x2411, 0x464C, 0x12AB, 0x403C, 0x0089, 0x12A8, 0x430C, 0x12A8, 0x4C07, -0x464C, 0x12AB, 0x403C, 0x0088, 0x12A8, 0xD037, 0x0010, 0x470C, 0x12A8, -0x4077, 0x0082, 0x12B0, 0xC286, 0x4035, 0xC0EA, 0x12B0, 0xCA9C, 0x239B, -0x12B0, 0xCABA, 0x934C, 0x3405, 0x12B0, 0xC286, 0x12B0, 0xCA9C, 0x2392, -0x12B0, 0xC280, 0x430C, 0x12B0, 0xCAE2, 0x238C, 0x4306, 0x444C, 0x12AB, -0x3C04, 0x12B0, 0xCA9C, 0x2385, 0x5316, 0x430C, 0x12A8, 0x934C, 0x3803, -0x9036, 0x000A, 0x2BF5, 0x9036, 0x000A, 0x277A, 0x407C, 0x0021, 0x12B0, -0xCABC, 0x822C, 0x4C81, 0x0008, 0x4381, 0x000A, 0x9306, 0x2019, 0x12B0, -0xCABA, 0xB03C, 0x0020, 0x2818, 0x53A1, 0x0008, 0x12B0, 0xC280, 0x403C, -0xC032, 0x12B0, 0xCAE2, 0x2361, 0x12B0, 0xC280, 0x403C, 0x0010, 0x12B0, -0xCAE2, 0x235A, 0x40B1, 0x0010, 0x0004, 0x3C04, 0x12B0, 0xC292, 0x4391, -0x000E, 0x12B0, 0xD5FA, 0x12B0, 0xC2A6, 0x2370, 0x12B0, 0xC2D8, 0x12B0, -0xCAC2, 0x12B0, 0xC2C2, 0x434C, 0x12AA, 0x430C, 0x12A8, 0x4C81, 0x0006, -0x12B0, 0xC2F8, 0x415F, 0x0006, 0xDF81, 0x0000, 0x12B0, 0xC2D8, 0x407C, -0x0048, 0x12AB, 0x427C, 0x1292, 0x1356, 0x12B0, 0xCAC2, 0x12AB, 0x412C, -0x12A8, 0x435C, 0x12AA, 0x12B0, 0xC2F8, 0x12B0, 0xCAD4, 0x403C, 0x4030, -0x12A8, 0x12B0, 0xC2C8, 0x403C, 0x0C04, 0x12A8, 0x9382, 0x1506, 0x2402, -0x12B0, 0xC2C8, 0x434C, 0x12AA, 0x407C, 0x0021, 0x12AB, 0x9382, 0x1506, -0x2002, 0x435C, 0x12AA, 0x12B0, 0xC2D0, 0x12B0, 0xCAD4, 0x403C, 0x4282, -0x12B0, 0xC2B8, 0x474C, 0x12AB, 0x403C, 0x00FE, 0x12B0, 0xC2B8, 0x12B0, -0xC2C8, 0x430C, 0x12A8, 0x4C81, 0x000C, 0x12B0, 0xC2D0, 0xD191, 0x0004, -0x000C, 0x403D, 0x000A, 0x410C, 0x503C, 0x0006, 0x421F, 0x1112, 0x129F, -0x0006, 0x430C, 0x5031, 0x0010, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x001A, 0x4308, 0x4309, -0x430A, 0x430B, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, 0x0002, 0x4381, -0x0004, 0x4381, 0x000E, 0x4381, 0x0010, 0x40B1, 0x0010, 0x0006, 0x4381, -0x0008, 0x4304, 0x4305, 0x4306, 0x4307, 0x410C, 0x503C, 0x000A, 0x12B0, -0xD66A, 0x3403, 0x403C, 0xFFC6, 0x3C7B, 0x410C, 0x532C, 0x12B0, 0xD66A, -0x3403, 0x403C, 0xFFC4, 0x3C73, 0x410C, 0x503C, 0x000E, 0x12B0, 0xD66A, -0x3BF7, 0x410C, 0x503C, 0x0006, 0x12B0, 0xD66A, 0x3403, 0x403C, 0xFFC3, -0x3C64, 0x411C, 0x0002, 0x411D, 0x0004, 0x411E, 0x000E, 0x411F, 0x0010, -0x4C81, 0x0012, 0x4D81, 0x0014, 0x4E81, 0x0016, 0x4F81, 0x0018, 0x92A1, -0x000A, 0x2033, 0x9381, 0x000C, 0x2030, 0x42B1, 0x0006, 0x4381, 0x0008, -0x43C1, 0x0000, 0x411C, 0x0012, 0x411D, 0x0014, 0x411E, 0x0016, 0x411F, -0x0018, 0x416B, 0x12B0, 0xCF16, 0xF31C, 0x5404, 0x6505, 0x6606, 0x6707, -0xDC04, 0x53D1, 0x0000, 0x92F1, 0x0000, 0x2BEA, 0x444C, 0x1292, 0x1354, -0x4C48, 0x4309, 0x430A, 0x430B, 0x480C, 0x490D, 0x421F, 0x1112, 0x129F, -0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, 0x000A, 0x3C1D, 0x4C04, -0x4D05, 0x4E06, 0x4F07, 0x411E, 0x000A, 0x411F, 0x000C, 0x930F, 0x20C1, -0x903E, 0x000B, 0x2CBE, 0x5E0E, 0x4E10, 0x5370, 0x5386, 0x5394, 0x5394, -0x539C, 0x5328, 0x53B4, 0x5418, 0x542A, 0x543A, 0x544C, 0x54C4, 0x1292, -0x134E, 0x430C, 0x5031, 0x001A, 0x4030, 0xD41E, 0x434C, 0x1292, 0x2754, -0x3FF7, 0x1292, 0x2756, 0x411F, 0x0002, 0xD11F, 0x0004, 0x930F, 0x27EF, -0x430C, 0x1292, 0x274A, 0x3FEB, 0x411E, 0x0006, 0x411F, 0x0008, 0x830F, -0x2029, 0x823E, 0x240B, 0x823E, 0x240D, 0x822E, 0x240F, 0x803E, 0x000C, -0x2414, 0x803E, 0x0020, 0x2414, 0x3C1C, 0x1292, 0x1356, 0x4C48, 0x3FAA, -0x1292, 0x1358, 0x4C08, 0x3FA6, 0xF035, 0x000F, 0x450D, 0x1292, 0x135A, -0x4C08, 0x4D09, 0x3F9E, 0x1292, 0x135C, 0x3FFA, 0x460E, 0x470F, 0x1292, -0x135E, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, 0x3F92, 0x403C, 0xFFC2, 0x3FBA, -0x407C, 0x0054, 0x1292, 0x1354, 0x440C, 0x450D, 0x1292, 0x135C, 0x3FB0, -0x407C, 0x00F4, 0x1292, 0x1354, 0x440C, 0x1292, 0x1358, 0x3FA8, 0x407C, -0x0046, 0x1292, 0x1354, 0x430C, 0x430D, 0x430E, 0x430F, 0x3FDC, 0x90B1, -0x0010, 0x0006, 0x2015, 0x9381, 0x0008, 0x2012, 0x4C07, 0x12B0, 0xD954, -0x12B0, 0xDA04, 0x531A, 0x630B, 0x202A, 0x903A, 0x0BB8, 0x2C27, 0xB31C, -0x2BF6, 0x431C, 0x1292, 0x1358, 0x470C, 0x3FDB, 0x90B1, 0x0020, 0x0006, -0x201C, 0x9381, 0x0008, 0x2019, 0x4C07, 0x4D08, 0x12B0, 0xD954, 0x12B0, -0xDA04, 0x531A, 0x630B, 0x2010, 0x903A, 0x0BB8, 0x2C0D, 0xB32C, 0x2BF6, -0x403C, 0x0011, 0x1292, 0x1358, 0x470C, 0x1292, 0x1358, 0x480C, 0x1292, -0x1358, 0x3F66, 0x403C, 0xFFCF, 0x3F64, 0x12B0, 0xD954, 0x12B0, 0xDA04, -0xB23C, 0x2B33, 0x403C, 0x0014, 0x1292, 0x1358, 0x12B0, 0xDA04, 0x4C08, -0x12B0, 0xDA04, 0x4C09, 0x3F28, 0x403C, 0xFFC5, 0x3F50, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0010, 0x410C, -0x503C, 0x0006, 0x403E, 0x0005, 0x12B0, 0xD494, 0x4381, 0x0004, 0x410C, -0x532C, 0x421F, 0x1112, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFD3, -0x3D30, 0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x933C, 0x2003, 0x403C, -0xFFD2, 0x3D26, 0x403A, 0x1360, 0x435C, 0x12AA, 0x403B, 0x1354, 0x4075, -0x0028, 0x454C, 0x12AB, 0x4038, 0x1358, 0x430C, 0x12A8, 0x4034, 0x1356, -0x4077, 0x00C8, 0xB03C, 0x0200, 0x2C18, 0x12B0, 0xD69A, 0x12B0, 0xD790, -0x454C, 0x12AB, 0x4039, 0x0032, 0x3C02, 0x9309, 0x240A, 0x430C, 0x12A8, -0x5339, 0x933C, 0x27F9, 0xB03C, 0x0200, 0x2BF6, 0x9309, 0x2003, 0x403C, -0xFFD4, 0x3CF9, 0xB32C, 0x2807, 0x434C, 0x12AA, 0x12B0, 0xD79A, 0x435C, -0x12AA, 0x3C02, 0x12B0, 0xD79A, 0x407C, 0x0048, 0x12AB, 0x435C, 0x12A4, -0x435C, 0x12AA, 0x4309, 0x12B0, 0xBB78, 0x2406, 0x12B0, 0xBB8A, 0x5319, -0x9039, 0x000A, 0x2BF7, 0x9039, 0x000A, 0x2003, 0x403C, 0xFFD1, 0x3CD7, -0x12B0, 0xBB92, 0x407C, 0x0030, 0x12AB, 0x403C, 0x0003, 0x12A8, 0x430C, -0x12A8, 0x93A2, 0x137C, 0x201B, 0x9382, 0x137E, 0x2018, 0x407C, 0x00B0, -0x12AB, 0x4039, 0x135C, 0x403C, 0x0082, 0x430D, 0x12A9, 0x403C, 0x000F, -0x430D, 0x12A9, 0x407C, 0x00B0, 0x12AB, 0x403C, 0x0082, 0x430D, 0x12A9, -0x403C, 0x000C, 0x430D, 0x12A9, 0x4076, 0x0082, 0x12B0, 0xBB5A, 0x403C, -0x4303, 0x12B0, 0xBBDE, 0x4309, 0x454C, 0x12AB, 0x3C07, 0x12B0, 0xC172, -0x4C0F, 0xDD0F, 0x930F, 0x23A1, 0x5319, 0x430C, 0x12A8, 0x934C, 0x3803, -0x9039, 0x000A, 0x2BF2, 0x9039, 0x000A, 0x2796, 0x407C, 0x0021, 0x12AB, -0x430C, 0x430D, 0x1292, 0x135A, 0x503C, 0xFFFE, 0x633D, 0x4C81, 0x0008, -0x4D81, 0x000A, 0x9309, 0x201B, 0x454C, 0x12AB, 0x430C, 0x12A8, 0xB03C, -0x0020, 0x2818, 0x53A1, 0x0008, 0x12B0, 0xBB5A, 0x403C, 0xC032, 0x12B0, -0xD5CC, 0x2376, 0x12B0, 0xBB5A, 0x403C, 0x0010, 0x12B0, 0xD5CC, 0x236F, -0x40B1, 0x0010, 0x0004, 0x3C04, 0x12B0, 0xBB92, 0x4391, 0x000E, 0x12B0, -0xD790, 0x12B0, 0xBB78, 0x2384, 0x12B0, 0xBBBE, 0x12B0, 0xBB62, 0x435C, -0x12AA, 0x434C, 0x12AA, 0x430C, 0x12A8, 0x4C81, 0x0006, 0x12B0, 0xBBEA, -0x415F, 0x0006, 0xDF81, 0x0000, 0x12B0, 0xBBBE, 0x407C, 0x0048, 0x12AB, -0x427C, 0x12A4, 0x12B0, 0xBB62, 0x412C, 0x12A8, 0x435C, 0x12AA, 0x12B0, -0xBBEA, 0x12B0, 0xD69A, 0x464C, 0x12AB, 0x403C, 0x0080, 0x12A8, 0x12B0, -0xBB8A, 0x403C, 0x0C04, 0x12A8, 0x434C, 0x12AA, 0x407C, 0x0021, 0x12B0, -0xBB5C, 0x12B0, 0xBBAA, 0x407C, 0x0088, 0x12AB, 0x403C, 0x0034, 0x12A8, -0x12B0, 0xBB5A, 0x403C, 0x0260, 0x12B0, 0xBBDE, 0x12B0, 0xBB5A, 0x403C, -0x00FC, 0x12B0, 0xBBDE, 0x430C, 0x12A8, 0x4C07, 0x12B0, 0xBB8A, 0x430C, -0x12A8, 0x12B0, 0xBBAA, 0xD117, 0x0004, 0x4781, 0x000C, 0x403D, 0x000A, -0x410C, 0x503C, 0x0006, 0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, -0x0010, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x0022, 0x4381, 0x0006, 0x4381, 0x0008, 0x4381, -0x0002, 0x4381, 0x0004, 0x4381, 0x0000, 0x410C, 0x503C, 0x0006, 0x421F, -0x1112, 0x129F, 0x0018, 0x410C, 0x532C, 0x421F, 0x1112, 0x129F, 0x0018, -0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x407C, 0x0046, 0x1292, 0x1354, -0x430C, 0x430D, 0x430E, 0x430F, 0x1292, 0x135E, 0x4C08, 0x4D09, 0x4E0A, -0x4F0B, 0x9381, 0x0000, 0x2022, 0x421E, 0x14B2, 0xF31E, 0x4A06, 0xF316, -0x960E, 0x241B, 0xB31A, 0x2819, 0x431C, 0x421F, 0x1112, 0x129F, 0x0008, -0x403C, 0x0080, 0x421F, 0x1112, 0x129F, 0x0008, 0x480C, 0x490D, 0x421F, -0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, 0x000A, -0x431C, 0x3CE0, 0x9381, 0x0000, 0x2009, 0x421F, 0x14B4, 0xF03F, 0x8000, -0x4B07, 0xF037, 0x8000, 0x970F, 0x24D3, 0x422C, 0x421F, 0x1112, 0x129F, -0x0008, 0x480C, 0x490D, 0x421F, 0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, -0x421F, 0x1112, 0x129F, 0x000A, 0x930B, 0x38BE, 0x9381, 0x0000, 0x20BB, -0x410C, 0x503C, 0x000A, 0x403E, 0x27CE, 0x423D, 0x12B0, 0xD454, 0x410F, -0x503F, 0x0012, 0x120F, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x000C, -0x4217, 0x1112, 0x1297, 0x000E, 0x403C, 0x0003, 0x1292, 0x1230, 0x410C, -0x503C, 0x0014, 0x421F, 0x1112, 0x129F, 0x0010, 0x4036, 0x1360, 0x434C, -0x12A6, 0x407C, 0x00C1, 0x1292, 0x1354, 0x403C, 0xFFFE, 0x430D, 0x1292, -0x135A, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0042, 0x1292, 0x1354, -0x4037, 0x1358, 0x430C, 0x12A7, 0x4C05, 0x435C, 0x12A6, 0x434C, 0x12A6, -0x435C, 0x12A6, 0x407C, 0x0028, 0x1292, 0x1354, 0x430C, 0x12A7, 0x434C, -0x12A6, 0x4074, 0x0082, 0x444C, 0x1292, 0x1354, 0x435C, 0x12A6, 0x403C, -0x0080, 0x12A7, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, -0x1400, 0x12A7, 0x444C, 0x1292, 0x1354, 0x434C, 0x12A6, 0x435C, 0x12A6, -0x5325, 0x450C, 0x12A7, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x403C, 0x4303, -0x12A7, 0x434C, 0x12A6, 0x407C, 0x0021, 0x1292, 0x1354, 0x430C, 0x430D, -0x1292, 0x135A, 0x434C, 0x12A6, 0x444C, 0x1292, 0x1354, 0x435C, 0x12A6, -0x432C, 0x12A7, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x1401, 0x12A7, -0x444C, 0x1292, 0x1354, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x430C, 0x12A7, -0x434C, 0x12A6, 0x435C, 0x12A6, 0x403C, 0x3FFD, 0x12A7, 0x434C, 0x12A6, -0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0021, 0x1292, 0x1354, 0x430C, -0x430D, 0x1292, 0x135A, 0x435C, 0x12A6, 0x407C, 0x00C8, 0x1292, 0x1354, -0x403C, 0x0501, 0x12A7, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x434C, 0x12A6, -0x407C, 0x0042, 0x1292, 0x1354, 0x435C, 0x12A6, 0x5321, 0x431C, 0x3C01, -0x432C, 0x9381, 0x0000, 0x2402, 0x430C, 0x3C08, 0x4882, 0x14AE, 0x4982, -0x14B0, 0x4A82, 0x14B2, 0x4B82, 0x14B4, 0x5031, 0x0022, 0x4030, 0xD41E, -0x407C, 0x00C1, 0x4820, 0x403C, 0x012C, 0x4030, 0x5C46, 0x444C, 0x12A8, -0x403C, 0x0034, 0x12AB, 0x464C, 0x4030, 0x5AF4, 0x12B0, 0x5B54, 0x4030, -0x5B6C, 0x12B0, 0x5C46, 0x12B0, 0x5CAE, 0x430C, 0x4B20, 0x12B0, 0x5AEA, -0x3FF0, 0x12B0, 0x5B54, 0x12B0, 0x5C38, 0x4820, 0x12B0, 0x5A56, 0x403C, -0x3FFD, 0x12AB, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12B0, 0x5BA6, 0x4A20, -0x12B0, 0x5AD2, 0x4C81, 0x0002, 0x12B0, 0x5ABA, 0x4C81, 0x0004, 0x12B0, -0x5AC6, 0x411E, 0x0002, 0x411F, 0x0004, 0x4130, 0x12B0, 0x5AD2, 0x4C81, -0x0004, 0x12B0, 0x5ABA, 0x4C81, 0x0002, 0x12B0, 0x5AC6, 0x411E, 0x0004, -0x411F, 0x0002, 0x4130, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x430C, 0x4B20, -0x434C, 0x12AA, 0x12B0, 0x5BB2, 0x435C, 0x4A20, 0x12B0, 0x5A56, 0x403C, -0x00FC, 0x12B0, 0x5AEA, 0x430C, 0x4B20, 0x12B0, 0x5B98, 0x4030, 0x5AF4, -0x12AB, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12A8, 0x435C, 0x4A20, 0x431C, -0x1292, 0x275A, 0x454C, 0x12A8, 0x430C, 0x430D, 0x1292, 0x135A, 0x53B1, -0x0006, 0x421E, 0x145C, 0x4130, 0x12B0, 0x5A5C, 0x403C, 0x012C, 0x12B0, -0x5C46, 0x421C, 0x1482, 0xD03C, 0x0040, 0x12B0, 0x5B32, 0x4030, 0x5B38, -0x12AB, 0x435C, 0x4A20, 0x12B0, 0x5C2E, 0x4A20, 0x12B0, 0xD196, 0xF03C, -0x0F00, 0x4130, 0x12B0, 0x5B38, 0x12B0, 0x5B54, 0x4030, 0x5B6C, 0x464C, -0x12A8, 0x403C, 0x3FFF, 0x12AB, 0x434C, 0x12AA, 0x494C, 0x12A8, 0x403C, -0x2409, 0x4130, 0x12AB, 0x4030, 0x5CAE, 0x4F81, 0x0002, 0x12B0, 0x5B98, -0x12A8, 0x403C, 0x0080, 0x12AB, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x411C, -0x0002, 0x12AB, 0x434C, 0x12AA, 0x454C, 0x3F70, 0x444C, 0x12A8, 0x407C, -0x0034, 0x12A7, 0x464C, 0x4130, 0x12B0, 0x5BBC, 0x12B0, 0x5BB2, 0x435C, -0x4130, 0x444C, 0x12A8, 0x407C, 0x0024, 0x4720, 0x12A8, 0x4030, 0x5CAE, -0x12B0, 0x5C6A, 0x4B20, 0x403C, 0x0003, 0x1292, 0x11E4, 0x410C, 0x503C, -0x0036, 0x421F, 0x1112, 0x129F, 0x0010, 0x403C, 0x1462, 0x12B0, 0x9702, -0x12B0, 0x5B54, 0x12B0, 0x5C38, 0x12A8, 0x403C, 0x0128, 0x12B0, 0x5C46, -0x421C, 0x147E, 0x12B0, 0x5C52, 0x403C, 0x012A, 0x12B0, 0x5C46, 0x421C, -0x1480, 0x12B0, 0x5C52, 0x403C, 0x012C, 0x12B0, 0x5C46, 0x421C, 0x1482, -0x12AB, 0x435C, 0x12AA, 0x12B0, 0x5C6A, 0x12AB, 0x4C81, 0x0004, 0x3F85, -0x12B0, 0x5C9A, 0x12A8, 0x435C, 0x4130, 0x12B0, 0x5CAC, 0x12B0, 0x5C60, -0x407C, 0x00C1, 0x4130, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x4820, -0x12B0, 0x5B32, 0x12B0, 0x5C8A, 0x12B0, 0x5C60, 0x3EE2, 0x407C, 0x0048, -0x12A8, 0x427C, 0x4720, 0x12B0, 0x5C8A, 0x407C, 0x00C1, 0x12A8, 0x403C, -0x012C, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12B0, 0x5BBC, 0x430C, -0x4130, 0x12B0, 0x5C9A, 0x12B0, 0x5AF4, 0x12B0, 0x5B54, 0x4030, 0x5CAC, -0x434C, 0x12AA, 0x494C, 0x12A8, 0x403C, 0x2401, 0x12AB, 0x454C, 0x4130, -0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x000C, 0x410C, 0x532C, 0x421F, -0x1112, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFDA, 0x3D29, 0x410C, -0x421F, 0x1112, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFD9, 0x3D1F, -0x403A, 0x1354, 0x407B, 0x00C8, 0x4B4C, 0x12AA, 0x4038, 0x1358, 0x403C, -0x2401, 0x12A8, 0x407C, 0x0028, 0x12AA, 0x907C, 0x0089, 0x2403, 0x403C, -0xFFD0, 0x3D0B, 0x12B0, 0xD7D6, 0x4C04, 0x4039, 0x1360, 0x435C, 0x12A9, -0x4037, 0x135C, 0x4035, 0x1356, 0xB034, 0x0200, 0x2C34, 0x12B0, 0xB564, -0x407C, 0x0034, 0x12A5, 0x4C44, 0x407C, 0x00B0, 0x12AA, 0x403C, 0x0089, -0x430D, 0x12A7, 0x430C, 0x430D, 0x12A7, 0xD034, 0x0040, 0x12B0, 0xB578, -0x12B0, 0xD6A6, 0x12B0, 0xB578, 0xF034, 0xFFBF, 0x12B0, 0xD6A6, 0x12B0, -0xB5EC, 0x407C, 0x0028, 0x12AA, 0x4036, 0x0032, 0x3C02, 0x9306, 0x240B, -0x430C, 0x12A8, 0x4C04, 0x5336, 0x933C, 0x27F8, 0xB03C, 0x0200, 0x2BF5, -0x9306, 0x2003, 0x403C, 0xFFDB, 0x3CC9, 0xB324, 0x2807, 0x434C, 0x12A9, -0x12B0, 0xB5EC, 0x435C, 0x12A9, 0x3C02, 0x12B0, 0xB5EC, 0x407C, 0x0082, -0x12B0, 0xB5AE, 0x403C, 0x4303, 0x12B0, 0xB5B4, 0x407C, 0x0042, 0x12AA, -0x12B0, 0xCCFA, 0x2003, 0x403C, 0xFFD1, 0x3CAD, 0x93A2, 0x137C, 0x200F, -0x9382, 0x137E, 0x200C, 0x12B0, 0xB56A, 0x403C, 0x000F, 0x430D, 0x12A7, -0x12B0, 0xB56A, 0x403C, 0x000C, 0x430D, 0x12A7, 0x12B0, 0xB5DA, 0x12B0, -0xB5DA, 0x403C, 0x0401, 0x12A8, 0x407C, 0x0098, 0x12AA, 0x12B0, 0xD68E, -0x12B0, 0xD68E, 0x12B0, 0xB564, 0x407C, 0x0024, 0x12A5, 0x4306, 0x4077, -0x0021, 0x12B0, 0xB586, 0x903C, 0xFFFE, 0x2002, 0x930D, 0x240B, 0x903C, -0x0F00, 0x2002, 0x930D, 0x2406, 0x12B0, 0xD9F4, 0x5316, 0x9036, 0x000A, -0x2BEE, 0x9036, 0x000A, 0x27C0, 0x434C, 0x12A9, 0x12B0, 0xB55C, 0x12B0, -0xB55C, 0x474C, 0x12AA, 0x430C, 0x12A8, 0x12B0, 0xCCFA, 0x27B3, 0x12B0, -0xB5F6, 0x12B0, 0xB5BA, 0x12B0, 0xB55C, 0x430C, 0x12A8, 0x4C81, 0x0004, -0x12B0, 0xB5D0, 0x415F, 0x0004, 0xDF81, 0x0000, 0x12B0, 0xB5F6, 0x407C, -0x0048, 0x12AA, 0x427C, 0x12A5, 0x12B0, 0xB5BA, 0x412C, 0x12A8, 0x435C, -0x12A9, 0x12B0, 0xB5D0, 0x12B0, 0xB586, 0x4C81, 0x0006, 0x4D81, 0x0008, -0x12B0, 0xB564, 0x407C, 0x0034, 0x12A5, 0x407C, 0x0082, 0x12AA, 0x403C, -0x0080, 0x12A8, 0x12B0, 0xD9F4, 0x403C, 0x0C04, 0x12B0, 0xB5B4, 0x474C, -0x12B0, 0xB5AE, 0x12B0, 0xB592, 0x12B0, 0xB564, 0x403C, 0x0034, 0x12A8, -0x407C, 0x0082, 0x12B0, 0xB5AE, 0x403C, 0x0260, 0x12B0, 0xB5A6, 0x407C, -0x0082, 0x12B0, 0xB5AE, 0x403C, 0x00FC, 0x12B0, 0xB5A6, 0x430C, 0x12A8, -0x4C0B, 0x12B0, 0xD9F4, 0x430C, 0x12A8, 0x12B0, 0xB592, 0x4B81, 0x000A, -0x423D, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, -0x000C, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x0016, 0x403B, 0x1112, 0x410C, 0x503C, 0x000A, -0x12B0, 0xD7B8, 0x2403, 0x403C, 0xFFE8, 0x3D25, 0x410C, 0x523C, 0x12B0, -0xD7B8, 0x2403, 0x403C, 0xFFE7, 0x3D1D, 0x410C, 0x503C, 0x0012, 0x4B2F, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3D12, 0x410C, 0x503C, -0x0006, 0x12B0, 0xD7B8, 0x2403, 0x403C, 0xFFE5, 0x3D09, 0x410C, 0x522C, -0x12B0, 0xD7B8, 0x2403, 0x403C, 0xFFE4, 0x3D01, 0x410C, 0x532C, 0x4B2F, -0x129F, 0x0016, 0x933C, 0x2003, 0x403C, 0xFFE3, 0x3CF7, 0x410C, 0x4B2F, -0x129F, 0x0016, 0x933C, 0x2002, 0x4381, 0x0000, 0x403A, 0x1354, 0x4077, -0x00C8, 0x474C, 0x12AA, 0x403B, 0x1358, 0x403C, 0x3401, 0x12AB, 0x4078, -0x0082, 0x484C, 0x12AA, 0x403C, 0x4032, 0x12AB, 0x4039, 0x1360, 0x12B0, -0xD984, 0x411C, 0x0006, 0x12AB, 0x12B0, 0xD984, 0x403C, 0x3FFD, 0x12AB, -0x12B0, 0xD620, 0x12B0, 0xD3C4, 0x484C, 0x12AA, 0x403C, 0x3FFF, 0x12AB, -0x12B0, 0xD98C, 0x403C, 0x2409, 0x12AB, 0x435C, 0x12A9, 0x434C, 0x12A9, -0x407C, 0x0048, 0x12AA, 0x427C, 0x1292, 0x1356, 0x407C, 0x00C1, 0x12AA, -0x411C, 0x000A, 0x12AB, 0x407C, 0x00A1, 0x12AA, 0x411C, 0x0008, 0x12AB, -0x435C, 0x12A9, 0x12B0, 0xD98C, 0x403C, 0x2401, 0x12AB, 0x4076, 0x0021, -0x464C, 0x12AA, 0x435C, 0x12B0, 0xD98E, 0x403C, 0x3401, 0x12AB, 0x484C, -0x12AA, 0x403C, 0x4030, 0x12AB, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x411C, -0x0012, 0x12AB, 0x9382, 0x1506, 0x2404, 0x434C, 0x12A9, 0x435C, 0x12A9, -0x434C, 0x12A9, 0x464C, 0x12AA, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A9, -0x12B0, 0xD3C4, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0010, 0x4077, -0x0090, 0x474C, 0x12AA, 0x403C, 0x0003, 0x12B0, 0xDA28, 0x4C81, 0x000C, -0x403C, 0x000B, 0x12B0, 0xDA28, 0x4C04, 0x4C81, 0x000E, 0x403C, 0x0013, -0x12B0, 0xDA28, 0x4C05, 0x4C81, 0x0010, 0x432C, 0x12B0, 0xDA28, 0x403C, -0x000A, 0x12B0, 0xDA28, 0x403C, 0x0012, 0x12B0, 0xDA28, 0x432C, 0x12AB, -0x411C, 0x000C, 0x12AB, 0x403C, 0x000A, 0x12AB, 0x440C, 0x12AB, 0x403C, -0x0012, 0x12AB, 0x450C, 0x12AB, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, -0x2420, 0x9382, 0x1380, 0x2410, 0x474C, 0x12AA, 0x403C, 0x0089, 0x12B0, -0xDA28, 0x4C04, 0x474C, 0x12AA, 0x403C, 0x0088, 0x12AB, 0xF034, 0xFFEF, -0x440C, 0x12AB, 0x93A2, 0x137C, 0x200A, 0x9382, 0x137E, 0x2007, 0x474C, -0x12AA, 0x480C, 0x12AB, 0x403C, 0x000F, 0x12AB, 0x407C, 0x0030, 0x12AA, -0x411C, 0x0004, 0x12AB, 0x9381, 0x0002, 0x240C, 0x484C, 0x12AA, 0x411C, -0x0002, 0x12AB, 0x434C, 0x12A9, 0x464C, 0x12AA, 0x435C, 0x12A9, 0x3C02, -0x464C, 0x12AA, 0x407C, 0x00A8, 0x12AA, 0x9381, 0x0000, 0x2402, 0x1292, -0x2756, 0x430C, 0x5031, 0x0016, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x8221, 0x4E0A, 0x4F0B, 0x4C0F, 0x823F, -0x2408, 0x823F, 0x2434, 0x822F, 0x2436, 0x803F, 0x000C, 0x2438, 0x3CDA, -0x40B1, 0x0080, 0x0000, 0x4381, 0x0002, 0x4C08, 0x4039, 0x150C, 0x4036, -0x1504, 0x4037, 0x0190, 0x930C, 0x246A, 0x4A0E, 0x4B0F, 0xF12E, 0xF11F, -0x0002, 0x9318, 0x4E0D, 0xDF0D, 0x2026, 0x930D, 0xD0F2, 0x0040, 0x0029, -0x4214, 0x2758, 0x470C, 0x2026, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xC0F2, 0x0040, 0x0029, -0x3C25, 0x40B1, 0x8000, 0x0000, 0x3FD1, 0x4381, 0x0000, 0x42B1, 0x0002, -0x3FCE, 0x4381, 0x0000, 0x40B1, 0x8000, 0x0002, 0x3FC8, 0x930D, 0xC0F2, -0x0040, 0x0029, 0x4214, 0x2758, 0x470C, 0x27DA, 0x1284, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, -0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x421F, 0x2782, 0x4FE2, 0x1513, 0x462F, -0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC9EF, 0x0000, 0x5A0A, 0x6B0B, -0x5338, 0x9308, 0x2396, 0xB0F2, 0x0040, 0x1100, 0xD0F2, 0x0040, 0x0029, -0x4214, 0x2758, 0x470C, 0x285D, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, 0x0040, 0x0029, -0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, 0xD3DF, 0x0000, -0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC9EF, -0x0000, 0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, -0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, 0x0040, -0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, -0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, -0xC9EF, 0x0000, 0x430C, 0x430D, 0x5221, 0x4030, 0xD420, 0x1284, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, -0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, -0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC9EF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, -0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, -0x1284, 0xC0F2, 0x0040, 0x0029, 0x3FA2, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x4C0A, 0x4D0B, 0x4218, 0x01F2, 0x40B2, 0x2839, 0x01EA, 0x40B2, -0x2845, 0x01F2, 0x4C0F, 0xDD0F, 0x930F, 0x2482, 0x4039, 0x150C, 0x4036, -0x1504, 0x533A, 0x633B, 0x435C, 0x1292, 0x1360, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x462F, 0xE9EF, 0x0000, 0xC232, 0x4303, 0x425E, 0x277E, -0x4E4F, 0xE37F, 0x421D, 0x2784, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462F, 0xE9EF, 0x0000, 0x434C, 0x1292, 0x1360, 0x4A0F, 0xDB0F, 0x930F, -0x2382, 0x4882, 0x01F2, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x4C0A, 0x4D0B, 0x4218, 0x01F2, 0x40B2, 0x283F, 0x01EA, 0x40B2, -0x284B, 0x01F2, 0x4C0F, 0xDD0F, 0x930F, 0x2482, 0x4039, 0x150C, 0x4036, -0x1504, 0x533A, 0x633B, 0x435C, 0x1292, 0x1360, 0x434C, 0x1292, 0x1360, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x462F, 0xE9EF, 0x0000, 0xC232, -0x4303, 0x425E, 0x277E, 0x4E4F, 0xE37F, 0x421D, 0x2784, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462F, 0xE9EF, 0x0000, 0x4A0F, 0xDB0F, 0x930F, -0x2382, 0x3F66, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x000C, 0x410C, 0x532C, 0x421F, 0x1112, 0x129F, 0x0016, -0x930C, 0x2403, 0x403C, 0xFFDA, 0x3D10, 0x410C, 0x421F, 0x1112, 0x129F, -0x0016, 0x930C, 0x2403, 0x403C, 0xFFD9, 0x3D06, 0x403A, 0x1354, 0x407B, -0x00C8, 0x4B4C, 0x12AA, 0x4038, 0x1358, 0x4039, 0x2401, 0x12B0, 0xD736, -0x907C, 0x0089, 0x2403, 0x403C, 0xFFD0, 0x3CF4, 0x407C, 0x0028, 0x12B0, -0xD9EE, 0x4C04, 0x4036, 0x1360, 0x435C, 0x12A6, 0x4075, 0x0090, 0xB034, -0x0200, 0x2C2F, 0x407C, 0x0088, 0x12AA, 0x407C, 0x0034, 0x1292, 0x1356, -0x454C, 0x12AA, 0x403C, 0x0089, 0x12A8, 0x430C, 0x12B0, 0xD612, 0xD037, -0x0040, 0x470C, 0x12B0, 0xD612, 0xF037, 0xFFBF, 0x470C, 0x12A8, 0x4B4C, -0x12AA, 0x12B0, 0xD736, 0x4037, 0x0032, 0x3C02, 0x9307, 0x240B, 0x430C, -0x12A8, 0x4C04, 0x5337, 0x933C, 0x27F8, 0xB03C, 0x0200, 0x2BF5, 0x9307, -0x2003, 0x403C, 0xFFDB, 0x3CB7, 0xB324, 0x2803, 0x12B0, 0xCF4A, 0x3C02, -0x12B0, 0xCF42, 0x12B0, 0xD48E, 0x435C, 0x12A6, 0x403C, 0x4303, 0x12B0, -0xD71E, 0x12B0, 0xCC02, 0x2003, 0x403C, 0xFFD1, 0x3CA2, 0x93A2, 0x137C, -0x200D, 0x9382, 0x137E, 0x200A, 0x12B0, 0xD89E, 0x403C, 0x000F, 0x12A8, -0x12B0, 0xD89E, 0x403C, 0x000C, 0x12A8, 0x12B0, 0xCF52, 0x12B0, 0xCF52, -0x403C, 0x0401, 0x12A8, 0x407C, 0x0098, 0x12AA, 0x12B0, 0xD6EE, 0x12B0, -0xD6EE, 0x407C, 0x0088, 0x12AA, 0x407C, 0x0024, 0x1292, 0x1356, 0x4307, -0x4075, 0x0021, 0x12B0, 0xD9EC, 0x903C, 0xFFFE, 0x2409, 0x903C, 0x0F00, -0x2406, 0x12B0, 0xD9AC, 0x5317, 0x9037, 0x000A, 0x2BF2, 0x9037, 0x000A, -0x27C4, 0x434C, 0x12A6, 0x12B0, 0xD9CC, 0x434C, 0x12A6, 0x12B0, 0xD9EC, -0x12B0, 0xCC02, 0x27B9, 0x12B0, 0xCFD6, 0x12B0, 0xD3B2, 0x12B0, 0xCFEE, -0x430C, 0x12A8, 0x4C81, 0x0004, 0x12B0, 0xD6BE, 0x415F, 0x0004, 0xDF81, -0x0000, 0x12B0, 0xCFD6, 0x407C, 0x0048, 0x12AA, 0x427C, 0x1292, 0x1356, -0x12B0, 0xD3B2, 0x412C, 0x12A8, 0x435C, 0x12A6, 0x12B0, 0xD6BE, 0x12B0, -0xD9EC, 0x4C81, 0x0006, 0x4381, 0x0008, 0x12B0, 0xD484, 0x403C, 0x4030, -0x12A8, 0x12B0, 0xD9AC, 0x403C, 0x0C04, 0x12A8, 0x9382, 0x1506, 0x2402, -0x12B0, 0xD9AC, 0x434C, 0x12A6, 0x454C, 0x12AA, 0x9382, 0x1506, 0x2002, -0x435C, 0x12A6, 0x12B0, 0xCF4A, 0x12B0, 0xD484, 0x403C, 0x4282, 0x12B0, -0xD71E, 0x435C, 0x12A6, 0x12B0, 0xD48E, 0x403C, 0x00FE, 0x12B0, 0xD71E, -0x12B0, 0xD9CC, 0x430C, 0x12A8, 0x4C81, 0x000A, 0x12B0, 0xCF4A, 0x423D, -0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, 0x000C, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x0010, 0x4381, 0x000A, 0x4381, 0x0004, 0x403B, 0x1112, -0x410C, 0x503C, 0x000E, 0x12B0, 0xDA22, 0x410C, 0x503C, 0x000C, 0x12B0, -0xDA22, 0x410C, 0x503C, 0x0006, 0x4B2F, 0x129F, 0x0018, 0x410C, 0x532C, -0x12B0, 0xDA22, 0x410C, 0x503C, 0x000A, 0x12B0, 0xDA22, 0x410C, 0x12B0, -0xDA22, 0x410C, 0x522C, 0x12B0, 0xDA22, 0x403B, 0x1360, 0x434C, 0x12AB, -0x4038, 0x1354, 0x407A, 0x0082, 0x12B0, 0xD934, 0x4039, 0x1358, 0x4A0C, -0x12A9, 0x4076, 0x00C8, 0x464C, 0x12A8, 0x403C, 0x1401, 0x12B0, 0xD604, -0x411C, 0x0002, 0x12A9, 0x12B0, 0xD60A, 0x403C, 0x3FFD, 0x12B0, 0xD62E, -0x4077, 0x0021, 0x12B0, 0xD63A, 0x435C, 0x12AB, 0x464C, 0x12A8, 0x403C, -0x0501, 0x12B0, 0xD62E, 0x407C, 0x0042, 0x12A8, 0x435C, 0x12AB, 0x12B0, -0xD864, 0x403C, 0x0500, 0x12A9, 0x407C, 0x00C1, 0x12A8, 0x411C, 0x000E, -0x430D, 0x1292, 0x135A, 0x435C, 0x12AB, 0x407C, 0x00A1, 0x12A8, 0x411C, -0x000C, 0x12B0, 0xD862, 0x403C, 0x0501, 0x12A9, 0x435C, 0x12AB, 0x12B0, -0xD60A, 0xB0B1, 0x0010, 0x0002, 0x2805, 0x50B1, 0xFFFE, 0x0006, 0x63B1, -0x0008, 0x411C, 0x0006, 0x411D, 0x0008, 0x12B0, 0xD196, 0x4C04, 0xF034, -0x0F00, 0x5034, 0x0080, 0x4115, 0x0006, 0x407C, 0x0028, 0x12A8, 0x430C, -0x12B0, 0xDA1C, 0x12B0, 0xD934, 0x440C, 0x12B0, 0xD862, 0x403C, 0x1400, -0x12B0, 0xD604, 0x450C, 0x12A9, 0x12B0, 0xD60A, 0x403C, 0x4303, 0x12B0, -0xDA1C, 0x12B0, 0xD63A, 0x9381, 0x0000, 0x240A, 0x12B0, 0xD830, 0x12B0, -0xD934, 0x412C, 0x12B0, 0xDA1C, 0x474C, 0x12A8, 0x3C08, 0x435C, 0x12AB, -0x12B0, 0xD830, 0x474C, 0x12A8, 0x434C, 0x12AB, 0x435C, 0x12AB, 0x407C, -0x0030, 0x12A8, 0x411C, 0x000A, 0x12A9, 0x9382, 0x138E, 0x2413, 0x407C, -0x00F4, 0x12A8, 0x430C, 0x12A9, 0x4C0B, 0x407C, 0x00F4, 0x12A8, 0xC21B, -0x138E, 0xD21B, 0x1390, 0x4B0C, 0x12A9, 0x403C, 0x0014, 0x1292, 0x275A, -0x421F, 0x1382, 0xD21F, 0x1384, 0x930F, 0x241C, 0x407C, 0x0054, 0x12A8, -0x430C, 0x430D, 0x1292, 0x135C, 0x4C0A, 0x4D0B, 0x407C, 0x0054, 0x12A8, -0xC21A, 0x1382, 0xC21B, 0x1384, 0xD21A, 0x1386, 0xD21B, 0x1388, 0x4A0C, -0x4B0D, 0x1292, 0x135C, 0x403C, 0x0014, 0x1292, 0x275A, 0x407C, 0x00A8, -0x12A8, 0x9381, 0x0004, 0x2402, 0x1292, 0x2756, 0x430C, 0x5031, 0x0010, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x403F, -0x150C, 0x403D, 0x1504, 0x403A, 0x2839, 0x403B, 0x277E, 0xB2D2, 0x2780, -0x1100, 0x2419, 0x4A82, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0x4217, 0x2784, 0xCBE7, 0x0000, -0x4217, 0x2784, 0xDBE7, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x3C1B, -0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0x4217, 0x2784, 0xCBE7, 0x0000, 0x4217, -0x2784, 0xDBE7, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x4A82, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, -0x4303, 0x4B68, 0xE378, 0x4219, 0x2784, 0xF8C9, 0x0000, 0xDBE9, 0x0000, -0xD232, 0x4D27, 0xEFE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x4076, 0x0080, -0xB64C, 0x2408, 0x3C10, 0xB356, 0x2BFB, 0xB64C, 0x2409, 0x4A82, 0x01EA, -0x3C09, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, -0xC232, 0x4303, 0xF8C9, 0x0000, 0x5E4E, 0x4217, 0x2782, 0xB2D7, 0x2781, -0x0000, 0x2002, 0x4347, 0x3C01, 0x4357, 0xD74E, 0xDBE9, 0x0000, 0xD232, -0x4D27, 0xEFE7, 0x0000, 0x1106, 0x23D1, 0x93D2, 0x1396, 0x2004, 0x43C2, -0x1100, 0x43C2, 0x1396, 0xB2D2, 0x2780, 0x1100, 0x241D, 0x4A82, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, -0x4303, 0xF8C9, 0x0000, 0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, -0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x3C1A, -0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBE9, 0x0000, 0xD232, -0x4D27, 0xEFE7, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBE9, 0x0000, 0xD232, -0x4D2B, 0xEFEB, 0x0000, 0x4E4C, 0x4030, 0xD422, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0010, 0x403A, 0x1354, -0x407C, 0x0028, 0x12AA, 0x4C4C, 0x4036, 0x135C, 0x403B, 0x1358, 0x903C, -0x0091, 0x2003, 0x12B0, 0xBCBA, 0x3C0B, 0x903C, 0x0099, 0x2008, 0x12B0, -0xBCBA, 0x407C, 0x0054, 0x12AA, 0x430C, 0x431D, 0x12A6, 0x12B0, 0xBCC6, -0x403C, 0x6D8E, 0x430D, 0x12A6, 0x407C, 0x0030, 0x12AA, 0x403C, 0x0005, -0x12AB, 0x4078, 0x00C8, 0x484C, 0x12AA, 0x403C, 0x1501, 0x12AB, 0x4307, -0x12B0, 0xBCB0, 0x3C03, 0x430C, 0x12AB, 0x5317, 0xB03C, 0x0200, 0x2C03, -0x9037, 0x0032, 0x3BF7, 0x9037, 0x0032, 0x34BB, 0x4039, 0x1360, 0x12B0, -0xBC9C, 0x403C, 0x0C01, 0x12AB, 0x403C, 0x0028, 0x1292, 0x275A, 0x403C, -0x0401, 0x12B0, 0xBCA6, 0x12B0, 0xBCA8, 0x12B0, 0xBCA8, 0x12B0, 0xBCA8, -0x12B0, 0xBC9C, 0x403C, 0x0501, 0x12B0, 0xBCA6, 0x407C, 0x0030, 0x12AA, -0x403C, 0x000E, 0x12AB, 0x12B0, 0xBCB0, 0x4035, 0x1112, 0x410C, 0x532C, -0x452F, 0x129F, 0x0016, 0x410C, 0x452F, 0x129F, 0x0016, 0x12B0, 0xBC92, -0x4034, 0x135A, 0x411C, 0x0002, 0x12B0, 0xBCD4, 0x4C81, 0x0006, 0x12B0, -0xBC8A, 0x415F, 0x0006, 0xDF81, 0x0000, 0x12B0, 0xBCF4, 0x411C, 0x0002, -0x12B0, 0xBCE6, 0x412C, 0x12B0, 0xBD08, 0x407C, 0x0021, 0x12AA, 0x430C, -0x430D, 0x12A4, 0x903C, 0xFFFE, 0x200F, 0x930D, 0x200D, 0x12B0, 0xBC92, -0x403C, 0xFFFE, 0x12B0, 0xBCD4, 0x4C81, 0x0008, 0x12B0, 0xBC8A, 0x4381, -0x000A, 0x3C07, 0x503C, 0xFFFC, 0x633D, 0x4C81, 0x0008, 0x4D81, 0x000A, -0x4381, 0x000C, 0x431C, 0x452F, 0x129F, 0x001A, 0x4307, 0x470C, 0x503C, -0x1102, 0x452F, 0x129F, 0x0014, 0x475F, 0x1102, 0x907F, 0x003C, 0x2C28, -0x4FD1, 0x12F2, 0x0004, 0x93C1, 0x0004, 0x2422, 0x431C, 0x474E, 0x12B0, -0xD6CA, 0xBC82, 0x1144, 0x2002, 0x430F, 0x3C01, 0x431F, 0x4F81, 0x000E, -0x12B0, 0xBCF4, 0x403C, 0x0110, 0x12B0, 0xBCE6, 0x415C, 0x0004, 0x503C, -0x9600, 0x12B0, 0xBD08, 0x12B0, 0xBCF4, 0x403C, 0x011E, 0x12B0, 0xBCE6, -0x411C, 0x000E, 0x12B0, 0xBD08, 0x5317, 0x9037, 0x0010, 0x3BC9, 0x12B0, -0xBCC6, 0x403C, 0x000E, 0x430D, 0x12A6, 0x403C, 0x00B0, 0x430D, 0x12A6, -0x403C, 0x0045, 0x430D, 0x12A6, 0x423D, 0x410C, 0x503C, 0x0006, 0x452F, -0x129F, 0x0006, 0x430C, 0x3C01, 0x433C, 0x5031, 0x0010, 0x4030, 0xD41E, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, -0x005C, 0x4334, 0x410C, 0x503C, 0x0016, 0x403E, 0x27FB, 0x403D, 0x001F, -0x12B0, 0xD454, 0x430A, 0x3C08, 0x410C, 0x503C, 0x0036, 0x5A0C, 0x4B2F, -0x129F, 0x0014, 0x531A, 0x403B, 0x1112, 0x4036, 0x0016, 0x960A, 0x2BF2, -0x4039, 0x0003, 0x4108, 0x5038, 0x004C, 0xB0F1, 0x0010, 0x003E, 0x2C14, -0x1208, 0x460F, 0x410E, 0x532E, 0x403D, 0x001F, 0x410C, 0x503C, 0x0018, -0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1244, 0x480C, 0x4B2F, 0x129F, -0x0010, 0x5321, 0x4107, 0x5037, 0x0036, 0x1208, 0x430F, 0x430E, 0x460D, -0x470C, 0x4B25, 0x1295, 0x000E, 0x490C, 0x1292, 0x1234, 0x480C, 0x4B2F, -0x129F, 0x0010, 0x407C, 0x0046, 0x1292, 0x1354, 0x430C, 0x430D, 0x430E, -0x430F, 0x1292, 0x135E, 0x5321, 0x930F, 0x3402, 0x430C, 0x3C98, 0xB0F1, -0x0010, 0x003E, 0x2C82, 0x407C, 0x0046, 0x1292, 0x1354, 0x430C, 0x430D, -0x430E, 0x430F, 0x1292, 0x135E, 0x531A, 0xB31E, 0x2C03, 0x903A, 0x01F4, -0x2BF4, 0x903A, 0x01F4, 0x2C80, 0x1208, 0x430F, 0x431E, 0x460D, 0x470C, -0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1230, 0x4C04, 0x480C, 0x4B2F, -0x129F, 0x0010, 0x40F1, 0x0005, 0x0018, 0x43C1, 0x0019, 0x41D1, 0x0002, -0x001A, 0x41D1, 0x0003, 0x001B, 0x41D1, 0x0004, 0x001C, 0x41D1, 0x0005, -0x001D, 0x43E1, 0x001E, 0x41D1, 0x0006, 0x001F, 0x41D1, 0x0007, 0x0020, -0x41D1, 0x0008, 0x0021, 0x41D1, 0x0009, 0x0022, 0x42E1, 0x0023, 0x41D1, -0x000A, 0x0024, 0x41D1, 0x000B, 0x0025, 0x41D1, 0x000C, 0x0026, 0x41D1, -0x000D, 0x0027, 0x40F1, 0x0006, 0x0028, 0x41D1, 0x000E, 0x0029, 0x41D1, -0x000F, 0x002A, 0x41D1, 0x0010, 0x002B, 0x41D1, 0x0011, 0x002C, 0x40F1, -0x0080, 0x002D, 0x41D1, 0x0012, 0x002E, 0x41D1, 0x0013, 0x002F, 0x41D1, -0x0014, 0x0030, 0x41D1, 0x0015, 0x0031, 0x1208, 0x430F, 0x430E, 0x403D, -0x001F, 0x410C, 0x503C, 0x001A, 0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, -0x1244, 0x480C, 0x4B2F, 0x129F, 0x0010, 0x5221, 0x3C11, 0x1208, 0x430F, -0x431E, 0x460D, 0x470C, 0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1230, -0x480C, 0x4B2F, 0x129F, 0x0010, 0x4304, 0x5321, 0x440C, 0x5031, 0x005C, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x0012, 0x403B, 0x1112, 0x410C, 0x503C, 0x000A, 0x12B0, -0xCCD2, 0x2403, 0x403C, 0xFFE8, 0x3CD6, 0x410C, 0x523C, 0x12B0, 0xCCD2, -0x2403, 0x403C, 0xFFE7, 0x3CCE, 0x410C, 0x503C, 0x000E, 0x4B2F, 0x129F, -0x0018, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3CC3, 0x410C, 0x503C, 0x0006, -0x12B0, 0xCCD2, 0x2403, 0x403C, 0xFFE5, 0x3CBA, 0x410C, 0x522C, 0x12B0, -0xCCD2, 0x2403, 0x403C, 0xFFE4, 0x3CB2, 0x410C, 0x532C, 0x4B2F, 0x129F, -0x0016, 0x933C, 0x2003, 0x403C, 0xFFE3, 0x3CA8, 0x410C, 0x4B2F, 0x129F, -0x0016, 0x933C, 0x2002, 0x4381, 0x0000, 0x403A, 0x1354, 0x4074, 0x0088, -0x444C, 0x12AA, 0x403B, 0x1356, 0x407C, 0x0034, 0x12AB, 0x4078, 0x0082, -0x484C, 0x12AA, 0x4039, 0x1360, 0x435C, 0x12A9, 0x4036, 0x1358, 0x480C, -0x12B0, 0xCCBE, 0x411C, 0x0006, 0x12B0, 0xCCBE, 0x403C, 0x3FFD, 0x12B0, -0xDA0A, 0x407C, 0x0042, 0x12B0, 0xCCDC, 0x484C, 0x12AA, 0x403C, 0x3FFF, -0x12A6, 0x12B0, 0xD812, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12A9, 0x434C, -0x12A9, 0x407C, 0x0048, 0x12AA, 0x427C, 0x12AB, 0x407C, 0x00C1, 0x12AA, -0x411C, 0x000A, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12AA, 0x411C, -0x0008, 0x12A6, 0x435C, 0x12A9, 0x12B0, 0xD812, 0x403C, 0x2401, 0x12A6, -0x4077, 0x0021, 0x12B0, 0xCCF2, 0x411C, 0x000E, 0x411D, 0x0010, 0x12B0, -0xD196, 0x4C05, 0xF035, 0x0F00, 0xD035, 0x0080, 0x4191, 0x000E, 0x000C, -0x444C, 0x12AA, 0x407C, 0x0034, 0x12AB, 0x484C, 0x12AA, 0x450C, 0x12B0, -0xDA0A, 0x435C, 0x12A9, 0x411C, 0x000C, 0x12B0, 0xDA0A, 0x474C, 0x12B0, -0xCCDC, 0x93A2, 0x137C, 0x200F, 0x9382, 0x137E, 0x200C, 0x407C, 0x00B0, -0x12AA, 0x480C, 0x430D, 0x1292, 0x135C, 0x403C, 0x000F, 0x430D, 0x1292, -0x135C, 0x407C, 0x0030, 0x12AA, 0x411C, 0x0004, 0x12A6, 0x9381, 0x0002, -0x2409, 0x484C, 0x12AA, 0x411C, 0x0002, 0x12B0, 0xDA0A, 0x12B0, 0xCCF2, -0x3C02, 0x474C, 0x12AA, 0x407C, 0x00A8, 0x12AA, 0x9381, 0x0000, 0x2402, -0x1292, 0x2756, 0x430C, 0x5031, 0x0012, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x421F, 0x01F2, 0x40B2, 0x2839, 0x01EA, 0x40B2, 0x2845, 0x01F2, -0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x403E, 0x150C, 0x403D, 0x1504, -0x4D2B, 0xEEEB, 0x0000, 0xC232, 0x4303, 0x425C, 0x277E, 0x4C4A, 0xE37A, -0x421B, 0x2784, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D2B, 0xEEEB, -0x0000, 0x4F82, 0x01F2, 0x430C, 0x4030, 0xD428, 0x120A, 0x120B, 0x1208, -0x40B2, 0x2839, 0x01EA, 0x407E, 0x0006, 0x403F, 0x150C, 0x403D, 0x1504, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2B, 0xEFEB, 0x0000, 0xC232, -0x4303, 0x425C, 0x277E, 0x4C4A, 0xE37A, 0x421B, 0x2784, 0xFACB, 0x0000, -0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEFE8, 0x0000, 0x537E, 0x23E6, 0x40B2, -0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2E, 0xEFEE, -0x0000, 0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D2B, -0xEFEB, 0x0000, 0x3FC1, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x005C, 0x4337, 0x410C, 0x503C, 0x0016, 0x403E, -0x281A, 0x403D, 0x001F, 0x12B0, 0xD454, 0x4304, 0x403A, 0x0016, 0x403B, -0x1112, 0x4108, 0x5038, 0x0036, 0x480C, 0x540C, 0x4B2F, 0x129F, 0x0014, -0x5314, 0x9A04, 0x2BF8, 0x4039, 0x0003, 0x4106, 0x5036, 0x004C, 0xB0F1, -0x0010, 0x003E, 0x2C0F, 0x1206, 0x4A0F, 0x410E, 0x532E, 0x403D, 0x001F, -0x410C, 0x503C, 0x0018, 0x4B25, 0x1295, 0x000E, 0x12B0, 0xD55C, 0x5321, -0x1206, 0x430F, 0x430E, 0x4A0D, 0x480C, 0x4B25, 0x1295, 0x000E, 0x490C, -0x1292, 0x1234, 0x12B0, 0xD562, 0x5321, 0xB0F1, 0x0010, 0x003E, 0x2C73, -0x407C, 0x00D0, 0x1292, 0x1354, 0x430C, 0x1292, 0x1358, 0x5314, 0x934C, -0x3803, 0x9034, 0x01F4, 0x2BF7, 0x9034, 0x01F4, 0x2C81, 0x1206, 0x12B0, -0xD56A, 0x490C, 0x1292, 0x1230, 0x4C07, 0x12B0, 0xD562, 0x40F1, 0x0005, -0x0018, 0x43C1, 0x0019, 0x41D1, 0x0002, 0x001A, 0x41D1, 0x0003, 0x001B, -0x41D1, 0x0004, 0x001C, 0x41D1, 0x0005, 0x001D, 0x43E1, 0x001E, 0x41D1, -0x0006, 0x001F, 0x41D1, 0x0007, 0x0020, 0x41D1, 0x0008, 0x0021, 0x41D1, -0x0009, 0x0022, 0x42E1, 0x0023, 0x41D1, 0x000A, 0x0024, 0x41D1, 0x000B, -0x0025, 0x41D1, 0x000C, 0x0026, 0x41D1, 0x000D, 0x0027, 0x40F1, 0x0006, -0x0028, 0x41D1, 0x000E, 0x0029, 0x41D1, 0x000F, 0x002A, 0x41D1, 0x0010, -0x002B, 0x41D1, 0x0011, 0x002C, 0x40F1, 0x0080, 0x002D, 0x41D1, 0x0012, -0x002E, 0x41D1, 0x0013, 0x002F, 0x41D1, 0x0014, 0x0030, 0x41D1, 0x0015, -0x0031, 0x1206, 0x430F, 0x430E, 0x403D, 0x001F, 0x410C, 0x503C, 0x001A, -0x4B2A, 0x129A, 0x000E, 0x12B0, 0xD55C, 0x5221, 0x3C1E, 0x407C, 0x0028, -0x1292, 0x1354, 0x4C4C, 0x903C, 0x0089, 0x240C, 0x903C, 0x008D, 0x2409, -0x903C, 0x0091, 0x2406, 0x903C, 0x0095, 0x2403, 0x903C, 0x0099, 0x2009, -0x1206, 0x12B0, 0xD56A, 0x490C, 0x1292, 0x1230, 0x12B0, 0xD562, 0x5321, -0x4307, 0x470C, 0x5031, 0x005C, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x4C4A, 0x403B, 0x150C, 0x4038, 0x1504, 0x4039, 0x0190, -0xB0F2, 0x0040, 0x1100, 0xD0F2, 0x0040, 0x0029, 0x4216, 0x2758, 0x490C, -0x280F, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x3C0E, 0x1286, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0xC0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xCBEF, 0x0000, 0xD0F2, 0x0040, 0x0029, 0x4216, 0x2758, -0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xC0F2, 0x0040, -0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xC0F2, -0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, -0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, -0x4A4E, 0x430F, 0x423C, 0x12B0, 0x61B6, 0x4030, 0xD424, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0xB2D2, 0x2780, 0x1100, 0x2404, 0x40B2, 0x2839, -0x01EA, 0x3C03, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x403F, 0x150C, 0x403D, 0x1504, 0x4D2B, 0xEFEB, 0x0000, 0xC232, -0x4303, 0x425A, 0x277E, 0x4A4B, 0xE37B, 0x4218, 0x2784, 0xFBC8, 0x0000, -0xDAC8, 0x0000, 0xD232, 0x4D2E, 0xEFEE, 0x0000, 0x40B2, 0x2845, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2E, 0xEFEE, 0x0000, 0xC232, -0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D2E, 0xEFEE, 0x0000, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2E, 0xEFEE, 0x0000, 0xC232, -0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D2E, 0xEFEE, 0x0000, -0x4079, 0x0080, 0xB94C, 0x2409, 0x3C11, 0xB359, 0x2BFB, 0xB94C, 0x240A, -0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, -0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4D26, 0xEFE6, 0x0000, 0xC232, 0x4303, 0xFBC8, 0x0000, 0x5E4E, 0x4216, -0x2782, 0xB2D6, 0x2781, 0x0000, 0x2002, 0x4346, 0x3C01, 0x4356, 0xD64E, -0xDAC8, 0x0000, 0xD232, 0x4D26, 0xEFE6, 0x0000, 0x1109, 0x23D0, 0x93D2, -0x1396, 0x2004, 0x43C2, 0x1100, 0x43C2, 0x1396, 0xB2D2, 0x2780, 0x1100, -0x241E, 0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, -0xD232, 0x4D29, 0xEFE9, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, -0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D29, 0xEFE9, 0x0000, 0xD0B2, 0x0010, -0x01F0, 0xD392, 0x01F0, 0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, -0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D2B, 0xEFEB, 0x0000, 0x4E4C, 0x4030, -0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, -0x000A, 0x4381, 0x0000, 0x430B, 0x430A, 0x4309, 0x4338, 0x4381, 0x0002, -0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0008, 0x410C, 0x421F, 0x1112, -0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFC1, 0x3CB5, 0x430B, 0x3C01, -0x531B, 0x912B, 0x2C0E, 0x410C, 0x532C, 0x4B0F, 0x5F0F, 0x5F0C, 0x421F, -0x1112, 0x129F, 0x0016, 0x930C, 0x37F2, 0x403C, 0xFFC0, 0x3CA2, 0x430C, -0x1292, 0x274E, 0x434C, 0x1292, 0x276C, 0x434C, 0x1292, 0x2754, 0x1292, -0x134E, 0x434C, 0x1292, 0x276C, 0x1292, 0x1350, 0x430A, 0x430B, 0x4308, -0x4116, 0x0002, 0x4117, 0x0004, 0x4039, 0x0011, 0x407C, 0x0086, 0x1292, -0x1354, 0x430C, 0x1292, 0x1358, 0x4C09, 0x531A, 0x630B, 0x930B, 0x2806, -0x2003, 0x903A, 0x0BB8, 0x2802, 0x4318, 0x3C08, 0xB329, 0x2C06, 0x930B, -0x2BEE, 0x2003, 0x903A, 0x0BB8, 0x2BEA, 0x930B, 0x2804, 0x2011, 0x903A, -0x0BB8, 0x2C0E, 0x4039, 0x0011, 0x490C, 0x1292, 0x1358, 0x4C09, 0x460C, -0x1292, 0x1358, 0x4C09, 0x470C, 0x1292, 0x1358, 0x4C09, 0x9318, 0x2003, -0x403C, 0xFFCE, 0x3C56, 0x90B1, 0x0003, 0x0000, 0x2843, 0x435C, 0x1292, -0x276C, 0x403C, 0x00C8, 0x1292, 0x275A, 0x430A, 0x430B, 0x4308, 0x4116, -0x0006, 0x4114, 0x0008, 0x4037, 0x0011, 0x407C, 0x0086, 0x1292, 0x1354, -0x430C, 0x1292, 0x1358, 0x4C09, 0x531A, 0x630B, 0x930B, 0x2806, 0x2003, -0x903A, 0x0BB8, 0x2802, 0x4318, 0x3C08, 0xB329, 0x2C06, 0x930B, 0x2BEE, -0x2003, 0x903A, 0x0BB8, 0x2BEA, 0x930B, 0x2804, 0x2011, 0x903A, 0x0BB8, -0x2C0E, 0x4037, 0x0011, 0x470C, 0x1292, 0x1358, 0x4C09, 0x460C, 0x1292, -0x1358, 0x4C09, 0x440C, 0x1292, 0x1358, 0x4C09, 0x9318, 0x2003, 0x403C, -0xFFCE, 0x3C0F, 0x407C, 0x0028, 0x1292, 0x1354, 0x4C4A, 0x903A, 0x0095, -0x2403, 0x403C, 0xFFCE, 0x3C04, 0x435C, 0x1292, 0x276C, 0x430C, 0x5031, -0x000A, 0x4030, 0xD420, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x003A, 0x4306, 0x4304, 0x430A, 0x403B, 0x1112, -0x4107, 0x5037, 0x0014, 0x470C, 0x5A0C, 0x4B2F, 0x129F, 0x0014, 0x531A, -0x903A, 0x0016, 0x2BF7, 0x4038, 0x1354, 0xB0F1, 0x0010, 0x001C, 0x2807, -0x4226, 0x407C, 0x0028, 0x12A8, 0xB26C, 0x2C01, 0x4314, 0x407C, 0x00B0, -0x12A8, 0x4039, 0x135C, 0x403C, 0x0003, 0x12B0, 0xD7CC, 0x4C81, 0x0010, -0x4D81, 0x0012, 0x403C, 0x0005, 0x12B0, 0xD7CC, 0x4C81, 0x000C, 0x4D81, -0x000E, 0x403C, 0x0007, 0x12B0, 0xD7CC, 0x4C81, 0x0008, 0x4D81, 0x000A, -0x403C, 0x0081, 0x12B0, 0xD7CC, 0x4C81, 0x0004, 0x4D81, 0x0006, 0x431C, -0x12B0, 0xD7CC, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x12B0, 0xD652, 0x460C, -0x430D, 0x12A9, 0x422C, 0x430D, 0x12A9, 0x433C, 0x433D, 0x12A9, 0x403C, -0x0006, 0x12B0, 0xD7EA, 0x403C, 0x0080, 0x12B0, 0xD7EA, 0x4106, 0x5036, -0x002A, 0x1206, 0x430F, 0x430E, 0x403D, 0x0016, 0x470C, 0x4B25, 0x1295, -0x000E, 0x403C, 0x0003, 0x1292, 0x11E8, 0x12B0, 0xD858, 0x5321, 0x9305, -0x2409, 0x450C, 0x3C56, 0x4304, 0x407C, 0x0021, 0x12A8, 0x407C, 0x00A8, -0x12A8, 0x407C, 0x00D0, 0x12A8, 0x430C, 0x1292, 0x1358, 0x531A, 0x934C, -0x3803, 0x903A, 0x0064, 0x2BF7, 0x903A, 0x0064, 0x2803, 0x403C, 0xFFCC, -0x3C3D, 0x9304, 0x23E5, 0x12B0, 0xD652, 0x411C, 0x0010, 0x411D, 0x0012, -0x12A9, 0x422C, 0x430D, 0x12A9, 0x411C, 0x000C, 0x411D, 0x000E, 0x12A9, -0x403C, 0x0006, 0x430D, 0x12A9, 0x411C, 0x0008, 0x411D, 0x000A, 0x12A9, -0x403C, 0x0080, 0x430D, 0x12A9, 0x411C, 0x0004, 0x411D, 0x0006, 0x12A9, -0x430C, 0x430D, 0x12A9, 0x412C, 0x411D, 0x0002, 0x12A9, 0x1206, 0x430F, -0x431E, 0x403D, 0x0016, 0x470C, 0x4B27, 0x1297, 0x000E, 0x403C, 0x0003, -0x1292, 0x11E4, 0x12B0, 0xD858, 0x5321, 0x9305, 0x23A9, 0x430C, 0x5031, -0x003A, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0xB2D2, -0x2780, 0x1100, 0x2404, 0x40B2, 0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x403D, 0x150C, 0x403A, -0x1504, 0x4A2F, 0xEDEF, 0x0000, 0xC232, 0x4303, 0x425B, 0x277E, 0x4B48, -0xE378, 0x4219, 0x2784, 0xF8C9, 0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2F, -0xEDEF, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4A2F, 0xEDEF, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, -0x0000, 0xD232, 0x4A2F, 0xEDEF, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4A2F, 0xEDEF, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, -0x0000, 0xD232, 0x4A2F, 0xEDEF, 0x0000, 0x4036, 0x8000, 0xB60C, 0x2409, -0x3C11, 0xB316, 0x2BFB, 0xB60C, 0x240A, 0x40B2, 0x2839, 0x01EA, 0x3C09, -0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4A2E, 0xEDEE, 0x0000, 0xC232, -0x4303, 0xF8C9, 0x0000, 0x5F0F, 0x421E, 0x2782, 0xB2DE, 0x2781, 0x0000, -0x2002, 0x434E, 0x3C01, 0x435E, 0xDE0F, 0xDBC9, 0x0000, 0xD232, 0x4A2E, -0xEDEE, 0x0000, 0xC312, 0x1006, 0x9306, 0x23CE, 0xB2D2, 0x2780, 0x1100, -0x241E, 0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4A2E, 0xEDEE, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, 0x0000, -0xD232, 0x4A2E, 0xEDEE, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4A2E, 0xEDEE, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2E, 0xEDEE, 0x0000, 0xD0B2, 0x0010, -0x01F0, 0xD392, 0x01F0, 0x4A2E, 0xEDEE, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2B, 0xEDEB, 0x0000, 0x4F0C, 0x4030, -0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x4C0A, 0x430B, -0xB31C, 0x287C, 0x4037, 0x14CA, 0x470C, 0x421F, 0x1112, 0x129F, 0x0018, -0x930C, 0x2403, 0x403C, 0xFFFB, 0x3CB6, 0x403C, 0x14C6, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, 0x3CAB, 0x472E, 0x471F, -0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0x503E, 0x0080, -0x4E82, 0x14D2, 0x47A2, 0x14CA, 0x4382, 0x14CC, 0x4038, 0x1354, 0x407C, -0x0028, 0x12A8, 0x4039, 0x1358, 0x430C, 0x12A9, 0x4036, 0x1360, 0x434C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x435C, 0x12A6, 0x421C, 0x14D2, 0x12A9, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x1400, 0x12A9, 0x407C, -0x0082, 0x12A8, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x472C, 0x12A9, 0x434C, -0x12A6, 0x435C, 0x12A6, 0x403C, 0x4303, 0x12A9, 0x434C, 0x12A6, 0x407C, -0x0021, 0x12A8, 0x430C, 0x430D, 0x1292, 0x135A, 0x407C, 0x00C8, 0x12A8, -0x403C, 0x0500, 0x12A9, 0x435C, 0x12A6, 0x407C, 0x00C2, 0x12A8, 0x3C12, -0x403C, 0x14CE, 0x421F, 0x1112, 0x129F, 0x0016, 0x4C0B, 0x421C, 0x14CE, -0x1292, 0x1358, 0x434C, 0x1292, 0x1360, 0x53B2, 0x14C6, 0x63B2, 0x14C8, -0x421F, 0x14C6, 0xD21F, 0x14C8, 0x930F, 0x2414, 0x930B, 0x2012, 0x435C, -0x1292, 0x1360, 0xB392, 0x14C6, 0x2BE0, 0x403C, 0x14D0, 0x421F, 0x1112, -0x129F, 0x0016, 0x4C0B, 0x421C, 0x14D0, 0x1292, 0x1358, 0x3FDF, 0xB32A, -0x2812, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x0501, 0x1292, 0x1358, -0x421C, 0x14D4, 0x421F, 0x1112, 0x129F, 0x0008, 0x435C, 0x1292, 0x1360, -0x3C17, 0x931B, 0x2008, 0x407C, 0x0091, 0x421F, 0x1112, 0x129F, 0x0012, -0x430B, 0x3C0D, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x0501, 0x1292, -0x1358, 0x403B, 0xFFF6, 0x435C, 0x1292, 0x1360, 0x4B0C, 0x4030, 0xD422, -0x407C, 0x00C1, 0x4820, 0x12B0, 0x80A8, 0x933C, 0x4130, 0x421F, 0x1112, -0x4F10, 0x0016, 0x12B0, 0x80A8, 0x930C, 0x4130, 0x12B0, 0x8184, 0x12B0, -0x813E, 0x430C, 0x4B20, 0x431C, 0x1292, 0x275A, 0x444C, 0x12A8, 0x430C, -0x12AB, 0x53B1, 0x0002, 0x421F, 0x13AA, 0x4130, 0x434C, 0x12AA, 0x435C, -0x4A20, 0x434C, 0x12AA, 0x444C, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, -0x12AA, 0x4130, 0x12B0, 0xD36E, 0x494C, 0x4820, 0x12B0, 0x80F8, 0x403C, -0x00FE, 0x12B0, 0xD36E, 0x12B0, 0x80DC, 0x430C, 0x4B20, 0x12B0, 0x80F8, -0x12B0, 0xD36A, 0x12B0, 0x8126, 0x470C, 0x4030, 0x814E, 0x434C, 0x4030, -0x8200, 0x12B0, 0x811C, 0x12B0, 0xD84E, 0x12B0, 0x8126, 0x403C, 0x2409, -0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12B0, 0x814E, 0x4030, 0x8174, -0x12AB, 0x435C, 0x4A20, 0x12B0, 0x817A, 0x421C, 0x13A6, 0x4130, 0x12B0, -0xD2E8, 0x4B20, 0x12B0, 0x817A, 0x421C, 0x13C2, 0xD03C, 0x0040, 0x12B0, -0x814E, 0x12B0, 0x81EE, 0x4A20, 0x12B0, 0x8206, 0x12A8, 0x403C, 0x012C, -0x12AB, 0x407C, 0x00A1, 0x4820, 0x403C, 0x0003, 0x1292, 0x1190, 0x410C, -0x503C, 0x0026, 0x421F, 0x1112, 0x129F, 0x0010, 0x403C, 0x13B0, 0x12B0, -0xB49C, 0x12B0, 0x8206, 0x12A8, 0x403C, 0x0128, 0x12B0, 0x8184, 0x421C, -0x13BE, 0x12B0, 0x8214, 0x403C, 0x012A, 0x12B0, 0x8184, 0x421C, 0x13C0, -0x12B0, 0x8214, 0x403C, 0x012C, 0x12B0, 0x8184, 0x421C, 0x13C2, 0x12AB, -0x435C, 0x12AA, 0x12B0, 0xD2E8, 0x12AB, 0x4C81, 0x0004, 0x3FC3, 0x12B0, -0x81FE, 0x470C, 0x12AB, 0x444C, 0x12A8, 0x435C, 0x4130, 0x434C, 0x12AA, -0x464C, 0x4820, 0x12B0, 0xD146, 0x12B0, 0xD646, 0x407C, 0x00C1, 0x4130, -0x12B0, 0x814E, 0x12B0, 0xD140, 0x12B0, 0xD646, 0x3F3C, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0030, 0x4304, -0x430A, 0x430B, 0x4038, 0x1112, 0x4109, 0x5039, 0x000A, 0x490C, 0x5B0C, -0x482F, 0x129F, 0x0014, 0x531B, 0x903B, 0x0016, 0x2BF7, 0x4036, 0x1354, -0xB0F1, 0x0010, 0x0012, 0x2807, 0x4224, 0x407C, 0x0028, 0x12A6, 0xB26C, -0x2C01, 0x431A, 0x407C, 0x0090, 0x12A6, 0x4037, 0x1358, 0x403C, 0x0003, -0x12B0, 0xDA16, 0x4C81, 0x0008, 0x403C, 0x0005, 0x12B0, 0xDA16, 0x4C81, -0x0006, 0x403C, 0x0007, 0x12B0, 0xDA16, 0x4C81, 0x0004, 0x403C, 0x0081, -0x12B0, 0xDA16, 0x4C81, 0x0002, 0x431C, 0x12B0, 0xDA16, 0x4C81, 0x0000, -0x12B0, 0xD880, 0x440C, 0x12A7, 0x422C, 0x12A7, 0x433C, 0x12A7, 0x403C, -0x0006, 0x12A7, 0x431C, 0x12A7, 0x403C, 0x0080, 0x12A7, 0x431C, 0x12A7, -0x4104, 0x5034, 0x0020, 0x1204, 0x430F, 0x430E, 0x403D, 0x0016, 0x490C, -0x4825, 0x1295, 0x000E, 0x403C, 0x0003, 0x1292, 0x1194, 0x12B0, 0xD88A, -0x5321, 0x9305, 0x2409, 0x450C, 0x3C46, 0x430A, 0x407C, 0x0021, 0x12A6, -0x407C, 0x00A8, 0x12A6, 0x407C, 0x00D0, 0x12A6, 0x430C, 0x12A7, 0x531B, -0x934C, 0x3803, 0x903B, 0x0032, 0x2BF8, 0x903B, 0x0032, 0x2803, 0x403C, -0xFFCC, 0x3C2E, 0x930A, 0x23E6, 0x12B0, 0xD880, 0x411C, 0x0008, 0x12A7, -0x422C, 0x12A7, 0x411C, 0x0006, 0x12A7, 0x403C, 0x0006, 0x12A7, 0x411C, -0x0004, 0x12A7, 0x403C, 0x0080, 0x12A7, 0x411C, 0x0002, 0x12B0, 0xDA16, -0x412C, 0x12A7, 0x1204, 0x430F, 0x431E, 0x403D, 0x0016, 0x490C, 0x482B, -0x129B, 0x000E, 0x403C, 0x0003, 0x1292, 0x1190, 0x12B0, 0xD88A, 0x5321, -0x9305, 0x23B9, 0x430C, 0x5031, 0x0030, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x4C08, 0x4E0A, 0x4F0B, 0x4039, -0x150C, 0x4036, 0x1504, 0x4037, 0x0190, 0xB0F2, 0x0040, 0x1100, 0xD0F2, -0x0040, 0x0029, 0x4214, 0x2758, 0x470C, 0x280F, 0x1284, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, -0x0040, 0x0029, 0x3C0E, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xC0F2, 0x0040, 0x0029, 0x470C, -0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, -0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC9EF, 0x0000, -0xC0F2, 0x0040, 0x0029, 0x4214, 0x2758, 0x470C, 0x1284, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, -0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC9EF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, -0xD0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, -0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC9EF, 0x0000, 0x4A0E, 0x4B0F, 0x480C, 0x12B0, 0x61B6, -0x4030, 0xD420, 0x120D, 0x120C, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, -0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2867, 0x01EA, -0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, 0x40B2, 0x286D, -0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, -0xB27D, 0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0x4EC1, 0x0002, 0xB26D, -0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0x51D1, 0x0002, 0x0002, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xDEC1, -0x0002, 0xB36D, 0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, 0x0031, 0xC2F2, -0x0031, 0xD2F2, 0x0031, 0x51D1, 0x0002, 0x0002, 0xB2E2, 0x0030, 0x7E4E, -0x535E, 0xDEC1, 0x0002, 0xB35D, 0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, -0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0x51D1, 0x0002, 0x0002, 0xB2E2, -0x0030, 0x7E4E, 0x535E, 0xDEC1, 0x0002, 0xD0F2, 0x000E, 0x0033, 0xD0F2, -0x0010, 0x0078, 0x41D2, 0x0005, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x42D1, -0x007E, 0x0001, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, -0x2BFD, 0x425E, 0x007E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, -0xB31C, 0x2804, 0xD0F2, 0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, -0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, -0xDEC1, 0x0000, 0xD392, 0x01F0, 0x412F, 0x4F0C, 0x411D, 0x0002, 0xC312, -0x100D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, -0xF03D, 0x000F, 0x5231, 0x4130, 0x120A, 0x120B, 0x1208, 0x4C4A, 0x9392, -0x14FE, 0x2006, 0x421F, 0x2784, 0xC2DF, 0x277E, 0x0000, 0x3C04, 0x421F, -0x1504, 0xD3DF, 0x0000, 0x403B, 0xD1BA, 0x4038, 0x0005, 0x480C, 0x128B, -0x431C, 0x128B, 0x934A, 0x2402, 0x935A, 0x201A, 0x9392, 0x14FE, 0x2006, -0x421F, 0x2784, 0xC2DF, 0x2780, 0x0000, 0x3C06, 0xC0F2, 0x0020, 0x0029, -0xC0F2, 0x0040, 0x0029, 0x480C, 0x128B, 0x9392, 0x14FE, 0x2016, 0x421F, -0x2784, 0xD2DF, 0x277E, 0x0000, 0x3C14, 0x9392, 0x14FE, 0x2006, 0x421F, -0x2784, 0xD2DF, 0x2780, 0x0000, 0x3FEC, 0xC0F2, 0x0020, 0x0029, 0xD0F2, -0x0040, 0x0029, 0x3FE5, 0x421F, 0x1504, 0xC3DF, 0x0000, 0x480C, 0x128B, -0x403C, 0x0064, 0x128B, 0x935A, 0x2403, 0x907A, 0x0003, 0x2021, 0x9392, -0x14FE, 0x2006, 0x421F, 0x2784, 0xC2DF, 0x2780, 0x0000, 0x3C06, 0xC0F2, -0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, 0x480C, 0x128B, 0x403C, 0x0028, -0x12B0, 0xD1EA, 0x934A, 0x2402, 0x936A, 0x2018, 0xC232, 0x4303, 0x421F, -0x2784, 0xC2DF, 0x277E, 0x0000, 0x3C14, 0x9392, 0x14FE, 0x2006, 0x421F, -0x2784, 0xD2DF, 0x2780, 0x0000, 0x3FE5, 0xC0F2, 0x0020, 0x0029, 0xD0F2, -0x0040, 0x0029, 0x3FDE, 0x421F, 0x1504, 0xD3DF, 0x0000, 0x935A, 0x2006, -0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x431C, 0x12B0, 0xD1EA, -0x934A, 0x2402, 0x936A, 0x2007, 0x421F, 0x2784, 0xD2DF, 0x277E, 0x0000, -0xD232, 0x3C04, 0x421F, 0x1504, 0xC3DF, 0x0000, 0x403C, 0x0028, 0x12B0, -0xD1EA, 0x907A, 0x0003, 0x2006, 0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, -0x0029, 0x480C, 0x128B, 0x4030, 0xD428, 0xE03F, 0x8000, 0x1206, 0x4D06, -0x5606, 0x9036, 0xFF01, 0x2C9E, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0E, -0x4D06, 0x5606, 0x9036, 0xFF00, 0x200B, 0x4F06, 0x5606, 0x9036, 0xFF00, -0x208F, 0x4D06, 0xEF06, 0x5606, 0x288B, 0x433D, 0x3C89, 0x4F06, 0x5606, -0x9036, 0xFF00, 0x2407, 0xB03F, 0x7FFF, 0x2007, 0x4D06, 0x5606, 0x207E, -0x287D, 0x4E0C, 0x4F0D, 0x3C7A, 0xB03D, 0x7FFF, 0x27FA, 0x1209, 0x1208, -0x1207, 0x4D06, 0x4F07, 0x5606, 0x5707, 0x9607, 0x2809, 0x2002, 0x9C0E, -0x2806, 0xED0F, 0xEF0D, 0xED0F, 0xEC0E, 0xEE0C, 0xEC0E, 0x4F06, 0x5606, -0x6909, 0x1086, 0xD07F, 0x0080, 0x4D08, 0x5808, 0x6909, 0x1088, 0xF378, -0xD07D, 0x0080, 0x4307, 0x8846, 0x2415, 0x9076, 0xFFF1, 0x2C0D, 0x9076, -0xFFE8, 0x283D, 0x4E07, 0x4F0E, 0x430F, 0x5076, 0x0010, 0x2409, 0x9347, -0x2402, 0xD037, 0x0100, 0x110F, 0x100E, 0x1007, 0x5356, 0x23FB, 0x4906, -0x1106, 0xE906, 0xB316, 0x2426, 0xE337, 0x5317, 0x7E0C, 0x7F4D, 0x2010, -0x930C, 0x2007, 0x9307, 0x242F, 0x1087, 0x474D, 0x8038, 0x0018, 0x3C06, -0x108C, 0x4C4D, 0xED0C, 0x1087, 0xD70C, 0x8238, 0x4307, 0x5707, 0x6C0C, -0x6D4D, 0x2C09, 0x8318, 0x5707, 0x6C0C, 0x6D4D, 0x2C04, 0x8318, 0x5C0C, -0x6D4D, 0x2BFC, 0x9318, 0x3408, 0x430D, 0x3C1C, 0x5E0C, 0x6F4D, 0x2C14, -0x5707, 0x6C0C, 0x6D4D, 0x1088, 0xD80D, 0x1009, 0x100D, 0x100C, 0x2806, -0x9307, 0x2002, 0xB31C, 0x2402, 0x531C, 0x630D, 0x4137, 0x4138, 0x4139, -0x4136, 0x4130, 0x5358, 0x9378, 0x23EC, 0x403D, 0xFF00, 0x430C, 0x1009, -0x100D, 0x3FF2, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x002E, 0x410C, 0x503C, 0x0018, 0x403E, 0x27E6, 0x403D, -0x0015, 0x12B0, 0xD454, 0x403A, 0x1112, 0x410C, 0x4A2F, 0x129F, 0x0018, -0x410C, 0x522C, 0x4A2F, 0x129F, 0x0018, 0x430F, 0x410B, 0x503B, 0x0018, -0x4B07, 0x5F07, 0x4FD7, 0x1102, 0x0005, 0x531F, 0x903F, 0x0010, 0x3BF7, -0x4107, 0x5237, 0x1207, 0x430F, 0x430E, 0x403D, 0x0015, 0x4B0C, 0x4A28, -0x1298, 0x000E, 0x12B0, 0xD4F4, 0x411C, 0x0002, 0x411D, 0x0004, 0x12B0, -0xD196, 0x4C04, 0xF034, 0x0F00, 0x5034, 0x0080, 0x4115, 0x0002, 0x4038, -0x1354, 0x407C, 0x0028, 0x12A8, 0x4039, 0x1358, 0x430C, 0x12A9, 0x4036, -0x1360, 0x434C, 0x12A6, 0x12B0, 0xD8DE, 0x435C, 0x12A6, 0x440C, 0x12A9, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x1400, 0x12B0, 0xD8DC, -0x434C, 0x12A6, 0x435C, 0x12A6, 0x450C, 0x12A9, 0x434C, 0x12A6, 0x435C, -0x12A6, 0x403C, 0x4303, 0x12A9, 0x434C, 0x12A6, 0x407C, 0x0021, 0x12A8, -0x430C, 0x430D, 0x1292, 0x135A, 0x435C, 0x12A6, 0x407C, 0x00C8, 0x12A8, -0x403C, 0x0501, 0x12B0, 0xD8DC, 0x411C, 0x0002, 0x832C, 0x12A9, 0x407C, -0x0022, 0x12A8, 0x411C, 0x0006, 0x411D, 0x0008, 0x1292, 0x1364, 0x407C, -0x0062, 0x12A8, 0x430C, 0x12A9, 0x4A2F, 0x129F, 0x0008, 0x430F, 0x5321, -0x4B0E, 0x5F0E, 0x4FDE, 0x1102, 0x0005, 0x531F, 0x903F, 0x0010, 0x3BF7, -0x1207, 0x430F, 0x430E, 0x403D, 0x0015, 0x4B0C, 0x4A2B, 0x129B, 0x000E, -0x12B0, 0xD4F4, 0x430C, 0x5031, 0x0030, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C4A, 0x425B, 0x2780, -0x4218, 0x2784, 0x4259, 0x277E, 0x494E, 0x525E, 0x277F, 0x5B4E, 0xDEC8, -0x0000, 0x4036, 0x1504, 0xB2B2, 0x136C, 0x462F, 0x2804, 0xC2DF, 0x150C, -0x0000, 0x3C03, 0xD2DF, 0x150C, 0x0000, 0xD0F2, 0x0040, 0x0029, 0xC0F2, -0x0020, 0x0029, 0x4037, 0xD1BA, 0x403C, 0x000A, 0x1287, 0x9392, 0x14FE, -0x2003, 0xC9C8, 0x0000, 0x3C03, 0x462F, 0xD3DF, 0x0000, 0x4034, 0x0005, -0x440C, 0x1287, 0x431C, 0x1287, 0x934A, 0x2402, 0x935A, 0x2004, 0xC0F2, -0x0040, 0x0029, 0x3C0E, 0x9392, 0x14FE, 0x2003, 0xDBC8, 0x0000, 0x3C06, -0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x440C, 0x1287, 0x4035, -0xD1EA, 0x403C, 0x000A, 0x1285, 0x9392, 0x14FE, 0x2003, 0xD9C8, 0x0000, -0x3C03, 0x462F, 0xC3DF, 0x0000, 0x440C, 0x1287, 0x403C, 0x0019, 0x1287, -0x935A, 0x2403, 0x907A, 0x0003, 0x2031, 0x9392, 0x14FE, 0x2003, 0xCBC8, -0x0000, 0x3C06, 0xC0F2, 0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, 0x440C, -0x1287, 0x403C, 0x0028, 0x1285, 0x462F, 0xD3DF, 0x0000, 0x935A, 0x2006, -0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x431C, 0x1285, 0x462F, -0xC3DF, 0x0000, 0x403C, 0x0028, 0x1285, 0x907A, 0x0003, 0x2006, 0xC0F2, -0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x440C, 0x1287, 0x4030, 0xD41E, -0x9392, 0x14FE, 0x2003, 0xDBC8, 0x0000, 0x3FD5, 0xC0F2, 0x0020, 0x0029, -0xD0F2, 0x0040, 0x0029, 0x3FCE, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x1204, 0x1205, 0x4327, 0x407C, 0x0028, 0x1292, 0x1354, 0x4C4C, -0x903C, 0x0089, 0x240B, 0x903C, 0x0091, 0x2408, 0x903C, 0x0095, 0x2405, -0x903C, 0x0099, 0x2402, 0x432C, 0x3C30, 0x407C, 0x00B0, 0x1292, 0x1354, -0x403B, 0x135C, 0x403C, 0x009F, 0x12B0, 0xD6E4, 0x4C0A, 0xB03C, 0x0100, -0x2821, 0x4034, 0x009D, 0x4038, 0x1112, 0x4C4E, 0xF07E, 0x0006, 0x926E, -0x201B, 0x423C, 0x12B0, 0xD1D2, 0x403C, 0x009E, 0x430D, 0x12AB, 0x12B0, -0xD74A, 0x4307, 0x403C, 0x009A, 0x430D, 0x12AB, 0x470C, 0x5C0C, 0x5C0C, -0x430D, 0x12B0, 0xD1D8, 0x5317, 0x9237, 0x2BF3, 0x4317, 0x470C, 0x4030, -0xD41E, 0x4309, 0x403C, 0x009B, 0x12B0, 0xD6E4, 0x12B0, 0xD18A, 0x4C06, -0x421F, 0x14C0, 0xB23A, 0x2813, 0xB03A, 0x0200, 0x280B, 0x403C, 0x009E, -0x430D, 0x12AB, 0xC31A, 0x12B0, 0xD74A, 0x4239, 0x8219, 0x14C0, 0x3C1A, -0x9F0C, 0x2418, 0x4C09, 0x8F09, 0x3C15, 0x9F0C, 0x2405, 0x4382, 0x14C4, -0x4C82, 0x14C0, 0x3FD7, 0x5392, 0x14C4, 0x90B2, 0x0014, 0x14C4, 0x2008, -0xB03A, 0x0200, 0x2804, 0x4239, 0x4C82, 0x14C0, 0x3C05, 0x4C09, 0x4682, -0x14C0, 0x9319, 0x3BC5, 0x460A, 0x432C, 0x12B0, 0xD1D2, 0x490C, 0x12B0, -0xD1D2, 0x533A, 0x930A, 0x3402, 0x403A, 0x0007, 0x403C, 0x009A, 0x430D, -0x12AB, 0x4A0C, 0x5C0C, 0x5C0C, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, 0x12B0, -0xD1D8, 0x440C, 0x12B0, 0xD6E4, 0x12B0, 0xD1D2, 0x960A, 0x23E7, 0x3FA3, -0x403E, 0x001C, 0x403D, 0x12B8, 0x411C, 0x0002, 0x4210, 0x14A8, 0x12B0, -0xC920, 0x430C, 0x4030, 0xA286, 0x12B0, 0xC94E, 0x4030, 0xA286, 0x12B0, -0xCE3E, 0x3FF6, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x0040, 0x4C05, 0x40B1, 0x0007, 0x0002, 0x4308, 0x4036, -0x0006, 0x4381, 0x0000, 0x4039, 0x1112, 0x410C, 0x492F, 0x129F, 0x0016, -0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C6A, 0x410C, 0x532C, 0x492F, 0x129F, -0x0016, 0x930C, 0x3403, 0x403C, 0xFFBE, 0x3C60, 0x90B1, 0x000F, 0x0002, -0x2002, 0x4036, 0x0009, 0x12B0, 0xD86C, 0x4034, 0x0015, 0x440E, 0x410D, -0x522D, 0x412C, 0x1292, 0x14AA, 0x12B0, 0x8E82, 0x4037, 0x0028, 0x460E, -0xD03E, 0x0080, 0x480C, 0x12B0, 0xD4B8, 0x12B0, 0xD40C, 0x2402, 0x12B0, -0x8E82, 0x4A0F, 0xDB0F, 0x930F, 0x2002, 0x433C, 0x3C3B, 0x903B, 0x0020, -0x280F, 0x2003, 0x903A, 0xA761, 0x280B, 0x480F, 0x5338, 0x930F, 0x2015, -0x4038, 0x0007, 0x460F, 0x5336, 0x930F, 0x200F, 0x3FEC, 0x940B, 0x2804, -0x200E, 0x903A, 0x83D0, 0x2C0B, 0x5318, 0x9238, 0x2805, 0x4308, 0x5316, -0x9681, 0x0002, 0x2BDE, 0x5337, 0x9317, 0x37CC, 0x440E, 0x410D, 0x522D, -0x12B0, 0x8D4A, 0x9317, 0x3BD4, 0x480C, 0x12B0, 0xD4B8, 0x492F, 0x129F, -0x0008, 0xD036, 0x0080, 0x460C, 0x492F, 0x129F, 0x0008, 0x430C, 0x492F, -0x129F, 0x0008, 0x430C, 0x5031, 0x0040, 0x4030, 0xD41E, 0x440E, 0x403D, -0x128E, 0x3F60, 0x12B0, 0x8F72, 0x12AB, 0x4030, 0x8F56, 0x12AB, 0x12B0, -0x8F3A, 0x434C, 0x12AA, 0x407C, 0x00A8, 0x12A8, 0x454C, 0x4820, 0x12B0, -0xD6D6, 0x12B0, 0xD5A2, 0x12B0, 0x8ED6, 0x435C, 0x4A20, 0x435C, 0x12AA, -0x12B0, 0x8FC4, 0x4030, 0x8F96, 0xD03C, 0x0040, 0x12AB, 0x12B0, 0x8ED6, -0x454C, 0x12A8, 0x435C, 0x4A20, 0x435C, 0x12AA, 0x434C, 0x12AA, 0x494C, -0x12A8, 0x470C, 0x4B20, 0x12B0, 0x8EDA, 0x435C, 0x12AA, 0x494C, 0x12A8, -0x403C, 0x3401, 0x12AB, 0x464C, 0x4820, 0x12AB, 0x435C, 0x12AA, 0x12B0, -0x8F12, 0x12B0, 0x8EB8, 0x403C, 0x012C, 0x4030, 0x8F1A, 0x12B0, 0x8EDA, -0x454C, 0x4820, 0x12B0, 0x8FBC, 0x12B0, 0x8F56, 0x430C, 0x4B20, 0x12B0, -0xD6D6, 0x403C, 0x00FE, 0x12B0, 0xD5A6, 0x12B0, 0x8F3A, 0x430C, 0x4B20, -0x12B0, 0x8F56, 0x435C, 0x4A20, 0x464C, 0x12A8, 0x403C, 0x4030, 0x12B0, -0x8F54, 0x421C, 0x1432, 0x4130, 0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, -0x12B0, 0x8F72, 0x12B0, 0x8F54, 0x12B0, 0x8F8A, 0x403C, 0x012A, 0x4030, -0x8FBC, 0x464C, 0x12A8, 0x403C, 0x3FFF, 0x12AB, 0x434C, 0x12AA, 0x494C, -0x12A8, 0x403C, 0x2409, 0x4130, 0x407C, 0x0048, 0x12A8, 0x427C, 0x1292, -0x1356, 0x407C, 0x00C1, 0x4820, 0x12B0, 0x8FB0, 0x421C, 0x144A, 0x4130, -0x12B0, 0x8FB0, 0x421C, 0x142E, 0x4130, 0x12B0, 0x8FC4, 0x12B0, 0x8F8A, -0x403C, 0x012C, 0x12AB, 0x407C, 0x00A1, 0x4820, 0x12B0, 0x8F72, 0x12AB, -0x3FC5, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8031, 0x001C, -0x403F, 0x27E2, 0x4FF1, 0x0008, 0x4FF1, 0x0009, 0x4FF1, 0x000A, 0x4FF1, -0x000B, 0x403B, 0x1112, 0x410C, 0x4B2F, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFDD, 0x3C7F, 0x410C, 0x522C, 0x4B2F, 0x129F, 0x0018, 0x930C, -0x3403, 0x403C, 0xFFDC, 0x3C75, 0x4108, 0x5038, 0x000C, 0x1208, 0x12B0, -0xD3D6, 0x12B0, 0xD3FA, 0x5321, 0x930A, 0x3402, 0x4A0C, 0x3C68, 0x412C, -0x411D, 0x0002, 0x503C, 0xFFFC, 0x633D, 0x12B0, 0xD196, 0x4C0A, 0xF03A, -0x0F00, 0xD03A, 0x0080, 0x4127, 0x8227, 0x4039, 0x1354, 0x407C, 0x0088, -0x12A9, 0x407C, 0x0034, 0x1292, 0x1356, 0x12B0, 0xD966, 0x4036, 0x1358, -0x4A0C, 0x12A6, 0x403A, 0x1360, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x470C, -0x12A6, 0x434C, 0x12AA, 0x407C, 0x0021, 0x12A9, 0x435C, 0x12AA, 0x434C, -0x12AA, 0x407C, 0x0088, 0x12A9, 0x407C, 0x0024, 0x1292, 0x1356, 0x435C, -0x12B0, 0xD964, 0x403C, 0x3FFF, 0x12A6, 0x434C, 0x12AA, 0x407C, 0x00C8, -0x12A9, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12AA, 0x434C, 0x12B0, 0xD964, -0x412C, 0x832C, 0x12A6, 0x407C, 0x0022, 0x12A9, 0x411C, 0x0004, 0x411D, -0x0006, 0x1292, 0x1364, 0x407C, 0x0062, 0x12A9, 0x430C, 0x12A6, 0x4B2F, -0x129F, 0x0008, 0x435C, 0x12AA, 0x1292, 0x1366, 0x1208, 0x12B0, 0xD3D6, -0x12B0, 0xD3FA, 0x4A0C, 0x5321, 0x5031, 0x001C, 0x4030, 0xD422, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x4327, 0x407C, 0x0028, -0x1292, 0x1354, 0x4C46, 0x9036, 0x0089, 0x240B, 0x9036, 0x0091, 0x2408, -0x9036, 0x0095, 0x2405, 0x9036, 0x0099, 0x2402, 0x432C, 0x3C2D, 0x407C, -0x0090, 0x1292, 0x1354, 0x403A, 0x1358, 0x403C, 0x009F, 0x12B0, 0xD9C6, -0x4C06, 0xB03C, 0x0100, 0x281E, 0x403B, 0x009D, 0x4038, 0x1112, 0x4C4E, -0xF07E, 0x0006, 0x926E, 0x2018, 0x423C, 0x12B0, 0xD014, 0x403C, 0x009E, -0x12AA, 0xD036, 0x0040, 0x460C, 0x12AA, 0x4309, 0x403C, 0x009A, 0x12AA, -0x490C, 0x12B0, 0xD01A, 0x5319, 0x9239, 0x2BF7, 0x4317, 0x470C, 0x4030, -0xD420, 0x4304, 0x403C, 0x009B, 0x12B0, 0xD9C6, 0x4C09, 0x1089, 0x1189, -0x1109, 0x1109, 0x421F, 0x14C0, 0xB236, 0x2814, 0xB036, 0x0200, 0x280C, -0x403C, 0x009E, 0x12AA, 0xC316, 0xD036, 0x0040, 0x460C, 0x12AA, 0x4234, -0x8214, 0x14C0, 0x3C1A, 0x9F09, 0x2418, 0x4904, 0x8F04, 0x3C15, 0x9F09, -0x2405, 0x4382, 0x14C2, 0x4982, 0x14C0, 0x3FD4, 0x5392, 0x14C2, 0x90B2, -0x0014, 0x14C2, 0x2008, 0xB036, 0x0200, 0x2804, 0x4234, 0x4982, 0x14C0, -0x3C05, 0x4904, 0x4982, 0x14C0, 0x9314, 0x3BC2, 0x4906, 0x432C, 0x12B0, -0xD014, 0x440C, 0x12B0, 0xD014, 0x5336, 0x9306, 0x3402, 0x4036, 0x0007, -0x403C, 0x009A, 0x12AA, 0x460C, 0x12B0, 0xD01A, 0x12B0, 0xD9C4, 0x12B0, -0xD014, 0x9906, 0x23EF, 0x3FA8, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x8231, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x410C, 0x522C, 0x421F, -0x1112, 0x129F, 0x0018, 0x4038, 0x1354, 0x407C, 0x0048, 0x12A8, 0x435C, -0x1292, 0x1356, 0x4039, 0x1360, 0x435C, 0x12A9, 0x430B, 0x4036, 0x1358, -0x407C, 0x0028, 0x12A8, 0x430C, 0x12A6, 0xF07C, 0x0081, 0x907C, 0x0081, -0x2408, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x531B, 0x903B, 0x000A, 0x2BEE, -0x412C, 0x411D, 0x0002, 0x503C, 0xFFFE, 0x633D, 0x12B0, 0xD196, 0x4C0B, -0xF03B, 0x0F00, 0xD03B, 0x0080, 0x412A, 0x832A, 0x407C, 0x0088, 0x12A8, -0x407C, 0x0034, 0x1292, 0x1356, 0x407C, 0x0082, 0x12A8, 0x4B0C, 0x12A6, -0x434C, 0x12A9, 0x435C, 0x12A9, 0x4A0C, 0x12A6, 0x434C, 0x12A9, 0x407C, -0x0021, 0x12A8, 0x12B0, 0xD99C, 0x407C, 0x0088, 0x12A8, 0x407C, 0x0024, -0x1292, 0x1356, 0x435C, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, -0x12A6, 0x434C, 0x12A9, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A6, -0x435C, 0x12A9, 0x407C, 0x00C2, 0x12A8, 0x430A, 0x430B, 0x3C0A, 0x12B0, -0xD99C, 0x430C, 0x12A6, 0x421F, 0x1112, 0x129F, 0x0008, 0x531A, 0x630B, -0x911B, 0x0006, 0x2BF3, 0x2003, 0x911A, 0x0004, 0x2BEF, 0x12B0, 0xD99C, -0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, 0x12A8, -0x435C, 0x12A9, 0x430C, 0x5231, 0x4030, 0xD424, 0x120A, 0x120B, 0x4C0A, -0x4D0B, 0x4C0F, 0xDD0F, 0x930F, 0x2443, 0x533A, 0x633B, 0x435C, 0x1292, -0x1360, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, 0xD2F2, -0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, 0xD2F2, -0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC2F2, -0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC2F2, -0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, 0xC2F2, -0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, -0x4303, 0x434C, 0x1292, 0x1360, 0x4303, 0x4A0F, 0xDB0F, 0x930F, 0x23BD, -0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0x4C0F, 0xDD0F, -0x930F, 0x2443, 0x533A, 0x633B, 0x435C, 0x1292, 0x1360, 0x4303, 0x434C, -0x1292, 0x1360, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, -0xD2F2, 0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, -0xD2F2, 0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, -0xC2F2, 0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, -0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, -0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0x4303, 0x4303, 0x4303, -0x4303, 0x4303, 0x4A0F, 0xDB0F, 0x930F, 0x23BD, 0x3FB1, 0x120F, 0x120E, -0x120D, 0x120C, 0x8231, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, -0x4381, 0x0006, 0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, -0x2867, 0x01EA, 0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, -0x40B2, 0x286D, 0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x41D2, -0x000F, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x403F, 0x007E, 0x4FE1, 0x0007, -0x41D2, 0x000E, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0006, 0x41D2, -0x000D, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0005, 0x4EC2, 0x007F, -0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0004, 0x41D2, 0x000B, 0x007F, 0xB3D2, -0x0079, 0x2BFD, 0x4FE1, 0x0003, 0x4DC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, -0x4FE1, 0x0002, 0x41D2, 0x0009, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, -0x0001, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, -0x4F6E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, 0xB31C, 0x2804, -0xD0F2, 0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, -0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xDEC1, 0x0000, -0xD392, 0x01F0, 0x412C, 0x411D, 0x0002, 0x411E, 0x0004, 0x411F, 0x0006, -0x5031, 0x0010, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x4306, 0x4307, 0x4308, 0x4309, 0x430A, 0x430B, 0x430F, 0x430C, -0x430D, 0x4304, 0x3C01, 0x5314, 0x9224, 0x347B, 0x407C, 0x0028, 0x1292, -0x1354, 0x4C46, 0x9036, 0x0089, 0x2403, 0x9036, 0x008D, 0x201E, 0x4307, -0x4308, 0x4309, 0x403A, 0x0FF0, 0x430B, 0x460C, 0x421F, 0x1112, 0x129F, -0x0008, 0x470C, 0x421F, 0x1112, 0x129F, 0x0008, 0x480C, 0x490D, 0x421F, -0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, 0x000A, -0x430C, 0x3C53, 0x9036, 0x0091, 0x2406, 0x9036, 0x0099, 0x2403, 0x9036, -0x0095, 0x23CB, 0x407C, 0x00E8, 0x1292, 0x1354, 0x430C, 0x1292, 0x1358, -0x4C0F, 0x4F07, 0x407C, 0x00E1, 0x1292, 0x1354, 0x430C, 0x430D, 0x1292, -0x135A, 0x4C08, 0x4D09, 0x480C, 0x490D, 0xF33C, 0xF30D, 0x5C0C, 0x6D0D, -0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x480E, 0x490F, 0x4F0E, -0xE33F, 0x5F0F, 0x7F0F, 0x4C08, 0x4D09, 0x5E08, 0x6F09, 0x480F, 0xD90F, -0x930F, 0x2404, 0x480A, 0x490B, 0x522A, 0x630B, 0x460C, 0x421F, 0x1112, -0x129F, 0x0008, 0x470C, 0x421F, 0x1112, 0x129F, 0x0008, 0x480C, 0x490D, -0x421F, 0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, -0x000A, 0x430C, 0x3C01, 0x433C, 0x4030, 0xD420, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8321, 0x4C0A, 0x4A2C, 0x4A1D, -0x0002, 0x12B0, 0xD196, 0x4C06, 0xF036, 0x0F00, 0xD036, 0x0085, 0x403B, -0x1354, 0x4075, 0x0088, 0x454C, 0x12AB, 0x4034, 0x1356, 0x407C, 0x0034, -0x12A4, 0x4077, 0x0082, 0x474C, 0x12AB, 0x4038, 0x1360, 0x435C, 0x12A8, -0x4039, 0x1358, 0x460C, 0x12B0, 0xC9E6, 0x4076, 0x0042, 0x12B0, 0xC9B6, -0x4A2C, 0x12B0, 0xC9BC, 0x4A1C, 0x0004, 0x4A1D, 0x0006, 0x12B0, 0x5B3E, -0xD03C, 0x0086, 0x12B0, 0xC9EC, 0x4A1C, 0x0004, 0x12B0, 0xC9BC, 0x4A1C, -0x0008, 0x4A1D, 0x000A, 0x12B0, 0x5B3E, 0xD03C, 0x0089, 0x12B0, 0xC9EC, -0x4A1C, 0x0008, 0x12B0, 0xC9BC, 0x4A1C, 0x000C, 0x4A1D, 0x000E, 0x12B0, -0x5B3E, 0xD50C, 0x4C81, 0x0000, 0x12B0, 0xD0CE, 0x12A8, 0x412C, 0x12B0, -0xC9E6, 0x12B0, 0xC9B6, 0x4A1C, 0x000C, 0x12B0, 0xC9BC, 0x4A1C, 0x0010, -0x4A1D, 0x0012, 0x12B0, 0x5B3E, 0xD03C, 0x008A, 0x12B0, 0xC9EC, 0x4A1C, -0x0010, 0x12B0, 0xC9BC, 0x4A1C, 0x0014, 0x4A1D, 0x0016, 0x12B0, 0x5B3E, -0xD03C, 0x008B, 0x12B0, 0xC9EC, 0x4A1C, 0x0014, 0x12B0, 0xC9BC, 0x4A1C, -0x0018, 0x4A1D, 0x001A, 0x12B0, 0x5B3E, 0xD03C, 0x008C, 0x12B0, 0xC9EC, -0x4A1C, 0x0018, 0x12B0, 0xC9BC, 0x5321, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8321, 0x430A, 0x430B, -0x4378, 0x4345, 0x43C1, 0x0000, 0x4304, 0x12B0, 0xCA04, 0xD3D2, 0x0031, -0x4216, 0x2758, 0x4037, 0x000A, 0x470C, 0x1286, 0xC2F2, 0x0031, 0x470C, -0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xC3D2, 0x0031, 0x470C, 0x1286, -0xC2F2, 0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xC2F2, -0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xB318, 0x2C03, -0xC3E2, 0x0031, 0x3C02, 0xD3E2, 0x0031, 0xC312, 0x1008, 0xC2F2, 0x0031, -0x470C, 0x1286, 0xD2F2, 0x0031, 0xC312, 0x100B, 0x100A, 0xB2E2, 0x0030, -0x2809, 0xD03B, 0x8000, 0x93C1, 0x0000, 0x2008, 0x4345, 0x43D1, 0x0000, -0x3C04, 0x93C1, 0x0000, 0x2001, 0x5314, 0x5165, 0x9075, 0x0020, 0x2009, -0x43C1, 0x0000, 0x4345, 0x4A4E, 0xC35E, 0x907E, 0x00FE, 0x2405, 0x5314, -0x9034, 0x00FF, 0x23CE, 0x4304, 0xD3D2, 0x0031, 0x470C, 0x1286, 0xC2F2, -0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0xC2F2, 0x0031, 0x470C, 0x1286, -0xD2F2, 0x0031, 0x470C, 0x1286, 0xC3D2, 0x0031, 0x470C, 0x1286, 0xC2F2, -0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xD3D2, 0x0031, -0x470C, 0x1286, 0x440C, 0x5321, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x8231, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, -0x0018, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x411B, 0x0004, 0x832B, -0x4038, 0x1354, 0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1356, 0x4039, -0x1360, 0x435C, 0x12A9, 0x4307, 0x4036, 0x1358, 0x407C, 0x0028, 0x12A8, -0x430C, 0x12A6, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2406, 0x12B0, 0xD96C, -0x5317, 0x9037, 0x000A, 0x2BF0, 0x4077, 0x00C8, 0x474C, 0x12A8, 0x403C, -0x3401, 0x12A6, 0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, 0x12A6, 0x12B0, -0xD96C, 0x4B0C, 0x12A6, 0x9382, 0x1506, 0x2402, 0x12B0, 0xD96C, 0x434C, -0x12A9, 0x407C, 0x0021, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A9, -0x12B0, 0xD524, 0x435C, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, -0x12A6, 0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, 0x2409, 0x12A6, 0x435C, -0x12A9, 0x407C, 0x00C2, 0x12A8, 0x430A, 0x430B, 0x3C0C, 0x435C, 0x12A9, -0x434C, 0x12A9, 0x430C, 0x12A6, 0x421F, 0x1112, 0x129F, 0x0008, 0x531A, -0x630B, 0x911B, 0x0002, 0x2BF1, 0x2002, 0x912A, 0x2BEE, 0x435C, 0x12A9, -0x12B0, 0xD524, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A9, 0x430C, 0x5231, -0x4030, 0xD422, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8031, -0x007C, 0x4381, 0x0000, 0x410C, 0x522C, 0x403E, 0x003C, 0x12B0, 0xD494, -0x410C, 0x532C, 0x12B0, 0xD706, 0x3403, 0x403C, 0xFFEB, 0x3C6D, 0x410C, -0x12B0, 0xD706, 0x2403, 0x403C, 0xFFC1, 0x3C66, 0x4306, 0x3C01, 0x5316, -0x9126, 0x2C0B, 0x410C, 0x522C, 0x460F, 0x5F0F, 0x5F0C, 0x12B0, 0xD706, -0x37F5, 0x403C, 0xFFC0, 0x3C56, 0x411C, 0x0002, 0x1292, 0x274E, 0x4216, -0x2754, 0x12B0, 0xD9DC, 0x435C, 0x12B0, 0xD9DE, 0x430A, 0x430B, 0x4038, -0x1354, 0x407C, 0x0086, 0x12A8, 0x4039, 0x1358, 0x430C, 0x12A9, 0x531A, -0x630B, 0x2014, 0x903A, 0x0BB8, 0x2C11, 0xB32C, 0x2BF6, 0x403C, 0x0011, -0x12A9, 0x403C, 0xA55A, 0x12A9, 0x403C, 0x1E1E, 0x12A9, 0x407C, 0x0028, -0x12A8, 0x907C, 0x0091, 0x2403, 0x403C, 0xFFCE, 0x3C26, 0x12B0, 0xD9DC, -0x4306, 0x3C19, 0x430A, 0x430B, 0x460F, 0x5F0F, 0x510F, 0x4F17, 0x0004, -0x407C, 0x0086, 0x12A8, 0x430C, 0x12A9, 0x531A, 0x630B, 0x23EA, 0x903A, -0x0BB8, 0x2FE7, 0xB31C, 0x2BF6, 0x431C, 0x12A9, 0x470C, 0x12A9, 0x5316, -0x9126, 0x2BE5, 0x407C, 0x0028, 0x12A8, 0x907C, 0x0091, 0x23D8, 0x430C, -0x5031, 0x007C, 0x4030, 0xD422, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x8321, 0x4C0A, 0x4306, 0x403B, 0x1360, 0x4038, 0x1358, 0x4039, 0x1354, -0xB31C, 0x282B, 0x403C, 0x14E2, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x2403, 0x403C, 0xFFF5, 0x3C68, 0x403C, 0x14DE, 0x421F, 0x1112, 0x129F, -0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C5D, 0x407C, 0x0082, 0x12A9, -0x403C, 0x3FFF, 0x12A8, 0x12B0, 0xD7F4, 0x403C, 0x2409, 0x12A8, 0x435C, -0x12AB, 0x434C, 0x12AB, 0x407C, 0x0048, 0x12A9, 0x403C, 0x0018, 0x12A8, -0x5292, 0x14DE, 0x14DE, 0x6292, 0x14E0, 0x14E0, 0x3C1F, 0x410C, 0x129F, -0x0014, 0x4C06, 0x407C, 0x00C1, 0x12A9, 0x421C, 0x14E2, 0x421D, 0x14E4, -0x1292, 0x135A, 0x407C, 0x00A1, 0x12A9, 0x416C, 0x1292, 0x1356, 0x435C, -0x12AB, 0x434C, 0x12AB, 0x5392, 0x14E2, 0x6382, 0x14E4, 0x53B2, 0x14DE, -0x63B2, 0x14E0, 0x421F, 0x1112, 0x421E, 0x14DE, 0xD21E, 0x14E0, 0x930E, -0x2402, 0x9306, 0x27D7, 0xB32A, 0x280B, 0x12B0, 0xD7F4, 0x403C, 0x2401, -0x12A8, 0x407C, 0x0021, 0x12A9, 0x435C, 0x12AB, 0x3C0A, 0x9316, 0x2006, -0x407C, 0x0091, 0x129F, 0x0012, 0x4306, 0x3C02, 0x4036, 0xFFF3, 0x460C, -0x5321, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x000A, 0x4338, 0x4039, 0x1112, 0x410C, 0x522C, -0x492F, 0x129F, 0x0014, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C6B, 0x431C, -0x492F, 0x129F, 0x001A, 0x410C, 0x492F, 0x129F, 0x0018, 0x930C, 0x3403, -0x403C, 0xFFCD, 0x3C5E, 0x43C1, 0x0004, 0x430C, 0x1292, 0x274E, 0x930C, -0x2403, 0x403C, 0xFFEA, 0x3C54, 0x90B1, 0xA55A, 0x0000, 0x2004, 0x90B1, -0xA55A, 0x0002, 0x2408, 0x90B1, 0x5AA5, 0x0000, 0x2040, 0x90B1, 0x5AA5, -0x0002, 0x203C, 0x4216, 0x276C, 0x434C, 0x1286, 0x435C, 0x1292, 0x2754, -0x1292, 0x134E, 0x434C, 0x1286, 0x4357, 0x1292, 0x1350, 0x430A, 0x430B, -0x4304, 0x4191, 0x0002, 0x0008, 0x41A1, 0x0006, 0x407C, 0x0086, 0x1292, -0x1354, 0x4035, 0x1358, 0x430C, 0x12A5, 0x531A, 0x630B, 0x2003, 0x903A, -0x0BB8, 0x2802, 0x4314, 0x3C0B, 0xB32C, 0x2BF4, 0x403C, 0x0011, 0x12A5, -0x411C, 0x0008, 0x12A5, 0x411C, 0x0006, 0x12A5, 0x435C, 0x1286, 0x403C, -0x0BB8, 0x1292, 0x275A, 0x9314, 0x2003, 0x403C, 0xFFCE, 0x3C08, 0x474C, -0x492F, 0x129F, 0x0004, 0x9347, 0x2401, 0x4308, 0x480C, 0x5031, 0x000A, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x4335, 0x4309, 0x4036, 0x1358, 0x4037, 0x1354, 0x3C06, 0x9309, -0x2404, 0x9319, 0x2402, 0x4308, 0x3C01, 0x4318, 0x480C, 0x1292, 0x274E, -0x4214, 0x2754, 0x435C, 0x12B0, 0xD740, 0x430A, 0x430B, 0x407C, 0x0086, -0x12A7, 0x430C, 0x12A6, 0x531A, 0x630B, 0x2003, 0x903A, 0x0BB8, 0x2803, -0x4035, 0xFFCF, 0x3C07, 0xB31C, 0x2BF3, 0x431C, 0x12A6, 0x403C, 0xA55A, -0x12A6, 0x12B0, 0xD284, 0x240F, 0x903A, 0x0091, 0x2413, 0x903A, 0x0099, -0x2013, 0x12B0, 0xD682, 0x407C, 0x0054, 0x12A7, 0x430C, 0x431D, 0x1292, -0x135C, 0x12B0, 0xD474, 0x484C, 0x12B0, 0xD47C, 0x430C, 0x3C34, 0x12B0, -0xD682, 0x3FF6, 0x5319, 0x9229, 0x3BBB, 0x4309, 0x432C, 0x1292, 0x274E, -0x434C, 0x12B0, 0x8AA4, 0x12B0, 0x4BFE, 0x12B0, 0xCC42, 0x403C, 0x000A, -0x1292, 0x275A, 0x12B0, 0xCF8C, 0x436C, 0x12B0, 0x8AA4, 0x12B0, 0x4BFE, -0x12B0, 0xCF66, 0x403C, 0x000A, 0x1292, 0x275A, 0x12B0, 0xD284, 0x2406, -0x903A, 0x0091, 0x2403, 0x903A, 0x0099, 0x2004, 0x12B0, 0xD474, 0x436C, -0x3FCD, 0x5319, 0x9039, 0x0003, 0x3BD7, 0x450C, 0x4030, 0xD41E, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x8031, 0x0018, 0x4C0B, 0x4E0A, 0x4D0E, -0x430F, 0x403C, 0x0005, 0x1292, 0x14A4, 0x4A0E, 0x430F, 0x403C, 0x0006, -0x1292, 0x14A4, 0x4B0C, 0x430D, 0x1292, 0x14A6, 0x407C, 0x00A8, 0x1292, -0x1354, 0x4382, 0x0160, 0xC392, 0x0160, 0x40B2, 0x0200, 0x0160, 0x40B2, -0x02E9, 0x0172, 0x4382, 0x0170, 0xD0B2, 0x0016, 0x0160, 0x4218, 0x14A0, -0x4309, 0x403F, 0xEA5E, 0x4303, 0x430B, 0x533F, 0x633B, 0x2FFD, 0x421A, -0x14A0, 0x430B, 0xC0B2, 0x0010, 0x0160, 0xC3A2, 0x0160, 0x410C, 0x403E, -0x27C6, 0x423D, 0x12B0, 0xD454, 0x410F, 0x523F, 0x120F, 0x430F, 0x430E, -0x423D, 0x410C, 0x532C, 0x4216, 0x1112, 0x1296, 0x000E, 0x403C, 0x0003, -0x1292, 0x14AC, 0x410C, 0x503C, 0x000A, 0x421F, 0x1112, 0x129F, 0x0010, -0x5321, 0x9309, 0x2005, 0x9A08, 0x2C03, 0x880A, 0x790B, 0x3C04, 0x8A08, -0x7309, 0x480A, 0x490B, 0x1292, 0x14A2, 0x4382, 0x14A0, 0x4C0E, 0x4D0F, -0x5C0C, 0x6D0D, 0x5E0C, 0x6F0D, 0x503C, 0x001F, 0x630D, 0x403E, 0x03E8, -0x430F, 0x12B0, 0xCE6E, 0x4A0E, 0x4B0F, 0x12B0, 0xCD32, 0x5031, 0x0018, -0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, -0x430B, 0x4038, 0x1360, 0x4039, 0x1358, 0x4036, 0x1354, 0xB31C, 0x2828, -0x403C, 0x14DA, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, -0xFFF5, 0x3C62, 0x403C, 0x14D6, 0x421F, 0x1112, 0x129F, 0x0018, 0x933C, -0x2003, 0x403C, 0xFFF4, 0x3C57, 0x407C, 0x0082, 0x12A6, 0x403C, 0x3FFF, -0x12A9, 0x12B0, 0xD7E0, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x12B0, -0xD7E0, 0x403C, 0x2418, 0x12A9, 0x5292, 0x14D6, 0x14D6, 0x6292, 0x14D8, -0x14D8, 0x3C1C, 0x410C, 0x129F, 0x0014, 0x4C0B, 0x407C, 0x00C1, 0x12A6, -0x421C, 0x14DA, 0x12A9, 0x407C, 0x00A1, 0x12A6, 0x416C, 0x1292, 0x1356, -0x435C, 0x12A8, 0x434C, 0x12A8, 0x5392, 0x14DA, 0x6382, 0x14DC, 0x53B2, -0x14D6, 0x63B2, 0x14D8, 0x421F, 0x1112, 0x421E, 0x14D6, 0xD21E, 0x14D8, -0x930E, 0x2402, 0x930B, 0x27DA, 0xB32A, 0x280B, 0x12B0, 0xD7E0, 0x403C, -0x2401, 0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x12A8, 0x3C0A, 0x931B, -0x2006, 0x407C, 0x0091, 0x129F, 0x0012, 0x430B, 0x3C02, 0x403B, 0xFFF3, -0x4B0C, 0x5321, 0x4030, 0xD424, 0x434C, 0x12A7, 0x484C, 0x4B20, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C0A, 0x403B, -0x1354, 0x12B0, 0xA15C, 0x403C, 0x3401, 0x12A9, 0x4076, 0x0082, 0x464C, -0x12AB, 0x403C, 0x4035, 0x12A9, 0x4037, 0x1360, 0x434C, 0x12A7, 0x4074, -0x0042, 0x12B0, 0xA170, 0x4A2C, 0x12B0, 0xA178, 0x4035, 0x2401, 0x450C, -0x12A9, 0x435C, 0x12B0, 0xA090, 0x12B0, 0xD252, 0x403C, 0x4036, 0x12B0, -0xA16A, 0x4A1C, 0x0002, 0x12B0, 0xD246, 0x403C, 0x4039, 0x12B0, 0xA16A, -0x4A1C, 0x0004, 0x12B0, 0xD246, 0x403C, 0x4038, 0x12B0, 0xA16A, 0x4A1C, -0x0006, 0x12B0, 0xD246, 0x403C, 0x403A, 0x12B0, 0xA16A, 0x4A1C, 0x0008, -0x12B0, 0xD246, 0x403C, 0x403B, 0x12B0, 0xA16A, 0x4A1C, 0x000A, 0x12B0, -0xD246, 0x403C, 0x403C, 0x12B0, 0xA16A, 0x4A1C, 0x000C, 0x12B0, 0xA178, -0x12B0, 0xA154, 0x4030, 0xD41E, 0x450C, 0x12A9, 0x435C, 0x4720, 0x4078, -0x00C8, 0x484C, 0x12AB, 0x4039, 0x1358, 0x4130, 0x12A9, 0x434C, 0x12A7, -0x12B0, 0xD5B6, 0x464C, 0x4B20, 0x12B0, 0xD5B0, 0x464C, 0x12AB, 0x403C, -0x3FFD, 0x12B0, 0xD5B0, 0x434C, 0x3F82, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x8231, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFF2, 0x3C6A, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0018, -0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C5F, 0x4038, 0x1354, 0x407C, 0x0082, -0x12A8, 0x4039, 0x1358, 0x403C, 0x3FFF, 0x12A9, 0x4036, 0x1360, 0x434C, -0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x12B0, 0xD9D4, -0x430A, 0x430B, 0x3C16, 0x407C, 0x00C1, 0x12A8, 0x412C, 0x12A9, 0x407C, -0x00A1, 0x12A8, 0x12B0, 0xD9D4, 0x430C, 0x12A9, 0x421F, 0x1112, 0x129F, -0x0008, 0x53A1, 0x0000, 0x6381, 0x0002, 0x531A, 0x630B, 0x911B, 0x0006, -0x2BE7, 0x2003, 0x911A, 0x0004, 0x2BE3, 0x12B0, 0xD9D4, 0x407C, 0x00C8, -0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, -0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1356, 0x435C, 0x12A6, 0x430B, -0x407C, 0x0028, 0x12A8, 0x430C, 0x12A9, 0xF07C, 0x0081, 0x907C, 0x0081, -0x2408, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x531B, 0x903B, 0x000A, 0x2BEE, -0x430C, 0x5231, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x1204, 0x1205, 0x8031, 0x003E, 0x4C05, 0x4308, 0x4039, 0x001B, -0x4381, 0x0000, 0x430A, 0x430B, 0x4036, 0x1112, 0x410C, 0x462F, 0x129F, -0x0016, 0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C5C, 0x12B0, 0xD86C, 0x403E, -0x001C, 0x410D, 0x532D, 0x412C, 0x1292, 0x14AA, 0x12B0, 0x8D42, 0x3C02, -0x4709, 0x4314, 0x480F, 0x531F, 0x990F, 0x2C1B, 0x4907, 0x5807, 0xC312, -0x1007, 0x4304, 0x430E, 0x470C, 0x12B0, 0xD4BC, 0x12B0, 0xD40C, 0x2402, -0x12B0, 0x8D42, 0x4A0F, 0xDB0F, 0x930F, 0x2415, 0x903B, 0x0020, 0x2804, -0x23E4, 0x903A, 0xA761, 0x2FE1, 0x4708, 0x3FE1, 0x9304, 0x240A, 0x430E, -0x480C, 0x12B0, 0xD4BC, 0x4C0D, 0x412C, 0x12B0, 0x9E8C, 0x4C0A, 0x4D0B, -0x403E, 0x0015, 0x410D, 0x532D, 0x12B0, 0x8D4A, 0x503A, 0x6478, 0x603B, -0xFFEC, 0x903B, 0x0010, 0x2806, 0x2003, 0x903A, 0xB559, 0x2802, 0x433C, -0x3C10, 0x430C, 0x12B0, 0xD8B6, 0x480C, 0x12B0, 0xD4BC, 0x12B0, 0xD8B6, -0x12B0, 0xD8B2, 0x12B0, 0xD8B2, 0x430C, 0x12B0, 0xD8B6, 0x430C, 0x5031, -0x003E, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x8221, 0x4316, 0x403B, 0x1358, 0x4038, 0x1354, 0x4039, 0x1360, 0x3C03, -0x9326, 0x2001, 0x4226, 0x434C, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x435C, -0x12A9, 0x464C, 0x108C, 0xF03C, 0x0F00, 0x503C, 0x0060, 0x12AB, 0x407C, -0x00C8, 0x12A8, 0x403C, 0x1401, 0x12AB, 0x407C, 0x0082, 0x12A8, 0x12B0, -0xD914, 0x9382, 0x1398, 0x2403, 0x403C, 0x0FF6, 0x3C02, 0x403C, 0x018C, -0x12AB, 0x12B0, 0xD914, 0x403C, 0x3FFD, 0x12AB, 0x434C, 0x12A9, 0x9382, -0x1398, 0x2402, 0x12B0, 0xD65E, 0x12B0, 0xD876, 0x430C, 0x12AB, 0x4C07, -0x12B0, 0xD914, 0x430C, 0x12AB, 0x4C0A, 0x12B0, 0xD914, 0x12B0, 0xD914, -0x12B0, 0xD914, 0x9382, 0x1398, 0x2002, 0x12B0, 0xD65E, 0x434C, 0x12A9, -0x12B0, 0xD876, 0x4781, 0x0000, 0x4A81, 0x0002, 0x403D, 0x0003, 0x410C, -0x421F, 0x1112, 0x129F, 0x0006, 0x5316, 0x9036, 0x0010, 0x2BA7, 0x407C, -0x0086, 0x12A8, 0x430C, 0x12AB, 0xB23C, 0x2807, 0x403C, 0x0014, 0x12AB, -0x430C, 0x12AB, 0x430C, 0x12AB, 0x430C, 0x5221, 0x4030, 0xD422, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, 0x430B, 0x4038, 0x1360, -0x4039, 0x1358, 0x4036, 0x1354, 0xB31C, 0x2844, 0x403C, 0x14EA, 0x421F, -0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C5B, 0x403C, -0x14E6, 0x421F, 0x1112, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, -0x3C50, 0x407C, 0x0082, 0x12A6, 0x403C, 0x3FFF, 0x12A9, 0x12B0, 0xD808, -0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x12B0, 0xD808, 0x403C, 0x2408, -0x12A9, 0x3C1B, 0x410C, 0x129F, 0x0016, 0x4C0B, 0x407C, 0x00C1, 0x12A6, -0x421C, 0x14EA, 0x12A9, 0x407C, 0x00A1, 0x12A6, 0x412C, 0x12A9, 0x435C, -0x12A8, 0x434C, 0x12A8, 0x53A2, 0x14EA, 0x6382, 0x14EC, 0x53B2, 0x14E6, -0x63B2, 0x14E8, 0x421F, 0x1112, 0x421E, 0x14E6, 0xD21E, 0x14E8, 0x930E, -0x2402, 0x930B, 0x27DB, 0xB32A, 0x280B, 0x12B0, 0xD808, 0x403C, 0x2401, -0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x12A8, 0x3C0A, 0x931B, 0x2006, -0x407C, 0x0091, 0x129F, 0x0012, 0x430B, 0x3C02, 0x403B, 0xFFF3, 0x4B0C, -0x5321, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8031, -0x001C, 0x403F, 0x27DE, 0x4FF1, 0x0008, 0x4FF1, 0x0009, 0x4FF1, 0x000A, -0x4FF1, 0x000B, 0x403A, 0x1112, 0x410C, 0x522C, 0x4A2F, 0x129F, 0x0018, -0x930C, 0x2403, 0x403C, 0xFFDD, 0x3C58, 0x410C, 0x4A2F, 0x129F, 0x0018, -0x930C, 0x3403, 0x403C, 0xFFDC, 0x3C4F, 0x410B, 0x503B, 0x000C, 0x120B, -0x12B0, 0xD442, 0x12B0, 0xD334, 0x5321, 0x9308, 0x3402, 0x480C, 0x3C42, -0x4038, 0x1354, 0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1356, 0x4039, -0x1360, 0x435C, 0x12A9, 0x4306, 0x407C, 0x0028, 0x12A8, 0x430C, 0x1292, -0x1358, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2408, 0x434C, 0x12A9, 0x435C, -0x12A9, 0x5316, 0x9036, 0x000A, 0x2BED, 0x411C, 0x0004, 0x411D, 0x0006, -0x1292, 0x1362, 0x407C, 0x0022, 0x12A8, 0x412C, 0x411D, 0x0002, 0x1292, -0x1364, 0x407C, 0x0062, 0x12A8, 0x430C, 0x1292, 0x1358, 0x4A2F, 0x129F, -0x0008, 0x435C, 0x12A9, 0x1292, 0x1366, 0x120B, 0x12B0, 0xD442, 0x12B0, -0xD334, 0x480C, 0x5321, 0x5031, 0x001C, 0x4030, 0xD424, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, 0x4306, 0x403B, 0x1360, 0x4038, -0x1358, 0x4039, 0x1354, 0xB31C, 0x2843, 0x403C, 0x14F2, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C5A, 0x403C, 0x14EE, -0x421F, 0x1112, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C4F, -0x407C, 0x0082, 0x12A9, 0x403C, 0x3FFF, 0x12A8, 0x12B0, 0xD81C, 0x403C, -0x2409, 0x12B0, 0xD826, 0x407C, 0x0048, 0x12A9, 0x423C, 0x12A8, 0x3C1B, -0x410C, 0x129F, 0x0016, 0x4C06, 0x407C, 0x00C1, 0x12A9, 0x421C, 0x14F2, -0x421D, 0x14F4, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12A9, 0x412C, 0x12B0, -0xD826, 0x53A2, 0x14F2, 0x6382, 0x14F4, 0x53B2, 0x14EE, 0x63B2, 0x14F0, -0x421F, 0x1112, 0x421E, 0x14EE, 0xD21E, 0x14F0, 0x930E, 0x2402, 0x9306, -0x27DB, 0xB32A, 0x280B, 0x12B0, 0xD81C, 0x403C, 0x2401, 0x12A8, 0x407C, -0x0021, 0x12A9, 0x435C, 0x12AB, 0x3C0A, 0x9316, 0x2006, 0x407C, 0x0091, -0x129F, 0x0012, 0x4306, 0x3C02, 0x4036, 0xFFF3, 0x460C, 0x5321, 0x4030, -0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x8031, 0x002A, 0x430A, 0x4038, -0x1360, 0x434C, 0x12A8, 0x403B, 0x1354, 0x407C, 0x00C8, 0x12AB, 0x4039, -0x1358, 0x403C, 0x0500, 0x12A9, 0x12B0, 0xD2FC, 0x407C, 0x00A1, 0x12AB, -0x403C, 0x0003, 0x12A9, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x12AB, 0x403C, -0x0501, 0x12A9, 0x12B0, 0xD676, 0x434C, 0x12A8, 0x12B0, 0xD2FC, 0x434C, -0x12A8, 0x407C, 0x0042, 0x12AB, 0x430C, 0x12A9, 0x4C09, 0x12B0, 0xD676, -0x9309, 0x383B, 0x4308, 0x4109, 0x5039, 0x0010, 0x490C, 0x580C, 0x421F, -0x1112, 0x129F, 0x0014, 0x5318, 0x9038, 0x0016, 0x2BF6, 0x490F, 0x580F, -0x40FF, 0x00DE, 0x0000, 0x40FF, 0x00AD, 0x0001, 0x40FF, 0x00BA, 0x0002, -0x40FF, 0x00BE, 0x0003, 0x410F, 0x120F, 0x430F, 0x431E, 0x403D, 0x001A, -0x490C, 0x4218, 0x1112, 0x1298, 0x000E, 0x403C, 0x0003, 0x1292, 0x1258, -0x410C, 0x532C, 0x421F, 0x1112, 0x129F, 0x0010, 0x407C, 0x0054, 0x12AB, -0x403C, 0x0200, 0x430D, 0x1292, 0x135C, 0x5321, 0x3C01, 0x433A, 0x4A0C, -0x5031, 0x002A, 0x4030, 0xD426, 0x120A, 0x120B, 0x8031, 0x001C, 0x43C1, -0x0000, 0x4381, 0x0002, 0x403C, 0x0005, 0x1292, 0x275A, 0x407C, 0x0028, -0x1292, 0x1354, 0x4CC1, 0x0000, 0x407A, 0x0091, 0x9AC1, 0x0000, 0x2002, -0x430F, 0x3C07, 0x421F, 0x14B6, 0x531F, 0x931F, 0x2002, 0x43F1, 0x0000, -0x4F82, 0x14B6, 0x932F, 0x384A, 0x4382, 0x14B6, 0x1292, 0x2756, 0x434C, -0x1292, 0x2754, 0x1292, 0x134E, 0x407C, 0x00C8, 0x1292, 0x1354, 0x4CC1, -0x0000, 0x9AC1, 0x0000, 0x2038, 0x407C, 0x0086, 0x1292, 0x1354, 0x9A4C, -0x2032, 0x422C, 0x1292, 0x1358, 0x903C, 0x1207, 0x202C, 0x430C, 0x1292, -0x1358, 0x903C, 0xA55A, 0x2024, 0x410C, 0x522C, 0x403E, 0x27D6, 0x423D, -0x12B0, 0xD454, 0x410F, 0x503F, 0x000C, 0x120F, 0x430F, 0x430E, 0x423D, -0x410C, 0x503C, 0x0006, 0x421B, 0x1112, 0x129B, 0x000E, 0x403C, 0x0003, -0x1292, 0x1230, 0x410C, 0x503C, 0x000E, 0x421F, 0x1112, 0x129F, 0x0010, -0x4AC1, 0x0002, 0x5321, 0x3C02, 0x43F1, 0x0000, 0x416C, 0x5031, 0x001C, -0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x403B, 0x1112, 0x403C, 0x14B8, 0x12B0, 0xD894, 0x2402, 0x433C, 0x3C61, -0x403C, 0x14BC, 0x12B0, 0xD894, 0x23F9, 0x403C, 0x14BE, 0x12B0, 0xD894, -0x23F4, 0x403C, 0x14BA, 0x4B2F, 0x129F, 0x0016, 0x933C, 0x27ED, 0x9382, -0x14BA, 0x2402, 0x435C, 0x3C01, 0x434C, 0x1292, 0x2754, 0x1292, 0x134E, -0x4038, 0x1358, 0x4216, 0x14BC, 0x90B2, 0x0011, 0x14B8, 0x430A, 0x430B, -0x4309, 0x2019, 0x4217, 0x14BE, 0x407C, 0x0086, 0x1292, 0x1354, 0x430C, -0x12A8, 0x531A, 0x630B, 0x2003, 0x903A, 0x0BB8, 0x2802, 0x4319, 0x3C1B, -0xB32C, 0x2BF4, 0x403C, 0x0011, 0x12A8, 0x460C, 0x12A8, 0x470C, 0x3C11, -0x407C, 0x0086, 0x1292, 0x1354, 0x430C, 0x12A8, 0x531A, 0x630B, 0x23EC, -0x903A, 0x0BB8, 0x2FE9, 0xB31C, 0x2BF6, 0x431C, 0x12A8, 0x460C, 0x12A8, -0x9382, 0x14BA, 0x2406, 0x434C, 0x1292, 0x276E, 0x435C, 0x1292, 0x276C, -0x403C, 0x003C, 0x1292, 0x275A, 0x9309, 0x239E, 0x430C, 0x4030, 0xD422, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8231, 0x410C, 0x522C, 0x421F, -0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C5C, 0x410C, -0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C52, -0x4038, 0x1354, 0x407C, 0x0082, 0x12A8, 0x4039, 0x1358, 0x403C, 0x3FFF, -0x12A9, 0x4036, 0x1360, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, -0x2409, 0x12A9, 0x12B0, 0xD93C, 0x407C, 0x0048, 0x12A8, 0x403C, 0x0019, -0x12A9, 0x51A1, 0x0000, 0x6191, 0x0002, 0x0002, 0x430A, 0x430B, 0x3C1A, -0x407C, 0x00C1, 0x12A8, 0x411C, 0x0004, 0x411D, 0x0006, 0x1292, 0x135A, -0x407C, 0x00A1, 0x12A8, 0x12B0, 0xD93C, 0x430C, 0x12A9, 0x421F, 0x1112, -0x129F, 0x0004, 0x5391, 0x0004, 0x6381, 0x0006, 0x531A, 0x630B, 0x911B, -0x0002, 0x2BE3, 0x2002, 0x912A, 0x2BE0, 0x12B0, 0xD93C, 0x407C, 0x00C8, -0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, -0x430C, 0x5231, 0x4030, 0xD424, 0x8231, 0x410C, 0x522C, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFCB, 0x3C29, 0x410C, 0x421F, -0x1112, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFCA, 0x3C1F, 0x411E, -0x0004, 0x411F, 0x0006, 0x930F, 0x204D, 0x903E, 0x000F, 0x2C4A, 0x5E0E, -0x4E10, 0xAB28, 0xABB6, 0xAB46, 0xAB52, 0xAB4C, 0xAB66, 0xAB72, 0xAB7E, -0xAB8A, 0xAB90, 0xAB96, 0xAB5A, 0xAB9C, 0xABA4, 0xABAA, 0xABB0, 0x412C, -0x1292, 0x2750, 0x430C, 0x5231, 0x4130, 0x412C, 0x1292, 0x2752, 0x3FF9, -0x41A2, 0x137C, 0x4192, 0x0002, 0x137E, 0x3FF3, 0x41A2, 0x1382, 0x4192, -0x0002, 0x1384, 0x3FED, 0x41A2, 0x1386, 0x4192, 0x0002, 0x1388, 0x3FE7, -0x41A2, 0x138A, 0x4192, 0x0002, 0x138C, 0x3FE1, 0x41A2, 0x138E, 0x3FDE, -0x41A2, 0x1390, 0x3FDB, 0x41A2, 0x1392, 0x3FD8, 0x412C, 0x1292, 0x2770, -0x3FD4, 0x41A2, 0x1380, 0x3FD1, 0x41A2, 0x1506, 0x3FCE, 0x41A2, 0x1398, -0x3FCB, 0x403C, 0xFFC9, 0x3FC9, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x1204, 0x4C0A, 0x403B, 0x1354, 0x407C, 0x0088, 0x12AB, 0x407C, -0x0034, 0x1292, 0x1356, 0x12B0, 0xA15C, 0x403C, 0x2401, 0x12A9, 0x407C, -0x0028, 0x12AB, 0x4036, 0x0032, 0x430C, 0x12A9, 0x5336, 0x933C, 0x2403, -0xB03C, 0x0200, 0x2C02, 0x9306, 0x23F6, 0x407C, 0x0082, 0x12AB, 0x403C, -0x4030, 0x12A9, 0x4037, 0x1360, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x403C, -0x0C04, 0x12B0, 0xD8FC, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x435C, 0x12A7, -0x407C, 0x0082, 0x12AB, 0x403C, 0x3FFF, 0x12A9, 0x12B0, 0xA08E, 0x403C, -0x2409, 0x12B0, 0xA156, 0x12B0, 0xA08E, 0x403C, 0x2408, 0x12A9, 0x4306, -0x407C, 0x00C1, 0x12AB, 0x4604, 0x5404, 0x4A0C, 0x540C, 0x12A9, 0x407C, -0x00A1, 0x12AB, 0x441C, 0x13C4, 0x12B0, 0xD8FC, 0x5316, 0x9036, 0x0030, -0x3BED, 0x12B0, 0xA08E, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12B0, -0xD5B8, 0x4030, 0xD420, 0x120D, 0x120C, 0x8221, 0x4381, 0x0000, 0x4381, -0x0002, 0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2867, -0x01EA, 0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, 0x40B2, -0x286D, 0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, -0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x41D2, 0x0007, -0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x403F, 0x007E, 0x4FE1, 0x0003, 0x4DC2, -0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0002, 0x41D2, 0x0005, 0x007F, -0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0001, 0xC0F2, 0x0010, 0x0078, 0x4CC2, -0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4F6E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, -0x00F1, 0x0033, 0xB31C, 0x2804, 0xD0F2, 0x0003, 0x0031, 0x3C04, 0xC3E2, -0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, -0x7E4E, 0x535E, 0xDEC1, 0x0000, 0xD392, 0x01F0, 0x412C, 0x411D, 0x0002, -0x5231, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8231, -0x4308, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, -0x4038, 0xFFDF, 0x3C53, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x3403, 0x4038, 0xFFDE, 0x3C49, 0x4039, 0x1354, 0x407C, 0x0082, 0x12A9, -0x4036, 0x1358, 0x403C, 0x3FFF, 0x12A6, 0x4037, 0x1360, 0x12B0, 0xD7AE, -0x403C, 0x2409, 0x12A6, 0x435C, 0x12A7, 0x12B0, 0xD7AE, 0x403C, 0x2419, -0x12A6, 0x51A1, 0x0000, 0x6191, 0x0002, 0x0002, 0x430A, 0x430B, 0x3C19, -0x407C, 0x00C1, 0x12A9, 0x411C, 0x0004, 0x12A6, 0x407C, 0x00A1, 0x12A9, -0x435C, 0x12A7, 0x434C, 0x12A7, 0x430C, 0x12A6, 0x421F, 0x1112, 0x129F, -0x0004, 0x5391, 0x0004, 0x6381, 0x0006, 0x531A, 0x630B, 0x911B, 0x0002, -0x2BE4, 0x2002, 0x912A, 0x2BE1, 0x12B0, 0xD7AE, 0x403C, 0x2401, 0x12A6, -0x407C, 0x0021, 0x12A9, 0x435C, 0x12A7, 0x480C, 0x5231, 0x4030, 0xD422, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, 0x000C, -0x4337, 0x4381, 0x0008, 0x4381, 0x000A, 0x4381, 0x0004, 0x4381, 0x0006, -0x43C1, 0x0000, 0x4214, 0x12F0, 0x4381, 0x0002, 0x4036, 0x1112, 0x410C, -0x523C, 0x462F, 0x129F, 0x0018, 0x410C, 0x522C, 0x462F, 0x129F, 0x0018, -0x410C, 0x532C, 0x462F, 0x129F, 0x0016, 0x411B, 0x0006, 0x12B0, 0xA838, -0x4CC1, 0x0000, 0xF03B, 0xC000, 0x9381, 0x0002, 0x2415, 0x462F, 0x4F1F, -0x0008, 0x90F1, 0x0091, 0x0000, 0x422C, 0x2005, 0x12B0, 0xD6FA, 0x430C, -0x430D, 0x3C04, 0x12B0, 0xD6FA, 0x430C, 0x4B0D, 0x12B0, 0xD700, 0x4307, -0x3C1B, 0x90F1, 0x0091, 0x0000, 0x2402, 0x432F, 0x3C01, 0x431F, 0x4F82, -0x12F0, 0x9F04, 0x2410, 0x931F, 0x2005, 0x12B0, 0xD21A, 0x12B0, 0xD6FE, -0x4317, 0x93A2, 0x12F0, 0x2006, 0x12B0, 0xD21A, 0x4B0D, 0x12B0, 0xD700, -0x4317, 0x470C, 0x5031, 0x000C, 0x4030, 0xD420, 0x120A, 0x120B, 0x1208, -0x8231, 0x403A, 0x1112, 0x410C, 0x522C, 0x4A2F, 0x129F, 0x0014, 0x930C, -0x342B, 0x403C, 0xFFC8, 0x3C55, 0x434C, 0x1292, 0x276E, 0x1292, 0x2762, -0x4C4B, 0x415E, 0x0002, 0xF07E, 0x000F, 0x416F, 0xF07F, 0x000F, 0xCF4B, -0xDE4B, 0x1292, 0x276A, 0x4C48, 0x415E, 0x0003, 0xF07E, 0x007C, 0x415F, -0x0001, 0xF07F, 0x007C, 0xCF48, 0xDE48, 0x4B4C, 0x1292, 0x2760, 0x484C, -0x1292, 0x2768, 0x53F1, 0x0004, 0x411C, 0x0006, 0x1292, 0x275A, 0x93C1, -0x0004, 0x2429, 0x410C, 0x532C, 0x12B0, 0xD77C, 0x3403, 0x403C, 0xFFC7, -0x3C22, 0x410C, 0x12B0, 0xD77C, 0x3BF9, 0x410C, 0x503C, 0x0006, 0x12B0, -0xD77C, 0x3BF3, 0xB0B1, 0x0040, 0x0000, 0x2809, 0xB0B1, 0x0040, 0x0002, -0x2802, 0x435C, 0x3C01, 0x434C, 0x1292, 0x276C, 0xB0B1, 0x0100, 0x0000, -0x2BB5, 0xB0B1, 0x0100, 0x0002, 0x2BAE, 0x435C, 0x3FAD, 0x430C, 0x5231, -0x4030, 0xD428, 0xC3A2, 0x01A0, 0x40B2, 0x22F0, 0x01A0, 0x40B2, 0x0206, -0x01A2, 0x407E, 0x0010, 0x4EC2, 0x0080, 0x407F, 0x0011, 0x4FC2, 0x0081, -0x407D, 0x0012, 0x4DC2, 0x0082, 0x407C, 0x0013, 0x4CC2, 0x0083, 0x4EC2, -0x0084, 0x4FC2, 0x0085, 0x4DC2, 0x0086, 0x4CC2, 0x0087, 0x4EC2, 0x0088, -0x4FC2, 0x0089, 0x4DC2, 0x008A, 0x4CC2, 0x008B, 0x4EC2, 0x008C, 0x4FC2, -0x008D, 0x4DC2, 0x008E, 0x4CC2, 0x008F, 0xD3A2, 0x01A0, 0xD392, 0x01A0, -0x40B2, 0x0FFF, 0x01C8, 0x40B2, 0x03A0, 0x01C0, 0xD3D2, 0x0078, 0x40F2, -0x0017, 0x0078, 0x40F2, 0x0053, 0x0079, 0x43E2, 0x007C, 0x43C2, 0x007D, -0x43C2, 0x007B, 0xC3D2, 0x0078, 0xDEC2, 0x0005, 0x4382, 0x0122, 0x4382, -0x0124, 0x40B2, 0x13C0, 0x01E8, 0x4292, 0x2784, 0x01EC, 0x40B2, 0x13C0, -0x01F0, 0x4292, 0x2784, 0x01F4, 0x42A2, 0x01F6, 0x4382, 0x14FE, 0x4382, -0x1500, 0x430C, 0x12B0, 0x3F54, 0x430C, 0x4130, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x8221, 0x4319, 0x403A, 0x1358, 0x403B, 0x1354, -0x4038, 0x1360, 0x3C03, 0x9329, 0x2001, 0x4229, 0x410C, 0x12B0, 0xD97C, -0x410C, 0x531C, 0x12B0, 0xD97C, 0x410C, 0x532C, 0x12B0, 0xD97C, 0x43C1, -0x0003, 0x412C, 0x411D, 0x0002, 0x12B0, 0xD196, 0x4C06, 0xF036, 0x0F00, -0x5036, 0x0080, 0x4127, 0x434C, 0x12A8, 0x407C, 0x0082, 0x12AB, 0x435C, -0x12A8, 0x490F, 0xF03F, 0x000F, 0x5F06, 0x460C, 0x12AA, 0x407C, 0x00C8, -0x12AB, 0x403C, 0x1401, 0x12AA, 0x407C, 0x0082, 0x12AB, 0x12B0, 0xD7C4, -0x470C, 0x12B0, 0xD7C2, 0x403C, 0x3FFD, 0x12B0, 0xD974, 0x407C, 0x0021, -0x12AB, 0x430C, 0x430D, 0x1292, 0x135A, 0x435C, 0x12A8, 0x407C, 0x00C8, -0x12AB, 0x403C, 0x0501, 0x12B0, 0xD974, 0x407C, 0x0042, 0x12AB, 0x435C, -0x12A8, 0x5319, 0x9039, 0x0010, 0x2BAD, 0x430C, 0x5221, 0x4030, 0xD422, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8231, 0x410C, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C52, 0x410C, 0x522C, -0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C47, -0x4038, 0x1354, 0x407C, 0x0082, 0x12A8, 0x4039, 0x1358, 0x403C, 0x3FFF, -0x12A9, 0x4036, 0x1360, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, -0x2409, 0x12A9, 0x12B0, 0xD9B4, 0x430A, 0x430B, 0x3C19, 0x407C, 0x00C1, -0x12A8, 0x412C, 0x411D, 0x0002, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12A8, -0x12B0, 0xD9B4, 0x430C, 0x12A9, 0x421F, 0x1112, 0x129F, 0x0008, 0x53A1, -0x0000, 0x6381, 0x0002, 0x531A, 0x630B, 0x911B, 0x0006, 0x2BE4, 0x2003, -0x911A, 0x0004, 0x2BE0, 0x12B0, 0xD9B4, 0x407C, 0x00C8, 0x12A8, 0x403C, -0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, 0x430C, 0x5231, -0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C0A, 0x4038, -0x1354, 0x407C, 0x00C8, 0x12A8, 0x4039, 0x1358, 0x403C, 0x3401, 0x12A9, -0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, 0x12A9, 0x4036, 0x1360, 0x12B0, -0xD91C, 0x4A0C, 0x12A9, 0x9382, 0x1506, 0x2402, 0x12B0, 0xD91C, 0x434C, -0x12A6, 0x407C, 0x0021, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A6, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x435C, -0x12A6, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C08, -0x4E0A, 0x4F0B, 0x4039, 0x1354, 0x407C, 0x0088, 0x12A9, 0x407C, 0x0034, -0x1292, 0x1356, 0x12B0, 0xD53A, 0x4036, 0x1360, 0x435C, 0x12A6, 0x12B0, -0xD54E, 0xDC08, 0xD038, 0x0080, 0x480C, 0x12B0, 0xD04E, 0x4A0C, 0x12B0, -0xD04E, 0x403C, 0x3FFD, 0x12B0, 0xD05C, 0x434C, 0x12A6, 0x407C, 0x0088, -0x12A9, 0x12B0, 0xD9FC, 0x3FCE, 0x120A, 0x120B, 0x1208, 0x8321, 0x430A, -0xB31C, 0x2851, 0x403C, 0x14F6, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x2403, 0x403C, 0xFFD7, 0x3C4F, 0x403C, 0x14FA, 0x421F, 0x1112, 0x129F, -0x0018, 0x933C, 0x203E, 0x403C, 0xFFD6, 0x3C44, 0x410C, 0x421F, 0x1112, -0x129F, 0x0016, 0x4C0A, 0x403B, 0x1360, 0x434C, 0x12AB, 0x4038, 0x1354, -0x407C, 0x00C8, 0x12A8, 0x403C, 0x0500, 0x1292, 0x1358, 0x407C, 0x00C1, -0x12A8, 0x421C, 0x14F6, 0x421D, 0x14F8, 0x1292, 0x135A, 0x435C, 0x12AB, -0x407C, 0x00A1, 0x12A8, 0x412C, 0x1292, 0x1358, 0x434C, 0x12AB, 0x407C, -0x00C8, 0x12A8, 0x403C, 0x0501, 0x1292, 0x1358, 0x435C, 0x12AB, 0x434C, -0x12AB, 0x435C, 0x12AB, 0x53A2, 0x14F6, 0x6382, 0x14F8, 0x53B2, 0x14FA, -0x63B2, 0x14FC, 0x421F, 0x14FA, 0xD21F, 0x14FC, 0x930F, 0x2402, 0x930A, -0x27BD, 0x4A0C, 0x5321, 0x4030, 0xD428, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x000C, 0x4037, 0x1112, 0x410C, -0x522C, 0x472F, 0x129F, 0x0018, 0x410C, 0x523C, 0x472F, 0x129F, 0x0018, -0x410C, 0x472F, 0x129F, 0x0018, 0x411C, 0x0004, 0x411D, 0x0006, 0x12B0, -0xD464, 0x411B, 0x0004, 0x4038, 0x1354, 0x407C, 0x0028, 0x12A8, 0x4039, -0x1358, 0x430C, 0x12A9, 0x4036, 0x1360, 0x12B0, 0xC808, 0x4075, 0x00C8, -0x12B0, 0xC83C, 0x4074, 0x0021, 0x12B0, 0xC81E, 0x407C, 0x00C2, 0x12A8, -0x430A, 0x430B, 0x3C0B, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x430C, 0x12A9, -0x472F, 0x129F, 0x0008, 0x531A, 0x630B, 0x911B, 0x000A, 0x2BF2, 0x2003, -0x911A, 0x0008, 0x2BEE, 0x12B0, 0xD786, 0x412C, 0x411D, 0x0002, 0x12B0, -0xD464, 0x412B, 0x12B0, 0xD786, 0x12B0, 0xC808, 0x12B0, 0xC83C, 0x12B0, -0xC81E, 0x430C, 0x5031, 0x000C, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C0A, 0x403B, 0x1354, 0x4078, -0x00C8, 0x484C, 0x12AB, 0x4039, 0x1358, 0x403C, 0x3401, 0x12A9, 0x4076, -0x0082, 0x464C, 0x12AB, 0x403C, 0x4035, 0x12A9, 0x4037, 0x1360, 0x434C, -0x12A7, 0x4074, 0x0042, 0x12B0, 0xD3EE, 0x4A2C, 0x12B0, 0xD172, 0x4035, -0x2401, 0x12B0, 0xD110, 0x403C, 0x4036, 0x12B0, 0xD3E8, 0x4A1C, 0x0002, -0x12B0, 0xD10C, 0x403C, 0x4039, 0x12B0, 0xD3E8, 0x4A1C, 0x0004, 0x12B0, -0xD10C, 0x403C, 0x4038, 0x12B0, 0xD3E8, 0x4A1C, 0x0006, 0x12B0, 0xD10C, -0x403C, 0x403A, 0x12B0, 0xD3E8, 0x4A1C, 0x0008, 0x12B0, 0xD10C, 0x403C, -0x403B, 0x12B0, 0xD3E8, 0x4A1C, 0x000A, 0x12B0, 0xD10C, 0x403C, 0x403C, -0x12B0, 0xD3E8, 0x4A1C, 0x000C, 0x12B0, 0xD172, 0x450C, 0x12A9, 0x435C, -0x12A7, 0x4030, 0xD41E, 0x435C, 0x12A9, 0x434C, 0x4920, 0x407C, 0x0088, -0x4A20, 0x407C, 0x00B0, 0x12AA, 0x403C, 0x0082, 0x430D, 0x4720, 0x407C, -0x00B0, 0x12AA, 0x403C, 0x0088, 0x430D, 0x4720, 0x474C, 0x12AA, 0x430C, -0x430D, 0x4210, 0x135A, 0x434C, 0x12A9, 0x407C, 0x0088, 0x12AA, 0x407C, -0x0024, 0x12A5, 0x435C, 0x4920, 0x12B0, 0xB5B4, 0x407C, 0x0042, 0x12AA, -0x435C, 0x4920, 0x12A8, 0x434C, 0x4920, 0x407C, 0x00C1, 0x12AA, 0x411C, -0x0004, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x4A20, 0x434C, 0x12B0, -0xB5EA, 0x474C, 0x3FEA, 0x434C, 0x12A9, 0x4B4C, 0x12AA, 0x403C, 0x2C01, -0x12A8, 0x435C, 0x12A9, 0x4B4C, 0x12AA, 0x403C, 0x2401, 0x4820, 0x407C, -0x0082, 0x12AA, 0x403C, 0x3FFF, 0x12B0, 0xB5B4, 0x4B4C, 0x12AA, 0x403C, -0x2409, 0x12A8, 0x3FA6, 0x120A, 0x120B, 0x1208, 0x1209, 0x8221, 0x4381, -0x0000, 0x4381, 0x0002, 0x4318, 0x403A, 0x1360, 0x403B, 0x1354, 0x3C03, -0x9328, 0x2001, 0x4228, 0x410C, 0x12B0, 0xD9A4, 0x410C, 0x531C, 0x12B0, -0xD9A4, 0x410C, 0x532C, 0x12B0, 0xD9A4, 0x9038, 0x000F, 0x2433, 0x930C, -0x2033, 0x412C, 0x411D, 0x0002, 0x12B0, 0xD196, 0xF03C, 0x0F00, 0x4809, -0xD039, 0x0080, 0xDC09, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0034, 0x1292, -0x1356, 0x12B0, 0xD06E, 0x490C, 0x12B0, 0xD06A, 0x412C, 0x12B0, 0xD06A, -0x403C, 0x3FFD, 0x12B0, 0xD078, 0x434C, 0x12AA, 0x407C, 0x0088, 0x12AB, -0x407C, 0x0024, 0x1292, 0x1356, 0x435C, 0x12AA, 0x5318, 0x9038, 0x0010, -0x2BC0, 0x430C, 0x5221, 0x4030, 0xD426, 0x930C, 0x37CD, 0x403C, 0xFFD8, -0x3FF8, 0x120A, 0x120B, 0x1208, 0xC232, 0x4303, 0x425E, 0x2780, 0x4E4F, -0xE37F, 0x421D, 0x2784, 0x403A, 0x277E, 0xBEC2, 0x1100, 0x2407, 0xFFCD, -0x0000, 0xCAED, 0x0000, 0xDECD, 0x0000, 0x3C04, 0xFFCD, 0x0000, 0xCAED, -0x0000, 0xDAED, 0x0000, 0x403B, 0x150C, 0x4038, 0x1504, 0x934C, 0x2418, -0xDECD, 0x0000, 0xDECD, 0x0000, 0x4A6C, 0xE37C, 0xFCCD, 0x0000, 0xDAED, -0x0000, 0x482F, 0xEBEF, 0x0000, 0xC232, 0x4303, 0xFCCD, 0x0000, 0xDAED, -0x0000, 0xD232, 0x482F, 0xEBEF, 0x0000, 0x3C18, 0xFFCD, 0x0000, 0xFFCD, -0x0000, 0x4A6C, 0xE37C, 0xFCCD, 0x0000, 0xDAED, 0x0000, 0x482E, 0xEBEE, -0x0000, 0xC232, 0x4303, 0xFCCD, 0x0000, 0xDAED, 0x0000, 0xD232, 0x482E, -0xEBEE, 0x0000, 0x4F4E, 0x4EC2, 0x1100, 0x4030, 0xD428, 0x120C, 0x8321, -0x4381, 0x0000, 0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, -0x2867, 0x01EA, 0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, -0x40B2, 0x286D, 0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x41D2, -0x0003, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x42D1, 0x007E, 0x0001, 0xC0F2, -0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x425E, 0x007E, -0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, 0xB31C, 0x2804, 0xD0F2, -0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xDEC1, 0x0000, 0xD392, -0x01F0, 0x412C, 0x5221, 0x4130, 0x120A, 0x8031, 0x0006, 0x403A, 0x1112, -0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, 0x00B0, 0x1292, 0x1354, -0x3C16, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, 0x0040, 0x0002, 0x2802, -0x4382, 0x14C0, 0x416C, 0x430D, 0x1292, 0x135C, 0x411C, 0x0002, 0x411D, -0x0004, 0x1292, 0x135C, 0x53F1, 0x0001, 0x93C1, 0x0001, 0x242A, 0x410C, -0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2815, 0x416E, 0xC35E, 0x907E, -0x008A, 0x2004, 0x421C, 0x1144, 0x430D, 0x3C08, 0x416C, 0x430D, 0x1292, -0x135C, 0x430C, 0x430D, 0x1292, 0x135C, 0x4A2F, 0x129F, 0x000A, 0x3FDF, -0x410C, 0x532C, 0x4A2F, 0x129F, 0x0018, 0x416E, 0xC35E, 0x907E, 0x008A, -0x23C1, 0x4192, 0x0002, 0x1144, 0x3FD1, 0x430C, 0x5031, 0x0006, 0x413A, -0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1292, 0x2756, 0x430B, 0x3C05, -0x930B, 0x2403, 0x903B, 0x0003, 0x2005, 0x4308, 0x4219, 0x274E, 0x430C, -0x3C11, 0x931B, 0x2402, 0x922B, 0x2003, 0x4318, 0x431C, 0x3C0A, 0x932B, -0x2406, 0x903B, 0x0005, 0x2403, 0x903B, 0x0006, 0x2003, 0x4328, 0x432C, -0x1289, 0x434C, 0x1292, 0x2754, 0x1292, 0x134E, 0x1292, 0x1350, 0x407C, -0x0028, 0x1292, 0x1354, 0x4C4A, 0x1292, 0x2756, 0x903A, 0x0089, 0x2409, -0x903A, 0x0091, 0x2406, 0x903A, 0x0095, 0x2403, 0x903A, 0x0099, 0x2008, -0x4A0C, 0x12B0, 0xD904, 0x480C, 0x12B0, 0xD904, 0x430C, 0x3C0C, 0x531B, -0x903B, 0x0007, 0x2BBE, 0x433C, 0x12B0, 0xD904, 0x403C, 0xAAAA, 0x12B0, -0xD904, 0x433C, 0x4030, 0xD426, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x435B, 0x4038, 0x1360, -0x4039, 0x1358, 0x4036, 0x1354, 0x3C03, 0x936B, 0x2001, 0x426B, 0x407C, -0x0088, 0x12A6, 0x403C, 0x0034, 0x12A9, 0x12B0, 0xD230, 0x4B4C, 0x108C, -0xF03C, 0x0F00, 0xD03C, 0x0060, 0x12B0, 0xD23A, 0x12B0, 0xD230, 0x403C, -0x00FC, 0x12B0, 0xD23A, 0x430C, 0x12A9, 0x4C07, 0x434C, 0x12A8, 0x435C, -0x12A8, 0x430C, 0x12A9, 0x4C0A, 0x434C, 0x12A8, 0x407C, 0x0088, 0x12A6, -0x407C, 0x0024, 0x1292, 0x1356, 0x435C, 0x12A8, 0x4781, 0x0000, 0x4A81, -0x0002, 0x403D, 0x0003, 0x410C, 0x421F, 0x1112, 0x129F, 0x0006, 0x535B, -0x907B, 0x0010, 0x2BC3, 0x430C, 0x5221, 0x4030, 0xD422, 0x120A, 0x120B, -0x1208, 0x1209, 0x434C, 0x1292, 0x276E, 0x4218, 0x275A, 0x4039, 0x0028, -0x490C, 0x1288, 0x434C, 0x1292, 0x276C, 0x490C, 0x1288, 0x435C, 0x1292, -0x276C, 0x490C, 0x1288, 0x435C, 0x1292, 0x276E, 0x490C, 0x1288, 0x435C, -0x12B0, 0xD6B2, 0x430A, 0x430B, 0x407C, 0x0086, 0x1292, 0x1354, 0x430C, -0x1292, 0x1358, 0x531A, 0x630B, 0x2020, 0x903A, 0x0BB8, 0x2C1D, 0xB31C, -0x2BF5, 0x431C, 0x1292, 0x1358, 0x403C, 0xA55A, 0x1292, 0x1358, 0x1292, -0x2756, 0x490C, 0x1288, 0x434C, 0x12B0, 0xD6B2, 0x494C, 0x1292, 0x1354, -0x4C4C, 0x903C, 0x0095, 0x2408, 0x903C, 0x0091, 0x2405, 0x903C, 0x0099, -0x2402, 0x433C, 0x3C01, 0x430C, 0x4030, 0xD426, 0x120A, 0x120B, 0x1208, -0x8221, 0x430A, 0x430B, 0x4381, 0x0000, 0x4381, 0x0002, 0x410C, 0x421F, -0x1112, 0x129F, 0x0016, 0x407C, 0x0028, 0x1292, 0x1354, 0x4C48, 0x9038, -0x0089, 0x240B, 0x9038, 0x0091, 0x2408, 0x9038, 0x0095, 0x2405, 0x9038, -0x0099, 0x2402, 0x432C, 0x3C2B, 0x407C, 0x00D0, 0x1292, 0x1354, 0x430C, -0x1292, 0x1358, 0x4C08, 0x531A, 0x630B, 0x4C0F, 0xE33F, 0x5F0F, 0x7F0F, -0xB12C, 0x2008, 0xB11F, 0x0002, 0x2005, 0x930B, 0x2003, 0x903A, 0x000A, -0x2BEC, 0x930B, 0x200F, 0x903A, 0x000A, 0x2C0C, 0x431B, 0x431C, 0x421F, -0x1112, 0x129F, 0x0008, 0x480C, 0x421F, 0x1112, 0x129F, 0x0008, 0x3C01, -0x432B, 0x4B0C, 0x5221, 0x4030, 0xD428, 0x464C, 0x12AB, 0x435C, 0x4A20, -0x407C, 0x00C1, 0x12AB, 0x411C, 0x0004, 0x430D, 0x1292, 0x135A, 0x407C, -0x00A1, 0x4B20, 0x454C, 0x12AB, 0x430C, 0x12A8, 0xF07C, 0x0081, 0x907C, -0x0081, 0x4130, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x407C, 0x0021, 0x12AB, -0x430C, 0x430D, 0x1292, 0x135A, 0x4C81, 0x000A, 0x4D81, 0x000C, 0x4130, -0x434C, 0x12AA, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0024, 0x12A4, 0x435C, -0x4A20, 0x464C, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12AA, 0x474C, -0x12AB, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12A8, -0x434C, 0x12AA, 0x407C, 0x0042, 0x3FB9, 0x434C, 0x12AA, 0x12B0, 0xD790, -0x407C, 0x0021, 0x3FB2, 0x930D, 0x3408, 0x1208, 0xE33C, 0xE33D, 0x531C, -0x630D, 0x4038, 0x0197, 0x3C03, 0x1208, 0x4038, 0x0097, 0x903D, 0x0100, -0x2C1C, 0x930D, 0x200F, 0x903C, 0x0100, 0x2806, 0x108C, 0x4C4D, 0xC03C, -0x00FF, 0x8238, 0x3C06, 0x930C, 0x240D, 0x4C0D, 0x430C, 0x8038, 0x0010, -0x8318, 0x5C0C, 0x6D4D, 0x2BFC, 0x1108, 0x104D, 0x100C, 0x1088, 0xD80D, -0x4138, 0x4130, 0x1207, 0x4347, 0x903D, 0x0200, 0x2808, 0xC312, 0x100D, -0x100C, 0x1047, 0x5318, 0x903D, 0x0200, 0x2FF8, 0x1108, 0x104D, 0x100C, -0x1088, 0xD80D, 0x6747, 0x2806, 0xC312, 0x1047, 0x2001, 0x2802, 0x531C, -0x630D, 0x4137, 0x4138, 0x4130, 0x435C, 0x12A9, 0x4030, 0xBCA8, 0x434C, -0x12A9, 0x407C, 0x00C1, 0x4A20, 0x434C, 0x12A9, 0x435C, 0x4030, 0xBD02, -0x12AB, 0x434C, 0x12A9, 0x435C, 0x4920, 0x407C, 0x0028, 0x12AA, 0x430C, -0x4B20, 0x407C, 0x00F4, 0x12AA, 0x403C, 0x4020, 0x4B20, 0x407C, 0x00B0, -0x12AA, 0x403C, 0x0088, 0x430D, 0x4620, 0x430D, 0x12A4, 0x435C, 0x12A9, -0x434C, 0x12A9, 0x407C, 0x0042, 0x3FE7, 0x430D, 0x12A4, 0x435C, 0x12A9, -0x407C, 0x00A1, 0x4A20, 0x12B0, 0xBD00, 0x403C, 0x0500, 0x12AB, 0x3FCB, -0x434C, 0x12A9, 0x484C, 0x4A20, 0x12AB, 0x12B0, 0xBD00, 0x403C, 0x0501, -0x12AB, 0x435C, 0x12A9, 0x4030, 0xBCA8, 0x120A, 0x43C2, 0x1100, 0x43C2, -0x1396, 0x4382, 0x1112, 0x403A, 0xD202, 0x403E, 0x000A, 0x430D, 0x403C, -0x1114, 0x128A, 0x403E, 0x0010, 0x430D, 0x403C, 0x1102, 0x128A, 0x403E, -0x0020, 0x430D, 0x403C, 0x111E, 0x128A, 0x4382, 0x113E, 0x43C2, 0x1140, -0x4382, 0x1142, 0x40B2, 0x0417, 0x1144, 0x4382, 0x14FE, 0x40B2, 0x0BB8, -0x1502, 0x43D2, 0x150F, 0x43C2, 0x1510, 0x4382, 0x136C, 0x4382, 0x136E, -0x4382, 0x150A, 0x43C2, 0x1511, 0x4382, 0x1508, 0x403E, 0x0006, 0x430D, -0x403C, 0x137C, 0x128A, 0x403E, 0x0012, 0x430D, 0x403C, 0x1382, 0x128A, -0x4392, 0x1398, 0x413A, 0x4130, 0x435C, 0x12A9, 0x434C, 0x4920, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x12B0, 0xD270, 0x3C0F, 0x12B0, -0xBE18, 0x12B0, 0xBDEE, 0x12B0, 0xBDAA, 0x430C, 0x12A6, 0x4C8B, 0x0000, -0x434C, 0x12A9, 0x12B0, 0xBDFE, 0x532B, 0x480F, 0x5338, 0x930F, 0x23ED, -0x4030, 0xD422, 0x407C, 0x00C1, 0x12A7, 0x4A0C, 0x12A6, 0x407C, 0x00A1, -0x4720, 0x407C, 0x00C8, 0x12A7, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, -0x12A7, 0x435C, 0x12A9, 0x532A, 0x4130, 0x407C, 0x0082, 0x12A7, 0x403C, -0x3FFF, 0x12A6, 0x434C, 0x12A9, 0x407C, 0x00C8, 0x12A7, 0x403C, 0x2409, -0x12A6, 0x3FBA, 0x120A, 0x120B, 0x1208, 0x1209, 0x8321, 0x431A, 0x403B, -0x1360, 0x4038, 0x1358, 0x4039, 0x1354, 0x3C03, 0x932A, 0x2001, 0x422A, -0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x903A, 0x000F, 0x2429, 0x930C, -0x2029, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x3401, 0x12A8, 0x407C, 0x0082, -0x12A9, 0x4A0C, 0xD03C, 0x4030, 0x12B0, 0xD772, 0x412C, 0x12B0, 0xD772, -0x403C, 0x3FFD, 0x12B0, 0xD4E4, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x12A9, -0x403C, 0x2401, 0x12A8, 0x435C, 0x12AB, 0x531A, 0x903A, 0x0010, 0x2BD0, -0x430C, 0x5321, 0x4030, 0xD426, 0x930C, 0x37D7, 0x403C, 0xFFD8, 0x3FF8, -0x120A, 0x120B, 0x8031, 0x0006, 0x403A, 0x1112, 0x410C, 0x531C, 0x4A2F, -0x129F, 0x0014, 0x407C, 0x00B0, 0x1292, 0x1354, 0x403B, 0x135C, 0x3C19, -0x410C, 0x532C, 0x4A2F, 0x129F, 0x0018, 0x416C, 0x430D, 0x12AB, 0x411C, -0x0002, 0x411D, 0x0004, 0x12AB, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, -0x0040, 0x0002, 0x2802, 0x4382, 0x14C0, 0x53F1, 0x0001, 0x93C1, 0x0001, -0x2411, 0x410C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BDD, 0x416C, -0x430D, 0x12AB, 0x430C, 0x430D, 0x12AB, 0x4A2F, 0x129F, 0x000A, 0x3FEA, -0x430C, 0x5031, 0x0006, 0x413B, 0x413A, 0x4130, 0x435C, 0x12A6, 0x4030, -0xBFB0, 0x12B0, 0xBFB0, 0x434C, 0x4620, 0x474C, 0x12A9, 0x403C, 0x1501, -0x4820, 0x430D, 0x12A7, 0x431C, 0x430D, 0x4720, 0x12B0, 0xBFAE, 0x403C, -0x3FFD, 0x12A8, 0x434C, 0x4620, 0x407C, 0x0030, 0x4920, 0x434C, 0x12A6, -0x407C, 0x00C1, 0x4920, 0x434C, 0x12A6, 0x407C, 0x0042, 0x12A9, 0x435C, -0x4620, 0x474C, 0x12A9, 0x403C, 0x0501, 0x4820, 0x474C, 0x12A9, 0x403C, -0x0501, 0x12A8, 0x434C, 0x12A6, 0x435C, 0x4620, 0x430D, 0x12A7, 0x430C, -0x430D, 0x4720, 0x12A8, 0x474C, 0x12A9, 0x403C, 0x1401, 0x12A8, 0x444C, -0x12A9, 0x4030, 0xBFB0, 0x120A, 0x120B, 0x1208, 0x8231, 0x410C, 0x421F, -0x1112, 0x129F, 0x0018, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0018, -0x4038, 0x1360, 0x434C, 0x12A8, 0x430A, 0x430B, 0x3C1E, 0x407C, 0x00C1, -0x1292, 0x1354, 0x412C, 0x411D, 0x0002, 0x1292, 0x135A, 0x435C, 0x12A8, -0x434C, 0x12A8, 0x407C, 0x0042, 0x1292, 0x1354, 0x430C, 0x1292, 0x1358, -0x421F, 0x1112, 0x129F, 0x0008, 0x53A1, 0x0000, 0x6381, 0x0002, 0x531A, -0x630B, 0x911B, 0x0006, 0x2BDF, 0x2003, 0x911A, 0x0004, 0x2BDB, 0x435C, -0x12A8, 0x434C, 0x12A8, 0x435C, 0x12A8, 0x430C, 0x5231, 0x4030, 0xD428, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x435A, 0x403B, 0x1360, 0x4038, -0x1358, 0x4039, 0x1354, 0x3C03, 0x936A, 0x2001, 0x426A, 0x407C, 0x00C8, -0x12A9, 0x403C, 0x3401, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x4A4C, 0x108C, -0xF03C, 0x0F00, 0xD03C, 0x4082, 0x12B0, 0xD514, 0x407C, 0x0082, 0x12A9, -0x403C, 0x00FE, 0x12B0, 0xD514, 0x434C, 0x12AB, 0x435C, 0x12AB, 0x430C, -0x12A8, 0x4C06, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x2401, -0x12A8, 0x435C, 0x12AB, 0x460C, 0x421F, 0x1112, 0x129F, 0x0008, 0x535A, -0x907A, 0x0010, 0x2BCB, 0x430C, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, -0x1209, 0x4308, 0x430A, 0x430B, 0x3C08, 0xB329, 0x2836, 0x930B, 0x3804, -0x2033, 0x903A, 0x1388, 0x2C30, 0x434C, 0x1292, 0x1360, 0x407C, 0x0028, -0x1292, 0x1354, 0x430C, 0x1292, 0x1358, 0x4C09, 0x9318, 0x380B, 0xB32C, -0x2C16, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x3400, 0x1292, 0x1358, -0x3C0D, 0x9308, 0x200B, 0xB32C, 0x2809, 0x407C, 0x00C8, 0x1292, 0x1354, -0x403C, 0x3402, 0x1292, 0x1358, 0x4318, 0x435C, 0x1292, 0x1360, 0x531A, -0x630B, 0x9038, 0x000A, 0x3BCB, 0x433C, 0x433D, 0x3C02, 0x430C, 0x430D, -0x4030, 0xD426, 0x120A, 0x120B, 0x1208, 0x1209, 0x4308, 0x430A, 0x430B, -0x3C08, 0xB329, 0x2836, 0x930B, 0x3804, 0x2033, 0x903A, 0x1388, 0x2C30, -0x434C, 0x1292, 0x1360, 0x407C, 0x0028, 0x1292, 0x1354, 0x430C, 0x1292, -0x1358, 0x4C09, 0x9318, 0x380B, 0xB32C, 0x2C16, 0x407C, 0x00C8, 0x1292, -0x1354, 0x403C, 0x3400, 0x1292, 0x1358, 0x3C0D, 0x9308, 0x200B, 0xB32C, -0x2809, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x3402, 0x1292, 0x1358, -0x4318, 0x435C, 0x1292, 0x1360, 0x531A, 0x630B, 0x9038, 0x000A, 0x3BCB, -0x433C, 0x433D, 0x3C02, 0x430C, 0x430D, 0x4030, 0xD426, 0x40B2, 0x0006, -0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2867, 0x01EA, 0x40B2, 0x2871, -0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, 0x40B2, 0x286D, 0x01F2, 0xD0B2, -0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, 0xD0F2, 0x000E, -0x0033, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, -0x425E, 0x007E, 0x5E4E, 0xF0F2, 0x00F1, 0x0033, 0xB35C, 0x2804, 0xD0F2, -0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7F4F, 0x535F, 0xD392, 0x01F0, 0xDF4E, -0x4E4C, 0x4130, 0x474C, 0x4030, 0xC2C2, 0x474C, 0x12B0, 0xC2C2, 0x403C, -0xD034, 0x4820, 0x407C, 0x0021, 0x12AB, 0x430C, 0x12A8, 0x4C81, 0x000A, -0x4381, 0x000C, 0x4130, 0x444C, 0x12AB, 0x430C, 0x12A8, 0xF07C, 0x0081, -0x907C, 0x0081, 0x4130, 0x12A8, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12AB, -0x435C, 0x4A20, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x12B0, 0xD5F6, 0x435C, -0x4A20, 0x474C, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12AA, 0x494C, -0x12AB, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12B0, -0xD5F6, 0x407C, 0x0021, 0x4030, 0xC2C2, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x403A, 0x1354, 0x407B, 0x0088, 0x4B4C, -0x12AA, 0x4038, 0x1358, 0x403C, 0x0034, 0x12A8, 0x4079, 0x0082, 0x494C, -0x12AA, 0x4036, 0x1360, 0x435C, 0x12A6, 0x403C, 0x0960, 0x12A8, 0x434C, -0x12A6, 0x4077, 0x0042, 0x12B0, 0xCFF6, 0x4C04, 0x12B0, 0xD90C, 0x4C05, -0x12B0, 0xD4D4, 0x4B4C, 0x12AA, 0x403C, 0x0034, 0x12A8, 0x12B0, 0xD8F4, -0x403C, 0x0A60, 0x12A8, 0x434C, 0x12A6, 0x12B0, 0xCFF6, 0x4C07, 0x12B0, -0xD90C, 0x12B0, 0xD4D4, 0x470D, 0x440C, 0xD50D, 0x4030, 0xD41E, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C05, 0x4C2A, -0x4C1B, 0x0002, 0x4038, 0x1360, 0x434C, 0x12A8, 0x4039, 0x1354, 0x4074, -0x0082, 0x12B0, 0xC866, 0x4036, 0x1358, 0x12B0, 0xC876, 0x503C, 0x0085, -0x12A6, 0x4077, 0x00C8, 0x12B0, 0xC886, 0x451A, 0x0004, 0x451B, 0x0006, -0x12B0, 0xC86E, 0x503C, 0x0086, 0x12B0, 0xC884, 0x451A, 0x0008, 0x451B, -0x000A, 0x12B0, 0xC86E, 0x503C, 0x0089, 0x12B0, 0xC884, 0x451A, 0x000C, -0x451B, 0x000E, 0x12B0, 0xC86E, 0x503C, 0x0088, 0x12B0, 0xC884, 0x4030, -0xD41E, 0x42B2, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2859, 0x01EA, -0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2851, 0x01EA, 0x40B2, 0x286D, -0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, -0xD0F2, 0x000E, 0x0033, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, -0x0079, 0x2BFD, 0xF0F2, 0x00F1, 0x0033, 0xB35C, 0x2804, 0xD0F2, 0x0003, -0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0x425C, 0x007E, 0x5C4C, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xD392, -0x01F0, 0xDE4C, 0x4130, 0x120A, 0x120B, 0x1208, 0x4C08, 0x4E0A, 0x4F0B, -0x12B0, 0xBD1C, 0x4A82, 0x136C, 0x4B82, 0x136E, 0xB23A, 0x2804, 0x432F, -0x403B, 0x0535, 0x3C03, 0x431F, 0x403B, 0x07CF, 0x4B82, 0x1378, 0x4F82, -0x1374, 0x403E, 0x000A, 0x403D, 0x253A, 0x403C, 0x1114, 0x12B0, 0xD1A2, -0x4882, 0x1112, 0x12B0, 0xCD6A, 0x9382, 0x128C, 0x2009, 0xB2B2, 0x136C, -0x2C06, 0x40B2, 0xFFFE, 0x128A, 0x4292, 0x275C, 0x128C, 0x12B0, 0xAFDE, -0x40B2, 0x040F, 0x1144, 0x40B2, 0x0052, 0x111A, 0x40B2, 0x1146, 0x111C, -0x403C, 0x1114, 0x4030, 0xD428, 0x120A, 0x120B, 0x8221, 0x403A, 0x1112, -0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, 0x0090, 0x1292, 0x1354, -0x403B, 0x1358, 0x3C16, 0x410C, 0x532C, 0x4A2F, 0x129F, 0x0016, 0x416C, -0x12AB, 0x411C, 0x0002, 0x12AB, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, -0x0040, 0x0002, 0x2802, 0x4382, 0x14C0, 0x53F1, 0x0001, 0x93C1, 0x0001, -0x240F, 0x410C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BE0, 0x416C, -0x12AB, 0x430C, 0x12AB, 0x4A2F, 0x129F, 0x0008, 0x3FEC, 0x430C, 0x5221, -0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x8221, 0x4291, -0x2772, 0x0000, 0x4291, 0x2774, 0x0002, 0x403A, 0x1360, 0x434C, 0x12AA, -0x403B, 0x1354, 0x4078, 0x00C8, 0x484C, 0x12AB, 0x4039, 0x1358, 0x12B0, -0xD72A, 0x403C, 0xFF80, 0x12B0, 0xD504, 0x412C, 0x12B0, 0xD0A2, 0x434C, -0x12AA, 0x484C, 0x12AB, 0x12B0, 0xD72A, 0x403C, 0xFF82, 0x12B0, 0xD504, -0x411C, 0x0002, 0x12B0, 0xD0A2, 0x407C, 0x0054, 0x12AB, 0x403C, 0x0200, -0x430D, 0x1292, 0x135C, 0x430C, 0x5221, 0x4030, 0xD426, 0x120A, 0x120B, -0x8221, 0x403A, 0x1112, 0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, -0x0090, 0x1292, 0x1354, 0x403B, 0x1358, 0x3C12, 0x410C, 0x532C, 0x4A2F, -0x129F, 0x0016, 0x90F1, 0x0088, 0x0000, 0x2002, 0xD391, 0x0002, 0x416C, -0x12AB, 0x411C, 0x0002, 0x12AB, 0x53F1, 0x0001, 0x93C1, 0x0001, 0x240F, -0x410C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BE4, 0x416C, 0x12AB, -0x430C, 0x12AB, 0x4A2F, 0x129F, 0x0008, 0x3FEC, 0x430C, 0x5221, 0x413B, -0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x4038, 0x1354, 0x4079, 0x00C8, 0x494C, 0x12A8, 0x12B0, 0xD844, 0x407B, -0x0082, 0x4B4C, 0x12A8, 0x403C, 0x4982, 0x12A6, 0x4037, 0x1360, 0x434C, -0x12A7, 0x4074, 0x0042, 0x12B0, 0xCE9C, 0x4C0A, 0x12B0, 0xD322, 0x494C, -0x12A8, 0x403C, 0x3401, 0x12A6, 0x4B4C, 0x12A8, 0x403C, 0x4A82, 0x12A6, -0x434C, 0x12A7, 0x12B0, 0xCE9C, 0x4C0B, 0x12B0, 0xD322, 0x4A0C, 0x4B0D, -0x4030, 0xD420, 0x120A, 0x407C, 0x0044, 0x1292, 0x1354, 0x431C, 0x1292, -0x275A, 0x43D2, 0x1396, 0x407C, 0x0024, 0x1292, 0x1354, 0x421A, 0x2784, -0xC2DA, 0x2780, 0x0000, 0xC2DA, 0x277E, 0x0000, 0xD2DA, 0x277E, 0x0000, -0x431C, 0x430D, 0x12B0, 0x45AE, 0xD2DA, 0x2780, 0x0000, 0x403C, 0x0003, -0x1292, 0x275A, 0x430C, 0x430D, 0x12B0, 0x45AE, 0x407C, 0x0054, 0x1292, -0x1354, 0x403C, 0x0200, 0x430D, 0x1292, 0x135C, 0x430C, 0x413A, 0x4130, -0x120A, 0x120B, 0x1208, 0x1209, 0x4C0A, 0x4D0B, 0x4038, 0x1354, 0x407C, -0x0088, 0x12A8, 0x407C, 0x0034, 0x1292, 0x1356, 0x407C, 0x0082, 0x12A8, -0x12B0, 0xD54E, 0xD03C, 0x0080, 0x1292, 0x1358, 0x4039, 0x1360, 0x434C, -0x12A9, 0x435C, 0x12A9, 0x4A0C, 0x1292, 0x1358, 0x434C, 0x12A9, 0x407C, -0x0021, 0x12A8, 0x12B0, 0xBDAA, 0x407C, 0x0088, 0x12A8, 0x12B0, 0xD9FC, -0x435C, 0x12A9, 0x4030, 0xD426, 0x120A, 0x403A, 0x1354, 0x934C, 0x200A, -0x407C, 0x00C8, 0x12AA, 0x403C, 0x7401, 0x1292, 0x1358, 0x434C, 0x12B0, -0x453A, 0x407C, 0x0044, 0x12AA, 0x431C, 0x1292, 0x275A, 0x431C, 0x430D, -0x12B0, 0x45AE, 0x407C, 0x0024, 0x12AA, 0x431C, 0x1292, 0x275A, 0x430C, -0x430D, 0x12B0, 0x45AE, 0x435C, 0x12B0, 0x453A, 0x407C, 0x0054, 0x12AA, -0x403C, 0x0200, 0x430D, 0x1292, 0x135C, 0x430C, 0x413A, 0x4130, 0x434C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x435C, 0x12A6, 0x4A0C, 0x12A9, 0x434C, -0x4620, 0x444C, 0x12A8, 0x430C, 0x430D, 0x1292, 0x135A, 0x454C, 0x12A8, -0x403C, 0x0501, 0x12A9, 0x435C, 0x12A6, 0x444C, 0x4820, 0x454C, 0x12A8, -0x403C, 0x1400, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x434C, 0x12A6, 0x435C, -0x12A6, 0x4B0C, 0x12A9, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x403C, 0x4303, -0x3FD9, 0x444C, 0x12A9, 0x435C, 0x4820, 0x434C, 0x12A8, 0x12B0, 0xC866, -0x4A0C, 0x4B0D, 0x12B0, 0xD196, 0xF03C, 0x0F00, 0x4130, 0x12A6, 0x474C, -0x12A9, 0x403C, 0x1401, 0x12A6, 0x444C, 0x12A9, 0x12B0, 0xD800, 0x4A0C, -0x12B0, 0xD7FE, 0x403C, 0x3FFD, 0x12B0, 0xD95C, 0x12B0, 0xD430, 0x12A8, -0x474C, 0x12A9, 0x403C, 0x0501, 0x12B0, 0xD95C, 0x407C, 0x0042, 0x4030, -0xC868, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C08, 0x4E0A, 0x4039, -0x1354, 0x407C, 0x00C8, 0x12A9, 0x12B0, 0xD844, 0x12B0, 0xD53A, 0xD038, -0x4030, 0x480C, 0x12A6, 0x4038, 0x1360, 0x12B0, 0xD532, 0x4A0C, 0x12A6, -0x12B0, 0xD532, 0x403C, 0x3FFD, 0x12A6, 0x12B0, 0xD7A4, 0x12B0, 0xD83A, -0x12A9, 0x403C, 0x2401, 0x12A6, 0x435C, 0x12A8, 0x4030, 0xD424, 0x12B0, -0xC920, 0x430C, 0x4030, 0x8D6A, 0x40B2, 0xC304, 0x14A2, 0x40B2, 0xB2B0, -0x14A4, 0x40B2, 0xC744, 0x14A6, 0x40B2, 0xCB78, 0x14A8, 0x40B2, 0xCB30, -0x14AA, 0x4292, 0x11E4, 0x14AC, 0x4130, 0x12B0, 0xC94E, 0x4030, 0x8D6A, -0x12B0, 0xCE4C, 0x40B2, 0xCDA2, 0x14A6, 0x12B0, 0xCE5A, 0x431C, 0x4130, -0x12B0, 0xCE3E, 0x3FDA, 0x434C, 0x12AB, 0x407C, 0x0082, 0x12A9, 0x435C, -0x4B20, 0x474C, 0x12A9, 0x435C, 0x12AB, 0x430C, 0x12A8, 0x4C81, 0x0002, -0x12B0, 0xD756, 0x12AB, 0x430C, 0x12A8, 0x4C05, 0x12B0, 0xD756, 0x12B0, -0xD754, 0x12B0, 0xD754, 0x12AB, 0x9382, 0x1398, 0x2005, 0x407C, 0x00C8, -0x12A9, 0x440C, 0x12A8, 0x434C, 0x12AB, 0x474C, 0x3FDC, 0x12B0, 0xD0BE, -0x4820, 0x12B0, 0xC9E6, 0x12B0, 0xC9B6, 0x403C, 0x3FFD, 0x12B0, 0xC9E6, -0x464C, 0x12AB, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x454C, 0x12AB, 0x407C, -0x0024, 0x12A4, 0x435C, 0x4820, 0x12A9, 0x434C, 0x4820, 0x4C81, 0x0002, -0x454C, 0x12B0, 0xD0CE, 0x12A8, 0x411C, 0x0002, 0x12A9, 0x434C, 0x12A8, -0x3FD9, 0xD3E2, 0x0031, 0xD3D2, 0x0031, 0xD2F2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, -0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xC3D2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0x430C, 0x4130, 0x1206, 0x1207, 0x4D06, 0xD07D, 0x0080, 0x6606, -0x6707, 0x1086, 0xF376, 0x8076, 0x007F, 0x2814, 0x8076, 0x0018, 0x280A, -0x9236, 0x3412, 0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x4137, 0x4136, -0x4130, 0xE376, 0x27FA, 0x110D, 0x100C, 0x8356, 0x23FC, 0x3FF5, 0x430C, -0x430D, 0x3FF2, 0x433C, 0x433D, 0x3FEF, 0x1285, 0x4C0F, 0xDD0F, 0x930F, -0x4130, 0x464C, 0x12AB, 0x403C, 0x0082, 0x4820, 0x494C, 0x12AB, 0x403C, -0x3400, 0x4820, 0x444C, 0x12AB, 0x430C, 0x4820, 0x407C, 0x00C1, 0x12AB, -0x411C, 0x0004, 0x12A8, 0x407C, 0x00A1, 0x4130, 0x494C, 0x12AB, 0x403C, -0x3401, 0x12A8, 0x474C, 0x4B20, 0x12A8, 0x3FDB, 0x120A, 0x120B, 0x1292, -0x134E, 0x1292, 0x1350, 0x407A, 0x0003, 0x407C, 0x0028, 0x1292, 0x1354, -0x403C, 0xAAAA, 0x1292, 0x1358, 0x4C0B, 0x903C, 0x5555, 0x2006, 0x403C, -0x5555, 0x421F, 0x1112, 0x129F, 0x0008, 0x537A, 0x23EC, 0x4B0C, 0x421F, -0x1112, 0x129F, 0x0008, 0x430C, 0x413B, 0x413A, 0x4130, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x4C0A, 0x4D0B, 0x4E07, 0x12B0, 0xD5BE, -0x3C12, 0x12B0, 0xCFB2, 0x12B0, 0xD2C0, 0x12B0, 0xCFCE, 0x430C, 0x12A9, -0x4C8B, 0x0000, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x12B0, 0xD358, 0x532A, -0x532B, 0x470F, 0x5337, 0x930F, 0x23EA, 0x4030, 0xD422, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x4C0A, 0x4D07, 0x4E0B, 0x12B0, 0xD5BE, -0x3C11, 0x12B0, 0xCFB2, 0x407C, 0x0048, 0x12A6, 0x427C, 0x1292, 0x1356, -0x12B0, 0xD2C0, 0x473C, 0x12A9, 0x12B0, 0xD83A, 0x12B0, 0xD358, 0x532A, -0x4B0F, 0x533B, 0x930F, 0x23EB, 0x4030, 0xD422, 0x8321, 0x410C, 0x421F, -0x1112, 0x129F, 0x0014, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C15, 0x416C, -0x1292, 0x274E, 0x930C, 0x2403, 0x403C, 0xFFEA, 0x3C0D, 0x434C, 0x1292, -0x2754, 0x1292, 0x134E, 0x1292, 0x1350, 0x435C, 0x421F, 0x1112, 0x129F, -0x0004, 0x430C, 0x5321, 0x4130, 0x435C, 0x12A6, 0x407C, 0x0048, 0x12AA, -0x435C, 0x1292, 0x1356, 0x435C, 0x12A6, 0x4307, 0x407C, 0x0028, 0x12AA, -0x430C, 0x12A8, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2408, 0x434C, 0x12A6, -0x435C, 0x12A6, 0x5317, 0x9037, 0x000A, 0x2BEE, 0x9037, 0x000A, 0x4130, -0x120A, 0x407C, 0x0086, 0x12B0, 0x7674, 0x421A, 0x275A, 0x403C, 0x000A, -0x128A, 0x431E, 0x430F, 0x403C, 0x0010, 0x12B0, 0x839C, 0x403C, 0x000A, -0x128A, 0x403E, 0xA55A, 0x430F, 0x403C, 0x0010, 0x12B0, 0x839C, 0x403C, -0x000F, 0x128A, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x12B0, 0xD270, 0x3C10, 0x12B0, 0xBE18, 0x407C, 0x0048, 0x12A7, -0x427C, 0x1292, 0x1356, 0x12B0, 0xBDEE, 0x4B3C, 0x12A6, 0x12B0, 0xBDAA, -0x12B0, 0xBDFE, 0x480F, 0x5338, 0x930F, 0x23EC, 0x4030, 0xD422, 0x12A6, -0x434C, 0x12A9, 0x407C, 0x0042, 0x12B0, 0xCCF4, 0x484C, 0x4030, 0xCCF4, -0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x12B0, 0xCCF4, 0x434C, 0x12A9, -0x444C, 0x12AA, 0x407C, 0x0024, 0x12AB, 0x435C, 0x4920, 0x474C, 0x12AA, -0x435C, 0x4920, 0x435C, 0x12A9, 0x407C, 0x0048, 0x12AA, 0x435C, 0x12A5, -0x435C, 0x12A9, 0x4306, 0x12B0, 0xD7D6, 0xF07C, 0x0081, 0x907C, 0x0081, -0x2408, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x5316, 0x9036, 0x000A, 0x2BF1, -0x9036, 0x000A, 0x4130, 0x1209, 0x120A, 0x120B, 0x430A, 0x430B, 0x4039, -0x0020, 0x5C0C, 0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, -0x5339, 0x23F6, 0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, -0x413B, 0x413A, 0x4139, 0x4130, 0x434E, 0x4E4F, 0x5F0F, 0x5F0F, 0x4F9F, -0x2544, 0x1146, 0x4F9F, 0x2546, 0x1148, 0x535E, 0x907E, 0x0050, 0x2BF3, -0x407E, 0x0050, 0x4E4F, 0x5F0F, 0x5F0F, 0x43BF, 0x1146, 0x438F, 0x1148, -0x535E, 0x907E, 0x0052, 0x2BF5, 0x4130, 0x120A, 0x120B, 0x1208, 0x4C0A, -0x407C, 0x0082, 0x1292, 0x1354, 0x403C, 0x4030, 0x1292, 0x1358, 0x4038, -0x1360, 0x12B0, 0xCFCE, 0x4A0C, 0x1292, 0x1358, 0x12B0, 0xCFCE, 0x12B0, -0xCFCE, 0x435C, 0x12A8, 0x4030, 0xD428, 0x1292, 0x275A, 0x407C, 0x0086, -0x12A9, 0x430C, 0x12A8, 0xB23C, 0x280C, 0x403C, 0x0014, 0x12A8, 0x430C, -0x12A8, 0x4C07, 0x430C, 0x12A8, 0x4781, 0x0004, 0x4C81, 0x0006, 0x5314, -0x6305, 0x90B1, 0xBABE, 0x0004, 0x4130, 0x8221, 0x4381, 0x0002, 0x4381, -0x0000, 0x410D, 0x410C, 0x532C, 0x1292, 0x274C, 0x411C, 0x0002, 0x421F, -0x1112, 0x129F, 0x0008, 0x412C, 0x421F, 0x1112, 0x129F, 0x0008, 0x430C, -0x5221, 0x4130, 0x12B0, 0xCE4C, 0x40B2, 0xB242, 0x14A6, 0x4030, 0xCE5A, -0x40B2, 0xC670, 0x14A2, 0x40B2, 0xC8C0, 0x14A4, 0x4130, 0x40B2, 0xCC80, -0x14A8, 0x40B2, 0xBDB2, 0x14AA, 0x4292, 0x1190, 0x14AC, 0x4130, 0x1202, -0xC232, 0x4303, 0x4C82, 0x0130, 0x4E82, 0x0138, 0x4C82, 0x0134, 0x421C, -0x013A, 0x4292, 0x013C, 0x013A, 0x4F82, 0x0138, 0x4D82, 0x0134, 0x4E82, -0x0138, 0x421D, 0x013A, 0x1300, 0x444C, 0x12A8, 0x435C, 0x12A7, 0x4B4C, -0x12A8, 0x403C, 0x00FE, 0x12A6, 0x434C, 0x12A7, 0x444C, 0x12A8, 0x435C, -0x12A7, 0x434C, 0x12A7, 0x435C, 0x12A7, 0x430C, 0x4620, 0xD3D2, 0x0031, -0xC3D2, 0x0031, 0x403C, 0x0005, 0x1292, 0x2758, 0xD3D2, 0x0031, 0xC3D2, -0x0031, 0x403C, 0x0005, 0x1292, 0x2758, 0xD3D2, 0x0031, 0x430C, 0x4130, -0x120A, 0x8321, 0x433A, 0x43C1, 0x0000, 0x410C, 0x421F, 0x1112, 0x129F, -0x0014, 0x933C, 0x2404, 0x416C, 0x1292, 0x1368, 0x430A, 0x4A0C, 0x5321, -0x413A, 0x4130, 0x907B, 0x0010, 0x2807, 0x4D0C, 0x4E0D, 0x4F0E, 0x430F, -0x807B, 0x0010, 0x3FF6, 0x934B, 0x2407, 0xC312, 0x100F, 0x100E, 0x100D, -0x100C, 0x835B, 0x23F9, 0x4130, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x490C, -0x4820, 0x12B0, 0xCF3E, 0x435C, 0x4620, 0x434C, 0x12A6, 0x4B4C, 0x12AA, -0x403C, 0x2C01, 0x12A8, 0x435C, 0x4030, 0xCF40, 0x407C, 0x00F4, 0x12B0, -0x7674, 0x403C, 0x000A, 0x1292, 0x275A, 0x403E, 0x4020, 0x430F, 0x403C, -0x0010, 0x12B0, 0x839C, 0x403C, 0x000A, 0x4210, 0x275A, 0xD0F2, 0x0040, -0x0029, 0x421F, 0x1504, 0xC2DF, 0x150C, 0x0000, 0x431C, 0x1292, 0x275A, -0x421F, 0x1504, 0xD3DF, 0x0000, 0xC0F2, 0x0020, 0x0029, 0x4130, 0x407C, -0x0082, 0x12A6, 0x403C, 0x3FFF, 0x12A9, 0x434C, 0x12A8, 0x407C, 0x00C8, -0x12A6, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x434C, 0x4820, 0x12B0, -0xD48E, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x403C, -0x2409, 0x12A8, 0x435C, 0x12A6, 0x434C, 0x4620, 0x474C, 0x12B0, 0xD8F6, -0x12B0, 0xD8F4, 0x403C, 0x00FC, 0x12A8, 0x434C, 0x12A6, 0x474C, 0x12B0, -0xD8F6, 0x430C, 0x4820, 0x482F, 0x4F10, 0x0008, 0x5C0C, 0x5C0C, 0x12AA, -0x12B0, 0xD9C4, 0x430D, 0x482F, 0x129F, 0x000A, 0x12B0, 0xD9C4, 0x3FF1, -0xF37C, 0xF37E, 0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, 0x9F0E, -0x2801, 0x8F0E, 0x6C0C, 0x2BF9, 0x4130, 0x12B0, 0xD05C, 0x407C, 0x0082, -0x12A9, 0x435C, 0x4620, 0x1292, 0x1358, 0x434C, 0x12A6, 0x407C, 0x0042, -0x3FF6, 0x12B0, 0xD078, 0x407C, 0x0082, 0x12AB, 0x435C, 0x4A20, 0x1292, -0x1358, 0x434C, 0x12AA, 0x407C, 0x0042, 0x3FF6, 0xF37C, 0xF37E, 0x1202, -0xC232, 0x4303, 0x4C82, 0x0130, 0x4E82, 0x0138, 0x421C, 0x013A, 0x421D, -0x013C, 0x1300, 0x12A9, 0x434C, 0x12AA, 0x484C, 0x12AB, 0x403C, 0x0501, -0x12A9, 0x435C, 0x12AA, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x464C, 0x12AB, -0x435C, 0x12A8, 0x474C, 0x12AB, 0x435C, 0x4130, 0x12AB, 0x407C, 0x0034, -0x12A4, 0x3FF7, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, -0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x4130, 0x12A8, 0x407C, 0x00C8, -0x12A9, 0x403C, 0x1401, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x12B0, 0xD756, -0x4B20, 0x12B0, 0xD172, 0x450C, 0x12A9, 0x435C, 0x12A7, 0x484C, 0x12AB, -0x403C, 0x3401, 0x12A9, 0x464C, 0x4B20, 0x407C, 0x0094, 0x1292, 0x1354, -0x434C, 0x1292, 0x1356, 0x421F, 0x1112, 0x129F, 0x0004, 0x430C, 0x4130, -0x12B0, 0x81EE, 0x12AA, 0x12B0, 0xD84E, 0x12B0, 0x81FE, 0x403C, 0x2409, -0x12B0, 0x814E, 0x434C, 0x4A20, 0x8321, 0x410C, 0x421F, 0x1112, 0x129F, -0x0016, 0x412C, 0x1292, 0x274A, 0x430C, 0x5321, 0x4130, 0x12B0, 0xD594, -0x464C, 0x12AB, 0x403C, 0x3FFD, 0x12B0, 0xD594, 0x434C, 0x12A7, 0x484C, -0x4B20, 0xC312, 0x100D, 0x100C, 0xC312, 0x100D, 0x100C, 0x108C, 0x108D, -0xED4C, 0xED0C, 0xF37D, 0x4130, 0x120A, 0x4C0A, 0x3C03, 0x4DFA, 0x0000, -0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, 0x4130, 0x4C0F, 0x930F, -0x2408, 0x421E, 0x1378, 0x930E, 0x2402, 0x533E, 0x3FFC, 0x533F, 0x3FF6, -0x4130, 0x482F, 0x4F10, 0x0008, 0x12AB, 0x12B0, 0xD6E2, 0x482F, 0x129F, -0x000A, 0x12B0, 0xD6E2, 0x3FF4, 0x4C0F, 0x930F, 0x2408, 0x421E, 0x1374, -0x930E, 0x2402, 0x533E, 0x3FFC, 0x533F, 0x3FF6, 0x4130, 0x120A, 0x4C0A, -0x3C03, 0x4DCA, 0x0000, 0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, -0x4130, 0x422C, 0x462F, 0x129F, 0x0008, 0x430C, 0x430D, 0x462F, 0x129F, -0x000A, 0x430C, 0x4130, 0x407C, 0x0082, 0x12A6, 0x435C, 0x4820, 0x12A9, -0x434C, 0x12A8, 0x407C, 0x0042, 0x3FF7, 0x12B0, 0xA178, 0x12B0, 0xA154, -0x484C, 0x12AB, 0x403C, 0x3401, 0x12A9, 0x464C, 0x4B20, 0x403C, 0x0003, -0x1292, 0x1230, 0x410C, 0x503C, 0x002E, 0x462F, 0x4F10, 0x0010, 0x4C0A, -0x4D0B, 0x4E08, 0x4039, 0x1360, 0x4036, 0x1358, 0x4037, 0x1354, 0x4130, -0x434C, 0x12B0, 0xD740, 0x407C, 0x0028, 0x12A7, 0x4C4A, 0x903A, 0x0095, -0x4130, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x0012, 0x4214, 0x1112, -0x4410, 0x000E, 0x12B0, 0xD314, 0x403C, 0x4030, 0x12AB, 0x12B0, 0x80DC, -0x421C, 0x13AA, 0x4130, 0x407C, 0x00C1, 0x12A6, 0x4A0C, 0x430D, 0x1292, -0x135A, 0x407C, 0x00A1, 0x4620, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, -0x0010, 0x4215, 0x1112, 0x4510, 0x000E, 0x12B0, 0xD140, 0x407C, 0x00C1, -0x12B0, 0x817E, 0x12B0, 0x813E, 0x430C, 0x4130, 0x407C, 0x00C1, 0x12AB, -0x403C, 0x0182, 0x430D, 0x1292, 0x135A, 0x435C, 0x4820, 0x12B0, 0x811C, -0x464C, 0x12A8, 0x403C, 0x3401, 0x12AB, 0x494C, 0x4820, 0x434C, 0x12A7, -0x494C, 0x12A8, 0x403C, 0x2401, 0x12A6, 0x435C, 0x4720, 0x403C, 0x0003, -0x1292, 0x118C, 0x4C08, 0x4B0C, 0x4A2F, 0x4F10, 0x0010, 0x4C0F, 0x5D0F, -0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, 0x4130, 0x12A6, 0x403C, -0x2401, 0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x4820, 0x403C, 0x3FFD, -0x12AB, 0x434C, 0x12AA, 0x454C, 0x12A8, 0x435C, 0x4A20, 0x9382, 0x1398, -0x2403, 0x403C, 0x0FF6, 0x4130, 0x403C, 0x018C, 0x4130, 0x12A8, 0x12B0, -0xD756, 0x12AB, 0x403C, 0x3FFD, 0x12A8, 0x434C, 0x4B20, 0x12B0, 0xD9E4, -0x434C, 0x12A6, 0x407C, 0x0042, 0x12A9, 0x430C, 0x4820, 0x407C, 0x00C1, -0x12AA, 0x411C, 0x0004, 0x12A8, 0x407C, 0x00A1, 0x4A20, 0x434C, 0x12A9, -0x474C, 0x12AA, 0x403C, 0x2401, 0x12AB, 0x435C, 0x4920, 0x430F, 0x430E, -0x422D, 0x410C, 0x503C, 0x000C, 0x4B27, 0x4710, 0x000E, 0x12A9, 0x434C, -0x12A7, 0x444C, 0x12AB, 0x435C, 0x12A7, 0x464C, 0x4B20, 0x403C, 0x0003, -0x1292, 0x11E0, 0x4C0A, 0x480C, 0x4B2F, 0x4F10, 0x0010, 0x4C0D, 0x411C, -0x0002, 0x12B0, 0x9E8C, 0x4C0A, 0x4D0B, 0x9305, 0x4130, 0x4135, 0x4134, -0x4137, 0x4136, 0x4139, 0x4138, 0x413B, 0x413A, 0x4130, 0x407C, 0x0021, -0x12A9, 0x430C, 0x430D, 0x1292, 0x135A, 0x435C, 0x4130, 0x430F, 0x430E, -0x422D, 0x410C, 0x503C, 0x000C, 0x4A28, 0x4810, 0x000E, 0x120C, 0x4EFC, -0x0000, 0x531C, 0x831D, 0x23FB, 0x413C, 0x4130, 0x12B0, 0xD196, 0x4C0A, -0xF03A, 0x0F00, 0x503A, 0x0080, 0x4130, 0x435C, 0x12B0, 0xD47C, 0x4A4C, -0x421F, 0x1112, 0x4F10, 0x0004, 0x4B4C, 0x12AA, 0x403C, 0x3401, 0x12A8, -0x407C, 0x0082, 0x4A20, 0x120C, 0x438C, 0x0000, 0x532C, 0x831E, 0x23FB, -0x413C, 0x4130, 0x403C, 0x113E, 0x421F, 0x1112, 0x129F, 0x0016, 0x430C, -0x4130, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x4130, -0x934C, 0x2403, 0xD3E2, 0x0031, 0x4130, 0xC3E2, 0x0031, 0x4130, 0x434C, -0x12A6, 0x4B4C, 0x12AA, 0x12B0, 0xD9FC, 0x435C, 0x4620, 0x12A8, 0x434C, -0x12AB, 0x407C, 0x0042, 0x12A9, 0x435C, 0x4B20, 0x403C, 0x0003, 0x1292, -0x122C, 0x470C, 0x4A2F, 0x4F10, 0x0010, 0x430D, 0x1292, 0x135A, 0x435C, -0x12AA, 0x407C, 0x00A1, 0x4B20, 0x12A8, 0x434C, 0x12AB, 0x407C, 0x0042, -0x12A9, 0x435C, 0x4B20, 0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, 0x2401, -0x4620, 0x12B0, 0xD7A4, 0x435C, 0x12A8, 0x407C, 0x0082, 0x4920, 0x423D, -0x12B0, 0xD454, 0x410F, 0x503F, 0x002C, 0x4130, 0x4A0C, 0x4B0D, 0x12B0, -0xD196, 0xF03C, 0x0F00, 0x4130, 0x490C, 0x1292, 0x1244, 0x460C, 0x4B2F, -0x4F10, 0x0010, 0x430F, 0x431E, 0x4A0D, 0x480C, 0x4B27, 0x4710, 0x000E, -0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x0012, 0x4130, 0x423D, 0x12B0, -0xD454, 0x410F, 0x503F, 0x0034, 0x4130, 0x12A9, 0x434C, 0x12A7, 0x444C, -0x12AB, 0x435C, 0x4720, 0x403C, 0x3FFD, 0x12AB, 0x434C, 0x12AA, 0x444C, -0x4820, 0x12A9, 0x434C, 0x12A7, 0x444C, 0x12AB, 0x435C, 0x4720, 0x4038, -0x1360, 0x4039, 0x1358, 0x4036, 0x1354, 0x4130, 0x12A8, 0x12B0, 0xC172, -0x4C0F, 0xDD0F, 0x930F, 0x4130, 0x423D, 0x12B0, 0xD454, 0x410F, 0x503F, -0x0024, 0x4130, 0x435C, 0x421F, 0x1112, 0x129F, 0x0004, 0x430C, 0x4130, -0x434C, 0x12AA, 0x494C, 0x12AB, 0x403C, 0x2401, 0x4820, 0x12A9, 0x4A4C, -0x12A8, 0x434C, 0x12AB, 0x435C, 0x4B20, 0x12A8, 0x4C07, 0x454C, 0x12AA, -0x403C, 0x0088, 0x4820, 0x434C, 0x12A9, 0x407C, 0x0042, 0x12AA, 0x435C, -0x4920, 0x12B0, 0xDA1C, 0x435C, 0x12AB, 0x434C, 0x4B20, 0x474C, 0x12A8, -0x430C, 0x430D, 0x4210, 0x135A, 0x407C, 0x0048, 0x12A8, 0x427C, 0x4210, -0x1356, 0x407C, 0x00B0, 0x12A8, 0x432C, 0x430D, 0x4920, 0x407C, 0x00C8, -0x12A8, 0x403C, 0x0501, 0x4B20, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x4130, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x435C, 0x4820, 0x407C, 0x00F4, -0x12A7, 0x403C, 0x4020, 0x4620, 0x403C, 0x0080, 0x12A8, 0x403C, 0x0880, -0x4820, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0034, 0x4420, 0x440C, 0x440D, -0xE33D, 0x5D0D, 0x7D0D, 0x4720, 0x1292, 0x2754, 0x1292, 0x134E, 0x4210, -0x1350, 0x12B0, 0xCF3E, 0x454C, 0x12AA, 0x435C, 0x4620, 0x934E, 0x2403, -0x5C0C, 0x835E, 0x23FD, 0x4130, 0x12B0, 0xD5A6, 0x435C, 0x12AA, 0x464C, -0x4820, 0x440C, 0x430D, 0x12AB, 0x430C, 0x430D, 0x4B20, 0x403C, 0x0080, -0x12A8, 0x403C, 0x0880, 0x4820, 0x128F, 0x430C, 0x430D, 0x462F, 0x4F10, -0x000A, 0x421F, 0x1112, 0x129F, 0x0016, 0x930C, 0x4130, 0x12B0, 0xCA50, -0x2802, 0x430C, 0x430D, 0x4130, 0x12A8, 0x434C, 0x12A6, 0x407C, 0x0042, -0x4A20, 0x403C, 0x0500, 0x12A9, 0x407C, 0x00C1, 0x4B20, 0x490C, 0x12A8, -0x407C, 0x0028, 0x4A20, 0x1284, 0x1292, 0x134E, 0x4210, 0x1350, 0xD03A, -0x0040, 0x4A0C, 0x430D, 0x4B20, 0x12AB, 0x434C, 0x12AB, 0x435C, 0x4130, -0x5392, 0x14A0, 0xC392, 0x0160, 0x1300, 0x462F, 0x129F, 0x0016, 0x930C, -0x4130, 0x12B0, 0xD4E4, 0x407C, 0x0082, 0x4920, 0x4A2F, 0x129F, 0x0016, -0x930C, 0x4130, 0x407C, 0x0028, 0x12A8, 0x430C, 0x4920, 0x474C, 0x12AB, -0x403C, 0x2401, 0x4820, 0x474C, 0x12AB, 0x403C, 0x3400, 0x4820, 0x434C, -0x12A8, 0x407C, 0x0042, 0x4920, 0x434C, 0x12A7, 0x407C, 0x00C8, 0x4920, -0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x12AA, 0x434C, 0x12A8, 0x435C, -0x4820, 0x430D, 0x12A9, 0x430C, 0x430D, 0x4920, 0x407C, 0x0028, 0x12AA, -0x430C, 0x4820, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x4620, 0x430D, 0x12A9, -0x431C, 0x430D, 0x4920, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x4920, 0x12A6, -0x434C, 0x12A8, 0x435C, 0x4820, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x4620, -0x434C, 0x12A9, 0x407C, 0x00C8, 0x4A20, 0x434C, 0x12AB, 0x407C, 0x00C8, -0x4920, 0x12A8, 0x435C, 0x12AB, 0x434C, 0x4B20, 0x464C, 0x12A8, 0x403C, -0x0401, 0x4920, 0x12B0, 0xCFCE, 0x407C, 0x00C8, 0x4130, 0x4036, 0x1358, -0x403C, 0x3401, 0x4620, 0x494C, 0x12A8, 0x403C, 0x3FFF, 0x4B20, 0x4C05, -0x460C, 0x4B2F, 0x4F10, 0x0010, 0x12A9, 0x434C, 0x12AB, 0x464C, 0x4820, -0x403C, 0x0C04, 0x430D, 0x4210, 0x14A6, 0x407C, 0x0042, 0x12A8, 0x435C, -0x4920, 0x407C, 0x0090, 0x12A6, 0x432C, 0x4720, 0x4C05, 0x440C, 0x482F, -0x4F10, 0x0010, 0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x454C, 0x12AA, -0x403C, 0x0082, 0x4820, 0x431C, 0x1292, 0x275A, 0x430C, 0x4B20, 0x403C, -0x0080, 0x462F, 0x4F10, 0x0008, 0x12B0, 0xD8D4, 0x930C, 0x4130, 0x12B0, -0x4802, 0x430C, 0x4130, 0x43D2, 0x1140, 0x430C, 0x4130, 0x421F, 0x1112, -0x4F10, 0x0016, 0x12A9, 0x407C, 0x0082, 0x4820, 0x12B0, 0xD8D4, 0x933C, -0x4130, 0x12B0, 0x8F12, 0x435C, 0x4A20, 0x494C, 0x12AA, 0x435C, 0x4620, -0x12B0, 0xA156, 0x434C, 0x4720, 0x421F, 0x1112, 0x4F10, 0x0008, 0x12B0, -0xD91C, 0x430C, 0x4820, 0x434C, 0x12A9, 0x435C, 0x4920, 0x434C, 0x12A6, -0x435C, 0x4620, 0x12B0, 0xD944, 0x933C, 0x4130, 0x1292, 0x2748, 0x430C, -0x4130, 0x4A4C, 0x12A8, 0x435C, 0x4B20, 0x435C, 0x12A6, 0x434C, 0x4620, -0x421F, 0x1112, 0x4F10, 0x0016, 0x12B0, 0xD944, 0x930C, 0x4130, 0x407C, -0x0086, 0x4210, 0x1354, 0x12B0, 0xD7FE, 0x434C, 0x4820, 0x12AA, 0x407C, -0x0082, 0x4920, 0x434C, 0x12A9, 0x435C, 0x4920, 0x12B0, 0xD7C2, 0x434C, -0x4820, 0x421F, 0x1112, 0x4F10, 0x0014, 0x12B0, 0xD620, 0x484C, 0x4A20, -0x434C, 0x12A9, 0x474C, 0x4A20, 0x1292, 0x2756, 0x430C, 0x4130, 0x435C, -0x12A9, 0x434C, 0x4920, 0x421F, 0x1112, 0x4F10, 0x0014, 0x434C, 0x12A6, -0x435C, 0x4620, 0x435C, 0x12A6, 0x434C, 0x4620, 0x12AB, 0x407C, 0x00C8, -0x4920, 0x4B0C, 0x12AA, 0x430C, 0x4A20, 0x12B0, 0xCFEE, 0x435C, 0x4620, -0x435C, 0x12A6, 0x434C, 0x4620, 0x434C, 0x1286, 0x4210, 0x134E, 0x430D, -0x12A5, 0x435C, 0x4620, 0x454C, 0x12AA, 0x430C, 0x4820, 0x434C, 0x12A9, -0x435C, 0x4920, 0x407C, 0x0024, 0x4210, 0x1356, 0x430C, 0x4210, 0x1358, -0x12A6, 0x434C, 0x4920, 0x4CC2, 0x007C, 0x4130, 0x12A7, 0x430C, 0x4720, -0x12A9, 0x434C, 0x4B20, 0x4B2F, 0x4F10, 0x0016, 0x12AB, 0x430C, 0x4B20, -0x431C, 0x4130, 0x4030, 0xD1A2, 0x430C, 0x4130, 0x5137, -}; - -const uint32_t halImage_address[] = -{ -0x0000250A, 0x0000251E, 0x0000253A, 0x00002748, 0x0000DFFE, -}; -const uint32_t halImage_length_of_sections[] = -{ -0x00000002, 0x00000001, 0x000000A5, 0x00005979, 0x00000001, -}; -const uint32_t halImage_sections = 0x00000005; -const uint32_t halImage_termination = 0x00000000; -const uint32_t halImage_start = 0x0000250A; -const uint32_t halImage_finish = 0x0000E000; -const uint32_t halImage_length = 0x0000BAF6; - -#define HALIMAGE_TERMINATION 0x00000000 -#define HALIMAGE_START 0x0000250A -#define HALIMAGE_FINISH 0x0000E000 -#define HALIMAGE_LENGTH 0x0000BAF6 -#define HALIMAGE_SECTIONS 0x00000005 +/* http://srecord.sourceforge.net/ */ +const uint16_t UifHalImage[] = +{ +0x50E0, 0x285E, 0x4D3C, 0x8B00, 0x0001, 0x0000, 0x0000, 0x0000, 0x0108, +0x0402, 0x0030, 0x0031, 0x0032, 0x2040, 0x0029, 0x002A, 0x0401, 0x2040, +0x1008, 0x001D, 0x001E, 0x1711, 0x1711, 0x1B16, 0x1711, 0x8000, 0xC040, +0xA020, 0xE060, 0x9010, 0xD050, 0xB030, 0xF070, 0x8808, 0xC848, 0xA828, +0xE868, 0x9818, 0xD858, 0xB838, 0xF878, 0x8404, 0xC444, 0xA424, 0xE464, +0x9414, 0xD454, 0xB434, 0xF474, 0x8C0C, 0xCC4C, 0xAC2C, 0xEC6C, 0x9C1C, +0xDC5C, 0xBC3C, 0xFC7C, 0x8202, 0xC242, 0xA222, 0xE262, 0x9212, 0xD252, +0xB232, 0xF272, 0x8A0A, 0xCA4A, 0xAA2A, 0xEA6A, 0x9A1A, 0xDA5A, 0xBA3A, +0xFA7A, 0x8606, 0xC646, 0xA626, 0xE666, 0x9616, 0xD656, 0xB636, 0xF676, +0x8E0E, 0xCE4E, 0xAE2E, 0xEE6E, 0x9E1E, 0xDE5E, 0xBE3E, 0xFE7E, 0x8101, +0xC141, 0xA121, 0xE161, 0x9111, 0xD151, 0xB131, 0xF171, 0x8909, 0xC949, +0xA929, 0xE969, 0x9919, 0xD959, 0xB939, 0xF979, 0x8505, 0xC545, 0xA525, +0xE565, 0x9515, 0xD555, 0xB535, 0xF575, 0x8D0D, 0xCD4D, 0xAD2D, 0xED6D, +0x9D1D, 0xDD5D, 0xBD3D, 0xFD7D, 0x8303, 0xC343, 0xA323, 0xE363, 0x9313, +0xD353, 0xB333, 0xF373, 0x8B0B, 0xCB4B, 0xAB2B, 0xEB6B, 0x9B1B, 0xDB5B, +0xBB3B, 0xFB7B, 0x8707, 0xC747, 0xA727, 0xE767, 0x9717, 0xD757, 0xB737, +0xF777, 0x8F0F, 0xCF4F, 0xAF2F, 0xEF6F, 0x9F1F, 0xDF5F, 0xBF3F, 0xFF7F, +0xCACA, 0xCACA, 0x0000, 0x54D8, 0x0001, 0x5446, 0x0002, 0x5346, 0x0003, +0x4FC2, 0x0004, 0x509A, 0x0005, 0x5548, 0x0006, 0x4EDA, 0x0007, 0x3802, +0x0008, 0x559C, 0x0009, 0x55B0, 0x000A, 0x54A4, 0x000B, 0x3D0E, 0x000C, +0x549C, 0x000D, 0x5480, 0x000E, 0x5478, 0x000F, 0x55E0, 0x0010, 0x4050, +0x0011, 0x55D8, 0x0012, 0x55D4, 0x0013, 0x55D0, 0x0014, 0x55C8, 0x0015, +0x55AC, 0x0016, 0x55A8, 0x0017, 0x55A4, 0x0018, 0x5598, 0x0019, 0x5590, +0x001A, 0x558C, 0x001B, 0x5588, 0x001C, 0x5580, 0x001D, 0x557C, 0x001E, +0x5578, 0x001F, 0x5574, 0x0020, 0x5564, 0x0021, 0x5558, 0x0022, 0x5550, +0x0023, 0x554C, 0x0024, 0x5544, 0x0025, 0x5540, 0x0026, 0x550C, 0x0027, +0x5508, 0x0028, 0x54F8, 0x0029, 0x54EC, 0x002A, 0x54D4, 0x002B, 0x54D0, +0x002C, 0x54CC, 0x002D, 0x54C8, 0x002E, 0x54C4, 0x002F, 0x54C0, 0x0030, +0x54BC, 0x0031, 0x54B8, 0x0032, 0x54B4, 0x0033, 0x54B0, 0x0034, 0x54AC, +0x0035, 0x54A8, 0x0036, 0x54A0, 0x0037, 0x5498, 0x0038, 0x5494, 0x0039, +0x5490, 0x003A, 0x548C, 0x003B, 0x5488, 0x003C, 0x547C, 0x003D, 0x5474, +0x003E, 0x5470, 0x003F, 0x546C, 0x0040, 0x5468, 0x0041, 0x5464, 0x0042, +0x5524, 0x0043, 0x55DC, 0x0044, 0x55C4, 0x0045, 0x55BC, 0x0046, 0x55B8, +0x0047, 0x55B4, 0x0048, 0x5584, 0x0049, 0x3332, 0x004A, 0x5570, 0x004B, +0x556C, 0x004C, 0x5568, 0x004D, 0x5554, 0x004E, 0x5510, 0x004F, 0x5504, +0x0050, 0x5500, 0x0051, 0x55C0, 0x0052, 0x54E0, 0x0053, 0x54E4, 0x0054, +0x55CC, 0x0055, 0x5594, 0x0056, 0x54E8, 0x0057, 0x54FC, 0x0058, 0x54F4, +0x0059, 0x55A0, 0x005A, 0x5560, 0x005B, 0x52A2, 0x005C, 0x41C4, 0x005D, +0x28AE, 0x005E, 0x410C, 0x005F, 0x3F90, 0x0060, 0x4B16, 0x0061, 0x4DE8, +0x0062, 0x369C, 0x0063, 0x43CA, 0x0064, 0x4890, 0x0065, 0x3C16, 0x0066, +0x4E3A, 0x0067, 0x5484, 0x0068, 0x4CDA, 0x0069, 0x555C, 0x006A, 0x54F0, +0x006B, 0x54DC, 0x006C, 0x5460, 0x006D, 0x553C, 0x5122, 0x4D94, 0x55F2, +0x500C, 0x3ACA, 0x55EE, 0x5436, 0x542E, 0x53AC, 0x51CE, 0x446A, 0x55EC, +0x51B6, 0x5198, 0x541A, 0x55EA, 0x55E8, 0x55F0, 0x53DE, 0x53F6, 0x53EA, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF01, 0x1204, +0x1205, 0x1206, 0x1207, 0x1208, 0x1209, 0x120A, 0x120B, 0x120C, 0x120D, +0x120E, 0x120F, 0x403C, 0x14FC, 0x403D, 0x00F4, 0x12B0, 0x538A, 0x403C, +0x1306, 0x403D, 0x2668, 0x403E, 0x01F5, 0x12B0, 0x55E4, 0x413F, 0x413E, +0x413D, 0x413C, 0x413B, 0x413A, 0x4139, 0x4138, 0x4137, 0x4136, 0x4135, +0x4134, 0x4030, 0x4D3C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8031, +0x0012, 0xB31C, 0x2885, 0x4382, 0x14FE, 0x4382, 0x1500, 0x4382, 0x1502, +0x4382, 0x1504, 0x403B, 0x1558, 0x403C, 0x14FE, 0x4B2F, 0x129F, 0x0016, +0x933C, 0x241C, 0x403C, 0x1506, 0x4B2F, 0x129F, 0x0016, 0x933C, 0x2415, +0x403C, 0x1508, 0x4B2F, 0x129F, 0x0016, 0x933C, 0x240E, 0x403C, 0x150A, +0x4B2F, 0x129F, 0x0018, 0x933C, 0x2407, 0x403C, 0x150E, 0x4B2F, 0x129F, +0x0018, 0x933C, 0x2003, 0x433C, 0x4030, 0x2E06, 0x421F, 0x150E, 0xD21F, +0x1510, 0x930F, 0x2003, 0x430C, 0x4030, 0x2E06, 0x42D2, 0x1502, 0x1505, +0x42D2, 0x1501, 0x1504, 0x42D2, 0x1500, 0x1503, 0x42D2, 0x14FF, 0x1502, +0x42D2, 0x14FE, 0x1501, 0x43C2, 0x1500, 0x4382, 0x14FE, 0x421C, 0x150E, +0x421D, 0x1510, 0x425E, 0x1508, 0x12B0, 0x5282, 0x4C82, 0x150E, 0x4D82, +0x1510, 0x12B0, 0x427A, 0x421E, 0x150E, 0x421F, 0x1510, 0x831E, 0x730F, +0xDF0E, 0x930E, 0x2403, 0x403E, 0x0010, 0x3C01, 0x430E, 0x421B, 0x14FE, +0xF03B, 0x0003, 0x5B0B, 0x5B0B, 0xDB1E, 0x1538, 0x4B1F, 0x153A, 0xD21E, +0x1508, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430F, 0x410E, 0x530E, 0x430C, +0x430D, 0x1292, 0x1590, 0x430F, 0x403E, 0x150A, 0x422C, 0x430D, 0x1292, +0x1590, 0x9382, 0x1506, 0x20BA, 0x407C, 0x0091, 0x421F, 0x1558, 0x129F, +0x0012, 0x421F, 0x1558, 0x129F, 0x0002, 0x410D, 0x503D, 0x0006, 0x410C, +0x523C, 0x421F, 0x1558, 0x129F, 0x001A, 0x421F, 0x150E, 0xD21F, 0x1510, +0x930F, 0x25F5, 0x9381, 0x0006, 0x25F0, 0x421F, 0x1508, 0x830F, 0x2403, +0x831F, 0x2407, 0x3C0D, 0x411F, 0x0008, 0x4F6E, 0x4E81, 0x0000, 0x3C04, +0x411F, 0x0008, 0x4FA1, 0x0000, 0x4381, 0x0002, 0x3C07, 0x411F, 0x0008, +0x4FA1, 0x0000, 0x4F91, 0x0002, 0x0002, 0x412C, 0x411D, 0x0002, 0x425E, +0x150A, 0xF07E, 0x0003, 0x5E4E, 0x5E4E, 0x5E4E, 0x12B0, 0x52F6, 0x4C81, +0x0000, 0x4D81, 0x0002, 0x4C08, 0x4D09, 0x430A, 0x5808, 0x6909, 0x6A0A, +0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x4076, 0x0028, 0xD038, +0x0006, 0x4881, 0x000A, 0x4981, 0x000C, 0x4A81, 0x000E, 0x4381, 0x0010, +0x410C, 0x503C, 0x000A, 0x1292, 0x157E, 0xF07C, 0x0007, 0x936C, 0x2402, +0x5376, 0x23ED, 0x431C, 0x425E, 0x1508, 0x12B0, 0x5402, 0x411F, 0x0008, +0x5C0F, 0x4F81, 0x0008, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, 0x5C82, 0x150A, +0x6D82, 0x150C, 0x9C81, 0x0006, 0x2806, 0x411F, 0x0006, 0x8C0F, 0x4F81, +0x0006, 0x3C02, 0x4381, 0x0006, 0x53B2, 0x150E, 0x63B2, 0x1510, 0x421F, +0x150E, 0xD21F, 0x1510, 0x930F, 0x257D, 0xB0B2, 0x0FFF, 0x150A, 0x2384, +0x4218, 0x150A, 0x4219, 0x150C, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, +0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x4076, 0x0028, 0xD328, 0x4881, +0x000A, 0x4981, 0x000C, 0x4A81, 0x000E, 0x4381, 0x0010, 0x410C, 0x503C, +0x000A, 0x1292, 0x157E, 0xF07C, 0x0007, 0x936C, 0x275C, 0x5376, 0x275A, +0x3FEC, 0x4381, 0x0000, 0x4381, 0x0002, 0x407A, 0x0028, 0x40B1, 0x0007, +0x000A, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0010, 0x410C, 0x503C, +0x000A, 0x1292, 0x157E, 0xB31C, 0x2870, 0x537A, 0x23EE, 0x3C6D, 0x421F, +0x1558, 0x129F, 0x000A, 0x421F, 0x150E, 0xD21F, 0x1510, 0x930F, 0x2474, +0x431C, 0x425E, 0x1508, 0x12B0, 0x5402, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, +0x5C82, 0x150A, 0x6D82, 0x150C, 0xB0B2, 0x0FFF, 0x150A, 0x2063, 0x12B0, +0x427A, 0x407C, 0x000B, 0x1292, 0x1574, 0x4218, 0x150A, 0x4219, 0x150C, +0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, +0x6A0A, 0x4076, 0x0028, 0x480C, 0xD32C, 0x4C81, 0x000A, 0x4981, 0x000C, +0x4A81, 0x000E, 0x4381, 0x0010, 0x410C, 0x503C, 0x000A, 0x1292, 0x157E, +0xF07C, 0x0007, 0x936C, 0x2402, 0x5376, 0x23EB, 0x4128, 0x4119, 0x0002, +0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, +0x6A0A, 0x40F1, 0x0028, 0x0004, 0xD038, 0x0007, 0x4881, 0x000A, 0x4981, +0x000C, 0x4A81, 0x000E, 0x4381, 0x0010, 0x410C, 0x503C, 0x000A, 0x1292, +0x157E, 0xB31C, 0x2806, 0x4156, 0x0004, 0x5376, 0x46C1, 0x0004, 0x23EB, +0xC312, 0x100F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, +0x110F, 0x100E, 0x100D, 0x100C, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x53B2, +0x150E, 0x63B2, 0x1510, 0x421F, 0x150E, 0xD21F, 0x1510, 0x930F, 0x2454, +0x4128, 0x4119, 0x0002, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, +0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x40F1, 0x0028, 0x0004, 0xD038, 0x0007, +0x4881, 0x000A, 0x4981, 0x000C, 0x4A81, 0x000E, 0x4381, 0x0010, 0x410C, +0x503C, 0x000A, 0x1292, 0x157E, 0xB31C, 0x2806, 0x4156, 0x0004, 0x5376, +0x46C1, 0x0004, 0x23EB, 0xC312, 0x100F, 0x100E, 0x100D, 0x100C, 0x110F, +0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x425E, 0x150A, +0xF07E, 0x0003, 0x5E4E, 0x5E4E, 0x5E4E, 0x12B0, 0x5282, 0x4C81, 0x0000, +0x4D81, 0x0002, 0x421F, 0x1508, 0x830F, 0x2405, 0x831F, 0x2408, 0x831F, +0x272F, 0x3F32, 0x421F, 0x1558, 0x129F, 0x0004, 0x3F2D, 0x421F, 0x1558, +0x129F, 0x0008, 0x3F28, 0x407C, 0x000A, 0x1292, 0x1574, 0x4128, 0x4119, +0x0002, 0x430A, 0x5808, 0x6909, 0x6A0A, 0x5808, 0x6909, 0x6A0A, 0x5808, +0x6909, 0x6A0A, 0x4076, 0x0028, 0xD038, 0x0007, 0x4881, 0x000A, 0x4981, +0x000C, 0x4A81, 0x000E, 0x4381, 0x0010, 0x410C, 0x503C, 0x000A, 0x1292, +0x157E, 0xB31C, 0x2802, 0x5376, 0x23EF, 0xC312, 0x100F, 0x100E, 0x100D, +0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, +0x425E, 0x150A, 0xF07E, 0x0003, 0x5E4E, 0x5E4E, 0x5E4E, 0x12B0, 0x5282, +0x4C81, 0x0000, 0x4D81, 0x0002, 0x421F, 0x1508, 0x830F, 0x2405, 0x831F, +0x2408, 0x831F, 0x240B, 0x3C0E, 0x421F, 0x1558, 0x129F, 0x0004, 0x3C09, +0x421F, 0x1558, 0x129F, 0x0008, 0x3C04, 0x421F, 0x1558, 0x129F, 0x000A, +0x421F, 0x150E, 0xD21F, 0x1510, 0x930F, 0x2402, 0x431C, 0x3C0D, 0x4381, +0x0000, 0x4381, 0x0002, 0x431E, 0x410D, 0x530D, 0x407C, 0x000C, 0x1292, +0x158E, 0x12B0, 0x427A, 0x5031, 0x0012, 0x4030, 0x537E, 0x421F, 0x15C0, +0xD2DF, 0x15BB, 0x0000, 0x4130, 0x120D, 0x120C, 0x8031, 0x000C, 0x4381, +0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0008, +0x4381, 0x000A, 0x415F, 0x000F, 0x4FD1, 0x2568, 0x0004, 0x4D4F, 0x4FD1, +0x2568, 0x0005, 0x415F, 0x000D, 0x4FD1, 0x2568, 0x0006, 0x4C4F, 0x4FD1, +0x2568, 0x0007, 0x40B2, 0x0006, 0x01EE, 0x40B2, 0x15DC, 0x01EA, 0xD0B2, +0x0010, 0x01E8, 0xD392, 0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, +0x0078, 0x41D2, 0x0007, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x403F, 0x007E, +0x4FE1, 0x0003, 0x41D2, 0x0006, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, +0x0002, 0x41D2, 0x0005, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0001, +0xC0F2, 0x0010, 0x0078, 0x41D2, 0x0004, 0x007F, 0xB3D2, 0x0079, 0x2BFD, +0x4F6E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, 0x421F, 0x15C0, +0xD2DF, 0x15BB, 0x0000, 0xC2DF, 0x15BA, 0x0000, 0xB31C, 0x2804, 0xD2DF, +0x15BC, 0x0000, 0x3C03, 0xC2DF, 0x15BC, 0x0000, 0xD2DF, 0x15BA, 0x0000, +0x421F, 0x15BE, 0xB2DF, 0x15BD, 0x0000, 0x2002, 0x434E, 0x3C01, 0x435E, +0xD16E, 0x4EC1, 0x0000, 0x42A2, 0x01F6, 0x40B2, 0x15E2, 0x01F2, 0xD0B2, +0x0010, 0x01F0, 0xD392, 0x01F0, 0x4E4F, 0x4FD1, 0x2568, 0x000B, 0x415F, +0x0001, 0x4FD1, 0x2568, 0x000A, 0x415F, 0x0002, 0x4FD1, 0x2568, 0x0009, +0x415F, 0x0003, 0x4FD1, 0x2568, 0x0008, 0x411C, 0x0008, 0x411D, 0x000A, +0x5031, 0x0010, 0x4130, 0x430C, 0x4130, 0x434C, 0x4130, 0x120A, 0x120B, +0x1208, 0x8031, 0x0018, 0x4381, 0x0010, 0x4381, 0x0012, 0x4381, 0x0014, +0x4381, 0x0016, 0x4381, 0x0008, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, +0x000E, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, +0x4C5F, 0x0003, 0x4FD1, 0x2568, 0x000B, 0x4C5F, 0x0002, 0x4FD1, 0x2568, +0x000A, 0x4C5F, 0x0001, 0x4FD1, 0x2568, 0x0009, 0x4C6F, 0x4FD1, 0x2568, +0x0008, 0x40B2, 0x0006, 0x01EE, 0x40B2, 0x15DC, 0x01EA, 0xD0B2, 0x0010, +0x01E8, 0xD392, 0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, +0x41D2, 0x0008, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x403F, 0x007E, 0x4FE1, +0x0010, 0x41D2, 0x0009, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0011, +0x41D2, 0x000A, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0012, 0x41D2, +0x000B, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0013, 0xF0F2, 0x00F1, +0x0033, 0x425E, 0x15BA, 0x4E4F, 0xE37F, 0x421D, 0x15C0, 0xFFCD, 0x0000, +0xB3DC, 0x0004, 0x2804, 0xD2DD, 0x15BC, 0x0000, 0x3C03, 0xC2DD, 0x15BC, +0x0000, 0xDECD, 0x0000, 0x425A, 0x15BD, 0x421B, 0x15BE, 0xBACB, 0x0000, +0x2002, 0x4348, 0x3C01, 0x4358, 0x48C1, 0x0004, 0xFFCD, 0x0000, 0xB3EC, +0x0004, 0x2804, 0xD2DD, 0x15BC, 0x0000, 0x3C03, 0xC2DD, 0x15BC, 0x0000, +0xDECD, 0x0000, 0xBACB, 0x0000, 0x2002, 0x4348, 0x3C01, 0x4358, 0x5848, +0xD8C1, 0x0004, 0xFFCD, 0x0000, 0xD2DD, 0x15BB, 0x0000, 0xB2EC, 0x0004, +0x2804, 0xD2DD, 0x15BC, 0x0000, 0x3C03, 0xC2DD, 0x15BC, 0x0000, 0xDECD, +0x0000, 0xBACB, 0x0000, 0x2002, 0x434E, 0x3C01, 0x435E, 0x5E4E, 0x5E4E, +0xDEC1, 0x0004, 0x42A2, 0x01F6, 0x40B2, 0x15E2, 0x01F2, 0xD0B2, 0x0010, +0x01F0, 0xD392, 0x01F0, 0x415F, 0x0010, 0x4FD1, 0x2568, 0x0000, 0x415F, +0x0011, 0x4FD1, 0x2568, 0x0001, 0x415F, 0x0012, 0x4FD1, 0x2568, 0x0002, +0x415F, 0x0013, 0x4FD1, 0x2568, 0x0003, 0x410F, 0x530F, 0x4F3C, 0x4F3D, +0x4F3E, 0x4F3F, 0x5031, 0x0018, 0x4030, 0x5382, 0x8321, 0x4C4D, 0x434F, +0x43C1, 0x0000, 0x42B2, 0x01EE, 0x40B2, 0x15D4, 0x01EA, 0xD0B2, 0x0010, +0x01E8, 0xD392, 0x01E8, 0x40B2, 0x0003, 0x01EE, 0x43A2, 0x01F6, 0x40B2, +0x15E6, 0x01EA, 0x40B2, 0x15EA, 0x01F2, 0x43C1, 0x0000, 0x3C16, 0xD0B2, +0x0010, 0x01F0, 0xD392, 0x01F0, 0x421E, 0x15BE, 0xB2DE, 0x15BD, 0x0000, +0x2002, 0x434C, 0x3C01, 0x435C, 0x416E, 0x12B0, 0x5402, 0xDC4F, 0x416E, +0x535E, 0x4EC1, 0x0000, 0x90F1, 0x0003, 0x0000, 0x2C0C, 0x431C, 0x416E, +0x12B0, 0x5402, 0xBC4D, 0x27E0, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, +0x3FDF, 0xB27D, 0x421E, 0x15C0, 0x2804, 0xD2DE, 0x15BC, 0x0000, 0x3C03, +0xC2DE, 0x15BC, 0x0000, 0x421E, 0x15C0, 0xD2DE, 0x15BB, 0x0000, 0xC2DE, +0x15BA, 0x0000, 0xD2DE, 0x15BA, 0x0000, 0x421E, 0x15BE, 0xB2DE, 0x15BD, +0x0000, 0x2002, 0x434C, 0x3C01, 0x435C, 0x416E, 0x42A2, 0x01F6, 0x40B2, +0x15E2, 0x01F2, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x12B0, 0x5402, +0xDF4C, 0x5321, 0x4130, 0x421F, 0x15C0, 0xC2DF, 0x15BB, 0x0000, 0x4130, +0x421F, 0x15C0, 0xD2DF, 0x15BC, 0x0000, 0xD2DF, 0x15BB, 0x0000, 0x425E, +0x15BA, 0xDECF, 0x0000, 0x4E4D, 0xE37D, 0xFDCF, 0x0000, 0xDECF, 0x0000, +0xFDCF, 0x0000, 0xDECF, 0x0000, 0xFDCF, 0x0000, 0xDECF, 0x0000, 0xFDCF, +0x0000, 0xDECF, 0x0000, 0xFDCF, 0x0000, 0xDECF, 0x0000, 0xFDCF, 0x0000, +0xDECF, 0x0000, 0xC2DF, 0x15BB, 0x0000, 0xFDCF, 0x0000, 0xDECF, 0x0000, +0x430C, 0x4130, 0x120A, 0x120B, 0x1208, 0x930C, 0x2420, 0x403F, 0x15C0, +0x403E, 0x15BA, 0x533C, 0x3C03, 0x533C, 0x930A, 0x2002, 0x4D7B, 0x423A, +0xB35B, 0x4F28, 0x2804, 0xD2D8, 0x15BB, 0x0000, 0x3C03, 0xC2D8, 0x15BB, +0x0000, 0x4F28, 0xCEE8, 0x0000, 0x4303, 0x4F28, 0xDEE8, 0x0000, 0x110B, +0x533A, 0x930C, 0x23E6, 0x4030, 0x5382, 0x403C, 0x15BA, 0x410E, 0x532E, +0x403D, 0x000D, 0x12B0, 0x539C, 0x425D, 0x15BA, 0x425E, 0x15BB, 0x4E4F, +0xDD0F, 0x108F, 0xDF0E, 0x4E82, 0x15D4, 0x4E82, 0x15D6, 0x4D0F, 0x108F, +0x4F82, 0x15D8, 0x4F82, 0x15DA, 0x4E82, 0x15DC, 0x4F82, 0x15DE, 0x4F82, +0x15E0, 0x4E82, 0x15E2, 0x4F82, 0x15E4, 0x425E, 0x15BC, 0x4E0C, 0x108C, +0x4C82, 0x15E6, 0xDD0E, 0x4E0D, 0x108D, 0xDD0E, 0x4E82, 0x15E8, 0x4F82, +0x15EA, 0x4130, 0x421F, 0x15C0, 0xD2DF, 0x15BC, 0x0000, 0x4130, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x001E, +0x4381, 0x001A, 0x4381, 0x001C, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, +0x0014, 0x4381, 0x0016, 0x40B1, 0x0010, 0x0008, 0x4381, 0x000A, 0x4381, +0x0004, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0012, +0x410C, 0x503C, 0x001A, 0x421F, 0x1558, 0x129F, 0x0018, 0x930C, 0x3403, +0x403C, 0xFFC6, 0x3D80, 0x410C, 0x530C, 0x421F, 0x1558, 0x129F, 0x0018, +0x930C, 0x3809, 0x410C, 0x503C, 0x0014, 0x421F, 0x1558, 0x129F, 0x0018, +0x930C, 0x3403, 0x403C, 0xFFC4, 0x3D6C, 0x410C, 0x523C, 0x421F, 0x1558, +0x129F, 0x0018, 0x4C81, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFC3, 0x3D5F, +0x4124, 0x4115, 0x0002, 0x4116, 0x0014, 0x4117, 0x0016, 0x92A1, 0x001A, +0x2032, 0x9381, 0x001C, 0x202F, 0x42B1, 0x0008, 0x4381, 0x000A, 0x43C1, +0x0006, 0x440C, 0x450D, 0x460E, 0x470F, 0x415B, 0x0006, 0x12B0, 0x5236, +0xF31C, 0x410B, 0x503B, 0x000C, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x5808, +0x6909, 0x6A0A, 0x6B0B, 0xDC08, 0x4881, 0x000C, 0x4981, 0x000E, 0x4A81, +0x0010, 0x4B81, 0x0012, 0x415E, 0x0006, 0x535E, 0x4EC1, 0x0006, 0x927E, +0x2BDC, 0x415C, 0x000C, 0x1292, 0x1572, 0x3C47, 0x4481, 0x000C, 0x4581, +0x000E, 0x4681, 0x0010, 0x4781, 0x0012, 0x411E, 0x001A, 0x411F, 0x001C, +0x930F, 0x210D, 0x903E, 0x0014, 0x2D0A, 0x5E0E, 0x4E10, 0x3476, 0x349E, +0x34AA, 0x34AA, 0x34C0, 0x3444, 0x34E2, 0x3576, 0x358C, 0x359E, 0x35CC, +0x3602, 0x3614, 0x34B2, 0x34A4, 0x34D6, 0x3624, 0x3636, 0x364A, 0x34BA, +0x35C4, 0x1292, 0x156E, 0x3CF3, 0x1292, 0x1570, 0x3CF0, 0x444C, 0x1292, +0x14CE, 0x3CEC, 0x431C, 0x1292, 0x14E4, 0x3CE8, 0x1292, 0x14F6, 0x3CE5, +0x1292, 0x14D0, 0x412F, 0xD11F, 0x0002, 0x930F, 0x24DE, 0x430C, 0x1292, +0x14C4, 0x3CDA, 0x444C, 0x1292, 0x1574, 0x4C4C, 0x430D, 0x3C92, 0x411E, +0x0008, 0x411F, 0x000A, 0x830F, 0x2041, 0x823E, 0x240E, 0x823E, 0x2416, +0x822E, 0x2419, 0x803E, 0x000C, 0x241F, 0x803E, 0x0003, 0x242F, 0x803E, +0x001D, 0x241E, 0x3C31, 0x444C, 0x1292, 0x1576, 0x4C48, 0x4309, 0x430A, +0x430B, 0x480C, 0x490D, 0x3C4A, 0x440C, 0x1292, 0x1578, 0x4C08, 0x3FF5, +0x440C, 0x450D, 0xF03D, 0x000F, 0x1292, 0x157A, 0x4C08, 0x4D09, 0x3FED, +0x440C, 0x450D, 0x1292, 0x157C, 0x3FF8, 0x410F, 0x503F, 0x000C, 0x4F3C, +0x4F3D, 0x4F3E, 0x4F3F, 0x1292, 0x1580, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, +0x3FDC, 0x410C, 0x503C, 0x000C, 0x1292, 0x157E, 0x3FF5, 0x403C, 0xFFC2, +0x3C8F, 0x407C, 0x0054, 0x1292, 0x1572, 0x411C, 0x000C, 0x411D, 0x000E, +0x1292, 0x157C, 0x3C7F, 0x407C, 0x00F4, 0x1292, 0x1572, 0x411C, 0x000C, +0x1292, 0x1578, 0x3C76, 0x407C, 0x0046, 0x1292, 0x1572, 0x430C, 0x430D, +0x430E, 0x430F, 0x1292, 0x1580, 0x4E0A, 0x4F0B, 0x421F, 0x1558, 0x129F, +0x000A, 0x4A0C, 0x4B0D, 0x3C5B, 0x444C, 0x1292, 0x1586, 0x3C5F, 0x90B1, +0x0010, 0x0008, 0x2007, 0x9381, 0x000A, 0x2004, 0x440C, 0x12B0, 0x4806, +0x3C0B, 0x90B1, 0x0020, 0x0008, 0x2009, 0x9381, 0x000A, 0x2006, 0x450D, +0x440C, 0x12B0, 0x4324, 0x935C, 0x2047, 0x403C, 0xFFCF, 0x3C49, 0x12B0, +0x5160, 0x421F, 0x1558, 0x129F, 0x000A, 0x430C, 0x430D, 0x3C33, 0x440C, +0x1292, 0x14CA, 0x403C, 0x156E, 0x12B0, 0x1880, 0x3C33, 0x411E, 0x0008, +0x410D, 0x503D, 0x0014, 0x444C, 0x1292, 0x158E, 0x3C16, 0x411F, 0x0008, +0x410E, 0x503E, 0x0014, 0x440C, 0x450D, 0x1292, 0x1590, 0x3C0C, 0x1211, +0x000A, 0x410D, 0x503D, 0x0016, 0x440E, 0x450F, 0x411C, 0x000C, 0x1292, +0x1592, 0x5321, 0x931C, 0x3403, 0x403F, 0xFFBA, 0x3C01, 0x430F, 0x4F81, +0x0004, 0x411C, 0x0014, 0x411D, 0x0016, 0x421F, 0x1558, 0x129F, 0x000A, +0x3C03, 0x40B1, 0xFFC5, 0x0004, 0x9381, 0x0018, 0x266E, 0x411C, 0x0004, +0x5031, 0x001E, 0x4030, 0x5378, 0x120A, 0x120B, 0x1208, 0x1209, 0x8031, +0x0006, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4039, 0x0028, +0x410C, 0x522C, 0x421F, 0x1558, 0x129F, 0x0016, 0x43A1, 0x0000, 0x4381, +0x0002, 0x4038, 0x1592, 0x1203, 0x410D, 0x532D, 0x421E, 0x154C, 0x421F, +0x154E, 0x430C, 0x12A8, 0x5321, 0x933C, 0x248B, 0x93C2, 0x1550, 0x341E, +0x403A, 0x0014, 0xB3A2, 0x1550, 0x4A0E, 0x430F, 0x2807, 0x410C, 0x530C, +0x12B0, 0x4B90, 0xD391, 0x0000, 0x3C06, 0x410C, 0x530C, 0x12B0, 0x4B90, +0xC391, 0x0000, 0x4A0E, 0x430F, 0x412C, 0x411D, 0x0002, 0x12B0, 0x4A1A, +0xC0B2, 0x0080, 0x1550, 0x40B1, 0x000B, 0x0000, 0x40B1, 0xA05F, 0x0002, +0x403A, 0xEDF0, 0x403B, 0xE000, 0x1203, 0x410D, 0x532D, 0x4A0E, 0x4B0F, +0x430C, 0x12A8, 0x5321, 0x933C, 0x2456, 0xC3A1, 0x0000, 0xD2A1, 0x0000, +0x1203, 0x410D, 0x532D, 0x4A0E, 0x4B0F, 0x430C, 0x12A8, 0x5321, 0x933C, +0x2448, 0x1213, 0x410D, 0x532D, 0x4A0E, 0x4B0F, 0x430C, 0x12A8, 0x5321, +0x933C, 0x243E, 0xB3A1, 0x0002, 0x2C02, 0x5339, 0x23F1, 0x40B1, 0x0003, +0x0000, 0x40B1, 0xA05F, 0x0002, 0x1203, 0x410D, 0x532D, 0x4A0E, 0x4B0F, +0x430C, 0x12A8, 0x5321, 0x933C, 0x2429, 0x40B1, 0x0003, 0x0000, 0x4381, +0x0002, 0x1203, 0x410D, 0x532D, 0x421E, 0x154C, 0x421F, 0x154E, 0x430C, +0x12A8, 0x5321, 0x933C, 0x2418, 0x421F, 0x1554, 0xD21F, 0x1556, 0x930F, +0x240E, 0x12B0, 0x4914, 0x930C, 0x200E, 0x9381, 0x0004, 0x2402, 0x1292, +0x14D0, 0x430C, 0x5031, 0x0006, 0x4030, 0x5380, 0x12B0, 0x4998, 0x930C, +0x27F2, 0x433C, 0x3FF6, 0x8031, 0x000C, 0x410C, 0x523C, 0x421F, 0x1558, +0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFCB, 0x3C2F, 0x410C, 0x530C, +0x421F, 0x1558, 0x129F, 0x0018, 0x930C, 0x3864, 0x411E, 0x0008, 0x411F, +0x000A, 0x930F, 0x2095, 0x903E, 0x0018, 0x2C92, 0x5E0E, 0x4E10, 0x3844, +0x3962, 0x3874, 0x3880, 0x3878, 0x3894, 0x38AC, 0x38B8, 0x38C4, 0x38D0, +0x38D6, 0x3888, 0x38DC, 0x3906, 0x3962, 0x390C, 0x3918, 0x38A0, 0x38CA, +0x3912, 0x391E, 0x392A, 0x3936, 0x394A, 0x3956, 0x41A2, 0x1536, 0x430C, +0x5031, 0x000C, 0x4130, 0x412C, 0x1292, 0x14CC, 0x3FF8, 0x41A2, 0x1512, +0x4192, 0x0002, 0x1514, 0x3FF2, 0x41A2, 0x151A, 0x4192, 0x0002, 0x151C, +0x3FEC, 0x41A2, 0x151E, 0x4192, 0x0002, 0x1520, 0x3FE6, 0x41A2, 0x1522, +0x4192, 0x0002, 0x1524, 0x3FE0, 0x41A2, 0x1526, 0x4192, 0x0002, 0x1528, +0x3FDA, 0x41A2, 0x152A, 0x3FD7, 0x41A2, 0x152C, 0x3FD4, 0x41A2, 0x152E, +0x3FD1, 0x41A2, 0x1530, 0x3FCE, 0x4381, 0x0004, 0x4381, 0x0006, 0x410C, +0x522C, 0x421F, 0x1558, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFCA, +0x3FC0, 0x411D, 0x0004, 0x412C, 0x1292, 0x14DE, 0x3FB9, 0x41A2, 0x1516, +0x3FB6, 0x41A2, 0x1532, 0x3FB3, 0x41A2, 0x1534, 0x3FB0, 0x41A2, 0x1518, +0x3FAD, 0x41A2, 0x1548, 0x4192, 0x0002, 0x154A, 0x3FA7, 0x41A2, 0x154C, +0x4192, 0x0002, 0x154E, 0x3FA1, 0x412E, 0x411F, 0x0002, 0xD03E, 0x0080, +0x4E82, 0x1550, 0x4F82, 0x1552, 0x3F97, 0x41A2, 0x1554, 0x4192, 0x0002, +0x1556, 0x3F91, 0x41A2, 0x1306, 0x4192, 0x0002, 0x1308, 0x3F8B, 0x403C, +0xFFC9, 0x3F89, 0xE03F, 0x8000, 0x1206, 0x4D06, 0x5606, 0x9036, 0xFF01, +0x2CA7, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0E, 0x4D06, 0x5606, 0x9036, +0xFF00, 0x200B, 0x4F06, 0x5606, 0x9036, 0xFF00, 0x2098, 0x4D06, 0xEF06, +0x5606, 0x2894, 0x433D, 0x3C92, 0x4F06, 0x5606, 0x9036, 0xFF00, 0x2407, +0xB03F, 0x7FFF, 0x2007, 0x4D06, 0x5606, 0x2087, 0x2886, 0x4E0C, 0x4F0D, +0x3C83, 0xB03D, 0x7FFF, 0x27FA, 0x1209, 0x1208, 0x1207, 0x4D06, 0x4F07, +0x5606, 0x5707, 0x9607, 0x2809, 0x2002, 0x9C0E, 0x2806, 0xED0F, 0xEF0D, +0xED0F, 0xEC0E, 0xEE0C, 0xEC0E, 0x4F06, 0x5606, 0x6909, 0x1086, 0xD07F, +0x0080, 0x4D08, 0x5808, 0x6909, 0x1088, 0xF378, 0xD07D, 0x0080, 0x4307, +0x8846, 0x2415, 0x9076, 0xFFF1, 0x2C0D, 0x9076, 0xFFE8, 0x2846, 0x4E07, +0x4F0E, 0x430F, 0x5076, 0x0010, 0x2409, 0x9347, 0x2402, 0xD037, 0x0100, +0x110F, 0x100E, 0x1007, 0x5356, 0x23FB, 0x4906, 0x1106, 0xE906, 0xB316, +0x242F, 0xE337, 0x5317, 0x7E0C, 0x7F4D, 0x2010, 0x930C, 0x2007, 0x9307, +0x2438, 0x1087, 0x474D, 0x8038, 0x0018, 0x3C06, 0x108C, 0x4C4D, 0xED0C, +0x1087, 0xD70C, 0x8238, 0x4307, 0x5707, 0x6C0C, 0x6D4D, 0x2C09, 0x8318, +0x5707, 0x6C0C, 0x6D4D, 0x2C04, 0x8318, 0x5C0C, 0x6D4D, 0x2BFC, 0x9318, +0x3411, 0x430D, 0x3C05, 0x5358, 0x9378, 0x200C, 0x403D, 0xFF00, 0x430C, +0x1009, 0x100D, 0x3C12, 0x5E0C, 0x6F4D, 0x2FF4, 0x5707, 0x6C0C, 0x6D4D, +0x1088, 0xD80D, 0x1009, 0x100D, 0x100C, 0x2806, 0x9307, 0x2002, 0xB31C, +0x2402, 0x531C, 0x630D, 0x4137, 0x4138, 0x4139, 0x4136, 0x4130, 0x120A, +0x120B, 0x4C0A, 0x430B, 0x903C, 0x0007, 0x2448, 0x923C, 0x2446, 0x433B, +0x40B2, 0x5528, 0x156E, 0x40B2, 0x552C, 0x1570, 0x40B2, 0x5530, 0x1572, +0x40B2, 0x5534, 0x1576, 0x40B2, 0x5538, 0x1578, 0x40B2, 0x5444, 0x157A, +0x40B2, 0x543E, 0x157C, 0x40B2, 0x52F4, 0x1580, 0x40B2, 0x52EA, 0x1582, +0x40B2, 0x52DC, 0x157E, 0x40B2, 0x52DA, 0x1584, 0x40B2, 0x52E8, 0x1586, +0x40B2, 0x52DE, 0x158C, 0x40B2, 0x52E6, 0x1588, 0x40B2, 0x52E2, 0x158A, +0x403F, 0x5514, 0x403E, 0x551C, 0x403D, 0x5518, 0x403A, 0x5520, 0x403C, +0x5454, 0x4C82, 0x1594, 0x4A82, 0x1592, 0x4D82, 0x1590, 0x4E82, 0x158E, +0x4F82, 0x1574, 0x4B0C, 0x413B, 0x413A, 0x4130, 0x4C82, 0x156A, 0x403C, +0x1598, 0x403E, 0x2546, 0x403D, 0x000D, 0x12B0, 0x539C, 0x403F, 0x001A, +0x121F, 0x1596, 0x832F, 0x23FC, 0x12B0, 0x32C0, 0x4292, 0x159E, 0x01EC, +0x4292, 0x159E, 0x01F4, 0x5031, 0x001A, 0x903A, 0x0007, 0x2402, 0x923A, +0x239C, 0x40B2, 0x552C, 0x1570, 0x40B2, 0x5530, 0x1572, 0x40B2, 0x5444, +0x157A, 0x40B2, 0x52DE, 0x158C, 0x40B2, 0x52E8, 0x1586, 0x40B2, 0x52EA, +0x1582, 0x40B2, 0x52E6, 0x1588, 0x40B2, 0x52E2, 0x158A, 0x40B2, 0x3214, +0x156E, 0x40B2, 0x2F60, 0x1576, 0x40B2, 0x2F5C, 0x1578, 0x40B2, 0x2E1A, +0x157C, 0x40B2, 0x5424, 0x1580, 0x40B2, 0x2F64, 0x157E, 0x40B2, 0x52DA, +0x1584, 0x403F, 0x3124, 0x403E, 0x4642, 0x403D, 0x3DF2, 0x403A, 0x4A9A, +0x403C, 0x5360, 0x3F9B, 0x120A, 0x120B, 0x1208, 0x1209, 0x8221, 0x4038, +0x0028, 0x43A1, 0x0000, 0x4381, 0x0002, 0x4039, 0x1592, 0x1203, 0x410D, +0x532D, 0x421E, 0x154C, 0x421F, 0x154E, 0x430C, 0x12A9, 0x5321, 0x933C, +0x245D, 0x40B1, 0x0003, 0x0000, 0x40B1, 0xA05F, 0x0002, 0xB392, 0x1550, +0x2806, 0x40B1, 0x000B, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x403A, 0xEDF0, +0x403B, 0xE000, 0x1203, 0x410D, 0x532D, 0x4A0E, 0x4B0F, 0x430C, 0x12A9, +0x5321, 0x933C, 0x2440, 0xC3A1, 0x0000, 0xD2A1, 0x0000, 0x1203, 0x410D, +0x532D, 0x4A0E, 0x4B0F, 0x430C, 0x12A9, 0x5321, 0x933C, 0x2432, 0x1213, +0x410D, 0x532D, 0x4A0E, 0x4B0F, 0x430C, 0x12A9, 0x5321, 0x933C, 0x2428, +0xB3A1, 0x0002, 0x2C02, 0x5338, 0x23F1, 0x40B1, 0x0003, 0x0000, 0x40B1, +0xA05F, 0x0002, 0x1203, 0x410D, 0x532D, 0x4A0E, 0x4B0F, 0x430C, 0x12A9, +0x5321, 0x933C, 0x2413, 0x40B1, 0x0003, 0x0000, 0x4381, 0x0002, 0x1203, +0x410D, 0x532D, 0x421E, 0x154C, 0x421F, 0x154E, 0x430C, 0x12A9, 0x5321, +0x933C, 0x2402, 0x9308, 0x2002, 0x433C, 0x3C01, 0x430C, 0x5221, 0x4030, +0x5380, 0x120A, 0x8231, 0x403A, 0x1558, 0x410C, 0x522C, 0x4A2F, 0x129F, +0x0014, 0x930C, 0x340F, 0x403C, 0xFFC8, 0x3C61, 0x434C, 0x1292, 0x14EA, +0x415E, 0x0004, 0x537E, 0x4EC1, 0x0004, 0x411C, 0x0006, 0x1292, 0x14D4, +0x93C1, 0x0004, 0x2451, 0x410C, 0x532C, 0x4A2F, 0x129F, 0x0016, 0x930C, +0x380F, 0x410C, 0x530C, 0x4A2F, 0x129F, 0x0016, 0x930C, 0x3808, 0x410C, +0x503C, 0x0006, 0x4A2F, 0x129F, 0x0016, 0x930C, 0x3403, 0x403C, 0xFFC7, +0x3C39, 0xB0B1, 0x0040, 0x0000, 0x2809, 0xB0B1, 0x0040, 0x0002, 0x2802, +0x435C, 0x3C01, 0x434C, 0x1292, 0x14DA, 0xB0B1, 0x0100, 0x0000, 0x2809, +0xB0B1, 0x0100, 0x0002, 0x2802, 0x435C, 0x3C01, 0x434C, 0x1292, 0x14DC, +0xB391, 0x0000, 0x2808, 0xB391, 0x0002, 0x2802, 0x435C, 0x3C01, 0x434C, +0x1292, 0x14E6, 0xB2B1, 0x0000, 0x2808, 0xB2B1, 0x0002, 0x2802, 0x435C, +0x3C01, 0x434C, 0x1292, 0x14E8, 0xB3A1, 0x0000, 0x2BA8, 0xB3A1, 0x0002, +0x2BA2, 0x435C, 0x3FA1, 0x430C, 0x5231, 0x413A, 0x4130, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x8031, 0x000C, 0x4C0A, 0x4D0B, 0x4E06, 0x4F09, +0x4348, 0x4E2C, 0x4E1D, 0x0002, 0x430E, 0x5C0C, 0x6D0D, 0x6E0E, 0x5C0C, +0x6D0D, 0x6E0E, 0x5C0C, 0x6D0D, 0x6E0E, 0x4C81, 0x0004, 0x4D81, 0x0006, +0x4E81, 0x0008, 0x4381, 0x000A, 0x4A0E, 0x4B0F, 0xF03E, 0x00F0, 0xF03F, +0xFF00, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430E, 0x410D, 0x530D, 0x427C, +0x1292, 0x158E, 0x932C, 0x2029, 0xC312, 0x104A, 0xF03A, 0x0006, 0x490E, +0xF31E, 0x5E0A, 0x410F, 0x522F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0xDA0C, +0x4C81, 0x0004, 0x4D81, 0x0006, 0x4E81, 0x0008, 0x4F81, 0x000A, 0x407C, +0x000B, 0x1292, 0x1574, 0x935C, 0x200D, 0x410C, 0x522C, 0x1292, 0x157E, +0xB31C, 0x2804, 0x5358, 0x9078, 0x0028, 0x2BF6, 0x9078, 0x0028, 0x2002, +0x433C, 0x3C0A, 0x9319, 0x2007, 0x431E, 0x460D, 0x407C, 0x000C, 0x1292, +0x158E, 0x3C01, 0x432C, 0x5031, 0x000C, 0x4030, 0x537E, 0x9382, 0x156C, +0x205C, 0x90B2, 0x0007, 0x156A, 0x2403, 0x92B2, 0x156A, 0x2017, 0x421F, +0x15A0, 0xD2DF, 0x159B, 0x0000, 0x421F, 0x15AE, 0xD2DF, 0x15A9, 0x0000, +0x421F, 0x15A4, 0xD2DF, 0x15A3, 0x0000, 0x431C, 0x1292, 0x14D4, 0x421F, +0x15AE, 0xD2DF, 0x15A8, 0x0000, 0x40B2, 0x5528, 0x156E, 0x40B2, 0x552C, +0x1570, 0x40B2, 0x5530, 0x1572, 0x40B2, 0x5534, 0x1576, 0x40B2, 0x5538, +0x1578, 0x40B2, 0x5444, 0x157A, 0x40B2, 0x543E, 0x157C, 0x40B2, 0x52F4, +0x1580, 0x40B2, 0x52EA, 0x1582, 0x40B2, 0x52DC, 0x157E, 0x40B2, 0x52DA, +0x1584, 0x40B2, 0x52E8, 0x1586, 0x40B2, 0x52DE, 0x158C, 0x40B2, 0x52E6, +0x1588, 0x40B2, 0x52E2, 0x158A, 0x40B2, 0x5514, 0x1574, 0x40B2, 0x551C, +0x158E, 0x40B2, 0x5518, 0x1590, 0x40B2, 0x5520, 0x1592, 0x40B2, 0x5454, +0x1594, 0x4392, 0x156C, 0x403C, 0x0005, 0x4210, 0x14D4, 0x120A, 0x120B, +0x1208, 0x1209, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x430A, 0x430B, +0x4038, 0x4A1A, 0x4039, 0x1558, 0x410C, 0x530C, 0x492F, 0x129F, 0x0018, +0x4A0E, 0x4B0F, 0x412C, 0x411D, 0x0002, 0x1288, 0x930C, 0x243E, 0x531A, +0x630B, 0x2003, 0x903A, 0x0010, 0x2BED, 0x410C, 0x530C, 0x492F, 0x129F, +0x0018, 0x403E, 0x0010, 0x430F, 0x412C, 0x411D, 0x0002, 0x1288, 0x930C, +0x242A, 0x410C, 0x530C, 0x492F, 0x129F, 0x0018, 0x403E, 0x0014, 0x430F, +0x412C, 0x411D, 0x0002, 0x1288, 0x930C, 0x241C, 0x410C, 0x530C, 0x492F, +0x129F, 0x0018, 0x403E, 0x0011, 0x430F, 0x412C, 0x411D, 0x0002, 0x1288, +0x930C, 0x240E, 0x410C, 0x530C, 0x492F, 0x129F, 0x0018, 0x403E, 0x0012, +0x430F, 0x412C, 0x411D, 0x0002, 0x1288, 0x930C, 0x2002, 0x433C, 0x3C01, +0x430C, 0x5221, 0x4030, 0x5380, 0x120A, 0x120B, 0x1208, 0x430B, 0x1292, +0x14D0, 0x3C3B, 0x932B, 0x2403, 0x903B, 0x0005, 0x2002, 0x4318, 0x3C08, +0x931B, 0x2405, 0x922B, 0x2403, 0x903B, 0x0006, 0x2001, 0x4328, 0x480C, +0x1292, 0x14CA, 0x434C, 0x1292, 0x14CE, 0x1292, 0x156E, 0x1292, 0x1570, +0x407C, 0x0028, 0x1292, 0x1572, 0x4C4A, 0x1292, 0x14D0, 0x907A, 0x0089, +0x241A, 0x907A, 0x008D, 0x2417, 0x907A, 0x0091, 0x2414, 0x907A, 0x0095, +0x2411, 0x907A, 0x0098, 0x240E, 0x907A, 0x0099, 0x240B, 0x531B, 0x903B, +0x0007, 0x2C13, 0x930B, 0x2403, 0x903B, 0x0003, 0x23C5, 0x4308, 0x3FD2, +0x4A0C, 0x421F, 0x1558, 0x129F, 0x0008, 0x480C, 0x421F, 0x1558, 0x129F, +0x0008, 0x430C, 0x3C0C, 0x433C, 0x421F, 0x1558, 0x129F, 0x0008, 0x403C, +0xAAAA, 0x421F, 0x1558, 0x129F, 0x0008, 0x433C, 0x4030, 0x5382, 0x120A, +0x120B, 0x1208, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x430A, 0x403B, +0x1558, 0x4038, 0x4B90, 0x4A0E, 0x430F, 0x410C, 0x530C, 0x1288, 0x930C, +0x243C, 0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, 0x531A, 0x903A, +0x0010, 0x2BEF, 0x403E, 0x0010, 0x430F, 0x410C, 0x530C, 0x1288, 0x930C, +0x242A, 0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, 0x403E, 0x0014, +0x430F, 0x410C, 0x530C, 0x1288, 0x930C, 0x241C, 0x412C, 0x411D, 0x0002, +0x4B2F, 0x129F, 0x000A, 0x403E, 0x0011, 0x430F, 0x410C, 0x530C, 0x1288, +0x930C, 0x240E, 0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, 0x403E, +0x0012, 0x430F, 0x410C, 0x530C, 0x1288, 0x930C, 0x2002, 0x433C, 0x3C07, +0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, 0x430C, 0x5221, 0x4030, +0x5382, 0x120A, 0x120B, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x12B0, +0x4C08, 0x930C, 0x2402, 0x433C, 0x3C4A, 0x403A, 0x1590, 0x431F, 0x410E, +0x530E, 0x403C, 0x00FC, 0x430D, 0x12AA, 0x403B, 0x1558, 0x412F, 0xD11F, +0x0002, 0x930F, 0x2433, 0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, +0x431F, 0x410E, 0x530E, 0x403C, 0x00F8, 0x430D, 0x12AA, 0x412C, 0x411D, +0x0002, 0x4B2F, 0x129F, 0x000A, 0x431F, 0x410E, 0x530E, 0x403C, 0x00F4, +0x430D, 0x12AA, 0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, 0x434C, +0x4B2F, 0x129F, 0x0004, 0x431F, 0x410E, 0x530E, 0x430C, 0x430D, 0x12AA, +0x412E, 0x411F, 0x0002, 0xF03E, 0xFFC0, 0x4E82, 0x1538, 0x4F82, 0x153A, +0x412C, 0x411D, 0x0002, 0x4B2F, 0x129F, 0x000A, 0x430C, 0x5221, 0x413B, +0x413A, 0x4130, 0x120A, 0x120B, 0x8231, 0x430A, 0x4381, 0x0000, 0x4381, +0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x403B, 0x158E, 0x431E, 0x410D, +0x530D, 0x426C, 0x12AB, 0x431E, 0x410D, 0x530D, 0x426C, 0x12AB, 0x41A1, +0x0004, 0x4191, 0x0002, 0x0006, 0xB0B1, 0x0010, 0x0000, 0x2803, 0xD0B1, +0x0010, 0x0004, 0xB0B1, 0x0020, 0x0000, 0x2803, 0xD0B1, 0x0020, 0x0004, +0x93C1, 0x0000, 0x3403, 0xD0B1, 0x0080, 0x0004, 0xB3A1, 0x0000, 0x2802, +0xD3A1, 0x0004, 0x411F, 0x0004, 0xD11F, 0x0006, 0x930F, 0x2414, 0x430E, +0x410D, 0x522D, 0x426C, 0x12AB, 0x431E, 0x410D, 0x530D, 0x426C, 0x12AB, +0x431E, 0x410D, 0x530D, 0x426C, 0x12AB, 0xB0F1, 0x00B2, 0x0000, 0x2401, +0x433A, 0x4A0C, 0x5231, 0x413B, 0x413A, 0x4130, 0x120A, 0x8031, 0x000C, +0x40B1, 0x0011, 0x0006, 0x4381, 0x0004, 0x4381, 0x0002, 0x4381, 0x0000, +0x4381, 0x0008, 0x4381, 0x000A, 0x4C81, 0x0004, 0x4D81, 0x0002, 0x407C, +0x0086, 0x1292, 0x1572, 0x403A, 0x1578, 0x430C, 0x12AA, 0x4C81, 0x0000, +0x411E, 0x0008, 0x411F, 0x000A, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x4C81, +0x0008, 0x4D81, 0x000A, 0x930F, 0x2003, 0x903E, 0x0BB8, 0x2802, 0x431C, +0x3C1E, 0xB3A1, 0x0000, 0x2C07, 0x9381, 0x000A, 0x2004, 0x90B1, 0x0BB8, +0x0008, 0x2BDF, 0x9381, 0x000A, 0x2010, 0x90B1, 0x0BB8, 0x0008, 0x2C0C, +0x40B1, 0x0011, 0x0006, 0x411C, 0x0006, 0x12AA, 0x411C, 0x0004, 0x12AA, +0x411C, 0x0002, 0x12AA, 0x430C, 0x5031, 0x000C, 0x413A, 0x4130, 0x120A, +0x120B, 0x8221, 0x430A, 0x4382, 0x14FC, 0x12B0, 0x4C08, 0x930C, 0x2402, +0x433C, 0x3C40, 0x12B0, 0x4C74, 0x930C, 0x2401, 0x433A, 0x407B, 0x0028, +0x40B1, 0x0003, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x1203, 0x410D, 0x532D, +0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x1213, +0x410D, 0x532D, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1292, 0x1592, +0x5321, 0xB3A1, 0x0002, 0x2C03, 0x537B, 0x2403, 0x3FEF, 0x934B, 0x2001, +0x433A, 0x1213, 0x410D, 0x532D, 0x403E, 0xED30, 0x403F, 0xE000, 0x430C, +0x1292, 0x1592, 0x411C, 0x0002, 0x411D, 0x0004, 0x421F, 0x1558, 0x129F, +0x000A, 0x4A0C, 0x5321, 0x5221, 0x413B, 0x413A, 0x4130, 0x120A, 0x120B, +0x1208, 0x430C, 0x12B0, 0x5054, 0x4C0A, 0x431C, 0x12B0, 0x5054, 0x4C0B, +0x403C, 0x0003, 0x12B0, 0x5054, 0x4C08, 0x903A, 0x06A4, 0x3813, 0x421F, +0x15B6, 0x503F, 0xFFF6, 0x9F0A, 0x3806, 0x421F, 0x15B6, 0x503F, 0x000A, +0x9A0F, 0x3402, 0x4A82, 0x15B6, 0x421C, 0x15B6, 0x12B0, 0x450A, 0x3C07, +0x9382, 0x15B2, 0x2422, 0x421C, 0x15B2, 0x12B0, 0x4D94, 0x9382, 0x15B2, +0x241B, 0x93C2, 0x15ED, 0x2418, 0x8B08, 0x9038, 0x0097, 0x3814, 0x5392, +0x15B8, 0x90B2, 0x0191, 0x15B8, 0x2810, 0x43D2, 0x15EE, 0x1292, 0x14D0, +0xC2F2, 0x001D, 0x4382, 0x15B2, 0x435C, 0x421F, 0x1558, 0x129F, 0x0022, +0x3C02, 0x4382, 0x15B8, 0x430C, 0x4030, 0x5382, 0x120A, 0x120B, 0x1208, +0x4C0A, 0x9A82, 0x15B4, 0x242C, 0x4A0C, 0x430D, 0x12B0, 0x4788, 0x403E, +0x41A3, 0x403F, 0xC4D6, 0x12B0, 0x396C, 0x4C0E, 0x4D0F, 0x403C, 0xF000, +0x403D, 0x457F, 0x12B0, 0x3968, 0x12B0, 0x540E, 0x4C08, 0x5038, 0x0055, +0x4A0C, 0x403E, 0x0014, 0x12B0, 0x52C2, 0x8C08, 0x9038, 0x1000, 0x3802, +0x4038, 0x0FFF, 0x9308, 0x3401, 0x4308, 0x4882, 0x01C8, 0xD3A2, 0x01C0, +0x4A82, 0x15B4, 0x3C1A, 0x431C, 0x12B0, 0x5054, 0x4C0B, 0x4A0F, 0x503F, +0x000A, 0x9B0F, 0x2C07, 0x90B2, 0x0FFF, 0x01C8, 0x2C0D, 0x5392, 0x01C8, +0x3C0A, 0x4A0F, 0x503F, 0xFFF6, 0x9F0B, 0x2C05, 0x9382, 0x01C8, 0x2402, +0x53B2, 0x01C8, 0x4030, 0x5382, 0xC3A2, 0x01A0, 0x40B2, 0x22F0, 0x01A0, +0x40B2, 0x0206, 0x01A2, 0x407E, 0x0010, 0x4EC2, 0x0080, 0x407F, 0x0011, +0x4FC2, 0x0081, 0x407D, 0x0012, 0x4DC2, 0x0082, 0x407C, 0x0013, 0x4CC2, +0x0083, 0x4EC2, 0x0084, 0x4FC2, 0x0085, 0x4DC2, 0x0086, 0x4CC2, 0x0087, +0x4EC2, 0x0088, 0x4FC2, 0x0089, 0x4DC2, 0x008A, 0x4CC2, 0x008B, 0x4EC2, +0x008C, 0x4FC2, 0x008D, 0x4DC2, 0x008E, 0x4CC2, 0x008F, 0xD3A2, 0x01A0, +0xD392, 0x01A0, 0x40B2, 0x0FFF, 0x01C8, 0x40B2, 0x03A0, 0x01C0, 0xD3D2, +0x0078, 0x40F2, 0x0017, 0x0078, 0x40F2, 0x0053, 0x0079, 0x43E2, 0x007C, +0x43C2, 0x007D, 0x43C2, 0x007B, 0xC3D2, 0x0078, 0xDEC2, 0x0005, 0x4130, +0x120A, 0x120B, 0x1208, 0x8231, 0x4D0A, 0x434B, 0xC312, 0x104C, 0x4C48, +0xF038, 0x0006, 0xF31E, 0x5E08, 0x4D2C, 0x4A1D, 0x0002, 0x430E, 0x5C0C, +0x6D0D, 0x6E0E, 0x5C0C, 0x6D0D, 0x6E0E, 0x5C0C, 0x6D0D, 0x6E0E, 0xD80C, +0x4C81, 0x0000, 0x4D81, 0x0002, 0x4E81, 0x0004, 0x4381, 0x0006, 0x407C, +0x000A, 0x1292, 0x1574, 0x935C, 0x2020, 0x410C, 0x530C, 0x1292, 0x157E, +0x4C48, 0xF078, 0x0003, 0x9368, 0x2013, 0xC312, 0x100F, 0x100E, 0x100D, +0x100C, 0x110F, 0x100E, 0x100D, 0x100C, 0x110F, 0x100E, 0x100D, 0x100C, +0x4C8A, 0x0000, 0x4D8A, 0x0002, 0x432C, 0x3C05, 0x535B, 0x907B, 0x0028, +0x2BE0, 0x433C, 0x5231, 0x4030, 0x5382, 0x12B0, 0x3ECA, 0x9382, 0x156C, +0x2404, 0x421C, 0x156A, 0x12B0, 0x3ACA, 0x90B2, 0x0007, 0x156A, 0x2403, +0x92B2, 0x156A, 0x2039, 0x425E, 0x1598, 0x525E, 0x1599, 0x525E, 0x159A, +0x421F, 0x159E, 0xDECF, 0x0000, 0x421F, 0x15A0, 0xDECF, 0x0000, 0x421F, +0x15A0, 0xC2DF, 0x159B, 0x0000, 0x421F, 0x15AE, 0x425E, 0x15A9, 0x525E, +0x15A8, 0xDECF, 0x0000, 0x421F, 0x15A4, 0xD2DF, 0x15A2, 0x0000, 0x421F, +0x15A4, 0xC2DF, 0x15A3, 0x0000, 0x12B0, 0x4F28, 0x421F, 0x15A4, 0xD2DF, +0x15A2, 0x0000, 0x403C, 0x0005, 0x12B0, 0x51CE, 0x421F, 0x15AE, 0xC2DF, +0x15A8, 0x0000, 0x403C, 0x0005, 0x12B0, 0x51CE, 0x4382, 0x156C, 0x4130, +0x930D, 0x3408, 0x1208, 0xE33C, 0xE33D, 0x531C, 0x630D, 0x4038, 0x0197, +0x3C03, 0x1208, 0x4038, 0x0097, 0x903D, 0x0100, 0x2C1C, 0x930D, 0x200F, +0x903C, 0x0100, 0x2806, 0x108C, 0x4C4D, 0xC03C, 0x00FF, 0x8238, 0x3C06, +0x930C, 0x240D, 0x4C0D, 0x430C, 0x8038, 0x0010, 0x8318, 0x5C0C, 0x6D4D, +0x2BFC, 0x1108, 0x104D, 0x100C, 0x1088, 0xD80D, 0x4138, 0x4130, 0x1207, +0x4347, 0x903D, 0x0200, 0x2808, 0xC312, 0x100D, 0x100C, 0x1047, 0x5318, +0x903D, 0x0200, 0x2FF8, 0x1108, 0x104D, 0x100C, 0x1088, 0xD80D, 0x6747, +0x2806, 0xC312, 0x1047, 0x2001, 0x2802, 0x531C, 0x630D, 0x4137, 0x4138, +0x4130, 0x8031, 0x000A, 0x4391, 0x0008, 0x4C81, 0x0006, 0x4381, 0x0000, +0x4381, 0x0002, 0x4381, 0x0004, 0x407C, 0x0086, 0x1292, 0x1572, 0x430C, +0x1292, 0x1578, 0x4C81, 0x0000, 0x411E, 0x0002, 0x411F, 0x0004, 0x4E0C, +0x4F0D, 0x531C, 0x630D, 0x4C81, 0x0002, 0x4D81, 0x0004, 0x930F, 0x2003, +0x903E, 0x0BB8, 0x2802, 0x431C, 0x3C1A, 0xB391, 0x0000, 0x2C07, 0x9381, +0x0004, 0x2004, 0x90B1, 0x0BB8, 0x0002, 0x2BDE, 0x9381, 0x0004, 0x200C, +0x90B1, 0x0BB8, 0x0002, 0x2C08, 0x411C, 0x0008, 0x1292, 0x1578, 0x411C, +0x0006, 0x1292, 0x1578, 0x430C, 0x5031, 0x000A, 0x4130, 0x8031, 0x0006, +0x4381, 0x0000, 0x410C, 0x530C, 0x421F, 0x1558, 0x129F, 0x0016, 0x933C, +0x2430, 0x9381, 0x0000, 0x2002, 0x431E, 0x3C01, 0x422E, 0x403F, 0x05FA, +0x4E81, 0x0002, 0x4F81, 0x0004, 0x1203, 0x410D, 0x522D, 0x403E, 0xED0C, +0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2417, 0x1213, +0x410D, 0x522D, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1292, 0x1592, +0x5321, 0x933C, 0x240A, 0x9381, 0x0000, 0x2009, 0x411F, 0x0004, 0xF03F, +0xFF00, 0x903F, 0x0200, 0x2402, 0x433C, 0x3C01, 0x430C, 0x5031, 0x0006, +0x4130, 0x8231, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, +0x0006, 0x431E, 0x410D, 0x530D, 0x426C, 0x1292, 0x158E, 0xC0B1, 0x4000, +0x0002, 0xD0B1, 0x1000, 0x0002, 0x430E, 0x410D, 0x530D, 0x426C, 0x1292, +0x158E, 0x4392, 0x14FC, 0x4391, 0x0004, 0x40B1, 0xA05F, 0x0006, 0x1203, +0x410D, 0x503D, 0x0006, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1292, +0x1592, 0x5321, 0x933C, 0x2002, 0x433C, 0x3C0E, 0xC0B1, 0x1000, 0x0002, +0x430E, 0x410D, 0x530D, 0x426C, 0x1292, 0x158E, 0x403C, 0x00C8, 0x1292, +0x14D4, 0x430C, 0x5231, 0x4130, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, +0x12B0, 0x4C08, 0x930C, 0x2033, 0x1213, 0x410D, 0x532D, 0x403E, 0xED10, +0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2426, 0xB3A1, +0x0000, 0x280F, 0xC3A1, 0x0000, 0x1203, 0x410D, 0x532D, 0x403E, 0xED10, +0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2414, 0x4392, +0x14FC, 0x4391, 0x0000, 0x40B1, 0xA05F, 0x0002, 0x1203, 0x410D, 0x532D, +0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, +0x2002, 0x433C, 0x3C01, 0x430C, 0x5221, 0x4130, 0x120A, 0x120B, 0x1208, +0x120D, 0x120C, 0x8221, 0x4E0A, 0x4F0B, 0x4078, 0x0028, 0x4381, 0x0000, +0x4381, 0x0002, 0x1203, 0x410D, 0x503D, 0x0006, 0x403E, 0xEDF8, 0x403F, +0xE000, 0x430C, 0x1292, 0x1592, 0xD31B, 0x4A81, 0x0006, 0x4B81, 0x0008, +0x1203, 0x410D, 0x523D, 0x403E, 0xEDF4, 0x403F, 0xE000, 0x430C, 0x1292, +0x1592, 0x5221, 0x1213, 0x410D, 0x532D, 0x403E, 0xEDF0, 0x403F, 0xE000, +0x430C, 0x1292, 0x1592, 0x5378, 0x5321, 0x9348, 0x2407, 0xB391, 0x0002, +0x2BEF, 0x431C, 0x5231, 0x4030, 0x5382, 0x430C, 0x3FFB, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8221, 0x4E08, 0x4F09, 0x4D04, +0x4116, 0x0014, 0x4381, 0x0000, 0x4381, 0x0002, 0x4C4B, 0x108B, 0x4037, +0x1590, 0x431F, 0x410E, 0x530E, 0x430C, 0x4B0D, 0x12A7, 0x932C, 0x2016, +0xD3A1, 0x0000, 0x430F, 0x410E, 0x530E, 0x430C, 0x4B0D, 0x12A7, 0x932C, +0x200C, 0x4881, 0x0000, 0x4981, 0x0002, 0x430F, 0x410E, 0x530E, 0x4B0D, +0x422C, 0x12A7, 0x932C, 0x2402, 0x433C, 0x3C06, 0x460F, 0x440E, 0x403C, +0x000C, 0x4B0D, 0x12A7, 0x5221, 0x4030, 0x537A, 0x8221, 0x4391, 0x0000, +0x40B1, 0xA05F, 0x0002, 0x1203, 0x410D, 0x532D, 0x403E, 0xEDF0, 0x403F, +0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2425, 0x40B1, 0x0401, +0x0000, 0x40B1, 0x0100, 0x0002, 0x1203, 0x410D, 0x532D, 0x403E, 0xEDFC, +0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2412, 0x40B1, +0x001F, 0x0000, 0x4381, 0x0002, 0x1203, 0x410D, 0x532D, 0x403E, 0xED30, +0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2002, 0x433C, +0x3C01, 0x430C, 0x5221, 0x4130, 0x120A, 0x120B, 0x120F, 0x120E, 0x8221, +0x4C0A, 0x1203, 0x410D, 0x503D, 0x0006, 0x403E, 0xEDF4, 0x403F, 0xE000, +0x430C, 0x1292, 0x1592, 0x407B, 0x0028, 0x4381, 0x0002, 0x4381, 0x0004, +0x5321, 0x1213, 0x410D, 0x532D, 0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, +0x1292, 0x1592, 0x537B, 0x5321, 0x934B, 0x2403, 0xB391, 0x0002, 0x2BEF, +0x1213, 0x4A0D, 0x403E, 0xEDF8, 0x403F, 0xE000, 0x430C, 0x1292, 0x1592, +0x5321, 0x934B, 0x2002, 0x430C, 0x3C01, 0x431C, 0x5231, 0x413B, 0x413A, +0x4130, 0x120A, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x403A, 0x00C8, +0x431E, 0x410D, 0x530D, 0x426C, 0x1292, 0x158E, 0x412E, 0x411F, 0x0002, +0xD03F, 0x5000, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430E, 0x410D, 0x530D, +0x426C, 0x1292, 0x158E, 0x431E, 0x410D, 0x530D, 0x426C, 0x1292, 0x158E, +0x533A, 0x411F, 0x0002, 0xF03F, 0xA000, 0x903F, 0xA000, 0x2403, 0x930A, +0x2403, 0x3FEF, 0x930A, 0x2002, 0x433C, 0x3C01, 0x430C, 0x5221, 0x413A, +0x4130, 0x120A, 0x8231, 0x40B1, 0x695A, 0x0004, 0x4381, 0x0006, 0x4381, +0x0000, 0x4381, 0x0002, 0x403A, 0x0064, 0x1203, 0x410D, 0x503D, 0x0006, +0x403E, 0x4000, 0x403F, 0xE004, 0x430C, 0x1292, 0x1592, 0x5321, 0x1213, +0x410D, 0x532D, 0x403E, 0x4020, 0x403F, 0xE004, 0x430C, 0x1292, 0x1592, +0x533A, 0x5321, 0xB2B1, 0x0000, 0x2803, 0x533A, 0x2403, 0x3FEE, 0x930A, +0x2002, 0x433C, 0x3C01, 0x430C, 0x5231, 0x413A, 0x4130, 0x120A, 0x430A, +0x1292, 0x14D0, 0x403C, 0x0007, 0x1292, 0x14CA, 0x434C, 0x1292, 0x14CE, +0x1292, 0x156E, 0x1292, 0x1594, 0x903C, 0xFFFE, 0x2002, 0x933D, 0x240C, +0x421F, 0x1558, 0x129F, 0x0008, 0x403C, 0x0007, 0x421F, 0x1558, 0x129F, +0x0008, 0x430C, 0x3C0F, 0x531A, 0x922A, 0x2BE1, 0x433C, 0x421F, 0x1558, +0x129F, 0x0008, 0x403C, 0xAAAA, 0x421F, 0x1558, 0x129F, 0x0008, 0x433C, +0x413A, 0x4130, 0x120A, 0x4C0A, 0x12B0, 0x525E, 0x4392, 0x1566, 0x40B2, +0x07CF, 0x1568, 0x403E, 0x000C, 0x403D, 0x253A, 0x403C, 0x155A, 0x12B0, +0x532C, 0x4A82, 0x1558, 0x12B0, 0x5204, 0x9382, 0x1304, 0x2006, 0x40B2, +0xFFFE, 0x1302, 0x4292, 0x14D6, 0x1304, 0x12B0, 0x5122, 0x40B2, 0x0070, +0x1562, 0x40B2, 0x1146, 0x1564, 0x43D2, 0x1560, 0x403C, 0x155A, 0x413A, +0x4130, 0x4C0F, 0x930C, 0x241D, 0x503C, 0x0032, 0x93C2, 0x14FA, 0x2411, +0xC2F2, 0x0031, 0xC0F2, 0x0020, 0x0029, 0x4F82, 0x15B2, 0x12B0, 0x450A, +0x12B0, 0x544E, 0x431C, 0x12B0, 0x51CE, 0x43C2, 0x14FA, 0x3C0F, 0x4F82, +0x15B2, 0x12B0, 0x450A, 0x12B0, 0x544E, 0x3C08, 0x12B0, 0x545A, 0x1292, +0x14D0, 0x4382, 0x15B2, 0x43D2, 0x14FA, 0x430C, 0x4130, 0x8221, 0x43A1, +0x0000, 0x4381, 0x0002, 0x1203, 0x410D, 0x532D, 0x421E, 0x154C, 0x421F, +0x154E, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2412, 0x4381, 0x0000, +0x40B1, 0xA05F, 0x0002, 0x1203, 0x410D, 0x532D, 0x403E, 0xEDF0, 0x403F, +0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, 0x2002, 0x433C, 0x3C01, +0x430C, 0x5221, 0x4130, 0x120A, 0x8221, 0x433A, 0x4381, 0x0000, 0x4381, +0x0002, 0x421F, 0x1554, 0xD21F, 0x1556, 0x930F, 0x2414, 0x431E, 0x410D, +0x530D, 0x426C, 0x1292, 0x158E, 0xB0B1, 0x2000, 0x0002, 0x280D, 0x12B0, +0x4C08, 0x930C, 0x2004, 0x12B0, 0x4C74, 0x930C, 0x2402, 0x432C, 0x3C04, +0x12B0, 0x4E8A, 0x4C0A, 0x4A0C, 0x5221, 0x413A, 0x4130, 0x8221, 0x4381, +0x0000, 0x4381, 0x0002, 0x9382, 0x14FC, 0x241D, 0x1213, 0x410D, 0x532D, +0x403E, 0xEDF0, 0x403F, 0xE000, 0x430C, 0x1292, 0x1592, 0x5321, 0x933C, +0x2002, 0x433C, 0x3C0F, 0xB3A1, 0x0002, 0x280B, 0x412C, 0x411D, 0x0002, +0x421F, 0x1558, 0x129F, 0x000A, 0x4382, 0x14FC, 0x431C, 0x3C01, 0x432C, +0x5221, 0x4130, 0x9382, 0x152A, 0x240C, 0x407C, 0x00F4, 0x1292, 0x1572, +0x421C, 0x152C, 0x1292, 0x1578, 0x403C, 0x0014, 0x1292, 0x14D4, 0x421F, +0x151A, 0xD21F, 0x151C, 0x930F, 0x240E, 0x407C, 0x0054, 0x1292, 0x1572, +0x421C, 0x151E, 0x421D, 0x1520, 0x1292, 0x157C, 0x403C, 0x0014, 0x1292, +0x14D4, 0x1292, 0x14D0, 0x430C, 0x4130, 0x120A, 0x8231, 0x410A, 0x530A, +0x4A0E, 0x43FE, 0x0000, 0x43FE, 0x0001, 0x532E, 0x4A0F, 0x523F, 0x9F0E, +0x23F7, 0x4A0D, 0x403C, 0x0033, 0x12B0, 0x3272, 0x40F1, 0x003C, 0x0000, +0x40F1, 0x00E7, 0x0001, 0x4A0D, 0x403C, 0x0010, 0x12B0, 0x3272, 0x43F1, +0x0000, 0x4A0D, 0x423C, 0x12B0, 0x3272, 0x5231, 0x413A, 0x4130, 0x1206, +0x1207, 0x4D06, 0xD07D, 0x0080, 0x6606, 0x6707, 0x1086, 0xF376, 0x8076, +0x007F, 0x2C03, 0x430C, 0x430D, 0x3C13, 0x8076, 0x0018, 0x2C07, 0xE376, +0x240E, 0x110D, 0x100C, 0x8356, 0x23FC, 0x3C09, 0x9236, 0x3803, 0x433C, +0x433D, 0x3C04, 0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x4137, 0x4136, +0x4130, 0x8231, 0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0000, 0x4381, +0x0002, 0x410D, 0x530D, 0x410C, 0x522C, 0x1292, 0x14C8, 0x411C, 0x0004, +0x411D, 0x0006, 0x12B0, 0x540E, 0x421F, 0x1558, 0x129F, 0x0008, 0x412C, +0x411D, 0x0002, 0x12B0, 0x540E, 0x421F, 0x1558, 0x129F, 0x0008, 0x430C, +0x5231, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0xB2F2, 0x001D, 0x280B, +0x431C, 0x12B0, 0x5054, 0x430D, 0x12B0, 0x4788, 0x4C8A, 0x0000, 0x4D8A, +0x0002, 0x3C04, 0x438C, 0x0000, 0x438C, 0x0002, 0x430C, 0x12B0, 0x5054, +0x430D, 0x12B0, 0x4788, 0x4C8B, 0x0000, 0x4D8B, 0x0002, 0x430C, 0x413B, +0x413A, 0x4130, 0x430F, 0x922C, 0x2C1E, 0x5C0C, 0x4C1F, 0x0140, 0x5C1F, +0x0148, 0x5C1F, 0x0150, 0x5C1F, 0x0158, 0x1202, 0xC232, 0x4303, 0x4F82, +0x0130, 0x4C92, 0x2560, 0x0138, 0x421C, 0x013A, 0x421D, 0x013C, 0x4132, +0x108C, 0x108D, 0xED4C, 0xED0C, 0xF37D, 0x12B0, 0x5312, 0x4C0F, 0x4F0C, +0x4130, 0x8321, 0x410C, 0x530C, 0x421F, 0x1558, 0x129F, 0x0014, 0x930C, +0x3403, 0x403C, 0xFFEB, 0x3C15, 0x416C, 0x1292, 0x14CA, 0x930C, 0x2403, +0x403C, 0xFFEA, 0x3C0D, 0x434C, 0x1292, 0x14CE, 0x1292, 0x156E, 0x1292, +0x1570, 0x435C, 0x421F, 0x1558, 0x129F, 0x0004, 0x430C, 0x5321, 0x4130, +0x53D2, 0x15EF, 0x90F2, 0x000A, 0x15EF, 0x201A, 0x43C2, 0x15EF, 0x4382, +0x0160, 0xC3A2, 0x01A0, 0x40F2, 0x0012, 0x0080, 0xD3A2, 0x01A0, 0xD392, +0x01A0, 0xB392, 0x01A4, 0x2BFD, 0x90B2, 0x0FFF, 0x0140, 0x3404, 0x40B2, +0x0114, 0x0160, 0x1300, 0x43C2, 0x15EC, 0x1300, 0x12B0, 0x45A8, 0x4382, +0x0122, 0x4382, 0x0124, 0x40B2, 0x13C0, 0x01E8, 0x4292, 0x159E, 0x01EC, +0x40B2, 0x13C0, 0x01F0, 0x4292, 0x159E, 0x01F4, 0x42A2, 0x01F6, 0x40B2, +0x0007, 0x156A, 0x403C, 0x0007, 0x12B0, 0x3ACA, 0x4392, 0x156C, 0x430C, +0x4130, 0x120A, 0x120B, 0x407C, 0x0086, 0x1292, 0x1572, 0x403B, 0x1578, +0x430C, 0x12AB, 0xB23C, 0x280B, 0x403C, 0x0014, 0x12AB, 0x430C, 0x12AB, +0x4C0A, 0x430C, 0x12AB, 0x4C0D, 0x4A0C, 0x3C02, 0x430C, 0x430D, 0x413B, +0x413A, 0x4130, 0x934C, 0x421F, 0x15AE, 0x2404, 0xC2DF, 0x15A8, 0x0000, +0x3C03, 0xD2DF, 0x15A8, 0x0000, 0x403C, 0x0005, 0x4030, 0x51CE, 0x934C, +0x421F, 0x15A4, 0x2404, 0xD2DF, 0x15A2, 0x0000, 0x3C03, 0xC2DF, 0x15A2, +0x0000, 0x3FF0, 0x930C, 0x2418, 0x4382, 0x0160, 0xC392, 0x0160, 0x40B2, +0x0200, 0x0160, 0x40B2, 0x02E9, 0x0172, 0x4382, 0x0170, 0xD0B2, 0x0014, +0x0160, 0xB392, 0x0160, 0x2BFD, 0x4382, 0x0160, 0xC392, 0x0160, 0x533C, +0x23E8, 0x4130, 0x403F, 0x1146, 0x403E, 0x130A, 0x4EBF, 0x0000, 0x4EBF, +0x0002, 0x4EBF, 0x0004, 0x4EBF, 0x0006, 0x523F, 0x903E, 0x14C2, 0x23F4, +0x43B2, 0x12FE, 0x4382, 0x1300, 0x43B2, 0x1302, 0x4382, 0x1304, 0x4130, +0x907B, 0x0010, 0x2807, 0x4D0C, 0x4E0D, 0x4F0E, 0x430F, 0x807B, 0x0010, +0x3FF6, 0x934B, 0x2407, 0xC312, 0x100F, 0x100E, 0x100D, 0x100C, 0x835B, +0x23F9, 0x4130, 0x4382, 0x156A, 0x40B2, 0x0CE4, 0x15B2, 0x43D2, 0x15ED, +0x43C2, 0x15EE, 0x4382, 0x15B6, 0x4382, 0x15B8, 0x4382, 0x15B4, 0x4382, +0x14FC, 0x4130, 0x907E, 0x0010, 0x2805, 0x4D0C, 0x430D, 0x2409, 0x807E, +0x0010, 0x934E, 0x2405, 0xC312, 0x100D, 0x100C, 0x835E, 0x23FB, 0x4130, +0x1292, 0x1594, 0x4C0F, 0xDD0F, 0x930F, 0x2406, 0x421F, 0x1558, 0x129F, +0x000A, 0x430C, 0x4130, 0x433C, 0x4130, 0xF37C, 0xF37E, 0x4E0F, 0x4C0D, +0x430E, 0x431C, 0x5D0D, 0x6E0E, 0x9F0E, 0x2801, 0x8F0E, 0x6C0C, 0x2BF9, +0x4130, 0x3C07, 0x3C06, 0x434C, 0x4130, 0x430C, 0x4130, 0x4130, 0x4130, +0x430C, 0x430D, 0x430E, 0x430F, 0x4130, 0x3FFA, 0x907E, 0x0010, 0x2804, +0x4C0D, 0x430C, 0x807E, 0x0010, 0x934E, 0x2404, 0x5C0C, 0x6D0D, 0x835E, +0x23FC, 0x4130, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, +0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x4130, 0x120A, 0x4C0A, 0x3C04, +0x4DEA, 0x0000, 0x531A, 0x531D, 0x4E0F, 0x533E, 0x930F, 0x23F8, 0x413A, +0x4130, 0x8321, 0x410C, 0x530C, 0x421F, 0x1558, 0x129F, 0x0016, 0x412C, +0x1292, 0x14C4, 0x430C, 0x5321, 0x4130, 0x407C, 0x000E, 0x1292, 0x1574, +0x4C4C, 0x430D, 0x935C, 0x2003, 0x430C, 0x1292, 0x157C, 0x4130, 0x4135, +0x4134, 0x4137, 0x4136, 0x4139, 0x4138, 0x413B, 0x413A, 0x4130, 0x4C0F, +0x5D0F, 0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, 0x4130, 0x120C, +0x4EBC, 0x0000, 0x532C, 0x831D, 0x23FB, 0x413C, 0x4130, 0x3C02, 0x3C00, +0x3C00, 0x533C, 0x930C, 0x23FB, 0x4130, 0x421F, 0x15C0, 0xC2DF, 0x15BC, +0x0000, 0x4130, 0x421F, 0x15C0, 0xD2DF, 0x15BA, 0x0000, 0x4130, 0x421F, +0x15C0, 0xC2DF, 0x15BA, 0x0000, 0x4130, 0x934C, 0x2402, 0x4030, 0x2E0E, +0x4030, 0x3208, 0x934C, 0x2402, 0x4030, 0x3326, 0x4030, 0x53BA, 0x934C, +0x2402, 0x4030, 0x53C6, 0x4030, 0x53D2, 0x934E, 0x2403, 0x5C0C, 0x835E, +0x23FD, 0x4130, 0x12B0, 0x4F76, 0x2802, 0x430C, 0x430D, 0x4130, 0x930C, +0x2402, 0x43E2, 0x007C, 0x4130, 0x430C, 0x430D, 0x430E, 0x430F, 0x4130, +0x12B0, 0x3ECA, 0x430C, 0x4130, 0x12B0, 0x46DC, 0x430C, 0x4130, 0x430C, +0x430D, 0x4130, 0x3FFC, 0x1292, 0x14C2, 0x430C, 0x4130, 0xD2F2, 0x001D, +0x4130, 0x433C, 0x433D, 0x4130, 0xC2F2, 0x001D, 0x4130, 0x430C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x430C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x430C, 0x4130, 0x430C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x434C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x430C, +0x4130, 0x430C, 0x4130, 0x434C, 0x4130, 0x434C, 0x4130, 0x430C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x4030, 0x532C, 0x4130, 0x4130, 0x4130, 0x4130, +0x4130, 0x4130, 0x5137, +}; + +const uint32_t UifHalImage_address[] = +{ +0x0000250C, 0x0000251E, 0x0000253A, 0x0000DFFE, +}; +const uint32_t UifHalImage_length_of_sections[] = +{ +0x00000001, 0x00000001, 0x0000185D, 0x00000001, +}; +const uint32_t UifHalImage_sections = 0x00000004; +const uint32_t UifHalImage_termination = 0x00000000; +const uint32_t UifHalImage_start = 0x0000250C; +const uint32_t UifHalImage_finish = 0x0000E000; +const uint32_t UifHalImage_length = 0x0000BAF4; + +#define UIFHALIMAGE_TERMINATION 0x00000000 +#define UIFHALIMAGE_START 0x0000250C +#define UIFHALIMAGE_FINISH 0x0000E000 +#define UIFHALIMAGE_LENGTH 0x0000BAF4 +#define UIFHALIMAGE_SECTIONS 0x00000004 diff --git a/Bios/include/UifHalMsp430.h b/Bios/include/UifHalMsp430.h new file mode 100644 index 0000000..89dccf0 --- /dev/null +++ b/Bios/include/UifHalMsp430.h @@ -0,0 +1,2623 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t UifHalMsp430Image[] = +{ +0xD8B2, 0xC8B6, 0x28BC, 0xC296, 0x8B00, 0x0001, 0x0000, 0x0000, 0x0000, +0x5555, 0x5555, 0x1711, 0x1711, 0x1B16, 0x1711, 0x0108, 0x0402, 0x0030, +0x0031, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, +0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, +0x5A80, 0x0000, 0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, 0x5A80, +0x0000, 0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, +0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, 0x5A83, 0x0000, 0x0000, +0x0120, 0x5A80, 0x0120, 0x5A80, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0301, 0x0705, 0x0281, 0x0000, +0x0000, 0xFF04, 0x0FFF, 0x0600, 0x0001, 0x0000, 0x0180, 0x0000, 0x0000, +0x0000, 0x0000, 0x0109, 0x0503, 0x8107, 0x0002, 0x0000, 0x0400, 0xFFFF, +0x000F, 0x0106, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0A00, +0x0A02, 0x020A, 0x0A0A, 0x0A02, 0x0008, 0x0808, 0x0800, 0x020A, 0x080A, +0x0800, 0x0008, 0x0108, 0x0109, 0x0009, 0x0008, 0x0308, 0x030B, 0x020B, +0x020A, 0x010A, 0x0009, 0x0008, 0x0308, 0x020B, 0x020A, 0x010A, 0x0009, +0x0308, 0x020B, 0xFF0A, 0xCACA, 0xCACA, 0x40B2, 0x5A80, 0x0120, 0xC232, +0xC0F2, 0x003F, 0x0057, 0xD0F2, 0x0007, 0x0057, 0x45C2, 0x0056, 0x46C2, +0x0057, 0x43C2, 0x0058, 0xEA0A, 0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, +0x4303, 0x3FFF, 0x40B2, 0x5A80, 0x0120, 0xC232, 0xD072, 0x0040, 0x4032, +0x0040, 0x40F2, 0x0080, 0x0052, 0x43C2, 0x0050, 0x45C2, 0x0051, 0xD0F2, +0x0080, 0x0053, 0xC0F2, 0x005F, 0x0054, 0xEA0A, 0xE909, 0x5319, 0x23FE, +0x531A, 0x23FC, 0x4303, 0x3FFF, 0x0001, 0x0000, 0xDBD8, 0x0001, 0xD99E, +0x0002, 0xCFE4, 0x0003, 0xC844, 0x0004, 0xC682, 0x0005, 0xA708, 0x0006, +0xC4C4, 0x0007, 0x8B9E, 0x0008, 0xCFFE, 0x0009, 0xCB54, 0x000A, 0xBCFC, +0x000B, 0xA8A0, 0x000C, 0xC5F2, 0x000D, 0xDB5C, 0x000E, 0xDBC0, 0x000F, +0xD5BE, 0x0010, 0xADC2, 0x0011, 0xA2E2, 0x0012, 0x601E, 0x0013, 0x5742, +0x0014, 0x6816, 0x0015, 0x9D8E, 0x0016, 0x90E0, 0x0017, 0x93E6, 0x0018, +0x91E4, 0x0019, 0x99CA, 0x001A, 0xBB72, 0x001B, 0xDBD4, 0x001C, 0x771A, +0x001D, 0xB9DE, 0x001E, 0xB7A0, 0x001F, 0x7A3A, 0x0020, 0x4848, 0x0021, +0x3F0E, 0x0022, 0xCC50, 0x0023, 0xCBD2, 0x0024, 0xCB7E, 0x0025, 0xCBFC, +0x0026, 0x8426, 0x0027, 0x5D48, 0x0028, 0x62DC, 0x0029, 0x714A, 0x002A, +0x98D4, 0x002B, 0xA496, 0x002C, 0x8A7C, 0x002D, 0x8CBA, 0x002E, 0x9ABE, +0x002F, 0xAFC2, 0x0030, 0x754C, 0x0031, 0xAE6E, 0x0032, 0xABA8, 0x0033, +0x82C6, 0x0034, 0x43E6, 0x0035, 0xCBA8, 0x0036, 0xCC26, 0x0037, 0x8576, +0x0038, 0x97DC, 0x0039, 0xBEF4, 0x003A, 0x5A5E, 0x003B, 0x5044, 0x003C, +0x658A, 0x003D, 0xB5E4, 0x003E, 0x9CA2, 0x003F, 0xA202, 0x0040, 0xA56C, +0x0041, 0x734C, 0x0042, 0x8164, 0x0043, 0xA63A, 0x0044, 0x7D30, 0x0045, +0x4C8A, 0x0046, 0xAF18, 0x0047, 0x9E78, 0x0048, 0xA7D4, 0x0049, 0x53F6, +0x004A, 0xDAA6, 0x004B, 0xC16E, 0x004C, 0xC10A, 0x004D, 0xC74E, 0x004E, +0x7BBE, 0x004F, 0xB4B6, 0x0050, 0x6CF0, 0x0051, 0xDB88, 0x0052, 0xCE0C, +0x0053, 0xC46E, 0x0054, 0xC412, 0x0055, 0xDA56, 0x0056, 0xDBD0, 0x0057, +0xB106, 0x0058, 0xDBC4, 0x0059, 0xC78E, 0x005A, 0x880E, 0x005B, 0xDB6C, +0x005C, 0xDB9C, 0x005D, 0xDB74, 0x005E, 0xDB8C, 0x005F, 0xDBAC, 0x0060, +0xDB68, 0x0061, 0xDB58, 0x0062, 0xDB94, 0x0063, 0xDB70, 0x0064, 0xDB90, +0x0065, 0xDBA0, 0x0066, 0xDBA4, 0x0067, 0xDB80, 0x0068, 0xDBA8, 0x0069, +0xDB1E, 0x006A, 0xDBB4, 0x006B, 0xDBC8, 0x006C, 0xDBCC, 0x006D, 0xB8C4, +0xC6C8, 0xC2F6, 0xDBE4, 0xC7CC, 0x347E, 0xC926, 0x37E0, 0x3476, 0xD4FA, +0xC95E, 0xB246, 0x37E8, 0x32E6, 0x3294, 0xD88A, 0xDBE6, 0x3292, 0x8DC8, +0x32CE, 0x8E38, 0x32B6, 0xDBB8, 0xDBE2, 0xDBB0, 0xDBE0, 0xDBE8, 0x8E50, +0x0000, 0xFF01, 0x1204, 0x1205, 0x1206, 0x1207, 0x1208, 0x1209, 0x120A, +0x120B, 0x120C, 0x120D, 0x120E, 0x120F, 0x403C, 0x1568, 0x403D, 0x0203, +0x12B0, 0xD35E, 0x403C, 0x1306, 0x403D, 0x265A, 0x403E, 0x0261, 0x12B0, +0xDBBC, 0x413F, 0x413E, 0x413D, 0x413C, 0x413B, 0x413A, 0x4139, 0x4138, +0x4137, 0x4136, 0x4135, 0x4134, 0x4030, 0xC296, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8231, 0x12B0, 0x2E6E, 0x2403, +0x12B0, 0x309E, 0x3C02, 0x12B0, 0x2E76, 0x12B0, 0x2EF2, 0x403D, 0x8000, +0xBC81, 0x0000, 0x2014, 0xBD81, 0x0002, 0x240C, 0x3C10, 0xB31C, 0x2BF7, +0xBC81, 0x0000, 0x2003, 0xBD81, 0x0002, 0x2406, 0x12B0, 0x309E, 0x3C05, +0x12B0, 0x2EE6, 0x3C04, 0x12B0, 0x2E76, 0x12B0, 0x2F6A, 0x12B0, 0x2E90, +0x23EB, 0x12B0, 0x2E6E, 0x2403, 0x12B0, 0x2F5C, 0x3C02, 0x12B0, 0x2EDC, +0x12B0, 0x2E7E, 0x440C, 0x450D, 0x5231, 0x4030, 0xD316, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x4CC2, 0x1768, 0x12B0, 0x31AA, 0x403A, +0x261D, 0x403B, 0x2552, 0x12B0, 0x2E6E, 0x2405, 0x4A82, 0x01EA, 0x12B0, +0x2A7E, 0x3C06, 0x12B0, 0x2E76, 0x12B0, 0x2A7E, 0x4A82, 0x01EA, 0x12B0, +0x2F6A, 0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0x4B68, 0xE378, 0x4219, +0x2558, 0xF8C9, 0x0000, 0x12B0, 0x2A9E, 0x12B0, 0x2F38, 0x12B0, 0x2A96, +0x12B0, 0x2A96, 0x434E, 0x4076, 0x0080, 0xB64C, 0x2408, 0x3C0C, 0xB356, +0x2BFB, 0xB64C, 0x2406, 0x4A82, 0x01EA, 0x3C05, 0x12B0, 0x2EE6, 0x3C04, +0x12B0, 0x2E76, 0x12B0, 0x2F6A, 0x12B0, 0x2A6E, 0x5E4E, 0x4217, 0x2556, +0xB2D7, 0x2555, 0x0000, 0x2002, 0x4347, 0x3C01, 0x4357, 0xD74E, 0x12B0, +0x2A9E, 0x1106, 0x23E1, 0x12B0, 0x31B4, 0x2407, 0x4A82, 0x01EA, 0x12B0, +0x2A96, 0x12B0, 0x2ED4, 0x3C06, 0x12B0, 0x2E76, 0x12B0, 0x2A96, 0x12B0, +0x2EE6, 0x12B0, 0x2A6E, 0xDBE9, 0x0000, 0xD232, 0x4D2B, 0xEFEB, 0x0000, +0x4E4C, 0x4030, 0xD31A, 0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, +0x0000, 0x4130, 0x12B0, 0x2AAC, 0x4217, 0x2558, 0xCBE7, 0x0000, 0x4217, +0x2558, 0xDBE7, 0x0000, 0x4030, 0x2AA2, 0x12B0, 0x2AAC, 0xF8C9, 0x0000, +0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x4130, 0x12B0, 0x2F6A, +0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0x4130, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x120F, 0x120E, 0x120D, 0x120C, 0x8031, 0x0010, +0x12B0, 0x2E6E, 0x2403, 0x12B0, 0x309E, 0x3C02, 0x12B0, 0x2E76, 0x12B0, +0x306E, 0x403F, 0x170A, 0x12B0, 0x2C50, 0xC232, 0x4303, 0x425C, 0x2552, +0x4C46, 0xE376, 0x421E, 0x2558, 0xF6CE, 0x0000, 0x12B0, 0x2C4A, 0x12B0, +0x2F38, 0x12B0, 0x2C80, 0x12B0, 0x2C80, 0x4381, 0x0008, 0x4381, 0x000A, +0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, +0x0004, 0x40B1, 0x8000, 0x0006, 0x410B, 0x530B, 0xBBB1, 0x0010, 0x2022, +0xBBB1, 0x0012, 0x201F, 0xBBB1, 0x0014, 0x201C, 0xBBB1, 0x0016, 0x2414, +0x3C18, 0xB318, 0x2BEF, 0x410B, 0x530B, 0xBBB1, 0x0010, 0x2009, 0xBBB1, +0x0012, 0x2006, 0xBBB1, 0x0014, 0x2003, 0xBBB1, 0x0016, 0x2406, 0x12B0, +0x309E, 0x3C05, 0x12B0, 0x2EE6, 0x3C04, 0x12B0, 0x2E76, 0x12B0, 0x2F6A, +0x12B0, 0x2C50, 0xC232, 0x4303, 0xF6CE, 0x0000, 0x12B0, 0x2C3A, 0x5808, +0x6909, 0x6A0A, 0x6B0B, 0x12B0, 0x2C58, 0x421B, 0x2556, 0xB2DB, 0x2555, +0x0000, 0x2002, 0x4347, 0x3C01, 0x4357, 0x12B0, 0x2C3A, 0xD708, 0x12B0, +0x2C58, 0x12B0, 0x2C4A, 0x410B, 0x530B, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, +0xC312, 0x100B, 0x100A, 0x1009, 0x1008, 0x4881, 0x0000, 0x4981, 0x0002, +0x4A81, 0x0004, 0x4B81, 0x0006, 0x480B, 0xD90B, 0xDA0B, 0xD11B, 0x0006, +0x930B, 0x23AE, 0x12B0, 0x2E6E, 0x2409, 0x12B0, 0x30A6, 0x12B0, 0x2C6A, +0x12B0, 0x2C50, 0x12B0, 0x2ED4, 0x3C06, 0x12B0, 0x2E76, 0x12B0, 0x2C80, +0x12B0, 0x2EE6, 0x12B0, 0x2C6A, 0x4F2F, 0xEDEF, 0x0000, 0x410F, 0x523F, +0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x5031, 0x0018, 0x4030, 0xD31A, 0x410B, +0x503B, 0x000A, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x4130, 0xDCCE, 0x0000, +0xD232, 0x4F2B, 0xEDEB, 0x0000, 0x4130, 0x4881, 0x000A, 0x4981, 0x000C, +0x4A81, 0x000E, 0x4B81, 0x0010, 0x4130, 0x4F2B, 0xEDEB, 0x0000, 0xC232, +0x4303, 0xF6CE, 0x0000, 0xDCCE, 0x0000, 0xD232, 0x4130, 0x12B0, 0x2F6A, +0x12B0, 0x2C6A, 0x3FE3, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, +0x1204, 0x1205, 0x120F, 0x120E, 0x120D, 0x120C, 0x8221, 0x411F, 0x001E, +0x4F81, 0x0002, 0x4347, 0xF31F, 0x4F81, 0x0000, 0x4191, 0x0020, 0x0020, +0x410F, 0x522F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x12B0, 0x2ABC, 0x4C08, +0x4D09, 0x4E0A, 0x4F0B, 0x108F, 0x4F46, 0xF036, 0x00C7, 0xB226, 0x2C71, +0x9076, 0x0083, 0x2003, 0x4077, 0x002A, 0x3C53, 0xB036, 0x0040, 0x2806, +0x464E, 0xF07E, 0x00C0, 0x907E, 0x00C0, 0x2066, 0x9076, 0x0081, 0x2003, +0x12B0, 0x2DD4, 0x3C3F, 0x464E, 0xF07E, 0x00C3, 0x935E, 0x2404, 0x934E, +0x2402, 0x936E, 0x2023, 0x9381, 0x0000, 0x2454, 0x90B1, 0x0021, 0x0020, +0x2850, 0x407C, 0x0054, 0x12B0, 0x298C, 0x430C, 0x430D, 0x12B0, 0x290C, +0x4C04, 0x4D05, 0xD035, 0x0200, 0x450D, 0x12B0, 0x290C, 0xF035, 0xFDFF, +0x440C, 0x450D, 0x12B0, 0x290C, 0x12B0, 0x2DD4, 0x412F, 0x533F, 0x4F81, +0x0000, 0x3C18, 0x9076, 0x0003, 0x2413, 0x9076, 0x0082, 0x2410, 0x9076, +0x0080, 0x240D, 0x464E, 0xF07E, 0x00C0, 0x907E, 0x00C0, 0x2407, 0x9346, +0x2405, 0x9366, 0x2403, 0x4077, 0x003A, 0x3C02, 0x4077, 0x001A, 0x9381, +0x0002, 0x2417, 0x411F, 0x0002, 0x533F, 0x4F81, 0x0002, 0x9077, 0x003A, +0x278A, 0x9077, 0x002A, 0x2787, 0x9076, 0x0082, 0x2407, 0x9076, 0x0080, +0x2404, 0x9346, 0x2402, 0x9366, 0x2002, 0x12B0, 0x2DD4, 0x480C, 0x490D, +0x4A0E, 0x4B0F, 0x5031, 0x000C, 0x4030, 0xD316, 0x407C, 0x0046, 0x4030, +0x298C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, +0x8231, 0x12B0, 0x2E6E, 0x2403, 0x12B0, 0x309E, 0x3C02, 0x12B0, 0x2E76, +0x12B0, 0x2EF2, 0x423D, 0xBC81, 0x0000, 0x2014, 0xBD81, 0x0002, 0x240C, +0x3C10, 0xB31C, 0x2BF7, 0xBC81, 0x0000, 0x2003, 0xBD81, 0x0002, 0x2406, +0x12B0, 0x309E, 0x3C05, 0x12B0, 0x2EE6, 0x3C04, 0x12B0, 0x2E76, 0x12B0, +0x2F6A, 0x12B0, 0x2E90, 0x23EB, 0x12B0, 0x2E6E, 0x2403, 0x12B0, 0x2F5C, +0x3C02, 0x12B0, 0x2EDC, 0x12B0, 0x2E7E, 0x440F, 0xC312, 0x1005, 0x1004, +0x1105, 0x1004, 0x1105, 0x1004, 0x1105, 0x1004, 0xDF05, 0xF035, 0x000F, +0x4030, 0x2982, 0xB2D2, 0x2554, 0x1766, 0x4130, 0x40B2, 0x2623, 0x01EA, +0x4130, 0x12B0, 0x2F2E, 0x12B0, 0x2F4E, 0xD232, 0x4B2F, 0xEAEF, 0x0000, +0x4130, 0x4B29, 0xEAE9, 0x0000, 0xC232, 0x4303, 0xC2D8, 0x2552, 0x0000, +0x5404, 0x6505, 0x4219, 0x2556, 0xB2D9, 0x2555, 0x0000, 0x2002, 0x4349, +0x3C01, 0x4359, 0xD904, 0xD2D8, 0x2552, 0x0000, 0xD232, 0x4B29, 0xEAE9, +0x0000, 0xC312, 0x100D, 0x100C, 0x4C09, 0xDD09, 0x9309, 0x4130, 0x12B0, +0x2F38, 0x4030, 0x2F6A, 0x40B2, 0x2623, 0x01EA, 0x12B0, 0x2F40, 0xD0B2, +0x0010, 0x01F0, 0xD392, 0x01F0, 0x4130, 0x12B0, 0x2F6A, 0x403A, 0x1760, +0x403B, 0x170A, 0x12B0, 0x2F2E, 0x4218, 0x2558, 0x12B0, 0x2E82, 0x12B0, +0x2F38, 0x12B0, 0x2F40, 0x12B0, 0x2F40, 0x4C81, 0x0002, 0x4D81, 0x0004, +0x4381, 0x0006, 0x4381, 0x0008, 0x4304, 0x4305, 0x430C, 0x4130, 0x4B2F, +0xEAEF, 0x0000, 0x4030, 0x2AB6, 0x40B2, 0x2629, 0x01EA, 0x4130, 0x12B0, +0x2F6A, 0x12B0, 0x2F2E, 0x12B0, 0x2F4E, 0x3F9C, 0xC2D8, 0x2552, 0x0000, +0xD2D8, 0x2552, 0x0000, 0x4130, 0x40B2, 0x261D, 0x01EA, 0x12B0, 0x2F40, +0x12B0, 0x2F38, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4130, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x12B0, 0x2E6E, 0x2403, 0x12B0, 0x309E, +0x3C02, 0x12B0, 0x2E76, 0x12B0, 0x306E, 0x403A, 0x170A, 0x4A2F, 0xEDEF, +0x0000, 0xC232, 0x4303, 0x425B, 0x2552, 0x4B48, 0xE378, 0x4219, 0x2558, +0xF8C9, 0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2F, 0xEDEF, 0x0000, 0x12B0, +0x2F38, 0x12B0, 0x3078, 0x12B0, 0x3078, 0x430F, 0x4036, 0x8000, 0xB60C, +0x2408, 0x3C0C, 0xB316, 0x2BFB, 0xB60C, 0x2406, 0x12B0, 0x309E, 0x3C05, +0x12B0, 0x2EE6, 0x3C04, 0x12B0, 0x2E76, 0x12B0, 0x2F6A, 0x12B0, 0x3066, +0x12B0, 0x2A74, 0x5F0F, 0x421E, 0x2556, 0xB2DE, 0x2555, 0x0000, 0x2002, +0x434E, 0x3C01, 0x435E, 0xDE0F, 0xDBC9, 0x0000, 0xD232, 0x12B0, 0x3066, +0xC312, 0x1006, 0x23DB, 0x12B0, 0x2E6E, 0x2407, 0x12B0, 0x30A6, 0x12B0, +0x305E, 0x12B0, 0x2ED4, 0x3C08, 0x12B0, 0x2E76, 0x12B0, 0x2F6A, 0x12B0, +0x305E, 0x12B0, 0x2EE6, 0x12B0, 0x3066, 0x12B0, 0x2A74, 0xDBC9, 0x0000, +0xD232, 0x4A2B, 0xEDEB, 0x0000, 0x4F0C, 0x4030, 0xD31C, 0x12B0, 0x3066, +0x12B0, 0x308E, 0x4A2E, 0xEDEE, 0x0000, 0x4130, 0x12B0, 0x2F6A, 0x403D, +0x1760, 0x4130, 0x12B0, 0x2F6A, 0x4A2F, 0xEDEF, 0x0000, 0x12B0, 0x308E, +0x4A2F, 0xEDEF, 0x0000, 0x4130, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, +0x0000, 0xD232, 0x4130, 0x40B2, 0x261D, 0x01EA, 0x4130, 0x40B2, 0x261D, +0x01EA, 0x4030, 0x2F6A, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x12B0, +0x2E6E, 0x2403, 0x12B0, 0x309E, 0x3C02, 0x12B0, 0x2E76, 0x12B0, 0x2F6A, +0x12B0, 0x31AA, 0x4D2B, 0xEFEB, 0x0000, 0xC232, 0x4303, 0x425A, 0x2552, +0x4A4B, 0xE37B, 0x4218, 0x2558, 0xFBC8, 0x0000, 0xDAC8, 0x0000, 0xD232, +0x4D2E, 0xEFEE, 0x0000, 0x12B0, 0x2F38, 0x12B0, 0xD1BC, 0x12B0, 0xD1BC, +0x434E, 0x4079, 0x0080, 0xB94C, 0x2408, 0x3C0C, 0xB359, 0x2BFB, 0xB94C, +0x2406, 0x12B0, 0x309E, 0x3C05, 0x12B0, 0x2EE6, 0x3C04, 0x12B0, 0x2E76, +0x12B0, 0x2F6A, 0x4D26, 0xEFE6, 0x0000, 0xC232, 0x4303, 0xFBC8, 0x0000, +0x5E4E, 0x4216, 0x2556, 0xB2D6, 0x2555, 0x0000, 0x2002, 0x4346, 0x3C01, +0x4356, 0xD64E, 0xDAC8, 0x0000, 0xD232, 0x4D26, 0xEFE6, 0x0000, 0x1109, +0x23D8, 0x12B0, 0x31B4, 0x2407, 0x12B0, 0x30A6, 0x12B0, 0xD6AC, 0x12B0, +0x2ED4, 0x3C08, 0x12B0, 0x2E76, 0x12B0, 0x2F6A, 0x12B0, 0xD6AC, 0x12B0, +0x2EE6, 0x12B0, 0x3194, 0x4D2B, 0xEFEB, 0x0000, 0x4E4C, 0x4030, 0xD31C, +0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, +0xD232, 0x4130, 0x403F, 0x1760, 0x403D, 0x170A, 0x4130, 0x93D2, 0x1767, +0x2004, 0x43C2, 0x1766, 0x43C2, 0x1767, 0x3E55, 0x480C, 0x1292, 0x153E, +0x4B2F, 0xC3DF, 0x0000, 0x4130, 0x421B, 0x2558, 0x4258, 0x2552, 0xD8CB, +0x0000, 0x4130, 0x403C, 0x0005, 0x12AA, 0x4030, 0x3226, 0x4258, 0x2552, +0x4849, 0xE379, 0x4216, 0x2558, 0xF9C6, 0x0000, 0x4B0C, 0x12AA, 0x431C, +0x12AA, 0x9392, 0x1706, 0x4130, 0x403C, 0x0005, 0x12B0, 0x3228, 0x4038, +0x000A, 0x480C, 0x12AA, 0x12B0, 0x3756, 0x480C, 0x12AA, 0x4B2F, 0xC3DF, +0x0000, 0x480C, 0x12AA, 0x4B2F, 0xD3DF, 0x0000, 0x4130, 0x403C, 0x0005, +0x12AA, 0x4849, 0xE379, 0xF9CB, 0x0000, 0x4036, 0x0064, 0x460C, 0x12AA, +0xC2DB, 0x2554, 0x0000, 0x460C, 0x12AA, 0xD8CB, 0x0000, 0x460C, 0x12AA, +0xF9CB, 0x0000, 0x403C, 0x000A, 0x1292, 0x153E, 0xD8CB, 0x0000, 0x460C, +0x12AA, 0x9392, 0x1706, 0x2004, 0xD2DB, 0x2554, 0x0000, 0x3C02, 0x12B0, +0x3322, 0x403C, 0x0005, 0x12AA, 0x460C, 0x12AA, 0xF9CB, 0x0000, 0x460C, +0x4130, 0x4130, 0x934C, 0x2409, 0x9392, 0x1706, 0x2003, 0x12B0, 0x393C, +0x3C05, 0x12B0, 0x3948, 0x3C02, 0x12B0, 0x3984, 0x403C, 0x0005, 0x4210, +0x1540, 0x934C, 0x421F, 0x2558, 0x2404, 0xD2DF, 0x2554, 0x0000, 0x4130, +0xC2DF, 0x2554, 0x0000, 0x4130, 0x934C, 0x421F, 0x2558, 0x2404, 0xD2DF, +0x2553, 0x0000, 0x4130, 0xC2DF, 0x2553, 0x0000, 0x4130, 0x934C, 0x2409, +0x9392, 0x1706, 0x2003, 0x12B0, 0x330E, 0x3C0B, 0x12B0, 0x3322, 0x3C08, +0x9392, 0x1706, 0x2003, 0x12B0, 0x3950, 0x3C02, 0x12B0, 0x3756, 0x3FD0, +0x421F, 0x2558, 0xD2DF, 0x2554, 0x0000, 0x4130, 0xC3DF, 0x0000, 0x12B0, +0x396C, 0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x4130, 0x934C, +0x2407, 0xD2E2, 0x001D, 0xD0F2, 0x0010, 0x001D, 0x434E, 0x3C06, 0xC0F2, +0x0010, 0x001D, 0xC2E2, 0x001D, 0x435E, 0x4EC2, 0x1761, 0x4130, 0x403E, +0xBAEC, 0x403F, 0x0041, 0x43D2, 0x1762, 0xD0F2, 0x0080, 0x002A, 0xD0F2, +0x0080, 0x002E, 0x40B2, 0x0028, 0x0172, 0x40B2, 0x0090, 0x0162, 0x40B2, +0x0114, 0x0160, 0x3C02, 0x533E, 0x633F, 0x93C2, 0x1762, 0x2404, 0x4E0D, +0xDF0D, 0x930D, 0x23F7, 0x4382, 0x0162, 0xC0F2, 0x0080, 0x002E, 0xC0F2, +0x0080, 0x002A, 0x4130, 0x4C0F, 0xDD0F, 0x930F, 0x2410, 0x12B0, 0x3354, +0x93C2, 0x1761, 0x2404, 0xD0F2, 0x0020, 0x001D, 0x3C03, 0xD0F2, 0x0040, +0x001D, 0x403C, 0x000A, 0x4210, 0x1540, 0xF0F2, 0x009F, 0x001D, 0x4130, +0x9382, 0x170C, 0x204D, 0x9392, 0x1706, 0x2010, 0x12B0, 0x330E, 0x421F, +0x170A, 0xD2DF, 0x1760, 0x0000, 0x431C, 0x1292, 0x1540, 0x421F, 0x2558, +0xC2DF, 0x2552, 0x0000, 0x3C0F, 0x421F, 0x170A, 0xD2DF, 0x1760, 0x0000, +0xD0F2, 0x0020, 0x0029, 0x431C, 0x1292, 0x1540, 0x421F, 0x170A, 0xD3DF, +0x0000, 0x40B2, 0xDB98, 0x170E, 0x40B2, 0xDB84, 0x1710, 0x40B2, 0xDBDC, +0x1712, 0x40B2, 0xDB7C, 0x1716, 0x40B2, 0xDB78, 0x1718, 0x40B2, 0xDA4C, +0x171A, 0x40B2, 0xDA46, 0x171C, 0x40B2, 0xCE4A, 0x1720, 0x40B2, 0xCE40, +0x1722, 0x40B2, 0xCE3E, 0x1726, 0x40B2, 0xCE34, 0x172C, 0x40B2, 0xCE3C, +0x1728, 0x40B2, 0xCE38, 0x172A, 0x12B0, 0x3592, 0x4392, 0x170C, 0x3F1C, +0x12B0, 0x33D4, 0x430C, 0x4130, 0x430F, 0x930C, 0x2003, 0x4382, 0x1706, +0x3C0B, 0x931C, 0x2003, 0x4392, 0x1706, 0x3C06, 0x932C, 0x2003, 0x43A2, +0x1706, 0x3C01, 0x433F, 0x40B2, 0x001D, 0x170A, 0x42E2, 0x1760, 0x12B0, +0x3592, 0x421E, 0x1708, 0x9392, 0x1706, 0x2039, 0x40B2, 0xA9F0, 0x170E, +0x40B2, 0xA968, 0x1710, 0x40B2, 0x298C, 0x1712, 0x40B2, 0x30B0, 0x1716, +0x40B2, 0x2F76, 0x1718, 0x40B2, 0x2DDC, 0x171A, 0x40B2, 0x290C, 0x171C, +0x40B2, 0x2ABC, 0x1720, 0x40B2, 0x2C8A, 0x1722, 0x40B2, 0xBE00, 0x1726, +0x40B2, 0xDB3C, 0x172C, 0x931E, 0x2003, 0x403E, 0xCCF2, 0x3C07, 0x932E, +0x2003, 0x403E, 0xAB50, 0x3C02, 0x403E, 0xAAEC, 0x403D, 0xC03C, 0x40B2, +0x0006, 0x01EE, 0x40B2, 0x0006, 0x01F6, 0x40B2, 0x262F, 0x01F2, 0x3C2E, +0x40B2, 0x3E82, 0x170E, 0x40B2, 0xD446, 0x1710, 0x40B2, 0x3A34, 0x1712, +0x40B2, 0x3DFA, 0x1716, 0x40B2, 0x3DA0, 0x1718, 0x40B2, 0x3CC0, 0x171A, +0x40B2, 0x39E6, 0x171C, 0x40B2, 0x3A92, 0x1720, 0x40B2, 0x3B66, 0x1722, +0x40B2, 0x39D6, 0x1726, 0x40B2, 0xDB42, 0x172C, 0x930E, 0x2402, 0x932E, +0x2003, 0x403E, 0x3EE2, 0x3C02, 0x403E, 0x3EB2, 0x403D, 0xC234, 0x42A2, +0x01F6, 0x4D82, 0x172A, 0x4E82, 0x1728, 0x4F0C, 0x4130, 0x40B2, 0xCE2E, +0x171E, 0x40B2, 0xCE2C, 0x1724, 0x40B2, 0xCE30, 0x1714, 0x40B2, 0xDB60, +0x172E, 0x40B2, 0xDB64, 0x1730, 0x40B2, 0xDB54, 0x1732, 0x40B2, 0xDB4E, +0x1734, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, +0x4C4A, 0x9382, 0x170C, 0x2404, 0x421C, 0x1706, 0x12B0, 0x347E, 0x403B, +0x1540, 0x4038, 0x0005, 0x403F, 0x1760, 0x4039, 0x2552, 0x4036, 0x170A, +0x934A, 0x2033, 0x9392, 0x1706, 0x2009, 0x12B0, 0x379A, 0x2003, 0xDAC7, +0x0000, 0x3C35, 0x12B0, 0x3322, 0x3C32, 0x12B0, 0x3764, 0x2084, 0x12B0, +0x374A, 0x12B0, 0x37D6, 0x2003, 0xDAC7, 0x0000, 0x3C02, 0x12B0, 0x3322, +0x12B0, 0x3736, 0x2003, 0xD9E7, 0x0000, 0x3C02, 0x12B0, 0x3750, 0x12B0, +0x373C, 0x2003, 0xCAC7, 0x0000, 0x3C02, 0x12B0, 0x3756, 0x12B0, 0x3968, +0x12B0, 0x374A, 0x12B0, 0x397E, 0x462F, 0x12B0, 0x331A, 0x3C68, 0x9392, +0x1706, 0x2026, 0x12B0, 0x379A, 0x2003, 0xCAC7, 0x0000, 0x3C02, 0x12B0, +0x3756, 0x12B0, 0x3736, 0x2003, 0xD9E7, 0x0000, 0x3C02, 0x12B0, 0x3750, +0x12B0, 0x373C, 0x2003, 0xDAC7, 0x0000, 0x3C02, 0x12B0, 0x3322, 0x480C, +0x12AB, 0x12B0, 0x3974, 0xF4C7, 0x0000, 0x12B0, 0x397E, 0xD9E7, 0x0000, +0xD232, 0x12B0, 0x396C, 0x3C3F, 0x12B0, 0x3764, 0x2034, 0xC232, 0x4303, +0x9392, 0x1706, 0x2003, 0xC9E7, 0x0000, 0x3C02, 0x12B0, 0x374A, 0x480C, +0x12AB, 0x422C, 0x12B0, 0x3744, 0x2003, 0xCAC7, 0x0000, 0x3C02, 0x12B0, +0x3756, 0x12B0, 0x3736, 0x2003, 0xD9E7, 0x0000, 0x3C02, 0x12B0, 0x3750, +0x480C, 0x12AB, 0x403C, 0x0032, 0x12B0, 0x3744, 0x2003, 0xCAC7, 0x0000, +0x3C02, 0x12B0, 0x3756, 0x12B0, 0x3968, 0x462F, 0x12B0, 0xD24A, 0x12B0, +0x3750, 0x480C, 0x12AB, 0xD232, 0x3C0A, 0x9392, 0x1706, 0x2003, 0xD9E7, +0x0000, 0x3C02, 0x12B0, 0x3750, 0x480C, 0x12AB, 0x4382, 0x170C, 0x4030, +0xD318, 0x480C, 0x4030, 0x3744, 0x480C, 0x12AB, 0x403C, 0x0064, 0x12AB, +0x4030, 0x3202, 0x462F, 0x4030, 0x322C, 0x462F, 0x4030, 0x31CC, 0xC0F2, +0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, 0x4130, 0x425A, 0x2554, 0x4217, +0x2558, 0x496E, 0x525E, 0x2553, 0x5A4E, 0xDEC7, 0x0000, 0x462E, 0xDFEE, +0x0000, 0x12B0, 0x378C, 0x431C, 0x12AB, 0x93A2, 0x1706, 0x4130, 0xD0F2, +0x0040, 0x0029, 0xC0F2, 0x0020, 0x0029, 0x4130, 0x4627, 0xD3D7, 0x0000, +0x425A, 0x2554, 0x4217, 0x2558, 0xDAC7, 0x0000, 0x462E, 0xCFEE, 0x0000, +0x431C, 0x12AB, 0x4964, 0xE374, 0xF4C7, 0x0000, 0xC0F2, 0x0020, 0x0029, +0x12B0, 0x37DA, 0x2003, 0xF4C7, 0x0000, 0x3C03, 0x462F, 0xD3DF, 0x0000, +0x480C, 0x12AB, 0x431C, 0x4030, 0x3744, 0x12B0, 0x35BE, 0x430C, 0x4130, +0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x403A, 0x1540, 0x403B, 0x0005, +0x421F, 0x1706, 0x831F, 0x2403, 0x831F, 0x2438, 0x3C94, 0x935C, 0x200A, +0x12B0, 0x31EA, 0x2004, 0xC2D6, 0x2554, 0x0000, 0x3C0E, 0x12B0, 0x3756, +0x3C0B, 0x934C, 0x208A, 0x12B0, 0x31EA, 0x2004, 0xD2D6, 0x2554, 0x0000, +0x3C02, 0x12B0, 0x3322, 0x4B0C, 0x12B0, 0x3200, 0x2003, 0xD8C6, 0x0000, +0x3C02, 0x12B0, 0x3948, 0x12B0, 0x395C, 0x2004, 0xD2D6, 0x2554, 0x0000, +0x3C02, 0x12B0, 0x3322, 0x4B0C, 0x12AA, 0x12B0, 0x3974, 0xF9C6, 0x0000, +0x12B0, 0x397E, 0xD8C6, 0x0000, 0xD232, 0x12B0, 0x396C, 0x3C5F, 0x935C, +0x202D, 0xC232, 0x4303, 0x12B0, 0x3984, 0x4B0C, 0x12AA, 0x422C, 0x12B0, +0x3200, 0x2003, 0x12B0, 0x3950, 0x3C02, 0x12B0, 0x3756, 0x4B0C, 0x12AA, +0x12B0, 0x39A0, 0x4B0C, 0x12AA, 0x403C, 0x0032, 0x12B0, 0x3200, 0x2003, +0x12B0, 0x3950, 0x3C02, 0x12B0, 0x3756, 0x4B0C, 0x12AA, 0x12B0, 0x396C, +0x421F, 0x170A, 0x12B0, 0xD24A, 0x12B0, 0x3948, 0x4B0C, 0x12AA, 0xD232, +0x3C32, 0x934C, 0x2030, 0x4038, 0x170A, 0x482F, 0xD3DF, 0x0000, 0x12B0, +0x31FA, 0x2003, 0x12B0, 0x330E, 0x3C02, 0x12B0, 0x3322, 0x4B0C, 0x12B0, +0x3200, 0x2003, 0x12B0, 0x393C, 0x3C03, 0x482F, 0xC3DF, 0x0000, 0x12B0, +0x395C, 0x2003, 0x12B0, 0x3950, 0x3C02, 0x12B0, 0x3756, 0x4B0C, 0x12AA, +0x12B0, 0x396C, 0x482F, 0xD3DF, 0x0000, 0x12B0, 0x397E, 0x482F, 0x12B0, +0x331A, 0x3C02, 0x12B0, 0x39A0, 0x4B0C, 0x12AA, 0x4030, 0xD31C, 0x421F, +0x2558, 0xD2DF, 0x2552, 0x0000, 0x4130, 0x421F, 0x170A, 0x4030, 0x31CC, +0x421F, 0x2558, 0xC2DF, 0x2554, 0x0000, 0x4130, 0x4B0C, 0x12AA, 0x403C, +0x0064, 0x4030, 0x3200, 0x480C, 0x12AB, 0x403C, 0x0028, 0x4210, 0x153E, +0x12B0, 0x396C, 0xC232, 0x4303, 0x4130, 0x431C, 0x4210, 0x153E, 0x9392, +0x1706, 0x2006, 0x421F, 0x2558, 0xC2DF, 0x2552, 0x0000, 0x4130, 0x421F, +0x170A, 0xD3DF, 0x0000, 0x4130, 0x9392, 0x1706, 0x2002, 0x4030, 0x393C, +0x421F, 0x170A, 0xC3DF, 0x0000, 0x4130, 0x12B0, 0x39CC, 0xD2F2, 0x0031, +0x4130, 0x12B0, 0x39CC, 0xD3D2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, +0xC2F2, 0x0031, 0x4303, 0x4130, 0x934C, 0x2403, 0xD3E2, 0x0031, 0x4130, +0xC3E2, 0x0031, 0x4130, 0x120D, 0x120C, 0x8221, 0x12B0, 0x3B4A, 0x12B0, +0x3B54, 0x41D2, 0x0007, 0x007F, 0x12B0, 0x3B2C, 0x403F, 0x007E, 0x4FE1, +0x0003, 0x4DC2, 0x007F, 0x12B0, 0x3B2C, 0x4FE1, 0x0002, 0x41D2, 0x0005, +0x007F, 0x12B0, 0x3B34, 0x2803, 0x12B0, 0x3D48, 0x3C02, 0x12B0, 0x3D5E, +0x12B0, 0x3DF0, 0x411D, 0x0002, 0x5231, 0x4130, 0x4CC2, 0x1769, 0x42B2, +0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x263D, 0x01EA, 0x40B2, 0x2655, +0x01F2, 0x3C06, 0x40B2, 0x2635, 0x01EA, 0x40B2, 0x2651, 0x01F2, 0x12B0, +0x3E70, 0x12B0, 0x3E32, 0xF0F2, 0x00F1, 0x0033, 0xB35C, 0x2803, 0x12B0, +0x3D48, 0x3C02, 0x12B0, 0x3D5E, 0x12B0, 0x3EAA, 0x425C, 0x007E, 0xB2E2, +0x0030, 0x7E4E, 0x535E, 0xD392, 0x01F0, 0x5C4C, 0xDE4C, 0x4130, 0x120F, +0x120E, 0x120D, 0x120C, 0x8231, 0x12B0, 0x3B4A, 0x4381, 0x0004, 0x4381, +0x0006, 0x12B0, 0x3B54, 0x41D2, 0x000F, 0x007F, 0x12B0, 0x3B2C, 0x403F, +0x007E, 0x4FE1, 0x0007, 0x41D2, 0x000E, 0x007F, 0x12B0, 0x3B2C, 0x4FE1, +0x0006, 0x41D2, 0x000D, 0x007F, 0x12B0, 0x3B2C, 0x4FE1, 0x0005, 0x4EC2, +0x007F, 0x12B0, 0x3B2C, 0x4FE1, 0x0004, 0x41D2, 0x000B, 0x007F, 0x12B0, +0x3B2C, 0x4FE1, 0x0003, 0x4DC2, 0x007F, 0x12B0, 0x3B2C, 0x4FE1, 0x0002, +0x41D2, 0x0009, 0x007F, 0x12B0, 0x3B34, 0x2803, 0x12B0, 0x3D48, 0x3C02, +0x12B0, 0x3D5E, 0x12B0, 0x3D88, 0x410F, 0x530F, 0x4F3C, 0x4F3D, 0x4F3E, +0x4F3F, 0x5031, 0x0010, 0x4130, 0xB3D2, 0x0079, 0x2BFD, 0x4130, 0xB3D2, +0x0079, 0x2BFD, 0x4FE1, 0x0003, 0x12B0, 0x3E38, 0x4F6E, 0x12B0, 0x3DE0, +0x4130, 0x4381, 0x0002, 0x4381, 0x0004, 0x4130, 0x12B0, 0x3E4A, 0xD0F2, +0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x4130, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x120F, 0x120E, 0x120D, 0x120C, +0x8221, 0x411F, 0x001E, 0x4F81, 0x0002, 0x4347, 0xF31F, 0x4F81, 0x0000, +0x4191, 0x0020, 0x0020, 0x410F, 0x522F, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, +0x12B0, 0x3A92, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, 0x108F, 0x4F46, 0xF036, +0x00C7, 0xB226, 0x2804, 0x12B0, 0x3CB8, 0x480C, 0x3C75, 0x9076, 0x0083, +0x2003, 0x4077, 0x002A, 0x3C53, 0xB036, 0x0040, 0x2806, 0x464E, 0xF07E, +0x00C0, 0x907E, 0x00C0, 0x2066, 0x9076, 0x0081, 0x2003, 0x12B0, 0x3CB8, +0x3C3F, 0x464E, 0xF07E, 0x00C3, 0x935E, 0x2404, 0x934E, 0x2402, 0x936E, +0x2023, 0x9381, 0x0000, 0x2454, 0x90B1, 0x0021, 0x0020, 0x2850, 0x407C, +0x0054, 0x12B0, 0x3A34, 0x430C, 0x430D, 0x12B0, 0x39E6, 0x4C04, 0x4D05, +0xD035, 0x0200, 0x450D, 0x12B0, 0x39E6, 0xF035, 0xFDFF, 0x440C, 0x450D, +0x12B0, 0x39E6, 0x12B0, 0x3CB8, 0x412F, 0x533F, 0x4F81, 0x0000, 0x3C18, +0x9076, 0x0003, 0x2413, 0x9076, 0x0082, 0x2410, 0x9076, 0x0080, 0x240D, +0x464E, 0xF07E, 0x00C0, 0x907E, 0x00C0, 0x2407, 0x9346, 0x2405, 0x9366, +0x2403, 0x4077, 0x003A, 0x3C02, 0x4077, 0x001A, 0x9381, 0x0002, 0x2417, +0x411F, 0x0002, 0x533F, 0x4F81, 0x0002, 0x9077, 0x003A, 0x2786, 0x9077, +0x002A, 0x2783, 0x9076, 0x0082, 0x2407, 0x9076, 0x0080, 0x2404, 0x9346, +0x2402, 0x9366, 0x2002, 0x12B0, 0x3CB8, 0x480C, 0x490D, 0x4A0E, 0x4B0F, +0x5031, 0x000C, 0x4030, 0xD316, 0x407C, 0x0046, 0x4030, 0x3A34, 0x120D, +0x120C, 0x8221, 0x12B0, 0x3B4A, 0x12B0, 0x3E4A, 0xB27D, 0x12B0, 0x3D50, +0x12B0, 0x3D68, 0x4EC1, 0x0002, 0xB26D, 0x12B0, 0x3D50, 0x12B0, 0x3D68, +0x415F, 0x0002, 0x5F4F, 0xDE4F, 0x4FC1, 0x0002, 0xB36D, 0x12B0, 0x3D50, +0x12B0, 0x3D7A, 0xB35D, 0x12B0, 0x3D50, 0x12B0, 0x3D7A, 0x12B0, 0x3B58, +0x41D2, 0x0005, 0x007F, 0x12B0, 0x3DCA, 0x2803, 0x12B0, 0x3D48, 0x3C02, +0x12B0, 0x3D5E, 0x12B0, 0x3D88, 0x412F, 0x4F0C, 0x411D, 0x0002, 0xC312, +0x100D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, +0xF03D, 0x000F, 0x5231, 0x4130, 0xD0F2, 0x0003, 0x0031, 0x4130, 0x2803, +0xD3E2, 0x0031, 0x4130, 0xC3E2, 0x0031, 0x4130, 0xC3E2, 0x0031, 0xD3D2, +0x0031, 0x4130, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, +0x535E, 0x4130, 0x12B0, 0x3D68, 0x5F4F, 0xDE4F, 0x4FC1, 0x0004, 0x4130, +0x12B0, 0x3D8E, 0x4130, 0x12B0, 0x3D68, 0xD15E, 0x0004, 0x4EC1, 0x0004, +0xD392, 0x01F0, 0x4130, 0x120C, 0x8321, 0x4381, 0x0000, 0x12B0, 0x3B54, +0x41D2, 0x0003, 0x007F, 0x12B0, 0x3DCA, 0x2803, 0x12B0, 0x3D48, 0x3C02, +0x12B0, 0x3D5E, 0x12B0, 0x3DF0, 0x5221, 0x4130, 0xB3D2, 0x0079, 0x2BFD, +0x42D1, 0x007E, 0x0003, 0x12B0, 0x3E38, 0x425E, 0x007E, 0x3EB2, 0x5E4E, +0x4EC1, 0x0004, 0xF0F2, 0x00F1, 0x0033, 0xB31C, 0x4130, 0x12B0, 0x3D8E, +0x411C, 0x0002, 0x4130, 0x12B0, 0x3E4A, 0x12B0, 0x3E32, 0x425E, 0x007E, +0x5E4E, 0xF0F2, 0x00F1, 0x0033, 0xB35C, 0x2803, 0x12B0, 0x3D48, 0x3C02, +0x12B0, 0x3D5E, 0x12B0, 0x3EAA, 0xB2E2, 0x0030, 0x7F4F, 0x535F, 0xD392, +0x01F0, 0xDF4E, 0x4E4C, 0x4130, 0xD0F2, 0x000E, 0x0033, 0xC0F2, 0x0010, +0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4130, 0x40B2, 0x0006, +0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x264B, 0x01EA, 0x40B2, 0x2655, +0x01F2, 0x3C06, 0x40B2, 0x2645, 0x01EA, 0x40B2, 0x2651, 0x01F2, 0xD0B2, +0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, 0x4130, 0xD3E2, +0x0031, 0xD3D2, 0x0031, 0xD2F2, 0x0031, 0x12B0, 0x3EA2, 0x12B0, 0x3EA2, +0xC3D2, 0x0031, 0x12B0, 0x3EAA, 0x430C, 0x4130, 0x12B0, 0x3EAA, 0x12B0, +0x3EAA, 0xC2F2, 0x0031, 0x4030, 0x39B8, 0x120A, 0x120B, 0x4C0A, 0x4D0B, +0x4C0F, 0xDD0F, 0x930F, 0x240D, 0x435C, 0x12B0, 0xC9CA, 0x434C, 0x1292, +0x1726, 0x4303, 0x533A, 0x633B, 0x4A0F, 0xDB0F, 0x930F, 0x23F3, 0x413B, +0x413A, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0x4C0F, 0xDD0F, 0x930F, +0x240D, 0x435C, 0x1292, 0x1726, 0x4303, 0x434C, 0x12B0, 0xC9CA, 0x533A, +0x633B, 0x4A0F, 0xDB0F, 0x930F, 0x23F3, 0x3FE7, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x120C, 0x8031, 0x0036, 0x4381, +0x0006, 0x4381, 0x000C, 0x4381, 0x000A, 0x40B1, 0x0BB8, 0x0004, 0x4381, +0x0000, 0x403A, 0x1726, 0x403B, 0x1718, 0x4038, 0x1712, 0x4074, 0x0042, +0x4075, 0x0021, 0x4037, 0x2401, 0x4079, 0x00C8, 0x4076, 0x0082, 0xB31C, +0x2940, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD9A6, 0x2404, 0x403C, 0xFFFE, +0x4030, 0x43DE, 0x403C, 0x15FA, 0x12B0, 0xD9A6, 0x2404, 0x403C, 0xFFFD, +0x4030, 0x43DE, 0x403C, 0x1600, 0x12B0, 0xD9A6, 0x2404, 0x403C, 0xFFFC, +0x4030, 0x43DE, 0x403C, 0x15F6, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, +0x2404, 0x403C, 0xFFFB, 0x4030, 0x43DE, 0x403C, 0x15F2, 0x421F, 0x16F4, +0x129F, 0x0018, 0x930C, 0x2404, 0x403C, 0xFFFA, 0x4030, 0x43DE, 0x403C, +0x15FE, 0x12B0, 0xD9A6, 0x2404, 0x403C, 0xFFF9, 0x4030, 0x43DE, 0x403C, +0x15FC, 0x12B0, 0xD9DE, 0x240A, 0x403C, 0x1604, 0x12B0, 0xD9DE, 0x2405, +0x403C, 0x1602, 0x12B0, 0xD9DE, 0x2003, 0x403C, 0xFFF8, 0x3DF1, 0x464C, +0x12A8, 0x403C, 0x4030, 0x12B0, 0x7E9E, 0x403C, 0x0C04, 0x12B0, 0x7E9E, +0x12B0, 0x7EA0, 0x435C, 0x12AA, 0x412F, 0x5F0F, 0x4F81, 0x0008, 0x421F, +0x1600, 0x511F, 0x0008, 0x4F81, 0x0002, 0x12B0, 0x7F9E, 0x411C, 0x0002, +0x12B0, 0x7EC8, 0x4C81, 0x0002, 0x12B0, 0x7F82, 0x411F, 0x0008, 0x419F, +0x0002, 0x1592, 0x412F, 0x531F, 0x4F81, 0x0000, 0x903F, 0x0030, 0x3BE0, +0x12B0, 0x7F50, 0x403C, 0x4582, 0x12B0, 0x7FDC, 0x41A2, 0x1606, 0x12B0, +0x7F50, 0x403C, 0x4682, 0x12B0, 0x7FDC, 0x41A2, 0x1608, 0x12B0, 0x7F50, +0x403C, 0x4982, 0x12B0, 0x7FDC, 0x41A2, 0x160A, 0x12B0, 0x7F50, 0x403C, +0x4882, 0x12B0, 0x7FDC, 0x41A2, 0x160C, 0x12B0, 0x7F50, 0x403C, 0x4A82, +0x12B0, 0x7FDC, 0x41A2, 0x160E, 0x12B0, 0x7F50, 0x403C, 0x4B82, 0x12B0, +0x7FDC, 0x41A2, 0x1610, 0x12B0, 0x7F50, 0x403C, 0x4C82, 0x12B0, 0x7FDC, +0x41A2, 0x1612, 0x12B0, 0x7F9E, 0x403C, 0x0128, 0x12B0, 0x7FAE, 0x41A2, +0x1614, 0x12B0, 0x7F9E, 0x403C, 0x012A, 0x12B0, 0x7FAE, 0x41A2, 0x1616, +0x12B0, 0x7FA4, 0xE0B2, 0x3300, 0x1614, 0xE0B2, 0x3300, 0x1616, 0x412F, +0xE03F, 0x3300, 0x4F82, 0x1618, 0x12B0, 0x7F1E, 0x12B0, 0x7EC2, 0x403C, +0xA544, 0x12B0, 0x7F7C, 0x4291, 0x15FC, 0x0000, 0x12B0, 0x7F3E, 0x12B0, +0x7F7C, 0x12B0, 0x7FA4, 0x91E2, 0x15FC, 0x240A, 0x421F, 0x15FC, 0xD03F, +0x0040, 0x4F81, 0x0000, 0x12B0, 0x7F3E, 0x12B0, 0x7F7C, 0x410C, 0x503C, +0x000E, 0x403E, 0x0007, 0x12B0, 0xD496, 0x4291, 0x15F6, 0x000E, 0x4291, +0x15F2, 0x0010, 0x4291, 0x15FE, 0x0012, 0x4291, 0x15FC, 0x0014, 0x4291, +0x1604, 0x0018, 0x4291, 0x1602, 0x001A, 0x410C, 0x503C, 0x000E, 0x12B0, +0xA122, 0x12B0, 0x7F50, 0x403C, 0x4032, 0x12B0, 0x7ECE, 0x430C, 0x12B0, +0x7F5E, 0x421F, 0x16CA, 0xD21F, 0x16CC, 0x930F, 0x240B, 0x9382, 0x16CE, +0x2408, 0x407C, 0x0090, 0x12A8, 0x403C, 0x0088, 0x12AB, 0x431C, 0x12AB, +0x4291, 0x1600, 0x0000, 0x12B0, 0x7EF4, 0x12B0, 0x7EA8, 0x503F, 0x0020, +0x9F0C, 0x2806, 0x421F, 0x1600, 0x503F, 0x0026, 0x9C0F, 0x2C03, 0x9381, +0x0004, 0x23F1, 0x421C, 0x1600, 0x12B0, 0xA3BE, 0x421F, 0x15F2, 0xD21F, +0x15F4, 0x930F, 0x248E, 0x9381, 0x0006, 0x208B, 0x9381, 0x0004, 0x248E, +0x421F, 0x1600, 0x503F, 0x0060, 0x4F81, 0x0002, 0x421C, 0x15F2, 0x421D, +0x15F4, 0x5C0C, 0x6D0D, 0x421E, 0x15FA, 0x2003, 0x9E0C, 0x2C01, 0x4C0E, +0x5F0E, 0x4E81, 0x0000, 0x12B0, 0x7EDA, 0x494C, 0x12A8, 0x403C, 0x2408, +0x12AB, 0x3C17, 0x410C, 0x503C, 0x000A, 0x12B0, 0xD9BE, 0x4C81, 0x0006, +0x407C, 0x00C1, 0x12A8, 0x411C, 0x0002, 0x12B0, 0x7EC2, 0x411C, 0x000A, +0x12B0, 0x7E9E, 0x411F, 0x0002, 0x532F, 0x4F81, 0x0002, 0x91A1, 0x0002, +0x2C03, 0x9381, 0x0006, 0x27E3, 0x12B0, 0x7F82, 0x411F, 0x0002, 0x821F, +0x1600, 0x503F, 0xFFA0, 0xC312, 0x100F, 0x4F81, 0x0008, 0x12B0, 0x7F50, +0x403C, 0x4036, 0x12B0, 0x7ECE, 0x411C, 0x0008, 0x12B0, 0x7F5E, 0x4291, +0x15F6, 0x0000, 0x12B0, 0x7F50, 0x403C, 0x4035, 0x12B0, 0x7ECE, 0x412C, +0x12B0, 0x7F5E, 0x411E, 0x0008, 0x5E0E, 0x5E82, 0x15F6, 0x6382, 0x15F8, +0x411E, 0x0008, 0x8E82, 0x15F2, 0x7382, 0x15F4, 0x421F, 0x1600, 0x503F, +0x0028, 0x4F81, 0x0000, 0x12B0, 0x7EF4, 0x40B1, 0x0BB8, 0x0004, 0x12B0, +0x7EA8, 0x503F, 0x005C, 0x9F0C, 0x2403, 0x9381, 0x0004, 0x23F7, 0x421C, +0x1600, 0x12B0, 0xA3BE, 0x9381, 0x0004, 0x2370, 0x40B1, 0xFFF7, 0x0006, +0x3C06, 0xB3A1, 0x0036, 0x2C03, 0x9391, 0x0006, 0x2458, 0x410C, 0x503C, +0x001C, 0x403E, 0x256A, 0x423D, 0x12B0, 0xD3B6, 0x410F, 0x503F, 0x0024, +0x120F, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x001E, 0x4214, 0x16F4, +0x1294, 0x000E, 0x403C, 0x0003, 0x1292, 0x1194, 0x410C, 0x503C, 0x0026, +0x421F, 0x16F4, 0x129F, 0x0010, 0x403C, 0x1606, 0x12B0, 0xA122, 0x4214, +0x1614, 0x12B0, 0x7EDA, 0x12B0, 0x7F2C, 0x403C, 0x0128, 0x12B0, 0x7F76, +0x4214, 0x1616, 0x12B0, 0x7F1E, 0x12B0, 0x7F76, 0x4214, 0x1618, 0x12B0, +0x7F72, 0x12B0, 0x7F9E, 0x403C, 0x012C, 0x12B0, 0x7EC8, 0x4C44, 0x12B0, +0x7F82, 0x5321, 0x94C2, 0x1618, 0x2406, 0x4214, 0x1618, 0xD034, 0x0040, +0x12B0, 0x7F72, 0xB3A1, 0x0036, 0x2806, 0x430C, 0x421F, 0x16F4, 0x129F, +0x0008, 0x3C0F, 0x9391, 0x0006, 0x2009, 0x407C, 0x0091, 0x421F, 0x16F4, +0x129F, 0x0012, 0x4381, 0x0006, 0x3C03, 0x40B1, 0xFFF6, 0x0006, 0x411C, +0x0006, 0x5031, 0x0038, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x1207, 0x1204, 0x1205, 0x120C, 0x8031, 0x0046, 0x4381, 0x0006, +0x4381, 0x000E, 0x4381, 0x000C, 0x40B1, 0x0BB8, 0x0004, 0x4037, 0x1716, +0x403A, 0x1726, 0x403B, 0x1718, 0x4038, 0x1712, 0x4075, 0x0021, 0x4079, +0x00C8, 0x4076, 0x0082, 0x4074, 0x0088, 0xB31C, 0x292D, 0x410C, 0x503C, +0x000E, 0x12B0, 0xDA0E, 0x2403, 0x403C, 0xFFFE, 0x3DFE, 0x403C, 0x1624, +0x12B0, 0xDA0E, 0x2403, 0x403C, 0xFFFD, 0x3DF6, 0x403C, 0x162A, 0x12B0, +0xDA0E, 0x2403, 0x403C, 0xFFFC, 0x3DEE, 0x403C, 0x1620, 0x421F, 0x16F4, +0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3DE3, 0x403C, 0x161A, +0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, 0x3DD8, +0x403C, 0x1628, 0x12B0, 0xDA0E, 0x2403, 0x403C, 0xFFF9, 0x3DD0, 0x403C, +0x1626, 0x12B0, 0xDA86, 0x240A, 0x403C, 0x162E, 0x12B0, 0xDA86, 0x2405, +0x403C, 0x162C, 0x12B0, 0xDA86, 0x2003, 0x403C, 0xFFF8, 0x3DBE, 0x12B0, +0x6F1E, 0x403C, 0x0560, 0x12B0, 0x6FD4, 0x4E82, 0x1630, 0x4F82, 0x1632, +0x12B0, 0x6F1E, 0x403C, 0x0660, 0x12B0, 0x6FB4, 0x4E82, 0x1634, 0x4F82, +0x1636, 0x12B0, 0x6F1E, 0x403C, 0x0960, 0x12B0, 0x6FD4, 0x4E82, 0x1638, +0x4F82, 0x163A, 0x12B0, 0x6F1E, 0x403C, 0x0860, 0x12B0, 0x6FB4, 0x4E82, +0x163C, 0x4F82, 0x163E, 0x12B0, 0x6F1E, 0x403C, 0x0A60, 0x12B0, 0x6FD4, +0x4E82, 0x1640, 0x4F82, 0x1642, 0x12B0, 0x6F1E, 0x403C, 0x0B60, 0x12B0, +0x6FB4, 0x4E82, 0x1644, 0x4F82, 0x1646, 0x12B0, 0x6F1E, 0x403C, 0x0C60, +0x12B0, 0x6FD4, 0x4E82, 0x1648, 0x4F82, 0x164A, 0x12B0, 0x6F36, 0x403C, +0x0128, 0x12B0, 0x708E, 0x41A2, 0x164C, 0x12B0, 0x6F36, 0x403C, 0x012A, +0x12B0, 0x708E, 0x41A2, 0x164E, 0x12B0, 0x708A, 0xE0B2, 0x3300, 0x164C, +0xE0B2, 0x3300, 0x164E, 0x412F, 0xE03F, 0x3300, 0x4F82, 0x1650, 0x12B0, +0x6F2C, 0x427C, 0x12A7, 0x12B0, 0x6F3A, 0x403C, 0x012A, 0x12B0, 0xDB30, +0x403C, 0xA544, 0x12AB, 0x435C, 0x12AA, 0x12B0, 0x7096, 0x4291, 0x1626, +0x0000, 0x12B0, 0x6F82, 0x12B0, 0x7096, 0x12B0, 0x708A, 0x91E2, 0x1626, +0x240A, 0x421F, 0x1626, 0xD03F, 0x0040, 0x4F81, 0x0000, 0x12B0, 0x6F82, +0x12B0, 0x7096, 0x410C, 0x503C, 0x0018, 0x403E, 0x000E, 0x12B0, 0xD496, +0x4291, 0x1620, 0x0018, 0x4291, 0x1622, 0x001A, 0x4291, 0x161A, 0x001C, +0x4291, 0x161C, 0x001E, 0x4291, 0x1628, 0x0020, 0x4381, 0x0022, 0x4291, +0x1626, 0x0024, 0x4381, 0x0026, 0x4291, 0x162E, 0x002C, 0x4381, 0x002E, +0x4291, 0x162C, 0x0030, 0x4381, 0x0032, 0x410C, 0x503C, 0x0018, 0x12B0, +0x9BB0, 0x12B0, 0xD7EA, 0x12B0, 0x6F64, 0x460C, 0x12B0, 0x6F60, 0x430C, +0x12B0, 0x6FA2, 0x4291, 0x162A, 0x0008, 0x12B0, 0x7056, 0x494C, 0x12A8, +0x403C, 0x0401, 0x12AB, 0x454C, 0x12A8, 0x407C, 0x00A8, 0x12A8, 0x12B0, +0x7030, 0x503E, 0x0022, 0x430F, 0x930D, 0x2002, 0x9E0C, 0x2809, 0x421E, +0x162A, 0x503E, 0x002C, 0x9D0F, 0x2803, 0x2005, 0x9C0E, 0x2C03, 0x9381, +0x0004, 0x23EB, 0x421F, 0x161A, 0xD21F, 0x161C, 0x930F, 0x2491, 0x9381, +0x0006, 0x208E, 0x9381, 0x0004, 0x248B, 0x421F, 0x162A, 0x503F, 0x006C, +0x4F81, 0x0002, 0x421C, 0x161A, 0x421D, 0x161C, 0x5C0C, 0x6D0D, 0x421E, +0x1624, 0x2003, 0x9E0C, 0x2C01, 0x4C0E, 0x5F0E, 0x4E81, 0x0000, 0x421E, +0x162A, 0x503E, 0x0068, 0x12B0, 0x7052, 0x12B0, 0x6F2C, 0x423C, 0x12AB, +0x3C16, 0x410C, 0x503C, 0x000C, 0x12B0, 0xDA3E, 0x4C81, 0x0006, 0x12B0, +0x6F3A, 0x411C, 0x0002, 0x12B0, 0xDB30, 0x411C, 0x000C, 0x12B0, 0x6F56, +0x411F, 0x0002, 0x532F, 0x4F81, 0x0002, 0x91A1, 0x0002, 0x2C03, 0x9381, +0x0006, 0x27E4, 0x12B0, 0x7096, 0x411F, 0x0002, 0x821F, 0x162A, 0x503F, +0xFF94, 0xC312, 0x100F, 0x4F81, 0x0000, 0x12B0, 0xD7EA, 0x12B0, 0x6F64, +0x403C, 0x0086, 0x12B0, 0x6F60, 0x412C, 0x12B0, 0x6FA2, 0x4291, 0x1620, +0x0008, 0x4291, 0x1622, 0x000A, 0x12B0, 0xD7EA, 0x12B0, 0x6F64, 0x411C, +0x0008, 0x411D, 0x000A, 0x12B0, 0xD4B4, 0x12B0, 0x6F60, 0x411C, 0x0008, +0x12B0, 0x6FA2, 0x412E, 0x5E0E, 0x5E82, 0x1620, 0x6382, 0x1622, 0x412E, +0x8E82, 0x161A, 0x7382, 0x161C, 0x421E, 0x162A, 0x503E, 0x002E, 0x12B0, +0x7052, 0x407C, 0x00A8, 0x12A8, 0x40B1, 0x0BB8, 0x0004, 0x12B0, 0x7030, +0x503E, 0x0068, 0x9E0C, 0x2002, 0x930D, 0x276C, 0x930F, 0x276A, 0x3FF5, +0xB3A1, 0x0046, 0x281B, 0x410C, 0x503C, 0x0010, 0x403E, 0x2572, 0x12B0, +0xD4C2, 0x120F, 0x12B0, 0xD222, 0x12B0, 0x709C, 0x5321, 0x91E2, 0x1650, +0x2404, 0x12B0, 0x6F6C, 0x12B0, 0x7096, 0x421C, 0x161E, 0x421F, 0x16F4, +0x129F, 0x0008, 0x3C23, 0x9391, 0x0006, 0x2009, 0x407C, 0x0091, 0x421F, +0x16F4, 0x129F, 0x0012, 0x4381, 0x0006, 0x3C17, 0x410C, 0x503C, 0x0010, +0x403E, 0x257A, 0x12B0, 0xD4C2, 0x120F, 0x12B0, 0xD222, 0x12B0, 0x709C, +0x5321, 0x91E2, 0x1650, 0x2404, 0x12B0, 0x6F6C, 0x12B0, 0x7096, 0x40B1, +0xFFF6, 0x0006, 0x411C, 0x0006, 0x5031, 0x0048, 0x4030, 0xD316, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x120C, 0x8031, +0x0036, 0x4381, 0x0004, 0x4381, 0x000C, 0x4381, 0x000A, 0x40B1, 0x0BB8, +0x0002, 0x403A, 0x1726, 0x403B, 0x1718, 0x4038, 0x1712, 0x4074, 0x0021, +0x4037, 0x2401, 0x4075, 0x0042, 0x4079, 0x0082, 0x4076, 0x00C8, 0xB31C, +0x291D, 0x410C, 0x503C, 0x000C, 0x12B0, 0xDAEE, 0x2403, 0x403C, 0xFFFE, +0x3DEE, 0x403C, 0x1572, 0x12B0, 0xDAEE, 0x2403, 0x403C, 0xFFFD, 0x3DE6, +0x403C, 0x1578, 0x12B0, 0xDAEE, 0x2403, 0x403C, 0xFFFC, 0x3DDE, 0x403C, +0x156E, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFB, +0x3DD3, 0x403C, 0x1568, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, +0x403C, 0xFFFA, 0x3DC8, 0x403C, 0x1576, 0x12B0, 0xDAEE, 0x2403, 0x403C, +0xFFF9, 0x3DC0, 0x403C, 0x1574, 0x12B0, 0xDAFE, 0x240A, 0x403C, 0x157C, +0x12B0, 0xDAFE, 0x2405, 0x403C, 0x157A, 0x12B0, 0xDAFE, 0x2003, 0x403C, +0xFFF8, 0x3DAE, 0x12B0, 0x79F0, 0x403C, 0x4582, 0x12B0, 0x78EC, 0x41A2, +0x157E, 0x12B0, 0x79F0, 0x403C, 0x4682, 0x12B0, 0x78EC, 0x41A2, 0x1580, +0x12B0, 0x79F0, 0x403C, 0x4982, 0x12B0, 0x78EC, 0x41A2, 0x1582, 0x12B0, +0x79F0, 0x403C, 0x4882, 0x12B0, 0x78EC, 0x41A2, 0x1584, 0x12B0, 0x79F0, +0x403C, 0x4A82, 0x12B0, 0x78EC, 0x41A2, 0x1586, 0x12B0, 0x79F0, 0x403C, +0x4B82, 0x12B0, 0x78EC, 0x41A2, 0x1588, 0x12B0, 0x79F0, 0x403C, 0x4C82, +0x12B0, 0x78EC, 0x41A2, 0x158A, 0x12B0, 0x78AE, 0x403C, 0x0128, 0x12B0, +0x7922, 0x41A2, 0x158C, 0x12B0, 0x78AE, 0x403C, 0x012A, 0x12B0, 0x7922, +0x41A2, 0x158E, 0x12B0, 0x791E, 0xE0B2, 0x3300, 0x158C, 0xE0B2, 0x3300, +0x158E, 0x412F, 0xE03F, 0x3300, 0x4F82, 0x1590, 0x12B0, 0xCF58, 0x12B0, +0x79BE, 0x12B0, 0x78B2, 0x403C, 0x012A, 0x12B0, 0x799E, 0x403C, 0xA544, +0x12B0, 0x78D6, 0x12B0, 0x792A, 0x4291, 0x1574, 0x0000, 0x12B0, 0x78CC, +0x12B0, 0x792A, 0x12B0, 0x791E, 0x91E2, 0x1574, 0x240A, 0x421F, 0x1574, +0xD03F, 0x0040, 0x4F81, 0x0000, 0x12B0, 0x78CC, 0x12B0, 0x792A, 0x410C, +0x503C, 0x0016, 0x403E, 0x0007, 0x12B0, 0xD496, 0x4291, 0x156E, 0x0016, +0x4291, 0x1568, 0x0018, 0x4291, 0x1576, 0x001A, 0x4291, 0x1574, 0x001C, +0x4291, 0x157C, 0x0020, 0x4291, 0x157A, 0x0022, 0x410C, 0x503C, 0x0016, +0x12B0, 0xA042, 0x12B0, 0x79F0, 0x403C, 0x4032, 0x12B0, 0xD920, 0x430C, +0x12B0, 0xD64A, 0x12B0, 0x7A30, 0x421F, 0x16CA, 0xD21F, 0x16CC, 0x930F, +0x240B, 0x9382, 0x16CE, 0x2408, 0x407C, 0x0090, 0x12A8, 0x403C, 0x0088, +0x12AB, 0x431C, 0x12AB, 0x4291, 0x1578, 0x0000, 0x12B0, 0x79FA, 0x435C, +0x12B0, 0xDAE0, 0x403C, 0x0401, 0x12AB, 0x444C, 0x12A8, 0x407C, 0x00A8, +0x12A8, 0x12B0, 0xCEC4, 0x503F, 0x0020, 0x9F0C, 0x2806, 0x421F, 0x1578, +0x503F, 0x0026, 0x9C0F, 0x2C03, 0x9381, 0x0002, 0x23F1, 0x421F, 0x1568, +0xD21F, 0x156A, 0x930F, 0x2491, 0x9381, 0x0004, 0x208E, 0x9381, 0x0002, +0x248B, 0x421F, 0x1578, 0x503F, 0x0060, 0x4F81, 0x0006, 0x421C, 0x1568, +0x421D, 0x156A, 0x5C0C, 0x6D0D, 0x421E, 0x1572, 0x2003, 0x9E0C, 0x2C01, +0x4C0E, 0x5F0E, 0x4E81, 0x0008, 0x421F, 0x1578, 0x503F, 0x005C, 0x12B0, +0x79F6, 0x12B0, 0xCF58, 0x464C, 0x12A8, 0x403C, 0x2408, 0x12AB, 0x3C18, +0x410C, 0x503C, 0x000A, 0x12B0, 0xDAF6, 0x4C81, 0x0004, 0x12B0, 0x78B2, +0x411C, 0x0006, 0x12B0, 0x799E, 0x411C, 0x000A, 0x12B0, 0x78D6, 0x434C, +0x12AA, 0x411F, 0x0006, 0x532F, 0x4F81, 0x0006, 0x9191, 0x0008, 0x0006, +0x2C03, 0x9381, 0x0004, 0x27E1, 0x12B0, 0x792A, 0x411F, 0x0006, 0x821F, +0x1578, 0x503F, 0xFFA0, 0xC312, 0x100F, 0x4F81, 0x0008, 0x12B0, 0x79F0, +0x403C, 0x4036, 0x12B0, 0xD920, 0x411C, 0x0008, 0x12B0, 0xD64A, 0x12B0, +0x7A30, 0x4291, 0x156E, 0x0000, 0x12B0, 0x79F0, 0x403C, 0x4035, 0x12B0, +0xD920, 0x412C, 0x12B0, 0xD64A, 0x12B0, 0x7A30, 0x411E, 0x0008, 0x5E0E, +0x5E82, 0x156E, 0x6382, 0x1570, 0x411E, 0x0008, 0x8E82, 0x1568, 0x7382, +0x156A, 0x421F, 0x1578, 0x503F, 0x0028, 0x12B0, 0x79F6, 0x407C, 0x00A8, +0x12A8, 0x40B1, 0x0BB8, 0x0002, 0x12B0, 0xCEC4, 0x503F, 0x005C, 0x9F0C, +0x276D, 0x9381, 0x0002, 0x276A, 0x3FF6, 0xB3A1, 0x0036, 0x281B, 0x410C, +0x503C, 0x000E, 0x403E, 0x255A, 0x12B0, 0xD4A6, 0x120F, 0x12B0, 0xD20E, +0x12B0, 0x7930, 0x5321, 0x91E2, 0x1590, 0x2404, 0x12B0, 0x78B8, 0x12B0, +0x792A, 0x421C, 0x156C, 0x421F, 0x16F4, 0x129F, 0x0008, 0x3C23, 0x9391, +0x0004, 0x2009, 0x407C, 0x0091, 0x421F, 0x16F4, 0x129F, 0x0012, 0x4381, +0x0004, 0x3C17, 0x410C, 0x503C, 0x000E, 0x403E, 0x2562, 0x12B0, 0xD4A6, +0x120F, 0x12B0, 0xD20E, 0x12B0, 0x7930, 0x5321, 0x91E2, 0x1590, 0x2404, +0x12B0, 0x78B8, 0x12B0, 0x792A, 0x40B1, 0xFFF6, 0x0004, 0x411C, 0x0004, +0x5031, 0x0038, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x1207, 0x1204, 0x1205, 0x120C, 0x8031, 0x003A, 0x4381, 0x0012, 0x4381, +0x0014, 0x4381, 0x0016, 0x4381, 0x0010, 0x4381, 0x000E, 0x4306, 0x403A, +0x1726, 0x403B, 0x1718, 0x4038, 0x1712, 0x4039, 0x16F4, 0xB31C, 0x28B7, +0x410C, 0x503C, 0x0012, 0x12B0, 0xD7A4, 0x2403, 0x403C, 0xFFFE, 0x3DB0, +0x432C, 0x492F, 0x129F, 0x001C, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD7A4, +0x2403, 0x403C, 0xFFFC, 0x3DA3, 0x410C, 0x503C, 0x0014, 0x492F, 0x129F, +0x0018, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3D98, 0x403C, 0x1652, 0x492F, +0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, 0x3D8E, 0x410C, 0x503C, +0x000E, 0x12B0, 0xD7A4, 0x2403, 0x403C, 0xFFF9, 0x3D85, 0x410C, 0x503C, +0x0010, 0x492F, 0x129F, 0x0016, 0x933C, 0x2406, 0x422C, 0x492F, 0x129F, +0x001C, 0x933C, 0x2003, 0x403C, 0xFFF8, 0x3D74, 0x4191, 0x0014, 0x0018, +0x4191, 0x0016, 0x001A, 0x4291, 0x1652, 0x001C, 0x4291, 0x1654, 0x001E, +0x4191, 0x000E, 0x0020, 0x4381, 0x0022, 0x4191, 0x0010, 0x0024, 0x4381, +0x0026, 0x410C, 0x503C, 0x0018, 0x12B0, 0xBD7E, 0x4117, 0x000C, 0x407C, +0x0028, 0x12A8, 0x430C, 0x12AB, 0x12B0, 0xD6DC, 0x403C, 0x0080, 0x12AB, +0x434C, 0x12B0, 0xD9E6, 0x403C, 0x1400, 0x12B0, 0xD9C6, 0x12B0, 0xD832, +0x470C, 0x12B0, 0xD830, 0x403C, 0x4303, 0x12AB, 0x434C, 0x12AA, 0x407C, +0x0021, 0x12A8, 0x430C, 0x430D, 0x1292, 0x171A, 0x435C, 0x12B0, 0xD9E6, +0x403C, 0x0401, 0x12AB, 0x407C, 0x0021, 0x12A8, 0x407C, 0x00A8, 0x12A8, +0x4304, 0x4305, 0x403C, 0x0005, 0x12B0, 0xD2AA, 0x2003, 0x903D, 0xABAD, +0x2405, 0x9305, 0x2003, 0x9034, 0x012C, 0x2BF3, 0x9305, 0x2003, 0x9034, +0x012C, 0x2802, 0x4036, 0xFFF7, 0xB392, 0x1652, 0x280E, 0x53B2, 0x1652, +0x63B2, 0x1654, 0x4392, 0x1668, 0x3C07, 0x450C, 0x128F, 0x4C06, 0x53B2, +0x1652, 0x63B2, 0x1654, 0x4924, 0x4035, 0x166A, 0x421F, 0x1652, 0xD21F, +0x1654, 0x930F, 0x2411, 0x9306, 0x200F, 0x441F, 0x0016, 0xB392, 0x1652, +0x2BE9, 0x403C, 0x166C, 0x128F, 0x4C06, 0x421D, 0x166C, 0x452C, 0x12B0, +0xB064, 0x3FE2, 0x4037, 0x16EC, 0x9382, 0x1668, 0x241C, 0x9306, 0x201A, +0x421F, 0x1652, 0xD21F, 0x1654, 0x930F, 0x2014, 0xB3A1, 0x003A, 0x28C7, +0x450C, 0x1294, 0x0016, 0x4C06, 0x403D, 0xAAAA, 0x452C, 0x12B0, 0xB064, +0x935C, 0x2403, 0x4382, 0x1668, 0x3C06, 0x403C, 0xFFBF, 0x3CC7, 0xB3A1, +0x003A, 0x28AB, 0x4304, 0x4305, 0x403C, 0x000A, 0x12B0, 0xD2AA, 0x2003, +0x903D, 0xCAFE, 0x2405, 0x9305, 0x2003, 0x9034, 0x012C, 0x2BF3, 0x9305, +0x2003, 0x9034, 0x012C, 0x2883, 0x4036, 0xFFBF, 0x410C, 0x522C, 0x403E, +0x2582, 0x12B0, 0xD07E, 0x120F, 0x12B0, 0xD70C, 0x4924, 0x1294, 0x000E, +0x12B0, 0xD25E, 0x407C, 0x0028, 0x12A8, 0x5321, 0x907C, 0x0098, 0x2403, +0x4034, 0x018C, 0x3C02, 0x4034, 0x014C, 0x12B0, 0xD6DC, 0x403C, 0x0A60, +0x12B0, 0xCE88, 0x2403, 0x403C, 0x0FF6, 0x3C01, 0x440C, 0x12B0, 0xD578, +0x4035, 0x0501, 0x9382, 0x16EA, 0x2404, 0x12B0, 0xD9E8, 0x450C, 0x12AB, +0x4074, 0x0042, 0x12B0, 0xD718, 0x4C81, 0x0002, 0x12B0, 0xD9B6, 0x4C81, +0x0000, 0x12B0, 0xCD64, 0x411E, 0x0002, 0x412F, 0x4E82, 0x1658, 0x4F82, +0x165A, 0x407C, 0x0028, 0x12A8, 0x907C, 0x0098, 0x2403, 0x403F, 0x018C, +0x3C02, 0x403F, 0x014C, 0x4F81, 0x0000, 0x12B0, 0xD6DC, 0x403C, 0x0B60, +0x12B0, 0xCE88, 0x2403, 0x403C, 0x0FF6, 0x3C01, 0x412C, 0x12B0, 0xD578, +0x9382, 0x16EA, 0x2404, 0x12B0, 0xD9E8, 0x450C, 0x12AB, 0x12B0, 0xD718, +0x4C81, 0x0000, 0x12B0, 0xD9B6, 0x4C81, 0x0002, 0x12B0, 0xCD64, 0x412B, +0x411F, 0x0002, 0x4B82, 0x165C, 0x4F82, 0x165E, 0xDF0B, 0x930B, 0x2409, +0x90B2, 0xFFFE, 0x1658, 0x2003, 0x9382, 0x165A, 0x2402, 0x4036, 0xFFF6, +0x410C, 0x522C, 0x403E, 0x258A, 0x12B0, 0xD07E, 0x120F, 0x12B0, 0xD70C, +0x492B, 0x129B, 0x000E, 0x12B0, 0xD25E, 0x421C, 0x1656, 0x492F, 0x129F, +0x0008, 0x3C17, 0x9316, 0x2006, 0x407C, 0x0091, 0x1294, 0x0012, 0x4306, +0x3C10, 0x410C, 0x522C, 0x403E, 0x2592, 0x12B0, 0xD07E, 0x120F, 0x12B0, +0xD70C, 0x1294, 0x000E, 0x12B0, 0xD25E, 0x4036, 0xFFF6, 0x5321, 0x460C, +0x5031, 0x003C, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x1207, 0x1204, 0x1205, 0x8031, 0x0026, 0x4381, 0x0002, 0x4381, 0x0000, +0x4304, 0x4305, 0x4382, 0x167C, 0x403A, 0x1718, 0x403B, 0x1712, 0x9382, +0x16E2, 0x240F, 0x407C, 0x00F4, 0x12AB, 0x421C, 0x16E4, 0x12AA, 0xC21C, +0x16E2, 0xD21C, 0x16E8, 0x12AA, 0x403C, 0x0014, 0x1292, 0x1540, 0x4037, +0x171C, 0x421F, 0x16D2, 0xD21F, 0x16D4, 0x930F, 0x2411, 0x407C, 0x0054, +0x12AB, 0x421C, 0x16D6, 0x421D, 0x16D8, 0x12A7, 0x421C, 0x16DE, 0x421D, +0x16E0, 0x12A7, 0x403C, 0x0014, 0x1292, 0x1540, 0x407C, 0x00D0, 0x12B0, +0xACCA, 0x4078, 0x0028, 0x934C, 0x387B, 0x12B0, 0xACC8, 0xB03C, 0x0020, +0x2C76, 0x407C, 0x00B0, 0x12AB, 0x431C, 0x12B0, 0xAC80, 0x4C81, 0x0022, +0x4D81, 0x0024, 0x403C, 0x0003, 0x12B0, 0xAC80, 0x4C81, 0x001E, 0x4D81, +0x0020, 0x403C, 0x0005, 0x12B0, 0xAC80, 0x4C81, 0x001A, 0x4D81, 0x001C, +0x403C, 0x0007, 0x12B0, 0xAC80, 0x4C81, 0x0016, 0x4D81, 0x0018, 0x403C, +0x0081, 0x12B0, 0xAC80, 0x4C81, 0x0012, 0x4D81, 0x0014, 0x432C, 0x12B0, +0xAC80, 0x422C, 0x430D, 0x12A7, 0x433C, 0x403D, 0x000F, 0x12B0, 0xAC76, +0x431C, 0x430D, 0x12B0, 0xAC6C, 0x431C, 0x430D, 0x12A7, 0x403C, 0x0088, +0x430D, 0x12A7, 0x403C, 0x000E, 0x430D, 0x12A7, 0x12B0, 0xAC86, 0x4039, +0x0BB8, 0x407C, 0x00D0, 0x12B0, 0xACCA, 0x5339, 0x934C, 0x3802, 0x9309, +0x23F7, 0x407C, 0x00B0, 0x12B0, 0xAC64, 0x411C, 0x0022, 0x411D, 0x0024, +0x12A7, 0x432C, 0x430D, 0x12A7, 0x411C, 0x001E, 0x411D, 0x0020, 0x12A7, +0x422C, 0x430D, 0x12A7, 0x411C, 0x001A, 0x411D, 0x001C, 0x12B0, 0xAC76, +0x411C, 0x0016, 0x411D, 0x0018, 0x12B0, 0xAC6C, 0x411C, 0x0012, 0x411D, +0x0014, 0x12A7, 0x407C, 0x0030, 0x12AB, 0x403C, 0x0005, 0x12AA, 0x4037, +0x0032, 0x4079, 0x00C8, 0x494C, 0x12AB, 0x403C, 0x1501, 0x12AA, 0x484C, +0x12AB, 0x430C, 0x12AA, 0x5337, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, +0x9307, 0x23F6, 0x12B0, 0xAC86, 0x403C, 0x0006, 0x12AA, 0x494C, 0x12AB, +0x403C, 0x1501, 0x12B0, 0xACC6, 0x4036, 0x1726, 0xB23C, 0x2C05, 0x3C0F, +0x12B0, 0xACBE, 0x12B0, 0xACC8, 0xB23C, 0x2809, 0x440E, 0x450F, 0x5314, +0x6305, 0x930F, 0x2003, 0x903E, 0x7530, 0x2BF1, 0x484C, 0x12AB, 0x4037, +0x2710, 0x434C, 0x12A6, 0x430C, 0x12AA, 0x4C04, 0x435C, 0x12A6, 0x5337, +0xB034, 0x0100, 0x2C02, 0x9307, 0x23F3, 0x12B0, 0xACB4, 0x407C, 0x0021, +0x12AB, 0x4037, 0x171A, 0x12B0, 0xAC66, 0x4C04, 0x4D05, 0x12B0, 0xACC8, +0x4C0F, 0xF22F, 0x4F81, 0x0006, 0xB03C, 0x0020, 0x2803, 0x5034, 0xFFFE, +0x3C02, 0x5034, 0xFFFC, 0x6335, 0x9034, 0xFFFE, 0x200B, 0x12B0, 0xAC92, +0x403C, 0xFFFE, 0x12B0, 0xACDE, 0x4481, 0x000A, 0x4381, 0x000C, 0x3C04, +0x4481, 0x000A, 0x4581, 0x000C, 0x407C, 0x0030, 0x12AB, 0x403C, 0x000E, +0x12B0, 0xACC6, 0x410C, 0x532C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x410C, +0x530C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x4114, 0x0002, 0x12B0, 0xAC92, +0x440C, 0x12B0, 0xACDE, 0x4481, 0x0008, 0x444F, 0xD12F, 0x4F81, 0x0000, +0x4F81, 0x0004, 0x4114, 0x0002, 0x434C, 0x12A6, 0x494C, 0x12AB, 0x403C, +0x0500, 0x12AA, 0x12B0, 0xAC96, 0x440C, 0x430D, 0x12A7, 0x435C, 0x12A6, +0x407C, 0x00A1, 0x12AB, 0x411C, 0x0004, 0x12AA, 0x434C, 0x12A6, 0x12B0, +0xACAA, 0x12B0, 0xACF6, 0x484C, 0x12AB, 0x907C, 0x0098, 0x2403, 0x4034, +0x018C, 0x3C02, 0x4034, 0x014C, 0x434C, 0x12A6, 0x4078, 0x0082, 0x484C, +0x12B0, 0xACA4, 0x403C, 0x0260, 0x12B0, 0xACFC, 0x9382, 0x16EA, 0x2403, +0x403C, 0x0FF6, 0x3C01, 0x440C, 0x12B0, 0xACD0, 0x9382, 0x16EA, 0x2402, +0x12B0, 0xACAA, 0x12B0, 0xACA0, 0x430C, 0x12AA, 0x4C04, 0x12B0, 0xAC5C, +0x12B0, 0xAC5C, 0x9382, 0x16EA, 0x2002, 0x12B0, 0xACAA, 0x12B0, 0xAC9C, +0x4481, 0x000E, 0x434C, 0x12A6, 0x484C, 0x12B0, 0xACA4, 0x480C, 0x12B0, +0xACFC, 0x440C, 0xF03C, 0xFFE7, 0x12B0, 0xACD0, 0x435C, 0x12A6, 0x434C, +0x12A6, 0x407C, 0x0021, 0x12B0, 0xAC64, 0x435C, 0x12A6, 0x12B0, 0xACB4, +0x12B0, 0xAC9C, 0x4191, 0x0006, 0x0010, 0x403D, 0x000A, 0x410C, 0x523C, +0x421F, 0x16F4, 0x129F, 0x0006, 0x430C, 0x5031, 0x0026, 0x4030, 0xD316, +0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, +0x001E, 0x4381, 0x001A, 0x4381, 0x001C, 0x4381, 0x0000, 0x4381, 0x0002, +0x4381, 0x0014, 0x4381, 0x0016, 0x40B1, 0x0010, 0x0008, 0x4381, 0x000A, +0x4381, 0x0004, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, +0x0012, 0x410C, 0x503C, 0x001A, 0x12B0, 0xD778, 0x3403, 0x403C, 0xFFC6, +0x3D74, 0x410C, 0x530C, 0x12B0, 0xD778, 0x3806, 0x410C, 0x503C, 0x0014, +0x12B0, 0xD778, 0x3403, 0x403C, 0xFFC4, 0x3D66, 0x410C, 0x523C, 0x421F, +0x16F4, 0x129F, 0x0018, 0x4C81, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFC3, +0x3D59, 0x4124, 0x4115, 0x0002, 0x4116, 0x0014, 0x4117, 0x0016, 0x92A1, +0x001A, 0x2032, 0x9381, 0x001C, 0x202F, 0x42B1, 0x0008, 0x4381, 0x000A, +0x43C1, 0x0006, 0x440C, 0x450D, 0x460E, 0x470F, 0x415B, 0x0006, 0x12B0, +0xCC7A, 0xF31C, 0x410B, 0x503B, 0x000C, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, +0x5808, 0x6909, 0x6A0A, 0x6B0B, 0xDC08, 0x4881, 0x000C, 0x4981, 0x000E, +0x4A81, 0x0010, 0x4B81, 0x0012, 0x415E, 0x0006, 0x535E, 0x4EC1, 0x0006, +0x927E, 0x2BDC, 0x415C, 0x000C, 0x1292, 0x1712, 0x3C47, 0x4481, 0x000C, +0x4581, 0x000E, 0x4681, 0x0010, 0x4781, 0x0012, 0x411E, 0x001A, 0x411F, +0x001C, 0x930F, 0x2107, 0x903E, 0x0014, 0x2D04, 0x5E0E, 0x4E10, 0x5528, +0x5550, 0x555C, 0x555C, 0x5572, 0x54F6, 0x5594, 0x5628, 0x563E, 0x5650, +0x567A, 0x56B0, 0x56BE, 0x5564, 0x5556, 0x5588, 0x56CE, 0x56E0, 0x56F4, +0x556C, 0x5672, 0x1292, 0x170E, 0x3CED, 0x1292, 0x1710, 0x3CEA, 0x444C, +0x1292, 0x153A, 0x3CE6, 0x431C, 0x1292, 0x1550, 0x3CE2, 0x1292, 0x1562, +0x3CDF, 0x1292, 0x153C, 0x412F, 0xD11F, 0x0002, 0x930F, 0x24D8, 0x430C, +0x1292, 0x1530, 0x3CD4, 0x444C, 0x1292, 0x1714, 0x4C4C, 0x430D, 0x3C90, +0x411E, 0x0008, 0x411F, 0x000A, 0x830F, 0x2041, 0x823E, 0x240E, 0x823E, +0x2416, 0x822E, 0x2419, 0x803E, 0x000C, 0x241F, 0x803E, 0x0003, 0x242F, +0x803E, 0x001D, 0x241E, 0x3C31, 0x444C, 0x1292, 0x1716, 0x4C48, 0x4309, +0x430A, 0x430B, 0x480C, 0x490D, 0x3C4A, 0x440C, 0x1292, 0x1718, 0x4C08, +0x3FF5, 0x440C, 0x450D, 0xF03D, 0x000F, 0x1292, 0x171A, 0x4C08, 0x4D09, +0x3FED, 0x440C, 0x450D, 0x1292, 0x171C, 0x3FF8, 0x410F, 0x503F, 0x000C, +0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x1292, 0x1720, 0x4C08, 0x4D09, 0x4E0A, +0x4F0B, 0x3FDC, 0x410C, 0x503C, 0x000C, 0x1292, 0x171E, 0x3FF5, 0x403C, +0xFFC2, 0x3C89, 0x407C, 0x0054, 0x1292, 0x1712, 0x411C, 0x000C, 0x411D, +0x000E, 0x1292, 0x171C, 0x3C79, 0x407C, 0x00F4, 0x1292, 0x1712, 0x411C, +0x000C, 0x1292, 0x1718, 0x3C70, 0x407C, 0x0046, 0x1292, 0x1712, 0x430C, +0x430D, 0x430E, 0x430F, 0x1292, 0x1720, 0x4E0A, 0x4F0B, 0x12B0, 0xDAC6, +0x4A0C, 0x4B0D, 0x3C59, 0x444C, 0x1292, 0x1726, 0x3C5B, 0x90B1, 0x0010, +0x0008, 0x2007, 0x9381, 0x000A, 0x2004, 0x440C, 0x12B0, 0xBC7A, 0x3C0B, +0x90B1, 0x0020, 0x0008, 0x2009, 0x9381, 0x000A, 0x2006, 0x450D, 0x440C, +0x12B0, 0xB064, 0x935C, 0x2043, 0x403C, 0xFFCF, 0x3C45, 0x12B0, 0xCA36, +0x12B0, 0xDAC6, 0x430C, 0x430D, 0x3C33, 0x440C, 0x1292, 0x1536, 0x403C, +0x170E, 0x12B0, 0x1880, 0x3C31, 0x411E, 0x0008, 0x410D, 0x503D, 0x0014, +0x444C, 0x1292, 0x172E, 0x3C16, 0x411F, 0x0008, 0x410E, 0x503E, 0x0014, +0x440C, 0x450D, 0x1292, 0x1730, 0x3C0C, 0x1211, 0x000A, 0x410D, 0x503D, +0x0016, 0x440E, 0x450F, 0x411C, 0x000C, 0x1292, 0x1732, 0x5321, 0x931C, +0x3403, 0x403F, 0xFFBA, 0x3C01, 0x430F, 0x4F81, 0x0004, 0x411C, 0x0014, +0x411D, 0x0016, 0x12B0, 0xDAC6, 0x3C03, 0x40B1, 0xFFC5, 0x0004, 0x9381, +0x0018, 0x267D, 0x411C, 0x0004, 0x5031, 0x001E, 0x4030, 0xD316, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0010, +0x4304, 0x4306, 0x410C, 0x503C, 0x0006, 0x403E, 0x0005, 0x12B0, 0xD496, +0x4381, 0x0004, 0x410C, 0x532C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, +0x2403, 0x403C, 0xFFD3, 0x3C6D, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, +0x0016, 0x933C, 0x2003, 0x403C, 0xFFD2, 0x3C62, 0x4382, 0x167C, 0x403A, +0x1726, 0x435C, 0x12AA, 0x403B, 0x1712, 0x4077, 0x0028, 0x474C, 0x12AB, +0x4038, 0x1718, 0x430C, 0x12A8, 0x4079, 0x00C8, 0xB03C, 0x0200, 0x2C1D, +0x407C, 0x0088, 0x12AB, 0x407C, 0x0034, 0x1292, 0x1716, 0x4036, 0x0032, +0x12B0, 0xD552, 0x474C, 0x12AB, 0x430C, 0x12A8, 0x5336, 0x933C, 0x2403, +0xB03C, 0x0200, 0x2C03, 0x9306, 0x23F6, 0x3CC3, 0x9306, 0x24C1, 0x4C06, +0x930C, 0x24BE, 0xB326, 0x2807, 0x434C, 0x12AA, 0x12B0, 0xCDDE, 0x435C, +0x12AA, 0x3C02, 0x12B0, 0xCDDE, 0x9382, 0x16D0, 0x240F, 0x407C, 0x0054, +0x12AB, 0x434C, 0x1292, 0x1716, 0x4C46, 0x407C, 0x0054, 0x12AB, 0xD076, +0x0080, 0x464C, 0x1292, 0x1716, 0x407C, 0x0048, 0x12AB, 0x435C, 0x1292, +0x1716, 0x435C, 0x12AA, 0x4076, 0x000A, 0x12B0, 0xBA8E, 0x240A, 0x12B0, +0xBAB2, 0x5376, 0x23F9, 0x403C, 0xFFD1, 0x5031, 0x0010, 0x4030, 0xD316, +0x12B0, 0xBA7A, 0x407C, 0x0030, 0x12AB, 0x403C, 0x0003, 0x12A8, 0x430C, +0x12A8, 0x4076, 0x0090, 0x93A2, 0x16CA, 0x200D, 0x9382, 0x16CC, 0x200A, +0x12B0, 0xD7D6, 0x403C, 0x000F, 0x12A8, 0x12B0, 0xD7D6, 0x403C, 0x000C, +0x12A8, 0x90B2, 0x0003, 0x16CA, 0x2007, 0x9382, 0x16CC, 0x2004, 0x12B0, +0xD7D6, 0x423C, 0x12A8, 0x421F, 0x16CA, 0xD21F, 0x16CC, 0x930F, 0x2414, +0x9382, 0x16CE, 0x2411, 0x464C, 0x12AB, 0x403C, 0x0089, 0x12A8, 0x430C, +0x12A8, 0x4C05, 0x464C, 0x12AB, 0x403C, 0x0088, 0x12A8, 0xD035, 0x0010, +0x450C, 0x12A8, 0x4076, 0x0082, 0x12B0, 0xBA6E, 0x4035, 0xBAEE, 0x12B0, +0xCDCC, 0x2040, 0x12B0, 0xCDD6, 0x934C, 0x3405, 0x12B0, 0xBA6E, 0x12B0, +0xCDCC, 0x2037, 0x12B0, 0xBA68, 0x430C, 0x12B0, 0xCDE8, 0x2031, 0x474C, +0x12AB, 0x3C04, 0x12B0, 0xCDCC, 0x202B, 0x5314, 0x430C, 0x12A8, 0x934C, +0x3803, 0x9034, 0x000A, 0x2BF5, 0x9034, 0x000A, 0x2420, 0x407C, 0x0021, +0x12B0, 0xCDD8, 0x822C, 0x4C81, 0x0008, 0x4381, 0x000A, 0x9304, 0x201C, +0x12B0, 0xCDD6, 0xB03C, 0x0020, 0x281B, 0x53A1, 0x0008, 0x12B0, 0xBA68, +0x403C, 0xC032, 0x12B0, 0xCDE8, 0x2007, 0x12B0, 0xBA68, 0x403C, 0x0010, +0x12B0, 0xCDE8, 0x2403, 0x403C, 0xFFD4, 0x3F6F, 0x40B1, 0x0010, 0x0004, +0x3C04, 0x12B0, 0xBA7A, 0x4391, 0x000E, 0x12B0, 0xD552, 0x12B0, 0xBA8E, +0x2360, 0x4117, 0x0002, 0x12B0, 0xBAC2, 0x407C, 0x00C1, 0x12AB, 0x470C, +0x12A8, 0x407C, 0x00A1, 0x12B0, 0xBAAA, 0x434C, 0x12AA, 0x430C, 0x12A8, +0x4C07, 0x12B0, 0xBAE2, 0x4781, 0x0006, 0x4747, 0xD127, 0x4781, 0x0000, +0x4114, 0x0002, 0x12B0, 0xBAC2, 0x407C, 0x0048, 0x12AB, 0x427C, 0x1292, +0x1716, 0x407C, 0x00C1, 0x12AB, 0x440C, 0x12A8, 0x407C, 0x00A1, 0x12AB, +0x470C, 0x12A8, 0x435C, 0x12AA, 0x12B0, 0xBAE2, 0x12B0, 0xD540, 0x403C, +0x4030, 0x12B0, 0xBAB0, 0x403C, 0x0C04, 0x12B0, 0xBAB0, 0x407C, 0x0021, +0x12AB, 0x12B0, 0xBABA, 0x12B0, 0xD540, 0x403C, 0x4282, 0x12B0, 0xBAA0, +0x464C, 0x12AB, 0x403C, 0x00FE, 0x12B0, 0xBAA0, 0x12B0, 0xBAB2, 0x430C, +0x12A8, 0x4C07, 0x12B0, 0xBABA, 0xD117, 0x0004, 0x4781, 0x000C, 0x403D, +0x000A, 0x410C, 0x503C, 0x0006, 0x421F, 0x16F4, 0x129F, 0x0006, 0x430C, +0x3EFF, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, +0x8031, 0x0014, 0x403B, 0x1712, 0x407C, 0x0028, 0x12AB, 0x4C4A, 0x4038, +0x1718, 0x907C, 0x0099, 0x200D, 0x407C, 0x00F4, 0x12AB, 0x403C, 0x40A0, +0x12A8, 0x407C, 0x0054, 0x12AB, 0x430C, 0x431D, 0x1292, 0x171C, 0x12B0, +0xBF72, 0x403C, 0x6D8E, 0x430D, 0x1292, 0x171C, 0x407C, 0x0030, 0x12AB, +0x403C, 0x0005, 0x12A8, 0x4079, 0x00C8, 0x494C, 0x12AB, 0x403C, 0x1501, +0x12A8, 0x4307, 0x407C, 0x0028, 0x12AB, 0x430C, 0x12A8, 0xB03C, 0x0200, +0x2C05, 0x470F, 0x5317, 0x903F, 0x0032, 0x2BF6, 0x9037, 0x0032, 0x2802, +0x433C, 0x3D28, 0x4036, 0x1726, 0x12B0, 0xD6D0, 0x403C, 0x0C01, 0x12A8, +0x403C, 0x0028, 0x1292, 0x1540, 0x403C, 0x0401, 0x12A8, 0x907A, 0x0091, +0x2406, 0x907A, 0x0099, 0x2403, 0x907A, 0x0098, 0x2010, 0x407C, 0x0082, +0x12AB, 0x12B0, 0xBFCA, 0x12B0, 0xBF82, 0x907A, 0x0091, 0x2002, 0x12B0, +0xBFCA, 0x407C, 0x0042, 0x12AB, 0x3C06, 0x12B0, 0xBFCA, 0x12B0, 0xBFCA, +0x12B0, 0xBFCA, 0x12B0, 0xBFCA, 0x12B0, 0xD6D0, 0x403C, 0x0501, 0x12B0, +0xBF88, 0x407C, 0x0030, 0x12AB, 0x403C, 0x000E, 0x12A8, 0x12B0, 0xBF68, +0x410C, 0x522C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x410C, 0x532C, 0x421F, +0x16F4, 0x129F, 0x0016, 0x4191, 0x0004, 0x0010, 0x4381, 0x0012, 0x434C, +0x12A6, 0x4075, 0x00C1, 0x454C, 0x12AB, 0x4037, 0x171A, 0x411C, 0x0010, +0x12B0, 0xBF8E, 0x4481, 0x0006, 0x4444, 0xD114, 0x0002, 0x4481, 0x0002, +0x4191, 0x0004, 0x0010, 0x4381, 0x0012, 0x12B0, 0xBFAC, 0x411C, 0x0010, +0x12B0, 0xD586, 0x440C, 0x12B0, 0xBFBE, 0x12B0, 0xD998, 0x430C, 0x430D, +0x12A7, 0x903C, 0xFFFE, 0x2409, 0x907A, 0x0091, 0x2406, 0x907A, 0x0099, +0x2403, 0x907A, 0x0098, 0x200D, 0x434C, 0x12A6, 0x454C, 0x12AB, 0x403C, +0xFFFE, 0x12B0, 0xBF8E, 0x4481, 0x0008, 0x4381, 0x000A, 0x3C07, 0x503C, +0xFFFC, 0x633D, 0x4C81, 0x0008, 0x4D81, 0x000A, 0x4381, 0x000C, 0x431C, +0x421F, 0x16F4, 0x129F, 0x001C, 0x4304, 0x440C, 0x503C, 0x1740, 0x421F, +0x16F4, 0x129F, 0x0014, 0x93C4, 0x1740, 0x2429, 0x444C, 0x12B0, 0xCF00, +0xF21C, 0x16F0, 0xF21D, 0x16F2, 0x4C0F, 0xDD0F, 0x930F, 0x2002, 0x430F, +0x3C01, 0x431F, 0x4F81, 0x000E, 0x445F, 0x1740, 0x503F, 0x9600, 0x4F81, +0x0000, 0x12B0, 0xBFAC, 0x403C, 0x0110, 0x12B0, 0xD586, 0x412C, 0x12B0, +0xBFBE, 0x12B0, 0xBFAC, 0x403C, 0x011E, 0x12B0, 0xD586, 0x411C, 0x000E, +0x12B0, 0xBFBE, 0x5314, 0x9034, 0x0020, 0x3BC9, 0x12B0, 0xBF72, 0x403C, +0x000E, 0x430D, 0x1292, 0x171C, 0x907A, 0x0091, 0x2042, 0x434C, 0x12A6, +0x454C, 0x12AB, 0x403C, 0x0102, 0x12B0, 0xBF9A, 0x4C0A, 0x435C, 0x12A6, +0x12B0, 0xBFCA, 0x4A81, 0x0000, 0xB2B1, 0x0000, 0x2830, 0x12B0, 0xBF68, +0x434C, 0x12A6, 0x407C, 0x0082, 0x12AB, 0x435C, 0x12A6, 0x403C, 0x0080, +0x12A8, 0x434C, 0x12B0, 0xD6D6, 0x403C, 0x1400, 0x12A8, 0x407C, 0x0082, +0x12AB, 0x12B0, 0xBF82, 0x403C, 0x4303, 0x12A8, 0x434C, 0x12B0, 0xD996, +0x430C, 0x430D, 0x12A7, 0x12B0, 0xD594, 0x12B0, 0xD996, 0xC2B1, 0x0000, +0x412A, 0x12B0, 0xBFAC, 0x403C, 0x0102, 0x12B0, 0xD586, 0x4A0C, 0x12B0, +0xBFBE, 0x423D, 0x410C, 0x503C, 0x0006, 0x421F, 0x16F4, 0x129F, 0x0006, +0x430C, 0x5031, 0x0014, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0018, 0x4381, 0x0002, 0x4305, +0x410C, 0x522C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, +0xFFDA, 0x3C8F, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, +0x2403, 0x403C, 0xFFD9, 0x3C84, 0x4382, 0x167C, 0x403A, 0x1712, 0x407B, +0x00C8, 0x4B4C, 0x12AA, 0x4038, 0x1718, 0x4034, 0x2401, 0x440C, 0x12A8, +0x407C, 0x0028, 0x12AA, 0x907C, 0x0089, 0x2403, 0x403C, 0xFFD0, 0x3C6D, +0x12B0, 0xD8BC, 0x4C81, 0x000A, 0x4039, 0x1726, 0x435C, 0x12A9, 0x4036, +0x171C, 0x4037, 0x1716, 0xB0B1, 0x0200, 0x000A, 0x2C41, 0x12B0, 0xDB36, +0x407C, 0x0034, 0x12A7, 0x407C, 0x00B0, 0x12AA, 0x403C, 0x0089, 0x430D, +0x12A6, 0x430C, 0x430D, 0x12A6, 0x4C81, 0x0014, 0x4D81, 0x0016, 0x12B0, +0xD63C, 0x411C, 0x0014, 0xD03C, 0x0040, 0x430D, 0x12A6, 0x4C81, 0x0006, +0x4D81, 0x0008, 0x12B0, 0xD63C, 0x411C, 0x0006, 0xF03C, 0xFFBF, 0x430D, +0x12A6, 0x4035, 0x0032, 0x12B0, 0xCAD0, 0x407C, 0x0028, 0x12AA, 0x430C, +0x12A8, 0x5335, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C03, 0x9305, 0x23F6, +0x3C05, 0x9305, 0x2403, 0x4C05, 0x930C, 0x2003, 0x403C, 0xFFDB, 0x3C1C, +0xB325, 0x2805, 0x12B0, 0xCACC, 0x435C, 0x12A9, 0x3C02, 0x12B0, 0xCAD0, +0x407C, 0x0082, 0x12B0, 0xCAE2, 0x403C, 0x4303, 0x12B0, 0xCAD8, 0x12B0, +0xD1E6, 0x12B0, 0xD612, 0x240A, 0x12B0, 0xD0AE, 0x5375, 0x23F9, 0x403C, +0xFFD1, 0x5031, 0x0018, 0x4030, 0xD316, 0x93A2, 0x16CA, 0x200F, 0x9382, +0x16CC, 0x200C, 0x12B0, 0xD62E, 0x403C, 0x000F, 0x430D, 0x12A6, 0x12B0, +0xD62E, 0x403C, 0x000C, 0x430D, 0x12A6, 0x12B0, 0xCAE8, 0x12B0, 0xCAE8, +0x403C, 0x0401, 0x12A8, 0x407C, 0x0098, 0x12AA, 0x12B0, 0xD0B6, 0x12B0, +0xD0B6, 0x12B0, 0xDB36, 0x407C, 0x0024, 0x12A7, 0x4076, 0x0021, 0x12B0, +0xD658, 0x903C, 0xFFFE, 0x240D, 0x903C, 0x0F00, 0x240A, 0x12B0, 0xD0AE, +0x411F, 0x0002, 0x531F, 0x4F81, 0x0002, 0x903F, 0x000A, 0x2BEE, 0x90B1, +0x000A, 0x0002, 0x27BD, 0x12B0, 0xD0AE, 0x12B0, 0xD0AE, 0x434C, 0x12A9, +0x464C, 0x12AA, 0x430C, 0x12A8, 0x435C, 0x12A9, 0x12B0, 0xD1E6, 0x12B0, +0xD612, 0x2405, 0x12B0, 0xD0AE, 0x5375, 0x27A8, 0x3FF8, 0x12B0, 0xCB28, +0x12B0, 0xD0F6, 0x12B0, 0xCAE2, 0x434C, 0x12A9, 0x430C, 0x12A8, 0x4C05, +0x12B0, 0xCACC, 0x464C, 0x12B0, 0xCAE2, 0x4581, 0x000C, 0x4545, 0xD125, +0x4581, 0x0000, 0x12B0, 0xCB28, 0x407C, 0x0048, 0x12AA, 0x427C, 0x12A7, +0x12B0, 0xD0F6, 0x12AA, 0x450C, 0x12A8, 0x435C, 0x12A9, 0x12B0, 0xCACC, +0x464C, 0x12B0, 0xCAE2, 0x12B0, 0xD658, 0x4C81, 0x000E, 0x4D81, 0x0010, +0x12B0, 0xDB36, 0x407C, 0x0034, 0x12A7, 0x407C, 0x0082, 0x12AA, 0x403C, +0x0080, 0x12B0, 0xD0C2, 0x403C, 0x0C04, 0x12B0, 0xD0C2, 0x464C, 0x12AA, +0x12B0, 0xD236, 0x12B0, 0xDB36, 0x403C, 0x0034, 0x12A8, 0x407C, 0x0082, +0x12B0, 0xCAE2, 0x403C, 0x0260, 0x12B0, 0xCAD8, 0x407C, 0x0082, 0x12B0, +0xCAE2, 0x403C, 0x00FC, 0x12B0, 0xCAD8, 0x430C, 0x12A8, 0x4C0B, 0x12B0, +0xD0AE, 0x430C, 0x12A8, 0x12B0, 0xD236, 0x4B81, 0x0012, 0x423D, 0x410C, +0x503C, 0x000C, 0x421F, 0x16F4, 0x129F, 0x0006, 0x430C, 0x3F3C, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0012, +0x4381, 0x0000, 0x4381, 0x0004, 0x410C, 0x523C, 0x421F, 0x16F4, 0x129F, +0x0016, 0x930C, 0x2403, 0x403C, 0xFFDA, 0x3C8E, 0x410C, 0x503C, 0x0006, +0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFD9, 0x3C82, +0x4382, 0x167C, 0x403A, 0x1712, 0x407B, 0x00C8, 0x4B4C, 0x12AA, 0x4038, +0x1718, 0x4039, 0x2401, 0x12B0, 0xD7F4, 0x907C, 0x0089, 0x2403, 0x403C, +0xFFD0, 0x3C6E, 0x407C, 0x0028, 0x12B0, 0xD9B0, 0x4C05, 0x4036, 0x1726, +0x435C, 0x12A6, 0x4037, 0x1716, 0x4074, 0x0090, 0xB035, 0x0200, 0x2C32, +0x407C, 0x0088, 0x12AA, 0x407C, 0x0034, 0x12A7, 0x444C, 0x12AA, 0x403C, +0x0089, 0x12A8, 0x430C, 0x12B0, 0xD56A, 0xD035, 0x0040, 0x450C, 0x12B0, +0xD56A, 0xF035, 0xFFBF, 0x450C, 0x12A8, 0x4035, 0x0032, 0x4B4C, 0x12AA, +0x12B0, 0xD7F4, 0x430C, 0x12A8, 0x5335, 0x933C, 0x2403, 0xB03C, 0x0200, +0x2C03, 0x9305, 0x23F6, 0x3C04, 0x9305, 0x2402, 0x4C81, 0x0004, 0xB3A1, +0x0004, 0x2C03, 0x403C, 0xFFDB, 0x3C2C, 0xB3A1, 0x0004, 0x2803, 0x12B0, +0xCCAE, 0x3C02, 0x12B0, 0xCCA6, 0x9382, 0x16D0, 0x240D, 0x407C, 0x0054, +0x12AA, 0x434C, 0x12A7, 0x4C45, 0x407C, 0x0054, 0x12AA, 0xD075, 0x0080, +0x454C, 0x12A7, 0x4075, 0x0082, 0x454C, 0x12AA, 0x435C, 0x12A6, 0x403C, +0x4303, 0x12B0, 0xD700, 0x12B0, 0xD018, 0x12B0, 0xD1FA, 0x2409, 0x12B0, +0xD1D2, 0x23FA, 0x403C, 0xFFD1, 0x5031, 0x0012, 0x4030, 0xD316, 0x93A2, +0x16CA, 0x200D, 0x9382, 0x16CC, 0x200A, 0x12B0, 0xD9CE, 0x403C, 0x000F, +0x12A8, 0x12B0, 0xD9CE, 0x403C, 0x000C, 0x12A8, 0x90B2, 0x0003, 0x16CA, +0x2007, 0x9382, 0x16CC, 0x2004, 0x12B0, 0xD9CE, 0x423C, 0x12A8, 0x12B0, +0xCCB6, 0x12B0, 0xCCB6, 0x403C, 0x0401, 0x12A8, 0x407C, 0x0098, 0x12AA, +0x12B0, 0xD748, 0x12B0, 0xD748, 0x407C, 0x0088, 0x12AA, 0x407C, 0x0024, +0x12A7, 0x4074, 0x0021, 0x12B0, 0xD9AE, 0x903C, 0xFFFE, 0x240C, 0x903C, +0x0F00, 0x2409, 0x12B0, 0xD2EA, 0x412F, 0x531F, 0x4F81, 0x0000, 0x903F, +0x000A, 0x2BEF, 0x90B1, 0x000A, 0x0000, 0x27B4, 0x434C, 0x12A6, 0x12B0, +0xD2E6, 0x434C, 0x12A6, 0x12B0, 0xD9AE, 0x12B0, 0xD018, 0x12B0, 0xD1FA, +0x2404, 0x12B0, 0xD1D2, 0x27A4, 0x3FF9, 0x12B0, 0xCD1A, 0x12B0, 0xD34C, +0x435C, 0x12A6, 0x434C, 0x12A6, 0x430C, 0x12A8, 0x4C81, 0x0000, 0x12B0, +0xD6A0, 0x41A1, 0x000A, 0x415F, 0x000A, 0xD11F, 0x0006, 0x4F81, 0x0006, +0x4F81, 0x0004, 0x12B0, 0xCD1A, 0x407C, 0x0048, 0x12AA, 0x427C, 0x12A7, +0x12B0, 0xD34C, 0x411C, 0x0004, 0x12A8, 0x435C, 0x12A6, 0x12B0, 0xD6A0, +0x12B0, 0xD9AE, 0x4C81, 0x000C, 0x4381, 0x000E, 0x12B0, 0xD5F6, 0x403C, +0x4030, 0x12B0, 0xD2E0, 0x403C, 0x0C04, 0x12B0, 0xD2E0, 0x444C, 0x12AA, +0x12B0, 0xCCAE, 0x12B0, 0xD5F6, 0x403C, 0x4282, 0x12B0, 0xD700, 0x435C, +0x12A6, 0x454C, 0x12AA, 0x403C, 0x00FE, 0x12B0, 0xD700, 0x12B0, 0xD2E6, +0x430C, 0x12A8, 0x4C07, 0x12B0, 0xCCAE, 0x4781, 0x0010, 0x423D, 0x410C, +0x503C, 0x000A, 0x421F, 0x16F4, 0x129F, 0x0006, 0x430C, 0x3F48, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0010, +0x4306, 0x4307, 0x410C, 0x503C, 0x0006, 0x403E, 0x0005, 0x12B0, 0xD496, +0x4381, 0x0004, 0x410C, 0x532C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, +0x2403, 0x403C, 0xFFD3, 0x3C58, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, +0x0016, 0x933C, 0x2003, 0x403C, 0xFFD2, 0x3C4D, 0x4382, 0x167C, 0x403A, +0x1726, 0x435C, 0x12AA, 0x403B, 0x1712, 0x4074, 0x0028, 0x444C, 0x12AB, +0x4038, 0x1718, 0x430C, 0x12A8, 0x4079, 0x00C8, 0xB03C, 0x0200, 0x2C18, +0x12B0, 0xD524, 0x4036, 0x0032, 0x12B0, 0xD984, 0x444C, 0x12AB, 0x430C, +0x12A8, 0x5336, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C03, 0x9306, 0x23F6, +0x3C96, 0x9306, 0x2494, 0x4C06, 0x930C, 0x2491, 0xB326, 0x2807, 0x434C, +0x12AA, 0x12B0, 0xD790, 0x435C, 0x12AA, 0x3C02, 0x12B0, 0xD790, 0x407C, +0x0048, 0x12AB, 0x435C, 0x1292, 0x1716, 0x435C, 0x12AA, 0x4076, 0x000A, +0x4075, 0x0081, 0x12B0, 0xB1AE, 0x240A, 0x12B0, 0xB1EA, 0x5376, 0x23F9, +0x403C, 0xFFD1, 0x5031, 0x0010, 0x4030, 0xD316, 0x12B0, 0xB1D0, 0x407C, +0x0030, 0x12AB, 0x403C, 0x0003, 0x12A8, 0x430C, 0x12A8, 0x93A2, 0x16CA, +0x201B, 0x9382, 0x16CC, 0x2018, 0x407C, 0x00B0, 0x12AB, 0x4036, 0x171C, +0x403C, 0x0082, 0x430D, 0x12A6, 0x403C, 0x000F, 0x430D, 0x12A6, 0x407C, +0x00B0, 0x12AB, 0x403C, 0x0082, 0x430D, 0x12A6, 0x403C, 0x000C, 0x430D, +0x12A6, 0x4076, 0x0082, 0x12B0, 0xB1A6, 0x403C, 0x4303, 0x12B0, 0xB22C, +0x444C, 0x12AB, 0x3C09, 0x12B0, 0xBBF6, 0x4C0F, 0xDD0F, 0x930F, 0x2034, +0x5317, 0x430C, 0x12A8, 0x430C, 0x12A8, 0x934C, 0x3803, 0x9037, 0x000A, +0x2BF0, 0x9037, 0x000A, 0x2427, 0x407C, 0x0021, 0x12AB, 0x430C, 0x430D, +0x1292, 0x171A, 0x503C, 0xFFFE, 0x633D, 0x4C81, 0x0008, 0x4D81, 0x000A, +0x9307, 0x201E, 0x444C, 0x12AB, 0x430C, 0x12A8, 0xB03C, 0x0020, 0x281B, +0x53A1, 0x0008, 0x12B0, 0xB1A6, 0x403C, 0xC032, 0x12B0, 0xD532, 0x2007, +0x12B0, 0xB1A6, 0x403C, 0x0010, 0x12B0, 0xD532, 0x2403, 0x403C, 0xFFD4, +0x3F8C, 0x40B1, 0x0010, 0x0004, 0x3C04, 0x12B0, 0xB1D0, 0x4391, 0x000E, +0x12B0, 0xD984, 0x12B0, 0xB1AE, 0x237D, 0x12B0, 0xB208, 0x12B0, 0xB1BC, +0x435C, 0x12AA, 0x434C, 0x12AA, 0x430C, 0x12A8, 0x4C07, 0x12B0, 0xB238, +0x4781, 0x0006, 0x4747, 0xD127, 0x4781, 0x0000, 0x12B0, 0xB208, 0x407C, +0x0048, 0x12AB, 0x427C, 0x1292, 0x1716, 0x12B0, 0xB1BC, 0x470C, 0x12A8, +0x435C, 0x12AA, 0x12B0, 0xB238, 0x12B0, 0xD524, 0x464C, 0x12AB, 0x403C, +0x0080, 0x12B0, 0xB1E8, 0x403C, 0x0C04, 0x12B0, 0xB1E8, 0x407C, 0x0021, +0x12AB, 0x12B0, 0xB1F2, 0x407C, 0x0088, 0x12AB, 0x403C, 0x0034, 0x12A8, +0x12B0, 0xB1A6, 0x403C, 0x0260, 0x12B0, 0xB22C, 0x12B0, 0xB1A6, 0x403C, +0x00FC, 0x12B0, 0xB22C, 0x430C, 0x12A8, 0x4C07, 0x12B0, 0xB1EA, 0x430C, +0x12A8, 0x12B0, 0xB1F2, 0xD117, 0x0004, 0x4781, 0x000C, 0x403D, 0x000A, +0x410C, 0x503C, 0x0006, 0x421F, 0x16F4, 0x129F, 0x0006, 0x430C, 0x3F21, +0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, +0x0014, 0x4381, 0x000E, 0x4381, 0x0008, 0x4381, 0x0006, 0x403B, 0x16F4, +0x410C, 0x503C, 0x0012, 0x12B0, 0xDB2A, 0x410C, 0x503C, 0x0010, 0x12B0, +0xDB2A, 0x410C, 0x503C, 0x000A, 0x4B2F, 0x129F, 0x0018, 0x410C, 0x522C, +0x12B0, 0xDB2A, 0x410C, 0x503C, 0x000E, 0x12B0, 0xDB2A, 0x410C, 0x532C, +0x12B0, 0xDB2A, 0x410C, 0x523C, 0x12B0, 0xDB2A, 0x410C, 0x503C, 0x0006, +0x12B0, 0xDB2A, 0x4117, 0x0004, 0x403A, 0x1726, 0x434C, 0x12AA, 0x403B, +0x1712, 0x4078, 0x0082, 0x12B0, 0xDA7E, 0x4039, 0x1718, 0x480C, 0x12A9, +0x4076, 0x00C8, 0x464C, 0x12AB, 0x403C, 0x1401, 0x12B0, 0xD5CC, 0x470C, +0x12A9, 0x12B0, 0xD5D2, 0x403C, 0x3FFD, 0x12B0, 0xD5B0, 0x4077, 0x0021, +0x474C, 0x12AB, 0x430C, 0x12B0, 0xD970, 0x464C, 0x12AB, 0x403C, 0x0501, +0x12B0, 0xD5B0, 0x407C, 0x0042, 0x12AB, 0x435C, 0x12AA, 0x4191, 0x0010, +0x0000, 0x4114, 0x0012, 0x12B0, 0xD97C, 0x403C, 0x0500, 0x12A9, 0x407C, +0x00C1, 0x12AB, 0x440C, 0x12B0, 0xD970, 0x407C, 0x00A1, 0x12AB, 0x412C, +0x12B0, 0xD97A, 0x403C, 0x0501, 0x12A9, 0x435C, 0x12AA, 0x12B0, 0xD5D2, +0xB0B1, 0x0010, 0x0004, 0x280B, 0x411E, 0x000A, 0x411F, 0x000C, 0x503E, +0xFFFE, 0x633F, 0x4E81, 0x000A, 0x4F81, 0x000C, 0x411C, 0x000A, 0x411D, +0x000C, 0x12B0, 0xCAC0, 0x4C05, 0xF035, 0x0F00, 0x5035, 0x0080, 0x4191, +0x000A, 0x0000, 0x4074, 0x0028, 0x444C, 0x12AB, 0x430C, 0x12A9, 0x434C, +0x12AA, 0x12B0, 0xDA7E, 0x450C, 0x12B0, 0xD97A, 0x403C, 0x1400, 0x12B0, +0xD5CC, 0x412C, 0x12A9, 0x12B0, 0xD5D2, 0x403C, 0x4303, 0x12B0, 0xD90C, +0x430C, 0x430D, 0x1292, 0x171A, 0x9381, 0x0002, 0x240B, 0x12B0, 0xD8E4, +0x12B0, 0xDA7E, 0x411C, 0x0002, 0x12B0, 0xD90C, 0x444C, 0x12AB, 0x3C0A, +0x435C, 0x12AA, 0x12B0, 0xD8E4, 0x474C, 0x12AB, 0x444C, 0x12AB, 0x434C, +0x12AA, 0x430C, 0x12A9, 0xB32C, 0x2805, 0x464C, 0x12AB, 0x403C, 0x0403, +0x12A9, 0x435C, 0x12AA, 0x407C, 0x0030, 0x12AB, 0x411C, 0x000E, 0x12A9, +0x4037, 0x171C, 0x403A, 0x1540, 0x4038, 0x0014, 0x9381, 0x0006, 0x241E, +0x9382, 0x16E2, 0x2407, 0x12B0, 0xD394, 0xD21C, 0x16E6, 0x12A9, 0x480C, +0x12AA, 0x421F, 0x16D2, 0xD21F, 0x16D4, 0x930F, 0x2435, 0x12B0, 0xD3A6, +0xC21C, 0x16D2, 0xC21D, 0x16D4, 0xD21C, 0x16DA, 0xD21D, 0x16DC, 0x12A7, +0x480C, 0x12AA, 0x3C27, 0x444C, 0x12AB, 0x4C46, 0x9382, 0x16E2, 0x2407, +0x12B0, 0xD394, 0xD21C, 0x16E8, 0x12A9, 0x480C, 0x12AA, 0x421F, 0x16D2, +0xD21F, 0x16D4, 0x930F, 0x2409, 0x12B0, 0xD3A6, 0x421C, 0x16DE, 0x421D, +0x16E0, 0x12A7, 0x480C, 0x12AA, 0x9076, 0x0099, 0x2008, 0x407C, 0x00F4, +0x12AB, 0x430C, 0x12A9, 0xF03C, 0xFF7F, 0x12A9, 0x4392, 0x167C, 0x407C, +0x00A8, 0x12AB, 0x9381, 0x0008, 0x2402, 0x1292, 0x153C, 0x430C, 0x5801, +0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, +0x1205, 0x8031, 0x0016, 0x403B, 0x16F4, 0x410C, 0x503C, 0x000A, 0x12B0, +0xD862, 0x2403, 0x403C, 0xFFE8, 0x3D24, 0x410C, 0x523C, 0x12B0, 0xD862, +0x2403, 0x403C, 0xFFE7, 0x3D1C, 0x410C, 0x503C, 0x0012, 0x4B2F, 0x129F, +0x0018, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3D11, 0x410C, 0x503C, 0x0006, +0x12B0, 0xD862, 0x2403, 0x403C, 0xFFE5, 0x3D08, 0x410C, 0x522C, 0x12B0, +0xD862, 0x2403, 0x403C, 0xFFE4, 0x3D00, 0x410C, 0x532C, 0x12B0, 0xD862, +0x2403, 0x403C, 0xFFE3, 0x3CF8, 0x410C, 0x530C, 0x4B2F, 0x129F, 0x0016, +0x933C, 0x2002, 0x4381, 0x0000, 0x432C, 0x4B2F, 0x129F, 0x001C, 0x4117, +0x0006, 0x403A, 0x1712, 0x4076, 0x00C8, 0x464C, 0x12AA, 0x403B, 0x1718, +0x403C, 0x3401, 0x12AB, 0x4078, 0x0082, 0x484C, 0x12AA, 0x403C, 0x4032, +0x12AB, 0x4039, 0x1726, 0x12B0, 0xD2CE, 0x470C, 0x12AB, 0x12B0, 0xD2CE, +0x403C, 0x3FFD, 0x12B0, 0xDB48, 0x407C, 0x0042, 0x12B0, 0xDA68, 0x12B0, +0xD670, 0x4117, 0x0008, 0x4114, 0x000A, 0x484C, 0x12AA, 0x403C, 0x3FFF, +0x12B0, 0xDB48, 0x464C, 0x12AA, 0x403C, 0x2409, 0x12B0, 0xD86C, 0x407C, +0x0048, 0x12AA, 0x427C, 0x1292, 0x1716, 0x407C, 0x00C1, 0x12AA, 0x440C, +0x12AB, 0x407C, 0x00A1, 0x12AA, 0x470C, 0x12B0, 0xD86C, 0x12B0, 0xD8D0, +0x4077, 0x0021, 0x12B0, 0xDA66, 0x4114, 0x0012, 0x464C, 0x12AA, 0x403C, +0x3401, 0x12AB, 0x484C, 0x12AA, 0x403C, 0x4030, 0x12B0, 0xDABE, 0x440C, +0x12B0, 0xDABE, 0x474C, 0x12AA, 0x12B0, 0xD670, 0x4381, 0x000C, 0x4381, +0x000E, 0x4381, 0x0010, 0x4076, 0x0090, 0x464C, 0x12AA, 0x403C, 0x0003, +0x12B0, 0xDB24, 0x4C81, 0x000C, 0x403C, 0x000B, 0x12B0, 0xDB24, 0x4C04, +0x4C81, 0x000E, 0x403C, 0x0013, 0x12B0, 0xDB24, 0x4C05, 0x4C81, 0x0010, +0x432C, 0x12B0, 0xDB24, 0x403C, 0x000A, 0x12B0, 0xDB24, 0x403C, 0x0012, +0x12B0, 0xDB24, 0x432C, 0x12AB, 0x411C, 0x000C, 0x12AB, 0x403C, 0x000A, +0x12AB, 0x440C, 0x12AB, 0x403C, 0x0012, 0x12AB, 0x450C, 0x12AB, 0x421F, +0x16CA, 0xD21F, 0x16CC, 0x930F, 0x242D, 0x9382, 0x16CE, 0x2410, 0x464C, +0x12AA, 0x403C, 0x0089, 0x12B0, 0xDB24, 0x4C04, 0x464C, 0x12AA, 0x403C, +0x0088, 0x12AB, 0xF034, 0xFFEF, 0x440C, 0x12AB, 0x93A2, 0x16CA, 0x200A, +0x9382, 0x16CC, 0x2007, 0x464C, 0x12AA, 0x480C, 0x12AB, 0x403C, 0x000F, +0x12AB, 0x90B2, 0x0003, 0x16CA, 0x2009, 0x9382, 0x16CC, 0x2006, 0x464C, +0x12AA, 0x480C, 0x12AB, 0x423C, 0x12AB, 0x407C, 0x0030, 0x12AA, 0x411C, +0x0004, 0x12AB, 0x9381, 0x0002, 0x2409, 0x484C, 0x12AA, 0x411C, 0x0002, +0x12B0, 0xDB48, 0x12B0, 0xDA66, 0x3C02, 0x474C, 0x12AA, 0x4392, 0x167C, +0x407C, 0x00A8, 0x12AA, 0x9381, 0x0000, 0x2402, 0x1292, 0x153C, 0x430C, +0x5031, 0x0016, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x1207, 0x1204, 0x1205, 0x8031, 0x0026, 0x4381, 0x0002, 0x4381, 0x0008, +0x4381, 0x0006, 0x4381, 0x000A, 0x410C, 0x532C, 0x421F, 0x16F4, 0x129F, +0x0016, 0x410C, 0x523C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x410C, 0x503C, +0x0006, 0x421F, 0x16F4, 0x129F, 0x0016, 0x410C, 0x503C, 0x000A, 0x421F, +0x16F4, 0x129F, 0x0016, 0x432C, 0x421F, 0x16F4, 0x129F, 0x001C, 0x933C, +0x2422, 0x1292, 0x172C, 0x907C, 0x0046, 0x2404, 0x407C, 0x0046, 0x1292, +0x1712, 0x9382, 0x167C, 0x2018, 0x9381, 0x0002, 0x24E9, 0x422C, 0x421F, +0x16F4, 0x129F, 0x0008, 0x430C, 0x430D, 0x421F, 0x16F4, 0x129F, 0x000A, +0x430C, 0x430D, 0x421F, 0x16F4, 0x129F, 0x000A, 0x430C, 0x3CD7, 0x433C, +0x3CD5, 0x433C, 0x433D, 0x433E, 0x433F, 0x1292, 0x1720, 0x4C08, 0x4D09, +0x4E0A, 0x4F0B, 0x9382, 0x167C, 0x2423, 0x9381, 0x0008, 0x2420, 0xB03F, +0x4000, 0x2C18, 0xB03F, 0x0400, 0x2815, 0x431C, 0x421F, 0x16F4, 0x129F, +0x0008, 0x480C, 0x490D, 0x421F, 0x16F4, 0x129F, 0x000A, 0x4A0C, 0x4B0D, +0x421F, 0x16F4, 0x129F, 0x000A, 0x4382, 0x167C, 0x431F, 0x3C01, 0x432F, +0x931F, 0x2002, 0x431C, 0x3CA5, 0x9382, 0x167C, 0x2003, 0x9381, 0x0002, +0x249E, 0x9381, 0x0006, 0x249B, 0x4B0F, 0x108F, 0x4F4C, 0xF07C, 0x00C0, +0x907C, 0x0040, 0x2493, 0x4191, 0x0002, 0x0000, 0x4381, 0x0004, 0xB03B, +0x4000, 0x2C1D, 0x930B, 0x3806, 0x4B0F, 0xF03F, 0x8300, 0x903F, 0x8300, +0x2015, 0x407C, 0x0086, 0x1292, 0x1712, 0x907C, 0x0099, 0x200E, 0x422C, +0x1292, 0x1718, 0x903C, 0x1207, 0x2008, 0x430C, 0x1292, 0x1718, 0x903C, +0xA55A, 0x2002, 0x4391, 0x0004, 0x9381, 0x0000, 0x2012, 0x403F, 0x167E, +0x4F34, 0x4F35, 0x4F36, 0x4F37, 0xF037, 0x4000, 0x4B0F, 0xF03F, 0x4000, +0x9F07, 0x2005, 0x9381, 0x0004, 0x2002, 0x432C, 0x3C48, 0x422C, 0x421F, +0x16F4, 0x129F, 0x0008, 0x480C, 0x490D, 0x421F, 0x16F4, 0x129F, 0x000A, +0x4A0C, 0x4B0D, 0x421F, 0x16F4, 0x129F, 0x000A, 0xB03B, 0x4000, 0x2C03, +0x9381, 0x0000, 0x2406, 0x9381, 0x0004, 0x242D, 0x9381, 0x0000, 0x202A, +0x410C, 0x503C, 0x000C, 0x403E, 0x25A2, 0x423D, 0x12B0, 0xD3B6, 0x42D1, +0x16EC, 0x000C, 0x42D1, 0x16ED, 0x000D, 0x410F, 0x503F, 0x0014, 0x120F, +0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x000E, 0x4217, 0x16F4, 0x1297, +0x000E, 0x403C, 0x0003, 0x1292, 0x1234, 0x410C, 0x503C, 0x0016, 0x421F, +0x16F4, 0x129F, 0x0010, 0x4382, 0x167C, 0x5321, 0x431C, 0x9381, 0x0000, +0x2402, 0x430C, 0x3C08, 0x4882, 0x167E, 0x4982, 0x1680, 0x4A82, 0x1682, +0x4B82, 0x1684, 0x931C, 0x2403, 0x930C, 0x2401, 0x432C, 0x5031, 0x0026, +0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8031, +0x0060, 0x4336, 0x4308, 0x410C, 0x503C, 0x001C, 0x403E, 0x25DF, 0x403D, +0x001F, 0x12B0, 0xD3B6, 0x4381, 0x0000, 0x3C07, 0x410C, 0x503C, 0x003C, +0x580C, 0x129F, 0x0014, 0x5318, 0x403A, 0x16F4, 0x4A2F, 0x9038, 0x0012, +0x2BF3, 0x410C, 0x530C, 0x129F, 0x0016, 0x4308, 0x3C07, 0x410C, 0x532C, +0x580C, 0x4A2F, 0x129F, 0x0014, 0x5318, 0x9228, 0x2BF7, 0x4039, 0x0003, +0x410B, 0x503B, 0x004E, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, +0x2815, 0x120B, 0x403F, 0x0016, 0x410E, 0x523E, 0x403D, 0x001F, 0x410C, +0x503C, 0x001E, 0x4A27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1248, 0x4B0C, +0x4A2F, 0x129F, 0x0010, 0x5321, 0x120B, 0x430F, 0x430E, 0x403D, 0x0012, +0x410C, 0x503C, 0x003E, 0x4A27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1238, +0x4B0C, 0x4A2F, 0x129F, 0x0010, 0x407C, 0x0046, 0x1292, 0x1712, 0x430C, +0x430D, 0x430E, 0x430F, 0x1292, 0x1720, 0x5321, 0xB03F, 0x4000, 0x2802, +0x430C, 0x3C9E, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2884, +0x407C, 0x0046, 0x1292, 0x1712, 0x5318, 0x430C, 0x430D, 0x430E, 0x430F, +0x1292, 0x1720, 0xB03F, 0x0400, 0x2C03, 0x9038, 0x01F4, 0x2BF3, 0x9038, +0x01F4, 0x2C82, 0x120B, 0x430F, 0x431E, 0x422D, 0x410C, 0x522C, 0x4A27, +0x1297, 0x000E, 0x490C, 0x1292, 0x1234, 0x4C06, 0x4B0C, 0x4A2F, 0x129F, +0x0010, 0x40F1, 0x0005, 0x001E, 0x43C1, 0x001F, 0x41D1, 0x0008, 0x0020, +0x41D1, 0x0009, 0x0021, 0x41D1, 0x000A, 0x0022, 0x41D1, 0x000B, 0x0023, +0x43E1, 0x0024, 0x41D1, 0x000C, 0x0025, 0x41D1, 0x000D, 0x0026, 0x41D1, +0x000E, 0x0027, 0x41D1, 0x000F, 0x0028, 0x42E1, 0x0029, 0x41D1, 0x0010, +0x002A, 0x41D1, 0x0011, 0x002B, 0x41D1, 0x0012, 0x002C, 0x41D1, 0x0013, +0x002D, 0x40F1, 0x0006, 0x002E, 0x41D1, 0x0014, 0x002F, 0x41D1, 0x0015, +0x0030, 0x41D1, 0x0016, 0x0031, 0x41D1, 0x0017, 0x0032, 0x40F1, 0x0080, +0x0033, 0x41D1, 0x0018, 0x0034, 0x41D1, 0x0019, 0x0035, 0x41D1, 0x001A, +0x0036, 0x41D1, 0x001B, 0x0037, 0x120B, 0x430F, 0x430E, 0x403D, 0x001F, +0x410C, 0x503C, 0x0020, 0x4A27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1248, +0x4B0C, 0x4A2F, 0x129F, 0x0010, 0x5221, 0x3C12, 0x120B, 0x430F, 0x431E, +0x422D, 0x410C, 0x522C, 0x4A27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1234, +0x4C06, 0x4B0C, 0x4A2F, 0x129F, 0x0010, 0x5321, 0x460C, 0x5031, 0x0060, +0x4030, 0xD31A, 0x444C, 0x12A8, 0x403C, 0x0034, 0x12AB, 0x4030, 0x6F64, +0x12B0, 0x6F40, 0x407C, 0x0048, 0x4820, 0x12B0, 0x6F40, 0x407C, 0x00C1, +0x4820, 0x464C, 0x12A8, 0x403C, 0x3FFF, 0x12AB, 0x434C, 0x12AA, 0x494C, +0x12A8, 0x403C, 0x2409, 0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12B0, +0x7022, 0x464C, 0x12A8, 0x435C, 0x4A20, 0x4214, 0x1650, 0xD034, 0x0040, +0x12B0, 0x6F8E, 0x12A8, 0x440C, 0x12AB, 0x435C, 0x4A20, 0x12B0, 0x6F8E, +0x12A8, 0x411C, 0x0002, 0x3FF7, 0x12B0, 0x7118, 0x403C, 0x012C, 0x430D, +0x1292, 0x171A, 0x407C, 0x00A1, 0x4130, 0x12B0, 0x6F60, 0x403C, 0x3FFD, +0x12B0, 0x7022, 0x12B0, 0x7000, 0x4A20, 0x12B0, 0x7012, 0x4C81, 0x0002, +0x12B0, 0x6FF4, 0x4C81, 0x0004, 0x12B0, 0x7000, 0x12AA, 0x411E, 0x0002, +0x411F, 0x0004, 0x4130, 0x12B0, 0x7012, 0x4C81, 0x0004, 0x12B0, 0x6FF4, +0x4C81, 0x0002, 0x12B0, 0x7000, 0x12AA, 0x411E, 0x0004, 0x411F, 0x0002, +0x4130, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x430C, 0x4B20, 0x434C, 0x12AA, +0x444C, 0x12A8, 0x407C, 0x0024, 0x12A7, 0x435C, 0x4130, 0x12B0, 0x6F60, +0x403C, 0x00FC, 0x12B0, 0x7022, 0x430C, 0x4B20, 0x12AB, 0x434C, 0x12AA, +0x407C, 0x0042, 0x4030, 0x6F66, 0x431C, 0x1292, 0x1540, 0x454C, 0x12A8, +0x430C, 0x430D, 0x1292, 0x171A, 0x411F, 0x0006, 0x533F, 0x4F81, 0x0006, +0x421E, 0x162A, 0x4130, 0x4E81, 0x000A, 0x4381, 0x000C, 0x444C, 0x12A8, +0x407C, 0x0034, 0x12A7, 0x464C, 0x12A8, 0x403C, 0x0080, 0x12AB, 0x434C, +0x12AA, 0x435C, 0x12AA, 0x411C, 0x000A, 0x12AB, 0x434C, 0x12AA, 0x435C, +0x12AA, 0x454C, 0x12A8, 0x3F92, 0x12B0, 0x710A, 0x12B0, 0x70FE, 0x4C81, +0x0002, 0x12B0, 0x7138, 0x4130, 0x403C, 0x0003, 0x1292, 0x11E8, 0x410C, +0x503C, 0x0038, 0x421F, 0x16F4, 0x129F, 0x0010, 0x403C, 0x1630, 0x12B0, +0x9BB0, 0x4291, 0x164C, 0x0004, 0x12B0, 0x7118, 0x403C, 0x0128, 0x12B0, +0x7128, 0x4291, 0x164E, 0x0004, 0x12B0, 0x7118, 0x403C, 0x012A, 0x12B0, +0x7128, 0x4291, 0x1650, 0x0004, 0x12B0, 0x7118, 0x403C, 0x012C, 0x12B0, +0x7128, 0x12B0, 0x710A, 0x12B0, 0x70FE, 0x4C81, 0x0004, 0x3FCC, 0x12B0, +0xDB30, 0x12B0, 0x6F58, 0x430C, 0x4B20, 0x12B0, 0x6F40, 0x12B0, 0x6F3A, +0x403C, 0x012C, 0x4130, 0x12B0, 0x6F40, 0x407C, 0x0048, 0x12A8, 0x427C, +0x12A7, 0x3F09, 0x12B0, 0x6F96, 0x12A8, 0x411C, 0x0006, 0x12AB, 0x435C, +0x12AA, 0x434C, 0x12AA, 0x494C, 0x12A8, 0x403C, 0x2401, 0x12AB, 0x454C, +0x3F0E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, +0x0014, 0x403B, 0x16F4, 0x410C, 0x503C, 0x000E, 0x12B0, 0xD8DA, 0x2403, +0x403C, 0xFFE8, 0x3CE9, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD8DA, 0x2403, +0x403C, 0xFFE7, 0x3CE0, 0x410C, 0x503C, 0x0010, 0x4B2F, 0x129F, 0x0018, +0x930C, 0x2403, 0x403C, 0xFFE6, 0x3CD5, 0x410C, 0x503C, 0x000A, 0x12B0, +0xD8DA, 0x2403, 0x403C, 0xFFE5, 0x3CCC, 0x410C, 0x523C, 0x12B0, 0xD8DA, +0x2403, 0x403C, 0xFFE4, 0x3CC4, 0x410C, 0x532C, 0x12B0, 0xD8DA, 0x2403, +0x403C, 0xFFE3, 0x3CBC, 0x410C, 0x530C, 0x4B2F, 0x129F, 0x0016, 0x933C, +0x2002, 0x4381, 0x0000, 0x432C, 0x4B2F, 0x129F, 0x001C, 0x4191, 0x000A, +0x0004, 0x4381, 0x0006, 0x403A, 0x1712, 0x4074, 0x0088, 0x444C, 0x12AA, +0x403B, 0x1716, 0x407C, 0x0034, 0x12AB, 0x4078, 0x0082, 0x484C, 0x12AA, +0x4039, 0x1726, 0x435C, 0x12A9, 0x4036, 0x1718, 0x480C, 0x12B0, 0xCA8A, +0x411C, 0x0004, 0x12B0, 0xCA8A, 0x403C, 0x3FFD, 0x12B0, 0xCA7A, 0x407C, +0x0042, 0x12B0, 0xCA6C, 0x12B0, 0xD33A, 0x4117, 0x000C, 0x4191, 0x000E, +0x0004, 0x4381, 0x0006, 0x484C, 0x12AA, 0x403C, 0x3FFF, 0x12A6, 0x12B0, +0xCA80, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12A9, 0x434C, 0x12A9, 0x407C, +0x0048, 0x12AA, 0x427C, 0x12AB, 0x407C, 0x00C1, 0x12AA, 0x411C, 0x0004, +0x430D, 0x1292, 0x171A, 0x407C, 0x00A1, 0x12AA, 0x470C, 0x12A6, 0x435C, +0x12A9, 0x12B0, 0xCA80, 0x403C, 0x2401, 0x12A6, 0x4077, 0x0021, 0x12B0, +0xCA6A, 0x4191, 0x0010, 0x0004, 0x4191, 0x0012, 0x0006, 0x444C, 0x12AA, +0x407C, 0x0034, 0x12AB, 0x484C, 0x12AA, 0x411C, 0x0004, 0x411D, 0x0006, +0x12B0, 0xCAC0, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x12B0, 0xCA72, 0x411C, +0x0004, 0x12B0, 0xCA72, 0x474C, 0x12AA, 0x12B0, 0xD33A, 0x93A2, 0x16CA, +0x200F, 0x9382, 0x16CC, 0x200C, 0x407C, 0x00B0, 0x12AA, 0x480C, 0x430D, +0x1292, 0x171C, 0x403C, 0x000F, 0x430D, 0x1292, 0x171C, 0x407C, 0x0030, +0x12AA, 0x411C, 0x0008, 0x12A6, 0x9381, 0x0002, 0x2409, 0x484C, 0x12AA, +0x411C, 0x0002, 0x12B0, 0xCA7A, 0x12B0, 0xCA6A, 0x3C02, 0x474C, 0x12AA, +0x4392, 0x167C, 0x407C, 0x00A8, 0x12AA, 0x9381, 0x0000, 0x2402, 0x1292, +0x153C, 0x430C, 0x5031, 0x0014, 0x4030, 0xD318, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x1204, 0x8031, 0x0060, 0x433A, 0x4309, 0x410C, +0x503C, 0x0018, 0x403E, 0x25FE, 0x403D, 0x001F, 0x12B0, 0xD3B6, 0x4381, +0x0000, 0x403B, 0x16F4, 0x410C, 0x503C, 0x003C, 0x590C, 0x4B2F, 0x129F, +0x0014, 0x5319, 0x9039, 0x0012, 0x2BF5, 0x410C, 0x530C, 0x4B2F, 0x129F, +0x0016, 0x4309, 0x4108, 0x5038, 0x0038, 0x480C, 0x590C, 0x4B2F, 0x129F, +0x0014, 0x5319, 0x9229, 0x2BF8, 0x4036, 0x0003, 0x4107, 0x5037, 0x004E, +0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2813, 0x1207, 0x403F, +0x0016, 0x410E, 0x522E, 0x403D, 0x001F, 0x410C, 0x503C, 0x001A, 0x4B24, +0x1294, 0x000E, 0x460C, 0x1292, 0x1248, 0x12B0, 0xD42E, 0x5321, 0x1207, +0x430F, 0x430E, 0x403D, 0x0012, 0x410C, 0x503C, 0x003E, 0x4B24, 0x1294, +0x000E, 0x460C, 0x1292, 0x1238, 0x12B0, 0xD42E, 0x5321, 0xB0F1, 0x0010, +0x0044, 0x2803, 0xB2A1, 0x0000, 0x2872, 0x407C, 0x00D0, 0x1292, 0x1712, +0x5319, 0x430C, 0x1292, 0x1718, 0x934C, 0x3803, 0x9039, 0x01F4, 0x2BF7, +0x9039, 0x01F4, 0x2C80, 0x1207, 0x12B0, 0xD4EC, 0x12B0, 0xD426, 0x40F1, +0x0005, 0x001A, 0x43C1, 0x001B, 0x41D1, 0x0004, 0x001C, 0x41D1, 0x0005, +0x001D, 0x41D1, 0x0006, 0x001E, 0x41D1, 0x0007, 0x001F, 0x43E1, 0x0020, +0x41D1, 0x0008, 0x0021, 0x41D1, 0x0009, 0x0022, 0x41D1, 0x000A, 0x0023, +0x41D1, 0x000B, 0x0024, 0x42E1, 0x0025, 0x41D1, 0x000C, 0x0026, 0x41D1, +0x000D, 0x0027, 0x41D1, 0x000E, 0x0028, 0x41D1, 0x000F, 0x0029, 0x40F1, +0x0006, 0x002A, 0x41D1, 0x0010, 0x002B, 0x41D1, 0x0011, 0x002C, 0x41D1, +0x0012, 0x002D, 0x41D1, 0x0013, 0x002E, 0x40F1, 0x0080, 0x002F, 0x41D1, +0x0014, 0x0030, 0x41D1, 0x0015, 0x0031, 0x41D1, 0x0016, 0x0032, 0x41D1, +0x0017, 0x0033, 0x1207, 0x430F, 0x430E, 0x403D, 0x001F, 0x410C, 0x503C, +0x001C, 0x4B28, 0x1298, 0x000E, 0x460C, 0x1292, 0x1248, 0x12B0, 0xD42E, +0x5221, 0x3C1E, 0x407C, 0x0028, 0x1292, 0x1712, 0x907C, 0x0089, 0x2411, +0x907C, 0x008D, 0x240E, 0x907C, 0x0091, 0x240B, 0x907C, 0x0095, 0x2408, +0x907C, 0x0098, 0x2405, 0x907C, 0x0099, 0x2402, 0x430A, 0x3C06, 0x1207, +0x12B0, 0xD4EC, 0x12B0, 0xD426, 0x5321, 0x4A0C, 0x5031, 0x0060, 0x4030, +0xD318, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, +0x003C, 0x430A, 0x4306, 0x4307, 0x403B, 0x16F4, 0x410C, 0x503C, 0x0018, +0x5A0C, 0x4B2F, 0x129F, 0x0014, 0x531A, 0x903A, 0x0012, 0x2BF5, 0x432C, +0x4B2F, 0x129F, 0x001C, 0x430A, 0x410C, 0x530C, 0x5A0C, 0x4B2F, 0x129F, +0x0014, 0x531A, 0x922A, 0x2BF7, 0x4038, 0x1712, 0xB0F1, 0x0010, 0x0020, +0x280A, 0x4226, 0x407C, 0x0028, 0x12A8, 0x430C, 0x1292, 0x1718, 0xB22C, +0x2C01, 0x4317, 0x407C, 0x00B0, 0x12A8, 0x4039, 0x171C, 0x403C, 0x0003, +0x12B0, 0xD7B8, 0x4C81, 0x0014, 0x4D81, 0x0016, 0x403C, 0x0005, 0x12B0, +0xD7B8, 0x4C81, 0x0010, 0x4D81, 0x0012, 0x403C, 0x0007, 0x12B0, 0xD7B8, +0x4C81, 0x000C, 0x4D81, 0x000E, 0x403C, 0x0081, 0x12B0, 0xD7B8, 0x4C81, +0x0008, 0x4D81, 0x000A, 0x431C, 0x12B0, 0xD7B8, 0x4C81, 0x0004, 0x4D81, +0x0006, 0x12B0, 0xD73C, 0x460C, 0x430D, 0x12A9, 0x422C, 0x430D, 0x12A9, +0x433C, 0x433D, 0x12A9, 0x403C, 0x0006, 0x12B0, 0xD7FE, 0x403C, 0x0080, +0x12B0, 0xD7FE, 0x4106, 0x5036, 0x002A, 0x1206, 0x430F, 0x430E, 0x403D, +0x0012, 0x410C, 0x503C, 0x001A, 0x4B24, 0x1294, 0x000E, 0x403C, 0x0003, +0x1292, 0x11EC, 0x12B0, 0xD812, 0x5321, 0x9304, 0x2055, 0x3C07, 0x4307, +0x407C, 0x0021, 0x12A8, 0x407C, 0x00A8, 0x12A8, 0x407C, 0x00D0, 0x12A8, +0x531A, 0x430C, 0x1292, 0x1718, 0x934C, 0x3803, 0x903A, 0x0064, 0x2BF7, +0x903A, 0x0064, 0x2803, 0x403C, 0xFFCC, 0x3C3C, 0x9307, 0x23E5, 0x12B0, +0xD73C, 0x411C, 0x0014, 0x411D, 0x0016, 0x12A9, 0x422C, 0x430D, 0x12A9, +0x411C, 0x0010, 0x411D, 0x0012, 0x12A9, 0x403C, 0x0006, 0x430D, 0x12A9, +0x411C, 0x000C, 0x411D, 0x000E, 0x12A9, 0x403C, 0x0080, 0x430D, 0x12A9, +0x411C, 0x0008, 0x411D, 0x000A, 0x12A9, 0x430C, 0x430D, 0x12A9, 0x411C, +0x0004, 0x411D, 0x0006, 0x12A9, 0x1206, 0x430F, 0x431E, 0x422D, 0x410C, +0x532C, 0x4B27, 0x1297, 0x000E, 0x403C, 0x0003, 0x1292, 0x11E8, 0x12B0, +0xD812, 0x5321, 0x440C, 0x5031, 0x003C, 0x4030, 0xD318, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0030, 0x430B, +0x4304, 0x4306, 0x403A, 0x16F4, 0x410C, 0x503C, 0x000C, 0x5B0C, 0x4A2F, +0x129F, 0x0014, 0x531B, 0x903B, 0x0012, 0x2BF5, 0x432C, 0x4A2F, 0x129F, +0x001C, 0x430B, 0x410C, 0x523C, 0x5B0C, 0x4A2F, 0x129F, 0x0014, 0x531B, +0x922B, 0x2BF7, 0x4038, 0x1718, 0x4039, 0x1712, 0xB0F1, 0x0010, 0x0014, +0x2809, 0x4224, 0x407C, 0x0028, 0x12A9, 0x430C, 0x12A8, 0xB22C, 0x2C01, +0x4316, 0x407C, 0x0090, 0x12A9, 0x403C, 0x0003, 0x12B0, 0xDB0C, 0x4C81, +0x0006, 0x403C, 0x0005, 0x12B0, 0xDB0C, 0x4C81, 0x0004, 0x403C, 0x0007, +0x12B0, 0xDB0C, 0x4C81, 0x0002, 0x403C, 0x0081, 0x12B0, 0xDB0C, 0x4C81, +0x0000, 0x431C, 0x12B0, 0xDB0C, 0x4C07, 0x12B0, 0xD876, 0x440C, 0x12A8, +0x422C, 0x12A8, 0x433C, 0x12A8, 0x403C, 0x0006, 0x12A8, 0x431C, 0x12A8, +0x403C, 0x0080, 0x12A8, 0x431C, 0x12A8, 0x4104, 0x5034, 0x001E, 0x1204, +0x430F, 0x430E, 0x403D, 0x0012, 0x410C, 0x503C, 0x000E, 0x4A25, 0x1295, +0x000E, 0x403C, 0x0003, 0x1292, 0x1198, 0x12B0, 0xD8C6, 0x5321, 0x9305, +0x2044, 0x3C07, 0x4306, 0x407C, 0x0021, 0x12A9, 0x407C, 0x00A8, 0x12A9, +0x407C, 0x00D0, 0x12A9, 0x531B, 0x430C, 0x12A8, 0x934C, 0x3803, 0x903B, +0x0032, 0x2BF8, 0x903B, 0x0032, 0x2803, 0x403C, 0xFFCC, 0x3C2C, 0x9306, +0x23E6, 0x12B0, 0xD876, 0x411C, 0x0006, 0x12A8, 0x422C, 0x12A8, 0x411C, +0x0004, 0x12A8, 0x403C, 0x0006, 0x12A8, 0x411C, 0x0002, 0x12A8, 0x403C, +0x0080, 0x12A8, 0x412C, 0x12B0, 0xDB0C, 0x470C, 0x12A8, 0x1204, 0x430F, +0x431E, 0x422D, 0x410C, 0x503C, 0x000A, 0x4A2B, 0x129B, 0x000E, 0x403C, +0x0003, 0x1292, 0x1194, 0x12B0, 0xD8C6, 0x5321, 0x450C, 0x5031, 0x0030, +0x4030, 0xD316, 0x12B0, 0xCF58, 0x407C, 0x00C1, 0x4820, 0x4215, 0x1590, +0xD035, 0x0040, 0x12B0, 0x78DC, 0x12A8, 0x450C, 0x4030, 0x78D6, 0x12B0, +0x78DC, 0x12A8, 0x411C, 0x0002, 0x12AB, 0x435C, 0x4A20, 0x12B0, 0x79B4, +0x403C, 0x012C, 0x12AB, 0x407C, 0x00A1, 0x4130, 0x12B0, 0x7910, 0x12AA, +0x494C, 0x12A8, 0x403C, 0x00FE, 0x12B0, 0x7910, 0x12AA, 0x12B0, 0x7A1A, +0x430C, 0x12AB, 0x4C81, 0x0002, 0x4030, 0x7A30, 0x12AB, 0x434C, 0x12AA, +0x454C, 0x12A8, 0x435C, 0x4130, 0x12B0, 0x79A6, 0x12B0, 0x798E, 0x4C81, +0x0002, 0x12B0, 0x79DC, 0x4130, 0x403C, 0x0003, 0x1292, 0x1194, 0x410C, +0x503C, 0x0028, 0x421F, 0x16F4, 0x129F, 0x0010, 0x403C, 0x157E, 0x12B0, +0xA042, 0x4291, 0x158C, 0x0004, 0x12B0, 0x79B4, 0x403C, 0x0128, 0x12B0, +0x79CA, 0x4291, 0x158E, 0x0004, 0x12B0, 0x79B4, 0x403C, 0x012A, 0x12B0, +0x79CA, 0x4291, 0x1590, 0x0004, 0x12B0, 0x78DC, 0x12B0, 0x79D0, 0x12B0, +0x79A6, 0x12B0, 0x798E, 0x4C81, 0x0004, 0x3FCE, 0x12B0, 0x799E, 0x435C, +0x12AA, 0x434C, 0x12AA, 0x430C, 0x4B20, 0x12AB, 0x407C, 0x00A1, 0x4820, +0x12B0, 0xCF58, 0x12B0, 0x78B2, 0x403C, 0x012C, 0x4130, 0x12B0, 0xCF58, +0x12B0, 0x79BE, 0x3F7A, 0x407C, 0x0048, 0x12A8, 0x427C, 0x4210, 0x1716, +0x12AB, 0x407C, 0x00A1, 0x12A8, 0x411C, 0x0006, 0x12AB, 0x435C, 0x12AA, +0x434C, 0x12AA, 0x464C, 0x12A8, 0x470C, 0x12AB, 0x444C, 0x12A8, 0x435C, +0x4A20, 0x12B0, 0x7A22, 0x4820, 0x4F81, 0x0002, 0x12B0, 0x7A22, 0x12A8, +0x403C, 0x4030, 0x12B0, 0x7A18, 0x411C, 0x0002, 0x12B0, 0x7A18, 0x444C, +0x12A8, 0x4030, 0x7A30, 0x12AB, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x464C, +0x12A8, 0x403C, 0x3401, 0x12AB, 0x494C, 0x4130, 0x12B0, 0xDADE, 0x470C, +0x4030, 0x78D6, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, +0x1205, 0x8031, 0x0022, 0x403F, 0x25B2, 0x4FF1, 0x000C, 0x4FF1, 0x000D, +0x4FF1, 0x000E, 0x4FF1, 0x000F, 0x403A, 0x16F4, 0x410C, 0x530C, 0x4A2F, +0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFDD, 0x3C9E, 0x410C, 0x523C, +0x4A2F, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFDC, 0x3C94, 0x410B, +0x503B, 0x0010, 0x120B, 0x12B0, 0xD298, 0x12B0, 0xD286, 0x5321, 0x9307, +0x3402, 0x470C, 0x3C87, 0x4038, 0x1712, 0x407C, 0x0048, 0x12A8, 0x435C, +0x1292, 0x1716, 0x4039, 0x1726, 0x435C, 0x12A9, 0x4077, 0x000A, 0x4036, +0x1718, 0x12B0, 0xD84E, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2404, 0x12B0, +0xD562, 0x5377, 0x23F5, 0x4074, 0x0082, 0x4077, 0x00C8, 0x9382, 0x16EE, +0x242B, 0x4125, 0x8225, 0x474C, 0x12A8, 0x403C, 0x3401, 0x12A6, 0x444C, +0x12A8, 0x12B0, 0xD55C, 0x450C, 0x12B0, 0xD560, 0x407C, 0x0021, 0x12A8, +0x12B0, 0xD508, 0x435C, 0x12A9, 0x12B0, 0xD416, 0x403C, 0x3FFF, 0x12A6, +0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12A9, +0x434C, 0x12A9, 0x444C, 0x12A8, 0x411C, 0x0004, 0x832C, 0x3C13, 0x12B0, +0xD416, 0x435C, 0x12A9, 0x12B0, 0xD55C, 0x411C, 0x0004, 0x832C, 0x12B0, +0xD560, 0x12B0, 0xD562, 0x434C, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x430C, +0x12A6, 0x407C, 0x0022, 0x12A8, 0x411C, 0x0008, 0x411D, 0x000A, 0x1292, +0x1728, 0x407C, 0x0062, 0x12A8, 0x430C, 0x12A6, 0x4A2F, 0x129F, 0x0008, +0x435C, 0x12A9, 0x9382, 0x16EE, 0x2409, 0x12B0, 0xD508, 0x407C, 0x0021, +0x12A8, 0x435C, 0x12A9, 0x12B0, 0xD84E, 0x120B, 0x12B0, 0xD298, 0x12B0, +0xD286, 0x470C, 0x5321, 0x5031, 0x0022, 0x4030, 0xD316, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x120C, 0x8231, 0x4381, +0x0004, 0x403A, 0x1726, 0x403B, 0x1718, 0x4038, 0x1712, 0x4074, 0x0021, +0x4079, 0x00C8, 0x4077, 0x0082, 0x4036, 0x16F4, 0xB31C, 0x2851, 0x403C, +0x1698, 0x462F, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3C8F, +0x403C, 0x1694, 0x462F, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, +0x3C85, 0x407C, 0x0028, 0x12A8, 0x4C4C, 0x4C82, 0x16A0, 0x421C, 0x1698, +0x421D, 0x169A, 0x12B0, 0xCAC0, 0xF03C, 0x0F00, 0x503C, 0x0080, 0x4C82, +0x169C, 0x4292, 0x1698, 0x1698, 0x4382, 0x169A, 0x4291, 0x1698, 0x0006, +0x4C05, 0x407C, 0x0028, 0x12A8, 0x430C, 0x12B0, 0xDB12, 0x474C, 0x12A8, +0x435C, 0x12AA, 0x450C, 0x12B0, 0xDB12, 0x12B0, 0xD138, 0x411C, 0x0006, +0x12B0, 0xDB12, 0x435C, 0x12AA, 0x403C, 0x4303, 0x12B0, 0xDB12, 0x12B0, +0xD456, 0x403C, 0x0500, 0x12B0, 0xDAB8, 0x407C, 0x00C2, 0x12A8, 0xB3A1, +0x0008, 0x2C05, 0x12B0, 0xD8A8, 0x462F, 0x129F, 0x0002, 0x410D, 0x530D, +0x410C, 0x532C, 0x462F, 0x129F, 0x001A, 0x3C12, 0x435C, 0x12AA, 0x411F, +0x0002, 0x53A1, 0x0002, 0x4F2C, 0x12AB, 0x412F, 0x832F, 0x4F81, 0x0000, +0x434C, 0x12AA, 0x53B2, 0x1694, 0x63B2, 0x1696, 0x421F, 0x1694, 0xD21F, +0x1696, 0x930F, 0x2403, 0x9381, 0x0000, 0x23E5, 0x4035, 0x0501, 0xB3A1, +0x0008, 0x2808, 0x12B0, 0xC356, 0x421C, 0x169E, 0x462F, 0x129F, 0x0008, +0x3C0E, 0x421F, 0x1694, 0xD21F, 0x1696, 0x930F, 0x2403, 0x12B0, 0xD8A8, +0x3C05, 0x12B0, 0xC356, 0x40B1, 0xFFF6, 0x0004, 0x411C, 0x0004, 0x5031, +0x000A, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, +0x1204, 0x1205, 0x8031, 0x0040, 0x410C, 0x503C, 0x001A, 0x403E, 0x25BA, +0x403D, 0x0025, 0x12B0, 0xD3B6, 0x42D1, 0x16EC, 0x001A, 0x42D1, 0x16ED, +0x001B, 0x403A, 0x16F4, 0x410C, 0x530C, 0x4A2F, 0x129F, 0x0018, 0x410C, +0x522C, 0x4A2F, 0x129F, 0x0018, 0x430F, 0x410B, 0x503B, 0x001A, 0x4B07, +0x5F07, 0x4FD7, 0x1740, 0x0005, 0x531F, 0x903F, 0x0020, 0x3BF7, 0x4107, +0x5237, 0x1207, 0x430F, 0x430E, 0x403D, 0x0025, 0x4B0C, 0x4A28, 0x1298, +0x000E, 0x12B0, 0xD3E6, 0x411C, 0x0002, 0x411D, 0x0004, 0x12B0, 0xCAC0, +0x4C04, 0xF034, 0x0F00, 0x5034, 0x0080, 0x4115, 0x0002, 0x4038, 0x1712, +0x407C, 0x0028, 0x12A8, 0x4039, 0x1718, 0x430C, 0x12A9, 0x4036, 0x1726, +0x434C, 0x12A6, 0x12B0, 0xD9F8, 0x435C, 0x12A6, 0x440C, 0x12A9, 0x434C, +0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x1400, 0x12B0, 0xD9F6, 0x434C, +0x12A6, 0x435C, 0x12A6, 0x450C, 0x12A9, 0x434C, 0x12A6, 0x435C, 0x12A6, +0x403C, 0x4303, 0x12A9, 0x434C, 0x12A6, 0x407C, 0x0021, 0x12A8, 0x430C, +0x430D, 0x1292, 0x171A, 0x435C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, +0x0501, 0x12B0, 0xD9F6, 0x411C, 0x0002, 0x832C, 0x12A9, 0x407C, 0x0022, +0x12A8, 0x411C, 0x0006, 0x411D, 0x0008, 0x1292, 0x1728, 0x407C, 0x0062, +0x12A8, 0x430C, 0x12A9, 0x4A2F, 0x129F, 0x0008, 0x430F, 0x5321, 0x4B0E, +0x5F0E, 0x4FDE, 0x1740, 0x0005, 0x531F, 0x903F, 0x0020, 0x3BF7, 0x1207, +0x430F, 0x430E, 0x403D, 0x0025, 0x4B0C, 0x4A2B, 0x129B, 0x000E, 0x12B0, +0xD3E6, 0x430C, 0x5031, 0x0042, 0x4030, 0xD316, 0x12AB, 0x435C, 0x12AA, +0x434C, 0x4A20, 0x431C, 0x1292, 0x1540, 0x430C, 0x12AB, 0x411F, 0x0006, +0x533F, 0x4F81, 0x0006, 0x421F, 0x1600, 0x4130, 0x12AB, 0x4030, 0x7F8A, +0x12B0, 0x7FBA, 0x4B20, 0x12B0, 0xD8F8, 0x435C, 0x12AA, 0x464C, 0x4820, +0x464C, 0x12A8, 0x403C, 0x3FFF, 0x12AB, 0x434C, 0x12AA, 0x494C, 0x12A8, +0x403C, 0x2409, 0x12AB, 0x3FD6, 0x464C, 0x12A8, 0x403C, 0x4030, 0x12AB, +0x435C, 0x12AA, 0x434C, 0x12AA, 0x411C, 0x0002, 0x12AB, 0x12B0, 0xDACE, +0x434C, 0x12AA, 0x407C, 0x00A8, 0x12A8, 0x454C, 0x4820, 0x12B0, 0x7EDA, +0x12B0, 0x7F2C, 0x403C, 0x012A, 0x4130, 0x407C, 0x0048, 0x12A8, 0x427C, +0x1292, 0x1716, 0x407C, 0x00C1, 0x4820, 0x12B0, 0x7F90, 0x12AB, 0x407C, +0x00A1, 0x12A8, 0x411C, 0x0002, 0x4130, 0x494C, 0x12A8, 0x403C, 0x3401, +0x12AB, 0x464C, 0x4820, 0x12B0, 0x7ECE, 0x403C, 0x3FFD, 0x12B0, 0xDA8E, +0x12AA, 0x12B0, 0xDA9E, 0x4A20, 0x12B0, 0x7F90, 0x12B0, 0x7F88, 0x440C, +0x12AB, 0x435C, 0x12AA, 0x12B0, 0x7FC6, 0x4A20, 0x12AB, 0x407C, 0x00A1, +0x4820, 0x12B0, 0x7EDA, 0x12B0, 0x7F2C, 0x403C, 0x012C, 0x4130, 0x12B0, +0x7FD2, 0x4820, 0x12B0, 0x7FD2, 0x12A8, 0x403C, 0x012C, 0x12B0, 0x7FBA, +0x12AB, 0x4C81, 0x0002, 0x3FE4, 0x12B0, 0x7F88, 0x12B0, 0x7EA0, 0x430C, +0x4130, 0x12B0, 0xD688, 0x454C, 0x12A8, 0x435C, 0x4130, 0x12B0, 0x7EDA, +0x407C, 0x00C1, 0x4130, 0x12B0, 0xDA8E, 0x12AA, 0x464C, 0x12A8, 0x403C, +0x00FE, 0x12AB, 0x434C, 0x12AA, 0x444C, 0x12A8, 0x12B0, 0xDACE, 0x430C, +0x12AB, 0x4C81, 0x0002, 0x3FB5, 0xE03F, 0x8000, 0x1206, 0x4D06, 0x5606, +0x9036, 0xFF01, 0x2CA7, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0E, 0x4D06, +0x5606, 0x9036, 0xFF00, 0x200B, 0x4F06, 0x5606, 0x9036, 0xFF00, 0x2098, +0x4D06, 0xEF06, 0x5606, 0x2894, 0x433D, 0x3C92, 0x4F06, 0x5606, 0x9036, +0xFF00, 0x2407, 0xB03F, 0x7FFF, 0x2007, 0x4D06, 0x5606, 0x2087, 0x2886, +0x4E0C, 0x4F0D, 0x3C83, 0xB03D, 0x7FFF, 0x27FA, 0x1209, 0x1208, 0x1207, +0x4D06, 0x4F07, 0x5606, 0x5707, 0x9607, 0x2809, 0x2002, 0x9C0E, 0x2806, +0xED0F, 0xEF0D, 0xED0F, 0xEC0E, 0xEE0C, 0xEC0E, 0x4F06, 0x5606, 0x6909, +0x1086, 0xD07F, 0x0080, 0x4D08, 0x5808, 0x6909, 0x1088, 0xF378, 0xD07D, +0x0080, 0x4307, 0x8846, 0x2415, 0x9076, 0xFFF1, 0x2C0D, 0x9076, 0xFFE8, +0x2846, 0x4E07, 0x4F0E, 0x430F, 0x5076, 0x0010, 0x2409, 0x9347, 0x2402, +0xD037, 0x0100, 0x110F, 0x100E, 0x1007, 0x5356, 0x23FB, 0x4906, 0x1106, +0xE906, 0xB316, 0x242F, 0xE337, 0x5317, 0x7E0C, 0x7F4D, 0x2010, 0x930C, +0x2007, 0x9307, 0x2438, 0x1087, 0x474D, 0x8038, 0x0018, 0x3C06, 0x108C, +0x4C4D, 0xED0C, 0x1087, 0xD70C, 0x8238, 0x4307, 0x5707, 0x6C0C, 0x6D4D, +0x2C09, 0x8318, 0x5707, 0x6C0C, 0x6D4D, 0x2C04, 0x8318, 0x5C0C, 0x6D4D, +0x2BFC, 0x9318, 0x3411, 0x430D, 0x3C05, 0x5358, 0x9378, 0x200C, 0x403D, +0xFF00, 0x430C, 0x1009, 0x100D, 0x3C12, 0x5E0C, 0x6F4D, 0x2FF4, 0x5707, +0x6C0C, 0x6D4D, 0x1088, 0xD80D, 0x1009, 0x100D, 0x100C, 0x2806, 0x9307, +0x2002, 0xB31C, 0x2402, 0x531C, 0x630D, 0x4137, 0x4138, 0x4139, 0x4136, +0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, +0x8031, 0x0006, 0x403A, 0x1712, 0x407C, 0x0028, 0x12AA, 0x4C44, 0x4316, +0x403B, 0x1718, 0x4038, 0x1726, 0x4079, 0x00C8, 0x4077, 0x0082, 0x3C03, +0x9326, 0x2001, 0x4226, 0x4645, 0x1085, 0xF035, 0x0F00, 0x5035, 0x0060, +0x407C, 0x0028, 0x12AA, 0x907C, 0x0098, 0x2403, 0x403F, 0x018C, 0x3C02, +0x403F, 0x014C, 0x4F81, 0x0000, 0x12B0, 0xD37A, 0x450C, 0x12AB, 0x494C, +0x12AA, 0x403C, 0x1401, 0x12B0, 0xD620, 0x9382, 0x16EA, 0x2403, 0x403C, +0x0FF6, 0x3C01, 0x412C, 0x12AB, 0x12B0, 0xD626, 0x403C, 0x3FFD, 0x12AB, +0x434C, 0x12A8, 0x9382, 0x16EA, 0x2402, 0x12B0, 0xD89E, 0x12B0, 0xD370, +0x430C, 0x12AB, 0x4C81, 0x0000, 0x12B0, 0xD626, 0x430C, 0x12AB, 0x4C05, +0x12B0, 0xD626, 0x12B0, 0xD626, 0x12B0, 0xD626, 0x9382, 0x16EA, 0x2002, +0x12B0, 0xD89E, 0x434C, 0x12A8, 0x12B0, 0xD370, 0x41A1, 0x0002, 0x4581, +0x0004, 0x403D, 0x0003, 0x410C, 0x532C, 0x421F, 0x16F4, 0x129F, 0x0006, +0x9074, 0x0091, 0x2406, 0x9074, 0x0099, 0x2403, 0x9074, 0x0098, 0x2029, +0x407C, 0x0028, 0x12AA, 0x430C, 0x12AB, 0x12B0, 0xD37A, 0x403C, 0x0080, +0x12AB, 0x434C, 0x12A8, 0x494C, 0x12AA, 0x403C, 0x1400, 0x12B0, 0xD620, +0x422C, 0x12AB, 0x12B0, 0xD626, 0x403C, 0x4303, 0x12AB, 0x434C, 0x12A8, +0x407C, 0x0021, 0x12AA, 0x430C, 0x430D, 0x1292, 0x171A, 0x12B0, 0xD89E, +0x435C, 0x12A8, 0x407C, 0x0021, 0x12AA, 0x5316, 0x9036, 0x0010, 0x2B70, +0x12B0, 0xCA36, 0x430C, 0x5031, 0x0006, 0x4030, 0xD316, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, 0x001E, 0x403F, 0x25B6, +0x4FF1, 0x0008, 0x4FF1, 0x0009, 0x4FF1, 0x000A, 0x4FF1, 0x000B, 0x403A, +0x16F4, 0x410C, 0x530C, 0x4A2F, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, +0xFFDD, 0x3C8D, 0x410C, 0x522C, 0x4A2F, 0x129F, 0x0018, 0x930C, 0x3403, +0x403C, 0xFFDC, 0x3C83, 0x4104, 0x5034, 0x000C, 0x1204, 0x12B0, 0xD304, +0x12B0, 0xD2F2, 0x5321, 0x930B, 0x3402, 0x4B0C, 0x3C76, 0x4126, 0x4117, +0x0002, 0x5036, 0xFFFC, 0x6337, 0x403B, 0x1712, 0x407C, 0x0088, 0x12AB, +0x407C, 0x0034, 0x1292, 0x1716, 0x407C, 0x0082, 0x12AB, 0x4038, 0x1718, +0x460C, 0x470D, 0x12B0, 0xCAC0, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x12A8, +0x4039, 0x1726, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x460C, 0x12A8, 0x434C, +0x12A9, 0x435C, 0x12A9, 0x407C, 0x0021, 0x12AB, 0x434C, 0x12A9, 0x407C, +0x0088, 0x12AB, 0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x12A9, 0x4126, +0x407C, 0x0082, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x12B0, 0xD81C, 0x403C, +0x2409, 0x12A8, 0x435C, 0x12A9, 0x434C, 0x12A9, 0x407C, 0x0082, 0x12AB, +0x460C, 0x832C, 0x12A8, 0x407C, 0x0022, 0x12AB, 0x411C, 0x0004, 0x411D, +0x0006, 0x1292, 0x1728, 0x407C, 0x0062, 0x12AB, 0x430C, 0x12A8, 0x4A2F, +0x129F, 0x0008, 0x435C, 0x12A9, 0x12B0, 0xD81C, 0x403C, 0x2401, 0x12A8, +0x407C, 0x0021, 0x12AB, 0x435C, 0x12A9, 0x407C, 0x0028, 0x12AB, 0x430C, +0x12A8, 0x1204, 0x12B0, 0xD304, 0x12B0, 0xD2F2, 0x4B0C, 0x5321, 0x5031, +0x001E, 0x4030, 0xD318, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, +0x1204, 0x4327, 0x407C, 0x0028, 0x1292, 0x1712, 0x907C, 0x0089, 0x2411, +0x907C, 0x008D, 0x240E, 0x907C, 0x0091, 0x240B, 0x907C, 0x0095, 0x2408, +0x907C, 0x0098, 0x2405, 0x907C, 0x0099, 0x2402, 0x432C, 0x3C86, 0x407C, +0x0090, 0x1292, 0x1712, 0x403A, 0x1718, 0x403C, 0x009F, 0x12B0, 0xDA08, +0x4C06, 0xB03C, 0x0100, 0x2877, 0x403B, 0x009D, 0x4038, 0x16F4, 0x4C4E, +0xF07E, 0x0006, 0x926E, 0x2016, 0x4309, 0x403C, 0x0010, 0x12B0, 0xCE4C, +0x403C, 0x009E, 0x12AA, 0xD036, 0x0040, 0x460C, 0x12AA, 0x403C, 0x009A, +0x12AA, 0x490C, 0x12B0, 0xCE52, 0x5319, 0x9239, 0x2C58, 0x3FF6, 0x403C, +0x009B, 0x12B0, 0xDA08, 0x4C09, 0x1089, 0xF379, 0x1109, 0x1109, 0x421F, +0x168E, 0xB236, 0x2819, 0xB036, 0x0200, 0x2C02, 0x9349, 0x200C, 0x403C, +0x009E, 0x12AA, 0xC316, 0xD036, 0x0040, 0x460C, 0x12AA, 0x4234, 0x8214, +0x168E, 0x3C1B, 0x9F09, 0x2003, 0x4982, 0x168E, 0x3C35, 0x4904, 0x8F04, +0x3C13, 0x9F09, 0x2403, 0x4382, 0x1690, 0x3FF5, 0x5392, 0x1690, 0x90B2, +0x0014, 0x1690, 0x23EF, 0xB036, 0x0200, 0x2804, 0x4234, 0x4982, 0x168E, +0x3C05, 0x4904, 0x4982, 0x168E, 0x9314, 0x381B, 0x4906, 0x8406, 0xF036, +0x0007, 0x432C, 0x12B0, 0xCE4C, 0x440C, 0x12B0, 0xCE4C, 0x403C, 0x009A, +0x12AA, 0x460C, 0x12B0, 0xCE52, 0x12B0, 0xDA06, 0x12B0, 0xCE4C, 0x5316, +0x9236, 0x2801, 0x4306, 0x9906, 0x23F0, 0x4317, 0x470C, 0x4030, 0xD318, +0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4324, +0x407C, 0x0028, 0x1292, 0x1712, 0x907C, 0x0089, 0x2411, 0x907C, 0x008D, +0x240E, 0x907C, 0x0091, 0x240B, 0x907C, 0x0095, 0x2408, 0x907C, 0x0098, +0x2405, 0x907C, 0x0099, 0x2402, 0x432C, 0x3C85, 0x407C, 0x00B0, 0x1292, +0x1712, 0x4039, 0x171C, 0x403C, 0x009F, 0x12B0, 0xD6C6, 0x4C08, 0xB03C, +0x0100, 0x2876, 0x403A, 0x009D, 0x4036, 0x16F4, 0x4C4E, 0xF07E, 0x0006, +0x926E, 0x2016, 0x4307, 0x403C, 0x0010, 0x12B0, 0xCEE2, 0x403C, 0x009E, +0x430D, 0x12A9, 0x12B0, 0xD952, 0x403C, 0x009A, 0x430D, 0x12A9, 0x470C, +0x12B0, 0xCEE8, 0x5317, 0x9237, 0x2C57, 0x3FF5, 0x403C, 0x009B, 0x12B0, +0xD6C6, 0x12B0, 0xCAB4, 0x4C07, 0x421F, 0x168E, 0xB238, 0x2818, 0xB038, +0x0200, 0x2C02, 0x930C, 0x200B, 0x403C, 0x009E, 0x430D, 0x12A9, 0xC318, +0x12B0, 0xD952, 0x4235, 0x8215, 0x168E, 0x3C1B, 0x9F0C, 0x2003, 0x4C82, +0x168E, 0x3C37, 0x4C05, 0x8F05, 0x3C13, 0x9F0C, 0x2403, 0x4382, 0x1692, +0x3FF5, 0x5392, 0x1692, 0x90B2, 0x0014, 0x1692, 0x23EF, 0xB038, 0x0200, +0x2804, 0x4235, 0x4C82, 0x168E, 0x3C05, 0x4C05, 0x4782, 0x168E, 0x9315, +0x381D, 0x4708, 0x8508, 0xF038, 0x0007, 0x432C, 0x12B0, 0xCEE2, 0x450C, +0x12B0, 0xCEE2, 0x403C, 0x009A, 0x430D, 0x12A9, 0x480C, 0x12B0, 0xCEE8, +0x4A0C, 0x12B0, 0xD6C6, 0x12B0, 0xCEE2, 0x5318, 0x9238, 0x2801, 0x4308, +0x9708, 0x23EE, 0x4314, 0x440C, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0040, 0x4C05, 0x40B1, +0x0007, 0x0002, 0x4308, 0x4036, 0x0006, 0x4381, 0x0000, 0x4039, 0x16F4, +0x410C, 0x530C, 0x492F, 0x129F, 0x0016, 0x930C, 0x3403, 0x403C, 0xFFFE, +0x3C81, 0x410C, 0x532C, 0x492F, 0x129F, 0x0016, 0x930C, 0x3403, 0x403C, +0xFFBE, 0x3C77, 0x90B1, 0x000F, 0x0002, 0x2002, 0x4036, 0x0009, 0x403C, +0x0C04, 0x430D, 0x1292, 0x1674, 0x4034, 0x0018, 0x440E, 0x410D, 0x522D, +0x412C, 0x1292, 0x1678, 0x440E, 0x403D, 0x130A, 0x412C, 0x1292, 0x1676, +0x4037, 0x0028, 0x460E, 0xD03E, 0x0080, 0x480D, 0x5D0D, 0x5D0D, 0x5D0D, +0x5D0D, 0x5D0D, 0x412C, 0x12B0, 0x92E6, 0x4C0A, 0x4D0B, 0x9305, 0x2406, +0x440E, 0x403D, 0x130A, 0x412C, 0x1292, 0x1676, 0x4A0F, 0xDB0F, 0x930F, +0x242C, 0x903B, 0x0020, 0x280F, 0x2003, 0x903A, 0xA761, 0x280B, 0x480F, +0x5338, 0x930F, 0x2016, 0x4038, 0x0007, 0x460F, 0x5336, 0x930F, 0x2010, +0x3C1A, 0x903B, 0x0015, 0x2804, 0x200E, 0x903A, 0x83D0, 0x2C0B, 0x5318, +0x9238, 0x2805, 0x4308, 0x5316, 0x9681, 0x0002, 0x280B, 0x5337, 0x9317, +0x37C2, 0x440E, 0x410D, 0x522D, 0x412C, 0x1292, 0x1676, 0x9317, 0x3402, +0x433C, 0x3C14, 0x5808, 0x5808, 0x5808, 0x5808, 0x5808, 0x480C, 0x492F, +0x129F, 0x0008, 0xD036, 0x0080, 0x460C, 0x492F, 0x129F, 0x0008, 0x430C, +0x492F, 0x129F, 0x0008, 0x430C, 0x5031, 0x0040, 0x4030, 0xD316, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8231, 0x4381, 0x0004, +0x4381, 0x0006, 0x4034, 0x4E20, 0x4381, 0x0000, 0x4381, 0x0002, 0x410C, +0x522C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x411A, 0x0004, 0x411B, 0x0006, +0xD23A, 0x4038, 0x1726, 0x434C, 0x12A8, 0x4039, 0x1712, 0x407C, 0x00C1, +0x12A9, 0x4037, 0x171A, 0x12B0, 0xD096, 0x4036, 0x1718, 0x12B0, 0xD382, +0xB31B, 0x2862, 0x407C, 0x0028, 0x12A9, 0x430C, 0x12A6, 0x434C, 0x12A8, +0x407C, 0x0082, 0x12A9, 0x435C, 0x12A8, 0x403C, 0x0080, 0x12A6, 0x434C, +0x12A8, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x1400, 0x12A6, 0x407C, 0x0082, +0x12A9, 0x12B0, 0xD38C, 0x422C, 0x12A6, 0x12B0, 0xD38C, 0x403C, 0x4303, +0x12A6, 0x434C, 0x12A8, 0x12B0, 0xD76C, 0x407C, 0x00C8, 0x12A9, 0x403C, +0x0501, 0x12A6, 0x435C, 0x12A8, 0x407C, 0x0021, 0x12A9, 0x407C, 0x00C8, +0x12A9, 0x403C, 0x1501, 0x12A6, 0x3C02, 0x12B0, 0xD38C, 0x440F, 0x5334, +0x930F, 0x23FA, 0x12B0, 0xD76C, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x92A1, +0x0000, 0x2003, 0x9381, 0x0002, 0x2409, 0x90B1, 0x0006, 0x0000, 0x2003, +0x9381, 0x0002, 0x2402, 0x433C, 0x3C15, 0x411A, 0x0004, 0x411B, 0x0006, +0xD23A, 0x434C, 0x12A8, 0x407C, 0x00C1, 0x12A9, 0x12B0, 0xD096, 0x12B0, +0xD382, 0xF31B, 0x4B0C, 0x421F, 0x16F4, 0x129F, 0x0008, 0x430C, 0x5231, +0x4030, 0xD318, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, +0x1205, 0x8031, 0x003E, 0x4C05, 0x4308, 0x4039, 0x001B, 0x4381, 0x0000, +0x430A, 0x430B, 0x4036, 0x16F4, 0x410C, 0x530C, 0x462F, 0x129F, 0x0016, +0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C79, 0x403C, 0x0C04, 0x430D, 0x1292, +0x1674, 0x403E, 0x001D, 0x410D, 0x532D, 0x412C, 0x1292, 0x1678, 0x403E, +0x001D, 0x403D, 0x133A, 0x412C, 0x1292, 0x1676, 0x3C02, 0x4709, 0x4314, +0x480F, 0x531F, 0x990F, 0x2C25, 0x4907, 0x5807, 0xC312, 0x1007, 0x4304, +0x430E, 0x470D, 0x5D0D, 0x5D0D, 0x5D0D, 0x412C, 0x12B0, 0x92E6, 0x4C0A, +0x4D0B, 0x9305, 0x2407, 0x403E, 0x001D, 0x403D, 0x133A, 0x412C, 0x1292, +0x1676, 0x4A0F, 0xDB0F, 0x930F, 0x2409, 0x903B, 0x0020, 0x2804, 0x23DA, +0x903A, 0xA761, 0x2FD7, 0x4708, 0x3FD7, 0x9304, 0x240A, 0x430E, 0x480D, +0x5D0D, 0x5D0D, 0x5D0D, 0x412C, 0x12B0, 0x92E6, 0x4C0A, 0x4D0B, 0x403E, +0x0018, 0x410D, 0x532D, 0x412C, 0x1292, 0x1676, 0x503A, 0x6478, 0x603B, +0xFFEC, 0x903B, 0x0010, 0x2806, 0x2003, 0x903A, 0xB559, 0x2802, 0x433C, +0x3C1A, 0x430C, 0x462F, 0x129F, 0x0008, 0x5808, 0x5808, 0x5808, 0x480C, +0x462F, 0x129F, 0x0008, 0x403C, 0x0080, 0x462F, 0x129F, 0x0008, 0x403C, +0x0080, 0x462F, 0x129F, 0x0008, 0x430C, 0x462F, 0x129F, 0x0008, 0x430C, +0x5031, 0x003E, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x8231, 0x410C, 0x522C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x410C, 0x530C, +0x421F, 0x16F4, 0x129F, 0x0018, 0x4038, 0x1712, 0x407C, 0x0048, 0x12A8, +0x435C, 0x1292, 0x1716, 0x4039, 0x1726, 0x435C, 0x12A9, 0x407A, 0x000A, +0x4036, 0x1718, 0x407C, 0x0028, 0x12A8, 0x430C, 0x12A6, 0xF07C, 0x0081, +0x907C, 0x0081, 0x2404, 0x12B0, 0xD7C4, 0x537A, 0x23F2, 0x411A, 0x0004, +0x411B, 0x0006, 0x503A, 0xFFFE, 0x633B, 0x407C, 0x0088, 0x12A8, 0x407C, +0x0034, 0x1292, 0x1716, 0x407C, 0x0082, 0x12A8, 0x4A0C, 0x4B0D, 0x12B0, +0xCAC0, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x12B0, 0xD7C2, 0x4A0C, 0x12B0, +0xD7C2, 0x407C, 0x0021, 0x12A8, 0x434C, 0x12A9, 0x407C, 0x0088, 0x12A8, +0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x12A9, 0x407C, 0x0082, 0x12A8, +0x403C, 0x3FFF, 0x12A6, 0x12B0, 0xD826, 0x403C, 0x2409, 0x12A6, 0x435C, +0x12A9, 0x407C, 0x00C2, 0x12A8, 0x430A, 0x430B, 0x3C0C, 0x435C, 0x12A9, +0x434C, 0x12A9, 0x430C, 0x12A6, 0x421F, 0x16F4, 0x129F, 0x0008, 0x531A, +0x630B, 0x911B, 0x0002, 0x2BF1, 0x2002, 0x912A, 0x2BEE, 0x435C, 0x12A9, +0x12B0, 0xD826, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, 0x12A8, 0x435C, +0x12A9, 0x430C, 0x5231, 0x4030, 0xD31C, 0x8031, 0x000C, 0x410C, 0x523C, +0x12B0, 0xD6F4, 0x3403, 0x403C, 0xFFCB, 0x3C2C, 0x410C, 0x530C, 0x12B0, +0xD6F4, 0x3861, 0x411E, 0x0008, 0x411F, 0x000A, 0x930F, 0x2076, 0x903E, +0x0018, 0x2C73, 0x5E0E, 0x4E10, 0x8BD4, 0x8CB4, 0x8C04, 0x8C10, 0x8C08, +0x8C24, 0x8C3C, 0x8C48, 0x8C54, 0x8C60, 0x8C66, 0x8C18, 0x8C6C, 0x8C90, +0x8CB4, 0x8C96, 0x8CA2, 0x8C30, 0x8C5A, 0x8C9C, 0x8C08, 0x8C08, 0x8C08, +0x8C08, 0x8CA8, 0x41A2, 0x16EE, 0x430C, 0x5031, 0x000C, 0x4130, 0x412C, +0x1292, 0x1538, 0x3FF8, 0x41A2, 0x16CA, 0x4192, 0x0002, 0x16CC, 0x3FF2, +0x41A2, 0x16D2, 0x4192, 0x0002, 0x16D4, 0x3FEC, 0x41A2, 0x16D6, 0x4192, +0x0002, 0x16D8, 0x3FE6, 0x41A2, 0x16DA, 0x4192, 0x0002, 0x16DC, 0x3FE0, +0x41A2, 0x16DE, 0x4192, 0x0002, 0x16E0, 0x3FDA, 0x41A2, 0x16E2, 0x3FD7, +0x41A2, 0x16E4, 0x3FD4, 0x41A2, 0x16E6, 0x3FD1, 0x41A2, 0x16E8, 0x3FCE, +0x4381, 0x0004, 0x4381, 0x0006, 0x410C, 0x522C, 0x12B0, 0xD6F4, 0x3403, +0x403C, 0xFFCA, 0x3FC3, 0x411D, 0x0004, 0x412C, 0x1292, 0x154A, 0x3FBC, +0x41A2, 0x16CE, 0x3FB9, 0x41A2, 0x16EA, 0x3FB6, 0x41A2, 0x16EC, 0x3FB3, +0x41A2, 0x16D0, 0x3FB0, 0x41A2, 0x1306, 0x4192, 0x0002, 0x1308, 0x3FAA, +0x403C, 0xFFC9, 0x3FA8, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8321, +0x4C0A, 0x4306, 0x403B, 0x1726, 0x4038, 0x1718, 0x4039, 0x1712, 0xB31C, +0x282B, 0x403C, 0x16AE, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, +0x403C, 0xFFF5, 0x3C69, 0x403C, 0x16AA, 0x421F, 0x16F4, 0x129F, 0x0018, +0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C5E, 0x407C, 0x0082, 0x12A9, 0x403C, +0x3FFF, 0x12A8, 0x12B0, 0xD902, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12AB, +0x434C, 0x12AB, 0x407C, 0x0048, 0x12A9, 0x403C, 0x0018, 0x12A8, 0x5292, +0x16AA, 0x16AA, 0x6292, 0x16AC, 0x16AC, 0x3C20, 0x410C, 0x530C, 0x129F, +0x0014, 0x4C06, 0x407C, 0x00C1, 0x12A9, 0x421C, 0x16AE, 0x421D, 0x16B0, +0x1292, 0x171A, 0x407C, 0x00A1, 0x12A9, 0x416C, 0x1292, 0x1716, 0x435C, +0x12AB, 0x434C, 0x12AB, 0x5392, 0x16AE, 0x6382, 0x16B0, 0x53B2, 0x16AA, +0x63B2, 0x16AC, 0x421F, 0x16F4, 0x421E, 0x16AA, 0xD21E, 0x16AC, 0x930E, +0x2402, 0x9306, 0x27D6, 0xB32A, 0x280B, 0x12B0, 0xD902, 0x403C, 0x2401, +0x12A8, 0x407C, 0x0021, 0x12A9, 0x435C, 0x12AB, 0x3C0A, 0x9316, 0x2006, +0x407C, 0x0091, 0x129F, 0x0012, 0x4306, 0x3C02, 0x4036, 0xFFF3, 0x460C, +0x5321, 0x4030, 0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x403A, +0x1540, 0x9392, 0x1706, 0x200E, 0x12B0, 0x31D2, 0x12B0, 0x31FE, 0x2004, +0xD2DB, 0x2554, 0x0000, 0x3C02, 0x12B0, 0x3322, 0x12B0, 0x3232, 0x3C1D, +0x403B, 0x170A, 0x4B2F, 0xC3DF, 0x0000, 0x12B0, 0x31FE, 0x2003, 0x12B0, +0x330E, 0x3C02, 0x12B0, 0x3322, 0x12B0, 0x3208, 0x12B0, 0x31C4, 0x480C, +0x12B0, 0x3200, 0x2003, 0x12B0, 0x330E, 0x3C02, 0x12B0, 0x3322, 0x12B0, +0x31E0, 0x480C, 0x12AA, 0x4030, 0xD31C, 0x934C, 0x421F, 0x2558, 0x2404, +0xD2DF, 0x2552, 0x0000, 0x4130, 0xC2DF, 0x2552, 0x0000, 0x4130, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x403A, 0x1540, 0x9392, 0x1706, 0x200E, +0x12B0, 0x31D2, 0x12B0, 0x31FE, 0x2004, 0xD2DB, 0x2554, 0x0000, 0x3C02, +0x12B0, 0x3322, 0x12B0, 0x3232, 0x3C28, 0x403B, 0x170A, 0x4B2F, 0xC3DF, +0x0000, 0x12B0, 0x31FE, 0x2003, 0x12B0, 0x330E, 0x3C02, 0x12B0, 0x3322, +0x12B0, 0x3208, 0x4039, 0x8E38, 0x434C, 0x1289, 0x12B0, 0x31C4, 0x435C, +0x1289, 0x480C, 0x12AA, 0x434C, 0x1289, 0x9392, 0x1706, 0x2003, 0x12B0, +0x330E, 0x3C02, 0x12B0, 0x3322, 0x12B0, 0x31E0, 0x435C, 0x1289, 0x480C, +0x3FB0, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, +0x4C4A, 0x425B, 0x2554, 0x4218, 0x2558, 0x4259, 0x2552, 0x494E, 0x525E, +0x2553, 0x5B4E, 0xDEC8, 0x0000, 0x4036, 0x170A, 0x462F, 0xD2DF, 0x1760, +0x0000, 0x12B0, 0x378C, 0x4037, 0x1540, 0x403C, 0x000A, 0x12A7, 0x9392, +0x1706, 0x2003, 0xC9C8, 0x0000, 0x3C02, 0x12B0, 0x374A, 0x4034, 0x0005, +0x440C, 0x12A7, 0x431C, 0x12A7, 0x934A, 0x2402, 0x935A, 0x2004, 0xC0F2, +0x0040, 0x0029, 0x3C0A, 0x9392, 0x1706, 0x2003, 0xDBC8, 0x0000, 0x3C02, +0x12B0, 0x3322, 0x440C, 0x12A7, 0x4035, 0x153E, 0x403C, 0x000A, 0x12A5, +0x9392, 0x1706, 0x2003, 0xD9C8, 0x0000, 0x3C02, 0x12B0, 0x3750, 0x440C, +0x12A7, 0x403C, 0x0019, 0x12A7, 0x935A, 0x2403, 0x907A, 0x0003, 0x2009, +0x9392, 0x1706, 0x2003, 0xCBC8, 0x0000, 0x3C0B, 0x12B0, 0x3756, 0x3C08, +0x9392, 0x1706, 0x2003, 0xDBC8, 0x0000, 0x3C02, 0x12B0, 0x3322, 0x440C, +0x12A7, 0x403C, 0x0028, 0x12A5, 0x12B0, 0x374A, 0x935A, 0x2002, 0x12B0, +0x3322, 0x431C, 0x12A5, 0x12B0, 0x3750, 0x403C, 0x0028, 0x12A5, 0x907A, +0x0003, 0x2002, 0x12B0, 0x3322, 0x440C, 0x12A7, 0x4030, 0xD316, 0x120A, +0x120B, 0x8031, 0x001C, 0x43C1, 0x0000, 0x435A, 0x403C, 0x0005, 0x1292, +0x1540, 0x407C, 0x0028, 0x1292, 0x1712, 0x907C, 0x0091, 0x240E, 0x907C, +0x0095, 0x240B, 0x907C, 0x0098, 0x2408, 0x907C, 0x0099, 0x2405, 0x421F, +0x1686, 0x531F, 0x436A, 0x3C01, 0x430F, 0x4F82, 0x1686, 0x932F, 0x3857, +0x4382, 0x1686, 0x434C, 0x1292, 0x1544, 0x1292, 0x170E, 0x407C, 0x0028, +0x1292, 0x1712, 0x4CC1, 0x0000, 0x416E, 0x907E, 0x0091, 0x2409, 0x907E, +0x0095, 0x2406, 0x907E, 0x0098, 0x2403, 0x907E, 0x0099, 0x203D, 0x407C, +0x0086, 0x1292, 0x1712, 0x916C, 0x2037, 0x435A, 0x422C, 0x1292, 0x1718, +0x903C, 0x1207, 0x2030, 0x430C, 0x1292, 0x1718, 0x903C, 0xA55A, 0x2027, +0x410C, 0x532C, 0x403E, 0x25AA, 0x423D, 0x12B0, 0xD3B6, 0x42D1, 0x16EC, +0x0002, 0x42D1, 0x16ED, 0x0003, 0x410F, 0x503F, 0x000A, 0x120F, 0x430F, +0x430E, 0x423D, 0x410C, 0x522C, 0x421B, 0x16F4, 0x129B, 0x000E, 0x403C, +0x0003, 0x1292, 0x1234, 0x410C, 0x503C, 0x000C, 0x421F, 0x16F4, 0x129F, +0x0010, 0x5321, 0x3C03, 0x43F1, 0x0000, 0x436A, 0x4A4C, 0x5031, 0x001C, +0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8231, +0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, +0xFFF2, 0x3C6E, 0x410C, 0x522C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, +0x3403, 0x403C, 0xFFF1, 0x3C63, 0x4038, 0x1712, 0x407C, 0x0082, 0x12A8, +0x4039, 0x1718, 0x403C, 0x3FFF, 0x12A9, 0x4036, 0x1726, 0x434C, 0x12A6, +0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x12B0, 0xDA1E, 0x430A, +0x430B, 0x3C1B, 0x407C, 0x00C1, 0x12A8, 0x412C, 0x12A9, 0x407C, 0x00A1, +0x12A8, 0x12B0, 0xDA1E, 0x430C, 0x12A9, 0x421F, 0x16F4, 0x129F, 0x0008, +0x412E, 0x411F, 0x0002, 0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x531A, 0x630B, 0x911B, 0x0006, 0x2BE2, 0x2003, 0x911A, 0x0004, 0x2BDE, +0x12B0, 0xDA1E, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, +0x0021, 0x12A8, 0x435C, 0x12A6, 0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, +0x1716, 0x435C, 0x12A6, 0x407A, 0x000A, 0x407C, 0x0028, 0x12A8, 0x430C, +0x12A9, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2406, 0x434C, 0x12A6, 0x435C, +0x12A6, 0x537A, 0x23F0, 0x430C, 0x5231, 0x4030, 0xD31C, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, 0x430B, 0x4038, 0x1726, 0x4039, +0x1718, 0x4036, 0x1712, 0xB31C, 0x2828, 0x403C, 0x16A6, 0x421F, 0x16F4, +0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C63, 0x403C, 0x16A2, +0x421F, 0x16F4, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C58, +0x407C, 0x0082, 0x12A6, 0x403C, 0x3FFF, 0x12A9, 0x12B0, 0xD8EE, 0x403C, +0x2409, 0x12A9, 0x435C, 0x12A8, 0x12B0, 0xD8EE, 0x403C, 0x2418, 0x12A9, +0x5292, 0x16A2, 0x16A2, 0x6292, 0x16A4, 0x16A4, 0x3C1D, 0x410C, 0x530C, +0x129F, 0x0014, 0x4C0B, 0x407C, 0x00C1, 0x12A6, 0x421C, 0x16A6, 0x12A9, +0x407C, 0x00A1, 0x12A6, 0x416C, 0x1292, 0x1716, 0x435C, 0x12A8, 0x434C, +0x12A8, 0x5392, 0x16A6, 0x6382, 0x16A8, 0x53B2, 0x16A2, 0x63B2, 0x16A4, +0x421F, 0x16F4, 0x421E, 0x16A2, 0xD21E, 0x16A4, 0x930E, 0x2402, 0x930B, +0x27D9, 0xB32A, 0x280B, 0x12B0, 0xD8EE, 0x403C, 0x2401, 0x12A9, 0x407C, +0x0021, 0x12A6, 0x435C, 0x12A8, 0x3C0A, 0x931B, 0x2006, 0x407C, 0x0091, +0x129F, 0x0012, 0x430B, 0x3C02, 0x403B, 0xFFF3, 0x4B0C, 0x5321, 0x4030, +0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8031, 0x001A, 0x4C0B, +0x4E0A, 0x4D0E, 0x430F, 0x403C, 0x0005, 0x1292, 0x1672, 0x4A0E, 0x430F, +0x403C, 0x0006, 0x1292, 0x1672, 0x4B0C, 0x430D, 0x1292, 0x1674, 0x407C, +0x00A8, 0x1292, 0x1712, 0x12B0, 0xCDAC, 0x4218, 0x166E, 0x4309, 0x403F, +0xEA5E, 0x4303, 0x430B, 0x533F, 0x633B, 0x2FFD, 0x421A, 0x166E, 0x430B, +0x12B0, 0xD67C, 0x410C, 0x530C, 0x403E, 0x259A, 0x423D, 0x12B0, 0xD3B6, +0x410F, 0x523F, 0x120F, 0x430F, 0x430E, 0x423D, 0x410C, 0x532C, 0x4216, +0x16F4, 0x1296, 0x000E, 0x403C, 0x0003, 0x1292, 0x167A, 0x410C, 0x503C, +0x000A, 0x421F, 0x16F4, 0x129F, 0x0010, 0x5321, 0x9309, 0x2005, 0x9A08, +0x2C03, 0x880A, 0x790B, 0x3C04, 0x8A08, 0x7309, 0x480A, 0x490B, 0x1292, +0x1670, 0x4C0E, 0x4D0F, 0x5C0C, 0x6D0D, 0x5E0C, 0x6F0D, 0x503C, 0x001F, +0x630D, 0x1202, 0xC232, 0x4303, 0x4C82, 0x0130, 0x40B2, 0x03E8, 0x0138, +0x421C, 0x013A, 0x4292, 0x013C, 0x013A, 0x4D82, 0x0134, 0x40B2, 0x03E8, +0x0138, 0x421D, 0x013A, 0x4132, 0x4A0E, 0x4B0F, 0x12B0, 0xC8EE, 0x5031, +0x001A, 0x4030, 0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, +0x8231, 0x410C, 0x522C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x410C, 0x530C, +0x421F, 0x16F4, 0x129F, 0x0018, 0x411B, 0x0004, 0x832B, 0x4038, 0x1712, +0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1716, 0x4039, 0x1726, 0x435C, +0x12A9, 0x407A, 0x000A, 0x4036, 0x1718, 0x407C, 0x0028, 0x12A8, 0x430C, +0x12A6, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2404, 0x12B0, 0xD85A, 0x537A, +0x23F2, 0x4077, 0x00C8, 0x474C, 0x12A8, 0x403C, 0x3401, 0x12A6, 0x407C, +0x0082, 0x12A8, 0x403C, 0x4030, 0x12B0, 0xD858, 0x4B0C, 0x12B0, 0xD858, +0x407C, 0x0021, 0x12A8, 0x12B0, 0xD5E8, 0x435C, 0x12A9, 0x407C, 0x0082, +0x12A8, 0x403C, 0x3FFF, 0x12A6, 0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, +0x2409, 0x12A6, 0x435C, 0x12A9, 0x407C, 0x00C2, 0x12A8, 0x430A, 0x430B, +0x3C0C, 0x435C, 0x12A9, 0x434C, 0x12A9, 0x430C, 0x12A6, 0x421F, 0x16F4, +0x129F, 0x0008, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BF1, 0x2002, 0x912A, +0x2BEE, 0x435C, 0x12A9, 0x12B0, 0xD5E8, 0x407C, 0x0021, 0x12A8, 0x435C, +0x12A9, 0x430C, 0x5231, 0x4030, 0xD31A, 0x460C, 0x12B0, 0xD164, 0x12B0, +0xCB20, 0x460C, 0x12AB, 0x12B0, 0x9516, 0xD8EF, 0x0000, 0x12B0, 0x9516, +0xC8EF, 0x0000, 0x12B0, 0xCB20, 0x12B0, 0x95C6, 0xC0F2, 0x0040, 0x0029, +0x4030, 0x95C6, 0x12B0, 0xD166, 0x492F, 0x4130, 0x407C, 0x00F4, 0x12B0, +0xC5A8, 0x403C, 0x000A, 0x1292, 0x1540, 0x403E, 0x4020, 0x12B0, 0x956C, +0x403C, 0x000A, 0x4210, 0x1540, 0x407C, 0x0086, 0x12B0, 0xC5A8, 0x403C, +0x000F, 0x1292, 0x1540, 0x431E, 0x12B0, 0x956C, 0x403C, 0x000F, 0x1292, +0x1540, 0x403E, 0xA55A, 0x12B0, 0x956C, 0x403C, 0x0014, 0x4210, 0x1540, +0x430F, 0x403C, 0x0010, 0x4030, 0xC55E, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x407A, 0x0006, 0x12B0, 0x95B4, 0x12B0, 0xCB20, 0x12B0, 0x95C6, +0x537A, 0x23FA, 0x12B0, 0xD6BC, 0x12B0, 0x94E6, 0x12B0, 0x9504, 0x12B0, +0xCB20, 0x12B0, 0x94E6, 0x403C, 0x000A, 0x1292, 0x1540, 0x4030, 0xD31C, +0x403B, 0x153E, 0x4038, 0x1760, 0x4039, 0x170A, 0x4036, 0x0190, 0x4130, +0x460C, 0x12B0, 0xD164, 0x12B0, 0xCB20, 0x460C, 0x12AB, 0x12B0, 0x9516, +0xD8EF, 0x0000, 0x12B0, 0x9516, 0xC8EF, 0x0000, 0x4130, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x403A, 0x1712, 0x407B, +0x0088, 0x4B4C, 0x12AA, 0x4038, 0x1718, 0x403C, 0x0034, 0x12A8, 0x4079, +0x0082, 0x494C, 0x12AA, 0x4036, 0x1726, 0x435C, 0x12A6, 0x403C, 0x0960, +0x12A8, 0x434C, 0x12A6, 0x4077, 0x0042, 0x474C, 0x12AA, 0x435C, 0x12A6, +0x494C, 0x12AA, 0x435C, 0x12A6, 0x403C, 0x00FC, 0x12A8, 0x434C, 0x12A6, +0x474C, 0x12AA, 0x435C, 0x12A6, 0x430C, 0x12A8, 0x4C04, 0x434C, 0x12A6, +0x435C, 0x12A6, 0x430C, 0x12A8, 0x4C05, 0x434C, 0x12A6, 0x4B4C, 0x12AA, +0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x12A6, 0x4B4C, 0x12AA, 0x403C, +0x0034, 0x12A8, 0x494C, 0x12AA, 0x435C, 0x12A6, 0x403C, 0x0A60, 0x12A8, +0x434C, 0x12A6, 0x474C, 0x12AA, 0x435C, 0x12A6, 0x494C, 0x12AA, 0x435C, +0x12A6, 0x403C, 0x00FC, 0x12A8, 0x434C, 0x12A6, 0x474C, 0x12AA, 0x435C, +0x12A6, 0x430C, 0x12A8, 0x4C07, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x430C, +0x12A8, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x407C, 0x0024, 0x1292, 0x1716, +0x435C, 0x12A6, 0x470D, 0x440C, 0xD50D, 0x4030, 0xD316, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8221, 0x4E0A, 0x4F0B, 0x823C, +0x2408, 0x823C, 0x240D, 0x822C, 0x2413, 0x803C, 0x000C, 0x2417, 0x3C64, +0x40B1, 0x0080, 0x0000, 0x4381, 0x0002, 0x4238, 0x3C16, 0x40B1, 0x8000, +0x0000, 0x4381, 0x0002, 0x4038, 0x0010, 0x3C0E, 0x4381, 0x0000, 0x42B1, +0x0002, 0x4038, 0x0014, 0x3C07, 0x4381, 0x0000, 0x40B1, 0x8000, 0x0002, +0x4038, 0x0020, 0x12B0, 0xD2BC, 0xB12A, 0x2010, 0xB11B, 0x0002, 0x200D, +0x12B0, 0xD6BC, 0x3C12, 0x9318, 0x23F6, 0xB12A, 0x2003, 0xB11B, 0x0002, +0x2409, 0x12B0, 0xCB20, 0x3C02, 0x12B0, 0xD6BC, 0x440C, 0x12B0, 0xCAFC, +0x3C05, 0x12B0, 0xCB20, 0x440C, 0x12B0, 0xD6B8, 0x440C, 0x12A9, 0x12B0, +0xD83A, 0x12B0, 0xCB0A, 0x472F, 0xD6EF, 0x0000, 0x12B0, 0xD83A, 0x43C2, +0x176A, 0x12B0, 0xCB0A, 0x472F, 0xC6EF, 0x0000, 0x5A0A, 0x6B0B, 0x5338, +0x23D5, 0xB0F2, 0x0040, 0x1766, 0x12B0, 0xCB20, 0x440C, 0x2803, 0x12B0, +0xCB14, 0x3C06, 0x12B0, 0xD6B8, 0x12B0, 0xCE6A, 0x12B0, 0xD6B8, 0x12B0, +0xD190, 0x430C, 0x430D, 0x5221, 0x4030, 0xD318, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x8031, 0x002C, 0x430A, 0x4309, 0x4038, 0x1726, 0x434C, +0x12A8, 0x403B, 0x1712, 0x407C, 0x00C8, 0x12AB, 0x4036, 0x1718, 0x403C, +0x0500, 0x12A6, 0x12B0, 0xD272, 0x407C, 0x00A1, 0x12AB, 0x403C, 0x0003, +0x12A6, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x12AB, 0x403C, 0x0501, 0x12A6, +0x12B0, 0xD754, 0x434C, 0x12A8, 0x12B0, 0xD272, 0x434C, 0x12A8, 0x407C, +0x0042, 0x12AB, 0x430C, 0x12A6, 0x4C06, 0x12B0, 0xD754, 0x9306, 0x383D, +0x4108, 0x5038, 0x0012, 0x480C, 0x590C, 0x421F, 0x16F4, 0x129F, 0x0014, +0x5319, 0x9039, 0x0016, 0x2BF3, 0x480C, 0x590C, 0x421D, 0x1306, 0x421F, +0x1308, 0x4DCC, 0x0000, 0x108D, 0x4DCC, 0x0001, 0x4FCC, 0x0002, 0x108F, +0x4FCC, 0x0003, 0x410F, 0x530F, 0x120F, 0x430F, 0x431E, 0x403D, 0x001A, +0x480C, 0x4218, 0x16F4, 0x1298, 0x000E, 0x403C, 0x0003, 0x1292, 0x125C, +0x410C, 0x532C, 0x421F, 0x16F4, 0x129F, 0x0010, 0x407C, 0x0054, 0x12AB, +0x403C, 0x0200, 0x430D, 0x1292, 0x171C, 0x5321, 0x3C01, 0x433A, 0x4A0C, +0x5031, 0x002C, 0x4030, 0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x8231, 0x410C, 0x522C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, +0x403C, 0xFFF2, 0x3C67, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0018, +0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C5C, 0x4038, 0x1712, 0x407C, 0x0082, +0x12A8, 0x4039, 0x1718, 0x403C, 0x3FFF, 0x12A9, 0x4036, 0x1726, 0x434C, +0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x12B0, 0xDA16, +0x407C, 0x0048, 0x12A8, 0x403C, 0x0019, 0x12A9, 0x412E, 0x411F, 0x0002, +0x5E0E, 0x6F0F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430A, 0x430B, 0x3C20, +0x407C, 0x00C1, 0x12A8, 0x411C, 0x0004, 0x411D, 0x0006, 0x1292, 0x171A, +0x407C, 0x00A1, 0x12A8, 0x12B0, 0xDA16, 0x430C, 0x12A9, 0x421F, 0x16F4, +0x129F, 0x0004, 0x411E, 0x0004, 0x411F, 0x0006, 0x531E, 0x630F, 0x4E81, +0x0004, 0x4F81, 0x0006, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BDD, 0x2002, +0x912A, 0x2BDA, 0x12B0, 0xDA16, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, +0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, 0x430C, 0x5231, 0x4030, +0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, 0x430B, +0x4038, 0x1726, 0x4039, 0x1718, 0x4036, 0x1712, 0xB31C, 0x2845, 0x403C, +0x16B6, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, +0x3C5C, 0x403C, 0x16B2, 0x421F, 0x16F4, 0x129F, 0x0018, 0x933C, 0x2003, +0x403C, 0xFFF4, 0x3C51, 0x407C, 0x0082, 0x12A6, 0x403C, 0x3FFF, 0x12A9, +0x12B0, 0xD916, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x12B0, 0xD916, +0x403C, 0x2408, 0x12A9, 0x3C1C, 0x410C, 0x530C, 0x129F, 0x0016, 0x4C0B, +0x407C, 0x00C1, 0x12A6, 0x421C, 0x16B6, 0x12A9, 0x407C, 0x00A1, 0x12A6, +0x412C, 0x12A9, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x53A2, 0x16B6, 0x6382, +0x16B8, 0x53B2, 0x16B2, 0x63B2, 0x16B4, 0x421F, 0x16F4, 0x421E, 0x16B2, +0xD21E, 0x16B4, 0x930E, 0x2402, 0x930B, 0x27DA, 0xB32A, 0x280B, 0x12B0, +0xD916, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x12A8, +0x3C0A, 0x931B, 0x2006, 0x407C, 0x0091, 0x129F, 0x0012, 0x430B, 0x3C02, +0x403B, 0xFFF3, 0x4B0C, 0x5321, 0x4030, 0xD31C, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x8321, 0x4C0A, 0x4306, 0x403B, 0x1726, 0x4038, 0x1718, +0x4039, 0x1712, 0xB31C, 0x2844, 0x403C, 0x16BE, 0x421F, 0x16F4, 0x129F, +0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C5B, 0x403C, 0x16BA, 0x421F, +0x16F4, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C50, 0x407C, +0x0082, 0x12A9, 0x403C, 0x3FFF, 0x12A8, 0x12B0, 0xD934, 0x403C, 0x2409, +0x12B0, 0xD92A, 0x407C, 0x0048, 0x12A9, 0x423C, 0x12A8, 0x3C1C, 0x410C, +0x530C, 0x129F, 0x0016, 0x4C06, 0x407C, 0x00C1, 0x12A9, 0x421C, 0x16BE, +0x421D, 0x16C0, 0x1292, 0x171A, 0x407C, 0x00A1, 0x12A9, 0x412C, 0x12B0, +0xD92A, 0x53A2, 0x16BE, 0x6382, 0x16C0, 0x53B2, 0x16BA, 0x63B2, 0x16BC, +0x421F, 0x16F4, 0x421E, 0x16BA, 0xD21E, 0x16BC, 0x930E, 0x2402, 0x9306, +0x27DA, 0xB32A, 0x280B, 0x12B0, 0xD934, 0x403C, 0x2401, 0x12A8, 0x407C, +0x0021, 0x12A9, 0x435C, 0x12AB, 0x3C0A, 0x9316, 0x2006, 0x407C, 0x0091, +0x129F, 0x0012, 0x4306, 0x3C02, 0x4036, 0xFFF3, 0x460C, 0x5321, 0x4030, +0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, +0x8221, 0x4C04, 0x4CA1, 0x0000, 0x4C91, 0x0002, 0x0002, 0x403A, 0x1712, +0x4075, 0x0088, 0x454C, 0x12AA, 0x4037, 0x1716, 0x12B0, 0xD7EE, 0x407B, +0x0082, 0x4B4C, 0x12AA, 0x4038, 0x1726, 0x435C, 0x12A8, 0x4039, 0x1718, +0x412C, 0x411D, 0x0002, 0x12B0, 0xD4B4, 0x12A9, 0x434C, 0x12A8, 0x4076, +0x0042, 0x12B0, 0xC80E, 0x4491, 0x0004, 0x0000, 0x4491, 0x0006, 0x0002, +0x12B0, 0xCD88, 0xD03C, 0x0086, 0x12B0, 0xC808, 0x4491, 0x0008, 0x0000, +0x4491, 0x000A, 0x0002, 0x12B0, 0xCD88, 0xD03C, 0x0089, 0x12B0, 0xC808, +0x4491, 0x000C, 0x0000, 0x4491, 0x000E, 0x0002, 0x12B0, 0xCD88, 0xD50C, +0x12B0, 0xC808, 0x4491, 0x0010, 0x0000, 0x4491, 0x0012, 0x0002, 0x12B0, +0xCD88, 0xD03C, 0x008A, 0x12B0, 0xC808, 0x4491, 0x0014, 0x0000, 0x4491, +0x0016, 0x0002, 0x12B0, 0xCD88, 0xD03C, 0x008B, 0x12B0, 0xC808, 0x4491, +0x0018, 0x0000, 0x4491, 0x001A, 0x0002, 0x12B0, 0xCD88, 0xD03C, 0x008C, +0x12B0, 0xC808, 0x5221, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x000C, 0x4038, 0x1712, 0x407C, +0x0028, 0x12A8, 0x4C4B, 0x4037, 0x16F4, 0x410C, 0x522C, 0x472F, 0x129F, +0x0018, 0x410C, 0x523C, 0x472F, 0x129F, 0x0018, 0x410C, 0x530C, 0x472F, +0x129F, 0x0018, 0x907B, 0x0091, 0x2406, 0x907B, 0x0099, 0x2403, 0x907B, +0x0098, 0x2004, 0x42A1, 0x0000, 0x4381, 0x0002, 0x411C, 0x0004, 0x411D, +0x0006, 0x12B0, 0xD406, 0x411B, 0x0004, 0x407C, 0x0028, 0x12A8, 0x4039, +0x1718, 0x430C, 0x12A9, 0x4036, 0x1726, 0x12B0, 0xC3B4, 0x4075, 0x00C8, +0x12B0, 0xC3E8, 0x4074, 0x0021, 0x12B0, 0xC3CA, 0x407C, 0x00C2, 0x12A8, +0x430A, 0x430B, 0x3C0B, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x430C, 0x12A9, +0x472F, 0x129F, 0x0008, 0x531A, 0x630B, 0x911B, 0x000A, 0x2BF2, 0x2003, +0x911A, 0x0008, 0x2BEE, 0x12B0, 0xD79A, 0x412C, 0x411D, 0x0002, 0x12B0, +0xD406, 0x412B, 0x12B0, 0xD79A, 0x12B0, 0xC3B4, 0x12B0, 0xC3E8, 0x12B0, +0xC3CA, 0x430C, 0x5031, 0x000C, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x8231, 0x4308, 0x410C, 0x522C, 0x421F, 0x16F4, +0x129F, 0x0018, 0x930C, 0x2403, 0x4038, 0xFFDF, 0x3C5E, 0x410C, 0x530C, +0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x3403, 0x4038, 0xFFDE, 0x3C53, +0x4039, 0x1712, 0x407C, 0x0082, 0x12A9, 0x4036, 0x1718, 0x403C, 0x3FFF, +0x12A6, 0x4037, 0x1726, 0x12B0, 0xD95C, 0x403C, 0x2409, 0x12A6, 0x435C, +0x12A7, 0x12B0, 0xD95C, 0x403C, 0x2419, 0x12A6, 0x412E, 0x411F, 0x0002, +0x5E0E, 0x6F0F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430A, 0x430B, 0x3C1F, +0x407C, 0x00C1, 0x12A9, 0x411C, 0x0004, 0x12A6, 0x407C, 0x00A1, 0x12A9, +0x435C, 0x12A7, 0x434C, 0x12A7, 0x430C, 0x12A6, 0x421F, 0x16F4, 0x129F, +0x0004, 0x411E, 0x0004, 0x411F, 0x0006, 0x531E, 0x630F, 0x4E81, 0x0004, +0x4F81, 0x0006, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BDE, 0x2002, 0x912A, +0x2BDB, 0x12B0, 0xD95C, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, 0x12A9, +0x435C, 0x12A7, 0x480C, 0x5231, 0x4030, 0xD31A, 0x120A, 0x120B, 0x1208, +0x8321, 0x4391, 0x0000, 0x403B, 0x16F4, 0x410C, 0x530C, 0x4B2F, 0x129F, +0x0016, 0x90B1, 0x0006, 0x0000, 0x2003, 0x12B0, 0xAA2C, 0x3C5D, 0x412C, +0x1292, 0x1536, 0x1292, 0x153C, 0x1292, 0x1558, 0x435C, 0x1292, 0x153A, +0x1292, 0x170E, 0x1292, 0x1710, 0x403C, 0xA55A, 0x12B0, 0xBC7A, 0x931C, +0x2003, 0x403C, 0xFFCF, 0x3C46, 0x434C, 0x1292, 0x153A, 0x1292, 0x170E, +0x1292, 0x1710, 0x12B0, 0xCEA6, 0x903C, 0xC3C3, 0x2003, 0x403C, 0xFFBB, +0x3C37, 0x4038, 0x1712, 0x407C, 0x0028, 0x12A8, 0x4C4A, 0x4A0C, 0x430D, +0x12B0, 0xC994, 0x930C, 0x2429, 0x903A, 0x0098, 0x2007, 0x407C, 0x00F4, +0x12A8, 0x403C, 0x4020, 0x1292, 0x1718, 0x903A, 0x0099, 0x200E, 0x407C, +0x00F4, 0x12A8, 0x403C, 0x40A0, 0x1292, 0x1718, 0x407C, 0x0054, 0x12A8, +0x430C, 0x431D, 0x1292, 0x171C, 0x435C, 0x4B2F, 0x129F, 0x0004, 0x4A4C, +0x4B2F, 0x129F, 0x0004, 0x416C, 0x4B2F, 0x129F, 0x0004, 0x430C, 0x3C02, +0x403C, 0xFFBC, 0x5321, 0x4030, 0xD320, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x1207, 0x1204, 0x4038, 0x1712, 0x4079, 0x00C8, 0x494C, 0x12A8, +0x4036, 0x1718, 0x403C, 0x3401, 0x12A6, 0x407B, 0x0082, 0x4B4C, 0x12A8, +0x403C, 0x4982, 0x12A6, 0x4037, 0x1726, 0x434C, 0x12A7, 0x4074, 0x0042, +0x444C, 0x12A8, 0x435C, 0x12A7, 0x4B4C, 0x12A8, 0x403C, 0x00FE, 0x12A6, +0x434C, 0x12A7, 0x444C, 0x12A8, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x435C, +0x12A7, 0x430C, 0x12A6, 0x430C, 0x12A6, 0x4C0A, 0x434C, 0x12A7, 0x494C, +0x12A8, 0x403C, 0x2401, 0x12A6, 0x435C, 0x12A7, 0x494C, 0x12A8, 0x403C, +0x3401, 0x12A6, 0x4B4C, 0x12A8, 0x403C, 0x4A82, 0x12A6, 0x434C, 0x12A7, +0x444C, 0x12A8, 0x435C, 0x12A7, 0x4B4C, 0x12A8, 0x403C, 0x00FE, 0x12A6, +0x434C, 0x12A7, 0x444C, 0x12A8, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x435C, +0x12A7, 0x430C, 0x12A6, 0x430C, 0x12A6, 0x4C0B, 0x434C, 0x12A7, 0x494C, +0x12A8, 0x403C, 0x2401, 0x12A6, 0x435C, 0x12A7, 0x4A0C, 0x4B0D, 0x4030, +0xD318, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, +0x8321, 0x4C0A, 0x4C25, 0x403B, 0x1712, 0x4078, 0x00C8, 0x484C, 0x12AB, +0x4039, 0x1718, 0x403C, 0x3401, 0x12A9, 0x4076, 0x0082, 0x464C, 0x12AB, +0x403C, 0x4035, 0x12A9, 0x4037, 0x1726, 0x434C, 0x12A7, 0x4074, 0x0042, +0x12B0, 0xD694, 0x450C, 0x12B0, 0xDB06, 0x4035, 0x2401, 0x450C, 0x12A9, +0x435C, 0x12A7, 0x4A91, 0x0002, 0x0000, 0x12B0, 0xD4D0, 0x403C, 0x4036, +0x12B0, 0xD0DE, 0x4A91, 0x0004, 0x0000, 0x12B0, 0xD4D0, 0x403C, 0x4039, +0x12B0, 0xD0DE, 0x4A91, 0x0006, 0x0000, 0x12B0, 0xD4D0, 0x403C, 0x4038, +0x12B0, 0xD0DE, 0x4A91, 0x0008, 0x0000, 0x12B0, 0xD4D0, 0x403C, 0x403A, +0x12B0, 0xD0DE, 0x4A91, 0x000A, 0x0000, 0x12B0, 0xD4D0, 0x403C, 0x403B, +0x12B0, 0xD0DE, 0x4A1A, 0x000C, 0x12B0, 0xD4D0, 0x403C, 0x403C, 0x12A9, +0x434C, 0x12A7, 0x12B0, 0xD694, 0x4A0C, 0x12B0, 0xDB06, 0x450C, 0x12A9, +0x435C, 0x12A7, 0x5321, 0x4030, 0xD316, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x1207, 0x1204, 0x1205, 0x8321, 0x4C0A, 0x4C25, 0x403B, 0x1712, +0x4078, 0x00C8, 0x484C, 0x12AB, 0x4039, 0x1718, 0x403C, 0x3401, 0x12A9, +0x4076, 0x0082, 0x464C, 0x12AB, 0x403C, 0x4035, 0x12A9, 0x4037, 0x1726, +0x434C, 0x12A7, 0x4074, 0x0042, 0x12B0, 0xD784, 0x450C, 0x12B0, 0xDB18, +0x4035, 0x2401, 0x450C, 0x12A9, 0x435C, 0x12A7, 0x4A91, 0x0002, 0x0000, +0x12B0, 0xD5DA, 0x403C, 0x4036, 0x12B0, 0xD066, 0x4A91, 0x0004, 0x0000, +0x12B0, 0xD5DA, 0x403C, 0x4039, 0x12B0, 0xD066, 0x4A91, 0x0006, 0x0000, +0x12B0, 0xD5DA, 0x403C, 0x4038, 0x12B0, 0xD066, 0x4A91, 0x0008, 0x0000, +0x12B0, 0xD5DA, 0x403C, 0x403A, 0x12B0, 0xD066, 0x4A91, 0x000A, 0x0000, +0x12B0, 0xD5DA, 0x403C, 0x403B, 0x12B0, 0xD066, 0x4A1A, 0x000C, 0x12B0, +0xD5DA, 0x403C, 0x403C, 0x12A9, 0x434C, 0x12A7, 0x12B0, 0xD784, 0x4A0C, +0x12B0, 0xDB18, 0x450C, 0x12A9, 0x435C, 0x12A7, 0x5321, 0x4030, 0xD316, +0x120A, 0x120B, 0x8221, 0x403A, 0x16F4, 0xB31C, 0x2814, 0x403C, 0x16C2, +0x4A2F, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFD7, 0x3C5B, 0x403C, +0x16C6, 0x4A2F, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFD6, 0x3C51, +0x407C, 0x0091, 0x4A2F, 0x129F, 0x0012, 0x4A2F, 0x129F, 0x0002, 0x410D, +0x530D, 0x410C, 0x532C, 0x4A2F, 0x129F, 0x001A, 0x403A, 0x1712, 0x403B, +0x1726, 0x3C33, 0x12B0, 0xD948, 0x403C, 0x0500, 0x1292, 0x1718, 0x407C, +0x00C1, 0x12AA, 0x421C, 0x16C2, 0x421D, 0x16C4, 0x1292, 0x171A, 0x435C, +0x12AB, 0x407C, 0x00A1, 0x12AA, 0x411F, 0x0002, 0x53A1, 0x0002, 0x4F2C, +0x1292, 0x1718, 0x12B0, 0xD948, 0x403C, 0x0501, 0x1292, 0x1718, 0x435C, +0x12AB, 0x434C, 0x12AB, 0x435C, 0x12AB, 0x53A2, 0x16C2, 0x6382, 0x16C4, +0x412F, 0x832F, 0x4F81, 0x0000, 0x53B2, 0x16C6, 0x63B2, 0x16C8, 0x421F, +0x16C6, 0xD21F, 0x16C8, 0x930F, 0x2403, 0x9381, 0x0000, 0x23C4, 0x430C, +0x5221, 0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x1207, 0x4307, 0x430A, 0x430B, 0x4308, 0x4309, 0x407C, 0x0028, 0x1292, +0x1712, 0x4C46, 0x907C, 0x0089, 0x2411, 0x907C, 0x008D, 0x240E, 0x907C, +0x0091, 0x240B, 0x907C, 0x0095, 0x2408, 0x907C, 0x0098, 0x2405, 0x907C, +0x0099, 0x2402, 0x433C, 0x3C48, 0x907C, 0x0091, 0x240C, 0x907C, 0x0095, +0x2409, 0x907C, 0x0098, 0x2406, 0x907C, 0x0099, 0x2403, 0x4038, 0x0FF0, +0x3C27, 0x407C, 0x00E8, 0x1292, 0x1712, 0x430C, 0x1292, 0x1718, 0x4C07, +0x9076, 0x0095, 0x2004, 0x403C, 0x05DC, 0x1292, 0x1540, 0x407C, 0x00E1, +0x1292, 0x1712, 0x430C, 0x430D, 0x1292, 0x171A, 0x4D0E, 0x430D, 0x12B0, +0xD328, 0x4C0A, 0x4D0B, 0x5E0A, 0x630B, 0x4A0F, 0xDB0F, 0x930F, 0x2404, +0x4A08, 0x4B09, 0x5228, 0x6309, 0x4A0C, 0x4B0D, 0x421F, 0x16F4, 0x129F, +0x000A, 0x480C, 0x490D, 0x421F, 0x16F4, 0x129F, 0x000A, 0x470C, 0x421F, +0x16F4, 0x129F, 0x0008, 0x430C, 0x4030, 0xD31A, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x1204, 0x4C0A, 0x430B, 0x4038, 0x1712, 0x407C, +0x0088, 0x12A8, 0x407C, 0x0034, 0x1292, 0x1716, 0x4037, 0x0032, 0x4079, +0x00C8, 0x494C, 0x12A8, 0x4036, 0x1718, 0x403C, 0x2401, 0x12A6, 0x407C, +0x0028, 0x12A8, 0x430C, 0x12A6, 0x5337, 0x933C, 0x2403, 0xB03C, 0x0200, +0x2C02, 0x9307, 0x23F6, 0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, 0x12A6, +0x4037, 0x1726, 0x12B0, 0xD940, 0x403C, 0x0C04, 0x12B0, 0xD93E, 0x12B0, +0xD940, 0x435C, 0x12A7, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, 0x12A6, +0x12B0, 0xDA4E, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12A7, 0x12B0, 0xDA4E, +0x403C, 0x2408, 0x12A6, 0x407C, 0x00C1, 0x12A8, 0x4B04, 0x5404, 0x4A0C, +0x540C, 0x12A6, 0x12B0, 0x7F8A, 0x441C, 0x1592, 0x12B0, 0xD93E, 0x531B, +0x903B, 0x0030, 0x3BEE, 0x12B0, 0xDA4E, 0x403C, 0x2401, 0x12A6, 0x407C, +0x0021, 0x12A8, 0x435C, 0x12A7, 0x4030, 0xD318, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x8231, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0018, +0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C57, 0x410C, 0x522C, 0x421F, 0x16F4, +0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C4C, 0x4038, 0x1712, +0x407C, 0x0082, 0x12A8, 0x4039, 0x1718, 0x403C, 0x3FFF, 0x12A9, 0x4036, +0x1726, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, +0x12B0, 0xDA2E, 0x430A, 0x430B, 0x3C1E, 0x407C, 0x00C1, 0x12A8, 0x412C, +0x411D, 0x0002, 0x1292, 0x171A, 0x407C, 0x00A1, 0x12A8, 0x12B0, 0xDA2E, +0x430C, 0x12A9, 0x421F, 0x16F4, 0x129F, 0x0008, 0x412E, 0x411F, 0x0002, +0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x531A, 0x630B, 0x911B, +0x0006, 0x2BDF, 0x2003, 0x911A, 0x0004, 0x2BDB, 0x12B0, 0xDA2E, 0x407C, +0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, +0x12A6, 0x430C, 0x5231, 0x4030, 0xD31C, 0x120A, 0x8031, 0x0006, 0x43C1, +0x0000, 0x43C1, 0x0001, 0x4381, 0x0002, 0x4381, 0x0004, 0x403A, 0x16F4, +0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, 0x00B0, 0x1292, 0x1712, +0x3C19, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, 0x0040, 0x0002, 0x2802, +0x4382, 0x168E, 0x416C, 0x430D, 0x1292, 0x171C, 0x411C, 0x0002, 0x411D, +0x0004, 0x1292, 0x171C, 0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, +0x0001, 0x242F, 0x410C, 0x530C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, +0x2816, 0x416E, 0xC35E, 0x907E, 0x008A, 0x2005, 0x421C, 0x16F0, 0x421D, +0x16F2, 0x3C08, 0x416C, 0x430D, 0x1292, 0x171C, 0x430C, 0x430D, 0x1292, +0x171C, 0x4A2F, 0x129F, 0x000A, 0x3FDA, 0x410C, 0x532C, 0x4A2F, 0x129F, +0x0018, 0x416E, 0xC35E, 0x907E, 0x008A, 0x23BC, 0x4192, 0x0002, 0x16F0, +0x4192, 0x0004, 0x16F2, 0x3FC9, 0x430C, 0x5031, 0x0006, 0x413A, 0x4130, +0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8221, 0x4319, 0x403A, +0x1718, 0x403B, 0x1712, 0x4038, 0x1726, 0x3C03, 0x9329, 0x2001, 0x4229, +0x410C, 0x530C, 0x12B0, 0xDAE6, 0x410C, 0x531C, 0x12B0, 0xDAE6, 0x410C, +0x532C, 0x12B0, 0xDAE6, 0x43C1, 0x0003, 0x412C, 0x411D, 0x0002, 0x12B0, +0xCAC0, 0x4C06, 0xF036, 0x0F00, 0x5036, 0x0080, 0x4127, 0x434C, 0x12A8, +0x407C, 0x0082, 0x12AB, 0x435C, 0x12A8, 0x490F, 0xF03F, 0x000F, 0x5F06, +0x460C, 0x12AA, 0x407C, 0x00C8, 0x12AB, 0x403C, 0x1401, 0x12AA, 0x407C, +0x0082, 0x12AB, 0x12B0, 0xD896, 0x470C, 0x12B0, 0xD894, 0x403C, 0x3FFD, +0x12B0, 0xDAD6, 0x407C, 0x0021, 0x12AB, 0x430C, 0x430D, 0x1292, 0x171A, +0x435C, 0x12A8, 0x407C, 0x00C8, 0x12AB, 0x403C, 0x0501, 0x12B0, 0xDAD6, +0x407C, 0x0042, 0x12AB, 0x435C, 0x12A8, 0x5319, 0x9039, 0x0010, 0x2BAC, +0x430C, 0x5221, 0x4030, 0xD31A, 0x120A, 0x120B, 0x1208, 0x1209, 0x8031, +0x0006, 0x434B, 0x4338, 0x4039, 0x16F4, 0x410C, 0x522C, 0x492F, 0x129F, +0x0014, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C4E, 0x431C, 0x492F, 0x129F, +0x001C, 0x410C, 0x530C, 0x492F, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, +0xFFCD, 0x3C40, 0x43C1, 0x0004, 0x430C, 0x1292, 0x1536, 0x930C, 0x2403, +0x403C, 0xFFEA, 0x3C36, 0x90B1, 0xA55A, 0x0000, 0x2004, 0x90B1, 0xA55A, +0x0002, 0x2408, 0x90B1, 0x5AA5, 0x0000, 0x2022, 0x90B1, 0x5AA5, 0x0002, +0x201E, 0x434C, 0x1292, 0x1546, 0x435C, 0x1292, 0x153A, 0x1292, 0x170E, +0x434C, 0x1292, 0x1546, 0x435B, 0x412D, 0x411C, 0x0002, 0x12B0, 0xB064, +0x4C4A, 0x435C, 0x1292, 0x1546, 0x403C, 0x0BB8, 0x1292, 0x1540, 0x935A, +0x2003, 0x403C, 0xFFCE, 0x3C08, 0x4B4C, 0x492F, 0x129F, 0x0004, 0xB35B, +0x2801, 0x4308, 0x480C, 0x5031, 0x0006, 0x4030, 0xD31E, 0x120A, 0x8031, +0x000A, 0x4381, 0x0000, 0x430A, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, +0x0006, 0x4381, 0x0008, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0016, +0x930C, 0x2404, 0x403C, 0xFFC1, 0x3C49, 0x531A, 0x912A, 0x2C0E, 0x410C, +0x532C, 0x4A0F, 0x5F0F, 0x5F0C, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, +0x37F2, 0x403C, 0xFFC0, 0x3C38, 0x430C, 0x1292, 0x1536, 0x403A, 0x1546, +0x434C, 0x12AA, 0x434C, 0x1292, 0x153A, 0x1292, 0x170E, 0x434C, 0x12AA, +0x1292, 0x1710, 0x411D, 0x0004, 0x411C, 0x0002, 0x12B0, 0xB064, 0x931C, +0x241A, 0x90B1, 0x0003, 0x0000, 0x280E, 0x435C, 0x12AA, 0x403C, 0x00C8, +0x1292, 0x1540, 0x411D, 0x0008, 0x411C, 0x0006, 0x12B0, 0xB064, 0x931C, +0x2408, 0x407C, 0x0028, 0x1292, 0x1712, 0x4C4C, 0x903C, 0x0095, 0x2403, +0x403C, 0xFFCE, 0x3C03, 0x435C, 0x12AA, 0x430C, 0x5031, 0x000A, 0x413A, +0x4130, 0x120A, 0x8231, 0x403A, 0x16F4, 0x410C, 0x522C, 0x4A2F, 0x129F, +0x0014, 0x930C, 0x340F, 0x403C, 0xFFC8, 0x3C53, 0x434C, 0x1292, 0x1556, +0x415E, 0x0004, 0x537E, 0x4EC1, 0x0004, 0x411C, 0x0006, 0x1292, 0x1540, +0x93C1, 0x0004, 0x2443, 0x410C, 0x532C, 0x12B0, 0xD808, 0x380B, 0x410C, +0x530C, 0x12B0, 0xD808, 0x3806, 0x410C, 0x503C, 0x0006, 0x12B0, 0xD808, +0x3403, 0x403C, 0xFFC7, 0x3C31, 0xB0B1, 0x0040, 0x0000, 0x2807, 0xB0B1, +0x0040, 0x0002, 0x12B0, 0xD7E0, 0x1292, 0x1546, 0xB0B1, 0x0100, 0x0000, +0x2807, 0xB0B1, 0x0100, 0x0002, 0x12B0, 0xD7E0, 0x1292, 0x1548, 0xB391, +0x0000, 0x2806, 0xB391, 0x0002, 0x12B0, 0xD7E0, 0x1292, 0x1552, 0xB2B1, +0x0000, 0x2806, 0xB2B1, 0x0002, 0x12B0, 0xD7E0, 0x1292, 0x1554, 0xB3A1, +0x0000, 0x2BB6, 0xB3A1, 0x0002, 0x2BB0, 0x435C, 0x3FAF, 0x430C, 0x5231, +0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x421F, 0x01F2, 0x12B0, 0xA9E2, +0x12B0, 0x2EE6, 0x403E, 0x1760, 0x403D, 0x170A, 0x4D2B, 0xEEEB, 0x0000, +0x12B0, 0xCF1E, 0xEEE8, 0x0000, 0x12B0, 0xA9CA, 0x12B0, 0xA9CA, 0x12B0, +0xA9BA, 0x12B0, 0xA9BA, 0x12B0, 0x2EE6, 0x12B0, 0xA9DA, 0x12B0, 0xDA6E, +0xEEEB, 0x0000, 0x4F82, 0x01F2, 0x430C, 0x4030, 0xD320, 0x12B0, 0x2F6A, +0x12B0, 0xA9DA, 0x12B0, 0xD466, 0x4030, 0xA9DA, 0x12B0, 0xA9BA, 0x12B0, +0x2EE6, 0x12B0, 0xA9DA, 0x12B0, 0xD466, 0x4D28, 0xEEE8, 0x0000, 0x4130, +0x40B2, 0x261D, 0x01EA, 0x40B2, 0x2629, 0x01F2, 0x4130, 0x120A, 0x120B, +0x1208, 0x12B0, 0x309E, 0x407E, 0x0006, 0x12B0, 0x31AA, 0x12B0, 0x2F6A, +0x4D2B, 0xEFEB, 0x0000, 0x12B0, 0xCF1E, 0xEFE8, 0x0000, 0x537E, 0x23F5, +0x12B0, 0x2ED4, 0x4D2E, 0xEFEE, 0x0000, 0x12B0, 0xDA6E, 0xEFEB, 0x0000, +0x3FC4, 0x120A, 0x120B, 0x1208, 0x432C, 0x1292, 0x1536, 0x407B, 0x0003, +0x4038, 0x1712, 0x434C, 0x12B0, 0x8ED2, 0x12B0, 0x9576, 0x12B0, 0x953E, +0x403C, 0x000A, 0x1292, 0x1540, 0x12B0, 0xCD40, 0x436C, 0x12B0, 0x8ED2, +0x12B0, 0x9576, 0x12B0, 0x951E, 0x403C, 0x000A, 0x1292, 0x1540, 0x434C, +0x1292, 0x153A, 0x1292, 0x170E, 0x1292, 0x1710, 0x407C, 0x0028, 0x12A8, +0x4C4A, 0x4A0C, 0x430D, 0x12B0, 0xC994, 0x930C, 0x2427, 0x907A, 0x0098, +0x2008, 0x407C, 0x00F4, 0x12A8, 0x403C, 0x4020, 0x1292, 0x1718, 0x3C11, +0x907A, 0x0099, 0x200E, 0x407C, 0x00F4, 0x12A8, 0x403C, 0x40A0, 0x1292, +0x1718, 0x407C, 0x0054, 0x12A8, 0x430C, 0x431D, 0x1292, 0x171C, 0x435C, +0x12B0, 0xD9EE, 0x4A4C, 0x12B0, 0xD9EE, 0x436C, 0x12B0, 0xD9EE, 0x430C, +0x3C04, 0x537B, 0x23AE, 0x403C, 0xFFBC, 0x4030, 0xD320, 0x120A, 0x120B, +0x1208, 0x1209, 0x1206, 0x12B0, 0xD10C, 0x12B0, 0xAB06, 0x4882, 0x01F2, +0x4030, 0xD31C, 0x4C0F, 0xDD0F, 0x930F, 0x2420, 0x4039, 0x1760, 0x4036, +0x170A, 0x435C, 0x1292, 0x1726, 0x434C, 0x1292, 0x1726, 0x12B0, 0x2F6A, +0x12B0, 0xC63A, 0x12B0, 0xC654, 0x12B0, 0xC654, 0x12B0, 0xC662, 0x12B0, +0xC662, 0x12B0, 0x2EE6, 0x12B0, 0xCF90, 0x533A, 0x633B, 0x4A0F, 0xDB0F, +0x930F, 0x23E4, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x12B0, +0xD10C, 0x4C0F, 0xDD0F, 0x930F, 0x2420, 0x4039, 0x1760, 0x4036, 0x170A, +0x434C, 0x1292, 0x1726, 0x12B0, 0x2F6A, 0x12B0, 0xC63A, 0x12B0, 0xC654, +0x12B0, 0xC654, 0x12B0, 0xC662, 0x12B0, 0xC662, 0x12B0, 0x2EE6, 0x12B0, +0xCF90, 0x435C, 0x1292, 0x1726, 0x533A, 0x633B, 0x4A0F, 0xDB0F, 0x930F, +0x23E4, 0x3FAB, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8221, 0x4381, +0x0000, 0x4381, 0x0002, 0x4316, 0x4038, 0x1726, 0x4039, 0x1712, 0x3C03, +0x9326, 0x2001, 0x4226, 0x410C, 0x530C, 0x12B0, 0xDAAE, 0x410C, 0x531C, +0x12B0, 0xDAAE, 0x410C, 0x532C, 0x12B0, 0xDAAE, 0x9036, 0x000F, 0x2433, +0x930C, 0x2033, 0x412A, 0x411B, 0x0002, 0x407C, 0x0088, 0x12A9, 0x407C, +0x0034, 0x1292, 0x1716, 0x12B0, 0xCF78, 0x4A0C, 0x4B0D, 0x12B0, 0xCAC0, +0xF03C, 0x0F00, 0xD60C, 0xD03C, 0x0080, 0x12B0, 0xCF74, 0x4A0C, 0x12B0, +0xCF74, 0x403C, 0x3FFD, 0x12B0, 0xCF82, 0x434C, 0x12A8, 0x407C, 0x0088, +0x12A9, 0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x12A8, 0x5316, 0x9036, +0x0010, 0x2BBF, 0x430C, 0x5221, 0x4030, 0xD31C, 0x930C, 0x37CD, 0x403C, +0xFFD8, 0x3FF8, 0x12B0, 0xACBE, 0x4030, 0xACBE, 0x12AB, 0x430C, 0x430D, +0x4720, 0x12A7, 0x403C, 0x0080, 0x430D, 0x4720, 0x12A7, 0x403C, 0x0006, +0x430D, 0x4720, 0x430D, 0x12A7, 0x3FF0, 0x407C, 0x0030, 0x12AB, 0x403C, +0x0007, 0x4A20, 0x434C, 0x12A6, 0x407C, 0x00C1, 0x4B20, 0x434C, 0x12A6, +0x407C, 0x0042, 0x12AB, 0x435C, 0x4620, 0x494C, 0x12AB, 0x403C, 0x0501, +0x4A20, 0x494C, 0x12AB, 0x403C, 0x0501, 0x12AA, 0x434C, 0x12A6, 0x435C, +0x4620, 0x12AA, 0x484C, 0x12AB, 0x430C, 0x4A20, 0x12B0, 0xACBC, 0x403C, +0x3FFD, 0x12AA, 0x434C, 0x4620, 0x430D, 0x12A7, 0x435C, 0x12A6, 0x434C, +0x12A6, 0x407C, 0x0042, 0x12AB, 0x430C, 0x12AA, 0x4C04, 0x435C, 0x12A6, +0x3FE1, 0x12AA, 0x494C, 0x12AB, 0x403C, 0x1401, 0x12AA, 0x484C, 0x12AB, +0x4030, 0xACBE, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C08, 0x4E0A, +0x4F0B, 0x4039, 0x1712, 0x407C, 0x0088, 0x12A9, 0x407C, 0x0034, 0x1292, +0x1716, 0x407C, 0x0082, 0x12A9, 0x4036, 0x1726, 0x435C, 0x12A6, 0x4A0E, +0x4B0F, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xDE08, 0xD038, +0x0080, 0x480C, 0x1292, 0x1718, 0x434C, 0x12A6, 0x407C, 0x0042, 0x12A9, +0x435C, 0x12A6, 0x407C, 0x0082, 0x12A9, 0x435C, 0x12A6, 0x4A0C, 0x1292, +0x1718, 0x434C, 0x12A6, 0x407C, 0x0042, 0x12A9, 0x435C, 0x12A6, 0x407C, +0x0082, 0x12A9, 0x435C, 0x12A6, 0x403C, 0x3FFD, 0x1292, 0x1718, 0x434C, +0x12A6, 0x407C, 0x0042, 0x12A9, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, +0x0088, 0x12A9, 0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x12A6, 0x4030, +0xD31C, 0x120A, 0x120B, 0x1208, 0x430B, 0x1292, 0x153C, 0x3C3B, 0x932B, +0x2403, 0x903B, 0x0005, 0x2002, 0x4318, 0x3C08, 0x931B, 0x2405, 0x922B, +0x2403, 0x903B, 0x0006, 0x2001, 0x4328, 0x480C, 0x1292, 0x1536, 0x434C, +0x1292, 0x153A, 0x1292, 0x170E, 0x1292, 0x1710, 0x407C, 0x0028, 0x1292, +0x1712, 0x4C4A, 0x1292, 0x153C, 0x907A, 0x0089, 0x241A, 0x907A, 0x008D, +0x2417, 0x907A, 0x0091, 0x2414, 0x907A, 0x0095, 0x2411, 0x907A, 0x0098, +0x240E, 0x907A, 0x0099, 0x240B, 0x531B, 0x903B, 0x0007, 0x2C0F, 0x930B, +0x2403, 0x903B, 0x0003, 0x23C5, 0x4308, 0x3FD2, 0x4A0C, 0x12B0, 0xD9FE, +0x480C, 0x12B0, 0xD9FE, 0x430C, 0x3C08, 0x433C, 0x12B0, 0xD9FE, 0x403C, +0xAAAA, 0x12B0, 0xD9FE, 0x433C, 0x4030, 0xD320, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x1207, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x435B, +0x4038, 0x1726, 0x4039, 0x1718, 0x4036, 0x1712, 0x3C03, 0x936B, 0x2001, +0x426B, 0x407C, 0x0088, 0x12A6, 0x403C, 0x0034, 0x12A9, 0x12B0, 0xD17A, +0x4B4C, 0x108C, 0xF03C, 0x0F00, 0xD03C, 0x0060, 0x12B0, 0xD184, 0x12B0, +0xD17A, 0x403C, 0x00FC, 0x12B0, 0xD184, 0x430C, 0x12A9, 0x4C07, 0x434C, +0x12A8, 0x435C, 0x12A8, 0x430C, 0x12A9, 0x4C0A, 0x434C, 0x12A8, 0x407C, +0x0088, 0x12A6, 0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x12A8, 0x4781, +0x0000, 0x4A81, 0x0002, 0x403D, 0x0003, 0x410C, 0x530C, 0x421F, 0x16F4, +0x129F, 0x0006, 0x535B, 0x907B, 0x0010, 0x2BC2, 0x430C, 0x5221, 0x4030, +0xD31A, 0x120A, 0x8031, 0x007C, 0x4381, 0x0000, 0x430A, 0x410C, 0x522C, +0x403E, 0x003C, 0x12B0, 0xD496, 0x410C, 0x532C, 0x12B0, 0xD724, 0x3403, +0x403C, 0xFFEB, 0x3C3D, 0x410C, 0x530C, 0x12B0, 0xD724, 0x2404, 0x403C, +0xFFC1, 0x3C35, 0x531A, 0x912A, 0x2C0B, 0x410C, 0x522C, 0x4A0F, 0x5F0F, +0x5F0C, 0x12B0, 0xD724, 0x37F5, 0x403C, 0xFFC0, 0x3C27, 0x411C, 0x0002, +0x1292, 0x1536, 0x12B0, 0xD7CC, 0x1292, 0x153C, 0x435C, 0x12B0, 0xD7CE, +0x403D, 0x1E1E, 0x403C, 0xA55A, 0x12B0, 0xB064, 0x931C, 0x2410, 0x12B0, +0xD7CC, 0x430A, 0x3C01, 0x531A, 0x912A, 0x2C0C, 0x4A0F, 0x5F0F, 0x510F, +0x4F1C, 0x0004, 0x12B0, 0xBC7A, 0x931C, 0x23F4, 0x403C, 0xFFCE, 0x3C01, +0x430C, 0x5031, 0x007C, 0x413A, 0x4130, 0x120A, 0x120B, 0x8031, 0x0006, +0x43C1, 0x0001, 0x43C1, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x403A, +0x16F4, 0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, 0x00B0, 0x1292, +0x1712, 0x403B, 0x171C, 0x3C1C, 0x410C, 0x532C, 0x4A2F, 0x129F, 0x0018, +0x416C, 0x430D, 0x12AB, 0x411C, 0x0002, 0x411D, 0x0004, 0x12AB, 0x90F1, +0x009E, 0x0000, 0x2006, 0xB0B1, 0x0040, 0x0002, 0x2802, 0x4382, 0x168E, +0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x2412, 0x410C, +0x530C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BD9, 0x416C, 0x430D, +0x12AB, 0x430C, 0x430D, 0x12AB, 0x4A2F, 0x129F, 0x000A, 0x3FE6, 0x430C, +0x5031, 0x0006, 0x413B, 0x413A, 0x4130, 0x120A, 0x8031, 0x000C, 0x40B1, +0x0011, 0x0006, 0x4381, 0x0004, 0x4381, 0x0002, 0x4381, 0x0000, 0x4381, +0x0008, 0x4381, 0x000A, 0x4C81, 0x0004, 0x4D81, 0x0002, 0x12B0, 0xD98E, +0x403A, 0x1718, 0x430C, 0x12AA, 0x4C81, 0x0000, 0x411E, 0x0008, 0x411F, +0x000A, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x4C81, 0x0008, 0x4D81, 0x000A, +0x930F, 0x2003, 0x903E, 0x0BB8, 0x2802, 0x431C, 0x3C1E, 0xB3A1, 0x0000, +0x2C07, 0x9381, 0x000A, 0x2004, 0x90B1, 0x0BB8, 0x0008, 0x2BDF, 0x9381, +0x000A, 0x2010, 0x90B1, 0x0BB8, 0x0008, 0x2C0C, 0x40B1, 0x0011, 0x0006, +0x411C, 0x0006, 0x12AA, 0x411C, 0x0004, 0x12AA, 0x411C, 0x0002, 0x12AA, +0x430C, 0x5031, 0x000C, 0x413A, 0x4130, 0x120A, 0x8221, 0x4381, 0x0000, +0x4381, 0x0002, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, +0x3403, 0x403C, 0xFFCD, 0x3C3C, 0x90B1, 0xA55A, 0x0000, 0x2004, 0x90B1, +0xA55A, 0x0002, 0x2408, 0x90B1, 0x5AA5, 0x0000, 0x202F, 0x90B1, 0x5AA5, +0x0002, 0x202B, 0x434C, 0x1292, 0x1546, 0x435C, 0x1292, 0x153A, 0x1292, +0x170E, 0x434C, 0x1292, 0x1546, 0x412D, 0x411C, 0x0002, 0x12B0, 0xB064, +0x4C4A, 0x435C, 0x1292, 0x1546, 0x403C, 0x0BB8, 0x1292, 0x1540, 0x935A, +0x2003, 0x403C, 0xFFCE, 0x3C0F, 0x12B0, 0xD516, 0x2409, 0x907C, 0x0095, +0x2406, 0x907C, 0x0098, 0x2403, 0x907C, 0x0099, 0x2002, 0x430C, 0x3C01, +0x433C, 0x5221, 0x413A, 0x4130, 0x464C, 0x12AB, 0x435C, 0x4A20, 0x444C, +0x12AB, 0x430C, 0x12A8, 0xF54C, 0x954C, 0x4130, 0x407C, 0x00C1, 0x12AB, +0x440C, 0x430D, 0x1292, 0x171A, 0x407C, 0x00A1, 0x4B20, 0x407C, 0x0021, +0x12AB, 0x430C, 0x430D, 0x1292, 0x171A, 0x4C81, 0x000A, 0x4D81, 0x000C, +0x4130, 0x12A8, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x434C, 0x12AA, 0x407C, +0x0088, 0x12AB, 0x407C, 0x0024, 0x1292, 0x1716, 0x435C, 0x4A20, 0x4114, +0x0004, 0x464C, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12AA, 0x494C, +0x12AB, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12A8, +0x434C, 0x12AA, 0x407C, 0x0042, 0x3FB8, 0x434C, 0x12AA, 0x12B0, 0xD984, +0x407C, 0x0021, 0x3FB1, 0x120A, 0x120B, 0x1208, 0x430C, 0x12B0, 0xCCCA, +0x4C0A, 0x431C, 0x12B0, 0xCCCA, 0x4C0B, 0x403C, 0x0003, 0x12B0, 0xCCCA, +0x4C08, 0x903A, 0x06A4, 0x3813, 0x421F, 0x173C, 0x503F, 0xFFF6, 0x9F0A, +0x3806, 0x421F, 0x173C, 0x503F, 0x000A, 0x9A0F, 0x3402, 0x4A82, 0x173C, +0x421C, 0x173C, 0x12B0, 0xB2E6, 0x3C07, 0x9382, 0x1738, 0x2422, 0x421C, +0x1738, 0x12B0, 0xC2F6, 0x9382, 0x1738, 0x241B, 0x93C2, 0x1763, 0x2418, +0x8B08, 0x9038, 0x0097, 0x3814, 0x5392, 0x173E, 0x90B2, 0x0191, 0x173E, +0x2810, 0x43D2, 0x1764, 0x1292, 0x153C, 0xC2F2, 0x001D, 0x4382, 0x1738, +0x435C, 0x421F, 0x16F4, 0x129F, 0x0022, 0x3C02, 0x4382, 0x173E, 0x430C, +0x4030, 0xD320, 0x120A, 0x120B, 0x1208, 0x4C0A, 0x9A82, 0x173A, 0x242C, +0x4A0C, 0x430D, 0x12B0, 0xB846, 0x403E, 0x41A3, 0x403F, 0xC4D6, 0x12B0, +0x8006, 0x4C0E, 0x4D0F, 0x403C, 0xF000, 0x403D, 0x457F, 0x12B0, 0x8002, +0x12B0, 0xD6E8, 0x4C08, 0x5038, 0x0055, 0x4A0C, 0x403E, 0x0014, 0x12B0, +0xCFCC, 0x8C08, 0x9038, 0x1000, 0x3802, 0x4038, 0x0FFF, 0x9308, 0x3401, +0x4308, 0x4882, 0x01C8, 0xD3A2, 0x01C0, 0x4A82, 0x173A, 0x3C1A, 0x431C, +0x12B0, 0xCCCA, 0x4C0B, 0x4A0F, 0x503F, 0x000A, 0x9B0F, 0x2C07, 0x90B2, +0x0FFF, 0x01C8, 0x2C0D, 0x5392, 0x01C8, 0x3C0A, 0x4A0F, 0x503F, 0xFFF6, +0x9F0B, 0x2C05, 0x9382, 0x01C8, 0x2402, 0x53B2, 0x01C8, 0x4030, 0xD320, +0xC3A2, 0x01A0, 0x40B2, 0x22F0, 0x01A0, 0x40B2, 0x0206, 0x01A2, 0x407E, +0x0010, 0x4EC2, 0x0080, 0x407F, 0x0011, 0x4FC2, 0x0081, 0x407D, 0x0012, +0x4DC2, 0x0082, 0x407C, 0x0013, 0x4CC2, 0x0083, 0x4EC2, 0x0084, 0x4FC2, +0x0085, 0x4DC2, 0x0086, 0x4CC2, 0x0087, 0x4EC2, 0x0088, 0x4FC2, 0x0089, +0x4DC2, 0x008A, 0x4CC2, 0x008B, 0x4EC2, 0x008C, 0x4FC2, 0x008D, 0x4DC2, +0x008E, 0x4CC2, 0x008F, 0xD3A2, 0x01A0, 0xD392, 0x01A0, 0x40B2, 0x0FFF, +0x01C8, 0x40B2, 0x03A0, 0x01C0, 0xD3D2, 0x0078, 0x40F2, 0x0017, 0x0078, +0x40F2, 0x0053, 0x0079, 0x43E2, 0x007C, 0x43C2, 0x007D, 0x43C2, 0x007B, +0xC3D2, 0x0078, 0xDEC2, 0x0005, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x1207, 0x1204, 0x4C0A, 0x4D04, 0x4E0B, 0x3C3B, 0x4437, 0x4038, +0x1712, 0x407C, 0x0082, 0x12A8, 0x4039, 0x1718, 0x403C, 0x3FFF, 0x12A9, +0x4036, 0x1726, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, +0x12A9, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0048, 0x12A8, 0x427C, +0x1292, 0x1716, 0x407C, 0x00C1, 0x12A8, 0x4A0C, 0x430D, 0x1292, 0x171A, +0x407C, 0x00A1, 0x12A8, 0x470C, 0x12A9, 0x435C, 0x12A6, 0x434C, 0x12A6, +0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, +0x435C, 0x12A6, 0x532A, 0x4B0F, 0x533B, 0x930F, 0x23C1, 0x4030, 0xD318, +0x403C, 0x1688, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, 0x2042, 0x403C, +0x168A, 0x421F, 0x16F4, 0x129F, 0x0016, 0x930C, 0x203A, 0x403C, 0x168C, +0x421F, 0x16F4, 0x129F, 0x0016, 0x933C, 0x2432, 0x435C, 0x1292, 0x1544, +0x1292, 0x170E, 0x90B2, 0x0011, 0x1688, 0x2007, 0x421D, 0x168C, 0x421C, +0x168A, 0x12B0, 0xB064, 0x3C04, 0x421C, 0x168A, 0x12B0, 0xBC7A, 0x934C, +0x201C, 0x435C, 0x1292, 0x1546, 0x403C, 0x0028, 0x1292, 0x1540, 0x434C, +0x1292, 0x1544, 0x403C, 0x00C8, 0x1292, 0x1540, 0x1292, 0x170E, 0x407C, +0x0028, 0x1292, 0x1712, 0x4C4C, 0x430D, 0x12B0, 0xCA00, 0x930C, 0x2402, +0x430C, 0x4130, 0x433C, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x1207, 0x1204, 0x4C0A, 0x4D0B, 0x4E07, 0x3C3A, 0x4038, 0x1712, 0x407C, +0x0082, 0x12A8, 0x4039, 0x1718, 0x403C, 0x3FFF, 0x12A9, 0x4036, 0x1726, +0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x435C, +0x12A6, 0x434C, 0x12A6, 0x407C, 0x00C1, 0x12A8, 0x4A0C, 0x430D, 0x1292, +0x171A, 0x407C, 0x00A1, 0x12A8, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x430C, +0x12A9, 0x4C04, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, +0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, 0x448B, 0x0000, 0x532A, +0x532B, 0x470F, 0x5337, 0x930F, 0x23C2, 0x4030, 0xD318, 0x120A, 0x120B, +0x1208, 0x8231, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x410C, +0x522C, 0x421F, 0x16F4, 0x129F, 0x0018, 0x4038, 0x1726, 0x434C, 0x12A8, +0x430A, 0x430B, 0x3C23, 0x407C, 0x00C1, 0x1292, 0x1712, 0x412C, 0x411D, +0x0002, 0x1292, 0x171A, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x407C, 0x0042, +0x1292, 0x1712, 0x430C, 0x1292, 0x1718, 0x421F, 0x16F4, 0x129F, 0x0008, +0x412E, 0x411F, 0x0002, 0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x531A, 0x630B, 0x911B, 0x0006, 0x2BDA, 0x2003, 0x911A, 0x0004, 0x2BD6, +0x435C, 0x12A8, 0x434C, 0x12A8, 0x435C, 0x12A8, 0x430C, 0x5231, 0x4030, +0xD320, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x4C0A, +0x4D0B, 0x4E08, 0x3C39, 0x4B39, 0x4036, 0x1712, 0x407C, 0x0082, 0x12A6, +0x4037, 0x1718, 0x403C, 0x3FFF, 0x12A7, 0x4034, 0x1726, 0x434C, 0x12A4, +0x407C, 0x00C8, 0x12A6, 0x403C, 0x2409, 0x12A7, 0x435C, 0x12A4, 0x434C, +0x12A4, 0x407C, 0x0048, 0x12A6, 0x427C, 0x1292, 0x1716, 0x407C, 0x00C1, +0x12A6, 0x4A0C, 0x12A7, 0x407C, 0x00A1, 0x12A6, 0x490C, 0x12A7, 0x435C, +0x12A4, 0x434C, 0x12A4, 0x407C, 0x00C8, 0x12A6, 0x403C, 0x2401, 0x12A7, +0x407C, 0x0021, 0x12A6, 0x435C, 0x12A4, 0x532A, 0x480F, 0x5338, 0x930F, +0x23C3, 0x4030, 0xD318, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, +0x1204, 0x4C0A, 0x4D0B, 0x4E08, 0x3C38, 0x4039, 0x1712, 0x407C, 0x0082, +0x12A9, 0x4036, 0x1718, 0x403C, 0x3FFF, 0x12A6, 0x4037, 0x1726, 0x434C, +0x12A7, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12A7, +0x434C, 0x12A7, 0x407C, 0x00C1, 0x12A9, 0x4A0C, 0x12A6, 0x407C, 0x00A1, +0x12A9, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x430C, 0x12A6, 0x4C04, 0x434C, +0x12A7, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, +0x12A9, 0x435C, 0x12A7, 0x448B, 0x0000, 0x532A, 0x532B, 0x480F, 0x5338, +0x930F, 0x23C4, 0x4030, 0xD318, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x8321, 0x431A, 0x403B, 0x1726, 0x4038, 0x1718, 0x4039, 0x1712, 0x3C03, +0x932A, 0x2001, 0x422A, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0016, +0x903A, 0x000F, 0x242A, 0x930C, 0x202A, 0x4126, 0x407C, 0x00C8, 0x12A9, +0x403C, 0x3401, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x4A0C, 0xD03C, 0x4030, +0x12B0, 0xD844, 0x460C, 0x12B0, 0xD844, 0x403C, 0x3FFD, 0x12B0, 0xD486, +0x434C, 0x12AB, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x2401, 0x12A8, 0x435C, +0x12AB, 0x531A, 0x903A, 0x0010, 0x2BCE, 0x430C, 0x5321, 0x4030, 0xD31C, +0x930C, 0x37D6, 0x403C, 0xFFD8, 0x3FF8, 0x930D, 0x3408, 0x1208, 0xE33C, +0xE33D, 0x531C, 0x630D, 0x4038, 0x0197, 0x3C03, 0x1208, 0x4038, 0x0097, +0x903D, 0x0100, 0x2C1C, 0x930D, 0x200F, 0x903C, 0x0100, 0x2806, 0x108C, +0x4C4D, 0xC03C, 0x00FF, 0x8238, 0x3C06, 0x930C, 0x240D, 0x4C0D, 0x430C, +0x8038, 0x0010, 0x8318, 0x5C0C, 0x6D4D, 0x2BFC, 0x1108, 0x104D, 0x100C, +0x1088, 0xD80D, 0x4138, 0x4130, 0x1207, 0x4347, 0x903D, 0x0200, 0x2808, +0xC312, 0x100D, 0x100C, 0x1047, 0x5318, 0x903D, 0x0200, 0x2FF8, 0x1108, +0x104D, 0x100C, 0x1088, 0xD80D, 0x6747, 0x2806, 0xC312, 0x1047, 0x2001, +0x2802, 0x531C, 0x630D, 0x4137, 0x4138, 0x4130, 0x120A, 0x120B, 0x1208, +0x8221, 0x403A, 0x00C8, 0x4381, 0x0000, 0x4381, 0x0002, 0x410C, 0x530C, +0x421F, 0x16F4, 0x129F, 0x0018, 0x403B, 0x1726, 0x434C, 0x12AB, 0x407C, +0x00C1, 0x1292, 0x1712, 0x403C, 0x0EC4, 0x430D, 0x1292, 0x171A, 0x435C, +0x12AB, 0x434C, 0x12AB, 0x407C, 0x0042, 0x1292, 0x1712, 0x430C, 0x1292, +0x1718, 0x4C08, 0x435C, 0x12AB, 0x434C, 0x12AB, 0x435C, 0x12AB, 0xB228, +0x2C07, 0xF228, 0x480C, 0x3C0B, 0x434C, 0x12AB, 0x435C, 0x12AB, 0x4A0F, +0x533A, 0x930F, 0x23F8, 0x435C, 0x12AB, 0x430C, 0x421F, 0x16F4, 0x129F, +0x0008, 0x430C, 0x5221, 0x4030, 0xD320, 0x120A, 0x120B, 0x1208, 0x1209, +0x1206, 0x4C08, 0x4E0A, 0x4039, 0x1712, 0x407C, 0x00C8, 0x12A9, 0x4036, +0x1718, 0x403C, 0x3401, 0x12A6, 0x407C, 0x0082, 0x12A9, 0xD038, 0x4030, +0x480C, 0x12A6, 0x4038, 0x1726, 0x434C, 0x12A8, 0x407C, 0x0042, 0x12A9, +0x435C, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x4A0C, 0x12A6, 0x434C, 0x12A8, +0x407C, 0x0042, 0x12A9, 0x435C, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x403C, +0x3FFD, 0x12A6, 0x434C, 0x12A8, 0x407C, 0x0042, 0x12A9, 0x435C, 0x12A8, +0x434C, 0x12A8, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x2401, 0x12A6, 0x435C, +0x12A8, 0x4030, 0xD31C, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x435A, +0x403B, 0x1726, 0x4038, 0x1718, 0x4039, 0x1712, 0x3C03, 0x936A, 0x2001, +0x426A, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x3401, 0x12A8, 0x407C, 0x0082, +0x12A9, 0x4A4C, 0x108C, 0xF03C, 0x0F00, 0xD03C, 0x4082, 0x12B0, 0xD3D6, +0x407C, 0x0082, 0x12A9, 0x403C, 0x00FE, 0x12B0, 0xD3D6, 0x434C, 0x12AB, +0x435C, 0x12AB, 0x430C, 0x12A8, 0x4C06, 0x434C, 0x12AB, 0x407C, 0x00C8, +0x12A9, 0x403C, 0x2401, 0x12A8, 0x435C, 0x12AB, 0x460C, 0x421F, 0x16F4, +0x129F, 0x0008, 0x535A, 0x907A, 0x0010, 0x2BCB, 0x430C, 0x4030, 0xD31C, +0x464C, 0x4030, 0xBAAA, 0x464C, 0x12B0, 0xBAAA, 0x403C, 0xD034, 0x4820, +0x407C, 0x0021, 0x12AB, 0x430C, 0x12A8, 0x4C81, 0x000A, 0x4381, 0x000C, +0x4130, 0x474C, 0x12AB, 0x430C, 0x12A8, 0xF07C, 0x0081, 0x907C, 0x0081, +0x4130, 0x12A8, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12AB, 0x435C, 0x4A20, +0x12A8, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x12B0, 0xD54E, 0x435C, 0x4A20, +0x464C, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12AA, 0x494C, 0x12AB, +0x403C, 0x2409, 0x12A8, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12B0, 0xD54E, +0x407C, 0x0021, 0x4030, 0xBAAA, 0x120A, 0x120B, 0x1208, 0x1209, 0x4308, +0x430A, 0x430B, 0x434C, 0x1292, 0x1726, 0x407C, 0x0028, 0x1292, 0x1712, +0x430C, 0x1292, 0x1718, 0x4C09, 0x9318, 0x380A, 0xB32C, 0x2C08, 0x407C, +0x00C8, 0x1292, 0x1712, 0x403C, 0x3400, 0x1292, 0x1718, 0xB318, 0x2C0B, +0xB329, 0x2809, 0x407C, 0x00C8, 0x1292, 0x1712, 0x403C, 0x3402, 0x1292, +0x1718, 0x4318, 0x435C, 0x1292, 0x1726, 0x531A, 0x630B, 0x9038, 0x000A, +0x340C, 0xB329, 0x2806, 0x930B, 0x3BD0, 0x2003, 0x903A, 0x1388, 0x2BCC, +0x430C, 0x430D, 0x4030, 0xD31E, 0x433C, 0x433D, 0x3FFB, 0x120A, 0x120B, +0x8221, 0x403A, 0x16F4, 0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, +0x0090, 0x1292, 0x1712, 0x403B, 0x1718, 0x3C19, 0x410C, 0x532C, 0x4A2F, +0x129F, 0x0016, 0x416C, 0x12AB, 0x411C, 0x0002, 0x12AB, 0x90F1, 0x009E, +0x0000, 0x2006, 0xB0B1, 0x0040, 0x0002, 0x2802, 0x4382, 0x168E, 0x415E, +0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x2410, 0x410C, 0x530C, +0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BDC, 0x416C, 0x12AB, 0x430C, +0x12AB, 0x4A2F, 0x129F, 0x0008, 0x3FE8, 0x430C, 0x5221, 0x413B, 0x413A, +0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x4308, 0x430A, 0x430B, 0x434C, +0x1292, 0x1726, 0x407C, 0x0028, 0x1292, 0x1712, 0x430C, 0x1292, 0x1718, +0x4C09, 0x9318, 0x380A, 0xB32C, 0x2C08, 0x407C, 0x00C8, 0x1292, 0x1712, +0x403C, 0x3400, 0x1292, 0x1718, 0xB318, 0x2C0B, 0xB329, 0x2809, 0x407C, +0x00C8, 0x1292, 0x1712, 0x403C, 0x3402, 0x1292, 0x1718, 0x4318, 0x435C, +0x1292, 0x1726, 0x531A, 0x630B, 0x9038, 0x000A, 0x340C, 0xB329, 0x2806, +0x930B, 0x3BD0, 0x2003, 0x903A, 0x1388, 0x2BCC, 0x430C, 0x430D, 0x4030, +0xD31E, 0x433C, 0x433D, 0x3FFB, 0x8031, 0x000A, 0x4391, 0x0008, 0x4C81, +0x0006, 0x12B0, 0xD966, 0x4381, 0x0004, 0x12B0, 0xD98E, 0x430C, 0x1292, +0x1718, 0x4C81, 0x0000, 0x411E, 0x0002, 0x411F, 0x0004, 0x4E0C, 0x4F0D, +0x531C, 0x630D, 0x4C81, 0x0002, 0x4D81, 0x0004, 0x930F, 0x2003, 0x903E, +0x0BB8, 0x2802, 0x431C, 0x3C1A, 0xB391, 0x0000, 0x2C07, 0x9381, 0x0004, +0x2004, 0x90B1, 0x0BB8, 0x0002, 0x2BDE, 0x9381, 0x0004, 0x200C, 0x90B1, +0x0BB8, 0x0002, 0x2C08, 0x411C, 0x0008, 0x1292, 0x1718, 0x411C, 0x0006, +0x1292, 0x1718, 0x430C, 0x5031, 0x000A, 0x4130, 0x120A, 0x8221, 0x4381, +0x0000, 0x4381, 0x0002, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0016, +0x9382, 0x167C, 0x2420, 0x407C, 0x0028, 0x1292, 0x1712, 0x907C, 0x0089, +0x240F, 0x907C, 0x008D, 0x240C, 0x907C, 0x0091, 0x2409, 0x907C, 0x0095, +0x2406, 0x907C, 0x0098, 0x2403, 0x907C, 0x0099, 0x200A, 0x407C, 0x00D0, +0x1292, 0x1712, 0x430C, 0x1292, 0x1718, 0x4C0A, 0xB12C, 0x2004, 0x432C, +0x5221, 0x413A, 0x4130, 0x4382, 0x167C, 0x431C, 0x421F, 0x16F4, 0x129F, +0x0008, 0x4A0C, 0x421F, 0x16F4, 0x129F, 0x0008, 0x431C, 0x3FEF, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C05, 0x4C2A, +0x4C1B, 0x0002, 0x4038, 0x1726, 0x434C, 0x12A8, 0x4039, 0x1712, 0x4074, +0x0082, 0x12B0, 0xC0A4, 0x4036, 0x1718, 0x12B0, 0xC0B4, 0x503C, 0x0085, +0x12A6, 0x4077, 0x00C8, 0x12B0, 0xC0C4, 0x451A, 0x0004, 0x451B, 0x0006, +0x12B0, 0xC0AC, 0x503C, 0x0086, 0x12B0, 0xC0C2, 0x451A, 0x0008, 0x451B, +0x000A, 0x12B0, 0xC0AC, 0x503C, 0x0089, 0x12B0, 0xC0C2, 0x451A, 0x000C, +0x451B, 0x000E, 0x12B0, 0xC0AC, 0x503C, 0x0088, 0x12B0, 0xC0C2, 0x4030, +0xD316, 0x120A, 0x120B, 0x1208, 0xC232, 0x4303, 0x425E, 0x2554, 0x403F, +0x2552, 0xBEC2, 0x1766, 0x421D, 0x2558, 0xCECD, 0x0000, 0xCFED, 0x0000, +0x2402, 0xDECD, 0x0000, 0xDFED, 0x0000, 0x403A, 0x1760, 0x403B, 0x170A, +0x934C, 0x2407, 0x421D, 0x2558, 0xDECD, 0x0000, 0xDECD, 0x0000, 0x3C07, +0xE37E, 0x421D, 0x2558, 0xFECD, 0x0000, 0xFECD, 0x0000, 0x4F6C, 0xE37C, +0xFCCD, 0x0000, 0xDFED, 0x0000, 0x4B28, 0xEAE8, 0x0000, 0xC232, 0x4303, +0xFCCD, 0x0000, 0xDFED, 0x0000, 0x12B0, 0x2E86, 0x4EC2, 0x1766, 0x4030, +0xD320, 0x120A, 0x120B, 0x1208, 0x1209, 0x4C0A, 0x4D0B, 0x4038, 0x1712, +0x407C, 0x0088, 0x12A8, 0x407C, 0x0034, 0x1292, 0x1716, 0x407C, 0x0082, +0x12A8, 0x4A0C, 0x4B0D, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF03C, 0x0F00, +0xD03C, 0x0080, 0x1292, 0x1718, 0x4039, 0x1726, 0x434C, 0x12A9, 0x435C, +0x12A9, 0x4A0C, 0x1292, 0x1718, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x407C, +0x0021, 0x12A8, 0x434C, 0x12A9, 0x407C, 0x0088, 0x12A8, 0x407C, 0x0024, +0x1292, 0x1716, 0x435C, 0x12A9, 0x4030, 0xD31E, 0x120A, 0x120B, 0x1208, +0x1209, 0x8221, 0x4291, 0x2546, 0x0000, 0x4291, 0x2548, 0x0002, 0x403A, +0x1726, 0x434C, 0x12AA, 0x403B, 0x1712, 0x4078, 0x00C8, 0x484C, 0x12AB, +0x4039, 0x1718, 0x12B0, 0xD730, 0x403C, 0xFF80, 0x12B0, 0xD3F6, 0x412C, +0x12B0, 0xCF3C, 0x434C, 0x12AA, 0x484C, 0x12AB, 0x12B0, 0xD730, 0x403C, +0xFF82, 0x12B0, 0xD3F6, 0x411C, 0x0002, 0x12B0, 0xCF3C, 0x407C, 0x0054, +0x12AB, 0x403C, 0x0200, 0x430D, 0x1292, 0x171C, 0x430C, 0x5221, 0x4030, +0xD31E, 0x407C, 0x0028, 0x12AB, 0x430C, 0x4820, 0x407C, 0x00B0, 0x12AB, +0x403C, 0x0088, 0x430D, 0x4210, 0x171C, 0x12B0, 0xBFCA, 0x422C, 0x12A8, +0x4030, 0xBFCA, 0x12B0, 0xBF9A, 0x4C04, 0x435C, 0x4030, 0xBFC8, 0x430D, +0x12A7, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0042, 0x3FE0, 0x434C, +0x12A6, 0x494C, 0x12AB, 0x403C, 0x0500, 0x12A8, 0x454C, 0x4B20, 0x12A8, +0x434C, 0x12A6, 0x12B0, 0xD594, 0x12A6, 0x434C, 0x12A6, 0x435C, 0x4620, +0x120A, 0x403A, 0xD0C6, 0x403E, 0x000C, 0x430D, 0x403C, 0x16F6, 0x128A, +0x403E, 0x0020, 0x430D, 0x403C, 0x1740, 0x128A, 0x40B2, 0x0417, 0x16F0, +0x4382, 0x16F2, 0x4382, 0x1706, 0x40B2, 0x0CE4, 0x1738, 0x43D2, 0x1763, +0x43C2, 0x1764, 0x4382, 0x173C, 0x4382, 0x173E, 0x4382, 0x173A, 0x423E, +0x430D, 0x403C, 0x16CA, 0x128A, 0x403E, 0x0018, 0x430D, 0x403C, 0x16D2, +0x128A, 0x4392, 0x16EA, 0x40B2, 0x015C, 0x16EC, 0x413A, 0x4130, 0x120A, +0x407C, 0x0044, 0x1292, 0x1712, 0x431C, 0x1292, 0x1540, 0x43D2, 0x1767, +0x407C, 0x0024, 0x1292, 0x1712, 0x421A, 0x2558, 0xC2DA, 0x2554, 0x0000, +0xC2DA, 0x2552, 0x0000, 0xD2DA, 0x2552, 0x0000, 0x431C, 0x430D, 0x12B0, +0x33A4, 0xD2DA, 0x2554, 0x0000, 0x403C, 0x0003, 0x1292, 0x1540, 0x430C, +0x430D, 0x12B0, 0x33A4, 0x407C, 0x0054, 0x1292, 0x1712, 0x403C, 0x0200, +0x430D, 0x1292, 0x171C, 0x430C, 0x413A, 0x4130, 0x444C, 0x12A9, 0x435C, +0x4820, 0x434C, 0x12A8, 0x12B0, 0xC0A4, 0x4A0C, 0x4B0D, 0x12B0, 0xCAC0, +0xF03C, 0x0F00, 0x4130, 0x12A6, 0x474C, 0x12A9, 0x403C, 0x1401, 0x12A6, +0x444C, 0x12A9, 0x12B0, 0xD7B0, 0x4A0C, 0x12B0, 0xD7AE, 0x403C, 0x3FFD, +0x12B0, 0xD9D6, 0x407C, 0x0021, 0x12A9, 0x430C, 0x430D, 0x1292, 0x171A, +0x435C, 0x12A8, 0x474C, 0x12A9, 0x403C, 0x0501, 0x12B0, 0xD9D6, 0x407C, +0x0042, 0x4030, 0xC0A6, 0x120A, 0x120B, 0x407A, 0x0003, 0x407C, 0x0028, +0x1292, 0x1712, 0x907C, 0x0099, 0x240E, 0x907C, 0x0098, 0x240B, 0x907C, +0x0095, 0x2408, 0x907C, 0x0091, 0x2405, 0x907C, 0x0089, 0x2402, 0x433C, +0x3C16, 0x403C, 0xAAAA, 0x1292, 0x1718, 0x4C0B, 0x903C, 0x5555, 0x2006, +0x403C, 0x5555, 0x421F, 0x16F4, 0x129F, 0x0008, 0x537A, 0x23DB, 0x4B0C, +0x421F, 0x16F4, 0x129F, 0x0008, 0x430C, 0x413B, 0x413A, 0x4130, 0x120A, +0x120B, 0x1208, 0x8221, 0x433B, 0x43E1, 0x0000, 0x4218, 0x1374, 0x4381, +0x0002, 0x403A, 0x16F4, 0x410C, 0x532C, 0x4A2F, 0x129F, 0x0016, 0x12B0, +0x8FDC, 0x4CC1, 0x0000, 0x9381, 0x0002, 0x2409, 0x4A2F, 0x4F1F, 0x0008, +0x93D1, 0x0000, 0x12B0, 0xD04C, 0x430B, 0x3C0C, 0x416E, 0x4E82, 0x1374, +0x9E08, 0x2407, 0x4A2F, 0x4F1F, 0x0008, 0x935E, 0x12B0, 0xD04C, 0x431B, +0x4B0C, 0x5221, 0x4030, 0xD320, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, +0x4C0A, 0x4038, 0x1712, 0x407C, 0x00C8, 0x12A8, 0x4039, 0x1718, 0x403C, +0x3401, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, 0x12A9, 0x4036, +0x1726, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x4A0C, 0x12A9, 0x434C, 0x12A6, +0x435C, 0x12A6, 0x407C, 0x0021, 0x12A8, 0x434C, 0x12A6, 0x407C, 0x00C8, +0x12A8, 0x403C, 0x2401, 0x12A9, 0x435C, 0x12A6, 0x4030, 0xD31C, 0x120A, +0x403A, 0x1712, 0x934C, 0x200A, 0x407C, 0x00C8, 0x12AA, 0x403C, 0x7401, +0x1292, 0x1718, 0x434C, 0x12B0, 0x3330, 0x407C, 0x0044, 0x12AA, 0x431C, +0x1292, 0x1540, 0x431C, 0x430D, 0x12B0, 0x33A4, 0x407C, 0x0024, 0x12AA, +0x431C, 0x1292, 0x1540, 0x430C, 0x430D, 0x12B0, 0x33A4, 0x435C, 0x12B0, +0x3330, 0x407C, 0x0054, 0x12AA, 0x403C, 0x0200, 0x430D, 0x1292, 0x171C, +0x430C, 0x413A, 0x4130, 0x120A, 0x4C0A, 0x12B0, 0xBFD2, 0x4392, 0x1702, +0x40B2, 0x07CF, 0x1704, 0x403E, 0x000C, 0x403D, 0x253A, 0x403C, 0x16F6, +0x12B0, 0xD032, 0x4A82, 0x16F4, 0x12B0, 0xC87E, 0x9382, 0x1304, 0x2006, +0x40B2, 0xFFFE, 0x1302, 0x4292, 0x1542, 0x1304, 0x12B0, 0xC6C8, 0x4382, +0x16F0, 0x4382, 0x16F2, 0x40B2, 0x0070, 0x16FE, 0x40B2, 0x1146, 0x1700, +0x43C2, 0x16FC, 0x403C, 0x16F6, 0x413A, 0x4130, 0x4C0F, 0x930C, 0x2421, +0x503C, 0x0032, 0x93C2, 0x1566, 0x2413, 0xC2F2, 0x0031, 0xC0F2, 0x0020, +0x0029, 0x4F82, 0x1738, 0x12B0, 0xB2E6, 0x421F, 0x170A, 0xD2FF, 0x0000, +0x431C, 0x12B0, 0xC95E, 0x43C2, 0x1566, 0x3C13, 0x4F82, 0x1738, 0x12B0, +0xB2E6, 0x421F, 0x170A, 0xD2FF, 0x0000, 0x3C0A, 0x421F, 0x170A, 0xC2FF, +0x0000, 0x1292, 0x153C, 0x4382, 0x1738, 0x43D2, 0x1566, 0x430C, 0x4130, +0x494C, 0x12A8, 0x12B0, 0xDAB6, 0x421F, 0x16A0, 0x903F, 0x0091, 0x2406, +0x903F, 0x0099, 0x2403, 0x903F, 0x0098, 0x201F, 0x407C, 0x0028, 0x12A8, +0x430C, 0x12B0, 0xDB12, 0x474C, 0x12A8, 0x435C, 0x12AA, 0x403C, 0x0080, +0x12B0, 0xDB12, 0x12B0, 0xD138, 0x422C, 0x12B0, 0xDB12, 0x435C, 0x12AA, +0x403C, 0x4303, 0x12B0, 0xDB12, 0x12B0, 0xD456, 0x12B0, 0xDAB6, 0x444C, +0x12A8, 0x4130, 0x434C, 0x12A6, 0x407C, 0x0082, 0x12A8, 0x435C, 0x12A6, +0x4A0C, 0x12A9, 0x434C, 0x4620, 0x444C, 0x12A8, 0x430C, 0x430D, 0x1292, +0x171A, 0x454C, 0x12A8, 0x403C, 0x0501, 0x12A9, 0x435C, 0x12A6, 0x444C, +0x4820, 0x454C, 0x12A8, 0x403C, 0x1400, 0x12A9, 0x407C, 0x0082, 0x12A8, +0x434C, 0x12A6, 0x435C, 0x12A6, 0x4B0C, 0x12A9, 0x434C, 0x12A6, 0x435C, +0x12A6, 0x403C, 0x4303, 0x3FD9, 0x120A, 0x120B, 0x8321, 0x433B, 0x4381, +0x0000, 0x403A, 0x16F4, 0x410C, 0x530C, 0x4A2F, 0x129F, 0x0016, 0x9381, +0x0000, 0x2419, 0x12B0, 0xD5A2, 0x240A, 0x434C, 0x1292, 0x153A, 0x1292, +0x170E, 0x1292, 0x1710, 0x12B0, 0xD5A2, 0x2004, 0x12B0, 0xD14E, 0x430D, +0x3C04, 0x12B0, 0xD14E, 0x403D, 0xC000, 0x4A2F, 0x129F, 0x000A, 0x430B, +0x4B0C, 0x5321, 0x413B, 0x413A, 0x4130, 0x8321, 0x4381, 0x0000, 0x431C, +0x1292, 0x1550, 0x403C, 0x01F4, 0x1292, 0x1540, 0x434C, 0x1292, 0x153A, +0x1292, 0x170E, 0x1292, 0x1710, 0x407C, 0x0028, 0x1292, 0x1712, 0x4C4C, +0x4C81, 0x0000, 0x90B1, 0x0089, 0x0000, 0x200C, 0x435C, 0x12B0, 0xDA36, +0x407C, 0x0089, 0x12B0, 0xDA36, 0x436C, 0x12B0, 0xDA36, 0x430C, 0x3C01, +0x433C, 0x5321, 0x4130, 0x9382, 0x16E2, 0x240C, 0x407C, 0x00F4, 0x1292, +0x1712, 0x421C, 0x16E4, 0x1292, 0x1718, 0x403C, 0x0014, 0x1292, 0x1540, +0x421F, 0x16D2, 0xD21F, 0x16D4, 0x930F, 0x240E, 0x407C, 0x0054, 0x1292, +0x1712, 0x421C, 0x16D6, 0x421D, 0x16D8, 0x1292, 0x171C, 0x403C, 0x0014, +0x1292, 0x1540, 0x1292, 0x153C, 0x430C, 0x4130, 0x1206, 0x1207, 0x4D06, +0xD07D, 0x0080, 0x6606, 0x6707, 0x1086, 0xF376, 0x8076, 0x007F, 0x2C03, +0x430C, 0x430D, 0x3C13, 0x8076, 0x0018, 0x2C07, 0xE376, 0x240E, 0x110D, +0x100C, 0x8356, 0x23FC, 0x3C09, 0x9236, 0x3803, 0x433C, 0x433D, 0x3C04, +0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x4137, 0x4136, 0x4130, 0x120A, +0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x4C08, 0x4E0A, 0x4F0B, +0x12B0, 0xD2BC, 0xB0F2, 0x0040, 0x1766, 0x12B0, 0xCB20, 0x440C, 0x2803, +0x12B0, 0xCAFC, 0x3C02, 0x12B0, 0xD6B8, 0x12B0, 0xCE6A, 0x12B0, 0xCB14, +0x12B0, 0xD190, 0x4A0E, 0x4B0F, 0x480C, 0x12B0, 0x96E2, 0x4030, 0xD318, +0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C4A, 0x12B0, 0x95B4, 0xB0F2, +0x0040, 0x1766, 0x12B0, 0xCB20, 0x460C, 0x2805, 0x12B0, 0xD164, 0x12B0, +0xCB20, 0x3C04, 0x12B0, 0xD164, 0x12B0, 0xD6BC, 0x12B0, 0x94F0, 0x12B0, +0xD6BC, 0x12B0, 0x95C6, 0x4A4E, 0x430F, 0x423C, 0x12B0, 0x96E2, 0x4030, +0xD31C, 0x120A, 0x426A, 0x407C, 0x0028, 0x1292, 0x1712, 0x4C4C, 0x907C, +0x0089, 0x2414, 0x907C, 0x008D, 0x2411, 0x907C, 0x0091, 0x240E, 0x907C, +0x0095, 0x240B, 0x907C, 0x0098, 0x2408, 0x907C, 0x0099, 0x2405, 0x537A, +0x23E7, 0x433C, 0x413A, 0x4130, 0x421F, 0x16F4, 0x129F, 0x0008, 0x430C, +0x3FF8, 0x462F, 0xE9EF, 0x0000, 0xC232, 0x4303, 0x425E, 0x2552, 0x4E4F, +0xE37F, 0x421D, 0x2558, 0x4030, 0xC670, 0xD0B2, 0x0010, 0x01F0, 0xD392, +0x01F0, 0x4030, 0xC666, 0x12B0, 0x2F6A, 0x462C, 0xE9EC, 0x0000, 0xC232, +0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, +0x4130, 0x8321, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0014, 0x930C, +0x3403, 0x403C, 0xFFEB, 0x3C15, 0x416C, 0x1292, 0x1536, 0x930C, 0x2403, +0x403C, 0xFFEA, 0x3C0D, 0x434C, 0x1292, 0x153A, 0x1292, 0x170E, 0x1292, +0x1710, 0x435C, 0x421F, 0x16F4, 0x129F, 0x0004, 0x430C, 0x5321, 0x4130, +0x12B0, 0xB384, 0x4382, 0x0122, 0x4382, 0x0124, 0x40B2, 0x13C0, 0x01E8, +0x4292, 0x2558, 0x01EC, 0x40B2, 0x13C0, 0x01F0, 0x4292, 0x2558, 0x01F4, +0x42A2, 0x01F6, 0x4382, 0x1706, 0x4382, 0x1708, 0x430C, 0x12B0, 0x347E, +0x4392, 0x170C, 0x40B2, 0x8E50, 0x1562, 0x430C, 0x4130, 0x120A, 0x120B, +0x1208, 0x4C0A, 0x407C, 0x0082, 0x1292, 0x1712, 0x403C, 0x4030, 0x1292, +0x1718, 0x4038, 0x1726, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x4A0C, 0x1292, +0x1718, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x435C, 0x12A8, 0x434C, 0x12A8, +0x435C, 0x12A8, 0x4030, 0xD320, 0x435C, 0x1292, 0x1544, 0x1292, 0x170E, +0x403C, 0xA55A, 0x12B0, 0xBC7A, 0x931C, 0x2413, 0x12B0, 0xDA5E, 0x435C, +0x1292, 0x1546, 0x12B0, 0xD516, 0x2409, 0x907C, 0x0095, 0x2406, 0x907C, +0x0098, 0x2403, 0x907C, 0x0099, 0x2002, 0x430C, 0x4130, 0x433C, 0x4130, +0x434C, 0x1292, 0x1546, 0x12B0, 0xDA5E, 0x434C, 0x1292, 0x1548, 0x12B0, +0xDA5E, 0x434C, 0x1292, 0x1544, 0x1292, 0x170E, 0x12B0, 0xD516, 0x240B, +0x907C, 0x0095, 0x2408, 0x907C, 0x0098, 0x2405, 0x907C, 0x0099, 0x2402, +0x433C, 0x4130, 0x430C, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0xB2F2, +0x001D, 0x2808, 0x431C, 0x12B0, 0xD880, 0x4C8A, 0x0000, 0x4D8A, 0x0002, +0x3C04, 0x438C, 0x0000, 0x438C, 0x0002, 0x430C, 0x12B0, 0xD880, 0x4C8B, +0x0000, 0x4D8B, 0x0002, 0x430C, 0x413B, 0x413A, 0x4130, 0x12A9, 0x434C, +0x12A8, 0x12B0, 0xD476, 0x411C, 0x0002, 0x12A9, 0x434C, 0x12A8, 0x12B0, +0xD476, 0x403C, 0x3FFD, 0x12A9, 0x434C, 0x12A8, 0x464C, 0x12AA, 0x435C, +0x12A8, 0x434C, 0x12A8, 0x454C, 0x12AA, 0x407C, 0x0024, 0x12A7, 0x435C, +0x4820, 0x8231, 0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0000, 0x4381, +0x0002, 0x410D, 0x530D, 0x410C, 0x522C, 0x1292, 0x1534, 0x411C, 0x0004, +0x411D, 0x0006, 0x12B0, 0xD664, 0x412C, 0x411D, 0x0002, 0x12B0, 0xD664, +0x430C, 0x5231, 0x4130, 0x434E, 0x4E4F, 0x5F0F, 0x5F0F, 0x4F9F, 0x1376, +0x1146, 0x4F9F, 0x1378, 0x1148, 0x535E, 0x907E, 0x006E, 0x2BF3, 0x407E, +0x006E, 0x4E4F, 0x5F0F, 0x5F0F, 0x43BF, 0x1146, 0x438F, 0x1148, 0x535E, +0x907E, 0x0070, 0x2BF5, 0x4130, 0x120C, 0x120E, 0x425E, 0x1765, 0x535E, +0x907E, 0x000A, 0x200F, 0x434E, 0x4382, 0x0160, 0x432C, 0x12B0, 0xCDEC, +0x903C, 0x0FFF, 0x3404, 0x40B2, 0x0114, 0x0160, 0x3C02, 0x43C2, 0x1762, +0x4EC2, 0x1765, 0x413E, 0x413C, 0x1300, 0x1209, 0x120A, 0x120B, 0x430A, +0x430B, 0x4039, 0x0020, 0x5C0C, 0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, +0x2804, 0xD31C, 0x5339, 0x23F6, 0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, +0x4A0E, 0x4B0F, 0x413B, 0x413A, 0x4139, 0x4130, 0x4C82, 0x1708, 0x9392, +0x1706, 0x200D, 0x931C, 0x2003, 0x403F, 0xCCF2, 0x3C0F, 0x932C, 0x2003, +0x403F, 0xAB50, 0x3C0A, 0x403F, 0xAAEC, 0x3C07, 0x931C, 0x2003, 0x403F, +0x3EB2, 0x3C02, 0x403F, 0x3EE2, 0x4F82, 0x1728, 0x4130, 0x930C, 0x2418, +0x4382, 0x0160, 0xC392, 0x0160, 0x40B2, 0x0200, 0x0160, 0x40B2, 0x02E9, +0x0172, 0x4382, 0x0170, 0xD0B2, 0x0014, 0x0160, 0xB392, 0x0160, 0x2BFD, +0x4382, 0x0160, 0xC392, 0x0160, 0x533C, 0x23E8, 0x4130, 0x903C, 0x0091, +0x2002, 0x930D, 0x2414, 0x903C, 0x0095, 0x2002, 0x930D, 0x240F, 0x903C, +0x0098, 0x2002, 0x930D, 0x240A, 0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, +0x2402, 0x434C, 0x4130, 0x435C, 0x4130, 0x435C, 0x4130, 0x1292, 0x1726, +0x12B0, 0x39BE, 0xC3D2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x12B0, 0x39B4, +0x12B0, 0x39BE, 0xD2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x12B0, 0x39B4, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4130, 0x903C, 0x0091, +0x2002, 0x930D, 0x2414, 0x903C, 0x0095, 0x2002, 0x930D, 0x240F, 0x903C, +0x0098, 0x2002, 0x930D, 0x240A, 0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, +0x2402, 0x434C, 0x4130, 0x435C, 0x4130, 0x435C, 0x4130, 0x120A, 0x120B, +0x12B0, 0xD98E, 0x403B, 0x1718, 0x430C, 0x12AB, 0xB23C, 0x280B, 0x403C, +0x0014, 0x12AB, 0x430C, 0x12AB, 0x4C0A, 0x430C, 0x12AB, 0x4C0D, 0x4A0C, +0x3C02, 0x430C, 0x430D, 0x413B, 0x413A, 0x4130, 0x474C, 0x12AA, 0x435C, +0x4920, 0x12B0, 0xCA7A, 0x435C, 0x4920, 0x12A6, 0x434C, 0x4920, 0x434C, +0x12A9, 0x407C, 0x00C8, 0x4A20, 0x12B0, 0xCA7A, 0x407C, 0x0042, 0x12AA, +0x435C, 0x12A9, 0x484C, 0x3FE8, 0xC312, 0x100D, 0x100C, 0xC312, 0x100D, +0x100C, 0xC312, 0x100D, 0x100C, 0xC312, 0x100D, 0x100C, 0xC312, 0x100D, +0x100C, 0xC312, 0x100D, 0x100C, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF37D, +0x4130, 0x434C, 0x12A9, 0x4B4C, 0x12AA, 0x440C, 0x4820, 0x12A8, 0x434C, +0x12A9, 0x407C, 0x0042, 0x12AA, 0x435C, 0x4920, 0x434C, 0x12A9, 0x4B4C, +0x12AA, 0x403C, 0x2C01, 0x12A8, 0x435C, 0x12A9, 0x3FEA, 0x12B0, 0xCB04, +0x4030, 0xCB20, 0x12A9, 0x12B0, 0xD83A, 0x472F, 0xC3DF, 0x0000, 0x431C, +0x4920, 0x12B0, 0xCB1C, 0x12B0, 0xCE6A, 0x12B0, 0xCB04, 0xD0F2, 0x0040, +0x0029, 0x4130, 0x4191, 0x0006, 0x0008, 0x4381, 0x000A, 0x407C, 0x0082, +0x12AA, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12A9, 0x4B4C, 0x12AA, 0x403C, +0x2409, 0x12A8, 0x435C, 0x12A9, 0x434C, 0x4920, 0x120A, 0x8321, 0x433A, +0x43C1, 0x0000, 0x410C, 0x530C, 0x421F, 0x16F4, 0x129F, 0x0014, 0x933C, +0x2404, 0x416C, 0x1292, 0x172A, 0x430A, 0x4A0C, 0x5321, 0x413A, 0x4130, +0x40B2, 0x9F60, 0x1670, 0x40B2, 0xB952, 0x1672, 0x40B2, 0xC1D2, 0x1674, +0x40B2, 0xB67A, 0x1676, 0x40B2, 0xB70E, 0x1678, 0x4292, 0x1194, 0x167A, +0x430C, 0x4030, 0x8946, 0x40B2, 0x95E6, 0x1670, 0x40B2, 0xAD10, 0x1672, +0x40B2, 0xBE7E, 0x1674, 0x40B2, 0xB41E, 0x1676, 0x40B2, 0xB54E, 0x1678, +0x4292, 0x11E8, 0x167A, 0x430C, 0x4030, 0x86C6, 0x40B2, 0x9F60, 0x1670, +0x40B2, 0xB952, 0x1672, 0x40B2, 0xC70C, 0x1674, 0x40B2, 0xB67A, 0x1676, +0x40B2, 0xB70E, 0x1678, 0x4292, 0x1194, 0x167A, 0x431C, 0x4030, 0x86C6, +0x40B2, 0x9F60, 0x1670, 0x40B2, 0xB952, 0x1672, 0x40B2, 0xC70C, 0x1674, +0x40B2, 0xB67A, 0x1676, 0x40B2, 0xB70E, 0x1678, 0x4292, 0x1194, 0x167A, +0x431C, 0x4030, 0x8946, 0x40B2, 0x95E6, 0x1670, 0x40B2, 0xAD10, 0x1672, +0x40B2, 0xBE7E, 0x1674, 0x40B2, 0xB41E, 0x1676, 0x40B2, 0xB54E, 0x1678, +0x4292, 0x11E8, 0x167A, 0x430C, 0x4030, 0x8946, 0x40B2, 0x9F60, 0x1670, +0x40B2, 0xB952, 0x1672, 0x40B2, 0xC1D2, 0x1674, 0x40B2, 0xB67A, 0x1676, +0x40B2, 0xB70E, 0x1678, 0x4292, 0x1194, 0x167A, 0x430C, 0x4030, 0x86C6, +0x907B, 0x0010, 0x2807, 0x4D0C, 0x4E0D, 0x4F0E, 0x430F, 0x807B, 0x0010, +0x3FF6, 0x934B, 0x2407, 0xC312, 0x100F, 0x100E, 0x100D, 0x100C, 0x835B, +0x23F9, 0x4130, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x490C, 0x4820, 0x12B0, +0xCCA2, 0x435C, 0x4620, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x403C, 0x2C01, +0x12A8, 0x435C, 0x4030, 0xCCA4, 0x4C0F, 0x430C, 0x922F, 0x2C0F, 0x5F0F, +0x4F1C, 0x0140, 0x5F1C, 0x0148, 0x5F1C, 0x0150, 0x5F1C, 0x0158, 0x4F1E, +0x254A, 0x12B0, 0xCFB0, 0x12B0, 0xCA9C, 0x4130, 0x120A, 0x120B, 0x1208, +0x1209, 0x1206, 0x4C0A, 0x4D0B, 0x4218, 0x01F2, 0x12B0, 0xA9E2, 0x12B0, +0xAB06, 0x4882, 0x01F2, 0x435C, 0x1292, 0x1726, 0x4030, 0xD31C, 0x4191, +0x000A, 0x0002, 0x454C, 0x12AA, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12A6, +0x4B4C, 0x12AA, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12A6, 0x434C, 0x4620, +0x12B0, 0xCB20, 0x421F, 0x170A, 0xC2DF, 0x1760, 0x0000, 0x431C, 0x1292, +0x1540, 0x421F, 0x170A, 0xD3DF, 0x0000, 0xC0F2, 0x0020, 0x0029, 0x4130, +0x12B0, 0xD832, 0x12B0, 0xD832, 0x12B0, 0xCE98, 0x2005, 0x407C, 0x00C8, +0x12A8, 0x450C, 0x12AB, 0x434C, 0x12AA, 0x444C, 0x12A8, 0x435C, 0x4A20, +0x454C, 0x12AA, 0x407C, 0x0034, 0x12A7, 0x4B4C, 0x12AA, 0x435C, 0x12A8, +0x411C, 0x0002, 0x411D, 0x0004, 0x12B0, 0xCAC0, 0xF03C, 0x0F00, 0x4130, +0x4382, 0x0160, 0xC392, 0x0160, 0x40B2, 0x0200, 0x0160, 0x40B2, 0x02E9, +0x0172, 0x4382, 0x0170, 0xD0B2, 0x0016, 0x0160, 0x4130, 0x1285, 0x4C0F, +0xDD0F, 0x930F, 0x4130, 0x474C, 0x12AB, 0x430C, 0x4820, 0x494C, 0x12AB, +0x403C, 0x3400, 0x4820, 0x12A8, 0x3FF0, 0xC3A2, 0x01A0, 0x507C, 0x0010, +0x4CC2, 0x0080, 0xD3A2, 0x01A0, 0xD392, 0x01A0, 0xB392, 0x01A4, 0x2BFD, +0x421C, 0x0140, 0x4130, 0x4392, 0x1374, 0x4382, 0x1686, 0x4382, 0x167E, +0x4382, 0x1680, 0x4382, 0x1682, 0x4382, 0x1684, 0x4382, 0x168E, 0x430C, +0x4130, 0x3C09, 0x3C08, 0x434C, 0x4130, 0x434C, 0x4130, 0x430C, 0x4130, +0x4130, 0x4130, 0x430C, 0x430D, 0x430E, 0x430F, 0x4130, 0x3FFA, 0x482F, +0x4F10, 0x0008, 0x5C0C, 0x5C0C, 0x12AA, 0x12B0, 0xDA06, 0x430D, 0x482F, +0x129F, 0x000A, 0x12B0, 0xDA06, 0x3FF1, 0x440C, 0x12B0, 0xCB04, 0x472F, +0xD6EF, 0x0000, 0x12B0, 0xDA26, 0xC6EF, 0x0000, 0xC0F2, 0x0040, 0x0029, +0x440C, 0x4130, 0x12AB, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x1401, 0x12B0, +0xD9C6, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x9382, 0x16EA, 0x4130, 0x12B0, +0xD98E, 0x430C, 0x1292, 0x1718, 0xB22C, 0x2806, 0x422C, 0x1292, 0x1718, +0x430C, 0x4210, 0x1718, 0x430C, 0x4130, 0x431C, 0x1292, 0x1540, 0x444C, +0x12A8, 0x430C, 0x12AB, 0x411F, 0x0004, 0x533F, 0x4F81, 0x0004, 0x421F, +0x1578, 0x4130, 0x462F, 0x4F10, 0x0008, 0x5C0C, 0x5C0C, 0x430D, 0x12A9, +0x12B0, 0xD6C4, 0x462F, 0x129F, 0x000A, 0x12B0, 0xD6C4, 0x3FF1, 0x4C0D, +0x4C0E, 0xF03E, 0x000F, 0x431C, 0x12B0, 0xD760, 0x907D, 0x0010, 0x2803, +0x4C0D, 0x430C, 0x4130, 0x430D, 0x4130, 0xC232, 0x4303, 0x425C, 0x2552, +0x4C4A, 0xE37A, 0x421B, 0x2558, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, +0x4D28, 0x4130, 0x12A9, 0x434C, 0x12AA, 0x484C, 0x12AB, 0x403C, 0x0501, +0x12A9, 0x435C, 0x12AA, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x494C, 0x12A8, +0x403C, 0x3FFF, 0x12AB, 0x12B0, 0xDADE, 0x403C, 0x2409, 0x12AB, 0x435C, +0x12AA, 0x434C, 0x4A20, 0x12B0, 0xCF82, 0x407C, 0x0082, 0x12A9, 0x435C, +0x4820, 0x1292, 0x1718, 0x434C, 0x12A8, 0x407C, 0x0042, 0x3FF6, 0x462C, +0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, +0x462F, 0xE9EF, 0x0000, 0x4130, 0xF37C, 0xF37E, 0x1202, 0xC232, 0x4303, +0x4C82, 0x0130, 0x4E82, 0x0138, 0x421C, 0x013A, 0x421D, 0x013C, 0x1300, +0xF37C, 0xF37E, 0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, 0x9F0E, +0x2801, 0x8F0E, 0x6C0C, 0x2BF9, 0x4130, 0x8321, 0x410C, 0x530C, 0x421F, +0x16F4, 0x129F, 0x0016, 0x412C, 0x1292, 0x1530, 0x430C, 0x5321, 0x4130, +0x407C, 0x0094, 0x1292, 0x1712, 0x434C, 0x1292, 0x1716, 0x421F, 0x16F4, +0x129F, 0x0004, 0x430C, 0x4130, 0x435C, 0x12A6, 0x407C, 0x0048, 0x12AA, +0x435C, 0x12A7, 0x435C, 0x12A6, 0x40F1, 0x000A, 0x0004, 0x4130, 0x120A, +0x4C0A, 0x3C04, 0x4DEA, 0x0000, 0x531A, 0x531D, 0x4E0F, 0x533E, 0x930F, +0x23F8, 0x413A, 0x4130, 0x422C, 0x2004, 0x12B0, 0xD3C6, 0x430D, 0x3C04, +0x12B0, 0xD3C6, 0x403D, 0x4000, 0x4A2F, 0x4F10, 0x000A, 0x12B0, 0xDA76, +0x12AB, 0x411C, 0x0002, 0x12B0, 0xD1A6, 0x12AB, 0x450C, 0x12A9, 0x435C, +0x4720, 0x423D, 0x12B0, 0xD3B6, 0x47E1, 0x0006, 0x47D1, 0x0001, 0x0007, +0x410F, 0x503F, 0x002A, 0x4130, 0xF03B, 0x000F, 0x4A0C, 0x4B0D, 0x12A7, +0x435C, 0x12A8, 0x434C, 0x12A8, 0x407C, 0x0042, 0x4920, 0x434C, 0x12A9, +0x435C, 0x4920, 0x403C, 0x0080, 0x12A8, 0x403C, 0x0880, 0x4820, 0x12A8, +0x3FF4, 0x120A, 0x4C0A, 0x3C03, 0x4DCA, 0x0000, 0x531A, 0x4E0F, 0x533E, +0x930F, 0x23F9, 0x413A, 0x4130, 0x12B0, 0xDA96, 0x12AB, 0x411C, 0x0002, +0x12B0, 0xD122, 0x12AB, 0x450C, 0x12A9, 0x435C, 0x4720, 0x407C, 0x00C1, +0x12AA, 0x411C, 0x0008, 0x430D, 0x1292, 0x171A, 0x407C, 0x00A1, 0x4130, +0x4C0A, 0x4D0B, 0x4218, 0x01F2, 0x40B2, 0x2623, 0x01EA, 0x40B2, 0x262F, +0x01F2, 0x4130, 0x12B0, 0xDA96, 0x12AB, 0x403C, 0x3FFD, 0x12B0, 0xD604, +0x434C, 0x12A7, 0x484C, 0x4130, 0x494C, 0x12A8, 0x403C, 0x1400, 0x12AB, +0x474C, 0x12A8, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x422C, 0x4A2F, 0x129F, +0x0008, 0x430C, 0x430D, 0x4A2F, 0x129F, 0x000A, 0x430C, 0x4130, 0x12AB, +0x492F, 0xD3DF, 0x0000, 0x431C, 0x12AB, 0x492F, 0xC3DF, 0x0000, 0x431C, +0x4B20, 0x407C, 0x0082, 0x12A6, 0x435C, 0x4820, 0x12A9, 0x434C, 0x12A8, +0x407C, 0x0042, 0x3FF7, 0x440C, 0x12A9, 0x12B0, 0xDA26, 0xD6EF, 0x0000, +0x12B0, 0xDA26, 0xC6EF, 0x0000, 0x4130, 0x12B0, 0xDA76, 0x12AB, 0x403C, +0x3FFD, 0x12B0, 0xD4DE, 0x434C, 0x12A7, 0x484C, 0x4130, 0x12B0, 0x2F6A, +0x4D2E, 0xEFEE, 0x0000, 0x12B0, 0x319A, 0x4D2E, 0xEFEE, 0x0000, 0x4130, +0x434C, 0x12A6, 0x435C, 0x12A6, 0x415E, 0x0004, 0x537E, 0x4EC1, 0x0004, +0x4130, 0x407C, 0x0048, 0x12AA, 0x435C, 0x12A7, 0x435C, 0x12A9, 0x4075, +0x000A, 0x4130, 0x407C, 0x0028, 0x12AA, 0x430C, 0x12A8, 0xF07C, 0x0081, +0x907C, 0x0081, 0x4130, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x0012, +0x4215, 0x16F4, 0x4510, 0x000E, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, +0x0014, 0x4214, 0x16F4, 0x4410, 0x000E, 0x434C, 0x12A9, 0x407C, 0x0088, +0x12AA, 0x407C, 0x0024, 0x12A7, 0x435C, 0x4920, 0xD3DF, 0x0000, 0x432C, +0x1292, 0x153E, 0x12B0, 0x3322, 0x432C, 0x4210, 0x153E, 0x403C, 0x0003, +0x1292, 0x1234, 0x410C, 0x503C, 0x002C, 0x492F, 0x4F10, 0x0010, 0x407C, +0x00C1, 0x12AB, 0x403C, 0x0182, 0x430D, 0x1292, 0x171A, 0x435C, 0x4820, +0x403C, 0x0003, 0x1292, 0x1190, 0x4C07, 0x4B0C, 0x4A2F, 0x4F10, 0x0010, +0x430F, 0x430E, 0x422D, 0x410C, 0x503C, 0x0010, 0x4A27, 0x4710, 0x000E, +0x1292, 0x1540, 0x5314, 0x6305, 0x12B0, 0xCA36, 0x903C, 0xBABE, 0x4130, +0x4039, 0x153E, 0x4036, 0x1760, 0x4037, 0x170A, 0x4034, 0x0190, 0x4130, +0x434C, 0x12A9, 0x407C, 0x0042, 0x12AA, 0x435C, 0x12A9, 0x484C, 0x4A20, +0x12A8, 0x4030, 0xD2EA, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x435C, 0x4620, +0x403C, 0x0003, 0x1292, 0x11E4, 0x4C0B, 0x440C, 0x4A2F, 0x4F10, 0x0010, +0x430F, 0x430E, 0x422D, 0x410C, 0x503C, 0x000C, 0x4A2B, 0x4B10, 0x000E, +0x4135, 0x4134, 0x4137, 0x4136, 0x4139, 0x4138, 0x413B, 0x413A, 0x4130, +0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x4130, +0x434C, 0x12A9, 0x444C, 0x12AA, 0x407C, 0x0024, 0x12AB, 0x435C, 0x4920, +0x407C, 0x00C1, 0x12AA, 0x411C, 0x0002, 0x12A8, 0x407C, 0x00A1, 0x4A20, +0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, 0x4130, +0x407C, 0x0042, 0x12AA, 0x435C, 0x4820, 0x434C, 0x12A8, 0x474C, 0x3FF9, +0x430C, 0x12A6, 0x4C0B, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x435C, 0x4820, +0x407C, 0x00F4, 0x12AB, 0x421C, 0x16E4, 0x12A9, 0xC21C, 0x16E2, 0x4130, +0x407C, 0x0054, 0x12AB, 0x421C, 0x16D6, 0x421D, 0x16D8, 0x4720, 0x120C, +0x4EFC, 0x0000, 0x531C, 0x831D, 0x23FB, 0x413C, 0x4130, 0x128F, 0x430C, +0x430D, 0x4A2F, 0x129F, 0x000A, 0x430C, 0x4130, 0x12A8, 0x434C, 0x12AB, +0x407C, 0x0042, 0x12A9, 0x435C, 0x4B20, 0x403C, 0x0003, 0x1292, 0x1230, +0x470C, 0x4A2F, 0x4F10, 0x0010, 0x430D, 0x1292, 0x171A, 0x435C, 0x12AA, +0x407C, 0x00A1, 0x4B20, 0x12B0, 0xCAC0, 0x4C0A, 0xF03A, 0x0F00, 0x503A, +0x0080, 0x4130, 0x4191, 0x0002, 0x0006, 0x4191, 0x0004, 0x0008, 0x444C, +0x4820, 0x460C, 0x1292, 0x1234, 0x4C0A, 0x470C, 0x4B2F, 0x4F10, 0x0010, +0xD3D2, 0x0031, 0xC3D2, 0x0031, 0x403C, 0x0005, 0x4210, 0x153E, 0x12B0, +0xD436, 0x12B0, 0xD436, 0xD3D2, 0x0031, 0x430C, 0x4130, 0x444C, 0x12A8, +0x430C, 0x430D, 0x1292, 0x171A, 0x494C, 0x4820, 0xC232, 0x4303, 0xFACB, +0x0000, 0xDCCB, 0x0000, 0xD232, 0x4130, 0x464C, 0x12AA, 0x435C, 0x12A8, +0x4B4C, 0x12AA, 0x435C, 0x4820, 0x12A8, 0x434C, 0x12AB, 0x407C, 0x0042, +0x12A9, 0x435C, 0x4B20, 0x120C, 0x438C, 0x0000, 0x532C, 0x831E, 0x23FB, +0x413C, 0x4130, 0x423D, 0x12B0, 0xD3B6, 0x410F, 0x503F, 0x0026, 0x4130, +0x12B0, 0xCAC0, 0xF03C, 0x0F00, 0xD03C, 0x0085, 0x4130, 0x423D, 0x12B0, +0xD3B6, 0x410F, 0x503F, 0x0036, 0x4130, 0x484C, 0x12AB, 0x403C, 0x3401, +0x12A9, 0x464C, 0x4B20, 0x12A9, 0x434C, 0x12A7, 0x444C, 0x12AB, 0x435C, +0x4720, 0x430F, 0x431E, 0x422D, 0x480C, 0x4B2A, 0x4A10, 0x000E, 0x3C02, +0x3C00, 0x3C00, 0x533C, 0x930C, 0x23FB, 0x4130, 0x434C, 0x12A9, 0x474C, +0x12A8, 0x403C, 0x2401, 0x4620, 0x407C, 0x0028, 0x1292, 0x1712, 0x907C, +0x0091, 0x4130, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0034, 0x4210, 0x1716, +0x12A8, 0x12B0, 0xBBF6, 0x4C0F, 0xDD0F, 0x930F, 0x4130, 0x494C, 0x12AB, +0x403C, 0x3401, 0x12A8, 0x464C, 0x4B20, 0x434C, 0x12AA, 0x494C, 0x12AB, +0x403C, 0x2401, 0x4820, 0x403C, 0x4030, 0x12A6, 0x434C, 0x12A9, 0x435C, +0x4920, 0x12A8, 0x4C05, 0x444C, 0x12AA, 0x403C, 0x0088, 0x4820, 0x12B0, +0xD830, 0x403C, 0x3FFD, 0x12AB, 0x434C, 0x4A20, 0x430D, 0x12A7, 0x435C, +0x12A6, 0x407C, 0x00A1, 0x4B20, 0x494C, 0x12AB, 0x403C, 0x0501, 0x12A8, +0x435C, 0x4130, 0x407C, 0x0028, 0x1292, 0x1712, 0x907C, 0x0089, 0x4130, +0x12A9, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x435C, 0x421F, +0x16F4, 0x129F, 0x0004, 0x430C, 0x4130, 0x12A9, 0x484C, 0x12AB, 0x434C, +0x12AA, 0x435C, 0x4A20, 0x484C, 0x12AB, 0x403C, 0x3401, 0x12A9, 0x464C, +0x4B20, 0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, 0x2401, 0x4620, 0x4B4C, +0x12AA, 0x403C, 0x3401, 0x12A8, 0x454C, 0x4A20, 0x12A9, 0x434C, 0x12A7, +0x444C, 0x12AB, 0x435C, 0x4720, 0x12B0, 0xD8BC, 0xF07C, 0x0081, 0x907C, +0x0081, 0x4130, 0x12AB, 0x474C, 0x12AA, 0x434C, 0x12A8, 0x435C, 0x4820, +0x407C, 0x00B0, 0x12AA, 0x403C, 0x0082, 0x430D, 0x4620, 0x407C, 0x00B0, +0x12AA, 0x403C, 0x0088, 0x430D, 0x4620, 0x12B0, 0xD920, 0x403C, 0x3FFD, +0x12B0, 0x7910, 0x4A20, 0x464C, 0x12AA, 0x430C, 0x430D, 0x4210, 0x171A, +0x12B0, 0xD6E8, 0x421F, 0x16F4, 0x4F10, 0x0008, 0x434C, 0x12A9, 0x12B0, +0xD8D0, 0x435C, 0x4920, 0xC0B2, 0x0010, 0x0160, 0xC3A2, 0x0160, 0x4130, +0x434C, 0x12AA, 0x494C, 0x12A8, 0x470C, 0x4B20, 0x444C, 0x12AB, 0x435C, +0x12A7, 0x464C, 0x4B20, 0x12B0, 0xCCA2, 0x444C, 0x12AA, 0x435C, 0x4620, +0x12B0, 0x3194, 0x4D29, 0xEFE9, 0x0000, 0x4130, 0x12B0, 0xCB04, 0xC0F2, +0x0040, 0x0029, 0x4130, 0x4A0C, 0x430D, 0x12A9, 0x430C, 0x430D, 0x4920, +0x434C, 0x12A6, 0x435C, 0x12A6, 0x494C, 0x4B20, 0x434C, 0x12AA, 0x12B0, +0xD9C8, 0x435C, 0x4A20, 0x12B0, 0xC512, 0x2802, 0x430C, 0x430D, 0x4130, +0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x4130, 0x12A8, 0x434C, 0x12A6, +0x407C, 0x0042, 0x4A20, 0x430F, 0x430E, 0x423D, 0x410C, 0x523C, 0x4130, +0x444C, 0x12A8, 0x435C, 0x12AA, 0x430C, 0x4B20, 0x421F, 0x16F4, 0x129F, +0x0016, 0x930C, 0x4130, 0x403C, 0x0500, 0x12A9, 0x407C, 0x00C1, 0x4B20, +0x407C, 0x00B0, 0x12A8, 0x432C, 0x430D, 0x4920, 0x403C, 0x0080, 0x12A8, +0x403C, 0x0880, 0x4820, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x435C, 0x4820, +0x934E, 0x2403, 0x5C0C, 0x835E, 0x23FD, 0x4130, 0x407C, 0x0021, 0x12A9, +0x430C, 0x430D, 0x4720, 0x421F, 0x16F4, 0x129F, 0x0018, 0x930C, 0x4130, +0x444C, 0x12AB, 0x435C, 0x12A7, 0x464C, 0x4B20, 0x494C, 0x12AB, 0x403C, +0x3400, 0x4820, 0x407C, 0x0028, 0x12A8, 0x430C, 0x4920, 0x492F, 0x129F, +0x0016, 0x930C, 0x4130, 0x12A6, 0x434C, 0x12A8, 0x435C, 0x4820, 0x430D, +0x12A9, 0x430C, 0x430D, 0x4920, 0x12A6, 0x434C, 0x12A9, 0x435C, 0x4920, +0x434C, 0x1292, 0x153A, 0x4210, 0x170E, 0x464C, 0x12AB, 0x403C, 0x0082, +0x4820, 0x2802, 0x435C, 0x4130, 0x434C, 0x4130, 0x444C, 0x12A8, 0x407C, +0x0034, 0x4720, 0x490C, 0x12A8, 0x407C, 0x0028, 0x4A20, 0x430D, 0x12A9, +0x431C, 0x430D, 0x4920, 0x4A2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x4C04, +0x460C, 0x4B2F, 0x4F10, 0x0010, 0x434C, 0x12A9, 0x407C, 0x00C8, 0x4B20, +0x434C, 0x12A9, 0x407C, 0x00C8, 0x4820, 0x12AB, 0x434C, 0x12AA, 0x435C, +0x4A20, 0x472F, 0xD3DF, 0x0000, 0x431C, 0x4920, 0x12B0, 0xD486, 0x407C, +0x0082, 0x4920, 0x407C, 0x0028, 0x12A8, 0x430C, 0x4620, 0x12A6, 0x434C, +0x12A9, 0x435C, 0x4920, 0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x12AB, +0x435C, 0x12A9, 0x434C, 0x4920, 0x407C, 0x0090, 0x12A9, 0x432C, 0x4820, +0x12B0, 0xCCCA, 0x430D, 0x4030, 0xB846, 0x930C, 0x2402, 0x43E2, 0x007C, +0x4130, 0x12AA, 0x434C, 0x12A8, 0x435C, 0x4820, 0x494C, 0x12AA, 0x403C, +0x0501, 0x4B20, 0x407C, 0x0091, 0x462F, 0x4F10, 0x0012, 0x5392, 0x166E, +0xC392, 0x0160, 0x1300, 0x407C, 0x0028, 0x12AA, 0x430C, 0x4820, 0x4C05, +0x440C, 0x4A2F, 0x4F10, 0x0010, 0x464C, 0x12AA, 0x403C, 0x2401, 0x4B20, +0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x464C, 0x12AB, 0x403C, 0x0401, +0x4920, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x4620, 0x12AB, 0x434C, 0x12AA, +0x444C, 0x4820, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x4920, 0x12A9, 0x434C, +0x12AA, 0x474C, 0x4B20, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x4620, 0x12B0, +0x7910, 0x12AA, 0x494C, 0x4820, 0x12A8, 0x435C, 0x12AB, 0x434C, 0x4B20, +0x434C, 0x12AB, 0x407C, 0x00C8, 0x4920, 0x12A6, 0x435C, 0x12A7, 0x434C, +0x4720, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x4A20, 0xD038, 0x0040, 0x480C, +0x430D, 0x4920, 0x434C, 0x12A7, 0x407C, 0x00C8, 0x4920, 0x4381, 0x0002, +0x4381, 0x0004, 0x4130, 0x430D, 0x1292, 0x171A, 0x435C, 0x4A20, 0x12A9, +0x434C, 0x12AA, 0x464C, 0x4B20, 0x494C, 0x12AB, 0x403C, 0x2401, 0x4820, +0x407C, 0x0086, 0x4210, 0x1712, 0x12A6, 0x407C, 0x0021, 0x4B20, 0x1292, +0x152E, 0x430C, 0x4130, 0x12B0, 0xD9BE, 0x930C, 0x4130, 0x444C, 0x12AA, +0x430C, 0x4820, 0x12B0, 0xD832, 0x430C, 0x4B20, 0x421F, 0x16F4, 0x4F10, +0x0016, 0x12AB, 0x407C, 0x0082, 0x4820, 0x444C, 0x12AA, 0x450C, 0x4820, +0x12B0, 0xD7AE, 0x434C, 0x4820, 0x12B0, 0xD9BE, 0x933C, 0x4130, 0x12AA, +0x407C, 0x00C8, 0x4820, 0x421F, 0x16F4, 0x4F10, 0x0004, 0x12A9, 0x407C, +0x0082, 0x4820, 0x421F, 0x16F4, 0x4F10, 0x0008, 0x4B0C, 0x12AA, 0x430C, +0x4A20, 0x12B0, 0xDA3E, 0x930C, 0x4130, 0x435C, 0x12A6, 0x434C, 0x4620, +0x435C, 0x12A6, 0x434C, 0x4620, 0x12B0, 0xCB06, 0x472F, 0x4130, 0x435C, +0x12A6, 0x434C, 0x4620, 0x421F, 0x16F4, 0x4F10, 0x0004, 0x421F, 0x16F4, +0x4F10, 0x0016, 0x430C, 0x430D, 0x4130, 0x3FFC, 0x434C, 0x12A7, 0x494C, +0x4820, 0x403C, 0x0020, 0x4030, 0x6A90, 0x403C, 0x0028, 0x4210, 0x1540, +0x474C, 0x12AA, 0x435C, 0x4920, 0x12B0, 0xD466, 0x4D2B, 0x4130, 0x12B0, +0xD4DE, 0x464C, 0x4130, 0x484C, 0x12AB, 0x435C, 0x4A20, 0x12B0, 0xDA3E, +0x933C, 0x4130, 0x12B0, 0xD8F8, 0x435C, 0x4130, 0x12B0, 0xD604, 0x464C, +0x4130, 0x12B0, 0xD688, 0x435C, 0x4130, 0x403C, 0x0021, 0x4030, 0x6A90, +0x421F, 0x16F4, 0x4F10, 0x0014, 0x450C, 0x12AB, 0x435C, 0x4A20, 0x12B0, +0xDB48, 0x435C, 0x4920, 0x421F, 0x16F4, 0x4F10, 0x000A, 0x12B0, 0x7EA0, +0x435C, 0x4A20, 0x12B0, 0xD894, 0x434C, 0x4820, 0x434C, 0x12AA, 0x464C, +0x4820, 0x421F, 0x16F4, 0x4F10, 0x0014, 0x12B0, 0xDAF6, 0x930C, 0x4130, +0x421F, 0x16F4, 0x4F10, 0x0016, 0x12B0, 0xDAF6, 0x933C, 0x4130, 0x12B0, +0xD122, 0x4B20, 0x12A8, 0x430C, 0x4820, 0x12AB, 0x434C, 0x4A20, 0x12B0, +0xD1A6, 0x4B20, 0x430C, 0x4030, 0x6A90, 0x12AB, 0x430C, 0x4B20, 0x4B2F, +0x4F10, 0x0016, 0x12B0, 0x6F96, 0x4820, 0x407C, 0x0088, 0x4A20, 0x425C, +0x1768, 0x4130, 0x425C, 0x1769, 0x4130, 0x12AB, 0x434C, 0x4920, 0x433C, +0x433D, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x430C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x433C, 0x4130, 0x430C, 0x4130, 0x434C, 0x4130, 0x433C, 0x4130, 0x430C, +0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, +0x430C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x430C, 0x4130, 0x433C, 0x4130, 0x430C, 0x4130, +0x4030, 0xD032, 0x430C, 0x4130, 0x433C, 0x4130, 0x433C, 0x4130, 0x433C, +0x4130, 0x433C, 0x4130, 0x430C, 0x4130, 0x430C, 0x4130, 0x434C, 0x4130, +0x4130, 0x4130, 0x4130, 0x4130, 0x4130, 0x5137, +}; + +const uint32_t UifHalMsp430Image_address[] = +{ +0x0000250A, 0x0000251E, 0x0000253A, 0x0000DFFE, +}; +const uint32_t UifHalMsp430Image_length_of_sections[] = +{ +0x00000002, 0x00000001, 0x00005B58, 0x00000001, +}; +const uint32_t UifHalMsp430Image_sections = 0x00000004; +const uint32_t UifHalMsp430Image_termination = 0x00000000; +const uint32_t UifHalMsp430Image_start = 0x0000250A; +const uint32_t UifHalMsp430Image_finish = 0x0000E000; +const uint32_t UifHalMsp430Image_length = 0x0000BAF6; + +#define UIFHALMSP430IMAGE_TERMINATION 0x00000000 +#define UIFHALMSP430IMAGE_START 0x0000250A +#define UIFHALMSP430IMAGE_FINISH 0x0000E000 +#define UIFHALMSP430IMAGE_LENGTH 0x0000BAF6 +#define UIFHALMSP430IMAGE_SECTIONS 0x00000004 diff --git a/Bios/include/eZ_FetComChannel.h b/Bios/include/eZ_FetComChannel.h new file mode 100644 index 0000000..f805f7f --- /dev/null +++ b/Bios/include/eZ_FetComChannel.h @@ -0,0 +1,487 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetComChannelImage[] = +{ +0x1000, 0x0002, 0x0009, 0x0009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x57DA, 0xACDC, +0xACDC, 0x4180, 0x3200, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, +0x1840, 0x1207, 0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, +0x120B, 0x1840, 0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, +0x008C, 0x420E, 0x403E, 0x0179, 0x403F, 0x0000, 0x13B2, 0x1614, 0x008C, +0x4204, 0x028D, 0x1714, 0x403E, 0x0009, 0x403F, 0x0000, 0x13B2, 0x1710, +0x1840, 0x413F, 0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, +0x413B, 0x1840, 0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, +0x1840, 0x4136, 0x1840, 0x4135, 0x1840, 0x4134, 0x1900, 0x4070, 0x12FE, +0x4011, 0x3172, 0x141B, 0x4C0A, 0x13B2, 0x16A8, 0x1840, 0x921A, 0x4300, +0x2004, 0x1840, 0x921D, 0x4302, 0x24AA, 0xD3D2, 0x05C0, 0xD0F2, 0x0080, +0x05C0, 0x903A, 0x12C0, 0x200A, 0x930D, 0x2008, 0x40F2, 0x0045, 0x05C6, +0x43D2, 0x05C7, 0x40F2, 0x0081, 0x05C8, 0x903A, 0x2580, 0x200B, 0x930D, +0x2009, 0x40F2, 0x00A2, 0x05C6, 0x43C2, 0x05C7, 0x40F2, 0x00C1, 0x05C8, +0x3C70, 0x903A, 0x3840, 0x200B, 0x930D, 0x2009, 0x40F2, 0x006C, 0x05C6, +0x43C2, 0x05C7, 0x40F2, 0x0081, 0x05C8, 0x3C62, 0x903A, 0x4B00, 0x200B, +0x930D, 0x2009, 0x40F2, 0x0051, 0x05C6, 0x43C2, 0x05C7, 0x40F2, 0x0061, +0x05C8, 0x3C54, 0x903A, 0x7080, 0x200B, 0x930D, 0x2009, 0x40F2, 0x0036, +0x05C6, 0x43C2, 0x05C7, 0x40F2, 0x0041, 0x05C8, 0x3C46, 0x903A, 0x9600, +0x200B, 0x930D, 0x2009, 0x40F2, 0x0028, 0x05C6, 0x43C2, 0x05C7, 0x40F2, +0x00B1, 0x05C8, 0x3C38, 0x903A, 0xDAC0, 0x200B, 0x930D, 0x2009, 0x40F2, +0x001B, 0x05C6, 0x43C2, 0x05C7, 0x40F2, 0x00E1, 0x05C8, 0x3C2A, 0x903A, +0xE100, 0x200B, 0x930D, 0x2009, 0x40F2, 0x001B, 0x05C6, 0x43C2, 0x05C7, +0x40F2, 0x0021, 0x05C8, 0x3C1C, 0x903A, 0xC200, 0x200B, 0x931D, 0x2009, +0x40F2, 0x000D, 0x05C6, 0x43C2, 0x05C7, 0x40F2, 0x0091, 0x05C8, 0x3C0E, +0x903A, 0xE800, 0x200B, 0x903D, 0x0003, 0x2008, 0x40F2, 0x0006, 0x05C6, +0x43C2, 0x05C7, 0x40F2, 0x0005, 0x05C8, 0x1840, 0x9392, 0x4304, 0x2004, +0xD0F2, 0x00C0, 0x05C1, 0x3C08, 0xF0F2, 0x003F, 0x05C1, 0x43C2, 0x05C0, +0xD0F2, 0x0080, 0x05C0, 0xC3D2, 0x05C0, 0xD3D2, 0x05DC, 0x1840, 0x4A82, +0x4300, 0x1840, 0x4D82, 0x4302, 0x13B2, 0x1696, 0x430C, 0x161A, 0x0110, +0x002F, 0x4204, 0x438F, 0x0000, 0x1840, 0x4E82, 0x42F0, 0x4C0E, 0x4D0F, +0x830F, 0x206F, 0x803E, 0x1F41, 0x240E, 0x803E, 0x0653, 0x240B, 0x831E, +0x2416, 0x831E, 0x2433, 0x831E, 0x240A, 0x831E, 0x2405, 0x831E, 0x240E, +0x0110, 0x0280, 0x15FC, 0x430C, 0x0020, 0x4254, 0x403C, 0x0CE4, 0x1380, +0x42D0, 0x403C, 0x0CE4, 0x0020, 0x4254, 0x1900, 0x40F2, 0x1494, 0x4220, +0x1900, 0x40F2, 0x1092, 0x423C, 0x1900, 0x40F2, 0x170C, 0x4240, 0x1900, +0x40F2, 0x170C, 0x4244, 0x903C, 0x2599, 0x2007, 0x930D, 0x2005, 0x431D, +0x403C, 0x2595, 0x0280, 0x159E, 0x430D, 0x403C, 0x2595, 0x0280, 0x159E, +0x1900, 0x40F2, 0x1494, 0x4220, 0x1900, 0x40F2, 0x1092, 0x423C, 0x1840, +0x90B2, 0xAAAC, 0x42F0, 0x2405, 0x1840, 0x90B2, 0xAAAD, 0x42F0, 0x200D, +0x1900, 0x40F2, 0x170C, 0x4240, 0x1900, 0x40F2, 0x170C, 0x4244, 0x430D, +0x403C, 0x2595, 0x0280, 0x159E, 0x1900, 0x40F2, 0x1696, 0x4240, 0x1900, +0x40F2, 0x16A8, 0x4244, 0x430D, 0x403C, 0x2596, 0x13B2, 0x159E, 0x1380, +0x4240, 0x002F, 0x4204, 0x4C8F, 0x0000, 0x0110, 0x141B, 0x0CCA, 0x008B, +0x4218, 0x1900, 0x40FB, 0x1700, 0x0000, 0x1900, 0x40FB, 0x14E0, 0x0004, +0x1900, 0x40FB, 0x13A4, 0x000C, 0x1900, 0x40FB, 0x16C8, 0x0014, 0x1900, +0x40FB, 0x16D6, 0x0018, 0x1900, 0x40FB, 0x1658, 0x001C, 0x1900, 0x40FB, +0x142A, 0x0020, 0x1900, 0x40FB, 0x15FC, 0x0010, 0x1900, 0x40FB, 0x170C, +0x0028, 0x1900, 0x40FB, 0x170C, 0x002C, 0x1900, 0x40FB, 0x16F8, 0x0030, +0x1900, 0x40FB, 0x1494, 0x0008, 0x1900, 0x40FB, 0x1092, 0x0024, 0x1900, +0x40FB, 0x1706, 0x0034, 0x430D, 0x403C, 0x2595, 0x13B2, 0x159E, 0x1840, +0x4382, 0x420E, 0x1800, 0x40F2, 0x4306, 0x4210, 0x1840, 0x43D2, 0x420C, +0x0ACC, 0x0BCE, 0x008D, 0x001C, 0x13B2, 0x162C, 0x161A, 0x0110, 0x140A, +0x4C4A, 0x1380, 0x4244, 0x002F, 0x4204, 0x4C8F, 0x0000, 0x1840, 0x90B2, +0x0040, 0x420E, 0x240F, 0x002E, 0x4210, 0x1840, 0x421F, 0x420E, 0x0FEE, +0x4ACE, 0x0000, 0x1840, 0x5392, 0x420E, 0x1840, 0x5392, 0x42EC, 0x3C1E, +0x13B2, 0x154A, 0x002E, 0x4210, 0x1840, 0x421F, 0x420E, 0x0FEE, 0x4ACE, +0x0000, 0x1840, 0x5392, 0x420E, 0x1840, 0x4392, 0x42EC, 0x1840, 0x4382, +0x42EE, 0x13B2, 0x166E, 0x1203, 0x1230, 0x000A, 0x435E, 0x403D, 0x0040, +0x1380, 0x42E8, 0x5221, 0x1380, 0x4240, 0x002F, 0x4204, 0x4C8F, 0x0000, +0x430C, 0x160A, 0x0110, 0x1380, 0x4220, 0x1840, 0x9382, 0x42EC, 0x242E, +0x1840, 0x5392, 0x42EE, 0x1840, 0x90B2, 0x05DC, 0x42EE, 0x2826, 0x1380, +0x4244, 0x002F, 0x4204, 0x4C8F, 0x0000, 0xC3D2, 0x05DC, 0x1840, 0x421D, +0x42EC, 0x1840, 0x4382, 0x42EC, 0x13B2, 0x154A, 0x13B2, 0x166E, 0x1203, +0x1230, 0x000A, 0x435E, 0x1380, 0x42E8, 0x5221, 0x934C, 0x2003, 0x1840, +0x4382, 0x42EE, 0xD3D2, 0x05DC, 0x1380, 0x4240, 0x002F, 0x4204, 0x4C8F, +0x0000, 0x0110, 0x8321, 0x435C, 0x1380, 0x42F4, 0x934C, 0x241D, 0x13B2, +0x16E4, 0x930C, 0x2419, 0x13B2, 0x16EE, 0x930C, 0x2415, 0x1840, 0x93C2, +0x4386, 0x2411, 0x1840, 0x9392, 0x42F2, 0x2003, 0x1840, 0x43C2, 0x4386, +0x43C1, 0x0000, 0x435E, 0x431D, 0x410C, 0x530C, 0x1380, 0x42F8, 0x41E2, +0x05CE, 0x430C, 0x5321, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x411E, 0x000C, +0x1840, 0x921C, 0x4214, 0x2004, 0x1840, 0x921D, 0x4216, 0x240C, 0x13B2, +0x1208, 0x4A0C, 0x4B0D, 0x1380, 0x423C, 0x1840, 0x4A82, 0x4214, 0x1840, +0x4B82, 0x4216, 0x430C, 0x161A, 0x0110, 0xF0F2, 0x00E7, 0x022A, 0xF0F2, +0x00E7, 0x0224, 0xC0F2, 0x0080, 0x0203, 0xC0F2, 0x0080, 0x0205, 0xC0F2, +0x0040, 0x0203, 0xC0F2, 0x0040, 0x0205, 0xC0F2, 0x0040, 0x0207, 0xC0F2, +0x0040, 0x021D, 0x0110, 0x1840, 0x4382, 0x420E, 0x1840, 0x93D2, 0x420C, +0x2008, 0x1800, 0x40F2, 0x4346, 0x4210, 0x1840, 0x43C2, 0x420C, 0x0110, +0x1800, 0x40F2, 0x4306, 0x4210, 0x1840, 0x43D2, 0x420C, 0x0110, 0x1840, +0x4392, 0x42F2, 0x1840, 0x43C2, 0x4386, 0xC0F2, 0x0040, 0x0219, 0xD0F2, +0x0040, 0x021B, 0xC0F2, 0x0040, 0x021D, 0xD0F2, 0x0040, 0x021D, 0x0110, +0x903C, 0x2595, 0x2002, 0x13B2, 0x1642, 0x903C, 0x2596, 0x2002, 0x13B2, +0x1578, 0x13B2, 0x15E0, 0xD3D2, 0x05DC, 0x1840, 0x4D82, 0x4304, 0x0110, +0x141B, 0x0CCA, 0x3C06, 0x4DFA, 0x0000, 0x00AA, 0x0001, 0x533E, 0x633F, +0x4E0B, 0xDF0B, 0x930B, 0x23F6, 0x161A, 0x0110, 0xD0F2, 0x0080, 0x0205, +0x13B2, 0x16A8, 0xC0F2, 0x0040, 0x0205, 0xD2F2, 0x022A, 0xD0F2, 0x0010, +0x022A, 0x0110, 0x1840, 0x4382, 0x420E, 0x1800, 0x40F2, 0x4306, 0x4210, +0x1840, 0x43D2, 0x420C, 0x0280, 0x1518, 0x151F, 0x160F, 0x0CCE, 0x0FEE, +0x3C04, 0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, 0x1800, +0x124C, 0x4EBC, 0x0000, 0x03EC, 0x00BD, 0x0001, 0x23FA, 0x1800, 0x417C, +0x0110, 0x1840, 0x4382, 0x42F2, 0x1840, 0x43D2, 0x4386, 0xC0F2, 0x0040, +0x021B, 0x0280, 0x1682, 0x0CCF, 0x008C, 0x42E0, 0x0FCE, 0x008D, 0x0006, +0x13B2, 0x162C, 0x0FCC, 0x0280, 0x16BA, 0x1840, 0x93C2, 0x420C, 0x2003, +0x008C, 0x4306, 0x0110, 0x008C, 0x4346, 0x0110, 0xD0F2, 0x0040, 0x0207, +0xD0F2, 0x0040, 0x0203, 0xC0F2, 0x0040, 0x0205, 0x0110, 0xD0F2, 0x0080, +0x0203, 0x002F, 0x4208, 0x439F, 0x0000, 0x431C, 0x0110, 0xC0F2, 0x0080, +0x0203, 0x002F, 0x4208, 0x438F, 0x0000, 0x430C, 0x0110, 0x0CCE, 0x008C, +0x42F4, 0x008D, 0x0006, 0x0280, 0x162C, 0x0CCE, 0x008C, 0x4250, 0x008D, +0x0038, 0x0280, 0x162C, 0x0CCE, 0x008C, 0x42C0, 0x008D, 0x0010, 0x0280, +0x162C, 0xB3D2, 0x05CA, 0x7C0C, 0xF31C, 0x0110, 0xB3E2, 0x05DD, 0x7C0C, +0x531C, 0x0110, 0x1840, 0x43D2, 0x4386, 0x0110, 0x403C, 0x0009, 0x0110, +0x403C, 0x0009, 0x0110, 0x430C, 0x0110, 0x0280, 0x15C2, 0x4200, 0x0000, +0x4200, 0x0000, 0xFF01, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, +}; + +const uint32_t eZ_FetComChannelImage_address[] = +{ +0x00001980, 0x00021000, +}; +const uint32_t eZ_FetComChannelImage_length_of_sections[] = +{ +0x00000040, 0x00001000, +}; +const uint32_t eZ_FetComChannelImage_sections = 0x00000002; +const uint32_t eZ_FetComChannelImage_termination = 0x00000000; +const uint32_t eZ_FetComChannelImage_start = 0x00001980; +const uint32_t eZ_FetComChannelImage_finish = 0x00023000; +const uint32_t eZ_FetComChannelImage_length = 0x00021680; + +#define EZ_FETCOMCHANNELIMAGE_TERMINATION 0x00000000 +#define EZ_FETCOMCHANNELIMAGE_START 0x00001980 +#define EZ_FETCOMCHANNELIMAGE_FINISH 0x00023000 +#define EZ_FETCOMCHANNELIMAGE_LENGTH 0x00021680 +#define EZ_FETCOMCHANNELIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/eZ_FetCore.h b/Bios/include/eZ_FetCore.h new file mode 100644 index 0000000..353ec59 --- /dev/null +++ b/Bios/include/eZ_FetCore.h @@ -0,0 +1,1027 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetCoreImage[] = +{ +0xFFFF, 0x03B3, 0x001D, 0x40B2, 0x5A80, 0x015C, 0x4031, 0x4100, 0x008C, +0x30D8, 0x403E, 0x0DE6, 0x403F, 0x0000, 0x13B0, 0x7FDA, 0x008C, 0x3000, +0x403D, 0x8882, 0x403E, 0x00D8, 0x403F, 0x0000, 0x13B0, 0x8554, 0x13B0, +0x6774, 0x13B0, 0x8558, 0x145F, 0x434A, 0xB2E2, 0x093E, 0x2811, 0x13B0, +0x738E, 0x4C4A, 0xC0F2, 0x0080, 0x0920, 0xC0F2, 0x0080, 0x0922, 0xC2E2, +0x093E, 0xD0F2, 0x0080, 0x0920, 0xD0F2, 0x0080, 0x0922, 0x421F, 0x0932, +0xF03F, 0x003F, 0x0FE0, 0x3C96, 0x3C1E, 0x3C94, 0x3C93, 0x3C1D, 0x3C23, +0x3C2B, 0x3C8F, 0x3C8E, 0x3C31, 0x3C33, 0x3C35, 0x3C3D, 0x3C46, 0x3C88, +0x3C87, 0x3C4D, 0x3C85, 0x3C84, 0x3C53, 0x3C82, 0x3C53, 0x3C80, 0x3C7F, +0x3C7E, 0x3C7D, 0x3C52, 0x3C7B, 0x3C63, 0x3C79, 0x3C78, 0x3C77, 0x4303, +0x3C75, 0x1840, 0xB392, 0x3C0E, 0x2871, 0x13B0, 0x8538, 0x3C6D, 0x13B0, +0x7DC2, 0x1840, 0xB3A2, 0x3C0E, 0x2868, 0x13B0, 0x8134, 0x3C64, 0x13B0, +0x7836, 0x1840, 0xB2A2, 0x3C0E, 0x285F, 0x13B0, 0x84BE, 0x3C5B, 0x13B0, +0x7EC4, 0x3C59, 0x13B0, 0x7782, 0x3C56, 0x13B0, 0x5670, 0x1840, 0xB2B2, +0x3C0E, 0x2850, 0x13B0, 0x8530, 0x3C4C, 0x13B0, 0x55CA, 0x1840, 0xB0B2, +0x0010, 0x3C0E, 0x2846, 0x13B0, 0x84C6, 0x3C42, 0x13B0, 0x55B6, 0x1840, +0xB0B2, 0x0020, 0x3C0E, 0x283E, 0x13B0, 0x84CE, 0x3C3B, 0x40F2, 0x0080, +0x0921, 0x40F2, 0x0080, 0x0923, 0x13B0, 0x738E, 0x3C30, 0x434C, 0x3C01, +0x435C, 0x13B0, 0x5F7C, 0x3C29, 0x434C, 0x13B0, 0x47B6, 0x930C, 0x200C, +0x434C, 0x13B0, 0x6ADC, 0x934C, 0x2407, 0x1840, 0xB0B2, 0x0040, 0x3C0E, +0x281B, 0x434C, 0x3C12, 0x434C, 0x3C14, 0x435C, 0x13B0, 0x47B6, 0x930C, +0x200E, 0x435C, 0x13B0, 0x6ADC, 0x934C, 0x2409, 0x1840, 0xB0B2, 0x0040, +0x3C0E, 0x2808, 0x435C, 0x13B0, 0x7D0E, 0x3C03, 0x435C, 0x13B0, 0x4856, +0x4C4A, 0x934A, 0x2404, 0xC0B1, 0x00D0, 0x0018, 0x4303, 0x165A, 0x1300, +0x145F, 0x90B2, 0x000E, 0x03AE, 0x2060, 0x008A, 0x3394, 0x93AA, 0x0000, +0x2806, 0xB3DA, 0x0002, 0x2C03, 0x53BA, 0x0000, 0x3C09, 0x939A, 0x0000, +0x2006, 0x438A, 0x0000, 0x403C, 0x8004, 0x13B0, 0x7E06, 0x93AA, 0x0004, +0x2806, 0x1840, 0x93C2, 0x3D14, 0x2002, 0x53BA, 0x0004, 0x008F, 0x339C, +0x4F6E, 0x4F1D, 0x0002, 0x035D, 0x9F1D, 0x0004, 0x7D4D, 0xF35D, 0xF35E, +0xED4E, 0x0F3E, 0x0006, 0x2404, 0xDFDE, 0x000A, 0x0000, 0x3C03, 0xCFDE, +0x000A, 0x0000, 0x938F, 0x0004, 0x2403, 0x53BF, 0x0004, 0x3C06, 0xB3EF, +0x0000, 0x2803, 0x4F9F, 0x0002, 0x0004, 0x4F5E, 0x000C, 0x4F1D, 0x000E, +0x035D, 0x9F1D, 0x0010, 0x7D4D, 0xF35D, 0xF35E, 0xED4E, 0x0F3E, 0x0012, +0x2404, 0xDFDE, 0x0016, 0x0000, 0x3C03, 0xCFDE, 0x0016, 0x0000, 0x938F, +0x0010, 0x2403, 0x53BF, 0x0010, 0x3C06, 0xB3EF, 0x000C, 0x2803, 0x4F9F, +0x000E, 0x0010, 0x165A, 0x1300, 0x4303, 0x1300, 0x143F, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x421F, 0x019A, 0x0FE0, 0x3C0A, 0x3C09, 0x3C02, +0x3C07, 0x3C08, 0xF0B2, 0xFFF4, 0x016E, 0xC3A2, 0x0102, 0x3C06, 0x4303, +0x3C06, 0x4382, 0x0198, 0x13B0, 0x5796, 0x13B0, 0x46BE, 0x163C, 0x1300, +0x435C, 0x13B0, 0x80A6, 0x434C, 0x0080, 0x80A6, 0x143F, 0x421F, 0x019A, +0x0FE0, 0x3C0A, 0x3C09, 0x3C02, 0x3C07, 0x3C08, 0xF0B2, 0xFFF4, 0x016E, +0xC3A2, 0x0102, 0x3C06, 0x4303, 0x3C06, 0x4382, 0x0198, 0x13B0, 0x5796, +0x13B0, 0x46BE, 0x163C, 0x1300, 0x145F, 0x421F, 0x036E, 0x903F, 0x000E, +0x2012, 0x008A, 0x3BFE, 0x0ACD, 0x403C, 0xAA04, 0x1380, 0x3060, 0x930C, +0x2409, 0x0A0F, 0x938F, 0x0000, 0x2002, 0x439F, 0x0000, 0x0A0F, 0x539F, +0x0000, 0x165A, 0x1300, 0x143F, 0x008D, 0x3BFA, 0x403C, 0xAA02, 0x1380, +0x3060, 0x930C, 0x2404, 0x002F, 0x3BFA, 0x539F, 0x0000, 0x163C, 0x1300, +0x143F, 0x421F, 0x042E, 0x903F, 0x000E, 0x200C, 0x008D, 0x3BF6, 0x403C, +0xAA03, 0x1380, 0x3060, 0x930C, 0x2404, 0x002F, 0x3BF6, 0x539F, 0x0000, +0x163C, 0x1300, 0x143F, 0x425C, 0x05CC, 0x1380, 0x3C1C, 0x163C, 0x1300, +0x143F, 0xB0F2, 0x0040, 0x021D, 0x2805, 0xC0F2, 0x0040, 0x021D, 0x1380, +0x3C40, 0x163C, 0x1300, 0x4A0C, 0x0080, 0x4B54, 0x434C, 0x1638, 0x0110, +0x1840, 0x4F1B, 0x320C, 0x1840, 0x8F1B, 0x320E, 0x0110, 0x4C4C, 0x0CEC, +0x0CCF, 0x064C, 0x0CEF, 0x0CEC, 0x0FEC, 0x1800, 0x4C5F, 0x3204, 0x03DF, +0x2002, 0x434C, 0x0110, 0x435C, 0x0110, 0x145B, 0x0CCB, 0x0DC8, 0x4E4E, +0x0EEE, 0x0ECF, 0x064E, 0x0EEF, 0x0EEE, 0x0FEE, 0x0EC9, 0x0EC6, 0x00A6, +0x321C, 0x466F, 0x1840, 0x9E1F, 0x320E, 0x2C02, 0x4F4A, 0x3C03, 0x1840, +0x4E5A, 0x320E, 0x4A4E, 0x430F, 0x0CCD, 0x1800, 0x495C, 0x3204, 0x1380, +0x3BDC, 0x1840, 0x8A89, 0x320E, 0x4A0F, 0x1800, 0x5FC9, 0x3204, 0x966A, +0x200E, 0x435E, 0x1840, 0x595E, 0x321D, 0xF35E, 0x1840, 0x4EC9, 0x321D, +0x1840, 0x43C9, 0x321C, 0x43C8, 0x0000, 0x3C07, 0x1840, 0x8AC9, 0x321C, +0x0FEB, 0x1800, 0x4BC9, 0x3208, 0x1656, 0x0110, 0x145B, 0x4C4A, 0x434B, +0x13B0, 0x81FC, 0x151F, 0x1609, 0x1840, 0x4956, 0x8582, 0x403E, 0x001A, +0x13B0, 0x7E28, 0x151D, 0x1608, 0x13B0, 0x4B2C, 0x2004, 0x1800, 0x43C8, +0x3204, 0x3C08, 0x0A56, 0x465E, 0x238A, 0xD65E, 0x238E, 0xB07E, 0x0080, +0x2002, 0x430C, 0x3C5C, 0x1840, 0x491E, 0x858A, 0x460F, 0x503F, 0x238E, +0x5036, 0x238A, 0x1840, 0x93C8, 0x321D, 0x200D, 0x1840, 0x491C, 0x8588, +0x1800, 0x46C8, 0x3210, 0x1800, 0x4EC8, 0x3218, 0x1800, 0x4FC8, 0x3214, +0x3C0D, 0x0ECC, 0x1800, 0x4FC8, 0x3210, 0x1840, 0x491F, 0x8588, 0x1800, +0x4FC8, 0x3218, 0x1800, 0x46C8, 0x3214, 0x1800, 0x485F, 0x3210, 0x4F6E, +0x934E, 0x3418, 0x13B0, 0x4954, 0x1800, 0x485D, 0x3210, 0x13B0, 0x47D6, +0x08C9, 0x00A9, 0x3214, 0x090F, 0x13B0, 0x4B2A, 0x240D, 0x934E, 0x3408, +0x13B0, 0x4954, 0x090D, 0x13B0, 0x4B02, 0x1800, 0x49E8, 0x3210, 0x13B0, +0x4B2C, 0x2014, 0x13B0, 0x4B1A, 0x2804, 0x4A4C, 0x13B0, 0x8510, 0x4C4B, +0x1840, 0x93C8, 0x321C, 0x2409, 0x1840, 0xB0B2, 0x0040, 0x3C0E, 0x2804, +0x4A4C, 0x13B0, 0x7D0E, 0xDC4B, 0x4B0C, 0x1656, 0x0110, 0xF07E, 0x007F, +0x1840, 0x4EC8, 0x321C, 0x4A4E, 0x0110, 0x147B, 0x0CC5, 0x4D07, 0x4E46, +0x4E48, 0x480E, 0x430F, 0x5E0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x151F, 0x160A, +0x1840, 0x4A54, 0x8582, 0x930D, 0x2402, 0x03DC, 0x2003, 0x407C, 0x0007, +0x3CB7, 0x444C, 0x13B0, 0x7BE0, 0x4C0B, 0x13B0, 0x84AE, 0x2004, 0x1840, +0x93D2, 0x3D2B, 0x2404, 0x13B0, 0x84F0, 0x427C, 0x3CA8, 0x13B0, 0x4B52, +0x151D, 0x1608, 0x1800, 0x485F, 0x3204, 0x03DF, 0x2406, 0x4B0C, 0x13B0, +0x84F0, 0x407C, 0x0003, 0x3C99, 0x1840, 0x4788, 0x320C, 0x1840, 0x4788, +0x320E, 0x1800, 0x45C8, 0x3204, 0x1840, 0x93C8, 0x321C, 0x242B, 0x08C7, +0x00A7, 0x3210, 0x464E, 0x070D, 0x13B0, 0x4B38, 0x13B0, 0x4B2C, 0x2472, +0x444E, 0x0A5E, 0x4E0F, 0x503F, 0x238A, 0x1800, 0x485D, 0x3210, 0x0FDD, +0x2009, 0x503E, 0x238E, 0x1800, 0x4EC8, 0x3210, 0x1840, 0x4A1F, 0x858A, +0x3C02, 0x13B0, 0x4B0C, 0x1800, 0x4FC8, 0x3208, 0x070F, 0x4F6E, 0x934E, +0x3402, 0x13B0, 0x4B34, 0x13B0, 0x4B2C, 0x2451, 0x444E, 0x0A5E, 0x1840, +0x93C8, 0x321D, 0x2018, 0x93CE, 0x238A, 0x3445, 0x1840, 0x4A1F, 0x8588, +0x1800, 0x4FC8, 0x3208, 0x4E0F, 0x503F, 0x238A, 0x1800, 0x4FC8, 0x3210, +0x1840, 0x4A1F, 0x858A, 0x1800, 0x4FC8, 0x3218, 0x503E, 0x238E, 0x3C13, +0x93CE, 0x238E, 0x342D, 0x1840, 0x4A1F, 0x858A, 0x1800, 0x4FC8, 0x3208, +0x4E0F, 0x503F, 0x238E, 0x13B0, 0x4B0C, 0x1800, 0x4FC8, 0x3218, 0x503E, +0x238A, 0x1800, 0x4EC8, 0x3214, 0x08C7, 0x00A7, 0x3210, 0x070F, 0x4F6E, +0x934E, 0x27FE, 0x3412, 0x13B0, 0x4B34, 0x08C7, 0x00A7, 0x3214, 0x070F, +0x13B0, 0x4B2A, 0x240C, 0x934E, 0x3407, 0x13B0, 0x4B42, 0x13B0, 0x4B02, +0x1800, 0x47E8, 0x3210, 0x13B0, 0x4B2C, 0x200C, 0x13B0, 0x4B1A, 0x2803, +0x464C, 0x13B0, 0x8510, 0x4B0C, 0x13B0, 0x84F0, 0x407C, 0x0005, 0x3C04, +0x4B0C, 0x13B0, 0x84F0, 0x426C, 0x1674, 0x0110, 0x1800, 0x485C, 0x3218, +0x0080, 0x47D6, 0x1800, 0x4FC8, 0x3210, 0x1840, 0x4A1F, 0x8588, 0x0110, +0x1800, 0x43C8, 0x3204, 0x1840, 0xB0B2, 0x0100, 0x3C0E, 0x0110, 0x4F6E, +0x1840, 0x9388, 0x320E, 0x0110, 0x13B0, 0x4B42, 0x1800, 0x485C, 0x3208, +0x0080, 0x47D6, 0xF07E, 0x007F, 0x1840, 0x4EC8, 0x321C, 0x464E, 0x070D, +0x0110, 0x480C, 0x430D, 0x403E, 0x001A, 0x430F, 0x0080, 0x7E28, 0x143B, +0x0CC8, 0x4D4D, 0x4D0A, 0x430B, 0x151B, 0x160F, 0x0E4F, 0x1840, 0x4F5C, +0x8582, 0x13B0, 0x7BF8, 0x4C09, 0x13B0, 0x4BAA, 0x151D, 0x160F, 0x1840, +0x4F1B, 0x31EC, 0x1840, 0x8F1B, 0x31EE, 0x4B88, 0x0000, 0x1840, 0x438F, +0x31EC, 0x1840, 0x438F, 0x31EE, 0x490C, 0x13B0, 0x7BF2, 0x0080, 0x47A2, +0x4A0C, 0x430D, 0x403E, 0x000C, 0x3FD3, 0x4303, 0x147B, 0x8231, 0x0CC9, +0x4338, 0x4C5E, 0x0001, 0x0087, 0x3CF8, 0x0086, 0x323A, 0x9EC6, 0x003B, +0x2003, 0x93C6, 0x003C, 0x380A, 0x4EC6, 0x003B, 0x4C5F, 0x0004, 0x4F86, +0x0030, 0x07CF, 0xD397, 0x0000, 0x3C03, 0x07CF, 0xC397, 0x0000, 0x93CC, +0x0002, 0x3803, 0xD3AF, 0x0000, 0x3C02, 0xC3AF, 0x0000, 0x0CCA, 0x03EA, +0x4AE6, 0x003C, 0x1840, 0x93C2, 0x3D12, 0x2006, 0x434C, 0x13B0, 0x80A6, +0x1840, 0x43D2, 0x3D12, 0x495E, 0x0001, 0x008B, 0x3008, 0x907E, 0x0081, +0x203A, 0xB397, 0x0000, 0x2807, 0x4914, 0x0004, 0x432C, 0x0B3F, 0x0038, +0x134F, 0x3C02, 0x4614, 0x0030, 0x9304, 0x2005, 0x09CC, 0x13B0, 0x4EE8, +0x930C, 0x2025, 0x13B0, 0x8472, 0x002F, 0x30D4, 0x9F14, 0x0008, 0x2C88, +0x002F, 0x3CF4, 0x04E4, 0x04CE, 0x04E4, 0x0EE4, 0x04EF, 0x0F3F, 0x0002, +0x03DF, 0x247D, 0x472C, 0x134F, 0x4C08, 0x930C, 0x248C, 0x9038, 0x8000, +0x248B, 0x9308, 0x3873, 0x407D, 0x0091, 0x4A6C, 0x0B0F, 0x134F, 0x930C, +0x3882, 0x480C, 0x3C7C, 0x4C08, 0x3FF0, 0x807E, 0x0051, 0x244D, 0x835E, +0x244F, 0x835E, 0x2456, 0x835E, 0x2459, 0x835E, 0x245B, 0x835E, 0x247A, +0x835E, 0x247C, 0x835E, 0x247D, 0x835E, 0x247E, 0x807E, 0x0007, 0x247E, +0x835E, 0x247F, 0x835E, 0x2468, 0x835E, 0x248D, 0x835E, 0x2496, 0x835E, +0x24B7, 0x835E, 0x24C1, 0x807E, 0x001C, 0x240D, 0x826E, 0x2412, 0x826E, +0x240E, 0x836E, 0x2417, 0x835E, 0x241C, 0x835E, 0x240F, 0x835E, 0x246D, +0x3FBE, 0x435D, 0x09CC, 0x13B0, 0x632A, 0x3FC7, 0x434D, 0x3FFA, 0x495C, +0x0006, 0x13B0, 0x6B62, 0x3FC0, 0x13B0, 0x7A94, 0x4318, 0x3FB3, 0x495C, +0x0006, 0xD07C, 0x0040, 0x13B0, 0x7B90, 0x3FB5, 0x495C, 0x0006, 0xD07C, +0x0040, 0x13B0, 0x7B68, 0x3FAE, 0x09CC, 0x13B0, 0x661E, 0x3FAA, 0x09CC, +0x13B0, 0x5A84, 0x4C08, 0x931C, 0x2396, 0x13B0, 0x804E, 0x3F98, 0x472D, +0x09CC, 0x13B0, 0x5BD2, 0x3F9C, 0x09CC, 0x13B0, 0x854C, 0x3F98, 0x13B0, +0x75E8, 0x407D, 0x0092, 0x4A6C, 0x0B0F, 0x134F, 0x480C, 0x13B0, 0x846C, +0x9038, 0x8002, 0x2009, 0x465C, 0x003C, 0x535C, 0xF07C, 0x003F, 0x2001, +0x435C, 0x13B0, 0x846C, 0x13B0, 0x84EA, 0x430C, 0x5231, 0x1674, 0x0110, +0x491C, 0x0004, 0x1380, 0x3C5C, 0x3F77, 0x09CC, 0x13B0, 0x63EC, 0x3F73, +0x13B0, 0x7442, 0x3FDA, 0x1380, 0x3C48, 0x3F6D, 0x1380, 0x3C4C, 0x3F6A, +0x1380, 0x3C54, 0x3F67, 0x13B0, 0x8472, 0x491C, 0x0006, 0x1380, 0x3C58, +0x3F60, 0x13B0, 0x8472, 0x9389, 0x0006, 0x2403, 0x13B0, 0x84B6, 0x3FC2, +0x13B0, 0x8486, 0x3FBF, 0x13B0, 0x8472, 0x002F, 0x3C6C, 0x03DF, 0x27B9, +0x491C, 0x0006, 0x1380, 0x3C6C, 0x3F4A, 0x4381, 0x0004, 0x4381, 0x0006, +0x4381, 0x0000, 0x4381, 0x0002, 0x002F, 0x3C74, 0x03DF, 0x2407, 0x410D, +0x530D, 0x410C, 0x522C, 0x1380, 0x3C74, 0x4C08, 0x13B0, 0x8472, 0x411C, +0x0004, 0x411D, 0x0006, 0x13B0, 0x8468, 0x412C, 0x411D, 0x0002, 0x13B0, +0x8468, 0x13B0, 0x84EA, 0x3F19, 0x13B0, 0x8472, 0x002F, 0x3C70, 0x03DF, +0x2404, 0x491C, 0x0006, 0x1380, 0x3C70, 0x4308, 0x3F12, 0x13B0, 0x8472, +0x0BC7, 0x00A7, 0x0010, 0x13B0, 0x83A4, 0x903C, 0xBEEF, 0x2023, 0x903D, +0xBEEF, 0x2020, 0x13B0, 0x81A2, 0x934C, 0x241C, 0x13B0, 0x8318, 0x903C, +0xF00D, 0x2017, 0x903D, 0xF00D, 0x2014, 0x13B0, 0x8190, 0x934C, 0x2410, +0x0088, 0x30D4, 0x080F, 0x4F1C, 0x0012, 0x070F, 0x134F, 0x080F, 0x4F1C, +0x0014, 0x070F, 0x134F, 0x080F, 0x4F1C, 0x0016, 0x3C07, 0x430C, 0x070F, +0x134F, 0x430C, 0x070F, 0x134F, 0x430C, 0x070F, 0x134F, 0x1380, 0x3C64, +0x070F, 0x134F, 0x1380, 0x309C, 0x070F, 0x134F, 0x13B0, 0x84EA, 0x3FBD, +0x4303, 0x140A, 0x8221, 0x430A, 0x93CC, 0x0006, 0x20CA, 0x407D, 0x0093, +0x4C5C, 0x0002, 0x1380, 0x3008, 0x930C, 0x38BF, 0x13B0, 0x84DE, 0x430D, +0x4C81, 0x0000, 0x4D81, 0x0002, 0x13B0, 0x849E, 0x412E, 0x411F, 0x0002, +0x4E0F, 0x430E, 0x430D, 0x5C0E, 0x6D0F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x13B0, 0x83A4, 0x903C, 0xBEEF, 0x2020, 0x903D, 0xBEEF, 0x201D, 0x13B0, +0x81A2, 0x934C, 0x2419, 0x13B0, 0x8318, 0x903C, 0xF00D, 0x2014, 0x903D, +0xF00D, 0x2011, 0x13B0, 0x8190, 0x934C, 0x240D, 0x002F, 0x30D4, 0x4F1C, +0x0004, 0x1380, 0x3018, 0x002F, 0x30D4, 0x4F1C, 0x0006, 0x1380, 0x3018, +0x3C08, 0x13B0, 0x849E, 0x1380, 0x3018, 0x13B0, 0x849E, 0x1380, 0x3018, +0x13B0, 0x84D6, 0x1380, 0x3018, 0x13B0, 0x848E, 0x1380, 0x3018, 0x422D, +0x410C, 0x530C, 0x1380, 0x3014, 0x002F, 0x30D4, 0x4F1C, 0x000E, 0x1380, +0x3018, 0x13B0, 0x82EE, 0x903C, 0xABBA, 0x200C, 0x903D, 0xABBA, 0x2009, +0x13B0, 0x8220, 0x934C, 0x2405, 0x1380, 0x3C4C, 0x1380, 0x3018, 0x3C03, +0x433C, 0x1380, 0x3018, 0x13B0, 0x82EE, 0x903C, 0xABBA, 0x2011, 0x903D, +0xABBA, 0x200E, 0x13B0, 0x8220, 0x934C, 0x240A, 0x13B0, 0x849E, 0x903C, +0xAAAB, 0x2405, 0x1380, 0x3C48, 0x1380, 0x3018, 0x3C03, 0x433C, 0x1380, +0x3018, 0x13B0, 0x8326, 0x903C, 0xACDC, 0x200C, 0x903D, 0xACDC, 0x2009, +0x13B0, 0x820E, 0x934C, 0x2405, 0x1380, 0x3068, 0x1380, 0x3018, 0x3C03, +0x433C, 0x1380, 0x3018, 0x13B0, 0x7CEA, 0x1380, 0x3018, 0x13B0, 0x7910, +0x1380, 0x3018, 0x13B0, 0x7CC6, 0x1380, 0x3018, 0x13B0, 0x7B14, 0x1380, +0x3018, 0x13B0, 0x7D32, 0x1380, 0x3018, 0x002F, 0x30D4, 0x4F1C, 0x0010, +0x1380, 0x3018, 0x422C, 0x1380, 0x3018, 0x403C, 0x0102, 0x1380, 0x3018, +0x430C, 0x430D, 0x1380, 0x301C, 0x13B0, 0x8148, 0x431A, 0x3C59, 0x403A, +0xFFFD, 0x3C56, 0x93DC, 0x0006, 0x201B, 0x002F, 0x30D4, 0x938F, 0x0008, +0x2413, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1380, 0x3008, 0x930C, 0x3808, +0x002F, 0x30D4, 0x4F1C, 0x0008, 0x1380, 0x3018, 0x431A, 0x3C3E, 0x403A, +0xFFFC, 0x3C3B, 0x403A, 0xFFFE, 0x3C38, 0x93EC, 0x0006, 0x2023, 0x407D, +0x0093, 0x4C5C, 0x0002, 0x1380, 0x3008, 0x930C, 0x3818, 0x430A, 0x3C0F, +0x4A0C, 0x1380, 0x3018, 0x002F, 0x3CF4, 0x4A0E, 0x0EEE, 0x0ECD, 0x0EEE, +0x0DEE, 0x0FEE, 0x4E2C, 0x1380, 0x3018, 0x531A, 0x002F, 0x30D4, 0x9F1A, +0x0008, 0x2BEC, 0x431A, 0x3C15, 0x403A, 0xFFFB, 0x3C12, 0x90FC, 0x0003, +0x0006, 0x200E, 0x407D, 0x0091, 0x4C5C, 0x0002, 0x1380, 0x3008, 0x930C, +0x3804, 0x1380, 0x300C, 0x403A, 0xFFFA, 0x13B0, 0x82C2, 0x931A, 0x2004, +0x403A, 0x8000, 0x1380, 0x300C, 0x4A0C, 0x5221, 0x160A, 0x0110, 0x147B, +0x434A, 0x4308, 0x13B0, 0x82D2, 0x434C, 0x13B0, 0x6ADC, 0x4C4B, 0x934C, +0x2511, 0x434E, 0x4C4D, 0x008C, 0x30D8, 0x13B0, 0x4962, 0x0089, 0x323A, +0x09C6, 0x00A6, 0x003A, 0x0087, 0x327C, 0x4A4F, 0x1840, 0x4F5E, 0x30D8, +0x1840, 0x4EC2, 0x3D13, 0x466F, 0x1840, 0xB3DF, 0x3277, 0x2807, 0x403C, +0x8009, 0x13B0, 0x7E06, 0x4038, 0x8009, 0x3CEE, 0x466F, 0x0FEF, 0x1840, +0x938F, 0x325A, 0x200F, 0x1840, 0x40B2, 0x0032, 0x3394, 0x4389, 0x0034, +0x1840, 0xB35E, 0x2C01, 0x531E, 0x466F, 0x0FEF, 0x1840, 0x4E8F, 0x3262, +0x466F, 0x0FEF, 0x1840, 0x90BF, 0x0104, 0x3262, 0x2C7C, 0x466F, 0x0FEF, +0x1840, 0x4F1D, 0x3262, 0x535D, 0x466F, 0x0FEF, 0x1840, 0x4F1E, 0x325A, +0x8E4D, 0x9D4B, 0x2C01, 0x4B4D, 0x4D4E, 0x035E, 0x466F, 0x064F, 0x1800, +0x4F54, 0x323A, 0x466F, 0x0FEF, 0x1840, 0x4F1F, 0x325A, 0x0FE4, 0x4A4F, +0x00AF, 0x30D8, 0x934E, 0x2406, 0x4E45, 0x4FB4, 0x0000, 0x03E4, 0x5375, +0x23FB, 0x5E4E, 0x9D4E, 0x2C17, 0x4A4C, 0x5E0C, 0xE03C, 0x8000, 0x0FAC, +0xB0D8, 0x466F, 0x064F, 0x1800, 0x4F54, 0x323A, 0x4665, 0x05E5, 0x4E4F, +0x1840, 0x551F, 0x325A, 0x0FE4, 0x4CF4, 0x0000, 0x535E, 0x9D4E, 0x2BEF, +0x466F, 0x0FEF, 0x1840, 0x5D8F, 0x325A, 0x5D4A, 0x8D4B, 0x466E, 0x0EEE, +0x466F, 0x0FEF, 0x1840, 0x9F9E, 0x325A, 0x3262, 0x2C81, 0x1840, 0x4382, +0x3394, 0x13B0, 0x8414, 0x90FF, 0x0091, 0x0001, 0x202D, 0xB3E7, 0x0006, +0x286E, 0x073F, 0x010C, 0x4F5E, 0x0002, 0xF07E, 0x003F, 0x13B0, 0x8414, +0x9F5E, 0x0002, 0x2063, 0x073F, 0x010C, 0x93CF, 0x0003, 0x2005, 0x13B0, +0x8414, 0x92EF, 0x0000, 0x2811, 0x13B0, 0x8262, 0x2056, 0xF0F7, 0x00F8, +0x0006, 0x1840, 0x4382, 0x3398, 0x3C4F, 0x403C, 0x800A, 0x13B0, 0x7E06, +0x4038, 0x800A, 0x3C4F, 0xF0F7, 0x00F8, 0x0006, 0x3C44, 0x13B0, 0x8414, +0x90FF, 0x0092, 0x0001, 0x466F, 0x2024, 0x13B0, 0x845E, 0x200C, 0x435C, +0x13B0, 0x80A6, 0x434C, 0x13B0, 0x8064, 0x1840, 0x43C2, 0x3D12, 0x4038, +0x0092, 0x3C2E, 0x475E, 0x0006, 0xF07E, 0x0003, 0x907E, 0x0003, 0x2027, +0x073E, 0x010C, 0x13B0, 0x8414, 0x9FDE, 0x0002, 0x0002, 0x201F, 0x13B0, +0x8262, 0x201C, 0xC3E7, 0x0006, 0x3C19, 0x13B0, 0x845E, 0x200B, 0x13B0, +0x8414, 0x90FF, 0x008B, 0x0001, 0x2005, 0x13B0, 0x7700, 0x4038, 0x008B, +0x3C12, 0x466F, 0x1840, 0xD3DF, 0x3277, 0x53D9, 0x003A, 0x92E9, 0x003A, +0x2802, 0x43C9, 0x003A, 0x466F, 0x0FEF, 0x1840, 0x438F, 0x325A, 0x4389, +0x0034, 0x4303, 0x934B, 0x22FC, 0x13B0, 0x83B2, 0x480C, 0x1674, 0x0110, +0x140A, 0x430E, 0x430E, 0x3C01, 0x532E, 0x932E, 0x2C1D, 0x4E0F, 0x064F, +0x1840, 0x9F1D, 0x86E6, 0x2BF7, 0x2004, 0x1840, 0x9F1C, 0x86E4, 0x2BF2, +0x4E0F, 0x531F, 0x064F, 0x1840, 0x9D8F, 0x86E6, 0x2BEB, 0x2004, 0x1840, +0x9C8F, 0x86E4, 0x2BE6, 0x1840, 0x425C, 0x887A, 0x4C4C, 0x430D, 0x3CF0, +0x430E, 0x3C01, 0x532E, 0x932E, 0x2C1D, 0x4E0F, 0x064F, 0x1840, 0x9F1D, +0x86DE, 0x2BF7, 0x2004, 0x1840, 0x9F1C, 0x86DC, 0x2BF2, 0x4E0F, 0x531F, +0x064F, 0x1840, 0x9D8F, 0x86DE, 0x2BEB, 0x2004, 0x1840, 0x9C8F, 0x86DC, +0x2BE6, 0x1840, 0x425C, 0x887B, 0x4C4C, 0x430D, 0x3CCE, 0x430E, 0x3C01, +0x532E, 0x922E, 0x2C1D, 0x4E0F, 0x064F, 0x1840, 0x9F1D, 0x86F6, 0x2BF7, +0x2004, 0x1840, 0x9F1C, 0x86F4, 0x2BF2, 0x4E0F, 0x531F, 0x064F, 0x1840, +0x9D8F, 0x86F6, 0x2BEB, 0x2004, 0x1840, 0x9C8F, 0x86F4, 0x2BE6, 0x1840, +0x425C, 0x887C, 0x4C4C, 0x430D, 0x3CAC, 0x430E, 0x3C01, 0x532E, 0x932E, +0x2C1D, 0x4E0F, 0x064F, 0x1840, 0x9F1D, 0x8706, 0x2BF7, 0x2004, 0x1840, +0x9F1C, 0x8704, 0x2BF2, 0x4E0F, 0x531F, 0x064F, 0x1840, 0x9D8F, 0x8706, +0x2BEB, 0x2004, 0x1840, 0x9C8F, 0x8704, 0x2BE6, 0x1840, 0x425C, 0x887D, +0x4C4C, 0x430D, 0x3C8A, 0x430E, 0x3C01, 0x532E, 0x932E, 0x2C1D, 0x4E0F, +0x064F, 0x1840, 0x9F1D, 0x870E, 0x2BF7, 0x2004, 0x1840, 0x9F1C, 0x870C, +0x2BF2, 0x4E0F, 0x531F, 0x064F, 0x1840, 0x9D8F, 0x870E, 0x2BEB, 0x2004, +0x1840, 0x9C8F, 0x870C, 0x2BE6, 0x1840, 0x425C, 0x887F, 0x4C4C, 0x430D, +0x3C68, 0x430E, 0x3C01, 0x532E, 0x932E, 0x2C1D, 0x4E0F, 0x064F, 0x1840, +0x9F1D, 0x86EE, 0x2BF7, 0x2004, 0x1840, 0x9F1C, 0x86EC, 0x2BF2, 0x4E0F, +0x531F, 0x064F, 0x1840, 0x9D8F, 0x86EE, 0x2BEB, 0x2004, 0x1840, 0x9C8F, +0x86EC, 0x2BE6, 0x1840, 0x425C, 0x887E, 0x4C4C, 0x430D, 0x3C46, 0x430E, +0x3C01, 0x532E, 0x932E, 0x2C1D, 0x4E0F, 0x064F, 0x1840, 0x9F1D, 0x8716, +0x2BF7, 0x2004, 0x1840, 0x9F1C, 0x8714, 0x2BF2, 0x4E0F, 0x531F, 0x064F, +0x1840, 0x9D8F, 0x8716, 0x2BEB, 0x2004, 0x1840, 0x9C8F, 0x8714, 0x2BE6, +0x1840, 0x425C, 0x8881, 0x4C4C, 0x430D, 0x3C24, 0x430E, 0x3C01, 0x532E, +0x932E, 0x2C1D, 0x4E0F, 0x064F, 0x1840, 0x9F1D, 0x86D6, 0x2BF7, 0x2004, +0x1840, 0x9F1C, 0x86D4, 0x2BF2, 0x4E0F, 0x531F, 0x064F, 0x1840, 0x9D8F, +0x86D6, 0x2BEB, 0x2004, 0x1840, 0x9C8F, 0x86D4, 0x2BE6, 0x1840, 0x425C, +0x8880, 0x4C4C, 0x430D, 0x3C02, 0x430C, 0x430D, 0x160A, 0x0110, 0x13B0, +0x6E54, 0xF0F2, 0x009F, 0x093E, 0x40F2, 0x00C4, 0x093D, 0x3C3E, 0x4303, +0x1840, 0x43D2, 0x3D2A, 0x13B0, 0x5668, 0xD0F2, 0x0010, 0x093C, 0xC0F2, +0x0040, 0x093E, 0xC0B2, 0x0100, 0x0910, 0x40F2, 0x0020, 0x093D, 0x13B0, +0x564E, 0x434C, 0x0110, 0x434C, 0xB2B2, 0x0908, 0x2801, 0x435C, 0x13B0, +0x5624, 0x2002, 0xD07C, 0x0020, 0xB3A2, 0x0902, 0x2802, 0xD07C, 0x0040, +0x1840, 0x93D2, 0x3D2A, 0x2002, 0xD27C, 0x0110, 0xD07C, 0x0010, 0x0110, +0x1840, 0x93D2, 0x3D2B, 0x0110, 0x13B0, 0x5668, 0xC3A2, 0x0902, 0xC0B2, +0x0400, 0x0908, 0x13B0, 0x564E, 0x1840, 0x43C2, 0x3D2B, 0x1840, 0x43C2, +0x3D2A, 0x434C, 0x0110, 0x40B2, 0x9600, 0x0900, 0x0110, 0x13B0, 0x5668, +0xD3A2, 0x0902, 0xD0B2, 0x0400, 0x0908, 0x3FC3, 0x4303, 0x40B2, 0x9628, +0x0900, 0x0110, 0x141B, 0x13B0, 0x5668, 0x1840, 0x43C2, 0x3D2B, 0x1840, +0x43C2, 0x3D2A, 0x1840, 0x43C2, 0x3D2C, 0x1840, 0x43C2, 0x3D16, 0x1840, +0x43C2, 0x3D17, 0x43C2, 0x093C, 0x1840, 0x43B2, 0x3C02, 0x1840, 0x43B2, +0x3C04, 0x1840, 0x43C2, 0x3D29, 0x43C2, 0x093F, 0x407F, 0x0080, 0x4FC2, +0x0921, 0x4FC2, 0x0923, 0x40F2, 0x008C, 0x0920, 0x40F2, 0x008C, 0x0922, +0x40F2, 0x0015, 0x092F, 0x40F2, 0x001F, 0x092E, 0x008D, 0x8584, 0x407A, +0x0040, 0x403B, 0xE400, 0x4D5C, 0xFFFE, 0x0A5C, 0x40FC, 0x0094, 0x23C8, +0x4B0E, 0x5D1E, 0x0008, 0x0B5E, 0x4ECC, 0x23C9, 0x4B0E, 0x5D1E, 0x000A, +0x0B5E, 0x4ECC, 0x23CD, 0x4FCC, 0x23CA, 0x4FCC, 0x23CE, 0x4ACC, 0x23CF, +0x40FC, 0x0094, 0x2388, 0x4B0E, 0x5D1E, 0x0004, 0x0B5E, 0x4ECC, 0x2389, +0x4B0E, 0x5D1E, 0x0006, 0x0B5E, 0x4ECC, 0x238D, 0x43CC, 0x238A, 0x43CC, +0x238E, 0x4ACC, 0x238F, 0x93ED, 0xFFFF, 0x2014, 0x40FC, 0x0094, 0x23C0, +0x4B0E, 0x5D2E, 0x0B5E, 0x4ECC, 0x23C1, 0x4B0E, 0x5D1E, 0x0002, 0x0B5E, +0x4ECC, 0x23C5, 0x4FCC, 0x23C2, 0x4FCC, 0x23C6, 0x4ACC, 0x23C7, 0x00AD, +0x0010, 0x009D, 0x85A4, 0x23B7, 0x13B0, 0x7678, 0x4AC2, 0x093C, 0x43C2, +0x093E, 0x40F2, 0x00C4, 0x093D, 0x13B0, 0x564E, 0x434C, 0x161A, 0x0110, +0x1840, 0x4C82, 0x3C0E, 0x434C, 0x0110, 0x13B0, 0x5668, 0x4382, 0x0902, +0xC0B2, 0x0100, 0x0910, 0x3F4A, 0x4303, 0x145B, 0x8031, 0x0006, 0x410C, +0x530C, 0x008E, 0x8873, 0x008D, 0x0006, 0x13B0, 0x7F92, 0x13B0, 0x804E, +0x13B0, 0x8148, 0x13B0, 0x8318, 0x903C, 0xF00D, 0x200B, 0x903D, 0xF00D, +0x2008, 0x13B0, 0x8496, 0x933C, 0x2404, 0x13B0, 0x8190, 0x934C, 0x201F, +0x008A, 0x3C68, 0x1800, 0x40FA, 0x850C, 0x0000, 0x1800, 0x40FA, 0x8508, +0x0004, 0x1800, 0x40FA, 0x851C, 0x000C, 0x1800, 0x40FA, 0x8578, 0x0058, +0x1800, 0x40FA, 0x857A, 0x0008, 0x1800, 0x40FA, 0x8534, 0x0054, 0x1800, +0x40FA, 0x857A, 0x006C, 0x3C1E, 0x13B0, 0x8496, 0x134C, 0x1800, 0x40F2, +0x18A0, 0x3CD8, 0x008A, 0x3C68, 0x0ACC, 0x13B0, 0x18A0, 0x13B0, 0x8342, +0x933C, 0x2002, 0x930D, 0x240C, 0x13B0, 0x83A4, 0x903C, 0xBEEF, 0x2007, +0x903D, 0xBEEF, 0x2004, 0x13B0, 0x81A2, 0x934C, 0x2002, 0x433C, 0x3C58, +0x13B0, 0x849E, 0x0A3F, 0x006C, 0x134F, 0x13B0, 0x8342, 0x4C08, 0x4D09, +0x13B0, 0x8220, 0x4C46, 0x13B0, 0x8190, 0x4C4D, 0x008B, 0x30D4, 0x1246, +0x430E, 0x430F, 0x008C, 0x3008, 0x1519, 0x1608, 0x1348, 0x0C7B, 0x0000, +0x0088, 0x3CF4, 0x0B0F, 0x1800, 0x4FD8, 0x000A, 0x0000, 0x0ACC, 0x13B0, +0x856E, 0x0ACC, 0x1380, 0x307C, 0x080E, 0x5321, 0x03DE, 0x242B, 0x13B0, +0x816C, 0x0EEF, 0x40BF, 0xFFFE, 0x0000, 0x080E, 0x13B0, 0x816C, 0x0FEE, +0x1800, 0x40FE, 0x6BE8, 0x0002, 0x434E, 0x3C01, 0x535E, 0x0B0F, 0x9F1E, +0x0008, 0x2C16, 0x080F, 0x4E4D, 0x0DED, 0x0DCA, 0x0DED, 0x0AED, 0x0FED, +0x4D2F, 0x933F, 0x27F1, 0x903F, 0xFF00, 0x2BEE, 0x4EC1, 0x0004, 0x43C1, +0x0005, 0x434D, 0x410C, 0x530C, 0x13B0, 0x632A, 0x430C, 0x5031, 0x0006, +0x1656, 0x0110, 0x143B, 0x008A, 0x327C, 0x4A6F, 0x1840, 0xB3DF, 0x3282, +0x2CA9, 0x4A6F, 0x13B0, 0x8288, 0x008D, 0x3D15, 0x4D6E, 0x90FF, 0x0093, +0x0001, 0x4A6F, 0x2406, 0x13B0, 0x8288, 0xC0FF, 0x0080, 0x0002, 0x3C11, +0x13B0, 0x8288, 0x93CF, 0x0002, 0x3802, 0x934E, 0x240A, 0x937E, 0x2402, +0x535E, 0x3C01, 0x435E, 0x4A6F, 0x13B0, 0x8288, 0x4ECF, 0x0003, 0x4ECD, +0x0000, 0x4A6F, 0x0FEF, 0x1840, 0x4F1E, 0x3284, 0x4A6F, 0x13B0, 0x8288, +0x4ECF, 0x0000, 0x4A6F, 0x13B0, 0x8288, 0xB3DF, 0x0000, 0x2C11, 0x4A6F, +0x064F, 0x1800, 0x4F5E, 0x3388, 0x4A6C, 0x0CEC, 0x431F, 0x1840, 0x5C1F, +0x3284, 0x1840, 0x4F8C, 0x3284, 0x0FEE, 0x43CE, 0x0000, 0x430C, 0x430F, +0x3C0D, 0x4F0B, 0x0BEB, 0x4A6E, 0x0EEE, 0x0EC8, 0x1806, 0x5E4E, 0x08EE, +0x0EEB, 0x1840, 0xEB1C, 0x3286, 0x531F, 0x4A6E, 0x0EEE, 0x431B, 0x1840, +0x5E1B, 0x3284, 0x035B, 0x9B0F, 0x2BEA, 0xE33C, 0x4A6F, 0x0FEF, 0x1840, +0x4F1E, 0x3284, 0x035E, 0x531E, 0x0EEE, 0x4A6F, 0x0FEF, 0x0FCB, 0x1806, +0x5F4F, 0x0BEF, 0x0FEE, 0x1840, 0x4C8E, 0x3286, 0x4A6F, 0x1840, 0xD3DF, +0x3282, 0x4A6F, 0x1840, 0xC2FF, 0x3282, 0x4A6F, 0x13B0, 0x8288, 0x93CF, +0x0002, 0x3802, 0x43CD, 0x0000, 0x4A6F, 0x13B0, 0x8288, 0xB0FF, 0x0040, +0x0002, 0x4A6F, 0x2C0B, 0x13B0, 0x8288, 0x90FF, 0x0093, 0x0001, 0x2008, +0x4A6F, 0x1840, 0xD3EF, 0x3282, 0x3C03, 0x1840, 0xC3EF, 0x3282, 0x4A6F, +0x0FEF, 0x403C, 0x0003, 0x1840, 0x5F1C, 0x3284, 0x13B0, 0x7D56, 0x53DA, +0x0000, 0x93CA, 0x0000, 0x2402, 0x43CA, 0x0000, 0x13B0, 0x83FC, 0x430C, +0x1638, 0x0110, 0x147B, 0x4C16, 0x0004, 0x4C17, 0x0006, 0xF336, 0xF037, +0x000F, 0x4C1E, 0x0008, 0x4C1F, 0x000A, 0xF33E, 0xF03F, 0x000F, 0x4604, +0x4705, 0x5E04, 0x6F05, 0x5034, 0xFFFE, 0x6335, 0x4308, 0x4309, 0x460C, +0x470D, 0x13B0, 0x538A, 0x120A, 0x4CC1, 0x0000, 0x413A, 0x1840, 0x925A, +0x8879, 0x2002, 0x433C, 0x3C7F, 0x1840, 0x925A, 0x887C, 0x2404, 0x1840, +0x925A, 0x887B, 0x2008, 0x1840, 0x4218, 0x871C, 0x4309, 0x002C, 0x86E0, +0x13B0, 0x6922, 0x1840, 0x925A, 0x887D, 0x2404, 0x1840, 0x925A, 0x887A, +0x2008, 0x1840, 0x4218, 0x871C, 0x4309, 0x002C, 0x86E4, 0x13B0, 0x6922, +0x1840, 0x925A, 0x887E, 0x2404, 0x1840, 0x925A, 0x887F, 0x2008, 0x1840, +0x4218, 0x871C, 0x4309, 0x002C, 0x86EC, 0x13B0, 0x6922, 0x1840, 0x925A, +0x8881, 0x2404, 0x1840, 0x925A, 0x8880, 0x200A, 0x1840, 0x4218, 0x871C, +0x4309, 0x13B0, 0x8038, 0x002C, 0x86D4, 0x13B0, 0x6922, 0x460A, 0x470B, +0x3C13, 0x4A0C, 0x4B0D, 0x13B0, 0x538A, 0x1840, 0x425E, 0x8879, 0x4E4E, +0x430F, 0x9E0C, 0x2002, 0x9F0D, 0x2404, 0x151B, 0x160C, 0x13B0, 0x6922, +0x580A, 0x690B, 0x950B, 0x2BEB, 0x2002, 0x940A, 0x2BE8, 0x460A, 0x470B, +0x3C17, 0x4A0C, 0x4B0D, 0x13B0, 0x538A, 0x1840, 0x425E, 0x8879, 0x4E4E, +0x430F, 0x9E0C, 0x2002, 0x9F0D, 0x2408, 0x480E, 0x490F, 0x531E, 0x630F, +0x151B, 0x160C, 0x13B0, 0x68FC, 0x580A, 0x690B, 0x950B, 0x2BE7, 0x2002, +0x940A, 0x2BE4, 0x13B0, 0x7FAA, 0x431C, 0x1674, 0x0110, 0x141B, 0x434A, +0x434B, 0xB31D, 0x2854, 0x4C1E, 0x0004, 0x4C1F, 0x0006, 0xF33E, 0xF03F, +0x000F, 0x1840, 0x4E82, 0x3CFE, 0x1840, 0x4F82, 0x3D00, 0x4C1E, 0x0008, +0x4C1F, 0x000A, 0xF33E, 0xF03F, 0x000F, 0x1840, 0x521E, 0x3CFE, 0x1840, +0x621F, 0x3D00, 0x1840, 0x4E82, 0x3D02, 0x1840, 0x4F82, 0x3D04, 0x0CCA, +0x00AA, 0x000C, 0x4C6C, 0x4C4C, 0x503C, 0xFFF5, 0x4C0D, 0xE33D, 0x5D0D, +0x7D0D, 0x035D, 0x100C, 0x432E, 0x430F, 0x13B0, 0x7E28, 0x151D, 0x160F, +0x0ACB, 0x0FEB, 0x1840, 0x421C, 0x3CFE, 0x1840, 0x421D, 0x3D00, 0x13B0, +0x538A, 0x1840, 0x925C, 0x8879, 0x2002, 0x433C, 0x3C58, 0x1840, 0x43A2, +0x3D06, 0x1840, 0x4382, 0x3D08, 0x1840, 0x4292, 0x3CFE, 0x3CFA, 0x1840, +0x4292, 0x3D00, 0x3CFC, 0x13B0, 0x8038, 0x3C39, 0x0CCA, 0x00AA, 0x0004, +0x4C6C, 0x4C4C, 0x503C, 0xFFFD, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, 0x035D, +0x100C, 0x432E, 0x430F, 0x13B0, 0x7E28, 0x151D, 0x160F, 0x0ACB, 0x0FEB, +0x13B0, 0x7FAA, 0x3C21, 0x1840, 0x421C, 0x3CFA, 0x1840, 0x421D, 0x3CFC, +0x13B0, 0x538A, 0x1840, 0x425E, 0x8879, 0x4E4E, 0x430F, 0x9E0C, 0x2002, +0x9F0D, 0x2408, 0x431E, 0x430F, 0x002D, 0x3CFA, 0x0ACC, 0x13B0, 0x68BE, +0x03EA, 0x1840, 0x5292, 0x3D06, 0x3CFA, 0x1840, 0x6292, 0x3D08, 0x3CFC, +0x1840, 0x9292, 0x3D04, 0x3CFC, 0x2806, 0x2007, 0x1840, 0x9292, 0x3D02, +0x3CFA, 0x2C02, 0x0BDA, 0x2BD2, 0x430C, 0x161A, 0x0110, 0x147B, 0x8031, +0x0032, 0x434A, 0x13B0, 0x83B2, 0x13B0, 0x8292, 0x930C, 0x241A, 0x410C, +0x503C, 0x0014, 0x13B0, 0x7AC0, 0x410C, 0x503C, 0x000A, 0x13B0, 0x7AC0, +0x410C, 0x530C, 0x13B0, 0x7AC0, 0x013E, 0x0016, 0x411D, 0x000A, 0x415C, +0x0006, 0x13B0, 0x7632, 0x13B0, 0x7FC2, 0x13B0, 0x83B2, 0x008B, 0x30B2, +0x4106, 0x5036, 0x001E, 0x0089, 0x3008, 0x0BC8, 0x00A8, 0x0001, 0x93C8, +0x0002, 0x243C, 0x4B1F, 0xFFFA, 0x0027, 0x30D4, 0x971F, 0x0008, 0x2C35, +0x0027, 0x3CF4, 0x0FEF, 0x0FCE, 0x0FEF, 0x0EEF, 0x0FE7, 0x0737, 0x0002, +0x03D7, 0x242A, 0x485D, 0x0001, 0x486C, 0x090F, 0x134F, 0x930C, 0x3823, +0x0BCF, 0x0FAF, 0xFFFA, 0x0F3C, 0x0002, 0x1406, 0x430F, 0x435E, 0x4C6D, +0x503D, 0xFFFD, 0x00AC, 0x0006, 0x0934, 0x001C, 0x1344, 0x403C, 0x0003, +0x1347, 0x5221, 0x931C, 0x2009, 0x093F, 0x0004, 0x134F, 0xB3DB, 0x0000, +0x2803, 0x486C, 0x13B0, 0x6B62, 0x06CC, 0x093F, 0x0020, 0x134F, 0x00AB, +0x000A, 0x009B, 0x30DA, 0x23B9, 0x4A0B, 0x1840, 0xB3DB, 0x3277, 0x281A, +0x403D, 0x0014, 0x434C, 0x13B0, 0x7EA6, 0x4A4D, 0x008C, 0x323A, 0x1380, +0x3020, 0x1840, 0x4AC2, 0x3D2D, 0x064B, 0x1800, 0x4B5C, 0x323A, 0x13B0, +0x4BB6, 0x1840, 0x425A, 0x3D2D, 0x1840, 0xC3DA, 0x3277, 0x3C05, 0x535A, +0x926A, 0x2C02, 0x934A, 0x23DC, 0x5031, 0x0032, 0x1674, 0x0110, 0x425F, +0x2384, 0xF07F, 0x000F, 0x2009, 0x93C2, 0x2384, 0x3403, 0x425E, 0x0920, +0x3C10, 0x425E, 0x0922, 0x3C0D, 0x537F, 0x907F, 0x0007, 0x2C0D, 0x0A5F, +0x93C2, 0x2384, 0x3403, 0x4F5E, 0x23C8, 0x3C02, 0x4F5E, 0x2388, 0xF27E, +0x1840, 0x4EC2, 0x3D19, 0x1840, 0x425E, 0x3D19, 0x1942, 0x104E, 0x1840, +0x4EC2, 0x3D19, 0x13B0, 0x5F32, 0x3C46, 0x4303, 0x3C3C, 0x4303, 0x008C, +0x3D19, 0x1840, 0xB0F2, 0x0040, 0x8737, 0x2802, 0x43DC, 0x0000, 0x1840, +0x93D2, 0x3D2C, 0x2002, 0xD3EC, 0x0000, 0x13B0, 0x84E4, 0x1840, 0x43A2, +0x3C02, 0x3C2E, 0x4303, 0x3C24, 0x4303, 0x13B0, 0x84E4, 0x425E, 0x2382, +0x907E, 0x0003, 0x2009, 0x1840, 0x425F, 0x3EBE, 0x1840, 0x4F82, 0x3C02, +0x008C, 0x3EBE, 0x3C11, 0x430C, 0x934E, 0x2406, 0x1840, 0x4C5F, 0x87BD, +0x5F0C, 0x537E, 0x23FA, 0x1840, 0x4C5F, 0x87BD, 0x1840, 0x4F82, 0x3C02, +0x00AC, 0x87BD, 0x3C09, 0x4303, 0x13B0, 0x5F32, 0x43CC, 0x0000, 0x1840, +0x42DC, 0x3D17, 0x0001, 0x13B0, 0x7C7C, 0x434C, 0x0110, 0x13B0, 0x84E4, +0x1840, 0x43A2, 0x3C02, 0x008C, 0x3D19, 0x0110, 0x13B0, 0x84E4, 0x1840, +0x40B2, 0x008D, 0x3C02, 0x008C, 0x8730, 0x3FEB, 0x4303, 0x13B0, 0x84E4, +0x1840, 0x40B2, 0x0012, 0x3C02, 0x008C, 0x871E, 0x3FE1, 0x4303, 0x13B0, +0x84E4, 0x1840, 0x4392, 0x3C02, 0x008C, 0x3D16, 0x3FD8, 0x4303, 0x145B, +0x4C4A, 0x4346, 0x13B0, 0x81FC, 0x151F, 0x1609, 0x1840, 0x4958, 0x8582, +0x403E, 0x000C, 0x13B0, 0x7E28, 0x151D, 0x160B, 0x1840, 0x938B, 0x31EE, +0x202F, 0x1840, 0x93CB, 0x31F5, 0x2029, 0x1840, 0x43DB, 0x31F5, 0x1840, +0x90FB, 0x0040, 0x31F6, 0x2016, 0x0A58, 0x1840, 0x93CB, 0x31F4, 0x2009, +0x93C8, 0x23CA, 0x340E, 0x43C8, 0x23CA, 0x1840, 0x43DB, 0x31F4, 0x3C08, +0x93C8, 0x23CE, 0x3405, 0x43C8, 0x23CE, 0x1840, 0x43CB, 0x31F4, 0x1840, +0x438B, 0x31EC, 0x1840, 0x93C2, 0x3C0E, 0x3404, 0x4A4C, 0x13B0, 0x8518, +0x4C46, 0x460C, 0x3C4D, 0x1840, 0x43CB, 0x31F5, 0x0A58, 0x480F, 0x503F, +0x23CE, 0x5038, 0x23CA, 0x4806, 0x1840, 0x93CB, 0x31F4, 0x2008, 0x1840, +0x491C, 0x858C, 0x1840, 0x4919, 0x858E, 0x0FC6, 0x3C07, 0x1840, 0x491C, +0x858E, 0x0FC8, 0x1840, 0x4919, 0x858C, 0x1840, 0x4B1A, 0x31EE, 0x903A, +0x0041, 0x2802, 0x407A, 0x0040, 0x93C8, 0x0000, 0x3424, 0x4A4E, 0x430F, +0x1800, 0x4B5D, 0x31F0, 0x1380, 0x3BD8, 0x4AC8, 0x0000, 0x13B0, 0x7C30, +0x1840, 0x4B1A, 0x31EE, 0x930A, 0x2414, 0x93C6, 0x0000, 0x3411, 0x903A, +0x0041, 0x2802, 0x407A, 0x0040, 0x4A4E, 0x430F, 0x1800, 0x4B5D, 0x31F0, +0x09CC, 0x1380, 0x3BD8, 0x4AC6, 0x0000, 0x13B0, 0x7C30, 0x430C, 0x1656, +0x0110, 0x147B, 0x4D0B, 0x4307, 0x0CC9, 0x008A, 0x327C, 0x0A3F, 0x0110, +0x03DF, 0x2057, 0x4A6F, 0x0FEF, 0x1840, 0x4F18, 0x3284, 0x480C, 0x531C, +0x4806, 0x5B06, 0x9036, 0x00FF, 0x2839, 0x4A6F, 0x13B0, 0x8288, 0x4F57, +0x0001, 0x4A6F, 0x13B0, 0x8288, 0x4F54, 0x0002, 0x4A6F, 0x13B0, 0x8288, +0xD0FF, 0x0080, 0x0002, 0x4376, 0x8806, 0x460E, 0x430F, 0x1409, 0x4A6D, +0x064D, 0x1800, 0x4D55, 0x3388, 0x4C0D, 0x05CC, 0x0DEC, 0x160D, 0x13B0, +0x7E6A, 0x4A6F, 0x0FEF, 0x1840, 0x40BF, 0x00FF, 0x3284, 0x403D, 0x0014, +0x434C, 0x13B0, 0x7EA6, 0x13B0, 0x591C, 0x474D, 0x444C, 0x13B0, 0x6DE0, +0x4C07, 0x5038, 0xFF01, 0x580B, 0x06E9, 0x930B, 0x23BC, 0x3C28, 0x4B0E, +0x430F, 0x09CD, 0x4A6B, 0x064B, 0x1800, 0x4B5B, 0x3388, 0x0CEB, 0x0BCC, +0x13B0, 0x7E6A, 0x4A6F, 0x0FEF, 0x1840, 0x468F, 0x3284, 0x3C16, 0x0A3F, +0x0110, 0x009F, 0xFFFF, 0x2411, 0x930D, 0x240F, 0x9A9A, 0x0114, 0x0116, +0x2C0B, 0x0A3E, 0x0110, 0x4A1F, 0x0116, 0x0FEE, 0x4CFE, 0x0000, 0x539A, +0x0116, 0x533B, 0x23F1, 0x470C, 0x1674, 0x0110, 0x140A, 0x430F, 0x420E, +0xF03E, 0x0040, 0xC032, 0x0040, 0x403A, 0x1000, 0x903C, 0x3E81, 0x2803, +0x035D, 0x431F, 0x3C05, 0x5C0C, 0x3C03, 0x503A, 0x1000, 0x035D, 0x903D, +0x0201, 0x2FFA, 0x4382, 0x0160, 0xF0B2, 0xFC00, 0x0164, 0x533D, 0xDD0A, +0x4A82, 0x0164, 0x903C, 0x0277, 0x2C03, 0x4382, 0x0162, 0x3C2E, 0x903C, +0x04E2, 0x2C04, 0x40B2, 0x0010, 0x0162, 0x3C27, 0x903C, 0x09C4, 0x2C04, +0x40B2, 0x0020, 0x0162, 0x3C20, 0x903C, 0x1388, 0x2C04, 0x40B2, 0x0030, +0x0162, 0x3C19, 0x903C, 0x2710, 0x2C04, 0x40B2, 0x0040, 0x0162, 0x3C12, +0x903C, 0x4E20, 0x2C04, 0x40B2, 0x0050, 0x0162, 0x3C0B, 0x903C, 0x9C40, +0x7D0D, 0x0E5D, 0x503D, 0x0070, 0x4D82, 0x0162, 0x3C02, 0x13B0, 0x7262, +0xB3A2, 0x0102, 0x2FFB, 0x930F, 0x421F, 0x0168, 0x2405, 0xF03F, 0xFF88, +0xD03F, 0x0033, 0x3C04, 0xF03F, 0xFF88, 0xD03F, 0x0044, 0x4F82, 0x0168, +0xDE02, 0x160A, 0x0110, 0x141B, 0x8321, 0x008A, 0x327C, 0x0ACB, 0x00AB, +0x0001, 0x4B6E, 0x13B0, 0x847C, 0x2C06, 0x13B0, 0x8272, 0x9ECA, 0x0001, +0x23F8, 0x3C4E, 0x4B6E, 0x0EEE, 0x4B6F, 0x0FEF, 0x1840, 0x9F9E, 0x3284, +0x327E, 0x2C45, 0x1203, 0x1230, 0x000A, 0x434E, 0x4B6F, 0x0FEF, 0x1840, +0x4F1D, 0x3284, 0x4B6F, 0x064F, 0x1800, 0x4F5C, 0x3388, 0x13B0, 0x6EC6, +0x5221, 0x934C, 0x2405, 0x434D, 0x410C, 0x530C, 0x13B0, 0x4B60, 0x4B6F, +0x1840, 0xC3DF, 0x3282, 0x4B6F, 0x0FEF, 0x1840, 0x438F, 0x327E, 0x4B6E, +0x4B6F, 0x1840, 0xB3EF, 0x3282, 0x2C03, 0x1840, 0x4382, 0x3398, 0x13B0, +0x8272, 0x13B0, 0x847C, 0x2810, 0x4B6F, 0x064F, 0x1800, 0x4F5F, 0x3388, +0x4F6D, 0x4B6F, 0x0FEF, 0x1840, 0x9F1D, 0x327E, 0x2804, 0x1840, 0x40B2, +0x0032, 0x3398, 0x13B0, 0x847C, 0x2C03, 0x9ECA, 0x0001, 0x23E5, 0x5321, +0x161A, 0x0110, 0x143B, 0x008F, 0x30AC, 0x0CCA, 0x00AA, 0x0004, 0x9AAF, +0x0000, 0x2004, 0x9CDF, 0x0002, 0x0007, 0x2405, 0x00AF, 0x000A, 0x009F, +0x30D4, 0x23F4, 0x430F, 0x008B, 0x30AC, 0x93BB, 0x0000, 0x2405, 0x531F, +0x00AB, 0x000A, 0x922F, 0x2BF8, 0x922F, 0x2C3E, 0x4F0E, 0x0EEE, 0x0ECB, +0x064E, 0x0BEE, 0x0ECB, 0x4C6E, 0x907E, 0x0006, 0x281A, 0x535E, 0x064F, +0x0FC8, 0x0A4F, 0x0FE8, 0x0FEF, 0x08EF, 0x00AF, 0x3D2E, 0x1800, 0x4FCB, +0x30AE, 0x430F, 0x934E, 0x240E, 0x0CC8, 0x1800, 0x4B59, 0x30AE, 0x0FE9, +0x48F9, 0x0000, 0x531F, 0x9E0F, 0x2BF7, 0x3C03, 0x1800, 0x43CB, 0x30AE, +0xF35D, 0x1840, 0x4DCB, 0x30B2, 0x4C5E, 0x0002, 0xD07E, 0x0040, 0x1840, +0x4ECB, 0x30B3, 0x1840, 0x40FB, 0x0093, 0x30B4, 0x1840, 0x4AAB, 0x30AC, +0x1840, 0x43DB, 0x30B5, 0x431C, 0x3C02, 0x403C, 0xFFFD, 0x1638, 0x0110, +0x147B, 0x8031, 0x0012, 0x0CC7, 0x008A, 0x3008, 0x407D, 0x0093, 0x475C, +0x0002, 0x0A0F, 0x134F, 0x471B, 0x0004, 0x410C, 0x523C, 0x403E, 0x0005, +0x13B0, 0x80E4, 0x430D, 0x403F, 0x0006, 0x4104, 0x5234, 0x440E, 0x07C8, +0x00A8, 0x0006, 0x3C05, 0x48BE, 0x0000, 0x531D, 0x532F, 0x532E, 0x9B0D, +0x2BF9, 0xE03F, 0x8000, 0x07EF, 0x1FC0, 0x4F16, 0x8000, 0x460E, 0x4B0D, +0x440C, 0x1380, 0x3C50, 0x930C, 0x201E, 0x4308, 0x4107, 0x5227, 0x4109, +0x5309, 0x3C15, 0x1409, 0x07CF, 0x4B0E, 0x443D, 0x460C, 0x1380, 0x3C60, +0x411C, 0x0008, 0x411D, 0x000A, 0x13B0, 0x84A8, 0x411C, 0x0004, 0x411D, +0x0006, 0x13B0, 0x84A8, 0x5318, 0x5221, 0x9B08, 0x2BE9, 0x3C08, 0x403C, +0xDEAD, 0x13B0, 0x84A6, 0x403C, 0xBABE, 0x13B0, 0x84A6, 0x0A3F, 0x0004, +0x134F, 0x403C, 0x8000, 0x5031, 0x0012, 0x1674, 0x0110, 0x145B, 0x03DC, +0x245C, 0x00BC, 0x0004, 0x0CCA, 0x4C2E, 0x4C1F, 0x0002, 0x930F, 0x2002, +0x923E, 0x2852, 0xB31E, 0x2C50, 0x008B, 0x3D0A, 0x0B36, 0x0004, 0x03D6, +0x2409, 0x140C, 0x171C, 0x1406, 0x1718, 0x990D, 0x2803, 0x2008, 0x980C, +0x2C06, 0x067A, 0x0004, 0x0A7B, 0x0004, 0x3C27, 0x07C6, 0x0637, 0x0004, +0x03D7, 0x2407, 0x1407, 0x1718, 0x9D09, 0x2BF7, 0x2002, 0x9C08, 0x2BF4, +0x060D, 0x06C7, 0x0DE7, 0x07DA, 0x282B, 0x0AD7, 0x2006, 0x5E86, 0x0000, +0x6F86, 0x0002, 0x06CA, 0x3C0E, 0x0637, 0x0004, 0x03D7, 0x2406, 0x151F, +0x160E, 0x0ACF, 0x0EEF, 0x0FD7, 0x2819, 0x077A, 0x0004, 0x0A76, 0x0004, +0x0A3F, 0x0004, 0x03DF, 0x2411, 0x0A07, 0x0ACE, 0x07EE, 0x0FDE, 0x200C, +0x1800, 0x43CB, 0x0000, 0x5FAA, 0x0000, 0x6F9A, 0x0002, 0x0002, 0x1800, +0x4FDA, 0x0004, 0x0004, 0x1656, 0x0110, 0x141B, 0x8031, 0x0006, 0x1800, +0x43C1, 0x0002, 0x008B, 0x3EBE, 0x40FB, 0x0003, 0x0001, 0x436A, 0x410F, +0x532F, 0x410E, 0x530E, 0x434D, 0x427C, 0x13B0, 0x73E8, 0x93C1, 0x0000, +0x2007, 0x42EB, 0x0000, 0x43CB, 0x0002, 0x43CB, 0x0003, 0x3C35, 0x434E, +0x013F, 0x0002, 0x4F6D, 0x1943, 0x104D, 0x4A4F, 0x535F, 0x13B0, 0x81B4, +0x1840, 0x4DCA, 0x3EBE, 0x4F4A, 0x1840, 0x43CF, 0x3EBE, 0x535A, 0x013F, +0x0002, 0x407D, 0x000F, 0xFF6D, 0x4A4C, 0x535C, 0x4A4F, 0x13B0, 0x81B4, +0x1840, 0x4DCF, 0x3EBE, 0x4C4A, 0x4A4F, 0x1840, 0x43CF, 0x3EBE, 0x535A, +0x535E, 0x013F, 0x0002, 0x00AF, 0x0001, 0x0F71, 0x0002, 0x916E, 0x2C02, +0x927E, 0x2BD1, 0x1841, 0x5E4E, 0x536E, 0x4ECB, 0x0000, 0x5031, 0x0006, +0x161A, 0x0110, 0x140A, 0x433A, 0x4C5E, 0x0004, 0x934E, 0x2010, 0x13B0, +0x7442, 0x13B0, 0x849E, 0x1380, 0x3C5C, 0x13B0, 0x57A8, 0x13B0, 0x7014, +0x430C, 0x13B0, 0x78DC, 0x13B0, 0x83F0, 0x3C3C, 0x935E, 0x2003, 0x13B0, +0x80F8, 0x3C08, 0x936E, 0x2009, 0x13B0, 0x7A94, 0x13B0, 0x8148, 0x1380, +0x3C54, 0x13B0, 0x77BE, 0x3C1A, 0x907E, 0x0003, 0x200F, 0x13B0, 0x80F8, +0x13B0, 0x77BE, 0x13B0, 0x837A, 0x403C, 0x0005, 0x13B0, 0x78DC, 0x13B0, +0x79A6, 0x930C, 0x201C, 0x3C1A, 0x926E, 0x200B, 0x13B0, 0x7A94, 0x13B0, +0x8486, 0x13B0, 0x837A, 0x403C, 0x001E, 0x13B0, 0x78DC, 0x3C0D, 0x907E, +0x0005, 0x200B, 0x13B0, 0x835E, 0x13B0, 0x83F0, 0x13B0, 0x82A2, 0x13B0, +0x84B6, 0x13B0, 0x82A2, 0x431A, 0x4A0C, 0x160A, 0x0110, 0x147B, 0x0DC7, +0x0EC6, 0x4348, 0x438D, 0x0000, 0x438E, 0x0000, 0x4C4A, 0x430B, 0x151B, +0x160F, 0x0E4F, 0x1840, 0x4F59, 0x8582, 0x494C, 0x13B0, 0x7BF8, 0x4C05, +0x494C, 0x13B0, 0x7BE0, 0x4C04, 0x13B0, 0x4BAA, 0x151D, 0x160F, 0x1840, +0x938F, 0x31EE, 0x2409, 0x4358, 0x1840, 0x4F1E, 0x31EC, 0x1840, 0x8F1E, +0x31EE, 0x4E87, 0x0000, 0x13B0, 0x479C, 0x151D, 0x160F, 0x13B0, 0x8440, +0x2417, 0xD368, 0x13B0, 0x47A8, 0x4B86, 0x0000, 0x13B0, 0x84AE, 0x2004, +0x1840, 0x93D2, 0x3D2B, 0x2401, 0x4278, 0x450C, 0x13B0, 0x7BF2, 0x440C, +0x13B0, 0x84F0, 0x4303, 0x484C, 0x1674, 0x0110, 0x13B0, 0x84AE, 0x23EB, +0x0A59, 0x495E, 0x238A, 0xD95E, 0x238E, 0xB07E, 0x0080, 0x27E6, 0xD268, +0x3FE4, 0x4303, 0x40B2, 0x5A80, 0x015C, 0x13B0, 0x800A, 0x930C, 0x2002, +0x4382, 0x015C, 0x13B0, 0x6A56, 0x13B0, 0x7080, 0x434C, 0x13B0, 0x8064, +0x435C, 0x13B0, 0x80A6, 0x13B0, 0x7276, 0x403C, 0x007E, 0x13B0, 0x578C, +0x13B0, 0x55F4, 0xB35C, 0x2829, 0x13B0, 0x6E54, 0x934C, 0x2022, 0x13B0, +0x5670, 0x13B0, 0x5656, 0x13B0, 0x74EE, 0x13B0, 0x76BC, 0x13B0, 0x6F36, +0x13B0, 0x77BE, 0x13B0, 0x7442, 0x13B0, 0x57A8, 0x13B0, 0x7014, 0x13B0, +0x84B6, 0xD232, 0x9382, 0x4200, 0x2010, 0xC0F2, 0x0080, 0x0203, 0x13B0, +0x84F6, 0x1380, 0x3004, 0x1380, 0x3000, 0x3FFB, 0x13B0, 0x83CC, 0x3FFF, +0x13B0, 0x83CC, 0x3FFF, 0xD0F2, 0x0080, 0x0203, 0x3FEF, 0x4303, 0x141B, +0x4E0A, 0x4F0B, 0x936C, 0x2044, 0x903E, 0x2581, 0x2002, 0x930F, 0x2426, +0x903E, 0x86A0, 0x2002, 0x931F, 0x2421, 0x903E, 0x1A80, 0x2003, 0x903F, +0x0006, 0x241B, 0x903E, 0x86A1, 0x2002, 0x931F, 0x2416, 0x903E, 0x1A81, +0x2003, 0x903F, 0x0006, 0x2410, 0x903E, 0x86A2, 0x2002, 0x931F, 0x240B, +0x903E, 0x1A82, 0x2003, 0x903F, 0x0006, 0x2405, 0x903E, 0x2582, 0x2005, +0x930F, 0x2003, 0x13B0, 0x7D7A, 0x3C0A, 0x903E, 0x1F41, 0x2005, 0x930F, +0x2003, 0x13B0, 0x7D9E, 0x3C02, 0x13B0, 0x7F2E, 0x13B0, 0x849E, 0x120C, +0x403E, 0x7840, 0x403F, 0x017D, 0x4A0C, 0x4B0D, 0x13B0, 0x815A, 0x5321, +0x434C, 0x161A, 0x0110, 0x40B2, 0xA500, 0x0140, 0x40B2, 0xA510, 0x0144, +0x0110, 0x13B0, 0x68A8, 0x160A, 0x0110, 0x140A, 0x13B0, 0x68EE, 0x4E0A, +0xDF0A, 0x930A, 0x240B, 0x13B0, 0x68E6, 0x4CBD, 0x0000, 0x03ED, 0x533E, +0x633F, 0x4E0A, 0xDF0A, 0x930A, 0x23F5, 0x3FE9, 0x4303, 0xB392, 0x0144, +0x2FFD, 0x0110, 0x40B2, 0xA500, 0x0144, 0x40B2, 0xA540, 0x0140, 0x0110, +0x141B, 0x430A, 0x430B, 0x3C02, 0x531A, 0x630B, 0x9F0B, 0x2803, 0x2007, +0x9E0A, 0x2C05, 0x4C7D, 0x937D, 0x27F6, 0x435C, 0x3C01, 0x434C, 0x161A, +0x0110, 0x40B2, 0xA500, 0x0144, 0x40B2, 0xA502, 0x0140, 0x438C, 0x0000, +0x13B0, 0x68E6, 0x3FB8, 0x4303, 0x140A, 0x008F, 0x85A0, 0x425E, 0x2380, +0x3C02, 0x00AF, 0x0006, 0x4F7D, 0x4F7C, 0x937D, 0x2002, 0x937C, 0x2406, +0x907E, 0x00C0, 0x2403, 0x907E, 0x0040, 0x2006, 0x03FF, 0xB3D2, 0x093E, +0x2824, 0x434C, 0x3C2D, 0x9E4D, 0x201D, 0x925C, 0x2381, 0x201A, 0x407D, +0x00C0, 0x407C, 0x0020, 0x008A, 0x2382, 0x9FEA, 0x0000, 0x2001, 0xDC4D, +0x00AF, 0x0001, 0x035C, 0x00AA, 0x0001, 0x009A, 0x2388, 0x23F4, 0x4F6A, +0x4A4C, 0xFD4C, 0x9A4C, 0x23D0, 0x00BF, 0x0008, 0x3FDC, 0x00AF, 0x000C, +0x3FCC, 0x0F3A, 0x000A, 0x134A, 0x009A, 0x7E4A, 0x2005, 0x93C2, 0x093F, +0x2402, 0x13B0, 0x8524, 0x160A, 0x0110, 0x145B, 0x0CC6, 0x4D08, 0x4E4E, +0x4E0A, 0x430B, 0x151B, 0x160F, 0x0E4F, 0x1840, 0x4F59, 0x8582, 0x930D, +0x2003, 0x407C, 0x0007, 0x3C32, 0x494C, 0x13B0, 0x7BF8, 0x4C07, 0x13B0, +0x84AE, 0x2004, 0x1840, 0x93D2, 0x3D2B, 0x2404, 0x13B0, 0x7BF2, 0x427C, +0x3C23, 0x13B0, 0x4BAA, 0x151D, 0x160F, 0x1840, 0x938F, 0x31EE, 0x2406, +0x470C, 0x13B0, 0x7BF2, 0x407C, 0x0003, 0x3C15, 0x1840, 0x488F, 0x31EC, +0x1840, 0x488F, 0x31EE, 0x1800, 0x46CF, 0x31F0, 0x431F, 0x5359, 0x8359, +0x3002, 0x18C9, 0x5F0F, 0xDFC2, 0x0930, 0x470C, 0x13B0, 0x7BF2, 0x435C, +0x1656, 0x0110, 0x43C2, 0x0204, 0x43C2, 0x0205, 0x43C2, 0x0224, 0x43C2, +0x0225, 0x43C2, 0x0244, 0x43C2, 0x0245, 0x43C2, 0x020A, 0x43C2, 0x020B, +0x43C2, 0x022A, 0x43C2, 0x022B, 0x43C2, 0x024A, 0x43C2, 0x024B, 0x43C2, +0x0202, 0x43C2, 0x0203, 0x43C2, 0x0222, 0x43C2, 0x0223, 0x43C2, 0x0242, +0x43C2, 0x0243, 0x40F2, 0x001C, 0x0204, 0x43D2, 0x0244, 0x40F2, 0x0041, +0x024A, 0x40F2, 0x0020, 0x0245, 0x40F2, 0x0007, 0x024B, 0xC0F2, 0x0010, +0x0245, 0xC0F2, 0x0040, 0x0243, 0x403F, 0x1A09, 0x533F, 0x2FFE, 0x40F2, +0x0040, 0x0243, 0xD0F2, 0x0040, 0x0207, 0x0110, 0x145B, 0x434A, 0x4C48, +0x4309, 0x1519, 0x160F, 0x0E4F, 0x1840, 0x4F5B, 0x8582, 0x4B4C, 0x13B0, +0x7BE0, 0x4C06, 0x13B0, 0x84AE, 0x2004, 0x1840, 0x93D2, 0x3D2B, 0x2404, +0x13B0, 0x84F0, 0x434C, 0x3C28, 0x13B0, 0x4B52, 0x151D, 0x160F, 0x1840, +0x4F5E, 0x321C, 0x934E, 0x240B, 0x4E4A, 0x1800, 0x4F5F, 0x3214, 0x93CF, +0x0000, 0x3414, 0x407E, 0x007F, 0xFF6E, 0x3C0F, 0x0A5B, 0x93CB, 0x238A, +0x3404, 0x4B5A, 0x238A, 0xF07A, 0x007F, 0x93CB, 0x238E, 0x3405, 0x4B5E, +0x238E, 0xF07E, 0x007F, 0x5E4A, 0x460C, 0x13B0, 0x84F0, 0x4A4C, 0x1656, +0x0110, 0x140A, 0x934C, 0x201F, 0x430C, 0x008E, 0x30AC, 0x002D, 0x3CF4, +0x4E2F, 0x933F, 0x2411, 0x0FEF, 0x0FCA, 0x0FEF, 0x0AEF, 0x0DEF, 0x90BF, +0xFF00, 0x0000, 0x2C08, 0x1800, 0x43CE, 0x0002, 0x43BE, 0x0000, 0x43CE, +0x0009, 0x531C, 0x00AE, 0x000A, 0x009E, 0x30D4, 0x2420, 0x3FE6, 0x430F, +0x008E, 0x30B3, 0x9CCE, 0x0000, 0x2403, 0x13B0, 0x844A, 0x2BFA, 0x922F, +0x2C13, 0x13B0, 0x838C, 0x0FCA, 0x1800, 0x4F5C, 0x30AE, 0x03DC, 0x2402, +0x13B0, 0x855C, 0x1800, 0x43CA, 0x30AE, 0x1840, 0x43BA, 0x30AC, 0x1840, +0x43CA, 0x30B5, 0x431C, 0x160A, 0x0110, 0x1840, 0x9382, 0x3BE0, 0x243B, +0xB0F2, 0x0010, 0x0241, 0x2805, 0x13B0, 0x849E, 0x903C, 0xAAAA, 0x2412, +0xB0F2, 0x0010, 0x0241, 0x2805, 0x13B0, 0x849E, 0x903C, 0xAAAC, 0x2409, +0xB0F2, 0x0010, 0x0241, 0x2818, 0x13B0, 0x849E, 0x903C, 0xAAAD, 0x2013, +0x435C, 0x13B0, 0x8064, 0x434C, 0x13B0, 0x80A6, 0x1840, 0x9382, 0x3BE6, +0x2004, 0x403C, 0x0005, 0x13B0, 0x72D4, 0x1840, 0x4392, 0x3BE6, 0x430C, +0x0110, 0x435C, 0x13B0, 0x80A6, 0x1840, 0x9382, 0x3BE6, 0x2406, 0x1840, +0x4382, 0x3BE6, 0x434C, 0x13B0, 0x8064, 0x430C, 0x0110, 0x425E, 0x2384, +0xF07E, 0x000F, 0x2438, 0x537E, 0x907E, 0x0007, 0x2C36, 0x4E4F, 0x0A5F, +0x93C2, 0x2384, 0x3419, 0xF0FF, 0x00D7, 0x23C8, 0x434F, 0x008D, 0x8582, +0x9ECD, 0x0000, 0x200A, 0x0FEF, 0x0FCE, 0x064F, 0x0FEE, 0x0FEF, 0x0EEF, +0x1840, 0x43CF, 0x321D, 0x3C1C, 0x535F, 0x00AD, 0x0010, 0x936F, 0x2C17, +0x3FED, 0xF0FF, 0x00D7, 0x2388, 0x434F, 0x008D, 0x8582, 0x9ECD, 0x0000, +0x2008, 0x064F, 0x0FCE, 0x0FEF, 0x0EEF, 0x1840, 0x43CF, 0x31F4, 0x3C05, +0x535F, 0x00AD, 0x0010, 0x936F, 0x2BF0, 0x13B0, 0x7A7E, 0x434C, 0x0110, +0x140A, 0x430E, 0x430E, 0x3C01, 0x532E, 0x903E, 0x0080, 0x3410, 0x4E0F, +0x0FEF, 0x1840, 0x9C8F, 0x4100, 0x23F6, 0x531E, 0xE03E, 0x8000, 0x0EEE, +0x0FAE, 0x4100, 0x0E7D, 0x0000, 0x431C, 0x3C25, 0x430E, 0x3C01, 0x532E, +0x903E, 0x0080, 0x341B, 0x4E0F, 0x0FEF, 0x1840, 0x938F, 0x4100, 0x23F6, +0x4E0F, 0x0FEF, 0x1840, 0x4C8F, 0x4100, 0x4E0F, 0x531F, 0xE03F, 0x8000, +0x0FEF, 0x0FAF, 0x4100, 0x0F7D, 0x0000, 0x531E, 0x0EEE, 0x1840, 0x438E, +0x4100, 0x431C, 0x3C04, 0x1800, 0x43CD, 0x0000, 0x430C, 0x160A, 0x0110, +0x140A, 0x0CCA, 0x13B0, 0x8350, 0x2424, 0x438A, 0x0000, 0x438A, 0x0002, +0x0ACC, 0x13B0, 0x7B3E, 0x930C, 0x2402, 0x433C, 0x3C29, 0x0ACC, 0x00AC, +0x0001, 0x13B0, 0x7B3E, 0x930C, 0x2403, 0x403C, 0xFFFE, 0x3C1F, 0x0ACC, +0x03EC, 0x13B0, 0x7B3E, 0x930C, 0x2403, 0x403C, 0xFFFD, 0x3C16, 0x00AA, +0x0003, 0x0ACC, 0x13B0, 0x7B3E, 0x3C10, 0x1800, 0x9DCE, 0x0004, 0x2C03, +0x403C, 0xFFFB, 0x3C09, 0x4DBA, 0x0000, 0x4DBA, 0x0002, 0x1800, 0x52EE, +0x0008, 0x13B0, 0x8436, 0x160A, 0x0110, 0x008E, 0x327C, 0x13B0, 0x6E40, +0x2404, 0x1840, 0x93A2, 0x3398, 0x2FF9, 0x13B0, 0x6E40, 0x2406, 0x907D, +0x0095, 0x2403, 0x13B0, 0x8520, 0x3C25, 0x13B0, 0x6E40, 0x2404, 0x907D, +0x0095, 0x2001, 0x3C1E, 0x4E6F, 0x13B0, 0x8288, 0x4DCF, 0x0001, 0x4E6F, +0x13B0, 0x8288, 0x4CCF, 0x0002, 0x4E6F, 0x13B0, 0x8288, 0x43CF, 0x0003, +0x4E6F, 0x0FEF, 0x1840, 0x40BF, 0x0003, 0x3284, 0x430C, 0x0110, 0x4E6F, +0x1840, 0x4F5F, 0x3282, 0xB07F, 0x000B, 0x0110, 0x403C, 0x8007, 0x0110, +0x8221, 0x4381, 0x0002, 0xB2B2, 0x0908, 0x2827, 0xB392, 0x0902, 0x2804, +0xB0B2, 0x0100, 0x0910, 0x2C29, 0x13B0, 0x5668, 0x40B2, 0x0117, 0x0912, +0x40B2, 0x0300, 0x0910, 0x4382, 0x0914, 0x4381, 0x0000, 0x3C04, 0x412F, +0x531F, 0x4F81, 0x0000, 0x90B1, 0x04E2, 0x0000, 0x2BF8, 0x411F, 0x0002, +0x4F0E, 0x531E, 0x4E81, 0x0002, 0x903F, 0x000B, 0x2804, 0x13B0, 0x564E, +0x435C, 0x3C08, 0x9382, 0x0914, 0x23E3, 0xD392, 0x0902, 0x13B0, 0x564E, +0x434C, 0x5221, 0x0110, 0x147B, 0x140C, 0x8221, 0x4D05, 0x4E46, 0x430A, +0x430B, 0x4107, 0x5327, 0x4104, 0x5304, 0x4118, 0x002C, 0x4119, 0x002E, +0x04CE, 0x07CD, 0x464C, 0x13B0, 0x66CA, 0xB35C, 0x280F, 0x480F, 0xD90F, +0x930F, 0x27F5, 0x4A0E, 0x4B0F, 0x531A, 0x630B, 0x9F09, 0x2803, 0x23EE, +0x9E08, 0x2FEC, 0x435C, 0x3C10, 0x464E, 0x450D, 0x013C, 0x0004, 0x13B0, +0x69CC, 0x931C, 0x2403, 0x923C, 0x2403, 0x3C04, 0x434C, 0x3C03, 0x436C, +0x3C01, 0x426C, 0x5231, 0x1674, 0x0110, 0x008C, 0x3068, 0x1800, 0x40FC, +0x8544, 0x0000, 0x1800, 0x40FC, 0x8544, 0x0034, 0x1800, 0x40FC, 0x8528, +0x0004, 0x1800, 0x40FC, 0x852C, 0x0008, 0x1800, 0x40FC, 0x853C, 0x000C, +0x1800, 0x40FC, 0x8570, 0x0010, 0x1800, 0x40FC, 0x8574, 0x0014, 0x1800, +0x40FC, 0x8576, 0x0018, 0x1800, 0x40FC, 0x857E, 0x001C, 0x1800, 0x40FC, +0x857C, 0x0020, 0x1800, 0x40FC, 0x852C, 0x0028, 0x1800, 0x40FC, 0x852C, +0x002C, 0x1800, 0x40FC, 0x8570, 0x0030, 0x0080, 0x82E0, 0x145B, 0x0CC8, +0x4D0A, 0x0EC9, 0x4F0B, 0x0086, 0x3BEA, 0x0137, 0x001C, 0x403E, 0x000C, +0x430F, 0x06CD, 0x07CC, 0x13B0, 0x7E6A, 0x008F, 0x327C, 0x1800, 0x4FD7, +0x0110, 0x000C, 0x4F97, 0x0114, 0x0010, 0x4F97, 0x0116, 0x0012, 0x0876, +0x0000, 0x0607, 0x0AE7, 0x0776, 0x0004, 0x0876, 0x0008, 0x0099, 0x0001, +0x240D, 0x03D9, 0x2005, 0x1800, 0x40FF, 0xFFFF, 0x0110, 0x3C02, 0x097F, +0x0110, 0x4B8F, 0x0114, 0x438F, 0x0116, 0x430C, 0x1656, 0x0110, 0x140A, +0x13B0, 0x82FC, 0x933C, 0x2002, 0x930D, 0x240C, 0x13B0, 0x8326, 0x903C, +0xACDC, 0x2007, 0x903D, 0xACDC, 0x2004, 0x13B0, 0x820E, 0x934C, 0x2004, +0x13B0, 0x6F36, 0x433C, 0x3C1D, 0x13B0, 0x82FC, 0x4C0E, 0x4D0F, 0x008A, +0x3068, 0x0ACC, 0x151F, 0x160F, 0x134F, 0x0ACC, 0x13B0, 0x82E0, 0x008C, +0x30A0, 0x0A3F, 0x001C, 0x134F, 0x008C, 0x3C68, 0x0A3F, 0x0014, 0x134F, +0x008C, 0x3C48, 0x0A3F, 0x0018, 0x134F, 0x430C, 0x160A, 0x0110, 0x13B0, +0x726E, 0x407C, 0x0003, 0x13B0, 0x7744, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0xD0F2, 0x000C, 0x024A, 0x421F, 0x0166, 0xF03F, 0xFF8F, 0xD03F, +0x0020, 0x4F82, 0x0166, 0x421F, 0x0168, 0xF03F, 0xF8FF, 0xD03F, 0x0200, +0x4F82, 0x0168, 0x403D, 0x02FA, 0x403C, 0x61A8, 0x13B0, 0x7A38, 0x13B0, +0x725C, 0x403D, 0x4E20, 0x430C, 0x13B0, 0x7218, 0x931C, 0x2007, 0x434C, +0x13B0, 0x8064, 0x435C, 0x13B0, 0x80A6, 0x3FFF, 0x0110, 0x002E, 0x3C06, +0x1840, 0x421F, 0x3C02, 0x933F, 0x2427, 0x903F, 0x0009, 0x2803, 0x427D, +0x823F, 0x3C0A, 0x923F, 0x2C02, 0x4F4D, 0x3C08, 0x427D, 0x1840, 0x93D2, +0x3D18, 0x2003, 0x430F, 0x435C, 0x3C02, 0x433F, 0x434C, 0x1840, 0x4CC2, +0x3D29, 0x1840, 0x4F82, 0x3C02, 0x934D, 0x2408, 0x403F, 0x2378, 0x4D4C, +0x4EFF, 0x0000, 0x531F, 0x537C, 0x23FB, 0x4DC2, 0x0921, 0x3C03, 0x1840, +0x43C2, 0x3D29, 0x0E60, 0x3C06, 0x0110, 0x141B, 0x13B0, 0x7F14, 0x4382, +0x012C, 0x4C4A, 0x4A0B, 0xD03B, 0x4400, 0x4B82, 0x0124, 0x13B0, 0x8408, +0xB0B2, 0x0020, 0x012C, 0x280B, 0xC0B2, 0x0010, 0x012C, 0x4E82, 0x0124, +0x13B0, 0x8454, 0x13B0, 0x8242, 0x431C, 0x3C14, 0x4A0B, 0x108B, 0xDB82, +0x0124, 0x13B0, 0x8408, 0x4CC2, 0x0120, 0xDB0A, 0xD03A, 0x4400, 0x4A82, +0x0126, 0xB392, 0x012C, 0x2BFD, 0xC392, 0x012C, 0x13B0, 0x7942, 0x161A, +0x0110, 0x140A, 0xB392, 0x2384, 0x421F, 0x2384, 0x2801, 0x533F, 0x035F, +0x4F4F, 0x0A4F, 0x008A, 0x3D19, 0x1840, 0x4FDA, 0x31E0, 0x0006, 0x1840, +0x4FDA, 0x31E2, 0x0005, 0x1840, 0x4FDA, 0x31E1, 0x0004, 0x13B0, 0x836C, +0x4F0D, 0x108D, 0x4D4C, 0x4CCA, 0x0003, 0x4FCA, 0x0002, 0x4E0D, 0x108D, +0x4DCA, 0x0001, 0x4ECA, 0x0000, 0x1840, 0x40B2, 0x0007, 0x3C02, 0x0ACC, +0x13B0, 0x7C7C, 0x434C, 0x160A, 0x0110, 0x421F, 0x016C, 0xF03F, 0xC000, +0x9C0F, 0x2405, 0xF0B2, 0x3FFF, 0x016C, 0xDC82, 0x016C, 0xC0B2, 0x0100, +0x016C, 0x3C05, 0xF0B2, 0xFFF4, 0x016E, 0xC3A2, 0x0102, 0xB3A2, 0x0102, +0x2805, 0x4D0F, 0x4F0D, 0x533D, 0x930F, 0x23F3, 0x930D, 0x2402, 0x430C, +0x0110, 0x431C, 0x0110, 0xD392, 0x016C, 0x0110, 0xF0B2, 0xFFF4, 0x016E, +0xC3A2, 0x0102, 0x0110, 0xD0B2, 0x0100, 0x016C, 0x0110, 0x140A, 0x8321, +0x420A, 0xF23A, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x13B0, 0x5668, +0x4382, 0x0908, 0x40B2, 0x0080, 0x0904, 0x40B2, 0x0840, 0x0908, 0x4381, +0x0000, 0x3C04, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, 0x30D4, 0x0000, +0x2BF8, 0x40B2, 0x0A40, 0x0908, 0x13B0, 0x564E, 0x1840, 0x4382, 0x3C0E, +0x13B0, 0x6570, 0x13B0, 0x7BB8, 0xDA02, 0x434C, 0x5321, 0x160A, 0x0110, +0x143B, 0x4C0B, 0x008A, 0x3BE2, 0x4A2F, 0xDA1F, 0x0002, 0x930F, 0x2011, +0x0088, 0x3008, 0x407D, 0x0095, 0x434C, 0x080F, 0x134F, 0x903C, 0x8007, +0x2407, 0x4B0C, 0x083F, 0x0010, 0x134F, 0x083F, 0x0004, 0x134F, 0x4A2E, +0x4A1F, 0x0002, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x931F, 0x2806, 0x2003, +0x903E, 0x86A1, 0x2802, 0x430C, 0x430D, 0x4C8A, 0x0000, 0x4D8A, 0x0002, +0x1638, 0x0110, 0x143B, 0x8321, 0xB392, 0x2384, 0x421E, 0x2384, 0x2801, +0x533E, 0x035E, 0x4EC1, 0x0000, 0x008D, 0x3D21, 0x4D68, 0x4D5A, 0x0001, +0x108A, 0x4D5E, 0x0002, 0x4D5C, 0x0003, 0x108C, 0x4C0D, 0xDE0D, 0x4A0C, +0xD80C, 0x416F, 0x0A4F, 0x1840, 0x4C8F, 0x31DC, 0x1840, 0x4D8F, 0x31DE, +0x416F, 0x0A4F, 0x13B0, 0x836C, 0x1840, 0x425C, 0x2384, 0x13B0, 0x6810, +0x5321, 0x1638, 0x0110, 0xD0F2, 0x0010, 0x093C, 0x3C0F, 0xC0F2, 0x0080, +0x0920, 0xC0F2, 0x0080, 0x0922, 0xF0F2, 0x00FA, 0x093E, 0xD0F2, 0x0080, +0x0920, 0xD0F2, 0x0080, 0x0922, 0x93C2, 0x2380, 0x3403, 0xD3D2, 0x093C, +0x3C02, 0xC3D2, 0x093C, 0x1840, 0x43C2, 0x3D29, 0x008F, 0x3D19, 0x43CF, +0x0000, 0x00AF, 0x0001, 0x009F, 0x3D21, 0x23F9, 0x13B0, 0x693A, 0xB3D2, +0x093E, 0x2FD8, 0x0110, 0x143B, 0x4D4A, 0x008B, 0x1A08, 0x4B6D, 0x9C4D, +0x2002, 0x934A, 0x2415, 0x937D, 0x2413, 0x9C4D, 0x2001, 0x537A, 0x4B5D, +0x0001, 0x532D, 0x4D08, 0xE038, 0x8000, 0x00B8, 0x8000, 0x08EB, 0x140B, +0x1718, 0x9309, 0x2003, 0x9038, 0x1AFF, 0x2BE6, 0x9CCB, 0x0000, 0x2004, +0x4B5D, 0x0001, 0x03EB, 0x3C02, 0x434D, 0x434B, 0x4DCE, 0x0000, 0x0B7F, +0x0000, 0x1638, 0x0110, 0x140A, 0x13B0, 0x8334, 0x933C, 0x2002, 0x930D, +0x240C, 0x13B0, 0x82EE, 0x903C, 0xABBA, 0x2007, 0x903D, 0xABBA, 0x2004, +0x13B0, 0x8220, 0x934C, 0x2004, 0x13B0, 0x77BE, 0x433C, 0x3C13, 0x13B0, +0x8334, 0x4C0E, 0x4D0F, 0x008A, 0x3C48, 0x0ACC, 0x151F, 0x160F, 0x134F, +0x0ACC, 0x1380, 0x3080, 0x13B0, 0x849E, 0x0A3F, 0x0014, 0x134F, 0x430C, +0x160A, 0x0110, 0x143B, 0x8321, 0x0CCB, 0x13B0, 0x8350, 0x2413, 0x4108, +0x5308, 0x08CC, 0x13B0, 0x7B3E, 0x416A, 0x930C, 0x2007, 0x08CC, 0x13B0, +0x7B3E, 0x416F, 0x108F, 0x5F0A, 0x3C01, 0x433C, 0x4A8B, 0x0000, 0x3C0E, +0x1800, 0x9DCE, 0x0004, 0x2C03, 0x403C, 0xFFFE, 0x3C07, 0x4DAB, 0x0000, +0x1800, 0x53EE, 0x0008, 0x13B0, 0x8436, 0x5321, 0x1638, 0x0110, 0x40B2, +0x7A11, 0x0392, 0x40B2, 0x02D6, 0x0380, 0x008F, 0x339C, 0x1800, 0x40FF, +0x0202, 0x0006, 0x42EF, 0x000A, 0x1800, 0x40FF, 0x0202, 0x0012, 0x42FF, +0x0016, 0x1800, 0x40F2, 0x3D13, 0x33B8, 0xC0B2, 0x8000, 0x0182, 0x008F, +0x3238, 0x429F, 0x100E, 0x0000, 0xD0B2, 0x8000, 0x0182, 0x1840, 0x4FA2, +0x33B4, 0x1840, 0x4FA2, 0x33B6, 0x0110, 0x1800, 0x1246, 0x1800, 0x1247, +0x4D06, 0xD07D, 0x0080, 0x6606, 0x6707, 0x1086, 0xF376, 0x8076, 0x007F, +0x2C03, 0x430C, 0x430D, 0x3C13, 0x8076, 0x0018, 0x2C07, 0xE376, 0x240E, +0x110D, 0x100C, 0x8356, 0x23FC, 0x3C09, 0x9236, 0x3803, 0x433C, 0x433D, +0x3C04, 0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x1800, 0x4177, 0x1800, +0x4176, 0x0110, 0x141B, 0x425E, 0x0923, 0xF07E, 0x007F, 0x002F, 0x3C0A, +0x4E4D, 0x008C, 0x3C04, 0x9D8C, 0x0000, 0x2812, 0x934E, 0x2409, 0x403A, +0x2370, 0x4A7B, 0x4BCF, 0x0000, 0x00AF, 0x0001, 0x537E, 0x23F9, 0x8D8C, +0x0000, 0x2404, 0x13B0, 0x84E4, 0x436E, 0x3C03, 0x13B0, 0x7A90, 0x434E, +0x1840, 0x4EC2, 0x3D29, 0x0F60, 0x3C0A, 0x161A, 0x0110, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x13B0, 0x562C, 0xC3E2, 0x0242, 0x13B0, 0x82B2, +0x13B0, 0x5796, 0x13B0, 0x726E, 0x008C, 0x197F, 0x13B0, 0x6922, 0x008C, +0x18FF, 0x13B0, 0x6922, 0x008C, 0x187F, 0x13B0, 0x6922, 0x008C, 0xFFFE, +0x13B0, 0x6922, 0x13B0, 0x82B2, 0x40B2, 0xA504, 0x0120, 0x0110, 0x143B, +0x4D0A, 0x0EC8, 0x008B, 0x3008, 0x407D, 0x0092, 0x0B0F, 0x134F, 0x930C, +0x3815, 0x03D8, 0x2004, 0x4A0C, 0x13B0, 0x846C, 0x3C0B, 0x4309, 0x3C04, +0x483C, 0x13B0, 0x846C, 0x5319, 0x9A09, 0x2C03, 0x9039, 0x007E, 0x2BF7, +0x13B0, 0x84EA, 0x430C, 0x3C01, 0x433C, 0x1638, 0x0110, 0x403E, 0x0018, +0x430F, 0x430D, 0x008C, 0x31EC, 0x13B0, 0x7E88, 0x403E, 0x0034, 0x430F, +0x430D, 0x008C, 0x3204, 0x13B0, 0x7E88, 0x403E, 0x0010, 0x430F, 0x430D, +0x008C, 0x31DC, 0x13B0, 0x7E88, 0x008F, 0x31E0, 0x42FF, 0x0000, 0x00AF, +0x0008, 0x009F, 0x31F0, 0x23F9, 0x0110, 0x140A, 0x008E, 0x323A, 0x008D, +0x323A, 0x008A, 0x33C8, 0x0A7E, 0x0010, 0x0E3F, 0x0010, 0x03DF, 0x2002, +0x13B0, 0x8232, 0x1800, 0x4EDD, 0x0010, 0x0000, 0x00AA, 0x0204, 0x00AD, +0x0004, 0x00AE, 0x0004, 0x009A, 0x3BD8, 0x23EB, 0x1800, 0x40F2, 0x3286, +0x3388, 0x160A, 0x0110, 0x140A, 0x008F, 0x323A, 0x43CF, 0x003A, 0x0FCE, +0x0FCD, 0x0FCC, 0x43CE, 0x003D, 0x43CF, 0x003B, 0x43CF, 0x003C, 0x0C1A, +0x43CA, 0x0000, 0x438D, 0x0032, 0x438D, 0x0020, 0x438D, 0x0028, 0x03ED, +0x00AE, 0x0001, 0x009C, 0x324A, 0x23EB, 0x1840, 0x4382, 0x3394, 0x160A, +0x0110, 0x141B, 0x430F, 0xF07C, 0x0003, 0x421A, 0x0120, 0xF03A, 0x0003, +0x4C4B, 0x3C05, 0x531A, 0x4A4C, 0x13B0, 0x7152, 0x4C0F, 0x9A0B, 0x2402, +0x930F, 0x2402, 0x9A0B, 0x2C07, 0x9B0A, 0x2BF3, 0x533A, 0x4A4C, 0x13B0, +0x77FA, 0x3FF2, 0x4F0C, 0x161A, 0x0110, 0x140A, 0x434A, 0xD0F2, 0x0010, +0x093C, 0x43C2, 0x0921, 0x1840, 0x93E2, 0x3D29, 0x200E, 0x13B0, 0x7596, +0x1840, 0x93C2, 0x3D29, 0x200A, 0x90F2, 0x0020, 0x2381, 0x2006, 0x13B0, +0x7332, 0x4C4A, 0x3C02, 0xD2F2, 0x0922, 0x4A4C, 0x160A, 0x0110, 0x008C, +0x3C48, 0x008F, 0x8544, 0x0F7C, 0x0000, 0x0F7C, 0x0004, 0x1800, 0x40FC, +0x8548, 0x0008, 0x0F7C, 0x000C, 0x1800, 0x40FC, 0x8540, 0x0010, 0x1800, +0x40FC, 0x8500, 0x0014, 0x1800, 0x40FC, 0x8572, 0x0018, 0x0F7C, 0x001C, +0x0020, 0x3080, 0x141B, 0x13B0, 0x7F14, 0xF0B2, 0xFFCC, 0x012C, 0x4C4A, +0x4A0B, 0x108B, 0xDB0A, 0xD03A, 0x4400, 0x4A82, 0x0124, 0x4A82, 0x0126, +0x13B0, 0x8454, 0xB392, 0x012C, 0x2BFB, 0xF0B2, 0xFFEE, 0x012C, 0x4CC2, +0x0120, 0x13B0, 0x7942, 0x161A, 0x0110, 0x8321, 0x13B0, 0x7EE0, 0xB2B2, +0x0908, 0x2C14, 0x40B2, 0x9628, 0x0900, 0x1840, 0x43C2, 0x3D2B, 0x1840, +0x43C2, 0x3D2A, 0x4382, 0x0902, 0xC0B2, 0x0100, 0x0910, 0xF0B2, 0xEBFB, +0x0908, 0x40B2, 0x9600, 0x0900, 0x5321, 0x0110, 0x9382, 0x2382, 0x2015, +0x425F, 0x2384, 0xF07F, 0x000F, 0x240D, 0x537F, 0x907F, 0x0007, 0x2C0E, +0x0A5F, 0x93C2, 0x2384, 0x3403, 0xD2FF, 0x23C8, 0x3C02, 0xD2FF, 0x2388, +0x13B0, 0x7A7E, 0x3C02, 0x13B0, 0x7A66, 0x434C, 0x0110, 0x430F, 0x430F, +0x3C01, 0x532F, 0x903F, 0x0080, 0x3412, 0x4F0E, 0x0EEE, 0x1840, 0x9C8E, +0x4100, 0x23F6, 0x4F0E, 0x0EEE, 0x1840, 0x438E, 0x4100, 0x531F, 0x0FEF, +0x1840, 0x438F, 0x4100, 0x431C, 0x0110, 0x430C, 0x0110, 0x4C0F, 0x5F0F, +0x008E, 0x339C, 0x4F8E, 0x0002, 0x4C8E, 0x0004, 0x4F8E, 0x000E, 0x4C8E, +0x0010, 0x930C, 0x2406, 0x40FE, 0x0003, 0x0000, 0x43EE, 0x000C, 0x3C04, +0x43CE, 0x0000, 0x43CE, 0x000C, 0x430C, 0x0110, 0x403E, 0x003D, 0x430F, +0x008D, 0x1900, 0x13B0, 0x83D8, 0x008D, 0x197C, 0x13B0, 0x7DE4, 0x403E, +0x0F00, 0x430F, 0x008D, 0xE000, 0x13B0, 0x7DE4, 0x403E, 0x7000, 0x430F, +0x018D, 0x0000, 0x0080, 0x7DE4, 0xF0B2, 0x0307, 0x0126, 0xF03D, 0xFCF8, +0xDD82, 0x0126, 0xF0B2, 0x0307, 0x0124, 0xF03E, 0xFCF8, 0xDE82, 0x0124, +0xB392, 0x012C, 0x2C04, 0xB0B2, 0x0010, 0x012C, 0x2BF9, 0x13B0, 0x8242, +0x430C, 0x0110, 0x140A, 0x0CCA, 0x403E, 0x000C, 0x430F, 0x0CCD, 0x008C, +0x3BEA, 0x13B0, 0x7E6A, 0x008F, 0x327C, 0x1800, 0x4ADF, 0x000C, 0x0110, +0x4A9F, 0x0010, 0x0114, 0x4A9F, 0x0012, 0x0116, 0x430C, 0x160A, 0x0110, +0x13B0, 0x8342, 0x933C, 0x2002, 0x930D, 0x240C, 0x13B0, 0x83A4, 0x903C, +0xADAC, 0x2007, 0x903D, 0xADAC, 0x2004, 0x13B0, 0x81C6, 0x934C, 0x2002, +0x433C, 0x0110, 0x13B0, 0x8342, 0x151D, 0x160F, 0x0FC0, 0x140A, 0x008A, +0x327C, 0x403E, 0x0118, 0x430F, 0x430D, 0x0ACC, 0x13B0, 0x7E88, 0x1840, +0x4382, 0x3398, 0x1840, 0x43C2, 0x3D13, 0x1800, 0x40FA, 0x3286, 0x010C, +0x43CA, 0x0006, 0x160A, 0x0110, 0x140A, 0x4E0A, 0xDF0A, 0x930A, 0x2411, +0x0C60, 0x0516, 0x0D60, 0x0512, 0x4E82, 0x051A, 0xD0B2, 0x0010, 0x0510, +0xD392, 0x0510, 0xB2B2, 0x0510, 0x2BFD, 0xC0B2, 0x0010, 0x0510, 0x160A, +0x0110, 0x8321, 0x4D0F, 0x1844, 0x5F0F, 0x4F81, 0x0000, 0x13B0, 0x6194, +0x3C05, 0x4303, 0x4303, 0x423F, 0x533F, 0x2FFE, 0x412F, 0x4F0E, 0x533E, +0x4E81, 0x0000, 0x930F, 0x23F4, 0x5321, 0x0110, 0xD2F2, 0x0920, 0xD2F2, +0x0922, 0x0110, 0xB3D2, 0x093E, 0x2C02, 0x13B0, 0x7A66, 0x434C, 0x0110, +0x1840, 0x43B2, 0x3C02, 0x1840, 0x43C2, 0x3D29, 0x43C2, 0x0921, 0x0110, +0x3FEC, 0x4303, 0x140A, 0x008A, 0x30AE, 0x0A0C, 0x03DC, 0x2402, 0x13B0, +0x855C, 0x1800, 0x43CA, 0x0000, 0x43BA, 0xFFFE, 0x43DA, 0x0007, 0x00AA, +0x000A, 0x009A, 0x30D6, 0x23EF, 0x160A, 0x0110, 0x8031, 0x000A, 0x4C0F, +0x410C, 0x530C, 0x008E, 0x33BC, 0x008D, 0x0005, 0x13B0, 0x807A, 0x4F0C, +0x410E, 0x530E, 0x403D, 0x0005, 0x13B0, 0x80BC, 0x5031, 0x000A, 0x0110, +0x008F, 0x3BEA, 0x1800, 0x4FDC, 0x0008, 0x0000, 0x4F1E, 0x0004, 0x8F1E, +0x0008, 0x531E, 0x4E8D, 0x0000, 0x0F3E, 0x0004, 0x00AE, 0x0004, 0x0E7F, +0x0008, 0x431C, 0x0110, 0x431E, 0x430F, 0x008D, 0x4400, 0x430C, 0x13B0, +0x7DE4, 0x403E, 0x22FE, 0x430F, 0x008D, 0x4404, 0x13B0, 0x7DE4, 0x403E, +0x0040, 0x430F, 0x008D, 0xFF80, 0x0080, 0x7DE4, 0x430F, 0x008E, 0x3BEA, +0x13B0, 0x842C, 0x2C02, 0x433F, 0x3C0B, 0x0E3D, 0x0008, 0x4DEC, 0x0000, +0x1800, 0x53DE, 0x0008, 0x13B0, 0x842C, 0x2C01, 0x431F, 0x4F0C, 0x0110, +0x907C, 0x0040, 0x240F, 0x430F, 0x008E, 0x30B3, 0x9CCE, 0x0000, 0x2006, +0x13B0, 0x8388, 0x184B, 0x43DF, 0x30B5, 0x3C03, 0x13B0, 0x844A, 0x3BF4, +0x431C, 0x0110, 0x907C, 0x0040, 0x240F, 0x430F, 0x008E, 0x30B3, 0x9CCE, +0x0000, 0x2006, 0x13B0, 0x8388, 0x184B, 0x43CF, 0x30B5, 0x3C03, 0x13B0, +0x844A, 0x3BF4, 0x431C, 0x0110, 0xF0B2, 0xFFE0, 0x0500, 0x4292, 0x0500, +0x0500, 0x40B2, 0x1FC0, 0x0510, 0xD392, 0x0508, 0x1800, 0x40F2, 0x7A08, +0x3BD8, 0x1800, 0x40F2, 0x7A08, 0x3BDC, 0x0110, 0x425E, 0x092F, 0x13B0, +0x8396, 0xCFC2, 0x092F, 0x4E4C, 0xFF0C, 0x0110, 0xDCC2, 0x092E, 0x0110, +0x425E, 0x092E, 0x13B0, 0x8396, 0xCFC2, 0x092E, 0x3FF3, 0x4303, 0x13B0, +0x7A90, 0x1840, 0x42D2, 0x2382, 0x3D16, 0x13B0, 0x7A7E, 0x1840, 0x93D2, +0x3D16, 0x2402, 0x434E, 0x3C01, 0x435E, 0x1840, 0x4EC2, 0x3D2B, 0x434C, +0x0110, 0x435E, 0x1840, 0x5B5E, 0x31F4, 0xF35E, 0x1840, 0x4ECB, 0x31F4, +0x4A4A, 0x1840, 0x8A8B, 0x31EE, 0x1800, 0x5ACB, 0x31F0, 0x1840, 0x4ACB, +0x31F6, 0x0110, 0x4D4D, 0x064D, 0x0CED, 0x0D0E, 0x008D, 0x3BEA, 0x0E7D, +0x0000, 0x4E6F, 0x0FEE, 0x0E7D, 0x0004, 0x0D0F, 0x00AF, 0x0004, 0x0F7D, +0x0008, 0x430C, 0x0110, 0x0C60, 0x3C06, 0x421F, 0x2386, 0x1840, 0x9F82, +0x3C02, 0x2805, 0x1840, 0x4F82, 0x3C02, 0x434E, 0x3C01, 0x435E, 0x1840, +0x4EC2, 0x3D18, 0x0080, 0x70EA, 0x141B, 0x8321, 0x4C0B, 0x433C, 0x930B, +0x2409, 0x410A, 0x530A, 0x0ACC, 0x13B0, 0x7B3E, 0x933C, 0x2402, 0x533B, +0x23F9, 0x5321, 0x161A, 0x0110, 0x403E, 0x003D, 0x430F, 0x008D, 0x1800, +0x13B0, 0x83D8, 0x008D, 0x187C, 0x13B0, 0x7DE4, 0x403E, 0x0A00, 0x430F, +0x028D, 0x3000, 0x0080, 0x7DE4, 0x403E, 0x003D, 0x430F, 0x008D, 0x1880, +0x13B0, 0x83D8, 0x008D, 0x18FC, 0x13B0, 0x7DE4, 0x403E, 0x2B00, 0x430F, +0x008D, 0x8A00, 0x0080, 0x7DE4, 0x934C, 0x200E, 0x13B0, 0x5148, 0x903C, +0x0092, 0x2009, 0x434C, 0x13B0, 0x6B62, 0x13B0, 0x7700, 0x13B0, 0x79D8, +0x13B0, 0x76BC, 0x435C, 0x0110, 0x403E, 0x003D, 0x430F, 0x008D, 0x1980, +0x13B0, 0x83D8, 0x008D, 0x19FC, 0x13B0, 0x7DE4, 0x403E, 0x1000, 0x430F, +0x028D, 0x1000, 0x0080, 0x7DE4, 0x008E, 0x327C, 0x4E5F, 0x0001, 0x0FEF, +0x1840, 0x438F, 0x327E, 0x4E6F, 0x0FEF, 0x1840, 0x4C8F, 0x3284, 0x4E6F, +0x1840, 0xD3DF, 0x3282, 0x0110, 0xC3A2, 0x0380, 0xC3A2, 0x03C0, 0xC3A2, +0x0340, 0x1800, 0x40F2, 0x856A, 0x3000, 0x1800, 0x40F2, 0x84FC, 0x3004, +0x1840, 0x4392, 0x3BE8, 0x0110, 0x1800, 0x40F2, 0x5D16, 0x3000, 0x1800, +0x40F2, 0x8568, 0x3004, 0xD3A2, 0x0380, 0xD3A2, 0x03C0, 0xD3A2, 0x0340, +0x1840, 0x4382, 0x3BE8, 0x0110, 0x8321, 0x13B0, 0x7EE0, 0x40B2, 0x9628, +0x0900, 0xD0B2, 0x0400, 0x0908, 0xF0B2, 0xFFF9, 0x0908, 0x40B2, 0x9600, +0x0900, 0x5321, 0x0110, 0x4C82, 0x0154, 0x4E0C, 0xDF0C, 0x930C, 0x2408, +0x4DB2, 0x0152, 0x533E, 0x633F, 0x4E0C, 0xDF0C, 0x930C, 0x23F8, 0x421C, +0x0154, 0x0110, 0x140A, 0x4C0A, 0x13B0, 0x7700, 0x008F, 0x33BC, 0x4A8F, +0x0000, 0x438F, 0x0006, 0x1800, 0x43CF, 0x0002, 0x439F, 0x0008, 0x160A, +0x0110, 0x1202, 0xC232, 0x4303, 0x4C82, 0x04D0, 0x4D82, 0x04D2, 0x4E82, +0x04E0, 0x4F82, 0x04E2, 0x421C, 0x04E4, 0x421D, 0x04E6, 0x4132, 0x0110, +0x13B0, 0x7A90, 0x90B2, 0x0080, 0x2382, 0x2C06, 0x42D2, 0x2382, 0x093F, +0x13B0, 0x7A7E, 0x3C02, 0x13B0, 0x7A66, 0x434C, 0x0110, 0x141B, 0x0CCA, +0x3C06, 0x4DFA, 0x0000, 0x00AA, 0x0001, 0x533E, 0x633F, 0x4E0B, 0xDF0B, +0x930B, 0x23F6, 0x161A, 0x0110, 0x141B, 0x0CCA, 0x3C06, 0x4DCA, 0x0000, +0x00AA, 0x0001, 0x533E, 0x633F, 0x4E0B, 0xDF0B, 0x930B, 0x23F6, 0x161A, +0x0110, 0x936C, 0x2C0B, 0x13B0, 0x8420, 0x1840, 0x938C, 0x33A0, 0x2005, +0x13B0, 0x8252, 0x1840, 0xC3EC, 0x339C, 0x430C, 0x0110, 0xD0F2, 0x0010, +0x093C, 0x43C2, 0x0923, 0x1840, 0x93D2, 0x3D29, 0x2002, 0x0080, 0x70EA, +0xD2F2, 0x0920, 0x0110, 0x4381, 0x0004, 0x3C05, 0x411F, 0x0004, 0x531F, +0x4F81, 0x0004, 0x90B1, 0x09C4, 0x0004, 0x2BF7, 0x0110, 0x9392, 0x2382, +0x2006, 0x1840, 0x43D2, 0x3D2C, 0x13B0, 0x7A7E, 0x3C02, 0x13B0, 0x7A66, +0x434C, 0x0110, 0x40F2, 0x00A5, 0x0121, 0x421F, 0x012E, 0xF0B2, 0xCC88, +0x012E, 0x421E, 0x0124, 0x421D, 0x0126, 0x0110, 0x1840, 0x9382, 0x3BE8, +0x2008, 0x1800, 0x40F2, 0x5D16, 0x3000, 0x1800, 0x40F2, 0x84FC, 0x3004, +0x0110, 0x9392, 0x2382, 0x2006, 0x1840, 0x43C2, 0x3D2C, 0x13B0, 0x7A7E, +0x3C02, 0x13B0, 0x7A66, 0x434C, 0x0110, 0x140A, 0x8321, 0x4C0A, 0x4A81, +0x0000, 0x410D, 0x530D, 0x435C, 0x13B0, 0x8566, 0x3FF8, 0x4303, 0x120C, +0x432D, 0x410C, 0x530C, 0x13B0, 0x60A0, 0x5321, 0x0110, 0x124C, 0x431D, +0x3FF7, 0x4303, 0x1800, 0x124C, 0x4EFC, 0x0000, 0x00AC, 0x0001, 0x00BD, +0x0001, 0x23F9, 0x1800, 0x417C, 0x0110, 0xB0B2, 0x0040, 0x0144, 0x2804, +0x40B2, 0xA540, 0x0144, 0x0110, 0x40B2, 0xA580, 0x0146, 0x0110, 0x008F, +0x33BC, 0x438F, 0x0000, 0x438F, 0x0006, 0x1800, 0x43CF, 0x0002, 0x438F, +0x0008, 0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, 0x3C04, 0x43CC, 0x0000, +0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, 0x1840, 0x425D, 0x2382, 0x1840, +0x425C, 0x2384, 0x13B0, 0x8504, 0x13B0, 0x7A7E, 0x434C, 0x0110, 0x13B0, +0x81EA, 0x934C, 0x2006, 0x008C, 0xFFFE, 0x13B0, 0x6922, 0x430C, 0x0110, +0x431C, 0x0110, 0x0C60, 0x3C0A, 0x1840, 0x4292, 0x2386, 0x3C04, 0x1840, +0x43E2, 0x3D29, 0x0080, 0x84E4, 0x40B2, 0xA500, 0x0146, 0xB0B2, 0x0040, +0x0144, 0x2803, 0x40B2, 0xA540, 0x0144, 0x0110, 0x13B0, 0x7A94, 0x1800, +0x40F2, 0x3CDC, 0x30D4, 0x1800, 0x43C2, 0x3CF4, 0x430C, 0x0110, 0x936C, +0x2C07, 0x13B0, 0x8420, 0x1840, 0x43CC, 0x339C, 0x13B0, 0x830A, 0x430C, +0x0110, 0x1800, 0x124C, 0x4EBC, 0x0000, 0x03EC, 0x00BD, 0x0001, 0x23FA, +0x1800, 0x417C, 0x0110, 0x936C, 0x2C07, 0x13B0, 0x8420, 0x13B0, 0x8252, +0x1840, 0x43EC, 0x339C, 0x430C, 0x0110, 0x936C, 0x2C07, 0x13B0, 0x8420, +0x1840, 0x43DC, 0x339C, 0x13B0, 0x830A, 0x430C, 0x0110, 0x1800, 0x124C, +0x4EBC, 0x0000, 0x532C, 0x831D, 0x23FB, 0x1800, 0x417C, 0x0110, 0x13B0, +0x7A90, 0x1840, 0x42D2, 0x2384, 0x3D17, 0x13B0, 0x7A7E, 0x434C, 0x0110, +0x1800, 0x124C, 0x438C, 0x0000, 0x532C, 0x831E, 0x23FB, 0x1800, 0x417C, +0x0110, 0x13B0, 0x7A94, 0x13B0, 0x804E, 0x13B0, 0x8148, 0x1380, 0x3C54, +0x0080, 0x6F36, 0x13B0, 0x8282, 0x4F5E, 0x0001, 0x13B0, 0x8282, 0x4CCF, +0x0001, 0x4E4C, 0x0110, 0x930E, 0x2406, 0x4DFC, 0x0000, 0x00AC, 0x0001, +0x533E, 0x23FA, 0x430C, 0x0110, 0x13B0, 0x6E54, 0x934C, 0x2004, 0x13B0, +0x5670, 0x13B0, 0x5656, 0x435C, 0x0110, 0x008F, 0x4100, 0x438F, 0x0000, +0x03EF, 0x009F, 0x4200, 0x23FA, 0x0110, 0x140A, 0x411A, 0x0008, 0x120A, +0x1380, 0x3C14, 0x5321, 0x160A, 0x0110, 0x0B0F, 0x4F1F, 0x0008, 0x533F, +0x0FEF, 0x0FCD, 0x0FEF, 0x0DEF, 0x0110, 0x120D, 0x120C, 0x422D, 0x410C, +0x530C, 0x13B0, 0x60A0, 0x5221, 0x0110, 0x13B0, 0x7CEA, 0x921C, 0x18FA, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x13B0, 0x7910, 0x921C, 0x197A, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x907D, 0x000A, 0x2C03, 0x507D, +0x0030, 0x0110, 0x507D, 0x0037, 0x0110, 0x13B0, 0x8514, 0x921C, 0x197A, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x1203, 0x1230, 0x0003, 0x435E, +0x13B0, 0x6EC6, 0x4C4C, 0x5221, 0x0110, 0x13B0, 0x7B14, 0x921C, 0x4402, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x4A0C, 0x430D, 0x4A0E, 0x430F, +0x5E0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x0110, 0x13B0, 0x7D32, 0x921C, 0x19FA, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x13B0, 0x7CC6, 0x921C, 0x187A, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x434C, 0x13B0, 0x80A6, 0x435C, +0x13B0, 0x8064, 0x3FFF, 0x4303, 0xF0B2, 0xFF88, 0x012C, 0x4F82, 0x012E, +0x43C2, 0x0121, 0x0110, 0x5D0D, 0x1840, 0x4D8C, 0x339E, 0x1840, 0x4D8C, +0x33A0, 0x0110, 0x073E, 0x010C, 0x13B0, 0x8414, 0x9FDE, 0x0004, 0x0003, +0x0110, 0x53DA, 0x0001, 0x93CA, 0x0001, 0x2402, 0x43CA, 0x0001, 0x0110, +0x1840, 0x425F, 0x327C, 0x064F, 0x1800, 0x4F5F, 0x3388, 0x0110, 0x1840, +0x9382, 0x33C4, 0x2002, 0x430C, 0x0110, 0x431C, 0x0110, 0x403F, 0x967E, +0x403E, 0x0098, 0x533F, 0x633E, 0x2FFD, 0x0110, 0x403F, 0x967E, 0x403E, +0x0098, 0x533F, 0x633E, 0x2FFD, 0x0110, 0x13B0, 0x8148, 0x13B0, 0x79D8, +0x13B0, 0x7700, 0x0080, 0x76BC, 0x1840, 0x4382, 0x33C6, 0x1840, 0xD3D2, +0x3396, 0x0110, 0x0CCE, 0x008C, 0x3C10, 0x008D, 0x001C, 0x0080, 0x807A, +0x1840, 0x421C, 0x187C, 0x1840, 0x421D, 0x187E, 0x0110, 0x1840, 0x421C, +0x1980, 0x1840, 0x421D, 0x1982, 0x0110, 0x1840, 0x438C, 0x339E, 0x1840, +0x438C, 0x33A0, 0x0110, 0x1840, 0x421C, 0x18FC, 0x1840, 0x421D, 0x18FE, +0x0110, 0x1840, 0x421C, 0x19FC, 0x1840, 0x421D, 0x19FE, 0x0110, 0x1840, +0x421C, 0x1800, 0x1840, 0x421D, 0x1802, 0x0110, 0x1840, 0x421C, 0x1900, +0x1840, 0x421D, 0x1902, 0x0110, 0x430C, 0x008E, 0x3BEA, 0x0E3D, 0x0008, +0xB35D, 0x0110, 0xD0F2, 0x0020, 0x0245, 0xC0F2, 0x0020, 0x0243, 0x0110, +0x1840, 0x4F1E, 0x31DC, 0x1840, 0x4F1F, 0x31DE, 0x0110, 0xD0F2, 0x0020, +0x0245, 0xD0F2, 0x0020, 0x0243, 0x0110, 0xE03F, 0x8000, 0x0FEF, 0x0FCE, +0x064F, 0x0EEF, 0x0110, 0x431F, 0x535C, 0x835C, 0x3002, 0x18CC, 0x5F0F, +0x0110, 0x1840, 0x421C, 0x197C, 0x1840, 0x421D, 0x197E, 0x0110, 0x1840, +0x4392, 0x33C6, 0x1840, 0xC3D2, 0x3396, 0x0110, 0x13B0, 0x7542, 0x2802, +0x430C, 0x430D, 0x0110, 0x435C, 0x13B0, 0x8064, 0x434C, 0x0080, 0x80A6, +0x430C, 0x13B0, 0x7DE4, 0x432E, 0x430F, 0x0110, 0x008C, 0x3D21, 0x13B0, +0x8022, 0x434C, 0x0110, 0x434C, 0x13B0, 0x8064, 0x435C, 0x0080, 0x80A6, +0x1840, 0x40B2, 0x0032, 0x3398, 0x0080, 0x6266, 0x13B0, 0x8454, 0xC0B2, +0x0010, 0x012C, 0x0110, 0x466F, 0x064F, 0x1800, 0x4F5F, 0x323A, 0x0110, +0x4C4C, 0x064C, 0x0CCF, 0x0CEC, 0x0FEC, 0x0110, 0x1800, 0x9EDE, 0x0008, +0x0004, 0x0110, 0x13B0, 0x842C, 0x2C01, 0x431C, 0x0110, 0x1800, 0x4F5B, +0x3204, 0x03DB, 0x0110, 0x531F, 0x00AE, 0x000A, 0x922F, 0x0110, 0xB0B2, +0x0010, 0x012C, 0x2BFC, 0x0110, 0x13B0, 0x8416, 0x93CF, 0x0002, 0x0110, +0x13B0, 0x83C0, 0x0B3F, 0x0010, 0x0FC0, 0x407D, 0x0093, 0x4A6C, 0x0B0F, +0x0FC0, 0x4B6F, 0x1840, 0xB3DF, 0x3282, 0x0110, 0x1840, 0x4382, 0x3BE0, +0x0110, 0x1840, 0x421C, 0x33B6, 0x0110, 0x1840, 0x421C, 0x18F8, 0x0110, +0x1840, 0x421C, 0x3238, 0x0110, 0x430D, 0x0A3F, 0x0014, 0x0FC0, 0x1840, +0x93C2, 0x3D2A, 0x0110, 0x1840, 0x4392, 0x3BE0, 0x0110, 0x13B0, 0x726E, +0x435C, 0x0110, 0x13B0, 0x8564, 0x435C, 0x0110, 0x13B0, 0x856C, 0x435C, +0x0110, 0x1840, 0x421C, 0x33B4, 0x0110, 0x403C, 0x001D, 0x0110, 0x43C2, +0x0923, 0x0110, 0x0B3F, 0x0004, 0x0FC0, 0xDCC2, 0x092F, 0x0110, 0xD392, +0x0700, 0x0110, 0x0020, 0x3C30, 0x430C, 0x0110, 0x434C, 0x0110, 0x430C, +0x0110, 0x430C, 0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x434C, 0x0110, +0x430C, 0x0110, 0x0080, 0x79D8, 0x435C, 0x0110, 0x430C, 0x0110, 0x430C, +0x0110, 0x435C, 0x0110, 0x430C, 0x0110, 0x435C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, +0x0110, 0x0080, 0x7E6A, 0x0080, 0x8560, 0x0080, 0x64AE, 0x0080, 0x7F62, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0282, 0x0201, 0x1C80, 0x1CC0, +0x1D00, 0x1D40, 0x1D80, 0x1DC0, 0x0484, 0x0203, 0x1E80, 0x1EC0, 0x1F00, +0x1F40, 0x1F80, 0x1FC0, 0x21A1, 0x0000, 0x0000, 0x0007, 0x00FF, 0x71B6, +0x0000, 0x2021, 0x0000, 0x0000, 0x0007, 0x00FF, 0x83E4, 0x0000, 0x2221, +0xFFFF, 0x0000, 0x0000, 0x00CF, 0x7FF2, 0x0000, 0x21A1, 0x0000, 0x0002, +0x0007, 0x00FF, 0x71B6, 0x0000, 0x2021, 0x0000, 0x0002, 0x0007, 0x00FF, +0x83E4, 0x0000, 0x2221, 0xFFFF, 0x0002, 0x0000, 0x00CF, 0x7FF2, 0x0000, +0x0100, 0x0001, 0x0000, 0x0000, 0x00FF, 0x7F48, 0x0000, 0x0102, 0x0000, +0x00FF, 0x0000, 0x00F7, 0x6C6A, 0x0000, 0x0880, 0x0000, 0x0000, 0x0001, +0x00FF, 0x5F6A, 0x0000, 0x0680, 0x01FF, 0xFFFF, 0xFFFF, 0x00D0, 0x5F56, +0x0000, 0x0680, 0x02FF, 0xFFFF, 0xFFFF, 0x00D0, 0x5F42, 0x0000, 0x0680, +0x03FF, 0xFFFF, 0xFFFF, 0x00D0, 0x5ED4, 0x0000, 0x0A81, 0x0000, 0xFFFF, +0x0001, 0x00F3, 0x5ED0, 0x0000, 0x0080, 0x0000, 0x0000, 0x0002, 0x00FF, +0x5EA4, 0x0000, 0x0081, 0x0000, 0x00FF, 0x0002, 0x00F7, 0x5EA0, 0x0000, +0x0082, 0x0000, 0x00FF, 0x0002, 0x00F7, 0x5E4A, 0x0000, 0x0500, 0x00FF, +0x0000, 0x0000, 0x00DF, 0x7E4A, 0x0000, 0x0900, 0x00FF, 0x0000, 0x0000, +0x00DF, 0x7C08, 0x0000, 0x0300, 0x00FF, 0x0000, 0x0000, 0x00DF, 0x7EFA, +0x0000, 0x0302, 0x00FF, 0x00FF, 0x0000, 0x00D7, 0x786E, 0x0000, 0x0B01, +0x00FF, 0x00FF, 0x0000, 0x00D7, 0x80D0, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0x0000, 0x7A70, 0x0000, 0x1980, 0x0000, 0x19FF, 0x0000, 0x1900, +0x0000, 0x197F, 0x0000, 0x1880, 0x0000, 0x18FF, 0x0000, 0x1800, 0x0000, +0x187F, 0x0000, 0xE000, 0x0000, 0xFDFF, 0x0000, 0x0000, 0x0001, 0xDFFF, +0x0001, 0x8A00, 0x0000, 0xDFFF, 0x0000, 0x3000, 0x0002, 0x43FF, 0x0002, +0x1000, 0x0002, 0x2FFF, 0x0002, 0x0200, 0x0112, 0x0200, 0x02EF, 0x0801, +0x2047, 0x0013, 0x0200, 0x0201, 0x0103, 0x0209, 0x008D, 0x0104, 0x8004, +0x0832, 0x000B, 0x0202, 0x0102, 0x0905, 0x0004, 0x0100, 0x0202, 0x0501, +0x2405, 0x1000, 0x0501, 0x0124, 0x0100, 0x2404, 0x0202, 0x2405, 0x0006, +0x0701, 0x8105, 0x4003, 0xFF00, 0x0409, 0x0001, 0x0A02, 0x0000, 0x0700, +0x0205, 0x4002, 0xFF00, 0x0507, 0x0282, 0x0040, 0x08FF, 0x020B, 0x0202, +0x0102, 0x0906, 0x0204, 0x0100, 0x0202, 0x0601, 0x2405, 0x1000, 0x0501, +0x0124, 0x0300, 0x2404, 0x0202, 0x2405, 0x0206, 0x0703, 0x8305, 0x4003, +0xFF00, 0x0409, 0x0003, 0x0A02, 0x0000, 0x0700, 0x0405, 0x4002, 0xFF00, +0x0507, 0x0284, 0x0040, 0x04FF, 0x0903, 0x2404, 0x5403, 0x6500, 0x7800, +0x6100, 0x7300, 0x2000, 0x4900, 0x6E00, 0x7300, 0x7400, 0x7200, 0x7500, +0x6D00, 0x6500, 0x6E00, 0x7400, 0x7300, 0x2200, 0x4D03, 0x5300, 0x5000, +0x2000, 0x5400, 0x6F00, 0x6F00, 0x6C00, 0x7300, 0x2000, 0x4400, 0x7200, +0x6900, 0x7600, 0x6500, 0x7200, 0x0400, 0x3003, 0x1600, 0x4D03, 0x5300, +0x5000, 0x3400, 0x3300, 0x3000, 0x2000, 0x5500, 0x5300, 0x4200, 0x2800, +0x4D03, 0x5300, 0x5000, 0x2000, 0x4400, 0x6500, 0x6200, 0x7500, 0x6700, +0x2000, 0x4900, 0x6E00, 0x7400, 0x6500, 0x7200, 0x6600, 0x6100, 0x6300, +0x6500, 0x2A00, 0x4D03, 0x5300, 0x5000, 0x2000, 0x4100, 0x7000, 0x7000, +0x6C00, 0x6900, 0x6300, 0x6100, 0x7400, 0x6900, 0x6F00, 0x6E00, 0x2000, +0x5500, 0x4100, 0x5200, 0x5400, 0x0500, 0x0082, 0x0000, 0x0000, 0x0201, +0x0403, 0x0605, 0x0807, 0x5D16, 0x0000, 0x8568, 0x0000, 0x6DE0, 0x0000, +0x591C, 0x0000, 0x7F8A, 0x0000, 0x60A0, 0x0000, 0x7F7A, 0x0000, 0x817E, +0x0000, 0x7C56, 0x0000, 0x6FA6, 0x0000, 0x7974, 0x0000, 0x810C, 0x0000, +0x7B3E, 0x0000, 0x749A, 0x0000, 0x6D6A, 0x0000, 0x7AEA, 0x0000, 0x7CA2, +0x0000, 0x8120, 0x0000, 0x80A6, 0x0000, 0x8064, 0x0000, 0x8090, 0x0000, +0x7EA6, 0x0000, 0x78DC, 0x0000, 0x81D8, 0x0000, 0x6CEC, 0x0000, 0x78A6, +0x0000, 0x8544, 0x0000, 0x8528, 0x0000, 0x852C, 0x0000, 0x853C, 0x0000, +0x8570, 0x0000, 0x8574, 0x0000, 0x8576, 0x0000, 0x857E, 0x0000, 0x857C, +0x0000, 0x8550, 0x0000, 0x852C, 0x0000, 0x852C, 0x0000, 0x8570, 0x0000, +0x0000, 0x0000, 0x6ADC, 0x0000, 0x4962, 0x0000, 0x6EC6, 0x0000, 0xFFFF, +0xFFFF, 0x0000, 0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0100, +0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0000, +0x0100, 0x3CDC, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0x4784, 0x474E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x45B0, +0xFFFF, 0xFFFF, 0x443C, 0x46FC, 0x467E, 0xFFFF, 0xFFFF, 0x4776, 0xFFFF, +0xFFFF, 0x4730, 0xFFFF, 0x4682, 0x46CA, 0x4406, +}; + +const uint32_t eZ_FetCoreImage_address[] = +{ +0x00004400, 0x0000FF80, +}; +const uint32_t eZ_FetCoreImage_length_of_sections[] = +{ +0x00002300, 0x00000040, +}; +const uint32_t eZ_FetCoreImage_sections = 0x00000002; +const uint32_t eZ_FetCoreImage_termination = 0x00000000; +const uint32_t eZ_FetCoreImage_start = 0x00004400; +const uint32_t eZ_FetCoreImage_finish = 0x00010000; +const uint32_t eZ_FetCoreImage_length = 0x0000BC00; + +#define EZ_FETCOREIMAGE_TERMINATION 0x00000000 +#define EZ_FETCOREIMAGE_START 0x00004400 +#define EZ_FETCOREIMAGE_FINISH 0x00010000 +#define EZ_FETCOREIMAGE_LENGTH 0x0000BC00 +#define EZ_FETCOREIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/eZ_FetDcdc.h b/Bios/include/eZ_FetDcdc.h new file mode 100644 index 0000000..4ddd0f1 --- /dev/null +++ b/Bios/include/eZ_FetDcdc.h @@ -0,0 +1,316 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetDcdcImage[] = +{ +0x3E84, 0x0002, 0x0005, 0x0005, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8D7B, 0xABBA, +0xABBA, 0x145B, 0x8031, 0x0010, 0x0CCB, 0x4D08, 0x430C, 0x4039, 0x000A, +0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0008, 0x4381, 0x000A, 0x430A, +0x1840, 0x9E82, 0x43B2, 0x2006, 0x1840, 0x9392, 0x43E6, 0x2002, 0x430C, +0x3CD3, 0x1840, 0x4E82, 0x43B2, 0x1840, 0x4382, 0x43E6, 0x430A, 0x3C16, +0x411E, 0x0004, 0x411F, 0x0006, 0x531E, 0x630F, 0x4E81, 0x0004, 0x4F81, +0x0006, 0x9381, 0x0006, 0x2BF3, 0x2004, 0x90B1, 0x4000, 0x0004, 0x2BEE, +0xC0F2, 0x0020, 0x0243, 0x531A, 0x980A, 0x2CA8, 0x4A0F, 0x0FEF, 0x0BEF, +0x4F26, 0x9306, 0x2002, 0x4039, 0x0032, 0x9226, 0x2002, 0x4039, 0x0014, +0xD0F2, 0x0020, 0x0243, 0x460D, 0x403C, 0x0003, 0x13B2, 0x3476, 0x930C, +0x2002, 0x433C, 0x3C9B, 0x4381, 0x0000, 0x4381, 0x0002, 0x3C09, 0x412E, +0x411F, 0x0002, 0x531E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x9381, +0x0002, 0x2BF4, 0x2004, 0x90B1, 0x4000, 0x0000, 0x2BEF, 0x4381, 0x0000, +0x4381, 0x0002, 0x3C09, 0x412E, 0x411F, 0x0002, 0x531E, 0x630F, 0x4E81, +0x0000, 0x4F81, 0x0002, 0x9381, 0x0002, 0x2BF4, 0x2004, 0x90B1, 0x4000, +0x0000, 0x2BEF, 0x4381, 0x0000, 0x4381, 0x0002, 0x3C09, 0x412E, 0x411F, +0x0002, 0x531E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x9381, 0x0002, +0x2BF4, 0x2004, 0x90B1, 0x4000, 0x0000, 0x2BEF, 0x4381, 0x0000, 0x4381, +0x0002, 0x3C09, 0x412E, 0x411F, 0x0002, 0x531E, 0x630F, 0x4E81, 0x0000, +0x4F81, 0x0002, 0x9381, 0x0002, 0x2BF4, 0x2004, 0x90B1, 0x4000, 0x0000, +0x2BEF, 0x490E, 0x410D, 0x523D, 0x410C, 0x503C, 0x000C, 0x13B2, 0x32D6, +0x411E, 0x000C, 0x411F, 0x000E, 0x4A0D, 0x0DED, 0x0DCC, 0x064D, 0x0CED, +0x1840, 0x4E8D, 0x43B8, 0x1840, 0x4F8D, 0x43BA, 0x411E, 0x0008, 0x411F, +0x000A, 0x4A0D, 0x0DED, 0x0DCC, 0x064D, 0x0CED, 0x1840, 0x4E8D, 0x43B4, +0x1840, 0x4F8D, 0x43B6, 0x4A0F, 0x0FEF, 0x0FCE, 0x064F, 0x0EEF, 0x1840, +0x468F, 0x43BC, 0x430D, 0x403C, 0x0003, 0x13B2, 0x3476, 0x4381, 0x0004, +0x4381, 0x0006, 0x3F4A, 0x930C, 0x2005, 0x1840, 0x4382, 0x43E6, 0x433C, +0x3C04, 0x1840, 0x4392, 0x43E6, 0x430C, 0x5031, 0x0010, 0x1656, 0x0110, +0x1840, 0x4C82, 0x43F8, 0x903C, 0xAAAA, 0x2406, 0x903C, 0xAAAC, 0x2403, +0x903C, 0xAAAD, 0x205E, 0xC0F2, 0x0010, 0x0245, 0xD0F2, 0x0020, 0x0245, +0xC0F2, 0x0020, 0x0243, 0xC0F2, 0x0080, 0x0245, 0xC0F2, 0x0080, 0x0243, +0xD0F2, 0x0040, 0x0245, 0x403F, 0x49EE, 0x4303, 0x432E, 0x533F, 0x633E, +0x2FFD, 0xC0F2, 0x0040, 0x0243, 0x403F, 0x49EE, 0x4303, 0x432E, 0x533F, +0x633E, 0x2FFD, 0xD0F2, 0x0040, 0x0243, 0xC0F2, 0x0040, 0x0245, 0x40F2, +0x0003, 0x022A, 0x403F, 0x05E0, 0x0F60, 0x43E8, 0x1800, 0x40F2, 0x05FD, +0x43EC, 0x1800, 0x40F2, 0x05EE, 0x43F0, 0x1800, 0x40F2, 0x05EC, 0x43F4, +0x4F0E, 0xD3DE, 0x0000, 0x40F2, 0x000F, 0x05E1, 0x40FF, 0x0081, 0x0000, +0x40F2, 0x00C8, 0x05E6, 0x43C2, 0x05E7, 0x40B2, 0x0048, 0x05F2, 0x40FF, +0x0080, 0x0000, 0x403F, 0x49EE, 0x4303, 0x432E, 0x533F, 0x633E, 0x2FFD, +0x1840, 0x4382, 0x43B2, 0x1840, 0x4382, 0x43E6, 0x0110, 0x903C, 0xAAAB, +0x2003, 0x403C, 0xAAAB, 0x0110, 0x903C, 0xBBBB, 0x2405, 0x903C, 0xBBBC, +0x2001, 0x0110, 0x433C, 0x0110, 0x145B, 0x8221, 0x430F, 0x438C, 0x0000, +0x438C, 0x0002, 0x438D, 0x0000, 0x438D, 0x0002, 0x1840, 0x421B, 0x43F8, +0x903B, 0xAAAC, 0x240C, 0x903B, 0xAAAA, 0x2409, 0x903B, 0xBBBB, 0x2406, +0x903B, 0xBBBC, 0x2403, 0x903B, 0xAAAD, 0x204E, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x3C1F, 0x412A, 0x411B, 0x0002, 0x531A, 0x630B, 0x4A81, +0x0000, 0x4B81, 0x0002, 0x9381, 0x0002, 0x2004, 0x90B1, 0x4000, 0x0000, +0x2BF0, 0x421A, 0x0410, 0x4218, 0x0350, 0x8908, 0x588D, 0x0000, 0x638D, +0x0002, 0x860A, 0x5A8C, 0x0000, 0x638C, 0x0002, 0x531F, 0x9E0F, 0x2C1C, +0xD0B2, 0x0026, 0x0340, 0x4216, 0x0410, 0x4219, 0x0350, 0xC3A2, 0x0700, +0x40F2, 0x0011, 0x0710, 0xD3A2, 0x0700, 0xC392, 0x070A, 0xD392, 0x0700, +0xB392, 0x070A, 0x2BFD, 0xC392, 0x070A, 0x4381, 0x0000, 0x4381, 0x0002, +0x3FCC, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x5221, 0x1656, 0x0110, 0x8321, 0x403F, 0x2710, +0x002E, 0x43E8, 0xB2EE, 0x0000, 0x2803, 0x533F, 0x930F, 0x23F8, 0x930F, +0x2002, 0x430C, 0x3C51, 0x002F, 0x43E8, 0xC0FF, 0x0010, 0x0000, 0x002F, +0x43E8, 0xD3EF, 0x0000, 0x403F, 0x2710, 0x002E, 0x43EC, 0xB3DE, 0x0000, +0x2C03, 0x533F, 0x930F, 0x23F8, 0x930F, 0x2002, 0x430C, 0x3C3A, 0x002F, +0x43EC, 0xC3DF, 0x0000, 0x002F, 0x43F4, 0x1840, 0x4FE1, 0x0000, 0x002F, +0x43E8, 0xD2EF, 0x0000, 0x403F, 0x2710, 0x002E, 0x43E8, 0xB2EE, 0x0000, +0x2803, 0x533F, 0x930F, 0x23F8, 0x930F, 0x2002, 0x430C, 0x3C1F, 0x403F, +0x2710, 0x002E, 0x43EC, 0xB3DE, 0x0000, 0x2C03, 0x533F, 0x930F, 0x23F8, +0x930F, 0x2002, 0x430C, 0x3C11, 0x002F, 0x43F4, 0x1840, 0x4FE1, 0x0001, +0x416E, 0x4E4E, 0xF03E, 0x00FF, 0x108E, 0x415F, 0x0001, 0x4F4F, 0x5F0E, +0x4E8C, 0x0000, 0x431C, 0x5321, 0x0110, 0x8221, 0x4CC1, 0x0000, 0x4D0F, +0x108F, 0xF03F, 0x00FF, 0x4FC1, 0x0001, 0x4DC1, 0x0002, 0x002F, 0x43E8, +0xD0FF, 0x0012, 0x0000, 0x403F, 0x0681, 0x533F, 0x2FFE, 0x002F, 0x43EC, +0xB0FF, 0x0020, 0x0000, 0x2802, 0x430C, 0x3C3C, 0x416E, 0x002F, 0x43F0, +0x4ECF, 0x0000, 0x403F, 0x0681, 0x533F, 0x2FFE, 0x002F, 0x43EC, 0xB0FF, +0x0020, 0x0000, 0x2802, 0x430C, 0x3C2B, 0x415E, 0x0001, 0x002F, 0x43F0, +0x4ECF, 0x0000, 0x403F, 0x0681, 0x533F, 0x2FFE, 0x002F, 0x43EC, 0xB0FF, +0x0020, 0x0000, 0x2802, 0x430C, 0x3C19, 0x415E, 0x0002, 0x002F, 0x43F0, +0x4ECF, 0x0000, 0x403F, 0x2710, 0x002E, 0x43EC, 0xB3EE, 0x0000, 0x2C03, +0x533F, 0x930F, 0x23F8, 0x930F, 0x2002, 0x430C, 0x3C05, 0x002F, 0x43E8, +0xD2EF, 0x0000, 0x431C, 0x5221, 0x0110, 0x008E, 0x4392, 0x1900, 0x40FE, +0x3000, 0x0008, 0x1900, 0x40FE, 0x364A, 0x0000, 0x1900, 0x40FE, 0x365E, +0x0004, 0x1900, 0x40FE, 0x360A, 0x000C, 0x1900, 0x40FE, 0x3636, 0x0010, +0x1900, 0x40FE, 0x31E4, 0x0014, 0x1900, 0x40FE, 0x3596, 0x0018, 0x1900, +0x40FE, 0x3664, 0x001C, 0x008D, 0x0010, 0x13B2, 0x3620, 0x1800, 0x43C2, +0x43E8, 0x1800, 0x43C2, 0x43EC, 0x1800, 0x43C2, 0x43F0, 0x1800, 0x43C2, +0x43F4, 0x1840, 0x4382, 0x43F8, 0x0110, 0x143B, 0x430C, 0x430C, 0x013A, +0x0014, 0x3C24, 0x4C0B, 0x0BEB, 0x0BC8, 0x064B, 0x08EB, 0x1840, 0x9D8B, +0x43BC, 0x201A, 0x4C0B, 0x0BEB, 0x0BC8, 0x064B, 0x08EB, 0x1840, 0x4B9A, +0x43B4, 0x0000, 0x1840, 0x4B9A, 0x43B6, 0x0002, 0x4C0B, 0x0BEB, 0x0BC8, +0x064B, 0x08EB, 0x1840, 0x4B9F, 0x43B8, 0x0000, 0x1840, 0x4B9F, 0x43BA, +0x0002, 0x531C, 0x9E0C, 0x2BDA, 0x1638, 0x0110, 0x151F, 0x160F, 0x0CCE, +0x0FEE, 0x3C04, 0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, +0x403D, 0x5A5A, 0x422C, 0x13B2, 0x3476, 0x930C, 0x2002, 0x433C, 0x0110, +0x430C, 0x0110, 0x1800, 0x124C, 0x4EBC, 0x0000, 0x03EC, 0x00BD, 0x0001, +0x23FA, 0x1800, 0x417C, 0x0110, 0x4C0D, 0x431C, 0x13B2, 0x3476, 0x930C, +0x2002, 0x433C, 0x0110, 0x430C, 0x0110, 0x8321, 0x4381, 0x0000, 0x410C, +0x530C, 0x13B2, 0x33B2, 0x412C, 0x5321, 0x0110, 0x403C, 0x0005, 0x0110, +0x403C, 0x0005, 0x0110, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4180, 0x050A, 0x1840, 0x1204, +0x1840, 0x1205, 0x1840, 0x1206, 0x1840, 0x1207, 0x1840, 0x1208, 0x1840, +0x1209, 0x1840, 0x120A, 0x1840, 0x120B, 0x1840, 0x120C, 0x1840, 0x120D, +0x1840, 0x120E, 0x1840, 0x120F, 0x008C, 0x4392, 0x403E, 0x0068, 0x403F, +0x0000, 0x13B2, 0x35F2, 0x1840, 0x413F, 0x1840, 0x413E, 0x1840, 0x413D, +0x1840, 0x413C, 0x1840, 0x413B, 0x1840, 0x413A, 0x1840, 0x4139, 0x1840, +0x4138, 0x1840, 0x4137, 0x1840, 0x4136, 0x1840, 0x4135, 0x1840, 0x4134, +0x1900, 0x4070, 0x352A, 0x4011, 0x0490, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +}; + +const uint32_t eZ_FetDcdcImage_address[] = +{ +0x00001800, 0x00023000, +}; +const uint32_t eZ_FetDcdcImage_length_of_sections[] = +{ +0x00000040, 0x00000A00, +}; +const uint32_t eZ_FetDcdcImage_sections = 0x00000002; +const uint32_t eZ_FetDcdcImage_termination = 0x00000000; +const uint32_t eZ_FetDcdcImage_start = 0x00001800; +const uint32_t eZ_FetDcdcImage_finish = 0x00024400; +const uint32_t eZ_FetDcdcImage_length = 0x00022C00; + +#define EZ_FETDCDCIMAGE_TERMINATION 0x00000000 +#define EZ_FETDCDCIMAGE_START 0x00001800 +#define EZ_FETDCDCIMAGE_FINISH 0x00024400 +#define EZ_FETDCDCIMAGE_LENGTH 0x00022C00 +#define EZ_FETDCDCIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/eZ_FetDcdcController.h b/Bios/include/eZ_FetDcdcController.h new file mode 100644 index 0000000..a8ae7df --- /dev/null +++ b/Bios/include/eZ_FetDcdcController.h @@ -0,0 +1,83 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetDcdcControllerImage[] = +{ +0x0011, 0x0390, 0x0302, 0x0302, 0x0302, 0x0402, 0x0402, 0x0502, 0x0502, +0x0502, 0x0502, 0x0502, 0x0502, 0x0602, 0x0602, 0x0603, 0x0603, 0x0703, +0x0703, 0x0703, 0x0803, 0x0803, 0x0803, 0x0803, 0x0903, 0x0903, 0xFF03, +0x4031, 0x0300, 0x403C, 0x0200, 0x403D, 0x0003, 0x12B0, 0xE402, 0x12B0, +0xE1AE, 0x12B0, 0xE418, 0x120F, 0x120E, 0xB3E2, 0x0079, 0x2804, 0x43A2, +0x0204, 0x4382, 0x0206, 0x421F, 0x0204, 0x830F, 0x249C, 0x832F, 0x240F, +0x832F, 0x2419, 0x832F, 0x2434, 0x832F, 0x2437, 0x832F, 0x243D, 0x823F, +0x246B, 0x832F, 0x2474, 0x832F, 0x247A, 0x3C8B, 0x425E, 0x007B, 0xF07E, +0x00E0, 0x527E, 0x4EC2, 0x007B, 0xC3E2, 0x0079, 0x42A2, 0x0204, 0x3C7F, +0xD3E2, 0x0078, 0x425E, 0x007C, 0xF07E, 0x00FE, 0x925E, 0xE000, 0x200C, +0xB3D2, 0x007C, 0x2804, 0x40B2, 0x0012, 0x0204, 0x3C02, 0x42B2, 0x0204, +0x43C2, 0x007C, 0x3C05, 0x43F2, 0x007C, 0x40B2, 0x0006, 0x0204, 0xD3D2, +0x007B, 0x3C62, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C5D, 0xC3E2, 0x0078, +0xD2F2, 0x007B, 0x40B2, 0x000A, 0x0204, 0x3C55, 0xD3E2, 0x0078, 0x90B2, +0x0003, 0x0206, 0x2C07, 0x421F, 0x0206, 0x42DF, 0x007C, 0x020D, 0x5392, +0x0206, 0x43C2, 0x007C, 0x90B2, 0x0003, 0x0206, 0x2818, 0x425F, 0x020D, +0x4F4F, 0x4F82, 0x0208, 0x425F, 0x020E, 0x4F4F, 0xF03F, 0x00FF, 0x108F, +0x4F82, 0x020A, 0x425F, 0x020F, 0x4F4F, 0x5F82, 0x020A, 0x40B2, 0x0006, +0x0204, 0x4382, 0x0206, 0x3C02, 0x42B2, 0x0204, 0xD3D2, 0x007B, 0x3C25, +0xD3E2, 0x0078, 0x42D2, 0x1001, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0x3C1A, 0xC3E2, 0x0078, 0xD3D2, 0x007B, 0x40B2, 0x0016, 0x0204, +0x3C12, 0xB3D2, 0x007C, 0x2805, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C0A, +0xD3E2, 0x0078, 0x42D2, 0x1000, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0xC3D2, 0x0079, 0xC0B1, 0x00D0, 0x0004, 0x413E, 0x413F, 0x1300, +0x40B2, 0x5A80, 0x0120, 0xD2E2, 0x0026, 0xF0F2, 0x00F5, 0x0021, 0x40F2, +0x000C, 0x0022, 0x43C2, 0x0027, 0xF0F2, 0x003F, 0x002E, 0xF0F2, 0x003F, +0x0042, 0xF0F2, 0x003F, 0x0029, 0x43C2, 0x002F, 0x40F2, 0x003F, 0x002A, +0x40F2, 0x0021, 0x005B, 0x40F2, 0x002C, 0x005A, 0x42F2, 0x0059, 0x42D2, +0x10F8, 0x0056, 0x42D2, 0x10F9, 0x0057, 0x40B2, 0x0060, 0x0164, 0x42B2, +0x0172, 0x43A2, 0x0174, 0x4034, 0x0224, 0x4305, 0xD0F2, 0x0020, 0x0053, +0x40B2, 0x5A3F, 0x0120, 0xD3D2, 0x0000, 0x43C2, 0x020C, 0x43B2, 0x0208, +0x4382, 0x0204, 0x4382, 0x0206, 0x40F2, 0x00C1, 0x0078, 0x40F2, 0x0070, +0x0079, 0x40F2, 0x00EE, 0x007A, 0xD0F2, 0x0020, 0x007B, 0xC3D2, 0x0078, +0xC3D2, 0x0079, 0xD232, 0x403C, 0x0E10, 0x12B0, 0xE282, 0xB3D2, 0x005A, +0x2C04, 0x4482, 0x0160, 0x4303, 0x3C03, 0x42A2, 0x0160, 0x5315, 0x93B2, +0x0208, 0x27F3, 0x421C, 0x020A, 0x12B0, 0xE324, 0x3FEE, 0x120A, 0x4C0A, +0x430C, 0x4A0F, 0xF03F, 0x7FFF, 0x4F82, 0x0200, 0x4A0F, 0xE33F, 0x5F0F, +0x7F0F, 0xF35F, 0x4FC2, 0x0202, 0x90B2, 0x04B0, 0x0200, 0x3819, 0x90B2, +0x0E11, 0x0200, 0x3415, 0x421F, 0x0200, 0x503F, 0xFB50, 0x4F0C, 0x403E, +0x0064, 0x12B0, 0xE3A6, 0x4C0E, 0x5E0E, 0x425F, 0x0202, 0x4F4F, 0x5F0E, +0x4E5F, 0xE001, 0x4F4F, 0x531F, 0x4F82, 0x0172, 0x413A, 0x4130, 0x120F, +0x120E, 0xB0F2, 0x0010, 0x0020, 0x2C19, 0x9305, 0x2013, 0x425E, 0x020C, +0x535E, 0x4EC2, 0x020C, 0x926E, 0x2810, 0xD2F2, 0x0021, 0x403F, 0x12CE, +0x403E, 0x0013, 0x533F, 0x633E, 0x2FFD, 0x43C2, 0x020C, 0x3C04, 0xC2F2, +0x0021, 0x43C2, 0x020C, 0x4305, 0x413E, 0x413F, 0x1300, 0x120A, 0x4C0A, +0x421F, 0x0208, 0x831F, 0x2407, 0x831F, 0x2409, 0x831F, 0x240B, 0x831F, +0x240D, 0x3C0F, 0x4A0C, 0x12B0, 0xE282, 0x3C0B, 0x4A0C, 0x12B0, 0xE3BE, +0x3C07, 0x4A0C, 0x12B0, 0xE364, 0x3C03, 0x4A0C, 0x12B0, 0xE3EC, 0x43B2, +0x0208, 0x413A, 0x4130, 0xC3E2, 0x0021, 0xF0F2, 0x003F, 0x0029, 0xB31C, +0x2804, 0xD0F2, 0x0040, 0x002A, 0x3C03, 0xC0F2, 0x0040, 0x002A, 0xB32C, +0x2803, 0xD3E2, 0x0022, 0x3C02, 0xC3E2, 0x0022, 0xB22C, 0x2804, 0xD0F2, +0x0080, 0x002A, 0x4130, 0xC0F2, 0x0080, 0x002A, 0x4130, 0xF37C, 0xF37E, +0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, 0x9F0E, 0x2801, 0x8F0E, +0x6C0C, 0x2BF9, 0x4130, 0x930C, 0x2002, 0x4224, 0x4130, 0x903C, 0x000A, +0x3404, 0x4C82, 0x0172, 0x4034, 0x0224, 0x4130, 0x120A, 0x8321, 0x4C0A, +0x4A81, 0x0000, 0x410D, 0x530D, 0x435C, 0x12B0, 0xE41C, 0x3FF8, 0x903C, +0x5A5A, 0x2007, 0xC3D2, 0x0000, 0xD032, 0x00D8, 0x4303, 0xD3D2, 0x0000, +0x4130, 0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, +0x4130, 0x4030, 0xE3D6, 0x4030, 0xE414, 0x4130, 0xE04C, 0xE2DE, 0xE034, +}; + +const uint32_t eZ_FetDcdcControllerImage_address[] = +{ +0x00001000, 0x0000E000, 0x0000FFE8, 0x0000FFF4, 0x0000FFFE, +}; +const uint32_t eZ_FetDcdcControllerImage_length_of_sections[] = +{ +0x00000001, 0x0000020F, 0x00000001, 0x00000001, 0x00000001, +}; +const uint32_t eZ_FetDcdcControllerImage_sections = 0x00000005; +const uint32_t eZ_FetDcdcControllerImage_termination = 0x00000000; +const uint32_t eZ_FetDcdcControllerImage_start = 0x00001000; +const uint32_t eZ_FetDcdcControllerImage_finish = 0x00010000; +const uint32_t eZ_FetDcdcControllerImage_length = 0x0000F000; + +#define EZ_FETDCDCCONTROLLERIMAGE_TERMINATION 0x00000000 +#define EZ_FETDCDCCONTROLLERIMAGE_START 0x00001000 +#define EZ_FETDCDCCONTROLLERIMAGE_FINISH 0x00010000 +#define EZ_FETDCDCCONTROLLERIMAGE_LENGTH 0x0000F000 +#define EZ_FETDCDCCONTROLLERIMAGE_SECTIONS 0x00000005 diff --git a/Bios/include/eZ_FetDcdcControllerV2x.h b/Bios/include/eZ_FetDcdcControllerV2x.h new file mode 100644 index 0000000..c8f62d9 --- /dev/null +++ b/Bios/include/eZ_FetDcdcControllerV2x.h @@ -0,0 +1,83 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetDcdcControllerV2xImage[] = +{ +0x0050, 0x0390, 0x0302, 0x0302, 0x0302, 0x0402, 0x0402, 0x0502, 0x0502, +0x0502, 0x0502, 0x0502, 0x0502, 0x0602, 0x0602, 0x0603, 0x0603, 0x0703, +0x0703, 0x0703, 0x0803, 0x0903, 0x0A03, 0x0B03, 0x0B03, 0x0B03, 0xFF03, +0x4031, 0x0300, 0x403C, 0x0200, 0x403D, 0x0003, 0x12B0, 0xE402, 0x12B0, +0xE1AE, 0x12B0, 0xE418, 0x120F, 0x120E, 0xB3E2, 0x0079, 0x2804, 0x43A2, +0x0204, 0x4382, 0x0206, 0x421F, 0x0204, 0x830F, 0x249C, 0x832F, 0x240F, +0x832F, 0x2419, 0x832F, 0x2434, 0x832F, 0x2437, 0x832F, 0x243D, 0x823F, +0x246B, 0x832F, 0x2474, 0x832F, 0x247A, 0x3C8B, 0x425E, 0x007B, 0xF07E, +0x00E0, 0x527E, 0x4EC2, 0x007B, 0xC3E2, 0x0079, 0x42A2, 0x0204, 0x3C7F, +0xD3E2, 0x0078, 0x425E, 0x007C, 0xF07E, 0x00FE, 0x925E, 0xE000, 0x200C, +0xB3D2, 0x007C, 0x2804, 0x40B2, 0x0012, 0x0204, 0x3C02, 0x42B2, 0x0204, +0x43C2, 0x007C, 0x3C05, 0x43F2, 0x007C, 0x40B2, 0x0006, 0x0204, 0xD3D2, +0x007B, 0x3C62, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C5D, 0xC3E2, 0x0078, +0xD2F2, 0x007B, 0x40B2, 0x000A, 0x0204, 0x3C55, 0xD3E2, 0x0078, 0x90B2, +0x0003, 0x0206, 0x2C07, 0x421F, 0x0206, 0x42DF, 0x007C, 0x020D, 0x5392, +0x0206, 0x43C2, 0x007C, 0x90B2, 0x0003, 0x0206, 0x2818, 0x425F, 0x020D, +0x4F4F, 0x4F82, 0x0208, 0x425F, 0x020E, 0x4F4F, 0xF03F, 0x00FF, 0x108F, +0x4F82, 0x020A, 0x425F, 0x020F, 0x4F4F, 0x5F82, 0x020A, 0x40B2, 0x0006, +0x0204, 0x4382, 0x0206, 0x3C02, 0x42B2, 0x0204, 0xD3D2, 0x007B, 0x3C25, +0xD3E2, 0x0078, 0x42D2, 0x1001, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0x3C1A, 0xC3E2, 0x0078, 0xD3D2, 0x007B, 0x40B2, 0x0016, 0x0204, +0x3C12, 0xB3D2, 0x007C, 0x2805, 0xC3E2, 0x0078, 0x4382, 0x0204, 0x3C0A, +0xD3E2, 0x0078, 0x42D2, 0x1000, 0x007C, 0xD2F2, 0x007B, 0x40B2, 0x0014, +0x0204, 0xC3D2, 0x0079, 0xC0B1, 0x00D0, 0x0004, 0x413E, 0x413F, 0x1300, +0x40B2, 0x5A80, 0x0120, 0xD2E2, 0x0026, 0xF0F2, 0x00F5, 0x0021, 0x40F2, +0x000C, 0x0022, 0x43C2, 0x0027, 0xF0F2, 0x003F, 0x002E, 0xF0F2, 0x003F, +0x0042, 0xF0F2, 0x003F, 0x0029, 0x43C2, 0x002F, 0x40F2, 0x003F, 0x002A, +0x40F2, 0x0021, 0x005B, 0x40F2, 0x002C, 0x005A, 0x42F2, 0x0059, 0x42D2, +0x10F8, 0x0056, 0x42D2, 0x10F9, 0x0057, 0x40B2, 0x0060, 0x0164, 0x42B2, +0x0172, 0x43A2, 0x0174, 0x4034, 0x0224, 0x4305, 0xD0F2, 0x0020, 0x0053, +0x40B2, 0x5A3F, 0x0120, 0xD3D2, 0x0000, 0x43C2, 0x020C, 0x43B2, 0x0208, +0x4382, 0x0204, 0x4382, 0x0206, 0x40F2, 0x00C1, 0x0078, 0x40F2, 0x0070, +0x0079, 0x40F2, 0x00EE, 0x007A, 0xD0F2, 0x0020, 0x007B, 0xC3D2, 0x0078, +0xC3D2, 0x0079, 0xD232, 0x403C, 0x0E10, 0x12B0, 0xE282, 0xB3D2, 0x005A, +0x2C04, 0x4482, 0x0160, 0x4303, 0x3C03, 0x42A2, 0x0160, 0x5315, 0x93B2, +0x0208, 0x27F3, 0x421C, 0x020A, 0x12B0, 0xE324, 0x3FEE, 0x120A, 0x4C0A, +0x430C, 0x4A0F, 0xF03F, 0x7FFF, 0x4F82, 0x0200, 0x4A0F, 0xE33F, 0x5F0F, +0x7F0F, 0xF35F, 0x4FC2, 0x0202, 0x90B2, 0x04B0, 0x0200, 0x3819, 0x90B2, +0x0E11, 0x0200, 0x3415, 0x421F, 0x0200, 0x503F, 0xFB50, 0x4F0C, 0x403E, +0x0064, 0x12B0, 0xE3A6, 0x4C0E, 0x5E0E, 0x425F, 0x0202, 0x4F4F, 0x5F0E, +0x4E5F, 0xE001, 0x4F4F, 0x531F, 0x4F82, 0x0172, 0x413A, 0x4130, 0x120F, +0x120E, 0xB0F2, 0x0010, 0x0020, 0x2C19, 0x9305, 0x2013, 0x425E, 0x020C, +0x535E, 0x4EC2, 0x020C, 0x926E, 0x2810, 0xD2F2, 0x0021, 0x403F, 0x12CE, +0x403E, 0x0013, 0x533F, 0x633E, 0x2FFD, 0x43C2, 0x020C, 0x3C04, 0xC2F2, +0x0021, 0x43C2, 0x020C, 0x4305, 0x413E, 0x413F, 0x1300, 0x120A, 0x4C0A, +0x421F, 0x0208, 0x831F, 0x2407, 0x831F, 0x2409, 0x831F, 0x240B, 0x831F, +0x240D, 0x3C0F, 0x4A0C, 0x12B0, 0xE282, 0x3C0B, 0x4A0C, 0x12B0, 0xE3BE, +0x3C07, 0x4A0C, 0x12B0, 0xE364, 0x3C03, 0x4A0C, 0x12B0, 0xE3EC, 0x43B2, +0x0208, 0x413A, 0x4130, 0xC3E2, 0x0021, 0xF0F2, 0x003F, 0x0029, 0xB31C, +0x2804, 0xD0F2, 0x0040, 0x002A, 0x3C03, 0xC0F2, 0x0040, 0x002A, 0xB32C, +0x2803, 0xD3E2, 0x0022, 0x3C02, 0xC3E2, 0x0022, 0xB22C, 0x2804, 0xD0F2, +0x0080, 0x002A, 0x4130, 0xC0F2, 0x0080, 0x002A, 0x4130, 0xF37C, 0xF37E, +0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, 0x9F0E, 0x2801, 0x8F0E, +0x6C0C, 0x2BF9, 0x4130, 0x930C, 0x2002, 0x4224, 0x4130, 0x903C, 0x000A, +0x3404, 0x4C82, 0x0172, 0x4034, 0x0224, 0x4130, 0x120A, 0x8321, 0x4C0A, +0x4A81, 0x0000, 0x410D, 0x530D, 0x435C, 0x12B0, 0xE41C, 0x3FF8, 0x903C, +0x5A5A, 0x2007, 0xC3D2, 0x0000, 0xD032, 0x00D8, 0x4303, 0xD3D2, 0x0000, +0x4130, 0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, +0x4130, 0x4030, 0xE3D6, 0x4030, 0xE414, 0x4130, 0xE04C, 0xE2DE, 0xE034, +}; + +const uint32_t eZ_FetDcdcControllerV2xImage_address[] = +{ +0x00001000, 0x0000E000, 0x0000FFE8, 0x0000FFF4, 0x0000FFFE, +}; +const uint32_t eZ_FetDcdcControllerV2xImage_length_of_sections[] = +{ +0x00000001, 0x0000020F, 0x00000001, 0x00000001, 0x00000001, +}; +const uint32_t eZ_FetDcdcControllerV2xImage_sections = 0x00000005; +const uint32_t eZ_FetDcdcControllerV2xImage_termination = 0x00000000; +const uint32_t eZ_FetDcdcControllerV2xImage_start = 0x00001000; +const uint32_t eZ_FetDcdcControllerV2xImage_finish = 0x00010000; +const uint32_t eZ_FetDcdcControllerV2xImage_length = 0x0000F000; + +#define EZ_FETDCDCCONTROLLERV2XIMAGE_TERMINATION 0x00000000 +#define EZ_FETDCDCCONTROLLERV2XIMAGE_START 0x00001000 +#define EZ_FETDCDCCONTROLLERV2XIMAGE_FINISH 0x00010000 +#define EZ_FETDCDCCONTROLLERV2XIMAGE_LENGTH 0x0000F000 +#define EZ_FETDCDCCONTROLLERV2XIMAGE_SECTIONS 0x00000005 diff --git a/Bios/include/eZ_FetHal.h b/Bios/include/eZ_FetHal.h new file mode 100644 index 0000000..8644427 --- /dev/null +++ b/Bios/include/eZ_FetHal.h @@ -0,0 +1,3644 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetHalImage[] = +{ +0xE080, 0x0000, 0x81FC, 0x0001, 0x8C00, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4626, 0xBEEF, +0xBEEF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, 0x1840, +0x1207, 0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, 0x120B, +0x1840, 0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, 0x008C, +0x2706, 0x403E, 0x05F3, 0x403F, 0x0000, 0x13B1, 0xCF26, 0x008C, 0x2400, +0x018D, 0xD19A, 0x403E, 0x0306, 0x403F, 0x0000, 0x13B1, 0xD0AE, 0x1840, +0x413F, 0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, 0x413B, +0x1840, 0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, 0x1840, +0x4136, 0x1840, 0x4135, 0x1840, 0x4134, 0x1880, 0x4070, 0x81FC, 0x147B, +0x120C, 0x8031, 0x0048, 0x4381, 0x0006, 0x4381, 0x000E, 0x4381, 0x000C, +0x40B1, 0x0BB8, 0x0004, 0xB31C, 0x2C02, 0x0080, 0xEC9C, 0x410C, 0x503C, +0x000E, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, +0xFFFE, 0x0080, 0xF776, 0x008C, 0x27C2, 0x002F, 0x2C26, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x2404, 0x403C, 0xFFFD, 0x0080, 0xF776, 0x008C, 0x27C8, +0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFC, +0x0080, 0xF776, 0x008C, 0x27BE, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x2404, 0x403C, 0xFFFB, 0x0080, 0xF776, 0x008C, 0x27B8, 0x002F, +0x2C26, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFA, 0x0080, +0xF776, 0x008C, 0x27C6, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFF9, 0x0080, 0xF776, 0x008C, 0x27C4, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2412, 0x008C, 0x27CC, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2409, 0x008C, 0x27CA, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFF8, 0x0080, 0xF776, +0x0086, 0x2BD2, 0x06CA, 0x00AA, 0x0008, 0x407C, 0x0088, 0x0A0F, 0x134F, +0x06CB, 0x00AB, 0x0014, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x4079, 0x0082, +0x494C, 0x0A0F, 0x134F, 0x06C8, 0x00A8, 0x0030, 0x435C, 0x080F, 0x134F, +0x403C, 0x0560, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4035, 0x00FC, 0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x06C4, 0x00A4, 0x0010, 0x407C, 0x0024, +0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x0087, 0x27CE, 0x412E, 0x411F, +0x0002, 0x4E87, 0x0000, 0x4F87, 0x0002, 0x407C, 0x0088, 0x0A0F, 0x134F, +0x403C, 0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x0660, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x411E, 0x0002, 0x412F, 0x4E87, 0x0004, 0x4F87, 0x0006, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0960, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, +0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, +0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x4E87, 0x0008, +0x4F87, 0x000A, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0860, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, +0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0002, +0x412F, 0x4E87, 0x000C, 0x4F87, 0x000E, 0x407C, 0x0088, 0x0A0F, 0x134F, +0x403C, 0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x0A60, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x412E, 0x411F, 0x0002, 0x4E87, 0x0010, 0x4F87, 0x0012, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0B60, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x450C, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, +0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0002, 0x412F, 0x4E87, 0x0014, +0x4F87, 0x0016, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x403C, 0x0034, 0x0B0F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0C60, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x450C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, +0x4C05, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, +0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x450F, 0x4E87, +0x0018, 0x4F87, 0x001A, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x4077, 0x00C8, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x00A6, 0x0018, 0x403C, 0x0128, +0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, +0x134F, 0x4075, 0x0021, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27EA, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x430D, 0x060F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27EC, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, +0x0000, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, +0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412F, +0x1840, 0x4F82, 0x27EE, 0x1840, 0xE0B2, 0x3300, 0x27EA, 0x1840, 0xE0B2, +0x3300, 0x27EC, 0x1840, 0xE0B2, 0x3300, 0x27EE, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x430D, 0x060F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x403C, 0xA544, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x1840, 0x4291, 0x27C4, 0x0000, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x412C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, +0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x416E, 0x1840, 0x9EC2, +0x27C4, 0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, 0x27C4, 0x4F81, 0x0000, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, +0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, +0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x410C, 0x503C, 0x0018, 0x403E, 0x000E, 0x13B1, 0xCF56, +0x1840, 0x4291, 0x27BE, 0x0018, 0x1840, 0x4291, 0x27C0, 0x001A, 0x1840, +0x4291, 0x27B8, 0x001C, 0x1840, 0x4291, 0x27BA, 0x001E, 0x1840, 0x421E, +0x27C6, 0x4E81, 0x0020, 0x4381, 0x0022, 0x1840, 0x421E, 0x27C4, 0x4E81, +0x0024, 0x4381, 0x0026, 0x1840, 0x421E, 0x27CC, 0x4E81, 0x002C, 0x4381, +0x002E, 0x1840, 0x421E, 0x27CA, 0x4E81, 0x0030, 0x4381, 0x0032, 0x410C, +0x503C, 0x0018, 0x13B1, 0x4A9E, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, +0x0034, 0x040F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x490C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, +0x435C, 0x080F, 0x134F, 0x1840, 0x421E, 0x27C8, 0x4E81, 0x0008, 0x4381, +0x000A, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0080, 0x4E0C, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, +0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x0401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x00A8, +0x0A0F, 0x134F, 0x431C, 0x1380, 0x2B86, 0x454C, 0x0A0F, 0x134F, 0x430C, +0x430D, 0x060F, 0x134F, 0x411F, 0x0004, 0x533F, 0x4F81, 0x0004, 0x403E, +0x0022, 0x1840, 0x521E, 0x27C8, 0x430F, 0x930D, 0x2002, 0x9E0C, 0x280A, +0x403E, 0x002C, 0x1840, 0x521E, 0x27C8, 0x9D0F, 0x2803, 0x2005, 0x9C0E, +0x2C03, 0x9381, 0x0004, 0x23DA, 0x1840, 0x421F, 0x27B8, 0x1840, 0xD21F, +0x27BA, 0x930F, 0x2002, 0x0080, 0xF0DA, 0x9381, 0x0006, 0x2402, 0x0080, +0xF0DA, 0x9381, 0x0004, 0x2002, 0x0080, 0xF0DA, 0x4037, 0x006C, 0x1840, +0x5217, 0x27C8, 0x1840, 0x421E, 0x27B8, 0x1840, 0x421F, 0x27BA, 0x5E0E, +0x6F0F, 0x1840, 0x421A, 0x27C2, 0x2002, 0x9A0E, 0x2802, 0x1840, 0x4A0E, +0x470F, 0x5E0F, 0x4F81, 0x0000, 0x403E, 0x0068, 0x1840, 0x521E, 0x27C8, +0x4E81, 0x0008, 0x4381, 0x000A, 0x0086, 0x2BD2, 0x06CA, 0x00AA, 0x0008, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x06C4, 0x00A4, 0x0010, 0x407C, 0x0034, +0x040F, 0x134F, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x06CB, 0x00AB, +0x0014, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, 0xEF4E, 0xEF0E, +0xF03E, 0x0F00, 0xD03E, 0x0080, 0x4E0C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, +0x0030, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4075, +0x0021, 0x454C, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0088, +0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C8, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x423C, 0x0B0F, 0x134F, 0x3C22, 0x410C, 0x503C, 0x000C, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4C81, 0x0006, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x470C, 0x430D, 0x063F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x411C, 0x000C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x5327, 0x9127, 0x2C03, 0x9381, 0x0006, 0x27D9, 0x434C, +0x080F, 0x134F, 0x407C, 0x00C8, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x8217, +0x27C8, 0x5037, 0xFF94, 0x0357, 0x4781, 0x0008, 0x4381, 0x000A, 0x407C, +0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0086, 0x4E0C, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, +0x0008, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, +0x080F, 0x134F, 0x1840, 0x4291, 0x27BE, 0x0008, 0x1840, 0x4291, 0x27C0, +0x000A, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0008, 0x411F, +0x000A, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0085, +0x4E0C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x411C, 0x0008, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x040F, +0x134F, 0x435C, 0x080F, 0x134F, 0x470E, 0x5E0E, 0x1840, 0x5E82, 0x27BE, +0x1840, 0x6382, 0x27C0, 0x1840, 0x8782, 0x27B8, 0x1840, 0x7382, 0x27BA, +0x403E, 0x002E, 0x1840, 0x521E, 0x27C8, 0x4E81, 0x0008, 0x4381, 0x000A, +0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x040F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, 0x108F, 0xEF4E, +0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0080, 0x4E0C, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0008, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0A0F, 0x134F, 0x407C, 0x0024, +0x040F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A8, 0x0A0F, 0x134F, +0x40B1, 0x0BB8, 0x0004, 0x431C, 0x1380, 0x2B86, 0x454C, 0x0A0F, 0x134F, +0x430C, 0x430D, 0x063F, 0x0018, 0x134F, 0x411F, 0x0004, 0x533F, 0x4F81, +0x0004, 0x403E, 0x0068, 0x1840, 0x521E, 0x27C8, 0x9E0C, 0x2004, 0x930D, +0x2002, 0x0080, 0xEC9C, 0x930F, 0x23E3, 0x0080, 0xEC9C, 0x0027, 0x2C26, +0xB3A1, 0x0048, 0x29A1, 0x410C, 0x503C, 0x0010, 0x018E, 0xD0EE, 0x427D, +0x13B1, 0xCF3E, 0x410B, 0x503B, 0x0034, 0x140B, 0x430F, 0x434E, 0x423D, +0x410C, 0x503C, 0x0014, 0x0737, 0x001C, 0x1347, 0x403C, 0x0003, 0x002F, +0x298E, 0x134F, 0x0BCC, 0x002F, 0x2C26, 0x0F3F, 0x0020, 0x134F, 0x008C, +0x27CE, 0x13B1, 0x4A9E, 0x1840, 0x4215, 0x27EA, 0x0086, 0x2BD2, 0x06CA, +0x00AA, 0x0008, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x06CB, 0x00AB, +0x0014, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0030, 0x434C, +0x080F, 0x134F, 0x4077, 0x00C8, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x06C4, 0x00A4, 0x0010, 0x427C, 0x040F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x00A6, 0x0018, 0x403C, 0x0128, 0x430D, +0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x450C, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2401, 0x0B0F, 0x134F, 0x4075, 0x0021, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x1840, 0x4291, 0x27EC, 0x0004, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x430D, 0x060F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x1840, 0x4291, 0x27EE, 0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, +0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, +0x0004, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, +0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x415E, +0x0004, 0x5221, 0x1840, 0x9EC2, 0x27EE, 0x2448, 0x403F, 0x0040, 0x1840, +0xD21F, 0x27EE, 0x4F81, 0x0000, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x412C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x421C, 0x27BC, +0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x3DA6, 0x9391, 0x0006, 0x2008, +0x407C, 0x0091, 0x073F, 0x0024, 0x134F, 0x4381, 0x0006, 0x3D9B, 0x410C, +0x503C, 0x0010, 0x018E, 0xD0F6, 0x427D, 0x13B1, 0xCF3E, 0x410B, 0x503B, +0x0034, 0x140B, 0x430F, 0x434E, 0x423D, 0x410C, 0x503C, 0x0014, 0x0737, +0x001C, 0x1347, 0x403C, 0x0003, 0x002F, 0x298E, 0x134F, 0x0BCC, 0x002F, +0x2C26, 0x0F3F, 0x0020, 0x134F, 0x008C, 0x27CE, 0x13B1, 0x4A9E, 0x1840, +0x4215, 0x27EA, 0x0086, 0x2BD2, 0x06CA, 0x00AA, 0x0008, 0x4079, 0x0082, +0x494C, 0x0A0F, 0x134F, 0x06CB, 0x00AB, 0x0014, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x06C8, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x4077, 0x00C8, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x06C4, +0x00A4, 0x0010, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x00A6, 0x0018, 0x403C, 0x0128, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x450C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x4075, 0x0021, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, +0x4291, 0x27EC, 0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012A, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x411C, 0x0004, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x4291, 0x27EE, +0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012C, 0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, +0x0004, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x430D, 0x060F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0004, 0x434C, 0x080F, 0x134F, +0x474C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x415E, 0x0004, 0x5221, 0x1840, 0x9EC2, +0x27EE, 0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, 0x27EE, 0x4F81, 0x0000, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, +0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x430D, 0x060F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x474C, 0x0A0F, +0x134F, 0x403C, 0x2401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x40B1, 0xFFF6, 0x0006, 0x411C, 0x0006, 0x5031, 0x004A, +0x1674, 0x0110, 0x147B, 0x8031, 0x0012, 0x4305, 0x4381, 0x0004, 0x434B, +0x410C, 0x532C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFDA, 0x0080, 0xFDB8, 0x410C, 0x530C, 0x002F, 0x2C26, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFD9, 0x0080, 0xFDB8, 0x410D, +0x503D, 0x0006, 0x403C, 0xAA01, 0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2402, 0x013B, 0x0006, 0x03DB, 0x2402, 0x438B, 0x0000, 0x008A, +0x2BD2, 0x0ACB, 0x00AB, 0x0008, 0x4077, 0x00C8, 0x474C, 0x0B0F, 0x134F, +0x0AC8, 0x00A8, 0x0014, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x907C, 0x0089, 0x2404, 0x403C, 0xFFD0, 0x0080, 0xFDB8, +0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C04, 0x0AC9, +0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0xB034, 0x0200, 0x2C5C, 0x407C, +0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, 0x0A3F, 0x0010, 0x134F, 0x407C, +0x00B0, 0x0B0F, 0x134F, 0x0AC6, 0x00A6, 0x001C, 0x403C, 0x0089, 0x430D, +0x060F, 0x134F, 0x430C, 0x430D, 0x060F, 0x134F, 0x4C04, 0x407C, 0x00B0, +0x0B0F, 0x134F, 0x403C, 0x0088, 0x430D, 0x060F, 0x134F, 0xD034, 0x0040, +0x440C, 0x430D, 0x060F, 0x134F, 0x4C04, 0x407C, 0x00B0, 0x0B0F, 0x134F, +0x403C, 0x0088, 0x430D, 0x060F, 0x134F, 0xF034, 0xFFBF, 0x440C, 0x430D, +0x060F, 0x134F, 0x4036, 0x0032, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, +0x080F, 0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, +0x5336, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, 0x9306, 0x23F5, 0x9306, +0x2402, 0x4C81, 0x0004, 0x9381, 0x0004, 0x2004, 0x403C, 0xFFDB, 0x0080, +0xFDB8, 0xB3A1, 0x0004, 0x280E, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x3C07, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x4303, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4306, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x0AC4, 0x00A4, 0x0010, +0x435C, 0x040F, 0x134F, 0x435C, 0x090F, 0x134F, 0x3C07, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x5316, 0x9036, 0x000A, 0x2C13, 0x407C, +0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0xF07C, 0x0081, 0x907C, +0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E5, 0x430F, 0x3C01, +0x433F, 0x930F, 0x20D2, 0x1840, 0x93A2, 0x2890, 0x2023, 0x1840, 0x9382, +0x2892, 0x201F, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x0AC6, 0x00A6, 0x001C, +0x403C, 0x0082, 0x430D, 0x060F, 0x134F, 0x403C, 0x000F, 0x430D, 0x060F, +0x134F, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x403C, 0x0082, 0x430D, 0x060F, +0x134F, 0x403C, 0x000C, 0x430D, 0x060F, 0x134F, 0x434C, 0x090F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x2C01, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2C01, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, +0x134F, 0x403C, 0x0401, 0x080F, 0x134F, 0x407C, 0x0098, 0x0B0F, 0x134F, +0x403C, 0x0080, 0x080F, 0x134F, 0x403C, 0x0880, 0x080F, 0x134F, 0x403C, +0x0080, 0x080F, 0x134F, 0x403C, 0x0880, 0x080F, 0x134F, 0x407C, 0x0088, +0x0B0F, 0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x3C07, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x5315, 0x9035, 0x000A, 0x2C0F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x903C, +0xFFFE, 0x2403, 0x903C, 0x0F00, 0x23E7, 0x9035, 0x000A, 0x2446, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x4075, 0x0021, 0x454C, 0x0B0F, +0x134F, 0x430C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4306, 0x407C, +0x0048, 0x0B0F, 0x134F, 0x435C, 0x040F, 0x134F, 0x435C, 0x090F, 0x134F, +0x3C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x5316, 0x9036, +0x000A, 0x2C13, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, +0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, +0x23E5, 0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, 0x403C, 0xFFD1, 0x3D30, +0x4191, 0x0002, 0x0006, 0x4381, 0x0008, 0x407C, 0x0082, 0x0B0F, 0x134F, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x411C, 0x0006, 0x411D, +0x0008, 0xF03D, 0x000F, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C06, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x2401, 0x080F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4681, 0x000A, 0x464F, 0xD12F, 0x4F81, 0x0000, 0x4F06, 0x4191, 0x0002, +0x0006, 0x4381, 0x0008, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0048, 0x0B0F, 0x134F, 0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, +0x0B0F, 0x134F, 0x411C, 0x0006, 0x411D, 0x0008, 0xF03D, 0x000F, 0x0A3F, +0x0018, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, 0x460C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x403C, 0x2401, 0x080F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, +0x4C81, 0x000C, 0x4D81, 0x000E, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, +0x0034, 0x040F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x403C, 0x0080, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x0C04, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x454C, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0088, 0x0B0F, +0x134F, 0x407C, 0x0024, 0x040F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x0088, 0x0B0F, 0x134F, 0x403C, 0x0034, 0x080F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x0260, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x00FC, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C07, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x040F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4781, 0x0010, 0x423D, 0x410C, 0x503C, +0x000A, 0x002F, 0x2C26, 0x0F3F, 0x000C, 0x134F, 0x430C, 0x5031, 0x0012, +0x1674, 0x0110, 0x141B, 0x407C, 0x0086, 0x1380, 0x2BDA, 0x008B, 0x2BE6, +0x430C, 0x0B0F, 0x134F, 0xB23C, 0x280E, 0x403C, 0x0014, 0x0B0F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C0A, 0x430C, 0x0B0F, 0x134F, 0x4C0D, 0x4A0C, +0x3C02, 0x430C, 0x430D, 0x161A, 0x0110, 0x430C, 0x0110, 0x147B, 0x120C, +0x8031, 0x0034, 0x4381, 0x0004, 0x4381, 0x0008, 0x4381, 0x0006, 0x40B1, +0x0BB8, 0x0002, 0xB31C, 0x2C02, 0x0180, 0x0A44, 0x410C, 0x523C, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFE, 0x0180, +0x1412, 0x008C, 0x2710, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFD, 0x0180, 0x1412, 0x008C, 0x2716, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFC, 0x0180, 0x1412, +0x008C, 0x270C, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFFB, 0x0180, 0x1412, 0x008C, 0x2706, 0x002F, 0x2C26, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFA, 0x0180, 0x1412, 0x008C, +0x2714, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, +0xFFF9, 0x0180, 0x1412, 0x008C, 0x2712, 0x002F, 0x2C26, 0x0F3F, 0x002C, +0x134F, 0x933C, 0x2412, 0x008C, 0x271A, 0x002F, 0x2C26, 0x0F3F, 0x002C, +0x134F, 0x933C, 0x2409, 0x008C, 0x2718, 0x002F, 0x2C26, 0x0F3F, 0x002C, +0x134F, 0x933C, 0x2004, 0x403C, 0xFFF8, 0x0180, 0x1412, 0x0087, 0x2BD2, +0x07CA, 0x00AA, 0x0008, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, 0x134F, 0x07C8, +0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, 0x134F, 0x4079, 0x0082, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x4582, 0x080F, 0x134F, 0x07C6, 0x00A6, 0x0030, +0x434C, 0x060F, 0x134F, 0x4075, 0x0042, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x4034, +0x2401, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x271C, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x4682, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x271E, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4982, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x2720, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x4882, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, +0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x2722, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x4A82, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x2724, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4B82, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x2726, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, +0x403C, 0x4C82, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x00FE, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, +0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x2728, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x0128, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x412F, 0x1840, 0x4F82, 0x272A, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x272C, 0x494C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x412F, 0x1840, +0x4F82, 0x272E, 0x1840, 0xE0B2, 0x3300, 0x272A, 0x1840, 0xE0B2, 0x3300, +0x272C, 0x1840, 0xE0B2, 0x3300, 0x272E, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x403C, 0xA544, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x1840, +0x4291, 0x2712, 0x0000, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x412C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x416E, 0x1840, 0x9EC2, 0x2712, 0x2448, +0x403F, 0x0040, 0x1840, 0xD21F, 0x2712, 0x4F81, 0x0000, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, +0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x410C, 0x503C, 0x0012, 0x403E, 0x0007, 0x13B1, 0xCF56, 0x1840, 0x4291, +0x270C, 0x0012, 0x1840, 0x4291, 0x2706, 0x0014, 0x1840, 0x4291, 0x2714, +0x0016, 0x1840, 0x4291, 0x2712, 0x0018, 0x1840, 0x4291, 0x271A, 0x001C, +0x1840, 0x4291, 0x2718, 0x001E, 0x410C, 0x503C, 0x0012, 0x13B1, 0x6198, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x4032, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x430C, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x1840, 0x421F, 0x2890, 0x1840, 0xD21F, 0x2892, +0x930F, 0x240F, 0x1840, 0x9382, 0x2894, 0x240B, 0x407C, 0x0090, 0x0A0F, +0x134F, 0x403C, 0x0088, 0x080F, 0x134F, 0x431C, 0x080F, 0x134F, 0x1840, +0x4217, 0x2716, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x435C, 0x060F, 0x134F, 0x470C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x435C, 0x060F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x0401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x407C, 0x00A8, +0x0A0F, 0x134F, 0x431C, 0x1380, 0x2B86, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x430C, 0x080F, 0x134F, 0x411F, 0x0002, 0x533F, 0x4F81, 0x0002, 0x403F, +0x0020, 0x1840, 0x521F, 0x2716, 0x9F0C, 0x2807, 0x403F, 0x0026, 0x1840, +0x521F, 0x2716, 0x9C0F, 0x2C03, 0x9381, 0x0002, 0x23E0, 0x1840, 0x421F, +0x2706, 0x1840, 0xD21F, 0x2708, 0x930F, 0x25A7, 0x9381, 0x0004, 0x21A4, +0x9381, 0x0002, 0x25A1, 0x4035, 0x0060, 0x1840, 0x5215, 0x2716, 0x1840, +0x421E, 0x2706, 0x1840, 0x421F, 0x2708, 0x5E0E, 0x6F0F, 0x1840, 0x421A, +0x2710, 0x2002, 0x9A0E, 0x2802, 0x1840, 0x4A0E, 0x450F, 0x5E0F, 0x4F81, +0x0000, 0x4034, 0x005C, 0x1840, 0x5214, 0x2716, 0x0086, 0x2BD2, 0x06CA, +0x00AA, 0x0008, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, 0x134F, 0x06C8, 0x00A8, +0x0014, 0x403C, 0x3401, 0x080F, 0x134F, 0x4079, 0x0082, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x00A6, 0x0030, 0x434C, 0x060F, +0x134F, 0x435C, 0x060F, 0x134F, 0x440C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x435C, 0x060F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x4034, 0x2401, 0x440C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2408, 0x080F, 0x134F, 0x3C20, 0x410C, +0x503C, 0x0006, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4C81, 0x0004, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x411C, 0x0006, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x5325, 0x9125, 0x2C03, 0x9381, 0x0004, 0x27DB, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x1840, 0x8215, +0x2716, 0x5035, 0xFFA0, 0x0355, 0x4507, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4036, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4075, 0x0042, 0x454C, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x470C, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, +0x134F, 0x1840, 0x4291, 0x270C, 0x0000, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4035, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x470E, +0x5E0E, 0x1840, 0x5E82, 0x270C, 0x1840, 0x6382, 0x270E, 0x1840, 0x8782, +0x2706, 0x1840, 0x7382, 0x2708, 0x4037, 0x0028, 0x1840, 0x5217, 0x2716, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x470C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x407C, 0x00A8, 0x0A0F, 0x134F, 0x40B1, 0x0BB8, 0x0002, 0x431C, 0x1380, +0x2B86, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x411F, +0x0002, 0x533F, 0x4F81, 0x0002, 0x403F, 0x005C, 0x1840, 0x521F, 0x2716, +0x9F0C, 0x2655, 0x9381, 0x0002, 0x23E7, 0x3E51, 0x0027, 0x2C26, 0xB3A1, +0x0034, 0x2996, 0x410C, 0x503C, 0x000A, 0x018E, 0xD0D6, 0x427D, 0x13B1, +0xCF3E, 0x410B, 0x503B, 0x0020, 0x140B, 0x430F, 0x434E, 0x423D, 0x410C, +0x503C, 0x000E, 0x0737, 0x001C, 0x1347, 0x403C, 0x0003, 0x002F, 0x2910, +0x134F, 0x0BCC, 0x002F, 0x2C26, 0x0F3F, 0x0020, 0x134F, 0x008C, 0x271C, +0x13B1, 0x6198, 0x1840, 0x4214, 0x272A, 0x0087, 0x2BD2, 0x07CA, 0x00AA, +0x0008, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x07C8, 0x00A8, 0x0014, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x07C6, 0x00A6, 0x0030, 0x434C, 0x060F, +0x134F, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, +0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x0128, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x4034, 0x2401, 0x440C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x1840, 0x4215, 0x272C, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, +0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, +0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x0085, 0x272E, 0x1840, 0x45A1, 0x0004, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, +0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, +0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0004, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x415E, 0x0004, 0x5221, 0x9EC5, 0x0000, 0x2445, 0x403F, 0x0040, 0xD52F, +0x4F05, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x1840, 0x421C, 0x270A, 0x002F, 0x2C26, 0x0F3F, +0x0010, 0x134F, 0x3D9B, 0x9391, 0x0004, 0x2008, 0x407C, 0x0091, 0x073F, +0x0024, 0x134F, 0x4381, 0x0004, 0x3D90, 0x410C, 0x503C, 0x000A, 0x018E, +0xD0DE, 0x427D, 0x13B1, 0xCF3E, 0x410B, 0x503B, 0x0020, 0x140B, 0x430F, +0x434E, 0x423D, 0x410C, 0x503C, 0x000E, 0x0737, 0x001C, 0x1347, 0x403C, +0x0003, 0x002F, 0x2910, 0x134F, 0x0BCC, 0x002F, 0x2C26, 0x0F3F, 0x0020, +0x134F, 0x008C, 0x271C, 0x13B1, 0x6198, 0x1840, 0x4214, 0x272A, 0x0087, +0x2BD2, 0x07CA, 0x00AA, 0x0008, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, +0x07C8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x07C6, 0x00A6, +0x0030, 0x434C, 0x060F, 0x134F, 0x407B, 0x00C8, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x0128, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x4034, 0x2401, 0x440C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x1840, 0x4215, 0x272C, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x0085, 0x272E, 0x1840, 0x45A1, +0x0004, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, +0x0004, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0004, 0x434C, 0x060F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x415E, 0x0004, 0x5221, 0x9EC5, 0x0000, 0x2445, +0x403F, 0x0040, 0xD52F, 0x4F05, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, +0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x40B1, 0xFFF6, 0x0004, +0x411C, 0x0004, 0x5031, 0x0036, 0x1674, 0x0110, 0x147B, 0x120C, 0x8031, +0x0034, 0x4381, 0x0004, 0x4381, 0x0008, 0x4381, 0x0006, 0x40B1, 0x0BB8, +0x0002, 0x4304, 0xB31C, 0x2C02, 0x0180, 0x2142, 0x008B, 0x2C26, 0x410C, +0x523C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFE, +0x0180, 0x2544, 0x008C, 0x2798, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFD, 0x0180, 0x2544, 0x008C, 0x279E, 0x0B0F, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFC, 0x0180, 0x2544, 0x008C, +0x2794, 0x0B0F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFB, +0x0180, 0x2544, 0x008C, 0x2790, 0x0B0F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFA, 0x0180, 0x2544, 0x008C, 0x279C, 0x0B0F, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFF9, 0x0180, 0x2544, 0x008C, +0x279A, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2410, 0x008C, 0x27A2, +0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x2408, 0x008C, 0x27A0, 0x0B0F, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFF8, 0x0180, 0x2544, +0x0087, 0x2BD2, 0x07CA, 0x00AA, 0x0008, 0x407B, 0x0082, 0x4B4C, 0x0A0F, +0x134F, 0x07C8, 0x00A8, 0x0014, 0x403C, 0x4030, 0x080F, 0x134F, 0x07C9, +0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x403C, +0x0C04, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x3C4B, 0x440F, 0x5F0F, 0x1840, 0x521F, 0x279E, 0x4F81, 0x0000, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x412C, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x440E, 0x0EEE, +0x1840, 0x4F8E, 0x2730, 0x5314, 0x4035, 0x2401, 0x4076, 0x00C8, 0x9034, +0x0030, 0x3BAE, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4582, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x4074, 0x0042, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27A4, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x4682, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27A6, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x4982, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27A8, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4882, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27AA, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x4A82, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27AC, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x4B82, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27AE, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4C82, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27B0, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x0128, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, +0x27B2, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x412F, 0x1840, 0x4F82, 0x27B4, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x412F, 0x1840, 0x4F82, 0x27B6, 0x1840, 0xE0B2, +0x3300, 0x27B2, 0x1840, 0xE0B2, 0x3300, 0x27B4, 0x1840, 0xE0B2, 0x3300, +0x27B6, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, +0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, +0x403C, 0x012A, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x403C, +0xA544, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x1840, 0x4291, 0x279A, 0x0000, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, +0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, +0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x416E, 0x1840, 0x9EC2, 0x279A, 0x2448, 0x403F, 0x0040, 0x1840, 0xD21F, +0x279A, 0x4F81, 0x0000, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x073F, 0x0010, 0x134F, 0x407C, 0x00C1, +0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, +0x134F, 0x412C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x410C, 0x503C, 0x000A, 0x403E, +0x0007, 0x13B1, 0xCF56, 0x1840, 0x4291, 0x2794, 0x000A, 0x1840, 0x4291, +0x2790, 0x000C, 0x1840, 0x4291, 0x279C, 0x000E, 0x1840, 0x4291, 0x279A, +0x0010, 0x1840, 0x4291, 0x27A2, 0x0014, 0x1840, 0x4291, 0x27A0, 0x0016, +0x410C, 0x503C, 0x000A, 0x13B1, 0x6588, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4032, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, +0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1840, +0x421F, 0x2890, 0x1840, 0xD21F, 0x2892, 0x930F, 0x240F, 0x1840, 0x9382, +0x2894, 0x240B, 0x407C, 0x0090, 0x0A0F, 0x134F, 0x403C, 0x0088, 0x080F, +0x134F, 0x431C, 0x080F, 0x134F, 0x1840, 0x4217, 0x279E, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x470C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x00A8, 0x0A0F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x431C, 0x1380, +0x2B86, 0x430C, 0x080F, 0x134F, 0x411F, 0x0002, 0x533F, 0x4F81, 0x0002, +0x403F, 0x0020, 0x1840, 0x521F, 0x279E, 0x9F0C, 0x2807, 0x403F, 0x0026, +0x1840, 0x521F, 0x279E, 0x9C0F, 0x2C03, 0x9381, 0x0002, 0x23E4, 0x1840, +0x421C, 0x279E, 0x13B1, 0xA056, 0x3D22, 0x410C, 0x503C, 0x0006, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4C81, 0x0004, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x440C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x411C, +0x0006, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x5324, 0x9504, 0x2C03, 0x9381, 0x0004, 0x27DB, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1840, 0x8214, 0x279E, 0x5034, +0xFFA0, 0x0354, 0x4407, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4036, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x4074, 0x0042, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x470C, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, +0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x1840, 0x4215, 0x2794, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x4035, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, +0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, +0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x470E, 0x5E0E, +0x1840, 0x5E82, 0x2794, 0x1840, 0x6382, 0x2796, 0x1840, 0x8782, 0x2790, +0x1840, 0x7382, 0x2792, 0x4037, 0x0028, 0x1840, 0x5217, 0x279E, 0x4B4C, +0x0A0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x470C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00A8, 0x0A0F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x40B1, +0x0BB8, 0x0002, 0x431C, 0x1380, 0x2B86, 0x430C, 0x080F, 0x134F, 0x411F, +0x0002, 0x533F, 0x4F81, 0x0002, 0x403F, 0x005C, 0x1840, 0x521F, 0x279E, +0x9F0C, 0x2403, 0x9381, 0x0002, 0x23EB, 0x1840, 0x421C, 0x279E, 0x13B1, +0xA056, 0x9381, 0x0002, 0x2003, 0x40B1, 0xFFF7, 0x0004, 0x1840, 0x421F, +0x2790, 0x1840, 0xD21F, 0x2792, 0x930F, 0x244A, 0x9381, 0x0004, 0x2047, +0x9381, 0x0002, 0x2444, 0x4034, 0x0060, 0x1840, 0x5214, 0x279E, 0x1840, +0x421E, 0x2790, 0x1840, 0x421F, 0x2792, 0x5E0E, 0x6F0F, 0x1840, 0x421A, +0x2798, 0x2002, 0x9A0E, 0x2802, 0x1840, 0x4A0E, 0x4405, 0x5E05, 0x0089, +0x2BD2, 0x09CA, 0x00AA, 0x0008, 0x407B, 0x0082, 0x4B4C, 0x0A0F, 0x134F, +0x09C8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x4076, 0x00C8, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x2408, 0x080F, 0x134F, 0x3EAC, 0xB3A1, +0x0034, 0x2C03, 0x9391, 0x0004, 0x258D, 0x410C, 0x503C, 0x0018, 0x018E, +0xD0E6, 0x427D, 0x13B1, 0xCF3E, 0x410B, 0x503B, 0x0020, 0x140B, 0x430F, +0x434E, 0x423D, 0x410C, 0x503C, 0x001C, 0x0027, 0x2C26, 0x0737, 0x001C, +0x1347, 0x403C, 0x0003, 0x002F, 0x2910, 0x134F, 0x0BCC, 0x002F, 0x2C26, +0x0F3F, 0x0020, 0x134F, 0x008C, 0x27A4, 0x13B1, 0x6588, 0x1840, 0x4214, +0x27B2, 0x0087, 0x2BD2, 0x07CA, 0x00AA, 0x0008, 0x407B, 0x0082, 0x4B4C, +0x0A0F, 0x134F, 0x07C8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, +0x07C9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x4076, 0x00C8, 0x464C, +0x0A0F, 0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x00A7, 0x0010, +0x427C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x0128, +0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x4035, 0x2401, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, +0x435C, 0x090F, 0x134F, 0x1840, 0x4214, 0x27B4, 0x4B4C, 0x0A0F, 0x134F, +0x403C, 0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x070F, 0x134F, +0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012A, 0x080F, 0x134F, 0x407C, +0x00A1, 0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x0084, 0x27B6, +0x1840, 0x44A1, 0x0004, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x0048, 0x0A0F, 0x134F, 0x427C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0A0F, +0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x411C, 0x0004, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, +0x407C, 0x00A1, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, 0x0004, 0x434C, 0x090F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x415E, 0x0004, 0x5221, 0x9EC4, 0x0000, +0x2444, 0x403F, 0x0040, 0xD42F, 0x4F04, 0x4B4C, 0x0A0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0048, 0x0A0F, 0x134F, 0x427C, 0x070F, 0x134F, 0x407C, +0x00C1, 0x0A0F, 0x134F, 0x403C, 0x012C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0A0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x435C, 0x090F, 0x134F, 0xB3A1, 0x0034, 0x2807, +0x430C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x3C10, 0x9391, 0x0004, +0x200A, 0x407C, 0x0091, 0x002F, 0x2C26, 0x0F3F, 0x0024, 0x134F, 0x4381, +0x0004, 0x3C03, 0x40B1, 0xFFF6, 0x0004, 0x411C, 0x0004, 0x5031, 0x0036, +0x1674, 0x0110, 0x147B, 0x8031, 0x002E, 0x4381, 0x0016, 0x4381, 0x0018, +0x4381, 0x0004, 0x4381, 0x0000, 0x4381, 0x001A, 0x4381, 0x001C, 0x410D, +0x503D, 0x0006, 0x403C, 0xAA01, 0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2403, 0x013F, 0x0006, 0x3C01, 0x434F, 0x03DF, 0x2402, 0x438F, +0x0000, 0x0085, 0x2BD2, 0x05CA, 0x00AA, 0x0014, 0x05CB, 0x00AB, 0x0008, +0x0088, 0x2878, 0x9388, 0x0010, 0x2412, 0x407C, 0x00F4, 0x0B0F, 0x134F, +0x481C, 0x0012, 0x0A0F, 0x134F, 0xC81C, 0x0010, 0xD81C, 0x0016, 0x0A0F, +0x134F, 0x403C, 0x0014, 0x1380, 0x2B86, 0x482F, 0xD81F, 0x0002, 0x930F, +0x2416, 0x407C, 0x0054, 0x0B0F, 0x134F, 0x481C, 0x0004, 0x481D, 0x0006, +0x053F, 0x001C, 0x134F, 0x481C, 0x000C, 0x481D, 0x000E, 0x053F, 0x001C, +0x134F, 0x403C, 0x0014, 0x1380, 0x2B86, 0x407C, 0x00D0, 0x0B0F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x4074, 0x0028, 0x934C, 0x38CB, 0x444C, 0x0B0F, +0x134F, 0x430C, 0x0A0F, 0x134F, 0xB03C, 0x0020, 0x2CC2, 0x407C, 0x00B0, +0x0B0F, 0x134F, 0x05C8, 0x00A8, 0x001C, 0x431C, 0x430D, 0x080F, 0x134F, +0x430C, 0x430D, 0x080F, 0x134F, 0x4C81, 0x0006, 0x4D81, 0x0008, 0x403C, +0x0003, 0x430D, 0x080F, 0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x4C81, +0x002A, 0x4D81, 0x002C, 0x403C, 0x0005, 0x430D, 0x080F, 0x134F, 0x430C, +0x430D, 0x080F, 0x134F, 0x4C81, 0x0026, 0x4D81, 0x0028, 0x403C, 0x0007, +0x430D, 0x080F, 0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x4C81, 0x0022, +0x4D81, 0x0024, 0x403C, 0x0081, 0x430D, 0x080F, 0x134F, 0x430C, 0x430D, +0x080F, 0x134F, 0x4C81, 0x001E, 0x4D81, 0x0020, 0x432C, 0x430D, 0x080F, +0x134F, 0x430C, 0x430D, 0x080F, 0x134F, 0x422C, 0x430D, 0x080F, 0x134F, +0x433C, 0x403D, 0x000F, 0x080F, 0x134F, 0x403C, 0x0006, 0x430D, 0x080F, +0x134F, 0x431C, 0x430D, 0x080F, 0x134F, 0x403C, 0x0080, 0x430D, 0x080F, +0x134F, 0x431C, 0x430D, 0x080F, 0x134F, 0x403C, 0x0088, 0x430D, 0x080F, +0x134F, 0x403C, 0x000E, 0x430D, 0x080F, 0x134F, 0x407C, 0x0030, 0x0B0F, +0x134F, 0x403C, 0x0007, 0x0A0F, 0x134F, 0x4309, 0x407C, 0x00D0, 0x0B0F, +0x134F, 0x5319, 0x430C, 0x0A0F, 0x134F, 0x934C, 0x3803, 0x9039, 0x0BB8, +0x3BF3, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x080F, 0x134F, +0x411C, 0x0006, 0x411D, 0x0008, 0x080F, 0x134F, 0x432C, 0x430D, 0x080F, +0x134F, 0x411C, 0x002A, 0x411D, 0x002C, 0x080F, 0x134F, 0x422C, 0x430D, +0x080F, 0x134F, 0x411C, 0x0026, 0x411D, 0x0028, 0x080F, 0x134F, 0x403C, +0x0006, 0x430D, 0x080F, 0x134F, 0x411C, 0x0022, 0x411D, 0x0024, 0x080F, +0x134F, 0x403C, 0x0080, 0x430D, 0x080F, 0x134F, 0x411C, 0x001E, 0x411D, +0x0020, 0x080F, 0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x403C, 0x0005, +0x0A0F, 0x134F, 0x4038, 0x0032, 0x4079, 0x00C8, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x1501, 0x0A0F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0x5338, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, 0x9308, 0x23F5, +0x407C, 0x0030, 0x0B0F, 0x134F, 0x403C, 0x0007, 0x0A0F, 0x134F, 0x403C, +0x0006, 0x0A0F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x1501, 0x0A0F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x05C8, 0x00A8, +0x0030, 0xB23C, 0x2C0D, 0x3C1F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0xB23C, 0x2811, +0x411C, 0x001A, 0x411D, 0x001C, 0x4C0E, 0x4D0F, 0x531E, 0x630F, 0x4E81, +0x001A, 0x4F81, 0x001C, 0x930D, 0x2003, 0x903C, 0x7530, 0x2BE1, 0x444C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0xB03C, +0x0100, 0x7646, 0x5356, 0x435C, 0x080F, 0x134F, 0x411E, 0x0016, 0x411F, +0x0018, 0x531E, 0x630F, 0x4E81, 0x0016, 0x4F81, 0x0018, 0x9346, 0x2005, +0x930F, 0x2003, 0x903E, 0x2710, 0x2BE2, 0x494C, 0x0B0F, 0x134F, 0x403C, +0x0501, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x00A5, 0x0018, 0x430C, 0x430D, 0x050F, +0x134F, 0x4C06, 0x4D07, 0x444C, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x4C0F, 0xF22F, 0x4F81, 0x000A, 0xB03C, 0x0020, 0x2804, 0x5036, 0xFFFE, +0x6337, 0x3C03, 0x5036, 0xFFFC, 0x6337, 0x9036, 0xFFFE, 0x2028, 0x434C, +0x080F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x403C, 0xFFFE, 0x430D, +0x050F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C07, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4781, 0x000E, +0x4381, 0x0010, 0x3C04, 0x4681, 0x000E, 0x4781, 0x0010, 0x407C, 0x0030, +0x0B0F, 0x134F, 0x403C, 0x000E, 0x0A0F, 0x134F, 0x444C, 0x0B0F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x410C, 0x522C, 0x002F, 0x2C26, 0x0F3F, 0x002C, +0x134F, 0x410C, 0x530C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4116, +0x0004, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x460C, +0x430D, 0x050F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C07, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4781, +0x000C, 0x474F, 0xD12F, 0x4F81, 0x0000, 0x4F81, 0x0002, 0x4116, 0x0004, +0x434C, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x0500, 0x0A0F, +0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x460C, 0x430D, 0x050F, 0x134F, +0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, 0x411C, 0x0002, +0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, +0x0501, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x4C4C, 0x903C, 0x0098, +0x2403, 0x4036, 0x018C, 0x3C02, 0x4036, 0x014C, 0x434C, 0x080F, 0x134F, +0x4074, 0x0082, 0x444C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, +0x0260, 0x0A0F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x1401, 0x0A0F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x0087, 0x2B3E, 0x9387, 0x0000, 0x2405, 0x403C, 0x0FF6, 0x0A0F, +0x134F, 0x3C03, 0x460C, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x9387, 0x0000, 0x2407, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, +0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, +0x0A0F, 0x134F, 0x4C06, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x9387, 0x0000, 0x2007, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4681, 0x0012, +0x434C, 0x080F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x440C, 0x0A0F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x1401, 0x0A0F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x460C, 0xF03C, 0xFFE7, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x0A0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0B0F, 0x134F, 0x430C, 0x430D, 0x050F, 0x134F, 0x435C, 0x080F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4191, 0x000A, 0x0014, 0x403D, +0x000A, 0x410C, 0x503C, 0x000C, 0x002F, 0x2C26, 0x0F3F, 0x000C, 0x134F, +0x430C, 0x5031, 0x002E, 0x1674, 0x0110, 0x147B, 0x8031, 0x003C, 0x4C05, +0x4381, 0x0012, 0x4381, 0x0014, 0x4381, 0x0016, 0x4381, 0x0010, 0x4381, +0x000E, 0x4304, 0xB31C, 0x290A, 0x0088, 0x2C26, 0x410C, 0x503C, 0x0012, +0x080F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFE, 0x0180, +0x32E8, 0x432C, 0x080F, 0x0F3F, 0x0038, 0x134F, 0x410C, 0x503C, 0x000C, +0x080F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFC, 0x0180, +0x32E8, 0x410C, 0x503C, 0x0014, 0x080F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFFB, 0x0180, 0x32E8, 0x0087, 0x27F0, 0x07CC, 0x080F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFFA, 0x0180, 0x32E8, +0x410C, 0x503C, 0x000E, 0x080F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFF9, 0x0180, 0x32E8, 0x410C, 0x503C, 0x0010, 0x080F, 0x0F3F, +0x002C, 0x134F, 0x933C, 0x2407, 0x422C, 0x080F, 0x0F3F, 0x0038, 0x134F, +0x933C, 0x2004, 0x403C, 0xFFF8, 0x0180, 0x32E8, 0x4191, 0x0014, 0x0018, +0x4191, 0x0016, 0x001A, 0x1840, 0x47A1, 0x001C, 0x1840, 0x4791, 0x0002, +0x001E, 0x4191, 0x000E, 0x0020, 0x4381, 0x0022, 0x4191, 0x0010, 0x0024, +0x4381, 0x0026, 0x410C, 0x503C, 0x0018, 0x13B1, 0x7070, 0x4118, 0x000C, +0x0086, 0x2BD2, 0x06CB, 0x00AB, 0x0008, 0x407C, 0x0028, 0x0B0F, 0x134F, +0x06CA, 0x00AA, 0x0014, 0x430C, 0x0A0F, 0x134F, 0x06C9, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x403C, 0x0080, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x0A0F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x480C, +0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x4303, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x063F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0401, 0x0A0F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x407C, 0x00A8, 0x0B0F, 0x134F, 0x430A, 0x430B, +0x403C, 0x0005, 0x1380, 0x2B86, 0x531A, 0x630B, 0x13B0, 0xFDC0, 0x903C, +0xBABE, 0x2003, 0x903D, 0xABAD, 0x2405, 0x930B, 0x2003, 0x903A, 0x012C, +0x2BED, 0x930B, 0x2003, 0x903A, 0x012C, 0x2802, 0x4034, 0xFFF7, 0xB397, +0x0000, 0x2810, 0x53B7, 0x0000, 0x63B7, 0x0002, 0x1840, 0x4392, 0x2806, +0x3C08, 0x008C, 0x2808, 0x134F, 0x4C04, 0x53B7, 0x0000, 0x63B7, 0x0002, +0x0087, 0x27F0, 0x472F, 0xD71F, 0x0002, 0x930F, 0x2417, 0x9304, 0x2015, +0x0088, 0x2C26, 0x080F, 0x0F3F, 0x002C, 0xB397, 0x0000, 0x2BE7, 0x008C, +0x280A, 0x134F, 0x4C04, 0x1840, 0x421D, 0x280A, 0x1840, 0x421C, 0x2808, +0x13B1, 0xBE82, 0x3FDE, 0x1840, 0x9382, 0x2806, 0x241F, 0x9304, 0x201D, +0x473F, 0xD73F, 0x930F, 0x2019, 0xB325, 0x2817, 0x008C, 0x2808, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4C04, 0x403D, 0xAAAA, 0x1840, 0x421C, +0x2808, 0x13B1, 0xBE82, 0x935C, 0x2003, 0x403C, 0xFFBF, 0x3DF7, 0x1840, +0x4382, 0x2806, 0xB325, 0x29BC, 0x430A, 0x430B, 0x403C, 0x000A, 0x1380, +0x2B86, 0x531A, 0x630B, 0x13B0, 0xFDC0, 0x903C, 0xBABE, 0x2003, 0x903D, +0xCAFE, 0x2405, 0x930B, 0x2003, 0x903A, 0x012C, 0x2BED, 0x4105, 0x5035, +0x0028, 0x0088, 0x2C26, 0x930B, 0x2003, 0x903A, 0x012C, 0x2970, 0x4034, +0xFFBF, 0x410C, 0x522C, 0x018E, 0xD0FE, 0x427D, 0x13B1, 0xCF3E, 0x1840, +0x42D1, 0x2470, 0x0004, 0x008F, 0x2470, 0x4FD1, 0x0001, 0x0005, 0x1405, +0x430F, 0x434E, 0x423D, 0x410C, 0x523C, 0x080B, 0x0B3B, 0x001C, 0x134B, +0x403C, 0x0003, 0x002F, 0x2A00, 0x134F, 0x05CC, 0x080F, 0x0F3F, 0x0020, +0x134F, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0028, 0x0B0F, +0x134F, 0x4C4C, 0x5221, 0x903C, 0x0098, 0x2403, 0x403F, 0x018C, 0x3C02, +0x403F, 0x014C, 0x4F81, 0x0000, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x00AA, +0x0014, 0x403C, 0x0A60, 0x0A0F, 0x134F, 0x4076, 0x00C8, 0x464C, 0x0B0F, +0x134F, 0x403C, 0x1401, 0x0A0F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x0087, 0x2B3E, 0x9387, +0x0000, 0x2405, 0x403C, 0x0FF6, 0x0A0F, 0x134F, 0x3C03, 0x412C, 0x0A0F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x3FFD, +0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x9387, 0x0000, 0x2407, 0x464C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0000, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x4C81, 0x0002, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x9387, 0x0000, 0x2007, 0x464C, 0x0B0F, 0x134F, 0x403C, +0x0501, 0x0A0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, +0x27F6, 0x1840, 0x4F82, 0x27F8, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x4C4C, +0x903C, 0x0098, 0x2403, 0x403F, 0x018C, 0x3C02, 0x403F, 0x014C, 0x4F81, +0x0000, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x0B60, 0x0A0F, 0x134F, 0x464C, 0x0B0F, 0x134F, +0x403C, 0x1401, 0x0A0F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x9387, 0x0000, 0x2405, 0x403C, +0x0FF6, 0x0A0F, 0x134F, 0x3C03, 0x412C, 0x0A0F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x3FFD, 0x0A0F, 0x134F, 0x434C, +0x090F, 0x134F, 0x9387, 0x0000, 0x2407, 0x464C, 0x0B0F, 0x134F, 0x403C, +0x0501, 0x0A0F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0000, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0002, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x9387, +0x0000, 0x2007, 0x464C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x0A0F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, 0x27FA, 0x1840, 0x4F82, +0x27FC, 0x4E0B, 0xDF0B, 0x930B, 0x240B, 0x1840, 0x90B2, 0xFFFE, 0x27F6, +0x2004, 0x1840, 0x9382, 0x27F8, 0x2402, 0x4034, 0xFFF6, 0x410C, 0x522C, +0x018E, 0xD106, 0x427D, 0x13B1, 0xCF3E, 0x1840, 0x42D1, 0x2470, 0x0004, +0x008F, 0x2470, 0x4FD1, 0x0001, 0x0005, 0x1405, 0x430F, 0x434E, 0x423D, +0x410C, 0x523C, 0x080B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, +0x2A00, 0x134F, 0x05CC, 0x080F, 0x0F3F, 0x0020, 0x134F, 0x1840, 0x421C, +0x27F4, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x5221, 0x3C35, 0x0088, 0x2C26, +0x080B, 0x9314, 0x2007, 0x407C, 0x0091, 0x0B3F, 0x0024, 0x134F, 0x4304, +0x3C29, 0x410C, 0x522C, 0x018E, 0xD10E, 0x427D, 0x13B1, 0xCF3E, 0x1840, +0x42D1, 0x2470, 0x0004, 0x008F, 0x2470, 0x4FD1, 0x0001, 0x0005, 0x4105, +0x5035, 0x0028, 0x1405, 0x430F, 0x434E, 0x423D, 0x410C, 0x523C, 0x0B3B, +0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2A00, 0x134F, 0x05CC, 0x080F, +0x0F3F, 0x0020, 0x134F, 0x4034, 0xFFF6, 0x5221, 0x440C, 0x5031, 0x003C, +0x1674, 0x0110, 0x147B, 0x8031, 0x0014, 0x4381, 0x0000, 0x4305, 0x434B, +0x410C, 0x522C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, +0x403C, 0xFFDA, 0x0180, 0x3910, 0x410C, 0x532C, 0x002F, 0x2C26, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFD9, 0x0180, 0x3910, 0x410D, +0x503D, 0x0010, 0x403C, 0xAA01, 0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2402, 0x013B, 0x0010, 0x03DB, 0x2402, 0x438B, 0x0000, 0x0084, +0x2BD2, 0x04CB, 0x00AB, 0x0008, 0x4078, 0x00C8, 0x484C, 0x0B0F, 0x134F, +0x04C9, 0x00A9, 0x0014, 0x4036, 0x2401, 0x460C, 0x090F, 0x134F, 0x407C, +0x0028, 0x0B0F, 0x134F, 0x907C, 0x0089, 0x2404, 0x403C, 0xFFD0, 0x0180, +0x3910, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C0A, +0x04C7, 0x00A7, 0x0030, 0x435C, 0x070F, 0x134F, 0xB03A, 0x0200, 0x2C50, +0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, 0x043F, 0x0010, 0x134F, +0x407C, 0x0090, 0x0B0F, 0x134F, 0x403C, 0x0089, 0x090F, 0x134F, 0x430C, +0x090F, 0x134F, 0x4C0A, 0x407C, 0x0090, 0x0B0F, 0x134F, 0x403C, 0x0088, +0x090F, 0x134F, 0xD03A, 0x0040, 0x4A0C, 0x090F, 0x134F, 0x4C0A, 0x407C, +0x0090, 0x0B0F, 0x134F, 0x403C, 0x0088, 0x090F, 0x134F, 0xF03A, 0xFFBF, +0x4A0C, 0x090F, 0x134F, 0x403A, 0x0032, 0x484C, 0x0B0F, 0x134F, 0x460C, +0x090F, 0x134F, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, +0x533A, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, 0x930A, 0x23F5, 0x930A, +0x2401, 0x4C05, 0xB325, 0x2C04, 0x403C, 0xFFDB, 0x0180, 0x3910, 0xB325, +0x280D, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, +0x134F, 0x435C, 0x070F, 0x134F, 0x3C06, 0x484C, 0x0B0F, 0x134F, 0x460C, +0x090F, 0x134F, 0x00A4, 0x0010, 0x1840, 0x9382, 0x2896, 0x2411, 0x407C, +0x0054, 0x0B0F, 0x134F, 0x434C, 0x040F, 0x134F, 0x4C4A, 0x407C, 0x0054, +0x0B0F, 0x134F, 0x4A4C, 0xD07C, 0x0080, 0x040F, 0x134F, 0x4075, 0x0082, +0x454C, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, 0x403C, 0x4303, 0x090F, +0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, +0x070F, 0x134F, 0x430A, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x435C, 0x040F, +0x134F, 0x435C, 0x070F, 0x134F, 0x3C07, 0x434C, 0x070F, 0x134F, 0x435C, +0x070F, 0x134F, 0x531A, 0x903A, 0x000A, 0x2C13, 0x407C, 0x0028, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, +0x430F, 0x3C01, 0x433F, 0x930F, 0x23E5, 0x430F, 0x3C01, 0x433F, 0x930F, +0x20E2, 0x1840, 0x93A2, 0x2890, 0x201A, 0x1840, 0x9382, 0x2892, 0x2016, +0x407C, 0x0090, 0x0B0F, 0x134F, 0x450C, 0x090F, 0x134F, 0x403C, 0x000F, +0x090F, 0x134F, 0x407C, 0x0090, 0x0B0F, 0x134F, 0x450C, 0x090F, 0x134F, +0x403C, 0x000C, 0x090F, 0x134F, 0x1840, 0x90B2, 0x0003, 0x2890, 0x200E, +0x1840, 0x9382, 0x2892, 0x200A, 0x407C, 0x0090, 0x0B0F, 0x134F, 0x450C, +0x090F, 0x134F, 0x423C, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, 0x484C, +0x0B0F, 0x134F, 0x403C, 0x2C01, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, +0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, +0x484C, 0x0B0F, 0x134F, 0x403C, 0x2C01, 0x090F, 0x134F, 0x435C, 0x070F, +0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x403C, 0x0401, +0x090F, 0x134F, 0x407C, 0x0098, 0x0B0F, 0x134F, 0x403C, 0x0080, 0x090F, +0x134F, 0x403C, 0x0880, 0x090F, 0x134F, 0x403C, 0x0080, 0x090F, 0x134F, +0x403C, 0x0880, 0x090F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, +0x0024, 0x040F, 0x134F, 0x3C0A, 0x434C, 0x070F, 0x134F, 0x435C, 0x070F, +0x134F, 0x412F, 0x531F, 0x4F81, 0x0000, 0x90B1, 0x000A, 0x0000, 0x2C0D, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x903C, 0xFFFE, +0x2403, 0x903C, 0x0F00, 0x23E5, 0x90B1, 0x000A, 0x0000, 0x244B, 0x434C, +0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x435C, +0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407A, 0x0021, 0x4A4C, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x4381, 0x0000, +0x407C, 0x0048, 0x0B0F, 0x134F, 0x435C, 0x040F, 0x134F, 0x435C, 0x070F, +0x134F, 0x3C0A, 0x434C, 0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x412F, +0x531F, 0x4F81, 0x0000, 0x90B1, 0x000A, 0x0000, 0x2C13, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, +0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E1, 0x430F, 0x3C01, 0x433F, +0x930F, 0x2403, 0x403C, 0xFFD1, 0x3D0C, 0x4191, 0x0004, 0x0000, 0x454C, +0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, +0x484C, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x070F, +0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x412C, +0x090F, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, +0x434C, 0x070F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C81, 0x0000, 0x434C, +0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x4A4C, +0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, 0x41A1, 0x0008, 0x415F, 0x0008, +0xD11F, 0x0002, 0x4F81, 0x0002, 0x4F81, 0x0006, 0x4191, 0x0004, 0x0000, +0x454C, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, 0x070F, +0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x090F, 0x134F, 0x435C, +0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0048, 0x0B0F, 0x134F, +0x427C, 0x040F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x412C, 0x090F, +0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, 0x411C, 0x0006, 0x090F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x484C, 0x0B0F, 0x134F, +0x460C, 0x090F, 0x134F, 0x4A4C, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, +0x4A4C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C81, 0x000A, 0x4381, +0x000C, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x090F, 0x134F, 0x454C, +0x0B0F, 0x134F, 0x403C, 0x4030, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, +0x435C, 0x070F, 0x134F, 0x403C, 0x0C04, 0x090F, 0x134F, 0x434C, 0x070F, +0x134F, 0x435C, 0x070F, 0x134F, 0x4A4C, 0x0B0F, 0x134F, 0x434C, 0x070F, +0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x435C, 0x070F, +0x134F, 0x484C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x090F, 0x134F, 0x454C, +0x0B0F, 0x134F, 0x403C, 0x4282, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, 0x454C, 0x0B0F, +0x134F, 0x403C, 0x00FE, 0x090F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, +0x0042, 0x0B0F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, +0x435C, 0x070F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C0A, 0x434C, 0x070F, +0x134F, 0x484C, 0x0B0F, 0x134F, 0x460C, 0x090F, 0x134F, 0x435C, 0x070F, +0x134F, 0x4A81, 0x000E, 0x423D, 0x410C, 0x523C, 0x002F, 0x2C26, 0x0F3F, +0x000C, 0x134F, 0x430C, 0x5031, 0x0014, 0x1674, 0x0110, 0x147B, 0x8031, +0x0016, 0x0089, 0x2BD2, 0x09CA, 0x00AA, 0x0008, 0x407C, 0x0028, 0x0A0F, +0x134F, 0x4C44, 0x09CB, 0x00AB, 0x0014, 0x9034, 0x0099, 0x2011, 0x407C, +0x00F4, 0x0A0F, 0x134F, 0x403C, 0x40A0, 0x0B0F, 0x134F, 0x407C, 0x0054, +0x0A0F, 0x134F, 0x430C, 0x431D, 0x093F, 0x001C, 0x134F, 0x407C, 0x00B0, +0x0A0F, 0x134F, 0x403C, 0x0088, 0x430D, 0x093F, 0x001C, 0x134F, 0x403C, +0x6D8E, 0x430D, 0x093F, 0x001C, 0x134F, 0x407C, 0x0030, 0x0A0F, 0x134F, +0x403C, 0x0005, 0x0B0F, 0x134F, 0x4076, 0x00C8, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x1501, 0x0B0F, 0x134F, 0x4307, 0x407C, 0x0028, 0x0A0F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0xB03C, 0x0200, 0x2C05, 0x470F, 0x5317, 0x903F, +0x0032, 0x2BF5, 0x9037, 0x0032, 0x7F0F, 0xF31F, 0x2002, 0x0180, 0x3F1E, +0x09C8, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x403C, 0x0C01, 0x0B0F, 0x134F, 0x403C, 0x0028, +0x1380, 0x2B86, 0x403C, 0x0401, 0x0B0F, 0x134F, 0x9034, 0x0091, 0x2406, +0x9034, 0x0099, 0x2403, 0x9034, 0x0098, 0x2027, 0x407C, 0x0082, 0x0A0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x422C, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x9034, 0x0091, 0x2006, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x3C12, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0030, +0x0A0F, 0x134F, 0x403C, 0x000E, 0x0B0F, 0x134F, 0x407C, 0x0028, 0x0A0F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x410C, 0x503C, 0x0006, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x410C, 0x522C, 0x002F, 0x2C26, 0x0F3F, 0x002C, +0x134F, 0x4191, 0x0006, 0x0012, 0x4381, 0x0014, 0x434C, 0x080F, 0x134F, +0x4075, 0x00C1, 0x454C, 0x0A0F, 0x134F, 0x09C7, 0x00A7, 0x0018, 0x411C, +0x0012, 0x411D, 0x0014, 0xF03D, 0x000F, 0x070F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x4C81, 0x0000, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x41A1, 0x0008, 0x415F, 0x0008, 0xD11F, +0x0004, 0x4F81, 0x0004, 0x4F81, 0x0000, 0x4191, 0x0006, 0x0012, 0x4381, +0x0014, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0500, +0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x411C, 0x0012, 0x411D, 0x0014, +0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x412C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x430C, +0x430D, 0x070F, 0x134F, 0x903C, 0xFFFE, 0x2409, 0x9034, 0x0091, 0x2406, +0x9034, 0x0099, 0x2403, 0x9034, 0x0098, 0x2028, 0x434C, 0x080F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x403C, 0xFFFE, 0x430D, 0x070F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C81, 0x0000, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x41A1, 0x000A, 0x4381, 0x000C, +0x3C07, 0x503C, 0xFFFC, 0x633D, 0x4C81, 0x000A, 0x4D81, 0x000C, 0x4381, +0x000E, 0x431C, 0x002F, 0x2C26, 0x0F3F, 0x0038, 0x134F, 0x4381, 0x0002, +0x3C90, 0x411C, 0x0002, 0xE03C, 0x8000, 0x0FAC, 0xACD8, 0x002F, 0x2C26, +0x0F3F, 0x0028, 0x134F, 0x411F, 0x0002, 0x1840, 0x93CF, 0x2CD8, 0x247A, +0x4F4C, 0x13B1, 0xCE4E, 0x1840, 0xF21C, 0x2898, 0x1840, 0xF21D, 0x289A, +0x4C0F, 0xDD0F, 0x930F, 0x2002, 0x430F, 0x3C01, 0x431F, 0x4F81, 0x0010, +0x411F, 0x0002, 0x1840, 0x4F5F, 0x2CD8, 0x503F, 0x9600, 0x4F81, 0x0000, +0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0500, 0x0B0F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, 0x0110, 0x430D, 0x070F, 0x134F, +0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x412C, 0x0B0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0501, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x0500, 0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, 0x011E, 0x430D, +0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, +0x411C, 0x0010, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411F, 0x0002, 0x531F, 0x4F81, +0x0002, 0x90B1, 0x0020, 0x0002, 0x3B6C, 0x407C, 0x00B0, 0x0A0F, 0x134F, +0x403C, 0x0088, 0x430D, 0x093F, 0x001C, 0x134F, 0x403C, 0x000E, 0x430D, +0x093F, 0x001C, 0x134F, 0x9034, 0x0091, 0x20A8, 0x434C, 0x080F, 0x134F, +0x454C, 0x0A0F, 0x134F, 0x403C, 0x0102, 0x430D, 0x070F, 0x134F, 0x435C, +0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0A0F, 0x134F, +0x430C, 0x0B0F, 0x134F, 0x4C09, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4981, 0x0000, 0xB2B1, 0x0000, 0x2881, +0x407C, 0x0028, 0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0082, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, +0x0080, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x403C, 0x1400, 0x0B0F, 0x134F, 0x407C, 0x0082, 0x0A0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x422C, 0x0B0F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x4303, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0x430C, 0x430D, +0x070F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0A0F, 0x134F, 0xC2B1, 0x0000, +0x4129, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, 0x0500, +0x0B0F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x403C, 0x0102, 0x430D, 0x070F, +0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x00A1, 0x0A0F, 0x134F, 0x490C, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x403C, +0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x423D, 0x410C, 0x523C, 0x002F, 0x2C26, 0x0F3F, +0x000C, 0x134F, 0x430C, 0x3C01, 0x433C, 0x5031, 0x0016, 0x1674, 0x0110, +0x147B, 0x8031, 0x0016, 0x4381, 0x0000, 0x4305, 0x410C, 0x523C, 0x403E, +0x0005, 0x13B1, 0xCF56, 0x4381, 0x0006, 0x434B, 0x410C, 0x522C, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFD3, 0x0180, +0x4522, 0x410C, 0x532C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x933C, +0x2004, 0x403C, 0xFFD2, 0x0180, 0x4522, 0x410D, 0x503D, 0x0012, 0x403C, +0xAA01, 0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2402, 0x013B, +0x0012, 0x03DB, 0x2402, 0x438B, 0x0000, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, +0x0030, 0x435C, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0008, 0x4074, 0x0028, +0x444C, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0014, 0x430C, 0x090F, 0x134F, +0x4076, 0x00C8, 0xB03C, 0x0200, 0x2C25, 0x407C, 0x0088, 0x080F, 0x134F, +0x407C, 0x0034, 0x0A3F, 0x0010, 0x134F, 0x4037, 0x0032, 0x464C, 0x080F, +0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x444C, 0x080F, 0x134F, 0x430C, +0x090F, 0x134F, 0x5337, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, 0x9307, +0x23F5, 0x9307, 0x2401, 0x4C05, 0x9305, 0x2550, 0xB325, 0x280E, 0x434C, +0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x3400, 0x090F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x3C07, 0x464C, 0x080F, 0x134F, 0x403C, 0x3400, +0x090F, 0x134F, 0x0087, 0x2890, 0x9387, 0x0006, 0x2413, 0x407C, 0x0054, +0x080F, 0x134F, 0x434C, 0x0A3F, 0x0010, 0x134F, 0x4C45, 0x407C, 0x0054, +0x080F, 0x134F, 0x454C, 0xD07C, 0x0080, 0x0A3F, 0x0010, 0x134F, 0x4305, +0x407C, 0x0048, 0x080F, 0x134F, 0x435C, 0x0A3F, 0x0010, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x3C07, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x5315, 0x9035, 0x000A, 0x2C12, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, +0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, +0x930F, 0x23E6, 0x430F, 0x3C01, 0x433F, 0x930F, 0x211F, 0x4075, 0x0021, +0x454C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C81, 0x000A, 0x4381, +0x000C, 0x407C, 0x0030, 0x080F, 0x134F, 0x403C, 0x0003, 0x090F, 0x134F, +0x430C, 0x090F, 0x134F, 0x93A7, 0x0000, 0x201B, 0x9387, 0x0002, 0x2018, +0x407C, 0x0090, 0x080F, 0x134F, 0x403C, 0x0082, 0x090F, 0x134F, 0x403C, +0x000F, 0x090F, 0x134F, 0x407C, 0x0090, 0x080F, 0x134F, 0x403C, 0x0082, +0x090F, 0x134F, 0x403C, 0x000C, 0x090F, 0x134F, 0x90B7, 0x0003, 0x0000, +0x200E, 0x9387, 0x0002, 0x200B, 0x407C, 0x0090, 0x080F, 0x134F, 0x403C, +0x0082, 0x090F, 0x134F, 0x423C, 0x090F, 0x134F, 0x472F, 0xD71F, 0x0002, +0x930F, 0x241C, 0x9387, 0x0004, 0x2419, 0x407C, 0x0090, 0x080F, 0x134F, +0x403C, 0x0089, 0x090F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C07, 0x407C, +0x0090, 0x080F, 0x134F, 0x403C, 0x0088, 0x090F, 0x134F, 0xD037, 0x0010, +0x470C, 0x090F, 0x134F, 0x4077, 0x0082, 0x474C, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x403C, 0xD034, 0x090F, 0x134F, 0x13B1, 0xC1BA, 0x4C0F, +0xDD0F, 0x930F, 0x207B, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, +0x934C, 0x3410, 0x474C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, +0xD034, 0x090F, 0x134F, 0x13B1, 0xC1BA, 0x4C0F, 0xDD0F, 0x930F, 0x2063, +0x474C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, +0x13B1, 0xC1BA, 0x4C0F, 0xDD0F, 0x930F, 0x2054, 0x444C, 0x080F, 0x134F, +0x3C0A, 0x13B1, 0xC1BA, 0x4C0F, 0xDD0F, 0x930F, 0x204A, 0x412F, 0x531F, +0x4F81, 0x0000, 0x430C, 0x090F, 0x134F, 0x934C, 0x3804, 0x90B1, 0x000A, +0x0000, 0x2BED, 0x90B1, 0x000A, 0x0000, 0x2439, 0x454C, 0x080F, 0x134F, +0x430C, 0x090F, 0x134F, 0x822C, 0x4C81, 0x000A, 0x4381, 0x000C, 0x9381, +0x0000, 0x2032, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xB03C, +0x0020, 0x2835, 0x53A1, 0x000A, 0x474C, 0x080F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x403C, 0xC032, 0x090F, 0x134F, 0x13B1, 0xC1BA, 0x4C0F, 0xDD0F, +0x930F, 0x2010, 0x474C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, +0x0010, 0x090F, 0x134F, 0x13B1, 0xC1BA, 0x4C0F, 0xDD0F, 0x930F, 0x2403, +0x403C, 0xFFD4, 0x3D2F, 0x40B1, 0x0010, 0x0006, 0x3C0C, 0x454C, 0x080F, +0x134F, 0x430C, 0x090F, 0x134F, 0x4C81, 0x000A, 0x4381, 0x000C, 0x4391, +0x0010, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x444C, +0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, +0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, 0x403C, 0xFFD1, 0x3D05, +0x4114, 0x0004, 0x474C, 0x080F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2409, 0x090F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x00C1, +0x080F, 0x134F, 0x440C, 0x090F, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, +0x4C04, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, +0x090F, 0x134F, 0x454C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x4481, +0x0008, 0x444F, 0xD11F, 0x0002, 0x4F81, 0x0002, 0x4F81, 0x0000, 0x4114, +0x0004, 0x474C, 0x080F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2409, 0x090F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0048, 0x080F, +0x134F, 0x427C, 0x0A3F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, +0x440C, 0x090F, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x412C, 0x090F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, +0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x454C, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x3401, 0x090F, 0x134F, +0x474C, 0x080F, 0x134F, 0x403C, 0x4030, 0x090F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x0C04, 0x090F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x454C, 0x080F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x3401, 0x090F, +0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x4282, 0x090F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x474C, 0x080F, 0x134F, 0x403C, 0x00FE, 0x090F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x4C07, +0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0xD117, 0x0006, 0x4781, 0x000E, 0x403D, +0x000A, 0x410C, 0x523C, 0x002F, 0x2C26, 0x0F3F, 0x000C, 0x134F, 0x430C, +0x5031, 0x0016, 0x1674, 0x0110, 0x147B, 0x8031, 0x0016, 0x4381, 0x0000, +0x4305, 0x410C, 0x523C, 0x403E, 0x0005, 0x13B1, 0xCF56, 0x4381, 0x0006, +0x434B, 0x410C, 0x522C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2404, 0x403C, 0xFFD3, 0x0180, 0x4A96, 0x410C, 0x532C, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2004, 0x403C, 0xFFD2, 0x0180, 0x4A96, +0x410D, 0x503D, 0x0012, 0x403C, 0xAA01, 0x002F, 0x2C26, 0x0F3F, 0x0058, +0x134F, 0x930C, 0x2402, 0x013B, 0x0012, 0x03DB, 0x2402, 0x438B, 0x0000, +0x008A, 0x2BD2, 0x0ACB, 0x00AB, 0x0030, 0x435C, 0x0B0F, 0x134F, 0x0AC8, +0x00A8, 0x0008, 0x4074, 0x0028, 0x444C, 0x080F, 0x134F, 0x0AC9, 0x00A9, +0x0014, 0x430C, 0x090F, 0x134F, 0x4077, 0x00C8, 0xB03C, 0x0200, 0x2C27, +0x407C, 0x0088, 0x080F, 0x134F, 0x407C, 0x0034, 0x0A3F, 0x0010, 0x134F, +0x4036, 0x0032, 0x474C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, +0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0x5336, 0x933C, 0x2403, +0xB03C, 0x0200, 0x2C02, 0x9306, 0x23F5, 0x9306, 0x2402, 0x4C81, 0x0000, +0x9381, 0x0000, 0x24EF, 0xB3A1, 0x0000, 0x280E, 0x434C, 0x0B0F, 0x134F, +0x474C, 0x080F, 0x134F, 0x403C, 0x3400, 0x090F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x3C07, 0x474C, 0x080F, 0x134F, 0x403C, 0x3400, 0x090F, 0x134F, +0x4306, 0x407C, 0x0048, 0x080F, 0x134F, 0x435C, 0x0A3F, 0x0010, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x3C07, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x5316, 0x9036, 0x000A, 0x2C12, 0x444C, 0x080F, 0x134F, 0x430C, +0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, +0x433F, 0x930F, 0x23E6, 0x430F, 0x3C01, 0x433F, 0x930F, 0x20D8, 0x407C, +0x0021, 0x080F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x4C81, +0x000A, 0x4D81, 0x000C, 0x407C, 0x0030, 0x080F, 0x134F, 0x403C, 0x0003, +0x090F, 0x134F, 0x430C, 0x090F, 0x134F, 0x1840, 0x93A2, 0x2890, 0x2023, +0x1840, 0x9382, 0x2892, 0x201F, 0x407C, 0x00B0, 0x080F, 0x134F, 0x0AC6, +0x00A6, 0x001C, 0x403C, 0x0082, 0x430D, 0x060F, 0x134F, 0x403C, 0x000F, +0x430D, 0x060F, 0x134F, 0x407C, 0x00B0, 0x080F, 0x134F, 0x403C, 0x0082, +0x430D, 0x060F, 0x134F, 0x403C, 0x000C, 0x430D, 0x060F, 0x134F, 0x4076, +0x0082, 0x464C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x4303, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x444C, 0x080F, 0x134F, 0x3C0A, 0x13B1, 0xC252, +0x4C0F, 0xDD0F, 0x930F, 0x204C, 0x5315, 0x430C, 0x090F, 0x134F, 0x430C, +0x090F, 0x134F, 0x934C, 0x3803, 0x9035, 0x000A, 0x2BEE, 0x9035, 0x000A, +0x243D, 0x407C, 0x0021, 0x080F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, +0x134F, 0x503C, 0xFFFE, 0x633D, 0x4C81, 0x000A, 0x4D81, 0x000C, 0x9305, +0x2032, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xB03C, 0x0020, +0x2838, 0x53A1, 0x000A, 0x464C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x403C, 0xC032, 0x090F, 0x134F, 0x13B1, 0xC252, 0x4C0F, 0xDD0F, 0x930F, +0x2010, 0x464C, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x0010, +0x090F, 0x134F, 0x13B1, 0xC252, 0x4C0F, 0xDD0F, 0x930F, 0x2403, 0x403C, +0xFFD4, 0x3D47, 0x40B1, 0x0010, 0x0006, 0x3C0F, 0x407C, 0x0021, 0x080F, +0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x4C81, 0x000A, 0x4D81, +0x000C, 0x4391, 0x0010, 0x474C, 0x080F, 0x134F, 0x403C, 0x2401, 0x090F, +0x134F, 0x444C, 0x080F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, +0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x2403, 0x403C, +0xFFD1, 0x3D1A, 0x4114, 0x0004, 0x464C, 0x080F, 0x134F, 0x403C, 0x3FFF, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, +0x2409, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x00C1, 0x080F, 0x134F, 0x440C, 0x430D, 0x0A3F, 0x0018, 0x134F, +0x407C, 0x00A1, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x4C04, 0x434C, 0x0B0F, 0x134F, 0x474C, +0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x407C, 0x0021, 0x080F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x4481, 0x0008, 0x444F, 0xD11F, 0x0002, +0x4F81, 0x0002, 0x4F81, 0x0000, 0x4114, 0x0004, 0x464C, 0x080F, 0x134F, +0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, +0x134F, 0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x407C, 0x0048, 0x080F, 0x134F, 0x427C, 0x0A3F, 0x0010, +0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, 0x440C, 0x430D, 0x0A3F, 0x0018, +0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, +0x2401, 0x090F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x4077, 0x0088, 0x474C, 0x080F, 0x134F, 0x407C, 0x0034, 0x0A3F, +0x0010, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x0080, 0x090F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x0C04, 0x090F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x0021, +0x080F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, 0x134F, 0x407C, +0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x474C, 0x080F, +0x134F, 0x403C, 0x0034, 0x090F, 0x134F, 0x464C, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x403C, 0x0260, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x464C, 0x080F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x00FC, 0x090F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x430C, 0x090F, 0x134F, 0x4C06, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x430C, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x474C, 0x080F, +0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x0B0F, 0x134F, +0xD116, 0x0006, 0x4681, 0x000E, 0x403D, 0x000A, 0x410C, 0x523C, 0x002F, +0x2C26, 0x0F3F, 0x000C, 0x134F, 0x430C, 0x5031, 0x0016, 0x1674, 0x0110, +0x147B, 0x8221, 0x0CC4, 0x1840, 0x4CA1, 0x0000, 0x1840, 0x4C91, 0x0002, +0x0002, 0x0089, 0x2BD2, 0x09CA, 0x00AA, 0x0008, 0x4075, 0x0088, 0x454C, +0x0A0F, 0x134F, 0x09C7, 0x00A7, 0x0010, 0x407C, 0x0034, 0x070F, 0x134F, +0x407B, 0x0082, 0x4B4C, 0x0A0F, 0x134F, 0x09C8, 0x00A8, 0x0030, 0x435C, +0x080F, 0x134F, 0x00A9, 0x0014, 0x412E, 0x411F, 0x0002, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x0085, 0x4E0C, 0x090F, 0x134F, +0x434C, 0x080F, 0x134F, 0x4076, 0x0042, 0x464C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412C, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, +0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4491, 0x0004, +0x0000, 0x4491, 0x0006, 0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, +0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, +0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, +0x0086, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, +0x4491, 0x0008, 0x0000, 0x4491, 0x000A, 0x0002, 0x454C, 0x0A0F, 0x134F, +0x407C, 0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x412E, 0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, +0x0F00, 0xD03E, 0x0089, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4491, 0x000C, 0x0000, 0x4491, 0x000E, 0x0002, 0x454C, +0x0A0F, 0x134F, 0x407C, 0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, +0xEF0E, 0xF03E, 0x0F00, 0xD50E, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, +0x435C, 0x080F, 0x134F, 0x4491, 0x0010, 0x0000, 0x4491, 0x0012, 0x0002, +0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x070F, 0x134F, 0x4B4C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, 0x108E, 0x108F, +0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x008A, 0x4E0C, 0x090F, 0x134F, +0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412C, 0x090F, 0x134F, +0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0024, +0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4491, 0x0014, 0x0000, 0x4491, +0x0016, 0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, 0x070F, 0x134F, +0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, +0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, 0x008B, 0x4E0C, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412C, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, +0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, 0x0A0F, 0x134F, +0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4491, 0x0018, +0x0000, 0x4491, 0x001A, 0x0002, 0x454C, 0x0A0F, 0x134F, 0x407C, 0x0034, +0x070F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x412E, +0x411F, 0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xD03E, +0x008C, 0x4E0C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x412C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, 0x0A0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x464C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x407C, 0x0024, 0x070F, 0x134F, 0x435C, 0x080F, 0x134F, +0x5221, 0x1674, 0x0110, 0x147B, 0x8031, 0x0038, 0x4C0A, 0x4381, 0x0006, +0x4381, 0x0012, 0x4381, 0x0010, 0x4381, 0x000E, 0x4344, 0x410C, 0x503C, +0x0006, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, 0x0012, +0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, 0x0010, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, 0x000E, 0x002F, 0x2C26, +0x0F3F, 0x002C, 0x134F, 0x432C, 0x002F, 0x2C26, 0x0F3F, 0x0038, 0x134F, +0x933C, 0x240E, 0x410D, 0x530D, 0x403C, 0xAA01, 0x002F, 0x2C26, 0x0F3F, +0x0058, 0x134F, 0x930C, 0x2401, 0x0104, 0x03D4, 0x2003, 0x433C, 0x0180, +0x54D6, 0x1380, 0x2C0E, 0x907C, 0x0046, 0x2404, 0x407C, 0x0046, 0x1380, +0x2BDA, 0x442F, 0x930F, 0x2508, 0x9381, 0x000E, 0x2505, 0x4381, 0x0008, +0x4381, 0x000A, 0x4381, 0x0018, 0x4381, 0x001A, 0x0087, 0x282E, 0x472F, +0x0FCB, 0x0FEF, 0x0FEB, 0x0A4F, 0x0BEF, 0x1840, 0x40FF, 0x0007, 0x2C79, +0x3C04, 0x403C, 0x0003, 0x1380, 0x2B82, 0x90B2, 0xFFA1, 0x0350, 0x2FF8, +0x93A2, 0x0350, 0x2BF5, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x421B, +0x0350, 0x421F, 0x0350, 0x1800, 0x43C1, 0x0000, 0x9B0F, 0x2C01, 0x4F0B, +0x410D, 0x530D, 0x403C, 0xAA04, 0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, +0x010D, 0x4B0E, 0x4D2F, 0x472B, 0x0BCD, 0x0BEB, 0x0BED, 0x0A4B, 0x0DEB, +0x1840, 0x4ECB, 0x2C7A, 0x108E, 0x1840, 0x4ECB, 0x2C7B, 0x1840, 0x4FCB, +0x2C7C, 0x108F, 0x1840, 0x4FCB, 0x2C7D, 0x421B, 0x0410, 0x421F, 0x0410, +0x1800, 0x43C1, 0x0014, 0x9B0F, 0x2C01, 0x4F0B, 0x410D, 0x503D, 0x0014, +0x403C, 0xAA03, 0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, 0x013D, 0x0014, +0x4B0E, 0x4D2F, 0x472B, 0x0BCD, 0x0BEB, 0x0BED, 0x0A4B, 0x0DEB, 0x1840, +0x4ECB, 0x2C86, 0x108E, 0x1840, 0x4ECB, 0x2C87, 0x1840, 0x4FCB, 0x2C88, +0x108F, 0x1840, 0x4FCB, 0x2C89, 0x410D, 0x503D, 0x0018, 0x410C, 0x523C, +0x1380, 0x2B6E, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0x120A, 0x1230, 0x001E, 0x433C, 0x433D, +0x433E, 0x433F, 0x1380, 0x2BFA, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, 0x472D, +0x0DC6, 0x0DED, 0x0DE6, 0x0A4D, 0x06ED, 0x0DC6, 0x1840, 0x48CD, 0x2C7E, +0x4C0D, 0x108D, 0x1840, 0x4DC6, 0x2C7F, 0x1840, 0x49C6, 0x2C80, 0x490D, +0x108D, 0x1840, 0x4DC6, 0x2C81, 0x1840, 0x4EC6, 0x2C82, 0x108E, 0x1840, +0x4EC6, 0x2C83, 0x1840, 0x4FC6, 0x2C84, 0x108F, 0x1840, 0x4FC6, 0x2C85, +0x430E, 0x430F, 0x411C, 0x000C, 0x411D, 0x000E, 0x13B1, 0xCF9C, 0x5221, +0x930C, 0x2407, 0x411C, 0x0008, 0x411D, 0x000A, 0x13B1, 0xCFA8, 0x3C06, +0x411C, 0x0018, 0x411D, 0x001A, 0x13B1, 0xCFA8, 0x1840, 0x4CC6, 0x2C8A, +0x108C, 0x1840, 0x4CC6, 0x2C8B, 0x5397, 0x0000, 0x90B7, 0x0005, 0x0000, +0x2046, 0x4387, 0x0000, 0x423C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, +0x407C, 0x0005, 0x002F, 0x2C26, 0x0F3F, 0x0008, 0x134F, 0x407C, 0x0013, +0x002F, 0x2C26, 0x0F3F, 0x0008, 0x134F, 0x403D, 0x005F, 0x008C, 0x2C79, +0x002F, 0x2C26, 0x0F3F, 0x000C, 0x134F, 0x431C, 0x3D25, 0x930F, 0x2019, +0x9381, 0x0006, 0x251F, 0x422C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, +0x430C, 0x430D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x430D, +0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x3D0A, 0x433C, 0x433D, +0x433E, 0x433F, 0x1380, 0x2BF6, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, 0x9384, +0x0000, 0x2435, 0x9381, 0x0012, 0x2432, 0x4347, 0xB03B, 0x4000, 0x2C29, +0xB03B, 0x0400, 0x2826, 0x431C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, +0x480C, 0x490D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x4A0C, 0x4B0D, +0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x410D, 0x530D, 0x403C, 0xAA01, +0x002F, 0x2C26, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2401, 0x0107, 0x03D7, +0x2402, 0x4387, 0x0000, 0x431F, 0x3C01, 0x432F, 0x931F, 0x2002, 0x431C, +0x3CC8, 0x9384, 0x0000, 0x2003, 0x9381, 0x0006, 0x24C1, 0x9381, 0x0010, +0x24BE, 0x4B0F, 0x108F, 0x4F4C, 0xF07C, 0x00C0, 0x907C, 0x0040, 0x24B6, +0x4191, 0x0006, 0x0004, 0x4381, 0x000C, 0x1800, 0x43C1, 0x0008, 0xB03B, +0x4000, 0x2C1D, 0x930B, 0x3806, 0x4B07, 0xF037, 0x8300, 0x9037, 0x8300, +0x2015, 0x407C, 0x0086, 0x1380, 0x2BDA, 0x907C, 0x0099, 0x200E, 0x422C, +0x1380, 0x2BE6, 0x903C, 0x1207, 0x2008, 0x430C, 0x1380, 0x2BE6, 0x903C, +0xA55A, 0x2002, 0x4391, 0x000C, 0x9381, 0x0004, 0x2015, 0x008F, 0x2826, +0x4304, 0x4305, 0x4306, 0x4037, 0x4000, 0xFF34, 0xFF35, 0xFF36, 0xFF37, +0x4B0F, 0xF03F, 0x4000, 0x9F07, 0x2005, 0x9381, 0x000C, 0x2002, 0x432C, +0x3C61, 0x422C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x480C, 0x490D, +0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x4A0C, 0x4B0D, 0x002F, 0x2C26, +0x0F3F, 0x0014, 0x134F, 0xB03B, 0x4000, 0x2C03, 0x9381, 0x0004, 0x2406, +0x9381, 0x000C, 0x2443, 0x9381, 0x0004, 0x2040, 0x410C, 0x503C, 0x001C, +0x018E, 0xD11E, 0x427D, 0x13B1, 0xCF3E, 0x1840, 0x42D1, 0x2470, 0x001C, +0x008F, 0x2470, 0x4FD1, 0x0001, 0x001D, 0x4107, 0x5037, 0x0024, 0x1407, +0x430F, 0x434E, 0x423D, 0x410C, 0x503C, 0x0020, 0x0026, 0x2C26, 0x0636, +0x001C, 0x1346, 0x403C, 0x0003, 0x002F, 0x2A00, 0x134F, 0x07CC, 0x002F, +0x2C26, 0x0F3F, 0x0020, 0x134F, 0x410D, 0x522D, 0x403C, 0xAA01, 0x002F, +0x2C26, 0x0F3F, 0x0058, 0x134F, 0x5221, 0x930C, 0x2403, 0x1800, 0x41E1, +0x0008, 0x013F, 0x0008, 0x03DF, 0x2402, 0x438F, 0x0000, 0x431C, 0x9381, +0x0004, 0x2402, 0x430C, 0x3C0C, 0x1840, 0x4882, 0x2826, 0x1840, 0x4982, +0x2828, 0x1840, 0x4A82, 0x282A, 0x1840, 0x4B82, 0x282C, 0x931C, 0x2403, +0x930C, 0x2401, 0x432C, 0x5031, 0x0038, 0x1674, 0x0110, 0x147B, 0x8031, +0x001E, 0x4381, 0x000C, 0x4381, 0x0006, 0x4381, 0x0004, 0x1800, 0x43C1, +0x001A, 0x0086, 0x2C26, 0x410C, 0x503C, 0x0010, 0x060F, 0x0F3F, 0x002C, +0x134F, 0x410C, 0x503C, 0x000E, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x410C, +0x523C, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x410C, 0x532C, 0x060F, 0x0F3F, +0x002C, 0x134F, 0x410C, 0x503C, 0x000C, 0x060F, 0x0F3F, 0x002C, 0x134F, +0x410C, 0x530C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x503C, 0x0006, +0x060F, 0x0F3F, 0x002C, 0x134F, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x002C, +0x134F, 0x4115, 0x0002, 0x008A, 0x2BD2, 0x0AC9, 0x00A9, 0x0030, 0x434C, +0x090F, 0x134F, 0x0ACB, 0x00AB, 0x0008, 0x4074, 0x0082, 0x444C, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x440C, 0x080F, +0x134F, 0x4077, 0x00C8, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x1401, 0x080F, +0x134F, 0x444C, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, +0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4115, 0x000E, 0x4191, 0x0010, 0x0012, +0x4381, 0x0014, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x0500, 0x080F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, 0x411C, 0x0012, +0x411D, 0x0014, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x00A1, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0xB0B1, 0x0010, +0x0002, 0x280B, 0x411E, 0x0008, 0x411F, 0x000A, 0x503E, 0xFFFE, 0x633F, +0x4E81, 0x0008, 0x4F81, 0x000A, 0x411E, 0x0008, 0x411F, 0x000A, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0x503E, 0x0080, 0x4E81, 0x0018, +0x4191, 0x0008, 0x0016, 0x4075, 0x0028, 0x454C, 0x0B0F, 0x134F, 0x430C, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x411C, 0x0018, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x411C, 0x0016, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x9381, 0x0000, 0x2427, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x0401, 0x080F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, +0x080F, 0x134F, 0xB32C, 0x2828, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x0403, +0x080F, 0x134F, 0x3C20, 0x435C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x403C, 0x0401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x454C, +0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x080F, 0x134F, 0xB32C, +0x2807, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x0403, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x411C, 0x000C, 0x080F, +0x134F, 0x0089, 0x2878, 0x9381, 0x0004, 0x2434, 0x9389, 0x0010, 0x2412, +0x407C, 0x00F4, 0x0B0F, 0x134F, 0x491C, 0x0012, 0x080F, 0x134F, 0xC91C, +0x0010, 0xD91C, 0x0014, 0x080F, 0x134F, 0x403C, 0x0014, 0x1380, 0x2B86, +0x492F, 0xD91F, 0x0002, 0x930F, 0x245C, 0x407C, 0x0054, 0x0B0F, 0x134F, +0x491C, 0x0004, 0x491D, 0x0006, 0x0A3F, 0x001C, 0x134F, 0x09CF, 0xC93C, +0xC93D, 0xDF1C, 0x0008, 0xDF1D, 0x000A, 0x0A3F, 0x001C, 0x134F, 0x403C, +0x0014, 0x1380, 0x2B86, 0x3C42, 0x454C, 0x0B0F, 0x134F, 0x4C47, 0x9389, +0x0010, 0x2412, 0x407C, 0x00F4, 0x0B0F, 0x134F, 0x491C, 0x0012, 0x080F, +0x134F, 0xC91C, 0x0010, 0xD91C, 0x0016, 0x080F, 0x134F, 0x403C, 0x0014, +0x1380, 0x2B86, 0x492F, 0xD91F, 0x0002, 0x930F, 0x2416, 0x407C, 0x0054, +0x0B0F, 0x134F, 0x491C, 0x0004, 0x491D, 0x0006, 0x0A3F, 0x001C, 0x134F, +0x491C, 0x000C, 0x491D, 0x000E, 0x0A3F, 0x001C, 0x134F, 0x403C, 0x0014, +0x1380, 0x2B86, 0x9037, 0x0099, 0x200B, 0x407C, 0x00F4, 0x0B0F, 0x134F, +0x430C, 0x080F, 0x134F, 0xF03C, 0xFF7F, 0x080F, 0x134F, 0x410D, 0x503D, +0x0012, 0x403C, 0xAA01, 0x060F, 0x0F3F, 0x0058, 0x134F, 0x930C, 0x2404, +0x1800, 0x41D1, 0x0012, 0x001A, 0x013F, 0x001A, 0x03DF, 0x2402, 0x439F, +0x0000, 0x407C, 0x00A8, 0x0B0F, 0x134F, 0x9381, 0x0006, 0x2402, 0x1380, +0x2B7E, 0x430C, 0x5031, 0x001E, 0x1674, 0x0110, 0x147B, 0x8031, 0x0022, +0x4381, 0x001E, 0x4381, 0x0020, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, +0x001A, 0x4381, 0x001C, 0x40B1, 0x0010, 0x0008, 0x4381, 0x000A, 0x4381, +0x000C, 0x4381, 0x0004, 0x3C02, 0x1380, 0x2BD2, 0x9381, 0x000C, 0x2402, +0x0180, 0x5D8E, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0012, 0x4381, +0x0014, 0x410C, 0x503C, 0x001E, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x3403, 0x403C, 0xFFC6, 0x3DEF, 0x410C, 0x530C, 0x002F, 0x2C26, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x380E, 0x410F, 0x503F, 0x001A, 0x0F71, +0x0016, 0x013C, 0x0016, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x3403, 0x403C, 0xFFC4, 0x3DD5, 0x410C, 0x523C, 0x002F, 0x2C26, 0x0F3F, +0x0030, 0x134F, 0x4C81, 0x000C, 0x930C, 0x3403, 0x403C, 0xFFC3, 0x3DC7, +0x4124, 0x4115, 0x0002, 0x4116, 0x001A, 0x4117, 0x001C, 0x92A1, 0x001E, +0x202F, 0x9381, 0x0020, 0x202C, 0x42B1, 0x0008, 0x4381, 0x000A, 0x43C1, +0x0006, 0x92F1, 0x0006, 0x2C2B, 0x440C, 0x450D, 0x460E, 0x470F, 0x415B, +0x0006, 0x13B1, 0xCE06, 0xF31C, 0x410B, 0x503B, 0x000E, 0x4B38, 0x4B39, +0x4B3A, 0x4B3B, 0x5808, 0x6909, 0x6A0A, 0x6B0B, 0xDC08, 0x4881, 0x000E, +0x4981, 0x0010, 0x4A81, 0x0012, 0x4B81, 0x0014, 0x415E, 0x0006, 0x535E, +0x4EC1, 0x0006, 0x3FDA, 0x4481, 0x000E, 0x4581, 0x0010, 0x4681, 0x0012, +0x4781, 0x0014, 0x411E, 0x001E, 0x411F, 0x0020, 0x930F, 0x2179, 0x903E, +0x0014, 0x2D76, 0x065E, 0x1880, 0x4E50, 0x5AA0, 0x597C, 0x0001, 0x5AF6, +0x0001, 0x5AF6, 0x0001, 0x5B0C, 0x0001, 0x5B22, 0x0001, 0x5B6E, 0x0001, +0x5C40, 0x0001, 0x5C56, 0x0001, 0x5C68, 0x0001, 0x5CA2, 0x0001, 0x5CD8, +0x0001, 0x5CF6, 0x0001, 0x5AFE, 0x0001, 0x5AF0, 0x0001, 0x5B48, 0x0001, +0x5D06, 0x0001, 0x5D26, 0x0001, 0x5D48, 0x0001, 0x5B06, 0x0001, 0x5C9A, +0x0001, 0x1380, 0x2BD6, 0x3F45, 0x444C, 0x1380, 0x2B7A, 0x3F41, 0x431C, +0x1380, 0x2BA6, 0x3F3D, 0x1380, 0x2BCA, 0x3F3A, 0x1380, 0x2B7E, 0x412F, +0xD11F, 0x0002, 0x930F, 0x2733, 0x430C, 0x1380, 0x2B66, 0x3F2F, 0x415C, +0x000E, 0x1380, 0x2BDA, 0x4C4C, 0x430D, 0x002F, 0x2C26, 0x0F3F, 0x0014, +0x134F, 0x430C, 0x430D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x3F1C, +0x415C, 0x000E, 0x1380, 0x2BDE, 0x4C4C, 0x430D, 0x002F, 0x2C26, 0x0F3F, +0x0014, 0x134F, 0x430C, 0x430D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, +0x3F09, 0x411E, 0x0008, 0x411F, 0x000A, 0x830F, 0x2060, 0x823E, 0x240E, +0x823E, 0x2423, 0x822E, 0x242A, 0x803E, 0x000C, 0x2434, 0x803E, 0x0003, +0x244A, 0x803E, 0x001D, 0x2439, 0x3C50, 0x415C, 0x000E, 0x1380, 0x2BE2, +0x4C48, 0x4309, 0x430A, 0x430B, 0x480C, 0x490D, 0x002F, 0x2C26, 0x0F3F, +0x0014, 0x134F, 0x4A0C, 0x4B0D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, +0x3EDC, 0x411C, 0x000E, 0x1380, 0x2BE6, 0x4C08, 0x4309, 0x430A, 0x430B, +0x3FE8, 0x411C, 0x000E, 0x411D, 0x0010, 0xF03D, 0x000F, 0x1380, 0x2BEA, +0x4C08, 0x4D09, 0x430A, 0x430B, 0x3FDB, 0x411C, 0x000E, 0x411D, 0x0010, +0x1380, 0x2BEE, 0x4C08, 0x4D09, 0x430A, 0x430B, 0x3FD0, 0x410F, 0x503F, +0x000E, 0x4F3C, 0x4F3D, 0x4F3E, 0x4F3F, 0x1380, 0x2BF6, 0x4C08, 0x4D09, +0x4E0A, 0x4F0B, 0x3FC2, 0x410C, 0x503C, 0x000E, 0x1380, 0x2BF2, 0x4C08, +0x4D09, 0x4E0A, 0x4F0B, 0x3FB8, 0x403C, 0xFFC2, 0x3CA9, 0x407C, 0x0054, +0x1380, 0x2BDA, 0x411C, 0x000E, 0x411D, 0x0010, 0x1380, 0x2BEE, 0x3E95, +0x407C, 0x00F4, 0x1380, 0x2BDA, 0x411C, 0x000E, 0x1380, 0x2BE6, 0x3E8C, +0x407C, 0x0046, 0x1380, 0x2BDA, 0x430C, 0x430D, 0x430E, 0x430F, 0x1380, +0x2BF6, 0x4E0A, 0x4F0B, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x4A0C, +0x4B0D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x3E73, 0x444C, 0x1380, +0x2C02, 0x3E6F, 0x90B1, 0x0010, 0x0008, 0x2007, 0x9381, 0x000A, 0x2004, +0x440C, 0x13B1, 0xC120, 0x3C0B, 0x90B1, 0x0020, 0x0008, 0x2009, 0x9381, +0x000A, 0x2006, 0x450D, 0x440C, 0x13B1, 0xBE82, 0x935C, 0x2257, 0x403C, +0xFFCF, 0x3C5D, 0x13B0, 0xFDC0, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, +0x430C, 0x430D, 0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x3E45, 0x440C, +0x1380, 0x2B72, 0x008C, 0x2BD2, 0x13B0, 0x1880, 0x3E3D, 0x411E, 0x0008, +0x013D, 0x0016, 0x444C, 0x1380, 0x2C12, 0x931C, 0x3403, 0x403F, 0xFFBA, +0x3C01, 0x430F, 0x4F81, 0x0004, 0x3C24, 0x411F, 0x0008, 0x013E, 0x0016, +0x440C, 0x450D, 0x1380, 0x2C16, 0x931C, 0x3403, 0x403F, 0xFFBA, 0x3C01, +0x430F, 0x4F81, 0x0004, 0x3C13, 0x1211, 0x000A, 0x013D, 0x0018, 0x440E, +0x450F, 0x411C, 0x000C, 0x1380, 0x2C1A, 0x5321, 0x931C, 0x3403, 0x403F, +0xFFBA, 0x3C01, 0x430F, 0x4F81, 0x0004, 0x411C, 0x001A, 0x411D, 0x001C, +0x002F, 0x2C26, 0x0F3F, 0x0014, 0x134F, 0x0180, 0x5980, 0x40B1, 0xFFC5, +0x0004, 0x0180, 0x5980, 0x411C, 0x0004, 0x5031, 0x0022, 0x1674, 0x0110, +0x147B, 0x8031, 0x0020, 0x1800, 0x43C1, 0x0014, 0x008A, 0x2C26, 0x410C, +0x503C, 0x000C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFE8, 0x3DE7, 0x410C, 0x503C, 0x000A, 0x0A0F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2403, 0x403C, 0xFFE7, 0x3DDB, 0x410C, 0x503C, 0x001C, 0x0A0F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3DCF, 0x410C, +0x523C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE5, +0x3DC4, 0x410C, 0x503C, 0x0006, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFE4, 0x3DB8, 0x410C, 0x522C, 0x0A0F, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x2403, 0x403C, 0xFFE3, 0x3DAD, 0x410C, 0x532C, 0x0A0F, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2002, 0x4381, 0x0002, 0x432C, 0x0A0F, +0x0F3F, 0x0038, 0x134F, 0x4115, 0x0008, 0x0086, 0x2BD2, 0x06CB, 0x00AB, +0x0008, 0x4077, 0x00C8, 0x474C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0014, +0x403C, 0x3401, 0x080F, 0x134F, 0x4074, 0x0082, 0x444C, 0x0B0F, 0x134F, +0x403C, 0x4032, 0x080F, 0x134F, 0x06C9, 0x00A9, 0x0030, 0x434C, 0x090F, +0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x444C, +0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x0042, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x444C, 0x0B0F, 0x134F, +0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x4191, 0x000A, 0x0000, 0x4115, 0x000C, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x3FFF, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x427C, 0x063F, 0x0010, 0x134F, +0x407C, 0x00C1, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x407C, 0x00A1, +0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, +0x4075, 0x0021, 0x454C, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4116, +0x001C, 0x474C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x444C, +0x0B0F, 0x134F, 0x403C, 0x4030, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x460C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0012, 0x4076, 0x0090, +0x464C, 0x0B0F, 0x134F, 0x403C, 0x0003, 0x080F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x000E, 0x403C, 0x000B, 0x080F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0010, 0x403C, 0x0013, 0x080F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C07, 0x4781, 0x0012, 0x432C, 0x080F, 0x134F, 0x430C, 0x080F, +0x134F, 0x403C, 0x000A, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x403C, +0x0012, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x432C, 0x080F, 0x134F, +0x411C, 0x000E, 0x080F, 0x134F, 0x403C, 0x000A, 0x080F, 0x134F, 0x411C, +0x0010, 0x080F, 0x134F, 0x403C, 0x0012, 0x080F, 0x134F, 0x470C, 0x080F, +0x134F, 0x0087, 0x2890, 0x472F, 0xD71F, 0x0002, 0x930F, 0x241B, 0x9387, +0x0004, 0x2418, 0x464C, 0x0B0F, 0x134F, 0x403C, 0x0089, 0x080F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C81, 0x0000, 0x464C, 0x0B0F, 0x134F, 0x403C, +0x0088, 0x080F, 0x134F, 0x412C, 0xF03C, 0xFFEF, 0x080F, 0x134F, 0x93A7, +0x0000, 0x200D, 0x9387, 0x0002, 0x200A, 0x464C, 0x0B0F, 0x134F, 0x440C, +0x080F, 0x134F, 0x403C, 0x000F, 0x080F, 0x134F, 0x90B7, 0x0003, 0x0000, +0x200C, 0x9387, 0x0002, 0x2009, 0x464C, 0x0B0F, 0x134F, 0x440C, 0x080F, +0x134F, 0x423C, 0x080F, 0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x411C, +0x0006, 0x080F, 0x134F, 0x9381, 0x0004, 0x2411, 0x444C, 0x0B0F, 0x134F, +0x411C, 0x0004, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x454C, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x3C03, 0x454C, 0x0B0F, 0x134F, 0x410D, +0x503D, 0x0018, 0x403C, 0xAA01, 0x0A0F, 0x0F3F, 0x0058, 0x134F, 0x930C, +0x2404, 0x1800, 0x41D1, 0x0018, 0x0014, 0x013F, 0x0014, 0x03DF, 0x2402, +0x439F, 0x0000, 0x407C, 0x00A8, 0x0B0F, 0x134F, 0x9381, 0x0002, 0x2402, +0x1380, 0x2B7E, 0x430C, 0x5031, 0x0020, 0x1674, 0x0110, 0x147B, 0x8321, +0x0CCA, 0x4C25, 0x0086, 0x2BD2, 0x06CB, 0x00AB, 0x0008, 0x4074, 0x00C8, +0x444C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, +0x134F, 0x4079, 0x0082, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4035, 0x080F, +0x134F, 0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x4077, 0x0042, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x4035, 0x2401, 0x450C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0002, 0x0000, 0x444C, +0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x4036, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x4A91, 0x0004, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4039, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, +0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, +0x0006, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x4038, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0008, 0x0000, 0x444C, +0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x403A, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x4A91, 0x000A, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x403B, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, +0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A1A, +0x000C, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x403C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x4A0C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x5321, 0x1674, 0x0110, 0x147B, 0x8321, +0x0CCA, 0x4C25, 0x0086, 0x2BD2, 0x06CB, 0x00AB, 0x0008, 0x4074, 0x00C8, +0x444C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, +0x134F, 0x4079, 0x0082, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4035, 0x080F, +0x134F, 0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x4077, 0x0042, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x4035, 0x2401, 0x450C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0002, 0x0000, 0x444C, +0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x4036, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x4A91, 0x0004, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x4039, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, +0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, +0x0006, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0B0F, 0x134F, 0x403C, 0x4038, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, +0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, +0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, +0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A91, 0x0008, 0x0000, 0x444C, +0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x403C, 0x403A, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, +0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x4A91, 0x000A, 0x0000, 0x444C, 0x0B0F, 0x134F, 0x403C, +0x3401, 0x080F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x403B, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x494C, 0x0B0F, 0x134F, 0x412C, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x403C, 0x3FFD, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, +0x0B0F, 0x134F, 0x450C, 0x080F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A1A, +0x000C, 0x444C, 0x0B0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, 0x494C, +0x0B0F, 0x134F, 0x403C, 0x403C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x4A0C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, 0x080F, +0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, +0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, 0x134F, 0x450C, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x5321, 0x1674, 0x0110, 0x147B, 0x8231, +0x4C07, 0x4304, 0x0086, 0x2C26, 0xB31C, 0x2892, 0x0088, 0x2842, 0x08CC, +0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3DC0, +0x008C, 0x283E, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFFA, 0x3DB5, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x4C4C, 0x1840, 0x4C82, 0x284A, 0x482E, 0x481F, 0x0002, +0x108E, 0x108F, 0xEF4E, 0xEF0E, 0x4E05, 0xF035, 0x0F00, 0x5035, 0x0080, +0x1840, 0x4582, 0x2846, 0x48A8, 0x0000, 0x4388, 0x0002, 0x1840, 0x48A1, +0x0002, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x430C, +0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x450C, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, +0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, +0x435C, 0x090F, 0x134F, 0x411C, 0x0002, 0x080F, 0x134F, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x4303, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, +0x0018, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0500, 0x080F, +0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x00C2, 0x0B0F, 0x134F, 0xB327, +0x2C0A, 0x407C, 0x0091, 0x060F, 0x0F3F, 0x0024, 0x134F, 0x060F, 0x0F3F, +0x0004, 0x134F, 0x410D, 0x530D, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x0034, +0x134F, 0x3C1B, 0x008A, 0x2BD2, 0x435C, 0x0A3F, 0x0030, 0x134F, 0x013F, +0x0004, 0x1800, 0x53E1, 0x0004, 0x4F2C, 0x0A3F, 0x0014, 0x134F, 0x412F, +0x832F, 0x4F81, 0x0000, 0x434C, 0x0A3F, 0x0030, 0x134F, 0x53BB, 0x0000, +0x63BB, 0x0002, 0x008B, 0x283E, 0x4B2F, 0xDB1F, 0x0002, 0x930F, 0x2403, +0x9381, 0x0000, 0x23DB, 0xB327, 0x287C, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, +0x0008, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, +0x0501, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, +0x1840, 0x421F, 0x284A, 0x903F, 0x0091, 0x2406, 0x903F, 0x0099, 0x2403, +0x903F, 0x0098, 0x2052, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x422C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x403C, 0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, +0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00C8, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x1840, 0x421C, 0x2848, 0x060F, 0x0F3F, +0x0010, 0x134F, 0x3C81, 0x4B3F, 0xDB3F, 0x930F, 0x2407, 0x407C, 0x0091, +0x060F, 0x0F3F, 0x0024, 0x134F, 0x3C76, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, +0x0008, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, +0x0501, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, +0x1840, 0x421F, 0x284A, 0x903F, 0x0091, 0x2406, 0x903F, 0x0099, 0x2403, +0x903F, 0x0098, 0x2052, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x422C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x403C, 0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, +0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00C8, +0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x4034, 0xFFF6, 0x440C, 0x5231, 0x1674, +0x0110, 0x147B, 0x8031, 0x001A, 0x1800, 0x43C1, 0x000E, 0x0086, 0x2C26, +0x410C, 0x503C, 0x000A, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, +0x403C, 0xFFE8, 0x3D8D, 0x410C, 0x523C, 0x060F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x2403, 0x403C, 0xFFE7, 0x3D82, 0x410C, 0x503C, 0x0016, 0x060F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3D76, 0x410C, +0x503C, 0x0006, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFE5, 0x3D6A, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFE4, 0x3D5F, 0x410C, 0x532C, 0x060F, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x2403, 0x403C, 0xFFE3, 0x3D54, 0x410C, 0x530C, 0x060F, +0x0F3F, 0x002C, 0x134F, 0x933C, 0x2002, 0x4381, 0x0000, 0x432C, 0x060F, +0x0F3F, 0x0038, 0x134F, 0x4114, 0x0006, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, +0x0008, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x0AC7, 0x00A7, 0x0010, 0x407C, +0x0034, 0x070F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, +0x0030, 0x435C, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0014, 0x403C, 0x0082, +0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x440C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0042, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, 0x070F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4191, 0x0008, 0x000C, 0x4114, 0x000A, +0x407C, 0x0082, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2409, 0x090F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0048, +0x0B0F, 0x134F, 0x427C, 0x070F, 0x134F, 0x407C, 0x00C1, 0x0B0F, 0x134F, +0x440C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x0B0F, 0x134F, +0x411C, 0x000C, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x4114, 0x0016, +0x4115, 0x0018, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, 0x070F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x440C, 0x450F, 0x108C, 0x108F, +0xEF4C, 0xEF0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x440C, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0088, 0x0B0F, 0x134F, 0x407C, 0x0024, +0x070F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1840, 0x93A2, 0x2890, 0x2014, +0x1840, 0x9382, 0x2892, 0x2010, 0x407C, 0x00B0, 0x0B0F, 0x134F, 0x403C, +0x0082, 0x430D, 0x0A3F, 0x001C, 0x134F, 0x403C, 0x000F, 0x430D, 0x0A3F, +0x001C, 0x134F, 0x407C, 0x0030, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x090F, +0x134F, 0x9381, 0x0002, 0x2413, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x411C, +0x0002, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x3C04, 0x407C, 0x0021, 0x0B0F, 0x134F, +0x410D, 0x503D, 0x0012, 0x403C, 0xAA01, 0x060F, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2404, 0x1800, 0x41D1, 0x0012, 0x000E, 0x013F, 0x000E, 0x03DF, +0x2402, 0x439F, 0x0000, 0x407C, 0x00A8, 0x0B0F, 0x134F, 0x9381, 0x0000, +0x2402, 0x1380, 0x2B7E, 0x430C, 0x5031, 0x001A, 0x1674, 0x0110, 0x147B, +0x0CC5, 0x4C2A, 0x4C1B, 0x0002, 0x0084, 0x2BD2, 0x04C8, 0x00A8, 0x0030, +0x434C, 0x080F, 0x134F, 0x04C9, 0x00A9, 0x0008, 0x407C, 0x0082, 0x090F, +0x134F, 0x435C, 0x080F, 0x134F, 0x04C6, 0x00A6, 0x0014, 0x4A0C, 0x4B0F, +0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, 0x503C, 0x0085, 0x060F, +0x134F, 0x4077, 0x00C8, 0x474C, 0x090F, 0x134F, 0x403C, 0x1401, 0x060F, +0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, +0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, 0x090F, +0x134F, 0x00A4, 0x0018, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x451A, 0x0004, 0x451B, +0x0006, 0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, +0x0F00, 0x503C, 0x0086, 0x060F, 0x134F, 0x474C, 0x090F, 0x134F, 0x403C, +0x1401, 0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0021, 0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x451A, 0x0008, 0x451B, +0x000A, 0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, +0x0F00, 0x503C, 0x0089, 0x060F, 0x134F, 0x474C, 0x090F, 0x134F, 0x403C, +0x1401, 0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0021, 0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x451A, 0x000C, 0x451B, +0x000E, 0x434C, 0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x435C, +0x080F, 0x134F, 0x4A0C, 0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, +0x0F00, 0x503C, 0x0088, 0x060F, 0x134F, 0x474C, 0x090F, 0x134F, 0x403C, +0x1401, 0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0021, 0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x474C, 0x090F, 0x134F, 0x403C, 0x0501, 0x060F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0042, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x1674, 0x0110, 0x147B, +0x8031, 0x0024, 0x018F, 0xD12E, 0x1840, 0x4FF1, 0x000C, 0x1840, 0x4FF1, +0x000D, 0x1840, 0x4FF1, 0x000E, 0x1840, 0x4FF1, 0x000F, 0x008A, 0x2BD2, +0x0ACC, 0x13B0, 0x1880, 0x0086, 0x2C26, 0x410C, 0x530C, 0x060F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFDD, 0x3D36, 0x410C, 0x523C, +0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFDC, 0x3D2B, +0x4104, 0x5034, 0x0010, 0x1404, 0x430F, 0x434E, 0x422D, 0x410C, 0x503C, +0x0010, 0x060B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x290A, +0x134F, 0x4C0B, 0x04CC, 0x060F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x930B, +0x3402, 0x4B0C, 0x3D0D, 0x4307, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0048, +0x0B0F, 0x134F, 0x435C, 0x0A3F, 0x0010, 0x134F, 0x0AC8, 0x00A8, 0x0030, +0x435C, 0x080F, 0x134F, 0x3C07, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x5317, 0x0AC9, 0x00A9, 0x0014, 0x9037, 0x000A, 0x2C11, 0x407C, +0x0028, 0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0xF07C, 0x0081, 0x907C, +0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E2, 0x4077, 0x0082, +0x1840, 0x9382, 0x2B40, 0x2458, 0x4125, 0x8225, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x3401, 0x090F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x4030, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x450C, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, +0x0B0F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, +0x41A1, 0x0004, 0x4191, 0x0002, 0x0006, 0x474C, 0x0B0F, 0x134F, 0x403C, +0x3FFF, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x2409, 0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x832C, 0x090F, +0x134F, 0x3C30, 0x41A1, 0x0004, 0x4191, 0x0002, 0x0006, 0x474C, 0x0B0F, +0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x4030, 0x090F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411C, 0x0004, 0x832C, 0x090F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, +0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0021, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x407C, 0x0022, 0x0B0F, 0x134F, +0x411C, 0x0008, 0x411D, 0x000A, 0x0A3F, 0x0034, 0x134F, 0x407C, 0x0062, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x060F, 0x0F3F, 0x0010, 0x134F, +0x435C, 0x080F, 0x134F, 0x1840, 0x9382, 0x2B40, 0x2419, 0x434C, 0x080F, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x407C, 0x0028, +0x0B0F, 0x134F, 0x430C, 0x090F, 0x134F, 0x1404, 0x430F, 0x434E, 0x422D, +0x410C, 0x503C, 0x0010, 0x060B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, +0x002F, 0x290A, 0x134F, 0x4C0B, 0x04CC, 0x060F, 0x0F3F, 0x0020, 0x134F, +0x4B0C, 0x5221, 0x5031, 0x0024, 0x1674, 0x0110, 0x147B, 0x8031, 0x003E, +0x430A, 0x4307, 0x4305, 0x3C08, 0x410C, 0x503C, 0x0018, 0x5A0C, 0x0F3F, +0x0028, 0x134F, 0x531A, 0x0089, 0x2C26, 0x090F, 0x903A, 0x0012, 0x2BF2, +0x432C, 0x0F3F, 0x0038, 0x134F, 0x430A, 0x3C08, 0x410C, 0x530C, 0x5A0C, +0x090F, 0x0F3F, 0x0028, 0x134F, 0x531A, 0x922A, 0x2BF6, 0x0086, 0x2BD2, +0x06C8, 0x00A8, 0x0008, 0xB0F1, 0x0010, 0x0020, 0x280C, 0x4227, 0x407C, +0x0028, 0x080F, 0x134F, 0x430C, 0x063F, 0x0014, 0x134F, 0xB22C, 0x2C01, +0x4315, 0x407C, 0x00B0, 0x080F, 0x134F, 0x06CB, 0x00AB, 0x001C, 0x403C, +0x0003, 0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, 0x134F, 0x4C81, +0x0014, 0x4D81, 0x0016, 0x403C, 0x0005, 0x430D, 0x0B0F, 0x134F, 0x430C, +0x430D, 0x0B0F, 0x134F, 0x4C81, 0x0010, 0x4D81, 0x0012, 0x403C, 0x0007, +0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, 0x134F, 0x4C81, 0x000C, +0x4D81, 0x000E, 0x403C, 0x0081, 0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, +0x0B0F, 0x134F, 0x4C81, 0x0008, 0x4D81, 0x000A, 0x431C, 0x430D, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x0B0F, 0x134F, 0x4C81, 0x0004, 0x4D81, 0x0006, +0x407C, 0x00B0, 0x080F, 0x134F, 0x432C, 0x430D, 0x0B0F, 0x134F, 0x470C, +0x430D, 0x0B0F, 0x134F, 0x422C, 0x430D, 0x0B0F, 0x134F, 0x433C, 0x433D, +0x0B0F, 0x134F, 0x403C, 0x0006, 0x430D, 0x0B0F, 0x134F, 0x431C, 0x430D, +0x0B0F, 0x134F, 0x403C, 0x0080, 0x430D, 0x0B0F, 0x134F, 0x431C, 0x430D, +0x0B0F, 0x134F, 0x4107, 0x5037, 0x002A, 0x1407, 0x430F, 0x434E, 0x403D, +0x0012, 0x410C, 0x503C, 0x001C, 0x0904, 0x0434, 0x001C, 0x1344, 0x403C, +0x0003, 0x002F, 0x2994, 0x134F, 0x4C04, 0x07CC, 0x090F, 0x0F3F, 0x0020, +0x134F, 0x5221, 0x9304, 0x206E, 0x3C09, 0x4305, 0x407C, 0x0021, 0x080F, +0x134F, 0x407C, 0x00A8, 0x080F, 0x134F, 0x407C, 0x00D0, 0x080F, 0x134F, +0x531A, 0x430C, 0x063F, 0x0014, 0x134F, 0x934C, 0x3803, 0x903A, 0x0064, +0x2BF6, 0x903A, 0x0064, 0x2803, 0x403C, 0xFFCC, 0x3C51, 0x9305, 0x23E1, +0x407C, 0x00B0, 0x080F, 0x134F, 0x432C, 0x430D, 0x0B0F, 0x134F, 0x411C, +0x0014, 0x411D, 0x0016, 0x0B0F, 0x134F, 0x422C, 0x430D, 0x0B0F, 0x134F, +0x411C, 0x0010, 0x411D, 0x0012, 0x0B0F, 0x134F, 0x403C, 0x0006, 0x430D, +0x0B0F, 0x134F, 0x411C, 0x000C, 0x411D, 0x000E, 0x0B0F, 0x134F, 0x403C, +0x0080, 0x430D, 0x0B0F, 0x134F, 0x411C, 0x0008, 0x411D, 0x000A, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, +0x0B0F, 0x134F, 0x1407, 0x430F, 0x435E, 0x422D, 0x410C, 0x522C, 0x090B, +0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x298E, 0x134F, 0x4C04, +0x07CC, 0x090F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x440C, 0x5031, 0x003E, +0x1674, 0x0110, 0x147B, 0x8031, 0x0062, 0x4334, 0x430A, 0x410C, 0x503C, +0x001C, 0x018E, 0xD15B, 0x008D, 0x001F, 0x13B1, 0xCF3E, 0x4381, 0x0000, +0x3C08, 0x410C, 0x503C, 0x003C, 0x5A0C, 0x0F3F, 0x0028, 0x134F, 0x531A, +0x008B, 0x2C26, 0x0B0F, 0x903A, 0x0012, 0x2BF2, 0x410C, 0x530C, 0x0F3F, +0x002C, 0x134F, 0x430A, 0x3C08, 0x410C, 0x532C, 0x5A0C, 0x0B0F, 0x0F3F, +0x0028, 0x134F, 0x531A, 0x922A, 0x2BF6, 0x4108, 0x5038, 0x004E, 0x0086, +0x289C, 0x4037, 0x0003, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, +0x2819, 0x1408, 0x403F, 0x0016, 0x410E, 0x503E, 0x000A, 0x403D, 0x001F, +0x410C, 0x503C, 0x0020, 0x0B09, 0x0939, 0x001C, 0x1349, 0x470C, 0x063F, +0x0182, 0x134F, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x1408, +0x430F, 0x434E, 0x403D, 0x0012, 0x410C, 0x503C, 0x0040, 0x0B09, 0x0939, +0x001C, 0x1349, 0x470C, 0x063F, 0x016A, 0x134F, 0x08CC, 0x0B0F, 0x0F3F, +0x0020, 0x134F, 0x0089, 0x2BD2, 0x407C, 0x0046, 0x093F, 0x0008, 0x134F, +0x430C, 0x430D, 0x430E, 0x430F, 0x0935, 0x0024, 0x1345, 0x5221, 0xB03F, +0x4000, 0x2802, 0x430C, 0x3CAB, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, +0x0000, 0x288D, 0x407C, 0x0046, 0x093F, 0x0008, 0x134F, 0x531A, 0x430C, +0x430D, 0x430E, 0x430F, 0x0935, 0x0024, 0x1345, 0xB03F, 0x0400, 0x2C03, +0x903A, 0x01F4, 0x2BF2, 0x903A, 0x01F4, 0x2C8D, 0x1408, 0x430F, 0x435E, +0x422D, 0x410C, 0x503C, 0x0006, 0x0B0A, 0x0A3A, 0x001C, 0x134A, 0x470C, +0x063F, 0x0164, 0x134F, 0x4C04, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, 0x134F, +0x40F1, 0x0005, 0x0020, 0x43C1, 0x0021, 0x41D1, 0x000A, 0x0022, 0x41D1, +0x000B, 0x0023, 0x41D1, 0x000C, 0x0024, 0x41D1, 0x000D, 0x0025, 0x43E1, +0x0026, 0x41D1, 0x000E, 0x0027, 0x41D1, 0x000F, 0x0028, 0x41D1, 0x0010, +0x0029, 0x41D1, 0x0011, 0x002A, 0x42E1, 0x002B, 0x41D1, 0x0012, 0x002C, +0x41D1, 0x0013, 0x002D, 0x41D1, 0x0014, 0x002E, 0x41D1, 0x0015, 0x002F, +0x40F1, 0x0006, 0x0030, 0x41D1, 0x0016, 0x0031, 0x41D1, 0x0017, 0x0032, +0x41D1, 0x0018, 0x0033, 0x41D1, 0x0019, 0x0034, 0x40F1, 0x0080, 0x0035, +0x41D1, 0x001A, 0x0036, 0x41D1, 0x001B, 0x0037, 0x41D1, 0x001C, 0x0038, +0x41D1, 0x001D, 0x0039, 0x1408, 0x430F, 0x434E, 0x403D, 0x001F, 0x410C, +0x503C, 0x0024, 0x0B0A, 0x0A3A, 0x001C, 0x134A, 0x470C, 0x063F, 0x0182, +0x134F, 0x08CC, 0x0B0F, 0x0F3F, 0x0020, 0x134F, 0x5231, 0x3C16, 0x1408, +0x430F, 0x435E, 0x422D, 0x410C, 0x503C, 0x0006, 0x0B0A, 0x0A3A, 0x001C, +0x134A, 0x470C, 0x063F, 0x0164, 0x134F, 0x4C04, 0x08CC, 0x0B0F, 0x0F3F, +0x0020, 0x134F, 0x5221, 0x440C, 0x5031, 0x0062, 0x1674, 0x0110, 0x147B, +0x8031, 0x000C, 0x0086, 0x2BD2, 0x06CA, 0x00AA, 0x0008, 0x407C, 0x0028, +0x0A0F, 0x134F, 0x4C4C, 0x4C81, 0x0000, 0x4319, 0x3CC4, 0x411C, 0x0006, +0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, +0x3FFD, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x9387, 0x0000, 0x2407, +0x444C, 0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x4C81, +0x0004, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x4C81, 0x0002, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x9387, 0x0000, 0x2007, 0x444C, 0x0A0F, 0x134F, +0x403C, 0x0501, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x411E, 0x0004, 0x411F, 0x0002, +0x4E81, 0x0008, 0x4F81, 0x000A, 0x403D, 0x0003, 0x410C, 0x523C, 0x002F, +0x2C26, 0x0F3F, 0x000C, 0x134F, 0x90B1, 0x0091, 0x0000, 0x2408, 0x90B1, +0x0099, 0x0000, 0x2404, 0x90B1, 0x0098, 0x0000, 0x204E, 0x407C, 0x0028, +0x0A0F, 0x134F, 0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x454C, +0x0A0F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0080, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x444C, 0x0A0F, 0x134F, 0x403C, 0x1400, 0x0B0F, +0x134F, 0x454C, 0x0A0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x422C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, +0x134F, 0x403C, 0x4303, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, +0x0021, 0x0A0F, 0x134F, 0x430C, 0x430D, 0x063F, 0x0018, 0x134F, 0x444C, +0x0A0F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, 0x080F, 0x134F, +0x407C, 0x0021, 0x0A0F, 0x134F, 0x5319, 0x9039, 0x0010, 0x2C48, 0x9329, +0x2001, 0x4229, 0x4947, 0x1087, 0xF037, 0x0F00, 0x5037, 0x0060, 0x407C, +0x0028, 0x0A0F, 0x134F, 0x4C4C, 0x903C, 0x0098, 0x2403, 0x403F, 0x018C, +0x3C02, 0x403F, 0x014C, 0x4F81, 0x0006, 0x06C8, 0x00A8, 0x0030, 0x434C, +0x080F, 0x134F, 0x4075, 0x0082, 0x454C, 0x0A0F, 0x134F, 0x435C, 0x080F, +0x134F, 0x06CB, 0x00AB, 0x0014, 0x470C, 0x0B0F, 0x134F, 0x4074, 0x00C8, +0x444C, 0x0A0F, 0x134F, 0x403C, 0x1401, 0x0B0F, 0x134F, 0x454C, 0x0A0F, +0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0x0087, 0x2B3E, +0x9387, 0x0000, 0x26F6, 0x403C, 0x0FF6, 0x0B0F, 0x134F, 0x3EF5, 0x13B0, +0xFDC0, 0x4C81, 0x0008, 0x4D81, 0x000A, 0x430C, 0x5031, 0x000C, 0x1674, +0x0110, 0x147B, 0x8031, 0x0062, 0x4336, 0x4309, 0x410C, 0x503C, 0x001C, +0x018E, 0xD17A, 0x008D, 0x001F, 0x13B1, 0xCF3E, 0x4381, 0x0000, 0x3C08, +0x410C, 0x503C, 0x003C, 0x590C, 0x0F3F, 0x0028, 0x134F, 0x5319, 0x008A, +0x2C26, 0x0A0F, 0x9039, 0x0012, 0x2BF2, 0x410C, 0x530C, 0x0F3F, 0x002C, +0x134F, 0x4309, 0x3C08, 0x410C, 0x532C, 0x590C, 0x0A0F, 0x0F3F, 0x0028, +0x134F, 0x5319, 0x9229, 0x2BF6, 0x410B, 0x503B, 0x004E, 0x0088, 0x289C, +0x4037, 0x0003, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2819, +0x140B, 0x403F, 0x0016, 0x410E, 0x503E, 0x000A, 0x403D, 0x001F, 0x410C, +0x503C, 0x0020, 0x0A04, 0x0434, 0x001C, 0x1344, 0x470C, 0x083F, 0x0182, +0x134F, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x140B, 0x430F, +0x434E, 0x403D, 0x0012, 0x410C, 0x503C, 0x0040, 0x0A04, 0x0434, 0x001C, +0x1344, 0x470C, 0x083F, 0x016A, 0x134F, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, +0x134F, 0x5221, 0xB0F1, 0x0010, 0x0044, 0x2803, 0xB2A1, 0x0000, 0x2887, +0x407C, 0x00D0, 0x1380, 0x2BDA, 0x5319, 0x430C, 0x1380, 0x2BE6, 0x934C, +0x3803, 0x9039, 0x01F4, 0x2BF7, 0x9039, 0x01F4, 0x2C99, 0x140B, 0x430F, +0x435E, 0x422D, 0x410C, 0x503C, 0x0006, 0x0A09, 0x0939, 0x001C, 0x1349, +0x470C, 0x083F, 0x0164, 0x134F, 0x4C06, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, +0x134F, 0x40F1, 0x0005, 0x0020, 0x43C1, 0x0021, 0x41D1, 0x000A, 0x0022, +0x41D1, 0x000B, 0x0023, 0x41D1, 0x000C, 0x0024, 0x41D1, 0x000D, 0x0025, +0x43E1, 0x0026, 0x41D1, 0x000E, 0x0027, 0x41D1, 0x000F, 0x0028, 0x41D1, +0x0010, 0x0029, 0x41D1, 0x0011, 0x002A, 0x42E1, 0x002B, 0x41D1, 0x0012, +0x002C, 0x41D1, 0x0013, 0x002D, 0x41D1, 0x0014, 0x002E, 0x41D1, 0x0015, +0x002F, 0x40F1, 0x0006, 0x0030, 0x41D1, 0x0016, 0x0031, 0x41D1, 0x0017, +0x0032, 0x41D1, 0x0018, 0x0033, 0x41D1, 0x0019, 0x0034, 0x40F1, 0x0080, +0x0035, 0x41D1, 0x001A, 0x0036, 0x41D1, 0x001B, 0x0037, 0x41D1, 0x001C, +0x0038, 0x41D1, 0x001D, 0x0039, 0x140B, 0x430F, 0x434E, 0x403D, 0x001F, +0x410C, 0x503C, 0x0024, 0x0A09, 0x0939, 0x001C, 0x1349, 0x470C, 0x083F, +0x0182, 0x134F, 0x0BCC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5231, 0x3C22, +0x407C, 0x0028, 0x1380, 0x2BDA, 0x4C4C, 0x430D, 0x13B1, 0xC7F8, 0x930C, +0x2417, 0x140B, 0x430F, 0x435E, 0x422D, 0x410C, 0x503C, 0x0006, 0x0A09, +0x0939, 0x001C, 0x1349, 0x470C, 0x083F, 0x0164, 0x134F, 0x4C06, 0x0BCC, +0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x3C01, 0x4306, 0x460C, 0x5031, +0x0062, 0x1674, 0x0110, 0x147B, 0x8031, 0x000C, 0x008A, 0x2BD2, 0x0ACB, +0x00AB, 0x0008, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x4C47, 0x0084, 0x2C26, +0x410C, 0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x410C, 0x523C, 0x040F, +0x0F3F, 0x0030, 0x134F, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, +0x9037, 0x0091, 0x2406, 0x9037, 0x0099, 0x2403, 0x9037, 0x0098, 0x2004, +0x42A1, 0x0000, 0x4381, 0x0002, 0x4116, 0x0004, 0x4117, 0x0006, 0x1086, +0x1087, 0xE746, 0xE706, 0xF036, 0x0F00, 0x5036, 0x0080, 0x4117, 0x0004, +0x407C, 0x0028, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x430C, 0x080F, +0x134F, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x0082, +0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x460C, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, +0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x470C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x403C, 0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, +0x4075, 0x0021, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, +0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, +0x435C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x407C, 0x00C2, 0x0B0F, +0x134F, 0x4306, 0x4307, 0x3C0F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x430C, 0x080F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, 0x5316, +0x6307, 0x9117, 0x000A, 0x2BEE, 0x2003, 0x9116, 0x0008, 0x2BEA, 0x407C, +0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x412E, 0x411F, 0x0002, +0x108E, 0x108F, 0xEF4E, 0xEF0E, 0x4E06, 0xF036, 0x0F00, 0x5036, 0x0080, +0x4127, 0x407C, 0x0028, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, +0x460C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, +0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x470C, 0x080F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, 0x4303, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, 0x430D, +0x0A3F, 0x0018, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0501, +0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x454C, 0x0B0F, 0x134F, 0x430C, +0x5031, 0x000C, 0x1674, 0x0110, 0x143B, 0x0CCB, 0x4D4A, 0x4159, 0x0014, +0x13B1, 0xC50A, 0x0088, 0x2C2A, 0x403E, 0x0018, 0x430F, 0x008D, 0x1904, +0x08CC, 0x13B1, 0xCDDE, 0x0B60, 0x2C26, 0x13B1, 0xCA82, 0x40B8, 0x8B00, +0x0012, 0x4398, 0x0014, 0x1840, 0x90B2, 0xF00D, 0x18FC, 0x2020, 0x1840, +0x90B2, 0xF00D, 0x18FE, 0x201B, 0x1840, 0x93B2, 0x18F8, 0x2417, 0x934A, +0x2415, 0x008C, 0x2B62, 0x13B0, 0x18A0, 0x1840, 0x4298, 0x18F6, 0x000E, +0x1840, 0x4298, 0x18F4, 0x0016, 0x9349, 0x2404, 0x403C, 0x0009, 0x1380, +0x2B6A, 0x4388, 0x0010, 0x3CBC, 0x4388, 0x000E, 0x4388, 0x0010, 0x008F, +0x2B62, 0x1880, 0x40FF, 0xD00E, 0x0000, 0x1880, 0x40FF, 0xD012, 0x0004, +0x1880, 0x40FF, 0xD01A, 0x000C, 0x1880, 0x40FF, 0xD01E, 0x0010, 0x1880, +0x40FF, 0xD0D0, 0x0014, 0x1880, 0x40FF, 0xD026, 0x0018, 0x1880, 0x40FF, +0xD02A, 0x001C, 0x1880, 0x40FF, 0xD0BC, 0x0020, 0x1880, 0x40FF, 0xD0BC, +0x0024, 0x1880, 0x40FF, 0xD092, 0x0028, 0x1880, 0x40FF, 0xD0CE, 0x002C, +0x1880, 0x40FF, 0xD0CC, 0x0030, 0x1880, 0x40FF, 0xD0CA, 0x0034, 0x1880, +0x40FF, 0xD0C8, 0x0048, 0x1880, 0x40FF, 0xD0C6, 0x0050, 0x1880, 0x40FF, +0xD0C4, 0x004C, 0x1880, 0x40FF, 0xD0C2, 0x0038, 0x1880, 0x40FF, 0xD0C0, +0x003C, 0x1880, 0x40FF, 0xD0BE, 0x0040, 0x1880, 0x40FF, 0xD056, 0x0054, +0x1880, 0x40FF, 0xD05A, 0x005C, 0x1880, 0x40FF, 0xD0B6, 0x0044, 0x1880, +0x40FF, 0xD0D2, 0x0008, 0x1880, 0x40FF, 0xD0B4, 0x0058, 0x1880, 0x40FF, +0xD056, 0x0054, 0x1880, 0x40FF, 0xD0B2, 0x0060, 0x1880, 0x40FF, 0xD0D4, +0x0064, 0x008F, 0x2BD2, 0x1880, 0x40FF, 0xD062, 0x0000, 0x1880, 0x40FF, +0xD066, 0x0004, 0x1880, 0x40FF, 0xD06A, 0x0008, 0x1880, 0x40FF, 0xD06E, +0x0010, 0x1880, 0x40FF, 0xD072, 0x0014, 0x1880, 0x40FF, 0xCFEE, 0x0018, +0x1880, 0x40FF, 0xCFF4, 0x001C, 0x1880, 0x40FF, 0xCFC8, 0x0024, 0x1880, +0x40FF, 0xCFBE, 0x0028, 0x1880, 0x40FF, 0xD0BA, 0x0030, 0x1880, 0x40FF, +0xD0B8, 0x0034, 0x1880, 0x40FF, 0xD08E, 0x0038, 0x1880, 0x40FF, 0xD096, +0x003C, 0x1880, 0x40FF, 0xCFB4, 0x002C, 0x1880, 0x40FF, 0xD0A6, 0x000C, +0x1880, 0x40FF, 0xD0AA, 0x0040, 0x1880, 0x40FF, 0xD09E, 0x0044, 0x1880, +0x40FF, 0xD09A, 0x0048, 0x1840, 0x40B2, 0x040F, 0x2898, 0x1840, 0x4382, +0x289A, 0x40B8, 0x0070, 0x0008, 0x1800, 0x40F8, 0x289C, 0x000A, 0x08CC, +0x1638, 0x0110, 0x147B, 0x8231, 0x4381, 0x0004, 0x4381, 0x0006, 0x4036, +0x4E20, 0x4381, 0x0000, 0x4381, 0x0002, 0x0085, 0x2C26, 0x410C, 0x522C, +0x050F, 0x0F3F, 0x0030, 0x134F, 0x411A, 0x0004, 0x411B, 0x0006, 0xD23A, +0x0087, 0x2BD2, 0x07C8, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x07C9, +0x00A9, 0x0008, 0x407C, 0x00C1, 0x090F, 0x134F, 0x07C4, 0x00A4, 0x0018, +0xF03B, 0x000F, 0x4A0C, 0x4B0D, 0x040F, 0x134F, 0x435C, 0x080F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x00A7, 0x0014, +0x07CB, 0x430C, 0x070F, 0x134F, 0x4C07, 0x435C, 0x080F, 0x134F, 0x434C, +0x080F, 0x134F, 0x435C, 0x080F, 0x134F, 0xB317, 0x2C08, 0xF317, 0x470C, +0x050F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x3CAF, 0x407C, 0x0028, 0x090F, +0x134F, 0x430C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0082, +0x090F, 0x134F, 0x435C, 0x080F, 0x134F, 0x403C, 0x0080, 0x0B0F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x1400, +0x0B0F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x422C, 0x0B0F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x403C, 0x4303, 0x0B0F, 0x134F, 0x434C, 0x080F, +0x134F, 0x407C, 0x0021, 0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, +0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x0501, 0x0B0F, 0x134F, 0x435C, +0x080F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, 0x407C, 0x00C8, 0x090F, +0x134F, 0x403C, 0x1501, 0x0B0F, 0x134F, 0x3C06, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0x460F, 0x5336, 0x930F, 0x23F6, 0x407C, 0x0021, +0x090F, 0x134F, 0x430C, 0x430D, 0x040F, 0x134F, 0x4C81, 0x0000, 0x4D81, +0x0002, 0x92A1, 0x0000, 0x2003, 0x9381, 0x0002, 0x2409, 0x90B1, 0x0006, +0x0000, 0x2003, 0x9381, 0x0002, 0x2402, 0x433C, 0x3C30, 0x4116, 0x0004, +0x4117, 0x0006, 0xD236, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C1, 0x090F, +0x134F, 0xF037, 0x000F, 0x460C, 0x470D, 0x040F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x4C0B, 0x435C, 0x080F, 0x134F, 0x434C, 0x080F, 0x134F, +0x435C, 0x080F, 0x134F, 0xF31B, 0x4B0C, 0x050F, 0x0F3F, 0x0010, 0x134F, +0x430C, 0x5231, 0x1674, 0x0110, 0x147B, 0x8031, 0x0020, 0x018F, 0xD132, +0x1840, 0x4FF1, 0x0008, 0x1840, 0x4FF1, 0x0009, 0x1840, 0x4FF1, 0x000A, +0x1840, 0x4FF1, 0x000B, 0x008A, 0x2BD2, 0x0ACC, 0x13B0, 0x1880, 0x0086, +0x2C26, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, +0x403C, 0xFFDD, 0x3CDF, 0x410C, 0x522C, 0x060F, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x3403, 0x403C, 0xFFDC, 0x3CD4, 0x4107, 0x5037, 0x000C, 0x1407, +0x430F, 0x434E, 0x422D, 0x410C, 0x503C, 0x000C, 0x060B, 0x0B3B, 0x001C, +0x134B, 0x403C, 0x0003, 0x002F, 0x2988, 0x134F, 0x4C0B, 0x07CC, 0x060F, +0x0F3F, 0x0020, 0x134F, 0x5221, 0x930B, 0x3402, 0x4B0C, 0x3CB6, 0x4124, +0x4115, 0x0002, 0x5034, 0xFFFC, 0x6335, 0x0ACB, 0x00AB, 0x0008, 0x407C, +0x0088, 0x0B0F, 0x134F, 0x407C, 0x0034, 0x0A3F, 0x0010, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x0AC8, 0x00A8, 0x0014, 0x440C, 0x450F, 0x108C, +0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, 0x080F, 0x134F, +0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x440C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x0021, 0x0B0F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0088, +0x0B0F, 0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x090F, +0x134F, 0x4124, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x403C, 0x3FFF, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, +0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0082, 0x0B0F, 0x134F, 0x440C, 0x832C, 0x080F, 0x134F, 0x407C, +0x0022, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x411D, 0x0006, 0x0A3F, 0x0034, +0x134F, 0x407C, 0x0062, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x060F, +0x0F3F, 0x0010, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, +0x0021, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0028, 0x0B0F, +0x134F, 0x430C, 0x080F, 0x134F, 0x1407, 0x430F, 0x434E, 0x422D, 0x410C, +0x503C, 0x000C, 0x060B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, +0x2988, 0x134F, 0x4C0B, 0x07CC, 0x060F, 0x0F3F, 0x0020, 0x134F, 0x4B0C, +0x5221, 0x5031, 0x0020, 0x1674, 0x0110, 0x143B, 0x8031, 0x0012, 0x4381, +0x0006, 0x4381, 0x0008, 0x4381, 0x000E, 0x4381, 0x0010, 0x4381, 0x0004, +0x434B, 0x008A, 0x2C26, 0x423C, 0x0A0F, 0x0F3F, 0x0038, 0x134F, 0x933C, +0x241E, 0x410C, 0x522C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x9381, 0x0004, +0x2417, 0x410D, 0x530D, 0x403C, 0xAA01, 0x0A0F, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2401, 0x010B, 0x03DB, 0x2408, 0x938B, 0x0000, 0x2007, 0x1840, +0x4382, 0x2824, 0x432C, 0x3CCB, 0x433C, 0x3CC9, 0x008B, 0x2824, 0x4B2F, +0x0FCE, 0x0FEF, 0x0FEE, 0x064F, 0x0EEF, 0x1840, 0x42FF, 0x2C42, 0x3C04, +0x403C, 0x0003, 0x1380, 0x2B82, 0x90B2, 0xFFA1, 0x0350, 0x2FF8, 0x93A2, +0x0350, 0x2BF5, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x4218, 0x0350, +0x421F, 0x0350, 0x1800, 0x43C1, 0x0000, 0x980F, 0x2C01, 0x4F08, 0x410D, +0x530D, 0x403C, 0xAA04, 0x0A0F, 0x0F3F, 0x0058, 0x134F, 0x010F, 0x4F29, +0x4B2F, 0x0FCE, 0x0FEF, 0x0FEE, 0x064F, 0x0EEF, 0x1840, 0x48CF, 0x2C43, +0x1088, 0x1840, 0x48CF, 0x2C44, 0x1840, 0x49CF, 0x2C45, 0x1089, 0x1840, +0x49CF, 0x2C46, 0x4218, 0x0410, 0x421F, 0x0410, 0x1800, 0x43C1, 0x000A, +0x980F, 0x2C01, 0x4F08, 0x410D, 0x503D, 0x000A, 0x403C, 0xAA03, 0x0A0F, +0x0F3F, 0x0058, 0x134F, 0x013F, 0x000A, 0x4F29, 0x4B2F, 0x0FCE, 0x0FEF, +0x0FEE, 0x064F, 0x0EEF, 0x1840, 0x48CF, 0x2C47, 0x1088, 0x1840, 0x48CF, +0x2C48, 0x1840, 0x49CF, 0x2C49, 0x1089, 0x1840, 0x49CF, 0x2C4A, 0x410D, +0x503D, 0x000E, 0x410C, 0x503C, 0x0006, 0x1380, 0x2B6E, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x430E, 0x430F, 0x411C, 0x0006, 0x411D, 0x0008, 0x13B1, 0xCF9C, 0x930C, +0x2407, 0x411C, 0x0006, 0x411D, 0x0008, 0x13B1, 0xCFA8, 0x3C06, 0x411C, +0x000E, 0x411D, 0x0010, 0x13B1, 0xCFA8, 0x4B2F, 0x0FCE, 0x0FEF, 0x0FEE, +0x064F, 0x0EEF, 0x1840, 0x4CCF, 0x2C4B, 0x108C, 0x1840, 0x4CCF, 0x2C4C, +0x539B, 0x0000, 0x90BB, 0x0005, 0x0000, 0x201D, 0x438B, 0x0000, 0x423C, +0x0A0F, 0x0F3F, 0x0010, 0x134F, 0x407C, 0x0005, 0x0A0F, 0x0F3F, 0x0008, +0x134F, 0x407C, 0x000B, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x403D, 0x0037, +0x008C, 0x2C42, 0x0A0F, 0x0F3F, 0x000C, 0x134F, 0x431C, 0x3C01, 0x432C, +0x5031, 0x0012, 0x1638, 0x0110, 0x147B, 0x8031, 0x0032, 0x430B, 0x4306, +0x4307, 0x3C08, 0x410C, 0x503C, 0x000C, 0x5B0C, 0x0F3F, 0x0028, 0x134F, +0x531B, 0x008A, 0x2C26, 0x0A0F, 0x903B, 0x0012, 0x2BF2, 0x432C, 0x0F3F, +0x0038, 0x134F, 0x430B, 0x3C08, 0x410C, 0x523C, 0x5B0C, 0x0A0F, 0x0F3F, +0x0028, 0x134F, 0x531B, 0x922B, 0x2BF6, 0x0088, 0x2BE6, 0x0089, 0x2BDA, +0xB0F1, 0x0010, 0x0014, 0x280B, 0x4226, 0x407C, 0x0028, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0xB22C, 0x2C01, 0x4317, 0x407C, 0x0090, 0x090F, +0x134F, 0x403C, 0x0003, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0006, 0x403C, 0x0005, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0004, 0x403C, 0x0007, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0002, 0x403C, 0x0081, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C81, +0x0000, 0x431C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C05, 0x407C, +0x0090, 0x090F, 0x134F, 0x432C, 0x080F, 0x134F, 0x460C, 0x080F, 0x134F, +0x422C, 0x080F, 0x134F, 0x433C, 0x080F, 0x134F, 0x403C, 0x0006, 0x080F, +0x134F, 0x431C, 0x080F, 0x134F, 0x403C, 0x0080, 0x080F, 0x134F, 0x431C, +0x080F, 0x134F, 0x4106, 0x5036, 0x001E, 0x1406, 0x430F, 0x434E, 0x403D, +0x0012, 0x410C, 0x503C, 0x0010, 0x0A04, 0x0434, 0x001C, 0x1344, 0x403C, +0x0003, 0x002F, 0x2916, 0x134F, 0x4C04, 0x06CC, 0x0A0F, 0x0F3F, 0x0020, +0x134F, 0x5221, 0x9304, 0x205D, 0x3C09, 0x4307, 0x407C, 0x0021, 0x090F, +0x134F, 0x407C, 0x00A8, 0x090F, 0x134F, 0x407C, 0x00D0, 0x090F, 0x134F, +0x531B, 0x430C, 0x080F, 0x134F, 0x934C, 0x3803, 0x903B, 0x0032, 0x2BF7, +0x903B, 0x0032, 0x2803, 0x403C, 0xFFCC, 0x3C41, 0x9307, 0x23E2, 0x407C, +0x0090, 0x090F, 0x134F, 0x432C, 0x080F, 0x134F, 0x411C, 0x0006, 0x080F, +0x134F, 0x422C, 0x080F, 0x134F, 0x411C, 0x0004, 0x080F, 0x134F, 0x403C, +0x0006, 0x080F, 0x134F, 0x411C, 0x0002, 0x080F, 0x134F, 0x403C, 0x0080, +0x080F, 0x134F, 0x412C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x450C, +0x080F, 0x134F, 0x1406, 0x430F, 0x435E, 0x422D, 0x410C, 0x503C, 0x000C, +0x0A0B, 0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x2910, 0x134F, +0x4C04, 0x06CC, 0x0A0F, 0x0F3F, 0x0020, 0x134F, 0x5221, 0x440C, 0x5031, +0x0032, 0x1674, 0x0110, 0x147B, 0x8031, 0x0048, 0x410C, 0x503C, 0x0022, +0x018E, 0xD136, 0x008D, 0x0025, 0x13B1, 0xCF3E, 0x1840, 0x42D1, 0x2470, +0x0022, 0x008F, 0x2470, 0x4FD1, 0x0001, 0x0023, 0x008A, 0x2BD2, 0x0ACC, +0x13B0, 0x1880, 0x0086, 0x2C26, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, +0x134F, 0x410C, 0x503C, 0x000A, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x430B, +0x3C07, 0x4B0F, 0x5B07, 0x1840, 0x4FD7, 0x2CD8, 0x0005, 0x531B, 0x4107, +0x5037, 0x0022, 0x903B, 0x0020, 0x3BF3, 0x0771, 0x0006, 0x4104, 0x5034, +0x000E, 0x1404, 0x430F, 0x434E, 0x403D, 0x0025, 0x013C, 0x000A, 0x060B, +0x0B3B, 0x001C, 0x134B, 0x403C, 0x0003, 0x002F, 0x29FA, 0x134F, 0x04CC, +0x060F, 0x0F3F, 0x0020, 0x134F, 0x411E, 0x0004, 0x411F, 0x0006, 0x108E, +0x108F, 0xEF4E, 0xEF0E, 0x4E05, 0xF035, 0x0F00, 0x5035, 0x0080, 0x4191, +0x0004, 0x0008, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0028, 0x0B0F, 0x134F, +0x0AC8, 0x00A8, 0x0014, 0x430C, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x450C, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, +0x0B0F, 0x134F, 0x403C, 0x1400, 0x080F, 0x134F, 0x407C, 0x0082, 0x0B0F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x411C, 0x0008, +0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x403C, +0x4303, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x430C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x0501, 0x080F, 0x134F, 0x407C, +0x0082, 0x0B0F, 0x134F, 0x411C, 0x0004, 0x832C, 0x080F, 0x134F, 0x407C, +0x0022, 0x0B0F, 0x134F, 0x411C, 0x000E, 0x411D, 0x0010, 0x0A3F, 0x0034, +0x134F, 0x407C, 0x0062, 0x0B0F, 0x134F, 0x430C, 0x080F, 0x134F, 0x060F, +0x0F3F, 0x0010, 0x134F, 0x430B, 0x5221, 0x3C08, 0x4B0E, 0x470F, 0x5B0F, +0x1840, 0x4EDF, 0x2CD8, 0x0005, 0x531B, 0x903B, 0x0020, 0x3BF5, 0x1404, +0x430F, 0x434E, 0x403D, 0x0025, 0x013C, 0x000A, 0x060B, 0x0B3B, 0x001C, +0x134B, 0x403C, 0x0003, 0x002F, 0x29FA, 0x134F, 0x04CC, 0x060F, 0x0F3F, +0x0020, 0x134F, 0x430C, 0x5031, 0x004C, 0x1674, 0x0110, 0x145B, 0x4328, +0x0089, 0x2BD2, 0x407C, 0x0028, 0x093F, 0x0008, 0x134F, 0x4C4C, 0x430D, +0x13B1, 0xC74C, 0x930C, 0x2002, 0x432C, 0x3CDF, 0x407C, 0x00B0, 0x093F, +0x0008, 0x134F, 0x00A9, 0x001C, 0x403C, 0x009F, 0x430D, 0x090F, 0x134F, +0x430C, 0x430D, 0x090F, 0x134F, 0x4C0A, 0xB03C, 0x0100, 0x28CA, 0x4C4E, +0xF07E, 0x0006, 0x926E, 0x203C, 0x430B, 0x0088, 0x2C26, 0x403C, 0x0010, +0x080F, 0x0F3F, 0x0010, 0x134F, 0x403C, 0x009E, 0x430D, 0x090F, 0x134F, +0xD03A, 0x0040, 0x4A0C, 0x430D, 0x090F, 0x134F, 0x923B, 0x2CAE, 0x403C, +0x009A, 0x430D, 0x090F, 0x134F, 0x4B0C, 0x065C, 0x430D, 0x090F, 0x134F, +0x403C, 0x009D, 0x430D, 0x090F, 0x134F, 0x430C, 0x430D, 0x090F, 0x134F, +0x080F, 0x0F3F, 0x0014, 0x134F, 0x403C, 0x009D, 0x430D, 0x090F, 0x134F, +0x430C, 0x430D, 0x090F, 0x134F, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x531B, +0x3FD8, 0x4306, 0x403C, 0x009B, 0x430D, 0x090F, 0x134F, 0x430C, 0x430D, +0x090F, 0x134F, 0x13B1, 0xCF6A, 0x4C0B, 0x0087, 0x2838, 0xB23A, 0x2819, +0xB03A, 0x0200, 0x2C02, 0x930C, 0x200F, 0x403C, 0x009E, 0x430D, 0x090F, +0x134F, 0xC31A, 0xD03A, 0x0040, 0x4A0C, 0x430D, 0x090F, 0x134F, 0x4236, +0x8726, 0x3C18, 0x972B, 0x2416, 0x4C06, 0x8726, 0x3C13, 0x008F, 0x283C, +0x972B, 0x2403, 0x438F, 0x0000, 0x3C0C, 0x539F, 0x0000, 0x90BF, 0x0014, +0x0000, 0x2006, 0xB03A, 0x0200, 0x2802, 0x4236, 0x3C01, 0x4C06, 0x4B87, +0x0000, 0x9316, 0x3848, 0x4B0A, 0x860A, 0xF03A, 0x0007, 0x0088, 0x2C26, +0x432C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x460C, 0x080F, 0x0F3F, 0x0010, +0x134F, 0x403C, 0x009A, 0x430D, 0x090F, 0x134F, 0x4A0C, 0x065C, 0x430D, +0x090F, 0x134F, 0x403C, 0x009D, 0x430D, 0x090F, 0x134F, 0x430C, 0x430D, +0x090F, 0x134F, 0x080F, 0x0F3F, 0x0014, 0x134F, 0x403C, 0x009D, 0x430D, +0x090F, 0x134F, 0x430C, 0x430D, 0x090F, 0x134F, 0x080F, 0x0F3F, 0x0010, +0x134F, 0x403C, 0x009D, 0x430D, 0x090F, 0x134F, 0x430C, 0x430D, 0x090F, +0x134F, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x531A, 0x923A, 0x2801, 0x430A, +0x9B0A, 0x23C9, 0x4318, 0x480C, 0x1656, 0x0110, 0x145B, 0x4328, 0x008A, +0x2BD2, 0x407C, 0x0028, 0x0A3F, 0x0008, 0x134F, 0x4C4C, 0x430D, 0x13B1, +0xC7A2, 0x930C, 0x2002, 0x432C, 0x3CCD, 0x407C, 0x0090, 0x0A3F, 0x0008, +0x134F, 0x00AA, 0x0014, 0x403C, 0x009F, 0x0A0F, 0x134F, 0x430C, 0x0A0F, +0x134F, 0x4C06, 0xB03C, 0x0100, 0x28BA, 0x4C4E, 0xF07E, 0x0006, 0x926E, +0x2035, 0x430B, 0x0089, 0x2C26, 0x403C, 0x0010, 0x090F, 0x0F3F, 0x0010, +0x134F, 0x403C, 0x009E, 0x0A0F, 0x134F, 0xD036, 0x0040, 0x460C, 0x0A0F, +0x134F, 0x923B, 0x2CA0, 0x403C, 0x009A, 0x0A0F, 0x134F, 0x4B0C, 0x065C, +0x0A0F, 0x134F, 0x403C, 0x009D, 0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x430D, 0x090F, 0x0F3F, 0x0014, 0x134F, 0x403C, 0x009D, 0x0A0F, 0x134F, +0x430C, 0x0A0F, 0x134F, 0x090F, 0x0F3F, 0x0010, 0x134F, 0x531B, 0x3FDD, +0x4307, 0x403C, 0x009B, 0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x4C0B, +0x108B, 0xF37B, 0x110B, 0x110B, 0x0089, 0x2838, 0xB236, 0x2817, 0xB036, +0x0200, 0x2C02, 0x930B, 0x200D, 0x403C, 0x009E, 0x0A0F, 0x134F, 0xC316, +0xD036, 0x0040, 0x460C, 0x0A0F, 0x134F, 0x4237, 0x8927, 0x3C18, 0x992B, +0x2416, 0x4B07, 0x8927, 0x3C13, 0x008F, 0x283A, 0x992B, 0x2403, 0x438F, +0x0000, 0x3C0C, 0x539F, 0x0000, 0x90BF, 0x0014, 0x0000, 0x2006, 0xB036, +0x0200, 0x2802, 0x4237, 0x3C01, 0x4B07, 0x4B89, 0x0000, 0x9317, 0x3841, +0x4B08, 0x8708, 0xF038, 0x0007, 0x0089, 0x2C26, 0x432C, 0x090F, 0x0F3F, +0x0010, 0x134F, 0x470C, 0x090F, 0x0F3F, 0x0010, 0x134F, 0x403C, 0x009A, +0x0A0F, 0x134F, 0x480C, 0x065C, 0x0A0F, 0x134F, 0x403C, 0x009D, 0x0A0F, +0x134F, 0x430C, 0x0A0F, 0x134F, 0x430D, 0x090F, 0x0F3F, 0x0014, 0x134F, +0x403C, 0x009D, 0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, 0x090F, 0x0F3F, +0x0010, 0x134F, 0x403C, 0x009D, 0x0A0F, 0x134F, 0x430C, 0x0A0F, 0x134F, +0x090F, 0x0F3F, 0x0010, 0x134F, 0x5318, 0x9238, 0x2801, 0x4308, 0x9B08, +0x23D0, 0x4318, 0x480C, 0x1656, 0x0110, 0x140A, 0x8031, 0x000C, 0x008A, +0x2C26, 0x410C, 0x523C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, +0x403C, 0xFFCB, 0x3C40, 0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x3892, 0x411E, 0x0008, 0x411F, 0x000A, 0x830F, 0x20B3, 0x831E, +0x242B, 0x831E, 0x2432, 0x831E, 0x242B, 0x831E, 0x243C, 0x831E, 0x244E, +0x831E, 0x2456, 0x831E, 0x245E, 0x831E, 0x2466, 0x831E, 0x2469, 0x831E, +0x2426, 0x831E, 0x246A, 0x831E, 0x247D, 0x832E, 0x2480, 0x831E, 0x2488, +0x831E, 0x2430, 0x831E, 0x2451, 0x831E, 0x247D, 0x831E, 0x240D, 0x831E, +0x240B, 0x831E, 0x2409, 0x831E, 0x2407, 0x831E, 0x247D, 0x3C86, 0x412F, +0x1840, 0x4F82, 0x2B40, 0x430C, 0x5031, 0x000C, 0x160A, 0x0110, 0x412C, +0x1380, 0x2B76, 0x3FF7, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, 0x2890, +0x1840, 0x4F82, 0x2892, 0x3FED, 0x412E, 0x411F, 0x0002, 0x1840, 0x4E82, +0x2878, 0x1840, 0x4F82, 0x287A, 0x3FE3, 0x412E, 0x411F, 0x0002, 0x1840, +0x4E82, 0x287C, 0x1840, 0x4F82, 0x287E, 0x3FD9, 0x412E, 0x411F, 0x0002, +0x1840, 0x4E82, 0x2880, 0x1840, 0x4F82, 0x2882, 0x3FCF, 0x412E, 0x411F, +0x0002, 0x1840, 0x4E82, 0x2884, 0x1840, 0x4F82, 0x2886, 0x3FC5, 0x412F, +0x1840, 0x4F82, 0x2888, 0x3FC0, 0x412F, 0x1840, 0x4F82, 0x288A, 0x3FBB, +0x412F, 0x1840, 0x4F82, 0x288C, 0x3FB6, 0x412F, 0x1840, 0x4F82, 0x288E, +0x3FB1, 0x4381, 0x0004, 0x4381, 0x0006, 0x410C, 0x522C, 0x0A0F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFCA, 0x3FA3, 0x411D, 0x0004, +0x412C, 0x1380, 0x2B9A, 0x3F9C, 0x412F, 0x1840, 0x4F82, 0x2894, 0x3F97, +0x412F, 0x1840, 0x4F82, 0x2B3E, 0x3F92, 0x412F, 0x1840, 0x4F82, 0x2470, +0x3F8D, 0x412F, 0x1840, 0x4F82, 0x2896, 0x3F88, 0x412E, 0x411F, 0x0002, +0x1840, 0x4E82, 0x2400, 0x1840, 0x4F82, 0x2402, 0x3F7E, 0x403C, 0xFFC9, +0x3F7C, 0x4303, 0x147B, 0x8231, 0x0084, 0x2C26, 0x410C, 0x522C, 0x040F, +0x0F3F, 0x0030, 0x134F, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, +0x430B, 0x0087, 0x2BD2, 0x07C8, 0x00A8, 0x0008, 0x407C, 0x0048, 0x080F, +0x134F, 0x435C, 0x073F, 0x0010, 0x134F, 0x07C9, 0x00A9, 0x0030, 0x435C, +0x090F, 0x134F, 0x3C07, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x531B, 0x07C6, 0x00A6, 0x0014, 0x903B, 0x000A, 0x2C11, 0x407C, 0x0028, +0x080F, 0x134F, 0x430C, 0x060F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, +0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, 0x23E2, 0x411A, 0x0004, 0x411B, +0x0006, 0x503A, 0xFFFE, 0x633B, 0x407C, 0x0088, 0x080F, 0x134F, 0x407C, +0x0034, 0x073F, 0x0010, 0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x4A0C, +0x4B0F, 0x108C, 0x108F, 0xEF4C, 0xEF0C, 0xF03C, 0x0F00, 0xD03C, 0x0080, +0x060F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4A0C, +0x060F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x0021, 0x080F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0088, 0x080F, +0x134F, 0x407C, 0x0024, 0x073F, 0x0010, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x0082, 0x080F, 0x134F, 0x403C, 0x3FFF, 0x060F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2409, 0x060F, +0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x00C2, 0x080F, 0x134F, 0x430A, +0x430B, 0x3C0F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, +0x060F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, 0x531A, 0x630B, 0x911B, +0x0002, 0x2BEE, 0x2002, 0x912A, 0x2BEB, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2401, 0x060F, +0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, +0x5231, 0x1674, 0x0110, 0x147B, 0x8231, 0x0084, 0x2C26, 0x410C, 0x522C, +0x040F, 0x0F3F, 0x0030, 0x134F, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, +0x134F, 0x411A, 0x0004, 0x832A, 0x430B, 0x0087, 0x2BD2, 0x07C8, 0x00A8, +0x0008, 0x407C, 0x0048, 0x080F, 0x134F, 0x435C, 0x073F, 0x0010, 0x134F, +0x07C9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x3C07, 0x434C, 0x090F, +0x134F, 0x435C, 0x090F, 0x134F, 0x531B, 0x07C6, 0x00A6, 0x0014, 0x903B, +0x000A, 0x2C11, 0x407C, 0x0028, 0x080F, 0x134F, 0x430C, 0x060F, 0x134F, +0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, 0x3C01, 0x433F, 0x930F, +0x23E2, 0x4077, 0x00C8, 0x474C, 0x080F, 0x134F, 0x403C, 0x3401, 0x060F, +0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x403C, 0x4030, 0x060F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4A0C, 0x060F, 0x134F, +0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0021, 0x080F, +0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x080F, 0x134F, 0x403C, 0x2401, +0x060F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, 0x0082, 0x080F, 0x134F, +0x403C, 0x3FFF, 0x060F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x080F, +0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, 0x090F, 0x134F, 0x407C, +0x00C2, 0x080F, 0x134F, 0x430A, 0x430B, 0x3C0F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x430C, 0x060F, 0x134F, 0x040F, 0x0F3F, 0x0010, +0x134F, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BEE, 0x2002, 0x912A, 0x2BEB, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x474C, 0x080F, 0x134F, +0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x430C, 0x5231, 0x1674, 0x0110, 0x143B, 0x8321, 0x4C0A, +0x4308, 0xB31C, 0x2844, 0x008C, 0x2858, 0x002F, 0x2C26, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3CA4, 0x008C, 0x2854, 0x002F, +0x2C26, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C98, +0x0089, 0x2BD2, 0x407C, 0x0082, 0x093F, 0x0008, 0x134F, 0x403C, 0x3FFF, +0x093F, 0x0014, 0x134F, 0x434C, 0x093F, 0x0030, 0x134F, 0x407C, 0x00C8, +0x093F, 0x0008, 0x134F, 0x403C, 0x2409, 0x093F, 0x0014, 0x134F, 0x435C, +0x093F, 0x0030, 0x134F, 0x434C, 0x093F, 0x0030, 0x134F, 0x407C, 0x0048, +0x093F, 0x0008, 0x134F, 0x403C, 0x0018, 0x093F, 0x0014, 0x134F, 0x008B, +0x2854, 0x5BAB, 0x0000, 0x6B9B, 0x0002, 0x0002, 0x3C33, 0x410C, 0x530C, +0x002F, 0x2C26, 0x0F3F, 0x0028, 0x134F, 0x4C08, 0x0089, 0x2BD2, 0x407C, +0x00C1, 0x093F, 0x0008, 0x134F, 0x1840, 0x421C, 0x2858, 0x1840, 0x421D, +0x285A, 0x093F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x093F, 0x0008, 0x134F, +0x416C, 0x093F, 0x0010, 0x134F, 0x435C, 0x093F, 0x0030, 0x134F, 0x434C, +0x093F, 0x0030, 0x134F, 0x1840, 0x5392, 0x2858, 0x1840, 0x6382, 0x285A, +0x53BB, 0x0000, 0x63BB, 0x0002, 0x4B2F, 0xDB1F, 0x0002, 0x930F, 0x2402, +0x9308, 0x27C6, 0xB32A, 0x281A, 0x0089, 0x2BD2, 0x434C, 0x093F, 0x0030, +0x134F, 0x407C, 0x00C8, 0x093F, 0x0008, 0x134F, 0x403C, 0x2401, 0x093F, +0x0014, 0x134F, 0x407C, 0x0021, 0x093F, 0x0008, 0x134F, 0x435C, 0x093F, +0x0030, 0x134F, 0x3C0D, 0x9318, 0x2009, 0x407C, 0x0091, 0x002F, 0x2C26, +0x0F3F, 0x0024, 0x134F, 0x4308, 0x3C02, 0x4038, 0xFFF3, 0x480C, 0x5321, +0x1638, 0x0110, 0x143B, 0x8321, 0x4C0A, 0x430B, 0xB31C, 0x2844, 0x008C, +0x2850, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, +0xFFF5, 0x3CA1, 0x008C, 0x284C, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, +0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C95, 0x0088, 0x2BD2, 0x407C, 0x0082, +0x083F, 0x0008, 0x134F, 0x403C, 0x3FFF, 0x083F, 0x0014, 0x134F, 0x434C, +0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, +0x2409, 0x083F, 0x0014, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x434C, +0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, +0x2418, 0x083F, 0x0014, 0x134F, 0x0089, 0x284C, 0x59A9, 0x0000, 0x6999, +0x0002, 0x0002, 0x3C30, 0x410C, 0x530C, 0x002F, 0x2C26, 0x0F3F, 0x0028, +0x134F, 0x4C0B, 0x0088, 0x2BD2, 0x407C, 0x00C1, 0x083F, 0x0008, 0x134F, +0x1840, 0x421C, 0x2850, 0x083F, 0x0014, 0x134F, 0x407C, 0x00A1, 0x083F, +0x0008, 0x134F, 0x416C, 0x083F, 0x0010, 0x134F, 0x435C, 0x083F, 0x0030, +0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x1840, 0x5392, 0x2850, 0x1840, +0x6382, 0x2852, 0x53B9, 0x0000, 0x63B9, 0x0002, 0x492F, 0xD91F, 0x0002, +0x930F, 0x2402, 0x930B, 0x27C9, 0xB32A, 0x281A, 0x0088, 0x2BD2, 0x434C, +0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, 0x134F, 0x403C, +0x2401, 0x083F, 0x0014, 0x134F, 0x407C, 0x0021, 0x083F, 0x0008, 0x134F, +0x435C, 0x083F, 0x0030, 0x134F, 0x3C0D, 0x931B, 0x2009, 0x407C, 0x0091, +0x002F, 0x2C26, 0x0F3F, 0x0024, 0x134F, 0x430B, 0x3C02, 0x403B, 0xFFF3, +0x4B0C, 0x5321, 0x1638, 0x0110, 0x143B, 0x8321, 0x4C0A, 0x430B, 0xB31C, +0x2879, 0x008C, 0x2868, 0x002F, 0x2C26, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFF5, 0x3CA1, 0x008C, 0x2864, 0x002F, 0x2C26, 0x0F3F, +0x0030, 0x134F, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C95, 0x0088, 0x2BD2, +0x407C, 0x0082, 0x083F, 0x0008, 0x134F, 0x403C, 0x3FFF, 0x083F, 0x0014, +0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, +0x134F, 0x403C, 0x2409, 0x083F, 0x0014, 0x134F, 0x435C, 0x083F, 0x0030, +0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, 0x0048, 0x083F, 0x0008, +0x134F, 0x423C, 0x083F, 0x0014, 0x134F, 0x3C35, 0x410C, 0x530C, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4C0B, 0x0088, 0x2BD2, 0x407C, 0x00C1, +0x083F, 0x0008, 0x134F, 0x1840, 0x421C, 0x2868, 0x1840, 0x421D, 0x286A, +0x083F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x083F, 0x0008, 0x134F, 0x412C, +0x083F, 0x0014, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x434C, 0x083F, +0x0030, 0x134F, 0x1840, 0x53A2, 0x2868, 0x1840, 0x6382, 0x286A, 0x1840, +0x53B2, 0x2864, 0x1840, 0x63B2, 0x2866, 0x1840, 0x421F, 0x2864, 0x1840, +0xD21F, 0x2866, 0x930F, 0x2402, 0x930B, 0x27C1, 0xB32A, 0x281A, 0x0088, +0x2BD2, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, +0x134F, 0x403C, 0x2401, 0x083F, 0x0014, 0x134F, 0x407C, 0x0021, 0x083F, +0x0008, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x3C0D, 0x931B, 0x2009, +0x407C, 0x0091, 0x002F, 0x2C26, 0x0F3F, 0x0024, 0x134F, 0x430B, 0x3C02, +0x403B, 0xFFF3, 0x4B0C, 0x5321, 0x1638, 0x0110, 0x143B, 0x8321, 0x4C0A, +0x430B, 0xB31C, 0x2877, 0x008C, 0x2860, 0x002F, 0x2C26, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C9F, 0x008C, 0x285C, 0x002F, +0x2C26, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C93, +0x0088, 0x2BD2, 0x407C, 0x0082, 0x083F, 0x0008, 0x134F, 0x403C, 0x3FFF, +0x083F, 0x0014, 0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, +0x083F, 0x0008, 0x134F, 0x403C, 0x2409, 0x083F, 0x0014, 0x134F, 0x435C, +0x083F, 0x0030, 0x134F, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, +0x083F, 0x0008, 0x134F, 0x403C, 0x2408, 0x083F, 0x0014, 0x134F, 0x3C32, +0x410C, 0x530C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x4C0B, 0x0088, +0x2BD2, 0x407C, 0x00C1, 0x083F, 0x0008, 0x134F, 0x1840, 0x421C, 0x2860, +0x083F, 0x0014, 0x134F, 0x407C, 0x00A1, 0x083F, 0x0008, 0x134F, 0x412C, +0x083F, 0x0014, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x434C, 0x083F, +0x0030, 0x134F, 0x1840, 0x53A2, 0x2860, 0x1840, 0x6382, 0x2862, 0x1840, +0x53B2, 0x285C, 0x1840, 0x63B2, 0x285E, 0x1840, 0x421F, 0x285C, 0x1840, +0xD21F, 0x285E, 0x930F, 0x2402, 0x930B, 0x27C4, 0xB32A, 0x281A, 0x0088, +0x2BD2, 0x434C, 0x083F, 0x0030, 0x134F, 0x407C, 0x00C8, 0x083F, 0x0008, +0x134F, 0x403C, 0x2401, 0x083F, 0x0014, 0x134F, 0x407C, 0x0021, 0x083F, +0x0008, 0x134F, 0x435C, 0x083F, 0x0030, 0x134F, 0x3C0D, 0x931B, 0x2009, +0x407C, 0x0091, 0x002F, 0x2C26, 0x0F3F, 0x0024, 0x134F, 0x430B, 0x3C02, +0x403B, 0xFFF3, 0x4B0C, 0x5321, 0x1638, 0x0110, 0x147B, 0x8321, 0x008A, +0x2BD2, 0x0ACB, 0x00AB, 0x0008, 0x4074, 0x0088, 0x444C, 0x0B0F, 0x134F, +0x0AC8, 0x00A8, 0x0014, 0x403C, 0x0034, 0x080F, 0x134F, 0x4079, 0x0082, +0x494C, 0x0B0F, 0x134F, 0x0AC6, 0x00A6, 0x0030, 0x435C, 0x060F, 0x134F, +0x403C, 0x0960, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x4077, 0x0042, +0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0B0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x403C, 0x00FC, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x430C, 0x080F, +0x134F, 0x4C81, 0x0000, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C05, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x060F, 0x134F, +0x444C, 0x0B0F, 0x134F, 0x403C, 0x0034, 0x080F, 0x134F, 0x494C, 0x0B0F, +0x134F, 0x435C, 0x060F, 0x134F, 0x403C, 0x0A60, 0x080F, 0x134F, 0x434C, +0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, +0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x403C, 0x00FC, 0x080F, 0x134F, +0x434C, 0x060F, 0x134F, 0x474C, 0x0B0F, 0x134F, 0x435C, 0x060F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C07, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, +0x134F, 0x430C, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x444C, 0x0B0F, +0x134F, 0x407C, 0x0024, 0x0A3F, 0x0010, 0x134F, 0x435C, 0x060F, 0x134F, +0x4124, 0x470D, 0x440C, 0xD50D, 0x5321, 0x1674, 0x0110, 0x147B, 0x8231, +0x0084, 0x2C26, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x930C, +0x2403, 0x403C, 0xFFF2, 0x3C9A, 0x410C, 0x522C, 0x040F, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C8F, 0x0088, 0x2BD2, 0x08C9, +0x00A9, 0x0008, 0x407C, 0x0082, 0x090F, 0x134F, 0x08C6, 0x00A6, 0x0014, +0x403C, 0x3FFF, 0x060F, 0x134F, 0x08C7, 0x00A7, 0x0030, 0x434C, 0x070F, +0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2409, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x430A, 0x430B, 0x3C23, +0x407C, 0x00C1, 0x090F, 0x134F, 0x412C, 0x060F, 0x134F, 0x407C, 0x00A1, +0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x430C, +0x060F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, 0x412E, 0x411F, 0x0002, +0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x531A, 0x630B, 0x911B, +0x0006, 0x2BDA, 0x2003, 0x911A, 0x0004, 0x2BD6, 0x435C, 0x070F, 0x134F, +0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2401, +0x060F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, +0x430B, 0x407C, 0x0048, 0x090F, 0x134F, 0x435C, 0x083F, 0x0010, 0x134F, +0x435C, 0x070F, 0x134F, 0x3C07, 0x434C, 0x070F, 0x134F, 0x435C, 0x070F, +0x134F, 0x531B, 0x903B, 0x000A, 0x2C11, 0x407C, 0x0028, 0x090F, 0x134F, +0x430C, 0x060F, 0x134F, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2002, 0x430F, +0x3C01, 0x433F, 0x930F, 0x23E5, 0x430C, 0x5231, 0x1674, 0x0110, 0x145B, +0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x4318, 0x3C6F, 0x412A, 0x411B, +0x0002, 0x0089, 0x2BD2, 0x09C6, 0x00A6, 0x0008, 0x407C, 0x0088, 0x060F, +0x134F, 0x407C, 0x0034, 0x093F, 0x0010, 0x134F, 0x407C, 0x0082, 0x060F, +0x134F, 0x09C7, 0x00A7, 0x0030, 0x435C, 0x070F, 0x134F, 0x4A0E, 0x4B0F, +0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0x480C, 0xDE0C, 0xD03C, +0x0080, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, +0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x4A0C, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, +0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x407C, +0x0082, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x403C, 0x3FFD, 0x093F, +0x0014, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0088, 0x060F, +0x134F, 0x407C, 0x0024, 0x093F, 0x0010, 0x134F, 0x435C, 0x070F, 0x134F, +0x5318, 0x9038, 0x0010, 0x2C26, 0x9328, 0x2001, 0x4228, 0x0087, 0x2C26, +0x410B, 0x530B, 0x0BCC, 0x070F, 0x0F3F, 0x0028, 0x134F, 0x0BCC, 0x00AC, +0x0001, 0x070F, 0x0F3F, 0x0028, 0x134F, 0x03EB, 0x0BCC, 0x070F, 0x0F3F, +0x0028, 0x134F, 0x9038, 0x000F, 0x2402, 0x930C, 0x2005, 0x9038, 0x000F, +0x236D, 0x930C, 0x376B, 0x403C, 0xFFD8, 0x3C01, 0x430C, 0x5221, 0x1656, +0x0110, 0x147B, 0x4C04, 0x430A, 0x008B, 0x2BD2, 0x0BC8, 0x00A8, 0x0008, +0x407C, 0x0088, 0x080F, 0x134F, 0x407C, 0x0034, 0x0B3F, 0x0010, 0x134F, +0x4039, 0x0032, 0x4076, 0x00C8, 0x464C, 0x080F, 0x134F, 0x0BC7, 0x00A7, +0x0014, 0x403C, 0x2401, 0x070F, 0x134F, 0x407C, 0x0028, 0x080F, 0x134F, +0x430C, 0x070F, 0x134F, 0x5339, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C02, +0x9309, 0x23F5, 0x407C, 0x0082, 0x080F, 0x134F, 0x403C, 0x4030, 0x070F, +0x134F, 0x00AB, 0x0030, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x403C, 0x0C04, 0x070F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x403C, 0x3FFF, 0x070F, 0x134F, +0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2409, 0x070F, +0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, +0x134F, 0x403C, 0x2408, 0x070F, 0x134F, 0x3C1C, 0x407C, 0x00C1, 0x080F, +0x134F, 0x4A0F, 0x5F0F, 0x440C, 0x5F0C, 0x070F, 0x134F, 0x407C, 0x00A1, +0x080F, 0x134F, 0x4A0F, 0x0FEF, 0x1840, 0x4F1C, 0x2730, 0x070F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x531A, 0x903A, 0x0030, +0x3BE1, 0x434C, 0x0B0F, 0x134F, 0x464C, 0x080F, 0x134F, 0x403C, 0x2401, +0x070F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x1674, 0x0110, 0x147B, 0x120C, 0x8031, 0x0040, 0x40B1, 0x0007, 0x0002, +0x430A, 0x403B, 0x0006, 0x4381, 0x0000, 0x0086, 0x2C26, 0x410C, 0x530C, +0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C82, +0x410C, 0x532C, 0x060F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x3403, 0x403C, +0xFFBE, 0x3C77, 0x90B1, 0x000F, 0x0002, 0x2002, 0x403B, 0x0009, 0x403C, +0x0C04, 0x430D, 0x1380, 0x2814, 0x4034, 0x0018, 0x440E, 0x410D, 0x522D, +0x412C, 0x1380, 0x281C, 0x0085, 0x2818, 0x440E, 0x008D, 0x2404, 0x412C, +0x050F, 0x134F, 0x4037, 0x0028, 0x4B0E, 0xD03E, 0x0080, 0x4A0D, 0x1844, +0x5D0D, 0x412C, 0x13B1, 0xAD2C, 0x4C08, 0x4D09, 0x9381, 0x0040, 0x2406, +0x440E, 0x008D, 0x2404, 0x412C, 0x050F, 0x134F, 0x480F, 0xD90F, 0x930F, +0x242C, 0x9039, 0x0020, 0x280F, 0x2003, 0x9038, 0xA761, 0x280B, 0x4A0F, +0x533A, 0x930F, 0x2016, 0x403A, 0x0007, 0x4B0F, 0x533B, 0x930F, 0x2010, +0x3C1A, 0x9039, 0x0015, 0x2804, 0x200E, 0x9038, 0x83D0, 0x2C0B, 0x531A, +0x923A, 0x2805, 0x430A, 0x531B, 0x9B81, 0x0002, 0x280B, 0x5337, 0x9317, +0x37C4, 0x440E, 0x410D, 0x522D, 0x412C, 0x050F, 0x134F, 0x9317, 0x3402, +0x433C, 0x3C14, 0x1844, 0x5A0A, 0x4A0C, 0x060F, 0x0F3F, 0x0010, 0x134F, +0xD03B, 0x0080, 0x4B0C, 0x060F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x060F, +0x0F3F, 0x0010, 0x134F, 0x430C, 0x5031, 0x0042, 0x1674, 0x0110, 0x147B, +0x8221, 0x431A, 0x3C90, 0x932A, 0x2001, 0x422A, 0x0087, 0x2C26, 0x410B, +0x530B, 0x0BCC, 0x070F, 0x0F3F, 0x0028, 0x134F, 0x0BCC, 0x00AC, 0x0001, +0x070F, 0x0F3F, 0x0028, 0x134F, 0x0BCC, 0x03EC, 0x070F, 0x0F3F, 0x0028, +0x134F, 0x43CB, 0x0003, 0x4124, 0x4115, 0x0002, 0x1084, 0x1085, 0xE344, +0xE504, 0xF034, 0x0F00, 0x5034, 0x0080, 0x4127, 0x0086, 0x2BD2, 0x06CB, +0x00AB, 0x0030, 0x434C, 0x0B0F, 0x134F, 0x06C8, 0x00A8, 0x0008, 0x407C, +0x0082, 0x080F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x06C9, 0x00A9, 0x0014, +0x4A0F, 0xF03F, 0x000F, 0x5F04, 0x440C, 0x090F, 0x134F, 0x407C, 0x00C8, +0x080F, 0x134F, 0x403C, 0x1401, 0x090F, 0x134F, 0x407C, 0x0082, 0x080F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x470C, 0x090F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x403C, 0x3FFD, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x434C, +0x0B0F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x430C, 0x430D, 0x063F, +0x0018, 0x134F, 0x435C, 0x0B0F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, +0x403C, 0x0501, 0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, +0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x531A, 0x903A, 0x0010, 0x2B6D, 0x430C, 0x5221, 0x1674, +0x0110, 0x147B, 0x120C, 0x8031, 0x0040, 0x4309, 0x4037, 0x001B, 0x4381, +0x0000, 0x430A, 0x430B, 0x0088, 0x2C26, 0x410C, 0x530C, 0x080F, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C7D, 0x403C, 0x0C04, +0x430D, 0x1380, 0x2814, 0x4105, 0x5225, 0x403E, 0x001D, 0x05CD, 0x412C, +0x1380, 0x281C, 0x0084, 0x2818, 0x403E, 0x001D, 0x008D, 0x2434, 0x412C, +0x040F, 0x134F, 0x3C03, 0x4607, 0x4391, 0x0002, 0x490F, 0x531F, 0x970F, +0x2C24, 0x4706, 0x5906, 0x0356, 0x4381, 0x0002, 0x430E, 0x460D, 0x0A5D, +0x412C, 0x13B1, 0xAD2C, 0x4C0A, 0x4D0B, 0x9381, 0x0040, 0x2407, 0x403E, +0x001D, 0x008D, 0x2434, 0x412C, 0x040F, 0x134F, 0x4A0F, 0xDB0F, 0x930F, +0x2409, 0x903B, 0x0020, 0x2804, 0x23DA, 0x903A, 0xA761, 0x2FD7, 0x4609, +0x3FD8, 0x9381, 0x0002, 0x2408, 0x430E, 0x490D, 0x0A5D, 0x412C, 0x13B1, +0xAD2C, 0x4C0A, 0x4D0B, 0x403E, 0x0018, 0x05CD, 0x412C, 0x040F, 0x134F, +0x503A, 0x6478, 0x603B, 0xFFEC, 0x903B, 0x0010, 0x2806, 0x2003, 0x903A, +0xB559, 0x2802, 0x433C, 0x3C1D, 0x430C, 0x080F, 0x0F3F, 0x0010, 0x134F, +0x0A59, 0x490C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x403C, 0x0080, 0x080F, +0x0F3F, 0x0010, 0x134F, 0x403C, 0x0080, 0x080F, 0x0F3F, 0x0010, 0x134F, +0x430C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x5031, 0x0042, 0x1674, +0x0110, 0x147B, 0x8231, 0x0084, 0x2C26, 0x410C, 0x522C, 0x040F, 0x0F3F, +0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C87, 0x410C, 0x530C, +0x040F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C7C, +0x0087, 0x2BD2, 0x07C8, 0x00A8, 0x0008, 0x407C, 0x0082, 0x080F, 0x134F, +0x07C6, 0x00A6, 0x0014, 0x403C, 0x3FFF, 0x060F, 0x134F, 0x07C9, 0x00A9, +0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, +0x2409, 0x060F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x0048, 0x080F, 0x134F, 0x403C, 0x0019, 0x060F, 0x134F, 0x412E, +0x411F, 0x0002, 0x5E0E, 0x6F0F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x430A, +0x430B, 0x3C28, 0x407C, 0x00C1, 0x080F, 0x134F, 0x411C, 0x0004, 0x411D, +0x0006, 0x073F, 0x0018, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430C, 0x060F, 0x134F, 0x040F, +0x0F3F, 0x0008, 0x134F, 0x411E, 0x0004, 0x411F, 0x0006, 0x531E, 0x630F, +0x4E81, 0x0004, 0x4F81, 0x0006, 0x531A, 0x630B, 0x911B, 0x0002, 0x2BD5, +0x2002, 0x912A, 0x2BD2, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x407C, +0x0021, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x430C, 0x5231, 0x1674, +0x0110, 0x147B, 0x0086, 0x2BD2, 0x06CA, 0x00AA, 0x0008, 0x407B, 0x00C8, +0x4B4C, 0x0A0F, 0x134F, 0x06C8, 0x00A8, 0x0014, 0x403C, 0x3401, 0x080F, +0x134F, 0x4079, 0x0082, 0x494C, 0x0A0F, 0x134F, 0x403C, 0x4982, 0x080F, +0x134F, 0x00A6, 0x0030, 0x434C, 0x060F, 0x134F, 0x4077, 0x0042, 0x474C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, 0x134F, 0x403C, +0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, 0x0A0F, 0x134F, +0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, +0x430C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C04, 0x434C, 0x060F, +0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x435C, +0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x3401, 0x080F, 0x134F, +0x494C, 0x0A0F, 0x134F, 0x403C, 0x4A82, 0x080F, 0x134F, 0x434C, 0x060F, +0x134F, 0x474C, 0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x494C, 0x0A0F, +0x134F, 0x403C, 0x00FE, 0x080F, 0x134F, 0x434C, 0x060F, 0x134F, 0x474C, +0x0A0F, 0x134F, 0x435C, 0x060F, 0x134F, 0x434C, 0x060F, 0x134F, 0x435C, +0x060F, 0x134F, 0x430C, 0x080F, 0x134F, 0x430C, 0x080F, 0x134F, 0x4C07, +0x434C, 0x060F, 0x134F, 0x4B4C, 0x0A0F, 0x134F, 0x403C, 0x2401, 0x080F, +0x134F, 0x435C, 0x060F, 0x134F, 0x440C, 0x470D, 0x1674, 0x0110, 0x143B, +0x8031, 0x0006, 0x008A, 0x2C26, 0xB31C, 0x2816, 0x008C, 0x286C, 0x0A0F, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFD7, 0x3C80, 0x008C, +0x2870, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x933C, 0x2003, 0x403C, 0xFFD6, +0x3C75, 0x407C, 0x0091, 0x0A0F, 0x0F3F, 0x0024, 0x134F, 0x0A0F, 0x0F3F, +0x0004, 0x134F, 0x410D, 0x530D, 0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x0034, +0x134F, 0x3C56, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, 0x0030, 0x434C, 0x0B0F, +0x134F, 0x0AC8, 0x00A8, 0x0008, 0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, +0x0500, 0x0A3F, 0x0014, 0x134F, 0x407C, 0x00C1, 0x080F, 0x134F, 0x1840, +0x421C, 0x286C, 0x1840, 0x421D, 0x286E, 0x0A3F, 0x0018, 0x134F, 0x435C, +0x0B0F, 0x134F, 0x407C, 0x00A1, 0x080F, 0x134F, 0x013F, 0x0002, 0x1800, +0x53E1, 0x0002, 0x4F2C, 0x0A3F, 0x0014, 0x134F, 0x434C, 0x0B0F, 0x134F, +0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x0501, 0x0A3F, 0x0014, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x1840, 0x53A2, 0x286C, 0x1840, 0x6382, 0x286E, 0x412F, 0x832F, 0x4F81, +0x0000, 0x1840, 0x53B2, 0x2870, 0x1840, 0x63B2, 0x2872, 0x1840, 0x421F, +0x2870, 0x1840, 0xD21F, 0x2872, 0x930F, 0x2403, 0x9381, 0x0000, 0x239F, +0x430C, 0x5031, 0x0006, 0x1638, 0x0110, 0x147B, 0x8231, 0x4304, 0x0088, +0x2C26, 0x410C, 0x522C, 0x080F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, +0x4034, 0xFFDF, 0x3C7F, 0x410C, 0x530C, 0x080F, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x3403, 0x4034, 0xFFDE, 0x3C74, 0x0087, 0x2BD2, 0x07C9, 0x00A9, +0x0008, 0x407C, 0x0082, 0x090F, 0x134F, 0x07C6, 0x00A6, 0x0014, 0x403C, +0x3FFF, 0x060F, 0x134F, 0x00A7, 0x0030, 0x434C, 0x070F, 0x134F, 0x407C, +0x00C8, 0x090F, 0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, 0x070F, +0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, +0x2419, 0x060F, 0x134F, 0x412E, 0x411F, 0x0002, 0x5E0E, 0x6F0F, 0x4E81, +0x0000, 0x4F81, 0x0002, 0x430A, 0x430B, 0x3C25, 0x407C, 0x00C1, 0x090F, +0x134F, 0x411C, 0x0004, 0x060F, 0x134F, 0x407C, 0x00A1, 0x090F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x430C, 0x060F, 0x134F, +0x080F, 0x0F3F, 0x0008, 0x134F, 0x411E, 0x0004, 0x411F, 0x0006, 0x531E, +0x630F, 0x4E81, 0x0004, 0x4F81, 0x0006, 0x531A, 0x630B, 0x911B, 0x0002, +0x2BD8, 0x2002, 0x912A, 0x2BD5, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, +0x090F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, 0x090F, +0x134F, 0x435C, 0x070F, 0x134F, 0x440C, 0x5231, 0x1674, 0x0110, 0x141B, +0x8231, 0x008A, 0x2C26, 0x410C, 0x522C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, +0x930C, 0x3411, 0x403C, 0xFFC8, 0x3C7B, 0x434C, 0x0B3F, 0x0050, 0x134F, +0x415E, 0x0004, 0x537E, 0x4EC1, 0x0004, 0x411C, 0x0006, 0x0B3F, 0x0024, +0x134F, 0x93C1, 0x0004, 0x2469, 0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x002C, +0x134F, 0x930C, 0x3811, 0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x3809, 0x410C, 0x503C, 0x0006, 0x0A0F, 0x0F3F, 0x002C, 0x134F, +0x930C, 0x3403, 0x403C, 0xFFC7, 0x3C4E, 0x008B, 0x2B62, 0xB0B1, 0x0040, +0x0000, 0x280D, 0xB0B1, 0x0040, 0x0002, 0x2805, 0x435C, 0x0B3F, 0x0030, +0x134F, 0x3C04, 0x434C, 0x0B3F, 0x0030, 0x134F, 0xB0B1, 0x0100, 0x0000, +0x280D, 0xB0B1, 0x0100, 0x0002, 0x2805, 0x435C, 0x0B3F, 0x0034, 0x134F, +0x3C04, 0x434C, 0x0B3F, 0x0034, 0x134F, 0xB391, 0x0000, 0x280C, 0xB391, +0x0002, 0x2805, 0x435C, 0x0B3F, 0x0048, 0x134F, 0x3C04, 0x434C, 0x0B3F, +0x0048, 0x134F, 0xB2B1, 0x0000, 0x280C, 0xB2B1, 0x0002, 0x2805, 0x435C, +0x0B3F, 0x004C, 0x134F, 0x3C04, 0x434C, 0x0B3F, 0x004C, 0x134F, 0xB3A1, +0x0000, 0x2B92, 0xB3A1, 0x0002, 0x2B8B, 0x435C, 0x0B3F, 0x0050, 0x134F, +0x3F8A, 0x430C, 0x5231, 0x161A, 0x0110, 0x143B, 0x8321, 0x4391, 0x0000, +0x008B, 0x2C26, 0x410C, 0x530C, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x9391, +0x0000, 0x2074, 0x008A, 0x2B62, 0x431C, 0x0A3F, 0x0010, 0x134F, 0x0088, +0x2BD2, 0x08CC, 0x13B0, 0x1880, 0x0A3F, 0x001C, 0x134F, 0x0A3F, 0x0054, +0x134F, 0x435C, 0x0A3F, 0x0018, 0x134F, 0x080F, 0x134F, 0x083F, 0x0004, +0x134F, 0x403C, 0xA55A, 0x13B1, 0xC120, 0x931C, 0x2003, 0x403C, 0xFFCF, +0x3C53, 0x434C, 0x0A3F, 0x0018, 0x134F, 0x080F, 0x134F, 0x083F, 0x0004, +0x134F, 0x13B1, 0xCD7C, 0x903C, 0xC3C3, 0x2003, 0x403C, 0xFFBB, 0x3C42, +0x08C9, 0x00A9, 0x0008, 0x407C, 0x0028, 0x090F, 0x134F, 0x4C4A, 0x4A0C, +0x430D, 0x13B1, 0xCCDC, 0x930C, 0x2432, 0x903A, 0x0098, 0x2009, 0x407C, +0x00F4, 0x090F, 0x134F, 0x403C, 0x4020, 0x083F, 0x0014, 0x134F, 0x903A, +0x0099, 0x2012, 0x407C, 0x00F4, 0x090F, 0x134F, 0x403C, 0x40A0, 0x083F, +0x0014, 0x134F, 0x407C, 0x0054, 0x090F, 0x134F, 0x430C, 0x431D, 0x083F, +0x001C, 0x134F, 0x435C, 0x0B0F, 0x0F3F, 0x0008, 0x134F, 0x4A4C, 0x0B0F, +0x0F3F, 0x0008, 0x134F, 0x416C, 0x0B0F, 0x0F3F, 0x0008, 0x134F, 0x430C, +0x3C02, 0x403C, 0xFFBC, 0x5321, 0x1638, 0x0110, 0x147B, 0x8231, 0x0084, +0x2C26, 0x410C, 0x530C, 0x040F, 0x0F3F, 0x0030, 0x134F, 0x930C, 0x2403, +0x403C, 0xFFF2, 0x3C75, 0x410C, 0x522C, 0x040F, 0x0F3F, 0x0030, 0x134F, +0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C6A, 0x0086, 0x2BD2, 0x06C8, 0x00A8, +0x0008, 0x407C, 0x0082, 0x080F, 0x134F, 0x06C7, 0x00A7, 0x0014, 0x403C, +0x3FFF, 0x070F, 0x134F, 0x06C9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, +0x407C, 0x00C8, 0x080F, 0x134F, 0x403C, 0x2409, 0x070F, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x430A, 0x430B, 0x3C26, 0x407C, +0x00C1, 0x080F, 0x134F, 0x412C, 0x411D, 0x0002, 0x063F, 0x0018, 0x134F, +0x407C, 0x00A1, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x430C, 0x070F, 0x134F, 0x040F, 0x0F3F, 0x0010, 0x134F, 0x412E, +0x411F, 0x0002, 0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x531A, +0x630B, 0x911B, 0x0006, 0x2BD7, 0x2003, 0x911A, 0x0004, 0x2BD3, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x080F, 0x134F, +0x403C, 0x2401, 0x070F, 0x134F, 0x407C, 0x0021, 0x080F, 0x134F, 0x435C, +0x090F, 0x134F, 0x430C, 0x5231, 0x1674, 0x0110, 0x147B, 0x8031, 0x0020, +0x4C0A, 0x4E0B, 0x1800, 0x43C1, 0x0000, 0x4D0E, 0x430F, 0x403C, 0x0005, +0x1380, 0x2810, 0x4B0E, 0x430F, 0x403C, 0x0006, 0x1380, 0x2810, 0x430B, +0x4A0C, 0x430D, 0x1380, 0x2814, 0x407C, 0x00A8, 0x1380, 0x2BDA, 0x0086, +0x2C26, 0x410D, 0x530D, 0x403C, 0xAA02, 0x060F, 0x0F3F, 0x0058, 0x134F, +0x13B1, 0xCE70, 0x010F, 0x4F28, 0x4309, 0x403F, 0x0D3E, 0x403B, 0x0003, +0x533F, 0x633B, 0x2FFD, 0x010F, 0x4F2A, 0x430B, 0x13B1, 0xCF8E, 0x410C, +0x522C, 0x018E, 0xD116, 0x427D, 0x13B1, 0xCF3E, 0x4107, 0x5037, 0x000C, +0x1407, 0x430F, 0x434E, 0x423D, 0x410C, 0x523C, 0x0604, 0x0434, 0x001C, +0x1344, 0x403C, 0x0003, 0x1380, 0x2820, 0x07CC, 0x060F, 0x0F3F, 0x0020, +0x134F, 0x5221, 0x9309, 0x2007, 0x9A08, 0x2C05, 0x880A, 0x790B, 0x4A08, +0x4B09, 0x3C02, 0x8A08, 0x7309, 0x1380, 0x280C, 0x4C0A, 0x4D0B, 0x403C, +0xAA02, 0x060F, 0x0F3F, 0x005C, 0x134F, 0x4A0C, 0x4B0D, 0x403E, 0x0003, +0x430F, 0x13B1, 0xCE2C, 0x503C, 0x001F, 0x630D, 0x403E, 0x03E8, 0x430F, +0x13B1, 0xCE2C, 0x480E, 0x490F, 0x13B1, 0xCA3E, 0x5031, 0x0020, 0x1674, +0x0110, 0x143B, 0x8031, 0x001E, 0x43C1, 0x0000, 0x435A, 0x403C, 0x0005, +0x1380, 0x2B86, 0x008B, 0x2BD2, 0x407C, 0x0028, 0x0B3F, 0x0008, 0x134F, +0x008F, 0x2830, 0x4C4C, 0x430D, 0x13B1, 0xCCA6, 0x930C, 0x2403, 0x438F, +0x0000, 0x3C03, 0x539F, 0x0000, 0x436A, 0x93AF, 0x0000, 0x3859, 0x438F, +0x0000, 0x434C, 0x1380, 0x2B8E, 0x0B0F, 0x134F, 0x407C, 0x0028, 0x0B3F, +0x0008, 0x134F, 0x4CC1, 0x0000, 0x416C, 0x430D, 0x13B1, 0xCCA6, 0x930C, +0x2445, 0x407C, 0x0086, 0x0B3F, 0x0008, 0x134F, 0x916C, 0x203E, 0x435A, +0x422C, 0x0B3F, 0x0014, 0x134F, 0x903C, 0x1207, 0x2036, 0x430C, 0x0B3F, +0x0014, 0x134F, 0x903C, 0xA55A, 0x202C, 0x410C, 0x532C, 0x018E, 0xD126, +0x427D, 0x13B1, 0xCF3E, 0x1840, 0x42D1, 0x2470, 0x0002, 0x008F, 0x2470, +0x4FD1, 0x0001, 0x0003, 0x410B, 0x503B, 0x000A, 0x140B, 0x430F, 0x434E, +0x423D, 0x410C, 0x503C, 0x0006, 0x0028, 0x2C26, 0x0838, 0x001C, 0x1348, +0x403C, 0x0003, 0x002F, 0x2A00, 0x134F, 0x0BCC, 0x002F, 0x2C26, 0x0F3F, +0x0020, 0x134F, 0x5221, 0x3C03, 0x43F1, 0x0000, 0x436A, 0x4A4C, 0x5031, +0x001E, 0x1638, 0x0110, 0x145B, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, +0x435A, 0x3C71, 0x936A, 0x2001, 0x426A, 0x0089, 0x2BD2, 0x09C6, 0x00A6, +0x0008, 0x407C, 0x0088, 0x060F, 0x134F, 0x09CB, 0x00AB, 0x0014, 0x403C, +0x0034, 0x0B0F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x09C7, 0x00A7, +0x0030, 0x435C, 0x070F, 0x134F, 0x4A4C, 0x108C, 0xF03C, 0x0F00, 0xD03C, +0x0060, 0x0B0F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x060F, +0x134F, 0x435C, 0x070F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x435C, +0x070F, 0x134F, 0x403C, 0x00FC, 0x0B0F, 0x134F, 0x434C, 0x070F, 0x134F, +0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x430C, 0x0B0F, +0x134F, 0x4C08, 0x434C, 0x070F, 0x134F, 0x435C, 0x070F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x4C0B, 0x434C, 0x070F, 0x134F, 0x407C, 0x0088, 0x060F, +0x134F, 0x407C, 0x0024, 0x093F, 0x0010, 0x134F, 0x435C, 0x070F, 0x134F, +0x480E, 0x4B0F, 0x4E81, 0x0000, 0x4F81, 0x0002, 0x403D, 0x0003, 0x410C, +0x530C, 0x002F, 0x2C26, 0x0F3F, 0x000C, 0x134F, 0x535A, 0x907A, 0x0010, +0x2B8C, 0x430C, 0x5221, 0x1656, 0x0110, 0x145B, 0x8321, 0x431A, 0x3C58, +0x412B, 0x0088, 0x2BD2, 0x08C9, 0x00A9, 0x0008, 0x407C, 0x00C8, 0x090F, +0x134F, 0x08C6, 0x00A6, 0x0014, 0x403C, 0x3401, 0x060F, 0x134F, 0x407C, +0x0082, 0x090F, 0x134F, 0x4A0C, 0xD03C, 0x4030, 0x060F, 0x134F, 0x00A8, +0x0030, 0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x435C, +0x080F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x4B0C, 0x060F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x435C, 0x080F, +0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x403C, 0x3FFD, 0x060F, 0x134F, +0x434C, 0x080F, 0x134F, 0x407C, 0x0042, 0x090F, 0x134F, 0x435C, 0x080F, +0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, +0x2401, 0x060F, 0x134F, 0x435C, 0x080F, 0x134F, 0x531A, 0x903A, 0x0010, +0x2C17, 0x932A, 0x2001, 0x422A, 0x410C, 0x530C, 0x002F, 0x2C26, 0x0F3F, +0x002C, 0x134F, 0x903A, 0x000F, 0x2402, 0x930C, 0x2005, 0x903A, 0x000F, +0x2393, 0x930C, 0x3791, 0x403C, 0xFFD8, 0x3C01, 0x430C, 0x5321, 0x1656, +0x0110, 0x143B, 0x8031, 0x000A, 0x4381, 0x0000, 0x430A, 0x4381, 0x0002, +0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0008, 0x410C, 0x530C, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFC1, 0x3C5B, +0x531A, 0x912A, 0x2C0F, 0x410C, 0x532C, 0x4A0F, 0x5F0F, 0x5F0C, 0x002F, +0x2C26, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x37F1, 0x403C, 0xFFC0, 0x3C49, +0x008A, 0x2B62, 0x430C, 0x0A3F, 0x0010, 0x134F, 0x0088, 0x2BD2, 0x08CC, +0x13B0, 0x1880, 0x0ACB, 0x00AB, 0x0030, 0x434C, 0x0B0F, 0x134F, 0x434C, +0x0A3F, 0x0018, 0x134F, 0x080F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x083F, +0x0004, 0x134F, 0x411D, 0x0004, 0x411C, 0x0002, 0x13B1, 0xBE82, 0x931C, +0x241D, 0x90B1, 0x0003, 0x0000, 0x2810, 0x435C, 0x0B0F, 0x134F, 0x403C, +0x00C8, 0x0A3F, 0x0024, 0x134F, 0x411D, 0x0008, 0x411C, 0x0006, 0x13B1, +0xBE82, 0x931C, 0x2409, 0x407C, 0x0028, 0x083F, 0x0008, 0x134F, 0x4C4C, +0x903C, 0x0095, 0x2403, 0x403C, 0xFFCE, 0x3C04, 0x435C, 0x0B0F, 0x134F, +0x430C, 0x5031, 0x000A, 0x1638, 0x0110, 0x141B, 0x8031, 0x0006, 0x43C1, +0x0000, 0x43C1, 0x0001, 0x4381, 0x0002, 0x4381, 0x0004, 0x008A, 0x2C26, +0x410C, 0x531C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x008B, 0x2BD2, 0x407C, +0x00B0, 0x0B3F, 0x0008, 0x134F, 0x3C1C, 0x90F1, 0x009E, 0x0000, 0x2007, +0xB0B1, 0x0040, 0x0002, 0x2803, 0x1840, 0x4382, 0x2838, 0x416C, 0x430D, +0x0B3F, 0x001C, 0x134F, 0x411C, 0x0002, 0x411D, 0x0004, 0x0B3F, 0x001C, +0x134F, 0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x243A, +0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0xB3D1, 0x0000, 0x281B, +0x416E, 0xC35E, 0x907E, 0x008A, 0x2007, 0x1840, 0x421C, 0x2898, 0x1840, +0x421D, 0x289A, 0x3C0A, 0x416C, 0x430D, 0x0B3F, 0x001C, 0x134F, 0x430C, +0x430D, 0x0B3F, 0x001C, 0x134F, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x3FD4, +0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x416E, 0xC35E, 0x907E, +0x008A, 0x23B2, 0x411E, 0x0002, 0x411F, 0x0004, 0x1840, 0x4E82, 0x2898, +0x1840, 0x4F82, 0x289A, 0x3FBE, 0x430C, 0x5031, 0x0006, 0x161A, 0x0110, +0x141B, 0x8031, 0x007C, 0x4381, 0x0000, 0x430A, 0x410C, 0x522C, 0x403E, +0x003C, 0x13B1, 0xCF56, 0x008B, 0x2C26, 0x410C, 0x532C, 0x0B0F, 0x0F3F, +0x002C, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C57, 0x410C, 0x530C, +0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2404, 0x403C, 0xFFC1, 0x3C4C, +0x531A, 0x912A, 0x2C0E, 0x410C, 0x522C, 0x4A0F, 0x5F0F, 0x5F0C, 0x0B0F, +0x0F3F, 0x002C, 0x134F, 0x930C, 0x37F2, 0x403C, 0xFFC0, 0x3C3B, 0x008B, +0x2B62, 0x411C, 0x0002, 0x0B3F, 0x0010, 0x134F, 0x008A, 0x2BD2, 0x0ACC, +0x13B0, 0x1880, 0x434C, 0x0B3F, 0x0018, 0x134F, 0x0A0F, 0x134F, 0x0B3F, +0x001C, 0x134F, 0x435C, 0x0B3F, 0x0018, 0x134F, 0x0A0F, 0x134F, 0x403D, +0x1E1E, 0x403C, 0xA55A, 0x13B1, 0xBE82, 0x931C, 0x2414, 0x434C, 0x0B3F, +0x0018, 0x134F, 0x0A0F, 0x134F, 0x430A, 0x3C01, 0x531A, 0x912A, 0x2C0C, +0x4A0F, 0x5F0F, 0x510F, 0x4F1C, 0x0004, 0x13B1, 0xC120, 0x931C, 0x23F4, +0x403C, 0xFFCE, 0x3C01, 0x430C, 0x5031, 0x007C, 0x161A, 0x0110, 0x145B, +0x8031, 0x0006, 0x434B, 0x4338, 0x0089, 0x2C26, 0x410C, 0x522C, 0x090F, +0x0F3F, 0x0028, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C5D, 0x431C, +0x090F, 0x0F3F, 0x0038, 0x134F, 0x410C, 0x530C, 0x090F, 0x0F3F, 0x0030, +0x134F, 0x930C, 0x3403, 0x403C, 0xFFCD, 0x3C4D, 0x43C1, 0x0004, 0x0086, +0x2B62, 0x430C, 0x063F, 0x0010, 0x134F, 0x930C, 0x2403, 0x403C, 0xFFEA, +0x3C40, 0x008C, 0x2BD2, 0x13B0, 0x1880, 0x90B1, 0xA55A, 0x0000, 0x2004, +0x90B1, 0xA55A, 0x0002, 0x2408, 0x90B1, 0x5AA5, 0x0000, 0x2027, 0x90B1, +0x5AA5, 0x0002, 0x2023, 0x434C, 0x063F, 0x0030, 0x134F, 0x435C, 0x063F, +0x0018, 0x134F, 0x1380, 0x2BD2, 0x434C, 0x063F, 0x0030, 0x134F, 0x435B, +0x412D, 0x411C, 0x0002, 0x13B1, 0xBE82, 0x4C4A, 0x435C, 0x063F, 0x0030, +0x134F, 0x403C, 0x0BB8, 0x063F, 0x0024, 0x134F, 0x935A, 0x2003, 0x403C, +0xFFCE, 0x3C09, 0x4B4C, 0x090F, 0x0F3F, 0x0008, 0x134F, 0x934B, 0x2401, +0x4308, 0x480C, 0x5031, 0x0006, 0x1656, 0x0110, 0x145B, 0x4C08, 0x4E0A, +0x4F0B, 0x0089, 0x2BD2, 0x09C6, 0x00A6, 0x0008, 0x407C, 0x0088, 0x060F, +0x134F, 0x407C, 0x0034, 0x093F, 0x0010, 0x134F, 0x407C, 0x0082, 0x060F, +0x134F, 0x09C7, 0x00A7, 0x0030, 0x435C, 0x070F, 0x134F, 0x4A0E, 0x4B0F, +0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0xDE08, 0xD038, 0x0080, +0x480C, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, +0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x407C, 0x0082, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x4A0C, 0x093F, 0x0014, 0x134F, 0x434C, 0x070F, +0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x407C, +0x0082, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x403C, 0x3FFD, 0x093F, +0x0014, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0088, 0x060F, +0x134F, 0x407C, 0x0024, 0x093F, 0x0010, 0x134F, 0x435C, 0x070F, 0x134F, +0x1656, 0x0110, 0x143B, 0x8221, 0x433B, 0x43E1, 0x0000, 0x1840, 0x4218, +0x246E, 0x4381, 0x0002, 0x008A, 0x2C26, 0x410C, 0x532C, 0x0A0F, 0x0F3F, +0x002C, 0x134F, 0x13B1, 0xAE30, 0x4CC1, 0x0000, 0x9381, 0x0002, 0x2425, +0x0A0F, 0x0F3F, 0x0010, 0x93D1, 0x0000, 0x422C, 0x200E, 0x134F, 0x430C, +0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, +0x0014, 0x134F, 0x3C0E, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, +0x134F, 0x430C, 0x403D, 0x4000, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430B, +0x3C2A, 0x416E, 0x1840, 0x4E82, 0x246E, 0x9E08, 0x2424, 0x931E, 0x422C, +0x0A0F, 0x0F3F, 0x0010, 0x200F, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, +0x0014, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x431B, +0x3C0F, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430C, +0x403D, 0x4000, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x431B, 0x4B0C, 0x5221, +0x1638, 0x0110, 0x145B, 0x435A, 0x3C5C, 0x936A, 0x2001, 0x426A, 0x008B, +0x2BD2, 0x0BC8, 0x00A8, 0x0008, 0x407C, 0x00C8, 0x080F, 0x134F, 0x0BC9, +0x00A9, 0x0014, 0x403C, 0x3401, 0x090F, 0x134F, 0x407C, 0x0082, 0x080F, +0x134F, 0x4A4C, 0x108C, 0xF03C, 0x0F00, 0xD03C, 0x4082, 0x090F, 0x134F, +0x00AB, 0x0030, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x407C, 0x0082, 0x080F, 0x134F, 0x403C, 0x00FE, +0x090F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x0042, 0x080F, 0x134F, +0x435C, 0x0B0F, 0x134F, 0x434C, 0x0B0F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x430C, 0x090F, 0x134F, 0x4C06, 0x434C, 0x0B0F, 0x134F, 0x407C, 0x00C8, +0x080F, 0x134F, 0x403C, 0x2401, 0x090F, 0x134F, 0x435C, 0x0B0F, 0x134F, +0x460C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x535A, 0x907A, 0x0010, +0x2BA1, 0x430C, 0x1656, 0x0110, 0x147B, 0x4304, 0x430A, 0x430B, 0x4306, +0x4307, 0x0088, 0x2BD2, 0x407C, 0x0028, 0x083F, 0x0008, 0x134F, 0x4C49, +0x490C, 0x430D, 0x13B1, 0xC84E, 0x930C, 0x2002, 0x433C, 0x3C4B, 0x490C, +0x430D, 0x13B1, 0xCC04, 0x930C, 0x242F, 0x407C, 0x00E8, 0x083F, 0x0008, +0x134F, 0x430C, 0x083F, 0x0014, 0x134F, 0x4C04, 0x9039, 0x0095, 0x2004, +0x403C, 0x05DC, 0x1380, 0x2B86, 0x407C, 0x00E1, 0x083F, 0x0008, 0x134F, +0x430C, 0x430D, 0x083F, 0x0018, 0x134F, 0x4C0A, 0x5A0A, 0x6B0B, 0x5A0A, +0x6B0B, 0x5A0A, 0x6B0B, 0x5A0A, 0x6B0B, 0x5D0A, 0x630B, 0x4A0F, 0xDB0F, +0x930F, 0x2407, 0x4A06, 0x4B07, 0x5226, 0x6307, 0x3C02, 0x4036, 0x0FF0, +0x0088, 0x2C26, 0x4A0C, 0x4B0D, 0x080F, 0x0F3F, 0x0014, 0x134F, 0x460C, +0x470D, 0x080F, 0x0F3F, 0x0014, 0x134F, 0x440C, 0x080F, 0x0F3F, 0x0010, +0x134F, 0x430C, 0x1674, 0x0110, 0x147B, 0x4C06, 0x0DC5, 0x4E07, 0x3C53, +0x4534, 0x008A, 0x2BD2, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0082, 0x0B0F, +0x134F, 0x0AC8, 0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x0AC9, +0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, +0x403C, 0x2409, 0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x407C, 0x0048, 0x0B0F, 0x134F, 0x427C, 0x0A3F, 0x0010, 0x134F, +0x407C, 0x00C1, 0x0B0F, 0x134F, 0x460C, 0x430D, 0x0A3F, 0x0018, 0x134F, +0x407C, 0x00A1, 0x0B0F, 0x134F, 0x440C, 0x080F, 0x134F, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, +0x2401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, 0x134F, 0x435C, 0x090F, +0x134F, 0x5326, 0x470F, 0x5337, 0x930F, 0x23A9, 0x1674, 0x0110, 0x147B, +0x4C0A, 0x0DC5, 0x4E0B, 0x3C51, 0x4534, 0x0088, 0x2BD2, 0x08C9, 0x00A9, +0x0008, 0x407C, 0x0082, 0x090F, 0x134F, 0x08C6, 0x00A6, 0x0014, 0x403C, +0x3FFF, 0x060F, 0x134F, 0x08C7, 0x00A7, 0x0030, 0x434C, 0x070F, 0x134F, +0x407C, 0x00C8, 0x090F, 0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, +0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x0048, 0x090F, 0x134F, +0x427C, 0x083F, 0x0010, 0x134F, 0x407C, 0x00C1, 0x090F, 0x134F, 0x4A0C, +0x060F, 0x134F, 0x407C, 0x00A1, 0x090F, 0x134F, 0x440C, 0x060F, 0x134F, +0x435C, 0x070F, 0x134F, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, +0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, 0x090F, 0x134F, +0x435C, 0x070F, 0x134F, 0x532A, 0x4B0F, 0x533B, 0x930F, 0x23AB, 0x1674, +0x0110, 0x143B, 0x8221, 0x403B, 0x00C8, 0x4381, 0x0000, 0x4381, 0x0002, +0x0088, 0x2C26, 0x410C, 0x530C, 0x080F, 0x0F3F, 0x0030, 0x134F, 0x008A, +0x2BD2, 0x0AC9, 0x00A9, 0x0030, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C1, +0x0A3F, 0x0008, 0x134F, 0x403C, 0x0EC4, 0x430D, 0x0A3F, 0x0018, 0x134F, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x0A3F, +0x0008, 0x134F, 0x430C, 0x0A3F, 0x0014, 0x134F, 0x4C0A, 0x435C, 0x090F, +0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0xB22A, 0x2C0E, +0xF22A, 0x4A0C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x3C13, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x4B0F, 0x533B, 0x930F, 0x23F6, +0x435C, 0x090F, 0x134F, 0x430C, 0x080F, 0x0F3F, 0x0010, 0x134F, 0x430C, +0x5221, 0x1638, 0x0110, 0x147B, 0x4C07, 0x0DC6, 0x4E04, 0x3C51, 0x008A, +0x2BD2, 0x0ACB, 0x00AB, 0x0008, 0x407C, 0x0082, 0x0B0F, 0x134F, 0x0AC8, +0x00A8, 0x0014, 0x403C, 0x3FFF, 0x080F, 0x134F, 0x0AC9, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x0B0F, 0x134F, 0x403C, 0x2409, +0x080F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, +0x00C1, 0x0B0F, 0x134F, 0x470C, 0x430D, 0x0A3F, 0x0018, 0x134F, 0x407C, +0x00A1, 0x0B0F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, +0x430C, 0x080F, 0x134F, 0x4C0A, 0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, +0x0B0F, 0x134F, 0x403C, 0x2401, 0x080F, 0x134F, 0x407C, 0x0021, 0x0B0F, +0x134F, 0x435C, 0x090F, 0x134F, 0x4A86, 0x0000, 0x5327, 0x03E6, 0x440F, +0x5334, 0x930F, 0x23AB, 0x1674, 0x0110, 0x143B, 0x008B, 0x2C26, 0x008C, +0x2832, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x204D, 0x008A, 0x2834, +0x0ACC, 0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x930C, 0x2044, 0x008C, 0x2836, +0x0B0F, 0x0F3F, 0x002C, 0x134F, 0x933C, 0x243C, 0x008B, 0x2B62, 0x435C, +0x0B3F, 0x002C, 0x134F, 0x0088, 0x2BD2, 0x080F, 0x134F, 0x1840, 0x90B2, +0x0011, 0x2832, 0x2007, 0x1840, 0x421D, 0x2836, 0x4A2C, 0x13B1, 0xBE82, +0x3C03, 0x4A2C, 0x13B1, 0xC120, 0x934C, 0x2021, 0x435C, 0x0B3F, 0x0030, +0x134F, 0x403C, 0x0028, 0x0B3F, 0x0024, 0x134F, 0x434C, 0x0B3F, 0x002C, +0x134F, 0x403C, 0x00C8, 0x0B3F, 0x0024, 0x134F, 0x080F, 0x134F, 0x407C, +0x0028, 0x083F, 0x0008, 0x134F, 0x4C4C, 0x430D, 0x13B1, 0xCB62, 0x930C, +0x2402, 0x430C, 0x3C01, 0x433C, 0x1638, 0x0110, 0x145B, 0x4C08, 0x4E0A, +0x0089, 0x2BD2, 0x09C6, 0x00A6, 0x0008, 0x407C, 0x00C8, 0x060F, 0x134F, +0x09C7, 0x00A7, 0x0014, 0x403C, 0x3401, 0x070F, 0x134F, 0x407C, 0x0082, +0x060F, 0x134F, 0xD038, 0x4030, 0x480C, 0x070F, 0x134F, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x090F, +0x134F, 0x407C, 0x0082, 0x060F, 0x134F, 0x4A0C, 0x070F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x090F, 0x134F, +0x407C, 0x0082, 0x060F, 0x134F, 0x403C, 0x3FFD, 0x070F, 0x134F, 0x434C, +0x090F, 0x134F, 0x407C, 0x0042, 0x060F, 0x134F, 0x435C, 0x090F, 0x134F, +0x434C, 0x090F, 0x134F, 0x407C, 0x00C8, 0x060F, 0x134F, 0x403C, 0x2401, +0x070F, 0x134F, 0x435C, 0x090F, 0x134F, 0x1656, 0x0110, 0x147B, 0x4C0A, +0x0DCB, 0x4E08, 0x3C4E, 0x0087, 0x2BD2, 0x07C9, 0x00A9, 0x0008, 0x407C, +0x0082, 0x090F, 0x134F, 0x07C6, 0x00A6, 0x0014, 0x403C, 0x3FFF, 0x060F, +0x134F, 0x00A7, 0x0030, 0x434C, 0x070F, 0x134F, 0x407C, 0x00C8, 0x090F, +0x134F, 0x403C, 0x2409, 0x060F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, +0x070F, 0x134F, 0x407C, 0x00C1, 0x090F, 0x134F, 0x4A0C, 0x060F, 0x134F, +0x407C, 0x00A1, 0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x434C, 0x070F, +0x134F, 0x430C, 0x060F, 0x134F, 0x4C04, 0x434C, 0x070F, 0x134F, 0x407C, +0x00C8, 0x090F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x407C, 0x0021, +0x090F, 0x134F, 0x435C, 0x070F, 0x134F, 0x448B, 0x0000, 0x532A, 0x03EB, +0x480F, 0x5338, 0x930F, 0x23AE, 0x1674, 0x0110, 0x145B, 0x8231, 0x0086, +0x2C26, 0x410C, 0x530C, 0x060F, 0x0F3F, 0x0030, 0x134F, 0x410C, 0x522C, +0x060F, 0x0F3F, 0x0030, 0x134F, 0x0088, 0x2BD2, 0x08C9, 0x00A9, 0x0030, +0x434C, 0x090F, 0x134F, 0x430A, 0x430B, 0x3C29, 0x407C, 0x00C1, 0x083F, +0x0008, 0x134F, 0x412C, 0x411D, 0x0002, 0x083F, 0x0018, 0x134F, 0x435C, +0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x407C, 0x0042, 0x083F, 0x0008, +0x134F, 0x430C, 0x083F, 0x0014, 0x134F, 0x060F, 0x0F3F, 0x0010, 0x134F, +0x412E, 0x411F, 0x0002, 0x532E, 0x630F, 0x4E81, 0x0000, 0x4F81, 0x0002, +0x531A, 0x630B, 0x911B, 0x0006, 0x2BD4, 0x2003, 0x911A, 0x0004, 0x2BD0, +0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, 0x090F, 0x134F, +0x430C, 0x5231, 0x1656, 0x0110, 0x141B, 0x8031, 0x0006, 0x43C1, 0x0001, +0x43C1, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x008A, 0x2C26, 0x410C, +0x531C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x407C, 0x00B0, 0x1380, 0x2BDA, +0x3C20, 0x410C, 0x532C, 0x0A0F, 0x0F3F, 0x0030, 0x134F, 0x416C, 0x430D, +0x0B0F, 0x134F, 0x411C, 0x0002, 0x411D, 0x0004, 0x0B0F, 0x134F, 0x90F1, +0x009E, 0x0000, 0x2007, 0xB0B1, 0x0040, 0x0002, 0x2803, 0x1840, 0x4382, +0x2838, 0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, 0x93C1, 0x0001, 0x2418, +0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, 0x008B, 0x2BEE, 0xB3D1, +0x0000, 0x2BD2, 0x416C, 0x430D, 0x0B0F, 0x134F, 0x430C, 0x430D, 0x0B0F, +0x134F, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x3FE0, 0x430C, 0x5031, 0x0006, +0x161A, 0x0110, 0x140A, 0x8031, 0x000C, 0x40B1, 0x0011, 0x0006, 0x4381, +0x0004, 0x4381, 0x0002, 0x4381, 0x0000, 0x4381, 0x0008, 0x4381, 0x000A, +0x4C81, 0x0004, 0x4D81, 0x0002, 0x407C, 0x0086, 0x1380, 0x2BDA, 0x008A, +0x2BE6, 0x430C, 0x0A0F, 0x134F, 0x4C81, 0x0000, 0x411E, 0x0008, 0x411F, +0x000A, 0x4E0C, 0x4F0D, 0x531C, 0x630D, 0x4C81, 0x0008, 0x4D81, 0x000A, +0x930F, 0x2003, 0x903E, 0x0BB8, 0x2802, 0x431C, 0x3C21, 0xB3A1, 0x0000, +0x2C07, 0x9381, 0x000A, 0x2004, 0x90B1, 0x0BB8, 0x0008, 0x2BDC, 0x9381, +0x000A, 0x2013, 0x90B1, 0x0BB8, 0x0008, 0x2C0F, 0x40B1, 0x0011, 0x0006, +0x411C, 0x0006, 0x0A0F, 0x134F, 0x411C, 0x0004, 0x0A0F, 0x134F, 0x411C, +0x0002, 0x0A0F, 0x134F, 0x430C, 0x5031, 0x000C, 0x160A, 0x0110, 0x141B, +0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x410C, 0x530C, 0x002F, 0x2C26, +0x0F3F, 0x0030, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFCD, 0x3C41, 0x90B1, +0xA55A, 0x0000, 0x2004, 0x90B1, 0xA55A, 0x0002, 0x2408, 0x90B1, 0x5AA5, +0x0000, 0x2034, 0x90B1, 0x5AA5, 0x0002, 0x2030, 0x008B, 0x2B62, 0x434C, +0x0B3F, 0x0030, 0x134F, 0x435C, 0x0B3F, 0x0018, 0x134F, 0x1380, 0x2BD2, +0x434C, 0x0B3F, 0x0030, 0x134F, 0x412D, 0x411C, 0x0002, 0x13B1, 0xBE82, +0x4C4A, 0x435C, 0x0B3F, 0x0030, 0x134F, 0x403C, 0x0BB8, 0x0B3F, 0x0024, +0x134F, 0x935A, 0x2003, 0x403C, 0xFFCE, 0x3C0D, 0x407C, 0x0028, 0x1380, +0x2BDA, 0x4C4C, 0x430D, 0x13B1, 0xCB98, 0x930C, 0x2402, 0x430C, 0x3C01, +0x433C, 0x5221, 0x161A, 0x0110, 0x143B, 0x8231, 0x4381, 0x0004, 0x4381, +0x0006, 0x434A, 0x008B, 0x2C26, 0x410C, 0x522C, 0x0B0F, 0x0F3F, 0x002C, +0x134F, 0x410D, 0x530D, 0x403C, 0xAA01, 0x0B0F, 0x0F3F, 0x0058, 0x134F, +0x930C, 0x2401, 0x010A, 0x03DA, 0x2412, 0x938A, 0x0000, 0x240D, 0x0088, +0x2BD2, 0x407C, 0x0028, 0x083F, 0x0008, 0x134F, 0x4C4C, 0x430D, 0x13B1, +0xC6F6, 0x930C, 0x2004, 0x432C, 0x3C20, 0x433C, 0x3C1E, 0x407C, 0x00D0, +0x083F, 0x0008, 0x134F, 0x430C, 0x083F, 0x0014, 0x134F, 0x4C08, 0xB118, +0x0004, 0x2410, 0x03DA, 0x2402, 0x438A, 0x0000, 0x431C, 0x0B0F, 0x0F3F, +0x0010, 0x134F, 0x480C, 0x0B0F, 0x0F3F, 0x0010, 0x134F, 0x431C, 0x3C01, +0x432C, 0x5231, 0x1638, 0x0110, 0x141B, 0x8321, 0x433B, 0x4381, 0x0000, +0x008A, 0x2C26, 0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x9381, +0x0000, 0x243D, 0x008B, 0x2BD2, 0x407C, 0x0028, 0x0B3F, 0x0008, 0x134F, +0x4C4C, 0x903C, 0x0089, 0x240E, 0x434C, 0x1380, 0x2B7A, 0x0B0F, 0x134F, +0x0B3F, 0x0004, 0x134F, 0x407C, 0x0028, 0x0B3F, 0x0008, 0x134F, 0x4C4C, +0x0A0F, 0x0F3F, 0x0010, 0x903C, 0x0089, 0x422C, 0x200E, 0x134F, 0x430C, +0x430D, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, +0x0014, 0x134F, 0x3C0E, 0x134F, 0x430C, 0x430D, 0x0A0F, 0x0F3F, 0x0014, +0x134F, 0x430C, 0x403D, 0xC000, 0x0A0F, 0x0F3F, 0x0014, 0x134F, 0x430B, +0x4B0C, 0x5321, 0x161A, 0x0110, 0x140A, 0x8031, 0x000A, 0x4391, 0x0008, +0x4C81, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x008A, +0x2BD2, 0x407C, 0x0086, 0x0A3F, 0x0008, 0x134F, 0x430C, 0x0A3F, 0x0014, +0x134F, 0x4C81, 0x0000, 0x411E, 0x0002, 0x411F, 0x0004, 0x4E0C, 0x4F0D, +0x531C, 0x630D, 0x4C81, 0x0002, 0x4D81, 0x0004, 0x930F, 0x2003, 0x903E, +0x0BB8, 0x2802, 0x431C, 0x3C1C, 0xB391, 0x0000, 0x2C07, 0x9381, 0x0004, +0x2004, 0x90B1, 0x0BB8, 0x0002, 0x2BDD, 0x9381, 0x0004, 0x200E, 0x90B1, +0x0BB8, 0x0002, 0x2C0A, 0x411C, 0x0008, 0x0A3F, 0x0014, 0x134F, 0x411C, +0x0006, 0x0A3F, 0x0014, 0x134F, 0x430C, 0x5031, 0x000A, 0x160A, 0x0110, +0x145B, 0x4308, 0x430A, 0x430B, 0x0089, 0x2BD2, 0x434C, 0x093F, 0x0030, +0x134F, 0x407C, 0x0028, 0x093F, 0x0008, 0x134F, 0x430C, 0x093F, 0x0014, +0x134F, 0x4C06, 0x9318, 0x380C, 0xB32C, 0x2C0A, 0x407C, 0x00C8, 0x093F, +0x0008, 0x134F, 0x403C, 0x3400, 0x093F, 0x0014, 0x134F, 0x9308, 0x200D, +0xB326, 0x280B, 0x407C, 0x00C8, 0x093F, 0x0008, 0x134F, 0x403C, 0x3402, +0x093F, 0x0014, 0x134F, 0x4318, 0x435C, 0x093F, 0x0030, 0x134F, 0x531A, +0x630B, 0x9038, 0x000A, 0x3408, 0xB326, 0x2806, 0x930B, 0x3BC6, 0x2003, +0x903A, 0x1388, 0x2BC2, 0x9038, 0x000A, 0x3803, 0x433C, 0x433D, 0x3C02, +0x430C, 0x430D, 0x1656, 0x0110, 0x145B, 0x4308, 0x430A, 0x430B, 0x0089, +0x2BD2, 0x434C, 0x093F, 0x0030, 0x134F, 0x407C, 0x0028, 0x093F, 0x0008, +0x134F, 0x430C, 0x093F, 0x0014, 0x134F, 0x4C06, 0x9318, 0x380C, 0xB32C, +0x2C0A, 0x407C, 0x00C8, 0x093F, 0x0008, 0x134F, 0x403C, 0x3400, 0x093F, +0x0014, 0x134F, 0x9308, 0x200D, 0xB326, 0x280B, 0x407C, 0x00C8, 0x093F, +0x0008, 0x134F, 0x403C, 0x3402, 0x093F, 0x0014, 0x134F, 0x4318, 0x435C, +0x093F, 0x0030, 0x134F, 0x531A, 0x630B, 0x9038, 0x000A, 0x3408, 0xB326, +0x2806, 0x930B, 0x3BC6, 0x2003, 0x903A, 0x1388, 0x2BC2, 0x9038, 0x000A, +0x3803, 0x433C, 0x433D, 0x3C02, 0x430C, 0x430D, 0x1656, 0x0110, 0x145B, +0x4C0A, 0x4D0B, 0x0088, 0x2BD2, 0x08C9, 0x00A9, 0x0008, 0x407C, 0x0088, +0x090F, 0x134F, 0x407C, 0x0034, 0x083F, 0x0010, 0x134F, 0x407C, 0x0082, +0x090F, 0x134F, 0x4A0C, 0x4B0D, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF03C, +0x0F00, 0xD03C, 0x0080, 0x083F, 0x0014, 0x134F, 0x08C6, 0x00A6, 0x0030, +0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x4A0C, 0x083F, 0x0014, +0x134F, 0x434C, 0x060F, 0x134F, 0x435C, 0x060F, 0x134F, 0x407C, 0x0021, +0x090F, 0x134F, 0x434C, 0x060F, 0x134F, 0x407C, 0x0088, 0x090F, 0x134F, +0x407C, 0x0024, 0x083F, 0x0010, 0x134F, 0x435C, 0x060F, 0x134F, 0x1656, +0x0110, 0x141B, 0x8221, 0x008A, 0x2C26, 0x410C, 0x531C, 0x0A0F, 0x0F3F, +0x0028, 0x134F, 0x407C, 0x0090, 0x1380, 0x2BDA, 0x3C1D, 0x410C, 0x532C, +0x0A0F, 0x0F3F, 0x002C, 0x134F, 0x416C, 0x0B0F, 0x134F, 0x411C, 0x0002, +0x0B0F, 0x134F, 0x90F1, 0x009E, 0x0000, 0x2007, 0xB0B1, 0x0040, 0x0002, +0x2803, 0x1840, 0x4382, 0x2838, 0x415E, 0x0001, 0x537E, 0x4EC1, 0x0001, +0x93C1, 0x0001, 0x2416, 0x410C, 0x530C, 0x0A0F, 0x0F3F, 0x0028, 0x134F, +0x008B, 0x2BE6, 0xB3D1, 0x0000, 0x2BD5, 0x416C, 0x0B0F, 0x134F, 0x430C, +0x0B0F, 0x134F, 0x0A0F, 0x0F3F, 0x0010, 0x134F, 0x3FE2, 0x430C, 0x5221, +0x161A, 0x0110, 0x145B, 0x4C0A, 0x0088, 0x2BD2, 0x08C9, 0x00A9, 0x0008, +0x407C, 0x00C8, 0x090F, 0x134F, 0x08C6, 0x00A6, 0x0014, 0x403C, 0x3401, +0x060F, 0x134F, 0x407C, 0x0082, 0x090F, 0x134F, 0x403C, 0x4030, 0x060F, +0x134F, 0x00A8, 0x0030, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x4A0C, 0x060F, 0x134F, 0x434C, 0x080F, 0x134F, 0x435C, 0x080F, 0x134F, +0x407C, 0x0021, 0x090F, 0x134F, 0x434C, 0x080F, 0x134F, 0x407C, 0x00C8, +0x090F, 0x134F, 0x403C, 0x2401, 0x060F, 0x134F, 0x435C, 0x080F, 0x134F, +0x1656, 0x0110, 0x140A, 0x8321, 0x4381, 0x0000, 0x008A, 0x2B62, 0x431C, +0x0A3F, 0x0044, 0x134F, 0x403C, 0x01F4, 0x0A3F, 0x0024, 0x134F, 0x434C, +0x0A3F, 0x0018, 0x134F, 0x008A, 0x2BD2, 0x0A0F, 0x134F, 0x0A3F, 0x0004, +0x134F, 0x407C, 0x0028, 0x0A3F, 0x0008, 0x134F, 0x4C4C, 0x4C81, 0x0000, +0x90B1, 0x0089, 0x0000, 0x2014, 0x008A, 0x2C26, 0x435C, 0x0A0F, 0x0F3F, +0x0008, 0x134F, 0x407C, 0x0089, 0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x436C, +0x0A0F, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x3C01, 0x433C, 0x5321, 0x160A, +0x0110, 0x403E, 0x0018, 0x430F, 0x430D, 0x008C, 0x2C2A, 0x13B1, 0xCE92, +0x403E, 0x0020, 0x430F, 0x430D, 0x008C, 0x2CD8, 0x13B1, 0xCE92, 0x403E, +0x0010, 0x430F, 0x430D, 0x008C, 0x2B42, 0x13B1, 0xCE92, 0x1840, 0x40B2, +0xE000, 0x2B52, 0x1840, 0x40B2, 0xE000, 0x2B54, 0x1840, 0x4382, 0x2874, +0x1840, 0x43C2, 0x2CF8, 0x1840, 0x4382, 0x2876, 0x1840, 0x40B2, 0x0417, +0x2898, 0x1840, 0x4382, 0x289A, 0x403E, 0x0018, 0x430F, 0x430D, 0x008C, +0x2878, 0x0180, 0xCE92, 0x141B, 0x430A, 0x430B, 0x3C10, 0x403C, 0xAAAA, +0x1380, 0x2BE6, 0x4C0B, 0x903C, 0x5555, 0x2007, 0x403C, 0x5555, 0x002F, +0x2C26, 0x0F3F, 0x0010, 0x134F, 0x531A, 0x903A, 0x0003, 0x2C16, 0x407C, +0x0028, 0x1380, 0x2BDA, 0x4C4C, 0x903C, 0x0099, 0x27E5, 0x903C, 0x0098, +0x27E2, 0x903C, 0x0095, 0x27DF, 0x903C, 0x0091, 0x27DC, 0x903C, 0x0089, +0x27D9, 0x433C, 0x3C07, 0x4B0C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, +0x430C, 0x161A, 0x0110, 0x141B, 0x008A, 0x2B62, 0x008B, 0x2878, 0x938B, +0x0010, 0x240D, 0x407C, 0x00F4, 0x1380, 0x2BDA, 0x4B1C, 0x0012, 0x1380, +0x2BE6, 0x403C, 0x0014, 0x0A3F, 0x0024, 0x134F, 0x4B2F, 0xDB1F, 0x0002, +0x930F, 0x240F, 0x407C, 0x0054, 0x1380, 0x2BDA, 0x4B1C, 0x0004, 0x4B1D, +0x0006, 0x1380, 0x2BEE, 0x403C, 0x0014, 0x0A3F, 0x0024, 0x134F, 0x0A3F, +0x001C, 0x134F, 0x430C, 0x161A, 0x0110, 0x140A, 0x8321, 0x410C, 0x530C, +0x002F, 0x2C26, 0x0F3F, 0x0028, 0x134F, 0x930C, 0x3403, 0x403C, 0xFFEB, +0x3C1C, 0x416C, 0x1380, 0x2B72, 0x930C, 0x2403, 0x403C, 0xFFEA, 0x3C14, +0x008A, 0x2BD2, 0x0ACC, 0x13B0, 0x1880, 0x434C, 0x1380, 0x2B7A, 0x0A0F, +0x134F, 0x0A3F, 0x0004, 0x134F, 0x435C, 0x002F, 0x2C26, 0x0F3F, 0x0008, +0x134F, 0x430C, 0x5321, 0x160A, 0x0110, 0x143B, 0x4C0A, 0x0088, 0x2BD2, +0x407C, 0x0082, 0x083F, 0x0008, 0x134F, 0x403C, 0x4030, 0x083F, 0x0014, +0x134F, 0x08C9, 0x00A9, 0x0030, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, +0x134F, 0x4A0C, 0x083F, 0x0014, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, +0x090F, 0x134F, 0x435C, 0x090F, 0x134F, 0x434C, 0x090F, 0x134F, 0x435C, +0x090F, 0x134F, 0x1638, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, 0x2424, +0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, 0x930D, +0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, 0x2002, +0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, 0x0477, +0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, +0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, 0x2424, 0x903C, 0x008D, +0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, 0x930D, 0x241A, 0x903C, +0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, 0x2002, 0x930D, 0x2410, +0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, 0x0477, 0x703D, 0x4BA0, +0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x435C, 0x0110, +0x903C, 0x0089, 0x2002, 0x930D, 0x2424, 0x903C, 0x008D, 0x2002, 0x930D, +0x241F, 0x903C, 0x0091, 0x2002, 0x930D, 0x241A, 0x903C, 0x0095, 0x2002, +0x930D, 0x2415, 0x903C, 0x0098, 0x2002, 0x930D, 0x2410, 0x903C, 0x0099, +0x2002, 0x930D, 0x240B, 0x803C, 0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, +0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x435C, 0x0110, 0x903C, 0x0089, +0x2002, 0x930D, 0x2424, 0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, +0x0091, 0x2002, 0x930D, 0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, +0x903C, 0x0098, 0x2002, 0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, +0x240B, 0x803C, 0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, +0x0110, 0x435C, 0x0110, 0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, +0x2424, 0x903C, 0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, +0x930D, 0x241A, 0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, +0x2002, 0x930D, 0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, +0x0477, 0x703D, 0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x903C, 0x0089, 0x2002, 0x930D, 0x2424, 0x903C, +0x008D, 0x2002, 0x930D, 0x241F, 0x903C, 0x0091, 0x2002, 0x930D, 0x241A, +0x903C, 0x0095, 0x2002, 0x930D, 0x2415, 0x903C, 0x0098, 0x2002, 0x930D, +0x2410, 0x903C, 0x0099, 0x2002, 0x930D, 0x240B, 0x803C, 0x0477, 0x703D, +0x4BA0, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, 0x0110, 0x435C, +0x0110, 0x1800, 0x1246, 0x1800, 0x1247, 0x4D06, 0xD07D, 0x0080, 0x6606, +0x6707, 0x1086, 0xF376, 0x8076, 0x007F, 0x2C03, 0x430C, 0x430D, 0x3C13, +0x8076, 0x0018, 0x2C07, 0xE376, 0x240E, 0x110D, 0x100C, 0x8356, 0x23FC, +0x3C09, 0x9236, 0x3803, 0x433C, 0x433D, 0x3C04, 0x5C0C, 0x6D0D, 0x8356, +0x2FFC, 0x1007, 0x1800, 0x4177, 0x1800, 0x4176, 0x0110, 0x140A, 0x008A, +0x2B62, 0x434C, 0x0A3F, 0x0030, 0x134F, 0x403C, 0x0028, 0x0A3F, 0x0024, +0x134F, 0x434C, 0x0A3F, 0x0034, 0x134F, 0x403C, 0x0028, 0x0A3F, 0x0024, +0x134F, 0x434C, 0x0A3F, 0x002C, 0x134F, 0x1380, 0x2BD2, 0x407C, 0x0028, +0x1380, 0x2BDA, 0x4C4C, 0x430D, 0x13B1, 0xCB98, 0x930C, 0x2002, 0x433C, +0x3C01, 0x430C, 0x160A, 0x0110, 0x140A, 0x008A, 0x2B62, 0x435C, 0x0A3F, +0x002C, 0x134F, 0x1380, 0x2BD2, 0x403C, 0xA55A, 0x13B1, 0xC120, 0x931C, +0x2415, 0x403C, 0x0028, 0x0A3F, 0x0024, 0x134F, 0x435C, 0x0A3F, 0x0030, +0x134F, 0x407C, 0x0028, 0x1380, 0x2BDA, 0x4C4C, 0x430D, 0x13B1, 0xCB98, +0x930C, 0x2402, 0x430C, 0x3C01, 0x433C, 0x160A, 0x0110, 0x8231, 0x4381, +0x0004, 0x4381, 0x0006, 0x4381, 0x0000, 0x4381, 0x0002, 0x410D, 0x530D, +0x410C, 0x522C, 0x1380, 0x2B6E, 0x411C, 0x0004, 0x411D, 0x0006, 0x13B1, +0xCFA8, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x412C, 0x411D, 0x0002, +0x13B1, 0xCFA8, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x5231, +0x0110, 0x1800, 0x1249, 0x1800, 0x124A, 0x1800, 0x124B, 0x430A, 0x430B, +0x4039, 0x0020, 0x5C0C, 0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, +0xD31C, 0x5339, 0x23F6, 0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, +0x4B0F, 0x1800, 0x417B, 0x1800, 0x417A, 0x1800, 0x4179, 0x0110, 0x434E, +0x3C07, 0x1840, 0x43BD, 0x289C, 0x1800, 0x43CD, 0x289E, 0x535E, 0x907E, +0x0070, 0x2C11, 0x4E4D, 0x0DED, 0x0DCF, 0x0DED, 0x0FED, 0x907E, 0x006E, +0x2FEE, 0x1840, 0x4D9D, 0x2472, 0x289C, 0x1800, 0x4DDD, 0x2474, 0x289E, +0x3FEB, 0x0110, 0x140A, 0x430A, 0x3C01, 0x531A, 0x922A, 0x3413, 0x407C, +0x0028, 0x1380, 0x2BDA, 0x4C4F, 0x4F0C, 0x430D, 0x13B1, 0xC8A4, 0x930C, +0x27F2, 0x4F0C, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x3C01, +0x433C, 0x160A, 0x0110, 0x1880, 0x40F2, 0x9C5E, 0x280C, 0x1880, 0x40F2, +0xB4D6, 0x2810, 0x1880, 0x40F2, 0xC2EA, 0x2814, 0x1880, 0x40F2, 0xB820, +0x2818, 0x1880, 0x40F2, 0xBA4C, 0x281C, 0x002F, 0x298E, 0x0F60, 0x2820, +0x430C, 0x0180, 0xA410, 0x1880, 0x40F2, 0xA674, 0x280C, 0x1880, 0x40F2, +0xBBBA, 0x2810, 0x1880, 0x40F2, 0xC69E, 0x2814, 0x1880, 0x40F2, 0xB8DC, +0x2818, 0x1880, 0x40F2, 0xBC70, 0x281C, 0x002F, 0x2910, 0x0F60, 0x2820, +0x431C, 0x0180, 0xA410, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1880, 0x40F2, 0xA674, 0x280C, 0x1880, 0x40F2, +0xBBBA, 0x2810, 0x1880, 0x40F2, 0xC69E, 0x2814, 0x1880, 0x40F2, 0xB8DC, +0x2818, 0x1880, 0x40F2, 0xBC70, 0x281C, 0x002F, 0x2910, 0x0F60, 0x2820, +0x431C, 0x0180, 0xA19C, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1880, 0x40F2, 0xA674, 0x280C, 0x1880, 0x40F2, +0xBBBA, 0x2810, 0x1880, 0x40F2, 0xC410, 0x2814, 0x1880, 0x40F2, 0xB8DC, +0x2818, 0x1880, 0x40F2, 0xBC70, 0x281C, 0x002F, 0x2910, 0x0F60, 0x2820, +0x430C, 0x0180, 0xA410, 0x1880, 0x40F2, 0xA674, 0x280C, 0x1880, 0x40F2, +0xBBBA, 0x2810, 0x1880, 0x40F2, 0xC410, 0x2814, 0x1880, 0x40F2, 0xB8DC, +0x2818, 0x1880, 0x40F2, 0xBC70, 0x281C, 0x002F, 0x2910, 0x0F60, 0x2820, +0x430C, 0x0180, 0xA19C, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x903C, 0x0091, 0x2002, 0x930D, 0x2414, 0x903C, +0x0095, 0x2002, 0x930D, 0x240F, 0x903C, 0x0098, 0x2002, 0x930D, 0x240A, +0x803C, 0x0099, 0x730D, 0xDD0C, 0x930C, 0x2402, 0x434C, 0x0110, 0x435C, +0x0110, 0x435C, 0x0110, 0x1880, 0x40F2, 0x9C5E, 0x280C, 0x1880, 0x40F2, +0xB4D6, 0x2810, 0x1880, 0x40F2, 0xC2EA, 0x2814, 0x1880, 0x40F2, 0xB820, +0x2818, 0x1880, 0x40F2, 0xBA4C, 0x281C, 0x002F, 0x298E, 0x0F60, 0x2820, +0x430C, 0x0180, 0xA19C, 0x1800, 0x1246, 0x4D06, 0x5606, 0x9036, 0xFF01, +0x2C05, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2802, 0xC322, 0x3C09, 0xB03D, +0x7FFF, 0x2003, 0xB03F, 0x7FFF, 0x3C03, 0x9D0F, 0x2001, 0x9C0E, 0x1800, +0x4176, 0x0110, 0x140A, 0x008A, 0x2BD2, 0x407C, 0x0086, 0x0A3F, 0x0008, +0x134F, 0x430C, 0x0A3F, 0x0014, 0x134F, 0xB22C, 0x2809, 0x422C, 0x0A3F, +0x0014, 0x134F, 0x430C, 0x0A3F, 0x0014, 0x134F, 0x3C01, 0x430C, 0x160A, +0x0110, 0x1840, 0x4392, 0x246E, 0x1840, 0x4382, 0x2830, 0x1840, 0x4382, +0x2826, 0x1840, 0x4382, 0x2828, 0x1840, 0x4382, 0x282A, 0x1840, 0x4382, +0x282C, 0x1840, 0x4382, 0x2838, 0x430C, 0x0110, 0x143B, 0x4E0A, 0x4F0B, +0x0CC8, 0x3C06, 0x4DE8, 0x0000, 0x00A8, 0x0001, 0x00AD, 0x0001, 0x4A09, +0x4B0F, 0x533A, 0x633B, 0xDF09, 0x9309, 0x23F3, 0x1638, 0x0110, 0x907B, +0x0010, 0x2807, 0x4D0C, 0x4E0D, 0x4F0E, 0x430F, 0x807B, 0x0010, 0x3FF6, +0x934B, 0x2406, 0x035F, 0x100E, 0x100D, 0x100C, 0x835B, 0x23FA, 0x0110, +0x1202, 0xC232, 0x4303, 0x4C82, 0x04D0, 0x4D82, 0x04D2, 0x4E82, 0x04E0, +0x4F82, 0x04E2, 0x421C, 0x04E4, 0x421D, 0x04E6, 0x4132, 0x0110, 0x4C0D, +0x4C0E, 0xF03E, 0x000F, 0x431C, 0x835E, 0x3002, 0x18CE, 0x5C0C, 0x907D, +0x0010, 0x2803, 0x4C0D, 0x430C, 0x0110, 0x430D, 0x0110, 0x4382, 0x03C0, +0x40B2, 0x02C0, 0x03C0, 0x40B2, 0x09CF, 0x03D2, 0xC392, 0x03C2, 0xD0B2, +0x0010, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0x0110, 0x143B, 0x0CC8, 0x3C04, +0x4DC8, 0x0000, 0x00A8, 0x0001, 0x4E09, 0x4F0B, 0x533E, 0x633F, 0xDB09, +0x9309, 0x23F5, 0x1638, 0x0110, 0x433C, 0x002F, 0x2C26, 0x0F3F, 0x0010, +0x134F, 0x403C, 0xAAAA, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x433C, +0x0110, 0x403C, 0x0099, 0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x431C, +0x002F, 0x2C26, 0x0F3F, 0x0010, 0x134F, 0x430C, 0x0110, 0x8321, 0x410C, +0x530C, 0x002F, 0x2C26, 0x0F3F, 0x002C, 0x134F, 0x412C, 0x1380, 0x2B66, +0x430C, 0x5321, 0x0110, 0x407C, 0x0094, 0x1380, 0x2BDA, 0x434C, 0x1380, +0x2BE2, 0x002F, 0x2C26, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x0110, 0x151F, +0x160F, 0x0CCE, 0x0FEE, 0x3C04, 0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, +0x23FA, 0x0110, 0x1800, 0x124C, 0x4EFC, 0x0000, 0x00AC, 0x0001, 0x00BD, +0x0001, 0x23F9, 0x1800, 0x417C, 0x0110, 0x1800, 0x124C, 0x438C, 0x0000, +0x532C, 0x831E, 0x23FB, 0x1800, 0x417C, 0x0110, 0x035D, 0x100C, 0x035D, +0x100C, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF37D, 0x0110, 0x435C, 0x002F, +0x2C26, 0x0F3F, 0x0008, 0x134F, 0x430C, 0x0110, 0xC0B2, 0x0010, 0x03C0, +0x4382, 0x03C0, 0x0020, 0x2BA2, 0x13B1, 0xCD48, 0x430C, 0x2401, 0x531C, +0x0110, 0x13B1, 0xC8FA, 0x2802, 0x430C, 0x430D, 0x0110, 0x430C, 0x430D, +0x430E, 0x430F, 0x0110, 0x430C, 0x430D, 0x430E, 0x430F, 0x0110, 0x430C, +0x430D, 0x430E, 0x430F, 0x0110, 0x403C, 0x0021, 0x0180, 0x4FD8, 0x403C, +0x0020, 0x0180, 0x4FD8, 0x430C, 0x0180, 0x4FD8, 0x403C, 0xFFBD, 0x0110, +0x430C, 0x430D, 0x0110, 0x430C, 0x430D, 0x0110, 0x403C, 0xFFBD, 0x0110, +0x403C, 0xFFBD, 0x0110, 0x430C, 0x0110, 0x433C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x433C, +0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x433C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, +0x0110, 0x430C, 0x0110, 0x433C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x434C, +0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x433C, 0x0110, +0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x430C, +0x0110, 0x430C, 0x0110, 0x434C, 0x0110, 0x433C, 0x0110, 0x433C, 0x0110, +0x430C, 0x0110, 0x434C, 0x0110, 0x433C, 0x0110, 0x0180, 0xCDDE, 0x0110, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, +0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0120, +0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, +0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, +0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, 0x5A80, 0x0000, 0x0000, +0x0000, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0000, +0x5A80, 0x0000, 0x0000, 0x0000, 0x5A83, 0x0000, 0x0000, 0x0120, 0x5A80, +0x0120, 0x5A80, 0x0000, 0x5A80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0900, 0x0301, 0x0705, 0x0281, 0x0000, 0x0000, 0xFF04, +0x0FFF, 0x0600, 0x0001, 0x0000, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, +0x0109, 0x0503, 0x8107, 0x0002, 0x0000, 0x0400, 0xFFFF, 0x000F, 0x0106, +0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, 0xFF00, 0xCACA, 0xCACA, +0x40B2, 0x5A80, 0x0120, 0xC232, 0xC0F2, 0x003F, 0x0057, 0xD0F2, 0x0007, +0x0057, 0x45C2, 0x0056, 0x46C2, 0x0057, 0x43C2, 0x0058, 0xEA0A, 0xE909, +0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x40B2, 0x5A80, 0x0120, +0xC232, 0xD072, 0x0040, 0x4032, 0x0040, 0x40F2, 0x0080, 0x0052, 0x43C2, +0x0050, 0x45C2, 0x0051, 0xD0F2, 0x0080, 0x0053, 0xC0F2, 0x005F, 0x0054, +0xEA0A, 0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x0001, +0x015C, 0x0000, 0xD042, 0x0001, 0x0001, 0xD03E, 0x0001, 0x0002, 0xCEEE, +0x0001, 0x0003, 0xC9F0, 0x0001, 0x0004, 0xC644, 0x0001, 0x0005, 0xB3F0, +0x0001, 0x0006, 0xC5E6, 0x0001, 0x0007, 0x91E2, 0x0001, 0x0008, 0xCF0A, +0x0001, 0x0009, 0xD000, 0x0001, 0x000A, 0xBFDC, 0x0001, 0x000B, 0xA9F4, +0x0001, 0x000C, 0xCABE, 0x0001, 0x000D, 0xD006, 0x0001, 0x000E, 0xD08A, +0x0001, 0x000F, 0xCF7E, 0x0001, 0x0010, 0xCED0, 0x0001, 0x0011, 0xB75A, +0x0001, 0x0012, 0x32F0, 0x0001, 0x0013, 0x3F28, 0x0001, 0x0014, 0x5D9A, +0x0001, 0x0015, 0xA8CE, 0x0001, 0x0016, 0x9DB6, 0x0001, 0x0017, 0x952C, +0x0001, 0x0018, 0x981E, 0x0001, 0x0019, 0x9AF6, 0x0001, 0x001A, 0xC37E, +0x0001, 0x001B, 0xD0A2, 0x0001, 0x001C, 0x8A36, 0x0001, 0x001D, 0xB690, +0x0001, 0x001E, 0xB030, 0x0001, 0x001F, 0x73AC, 0x0001, 0x0020, 0x0000, +0x0001, 0x0021, 0x141A, 0x0001, 0x0022, 0xCC70, 0x0001, 0x0023, 0xCBCE, +0x0001, 0x0024, 0xCC3A, 0x0001, 0x0025, 0xCB2C, 0x0001, 0x0026, 0x9022, +0x0001, 0x0027, 0xF77E, 0x0000, 0x0028, 0x452A, 0x0001, 0x0029, 0x6D26, +0x0001, 0x002A, 0xA542, 0x0001, 0x002B, 0xAC1E, 0x0001, 0x002C, 0x938C, +0x0001, 0x002D, 0x96AC, 0x0001, 0x002E, 0x998A, 0x0001, 0x002F, 0xBDD2, +0x0001, 0x0030, 0x7666, 0x0001, 0x0031, 0xAF30, 0x0001, 0x0032, 0x9F0E, +0x0001, 0x0033, 0x8622, 0x0001, 0x0034, 0xE10A, 0x0000, 0x0035, 0xCD12, +0x0001, 0x0036, 0xCAF6, 0x0001, 0x0037, 0x8E3E, 0x0001, 0x0038, 0xCFE8, +0x0001, 0x0039, 0xCFFA, 0x0001, 0x003A, 0x3918, 0x0001, 0x003B, 0x254C, +0x0001, 0x003C, 0x54DE, 0x0001, 0x003D, 0xBD22, 0x0001, 0x003E, 0x7FCC, +0x0001, 0x003F, 0xA7A2, 0x0001, 0x0040, 0xB216, 0x0001, 0x0041, 0x7D88, +0x0001, 0x0042, 0x7B32, 0x0001, 0x0043, 0xA2DA, 0x0001, 0x0044, 0x8C3E, +0x0001, 0x0045, 0x2C48, 0x0001, 0x0046, 0xB308, 0x0001, 0x0047, 0xAB0E, +0x0001, 0x0048, 0xB124, 0x0001, 0x0049, 0x594A, 0x0001, 0x004A, 0xCFD2, +0x0001, 0x004B, 0xB5B8, 0x0001, 0x004C, 0xC57A, 0x0001, 0x004D, 0xC9A2, +0x0001, 0x004E, 0x6978, 0x0001, 0x004F, 0xBB04, 0x0001, 0x0050, 0x78D4, +0x0001, 0x0051, 0x882E, 0x0001, 0x0052, 0xCDB0, 0x0001, 0x0053, 0xC48E, +0x0001, 0x0054, 0xC07E, 0x0001, 0x0055, 0xCFDA, 0x0001, 0x0056, 0xD02E, +0x0001, 0x0057, 0xBF30, 0x0001, 0x0058, 0xD00A, 0x0001, 0x0059, 0xC94E, +0x0001, 0x005A, 0x8414, 0x0001, 0x005B, 0xD022, 0x0001, 0x005C, 0xD05E, +0x0001, 0x005D, 0xD032, 0x0001, 0x005E, 0xD046, 0x0001, 0x005F, 0xD07E, +0x0001, 0x0060, 0xD082, 0x0001, 0x0061, 0xD086, 0x0001, 0x0062, 0xD052, +0x0001, 0x0063, 0xD016, 0x0001, 0x0064, 0xD04A, 0x0001, 0x0065, 0xFDFC, +0x0000, 0x0066, 0xD04E, 0x0001, 0x0067, 0xD036, 0x0001, 0x0068, 0xCEB2, +0x0001, 0x0069, 0xCFE2, 0x0001, 0x006A, 0xD07A, 0x0001, 0x006B, 0xD076, +0x0001, 0x006C, 0xD03A, 0x0001, 0x006D, 0xB994, 0x0001, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +}; + +const uint32_t eZ_FetHalImage_address[] = +{ +0x00001900, 0x0000E000, 0x00010000, +}; +const uint32_t eZ_FetHalImage_length_of_sections[] = +{ +0x00000040, 0x00000F00, 0x00007000, +}; +const uint32_t eZ_FetHalImage_sections = 0x00000003; +const uint32_t eZ_FetHalImage_termination = 0x00000000; +const uint32_t eZ_FetHalImage_start = 0x00001900; +const uint32_t eZ_FetHalImage_finish = 0x0001E000; +const uint32_t eZ_FetHalImage_length = 0x0001C700; + +#define EZ_FETHALIMAGE_TERMINATION 0x00000000 +#define EZ_FETHALIMAGE_START 0x00001900 +#define EZ_FETHALIMAGE_FINISH 0x0001E000 +#define EZ_FETHALIMAGE_LENGTH 0x0001C700 +#define EZ_FETHALIMAGE_SECTIONS 0x00000003 diff --git a/Bios/include/eZ_FetHil.h b/Bios/include/eZ_FetHil.h new file mode 100644 index 0000000..ba76da6 --- /dev/null +++ b/Bios/include/eZ_FetHil.h @@ -0,0 +1,1255 @@ +/* http://srecord.sourceforge.net/ */ +const uint16_t eZ_FetHilImage[] = +{ +0x008E, 0x2D7C, 0x008D, 0x002A, 0x0080, 0xDB20, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x008E, 0x2D0C, +0x008D, 0x0038, 0x0080, 0xDB20, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x000B, 0x000D, 0x8A00, 0x9277, 0xF00D, +0xF00D, 0x4180, 0xA2FE, 0x1840, 0x1204, 0x1840, 0x1205, 0x1840, 0x1206, +0x1840, 0x1207, 0x1840, 0x1208, 0x1840, 0x1209, 0x1840, 0x120A, 0x1840, +0x120B, 0x1840, 0x120C, 0x1840, 0x120D, 0x1840, 0x120E, 0x1840, 0x120F, +0x008C, 0x2D04, 0x403E, 0x0248, 0x403F, 0x0000, 0x13B0, 0xDB08, 0x008C, +0x2D02, 0x008D, 0xDBD6, 0x403E, 0x0001, 0x403F, 0x0000, 0x13B0, 0xDBA4, +0x1840, 0x413F, 0x1840, 0x413E, 0x1840, 0x413D, 0x1840, 0x413C, 0x1840, +0x413B, 0x1840, 0x413A, 0x1840, 0x4139, 0x1840, 0x4138, 0x1840, 0x4137, +0x1840, 0x4136, 0x1840, 0x4135, 0x1840, 0x4134, 0x1800, 0x4070, 0xDB52, +0x4011, 0xA270, 0x934C, 0x002F, 0x2DD8, 0x2405, 0x1840, 0xD2DF, 0x2DDD, +0x0000, 0x3C04, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, +0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, +0x03C0, 0x537E, 0x23F3, 0x0110, 0x934C, 0x002F, 0x2DD8, 0x2405, 0x1840, +0xD2DF, 0x2DDC, 0x0000, 0x3C04, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x3FE2, +0x4303, 0x1840, 0x4C82, 0x2D06, 0x0110, 0x930D, 0x2406, 0x1840, 0x4D82, +0x2DE4, 0x4D0C, 0x13B0, 0xBDFA, 0x0110, 0x1840, 0x9382, 0x2D08, 0x206D, +0x008F, 0x2DD0, 0x0F3E, 0x0008, 0xDFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, +0xCFDE, 0x000D, 0x0000, 0x407E, 0x0032, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x0F3E, 0x000E, 0xCFDE, 0x000D, 0x0000, 0x0F3E, 0x000E, 0xCFDE, 0x000C, +0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x008F, 0x2D7C, +0x1800, 0x40FF, 0xDB84, 0x0000, 0x1800, 0x40FF, 0xDB98, 0x0004, 0x1800, +0x40FF, 0xDB94, 0x0008, 0x1800, 0x40FF, 0xDB8C, 0x0010, 0x1800, 0x40FF, +0xDBA0, 0x0014, 0x1800, 0x40FF, 0xDB66, 0x0018, 0x1800, 0x40FF, 0xDB60, +0x001C, 0x1800, 0x40FF, 0xDB40, 0x0024, 0x1800, 0x40FF, 0xDB36, 0x0028, +0x1800, 0x40FF, 0xDBAC, 0x0030, 0x1800, 0x40FF, 0xDB80, 0x003C, 0x1800, +0x40FF, 0xDBAA, 0x0034, 0x1800, 0x40FF, 0xDB90, 0x0038, 0x1840, 0x4392, +0x2D08, 0x0110, 0x13B0, 0x8B04, 0x430C, 0x0110, 0x140A, 0x430A, 0x931C, +0x2020, 0x1840, 0x4392, 0x2DE2, 0x008C, 0x2DD0, 0x008E, 0xDBC4, 0x008D, +0x0009, 0x13B0, 0xDB20, 0x008C, 0x2DE6, 0x008E, 0x2DD0, 0x008D, 0x0009, +0x13B0, 0xDB20, 0x1840, 0x43C2, 0x2F49, 0x1840, 0x43C2, 0x2F4A, 0x1840, +0x43C2, 0x2F4B, 0x1840, 0x421C, 0x2DE4, 0x3C21, 0x903C, 0x0005, 0x2021, +0x1840, 0x4392, 0x2DE2, 0x008C, 0x2DD0, 0x008E, 0xDBB2, 0x008D, 0x0009, +0x13B0, 0xDB20, 0x008C, 0x2DE6, 0x008E, 0x2DD0, 0x008D, 0x0009, 0x13B0, +0xDB20, 0x1840, 0x43C2, 0x2F49, 0x1840, 0x43C2, 0x2F4A, 0x1840, 0x43C2, +0x2F4B, 0x403C, 0x400A, 0x13B0, 0xBDFA, 0x3C3C, 0x932C, 0x2039, 0x008F, +0x2D7C, 0x1800, 0x40FF, 0xDB84, 0x0000, 0x1800, 0x40FF, 0xDB98, 0x0004, +0x1800, 0x40FF, 0xDB94, 0x0008, 0x1800, 0x40FF, 0xDB8C, 0x0010, 0x1800, +0x40FF, 0xDBA0, 0x0014, 0x1800, 0x40FF, 0xDB66, 0x0018, 0x1800, 0x40FF, +0xDB60, 0x001C, 0x1800, 0x40FF, 0xDB40, 0x0024, 0x1800, 0x40FF, 0xDB36, +0x0028, 0x1800, 0x40FF, 0xDBAC, 0x0030, 0x1800, 0x40FF, 0xDB80, 0x003C, +0x1800, 0x40FF, 0xDBAA, 0x0034, 0x1800, 0x40FF, 0xDB90, 0x0038, 0x403C, +0xFFEA, 0x3C59, 0x433A, 0x40B2, 0x13C0, 0x0520, 0x002F, 0x2DD8, 0x0F60, +0x0526, 0x40B2, 0x13C0, 0x0530, 0x0F60, 0x0536, 0x008F, 0x2D7C, 0x1800, +0x40FF, 0xD7C4, 0x0000, 0x1800, 0x40FF, 0xD0E6, 0x0004, 0x1800, 0x40FF, +0xBCE0, 0x0008, 0x1800, 0x40FF, 0xBCA0, 0x0010, 0x1800, 0x40FF, 0xBB2A, +0x0014, 0x1800, 0x40FF, 0xB75C, 0x0018, 0x1800, 0x40FF, 0xB50A, 0x001C, +0x1800, 0x40FF, 0xAF34, 0x0024, 0x1800, 0x40FF, 0x9EFA, 0x0028, 0x1800, +0x40FF, 0xD6A0, 0x0030, 0x1800, 0x40FF, 0xDB6A, 0x003C, 0x1840, 0x9392, +0x2D04, 0x2003, 0x008F, 0xC910, 0x3C09, 0x1840, 0x93A2, 0x2D04, 0x2003, +0x008F, 0xCE4C, 0x3C02, 0x008F, 0xCBAE, 0x0F60, 0x2DB0, 0x1800, 0x40F2, +0xDB9C, 0x2DB4, 0x1800, 0x40F2, 0x2EF5, 0x0532, 0x1840, 0x4382, 0x2D08, +0x4A0C, 0x160A, 0x0110, 0x140A, 0x4C4A, 0x1840, 0x9382, 0x2D08, 0x2405, +0x1840, 0x421C, 0x2DE2, 0x13B0, 0x8BF0, 0x934A, 0x21A7, 0x1840, 0x9392, +0x2DE2, 0x008F, 0x2DD0, 0x0F3E, 0x0008, 0xDFDE, 0x000C, 0x0000, 0x0F3E, +0x0008, 0xCFDE, 0x000D, 0x0000, 0x0F3E, 0x000E, 0x4F5D, 0x000D, 0x20B0, +0x5F5D, 0x000C, 0xDDCE, 0x0000, 0x435E, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, +0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, +0x03C0, 0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, +0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, +0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0014, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, +0x100F, 0x537E, 0x934E, 0x23FB, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x435E, 0x3C02, 0x184D, +0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x0080, 0x9444, 0x5F5D, 0x000C, 0xDDCE, 0x0000, +0x435E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x1840, 0x93A2, 0x2DE2, 0x002F, +0x2DD8, 0x20C6, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, +0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, +0x03C0, 0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, +0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, +0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0014, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, +0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, +0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x435E, 0x3C02, +0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xD2DF, +0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, +0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, +0x003C, 0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, +0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x3DA5, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x3DA0, 0x1840, 0x9392, +0x2DE2, 0x008F, 0x2DD0, 0x0F3E, 0x0008, 0xDFDE, 0x000C, 0x0000, 0x0F3E, +0x0008, 0xCFDE, 0x000D, 0x0000, 0x0F3E, 0x000E, 0x4F5D, 0x000D, 0x20AF, +0x5F5D, 0x000C, 0xDDCE, 0x0000, 0x435E, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, +0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, +0x03C0, 0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, +0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, +0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0014, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, +0x100F, 0x537E, 0x934E, 0x23FB, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x435E, 0x3C02, 0x184D, +0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3CD9, +0xC0F2, 0x0080, 0x0203, 0x3CD5, 0x5F5D, 0x000C, 0xDDCE, 0x0000, 0x435E, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x1840, 0x93A2, 0x2DE2, 0x002F, 0x2DD8, +0x20D5, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, +0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0014, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, 0x100F, +0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, +0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, +0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x435E, 0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, +0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, +0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x3C13, 0x1840, 0xD2DF, +0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, +0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x1840, +0x4382, 0x2D08, 0x160A, 0x0110, 0x13B0, 0x8DAC, 0x430C, 0x0110, 0x1840, +0x421F, 0x2DE2, 0x831F, 0x2404, 0x831F, 0x24D8, 0x0080, 0x9982, 0x935C, +0x202A, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x3C2D, 0x934C, 0x2402, +0x0080, 0x99EC, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, +0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0014, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDC, +0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, +0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x435E, +0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, +0xD2DF, 0x2DDD, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x407E, 0x003C, 0x3C02, 0x184D, +0x100F, 0x537E, 0x934E, 0x23FB, 0x0080, 0x8AAC, 0x935C, 0x20C0, 0x002F, +0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x426E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, +0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0014, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, 0x100F, +0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, +0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, +0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x435E, 0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, +0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x3F34, 0x934C, 0x20FD, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, +0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x426E, 0xC392, +0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, +0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, +0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, +0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x407E, 0x0014, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, +0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x407E, 0x003C, 0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, +0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x435E, 0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, +0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, +0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, +0x03C0, 0x537E, 0x23F3, 0x407E, 0x003C, 0x3C02, 0x184D, 0x100F, 0x537E, +0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x3E72, 0x935C, 0x201C, 0x002F, +0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, +0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, +0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x3E54, +0x934C, 0x2015, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, +0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, +0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x0110, 0x1840, 0x4C82, 0x2D04, +0x1840, 0x9392, 0x2DE2, 0x2014, 0x1840, 0x931C, 0x2005, 0x1800, 0x40F2, +0xC910, 0x2DB0, 0x0110, 0x1840, 0x932C, 0x2005, 0x1800, 0x40F2, 0xCE4C, +0x2DB0, 0x0110, 0x1800, 0x40F2, 0xCBAE, 0x2DB0, 0x0110, 0x8221, 0x4381, +0x0000, 0x4381, 0x0002, 0xC3A2, 0x0700, 0x507C, 0x0010, 0x4CC2, 0x0710, +0xD3A2, 0x0700, 0xD392, 0x0700, 0xB392, 0x070A, 0x2BFD, 0x4291, 0x0720, +0x0000, 0x4381, 0x0002, 0x421F, 0x1A16, 0x1202, 0xC232, 0x4303, 0x4F82, +0x04C0, 0x4192, 0x0002, 0x04C8, 0x4F82, 0x04C4, 0x421C, 0x04CA, 0x4292, +0x04CC, 0x04CA, 0x4192, 0x0004, 0x04C8, 0x421D, 0x04CA, 0x4132, 0x5C0C, +0x4D0C, 0x6C0C, 0x430D, 0x6D0D, 0x421E, 0x1A18, 0x4E0F, 0xE33F, 0x5F0F, +0x7F0F, 0x5E0C, 0x6F0D, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x421C, 0x0720, +0x430D, 0x13B0, 0xD986, 0x430E, 0x403F, 0x4020, 0x13B0, 0xD566, 0x430E, +0x403F, 0x4580, 0x13B0, 0xD426, 0x5221, 0x0110, 0x143B, 0x0CC9, 0x0DC8, +0x430A, 0x430B, 0x431C, 0x13B0, 0x9A26, 0x430E, 0x403F, 0x447A, 0x13B0, +0xD566, 0x430E, 0x403F, 0x43FA, 0x13B0, 0xD426, 0x4C0A, 0x4D0B, 0x430E, +0x403F, 0x447A, 0x4A0C, 0x4B0D, 0x13B0, 0xD566, 0x4C0A, 0x4D0B, 0x4A89, +0x0000, 0x4B89, 0x0002, 0x4388, 0x0000, 0x4388, 0x0002, 0x430C, 0x1638, +0x0110, 0x930C, 0x2407, 0xC3E2, 0x0205, 0xD3D2, 0x0205, 0xD3D2, 0x0203, +0x3C08, 0xF0F2, 0x00FC, 0x0205, 0xF0F2, 0x00FC, 0x0203, 0x13B0, 0x8B04, +0x430C, 0x0110, 0x1840, 0x90B2, 0xAAAD, 0x2D0A, 0x206C, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x907C, 0x0006, 0x201B, 0xD0F2, 0x0003, 0x0205, +0x1840, 0x90F2, 0x0009, 0x2D02, 0x2005, 0xD3D2, 0x0203, 0xC3E2, 0x0203, +0x3C04, 0xC3E2, 0x0203, 0xD3D2, 0x0203, 0xC0F2, 0x0010, 0x0204, 0xC0F2, +0x0010, 0x0202, 0x1840, 0x4CC2, 0x2D02, 0x3C3D, 0x927C, 0x200F, 0xF0F2, +0x00FC, 0x0205, 0xF0F2, 0x00FC, 0x0203, 0xC0F2, 0x0010, 0x0202, 0x13B0, +0x8B04, 0x1840, 0x4CC2, 0x2D02, 0x3C2C, 0x907C, 0x0009, 0x201B, 0xD0F2, +0x0003, 0x0205, 0x1840, 0x90F2, 0x0006, 0x2D02, 0x2005, 0xD3E2, 0x0203, +0xC3D2, 0x0203, 0x3C04, 0xD3E2, 0x0203, 0xC3D2, 0x0203, 0xD0F2, 0x0010, +0x0204, 0xD0F2, 0x0010, 0x0202, 0x1840, 0x4CC2, 0x2D02, 0x3C0E, 0xF0F2, +0x00FC, 0x0205, 0xF0F2, 0x00FC, 0x0203, 0xC0F2, 0x0010, 0x0202, 0x13B0, +0x8B04, 0x1840, 0x42E2, 0x2D02, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x0110, 0xC0F2, 0x0080, 0x0203, 0x0110, 0x903C, 0x0009, +0x2403, 0x903C, 0x0006, 0x2004, 0x403C, 0x0CE4, 0x0080, 0x9B16, 0x430C, +0x0080, 0x9B16, 0x4382, 0x03C0, 0x40B2, 0x02C0, 0x03C0, 0x40B2, 0x0C6C, +0x03D2, 0xC0B2, 0x0010, 0x03C2, 0x0110, 0xC2E2, 0x0205, 0xD2E2, 0x020B, +0x4382, 0x0400, 0x43B2, 0x0412, 0x40B2, 0x0022, 0x0400, 0x0110, 0x4382, +0x0340, 0x43B2, 0x0352, 0x40B2, 0x02C0, 0x0340, 0x4392, 0x0360, 0xD0B2, +0x0026, 0x0340, 0x0110, 0x13B0, 0x9C68, 0x13B0, 0x9C50, 0x13B0, 0x9C38, +0xD0B2, 0x0080, 0x01B0, 0xD0B2, 0x0020, 0x01B0, 0xD392, 0x01B0, 0x40B2, +0x0410, 0x0700, 0x40B2, 0x0200, 0x0702, 0x40F2, 0x0010, 0x0710, 0x4303, +0x403F, 0x01C0, 0x533F, 0x2FFE, 0xD3A2, 0x0700, 0x4382, 0x0504, 0x4382, +0x0502, 0xD3D2, 0x0205, 0xD3D2, 0x0203, 0x1840, 0x40F2, 0x0006, 0x2D02, +0x1840, 0x4392, 0x2DE2, 0x1840, 0x4382, 0x2D04, 0x431C, 0x13B0, 0x8BF0, +0x1840, 0x4392, 0x2D08, 0x430C, 0x0110, 0x002F, 0x2DD8, 0x1840, 0xD2DF, +0x2DDD, 0x0000, 0x435E, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, +0x1840, 0xD2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0064, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0064, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, +0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, +0x0010, 0x03C0, 0x537E, 0x23F3, 0x407E, 0x0064, 0xC392, 0x03C2, 0xD0B2, +0x0014, 0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, +0x23F3, 0x002F, 0x2DD8, 0x1840, 0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x000A, +0x3C02, 0x184D, 0x100F, 0x537E, 0x934E, 0x23FB, 0x002F, 0x2DD8, 0x1840, +0xD2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x407E, 0x0064, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, +0xD2DF, 0x2DDC, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x407E, 0x0064, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, 0x03C2, +0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, 0x002F, 0x2DD8, 0x1840, +0xC2DF, 0x2DDD, 0x0000, 0x407E, 0x0005, 0xC392, 0x03C2, 0xD0B2, 0x0014, +0x03C0, 0xB392, 0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x537E, 0x23F3, +0x407E, 0x0064, 0x0080, 0x8AB0, 0x147B, 0x120F, 0x120E, 0x120D, 0x120C, +0x8221, 0x411F, 0x0030, 0x4F07, 0x035F, 0x4F81, 0x0002, 0x4191, 0x0032, +0x0032, 0x4308, 0x4309, 0x430A, 0x430B, 0x430C, 0x430D, 0x430E, 0x403F, +0x8000, 0x4346, 0x1840, 0x4254, 0x2F49, 0x1840, 0xF254, 0x2DF2, 0x2405, +0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C04, 0x1800, 0x40F2, 0x2E4D, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x0084, 0x2DE6, 0x0435, 0x000E, 0xC4D5, 0x000C, 0x0000, 0x0435, +0x0008, 0xC4D5, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0435, 0x0008, +0xD4D5, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0435, 0x000E, 0xD4D5, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, +0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0435, 0x000E, 0xC4D5, 0x000C, 0x0000, 0x0435, +0x0008, 0xC4D5, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0435, 0x0008, +0xD4D5, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0435, 0x000E, 0xD4D5, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0435, +0x000E, 0xC4D5, 0x000C, 0x0000, 0x0435, 0x0008, 0xC4D5, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x0435, 0x0008, 0xD4D5, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0435, 0x000E, 0xD4D5, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2410, 0xD0F2, 0x0080, 0x0203, 0xBC81, +0x0004, 0x202B, 0xBD81, 0x0006, 0x2028, 0xBE81, 0x0008, 0x2025, 0xBF81, +0x000A, 0x2418, 0x3C21, 0xC0F2, 0x0080, 0x0203, 0x3FEF, 0xB31C, 0x2BED, +0xBC81, 0x0004, 0x2009, 0xBD81, 0x0006, 0x2006, 0xBE81, 0x0008, 0x2003, +0xBF81, 0x000A, 0x240B, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C0A, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, 0x40F2, 0x2E4D, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x0084, 0x2DE6, 0x0435, 0x000E, 0xC4D5, 0x000C, 0x0000, 0x0435, +0x0008, 0xC4D5, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0435, 0x0004, +0x1840, 0x45E2, 0x2DF8, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0435, 0x0008, 0xD4D5, 0x000D, 0x0000, 0x0435, 0x000E, 0xD4D5, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x5808, 0x6909, 0x6A0A, 0x6B0B, 0x1840, 0x4254, +0x2DF8, 0x1840, 0xF254, 0x2DF2, 0x2002, 0x4344, 0x3C01, 0x4354, 0xD408, +0xB03F, 0x0100, 0x2C02, 0x0080, 0xAD18, 0x4846, 0xF076, 0x00C7, 0xB266, +0x28ED, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0084, 0x2DE6, 0x043F, +0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, 0x2DF2, +0x2440, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, +0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, +0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, +0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0x3C3B, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, +0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, +0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, +0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x407C, 0x0046, +0x13B0, 0xBCE0, 0x0080, 0xAD00, 0x9076, 0x0083, 0x20EE, 0x1800, 0x40F2, +0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0084, 0x2DE6, 0x043F, 0x000E, 0xC4DF, 0x000C, +0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, 0x2DF2, 0x2440, 0x1800, 0x40F2, +0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, +0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, +0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, +0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C3B, 0x1800, +0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, +0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, +0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0x410F, 0x530F, 0x40FF, 0x002A, 0x0000, +0x0080, 0xACF6, 0xB076, 0x0040, 0x28F4, 0x4644, 0xF074, 0x00C0, 0x9074, +0x00C0, 0x24EE, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0084, 0x2DE6, +0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, +0x2DF2, 0x2440, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, +0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0x3C3B, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, +0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, +0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, +0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x410F, +0x530F, 0x40FF, 0x004A, 0x0000, 0x0080, 0xAD0A, 0x9076, 0x0081, 0x20EC, +0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0084, 0x2DE6, 0x043F, 0x000E, +0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, 0x2DF2, 0x2440, +0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, +0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0x3C3B, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, +0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, +0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, +0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, +0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, +0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x407C, 0x0046, 0x13B0, +0xBCE0, 0x3D03, 0x4644, 0xF074, 0x00C3, 0x9354, 0x2504, 0xB076, 0x00C3, +0x2501, 0x4644, 0xF074, 0x00C3, 0x9364, 0x24FC, 0x9076, 0x0003, 0x25FA, +0x9076, 0x0082, 0x25F7, 0x9076, 0x0080, 0x25F4, 0x4644, 0xF074, 0x00C0, +0x9074, 0x00C0, 0x25EE, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0084, +0x2DE6, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, +0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1840, 0x425E, 0x2F49, 0x1840, +0xF25E, 0x2DF2, 0x2440, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, +0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0x3C3B, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, +0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x410F, 0x530F, 0x40FF, 0x003A, 0x0000, 0x3CF0, 0x1800, 0x40F2, 0x2DF9, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x0084, 0x2DE6, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, +0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, +0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1840, +0x425E, 0x2F49, 0x1840, 0xF25E, 0x2DF2, 0x2440, 0x1800, 0x40F2, 0x2DF9, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, +0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, +0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, 0x2EA1, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C3B, 0x1800, 0x40F2, +0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, +0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, +0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x043F, +0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x90B1, 0x0021, 0x0032, 0x280A, 0x410F, 0x530F, +0x40FF, 0x005A, 0x0000, 0x4308, 0x4309, 0x430A, 0x430B, 0x3CDE, 0x410F, +0x530F, 0x40FF, 0x001A, 0x0000, 0xF378, 0x1088, 0x480B, 0x430A, 0x4309, +0x4308, 0x3CD2, 0x035F, 0x100E, 0x100D, 0x100C, 0x4C04, 0xDD04, 0xDE04, +0xDF04, 0x9304, 0x2402, 0x0080, 0xA09E, 0x1840, 0x425E, 0x2F49, 0x1840, +0xF25E, 0x2DF2, 0x2442, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0084, +0x2DE6, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, +0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C3D, 0x1800, 0x40F2, 0x2E4D, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x0084, 0x2DE6, 0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, +0x043F, 0x0008, 0xC4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x043F, +0x0008, 0xD4DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x043F, 0x000E, 0xD4DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x043F, 0x000E, 0xC4DF, 0x000C, 0x0000, 0x043F, 0x0008, 0xC4DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x043F, 0x0008, 0xD4DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x043F, 0x000E, 0xD4DF, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0x9076, 0x0082, 0x2407, 0x9076, 0x0080, +0x2404, 0x9346, 0x2402, 0x9366, 0x2004, 0x407C, 0x0046, 0x13B0, 0xBCE0, +0x410F, 0x530F, 0x40FF, 0x001A, 0x0000, 0x9307, 0x2432, 0x5337, 0x90F1, +0x005A, 0x0000, 0x2021, 0x9381, 0x0002, 0x242A, 0x90B1, 0x0021, 0x0032, +0x2826, 0x407C, 0x0054, 0x13B0, 0xBCE0, 0x430C, 0x430D, 0x13B0, 0xB50A, +0x4C06, 0x4D07, 0xD037, 0x0200, 0x470D, 0x13B0, 0xB50A, 0xF037, 0xFDFF, +0x460C, 0x470D, 0x13B0, 0xB50A, 0x407C, 0x0046, 0x13B0, 0xBCE0, 0x3C0C, +0x90F1, 0x003A, 0x0000, 0x2002, 0x0080, 0x9F18, 0x90F1, 0x002A, 0x0000, +0x2002, 0x0080, 0x9F18, 0x480C, 0x490D, 0x4A0E, 0x4B0F, 0x5031, 0x000C, +0x1674, 0x0110, 0x145B, 0x120F, 0x120E, 0x120D, 0x120C, 0x1840, 0x425E, +0x2F49, 0x1840, 0xF25E, 0x2DF2, 0x2405, 0x1800, 0x40F2, 0x2DF9, 0x0522, +0x3C04, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063F, +0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x063F, +0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, 0x0000, +0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063F, +0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x430C, +0x430D, 0x430E, 0x430F, 0x4308, 0x4309, 0x430A, 0x403B, 0x8000, 0xB881, +0x0000, 0x2027, 0xB981, 0x0002, 0x2024, 0xBA81, 0x0004, 0x2021, 0xBB81, +0x0006, 0x2414, 0x3C1D, 0xB318, 0x2BF1, 0xB881, 0x0000, 0x2009, 0xB981, +0x0002, 0x2006, 0xBA81, 0x0004, 0x2003, 0xBB81, 0x0006, 0x240B, 0x1800, +0x40F2, 0x2DF9, 0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0x3C09, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x0637, +0x000E, 0xC6D7, 0x000C, 0x0000, 0x0637, 0x0008, 0xC6D7, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x0637, 0x0004, 0x1840, 0x47E2, 0x2DF8, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0637, 0x0008, 0xD6D7, 0x000D, +0x0000, 0x0637, 0x000E, 0xD6D7, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x5C0C, +0x6D0D, 0x6E0E, 0x6F0F, 0x1840, 0x4256, 0x2DF8, 0x1840, 0xF256, 0x2DF2, +0x2002, 0x4346, 0x3C01, 0x4356, 0xD60C, 0x035B, 0x100A, 0x1009, 0x1008, +0x4807, 0xD907, 0xDA07, 0xDB07, 0x9307, 0x2391, 0x3CFE, 0x4303, 0x063F, +0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x063F, +0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, 0x0000, +0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063F, +0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x4C4C, +0x4C81, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x430C, +0x4038, 0x0080, 0x430B, 0xB881, 0x0000, 0x240B, 0x3C14, 0xB318, 0x2BFA, +0xB881, 0x0000, 0x240B, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C0A, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, 0x40F2, 0x2E4D, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x0086, 0x2DE6, 0x0637, 0x000E, 0xC6D7, 0x000C, 0x0000, 0x0637, +0x0008, 0xC6D7, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0637, 0x0004, +0x1840, 0x47E2, 0x2DF8, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0637, 0x0008, 0xD6D7, 0x000D, 0x0000, 0x0637, 0x000E, 0xD6D7, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0x5C0C, 0x1840, 0x4256, 0x2DF8, 0x1840, 0xF256, +0x2DF2, 0x2002, 0x4346, 0x3C01, 0x4356, 0xD60C, 0x035B, 0x1008, 0x23A4, +0x1840, 0x425A, 0x2F49, 0x1840, 0xF25A, 0x2DF2, 0x2442, 0x1800, 0x40F2, +0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063B, 0x000E, 0xC6DB, 0x000C, +0x0000, 0x063B, 0x0008, 0xC6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x063B, 0x0008, 0xD6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x063B, 0x000E, 0xD6DB, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0x3C3D, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063B, +0x000E, 0xC6DB, 0x000C, 0x0000, 0x063B, 0x0008, 0xC6DB, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x063B, 0x0008, 0xD6DB, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063B, 0x000E, 0xD6DB, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x063B, 0x000E, 0xC6DB, 0x000C, 0x0000, +0x063B, 0x0008, 0xC6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063B, +0x0008, 0xD6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x063B, 0x000E, 0xD6DB, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x5231, +0x1656, 0x0110, 0x145B, 0x8231, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, +0x2DF2, 0x2405, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C04, 0x1800, 0x40F2, +0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063F, 0x000E, 0xC6DF, 0x000C, +0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, +0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, +0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x4C81, 0x0000, 0x4D81, 0x0002, +0x4381, 0x0004, 0x4381, 0x0006, 0x430C, 0x430D, 0x4308, 0x4039, 0x8000, +0x430B, 0xB881, 0x0000, 0x201B, 0xB981, 0x0002, 0x240E, 0x3C17, 0xB318, +0x2BF7, 0xB881, 0x0000, 0x2003, 0xB981, 0x0002, 0x240B, 0x1800, 0x40F2, +0x2DF9, 0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0x3C09, +0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x0637, 0x000E, +0xC6D7, 0x000C, 0x0000, 0x0637, 0x0008, 0xC6D7, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x0637, 0x0004, 0x1840, 0x47E2, 0x2DF8, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0637, 0x0008, 0xD6D7, 0x000D, 0x0000, +0x0637, 0x000E, 0xD6D7, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x5C0C, 0x6D0D, +0x1840, 0x4256, 0x2DF8, 0x1840, 0xF256, 0x2DF2, 0x2002, 0x4346, 0x3C01, +0x4356, 0xD60C, 0x035B, 0x1009, 0x1008, 0x4807, 0xD907, 0x9307, 0x239C, +0x3E22, 0x4303, 0x145B, 0x8231, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, +0x2DF2, 0x2405, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C04, 0x1800, 0x40F2, +0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063F, 0x000E, 0xC6DF, 0x000C, +0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, +0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, +0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x4C81, 0x0000, 0x4D81, 0x0002, +0x4381, 0x0004, 0x4381, 0x0006, 0x430C, 0x430D, 0x4308, 0x4239, 0x430B, +0xB881, 0x0000, 0x201B, 0xB981, 0x0002, 0x240E, 0x3C17, 0xB318, 0x2BF7, +0xB881, 0x0000, 0x2003, 0xB981, 0x0002, 0x240B, 0x1800, 0x40F2, 0x2DF9, +0x0522, 0x3C0A, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0x3C09, 0x1800, +0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x0637, 0x000E, 0xC6D7, +0x000C, 0x0000, 0x0637, 0x0008, 0xC6D7, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x0637, 0x0004, 0x1840, 0x47E2, 0x2DF8, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0637, 0x0008, 0xD6D7, 0x000D, 0x0000, 0x0637, +0x000E, 0xD6D7, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x5C0C, 0x6D0D, 0x1840, +0x4256, 0x2DF8, 0x1840, 0xF256, 0x2DF2, 0x2002, 0x4346, 0x3C01, 0x4356, +0xD60C, 0x035B, 0x1009, 0x1008, 0x4807, 0xD907, 0x9307, 0x239C, 0x1840, +0x425A, 0x2F49, 0x1840, 0xF25A, 0x2DF2, 0x2442, 0x1800, 0x40F2, 0x2DF9, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x0086, 0x2DE6, 0x063B, 0x000E, 0xC6DB, 0x000C, 0x0000, +0x063B, 0x0008, 0xC6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063B, +0x0008, 0xD6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x063B, 0x000E, 0xD6DB, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1800, +0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0x3C3D, +0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063B, 0x000E, +0xC6DB, 0x000C, 0x0000, 0x063B, 0x0008, 0xC6DB, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x063B, 0x0008, 0xD6DB, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x063B, 0x000E, 0xD6DB, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x063B, 0x000E, 0xC6DB, 0x000C, 0x0000, 0x063B, +0x0008, 0xC6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063B, 0x0008, +0xD6DB, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x063B, 0x000E, 0xD6DB, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x4C0F, 0x035D, +0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, 0xF03D, +0x000F, 0x0080, 0xB504, 0x145B, 0x8231, 0x1840, 0x425E, 0x2F49, 0x1840, +0xF25E, 0x2DF2, 0x2405, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C04, 0x1800, +0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063F, 0x000E, 0xC6DF, +0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, +0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, +0x0203, 0x1800, 0x40F2, 0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x063F, 0x000E, 0xC6DF, +0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, +0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, +0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x063F, 0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, +0xC6DF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, +0x000E, 0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x4C81, 0x0000, 0x4381, +0x0002, 0x4381, 0x0004, 0x4381, 0x0006, 0x430C, 0x4038, 0x8000, 0x0080, +0xB2DC, 0x145B, 0x8231, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, 0x2DF2, +0x2405, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x3C04, 0x1800, 0x40F2, 0x2E4D, +0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x0086, 0x2DE6, 0x0080, 0xB1A4, 0x145B, 0x8231, 0x1840, +0x4CC2, 0x2F4B, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, 0x2DF2, 0x2439, +0x1800, 0x40F2, 0x2DF9, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, 0x2DE6, 0x063F, 0x000E, +0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, 0xD6DF, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C40, 0xC0F2, +0x0080, 0x0203, 0x3C3C, 0x1800, 0x40F2, 0x2E4D, 0x0522, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0086, +0x2DE6, 0x063F, 0x000E, 0xC6DF, 0x000C, 0x0000, 0x063F, 0x0008, 0xC6DF, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x063F, 0x0008, 0xD6DF, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x063F, 0x000E, +0xD6DF, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x1800, 0x40F2, 0x2DF9, 0x0522, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x0080, 0xB1A4, 0x803C, 0x100A, 0x2002, 0x0080, 0xC2F4, 0x803C, +0x1000, 0x24DD, 0x803C, 0x2000, 0x2402, 0x0080, 0xC864, 0x40B2, 0x0018, +0x052A, 0x40B2, 0x0018, 0x053A, 0x008F, 0x2DE6, 0x0FCE, 0x00AE, 0x000D, +0x00AF, 0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2DF9, 0x4DCC, 0x0000, 0x4DCC, +0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4FEC, 0x0004, 0x4FEC, 0x0005, +0x4FEC, 0x0006, 0x4FEC, 0x0007, 0x4DCC, 0x0008, 0x4DCC, 0x0009, 0x4DCC, +0x000A, 0x4DCC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, 0x4DCC, 0x000E, +0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, 0x0012, 0x4FEC, +0x0013, 0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, +0x008C, 0x2E4D, 0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4DCC, 0x0002, 0x4DCC, +0x0003, 0x4FEC, 0x0004, 0x4FEC, 0x0005, 0x4FEC, 0x0006, 0x4FEC, 0x0007, +0x4DCC, 0x0008, 0x4DCC, 0x0009, 0x4DCC, 0x000A, 0x4DCC, 0x000B, 0x4EEC, +0x000C, 0x4EEC, 0x000D, 0x4EEC, 0x000E, 0x4EEC, 0x000F, 0x43CC, 0x0010, +0x43CC, 0x0011, 0x43CC, 0x0012, 0x43CC, 0x0013, 0x4EEC, 0x0014, 0x4EEC, +0x0015, 0x4EEC, 0x0016, 0x4EEC, 0x0017, 0x008C, 0x2EA1, 0x4EEC, 0x0000, +0x4EEC, 0x0001, 0x4EEC, 0x0002, 0x4EEC, 0x0003, 0x43CC, 0x0004, 0x43CC, +0x0005, 0x43CC, 0x0006, 0x43CC, 0x0007, 0x4EEC, 0x0008, 0x4EEC, 0x0009, +0x4EEC, 0x000A, 0x4EEC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, 0x4DCC, +0x000E, 0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, 0x0012, +0x4FEC, 0x0013, 0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, +0x0017, 0x008F, 0x2EF5, 0x4EEF, 0x0000, 0x4EEF, 0x0001, 0x4EEF, 0x0002, +0x4EEF, 0x0003, 0x43CF, 0x0004, 0x43CF, 0x0005, 0x43CF, 0x0006, 0x43CF, +0x0007, 0x4EEF, 0x0008, 0x4EEF, 0x0009, 0x4EEF, 0x000A, 0x4EEF, 0x000B, +0x4EEF, 0x000C, 0x4EEF, 0x000D, 0x4EEF, 0x000E, 0x4EEF, 0x000F, 0x43CF, +0x0010, 0x43CF, 0x0011, 0x43CF, 0x0012, 0x43CF, 0x0013, 0x4EEF, 0x0014, +0x4EEF, 0x0015, 0x4EEF, 0x0016, 0x4EEF, 0x0017, 0x0110, 0x40B2, 0x0030, +0x052A, 0x40B2, 0x0030, 0x053A, 0x008F, 0x2DE6, 0x0FCE, 0x00AE, 0x000D, +0x00AF, 0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2DF9, 0x4DCC, 0x0000, 0x4DCC, +0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, 0x4DCC, 0x0005, +0x4DCC, 0x0006, 0x4DCC, 0x0007, 0x4FEC, 0x0008, 0x4FEC, 0x0009, 0x4FEC, +0x000A, 0x4FEC, 0x000B, 0x4FEC, 0x000C, 0x4FEC, 0x000D, 0x4FEC, 0x000E, +0x4FEC, 0x000F, 0x4DCC, 0x0010, 0x4DCC, 0x0011, 0x4DCC, 0x0012, 0x4DCC, +0x0013, 0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, +0x4DCC, 0x0018, 0x4DCC, 0x0019, 0x4DCC, 0x001A, 0x4DCC, 0x001B, 0x4DCC, +0x001C, 0x4DCC, 0x001D, 0x4DCC, 0x001E, 0x4DCC, 0x001F, 0x4FEC, 0x0020, +0x4FEC, 0x0021, 0x4FEC, 0x0022, 0x4FEC, 0x0023, 0x4FEC, 0x0024, 0x4FEC, +0x0025, 0x4FEC, 0x0026, 0x4FEC, 0x0027, 0x4DCC, 0x0028, 0x4DCC, 0x0029, +0x4DCC, 0x002A, 0x4DCC, 0x002B, 0x4DCC, 0x002C, 0x4DCC, 0x002D, 0x4DCC, +0x002E, 0x4DCC, 0x002F, 0x008C, 0x2E4D, 0x4DCC, 0x0000, 0x4DCC, 0x0001, +0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, 0x4DCC, 0x0005, 0x4DCC, +0x0006, 0x4DCC, 0x0007, 0x4FEC, 0x0008, 0x4FEC, 0x0009, 0x4FEC, 0x000A, +0x4FEC, 0x000B, 0x4FEC, 0x000C, 0x4FEC, 0x000D, 0x4FEC, 0x000E, 0x4FEC, +0x000F, 0x4DCC, 0x0010, 0x4DCC, 0x0011, 0x4DCC, 0x0012, 0x4DCC, 0x0013, +0x4DCC, 0x0014, 0x4DCC, 0x0015, 0x4DCC, 0x0016, 0x4DCC, 0x0017, 0x4EEC, +0x0018, 0x4EEC, 0x0019, 0x4EEC, 0x001A, 0x4EEC, 0x001B, 0x4EEC, 0x001C, +0x4EEC, 0x001D, 0x4EEC, 0x001E, 0x4EEC, 0x001F, 0x43CC, 0x0020, 0x43CC, +0x0021, 0x43CC, 0x0022, 0x43CC, 0x0023, 0x43CC, 0x0024, 0x43CC, 0x0025, +0x43CC, 0x0026, 0x43CC, 0x0027, 0x4EEC, 0x0028, 0x4EEC, 0x0029, 0x4EEC, +0x002A, 0x4EEC, 0x002B, 0x4EEC, 0x002C, 0x4EEC, 0x002D, 0x4EEC, 0x002E, +0x4EEC, 0x002F, 0x008C, 0x2EA1, 0x4EEC, 0x0000, 0x4EEC, 0x0001, 0x4EEC, +0x0002, 0x4EEC, 0x0003, 0x4EEC, 0x0004, 0x4EEC, 0x0005, 0x4EEC, 0x0006, +0x4EEC, 0x0007, 0x43CC, 0x0008, 0x43CC, 0x0009, 0x43CC, 0x000A, 0x43CC, +0x000B, 0x43CC, 0x000C, 0x43CC, 0x000D, 0x43CC, 0x000E, 0x43CC, 0x000F, +0x4EEC, 0x0010, 0x4EEC, 0x0011, 0x4EEC, 0x0012, 0x4EEC, 0x0013, 0x4EEC, +0x0014, 0x4EEC, 0x0015, 0x4EEC, 0x0016, 0x4EEC, 0x0017, 0x4DCC, 0x0018, +0x4DCC, 0x0019, 0x4DCC, 0x001A, 0x4DCC, 0x001B, 0x4DCC, 0x001C, 0x4DCC, +0x001D, 0x4DCC, 0x001E, 0x4DCC, 0x001F, 0x4FEC, 0x0020, 0x4FEC, 0x0021, +0x4FEC, 0x0022, 0x4FEC, 0x0023, 0x4FEC, 0x0024, 0x4FEC, 0x0025, 0x4FEC, +0x0026, 0x4FEC, 0x0027, 0x4DCC, 0x0028, 0x4DCC, 0x0029, 0x4DCC, 0x002A, +0x4DCC, 0x002B, 0x4DCC, 0x002C, 0x4DCC, 0x002D, 0x4DCC, 0x002E, 0x4DCC, +0x002F, 0x008F, 0x2EF5, 0x4EEF, 0x0000, 0x4EEF, 0x0001, 0x4EEF, 0x0002, +0x4EEF, 0x0003, 0x4EEF, 0x0004, 0x4EEF, 0x0005, 0x4EEF, 0x0006, 0x4EEF, +0x0007, 0x43CF, 0x0008, 0x43CF, 0x0009, 0x43CF, 0x000A, 0x43CF, 0x000B, +0x43CF, 0x000C, 0x43CF, 0x000D, 0x43CF, 0x000E, 0x43CF, 0x000F, 0x4EEF, +0x0010, 0x4EEF, 0x0011, 0x4EEF, 0x0012, 0x4EEF, 0x0013, 0x4EEF, 0x0014, +0x4EEF, 0x0015, 0x4EEF, 0x0016, 0x4EEF, 0x0017, 0x4EEF, 0x0018, 0x4EEF, +0x0019, 0x4EEF, 0x001A, 0x4EEF, 0x001B, 0x4EEF, 0x001C, 0x4EEF, 0x001D, +0x4EEF, 0x001E, 0x4EEF, 0x001F, 0x43CF, 0x0020, 0x43CF, 0x0021, 0x43CF, +0x0022, 0x43CF, 0x0023, 0x43CF, 0x0024, 0x43CF, 0x0025, 0x43CF, 0x0026, +0x43CF, 0x0027, 0x4EEF, 0x0028, 0x4EEF, 0x0029, 0x4EEF, 0x002A, 0x4EEF, +0x002B, 0x4EEF, 0x002C, 0x4EEF, 0x002D, 0x4EEF, 0x002E, 0x4EEF, 0x002F, +0x0110, 0x40B2, 0x0054, 0x052A, 0x40B2, 0x0054, 0x053A, 0x008F, 0x2DE6, +0x0FCE, 0x00AE, 0x000D, 0x00AF, 0x000C, 0x4F6D, 0xDE6D, 0x008C, 0x2DF9, +0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, +0x0004, 0x4DCC, 0x0005, 0x4DCC, 0x0006, 0x4DCC, 0x0007, 0x4DCC, 0x0008, +0x4DCC, 0x0009, 0x4DCC, 0x000A, 0x4DCC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, +0x000D, 0x4DCC, 0x000E, 0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, +0x4FEC, 0x0012, 0x4FEC, 0x0013, 0x4FEC, 0x0014, 0x4FEC, 0x0015, 0x4FEC, +0x0016, 0x4FEC, 0x0017, 0x4FEC, 0x0018, 0x4FEC, 0x0019, 0x4DCC, 0x001A, +0x4DCC, 0x001B, 0x4DCC, 0x001C, 0x4DCC, 0x001D, 0x4DCC, 0x001E, 0x4DCC, +0x001F, 0x4DCC, 0x0020, 0x4DCC, 0x0021, 0x4DCC, 0x0022, 0x4DCC, 0x0023, +0x4DCC, 0x0024, 0x4DCC, 0x0025, 0x4DCC, 0x0026, 0x4DCC, 0x0027, 0x4DCC, +0x0028, 0x4DCC, 0x0029, 0x4DCC, 0x002A, 0x4DCC, 0x002B, 0x4DCC, 0x002C, +0x4DCC, 0x002D, 0x4DCC, 0x002E, 0x4DCC, 0x002F, 0x4DCC, 0x0030, 0x4DCC, +0x0031, 0x4DCC, 0x0032, 0x4DCC, 0x0033, 0x4DCC, 0x0034, 0x4DCC, 0x0035, +0x4DCC, 0x0036, 0x4DCC, 0x0037, 0x4DCC, 0x0038, 0x4DCC, 0x0039, 0x4FEC, +0x003A, 0x4FEC, 0x003B, 0x4FEC, 0x003C, 0x4FEC, 0x003D, 0x4FEC, 0x003E, +0x4FEC, 0x003F, 0x4FEC, 0x0040, 0x4FEC, 0x0041, 0x4FEC, 0x0042, 0x4FEC, +0x0043, 0x4DCC, 0x0044, 0x4DCC, 0x0045, 0x4DCC, 0x0046, 0x4DCC, 0x0047, +0x4DCC, 0x0048, 0x4DCC, 0x0049, 0x4DCC, 0x004A, 0x4DCC, 0x004B, 0x4DCC, +0x004C, 0x4DCC, 0x004D, 0x4DCC, 0x004E, 0x4DCC, 0x004F, 0x4DCC, 0x0050, +0x4DCC, 0x0051, 0x4DCC, 0x0052, 0x4DCC, 0x0053, 0x008C, 0x2E4D, 0x4DCC, +0x0000, 0x4DCC, 0x0001, 0x4DCC, 0x0002, 0x4DCC, 0x0003, 0x4DCC, 0x0004, +0x4DCC, 0x0005, 0x4DCC, 0x0006, 0x4DCC, 0x0007, 0x4DCC, 0x0008, 0x4DCC, +0x0009, 0x4DCC, 0x000A, 0x4DCC, 0x000B, 0x4DCC, 0x000C, 0x4DCC, 0x000D, +0x4DCC, 0x000E, 0x4DCC, 0x000F, 0x4FEC, 0x0010, 0x4FEC, 0x0011, 0x4FEC, +0x0012, 0x4FEC, 0x0013, 0x4FEC, 0x0014, 0x4FEC, 0x0015, 0x4FEC, 0x0016, +0x4FEC, 0x0017, 0x4FEC, 0x0018, 0x4FEC, 0x0019, 0x4DCC, 0x001A, 0x4DCC, +0x001B, 0x4DCC, 0x001C, 0x4DCC, 0x001D, 0x4DCC, 0x001E, 0x4DCC, 0x001F, +0x4DCC, 0x0020, 0x4DCC, 0x0021, 0x4DCC, 0x0022, 0x4DCC, 0x0023, 0x4DCC, +0x0024, 0x4DCC, 0x0025, 0x4DCC, 0x0026, 0x4DCC, 0x0027, 0x4DCC, 0x0028, +0x4DCC, 0x0029, 0x4EEC, 0x002A, 0x4EEC, 0x002B, 0x4EEC, 0x002C, 0x4EEC, +0x002D, 0x4EEC, 0x002E, 0x4EEC, 0x002F, 0x4EEC, 0x0030, 0x4EEC, 0x0031, +0x4EEC, 0x0032, 0x4EEC, 0x0033, 0x4EEC, 0x0034, 0x4EEC, 0x0035, 0x4EEC, +0x0036, 0x4EEC, 0x0037, 0x4EEC, 0x0038, 0x4EEC, 0x0039, 0x43CC, 0x003A, +0x43CC, 0x003B, 0x43CC, 0x003C, 0x43CC, 0x003D, 0x43CC, 0x003E, 0x43CC, +0x003F, 0x43CC, 0x0040, 0x43CC, 0x0041, 0x43CC, 0x0042, 0x43CC, 0x0043, +0x4EEC, 0x0044, 0x4EEC, 0x0045, 0x4EEC, 0x0046, 0x4EEC, 0x0047, 0x4EEC, +0x0048, 0x4EEC, 0x0049, 0x4EEC, 0x004A, 0x4EEC, 0x004B, 0x4EEC, 0x004C, +0x4EEC, 0x004D, 0x4EEC, 0x004E, 0x4EEC, 0x004F, 0x4EEC, 0x0050, 0x4EEC, +0x0051, 0x4EEC, 0x0052, 0x4EEC, 0x0053, 0x008C, 0x2EA1, 0x4EEC, 0x0000, +0x4EEC, 0x0001, 0x4EEC, 0x0002, 0x4EEC, 0x0003, 0x4EEC, 0x0004, 0x4EEC, +0x0005, 0x4EEC, 0x0006, 0x4EEC, 0x0007, 0x4EEC, 0x0008, 0x4EEC, 0x0009, +0x4EEC, 0x000A, 0x4EEC, 0x000B, 0x4EEC, 0x000C, 0x4EEC, 0x000D, 0x4EEC, +0x000E, 0x4EEC, 0x000F, 0x43CC, 0x0010, 0x43CC, 0x0011, 0x43CC, 0x0012, +0x43CC, 0x0013, 0x43CC, 0x0014, 0x43CC, 0x0015, 0x43CC, 0x0016, 0x43CC, +0x0017, 0x43CC, 0x0018, 0x43CC, 0x0019, 0x4EEC, 0x001A, 0x4EEC, 0x001B, +0x4EEC, 0x001C, 0x4EEC, 0x001D, 0x4EEC, 0x001E, 0x4EEC, 0x001F, 0x4EEC, +0x0020, 0x4EEC, 0x0021, 0x4EEC, 0x0022, 0x4EEC, 0x0023, 0x4EEC, 0x0024, +0x4EEC, 0x0025, 0x4EEC, 0x0026, 0x4EEC, 0x0027, 0x4EEC, 0x0028, 0x4EEC, +0x0029, 0x4DCC, 0x002A, 0x4DCC, 0x002B, 0x4DCC, 0x002C, 0x4DCC, 0x002D, +0x4DCC, 0x002E, 0x4DCC, 0x002F, 0x4DCC, 0x0030, 0x4DCC, 0x0031, 0x4DCC, +0x0032, 0x4DCC, 0x0033, 0x4DCC, 0x0034, 0x4DCC, 0x0035, 0x4DCC, 0x0036, +0x4DCC, 0x0037, 0x4DCC, 0x0038, 0x4DCC, 0x0039, 0x4FEC, 0x003A, 0x4FEC, +0x003B, 0x4FEC, 0x003C, 0x4FEC, 0x003D, 0x4FEC, 0x003E, 0x4FEC, 0x003F, +0x4FEC, 0x0040, 0x4FEC, 0x0041, 0x4FEC, 0x0042, 0x4FEC, 0x0043, 0x4DCC, +0x0044, 0x4DCC, 0x0045, 0x4DCC, 0x0046, 0x4DCC, 0x0047, 0x4DCC, 0x0048, +0x4DCC, 0x0049, 0x4DCC, 0x004A, 0x4DCC, 0x004B, 0x4DCC, 0x004C, 0x4DCC, +0x004D, 0x4DCC, 0x004E, 0x4DCC, 0x004F, 0x4DCC, 0x0050, 0x4DCC, 0x0051, +0x4DCC, 0x0052, 0x4DCC, 0x0053, 0x008F, 0x2EF5, 0x4EEF, 0x0000, 0x4EEF, +0x0001, 0x4EEF, 0x0002, 0x4EEF, 0x0003, 0x4EEF, 0x0004, 0x4EEF, 0x0005, +0x4EEF, 0x0006, 0x4EEF, 0x0007, 0x4EEF, 0x0008, 0x4EEF, 0x0009, 0x4EEF, +0x000A, 0x4EEF, 0x000B, 0x4EEF, 0x000C, 0x4EEF, 0x000D, 0x4EEF, 0x000E, +0x4EEF, 0x000F, 0x43CF, 0x0010, 0x43CF, 0x0011, 0x43CF, 0x0012, 0x43CF, +0x0013, 0x43CF, 0x0014, 0x43CF, 0x0015, 0x43CF, 0x0016, 0x43CF, 0x0017, +0x43CF, 0x0018, 0x43CF, 0x0019, 0x4EEF, 0x001A, 0x4EEF, 0x001B, 0x4EEF, +0x001C, 0x4EEF, 0x001D, 0x4EEF, 0x001E, 0x4EEF, 0x001F, 0x4EEF, 0x0020, +0x4EEF, 0x0021, 0x4EEF, 0x0022, 0x4EEF, 0x0023, 0x4EEF, 0x0024, 0x4EEF, +0x0025, 0x4EEF, 0x0026, 0x4EEF, 0x0027, 0x4EEF, 0x0028, 0x4EEF, 0x0029, +0x4EEF, 0x002A, 0x4EEF, 0x002B, 0x4EEF, 0x002C, 0x4EEF, 0x002D, 0x4EEF, +0x002E, 0x4EEF, 0x002F, 0x4EEF, 0x0030, 0x4EEF, 0x0031, 0x4EEF, 0x0032, +0x4EEF, 0x0033, 0x4EEF, 0x0034, 0x4EEF, 0x0035, 0x4EEF, 0x0036, 0x4EEF, +0x0037, 0x4EEF, 0x0038, 0x4EEF, 0x0039, 0x43CF, 0x003A, 0x43CF, 0x003B, +0x43CF, 0x003C, 0x43CF, 0x003D, 0x43CF, 0x003E, 0x43CF, 0x003F, 0x43CF, +0x0040, 0x43CF, 0x0041, 0x43CF, 0x0042, 0x43CF, 0x0043, 0x4EEF, 0x0044, +0x4EEF, 0x0045, 0x4EEF, 0x0046, 0x4EEF, 0x0047, 0x4EEF, 0x0048, 0x4EEF, +0x0049, 0x4EEF, 0x004A, 0x4EEF, 0x004B, 0x4EEF, 0x004C, 0x4EEF, 0x004D, +0x4EEF, 0x004E, 0x4EEF, 0x004F, 0x4EEF, 0x0050, 0x4EEF, 0x0051, 0x4EEF, +0x0052, 0x4EEF, 0x0053, 0x0110, 0x42B2, 0x052A, 0x42B2, 0x053A, 0x008F, +0x2DE6, 0x0FCE, 0x00AE, 0x000D, 0x00AF, 0x000C, 0x4F6D, 0xDE6D, 0x008C, +0x2DF9, 0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4FEC, 0x0002, 0x4DCC, 0x0003, +0x4DCC, 0x0004, 0x4DCC, 0x0005, 0x4FEC, 0x0006, 0x4DCC, 0x0007, 0x008C, +0x2E4D, 0x4DCC, 0x0000, 0x4DCC, 0x0001, 0x4FEC, 0x0002, 0x4DCC, 0x0003, +0x4EEC, 0x0004, 0x4EEC, 0x0005, 0x43CC, 0x0006, 0x4EEC, 0x0007, 0x008C, +0x2EA1, 0x4EEC, 0x0000, 0x4EEC, 0x0001, 0x43CC, 0x0002, 0x4EEC, 0x0003, +0x4DCC, 0x0004, 0x4DCC, 0x0005, 0x4FEC, 0x0006, 0x4DCC, 0x0007, 0x008F, +0x2EF5, 0x4EEF, 0x0000, 0x4EEF, 0x0001, 0x43CF, 0x0002, 0x4EEF, 0x0003, +0x4EEF, 0x0004, 0x4EEF, 0x0005, 0x43CF, 0x0006, 0x4EEF, 0x0007, 0x0110, +0x143B, 0x0028, 0x0532, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x1800, 0x40F2, +0x2EA1, 0x0532, 0x4C0F, 0xDD0F, 0x930F, 0x253C, 0x4C0A, 0x4D0B, 0x435C, +0x13B0, 0xD6A0, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x008F, 0x2DE6, 0x0F3E, 0x000E, 0xCFDE, 0x000C, +0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x533A, +0x633B, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, +0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, +0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, +0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, +0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, +0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, +0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x434C, 0x13B0, 0xD6A0, 0x4A0F, 0xDB0F, 0x930F, 0x22C6, 0x0860, 0x0532, +0x1638, 0x0110, 0x141B, 0x4C0A, 0x4D0B, 0x002D, 0x0532, 0x1800, 0x40F2, +0x2E4D, 0x0522, 0x1800, 0x40F2, 0x2EF5, 0x0532, 0x4C0F, 0xDB0F, 0x930F, +0x253A, 0x533A, 0x633B, 0x435C, 0x13B0, 0xD6A0, 0x434C, 0x13B0, 0xD6A0, +0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x008F, 0x2DE6, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, +0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, +0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, +0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, +0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, +0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, +0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, +0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, +0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, +0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x4A0F, 0xDB0F, 0x930F, 0x22C6, +0x0D60, 0x0532, 0x161A, 0x0110, 0x143B, 0x0028, 0x0532, 0x1800, 0x40F2, +0x2E4D, 0x0522, 0x1800, 0x40F2, 0x2EF5, 0x0532, 0x4C0F, 0xDD0F, 0x930F, +0x253C, 0x4C0A, 0x4D0B, 0x434C, 0x13B0, 0xD6A0, 0xD0B2, 0x0010, 0x0520, +0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x008F, 0x2DE6, +0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, +0x000C, 0x0000, 0xD232, 0x533A, 0x633B, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, +0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, +0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, +0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, +0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, +0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, +0x0F3E, 0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, +0x0008, 0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, 0x0008, 0xCFDE, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, 0xDFDE, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x000E, 0xDFDE, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0x435C, 0x13B0, 0xD6A0, 0x4A0F, 0xDB0F, +0x930F, 0x22C6, 0x0080, 0xCBA6, 0x002F, 0x0532, 0x1800, 0x40F2, 0x2DF9, +0x0522, 0x1800, 0x40F2, 0x2EA1, 0x0532, 0xD0B2, 0x0010, 0x0530, 0xD392, +0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x008E, 0x2DE6, 0x0E3D, +0x000E, 0xCEDD, 0x000C, 0x0000, 0x0E3D, 0x0008, 0xCEDD, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x0E3D, 0x0008, 0xDEDD, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x000E, 0xDEDD, 0x000C, +0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, +0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x0E3D, 0x000E, 0xCEDD, 0x000C, 0x0000, +0x0E3D, 0x0008, 0xCEDD, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E3D, +0x0008, 0xDEDD, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x0E3D, 0x000E, 0xDEDD, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, +0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, +0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, +0x0E3D, 0x000E, 0xCEDD, 0x000C, 0x0000, 0x0E3D, 0x0008, 0xCEDD, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x0008, 0xDEDD, 0x000D, 0x0000, +0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x000E, 0xDEDD, +0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, +0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0E3D, 0x000E, 0xCEDD, 0x000C, +0x0000, 0x0E3D, 0x0008, 0xCEDD, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E3D, 0x0008, 0xDEDD, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E3D, 0x000E, 0xDEDD, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0xD0B2, 0x0010, 0x0530, 0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, +0x4303, 0x0E3D, 0x000E, 0xCEDD, 0x000C, 0x0000, 0x0E3D, 0x0008, 0xCEDD, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x0008, 0xDEDD, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x000E, +0xDEDD, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, +0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0E3D, 0x000E, 0xCEDD, +0x000C, 0x0000, 0x0E3D, 0x0008, 0xCEDD, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x0E3D, 0x0008, 0xDEDD, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x0E3D, 0x000E, 0xDEDD, 0x000C, 0x0000, 0xD232, +0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, +0x0203, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, +0xC232, 0x4303, 0x0E3D, 0x000E, 0xCEDD, 0x000C, 0x0000, 0x0E3D, 0x0008, +0xCEDD, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x0008, 0xDEDD, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0E3D, +0x000E, 0xDEDD, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, +0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0xD0B2, 0x0010, 0x0530, +0xD392, 0x0530, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0E3D, 0x000E, +0xCEDD, 0x000C, 0x0000, 0x0E3D, 0x0008, 0xCEDD, 0x000D, 0x0000, 0x4303, +0x4303, 0x4303, 0x0E3D, 0x0008, 0xDEDD, 0x000D, 0x0000, 0x4303, 0x4303, +0x4303, 0x4303, 0x4303, 0x4303, 0x0E3D, 0x000E, 0xDEDD, 0x000C, 0x0000, +0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, +0x0080, 0x0203, 0x0F60, 0x0532, 0x430C, 0x0110, 0x1800, 0x1246, 0x4D06, +0x5606, 0x9036, 0xFF01, 0x2C96, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0A, +0x4F06, 0xF036, 0x8000, 0xE60D, 0xB03D, 0x7FFF, 0x2005, 0xB03F, 0x7FFF, +0x2087, 0x433D, 0x3C85, 0xB03F, 0x7FFF, 0x2006, 0x430C, 0xF03D, 0x8000, +0xD03D, 0x7F80, 0x3C7C, 0x4F06, 0x5606, 0x9036, 0xFF00, 0x2009, 0x4D06, +0x5606, 0x9036, 0xFF00, 0x27EB, 0xC03D, 0x7FFF, 0x430C, 0x3C6E, 0x4D06, +0x5606, 0x9036, 0xFF00, 0x2469, 0x1800, 0x124A, 0x1800, 0x124B, 0x1800, +0x1248, 0x4D0B, 0x4C0A, 0x5F0F, 0x5D0D, 0x4F08, 0x100F, 0x108D, 0x1088, +0xF37D, 0xF378, 0x8038, 0x007F, 0x880D, 0x3026, 0x4D08, 0xD03F, 0x0080, +0xD07B, 0x0080, 0x431C, 0x430D, 0x8E0A, 0x7F4B, 0x2C2C, 0x8318, 0x301A, +0x5A0A, 0x6B4B, 0x5E0A, 0x6F4B, 0x5A0A, 0x6B4B, 0x2825, 0x8E0A, 0x7F4B, +0xD312, 0x6C0C, 0x6D4D, 0x2BF7, 0x9038, 0x00FF, 0x3803, 0x403D, 0xFF00, +0x3C08, 0x9308, 0x2027, 0xD31C, 0x933C, 0x2002, 0x937D, 0x2422, 0x430D, +0x430C, 0x6F0F, 0x100D, 0x3C24, 0x6C0C, 0x6D4D, 0x2808, 0x930A, 0x23E9, +0x934B, 0x23E7, 0xB32C, 0x23E5, 0xC31C, 0x3FE3, 0x5A0A, 0x6B4B, 0x3004, +0x6C0C, 0x6D4D, 0x2BFA, 0x3FDC, 0x8E0A, 0x7F4B, 0x2FEB, 0x6C0C, 0x6D4D, +0x2FD6, 0x5A0A, 0x6B4B, 0x5E0A, 0x6F4B, 0x3FCD, 0x1088, 0xD80D, 0x6F0F, +0x100D, 0x100C, 0x630C, 0x630D, 0x1800, 0x4178, 0x1800, 0x417B, 0x1800, +0x417A, 0x1800, 0x4176, 0x0110, 0x1800, 0x1246, 0x4D06, 0x5606, 0x9036, +0xFF01, 0x2C93, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0E, 0x4F06, 0xF036, +0x8000, 0xE60D, 0x4D06, 0x5606, 0x9036, 0xFF00, 0x2008, 0x4F06, 0x5606, +0x2082, 0x433D, 0x3C80, 0x4F0D, 0x4E0C, 0x3C7D, 0x4F06, 0x5606, 0x9036, +0xFF00, 0x4036, 0x7FFF, 0x2007, 0xB60D, 0x27F2, 0xC60D, 0xD03D, 0x7F80, +0x430C, 0x3C6F, 0xB60D, 0x246D, 0xB60F, 0x2002, 0xC60D, 0x3FF8, 0x1800, +0x1248, 0x4D08, 0x5808, 0x1088, 0xF378, 0x4F06, 0x5606, 0x1086, 0xF376, +0x5608, 0x4D06, 0x8038, 0x007E, 0x303C, 0x1202, 0xC232, 0xD03D, 0x0080, +0xD03F, 0x0080, 0x4E82, 0x04C0, 0x4C82, 0x04C8, 0x4E82, 0x04C4, 0x421E, +0x04CA, 0x4292, 0x04CC, 0x04CA, 0x4382, 0x04CC, 0x4DC2, 0x04C8, 0x4C82, +0x04C4, 0x4FC2, 0x04C8, 0x4FC2, 0x04C4, 0x421F, 0x04CA, 0x4292, 0x04CC, +0x04CA, 0x4DC2, 0x04C8, 0x421C, 0x04CA, 0x4132, 0x5E0E, 0x6F0F, 0x6C0C, +0x2C04, 0x5E0E, 0x6F0F, 0x6C0C, 0x8318, 0x9038, 0x00FF, 0x340E, 0x9308, +0x2012, 0x933C, 0x2008, 0xF03F, 0xFE00, 0x903F, 0xFE00, 0x2003, 0x403D, +0x0100, 0x3C04, 0x430D, 0x3C02, 0x403D, 0xFF00, 0x5606, 0x100D, 0x430C, +0x3C14, 0x33F7, 0x484D, 0xEC4D, 0xEC0D, 0x108D, 0xEF4C, 0xEF0C, 0x108C, +0x5606, 0x100D, 0x100C, 0x2808, 0x934F, 0x2004, 0x930E, 0x2002, 0xB31C, +0x2402, 0x531C, 0x630D, 0x1800, 0x4178, 0x1800, 0x4176, 0x0110, 0xC0F2, +0x0080, 0x0203, 0xC232, 0x4303, 0x1840, 0x425E, 0x2F49, 0x1840, 0xF25E, +0x2DF2, 0x2403, 0x13B0, 0xDA0E, 0x3C02, 0x13B0, 0xDA9E, 0x934C, 0x008E, +0x2DE6, 0x0E3F, 0x0008, 0x2436, 0xDEDF, 0x000C, 0x0000, 0x13B0, 0xDA72, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0E3F, 0x000E, 0xCEDF, 0x000C, +0x0000, 0x0E3F, 0x0008, 0xCEDF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E3F, 0x0008, 0xDEDF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E3F, 0x000E, 0xDEDF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1840, 0x425E, 0x2DF2, 0x3C36, 0xCEDF, 0x000C, 0x0000, 0x13B0, 0xDA46, +0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x0E3F, 0x000E, 0xCEDF, 0x000C, +0x0000, 0x0E3F, 0x0008, 0xCEDF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, +0x0E3F, 0x0008, 0xDEDF, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, +0x4303, 0x4303, 0x0E3F, 0x000E, 0xDEDF, 0x000C, 0x0000, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, +0x1840, 0x425E, 0x2DF2, 0xE37E, 0x1840, 0x4EC2, 0x2F49, 0xD232, 0x9382, +0x4200, 0x2404, 0xD0F2, 0x0080, 0x0203, 0x0110, 0xC0F2, 0x0080, 0x0203, +0x0110, 0x1800, 0x40F2, 0x2DF9, 0x0522, 0x407E, 0x0006, 0xD0B2, 0x0010, +0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, 0x0203, 0xC232, 0x4303, 0x008F, +0x2DE6, 0x0F3D, 0x000E, 0xCFDD, 0x000C, 0x0000, 0x0F3D, 0x0008, 0xCFDD, +0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3D, 0x0008, 0xDFDD, 0x000D, +0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x0F3D, 0x000E, +0xDFDD, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, 0xD0F2, 0x0080, +0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x537E, 0x23CA, 0x1800, 0x40F2, +0x2EA1, 0x0522, 0xD0B2, 0x0010, 0x0520, 0xD392, 0x0520, 0xC0F2, 0x0080, +0x0203, 0xC232, 0x4303, 0x0F3E, 0x000E, 0xCFDE, 0x000C, 0x0000, 0x0F3E, +0x0008, 0xCFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x0F3E, 0x0008, +0xDFDE, 0x000D, 0x0000, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, +0x0F3E, 0x000E, 0xDFDE, 0x000C, 0x0000, 0xD232, 0x9382, 0x4200, 0x2404, +0xD0F2, 0x0080, 0x0203, 0x3C03, 0xC0F2, 0x0080, 0x0203, 0x430C, 0x0110, +0x008F, 0x2D0C, 0x1800, 0x40FF, 0x9C82, 0x0000, 0x1800, 0x40FF, 0x9B16, +0x0004, 0x1800, 0x40FF, 0x9AC6, 0x000C, 0x1800, 0x40FF, 0x8BF0, 0x0010, +0x1800, 0x40FF, 0x99EE, 0x0014, 0x1800, 0x40FF, 0x94A4, 0x0018, 0x1800, +0x40FF, 0x8BE8, 0x001C, 0x1800, 0x40FF, 0xDB44, 0x0020, 0x1800, 0x40FF, +0xDACA, 0x0024, 0x1800, 0x43CF, 0x0028, 0x1800, 0x40FF, 0x94AC, 0x002C, +0x1800, 0x40FF, 0x8ACC, 0x0030, 0x1800, 0x40FF, 0x8A92, 0x0034, 0x1800, +0x40FF, 0xDBA8, 0x0048, 0x1800, 0x40FF, 0xDBAE, 0x004C, 0x1800, 0x40FF, +0xDBB0, 0x0050, 0x1800, 0x40FF, 0x8AF2, 0x0038, 0x1800, 0x40FF, 0x8AEA, +0x003C, 0x1800, 0x40FF, 0x9C38, 0x0040, 0x1800, 0x40FF, 0x9CF2, 0x0044, +0x1800, 0x40FF, 0xDB7A, 0x0068, 0x1800, 0x40FF, 0xDB88, 0x0054, 0x1800, +0x40FF, 0x9B3C, 0x0008, 0x1800, 0x40FF, 0xDB72, 0x006C, 0x0110, 0x930D, +0x3409, 0x1800, 0x1248, 0xE33C, 0xE33D, 0x531C, 0x630D, 0x4038, 0x0197, +0x3C04, 0x1800, 0x1248, 0x4038, 0x0097, 0x903D, 0x0100, 0x2C1D, 0x930D, +0x200F, 0x903C, 0x0100, 0x2806, 0x108C, 0x4C4D, 0xC03C, 0x00FF, 0x8238, +0x3C06, 0x930C, 0x240D, 0x4C0D, 0x430C, 0x8038, 0x0010, 0x8318, 0x5C0C, +0x6D4D, 0x2BFC, 0x1108, 0x104D, 0x100C, 0x1088, 0xD80D, 0x1800, 0x4178, +0x0110, 0x1800, 0x1247, 0x4347, 0x903D, 0x0200, 0x2808, 0xC312, 0x100D, +0x100C, 0x1047, 0x5318, 0x903D, 0x0200, 0x2FF8, 0x1108, 0x104D, 0x100C, +0x1088, 0xD80D, 0x6747, 0x2806, 0xC312, 0x1047, 0x2001, 0x2802, 0x531C, +0x630D, 0x1800, 0x4177, 0x1800, 0x4178, 0x0110, 0x002F, 0x2DEE, 0x1840, +0xC2DF, 0x2DF2, 0x0000, 0x002F, 0x2DEE, 0x1840, 0xC2DF, 0x2DF3, 0x0000, +0x4303, 0x4303, 0x4303, 0x002F, 0x2DEE, 0x1840, 0xD2DF, 0x2DF2, 0x0000, +0x002F, 0x2DEE, 0x1840, 0xD2DF, 0x2DF3, 0x0000, 0x0110, 0x002F, 0x2DEE, +0x1840, 0xC2DF, 0x2DF2, 0x0000, 0x002F, 0x2DEE, 0x1840, 0xC2DF, 0x2DF3, +0x0000, 0x4303, 0x4303, 0x4303, 0x002F, 0x2DEE, 0x1840, 0xD2DF, 0x2DF3, +0x0000, 0x0110, 0x002F, 0x2DEE, 0x1840, 0xD2DF, 0x2DF2, 0x0000, 0x002F, +0x2DEE, 0x1840, 0xC2DF, 0x2DF3, 0x0000, 0x4303, 0x4303, 0x4303, 0x002F, +0x2DEE, 0x1840, 0xD2DF, 0x2DF3, 0x0000, 0x0110, 0x002F, 0x2DEE, 0x1840, +0xC2DF, 0x2DF2, 0x0000, 0x002F, 0x2DEE, 0x1840, 0xC2DF, 0x2DF3, 0x0000, +0x4303, 0x4303, 0x4303, 0x002F, 0x2DEE, 0x1840, 0xD2DF, 0x2DF3, 0x0000, +0x0110, 0x930C, 0x240D, 0xC392, 0x03C2, 0xD0B2, 0x0014, 0x03C0, 0xB392, +0x03C2, 0x2BFD, 0xC0B2, 0x0010, 0x03C0, 0x533C, 0x23F3, 0x0110, 0x141B, +0x0CCA, 0x3C06, 0x4DFA, 0x0000, 0x00AA, 0x0001, 0x533E, 0x633F, 0x4E0B, +0xDF0B, 0x930B, 0x23F6, 0x161A, 0x0110, 0x151F, 0x160F, 0x0CCE, 0x0FEE, +0x3C04, 0x43CC, 0x0000, 0x00AC, 0x0001, 0x0EDC, 0x23FA, 0x0110, 0x1800, +0x124C, 0x4EBC, 0x0000, 0x03EC, 0x00BD, 0x0001, 0x23FA, 0x1800, 0x417C, +0x0110, 0x430C, 0x430D, 0x430E, 0x430F, 0x0110, 0x3FFA, 0x4303, 0x3C02, +0x184D, 0x100F, 0x533C, 0x930C, 0x23FB, 0x0110, 0x13B0, 0xD8AC, 0x1380, +0x2D0C, 0xD2A2, 0x0508, 0x0110, 0x430C, 0x430D, 0x0110, 0x3FFC, 0x4303, +0x1840, 0x425C, 0x2F4B, 0x0110, 0x1840, 0x4C82, 0x2D0A, 0x0110, 0x430C, +0x0080, 0x9CF2, 0x434C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, 0x434C, +0x0110, 0x430C, 0x0110, 0x434C, 0x0110, 0x430C, 0x0110, 0x430C, 0x0110, +0x430C, 0x0110, 0x0080, 0xDAEA, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, +0x0000, 0x0000, 0x0241, 0x0000, 0x0243, 0x0000, 0x8040, 0x0245, 0x0000, +0x2010, 0x8040, 0x0221, 0x0000, 0x0223, 0x0000, 0x0804, 0x0225, 0x0000, +0xFF04, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, +}; + +const uint32_t eZ_FetHilImage_address[] = +{ +0x00001880, 0x00008A00, +}; +const uint32_t eZ_FetHilImage_length_of_sections[] = +{ +0x00000040, 0x00002B00, +}; +const uint32_t eZ_FetHilImage_sections = 0x00000002; +const uint32_t eZ_FetHilImage_termination = 0x00000000; +const uint32_t eZ_FetHilImage_start = 0x00001880; +const uint32_t eZ_FetHilImage_finish = 0x0000E000; +const uint32_t eZ_FetHilImage_length = 0x0000C780; + +#define EZ_FETHILIMAGE_TERMINATION 0x00000000 +#define EZ_FETHILIMAGE_START 0x00001880 +#define EZ_FETHILIMAGE_FINISH 0x0000E000 +#define EZ_FETHILIMAGE_LENGTH 0x0000C780 +#define EZ_FETHILIMAGE_SECTIONS 0x00000002 diff --git a/Bios/include/error_def.h b/Bios/include/error_def.h index d6d0918..21c4aea 100644 --- a/Bios/include/error_def.h +++ b/Bios/include/error_def.h @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -54,7 +54,7 @@ #define HALERR_WRITE_FLASH_BLOCK_TIMEOUT_EXECUTE 0xFFF9 #define HALERR_WRITE_FLASH_BLOCK_TIMEOUT_FINISH 0xFFF8 #define HALERR_WRITE_FLASH_BLOCK_TIMEOUT_INIT 0xFFF7 -#define HALERR_WRITE_FLASH_BLOCK_MISSING_STREAM_DATA 0xFFF6 +#define HALERR_WRITE_FLASH_BLOCK_MISSING_STREAM_DATA 0xFFF6 */ #define HALERR_EXECUTE_FUNCLET_NO_RAM_START 0xFFFE @@ -149,4 +149,11 @@ #define HALERR_EXECUTE_FUNCLET_NO_MAXRSEL 0xFFBE +#define API_CALL_NOT_SUPPORTED 0xFFBD // API call is not supported on the current FET type + +#define HALERR_MAGIC_PATTERN 0xFFBC +#define HALERR_MAGIC_PATTERN_BOOT_DATA_CRC_WRONG 0xFFBB +#define HALERR_DAP_NACK 0xFFBA // NACK timeout on DAP + + #endif diff --git a/Bios/include/hal.h b/Bios/include/hal.h index 16b4131..5db7656 100644 --- a/Bios/include/hal.h +++ b/Bios/include/hal.h @@ -1,36 +1,36 @@ /* * hal.h * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -49,18 +49,10 @@ #ifndef _HAL_H_ #define _HAL_H_ -/// Configurations values for StartJtag -enum INTERFACE_TYPE -{ - /// 4 Wire JTAG protocol used - JTAG_IF = 0, - /// 2 Wire (Spy-bi-wire) JTAG protocol used - SPYBIWIRE_IF, - /// 2 Wire Devices accessed by 4wire JTAG protocol - SPYBIWIREJTAG_IF -}; +#define T_ARCH_MSP430 0 +#define T_ARCH_MSP432 1 -// Event types send async to DLL First word in message +// Event types send async to DLL First word in message enum EVENT_TYPE_FLAGS { // set if breakpoint is hit @@ -69,28 +61,10 @@ enum EVENT_TYPE_FLAGS STATE_STORAGE_FLAG = 0x2, //JSTATE Capute JSTATE_CAPTURE_FLAG = 0x4, + //Power profiling data capture + ENERGYTRACE_INFO = 0x8, // Variable watch event - VARIABLE_WATCH_FLAG = 0x8 -}; - -/// FLASH erase type. -enum ERASE_TYPE -{ - /// Erase a segment. - ERASE_SEGMENT = 0, - /// Erase all MAIN memory. - ERASE_MAIN, - /// Erase all MAIN and INFORMATION memory. - ERASE_ALL, - /// Erase all MAIN and IP PROTECTED memory. - ERASE_TOTAL, -}; - - -enum MAILBOX_MODE -{ - LONG_MODE = 0, - WORD_MODE, + VARIABLE_WATCH_FLAG = 0x10 }; #define NO_FLAG 0x00 @@ -99,33 +73,36 @@ enum MAILBOX_MODE #define HAL_FUNCTION(x) short x (unsigned short flags) typedef short (*HalFuncInOut)(unsigned short); -union _chain_Configuration{ - struct __chain_Configuration{ - unsigned char Num : 7; - unsigned char isMsp430 : 1; - }bitAccess; - unsigned char byteAccess; -}; - struct _DeviceSettings_ { - unsigned long clockControlType; + unsigned long clockControlType; unsigned short stopFLL; + unsigned short assertBslValidBit; }; typedef struct _DeviceSettings_ DeviceSettings; struct _DevicePowerSettings_ { unsigned long powerTestRegMask; + unsigned long powerTestRegDefault; unsigned long enableLpmx5TestReg; unsigned long disableLpmx5TestReg; unsigned short powerTestReg3VMask; + unsigned short powerTestReg3VDefault; unsigned short enableLpmx5TestReg3V; - unsigned short disableLpmx5TestReg3V; + unsigned short disableLpmx5TestReg3V; }; typedef struct _DevicePowerSettings_ DevicePowerSettings; +typedef struct _ARMConfigSettings +{ + unsigned long scsBase; // System Control Space base address + unsigned long fpbBase; // FLASH Patch Block base address + unsigned long interruptOptions; // Options to enable/disable interrupts when single stepping or letting the device run + unsigned long ulpDebug; // Options to enable/disable entry to LPM. poll for PB hit in low poer mode +} ARMConfigSettings; + #ifndef HAL_REC #define HAL_REC struct _HalRec_ @@ -155,6 +132,7 @@ extern void _init_Hal(void); MACRO(SetChainConfiguration) \ MACRO(GetNumOfDevices) \ MACRO(GetInterfaceMode) \ + MACRO(GetDeviceIdPtr) \ MACRO(SyncJtag_AssertPor_SaveContext) \ MACRO(SyncJtag_Conditional_SaveContext) \ MACRO(RestoreContext_ReleaseJtag) \ @@ -192,7 +170,7 @@ extern void _init_Hal(void); MACRO(ExecuteFuncletX) \ MACRO(GetDcoFrequencyX) \ MACRO(GetFllFrequencyX) \ - MACRO(WaitForStorageX) \ + MACRO(WaitForStorageX) \ MACRO(BlowFuseXv2) \ MACRO(BlowFuseFram) \ MACRO(SyncJtag_AssertPor_SaveContextXv2) \ @@ -208,8 +186,8 @@ extern void _init_Hal(void); MACRO(PsaXv2) \ MACRO(ExecuteFuncletXv2) \ MACRO(UnlockDeviceXv2) \ - MACRO(MagicPattern) \ - MACRO(UnlockC092) \ + MACRO(MagicPattern) \ + MACRO(UnlockC092) \ MACRO(HilCommand) \ MACRO(PollJStateReg) \ MACRO(PollJStateRegFR57xx) \ @@ -217,13 +195,41 @@ extern void _init_Hal(void); MACRO(ResetXv2) \ MACRO(WriteFramQuickXv2) \ MACRO(SendJtagMailboxXv2) \ - MACRO(SingleStepJStateXv2) + MACRO(SingleStepJStateXv2) \ + MACRO(PollJStateRegEt8) \ + MACRO(ResetStaticGlobalVars) \ + MACRO(Reset430I) \ + MACRO(PollJStateReg430I) \ + MACRO(PollJStateReg20) \ + MACRO(SwitchMosfet) \ + MACRO(ResetL092) \ + MACRO(DummyMacro) \ + MACRO(Reset5438Xv2) \ + MACRO(LeaSyncConditional) \ + MACRO(GetJtagIdCodeArm) \ + MACRO(ScanApArm) \ + MACRO(MemApTransactionArm) \ + MACRO(ReadAllCpuRegsArm) \ + MACRO(WriteAllCpuRegsArm) \ + MACRO(EnableDebugArm) \ + MACRO(DisableDebugArm) \ + MACRO(RunArm) \ + MACRO(HaltArm) \ + MACRO(ResetArm) \ + MACRO(SingleStepArm) \ + MACRO(WaitForDebugHaltArm) \ + MACRO(MemApTransactionArmSwd) \ + MACRO(GetInterfaceModeArm) \ + MACRO(PollDStatePCRegEt) \ + MACRO(GetCpuIdArm) \ + MACRO(CheckDapLockArm) \ + MACRO(UnlockDap) \ + MACRO(UssSyncConditional) - #define MACRO(x) ID_##x, enum hal_id { - MACRO(Zero) + MACRO(Zero) MACRO_LIST NUM_MACROS }; diff --git a/Bios/include/hw_compiler_specific.h b/Bios/include/hw_compiler_specific.h index c97bf00..8f0e096 100644 --- a/Bios/include/hw_compiler_specific.h +++ b/Bios/include/hw_compiler_specific.h @@ -4,61 +4,64 @@ * \brief */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -//! \author Detlef Fink (03/10/2011) #ifndef HW_COMPILER_SPECIFIC_H #define HW_COMPILER_SPECIFIC_H -#ifdef __ICC430__ + #define eZ_FET_WITH_DCDC 0xAAAA + #define eZ_FET_NO_DCDC 0xAAAB + #define eZ_FET_WITH_DCDC_NO_FLOWCTL 0xAAAC + #define MSP_FET_WITH_DCDC 0xBBBB + #define MSP_FET_WITH_DCDC_V2x 0xBBBC + #define eZ_FET_WITH_DCDC_V2x 0xAAAD + #include "msp430.h" #include "intrinsics.h" - #define BAUDRATE 460800 // communication speed to TUSB3410 - + #define BAUDRATE 460800 // communication speed to TUSB3410 + #define CRYSTAL_U1 8000000 // externally connected HF crystal - #define CRYSTAL_E2 12000000 // externally connected HF crystal + #define CRYSTAL_E2 12000000 // externally connected HF crystal #define BAUDMOD_U1 0x52 // corresponding modulation register value #define BAUDMOD_E2 0x00 // corresponding modulation register value #define USB_READ U0RXBUF #define USB_WRITE U0TXBUF - + #define INFO_U1_HW_0 0xFF55 #define INFO_U1_HW_1 0x0140 - #define INFO_E2_HW_0 0xFF45 - #define INFO_E2_HW_1 0x0200 - + #define CONCAT0(x,y) x##y #define CONCAT(x,y) CONCAT0(x,y) #define PRAGMA(x) _Pragma(#x) @@ -68,31 +71,49 @@ #define INTERRUPT(x) PRAGMA(vector=x) __interrupt #define INTERRUPT_PROTO __interrupt #define INLINE(x) PRAGMA(inline=x) + +#if defined(eZ_FET) || defined(MSP_FET) + #define VAR_AT(x, y) __no_init __data20 x @ y + #define CONST_AT(x, y) const __data20 x @ y +#endif + +#ifdef MSP430_UIF #define VAR_AT(x, y) __no_init x @ y #define CONST_AT(x, y) const x @ y +#endif + #define RO_PLACEMENT __ro_placement #define NO_INIT __no_init #define RO_PLACEMENT_NO_INIT __ro_placement __no_init +#ifdef MSP430_UIF #define ENABLE_INTERRUPT __enable_interrupt() #define DISABLE_INTERRUPT __disable_interrupt() - #define NO_OPERATION __no_operation() +#endif - - #define PTR_FOR_CMP unsigned short - -#else - // dummys for unused function in DLL - #define DIAG_SUPPRESS(x) - #define DIAG_DEFAULT(x) - #define REQUIRED(x) - #define setRst(x) - #define setTst(x) - #define VAR_AT(x, y) x - #define CONST_AT(x, y) const x - + #define NO_OPERATION __no_operation() #define PTR_FOR_CMP unsigned long -#endif + #if defined(eZ_FET) || defined(MSP_FET) + + #ifdef eZ_FET + #define COM_CLEARCTS {P2OUT &=~ BIT7;} + #define COM_SETCTS {P2OUT |= BIT7;} + #define COM_SEMAPHOREADRESS 0x4200 + #endif + + #ifdef MSP_FET + #define COM_CLEARCTS {P9OUT &=~ BIT5;} + #define COM_SETCTS {P9OUT |= BIT5;} + #define COM_SEMAPHOREADRESS 0x4A00 + #endif + + #define COM_CTSSTATUS {if(*((unsigned int*)COM_SEMAPHOREADRESS)){COM_SETCTS;}else {COM_CLEARCTS;}} + + #define _DINT_FET() {COM_CLEARCTS; __disable_interrupt();} + #define _EINT_FET() {__enable_interrupt();COM_CTSSTATUS;} + #define _DISABLE_UART() {COM_CLEARCTS;} + #define _ENABLE_UART() {COM_CTSSTATUS;} + #endif #endif diff --git a/Bios/include/protocol.h b/Bios/include/protocol.h index 25621db..0db6a84 100644 --- a/Bios/include/protocol.h +++ b/Bios/include/protocol.h @@ -7,42 +7,42 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @page protocol Host (PC) - Bios Communication Protocol This page introduces the user to the topic. - Proceed to the @ref hil. + Proceed to the @ref hil. */ /** @@ -58,39 +58,57 @@ enum eCMDTYP { - CMDTYP_UPINIT = 0x51, - CMDTYP_UPERASE = 0x52, - CMDTYP_UPWRITE = 0x53, - CMDTYP_UPREAD = 0x54, - CMDTYP_UPCORE = 0x55, - - CMDTYP_LEGACY = 0x7E, - CMDTYP_SYNC = 0x80, - CMDTYP_EXECUTE = 0x81, - CMDTYP_EXECUTELOOP = 0x82, - CMDTYP_LOAD = 0x83, - CMDTYP_LOAD_CONTINUED = 0x84, - CMDTYP_DATA = 0x85, - CMDTYP_KILL = 0x86, - CMDTYP_MOVE = 0x87, - CMDTYP_UNLOAD = 0x88, - CMDTYP_BYPASS = 0x89, - CMDTYP_EXECUTEEVER = 0x8A, - CMDTYP_COMRESET = 0x8B, - CMDTYP_PAUSE_LOOP = 0x8C, - CMDTYP_RESUME_LOOP = 0x8D, + // Fet-Core functions + CMDTYP_UPINIT = 0x51, + CMDTYP_UPERASE = 0x52, + CMDTYP_UPWRITE = 0x53, + CMDTYP_UPREAD = 0x54, + CMDTYP_UPCORE = 0x55, + // Fet-Dcdc functions + CMDTYP_DCDC_CALIBRATE = 0x56, + CMDTYP_DCDC_INIT_INTERFACE = 0x57, + CMDTYP_DCDC_SUB_MCU_VERSION = 0x58, + CMDTYP_DCDC_LAYER_VERSION = 0x59, + CMDTYP_DCDC_POWER_DOWN = 0x60, + CMDTYP_DCDC_SET_VCC = 0x61, + + CMDTYP_DCDC_RESTART = 0x62, + + CMDTYP_HIL_SET_VCC = 0x63, + CMDTYP_HIL_GET_VCC = 0x64, + CMDTYP_HIL_SWITCH_FET = 0x65, + + CMDTYP_CMP_VERSIONS = 0x66, + + CMDTYP_LEGACY = 0x7E, + CMDTYP_SYNC = 0x80, + CMDTYP_EXECUTE = 0x81, + CMDTYP_EXECUTELOOP = 0x82, + CMDTYP_LOAD = 0x83, + CMDTYP_LOAD_CONTINUED = 0x84, + CMDTYP_DATA = 0x85, + CMDTYP_KILL = 0x86, + CMDTYP_MOVE = 0x87, + CMDTYP_UNLOAD = 0x88, + CMDTYP_BYPASS = 0x89, + CMDTYP_EXECUTEEVER = 0x8A, + CMDTYP_COMRESET = 0x8B, + CMDTYP_PAUSE_LOOP = 0x8C, + CMDTYP_RESUME_LOOP = 0x8D, + CMDTYP_KILL_ALL = 0x8E, + CMDTYP_OVER_CURRENT = 0x8F }; typedef enum eCMDTYP eCMDTYP_t; enum eRESPTYP { - RESPTYP_EMPTY = 0x00, - RESPTYP_ACKNOWLEDGE = 0x91, - RESPTYP_EXCEPTION = 0x92, - RESPTYP_DATA = 0x93, - RESPTYP_REQUEST = 0x94, - RESPTYP_STATUS = 0x95, + RESPTYP_EMPTY = 0x00, + RESPTYP_ACKNOWLEDGE = 0x91, + RESPTYP_EXCEPTION = 0x92, + RESPTYP_DATA = 0x93, + RESPTYP_REQUEST = 0x94, + RESPTYP_STATUS = 0x95, }; typedef enum eRESPTYP eRESPTYP_t; diff --git a/Bios/settings/MSP-FET_Bios.wsdt b/Bios/settings/MSP-FET_Bios.wsdt new file mode 100644 index 0000000..4e255f8 --- /dev/null +++ b/Bios/settings/MSP-FET_Bios.wsdt @@ -0,0 +1,55 @@ + + + + + + + + FET_Bios/MSP_FET_DebugFET_ComChannel/MSP_FET_DebugFET_DCDC/MSP_FET_DebugMSP-FET_FpgaUpdate/DebugMSP-FET_Hil/DebugFET_Hal/MSP_FET_DebugFetDcdcController/MSP_FET_DebugFET_Hal1 + + + + + + + + + 305272727 + + 20139537293664941138191622 + + + + + + TabID-20988-12588 + Workspace + Workspace + + + <ws> + + + + 0TabID-10977-651BuildBuildTabID-27521-24699Find in FilesFind-in-FilesTabID-6087-31012Debug LogDebug-Log0 + + + + + + TextEditor$WS_DIR$\src\hil\msp_fet\hil.c0000068400TextEditor$WS_DIR$\src\hil\fet_generic\hil_4w.c000008400TextEditor$WS_DIR$\src\hil\fet_generic\hil_generic432.c000001600TextEditor$WS_DIR$\src\fw\fet\halMain.c0000020700TextEditor$WS_DIR$\src\hil\fet_generic\hil_generic.c000009700TextEditor$WS_DIR$\src\hil\hil_Structs.h000005800TextEditor$WS_DIR$\src\hal\macros\Configure.c0000010800TextEditor$WS_DIR$\src\hal\macros\HilCommand.c0000017200TextEditor$WS_DIR$\src\fw\fet\Fet_cStartUp\cstartup.s43000009832323232TextEditor$WS_DIR$\src\hil\msp_fet\hilFpgaAccess.c0000039800TextEditor$WS_DIR$\src\hil\msp_fet\hilAdcControl.c000005027912791TextEditor$WS_DIR$\src\hal\JTAG_defs.h000008500TextEditor$WS_DIR$\src\dcdc\FetDcdc.c0000034100TextEditor$WS_DIR$\src\fw\fet\hal.c00000000TextEditor$WS_DIR$\src\hil\edt.h00000102719719TextEditor$WS_DIR$\src\fw\fet\HalGlobalVars.c00000000TextEditor$WS_DIR$\include\hal.h00000623401340116TextEditor$WS_DIR$\src\hal\macros\UssSyncConditional.c0000030203020480100000010000001 + + + + + + + iaridepm.enu1-2-2705379-2-2231210120313210421198438708417-2-22481922-2-219242501002083250501105208204409 + + + + + + iaridepm.enu1-2-2726328-2-2200200119048206612196429752066-2-21981682-2-216842001002381206612119048206612 + + diff --git a/Bios/settings/bios_core.wsdt b/Bios/settings/bios_core.wsdt new file mode 100644 index 0000000..81a70b8 --- /dev/null +++ b/Bios/settings/bios_core.wsdt @@ -0,0 +1,68 @@ + + + + + + + + Uifv3Updater/DebugUifHal/DebugUifHalMsp430/DebugUifBiosCore/Debug COM-IRQUifv3EepromUpdate/DebugUifv3Downgrader/DebugSafeCore/DebugUifHalMsp4301 + + + + + + + + + 628272727 + + + + + + + 20121632481 + 664941138201861 + + + + + + + TabID-19524-11592 + Workspace + Workspace + + + <ws> + + + + 0 + + + TabID-29749-11605 + Build + Build + + + TabID-6838-15177Find in FilesFind-in-FilesTabID-24111-21813Debug LogDebug-Log + + 0 + + + + + + TextEditor$WS_DIR$\src\hal\macros\GetJtagIdCodeArm.c000001119821982TextEditor$WS_DIR$\src\hal\macros\EnableDebugArm.c000003220662069TextEditor$WS_DIR$\src\hal\macros\HaltArm.c000002720622062TextEditor$WS_DIR$\src\hal\macros\MemApTransactionArm.c0000012658955895TextEditor$WS_DIR$\src\hal\macros\ReadAllCpuRegsArm.c000003621242124TextEditor$WS_DIR$\src\hal\macros\ResetArm.c000003021182118TextEditor$WS_DIR$\src\hal\macros\RunArm.c000003920642064TextEditor$WS_DIR$\src\hal\macros\ScanApArm.c000003320722072TextEditor$WS_DIR$\src\hal\macros\SingleStepArm.c000004220742074TextEditor$WS_DIR$\src\hal\macros\WaitForDebugHaltArm.c000004922942318TextEditor$WS_DIR$\src\hal\macros\WriteAllCpuRegsArm.c000006125462546TextEditor$WS_DIR$\include\hal.h0000018988598867TextEditor$WS_DIR$\src\hal\macros\DummyHal432.c000001624342434TextEditor$WS_DIR$\src\hal\macros\Configure.c000004227262726TextEditor$WS_DIR$\src\fw\uifv1\halMain430.c000005435263526TextEditor$WS_DIR$\src\hal\macros\DisableDebugArm.c000002922202220TextEditor$WS_DIR$\src\hil\uifv1\hil430.c0000040200TextEditor$WS_DIR$\objects\list\hilGeneric.s4300000104500TextEditor$WS_DIR$\src\fw\uifv1\hal430.c0000011400TextEditor$WS_DIR$\src\fw\uifv1\HalGlobalVars430.c000004728632863TextEditor$WS_DIR$\src\hil\uifv1\hilGeneric.c0000015866976697TextEditor$WS_DIR$\objects\list\UifHalMsp430.map000001172500TextEditor$WS_DIR$\src\hil\uifv1\hil432.c000002971298712987TextEditor$WS_DIR$\src\hil\uifv1\arch.h000002101146411464TextEditor$WS_DIR$\src\hil\uifv1\hil_4w.c0000050153085315TextEditor$WS_DIR$\src\hil\uifv1\hil_Swd.c0000013833423342TextEditor$WS_DIR$\src\hil\uifv1\hil_4w_432.c0000015061696169260100000010000001 + + + + + + + iaridepm.enu1-2-2794702-2-28301081432292967771366667712623-2-22781922-2-219242801002083250671432292967771 + + + + diff --git a/Bios/settings/eZ-FET_Bios.wsdt b/Bios/settings/eZ-FET_Bios.wsdt new file mode 100644 index 0000000..f58fd98 --- /dev/null +++ b/Bios/settings/eZ-FET_Bios.wsdt @@ -0,0 +1,72 @@ + + + + + + + + FET_Hal/eZ_FET_DebugFetDcdcController/eZ_FET_DebugFET_DCDC/eZ_FET_DebugFET_Bios/eZ_FET_DCDC_DebugeZ-FET_Hil/DebugFET_ComChannel/eZ_FET_DebugFET_Hal1 + + + + + + + + + 325272727 + + + + + + + 20121632481 + 211620 + + + + + + + TabID-12498-11928 + Workspace + Workspace + + + <ws> + + + + 0 + + + TabID-28244-12043 + Build + Build + + + TabID-166-11269Debug LogDebug-Log + + 1 + + + + + + 0100000010000001 + + + + + + + iaridepm.enu1-2-2749399-2-2229206119271206413208854752505-2-22041922-2-219242061002083206413119271206413 + + + + + + iaridepm.enu1-2-2726349-2-2200200119048206612208929752066-2-21981682-2-216842001002381206612119048206612 + + diff --git a/Bios/src/dcdc/FetDcdc.c b/Bios/src/dcdc/FetDcdc.c new file mode 100644 index 0000000..fb9f816 --- /dev/null +++ b/Bios/src/dcdc/FetDcdc.c @@ -0,0 +1,512 @@ +/* + * FetDcdc.c + * + * Copyright (C) 2012 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. + */ + +#include "msp430.h" +#include "FetDcdc.h" +#include "hw_compiler_specific.h" +#include "../fw/fet/FetVersion.h" + +#define DCDC_SIGNATURE 0xABBAABBAul + +#define CALIB_COUNT 10 +#define DELAYCOUNT 16384 + +const unsigned long dcdc_Signature_ @ "DCDCSIGNATURE" = DCDC_SIGNATURE; +#pragma required = dcdc_Signature_ + +const unsigned short dcdc_LayerVersion_ @ "DCDCLAYERVERSION" = DCDC_LAYER_VERSION; +#pragma required = dcdc_LayerVersion_ + +const unsigned short dcdc_LayerVersionCMP_ @ "DCDCLAYERVERSIONCMP" = DCDC_LAYER_VERSION_CMP; +#pragma required = dcdc_LayerVersionCMP_ + +DCDC_INFOS_t dcdcInfos_; +calibrationValues_t savedCalibrationValues; +const unsigned short countScV = 4; + +unsigned short dcdcLayerVersion =0; + +unsigned char* _UCBxCTL1 = 0 ; +unsigned char* _UCBxIFG = 0 ; +unsigned char* _UCBxTXBUF = 0 ; +unsigned char* _UCBxRXBUF = 0 ; +unsigned short _fetType = 0; + +void dcdc_Init(DCDC_INFOS_t* dcdcInfos_Pointer) +{ + // map funciotn pointers in FET dcdc layer + dcdcInfos_.dcdcCalibrate = dcdc_Calibrate; + dcdcInfos_.getSubMcuVersion = dcdc_getSubMcuVersion; + dcdcInfos_.getLayerVersion = dcdc_getLayerVersion; + dcdcInfos_.dcdcPowerDown = dcdc_PowerDown; + dcdcInfos_.dcdcSetVcc = dcdc_SetVcc; + dcdcInfos_.dcdcRestart = dcdc_Restart; + dcdcInfos_.dcdc_getCalibrationValues = dcdc_getCalibrationValues; + dcdcInfos_.getLayerVersionCmp = dcdc_getLayerVersionCmp; + // now copy getLayerVersion and retrun it to uper core layer + *dcdcInfos_Pointer = dcdcInfos_; + + _UCBxCTL1 = 0 ; + _UCBxIFG = 0 ; + _UCBxTXBUF = 0 ; + _UCBxRXBUF = 0 ; + _fetType = 0 ; +} + +short dcdc_Restart(unsigned short fetType_) +{ + _fetType = fetType_; + if(fetType_ == eZ_FET_WITH_DCDC || fetType_ == eZ_FET_WITH_DCDC_NO_FLOWCTL || fetType_ == eZ_FET_WITH_DCDC_V2x) // this is the eZ-FET tool id + { + P6DIR &= ~BIT4; + + P6DIR |= BIT5; + P6OUT &= ~BIT5; + + // TEST pin sub mcu + P6DIR &= ~BIT7; + P6OUT &= ~BIT7; + //togle RST pin to restart sub mcu + P6DIR |= BIT6; + __delay_cycles(600000); + P6OUT &= ~BIT6; + __delay_cycles(600000); + P6OUT |= BIT6; + P6DIR &= ~BIT6; + // Port3 + // P3.0 <-> HOST_SDA + // P3.1 -> HOST_SCL + // P3.2 -> N/C + // P3.3 -> UART_RXD N/C + // P3.4 <- UART_TXD N/C + // P3.5 -> n/c + // P3.6 -> n/c + // P3.7 -> n/c + P3SEL = (BIT0+BIT1); + // Configure I2C + + _UCBxCTL1 = (unsigned char*)&UCB0CTL1; + _UCBxIFG = (unsigned char*)&UCB0IFG; + _UCBxTXBUF = (unsigned char*)&UCB0TXBUF; + _UCBxRXBUF = (unsigned char*)&UCB0RXBUF; + + *_UCBxCTL1 |= UCSWRST; // Enable SW reset + UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode + *_UCBxCTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset + UCB0BR0 = 0xc8;//25;//12; // fSCL = SMCLK/25 = ~100kHz + UCB0BR1 = 0; + UCB0I2CSA = 0x48; // Slave Address is 048h + *_UCBxCTL1 &= ~UCSWRST; // Clear SW reset, resume operation + __delay_cycles(600000); + + savedCalibrationValues.vcc = 0; + savedCalibrationValues.valid = 0; + return fetType_; + } + else if(fetType_ == eZ_FET_NO_DCDC) // else it the MSP-FET + { + return eZ_FET_NO_DCDC; + } + else if(fetType_ == MSP_FET_WITH_DCDC || fetType_ == MSP_FET_WITH_DCDC_V2x) + { + #ifdef MSP_FET + // Port7 + // P7.0 -> n/c + // P7.1 -> n/c + // P7.2 <- XT2IN + // P7.3 -> XT2OUT + // P7.4 -> DCDC_TEST + // P7.5 -> DCDC_RST (0 = reset) + // P7.6 -> VCC_DT_REF + // P7.7 -> VCC_DCDC_REF + // TEST pin sub mcu low + + P7DIR &= ~BIT4; + P7OUT &= ~BIT4; + //togle RST pin to restart sub mcu + P7DIR |= BIT5; + __delay_cycles(600000); + P7OUT &= ~BIT5; + __delay_cycles(600000); + P7OUT |= BIT5; + P7DIR &= ~BIT5; + // Port8 + // P8.0 -> VCC_DT2TRGT_CTRL (control signal to switches to provide debug signals to target via JTAG.x) + // P8.1 -> UART_? + // P8.2 -> UART_TXD + // P8.3 <- UART_RXD + // P8.4 <- DCDC_IO0 + // P8.5 -> HOST_SDA + // P8.6 -> HOST_SCL + // P8.7 -> VCC_SUPPLY2TRGT_CTRL (DCDC VCC to target VCC) + + P8DIR |= (BIT5+BIT6); // set pins to output direction + P8SEL |= (BIT5+BIT6); // use USCI for i2c communication + + _UCBxCTL1 = (unsigned char*)&UCB1CTL1; + _UCBxIFG = (unsigned char*)&UCB1IFG; + _UCBxTXBUF = (unsigned char*)&UCB1TXBUF; + _UCBxRXBUF = (unsigned char*)&UCB1RXBUF; + + *_UCBxCTL1 |= UCSWRST; // Enable SW reset + UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode + *_UCBxCTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset + UCB1BR0 = 20; // fSCL = SMCLK/20 = ~100kHz + UCB1BR1 = 0; + UCB1I2CSA = 0x48; // Slave Address is 048h + * _UCBxCTL1 &= ~UCSWRST; // Clear SW reset, resume operation + __delay_cycles(600000); + + //Configure port mapper and P2 for current measuring + P2DIR &= ~BIT0; + P2SEL |= BIT0; + _DINT_FET(); + PMAPKEYID = PMAPKEY; + PMAPCTL |= PMAPRECFG; + P2MAP0 = PM_TB0CLK; + PMAPKEYID = 0; + _EINT_FET(); + + dcdc_SetVcc(3300); + + savedCalibrationValues.vcc = 0; + savedCalibrationValues.valid = 0; + + #endif + return fetType_; + } + return -1; +} + +#pragma optimize = low +short dcdc_SetVcc(unsigned short vcc) +{ + short success = dcdc_Send(CMD_CONFIGURE, vcc); + if(!success) + { + return -1; + } + return 0; +} + +/* TBD make ADC and timer config configurable via pointers like or I2c communication */ +void dcdc_RunCalibrate(unsigned long *ticks, unsigned long *time, unsigned short count) +{ + unsigned short i0 = 0, i1 = 0; + unsigned short t0 = 0, t1 = 0; + unsigned short i = 0; + + *ticks = 0; + *time = 0; + +#ifdef MSP_FET + #define PULSES TB0R +#else + #define PULSES TA2R +#endif + + if(_fetType == eZ_FET_WITH_DCDC_NO_FLOWCTL || _fetType == eZ_FET_WITH_DCDC ||_fetType == MSP_FET_WITH_DCDC + || _fetType == MSP_FET_WITH_DCDC_V2x || _fetType == eZ_FET_WITH_DCDC_V2x) + { + _DINT_FET(); + + for(i = 0; i < count; ++i) + { + TA0CTL |= TACLR + MC__CONTINOUS + TAIE; // START the timer in free-running mode + + i0 = PULSES; + t0 = TA0R; + + // Sample VCCout + ADC12CTL0 &= ~ADC12ENC; // Disable conversion, write controls + ADC12MCTL0 = ADC12SREF_1 + 1; // select Vref and analog channel Ax + ADC12CTL0 |= ADC12ENC; // Enable conversions + + ADC12IFG &= ~BIT0; + ADC12CTL0 |= ADC12SC; // Start conversions + while ((ADC12IFG & BIT0) == 0); // wait until conversion is done + ADC12IFG &= ~BIT0; + + // Wait for some time + for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j); + + i1 = PULSES; + t1 = TA0R; + + *time += (t1 - t0); + *ticks += (i1 - i0); + } + _EINT_FET(); + } +} +#pragma optimize = low +void dcdc_getCalibrationValues(unsigned short vcc, unsigned short resistor, unsigned short resCount, unsigned long *ticks, unsigned long *time) +{ + unsigned short currentResCount = 0; + + for(currentResCount = 0; currentResCount < resCount; currentResCount++) + { + if(savedCalibrationValues.resValues[currentResCount].resistor == resistor) + { + *time = savedCalibrationValues.resValues[currentResCount].time; + *ticks = savedCalibrationValues.resValues[currentResCount].ticks; + } + } +} +#pragma optimize = low +short dcdc_Calibrate(unsigned short resistors[5], unsigned short resCount, unsigned short vcc) +{ + short success = 0; + unsigned int count = CALIB_COUNT; + unsigned long internalTicks = 0; + unsigned long internalTime = 0; + unsigned short currentResCount = 0; + + if((savedCalibrationValues.vcc == vcc) && (savedCalibrationValues.valid == 1)) + { + return 0; + } + + savedCalibrationValues.vcc = vcc; + savedCalibrationValues.valid = 0; + + for(currentResCount = 0; currentResCount < resCount; currentResCount++) + { + unsigned short resistor = resistors[currentResCount]; + + if (resistor == 0) + { + count = CALIB_COUNT*5; + } + + if (resistor == 4) + { + count = CALIB_COUNT*2; + } + + // switch off Overcurrent detection +#ifdef MSP_FET + P5OUT |= BIT7; +#else + P6OUT |= BIT5; +#endif + + success = dcdc_Send(CMD_CALLOAD, resistor); + + if(!success) + { + return -1; + } + // Wait for some time + for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j); + for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j); + for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j); + for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j); + + dcdc_RunCalibrate(&internalTicks, &internalTime, count); + + savedCalibrationValues.resValues[currentResCount].ticks = internalTicks; + savedCalibrationValues.resValues[currentResCount].time = internalTime; + savedCalibrationValues.resValues[currentResCount].resistor = resistor; + + // Reset the calibration resistor + success = dcdc_Send(CMD_CALLOAD, 0); + for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j); + + // switch on Overcurrent detection +#ifdef MSP_FET + P5OUT &= ~BIT7; +#else + P6OUT &= ~BIT5; +#endif + } + if(!success) + { + savedCalibrationValues.valid = 0; + return -1; + } + + savedCalibrationValues.valid = 1; + return 0; +} +#pragma optimize = low +short dcdc_getSubMcuVersion() +{ + unsigned int version = 0; + + //togle RST pin to restart sub mcu + #ifdef MSP_FET + P7DIR |= BIT5; + __delay_cycles(600000); + P7OUT &= ~BIT5; + __delay_cycles(600000); + P7OUT |= BIT5; + P7DIR &= ~BIT5; + #endif + + dcdc_Receive(&version); + return version; +} + +short dcdc_getLayerVersion() +{ + return DCDC_LAYER_VERSION; +} + +short dcdc_getLayerVersionCmp() +{ + return DCDC_LAYER_VERSION_CMP; +} + +short dcdc_PowerDown() +{ + if(!dcdc_Send(CMD_POWERDOWN, SDIO_POWERDOWN_KEY)) + { + return -1; + } + return 0; +} + +#pragma optimize = low +// Generic send function +short dcdc_Send(unsigned int cmd, unsigned int data) +{ + unsigned char TxData[3]; + unsigned int timeout; + + TxData[0] = cmd; + TxData[1] = (unsigned char)(data>>8); // High byte + TxData[2] = data&0xFF; // Low bytes + + // Send start condition and slave address + *_UCBxCTL1 |= UCTR + UCTXSTT; // Master Tx and Start Condition + __delay_cycles(5000); + if(*_UCBxIFG & UCNACKIFG) + { + // Nack received + return (0); + } + + // Send byte 0 + *_UCBxTXBUF = TxData[0]; + __delay_cycles(5000); + if(*_UCBxIFG & UCNACKIFG) + { + // Nack received + return (0); + } + + // Send byte 1 + *_UCBxTXBUF = TxData[1]; + __delay_cycles(5000); + if(*_UCBxIFG & UCNACKIFG) + { + // Nack received + return (0); + } + + // Send byte 3 + *_UCBxTXBUF = TxData[2]; + + //Poll for transmit interrupt flag. + timeout = 10000; + while ((!(*_UCBxIFG & UCTXIFG)) && (--timeout>0)); + if (timeout==0) + { + // Error + return (0); + } + + //Send stop condition. + *_UCBxCTL1 |= UCTXSTP; + + return (1); + +} + +#pragma optimize = low +// Generic receive function +short dcdc_Receive(unsigned int *data_read) +{ + unsigned char RxBuffer[2]; + unsigned int timeout; + unsigned int val; + + timeout = 10000; + while ((*_UCBxCTL1 & UCTXSTP) && (--timeout>0)); // Ensure stop condition got sent + if (timeout==0) + { + // Slave did not send in time + return (0); + } + + *_UCBxCTL1 &= ~UCTR; // Master receives + *_UCBxCTL1 |= UCTXSTT; // Start transmit enable + + // Receive byte 0 + timeout = 10000; + while ((((*_UCBxIFG&UCRXIFG)==0)) && (--timeout>0)); + if (timeout==0) + { + // Slave did not send in time + return (0); + } + *_UCBxIFG &= ~UCRXIFG; + RxBuffer[0] = (unsigned char)*_UCBxRXBUF; // Read RX buffer byte + + // Receive byte 1 + *_UCBxCTL1 |= UCTXSTP; // Generate I2C stop condition + timeout = 10000; + while ((*_UCBxCTL1& UCTXSTP) && (--timeout>0)); // Wait for Stop + if (timeout==0) + { + // Slave did not send in time + return (0); + } + timeout = 10000; + while ((((*_UCBxIFG&UCRXIFG)==0)) && (--timeout>0)); // Wait for byte RX + if (timeout==0) + { + // Slave did not send in time + return (0); + } + RxBuffer[1] = (unsigned char)*_UCBxRXBUF; // Read RX buffer byte + + val = ((unsigned int) RxBuffer[0])<<8 ; + val += ((unsigned int) RxBuffer[1]); + *data_read=val; + + return (1); +} diff --git a/Bios/src/dcdc/FetDcdc.h b/Bios/src/dcdc/FetDcdc.h new file mode 100644 index 0000000..bb065ae --- /dev/null +++ b/Bios/src/dcdc/FetDcdc.h @@ -0,0 +1,94 @@ +/* + * FetDcdc.h + * + * Copyright (C) 2012 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. + */ + +//! \ingroup MODULBIOS +//! \file FetDcdc.h +//! \brief +//! +//! \author Berenbrinker Florian 02/01/2012) +#ifndef _FetDcdc_H_ +#define _FetDcdc_H_ + +#define CMD_CONFIGURE 0x01 +#define CMD_SETPWM 0x02 +#define CMD_CALLOAD 0x03 +#define CMD_POWERDOWN 0x04 + +// Defines +#define SDIO_SLAVE_ADDRESS (0x8200) +#define SDIO_POWERDOWN_KEY (0x5a5a) +#define SDIO_DELAY_AFTER_SENDING (1000u) + +struct calibrationResistors +{ + unsigned long time; + unsigned long ticks; + unsigned short resistor; +}; +typedef struct calibrationResistors calibrationResistors_t; + +struct calibrationValues +{ + unsigned short vcc; + calibrationResistors_t resValues[5]; + unsigned short valid; +}; +typedef struct calibrationValues calibrationValues_t; + +struct DCDC_INFOS +{ + short (*getSubMcuVersion)(void); + short (*getLayerVersion)(void); + short (*dcdcCalibrate)(unsigned short resistor[4], unsigned short resCount, unsigned short vcc); + short (*dcdcPowerDown)(void); + short (*dcdcSetVcc)(unsigned short vcc); + short (*dcdcRestart)(unsigned short fetType_); + void (*dcdc_getCalibrationValues)(unsigned short vcc, unsigned short resistor, unsigned short resCount, unsigned long *ticks, unsigned long *time); + short (*getLayerVersionCmp)(void); +}; +typedef struct DCDC_INFOS DCDC_INFOS_t; + +void dcdc_Init(DCDC_INFOS_t* dcdcInfos_Pointer); +short dcdc_Calibrate(unsigned short resistor[5], unsigned short resCount, unsigned short vcc); +short dcdc_PowerDown(); +short dcdc_SetVcc(unsigned short vcc); +short dcdc_getSubMcuVersion(); +short dcdc_getLayerVersion(); +short dcdc_getLayerVersionCmp(); +short dcdc_Restart(unsigned short fetType_); +short dcdc_Send(unsigned int cmd, unsigned int data); +short dcdc_Receive(unsigned int *data_read); +void dcdc_getCalibrationValues(unsigned short vcc, unsigned short resistor, unsigned short resCount, unsigned long *ticks, unsigned long *time); +#endif diff --git a/Bios/src/dcdc/cstartup_dcdc.s43 b/Bios/src/dcdc/cstartup_dcdc.s43 new file mode 100644 index 0000000..341944a --- /dev/null +++ b/Bios/src/dcdc/cstartup_dcdc.s43 @@ -0,0 +1,453 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +#ifdef DISABLE_WATCHDOG +#include "msp430.h" +#endif + + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + // The CPU40 warning is issued when a Jxx instruction is place + // at the end of a segment part. However, this case is safe, + // as we have control of what will be placed right after the + // instruction. + SUPPRESS_CPU40_WARNING + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + RSEG DATA16_N +saved_stack DS 2 + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + + // -------------------- + // Initialize SP to point to the top of the stack. + // + + MOV SP, saved_stack + + pushx R4 + pushx R5 + pushx R6 + pushx R7 + pushx R8 + pushx R9 + pushx R10 + pushx R11 + pushx R12 + pushx R13 + pushx R14 + pushx R15 + + //MOV #SFE(CSTACK), SP + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + MOV #SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XCALL #__data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + MOVA #SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XCALL #__data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy + +#endif // IGNORE_DATA16_DATA + +#endif // MSP430X + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN dcdc_Init + EXTERN exit + +?cstart_call_main: + + popx R15 + popx R14 + popx R13 + popx R12 + popx R11 + popx R10 + popx R9 + popx R8 + popx R7 + popx R6 + popx R5 + popx R4 + + movx.a #dcdc_Init, PC + MOV saved_stack,SP + //XRET // indicates that the normal + //XCALL #exit + + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC32 __program_start + + ENDMOD + + +// --------------------------------------------------------- +// ?CPU30_OFFSET +// +// The compiler compensates for the CPU30 hardware bug by adding or +// subtracting the symbol ?CPU30_OFFSET from certain immediates. Here, +// it is defined to the default value zero (0), for when the device is +// not affected by CPU30. If the device is affected, the value must be +// set to two (2) using a linker command line override: +// +// -D?CPU30_OFFSET=2. +// +// The override is normally placed in the device-specific .xcl file. + + MODULE ?cpu30_offset + + PUBLIC ?CPU30_OFFSET + +?CPU30_OFFSET EQU 0 + + ENDMOD + + END diff --git a/Bios/src/fpga_update/DirectC/README.txt b/Bios/src/fpga_update/DirectC/README.txt new file mode 100644 index 0000000..f3776e5 --- /dev/null +++ b/Bios/src/fpga_update/DirectC/README.txt @@ -0,0 +1,25 @@ +Please download DirectC from http://www.actel.com/download/program_debug/directc/dc27.aspx + +Place the following files in this directory. + +dpalg.c +dpalg.h +dpchain.c +dpchain.g +dpcom.c +dpcom.h +dpcore.c +dpcore.h +dpdef.h +dpfrom.c +dpfrom.h +dpjtag.c +dpjtag.h +dpnvm.c +dpnvm.h +dpsecurity.c +dpsecurity.h +dpuser.c +dpuser.h +dputil.c +dputil.h diff --git a/Bios/src/fpga_update/FpgaUpdate.c b/Bios/src/fpga_update/FpgaUpdate.c new file mode 100644 index 0000000..93fb6a7 --- /dev/null +++ b/Bios/src/fpga_update/FpgaUpdate.c @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2013 - 2014 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. + */ + +#include "dpuser.h" +#include "dpalg.h" +#include "dpdef.h" +#include "FpgaVersion.h" +#include "fpga_top.h" +#include "arch.h" + +unsigned char UpdateFpga(void); +void configureJtagPort(void); + +const unsigned short fpga_Version_ @ "FPGAVERSION" = FPGA_VERSION; +#pragma required=fpga_Version_ +const unsigned long fpga_Signature_ @ "HALSIGNATURE" = FPGA_SIGNATURE; +#pragma required=fpga_Signature_ + +#pragma required=UpdateFpga +unsigned char UpdateFpga(void) +{ + DPUCHAR status; + + // Configure JTAG port for communication with FPGA + configureJtagPort(); + + // Select FPGA programming through GPIO pins + hardware_interface = GPIO_SEL; + enable_mss_support = FALSE; + + // Set the fpga bitstream as image for programming via DirectC + image_buffer = (DPUCHAR*)top; + + // Start programming + // At first, verify whether the FPGA already contains the correct bitstream + Action_code = DP_VERIFY_ACTION_CODE; + status = dp_top(); + + if(status != DPE_SUCCESS) // If verification fails, the FPGA needs to be reprogrammed + { + + // Erase FPGA memory + Action_code = DP_ERASE_ACTION_CODE; + status = dp_top(); + if(status != DPE_SUCCESS) + { + return status; + } + + // Program FPGA bitstream + Action_code = DP_PROGRAM_ACTION_CODE; + status = dp_top(); + if(status != DPE_SUCCESS) + { + return status; + } + + // Verify FPGA memory + Action_code = DP_VERIFY_ACTION_CODE; + status = dp_top(); + if(status != DPE_SUCCESS) + { + return status; + } + } + + // Reset the FPGA + P9OUT |= BIT4; + __delay_cycles(100); + P9OUT &= ~BIT4; + + return status; +} + +void configureJtagPort(void) +{ + *(_Jtag_FPGA.DIRECTION) = _Jtag_FPGA.TCK | + _Jtag_FPGA.TMS | + _Jtag_FPGA.TDI | + _Jtag_FPGA.TST; +} diff --git a/Bios/src/fpga_update/FpgaVersion.h b/Bios/src/fpga_update/FpgaVersion.h new file mode 100644 index 0000000..5f04661 --- /dev/null +++ b/Bios/src/fpga_update/FpgaVersion.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2013 - 2014 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 _FPGA_VERSION_H_ +#define _FPGA_VERSION_H_ + +#define FPGA_VERSION 0x016 +#define FPGA_SIGNATURE 0xADACADAC + +#endif /* _FPGA_VERSION_H_ */ diff --git a/Bios/src/fpga_update/cstartup_fpgaUpdate.s43 b/Bios/src/fpga_update/cstartup_fpgaUpdate.s43 new file mode 100644 index 0000000..77a1e51 --- /dev/null +++ b/Bios/src/fpga_update/cstartup_fpgaUpdate.s43 @@ -0,0 +1,415 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +#ifdef DISABLE_WATCHDOG +#include "msp430.h" +#endif + + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + pushx R4 + pushx R5 + pushx R6 + pushx R7 + pushx R8 + pushx R9 + pushx R10 + pushx R11 + pushx R12 + pushx R13 + pushx R14 + pushx R15 + // -------------------- + // Initialize SP to point to the top of the stack. + // +// no stack pointer, stack pointer is administered from bios +// MOV #SFE(CSTACK), SP + + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + NOP + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + MOV #SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XCALL #__data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + MOVA #SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XCALL #__data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy + +#endif // IGNORE_DATA16_DATA + +#endif // MSP430X + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN UpdateFpga +?cstart_call_main: +// XCALL + popx R15 + popx R14 + popx R13 + popx R12 + popx R11 + popx R10 + popx R9 + popx R8 + popx R7 + popx R6 + popx R5 + popx R4 + + movx.a #UpdateFpga,PC + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC32 __program_start + + ENDMOD + + END diff --git a/Bios/src/fpga_update/fpga_top.h b/Bios/src/fpga_update/fpga_top.h new file mode 100644 index 0000000..551c957 --- /dev/null +++ b/Bios/src/fpga_update/fpga_top.h @@ -0,0 +1,10865 @@ +/* + * Copyright (C) 2007 - 2016 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. + */ + +/* http://srecord.sourceforge.net/ */ +const unsigned char top[] = +{ +0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x65, 0x72, 0x20, 0x31, 0x31, 0x2E, +0x35, 0x2E, 0x33, 0x2E, 0x31, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x45, 0x9D, 0xFA, 0x01, 0x00, 0x00, 0x00, 0xCF, 0x21, 0xA5, 0x03, 0x01, +0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFB, +0x06, 0x04, 0xDC, 0x04, 0x34, 0x02, 0x00, 0x00, 0x06, 0x01, 0x7B, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x84, 0x00, 0x00, 0x00, 0x47, +0x00, 0x00, 0x00, 0x03, 0xCB, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x04, 0xCF, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0xD3, 0x00, +0x00, 0x00, 0x60, 0xF9, 0x01, 0x00, 0x06, 0x33, 0xFA, 0x01, 0x00, 0x68, +0x00, 0x00, 0x00, 0x87, 0xFD, 0xA5, 0x3F, 0x9C, 0x1F, 0x66, 0x02, 0x01, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x99, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, +0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x40, 0x00, +0x40, 0x00, 0x10, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, +0x00, 0x00, 0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, +0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, +0x80, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, +0x02, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x02, 0x00, 0x00, +0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x04, 0x00, 0x00, +0x08, 0x00, 0x02, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x02, +0x00, 0x00, 0x00, 0x6D, 0x93, 0xB6, 0x06, 0x00, 0x00, 0xCC, 0xFF, 0xFF, +0x9F, 0x24, 0x49, 0x52, 0x93, 0xA4, 0x49, 0x06, 0x00, 0x00, 0xF8, 0xFF, +0xFF, 0x7F, 0x49, 0x92, 0xE4, 0x6D, 0xDB, 0xB6, 0x00, 0x00, 0x00, 0xF0, +0xFF, 0xFF, 0x8F, 0x24, 0x49, 0x12, 0xDA, 0xA6, 0x69, 0x00, 0x00, 0x00, +0xF0, 0xFF, 0xFF, 0x0F, 0x49, 0x92, 0x24, 0x6D, 0xDA, 0xA6, 0x00, 0x00, +0x00, 0xF0, 0xFF, 0xFF, 0x8F, 0x24, 0x49, 0x12, 0xDA, 0xA6, 0x6D, 0x00, +0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0x49, 0x92, 0x24, 0x69, 0x93, 0x24, +0x02, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x9F, 0x24, 0x49, 0x72, 0xDB, 0x24, +0x69, 0x02, 0x00, 0x00, 0xF9, 0xFF, 0xFF, 0x1B, 0x49, 0x92, 0x64, 0x00, +0x00, 0x00, 0x91, 0x24, 0x49, 0x62, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x49, 0x92, 0x80, 0x24, 0x49, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x42, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x90, 0x24, 0x49, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x42, 0x92, 0x24, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x90, 0x24, +0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x91, 0x24, 0x49, 0x40, +0x92, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, +0x90, 0x24, 0x49, 0x02, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x01, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, +0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x49, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xD2, 0xB6, 0x96, 0x24, 0x4B, 0x0E, 0x49, 0x92, +0x94, 0x00, 0x00, 0x40, 0x93, 0xB4, 0x6D, 0x2E, 0x49, 0xB6, 0x59, 0x92, +0x24, 0x79, 0x00, 0x00, 0xC0, 0x6D, 0xDB, 0xB6, 0xB0, 0x2D, 0xCB, 0x22, +0x49, 0x92, 0x04, 0x00, 0x00, 0x00, 0xDB, 0xB6, 0x6D, 0x6C, 0xDB, 0xB6, +0x41, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x6D, 0xDB, 0xB6, 0xB0, 0x2D, +0xDB, 0x22, 0x49, 0x92, 0x04, 0x00, 0x00, 0x00, 0xDB, 0xB6, 0x6D, 0x6C, +0xD9, 0x96, 0x41, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x6D, 0x93, 0x24, +0xB6, 0x25, 0xC9, 0x2E, 0x49, 0x92, 0x1C, 0x00, 0x00, 0x60, 0xDB, 0x26, +0x69, 0x66, 0x4B, 0x92, 0x49, 0x92, 0x24, 0x19, 0x00, 0x00, 0x60, 0x69, +0x9B, 0x24, 0xB7, 0x6D, 0xD9, 0x4E, 0xDB, 0xB6, 0x9D, 0x6D, 0x9B, 0x76, +0xDB, 0x26, 0x49, 0x66, 0xDB, 0x92, 0xD8, 0xB6, 0x6D, 0x7B, 0xDA, 0x36, +0xC9, 0x49, 0x92, 0x24, 0x95, 0x64, 0x59, 0x62, 0xDB, 0xB6, 0x8D, 0x49, +0x9A, 0x26, 0x92, 0x24, 0x49, 0x24, 0x49, 0x92, 0xD0, 0xB6, 0x6D, 0x4B, +0x92, 0x24, 0x09, 0x49, 0x92, 0x24, 0x95, 0x64, 0x49, 0x62, 0xDB, 0xB6, +0x8D, 0x49, 0x9A, 0x24, 0x92, 0x24, 0x49, 0x24, 0x4B, 0xB2, 0xD0, 0xB6, +0x6D, 0x4B, 0xD2, 0x24, 0x0D, 0x49, 0xDA, 0x36, 0x93, 0x6C, 0x5B, 0x6E, +0xDB, 0xB6, 0x1D, 0x49, 0xDB, 0x66, 0x92, 0xB4, 0x4D, 0x2E, 0xD9, 0xB6, +0xD9, 0xB6, 0x6D, 0x5B, 0x93, 0xB6, 0x6D, 0x00, 0x00, 0x00, 0x20, 0x49, +0x92, 0x20, 0x80, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, +0x92, 0x24, 0x81, 0x24, 0x41, 0x02, 0x01, 0x80, 0x24, 0x00, 0x00, 0x00, +0x24, 0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x24, 0x41, 0x10, 0x00, 0x00, +0x00, 0x48, 0x92, 0x24, 0x11, 0x00, 0x41, 0x00, 0x49, 0x92, 0x24, 0x00, +0x00, 0x00, 0x24, 0x49, 0x92, 0x00, 0x10, 0x00, 0x01, 0x24, 0x41, 0x12, +0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x11, 0x00, 0x01, 0x00, 0x09, 0x92, +0x20, 0x00, 0x00, 0x80, 0x24, 0x49, 0x92, 0x40, 0x80, 0x24, 0x81, 0x24, +0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x00, 0x20, 0x49, 0x00, +0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x24, 0x01, 0x00, 0x00, 0x00, +0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x24, 0x49, 0x90, 0x08, 0x00, +0x00, 0x00, 0x49, 0x92, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x04, 0x40, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x40, 0x00, +0x10, 0x20, 0x49, 0x02, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x10, +0x00, 0x00, 0x48, 0x12, 0x08, 0x00, 0x00, 0x00, 0x49, 0x92, 0x64, 0x00, +0x00, 0x00, 0x15, 0x49, 0xDA, 0x4E, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x80, 0x26, 0x81, 0x24, 0x49, 0x42, 0x24, 0x00, +0x80, 0x00, 0x00, 0x00, 0xB5, 0x6D, 0xDB, 0x42, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x9B, 0xA6, 0x91, 0x24, 0x49, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x69, 0x9B, 0x42, 0x92, 0x24, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x9B, 0xB6, 0x91, 0x24, +0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x4D, 0x92, 0x4C, +0x92, 0x24, 0x01, 0x00, 0x24, 0x21, 0x00, 0x00, 0x00, 0x6C, 0x93, 0xA4, +0x91, 0x24, 0x49, 0x02, 0x00, 0x49, 0x02, 0xDA, 0xB6, 0x6D, 0x78, 0xB2, +0x6D, 0x97, 0x24, 0x49, 0x62, 0xFF, 0xFF, 0xFF, 0xB6, 0x6D, 0xDB, 0xF1, +0x7F, 0xDB, 0x26, 0x49, 0x92, 0x84, 0xDB, 0xFF, 0x3F, 0xDB, 0xB6, 0x6D, +0xD8, 0xB6, 0x6D, 0x93, 0x24, 0x49, 0xC2, 0xFF, 0xFF, 0x3F, 0xB6, 0x6D, +0xDB, 0xB4, 0x6D, 0xDB, 0x22, 0x49, 0x92, 0xC4, 0xFF, 0xFF, 0x3F, 0xDB, +0xB6, 0x6D, 0xD8, 0xB6, 0x6D, 0x93, 0x24, 0x49, 0xC2, 0xFF, 0xFF, 0x3F, +0xB6, 0x6D, 0xDB, 0xB4, 0x6D, 0xDB, 0x22, 0x49, 0x92, 0xC4, 0xFF, 0xFF, +0x3F, 0xDB, 0xB6, 0x6D, 0xD8, 0xB6, 0x6D, 0x95, 0x24, 0x49, 0xE2, 0xFF, +0xDB, 0xDE, 0xB6, 0x6D, 0x9B, 0xB5, 0x6D, 0xDB, 0x26, 0x49, 0x92, 0xC4, +0xFF, 0xB6, 0x1D, 0xDA, 0xB6, 0x6D, 0xCD, 0xD6, 0xB6, 0xD9, 0xB6, 0x6D, +0xFB, 0x49, 0xB6, 0xED, 0xF6, 0x6D, 0xDB, 0xDD, 0xA6, 0x6D, 0xAF, 0x6D, +0xDB, 0xC6, 0x92, 0x6C, 0xDB, 0xDB, 0xB6, 0x6D, 0x6D, 0xDB, 0xB6, 0xD1, +0xB6, 0x6D, 0x4B, 0xDB, 0xB6, 0x2D, 0xB6, 0x6D, 0xDB, 0xD8, 0xB6, 0x6D, +0xB3, 0x6D, 0xDB, 0xC6, 0xB6, 0x6D, 0x1B, 0xDB, 0xB6, 0x6D, 0x6D, 0xDB, +0xB6, 0xD1, 0xB6, 0x6D, 0x4B, 0xDB, 0xB6, 0x2D, 0xB6, 0x6D, 0xDB, 0xD8, +0xB6, 0x6D, 0xB3, 0x6D, 0xDB, 0xC6, 0xB6, 0x6D, 0x1B, 0xDB, 0xB6, 0x6D, +0x6D, 0x9B, 0xA4, 0xDB, 0xB6, 0x6D, 0x73, 0xDB, 0x92, 0xEC, 0xB6, 0x6D, +0x9F, 0xD9, 0x26, 0x49, 0xBF, 0x6D, 0xDB, 0xC6, 0xB6, 0x24, 0x79, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x04, 0x02, 0x00, 0x00, 0x12, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, +0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x04, 0x40, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x01, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, +0x4B, 0x92, 0x24, 0x41, 0x92, 0x28, 0x48, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x00, 0x24, 0x4A, 0x90, 0x24, 0x41, 0x90, 0x24, 0x79, 0x92, 0x24, +0x89, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x60, 0x59, 0x96, 0x04, 0x49, +0x92, 0x24, 0x49, 0x92, 0x2C, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0xB2, +0x0C, 0x49, 0x92, 0x24, 0x4B, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0xB2, +0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x20, 0x4A, 0x92, 0x24, +0x41, 0x92, 0x64, 0x59, 0x92, 0x24, 0x09, 0x25, 0x4B, 0x92, 0x20, 0x41, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x79, 0x82, 0x24, 0x09, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x60, 0x59, 0x96, 0x04, 0x08, 0x82, 0x24, 0x49, 0x92, +0x2C, 0x48, 0x92, 0x04, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0xB2, 0x0C, 0x49, 0x12, 0x04, +0x4B, 0x92, 0x24, 0x40, 0x92, 0x24, 0x41, 0xB2, 0x24, 0x49, 0x12, 0x24, +0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, +0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x64, 0x59, +0x92, 0x24, 0x08, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x48, 0x82, 0x00, 0x00, 0x00, 0x00, 0x08, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x20, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x48, 0x82, 0x00, 0x00, 0x00, +0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x90, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x58, 0x21, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, +0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x08, 0x82, 0x04, 0x09, 0x12, 0x28, 0x49, 0x02, +0x04, 0x49, 0x90, 0x20, 0x49, 0x02, 0x00, 0x48, 0x02, 0x24, 0x40, 0x02, +0x24, 0x59, 0x82, 0x24, 0x89, 0x24, 0x41, 0x92, 0x00, 0x01, 0x10, 0x20, +0x09, 0x92, 0x04, 0x01, 0x12, 0x04, 0x49, 0x92, 0x24, 0x48, 0x00, 0x04, +0x40, 0x12, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x82, 0x00, 0x01, +0x10, 0x20, 0x49, 0x92, 0x04, 0x41, 0x12, 0x24, 0x48, 0x82, 0x24, 0x40, +0x00, 0x24, 0x40, 0x92, 0x24, 0x49, 0x92, 0x24, 0x08, 0x24, 0x49, 0x82, +0x00, 0x01, 0x90, 0x28, 0x49, 0x92, 0x04, 0x41, 0x12, 0x64, 0x49, 0x92, +0x24, 0x42, 0x80, 0x00, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, +0x00, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x00, 0x49, 0x92, 0x64, +0x48, 0x80, 0x04, 0x48, 0x92, 0x24, 0x41, 0x82, 0x04, 0x59, 0x00, 0x24, +0x81, 0x20, 0x49, 0x02, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x08, +0x92, 0x24, 0x49, 0x82, 0x20, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x20, 0x41, 0x92, +0x04, 0x49, 0x12, 0x24, 0x41, 0x80, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, +0x04, 0x49, 0x90, 0x24, 0x09, 0x04, 0x09, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x02, 0x00, 0x00, +0x90, 0x24, 0x49, 0x52, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x0C, 0x00, +0x00, 0x10, 0x49, 0x92, 0x64, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x02, +0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, +0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x91, 0x24, +0x49, 0x02, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, +0x91, 0x24, 0x49, 0x02, 0x00, 0x00, 0x90, 0x24, 0x49, 0x52, 0x00, 0x00, +0x00, 0x24, 0x49, 0x92, 0x0C, 0x00, 0x00, 0x10, 0x49, 0x92, 0x64, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x01, 0x12, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x20, 0x00, 0x00, 0x00, 0x48, +0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x01, 0x10, 0x02, 0x00, 0x00, 0x49, 0x92, 0x24, 0x03, 0x00, +0x00, 0x48, 0x92, 0x24, 0x39, 0x00, 0x00, 0x80, 0x92, 0x24, 0x49, 0x00, +0x00, 0x00, 0x90, 0x24, 0x49, 0x22, 0x00, 0x00, 0x00, 0x48, 0x82, 0x24, +0x21, 0x00, 0x00, 0x00, 0x92, 0x20, 0x89, 0x00, 0x08, 0x00, 0x92, 0x24, +0x49, 0x04, 0x40, 0x00, 0x80, 0x24, 0x48, 0x02, 0x00, 0x00, 0x00, 0x48, +0x80, 0x04, 0x81, 0x04, 0x4A, 0x00, 0x92, 0x20, 0x89, 0x24, 0x48, 0x02, +0x92, 0x24, 0x49, 0x24, 0x49, 0x92, 0x80, 0x24, 0x48, 0x02, 0x40, 0x00, +0x04, 0x48, 0x80, 0x04, 0xA3, 0x04, 0x48, 0x00, 0x92, 0x20, 0xB9, 0x24, +0x48, 0x02, 0x92, 0x24, 0x49, 0x24, 0x49, 0x92, 0x88, 0x24, 0x48, 0x02, +0x42, 0x00, 0x04, 0x00, 0x00, 0x00, 0x93, 0x24, 0x49, 0x0A, 0x00, 0x00, +0xA0, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x25, 0x49, 0x92, 0x08, 0x00, +0x00, 0x10, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x02, +0x00, 0x00, 0x00, 0x24, 0x41, 0x12, 0x00, 0x00, 0x00, 0x20, 0x09, 0x92, +0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x11, 0x20, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x92, 0x20, 0x00, 0x00, 0x00, +0x13, 0x20, 0x01, 0x02, 0x00, 0x00, 0x20, 0x00, 0x01, 0x10, 0x00, 0x00, +0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x09, 0x92, 0x20, 0x24, +0x49, 0x92, 0x00, 0x00, 0x00, 0x20, 0x49, 0x92, 0x14, 0x00, 0x00, 0x00, +0x49, 0x92, 0x24, 0x02, 0x00, 0x00, 0x40, 0x92, 0x24, 0x19, 0x00, 0x00, +0x00, 0x24, 0xC9, 0x92, 0x00, 0x00, 0x00, 0x20, 0x49, 0x92, 0x04, 0x00, +0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x40, 0x92, 0x24, 0x09, +0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x00, 0x00, 0x00, 0x20, 0x49, 0x92, +0x04, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x40, 0x92, +0x24, 0x09, 0x00, 0x00, 0x00, 0x2C, 0xC9, 0x92, 0x00, 0x00, 0x00, 0x20, +0x49, 0x92, 0x14, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, +0x40, 0x92, 0x2C, 0x19, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x01, 0x00, +0x00, 0x20, 0x49, 0x92, 0x04, 0x00, 0x00, 0x40, 0x49, 0x92, 0x24, 0x00, +0x00, 0x00, 0x44, 0x92, 0x24, 0x19, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, +0x01, 0x00, 0x00, 0x20, 0x49, 0x92, 0x04, 0x00, 0x00, 0x00, 0x49, 0x92, +0x24, 0x00, 0x00, 0x00, 0x40, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x01, 0x00, 0x00, 0x20, 0x49, 0x92, 0x04, 0x00, 0x00, 0x00, +0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x40, 0x92, 0x2C, 0x09, 0x00, 0x00, +0x00, 0x24, 0x49, 0x92, 0x01, 0x00, 0x00, 0x20, 0x49, 0x92, 0x04, 0x00, +0x00, 0x40, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x44, 0x92, 0x24, 0x19, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, +0x08, 0x02, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x08, 0x04, 0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x48, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x48, 0x96, 0x25, 0x49, 0x92, 0x2C, 0x49, 0x92, +0x04, 0x49, 0x12, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x48, 0x92, 0x24, 0x49, 0x92, 0x20, +0x4B, 0x92, 0x04, 0x49, 0x92, 0x24, 0x4B, 0x92, 0x24, 0x48, 0x92, 0x24, +0x41, 0x92, 0x04, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x96, 0x24, 0x49, +0x92, 0x20, 0x49, 0xB6, 0x04, 0x49, 0x92, 0x24, 0x49, 0xB2, 0x24, 0x48, +0x92, 0x24, 0x41, 0x92, 0x25, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x90, +0x24, 0x49, 0x92, 0x6C, 0x49, 0x10, 0x04, 0x49, 0x92, 0x64, 0x49, 0x96, +0x24, 0x4A, 0x82, 0x24, 0x51, 0x92, 0x20, 0x59, 0x92, 0x20, 0x09, 0x24, +0x49, 0x96, 0x24, 0x49, 0x82, 0x28, 0x49, 0x92, 0x84, 0x49, 0x92, 0x64, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x20, 0x4B, 0x92, 0x04, 0x41, +0x92, 0x24, 0x4B, 0x92, 0x24, 0x40, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x24, 0x49, 0x96, 0x25, 0x49, 0x82, 0x20, 0x49, 0xB6, +0x04, 0x49, 0x02, 0x24, 0x41, 0xA2, 0x24, 0x48, 0x12, 0x24, 0x41, 0x92, +0x25, 0x49, 0x92, 0x20, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x68, +0x49, 0x92, 0x04, 0x48, 0x92, 0x64, 0x49, 0x94, 0x24, 0x4A, 0x82, 0x24, +0x51, 0x92, 0x24, 0x19, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x08, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x24, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x44, 0x49, 0x92, 0x04, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, +0x20, 0x09, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x04, +0x49, 0x02, 0x24, 0x48, 0x92, 0x24, 0x01, 0x92, 0x24, 0x49, 0x92, 0x24, +0x09, 0x24, 0x41, 0x92, 0x20, 0x09, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, +0x82, 0x64, 0x41, 0x82, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, +0x90, 0x20, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x10, +0x00, 0x49, 0x92, 0x44, 0x49, 0x92, 0x04, 0x4A, 0x92, 0x24, 0x41, 0x12, +0x20, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, 0x04, 0x49, 0x92, 0x20, +0x49, 0x80, 0x04, 0x49, 0x92, 0x24, 0x49, 0x82, 0x24, 0x48, 0x92, 0x24, +0x41, 0x92, 0x24, 0x09, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x20, 0x49, +0x90, 0x20, 0x49, 0x92, 0x04, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x48, +0x92, 0x24, 0x40, 0x13, 0x30, 0x09, 0x92, 0x24, 0x09, 0x24, 0x41, 0x92, +0x04, 0x49, 0x92, 0x08, 0x41, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x82, +0x24, 0x0A, 0x92, 0x24, 0x41, 0x93, 0x34, 0x59, 0x90, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x04, 0x40, 0x00, 0x10, 0x80, 0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x40, 0x00, 0x10, 0x00, 0x00, 0x40, 0x20, 0x04, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, +0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x91, 0x24, +0x49, 0x02, 0x00, 0x00, 0x90, 0x24, 0x49, 0x52, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x0C, 0x00, 0x00, 0x10, 0x49, 0x92, 0x64, 0x00, 0x00, 0x00, +0x91, 0x24, 0x49, 0x02, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, +0x00, 0x24, 0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, +0x00, 0x00, 0x91, 0x24, 0x49, 0x02, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, +0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB2, +0x24, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x02, 0x00, 0x00, 0x90, 0x24, +0x49, 0x52, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x04, 0x00, 0x00, 0x10, +0x49, 0x92, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1A, 0xA2, 0x01, 0x00, 0x00, 0x00, +0x00, 0x82, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x20, +0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x49, +0x92, 0x24, 0x03, 0x00, 0x00, 0x48, 0x92, 0x24, 0x39, 0x00, 0x00, 0x80, +0x92, 0x24, 0x49, 0x00, 0x00, 0x00, 0x98, 0x24, 0x49, 0x22, 0x00, 0x00, +0x00, 0x41, 0x12, 0x24, 0x91, 0x04, 0x49, 0x40, 0x92, 0xA4, 0x09, 0x20, +0x00, 0x12, 0x80, 0x04, 0x48, 0x20, 0x01, 0x92, 0x90, 0x24, 0x49, 0x02, +0x08, 0x82, 0x04, 0x41, 0x12, 0xA4, 0x91, 0x04, 0x49, 0x42, 0x92, 0x24, +0x0D, 0x20, 0x00, 0x10, 0x80, 0x04, 0x48, 0x20, 0x01, 0x82, 0x90, 0x24, +0x49, 0x02, 0x08, 0x00, 0x04, 0x41, 0x13, 0x24, 0x93, 0x20, 0x09, 0x40, +0x9A, 0x24, 0x39, 0x00, 0x01, 0x80, 0xC0, 0x04, 0x48, 0x20, 0x08, 0x02, +0x98, 0x34, 0x49, 0x02, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x93, 0x24, +0x49, 0x02, 0x00, 0x00, 0xA0, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x25, +0x49, 0x92, 0x00, 0x00, 0x00, 0x10, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, +0x01, 0x20, 0x00, 0x02, 0x00, 0x00, 0x80, 0x04, 0x49, 0x00, 0x00, 0x00, +0x00, 0x04, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x10, 0x20, 0x00, +0x80, 0x00, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x49, 0x02, +0x00, 0x00, 0x00, 0x04, 0x48, 0x10, 0x00, 0x00, 0x00, 0x00, 0x41, 0x92, +0x20, 0x00, 0x00, 0x00, 0x03, 0x04, 0x40, 0x0A, 0x00, 0x00, 0xA0, 0x24, +0x48, 0x92, 0x00, 0x00, 0x00, 0x05, 0x61, 0x90, 0x00, 0x00, 0x00, 0x10, +0x09, 0x10, 0x24, 0x24, 0x49, 0x92, 0x00, 0x00, 0x00, 0x20, 0x49, 0x92, +0x14, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x40, 0x92, +0x24, 0x19, 0x00, 0x00, 0x00, 0x04, 0x49, 0x90, 0x00, 0x00, 0x00, 0x20, +0x48, 0x82, 0x04, 0x00, 0x00, 0x00, 0x41, 0x12, 0x24, 0x00, 0x00, 0x00, +0x40, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x04, 0x49, 0x90, 0x00, 0x00, +0x00, 0x20, 0x48, 0x82, 0x04, 0x00, 0x00, 0x00, 0x41, 0x12, 0x24, 0x00, +0x00, 0x00, 0x40, 0x92, 0x24, 0x09, 0x02, 0x00, 0x00, 0x04, 0x49, 0x90, +0x00, 0x00, 0x00, 0x20, 0x48, 0x82, 0x14, 0x00, 0x00, 0x00, 0x41, 0x12, +0x24, 0x02, 0x00, 0x00, 0x40, 0x92, 0x24, 0x19, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x01, 0x00, 0x00, 0x20, 0x49, 0x92, 0x04, 0x00, 0x00, 0x40, +0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x44, 0x92, 0x24, 0x19, 0x00, 0x00, +0x00, 0x04, 0x40, 0x80, 0x01, 0x00, 0x00, 0x20, 0x01, 0x12, 0x00, 0x00, +0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x08, +0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x01, 0x00, 0x00, 0x20, 0x01, 0x12, +0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x04, 0x00, 0x02, 0x00, 0x00, 0x04, 0x40, 0x90, 0x01, 0x00, 0x00, 0x20, +0x01, 0x92, 0x04, 0x00, 0x00, 0x40, 0x01, 0x10, 0x24, 0x00, 0x00, 0x00, +0x44, 0x00, 0x04, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x41, +0x10, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x08, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x84, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x10, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, +0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x25, 0x41, +0x82, 0x2C, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x12, 0x2C, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x20, 0x48, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x90, +0x24, 0x48, 0x92, 0x24, 0x41, 0x12, 0x04, 0x48, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0xC9, 0x90, 0x04, 0x49, 0x92, 0x26, +0x4B, 0x12, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x41, 0x92, 0x24, +0x09, 0x44, 0x49, 0x92, 0x24, 0x48, 0x92, 0x28, 0x4B, 0x92, 0x04, 0x09, +0x92, 0x64, 0x49, 0x92, 0x24, 0x8A, 0x92, 0x24, 0xC1, 0x12, 0x24, 0x59, +0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x2C, 0x4A, 0x82, 0x04, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x20, +0x48, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, +0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, +0x92, 0x20, 0xC9, 0x92, 0x04, 0x49, 0x90, 0x24, 0x4B, 0x92, 0x24, 0x40, +0x92, 0x24, 0x41, 0x92, 0x04, 0x49, 0x92, 0x24, 0x09, 0x64, 0x49, 0x92, +0x25, 0x08, 0x92, 0x28, 0x4B, 0x92, 0x04, 0x41, 0x90, 0x64, 0x48, 0x92, +0x24, 0x4A, 0x92, 0x24, 0xC1, 0x92, 0x24, 0x59, 0x90, 0x24, 0x09, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x10, 0x00, 0x04, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x49, 0x00, +0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x24, 0x49, 0x90, 0x28, 0x49, 0x12, 0x04, 0x49, 0x92, 0x64, +0x49, 0x92, 0x20, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x24, 0x69, 0xD2, 0x04, 0x48, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0x49, 0xDA, 0x36, 0x40, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x82, 0x24, 0x09, 0x24, 0x09, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, +0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x04, 0x48, 0x92, 0x24, 0x41, 0x92, +0x24, 0x49, 0x92, 0x04, 0x09, 0x01, 0x00, 0x92, 0x24, 0x49, 0x92, 0x28, +0x41, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x12, 0x04, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0x90, 0x20, 0x09, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x0A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, +0x20, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0x90, 0x00, 0x01, 0x83, 0x20, 0x49, 0x92, 0x04, 0x41, 0x11, 0x00, +0x49, 0x92, 0x04, 0x40, 0x10, 0x00, 0x40, 0x12, 0x24, 0x49, 0x86, 0x64, +0x00, 0x25, 0x49, 0x82, 0x20, 0x48, 0x92, 0x28, 0x49, 0x92, 0x04, 0x41, +0x92, 0x64, 0x49, 0x92, 0x24, 0x42, 0x90, 0x24, 0x41, 0x91, 0x24, 0x59, +0x96, 0x64, 0x09, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x20, 0x20, 0x00, 0x22, 0x00, +0x80, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xD9, 0xB6, 0x6D, 0x03, 0x00, 0x00, 0xD0, 0xB6, 0x6D, 0x5B, +0x00, 0x01, 0x00, 0xB4, 0x6D, 0xDB, 0x0E, 0x40, 0x00, 0x90, 0x6D, 0xDB, +0x76, 0x01, 0xB2, 0x44, 0x99, 0xF6, 0x4F, 0x13, 0xA1, 0xE4, 0xC1, 0xB2, +0x49, 0x19, 0x10, 0xD8, 0x12, 0xB4, 0x2D, 0xD9, 0x82, 0x01, 0x49, 0x82, +0x6F, 0xDB, 0x37, 0x80, 0x00, 0x01, 0xD9, 0xB6, 0x6D, 0x03, 0x04, 0x04, +0xC1, 0xB6, 0x6D, 0x1B, 0x00, 0x40, 0x10, 0xB4, 0x6D, 0xDB, 0x82, 0x00, +0x88, 0x80, 0x6D, 0xDB, 0x36, 0x23, 0x00, 0x00, 0x59, 0xB6, 0x6D, 0x13, +0x00, 0x00, 0xD0, 0xB6, 0x6D, 0x5B, 0x10, 0x08, 0x00, 0xF4, 0x6D, 0xDB, +0x1E, 0x00, 0x00, 0x90, 0x69, 0xDB, 0x76, 0xB6, 0x6D, 0xDB, 0x48, 0x92, +0x24, 0xB1, 0x6D, 0xDB, 0x46, 0x92, 0x24, 0x29, 0x6D, 0xDA, 0xB6, 0x90, +0x20, 0x49, 0x60, 0x9B, 0xB6, 0x95, 0x24, 0x48, 0x12, 0x96, 0xDC, 0x9B, +0x08, 0x92, 0x04, 0xA1, 0x4C, 0x09, 0x42, 0x96, 0x00, 0x0B, 0x6C, 0x01, +0xA0, 0x90, 0x66, 0x4B, 0xE2, 0x5A, 0xD2, 0x8C, 0x04, 0x49, 0x12, 0x36, +0x6C, 0xCA, 0x48, 0x01, 0x04, 0xB1, 0x60, 0xCB, 0x46, 0x02, 0x04, 0x01, +0x2D, 0x9B, 0xA6, 0x90, 0x26, 0x69, 0x62, 0xDB, 0x32, 0x8C, 0x14, 0x01, +0x10, 0x94, 0x64, 0xDB, 0x88, 0x48, 0x24, 0x89, 0x24, 0xD9, 0x46, 0x12, +0x30, 0x89, 0x7C, 0xC1, 0xB6, 0x90, 0x16, 0x48, 0x62, 0xDB, 0xB2, 0x1D, +0x92, 0x4C, 0x12, 0xDB, 0xB6, 0x6D, 0x27, 0x49, 0x92, 0xD8, 0xB6, 0x6D, +0x33, 0x49, 0x92, 0xA4, 0xB6, 0x68, 0x5B, 0x48, 0x92, 0x24, 0xB1, 0x2D, +0xDB, 0x66, 0x92, 0x24, 0x89, 0xCA, 0x05, 0x20, 0xA1, 0x01, 0x80, 0xC0, +0x16, 0x00, 0x0A, 0x49, 0x08, 0x30, 0x26, 0x25, 0xC9, 0x0C, 0x9A, 0x34, +0x31, 0x64, 0x9A, 0x44, 0x90, 0x92, 0x04, 0x0B, 0x12, 0x54, 0x25, 0x49, +0x92, 0xD0, 0x9A, 0x65, 0x09, 0x4D, 0x82, 0x20, 0xF6, 0x0D, 0xCB, 0x48, +0x92, 0x24, 0xB1, 0x61, 0x08, 0x46, 0x90, 0x04, 0x0D, 0x69, 0x90, 0x6D, +0x23, 0x49, 0x92, 0xC0, 0x96, 0x6C, 0x3B, 0x49, 0x92, 0x24, 0x26, 0x25, +0xDB, 0x0C, 0x92, 0x24, 0x19, 0x04, 0xDA, 0x06, 0x92, 0x25, 0x09, 0x00, +0x00, 0x00, 0x27, 0x49, 0x92, 0x08, 0x00, 0x00, 0x20, 0x49, 0x92, 0x24, +0x00, 0x00, 0x00, 0x49, 0x96, 0x24, 0x09, 0x10, 0x00, 0x50, 0x92, 0x24, +0xA9, 0x00, 0x91, 0x00, 0xA5, 0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x4D, +0xDA, 0x36, 0x00, 0x00, 0x00, 0x4C, 0xDA, 0x36, 0x81, 0x00, 0x40, 0x40, +0xB2, 0xB6, 0x0D, 0x00, 0x40, 0x10, 0x25, 0x4D, 0x92, 0x00, 0x00, 0x00, +0x00, 0x6D, 0xF2, 0x24, 0x00, 0x00, 0x00, 0x48, 0x93, 0x24, 0x01, 0x00, +0x00, 0x40, 0xB2, 0x34, 0x0D, 0x00, 0x00, 0x00, 0xA7, 0x49, 0x92, 0x00, +0x00, 0x00, 0xA0, 0x49, 0x92, 0x24, 0x10, 0x00, 0x00, 0x4D, 0x92, 0x24, +0x01, 0x00, 0x00, 0x50, 0x92, 0x24, 0x09, 0xFF, 0xFF, 0xFF, 0x90, 0x24, +0x49, 0xF2, 0xEF, 0xFF, 0x97, 0x24, 0x49, 0x12, 0xFF, 0xFB, 0x7F, 0x26, +0x49, 0x92, 0xF0, 0xEF, 0xFF, 0x3F, 0x49, 0x92, 0x04, 0xEE, 0x6C, 0xF3, +0x10, 0x24, 0x49, 0xF2, 0x7E, 0x52, 0x8E, 0x20, 0x01, 0x00, 0x6F, 0x6F, +0xFF, 0x20, 0x01, 0x80, 0x70, 0xF7, 0xB6, 0x0D, 0x49, 0x00, 0x20, 0x3F, +0x3D, 0xCF, 0x90, 0x20, 0x69, 0xF2, 0xFB, 0xFB, 0x8E, 0x00, 0x09, 0x12, +0x7F, 0xDF, 0xF6, 0x24, 0x48, 0x92, 0x70, 0xD3, 0x36, 0x0F, 0x49, 0xC2, +0x22, 0x4E, 0xC9, 0xFF, 0x50, 0xA4, 0x49, 0xF2, 0x5F, 0xFA, 0x1F, 0x24, +0x49, 0x12, 0x6D, 0xBB, 0xFF, 0x20, 0x49, 0x92, 0x60, 0x92, 0xFE, 0x9F, +0x49, 0x93, 0x24, 0x00, 0x00, 0x00, 0xB5, 0x6D, 0xDB, 0x02, 0x00, 0x00, +0x88, 0x6D, 0xDB, 0x76, 0x00, 0x04, 0x00, 0x6C, 0xDB, 0xB6, 0x05, 0x00, +0x00, 0x58, 0xDB, 0xB6, 0xAD, 0x31, 0x02, 0x0C, 0x35, 0x2D, 0xD9, 0x02, +0x81, 0xBF, 0x85, 0x69, 0xD3, 0x24, 0x91, 0x92, 0x04, 0x68, 0x93, 0xA4, +0x01, 0x80, 0x25, 0x43, 0xD9, 0x24, 0x28, 0x40, 0x81, 0x20, 0xF5, 0xFD, +0xDB, 0x02, 0x01, 0x10, 0x80, 0x69, 0xDB, 0x36, 0x00, 0x20, 0x00, 0x6C, +0xDB, 0xB6, 0x01, 0x04, 0x45, 0x41, 0xDB, 0xB6, 0x29, 0x00, 0x0B, 0x00, +0x35, 0x6D, 0xDB, 0x22, 0x49, 0x02, 0x80, 0x6D, 0xDB, 0x76, 0x81, 0x12, +0x00, 0x28, 0xFB, 0xB6, 0x85, 0x21, 0x05, 0x50, 0xDB, 0xB6, 0x2D, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x01, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x80, 0x00, 0x04, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, +0x00, 0x02, 0x40, 0x00, 0x00, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x04, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x10, 0x00, 0x08, 0x80, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x08, 0x80, 0x00, 0x02, 0x40, 0x00, +0x00, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x10, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x04, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x01, 0x00, 0x08, 0x04, 0x40, 0x00, 0x00, 0x00, 0x10, 0x80, 0x08, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x42, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x08, 0x80, 0x80, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x82, 0x00, 0x08, 0x00, 0x00, 0x40, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x02, 0x80, 0x40, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x08, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x90, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x10, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x20, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x02, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x10, 0x08, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x01, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x00, 0x96, 0x25, 0x49, 0x92, 0x2C, 0x09, 0x82, 0x0C, 0x49, 0x92, 0x44, +0x49, 0x86, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x19, 0x92, 0x24, +0x89, 0x24, 0x49, 0x12, 0x25, 0x49, 0xB2, 0x00, 0x49, 0x92, 0x04, 0x49, +0xB6, 0x24, 0x41, 0x92, 0x04, 0x48, 0x92, 0x04, 0xC1, 0x92, 0x24, 0x49, +0x92, 0xA4, 0x09, 0x24, 0x49, 0x12, 0x85, 0x49, 0x91, 0x20, 0xC8, 0xB2, +0x04, 0x49, 0x92, 0x2C, 0x08, 0x90, 0x2C, 0x48, 0x92, 0x04, 0x41, 0x12, +0x24, 0x49, 0xD2, 0x64, 0x09, 0x24, 0x49, 0x96, 0x05, 0xC9, 0x90, 0x64, +0x09, 0x84, 0x14, 0x01, 0x90, 0x24, 0x49, 0x86, 0x24, 0x4A, 0x90, 0x24, +0x41, 0x92, 0x2C, 0x59, 0x36, 0x04, 0x09, 0x24, 0x09, 0x96, 0x24, 0x49, +0x82, 0x28, 0x49, 0x12, 0x0C, 0x49, 0x92, 0x44, 0x49, 0x06, 0x04, 0x4A, +0x82, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x41, 0x12, +0x24, 0x49, 0x92, 0x00, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x09, 0x82, +0x24, 0x48, 0x92, 0x24, 0xC1, 0x12, 0x20, 0x49, 0x90, 0x24, 0x09, 0x24, +0x40, 0x82, 0x24, 0x49, 0x92, 0x20, 0xC9, 0xB0, 0x04, 0x49, 0x10, 0x24, +0x48, 0x80, 0x2C, 0x48, 0x92, 0x04, 0x01, 0x12, 0x24, 0x48, 0x92, 0x24, +0x09, 0x24, 0x48, 0x96, 0x24, 0x41, 0x82, 0x68, 0x49, 0x94, 0x14, 0x48, +0x82, 0x24, 0x41, 0x06, 0x24, 0x4A, 0x82, 0x24, 0x41, 0x10, 0x2C, 0x49, +0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x20, 0x00, 0x01, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x00, 0x08, 0x80, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x80, 0x00, 0x00, 0x00, 0x80, 0x44, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x12, 0x00, 0x04, 0x80, 0x08, 0x42, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, +0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x90, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, +0x00, 0x40, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x24, 0xD9, 0x92, 0x24, 0x69, 0x92, 0x28, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0xB2, 0x24, 0x4A, 0xD2, 0x24, 0x41, 0x92, +0x24, 0x59, 0x82, 0x24, 0x81, 0x64, 0x49, 0x92, 0x24, 0x09, 0x92, 0x20, +0x49, 0x92, 0x04, 0x49, 0x90, 0x04, 0x49, 0x92, 0x64, 0x40, 0x12, 0x24, +0x41, 0x92, 0x24, 0x49, 0x12, 0x24, 0x09, 0x24, 0x49, 0x92, 0x20, 0x41, +0x92, 0x20, 0x49, 0x92, 0x05, 0x49, 0x91, 0x04, 0x49, 0xD2, 0x24, 0x40, +0x1A, 0x24, 0x41, 0x92, 0x25, 0x49, 0x92, 0x04, 0x09, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x20, 0xC9, 0x92, 0x14, 0x49, 0x90, 0x04, 0xC9, 0x92, +0x24, 0x42, 0x92, 0x24, 0x41, 0x92, 0x25, 0x19, 0x92, 0x24, 0x09, 0x24, +0xD9, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x00, 0x49, 0x92, 0x44, +0x49, 0xB2, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x64, 0x49, 0x92, 0x24, 0x09, 0x90, 0x20, 0x49, 0x92, 0x04, 0x49, +0x90, 0x04, 0x48, 0x92, 0x64, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x92, 0x04, 0x08, 0x24, 0x49, 0x92, 0x00, 0x01, 0x10, 0x20, 0x48, 0x92, +0x05, 0x4D, 0x80, 0x04, 0x49, 0x92, 0x24, 0x48, 0x12, 0x04, 0x41, 0x92, +0x25, 0x49, 0x80, 0x04, 0x08, 0x24, 0x49, 0x92, 0x00, 0x01, 0x90, 0x28, +0xC9, 0x12, 0x14, 0x49, 0x93, 0x64, 0xC9, 0x92, 0x24, 0x48, 0xD2, 0x24, +0x41, 0x92, 0x25, 0x49, 0x80, 0x04, 0x09, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x24, 0x40, 0x82, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x20, +0x01, 0x00, 0x00, 0x00, 0x24, 0x48, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x12, 0x20, 0x00, 0x00, 0x14, 0x80, 0xD8, 0xE6, 0x6D, 0x01, 0xC0, 0x00, +0xD0, 0xB6, 0x68, 0x5B, 0x00, 0x10, 0x40, 0xB4, 0x2D, 0xDB, 0x0F, 0x68, +0x40, 0x90, 0xED, 0xDB, 0x66, 0x01, 0x80, 0x24, 0xDD, 0x36, 0xF9, 0x02, +0x10, 0x1A, 0x8D, 0xF6, 0x25, 0x06, 0x03, 0x04, 0x24, 0xB0, 0x69, 0x0B, +0x22, 0x30, 0x09, 0x83, 0x2D, 0xFF, 0x3A, 0x01, 0x94, 0x14, 0xD8, 0xFC, +0x2D, 0x13, 0x88, 0x28, 0xC0, 0x96, 0xE9, 0x1B, 0x00, 0x32, 0x88, 0xB4, +0x25, 0xF3, 0x02, 0x04, 0x22, 0x80, 0x7D, 0x5B, 0x34, 0x00, 0x01, 0x00, +0xD9, 0x22, 0x6D, 0x03, 0x50, 0x02, 0xD0, 0xF6, 0x64, 0x5B, 0x80, 0x08, +0x00, 0xB4, 0x6B, 0xDB, 0x06, 0x30, 0x01, 0x90, 0x8D, 0xDF, 0x76, 0xB6, +0x71, 0x5B, 0x48, 0x82, 0x34, 0xBB, 0x2D, 0x5B, 0x46, 0x92, 0xA1, 0xA8, +0x6D, 0xCB, 0xF2, 0x90, 0x64, 0x41, 0x60, 0x33, 0x96, 0x95, 0x04, 0x48, +0x02, 0x93, 0x65, 0xFF, 0x08, 0x12, 0x20, 0xB0, 0x3C, 0xC1, 0x03, 0x92, +0x6C, 0x10, 0x6C, 0x5B, 0x92, 0xC4, 0x20, 0x99, 0x42, 0xCB, 0xBF, 0x86, +0x62, 0x49, 0x16, 0xB6, 0x38, 0xC9, 0x48, 0x01, 0x44, 0xA1, 0x25, 0xF3, +0x06, 0x6A, 0x20, 0x05, 0x2D, 0x49, 0x3A, 0x10, 0x6A, 0x04, 0x60, 0x4D, +0x94, 0x8C, 0x04, 0x89, 0x00, 0x96, 0x64, 0xD9, 0x48, 0x4E, 0x24, 0xB9, +0x3D, 0xD9, 0x46, 0x1A, 0x29, 0x09, 0xED, 0xC1, 0xB6, 0x50, 0x10, 0x4D, +0x6A, 0xE9, 0xB7, 0x9D, 0x40, 0x08, 0x12, 0xDB, 0xAA, 0x61, 0x27, 0x09, +0x92, 0xD0, 0x36, 0x0C, 0x33, 0x49, 0x90, 0x24, 0x36, 0x65, 0x1D, 0x48, +0x92, 0x24, 0xB8, 0x05, 0xDB, 0x6A, 0x12, 0x26, 0x88, 0xCA, 0x16, 0x08, +0x71, 0x49, 0x00, 0x80, 0xA7, 0x25, 0x00, 0x09, 0x92, 0x00, 0xA2, 0x6C, +0x4B, 0x40, 0x82, 0x26, 0x11, 0x6C, 0xD2, 0x45, 0x12, 0x00, 0x21, 0x5A, +0x80, 0x57, 0x21, 0x01, 0x81, 0xC0, 0x8A, 0x00, 0x01, 0x49, 0x10, 0x24, +0x96, 0x34, 0x01, 0x4C, 0x12, 0x1F, 0xB1, 0x51, 0x68, 0x43, 0x82, 0x26, +0x09, 0xDB, 0x93, 0x6D, 0x27, 0x49, 0x92, 0xD0, 0x44, 0x6E, 0x3B, 0x09, +0x92, 0xA4, 0x16, 0x64, 0xDB, 0x48, 0x90, 0x24, 0xB9, 0x14, 0xCA, 0x46, +0x12, 0x20, 0x09, 0x00, 0x08, 0x00, 0x27, 0x49, 0x92, 0x02, 0x00, 0x00, +0x20, 0x49, 0x93, 0x26, 0x00, 0x00, 0x04, 0x49, 0xD2, 0x34, 0x01, 0x60, +0x00, 0x58, 0x92, 0xA6, 0xA9, 0x01, 0x00, 0x24, 0xB5, 0x69, 0x92, 0x00, +0x11, 0x00, 0x01, 0x4D, 0xDB, 0x34, 0x00, 0x00, 0x00, 0x5C, 0x92, 0xB6, +0x43, 0x00, 0x09, 0x42, 0xD2, 0x24, 0x2D, 0x00, 0x14, 0x02, 0x25, 0x45, +0xD3, 0x10, 0x00, 0xA0, 0x00, 0x69, 0x92, 0x24, 0x00, 0x02, 0x00, 0x48, +0xDB, 0x36, 0x01, 0x04, 0x00, 0x41, 0xDA, 0xA6, 0x09, 0x00, 0x00, 0x00, +0x27, 0x4D, 0x92, 0x08, 0x10, 0x00, 0x20, 0x49, 0x9B, 0xA4, 0x80, 0x00, +0x00, 0x49, 0xB2, 0x24, 0x01, 0x20, 0x01, 0x50, 0xD2, 0x24, 0x09, 0xFF, +0xF3, 0x7B, 0x90, 0x24, 0x69, 0xF0, 0x3F, 0x9E, 0x97, 0x24, 0x48, 0x10, +0x7F, 0xEB, 0x79, 0x24, 0x29, 0x82, 0xF0, 0x9F, 0xBF, 0x33, 0x49, 0x10, +0x04, 0xEE, 0x5F, 0x9A, 0x00, 0x04, 0x49, 0xA2, 0xEE, 0xAD, 0x80, 0x20, +0x00, 0x02, 0xEC, 0xFA, 0xCB, 0x20, 0x49, 0x00, 0x30, 0xCE, 0xF6, 0x0C, +0x09, 0x92, 0x00, 0x3E, 0x6B, 0xC9, 0x90, 0x28, 0x08, 0xE2, 0x41, 0x5A, +0x86, 0x04, 0x49, 0x12, 0x5F, 0xCC, 0xAC, 0x24, 0x00, 0x80, 0xF0, 0xD3, +0x0E, 0x0E, 0x01, 0x10, 0x24, 0xFF, 0xC8, 0xFF, 0x90, 0x20, 0x49, 0xF2, +0x0D, 0xFC, 0x9F, 0x24, 0x40, 0x12, 0x4F, 0xFA, 0xFE, 0x26, 0x49, 0x92, +0xF0, 0x86, 0xEE, 0x1F, 0x09, 0x93, 0x24, 0x00, 0x04, 0x84, 0xB5, 0x2D, +0xDB, 0x00, 0xC0, 0xA1, 0x88, 0x6D, 0xDA, 0x76, 0x80, 0x10, 0x00, 0x6C, +0x9B, 0xB6, 0x04, 0x80, 0x20, 0x54, 0x5B, 0xB4, 0xAD, 0x24, 0xA8, 0x41, +0xA1, 0x6D, 0x4B, 0x52, 0x40, 0x52, 0x8E, 0x2D, 0x93, 0x2B, 0x11, 0x81, +0x34, 0x68, 0xDB, 0x24, 0x81, 0x10, 0x00, 0x48, 0x9B, 0x92, 0x01, 0x81, +0x43, 0x20, 0xB5, 0x25, 0x9A, 0x02, 0x50, 0x05, 0x88, 0x4D, 0x5F, 0x36, +0x40, 0x82, 0x46, 0xE8, 0x97, 0x8D, 0x01, 0xA2, 0x81, 0x40, 0xCB, 0x34, +0x2D, 0x20, 0x2C, 0x02, 0xB4, 0x69, 0xDB, 0x02, 0x82, 0x00, 0x80, 0x2D, +0xD2, 0x76, 0x00, 0x13, 0x00, 0x6C, 0xD9, 0xB6, 0x05, 0x0A, 0x00, 0x50, +0x1B, 0xF2, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, +0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x10, +0x20, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x48, 0x12, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x20, 0x40, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x01, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x8C, 0x00, 0x00, 0x00, 0x80, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x02, 0x10, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x80, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, +0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, +0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x09, 0x02, +0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x09, 0x02, 0x26, 0x00, 0x00, 0x00, +0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x82, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x80, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x21, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, +0x10, 0x00, 0x10, 0x00, 0x01, 0x80, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, +0x00, 0x00, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x40, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, +0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x82, 0x44, 0x00, 0x00, +0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x04, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x41, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x10, 0x00, 0x04, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, +0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, +0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x02, 0x00, 0x24, 0x41, 0x96, 0x24, 0x49, 0x92, 0x2C, 0x09, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x28, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x58, 0x92, 0x24, 0x89, 0x04, 0x09, 0x80, 0x04, 0x49, 0x96, 0x00, +0x49, 0x92, 0x04, 0x09, 0x92, 0x24, 0x89, 0x12, 0x00, 0x58, 0x92, 0x24, +0x01, 0x92, 0x24, 0x08, 0x91, 0x24, 0x09, 0x00, 0x49, 0x92, 0x24, 0x49, +0x92, 0x20, 0x40, 0x92, 0x0E, 0x41, 0x92, 0x24, 0x49, 0x92, 0x04, 0x48, +0x92, 0x24, 0x01, 0x10, 0x20, 0x40, 0x92, 0x24, 0x09, 0x60, 0x48, 0x96, +0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0xC9, 0x00, +0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x09, 0x86, 0x25, 0x49, 0x82, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x82, 0x2C, 0x4A, 0x92, 0x04, 0x41, 0x92, 0x24, 0x51, 0x92, 0x24, +0x89, 0x24, 0x49, 0x92, 0x21, 0x09, 0x02, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0xC9, 0x90, 0x20, 0x48, 0xD0, 0x26, 0x01, 0x12, 0x20, 0x49, +0x82, 0x04, 0x09, 0x04, 0x49, 0x92, 0x25, 0x49, 0xD2, 0x20, 0x49, 0x92, +0x0C, 0x49, 0x92, 0x06, 0x49, 0x92, 0x04, 0x48, 0x92, 0x04, 0x01, 0x92, +0x24, 0x48, 0x12, 0x24, 0x09, 0x64, 0x41, 0x96, 0x25, 0x48, 0x82, 0x28, +0x49, 0x92, 0x04, 0x49, 0x10, 0x20, 0xC9, 0x92, 0x24, 0x0E, 0x90, 0x20, +0x41, 0x82, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, 0x00, 0x10, 0x01, 0x00, +0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, +0x01, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x24, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x40, 0x80, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, +0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, +0x00, 0x00, 0x00, 0x40, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x10, +0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x24, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x58, 0x92, 0x24, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0xB2, 0x2C, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, +0x20, 0x09, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0xB2, 0x24, 0x48, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x09, 0x12, 0x20, 0x09, 0x24, +0x4D, 0xB2, 0x20, 0x09, 0x92, 0x20, 0x09, 0x92, 0x07, 0x49, 0x92, 0x24, +0x49, 0x92, 0x24, 0x48, 0x92, 0x34, 0x41, 0x92, 0x24, 0x09, 0x92, 0x24, +0x09, 0x24, 0x49, 0x92, 0x00, 0x09, 0x90, 0x20, 0x79, 0x92, 0x04, 0x49, +0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x26, 0x59, +0x92, 0x24, 0x09, 0x24, 0x59, 0x9A, 0x24, 0x49, 0x82, 0x20, 0x49, 0x90, +0x04, 0x49, 0x10, 0x64, 0x49, 0xAA, 0x2C, 0x4A, 0x92, 0x24, 0x41, 0x12, +0x24, 0x59, 0x92, 0x24, 0x89, 0x20, 0x4C, 0x92, 0x24, 0x48, 0x02, 0x20, +0x49, 0x92, 0x06, 0x01, 0x12, 0x20, 0x49, 0x9A, 0x24, 0x00, 0x82, 0x20, +0x40, 0xD2, 0x24, 0x48, 0x12, 0x00, 0x01, 0x26, 0x49, 0xB2, 0x24, 0x40, +0x02, 0x20, 0x0D, 0x92, 0x05, 0x01, 0x12, 0x00, 0x49, 0x13, 0x24, 0x08, +0x02, 0x20, 0x40, 0xD2, 0x34, 0x09, 0x10, 0x00, 0x01, 0x24, 0x49, 0x92, +0x24, 0x40, 0x92, 0x30, 0x59, 0x92, 0x00, 0x01, 0x90, 0x64, 0x49, 0x92, +0x00, 0x0A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x19, 0x10, 0x00, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x91, 0x00, 0x00, 0x00, +0x00, 0x48, 0x80, 0x04, 0x00, 0x00, 0x00, 0x40, 0x10, 0x14, 0x01, 0x00, +0x00, 0x40, 0x82, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x04, +0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x82, 0x24, 0x00, 0x00, 0x00, 0x02, 0xD8, 0xB6, +0x45, 0x03, 0x20, 0x80, 0xD0, 0xB6, 0x6F, 0x59, 0x00, 0x0D, 0x09, 0xB4, +0x6D, 0xDF, 0x06, 0xC0, 0x48, 0x90, 0x6D, 0x99, 0x77, 0x20, 0x88, 0x20, +0x18, 0x96, 0xED, 0x03, 0xC1, 0x04, 0xC1, 0xB2, 0x6E, 0x13, 0x00, 0x04, +0xE0, 0xF4, 0x5D, 0x5B, 0x82, 0x80, 0x00, 0x80, 0xEF, 0xD8, 0x36, 0x41, +0x0C, 0x4B, 0xD1, 0x97, 0x65, 0x23, 0xA2, 0x24, 0x43, 0xE6, 0x6D, 0x1B, +0x40, 0x44, 0x49, 0xB4, 0x7C, 0xDF, 0x12, 0x1C, 0x02, 0xC2, 0x2D, 0x9A, +0x36, 0x41, 0x04, 0x00, 0xDD, 0xB7, 0x6D, 0x03, 0x90, 0x00, 0x90, 0xE6, +0x6D, 0x5B, 0x41, 0x00, 0x00, 0xB0, 0x68, 0xDB, 0x1E, 0x10, 0x00, 0x90, +0x2D, 0xDB, 0x76, 0xB6, 0x65, 0xC9, 0x48, 0x8A, 0x0C, 0xB9, 0x0D, 0x4B, +0x46, 0x12, 0x00, 0x0B, 0x6D, 0xD0, 0xB7, 0x90, 0x00, 0x49, 0x6A, 0x1B, +0xF6, 0x9D, 0xA4, 0x0B, 0x12, 0x96, 0x65, 0x7B, 0x80, 0xE2, 0x24, 0xB1, +0xAC, 0xDB, 0x06, 0x96, 0x21, 0x01, 0x6D, 0x4F, 0x16, 0x80, 0x04, 0xC9, +0xE0, 0x5B, 0xB2, 0x0C, 0x20, 0x4A, 0x12, 0xF6, 0x60, 0x00, 0x40, 0xA0, +0x08, 0x91, 0x4D, 0x5B, 0xC0, 0x02, 0x00, 0x20, 0x2C, 0x9F, 0xB7, 0x90, +0x21, 0x49, 0x70, 0x41, 0x90, 0x84, 0x44, 0x00, 0x13, 0xF7, 0x60, 0xDB, +0x48, 0x48, 0x24, 0x99, 0x75, 0xD9, 0x06, 0x0A, 0x20, 0x89, 0x2C, 0xC9, +0xB6, 0x14, 0x33, 0x49, 0x62, 0x49, 0xB6, 0x9D, 0x54, 0x44, 0x12, 0xDB, +0xB2, 0x64, 0x27, 0x69, 0xD2, 0xD0, 0x16, 0x64, 0x3B, 0x49, 0xD0, 0xA4, +0xB6, 0x60, 0xD2, 0x48, 0x82, 0x00, 0xB9, 0x2D, 0x03, 0x66, 0x92, 0x04, +0x88, 0xC8, 0xAA, 0x4D, 0x25, 0x59, 0x10, 0x82, 0x76, 0x60, 0x08, 0x49, +0x80, 0x20, 0xA0, 0x21, 0x4B, 0x08, 0x82, 0x26, 0x00, 0x8C, 0xDB, 0x42, +0x10, 0x24, 0x0D, 0x18, 0x38, 0x02, 0x21, 0x48, 0xD2, 0xC2, 0x80, 0xA4, +0x09, 0x21, 0x00, 0x30, 0x56, 0x00, 0x48, 0x48, 0x82, 0x00, 0xA0, 0x01, +0x41, 0x0A, 0x8A, 0xB6, 0x05, 0x18, 0x8A, 0x6D, 0x23, 0x48, 0x92, 0xC0, +0x80, 0x6C, 0xFB, 0x09, 0x90, 0x24, 0xD7, 0x70, 0xDB, 0x48, 0x92, 0x24, +0xB9, 0x35, 0xD9, 0x06, 0xB2, 0x26, 0x09, 0x00, 0x08, 0x00, 0x27, 0x49, +0xDA, 0x08, 0x00, 0x00, 0x20, 0x49, 0xD0, 0xA6, 0x00, 0x10, 0x00, 0x49, +0x92, 0x24, 0x01, 0x90, 0x40, 0x50, 0x92, 0x26, 0x89, 0x24, 0x00, 0x20, +0xA5, 0x69, 0x92, 0x22, 0x40, 0x00, 0x00, 0x4D, 0x93, 0x24, 0x00, 0x00, +0x00, 0x08, 0x92, 0xA6, 0x41, 0x00, 0x00, 0x48, 0x12, 0x36, 0x0D, 0xC0, +0x40, 0x00, 0x25, 0x69, 0xDA, 0x03, 0x40, 0x80, 0x80, 0x09, 0xB2, 0x34, +0x00, 0x02, 0x00, 0x4C, 0x93, 0x24, 0x11, 0x18, 0x00, 0x48, 0xDA, 0xB6, +0x0D, 0x40, 0x08, 0x00, 0x27, 0xC9, 0x92, 0x00, 0x10, 0x00, 0xA0, 0x69, +0x92, 0x24, 0x00, 0x10, 0x00, 0x4F, 0x9B, 0x24, 0x01, 0x00, 0x00, 0x50, +0xD2, 0x26, 0x09, 0xFF, 0x61, 0xF5, 0x90, 0x24, 0x01, 0xF2, 0xCF, 0x7F, +0x9F, 0xA4, 0x0B, 0x10, 0xFF, 0xE3, 0xF7, 0x26, 0x49, 0x92, 0xF0, 0x4F, +0xA7, 0x3F, 0x49, 0x90, 0x24, 0xCA, 0x63, 0xDF, 0x18, 0x04, 0x49, 0x90, +0xBE, 0xFA, 0x84, 0x20, 0x48, 0x12, 0xFD, 0xF7, 0x9F, 0x64, 0x49, 0x10, +0xA0, 0x3E, 0xFF, 0x07, 0xC9, 0x80, 0x20, 0x3C, 0x25, 0xD1, 0x90, 0x06, +0x21, 0xD0, 0x39, 0x5B, 0x06, 0x64, 0x49, 0x02, 0x3F, 0xDC, 0x37, 0x20, +0x48, 0x93, 0xE0, 0x83, 0xA7, 0x05, 0x01, 0x00, 0x20, 0x3F, 0xC5, 0xFF, +0x90, 0x24, 0x49, 0xE2, 0x49, 0xFE, 0x1F, 0x04, 0x49, 0x12, 0x1E, 0xCA, +0xFF, 0xA0, 0x40, 0x92, 0xE0, 0x83, 0xFE, 0x1F, 0x09, 0x90, 0x24, 0x00, +0x08, 0x1A, 0xB4, 0x4D, 0x93, 0x02, 0xC0, 0x90, 0x80, 0x6D, 0x99, 0x74, +0x00, 0x06, 0x08, 0x6C, 0xDB, 0xB2, 0x05, 0x80, 0x18, 0x50, 0xDB, 0xB4, +0xAC, 0x31, 0x10, 0x80, 0x35, 0x4D, 0x5B, 0x40, 0x01, 0x04, 0x83, 0x69, +0xD8, 0x36, 0x12, 0x98, 0x20, 0x2C, 0xCB, 0x34, 0x11, 0x60, 0x04, 0x41, +0x59, 0xB4, 0x29, 0x03, 0x83, 0xB4, 0xBD, 0x4C, 0x93, 0x20, 0x16, 0x00, +0x04, 0x0D, 0xDB, 0x26, 0x81, 0x20, 0x00, 0x6C, 0xCA, 0xB2, 0x01, 0xF6, +0x3C, 0x01, 0x93, 0x24, 0x2B, 0x00, 0x11, 0x00, 0xB1, 0x6C, 0xDB, 0x32, +0x0E, 0x02, 0x00, 0x2D, 0xDF, 0x76, 0x00, 0x07, 0x00, 0x68, 0xDA, 0xB6, +0x05, 0x82, 0x00, 0x50, 0x9B, 0xB4, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x80, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x24, 0x41, 0x00, +0x00, 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x81, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x48, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, +0x00, 0x01, 0x01, 0x02, 0x04, 0x00, 0x08, 0x00, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x01, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x90, 0x24, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, +0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x40, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x02, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, +0x04, 0x00, 0x00, 0x00, 0x90, 0x24, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01, 0x00, +0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x40, 0x02, 0x00, +0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x40, +0x20, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, +0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, +0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x10, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x40, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x80, +0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x10, +0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x01, 0x00, 0x00, 0x02, 0x02, 0x20, 0x00, 0x00, 0x40, 0x00, 0x20, 0x0C, +0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x02, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x88, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x09, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x80, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, +0x08, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x20, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, 0x11, 0x90, 0x24, 0x49, +0x92, 0x2A, 0x49, 0x82, 0x0C, 0x49, 0x12, 0x64, 0x59, 0x92, 0x65, 0x48, +0x92, 0x24, 0xC1, 0xC2, 0x04, 0x59, 0x92, 0x24, 0x89, 0x65, 0x4D, 0x92, +0x24, 0x48, 0x92, 0x20, 0x09, 0x92, 0x04, 0x01, 0x92, 0x2C, 0x40, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x83, 0x24, 0x49, 0x92, 0x04, 0x09, 0x04, +0x19, 0x80, 0x25, 0x40, 0x12, 0x20, 0x49, 0x82, 0x05, 0x49, 0x92, 0x20, +0x41, 0xB2, 0x08, 0x48, 0x12, 0x04, 0x03, 0x16, 0x04, 0x48, 0x92, 0x24, +0x09, 0x00, 0x00, 0x92, 0x20, 0x09, 0x92, 0x6C, 0x49, 0x86, 0x04, 0x58, +0x82, 0x64, 0x0B, 0x92, 0x24, 0x42, 0x92, 0x24, 0x41, 0x82, 0x21, 0x59, +0x12, 0x24, 0x09, 0x24, 0x59, 0x12, 0x21, 0x09, 0x92, 0x28, 0x09, 0x82, +0x0C, 0x49, 0x90, 0x44, 0x59, 0x92, 0x61, 0x0A, 0x92, 0x20, 0xC0, 0x92, +0x24, 0x59, 0x90, 0x20, 0x01, 0x65, 0x49, 0x10, 0x21, 0x48, 0x92, 0x00, +0x01, 0x92, 0x04, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, 0x48, 0x92, 0x24, +0x40, 0x92, 0x20, 0x49, 0x92, 0x04, 0x09, 0x20, 0x58, 0x80, 0x24, 0x09, +0x98, 0x20, 0x48, 0x82, 0x05, 0x49, 0x92, 0x20, 0x49, 0xA0, 0x2C, 0x4C, +0x12, 0x14, 0x41, 0x16, 0x06, 0x49, 0x80, 0x24, 0x09, 0x04, 0x49, 0x92, +0x25, 0x01, 0x92, 0x68, 0x49, 0x96, 0x04, 0x48, 0x82, 0x64, 0x4B, 0x82, +0x24, 0x42, 0x90, 0x24, 0x01, 0x02, 0x05, 0x59, 0x82, 0x30, 0x09, 0x00, +0x00, 0x80, 0x01, 0x00, 0x40, 0x04, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x24, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x30, 0x00, 0x04, 0x42, 0x01, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x10, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, +0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x08, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x09, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, +0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x01, +0x00, 0x01, 0x40, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x49, 0x96, 0x04, 0x49, 0x90, 0x28, 0x49, 0x92, 0x04, 0x49, 0x90, 0x44, +0x49, 0x92, 0x04, 0x4A, 0xBA, 0xA0, 0x40, 0x92, 0x2C, 0x59, 0x92, 0x04, +0x89, 0x05, 0x49, 0x92, 0x24, 0x18, 0x92, 0x20, 0x49, 0x96, 0x04, 0x49, +0x90, 0x24, 0x49, 0x92, 0xA5, 0x08, 0x82, 0x24, 0x51, 0x96, 0x04, 0x49, +0x90, 0x24, 0x01, 0x24, 0x5B, 0x92, 0x20, 0x09, 0x92, 0x20, 0x49, 0xBA, +0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x25, 0x48, 0x92, 0x24, 0x41, 0xD2, +0x2C, 0x49, 0x92, 0x26, 0x09, 0x24, 0x59, 0x92, 0x20, 0x09, 0x92, 0x60, +0x49, 0xB2, 0x04, 0x59, 0x9A, 0x64, 0x59, 0x92, 0x24, 0x4A, 0x96, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x41, 0x86, 0x24, 0x49, +0x92, 0x28, 0x49, 0x82, 0x04, 0x49, 0x92, 0x64, 0x69, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x12, 0xBC, 0x59, 0x92, 0x24, 0x89, 0x05, 0x49, 0x92, +0x34, 0x49, 0x12, 0x20, 0x49, 0x96, 0x04, 0x44, 0x92, 0x04, 0x49, 0x92, +0x25, 0x48, 0x92, 0x24, 0x51, 0x96, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x5B, 0x92, 0x25, 0x49, 0x10, 0x00, 0x49, 0xB2, 0x04, 0x49, 0x82, 0x24, +0x49, 0x92, 0x25, 0x48, 0x90, 0x04, 0x41, 0x12, 0x28, 0x09, 0x92, 0x04, +0x08, 0x24, 0x59, 0x92, 0x24, 0x48, 0x92, 0x68, 0x4D, 0xB3, 0x04, 0x49, +0x92, 0x64, 0x59, 0x9A, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, +0x80, 0x34, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x08, +0x04, 0x16, 0xD8, 0xB6, 0x25, 0x03, 0x62, 0x61, 0xD0, 0xBE, 0x6E, 0x5B, +0x00, 0x04, 0x0B, 0x34, 0x6D, 0xFF, 0x06, 0x8A, 0x09, 0x90, 0xE5, 0x99, +0x74, 0x02, 0x00, 0x80, 0xD9, 0xB6, 0x6D, 0x01, 0x00, 0x6C, 0xC8, 0xB6, +0xFD, 0x1B, 0x00, 0x00, 0x81, 0xB4, 0x6D, 0xD2, 0x83, 0x01, 0x26, 0x82, +0x6D, 0x4B, 0x36, 0x40, 0x90, 0x96, 0xD8, 0x3F, 0x21, 0x51, 0x82, 0x3E, +0xC9, 0xE7, 0xB7, 0x3F, 0x42, 0x22, 0x49, 0xA4, 0x44, 0xB6, 0x51, 0x9C, +0x2D, 0x89, 0x2C, 0x2D, 0x00, 0x40, 0x10, 0x01, 0xD1, 0xF7, 0x6D, 0x23, +0x80, 0x04, 0x50, 0xA6, 0x6B, 0x5B, 0x40, 0x50, 0x01, 0xB4, 0x0C, 0xDB, +0x16, 0xC0, 0x02, 0xD0, 0x6D, 0xD9, 0x76, 0xB6, 0x60, 0xC9, 0x08, 0xC2, +0x4C, 0xB9, 0x0F, 0x88, 0x46, 0x12, 0x21, 0x09, 0x65, 0xCB, 0xB9, 0x10, +0x06, 0x49, 0x6A, 0x51, 0x96, 0x9D, 0x0C, 0x0B, 0x10, 0x94, 0x6D, 0x59, +0x40, 0x12, 0x24, 0xB3, 0x6C, 0xB5, 0x42, 0x92, 0x00, 0x08, 0x6D, 0xDB, +0x36, 0xC0, 0x04, 0x40, 0x60, 0xDA, 0x90, 0x0D, 0x20, 0xD0, 0x02, 0xF6, +0x6D, 0x49, 0x68, 0x02, 0x48, 0xC3, 0xE5, 0xE5, 0x0F, 0x00, 0x6C, 0x01, +0x25, 0x49, 0xFB, 0x00, 0x09, 0x00, 0x20, 0x43, 0x9B, 0x04, 0x45, 0x92, +0x24, 0xF6, 0x7C, 0xD8, 0x44, 0x08, 0x30, 0x99, 0xA5, 0xD9, 0x86, 0x4A, +0x20, 0x08, 0x2C, 0x89, 0xB2, 0x10, 0x43, 0x49, 0x7A, 0x09, 0xB0, 0x9D, +0x94, 0x46, 0x12, 0xCB, 0x92, 0x64, 0x07, 0x69, 0x82, 0x50, 0x54, 0x2C, +0x3B, 0x41, 0x58, 0xA4, 0x16, 0x61, 0xD0, 0xE8, 0xA2, 0x00, 0xB9, 0x05, +0x4B, 0x66, 0x12, 0x00, 0x89, 0xC9, 0x16, 0x6D, 0x25, 0x49, 0x92, 0x90, +0x36, 0x02, 0x03, 0x4D, 0x02, 0x04, 0xA0, 0x01, 0x18, 0x48, 0x92, 0x20, +0x10, 0x2C, 0xEC, 0x40, 0x90, 0x24, 0x21, 0x18, 0x90, 0xD6, 0x35, 0x00, +0x81, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x10, 0x04, 0x00, 0x40, +0x52, 0x12, 0xD0, 0xA5, 0x64, 0x0B, 0x8A, 0x00, 0x09, 0x19, 0x82, 0x6C, +0x2F, 0x08, 0x9A, 0xE0, 0x00, 0x2A, 0x3B, 0x49, 0x80, 0xA5, 0x57, 0x10, +0xDA, 0x48, 0x92, 0x20, 0xA9, 0x81, 0xC9, 0x06, 0x92, 0x34, 0x09, 0x00, +0x08, 0x00, 0x27, 0x49, 0xDA, 0x08, 0x00, 0x00, 0x20, 0xC9, 0xD9, 0xA4, +0x00, 0x00, 0x00, 0x69, 0xD2, 0x34, 0x01, 0x80, 0x00, 0x50, 0x1A, 0xA6, +0x89, 0x04, 0x20, 0x80, 0xA5, 0x49, 0x9A, 0x22, 0x00, 0x02, 0x00, 0x4D, +0x92, 0x34, 0x00, 0x80, 0x84, 0x48, 0x92, 0x24, 0x40, 0x00, 0x00, 0x40, +0x92, 0xB4, 0x09, 0x40, 0x09, 0x00, 0x25, 0x41, 0xDA, 0x42, 0x40, 0xA4, +0x81, 0x29, 0xDA, 0x2C, 0x20, 0x02, 0x41, 0x68, 0xDB, 0x36, 0x21, 0x10, +0x0B, 0x40, 0xD3, 0xB6, 0x2D, 0x40, 0x50, 0x00, 0x27, 0x49, 0x9A, 0x08, +0x80, 0x02, 0xA0, 0x49, 0x93, 0xA4, 0x01, 0x00, 0x00, 0x49, 0xDB, 0x24, +0x11, 0x00, 0x00, 0x50, 0x92, 0x36, 0x09, 0xF7, 0xE1, 0xE9, 0x90, 0x24, +0x01, 0xF2, 0xFF, 0xDE, 0x9F, 0x24, 0x02, 0x12, 0x5F, 0xF3, 0xFF, 0x06, +0x09, 0x82, 0x70, 0x75, 0x26, 0x3F, 0xC1, 0x10, 0x24, 0xFB, 0x4F, 0x7B, +0x10, 0x24, 0x41, 0x90, 0x7F, 0xFD, 0x87, 0x20, 0x49, 0x03, 0xED, 0x1B, +0x78, 0x34, 0x49, 0x92, 0x21, 0xFE, 0xDA, 0x09, 0x49, 0x02, 0x24, 0xB6, +0x46, 0x48, 0x98, 0x2C, 0x01, 0x30, 0x99, 0x49, 0x0E, 0x44, 0x01, 0x12, +0x19, 0x90, 0x2C, 0x04, 0x00, 0x80, 0x80, 0x4B, 0x00, 0x82, 0x08, 0x08, +0x00, 0x3C, 0x89, 0xFB, 0x90, 0x24, 0x41, 0xC2, 0x49, 0xB8, 0x1F, 0x24, +0x48, 0x12, 0x1E, 0xC2, 0xFE, 0x26, 0x00, 0x92, 0xE0, 0x53, 0xF6, 0x1F, +0x49, 0x80, 0x24, 0x00, 0x09, 0x12, 0xB4, 0x4D, 0x93, 0x02, 0x80, 0x12, +0x80, 0x65, 0x90, 0x76, 0xA8, 0x14, 0x04, 0x4C, 0xDB, 0x92, 0x05, 0xA2, +0xB0, 0x50, 0x53, 0xB4, 0xAD, 0x20, 0x80, 0x82, 0xBD, 0x6D, 0xDB, 0x40, +0x81, 0x00, 0x8C, 0x69, 0x6B, 0x36, 0x12, 0x64, 0x43, 0x6C, 0xFB, 0xB6, +0x80, 0x00, 0x01, 0x42, 0xDB, 0x26, 0x0D, 0x01, 0x22, 0x21, 0xA5, 0x74, +0x92, 0x20, 0x1E, 0x12, 0x00, 0x0C, 0x01, 0x12, 0xCE, 0xFA, 0x96, 0x6C, +0x92, 0x88, 0x00, 0x10, 0x90, 0x44, 0x92, 0x00, 0x19, 0x02, 0x01, 0x02, +0xB5, 0x2E, 0xD3, 0x02, 0x5E, 0x05, 0x40, 0x6D, 0xD9, 0x76, 0x80, 0x2E, +0x05, 0xEC, 0x9A, 0xB6, 0x05, 0x36, 0x04, 0x10, 0xDB, 0xA4, 0x2D, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0xB0, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x84, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, +0x40, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x90, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, +0x00, 0x20, 0x51, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x30, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x20, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x80, +0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x08, +0x08, 0x00, 0x10, 0x80, 0x00, 0x04, 0x44, 0x01, 0x00, 0x00, 0x04, 0x08, +0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x12, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x80, +0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x09, 0x00, 0x10, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x84, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x20, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x14, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x04, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x0A, 0x04, 0x08, 0x41, 0x00, 0x01, 0x00, +0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, +0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x90, +0x00, 0x10, 0x00, 0x00, 0xC0, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0C, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x20, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x00, +0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x08, 0x00, 0x00, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x40, 0x91, 0x30, 0x01, 0x00, 0x00, 0x00, 0x88, 0x20, 0x48, 0x00, 0x00, +0x00, 0x40, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x0C, 0x12, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x40, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x01, 0x00, +0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x08, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x08, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x08, 0x80, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0x04, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, +0x81, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x24, +0x48, 0x96, 0x25, 0x49, 0x82, 0x28, 0x09, 0x90, 0x05, 0x49, 0x90, 0x64, +0x49, 0x80, 0x20, 0x4A, 0x92, 0x24, 0x41, 0x02, 0x20, 0x59, 0x92, 0x24, +0x89, 0x40, 0x41, 0x90, 0x25, 0x49, 0x92, 0x20, 0x48, 0x92, 0x04, 0x49, +0x92, 0x20, 0x01, 0x82, 0x05, 0x48, 0x82, 0x2C, 0x41, 0x92, 0x24, 0x49, +0x90, 0x24, 0x19, 0x24, 0x49, 0x90, 0x25, 0x49, 0x82, 0x20, 0x48, 0x82, +0x0F, 0xC9, 0x93, 0x00, 0xC9, 0x92, 0x2C, 0x58, 0x10, 0x05, 0x41, 0x96, +0x61, 0x41, 0x82, 0x21, 0x08, 0x24, 0x59, 0x90, 0x25, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x59, 0x92, 0x64, 0x09, 0x92, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x02, 0x24, 0x19, 0x92, 0x24, 0x09, 0x24, 0x49, 0x96, 0x24, 0x09, +0x82, 0x28, 0x49, 0x90, 0x01, 0x49, 0xD2, 0x60, 0x49, 0x92, 0x20, 0x4A, +0x92, 0x24, 0x41, 0x82, 0x20, 0x59, 0x92, 0x24, 0x89, 0x44, 0x41, 0x00, +0x24, 0x48, 0x12, 0x20, 0x48, 0x92, 0x04, 0x49, 0x92, 0x24, 0x09, 0x9A, +0x21, 0x0C, 0x8A, 0x20, 0x41, 0x92, 0x24, 0x48, 0x92, 0x24, 0x09, 0x24, +0x49, 0x82, 0x24, 0x48, 0x92, 0x20, 0x40, 0x82, 0x0D, 0x48, 0x82, 0x10, +0xC9, 0x90, 0x2C, 0x40, 0x90, 0x04, 0x41, 0x86, 0x45, 0x09, 0xC2, 0x20, +0x0C, 0x24, 0x51, 0x92, 0x20, 0x09, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, +0x92, 0x64, 0x48, 0x92, 0x24, 0x4A, 0x9A, 0x24, 0x41, 0x92, 0x24, 0x19, +0x92, 0x24, 0x09, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x08, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, +0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, +0x04, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, +0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x18, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x04, +0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, +0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x40, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x24, 0x49, 0x96, 0x24, 0x49, 0x92, 0x28, 0x41, 0x92, +0x04, 0x49, 0x12, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x12, 0x26, 0x88, 0x64, 0x49, 0x96, 0x24, 0x49, 0x9A, 0x20, +0x09, 0x92, 0x04, 0x40, 0x02, 0x34, 0x49, 0x92, 0x6D, 0x48, 0x92, 0x26, +0x40, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, +0x92, 0x20, 0x59, 0xB2, 0x04, 0xC9, 0x92, 0x24, 0x49, 0x92, 0x2C, 0x48, +0x97, 0x24, 0x41, 0x92, 0x34, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, +0x20, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, +0x41, 0x96, 0x24, 0x49, 0xD2, 0x28, 0x41, 0x90, 0x04, 0x49, 0x92, 0x64, +0x49, 0x92, 0x20, 0x4A, 0x92, 0x24, 0x41, 0x90, 0x24, 0x19, 0x92, 0x24, +0x89, 0x64, 0x49, 0x14, 0x24, 0x49, 0x90, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x25, 0x49, 0x92, 0x6D, 0x48, 0x92, 0x24, 0x41, 0x92, 0x00, 0x49, +0x92, 0x24, 0x09, 0x24, 0x09, 0x92, 0x24, 0x48, 0x92, 0x20, 0x59, 0xB0, +0x04, 0x49, 0x02, 0x24, 0x49, 0x92, 0x2C, 0x40, 0x90, 0x24, 0x41, 0x92, +0x24, 0x09, 0x8A, 0x24, 0x08, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x86, 0x26, 0xD8, 0xB6, 0xE5, 0x43, 0x22, 0x2C, +0xD9, 0xB7, 0x6D, 0x73, 0x00, 0x44, 0x28, 0xA4, 0x6D, 0x5F, 0xC4, 0x48, +0x00, 0x98, 0x6C, 0xDB, 0x56, 0x41, 0x8A, 0x07, 0xDC, 0x8F, 0xC7, 0xC3, +0xD2, 0xE1, 0x80, 0x26, 0x4E, 0x19, 0x75, 0xC7, 0x21, 0xB0, 0x54, 0x5D, +0x22, 0xA8, 0x43, 0x86, 0xED, 0x98, 0x37, 0x30, 0x9C, 0x04, 0x59, 0xDE, +0x7D, 0x42, 0x08, 0x24, 0xC6, 0x97, 0x79, 0x0A, 0x92, 0x13, 0x45, 0xE4, +0x35, 0xCA, 0x52, 0x08, 0x4C, 0x82, 0x78, 0xCB, 0x3E, 0x00, 0x16, 0x00, +0xD9, 0xFE, 0x6D, 0x13, 0x10, 0x28, 0xD0, 0x76, 0x69, 0x5B, 0x00, 0x16, +0x00, 0xB4, 0x21, 0xDB, 0x26, 0x10, 0x01, 0x90, 0x2D, 0xDB, 0x76, 0xB6, +0x69, 0xE9, 0x48, 0x82, 0x2C, 0xF9, 0x0C, 0xD3, 0x4E, 0x92, 0x04, 0x01, +0x65, 0x99, 0x92, 0x80, 0x04, 0xC9, 0x28, 0x91, 0x92, 0x94, 0x85, 0x08, +0x32, 0xD3, 0xE7, 0xD8, 0x00, 0xA0, 0x08, 0x10, 0xA4, 0x18, 0x06, 0x00, +0x01, 0x02, 0x08, 0x1C, 0x97, 0x9C, 0x0D, 0x8A, 0x00, 0x61, 0xD4, 0x40, +0x16, 0x02, 0x02, 0x86, 0x70, 0x5D, 0xAC, 0xA1, 0xA4, 0xD0, 0x24, 0x4F, +0x00, 0x20, 0x00, 0x10, 0x34, 0xC8, 0x92, 0x80, 0x48, 0x10, 0x20, 0xC3, +0xB2, 0x0F, 0x23, 0x58, 0x10, 0xB2, 0x32, 0xDB, 0x40, 0x81, 0x20, 0xA9, +0x75, 0xD1, 0x06, 0x0A, 0x02, 0x09, 0x2D, 0xC9, 0xB6, 0x18, 0xCA, 0x48, +0x4A, 0x49, 0x96, 0x1D, 0x54, 0x41, 0x12, 0xC3, 0xB2, 0x4F, 0x07, 0x61, +0x40, 0x10, 0x16, 0x05, 0x30, 0x44, 0x02, 0x88, 0x92, 0x21, 0x68, 0x68, +0x8A, 0x12, 0xB9, 0x25, 0x4B, 0x6E, 0x98, 0xB5, 0x8D, 0x00, 0x00, 0x00, +0x21, 0x40, 0x00, 0x00, 0x5B, 0x24, 0x00, 0x00, 0x10, 0x34, 0xC3, 0x02, +0x48, 0x08, 0x82, 0x30, 0x11, 0x04, 0x80, 0x40, 0x1B, 0xA0, 0x00, 0x09, +0x20, 0x20, 0x35, 0x05, 0x80, 0x02, 0x83, 0x00, 0x85, 0x58, 0x42, 0x26, +0x21, 0x30, 0x64, 0x00, 0x80, 0x22, 0x50, 0x00, 0x47, 0x00, 0x82, 0x84, +0x00, 0x1C, 0xC0, 0x6C, 0x27, 0x21, 0x92, 0xC0, 0x80, 0x64, 0x3B, 0x99, +0x1A, 0xA4, 0x96, 0x36, 0xD9, 0x48, 0x82, 0x24, 0x89, 0x11, 0xD1, 0x46, +0x92, 0xA0, 0x09, 0x00, 0x01, 0x22, 0x27, 0x49, 0xDA, 0x08, 0x00, 0x08, +0x28, 0x4D, 0x92, 0xA4, 0x00, 0x00, 0x00, 0xE9, 0x9A, 0xF0, 0x01, 0x40, +0x00, 0x50, 0x9B, 0xB4, 0xAD, 0x00, 0x81, 0xC0, 0xAD, 0x6B, 0x1A, 0x00, +0x89, 0x40, 0x00, 0x49, 0x9B, 0x26, 0x00, 0x04, 0xB1, 0xCC, 0x9B, 0xA6, +0x01, 0x00, 0x00, 0x40, 0xDB, 0xA6, 0x09, 0x00, 0x04, 0x00, 0xA5, 0x65, +0x9A, 0x42, 0x08, 0x0C, 0x80, 0x6D, 0xF2, 0x3E, 0x11, 0x03, 0x22, 0x68, +0xCA, 0x34, 0x21, 0x80, 0x00, 0x41, 0x83, 0x34, 0x09, 0x04, 0x42, 0x00, +0x2F, 0x69, 0x92, 0x08, 0x10, 0x10, 0x20, 0x49, 0x9A, 0xA4, 0x00, 0x80, +0x00, 0x49, 0xDA, 0x24, 0x01, 0x00, 0x20, 0x50, 0xD2, 0x2E, 0x09, 0xF7, +0x78, 0xD9, 0x90, 0x24, 0x01, 0xF2, 0x7D, 0xD3, 0x94, 0x20, 0x49, 0x12, +0x7B, 0xFB, 0x57, 0x06, 0x41, 0x06, 0x30, 0x9F, 0xEF, 0x37, 0x60, 0x02, +0x00, 0x65, 0x62, 0x31, 0x10, 0x04, 0xC1, 0xA2, 0x00, 0x13, 0x84, 0x24, +0x44, 0x10, 0x2C, 0x51, 0x0E, 0x20, 0x40, 0x10, 0x40, 0x3B, 0xE6, 0x8D, +0x00, 0x10, 0x24, 0x06, 0x7B, 0x9F, 0x10, 0x08, 0x41, 0x20, 0x43, 0x92, +0x00, 0x00, 0x09, 0x00, 0x68, 0xAC, 0x90, 0x04, 0x11, 0x8A, 0x02, 0x1E, +0xB3, 0x8E, 0x58, 0x82, 0x24, 0x3A, 0x3D, 0xFF, 0x90, 0x04, 0x49, 0xF2, +0x49, 0xCA, 0x9F, 0x24, 0x41, 0x12, 0x5D, 0x40, 0xFF, 0x26, 0x01, 0x92, +0xC0, 0xC3, 0xD4, 0x9F, 0x09, 0x91, 0x24, 0x08, 0x00, 0x10, 0xB4, 0x4D, +0x13, 0x02, 0xC1, 0x20, 0x83, 0x6A, 0xDB, 0x56, 0x0C, 0x06, 0x85, 0x5C, +0xD3, 0x20, 0x45, 0x02, 0x24, 0x51, 0xD2, 0x26, 0x89, 0x2C, 0x1C, 0x2E, +0xB0, 0x44, 0x51, 0x72, 0x24, 0x8A, 0xC9, 0x6D, 0xD8, 0x24, 0x10, 0xA8, +0x20, 0x68, 0xC2, 0x28, 0xC1, 0xD2, 0x39, 0x4B, 0x52, 0x34, 0x2C, 0x60, +0x8B, 0xC2, 0x24, 0x01, 0xEB, 0x20, 0x58, 0xF1, 0x08, 0x4C, 0x8B, 0x24, +0xCE, 0x46, 0x09, 0x2C, 0x83, 0xA4, 0x81, 0x35, 0x08, 0x40, 0xCA, 0x26, +0x35, 0x41, 0x09, 0x00, 0xB4, 0x15, 0xDB, 0x02, 0x2A, 0x03, 0x80, 0x2D, +0xD3, 0x76, 0x40, 0x01, 0x00, 0x6C, 0x93, 0xB6, 0x15, 0xA6, 0x28, 0x50, +0x9B, 0x36, 0x2D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x02, 0x00, 0x40, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x40, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x01, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, 0x04, 0x88, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, +0x08, 0x00, 0x00, 0x10, 0xC0, 0x00, 0x4C, 0xC0, 0x02, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x40, 0x48, 0x80, 0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x14, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, +0x10, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x01, 0x04, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, +0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x80, 0x00, 0x0C, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x08, 0x01, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x08, 0x10, 0x04, 0x00, 0x09, 0x00, +0x00, 0x82, 0x20, 0x04, 0x4C, 0x80, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, +0x21, 0x00, 0x40, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x02, 0x80, 0x80, +0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90, 0x08, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x08, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x00, +0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x80, 0x00, 0x08, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x20, +0x00, 0x00, 0x08, 0x10, 0x04, 0x10, 0x09, 0x00, 0x00, 0x82, 0x20, 0x04, +0xC8, 0x80, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x20, 0x00, 0x40, 0x00, +0x81, 0x04, 0x00, 0x04, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x20, 0x20, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, +0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x01, 0x40, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, +0x00, 0x00, 0x08, 0x80, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, +0x00, 0x00, 0x00, 0x00, 0x40, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x02, 0x02, 0x00, +0x00, 0x88, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x2C, 0x81, 0x80, 0x00, +0x00, 0x00, 0x60, 0x00, 0x09, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, +0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x40, 0x00, 0x08, +0x00, 0x00, 0x20, 0x01, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, +0x20, 0xA0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x82, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, +0x00, 0x02, 0x00, 0x08, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, +0x20, 0x04, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x20, 0x00, 0x40, +0x00, 0x10, 0x00, 0x08, 0x08, 0x10, 0x24, 0x00, 0x00, 0x00, 0x00, 0x02, +0x60, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, +0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x22, 0x00, +0x08, 0x10, 0x24, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x12, 0x04, +0x41, 0x00, 0x00, 0x40, 0x02, 0x20, 0x01, 0x00, 0x00, 0x42, 0x20, 0x08, +0x92, 0x00, 0x00, 0x00, 0x40, 0x18, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x03, 0x80, 0x00, 0x40, 0x00, 0x20, 0x08, 0x00, 0x01, 0x00, +0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, +0x80, 0x00, 0x00, 0x01, 0x00, 0x40, 0x12, 0x04, 0x41, 0x00, 0x00, 0x40, +0x02, 0x20, 0x01, 0x00, 0x00, 0x02, 0x21, 0x08, 0x92, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x00, 0x40, 0x00, 0x20, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x00, 0x00, 0x40, 0x00, +0x20, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x48, 0x00, 0x00, +0x20, 0x48, 0x10, 0x44, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, +0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x42, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x48, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2C, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, +0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x40, +0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x40, 0x00, 0x14, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x02, +0x84, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x09, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x81, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x00, +0x05, 0x52, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, +0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x24, 0x49, 0xB2, 0x24, 0x49, 0x12, 0x28, 0x48, 0x90, +0x05, 0x49, 0x92, 0x64, 0x48, 0x90, 0x65, 0x6A, 0x90, 0x24, 0x40, 0x96, +0x20, 0x59, 0x92, 0x04, 0x81, 0x0C, 0x89, 0xB0, 0x64, 0x4C, 0x12, 0x40, +0x49, 0x90, 0x0C, 0x08, 0x10, 0x05, 0x4B, 0x80, 0x04, 0x48, 0x92, 0x00, +0x00, 0xC2, 0x34, 0x01, 0x12, 0x24, 0x09, 0xE4, 0xD1, 0x9A, 0x04, 0x03, +0x00, 0x20, 0x09, 0x94, 0x49, 0x41, 0x02, 0x38, 0x48, 0x88, 0x0D, 0x58, +0xB2, 0x64, 0x00, 0x90, 0x05, 0x80, 0x82, 0x04, 0x01, 0x04, 0x48, 0x92, +0x04, 0x49, 0x92, 0x08, 0xC1, 0x92, 0x04, 0x09, 0x90, 0x64, 0xC0, 0x16, +0x24, 0x4A, 0x12, 0x24, 0x41, 0x12, 0x24, 0x59, 0x92, 0x20, 0x09, 0x24, +0x09, 0xB2, 0x25, 0x49, 0x12, 0x28, 0x09, 0x92, 0x05, 0x49, 0x9A, 0x60, +0x48, 0x90, 0x65, 0x4A, 0x92, 0x20, 0x40, 0x96, 0x24, 0x58, 0x82, 0x24, +0x89, 0x28, 0xC9, 0xB0, 0x05, 0x49, 0x10, 0x40, 0x49, 0x92, 0x0C, 0x48, +0x12, 0x04, 0x4B, 0x92, 0x20, 0x00, 0x80, 0x20, 0x40, 0x92, 0x24, 0x08, +0x90, 0x04, 0x08, 0x64, 0xD9, 0x92, 0x05, 0x00, 0x00, 0x20, 0x48, 0x94, +0x09, 0x41, 0x82, 0x00, 0x41, 0x92, 0x0D, 0x48, 0x92, 0x00, 0x40, 0x12, +0x25, 0x00, 0x92, 0x00, 0x01, 0x24, 0x01, 0x92, 0x25, 0x49, 0x92, 0x28, +0xC1, 0x92, 0x04, 0x41, 0x90, 0x64, 0x89, 0x96, 0x20, 0x4A, 0x00, 0x24, +0x41, 0x12, 0x24, 0x59, 0x12, 0x24, 0x09, 0x00, 0x44, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x81, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x22, 0x01, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x49, 0x92, 0x04, 0x00, 0x00, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, +0x20, 0x02, 0x00, 0x00, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x81, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, +0x02, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00, 0x80, 0x08, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x20, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x40, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x00, 0x00, 0x00, +0x20, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x40, 0x00, 0x00, +0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, 0x00, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, +0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x0D, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x24, 0x09, +0x12, 0x28, 0x49, 0x92, 0x05, 0x49, 0x92, 0x74, 0x49, 0xB2, 0x20, 0x4A, +0x92, 0x24, 0x41, 0xB2, 0x24, 0x58, 0x92, 0x24, 0x85, 0x24, 0x49, 0x92, +0x20, 0x40, 0x02, 0x20, 0x49, 0x92, 0x07, 0x09, 0xB2, 0x24, 0x4B, 0x90, +0x24, 0x08, 0x96, 0x20, 0x51, 0x92, 0x24, 0x49, 0x12, 0x24, 0x09, 0x2C, +0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x0D, 0x49, 0x90, 0x24, +0x49, 0x92, 0x24, 0x08, 0x92, 0x24, 0xC1, 0x12, 0x25, 0x40, 0x92, 0x24, +0x09, 0x24, 0x48, 0x96, 0x24, 0x49, 0x92, 0x28, 0x69, 0x92, 0x04, 0x49, +0x32, 0x64, 0x49, 0xB6, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, +0x92, 0x24, 0x09, 0x24, 0x4D, 0x90, 0x24, 0x49, 0x02, 0x28, 0x09, 0xD3, +0x05, 0x49, 0x92, 0x60, 0x49, 0xB0, 0x20, 0x4A, 0x92, 0x24, 0x41, 0xB2, +0x24, 0x58, 0x92, 0xA4, 0x89, 0x24, 0x41, 0x12, 0x24, 0x01, 0x10, 0x20, +0x09, 0x92, 0x05, 0x49, 0x10, 0x24, 0x4B, 0x52, 0x24, 0x40, 0x80, 0x20, +0x10, 0x82, 0x24, 0x49, 0x10, 0x20, 0x09, 0x2C, 0x41, 0x9A, 0x20, 0x01, +0x12, 0xA0, 0x69, 0xDA, 0x0D, 0x09, 0x80, 0x24, 0x49, 0xC2, 0x24, 0x48, +0x82, 0x24, 0xC1, 0xDA, 0x35, 0x0D, 0x12, 0x04, 0x09, 0x24, 0x09, 0x96, +0x24, 0x49, 0x92, 0x28, 0x48, 0x92, 0x04, 0x48, 0x92, 0x64, 0x49, 0xB6, +0x24, 0x4A, 0x90, 0x26, 0x41, 0x92, 0x24, 0x19, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x06, 0x4C, 0xF9, 0xF6, +0x7D, 0x03, 0x48, 0x2C, 0xD1, 0x96, 0x6C, 0x5E, 0x88, 0x18, 0x84, 0x94, +0x2D, 0x8B, 0x86, 0x40, 0x48, 0x91, 0xFD, 0xDB, 0x72, 0x5E, 0x00, 0x24, +0xC8, 0xB6, 0x6D, 0x53, 0x10, 0x64, 0xC3, 0xB7, 0x7D, 0x1B, 0xB2, 0x01, +0x0A, 0xAC, 0x6D, 0xDA, 0x42, 0x08, 0xC6, 0x00, 0x6C, 0xCB, 0x36, 0xC9, +0x9B, 0xA6, 0xF8, 0x9A, 0x57, 0x01, 0x90, 0x84, 0xC1, 0x34, 0x5D, 0x18, +0x0C, 0xA7, 0xCD, 0x94, 0x77, 0xCC, 0x13, 0x20, 0x44, 0x80, 0x6D, 0x8A, +0x27, 0x01, 0x34, 0x03, 0xD9, 0xB6, 0x65, 0x53, 0x00, 0x01, 0xD0, 0xB6, +0x6D, 0x5B, 0x00, 0x00, 0x1B, 0xB4, 0x6D, 0xDF, 0x06, 0x40, 0x88, 0x90, +0x6D, 0x9B, 0x76, 0xB6, 0x68, 0x87, 0x48, 0x80, 0x22, 0xB8, 0x24, 0x53, +0x47, 0xB0, 0x01, 0x08, 0x25, 0x41, 0x32, 0x30, 0x44, 0x31, 0x68, 0x9B, +0xB2, 0x9C, 0x24, 0x08, 0x14, 0x80, 0x6C, 0xC9, 0x10, 0x82, 0x20, 0xE1, +0x6C, 0x1F, 0x04, 0x92, 0x24, 0x29, 0x07, 0xDA, 0x90, 0x00, 0x24, 0x08, +0x20, 0xC3, 0x10, 0x05, 0x27, 0x11, 0x12, 0x3E, 0xA6, 0x4D, 0x40, 0x34, +0x08, 0xB2, 0x25, 0x4F, 0x06, 0x01, 0x04, 0x0A, 0x61, 0x4C, 0x53, 0xA0, +0x2C, 0x52, 0x20, 0x4B, 0xF2, 0x8C, 0x14, 0x38, 0x02, 0xB6, 0x48, 0xC8, +0x40, 0x09, 0x28, 0xA9, 0x65, 0xDA, 0x46, 0x42, 0x24, 0x09, 0x2C, 0xC9, +0xA5, 0x90, 0x02, 0x00, 0x2A, 0x8B, 0x36, 0x1D, 0x14, 0x08, 0x12, 0x03, +0x20, 0x30, 0x07, 0x04, 0x82, 0x50, 0x5A, 0x04, 0x3A, 0x49, 0x42, 0xA2, +0x16, 0x25, 0x48, 0x48, 0xB9, 0x24, 0x39, 0x01, 0x43, 0x66, 0x00, 0x94, +0x88, 0xC5, 0xB2, 0x42, 0x85, 0x4C, 0x42, 0x00, 0xB2, 0x09, 0x09, 0x08, +0x02, 0x22, 0x90, 0x0C, 0x40, 0x20, 0x91, 0x14, 0xD1, 0x64, 0x09, 0x4E, +0x92, 0xA4, 0x0C, 0x10, 0x18, 0xA0, 0x01, 0x00, 0x61, 0x00, 0x9A, 0x90, +0x81, 0x09, 0x81, 0x20, 0x3A, 0xA2, 0x0C, 0x4C, 0x41, 0x80, 0xE0, 0x21, +0x0D, 0x02, 0x12, 0x26, 0x0C, 0x59, 0x92, 0x6C, 0x23, 0x09, 0x92, 0xC0, +0x82, 0x48, 0x3B, 0x48, 0xD2, 0xA4, 0x32, 0x20, 0xC0, 0x4C, 0xD2, 0x00, +0x89, 0x05, 0x42, 0x46, 0x93, 0x04, 0x09, 0x00, 0x08, 0x15, 0x07, 0x0D, +0x92, 0x08, 0x00, 0x00, 0x20, 0x6D, 0x93, 0xA6, 0x08, 0x10, 0x02, 0x69, +0xDB, 0x35, 0x01, 0x82, 0x20, 0x50, 0x02, 0x34, 0x8D, 0x00, 0x00, 0x02, +0xBD, 0x4D, 0xD2, 0x40, 0x40, 0x00, 0x00, 0x59, 0x92, 0x26, 0x02, 0x00, +0x10, 0x68, 0x93, 0xB4, 0x01, 0x02, 0x10, 0x48, 0xD3, 0xB4, 0x09, 0x0A, +0x00, 0x04, 0x25, 0x6D, 0xDB, 0x12, 0x04, 0x14, 0x04, 0x69, 0x93, 0x26, +0x00, 0x00, 0x01, 0x68, 0xD8, 0xB6, 0x01, 0x00, 0x40, 0x40, 0xD3, 0x36, +0x0D, 0x04, 0x00, 0x00, 0x27, 0x49, 0xDA, 0x08, 0x00, 0x12, 0x20, 0x49, +0x92, 0xA4, 0x00, 0x00, 0x00, 0x4D, 0xFA, 0x65, 0x01, 0x80, 0x20, 0x51, +0x93, 0x24, 0x09, 0x3F, 0x71, 0xEA, 0xB0, 0x60, 0x69, 0x73, 0x7D, 0x92, +0x97, 0x00, 0x48, 0x10, 0x77, 0xEB, 0xE0, 0x06, 0x00, 0x82, 0x72, 0x7D, +0x17, 0x3C, 0xD9, 0x82, 0x20, 0xA2, 0xFF, 0xD9, 0x40, 0x20, 0x09, 0xB2, +0xAD, 0xDF, 0x86, 0x24, 0x49, 0x11, 0x69, 0x9F, 0x66, 0x04, 0x48, 0x02, +0x00, 0xDD, 0xA3, 0x07, 0x0C, 0x02, 0x24, 0x34, 0xE7, 0x50, 0x98, 0x00, +0x00, 0x20, 0x4B, 0x03, 0x82, 0x14, 0x48, 0x10, 0xF3, 0x1D, 0xF2, 0x04, +0x03, 0x00, 0xE0, 0x93, 0xA2, 0x09, 0x08, 0x80, 0x20, 0x3A, 0xED, 0xFD, +0x90, 0x24, 0x01, 0xB2, 0x4B, 0xC9, 0xDE, 0x24, 0x49, 0x12, 0x7D, 0xFA, +0xF7, 0x22, 0x01, 0x92, 0xE0, 0x53, 0xC6, 0x1E, 0x48, 0x93, 0x24, 0x48, +0x93, 0x00, 0xD5, 0x29, 0xCF, 0x02, 0x81, 0xE0, 0x80, 0x4D, 0x9A, 0x70, +0xC8, 0x92, 0x15, 0x4C, 0x92, 0xA6, 0x85, 0x24, 0x0C, 0x51, 0x4B, 0x26, +0xA9, 0x28, 0x01, 0x34, 0x25, 0x69, 0xBB, 0x02, 0x01, 0xA0, 0x80, 0x6C, +0xCB, 0x34, 0x4C, 0x60, 0x2D, 0x44, 0xDA, 0xA6, 0x21, 0x10, 0x64, 0x40, +0xDA, 0x26, 0x29, 0x41, 0x41, 0x1A, 0x94, 0x41, 0x80, 0xC0, 0x60, 0x68, +0x08, 0x6D, 0xCA, 0x35, 0x80, 0x50, 0x20, 0x48, 0x80, 0x20, 0x10, 0xD4, +0x10, 0x45, 0xDB, 0xE4, 0x28, 0x00, 0x01, 0x12, 0xB5, 0x6D, 0xD3, 0x02, +0x18, 0x24, 0x80, 0x6D, 0x9B, 0x76, 0xC1, 0x16, 0x08, 0x68, 0x9B, 0xBA, +0x55, 0x30, 0x19, 0x50, 0xDA, 0xB6, 0x2F, 0x00, 0x82, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x88, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x04, +0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x04, 0x00, 0xA0, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x10, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x49, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x24, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, +0x00, 0x00, 0xC0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x80, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, +0x00, 0x00, 0x00, 0x20, 0x0A, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x40, 0x02, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x81, 0x00, +0x09, 0x04, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, +0x08, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, +0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x04, 0x40, 0x02, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, +0x00, 0x11, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x40, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, +0x20, 0x20, 0x00, 0x90, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x40, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x20, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x24, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x42, 0x02, 0x01, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x10, 0x00, +0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x04, +0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x42, +0x20, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x81, 0x00, 0x00, 0x00, 0x44, 0x20, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x02, +0x00, 0x00, 0x40, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x80, +0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x40, 0x40, 0x00, 0x00, 0x20, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x20, +0x08, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x80, 0x00, 0x00, 0x20, 0x01, 0x00, 0x80, 0x80, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x41, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x02, 0x00, 0x40, +0x02, 0x30, 0x02, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x40, 0x20, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00, 0x21, 0x01, 0x00, +0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, +0x04, 0x00, 0x00, 0x08, 0x20, 0x00, 0x10, 0x44, 0x00, 0x00, 0x84, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x45, 0x00, +0x00, 0x00, 0x90, 0x00, 0x00, 0x02, 0x02, 0x40, 0x02, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x40, 0x00, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, +0x00, 0x00, 0x00, 0x82, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, +0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x08, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x89, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x91, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x01, 0x44, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x80, 0x24, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, +0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x10, 0x40, 0x00, 0x00, 0x00, 0x04, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x84, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x19, 0x90, 0x24, 0x49, +0x90, 0x28, 0x98, 0x92, 0x01, 0x09, 0x18, 0x64, 0x41, 0xA0, 0x24, 0x4A, +0x10, 0x20, 0x41, 0x92, 0x4C, 0x51, 0x92, 0x24, 0x89, 0x20, 0x49, 0x92, +0x24, 0x49, 0x92, 0x40, 0x40, 0x92, 0x04, 0x49, 0x92, 0x34, 0x49, 0x86, +0x3D, 0x48, 0x92, 0x24, 0x51, 0x9C, 0x20, 0x01, 0x82, 0x24, 0x29, 0x24, +0x59, 0x90, 0x25, 0x48, 0x92, 0x20, 0x09, 0x90, 0x00, 0x09, 0x92, 0x24, +0x4B, 0x82, 0x04, 0x60, 0x12, 0x24, 0x01, 0x82, 0x14, 0x49, 0xB2, 0x24, +0x09, 0x04, 0x4B, 0x82, 0x24, 0x49, 0x92, 0x28, 0x19, 0x80, 0x05, 0x49, +0x92, 0x64, 0x09, 0x01, 0x26, 0x4A, 0x92, 0x24, 0x41, 0x90, 0x24, 0x58, +0x32, 0x31, 0x09, 0x2C, 0x59, 0x92, 0x05, 0x09, 0x92, 0x28, 0x98, 0x92, +0x01, 0x09, 0x00, 0x60, 0x49, 0xB2, 0x20, 0x0A, 0x10, 0x04, 0x41, 0x92, +0x6C, 0x59, 0x92, 0x04, 0x88, 0x24, 0x41, 0x92, 0x25, 0x49, 0x92, 0x60, +0x48, 0x12, 0x04, 0x48, 0x82, 0x24, 0x09, 0x96, 0x2D, 0x08, 0x82, 0x02, +0x11, 0x94, 0x20, 0x09, 0x83, 0x04, 0x0C, 0x20, 0x59, 0x92, 0x24, 0x08, +0x92, 0x20, 0x49, 0x92, 0x04, 0x48, 0x82, 0x24, 0x4B, 0x92, 0x04, 0x40, +0x92, 0x24, 0x01, 0x92, 0x04, 0x40, 0x12, 0x24, 0x29, 0x04, 0x4B, 0x92, +0x21, 0x45, 0x92, 0x28, 0x59, 0x82, 0x05, 0x09, 0x92, 0x60, 0x49, 0x10, +0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x12, 0x34, 0x09, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x10, 0x00, +0x84, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, +0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x20, 0x01, 0x00, 0x00, 0x08, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x08, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x84, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, +0x08, 0x00, 0x00, 0x80, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x40, 0x20, 0x00, +0x00, 0x00, 0x20, 0x00, 0x08, 0x41, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, +0x00, 0x81, 0x40, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x49, 0x96, 0x24, 0x58, 0x02, 0x28, 0x49, 0xD2, 0x04, 0x49, 0x06, 0x44, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x20, 0xC1, 0x92, 0x24, 0x59, 0x82, 0x24, +0xA9, 0x64, 0x49, 0x92, 0x24, 0x49, 0x92, 0x60, 0x43, 0x96, 0x04, 0x40, +0x42, 0x24, 0x41, 0xD6, 0x24, 0x08, 0x92, 0x24, 0x41, 0x92, 0x44, 0x49, +0x82, 0x24, 0x09, 0x24, 0x49, 0xB2, 0x25, 0x49, 0x92, 0x60, 0x49, 0x98, +0x04, 0x49, 0x92, 0x24, 0x4B, 0x92, 0xA4, 0x48, 0x92, 0x24, 0x01, 0x92, +0x34, 0x41, 0x92, 0x24, 0x2D, 0xA4, 0xCB, 0x92, 0x24, 0x49, 0x90, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x09, 0x92, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x82, 0x24, 0x59, 0x92, 0x04, 0x09, 0x04, 0x49, 0x96, 0x04, 0x49, +0x90, 0x28, 0x00, 0x12, 0x06, 0x49, 0x82, 0x64, 0x49, 0x02, 0x24, 0x4A, +0x80, 0x24, 0xC1, 0x12, 0x00, 0x59, 0x02, 0x24, 0x88, 0x76, 0x49, 0x92, +0x24, 0x49, 0x92, 0x50, 0x4B, 0x96, 0x04, 0x40, 0x82, 0x26, 0x6D, 0x96, +0x04, 0x48, 0x12, 0x24, 0x41, 0x9A, 0x64, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0xB2, 0x20, 0x49, 0x92, 0x60, 0x49, 0x92, 0x04, 0x48, 0x92, 0x24, +0x4B, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, +0x09, 0x24, 0xC3, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, +0x12, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x9A, 0x36, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, +0x00, 0x00, 0x00, 0x21, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, +0x02, 0x60, 0xD8, 0xB6, 0xE9, 0x03, 0xB0, 0x50, 0xD0, 0xB6, 0xAD, 0x53, +0x84, 0x49, 0xA1, 0xB4, 0x6D, 0x5B, 0x0E, 0x69, 0x78, 0x94, 0x6D, 0x7B, +0x76, 0x81, 0x87, 0x2A, 0x94, 0x32, 0x67, 0xE3, 0x87, 0x06, 0x0B, 0xBB, +0x45, 0x3B, 0x83, 0xAC, 0x43, 0x20, 0x6F, 0xDD, 0xF0, 0x22, 0x01, 0xCA, +0x46, 0x9F, 0x16, 0x4D, 0xD1, 0x30, 0xCC, 0xAB, 0xAC, 0x03, 0xD0, 0x00, +0x81, 0xA6, 0x6E, 0x17, 0xC3, 0x22, 0x2A, 0xB8, 0xC6, 0x3B, 0x02, 0xA4, +0x58, 0x05, 0xCD, 0xD1, 0x30, 0x15, 0xC1, 0x0A, 0xC9, 0xB2, 0x64, 0x13, +0x00, 0x21, 0xD1, 0xB6, 0x6D, 0x5B, 0x92, 0x65, 0x01, 0xBE, 0xEF, 0xDF, +0x1E, 0x00, 0xC1, 0x10, 0x4D, 0x93, 0x76, 0xA6, 0x6C, 0xA9, 0x08, 0x51, +0x20, 0xB0, 0x05, 0x0B, 0x42, 0x02, 0x40, 0xA0, 0x21, 0x82, 0x16, 0x80, +0x04, 0xE0, 0x60, 0x82, 0x8E, 0x91, 0x30, 0xC8, 0x08, 0x13, 0xA0, 0x51, +0x00, 0x15, 0x18, 0x51, 0x2A, 0xC9, 0x88, 0x84, 0x0C, 0x08, 0xAC, 0x51, +0x91, 0x44, 0x04, 0x43, 0x90, 0xD9, 0xB3, 0x84, 0x09, 0x29, 0x30, 0xF3, +0x2C, 0x6B, 0x18, 0x86, 0x75, 0xB0, 0xA4, 0x4B, 0x07, 0x01, 0x25, 0x20, +0xAE, 0x69, 0x98, 0x84, 0x0D, 0x81, 0x21, 0x6B, 0xA6, 0x00, 0x06, 0x02, +0x04, 0x82, 0x24, 0xC1, 0x18, 0x8D, 0x29, 0x89, 0x65, 0x58, 0x46, 0x42, +0x32, 0x88, 0xAE, 0x38, 0xB7, 0x10, 0x00, 0x68, 0x62, 0x4B, 0x12, 0x1C, +0x14, 0x01, 0x10, 0x0B, 0x12, 0x04, 0x07, 0x41, 0x1A, 0x58, 0x02, 0x04, +0x39, 0x09, 0x11, 0x24, 0x62, 0x20, 0x71, 0x68, 0x98, 0x20, 0x31, 0x20, +0x63, 0x62, 0x52, 0x06, 0x88, 0x68, 0x11, 0x00, 0x31, 0x61, 0x10, 0x20, +0x91, 0x03, 0x00, 0x40, 0x81, 0x10, 0x13, 0x85, 0x0C, 0x50, 0x08, 0xA0, +0x40, 0x06, 0x00, 0x02, 0x10, 0x32, 0x05, 0x06, 0xF0, 0x94, 0x01, 0x00, +0x10, 0x40, 0x52, 0x04, 0x08, 0x2B, 0xD0, 0x22, 0x71, 0x45, 0x64, 0x60, +0x50, 0x06, 0x91, 0x81, 0x41, 0x49, 0x02, 0x04, 0x08, 0x0D, 0x11, 0x66, +0xA3, 0x69, 0x90, 0xC0, 0x80, 0x00, 0xBB, 0x49, 0x1A, 0x20, 0x14, 0x00, +0xC0, 0x04, 0x04, 0x22, 0x99, 0x24, 0x00, 0x06, 0x92, 0x20, 0x0C, 0x00, +0x08, 0xB0, 0x27, 0x4D, 0xDA, 0x08, 0x20, 0x02, 0x20, 0x69, 0x53, 0x26, +0x40, 0x08, 0x04, 0x69, 0x93, 0xA4, 0x49, 0x00, 0x08, 0x50, 0xD2, 0xA4, +0x89, 0x21, 0x00, 0x10, 0x35, 0x6D, 0x9B, 0x42, 0x02, 0x80, 0x88, 0x4D, +0x9B, 0x34, 0x80, 0x08, 0x05, 0x4C, 0xBA, 0xA6, 0x81, 0x00, 0x00, 0x40, +0x9B, 0x34, 0x2D, 0x41, 0x00, 0xA0, 0x35, 0x45, 0xD3, 0x81, 0x00, 0x00, +0x00, 0x6D, 0xD3, 0x26, 0x82, 0x22, 0x0C, 0x4C, 0xDB, 0xA6, 0x01, 0x20, +0x00, 0x48, 0xD3, 0x26, 0x0D, 0x00, 0x00, 0x10, 0xB7, 0x6D, 0xDB, 0x00, +0x41, 0x10, 0xA0, 0x49, 0x9E, 0x26, 0x80, 0x10, 0x04, 0x4D, 0x9A, 0x2E, +0x01, 0x02, 0x00, 0x51, 0x92, 0xB4, 0x09, 0x37, 0x65, 0x0A, 0x90, 0x20, +0x21, 0xB3, 0x4B, 0xE8, 0x95, 0x04, 0x88, 0x10, 0x2F, 0xF3, 0x10, 0x06, +0x4C, 0x12, 0x30, 0xDB, 0x36, 0x3D, 0x09, 0x12, 0x34, 0x84, 0xDC, 0xC8, +0x80, 0x00, 0x40, 0x81, 0x78, 0x11, 0x06, 0xA0, 0x40, 0x02, 0x48, 0x53, +0x32, 0x20, 0x41, 0x18, 0x30, 0xD0, 0xA7, 0x85, 0x44, 0x82, 0x00, 0xA2, +0x2A, 0x4B, 0x80, 0x28, 0x08, 0x22, 0x8B, 0x9F, 0x85, 0x00, 0x08, 0x10, +0x38, 0xD1, 0x02, 0x20, 0x00, 0x10, 0x50, 0x53, 0x35, 0x00, 0x08, 0x90, +0x30, 0x3A, 0x2C, 0xE9, 0x40, 0x80, 0x00, 0xF2, 0x08, 0xCB, 0x1E, 0x34, +0x41, 0x10, 0x6F, 0xA2, 0xF3, 0x20, 0x41, 0x90, 0x40, 0xD1, 0x24, 0x1E, +0x49, 0x02, 0x24, 0x40, 0x81, 0x13, 0xB4, 0x7D, 0x53, 0x02, 0xD8, 0xB0, +0x86, 0x6D, 0x1A, 0x76, 0x98, 0x14, 0x08, 0x4C, 0xD3, 0x36, 0x85, 0x14, +0x00, 0x58, 0xBB, 0x54, 0xAD, 0x16, 0x6A, 0xA6, 0xA1, 0x4B, 0xD1, 0x12, +0x40, 0x3C, 0x05, 0x62, 0xD2, 0x06, 0x64, 0x22, 0xE0, 0xE8, 0xD1, 0x30, +0x01, 0x28, 0x5C, 0x09, 0xD0, 0xA0, 0x0B, 0x08, 0x07, 0x00, 0xA0, 0x72, +0x1E, 0x12, 0x0D, 0xB0, 0x82, 0x4D, 0xB8, 0x31, 0x00, 0x9A, 0x11, 0x40, +0x10, 0x14, 0x61, 0x1C, 0x8A, 0x42, 0x5B, 0xB4, 0x29, 0x60, 0xCA, 0x10, +0x24, 0x59, 0xD2, 0x22, 0x1A, 0xA6, 0x00, 0x6D, 0xD3, 0x76, 0x41, 0x86, +0x08, 0x60, 0x59, 0xB0, 0x25, 0x98, 0x7F, 0x51, 0xDF, 0xB6, 0x29, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x24, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, +0x00, 0x04, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x12, 0x00, 0x20, 0x08, 0x12, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x04, 0x01, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x10, 0x04, 0x00, +0x00, 0x00, 0x00, 0x40, 0x41, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x08, 0x00, 0x00, 0x10, +0x40, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x04, 0x00, 0x40, 0x10, 0x00, 0x00, +0x43, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, +0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x40, 0x10, 0x60, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x01, 0x10, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x80, 0x00, 0x20, 0x08, 0x20, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, +0x41, 0x00, 0x00, 0x10, 0x00, 0x02, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, +0x01, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, +0x10, 0x00, 0x03, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, +0x04, 0x00, 0x04, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x10, 0x00, 0x02, 0x01, 0x10, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, +0xA0, 0x00, 0x08, 0x80, 0x00, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x41, 0x00, 0x00, 0x10, +0x40, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x04, +0x00, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x02, +0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, +0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x20, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, +0x00, 0x82, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, +0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x41, 0x80, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x44, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x06, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x08, +0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, +0x01, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x08, 0x40, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x20, +0x20, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x82, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x00, 0x00, +0x00, 0x90, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x48, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x08, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x20, 0x00, 0x20, +0x08, 0x00, 0x02, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x04, 0x10, 0x90, 0x00, 0x20, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x40, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x05, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x09, 0x00, 0x40, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x41, 0x60, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, +0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x90, 0x80, 0x20, +0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, +0x10, 0x00, 0x00, 0x80, 0x00, 0x20, 0x10, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, +0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x80, +0x10, 0x00, 0x10, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x11, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x48, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x10, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x90, +0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x41, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x01, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x08, 0x00, 0x80, 0x10, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x00, 0x01, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x40, 0x00, 0x02, 0x00, 0x80, 0x00, 0x01, 0x01, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x80, 0x48, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x01, 0x00, 0x10, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x24, +0x09, 0x92, 0x25, 0x09, 0x82, 0x24, 0x08, 0xD2, 0x04, 0x49, 0x90, 0x42, +0x89, 0x82, 0x60, 0x4A, 0x92, 0x2C, 0x41, 0x12, 0x24, 0x51, 0x12, 0x24, +0x99, 0x34, 0x41, 0x90, 0x05, 0x49, 0xB2, 0x20, 0x49, 0x12, 0x00, 0x4B, +0x93, 0x24, 0x09, 0x92, 0x20, 0x08, 0x82, 0x24, 0x50, 0x10, 0x28, 0x08, +0x80, 0x24, 0x29, 0x20, 0x19, 0x82, 0x25, 0x09, 0x92, 0x00, 0x49, 0x12, +0x00, 0xC9, 0x92, 0x24, 0x09, 0x82, 0x04, 0x48, 0x92, 0x24, 0x41, 0x92, +0x24, 0x48, 0xB2, 0x04, 0x09, 0x20, 0x09, 0x82, 0x25, 0x09, 0x82, 0x0C, +0xCB, 0xB0, 0x04, 0x09, 0x90, 0x64, 0x48, 0x16, 0x25, 0x48, 0x92, 0x25, +0x41, 0x82, 0x29, 0x41, 0x92, 0x44, 0x09, 0x24, 0x08, 0x12, 0x20, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x12, 0x44, 0xC9, 0x02, 0x64, 0x4A, +0x10, 0x04, 0x40, 0x02, 0x24, 0x58, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, +0x24, 0x09, 0x92, 0x20, 0x40, 0x92, 0x04, 0x4D, 0x82, 0x24, 0x41, 0x82, +0x24, 0x48, 0x82, 0x22, 0x10, 0x90, 0x2C, 0x09, 0x92, 0x04, 0x09, 0x20, +0x59, 0x82, 0x24, 0x09, 0x02, 0x00, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, +0x48, 0x82, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x09, 0x82, 0x2C, +0x09, 0x24, 0x49, 0x12, 0x24, 0x4D, 0x92, 0x28, 0xCB, 0xB2, 0x04, 0x41, +0x10, 0x64, 0x49, 0x96, 0x25, 0x4A, 0x8A, 0x00, 0x41, 0x92, 0x29, 0x59, +0x12, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, +0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x28, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x01, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x20, 0x40, 0x40, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x88, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, +0x02, 0x00, 0x00, 0x10, 0x82, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, +0x00, 0x01, 0x00, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x90, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x80, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, +0x10, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x40, 0x00, 0x24, 0xD9, 0x92, 0x04, 0x49, 0x02, 0x20, 0x51, 0x92, +0x04, 0x48, 0xD2, 0x44, 0xC9, 0xA2, 0x64, 0x4A, 0x12, 0x04, 0x41, 0x90, +0x24, 0x59, 0x92, 0x04, 0x80, 0x24, 0x49, 0x12, 0x20, 0x09, 0x92, 0x40, +0x4B, 0x93, 0x04, 0x49, 0x90, 0x20, 0x49, 0x82, 0x24, 0x08, 0x92, 0x24, +0x40, 0x02, 0x24, 0x4D, 0x12, 0x20, 0x00, 0x24, 0x50, 0x12, 0x20, 0x09, +0x9A, 0x20, 0x48, 0x92, 0x04, 0xC9, 0x92, 0x24, 0x48, 0x90, 0x2C, 0x48, +0x92, 0x24, 0x41, 0x92, 0x04, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, +0x20, 0x09, 0x92, 0x20, 0x49, 0x10, 0x04, 0x49, 0x92, 0x24, 0x69, 0x82, +0x24, 0x4A, 0x92, 0x24, 0x41, 0x90, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, +0xD8, 0x92, 0x25, 0x09, 0x92, 0x28, 0x59, 0x92, 0x04, 0x49, 0x92, 0x44, +0xC9, 0xB0, 0x64, 0x4A, 0x92, 0x25, 0x41, 0x82, 0x24, 0x59, 0x80, 0x24, +0xA8, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x60, 0x4B, 0x92, 0x04, 0x49, +0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x12, 0x20, 0x41, 0x92, 0x24, 0x49, +0x82, 0x20, 0x0C, 0x24, 0x59, 0x92, 0x25, 0x48, 0x92, 0x20, 0x49, 0x82, +0x04, 0x49, 0x12, 0x24, 0x49, 0x92, 0x2C, 0x48, 0x92, 0x24, 0x41, 0x92, +0x24, 0x49, 0x02, 0x24, 0x08, 0x24, 0x09, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x40, 0x92, 0x64, 0x49, 0x92, 0x24, 0x48, 0x12, 0x24, +0x41, 0x82, 0x24, 0x59, 0x80, 0x04, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, +0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x10, 0x20, 0x00, 0x08, 0x10, 0x61, 0xD8, 0xB4, 0x4D, 0x13, 0x28, 0xA3, +0xD0, 0x96, 0x65, 0x59, 0x02, 0x29, 0xC9, 0xB4, 0x6D, 0xDB, 0x2E, 0x44, +0x52, 0x96, 0x7D, 0xDF, 0x77, 0x68, 0x10, 0x60, 0x18, 0xB4, 0x69, 0x03, +0x89, 0x58, 0xC9, 0x92, 0x2D, 0x1B, 0x16, 0x04, 0x5A, 0xF4, 0x6D, 0xDB, +0x92, 0x04, 0x08, 0x86, 0x7B, 0xFB, 0x36, 0x4C, 0xDA, 0x85, 0xE8, 0xDD, +0x5C, 0x41, 0x9A, 0xA4, 0xCA, 0x04, 0x79, 0x18, 0x5A, 0x36, 0x4E, 0x9C, +0xB4, 0xCA, 0x03, 0x24, 0x4D, 0x00, 0x7D, 0xC2, 0x27, 0x70, 0x18, 0x1D, +0x70, 0x94, 0x2D, 0x23, 0x0E, 0x0D, 0x50, 0x97, 0x6D, 0x5B, 0x08, 0x4D, +0x0B, 0xD4, 0x7D, 0xFB, 0x5E, 0x04, 0x01, 0xD0, 0x7C, 0xDA, 0x74, 0xB2, +0x2D, 0x08, 0x40, 0x00, 0x10, 0xA9, 0x45, 0x58, 0x02, 0x32, 0x1C, 0x0A, +0x65, 0xC2, 0x12, 0x80, 0x00, 0x48, 0x40, 0x1F, 0xC0, 0x99, 0x20, 0x48, +0x10, 0x92, 0x24, 0x9B, 0x8C, 0x00, 0x00, 0x90, 0x64, 0x83, 0x06, 0xBE, +0x44, 0x08, 0x30, 0xCB, 0x84, 0x00, 0xA6, 0x00, 0xE2, 0x5D, 0xBE, 0x81, +0x00, 0x01, 0x00, 0xFA, 0x37, 0x4E, 0x58, 0x20, 0x05, 0xB2, 0x65, 0x4F, +0x44, 0x20, 0x00, 0x06, 0x27, 0xED, 0xF0, 0x20, 0x69, 0x18, 0x62, 0x5F, +0xD2, 0x04, 0x20, 0x10, 0x02, 0x86, 0x64, 0xC0, 0x80, 0xA9, 0x40, 0x99, +0x21, 0x50, 0xC6, 0x20, 0x06, 0x89, 0x25, 0x84, 0xB8, 0xA0, 0x02, 0x41, +0x32, 0x5D, 0xB2, 0x9D, 0x81, 0x48, 0x11, 0x59, 0x80, 0x20, 0x07, 0x09, +0x5A, 0x02, 0x16, 0x06, 0x39, 0x49, 0x12, 0xB4, 0xA0, 0x24, 0x54, 0x60, +0x12, 0x80, 0x88, 0x08, 0x04, 0x62, 0x82, 0xA2, 0x80, 0x61, 0x13, 0x00, +0x15, 0x28, 0x52, 0x42, 0x3B, 0x10, 0x80, 0x49, 0x90, 0x10, 0x03, 0x05, +0x01, 0x20, 0xC3, 0x84, 0x10, 0x22, 0x00, 0x00, 0x80, 0x04, 0x05, 0x13, +0x48, 0x80, 0x85, 0x00, 0xC0, 0x10, 0x80, 0xA0, 0x09, 0x00, 0x49, 0x04, +0xD8, 0x12, 0x0C, 0x00, 0x06, 0x06, 0x90, 0x08, 0x0C, 0x41, 0x4B, 0x82, +0x28, 0x21, 0x0A, 0x64, 0x07, 0x08, 0x82, 0x30, 0xD8, 0x00, 0x3B, 0x40, +0x8A, 0x24, 0x4A, 0x20, 0xD0, 0x08, 0x83, 0x10, 0x69, 0x00, 0x0B, 0x06, +0x8E, 0x20, 0x09, 0x20, 0x08, 0x10, 0x37, 0x49, 0x9B, 0x2A, 0x00, 0x12, +0x20, 0x69, 0x9A, 0xBE, 0x01, 0x82, 0x04, 0x69, 0xD2, 0xB5, 0x41, 0x90, +0xC4, 0x58, 0x92, 0xA0, 0x89, 0x00, 0x01, 0x40, 0xB5, 0x69, 0x92, 0x00, +0x40, 0x00, 0x80, 0x6D, 0xD2, 0x24, 0x01, 0x00, 0x14, 0x68, 0xF3, 0xA4, +0x01, 0x06, 0xA4, 0x45, 0x92, 0x26, 0x29, 0x48, 0x36, 0x00, 0x35, 0x69, +0xD3, 0x02, 0x00, 0x0C, 0x00, 0x69, 0xD2, 0x26, 0x26, 0x25, 0x40, 0x78, +0xDB, 0x34, 0x01, 0x05, 0x40, 0x41, 0x96, 0xB6, 0x29, 0x00, 0x00, 0x00, +0x87, 0x6D, 0xDA, 0x00, 0x40, 0x80, 0xA0, 0x68, 0x9A, 0x26, 0x48, 0x80, +0x04, 0x29, 0xDA, 0x24, 0x51, 0x04, 0x20, 0x50, 0x9B, 0x36, 0x09, 0x56, +0x45, 0xC3, 0x80, 0x24, 0x44, 0x91, 0x67, 0x09, 0x97, 0x04, 0x41, 0x00, +0xEC, 0x19, 0xB2, 0x06, 0x09, 0x02, 0xA0, 0x4F, 0x33, 0x95, 0x49, 0x56, +0x24, 0x06, 0x6E, 0x9A, 0x00, 0x04, 0x49, 0xA2, 0x34, 0xCB, 0x06, 0x00, +0x29, 0x12, 0x5C, 0xDB, 0xA2, 0x04, 0x08, 0x13, 0xE0, 0xD0, 0x18, 0x08, +0x49, 0x90, 0x04, 0x33, 0x01, 0x57, 0x80, 0x84, 0x08, 0x30, 0x41, 0x12, +0x86, 0x04, 0x09, 0x10, 0x81, 0x88, 0xA2, 0x84, 0x00, 0x82, 0xD0, 0x9A, +0xB0, 0x08, 0x49, 0x00, 0x04, 0x3D, 0x61, 0xE3, 0x30, 0x00, 0x01, 0x52, +0x01, 0x5B, 0x1F, 0x05, 0x45, 0x10, 0x33, 0x77, 0xFA, 0x44, 0x25, 0x92, +0x20, 0x92, 0x16, 0x1F, 0x40, 0x80, 0x24, 0x84, 0x52, 0x9E, 0xBD, 0x6D, +0x93, 0x40, 0x88, 0xA0, 0x84, 0x4D, 0xD3, 0x65, 0x1A, 0x10, 0x29, 0x5C, +0xDB, 0x3E, 0x15, 0xA0, 0x29, 0x50, 0xCB, 0x30, 0xAC, 0x9C, 0xC8, 0x25, +0x25, 0x4D, 0x9F, 0x20, 0x80, 0x24, 0x09, 0x49, 0x9F, 0x26, 0xC8, 0x30, +0x68, 0x0C, 0x9A, 0x36, 0x01, 0x81, 0x41, 0x4A, 0xED, 0x96, 0x3B, 0x84, +0x80, 0x38, 0x05, 0x04, 0x8A, 0xC0, 0x3E, 0x51, 0x80, 0x4D, 0x82, 0x34, +0x00, 0x40, 0x01, 0x44, 0x02, 0xA4, 0x20, 0xE0, 0x23, 0x4E, 0x82, 0x24, +0x0C, 0xCA, 0x91, 0x12, 0x15, 0x4F, 0x9B, 0x42, 0x02, 0xA6, 0x00, 0x4C, +0xF3, 0x76, 0x90, 0x12, 0x05, 0x0C, 0xCA, 0x86, 0x85, 0xE2, 0xC4, 0x10, +0xC2, 0xB6, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x10, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, +0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x81, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, +0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x08, 0xA0, 0x01, 0x20, 0x00, 0x00, 0x01, 0x00, 0x40, 0x24, 0x00, 0x00, +0x90, 0x2C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x40, 0x10, 0x00, 0x20, 0x01, 0x10, +0x10, 0x00, 0x00, 0x20, 0x48, 0x00, 0x40, 0x10, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x01, 0x01, 0x04, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x40, 0x24, 0x00, 0x00, 0x90, 0x24, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x10, 0x00, 0x90, 0x04, +0x00, 0x00, 0x40, 0x10, 0x00, 0x20, 0x01, 0x10, 0x00, 0x00, 0x00, 0x20, +0x48, 0x00, 0x40, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, +0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x22, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, +0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x10, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, +0x41, 0x02, 0x80, 0x01, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x16, 0x00, 0x00, 0x04, 0x00, +0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x40, 0x00, +0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x20, 0x00, 0x20, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, +0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x08, +0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x01, 0x80, 0x00, 0x08, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x01, 0x80, +0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x10, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, +0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x88, 0x00, 0x00, +0x00, 0x00, 0x40, 0x80, 0x00, 0x05, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x10, 0x80, 0x02, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x30, 0x00, 0x02, +0x04, 0x00, 0x22, 0x04, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x40, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x20, 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, +0x00, 0x00, 0x80, 0x04, 0x00, 0x20, 0x00, 0x02, 0x04, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, +0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, +0x81, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x24, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, +0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x80, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0x80, 0x01, 0x00, +0x05, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x50, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x14, 0x00, 0x00, 0x20, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, +0x04, 0x00, 0x01, 0x20, 0x04, 0x04, 0x20, 0x00, 0x00, 0x00, 0x20, 0x80, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x80, 0x08, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, +0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x08, 0x04, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, +0x00, 0x10, 0x04, 0x08, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0D, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x41, 0x92, 0x24, 0x49, 0x92, 0xA8, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x10, 0x44, 0x4A, 0x92, 0x04, 0x01, 0x92, +0x24, 0x4B, 0x92, 0x24, 0x81, 0x00, 0xC0, 0x10, 0x21, 0x49, 0x92, 0x60, +0x48, 0xB2, 0x04, 0x49, 0x92, 0x20, 0x01, 0x92, 0x04, 0x00, 0x92, 0x24, +0x41, 0x52, 0x20, 0x49, 0x90, 0x24, 0x09, 0x00, 0x4A, 0x92, 0x24, 0x49, +0x92, 0x20, 0x01, 0x90, 0x00, 0x1A, 0x92, 0x20, 0x40, 0x80, 0x24, 0x48, +0x90, 0x64, 0x01, 0x92, 0x30, 0x49, 0x12, 0x00, 0x09, 0xA0, 0x09, 0x90, +0xA0, 0x49, 0xB2, 0x2C, 0xC9, 0x92, 0x04, 0x49, 0x92, 0x60, 0x40, 0x02, +0x20, 0x4A, 0xB2, 0x24, 0x41, 0x92, 0x2C, 0x58, 0x92, 0x24, 0x09, 0x24, +0x49, 0x10, 0x25, 0x49, 0x90, 0x28, 0x09, 0x90, 0x04, 0x49, 0x92, 0x44, +0x09, 0x82, 0x64, 0x4A, 0x92, 0x24, 0x40, 0x92, 0x24, 0x5B, 0x92, 0x34, +0x81, 0x04, 0xC8, 0x90, 0x24, 0x41, 0x90, 0x60, 0x48, 0xB2, 0x04, 0x48, +0x12, 0x20, 0x01, 0x92, 0x24, 0x08, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x90, 0x04, 0x08, 0x24, 0x4B, 0x92, 0x25, 0x41, 0x92, 0x20, 0x49, 0x92, +0x04, 0x08, 0x82, 0x20, 0x49, 0x12, 0x24, 0x48, 0x92, 0x20, 0x00, 0x92, +0x24, 0x49, 0x12, 0x20, 0x09, 0x00, 0x49, 0x92, 0x21, 0x49, 0x90, 0x28, +0xC9, 0x92, 0x04, 0x49, 0x90, 0x64, 0x49, 0x12, 0x24, 0x0A, 0x92, 0x20, +0x41, 0x12, 0x2C, 0x59, 0x12, 0x04, 0x09, 0x00, 0x00, 0x01, 0x01, 0x00, +0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x22, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x81, 0x00, 0x00, 0x10, 0x24, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x08, 0x11, 0x00, 0x00, 0x00, 0x20, 0x08, 0x82, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x42, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x34, 0xC0, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x24, 0x10, +0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x06, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x81, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, +0x02, 0x80, 0x24, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x20, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x59, 0x92, 0x24, 0x09, +0x12, 0x28, 0x49, 0x92, 0x04, 0x41, 0x92, 0x64, 0x49, 0x92, 0x65, 0x6A, +0x12, 0x24, 0x41, 0xB2, 0x25, 0x59, 0x92, 0x24, 0x89, 0x6C, 0x48, 0x92, +0x00, 0x09, 0x90, 0x20, 0x49, 0x92, 0x04, 0x41, 0x92, 0x04, 0xD9, 0x9A, +0x24, 0x0C, 0x92, 0x24, 0x81, 0x12, 0x24, 0x49, 0x92, 0x04, 0x09, 0x24, +0x89, 0x92, 0x10, 0x09, 0xB0, 0x62, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, +0x4D, 0x92, 0x04, 0x08, 0x92, 0x24, 0x41, 0x92, 0x20, 0x09, 0x92, 0x25, +0x19, 0x20, 0x49, 0x92, 0x04, 0x4D, 0x90, 0x28, 0x49, 0x92, 0x04, 0x49, +0x93, 0x64, 0x6B, 0x10, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, +0x92, 0x25, 0x09, 0x64, 0x79, 0xD2, 0x24, 0x49, 0x92, 0x28, 0x69, 0x92, +0x04, 0x49, 0x92, 0x44, 0x08, 0x92, 0x65, 0x4A, 0x92, 0x04, 0x41, 0xB2, +0x35, 0x59, 0x92, 0x24, 0x89, 0x6C, 0x49, 0x9A, 0x24, 0x49, 0x93, 0x20, +0x48, 0x52, 0x04, 0x49, 0x82, 0x24, 0xD9, 0x82, 0x24, 0x68, 0x92, 0x24, +0xC1, 0x92, 0x24, 0x49, 0x12, 0x04, 0x09, 0x24, 0xC9, 0x93, 0x24, 0x00, +0x00, 0x60, 0x69, 0x9A, 0x04, 0x48, 0x82, 0x24, 0x49, 0x9A, 0xB6, 0x48, +0x12, 0x24, 0x41, 0x9B, 0x24, 0x4D, 0x00, 0x24, 0x09, 0x84, 0x49, 0x90, +0x04, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x41, 0x12, 0x64, 0x4B, 0x92, +0x24, 0x4A, 0x92, 0x04, 0x41, 0x90, 0x24, 0x59, 0x90, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x4A, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x94, 0x02, 0xD8, 0xBE, +0x45, 0x02, 0x80, 0x86, 0xD4, 0xB6, 0x75, 0x49, 0x02, 0x23, 0x91, 0xB4, +0x65, 0xDE, 0x0E, 0x00, 0x4C, 0x96, 0x6D, 0x8F, 0x7F, 0xDC, 0x04, 0x44, +0xE0, 0xBE, 0x5D, 0x23, 0x02, 0xAC, 0x40, 0xB4, 0x6D, 0x18, 0x0E, 0x0A, +0xD4, 0x9C, 0x65, 0xCB, 0x12, 0x20, 0xC2, 0x40, 0x6D, 0xDB, 0x37, 0x20, +0x9B, 0xA0, 0x58, 0xDA, 0x6B, 0x41, 0x92, 0x34, 0xCB, 0x36, 0x8B, 0x3F, +0x92, 0xB6, 0x40, 0xF4, 0x17, 0x91, 0x01, 0x84, 0x28, 0x89, 0x49, 0x78, +0x02, 0x24, 0x22, 0x05, 0x69, 0xAC, 0x4D, 0x03, 0x48, 0xEC, 0xD0, 0x17, +0x6C, 0x59, 0x28, 0x0A, 0x12, 0xDC, 0x65, 0xDB, 0x46, 0x6C, 0x5B, 0x90, +0xFC, 0xDB, 0x77, 0xB2, 0x29, 0x59, 0x48, 0x02, 0x9C, 0xB0, 0x6D, 0x4D, +0x42, 0x12, 0x2C, 0x12, 0x65, 0x48, 0x03, 0x90, 0x28, 0x08, 0x61, 0x5B, +0xF2, 0x9B, 0x24, 0x18, 0x02, 0x2A, 0x28, 0x1F, 0x14, 0x10, 0x02, 0x90, +0x2D, 0x53, 0x86, 0x10, 0x06, 0x0A, 0x22, 0x51, 0x22, 0xA0, 0x8E, 0x19, +0x70, 0x59, 0x50, 0x0D, 0x04, 0x00, 0x10, 0x92, 0xF6, 0x5B, 0xC8, 0xB6, +0x20, 0xB3, 0xE5, 0xEB, 0x4D, 0x02, 0x40, 0x09, 0xFD, 0x4D, 0xD6, 0x90, +0x48, 0x02, 0x20, 0x59, 0x9E, 0x84, 0x00, 0xC2, 0x26, 0x92, 0x0F, 0xD8, +0x98, 0x80, 0x04, 0xB9, 0x24, 0x01, 0x46, 0x60, 0x01, 0x0B, 0x45, 0xD1, +0xA0, 0x20, 0x88, 0x05, 0x2A, 0xA7, 0xE0, 0x9D, 0x03, 0x00, 0x10, 0xD3, +0x00, 0x20, 0x17, 0x01, 0x90, 0x58, 0x86, 0x21, 0x39, 0x49, 0xC0, 0xA4, +0xB6, 0x02, 0x6A, 0x60, 0x12, 0x22, 0x91, 0x0D, 0x88, 0x60, 0x92, 0x02, +0x80, 0x05, 0x51, 0x20, 0x05, 0x40, 0x82, 0x62, 0x92, 0x25, 0x0B, 0x41, +0x03, 0x24, 0x99, 0x05, 0x09, 0x40, 0x93, 0x24, 0x00, 0x01, 0x08, 0x02, +0x1A, 0xF4, 0x08, 0x5B, 0x24, 0x6C, 0x25, 0x01, 0x11, 0x90, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x09, 0x00, 0x00, 0xA5, 0x90, 0xA0, +0xF1, 0x43, 0xC3, 0x14, 0x09, 0x23, 0xD0, 0x62, 0x07, 0x41, 0x82, 0x10, +0xC0, 0x00, 0x3A, 0x48, 0x0A, 0xA4, 0x08, 0x02, 0xC8, 0x00, 0x92, 0x24, +0xD9, 0x10, 0x00, 0x46, 0x02, 0x90, 0x08, 0x00, 0x00, 0x00, 0x37, 0x41, +0x9B, 0x08, 0x00, 0x00, 0x20, 0x49, 0xDA, 0x36, 0x00, 0x02, 0x21, 0x69, +0xDA, 0x36, 0x09, 0x00, 0x00, 0x5B, 0x92, 0x32, 0x89, 0x00, 0x41, 0x16, +0x35, 0x41, 0x92, 0x02, 0x00, 0x02, 0x84, 0x49, 0x93, 0x26, 0x03, 0x00, +0x00, 0x68, 0x9B, 0x34, 0x01, 0x00, 0x00, 0x49, 0xBA, 0xB4, 0x09, 0x00, +0x92, 0x00, 0xB5, 0x6D, 0x92, 0x02, 0x80, 0x20, 0x00, 0x69, 0xD2, 0x2C, +0x90, 0x45, 0x00, 0x48, 0xDA, 0xA6, 0x01, 0x00, 0x0A, 0x40, 0x9B, 0xA6, +0x2D, 0x00, 0x42, 0x10, 0x97, 0x49, 0x9A, 0x08, 0x00, 0x00, 0x20, 0x68, +0xDB, 0xA6, 0x08, 0x80, 0x00, 0x21, 0x9A, 0x3D, 0x41, 0x30, 0x00, 0x51, +0x93, 0x3C, 0x09, 0xF7, 0x4F, 0x91, 0x80, 0x2C, 0x40, 0xF2, 0x4F, 0x3F, +0x90, 0x24, 0x01, 0x08, 0xFD, 0x99, 0x9E, 0x06, 0x01, 0x80, 0xF0, 0xDF, +0xE3, 0xB0, 0x49, 0x84, 0x24, 0xB8, 0x3E, 0xE1, 0x80, 0x2C, 0x49, 0x01, +0x5D, 0x11, 0x42, 0x24, 0x48, 0x10, 0x74, 0xD3, 0xB2, 0x84, 0x40, 0xC2, +0x52, 0xD3, 0xF4, 0x04, 0x41, 0x02, 0x24, 0x9F, 0x64, 0x5E, 0x00, 0x00, +0x49, 0xB0, 0x4D, 0xC2, 0x8F, 0x04, 0x09, 0x12, 0x6D, 0x00, 0x6D, 0x24, +0x01, 0x10, 0xF0, 0x32, 0xD5, 0x02, 0x40, 0x10, 0x00, 0x2F, 0x29, 0xE3, +0x20, 0x24, 0x41, 0x72, 0x05, 0x5B, 0x9E, 0x05, 0x00, 0x10, 0x73, 0x58, +0xF6, 0x4E, 0x41, 0x82, 0x10, 0xCE, 0xE4, 0x1E, 0x48, 0x82, 0x24, 0x0C, +0xD2, 0xCE, 0xA5, 0x65, 0xD3, 0x02, 0x10, 0x92, 0x84, 0x6D, 0x83, 0x64, +0x08, 0xF4, 0x04, 0x4C, 0xD3, 0xB0, 0x05, 0xA0, 0x15, 0x50, 0xDB, 0xA0, +0xA4, 0x42, 0x82, 0x88, 0x85, 0x65, 0xCB, 0x80, 0x40, 0xC0, 0x00, 0x6D, +0xDA, 0x34, 0x40, 0xA2, 0x44, 0x44, 0xD2, 0xA6, 0xA1, 0xA6, 0x25, 0x00, +0xD3, 0x66, 0x2C, 0x24, 0x09, 0x81, 0x34, 0x01, 0xD8, 0x40, 0x3A, 0x1D, +0x80, 0x6D, 0x1D, 0x12, 0x02, 0x38, 0xB2, 0x2C, 0x81, 0x34, 0x42, 0x4F, +0x00, 0x4C, 0x9E, 0x05, 0x09, 0xCC, 0x04, 0x0C, 0x05, 0x65, 0xFB, 0x42, +0x3B, 0xB6, 0x81, 0x4C, 0xD2, 0x74, 0x92, 0x24, 0x05, 0x04, 0xF3, 0xB6, +0x05, 0x00, 0x0D, 0x50, 0x4A, 0x26, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, +0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x20, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x82, 0x00, 0x00, 0x00, 0x00, 0x09, +0x20, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x08, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x81, 0x10, 0x00, 0x00, 0x00, 0x20, 0x01, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x40, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, +0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, +0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x90, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x10, 0x00, 0x00, 0x20, 0x20, 0x01, 0x80, 0x40, 0x80, 0x00, 0x00, +0x00, 0xA2, 0x24, 0x00, 0x00, 0x82, 0x01, 0x40, 0x08, 0x20, 0x00, 0x00, +0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x22, 0x00, 0x40, 0x00, 0x00, 0x00, +0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x12, +0x00, 0x00, 0x04, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x21, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, +0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x01, +0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x08, 0x80, +0x00, 0x00, 0x40, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, +0x00, 0x00, 0x00, 0x90, 0x20, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x04, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x01, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, 0x00, +0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x01, 0x19, 0x02, 0x00, 0x00, +0x00, 0x00, 0x81, 0x00, 0x00, 0x02, 0x08, 0x80, 0x00, 0x00, 0x40, 0x10, +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, +0x20, 0x04, 0x00, 0x00, 0x81, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x40, 0x04, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x80, 0x00, +0x10, 0x00, 0x00, 0x42, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x10, +0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x08, 0x92, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, +0x00, 0x00, 0x00, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x01, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x81, 0x01, 0x00, 0x61, 0x00, +0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x20, 0x0C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, +0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x81, 0x08, 0x00, 0x04, 0x00, 0x88, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x80, +0x00, 0x00, 0x42, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, +0x20, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, +0x00, 0x48, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x00, 0x00, +0x00, 0x8A, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, +0x00, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x80, 0x10, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, +0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x24, 0x01, 0x00, 0x00, 0x22, 0x00, 0x04, 0x00, 0x00, 0xA8, +0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x02, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x08, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, +0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x02, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x01, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x81, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x83, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, +0x20, 0x02, 0x00, 0x00, 0x00, 0x82, 0x14, 0x04, 0x00, 0x00, 0x00, 0x20, +0x80, 0x20, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, +0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x02, 0x96, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x90, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x20, 0x00, 0x86, 0x40, 0x00, 0x43, +0x14, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x22, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, +0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, +0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x40, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x00, 0x00, 0x10, +0x00, 0x00, 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x04, 0x80, 0x00, 0x02, 0x00, 0x81, 0x00, 0x00, 0x00, +0x00, 0x02, 0x01, 0x00, 0x40, 0x00, 0x80, 0x28, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, +0x08, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x22, 0x00, 0x00, 0x11, 0x00, +0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x00, 0x40, 0x00, +0x41, 0x50, 0x00, 0x04, 0x02, 0x00, 0x00, 0x24, 0x40, 0x00, 0x10, 0x00, +0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x04, 0x80, 0x00, 0x10, 0x20, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x04, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x24, 0x4B, 0x96, 0x24, 0xC9, +0x82, 0x2C, 0x08, 0x12, 0x00, 0x49, 0x82, 0x60, 0xC1, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x53, 0x92, 0x24, 0x53, 0x92, 0x24, 0x88, 0x00, 0x65, 0x82, +0x34, 0x4B, 0x83, 0x60, 0x88, 0x90, 0x01, 0x09, 0x90, 0x20, 0x01, 0x92, +0x4C, 0x48, 0xB2, 0x24, 0x11, 0x10, 0x04, 0x40, 0x12, 0x24, 0x09, 0x04, +0x49, 0x10, 0x24, 0x49, 0x90, 0x40, 0x49, 0xA2, 0x00, 0x49, 0x10, 0x24, +0x49, 0x82, 0x07, 0x48, 0x92, 0x20, 0x41, 0xB3, 0x49, 0x43, 0x82, 0x24, +0x08, 0x04, 0x40, 0x92, 0x24, 0x49, 0x82, 0x28, 0xC9, 0x02, 0x04, 0xC3, +0x90, 0x64, 0x4B, 0x36, 0x20, 0x42, 0x96, 0x24, 0x81, 0x10, 0x20, 0x59, +0x92, 0xAC, 0x0B, 0x24, 0x4B, 0x96, 0x05, 0x41, 0x82, 0x28, 0x49, 0x82, +0x04, 0x49, 0x82, 0x60, 0xC9, 0x92, 0x24, 0x4A, 0x10, 0x04, 0x51, 0x02, +0x24, 0x12, 0x92, 0x24, 0x80, 0x04, 0x49, 0x12, 0x25, 0x49, 0x82, 0x60, +0x89, 0x92, 0x05, 0x48, 0x90, 0x20, 0x09, 0x92, 0x6C, 0x48, 0x82, 0x00, +0x10, 0x90, 0x24, 0x09, 0x12, 0x24, 0x08, 0x04, 0x49, 0x90, 0x25, 0x49, +0x00, 0x40, 0x49, 0xB0, 0x00, 0x68, 0x12, 0x24, 0x49, 0x92, 0x05, 0x48, +0x92, 0x20, 0x41, 0xB2, 0x4D, 0x03, 0x02, 0x00, 0x00, 0x20, 0x09, 0x92, +0x25, 0x01, 0x92, 0x28, 0xC1, 0x02, 0x04, 0x08, 0x80, 0x64, 0x4B, 0xA6, +0x00, 0x46, 0x02, 0x24, 0xC1, 0x10, 0x20, 0x59, 0x90, 0x24, 0x09, 0x80, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x90, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x81, 0x00, 0x00, 0x84, +0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x82, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, +0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x14, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x60, +0x00, 0x00, 0x09, 0x01, 0x00, 0x04, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, +0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x48, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x01, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x40, 0x01, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x84, 0xA0, 0x00, 0x00, 0x00, +0x08, 0x00, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x60, 0x81, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, +0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x10, 0x00, 0x24, +0x09, 0x92, 0x24, 0xC9, 0x92, 0x28, 0xD9, 0x92, 0x0D, 0xC9, 0x92, 0x60, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x2C, 0x59, 0x82, 0x24, +0x88, 0x64, 0x49, 0x12, 0x24, 0x49, 0xD2, 0x60, 0x0A, 0x92, 0x04, 0x49, +0x92, 0x24, 0x59, 0x92, 0x64, 0x48, 0x92, 0x24, 0x41, 0x22, 0x20, 0x48, +0x82, 0x24, 0x08, 0x24, 0x49, 0xB0, 0x24, 0x48, 0x92, 0x20, 0x49, 0xB2, +0x0C, 0x48, 0x92, 0x24, 0x59, 0x9B, 0x84, 0x40, 0x92, 0x24, 0x51, 0x12, +0x05, 0x4B, 0x92, 0x24, 0x09, 0x24, 0x49, 0xBE, 0x24, 0x49, 0x92, 0x28, +0xC9, 0x96, 0x04, 0x49, 0x92, 0x64, 0x2A, 0x92, 0x24, 0x0A, 0x92, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0xD2, 0x24, 0x49, +0x82, 0x28, 0xD1, 0x92, 0x0D, 0x49, 0x12, 0x40, 0x49, 0x92, 0x24, 0x4A, +0x90, 0x20, 0x40, 0x92, 0x2C, 0x59, 0x92, 0x00, 0x81, 0xE4, 0x49, 0x92, +0x24, 0x48, 0x82, 0x40, 0x4B, 0x92, 0x04, 0x01, 0x92, 0x00, 0x79, 0x92, +0x64, 0x08, 0x82, 0x20, 0x40, 0xB2, 0x24, 0x49, 0x92, 0x20, 0x00, 0x24, +0x29, 0x30, 0x24, 0x00, 0x00, 0x30, 0x0D, 0xB2, 0x08, 0x48, 0x80, 0x04, +0x59, 0x92, 0x24, 0x08, 0x82, 0x24, 0x51, 0x82, 0x25, 0x07, 0x12, 0x20, +0x01, 0x04, 0x49, 0xB6, 0x24, 0x40, 0x92, 0x28, 0xC9, 0x96, 0x04, 0x41, +0xD2, 0x64, 0x4B, 0x92, 0x24, 0x02, 0x92, 0x26, 0x21, 0x10, 0x36, 0x59, +0x82, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x18, 0x00, +0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x04, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x20, 0x00, 0x00, 0x00, 0x40, +0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC4, 0x22, 0xD9, 0xB6, 0x64, 0x02, 0x30, 0x02, 0xD6, 0xB6, 0x67, 0x4B, +0x10, 0x05, 0x01, 0xB6, 0xED, 0xDF, 0x8E, 0x81, 0x40, 0x96, 0x6D, 0x9D, +0x7E, 0x11, 0xA2, 0x31, 0xD9, 0xA4, 0x2F, 0x13, 0x5E, 0x24, 0xC9, 0x9E, +0xCC, 0x3F, 0x80, 0x84, 0x08, 0x34, 0x6D, 0xB1, 0x30, 0x26, 0x29, 0x89, +0xF5, 0x5B, 0x10, 0x08, 0xD3, 0xB3, 0x95, 0x33, 0xA4, 0x61, 0x11, 0x26, +0x40, 0xB3, 0x65, 0x13, 0xF1, 0x2C, 0x29, 0xA0, 0xEE, 0x7F, 0xD3, 0x04, +0x01, 0xC0, 0x4E, 0x97, 0x34, 0x0C, 0xC2, 0x0E, 0xE1, 0xBC, 0x64, 0x23, +0x1A, 0x09, 0x50, 0x14, 0x6D, 0x5B, 0x9A, 0x66, 0x0B, 0x9C, 0xE5, 0xDF, +0x16, 0x24, 0x00, 0x50, 0x7D, 0x93, 0x76, 0xB6, 0x29, 0xD9, 0x48, 0x4A, +0x2D, 0xB8, 0x4C, 0x59, 0x40, 0x10, 0x38, 0x99, 0x6D, 0x48, 0x97, 0x90, +0x00, 0x48, 0x60, 0x5A, 0xB2, 0x9B, 0x20, 0x02, 0x02, 0x82, 0xC4, 0xCA, +0x28, 0x01, 0x44, 0x81, 0x22, 0x69, 0x4F, 0xA1, 0x01, 0x09, 0x24, 0x59, +0x9E, 0x48, 0x04, 0x03, 0x00, 0xED, 0x92, 0x04, 0x2A, 0x85, 0x25, 0x96, +0x2C, 0x68, 0x00, 0x16, 0x69, 0xD3, 0x64, 0xD9, 0x86, 0x86, 0x2C, 0x25, +0x84, 0x61, 0x9F, 0x04, 0x05, 0x81, 0xB0, 0xCB, 0xB3, 0x84, 0x05, 0x00, +0x00, 0x9A, 0x26, 0xC1, 0x14, 0x91, 0x0D, 0x99, 0x24, 0x52, 0x86, 0x20, +0x30, 0x09, 0x26, 0x39, 0xB1, 0xB0, 0x0C, 0x40, 0x7A, 0xCD, 0xB2, 0x1D, +0x26, 0x01, 0x13, 0xCB, 0x90, 0x25, 0xA7, 0xE9, 0x10, 0x50, 0x16, 0x60, +0x35, 0x0D, 0x90, 0x24, 0xB6, 0x14, 0x5A, 0x08, 0x02, 0xA2, 0xB9, 0x0C, +0xCC, 0x60, 0xD0, 0x20, 0x80, 0x69, 0x00, 0x44, 0x21, 0x45, 0x10, 0x00, +0x08, 0x42, 0x80, 0x01, 0x4A, 0x00, 0x9A, 0x81, 0x40, 0x4C, 0x88, 0x04, +0xD1, 0x02, 0x00, 0x03, 0x02, 0x10, 0x09, 0x00, 0x04, 0x4C, 0x81, 0x20, +0x10, 0x20, 0x00, 0x40, 0x09, 0x08, 0x02, 0x24, 0x02, 0x00, 0x00, 0x28, +0x08, 0x02, 0x20, 0x20, 0x40, 0x02, 0xC0, 0xA0, 0x09, 0x41, 0x60, 0x61, +0x07, 0x65, 0xC0, 0x40, 0x10, 0x00, 0x3B, 0x01, 0x93, 0xA4, 0x14, 0x04, +0xD8, 0x00, 0x00, 0x00, 0x89, 0x20, 0x09, 0x06, 0x4A, 0x24, 0x09, 0x00, +0x40, 0x00, 0x27, 0x49, 0x9B, 0x00, 0x00, 0x02, 0x20, 0x4D, 0x98, 0x36, +0x00, 0x11, 0x01, 0x49, 0x12, 0xA6, 0x01, 0xD1, 0x04, 0x58, 0x92, 0x23, +0x89, 0x20, 0x40, 0x80, 0x25, 0x6D, 0xD2, 0x00, 0x02, 0x00, 0x80, 0x79, +0xD3, 0x26, 0x08, 0x00, 0x00, 0x4C, 0xBA, 0xA7, 0x41, 0x20, 0x00, 0x40, +0xDA, 0xB4, 0x2D, 0x00, 0x00, 0x80, 0xA1, 0x4C, 0xDB, 0x02, 0x00, 0x00, +0x80, 0x6D, 0x9A, 0x24, 0xC9, 0x20, 0x03, 0xCC, 0xDB, 0xA6, 0x00, 0x40, +0x01, 0x40, 0xD3, 0x35, 0x2D, 0x00, 0x01, 0x10, 0xB7, 0x69, 0x9B, 0x08, +0x00, 0x80, 0xA0, 0x6D, 0x97, 0xA6, 0x02, 0x00, 0x00, 0x6D, 0x9B, 0x36, +0x01, 0x80, 0x00, 0x50, 0xDA, 0x24, 0x09, 0xF7, 0x0D, 0x9D, 0x90, 0x24, +0x40, 0xF2, 0xCF, 0xF8, 0x93, 0x20, 0x43, 0x00, 0xEF, 0xA2, 0xBE, 0x24, +0xC9, 0x10, 0x70, 0x0E, 0xA9, 0x37, 0x4D, 0x94, 0x34, 0x06, 0x89, 0x47, +0xD0, 0x00, 0x09, 0x32, 0x21, 0xF3, 0x4F, 0x04, 0x08, 0x10, 0x41, 0x5B, +0x2C, 0x20, 0x41, 0x10, 0x00, 0xDC, 0x16, 0x86, 0x01, 0x0A, 0x00, 0xE5, +0x0C, 0x6D, 0x14, 0x21, 0x00, 0xC0, 0x68, 0xD9, 0x04, 0x00, 0x41, 0x12, +0x22, 0xDB, 0x4C, 0x20, 0x00, 0x10, 0xB1, 0xB3, 0x64, 0x0B, 0x08, 0x82, +0x00, 0x28, 0x2E, 0xE1, 0x00, 0x14, 0x40, 0x42, 0x41, 0x5B, 0x1F, 0x00, +0x48, 0x10, 0x65, 0xB9, 0xF7, 0x02, 0x40, 0x80, 0x50, 0x5F, 0xAD, 0x1F, +0x01, 0x92, 0x24, 0x00, 0x42, 0x42, 0x34, 0x4D, 0xD2, 0x03, 0x81, 0x86, +0x88, 0x69, 0xD1, 0x66, 0x00, 0xA2, 0x20, 0x6C, 0x5B, 0x31, 0x07, 0xA0, +0x11, 0x50, 0x9B, 0xB0, 0xA5, 0x84, 0x1F, 0x30, 0xB5, 0x69, 0xB9, 0x62, +0xD1, 0x9C, 0x00, 0x45, 0x12, 0x12, 0x61, 0x26, 0xB3, 0xE8, 0xD3, 0x94, +0x01, 0x10, 0xED, 0x48, 0x43, 0x26, 0x09, 0x7B, 0xF3, 0x92, 0x38, 0x48, +0x12, 0x00, 0x9B, 0x26, 0x02, 0x68, 0xD3, 0x3E, 0x5D, 0x96, 0x60, 0x48, +0x50, 0x10, 0x40, 0x1C, 0x9E, 0x09, 0x98, 0x32, 0x2D, 0xA6, 0x99, 0x16, +0x84, 0x41, 0x92, 0xA2, 0xEB, 0xA4, 0x00, 0x4F, 0xDA, 0x76, 0xC9, 0x82, +0x04, 0x44, 0x53, 0xB2, 0x25, 0x12, 0x56, 0x10, 0x83, 0xB6, 0x2D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, +0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x80, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x24, +0x88, 0x04, 0x00, 0x02, 0x08, 0x80, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, +0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, +0xA0, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x80, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x08, 0x00, 0x40, 0x00, +0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x01, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x49, 0x20, +0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x80, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x60, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x08, 0x02, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x00, 0x02, 0x80, 0x28, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x10, 0x11, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, +0x40, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, +0x00, 0x00, 0x08, 0x02, 0x21, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x20, 0x20, 0x00, 0x02, 0x81, 0x20, 0x08, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, +0x88, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x40, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x20, 0x00, 0x81, 0x24, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0xA3, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x01, 0x04, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x02, 0x01, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, +0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x48, 0x8A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x44, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x20, 0x00, 0x00, +0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x24, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, +0x04, 0x00, 0x00, 0x40, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x10, 0x40, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x42, 0x12, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, +0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x80, 0x44, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, +0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x10, 0x44, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x80, 0x20, 0x08, 0x00, 0x02, 0x00, 0x08, 0x10, 0x04, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x44, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, +0x00, 0x58, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x08, 0x10, 0x84, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x04, 0x08, 0x03, 0x00, 0x92, 0x00, 0x00, 0x02, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x90, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x48, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x11, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x80, 0x08, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x40, +0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x02, 0x00, 0x00, +0x00, 0x08, 0x90, 0x20, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x02, 0x08, +0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00, 0x01, 0x00, 0x28, 0x00, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x84, 0x40, 0x20, 0x00, 0x00, +0x00, 0x00, 0x02, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x49, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x14, 0x01, 0x10, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, +0x42, 0xB0, 0x25, 0x48, 0x8A, 0x2C, 0x09, 0x94, 0x04, 0x49, 0x80, 0x64, +0x09, 0x80, 0x61, 0x4A, 0x92, 0x04, 0x41, 0x50, 0x26, 0x5B, 0x92, 0x2C, +0x89, 0x14, 0x0D, 0x00, 0x25, 0x49, 0x82, 0x00, 0x51, 0x92, 0x0C, 0x00, +0x92, 0x24, 0x69, 0xA2, 0x04, 0x48, 0x22, 0x20, 0x41, 0xB2, 0x28, 0x43, +0x92, 0x2C, 0x09, 0x04, 0x41, 0x30, 0x21, 0x49, 0x52, 0x20, 0x4A, 0x90, +0x05, 0x41, 0x82, 0x24, 0x41, 0x92, 0x64, 0x08, 0x82, 0x20, 0x41, 0x80, +0x26, 0x49, 0x82, 0x24, 0x09, 0x24, 0x59, 0x82, 0x25, 0x49, 0x92, 0x28, +0x49, 0x97, 0x04, 0x49, 0x92, 0x64, 0xDA, 0x92, 0x24, 0x4A, 0x92, 0x04, +0x41, 0x82, 0x24, 0x59, 0x12, 0x24, 0x09, 0x20, 0x0B, 0xB2, 0x24, 0x41, +0x12, 0x28, 0x49, 0x96, 0x04, 0x49, 0x02, 0x20, 0x49, 0x90, 0x61, 0x42, +0x92, 0x20, 0x40, 0x02, 0x24, 0x5B, 0x92, 0x24, 0x81, 0x04, 0x09, 0x00, +0x04, 0x41, 0x92, 0x00, 0x59, 0x12, 0x0C, 0x01, 0x92, 0x04, 0x40, 0x32, +0x04, 0x00, 0x42, 0x20, 0x01, 0xB2, 0x28, 0x47, 0x12, 0x04, 0x01, 0x20, +0x49, 0x30, 0x04, 0x49, 0x12, 0x20, 0x43, 0x92, 0x05, 0x41, 0xD2, 0x20, +0x4D, 0x92, 0x40, 0x40, 0x82, 0x20, 0x40, 0x92, 0x04, 0x49, 0x92, 0x24, +0x09, 0x24, 0x59, 0x90, 0x04, 0x08, 0x92, 0x28, 0x09, 0x96, 0x04, 0x49, +0x82, 0x64, 0xDA, 0x12, 0x24, 0x02, 0xB0, 0x24, 0x41, 0x92, 0x24, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x40, 0x00, +0x02, 0x00, 0x80, 0x00, 0x00, 0x20, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x20, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x40, 0x02, 0x02, 0x00, 0x00, +0x10, 0x10, 0x00, 0x00, 0x34, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x02, 0x04, 0x00, 0x00, 0x08, 0x00, +0x30, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x80, 0x0E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x20, 0x04, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xA0, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x83, 0x00, 0x10, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, +0x04, 0x00, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, +0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x92, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, +0xA0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, +0x08, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x82, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x40, 0x08, 0x80, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x40, 0x10, 0x00, 0x00, 0x40, 0x00, 0x04, 0x20, 0x00, 0x10, 0x01, +0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x21, 0x04, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x0B, 0x92, 0x21, 0x49, 0x12, 0x28, 0x59, 0x93, +0x04, 0x49, 0x12, 0x60, 0x41, 0x92, 0x20, 0x0A, 0x10, 0x04, 0x41, 0x82, +0x24, 0x59, 0x92, 0x24, 0x09, 0x25, 0x49, 0xB0, 0x00, 0x08, 0x80, 0x60, +0x48, 0x92, 0x0C, 0x09, 0x42, 0x00, 0x79, 0xB2, 0x6D, 0x00, 0x90, 0x00, +0x11, 0x92, 0x64, 0x49, 0x82, 0x24, 0x28, 0x24, 0x49, 0x90, 0x00, 0x09, +0x90, 0x20, 0x48, 0xB2, 0x44, 0x59, 0x90, 0x24, 0x4B, 0x92, 0x64, 0x00, +0x12, 0x20, 0x41, 0x92, 0x04, 0x49, 0x82, 0x24, 0x19, 0x24, 0xCD, 0x83, +0x24, 0x49, 0x92, 0x28, 0x49, 0x93, 0x84, 0x49, 0x92, 0x60, 0x49, 0x9A, +0x25, 0x02, 0x12, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, +0x02, 0x92, 0x20, 0x49, 0x92, 0x20, 0x59, 0x12, 0x00, 0x09, 0x90, 0x64, +0x49, 0x90, 0x24, 0x4A, 0x92, 0x20, 0x41, 0x90, 0x20, 0x59, 0x92, 0x24, +0x29, 0x25, 0x49, 0xB2, 0x25, 0x49, 0x92, 0x60, 0x49, 0x80, 0x0C, 0x49, +0x12, 0x04, 0x51, 0xA2, 0x6D, 0x08, 0xC2, 0x24, 0x50, 0x00, 0x64, 0x41, +0x12, 0x04, 0x01, 0x04, 0x49, 0x92, 0x24, 0x41, 0x10, 0x20, 0x49, 0xB2, +0x00, 0x81, 0xB2, 0x20, 0x0A, 0x12, 0x44, 0x08, 0x82, 0x20, 0x41, 0x12, +0x24, 0x09, 0x16, 0x24, 0x01, 0x20, 0x81, 0x92, 0x04, 0x49, 0x92, 0x28, +0x09, 0x92, 0x04, 0x49, 0x12, 0x64, 0x49, 0x92, 0x25, 0x0A, 0x92, 0x20, +0x41, 0x82, 0x04, 0x59, 0x92, 0x24, 0x09, 0x00, 0x08, 0x00, 0x00, 0x24, +0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x08, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x48, 0x84, 0x20, 0x98, 0xB7, 0x4F, 0x06, 0xA3, 0x80, +0xD4, 0xA2, 0x4D, 0x09, 0xC0, 0xA5, 0x00, 0xB4, 0x6C, 0xD9, 0x8A, 0x28, +0x42, 0x86, 0x6F, 0xDB, 0x3F, 0xFA, 0x17, 0x22, 0x59, 0x3A, 0xF1, 0x42, +0x04, 0x16, 0xCC, 0x36, 0xB7, 0x23, 0xB0, 0x22, 0x25, 0xF4, 0x67, 0x4E, +0x20, 0xA0, 0x2D, 0x8A, 0x49, 0x2D, 0x1E, 0x00, 0x06, 0x32, 0xD8, 0x36, +0x25, 0x02, 0xB0, 0x06, 0xCC, 0xF6, 0x75, 0x2F, 0x86, 0x2C, 0x09, 0xB4, +0x61, 0xFE, 0x00, 0x14, 0x0D, 0x8B, 0x2D, 0x8D, 0x18, 0x01, 0x08, 0x01, +0xBD, 0x97, 0x5D, 0x27, 0x0B, 0x8B, 0x10, 0x92, 0xE5, 0x19, 0x4F, 0x65, +0x04, 0x90, 0x7C, 0xCB, 0x8A, 0x01, 0x62, 0xC0, 0x7F, 0x5E, 0x37, 0xD6, +0xA0, 0xCB, 0x0A, 0x52, 0x04, 0xB8, 0x0C, 0x5B, 0x42, 0x06, 0x00, 0x1B, +0x25, 0x4A, 0x96, 0xD0, 0x21, 0x6B, 0xE0, 0x51, 0xF4, 0x8B, 0x20, 0x49, +0x00, 0x04, 0x2A, 0xF9, 0x80, 0x14, 0x28, 0xB0, 0x29, 0xCD, 0x0A, 0x12, +0x6C, 0x14, 0x95, 0xC9, 0x93, 0x10, 0x0C, 0x90, 0x00, 0x5B, 0x9B, 0x06, +0x00, 0x9B, 0x22, 0xB2, 0x20, 0x49, 0x08, 0x43, 0x6C, 0xB0, 0x15, 0xCD, +0x0A, 0x00, 0x08, 0x19, 0x28, 0xC3, 0x9F, 0x80, 0x00, 0x08, 0x61, 0xCB, +0xB3, 0x86, 0x60, 0x19, 0x24, 0xB7, 0x24, 0xDA, 0x02, 0x20, 0x00, 0x99, +0x24, 0x40, 0xA6, 0xA5, 0x08, 0x4A, 0x20, 0x9E, 0xB2, 0xA5, 0x03, 0x50, +0xA2, 0xD8, 0xD4, 0x0D, 0x80, 0xE8, 0x12, 0xAB, 0x02, 0x25, 0x05, 0x68, +0x10, 0x50, 0x90, 0x64, 0x25, 0x41, 0x91, 0xE4, 0x96, 0x64, 0x53, 0x69, +0x00, 0xA4, 0x3D, 0x24, 0x19, 0x60, 0x18, 0x24, 0x80, 0x68, 0x81, 0x08, +0x05, 0x00, 0x02, 0x00, 0x12, 0x0A, 0x05, 0x48, 0x00, 0x04, 0x00, 0x05, +0x48, 0x28, 0x51, 0x20, 0x91, 0x64, 0xC4, 0x40, 0x13, 0x00, 0x01, 0x0A, +0x90, 0xAE, 0x35, 0x65, 0x13, 0x40, 0x42, 0x60, 0x00, 0x29, 0xC0, 0x00, +0x30, 0x10, 0x02, 0x44, 0x08, 0x80, 0x91, 0x20, 0x44, 0x40, 0x82, 0x02, +0x03, 0x00, 0x82, 0x60, 0x11, 0x48, 0x82, 0x00, 0x20, 0x00, 0x0B, 0x51, +0x12, 0xA4, 0xC8, 0x00, 0xDD, 0x40, 0x02, 0x24, 0x45, 0x20, 0xB0, 0x16, +0x80, 0x20, 0x08, 0x20, 0x00, 0x00, 0x27, 0x7D, 0xD3, 0x0C, 0x00, 0x00, +0x30, 0x4D, 0x93, 0xF6, 0x00, 0x00, 0x00, 0x69, 0xB3, 0xA6, 0x05, 0x10, +0x40, 0x4A, 0x9A, 0x26, 0xC9, 0x00, 0x02, 0xA0, 0xA5, 0x4D, 0x8B, 0x00, +0x00, 0x00, 0x00, 0x5B, 0x59, 0x34, 0x81, 0x00, 0x05, 0x68, 0xDB, 0xB4, +0x01, 0x82, 0x28, 0x40, 0x93, 0xB6, 0x2D, 0x04, 0x04, 0x00, 0x25, 0x6D, +0xDB, 0x02, 0x48, 0x04, 0x08, 0x49, 0xDA, 0x30, 0x01, 0x02, 0x01, 0x48, +0xD3, 0xA4, 0x01, 0x80, 0x01, 0x41, 0xD2, 0x35, 0x2D, 0x04, 0x00, 0x00, +0x07, 0x68, 0x83, 0x2C, 0x08, 0x10, 0x90, 0x6D, 0x7B, 0xE6, 0x08, 0x10, +0x04, 0x6C, 0x93, 0x34, 0x4D, 0x00, 0x20, 0x00, 0x8B, 0xA0, 0x49, 0xC7, +0xED, 0x97, 0x92, 0x80, 0x08, 0xF6, 0x68, 0x76, 0xB3, 0x20, 0x48, 0x40, +0x2F, 0x5B, 0xB7, 0x05, 0x48, 0x10, 0xFC, 0xCE, 0x3E, 0x25, 0x41, 0x90, +0x64, 0x96, 0xCC, 0x1C, 0x50, 0x20, 0x50, 0xB2, 0xDD, 0xAD, 0x88, 0x24, +0x82, 0x02, 0x7C, 0x95, 0x08, 0x04, 0x00, 0x02, 0x60, 0x50, 0xC3, 0x07, +0x48, 0x00, 0x00, 0xB2, 0x49, 0x8D, 0x90, 0x00, 0x00, 0xB0, 0x33, 0xF8, +0x83, 0x24, 0x01, 0x06, 0x6C, 0x98, 0x2E, 0x24, 0x08, 0x12, 0x70, 0x4B, +0x62, 0x02, 0x09, 0x82, 0x00, 0x69, 0x43, 0xF6, 0xB2, 0x05, 0x58, 0x06, +0x60, 0x2B, 0x1F, 0x00, 0x80, 0x50, 0x60, 0xCF, 0xF9, 0x01, 0x48, 0x82, +0xBC, 0x97, 0xD7, 0xCF, 0x50, 0x16, 0x64, 0x10, 0x59, 0x58, 0xB5, 0x4C, +0xD9, 0x02, 0x47, 0x88, 0x88, 0x69, 0xFA, 0xA4, 0x48, 0x90, 0x28, 0x4E, +0xDA, 0x34, 0x01, 0x82, 0x00, 0x50, 0xD1, 0xB6, 0xA4, 0x01, 0x70, 0x47, +0x35, 0x61, 0x43, 0x42, 0xE0, 0x30, 0x82, 0x6D, 0x01, 0x0E, 0x4A, 0x72, +0xA4, 0x1C, 0x90, 0x22, 0x41, 0x89, 0x30, 0x49, 0xDA, 0x00, 0x05, 0x45, +0x6B, 0x50, 0xA5, 0x49, 0x92, 0x03, 0x88, 0x12, 0x85, 0x0D, 0x83, 0x02, +0xC3, 0x67, 0xE0, 0x68, 0xD3, 0x12, 0x01, 0x94, 0x98, 0x49, 0x9B, 0xA0, +0x01, 0x58, 0x59, 0x0C, 0xC1, 0x5C, 0xEB, 0x72, 0xDB, 0xB6, 0x20, 0x49, +0x53, 0xB5, 0x13, 0x20, 0x00, 0x4A, 0xCA, 0xA6, 0x11, 0x46, 0x09, 0x10, +0xC9, 0x33, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, +0x02, 0x04, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x08, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x04, 0x00, 0x08, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x09, 0x86, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x24, 0x40, 0x82, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x04, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x82, 0x00, 0x00, +0x00, 0x80, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x40, 0x86, 0x00, 0x00, 0x00, 0x08, 0x00, 0x34, +0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x80, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0x04, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x40, 0x00, 0x00, 0x02, 0x04, 0x20, 0x01, 0x10, 0x00, 0x42, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, +0x40, 0x80, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x08, 0x00, 0x00, 0x00, 0x09, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, +0x20, 0x20, 0x08, 0x80, 0x00, 0x20, 0x00, 0x00, 0x80, 0x04, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, +0x49, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x04, 0x00, 0x02, +0x04, 0x20, 0x01, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x80, 0x81, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, +0x09, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x28, 0x20, 0x08, 0x80, +0x01, 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x49, 0x12, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, +0x00, 0x00, 0x00, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x24, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x82, 0x00, 0x00, +0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x04, 0x08, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, +0x08, 0x00, 0x00, 0x34, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x80, 0x01, 0x01, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, +0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x01, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x12, +0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, +0x00, 0x10, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x08, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, +0x00, 0x01, 0x80, 0x10, 0x04, 0x00, 0x22, 0x80, 0x00, 0x08, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x20, 0x80, 0x80, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x00, 0x20, 0x00, 0x02, 0x20, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x40, 0x08, 0x00, 0x04, 0x60, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x51, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x20, 0x00, 0x02, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, +0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x81, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x02, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x24, 0x00, +0x00, 0x80, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x20, 0x00, 0x11, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x80, 0x14, 0x00, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x04, +0x00, 0x08, 0x04, 0x20, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x02, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x10, +0x00, 0x00, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x92, 0x28, 0xA1, 0x9A, +0x00, 0x49, 0x92, 0x64, 0xC9, 0x92, 0x20, 0x4A, 0x92, 0x24, 0x41, 0x13, +0x24, 0x58, 0x92, 0x20, 0x81, 0x04, 0x41, 0x92, 0x24, 0x49, 0x12, 0x00, +0x49, 0x92, 0x06, 0x49, 0x92, 0x24, 0x4A, 0x12, 0x24, 0x48, 0x92, 0x24, +0x11, 0x19, 0x04, 0x49, 0x92, 0x24, 0x19, 0x00, 0x49, 0x16, 0x04, 0x49, +0x92, 0x20, 0x88, 0x92, 0x04, 0x48, 0x90, 0x04, 0x00, 0x00, 0x44, 0x48, +0x12, 0x04, 0x42, 0x12, 0x20, 0x43, 0x92, 0x24, 0x01, 0x64, 0x41, 0x92, +0x34, 0xC9, 0x92, 0x08, 0x49, 0x92, 0x04, 0x49, 0x94, 0x60, 0x79, 0x96, +0x24, 0x0A, 0x82, 0x24, 0x80, 0x00, 0x22, 0x49, 0x92, 0x24, 0x09, 0x04, +0x49, 0x92, 0x25, 0x49, 0x12, 0x28, 0xC9, 0x90, 0x00, 0x49, 0x10, 0x64, +0xC9, 0x92, 0x24, 0x4A, 0x90, 0x24, 0x40, 0x12, 0x24, 0x58, 0x92, 0x24, +0x89, 0x00, 0x41, 0x12, 0x05, 0x49, 0x12, 0x20, 0x49, 0x92, 0x04, 0x41, +0x92, 0x24, 0x43, 0x92, 0x24, 0x40, 0x92, 0x24, 0x11, 0x92, 0x24, 0x09, +0x92, 0x04, 0x09, 0x04, 0x41, 0x16, 0x05, 0x41, 0x82, 0x20, 0x89, 0x80, +0x04, 0x49, 0x90, 0x04, 0x09, 0x82, 0x64, 0x48, 0x92, 0x04, 0x40, 0x12, +0x20, 0x4B, 0x92, 0x26, 0x01, 0x64, 0x01, 0x92, 0x25, 0x48, 0x90, 0x00, +0x48, 0x92, 0x00, 0x41, 0x92, 0x60, 0x59, 0x96, 0x24, 0x0A, 0x82, 0x24, +0xC1, 0x12, 0x24, 0x19, 0x80, 0x24, 0x09, 0x00, 0x20, 0x20, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x01, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x92, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x92, 0x00, 0x01, 0x00, +0x00, 0x82, 0x00, 0x00, 0x01, 0x00, 0x00, 0x84, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x44, 0x04, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x60, +0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x80, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x41, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x14, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x01, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x24, 0x49, +0x12, 0x28, 0xC8, 0x92, 0x05, 0x49, 0x92, 0x64, 0x59, 0x90, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x25, 0x51, 0xD2, 0x24, 0x88, 0x28, 0x49, 0x92, +0x24, 0x49, 0x92, 0x00, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x5B, 0x92, +0x04, 0x48, 0x12, 0x24, 0x41, 0x92, 0x04, 0x49, 0x92, 0x24, 0x09, 0x24, +0x59, 0x92, 0x04, 0x49, 0x90, 0x20, 0xC8, 0x96, 0x04, 0x49, 0x92, 0x24, +0x49, 0x92, 0x24, 0x48, 0x93, 0x24, 0x01, 0x92, 0x04, 0x49, 0x92, 0x04, +0x19, 0x84, 0x09, 0x90, 0xA0, 0x09, 0x92, 0x28, 0xC9, 0x92, 0x04, 0x41, +0x92, 0x66, 0x41, 0x16, 0x24, 0x1A, 0xB2, 0x24, 0xD1, 0x92, 0x24, 0x5B, +0x90, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0xC9, 0x92, +0x25, 0x49, 0x90, 0x44, 0x59, 0x92, 0x24, 0x4A, 0x92, 0x04, 0x41, 0x92, +0x25, 0x59, 0x92, 0x24, 0xA9, 0x2C, 0x49, 0xD2, 0x24, 0x49, 0x12, 0x20, +0x49, 0x92, 0x04, 0x41, 0x82, 0x24, 0x5B, 0x92, 0x24, 0x4C, 0x90, 0x00, +0x41, 0x92, 0x24, 0x49, 0x92, 0x04, 0x01, 0x84, 0x1C, 0x5A, 0x04, 0x49, +0x10, 0xA0, 0xC9, 0x87, 0x04, 0x49, 0x80, 0x04, 0x49, 0x8A, 0x26, 0x08, +0x00, 0x00, 0x40, 0x93, 0x26, 0x41, 0x92, 0x24, 0x09, 0x04, 0x4D, 0x92, +0x24, 0x41, 0x82, 0x28, 0xC8, 0x12, 0x04, 0x49, 0x82, 0x64, 0x49, 0x14, +0xA4, 0x0A, 0x90, 0x00, 0xD1, 0x92, 0x24, 0x1B, 0x02, 0x20, 0x09, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x40, 0x02, 0x24, 0x01, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0A, 0x24, +0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x26, 0x70, 0xDB, 0xB6, +0x2D, 0x07, 0xB0, 0x00, 0xD3, 0xB6, 0x6D, 0x1F, 0x80, 0x0D, 0x08, 0xB4, +0x6D, 0xBB, 0x02, 0x68, 0x03, 0x85, 0x6D, 0xDB, 0x30, 0x4D, 0x13, 0x22, +0xE9, 0xB2, 0x67, 0x42, 0x28, 0x02, 0xCD, 0x95, 0x65, 0x0F, 0xAA, 0x80, +0x48, 0x8C, 0x6F, 0x9D, 0x42, 0x21, 0x48, 0x03, 0x5C, 0xDF, 0x3A, 0x28, +0xD0, 0x20, 0x78, 0xE4, 0x4C, 0x62, 0xD8, 0xA4, 0x4C, 0x94, 0xEA, 0x0D, +0x18, 0x34, 0x01, 0xD4, 0x8D, 0xD3, 0x02, 0xE4, 0x61, 0xC3, 0xF9, 0x51, +0x3B, 0x0B, 0x89, 0x00, 0xDB, 0x83, 0x7F, 0x47, 0x52, 0x85, 0xD0, 0xB6, +0x4C, 0x39, 0xC2, 0x85, 0x04, 0xB4, 0x7E, 0xC9, 0x2A, 0x21, 0x0A, 0x88, +0xCD, 0xDA, 0x57, 0xB6, 0x08, 0x8B, 0x48, 0xD2, 0x44, 0xB8, 0x0D, 0x59, +0x45, 0x92, 0x20, 0x09, 0x6D, 0xC0, 0x9E, 0x90, 0x84, 0x08, 0x68, 0x83, +0xB4, 0x88, 0x24, 0x40, 0x45, 0x9A, 0x6C, 0xC9, 0x10, 0x14, 0x0C, 0xD0, +0x05, 0xC9, 0x43, 0x30, 0x08, 0x11, 0x86, 0x5B, 0xB6, 0x60, 0x24, 0x03, +0x22, 0xDA, 0x96, 0x46, 0x01, 0x09, 0x06, 0x9A, 0x35, 0x4B, 0xC4, 0x88, +0x15, 0x90, 0xA5, 0x79, 0x82, 0x20, 0x21, 0x1A, 0x74, 0x69, 0x92, 0x38, +0x44, 0x20, 0x23, 0x2F, 0xD6, 0x06, 0x00, 0x82, 0x04, 0xB4, 0xE4, 0xDB, +0x40, 0x24, 0x04, 0x99, 0x2D, 0x4A, 0x66, 0x02, 0x03, 0x0A, 0xA4, 0x5E, +0xB2, 0x90, 0x05, 0x5B, 0x00, 0x68, 0xB0, 0x45, 0x00, 0x40, 0x32, 0xDB, +0x90, 0x25, 0x25, 0x61, 0x32, 0xD0, 0x06, 0xEC, 0x20, 0x09, 0x91, 0xE0, +0xB6, 0x10, 0x43, 0x49, 0xA8, 0x84, 0xB5, 0x05, 0x19, 0x63, 0x12, 0x22, +0x89, 0x05, 0x01, 0x04, 0x01, 0x00, 0x70, 0x22, 0x92, 0x44, 0x04, 0x48, +0xD3, 0x02, 0x18, 0x6D, 0x40, 0x44, 0xD8, 0x80, 0x50, 0x40, 0x22, 0x41, +0x02, 0x80, 0x20, 0x50, 0x02, 0x25, 0x05, 0x29, 0x18, 0x40, 0x02, 0x00, +0x08, 0x08, 0x08, 0x00, 0x81, 0x02, 0x48, 0x08, 0x22, 0xA0, 0x81, 0x00, +0x08, 0x80, 0x43, 0x30, 0x20, 0x10, 0x03, 0x60, 0x11, 0x48, 0x80, 0x20, +0x80, 0x20, 0x03, 0x00, 0xC2, 0xC4, 0x40, 0x00, 0x5F, 0x61, 0x80, 0x24, +0x85, 0x00, 0x91, 0x4E, 0x5A, 0x15, 0x08, 0x00, 0x00, 0x80, 0x27, 0x4D, +0xD2, 0x0C, 0x00, 0x80, 0x11, 0x49, 0x9B, 0x66, 0x00, 0x18, 0x00, 0x49, +0x9A, 0xA4, 0x0D, 0x40, 0x04, 0x40, 0xD2, 0x24, 0xCD, 0x08, 0x00, 0x12, +0x3D, 0x4D, 0x9C, 0x60, 0x29, 0x13, 0x01, 0x69, 0x9B, 0x34, 0x82, 0x82, +0x00, 0x6C, 0x93, 0x22, 0x01, 0x00, 0x00, 0x48, 0x83, 0x20, 0x0D, 0x00, +0x08, 0x00, 0xB5, 0x49, 0xD3, 0x22, 0x00, 0x00, 0x80, 0x69, 0x9B, 0x32, +0x01, 0x40, 0x00, 0x6C, 0xDA, 0xB6, 0x01, 0x50, 0x10, 0x09, 0x93, 0xA6, +0x0D, 0x04, 0x40, 0x00, 0x27, 0x6C, 0x82, 0x0C, 0x00, 0x90, 0x90, 0x49, +0x93, 0xC6, 0x08, 0x10, 0x04, 0x4D, 0x93, 0x36, 0x0D, 0x00, 0x00, 0x48, +0xDB, 0x36, 0x68, 0xFF, 0xED, 0x47, 0x90, 0xA0, 0x09, 0xF6, 0x6F, 0x7A, +0xB6, 0x24, 0x40, 0xD8, 0x7F, 0xC3, 0xAF, 0x25, 0x41, 0x12, 0xFC, 0x9F, +0x38, 0x2C, 0x09, 0x92, 0x60, 0x30, 0xCC, 0x8D, 0x80, 0x30, 0x43, 0x12, +0xD4, 0xC4, 0x82, 0x04, 0x40, 0x02, 0x61, 0x7D, 0xA7, 0x00, 0x48, 0x94, +0x02, 0xD6, 0xA7, 0x06, 0x58, 0x96, 0x20, 0x1C, 0x31, 0x93, 0x00, 0x24, +0x08, 0x00, 0x85, 0x3A, 0x03, 0x04, 0x40, 0x04, 0x74, 0xA3, 0xA4, 0x00, +0x01, 0x00, 0xD0, 0x2E, 0x4C, 0x42, 0x48, 0x10, 0x20, 0xF0, 0xA0, 0xF7, +0x92, 0x01, 0x59, 0xB6, 0x29, 0x23, 0x7F, 0x24, 0x48, 0xF0, 0xE5, 0x47, +0x7B, 0x21, 0x48, 0x80, 0xEC, 0xB3, 0xF6, 0x07, 0x00, 0x88, 0x45, 0x00, +0x43, 0x10, 0xB6, 0x4D, 0xBB, 0x02, 0xD0, 0x02, 0x88, 0x6D, 0xDA, 0x32, +0x00, 0x26, 0x30, 0x6E, 0xD3, 0x16, 0x01, 0x30, 0xC0, 0x50, 0xDB, 0xB4, +0xA9, 0x60, 0x92, 0x72, 0x84, 0x69, 0x91, 0x80, 0x48, 0x32, 0x88, 0x4C, +0x92, 0x20, 0x45, 0x80, 0x19, 0x50, 0x91, 0x30, 0xA1, 0x2C, 0x49, 0xC8, +0xCA, 0x32, 0x03, 0xA5, 0xCC, 0xD8, 0x14, 0x0D, 0xD2, 0xA2, 0x58, 0x87, +0x05, 0x4F, 0x50, 0x20, 0x0A, 0x9C, 0x27, 0x1C, 0x1B, 0x36, 0x51, 0x91, +0x23, 0x89, 0x0E, 0x24, 0x00, 0x49, 0x1C, 0x04, 0xA5, 0x48, 0xC9, 0x42, +0x52, 0x9C, 0x88, 0x6D, 0x9A, 0x15, 0x1B, 0xA0, 0x00, 0x4E, 0xC8, 0xA4, +0x51, 0xDE, 0x4C, 0x50, 0x13, 0xA6, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x90, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x21, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x04, 0x04, 0x08, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x04, 0x48, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, +0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x03, 0x40, 0x00, 0x00, 0x00, 0x01, +0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x01, 0x04, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x09, 0x80, +0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, +0x20, 0x00, 0x00, 0x82, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x80, 0x08, 0x10, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x01, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x48, 0x00, +0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x20, 0x08, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x04, 0x40, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x02, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x24, +0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, +0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x80, 0x20, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x82, 0x01, 0x04, +0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x24, 0x40, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, +0x00, 0x02, 0x81, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x04, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, +0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x01, 0x00, +0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x40, 0x00, 0x00, 0x04, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x02, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x02, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x03, 0x00, 0x44, +0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x04, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x0C, 0x08, +0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x02, 0x40, 0x00, 0x04, 0x80, 0x10, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x02, +0x00, 0x80, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xC0, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x09, 0x00, +0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x84, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x10, 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x20, 0x00, +0x00, 0x48, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x40, 0x01, 0x00, +0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x40, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x20, 0x00, 0x00, 0x48, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x08, 0x02, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x08, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x84, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, +0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x40, 0x82, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x09, 0x02, 0x00, 0x82, +0x04, 0x41, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x00, +0x60, 0x04, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x20, 0x00, 0x00, 0x00, +0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, +0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x40, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x48, 0x92, 0x24, 0x49, +0x92, 0x29, 0x40, 0x12, 0x04, 0x48, 0x92, 0x44, 0x49, 0x82, 0x64, 0x4A, +0x92, 0x20, 0x40, 0x12, 0x04, 0x5B, 0x92, 0x25, 0x89, 0x65, 0x49, 0x92, +0x28, 0xC9, 0x92, 0x00, 0x40, 0x02, 0x04, 0x49, 0x92, 0x24, 0x48, 0x92, +0x00, 0x48, 0x92, 0x24, 0x01, 0x12, 0x24, 0x4B, 0x92, 0x24, 0x08, 0x04, +0x03, 0x12, 0x34, 0x49, 0x92, 0x40, 0x03, 0x92, 0x04, 0x49, 0x92, 0x24, +0x08, 0x1E, 0x2C, 0x68, 0x92, 0x60, 0x81, 0x36, 0x24, 0x49, 0x80, 0x2C, +0x09, 0x04, 0x41, 0x90, 0x24, 0x4B, 0x92, 0x28, 0xC9, 0x9A, 0x04, 0x49, +0x92, 0x64, 0x19, 0x92, 0x20, 0x6A, 0x92, 0x24, 0x51, 0x12, 0x24, 0x59, +0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, 0x82, 0x28, 0x08, 0x12, +0x00, 0x49, 0x92, 0x44, 0x49, 0x92, 0x64, 0x4A, 0x92, 0x24, 0x40, 0x92, +0x04, 0x5B, 0x92, 0x24, 0x81, 0x61, 0x09, 0x92, 0x21, 0x48, 0x9A, 0x20, +0x48, 0x92, 0x04, 0x61, 0x92, 0x20, 0x49, 0x92, 0x04, 0x00, 0x92, 0x24, +0x01, 0x92, 0x24, 0x42, 0x92, 0x24, 0x00, 0x24, 0x4B, 0x92, 0xA5, 0x41, +0x92, 0x60, 0x4A, 0x92, 0x04, 0x44, 0x92, 0x24, 0x48, 0x06, 0x2C, 0x48, +0x82, 0x00, 0xC1, 0xB6, 0x24, 0x41, 0x00, 0x24, 0x09, 0x24, 0x49, 0x92, +0x25, 0x49, 0x92, 0x28, 0xC9, 0x90, 0x04, 0x49, 0x90, 0x64, 0x59, 0x92, +0x24, 0x0A, 0x93, 0x24, 0x11, 0x12, 0x24, 0x19, 0x92, 0x24, 0x09, 0x10, +0x00, 0x40, 0x01, 0x00, 0x00, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, +0x00, 0x10, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x58, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x20, 0x08, 0x01, 0x00, 0x00, 0x84, +0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x20, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x54, 0x00, 0x00, +0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x80, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x40, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, +0x10, 0x00, 0x00, 0x00, 0x20, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x02, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x04, 0x04, 0x48, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x01, +0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x11, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x01, 0x80, 0x48, 0x80, 0x04, 0x08, 0x40, 0x02, 0x00, 0x00, 0x01, +0x40, 0x00, 0x00, 0x44, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, +0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x41, 0x12, 0x24, 0x4A, 0x9A, 0x24, 0xC1, 0x92, 0x64, 0x59, 0x92, 0x24, +0x8D, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x20, 0x49, 0x92, 0x0D, 0x41, +0x92, 0x24, 0x0B, 0xB2, 0x24, 0x08, 0x92, 0x24, 0xC1, 0x90, 0x26, 0x49, +0x92, 0x24, 0x09, 0x24, 0xD9, 0x92, 0x24, 0x09, 0x92, 0x20, 0x49, 0x92, +0x04, 0x09, 0x90, 0x24, 0x49, 0xD2, 0x24, 0x48, 0x92, 0x24, 0x40, 0x92, +0x04, 0x09, 0x12, 0xA0, 0x09, 0x04, 0x49, 0x92, 0x24, 0x69, 0x92, 0x28, +0x49, 0x82, 0x04, 0x49, 0x92, 0x64, 0x09, 0x10, 0x24, 0x4E, 0x82, 0x24, +0x41, 0x92, 0x25, 0x59, 0x92, 0x24, 0x09, 0xA4, 0x49, 0x92, 0x24, 0x09, +0x92, 0x2C, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0xA4, 0x4A, +0x82, 0x24, 0xC1, 0x92, 0x64, 0x59, 0x92, 0x24, 0x89, 0x26, 0x6D, 0x92, +0x24, 0x49, 0x92, 0x20, 0x4D, 0xD2, 0x09, 0x49, 0x92, 0x24, 0x0B, 0xB2, +0xA4, 0x48, 0x92, 0x24, 0xE1, 0x93, 0x24, 0x49, 0x92, 0xA4, 0x01, 0x26, +0xD8, 0x8A, 0x34, 0x49, 0x12, 0x20, 0x49, 0x92, 0x06, 0x49, 0x90, 0x24, +0x49, 0x93, 0x24, 0x48, 0x12, 0x24, 0x01, 0x92, 0x24, 0x4D, 0x92, 0x24, +0x09, 0x34, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x93, 0x04, 0x49, +0x92, 0x64, 0x4D, 0x90, 0x24, 0x4A, 0x92, 0x24, 0x61, 0x92, 0x25, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x02, 0x24, 0x00, 0x00, 0x00, 0x40, 0x82, 0x04, 0x01, 0x00, 0x02, 0x00, +0x12, 0x3C, 0x08, 0x00, 0x60, 0x00, 0x80, 0xA0, 0x41, 0x02, 0x00, 0x02, +0x00, 0x08, 0x02, 0x24, 0x00, 0x40, 0x00, 0x40, 0x82, 0x04, 0x01, 0x00, +0x02, 0x00, 0x12, 0x3C, 0x08, 0x00, 0x60, 0x00, 0x80, 0xA0, 0x41, 0x02, +0x00, 0x02, 0x00, 0x08, 0x12, 0x24, 0x00, 0x40, 0x00, 0x40, 0x82, 0x04, +0x01, 0x00, 0x02, 0x00, 0x12, 0x3C, 0x08, 0x00, 0x60, 0x00, 0x80, 0xA0, +0x41, 0x02, 0x00, 0x02, 0x00, 0x08, 0x12, 0x24, 0x00, 0x40, 0x00, 0x40, +0x82, 0x04, 0x01, 0x00, 0x02, 0x00, 0x12, 0x3C, 0x08, 0x00, 0x60, 0x00, +0x80, 0xA0, 0x41, 0x02, 0x00, 0x02, 0x00, 0x08, 0x12, 0x24, 0x00, 0x40, +0x00, 0x40, 0x02, 0x05, 0x01, 0x00, 0x04, 0x00, 0x12, 0x24, 0x08, 0x00, +0x00, 0x00, 0x80, 0x20, 0x41, 0x02, 0x00, 0x00, 0x00, 0x08, 0x12, 0x24, +0x00, 0x00, 0x00, 0x40, 0x02, 0x05, 0x01, 0x00, 0x04, 0x00, 0x12, 0x24, +0x08, 0x00, 0x00, 0x00, 0x80, 0x20, 0x41, 0x02, 0x00, 0x00, 0x00, 0x08, +0x02, 0x24, 0x00, 0x00, 0x00, 0x40, 0x02, 0x05, 0x01, 0x00, 0x04, 0x00, +0x12, 0x24, 0x08, 0x00, 0x00, 0x00, 0x80, 0x20, 0x41, 0x02, 0x00, 0x00, +0x00, 0x08, 0x02, 0x24, 0x00, 0x00, 0x00, 0x40, 0x02, 0x05, 0x01, 0x00, +0x04, 0x00, 0x12, 0x24, 0x08, 0x00, 0x00, 0x00, 0x80, 0x20, 0x41, 0x02, +0x00, 0x00, 0x00, 0x00, 0x14, 0x44, 0xD9, 0xB4, 0x6F, 0x03, 0x18, 0x02, +0xDA, 0x96, 0x67, 0x7B, 0x80, 0xE0, 0x00, 0xB4, 0x6D, 0xD9, 0x0C, 0xE4, +0x00, 0x98, 0x7D, 0xDD, 0x56, 0x24, 0x96, 0x24, 0x41, 0x37, 0x7D, 0x63, +0x42, 0x22, 0x40, 0xB6, 0x64, 0x3A, 0xF6, 0x00, 0x04, 0xFC, 0x6C, 0xCB, +0x12, 0x08, 0x03, 0x48, 0xE9, 0xDF, 0x16, 0x20, 0xC0, 0x94, 0x59, 0xB4, +0xBA, 0x61, 0xAA, 0x90, 0x40, 0xDE, 0x0D, 0x18, 0x10, 0xAC, 0xAD, 0x74, +0xED, 0x69, 0x03, 0x76, 0x08, 0xC0, 0x31, 0xF1, 0x35, 0x06, 0x04, 0x00, +0xC9, 0xF6, 0x6D, 0x43, 0x85, 0x00, 0xD1, 0xB3, 0x6F, 0x7B, 0x32, 0x71, +0x00, 0xAC, 0x0D, 0xDB, 0x4E, 0x8C, 0xC3, 0x18, 0x6E, 0xD9, 0x56, 0xB6, +0x20, 0x1B, 0x48, 0x00, 0xA4, 0xB0, 0x65, 0xD9, 0x4C, 0x32, 0x9C, 0x81, +0x6D, 0x0B, 0x92, 0x90, 0x14, 0x42, 0x61, 0x0F, 0x92, 0x95, 0xA4, 0x4A, +0x22, 0x92, 0x68, 0x5F, 0x90, 0x00, 0x00, 0x91, 0x25, 0x49, 0xC6, 0x40, +0x29, 0x08, 0x1B, 0x5B, 0x92, 0x90, 0x21, 0x19, 0x31, 0xC1, 0x95, 0x04, +0x30, 0x01, 0x23, 0x96, 0xA5, 0x4D, 0x80, 0xC8, 0x41, 0x93, 0x47, 0x4B, +0xC6, 0x22, 0x50, 0x06, 0x7D, 0x61, 0x1A, 0x00, 0x00, 0x9A, 0x60, 0x8D, +0xBA, 0x8C, 0x48, 0x40, 0x00, 0x90, 0x28, 0xCB, 0x30, 0x82, 0x24, 0xF9, +0xE0, 0x59, 0x06, 0x8C, 0x00, 0x89, 0x47, 0x8A, 0xB6, 0x00, 0x40, 0x68, +0x22, 0x51, 0x34, 0x14, 0x05, 0x4A, 0x30, 0x5B, 0x10, 0x29, 0x27, 0x0D, +0x81, 0xD8, 0x06, 0x24, 0x31, 0x09, 0x91, 0x04, 0x36, 0x24, 0x59, 0x48, +0x50, 0x34, 0xB1, 0x01, 0xF8, 0x6A, 0x42, 0x20, 0x89, 0x25, 0x00, 0xE0, +0x25, 0x04, 0x00, 0x70, 0xD0, 0x14, 0x00, 0x40, 0x52, 0x04, 0x00, 0x4C, +0x0D, 0x00, 0xD8, 0x66, 0x01, 0x40, 0xC0, 0x0B, 0x1B, 0xA0, 0x0D, 0x49, +0x32, 0x40, 0x25, 0x69, 0x0C, 0x90, 0x00, 0xA4, 0x01, 0x00, 0x91, 0x24, +0x82, 0x10, 0x02, 0x08, 0x02, 0x00, 0xA0, 0x10, 0x01, 0x02, 0x03, 0x06, +0x08, 0x01, 0x02, 0x65, 0xA7, 0x09, 0x92, 0x00, 0x30, 0x60, 0x33, 0x48, +0x90, 0x02, 0x98, 0x24, 0x43, 0x00, 0x12, 0x24, 0x09, 0x20, 0x18, 0x46, +0x80, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x27, 0x5D, 0x91, 0x08, 0x40, 0x02, +0x20, 0x69, 0x98, 0x24, 0x00, 0x80, 0x00, 0x49, 0xD2, 0x36, 0x09, 0x80, +0x20, 0x50, 0xD2, 0x22, 0xA9, 0x00, 0x00, 0x84, 0xB5, 0x4C, 0x92, 0x02, +0x20, 0x01, 0x80, 0x49, 0x9B, 0x06, 0x58, 0x92, 0x00, 0x48, 0x93, 0xB4, +0x01, 0x00, 0x21, 0x48, 0x1B, 0x24, 0x29, 0x00, 0x88, 0x80, 0xA5, 0x59, +0x5B, 0x22, 0x40, 0x80, 0x80, 0x29, 0xD2, 0x26, 0x40, 0x02, 0x20, 0x48, +0xDA, 0xB6, 0x00, 0xC0, 0x08, 0x00, 0xDA, 0x34, 0x0C, 0x00, 0x00, 0x00, +0xB7, 0x0B, 0xD3, 0x40, 0x41, 0x00, 0x20, 0x6D, 0x9A, 0x06, 0x02, 0x10, +0x00, 0x69, 0xD2, 0x24, 0x01, 0x08, 0x00, 0x51, 0xB1, 0x26, 0x29, 0x7F, +0xC9, 0xDB, 0x90, 0x20, 0x4A, 0xF2, 0xA7, 0xD1, 0x9D, 0x04, 0x43, 0x1A, +0x7F, 0x13, 0x3D, 0x26, 0x09, 0x80, 0xF0, 0x1F, 0xDF, 0x31, 0x09, 0x94, +0x04, 0x51, 0x49, 0x53, 0x40, 0x21, 0x49, 0x90, 0xC9, 0x9C, 0x0E, 0x24, +0x40, 0x30, 0x27, 0x4C, 0x3A, 0x24, 0x48, 0x02, 0x50, 0xFA, 0x96, 0x03, +0xC0, 0x92, 0x04, 0x1D, 0x25, 0x66, 0x10, 0x24, 0x80, 0x90, 0x17, 0x22, +0x04, 0x44, 0x09, 0x10, 0x1F, 0x38, 0xCA, 0x24, 0x01, 0x00, 0x71, 0x1C, +0x75, 0x4B, 0x01, 0x82, 0x21, 0xA2, 0x7F, 0xFF, 0x00, 0x64, 0x08, 0x32, +0xAC, 0xFA, 0x9E, 0x00, 0x41, 0x30, 0x49, 0xC3, 0x77, 0x04, 0x09, 0x92, +0x80, 0x53, 0x3E, 0x1E, 0x4A, 0x90, 0x04, 0x80, 0xCB, 0x84, 0xB5, 0x79, +0xD8, 0x02, 0x98, 0x02, 0x80, 0x4D, 0xD0, 0x56, 0x80, 0x90, 0xA4, 0x6C, +0x9B, 0xA4, 0x05, 0xB0, 0x05, 0x50, 0x8B, 0xB0, 0x8D, 0x4A, 0xB3, 0x00, +0x25, 0x68, 0xCB, 0x02, 0x0A, 0xE2, 0x09, 0x6D, 0x92, 0x17, 0xC0, 0xA0, +0x60, 0x24, 0x92, 0xA4, 0xE1, 0x37, 0x28, 0x00, 0x52, 0x32, 0x09, 0xA0, +0x48, 0xB3, 0x34, 0x4D, 0x00, 0x60, 0x98, 0x58, 0x08, 0x05, 0x9A, 0x34, +0x20, 0x86, 0x65, 0x2C, 0x5B, 0x44, 0x10, 0xA3, 0xC6, 0x01, 0x82, 0xD4, +0x2C, 0x6C, 0xD1, 0x10, 0x25, 0xAD, 0xDB, 0x02, 0x0B, 0x86, 0x88, 0x68, +0xD9, 0x54, 0x04, 0x18, 0x08, 0x64, 0x9B, 0xB6, 0xF5, 0x86, 0x41, 0x59, +0xD8, 0xBC, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, +0x00, 0x00, 0x00, 0x20, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, +0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x48, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x40, 0x08, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, +0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x04, 0x80, 0x20, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x90, 0x01, 0x00, 0x00, 0x00, +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x08, 0x41, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x02, +0x00, 0x10, 0x00, 0x00, 0x41, 0x02, 0x40, 0x00, 0x00, 0x80, 0x00, 0x04, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x80, 0x20, 0x48, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x20, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x41, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x00, 0x00, 0x00, 0x00, 0x10, +0x24, 0x01, 0x00, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x02, 0x00, 0x00, +0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, +0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x01, 0x02, 0x00, 0x00, 0x04, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x00, 0x10, +0x01, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x04, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x88, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x08, 0x04, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, +0x10, 0x80, 0x00, 0x41, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x02, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x30, 0x10, +0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x80, 0x02, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0x00, 0x00, 0x20, 0x00, +0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x04, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x01, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x08, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x22, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x01, +0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, +0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x80, +0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x10, 0x00, +0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x40, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x48, 0x16, 0x25, 0x41, 0x82, 0x2C, 0xC9, 0x92, +0x00, 0x89, 0xB2, 0x44, 0x49, 0x9C, 0x24, 0x4A, 0x92, 0x24, 0x40, 0x82, +0x26, 0x58, 0x92, 0x24, 0x99, 0x06, 0x41, 0x8C, 0x25, 0x49, 0x82, 0x00, +0x0F, 0x12, 0x04, 0x49, 0x92, 0x24, 0x40, 0x82, 0x02, 0x48, 0x92, 0x24, +0x01, 0x10, 0x64, 0x41, 0x92, 0x24, 0x09, 0x24, 0x09, 0x90, 0x25, 0x49, +0x92, 0x20, 0x4C, 0x82, 0x00, 0x49, 0x92, 0x2C, 0x49, 0x12, 0x25, 0x48, +0xD2, 0x65, 0x41, 0x12, 0x05, 0x48, 0x93, 0x24, 0x09, 0x24, 0x09, 0x86, +0x25, 0x49, 0x92, 0x2C, 0x49, 0x96, 0x10, 0x49, 0x82, 0x24, 0x09, 0x12, +0x24, 0x42, 0x92, 0x04, 0xA1, 0x40, 0x24, 0x49, 0x92, 0x24, 0x09, 0x04, +0x49, 0x96, 0x24, 0x09, 0x82, 0x28, 0xC9, 0x92, 0x04, 0x09, 0x90, 0x64, +0x49, 0x96, 0x24, 0x4A, 0x82, 0x24, 0x40, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x24, 0x49, 0x96, 0x20, 0x49, 0x02, 0x00, 0x0B, 0x92, 0x04, 0x45, +0x92, 0x24, 0x49, 0x92, 0x00, 0x48, 0x92, 0x24, 0x41, 0x12, 0x64, 0x41, +0x92, 0x24, 0x08, 0x24, 0x49, 0x92, 0x24, 0x41, 0x92, 0x20, 0x49, 0x82, +0x04, 0x49, 0x92, 0x04, 0x49, 0x90, 0x25, 0x48, 0x92, 0x20, 0x41, 0x92, +0x25, 0x49, 0x52, 0x20, 0x09, 0x24, 0x09, 0x86, 0x24, 0x49, 0x82, 0x28, +0x69, 0x96, 0x14, 0x48, 0x82, 0x24, 0x49, 0x12, 0x24, 0x4A, 0x92, 0x04, +0xC1, 0x12, 0x24, 0x49, 0x90, 0x04, 0x09, 0x00, 0x10, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x40, +0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x20, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x10, 0x80, +0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x20, 0x01, 0x00, 0x24, 0x48, 0x92, 0x24, 0x49, +0x90, 0x28, 0x49, 0x92, 0x04, 0x48, 0x82, 0x60, 0x49, 0x12, 0x24, 0x4A, +0x92, 0x20, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0xFE, +0x20, 0x59, 0x92, 0xA0, 0xC9, 0x92, 0x0C, 0x11, 0x92, 0x04, 0x41, 0x92, +0x24, 0x08, 0x92, 0x24, 0x43, 0x90, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x28, 0x09, 0xB2, 0x20, 0x4D, 0x92, 0x04, 0x49, 0x9A, 0x2C, +0x68, 0x92, 0x24, 0x48, 0xD6, 0x24, 0x41, 0x92, 0x2C, 0x09, 0x92, 0x24, +0x19, 0x24, 0xC9, 0x92, 0x60, 0x09, 0x92, 0x20, 0xC9, 0x92, 0x14, 0x49, +0x96, 0x64, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0x82, 0x20, 0x59, +0x90, 0x04, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, +0x04, 0x41, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0xB6, 0x24, 0x49, 0x92, 0x20, +0xC9, 0x92, 0x0C, 0x49, 0x92, 0x24, 0x09, 0x92, 0x24, 0x48, 0x92, 0x26, +0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x29, 0x24, 0x49, 0x90, 0x24, 0x49, +0x90, 0x20, 0x49, 0x12, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, +0x92, 0x00, 0x41, 0x82, 0x2C, 0x49, 0x92, 0x24, 0x09, 0x04, 0xC9, 0x92, +0x04, 0x09, 0x92, 0x28, 0xC9, 0x92, 0x14, 0x09, 0x92, 0x24, 0x48, 0x12, +0x24, 0x4A, 0x90, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xE6, 0xD9, 0xB6, +0xF5, 0x01, 0x00, 0x00, 0xD0, 0xB6, 0x6D, 0x52, 0x00, 0x28, 0x6C, 0xB4, +0x6D, 0x4F, 0x07, 0x00, 0x01, 0x90, 0x6D, 0xDB, 0x66, 0x10, 0x08, 0xE3, +0xD9, 0xD7, 0xF7, 0x41, 0x62, 0x20, 0xC9, 0xB7, 0x6C, 0x13, 0xC0, 0xBC, +0xA4, 0xA4, 0x3C, 0x4D, 0x63, 0x0C, 0xC1, 0x82, 0xEC, 0xDA, 0x36, 0x44, +0x00, 0xC4, 0xC8, 0xFE, 0x7F, 0x01, 0x92, 0x26, 0xC1, 0xB6, 0x67, 0x1E, +0x10, 0x96, 0x44, 0xBC, 0x05, 0x89, 0x93, 0xC0, 0x00, 0x81, 0x6D, 0xDD, +0x22, 0x4B, 0x92, 0x04, 0xD8, 0xB6, 0x7D, 0x43, 0x90, 0x0F, 0xD1, 0xF6, +0x65, 0x5E, 0x20, 0x04, 0x0C, 0xB4, 0x69, 0x8B, 0x2E, 0x30, 0xC0, 0x91, +0x2D, 0xDF, 0x72, 0xB6, 0x2D, 0x2D, 0x48, 0x90, 0x2C, 0xBA, 0x65, 0xD9, +0x46, 0x92, 0x24, 0x00, 0x6D, 0xC3, 0xD2, 0x90, 0x00, 0xD9, 0x6A, 0xDB, +0xB6, 0x9D, 0x34, 0x09, 0x02, 0xA6, 0x25, 0x38, 0x00, 0x2A, 0x28, 0xD3, +0x05, 0x5B, 0x42, 0x00, 0x01, 0x00, 0x2D, 0x45, 0x12, 0x80, 0x41, 0xDB, +0x02, 0xD1, 0x16, 0x44, 0x05, 0x08, 0x00, 0x92, 0x25, 0x1F, 0x70, 0x12, +0x00, 0xB2, 0xEC, 0x49, 0x43, 0x01, 0x08, 0x28, 0x65, 0x49, 0xF2, 0x80, +0xC8, 0x1B, 0x20, 0x19, 0x92, 0x04, 0x24, 0x62, 0x0F, 0xB4, 0x6C, 0xDF, +0x00, 0x10, 0x24, 0xB9, 0x34, 0x50, 0x47, 0x92, 0x0C, 0x88, 0x04, 0xC9, +0xB2, 0x10, 0x22, 0x19, 0x02, 0x4B, 0x32, 0x1C, 0x56, 0x40, 0x14, 0x5B, +0x86, 0x8B, 0x27, 0x09, 0x42, 0xD0, 0xBE, 0x2C, 0x39, 0x49, 0x92, 0xAC, +0xB6, 0x64, 0xBA, 0x48, 0x12, 0x00, 0xB8, 0x6D, 0x48, 0x62, 0x92, 0x20, +0x89, 0x01, 0x08, 0x00, 0x25, 0x1C, 0x01, 0x30, 0x50, 0x04, 0x09, 0x40, +0x3A, 0x02, 0x12, 0x62, 0x20, 0x48, 0x00, 0x20, 0xD0, 0x01, 0x00, 0xC0, +0x0A, 0x20, 0x00, 0x81, 0x04, 0x20, 0xA5, 0x20, 0x80, 0x10, 0x12, 0x12, +0x86, 0x05, 0x00, 0x20, 0x80, 0x92, 0x09, 0x00, 0x87, 0x24, 0x00, 0x2C, +0xD8, 0x08, 0xD8, 0xB0, 0x09, 0x01, 0x13, 0x61, 0x03, 0x20, 0xC0, 0x00, +0x00, 0x24, 0x3A, 0x08, 0x80, 0x20, 0x90, 0x24, 0xCB, 0x4C, 0x8B, 0x06, +0x89, 0x05, 0x18, 0x47, 0x12, 0x32, 0x08, 0x00, 0x00, 0x22, 0x27, 0x49, +0xDB, 0x0A, 0x08, 0x00, 0x20, 0x49, 0x9A, 0xA4, 0x00, 0x00, 0x40, 0x49, +0xD2, 0xB0, 0x01, 0x10, 0x00, 0x50, 0x92, 0x24, 0x89, 0x00, 0x20, 0xA2, +0x2D, 0x2A, 0x89, 0x22, 0x40, 0x82, 0x00, 0x69, 0x93, 0x34, 0x48, 0x96, +0x04, 0x48, 0xDB, 0xF2, 0x00, 0x18, 0x00, 0x40, 0x1B, 0xA4, 0x2D, 0x26, +0x08, 0x00, 0x35, 0x01, 0x91, 0x22, 0x01, 0x00, 0x00, 0x49, 0xDA, 0x36, +0x00, 0x00, 0x40, 0x60, 0xDA, 0x36, 0x01, 0x50, 0x00, 0x40, 0x9B, 0xB2, +0x2D, 0x04, 0x40, 0x04, 0x27, 0x4D, 0x92, 0x00, 0x10, 0x0A, 0x21, 0x5D, +0x9B, 0x26, 0x41, 0x00, 0x00, 0x69, 0xDA, 0x34, 0x01, 0x40, 0x80, 0x50, +0xD3, 0x3B, 0x0D, 0x7F, 0xEF, 0x5D, 0x90, 0x24, 0x00, 0xF1, 0x67, 0xBF, +0x9D, 0x24, 0x41, 0x12, 0xFF, 0xDF, 0x93, 0x26, 0x09, 0x06, 0xF0, 0xEB, +0xEE, 0x39, 0x49, 0x92, 0x24, 0xF5, 0xD1, 0x5D, 0xD0, 0x45, 0x52, 0xD0, +0x09, 0x14, 0x84, 0x04, 0x48, 0x02, 0x31, 0x49, 0xD3, 0x24, 0x00, 0x04, +0x21, 0xA3, 0xA6, 0x09, 0xC0, 0x12, 0x00, 0x91, 0xD7, 0x36, 0x80, 0x6C, +0x4A, 0x10, 0xCC, 0x92, 0x87, 0x24, 0x01, 0x00, 0xEB, 0xD3, 0x2B, 0x0C, +0x05, 0x80, 0x40, 0x2F, 0xB5, 0x08, 0x40, 0x04, 0x00, 0x22, 0x0D, 0xFB, +0x90, 0x20, 0x49, 0xB2, 0x6D, 0xB1, 0x9E, 0x20, 0x40, 0x10, 0x3C, 0xDA, +0xE3, 0x94, 0x01, 0x82, 0x60, 0x83, 0x3F, 0x1E, 0x08, 0x84, 0x20, 0x00, +0x50, 0x10, 0xB4, 0xED, 0x03, 0x00, 0x00, 0x42, 0x82, 0x6D, 0xDB, 0x76, +0x00, 0x10, 0x05, 0x6C, 0xDB, 0x22, 0x04, 0x00, 0x01, 0x54, 0xDB, 0xB6, +0xAD, 0x48, 0xD2, 0x86, 0xB5, 0x08, 0x40, 0x00, 0x8A, 0xA0, 0x86, 0x6C, +0xD2, 0x34, 0xC4, 0x90, 0x4D, 0xEC, 0x8A, 0x20, 0x02, 0x66, 0x69, 0x4B, +0x52, 0xB6, 0x2D, 0x6C, 0xDA, 0x80, 0x24, 0x05, 0xC9, 0x40, 0x01, 0xE4, +0x08, 0x69, 0xD1, 0x32, 0x1A, 0x2C, 0x14, 0x64, 0x92, 0xA4, 0xD0, 0x82, +0x25, 0x47, 0x93, 0x20, 0x39, 0x48, 0x80, 0x00, 0xB4, 0x4D, 0x8B, 0x42, +0xCB, 0xC2, 0xC0, 0x2D, 0xD3, 0x72, 0x4B, 0x13, 0x14, 0x68, 0xD6, 0xA5, +0x55, 0xB0, 0x45, 0x50, 0x9B, 0xA0, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x04, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x10, 0x40, 0x00, 0x00, 0x00, 0x41, 0x02, 0x00, 0x08, +0x00, 0x00, 0x40, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, +0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x02, +0x90, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x90, 0x00, 0x00, +0x00, 0x80, 0x00, 0x04, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, +0x00, 0x00, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x04, 0x00, 0x40, 0x10, +0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, +0x08, 0x00, 0x00, 0x10, 0x00, 0x20, 0x41, 0x00, 0x40, 0x10, 0x00, 0x40, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x04, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x04, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x90, 0x00, 0x08, 0x00, +0x40, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x08, 0x00, 0x00, 0x04, 0x50, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, +0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, +0x00, 0x00, 0x80, 0x00, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x20, 0x02, 0x00, 0x00, 0x08, 0x00, 0x01, 0x04, +0x40, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, +0x01, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x02, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x08, 0x04, 0x00, 0x00, 0x80, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x74, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x02, +0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x20, 0x41, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x20, +0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x01, +0x40, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x44, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, +0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x09, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x80, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x01, 0x10, +0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x20, 0x00, 0x20, 0x21, +0x00, 0x06, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x02, 0x00, 0x80, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, +0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x90, 0x02, 0x00, +0x00, 0x00, 0x01, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x00, 0x20, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x40, 0x80, +0x00, 0x00, 0x00, 0x00, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x28, 0x10, 0x04, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, +0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x40, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x04, +0x01, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x08, 0x02, 0x24, 0x49, +0x92, 0x28, 0x49, 0x90, 0x02, 0x49, 0x92, 0x64, 0x0B, 0x02, 0x24, 0x4A, +0x82, 0x24, 0x41, 0x82, 0x20, 0x59, 0x90, 0x24, 0x89, 0x24, 0x18, 0x86, +0x25, 0x49, 0x90, 0x00, 0x41, 0x18, 0x04, 0x49, 0x92, 0x24, 0x21, 0x82, +0x2D, 0x40, 0x92, 0x24, 0x01, 0x82, 0x24, 0x49, 0x92, 0x24, 0x08, 0x25, +0xD9, 0x92, 0x24, 0x49, 0x10, 0x20, 0x00, 0x82, 0x05, 0x49, 0x92, 0x25, +0x48, 0x12, 0x24, 0x48, 0x92, 0x24, 0x51, 0x12, 0x20, 0x4B, 0x92, 0x28, +0x19, 0x01, 0x4D, 0x90, 0x24, 0x49, 0x92, 0x04, 0x19, 0x02, 0x14, 0x49, +0x92, 0x64, 0x41, 0x92, 0x24, 0x4A, 0xD6, 0x24, 0x51, 0x12, 0x00, 0x59, +0x92, 0x24, 0x09, 0x04, 0x49, 0x82, 0x25, 0x49, 0x12, 0x28, 0x49, 0x90, +0x04, 0x69, 0x90, 0x64, 0x0B, 0x92, 0x24, 0x42, 0x82, 0x24, 0x41, 0x90, +0x24, 0x19, 0x92, 0x24, 0x89, 0x04, 0x50, 0x96, 0x24, 0x01, 0x82, 0x00, +0x48, 0x02, 0x04, 0x49, 0x92, 0x24, 0x48, 0x92, 0x2D, 0x48, 0x82, 0x00, +0x40, 0x92, 0x24, 0x01, 0x92, 0x24, 0x08, 0x25, 0xD9, 0x92, 0x21, 0x09, +0x90, 0x20, 0x49, 0x92, 0x05, 0x49, 0x92, 0x20, 0x48, 0x12, 0x24, 0x48, +0x92, 0x24, 0x51, 0x82, 0x24, 0x03, 0x92, 0x04, 0x21, 0x05, 0x49, 0x90, +0x21, 0x41, 0x92, 0x00, 0x59, 0x92, 0x14, 0x09, 0x92, 0x24, 0x49, 0x92, +0x24, 0x4A, 0x12, 0x24, 0x51, 0x92, 0x24, 0x19, 0x92, 0x24, 0x09, 0x00, +0x20, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x48, +0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x08, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, +0x90, 0x00, 0x48, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x48, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x10, 0x00, 0x00, 0x04, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x49, 0x82, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x59, 0xC2, 0x04, 0x4A, 0x90, 0x00, 0x41, 0x92, 0x25, 0x49, 0x92, 0x24, +0x89, 0xA5, 0x49, 0x92, 0x24, 0x49, 0x12, 0x00, 0x49, 0x93, 0x04, 0x49, +0x92, 0x24, 0xD1, 0x92, 0x24, 0x48, 0x92, 0x24, 0x40, 0x82, 0x24, 0x49, +0x92, 0x24, 0x09, 0x20, 0xC9, 0x92, 0x24, 0x09, 0x92, 0x01, 0x59, 0x92, +0x04, 0x4B, 0x00, 0x24, 0x49, 0x9A, 0x24, 0x50, 0x92, 0x24, 0x43, 0x92, +0x24, 0x08, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x20, 0x09, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x25, 0x48, 0x92, 0x24, +0x51, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x69, 0x92, 0x24, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x59, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x61, 0x12, 0x25, 0x59, 0x92, 0x24, 0x89, 0x25, 0x49, 0x92, +0x24, 0x49, 0x92, 0x20, 0x41, 0x92, 0x04, 0x49, 0x92, 0x20, 0x99, 0xD2, +0x24, 0x48, 0x12, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0xC9, 0x9B, 0x04, 0x49, 0x92, 0x20, 0x59, 0xD2, 0x00, 0x09, 0x82, 0x24, +0x48, 0x02, 0x26, 0x48, 0x92, 0x24, 0x01, 0x10, 0x80, 0x48, 0x92, 0x24, +0x08, 0x34, 0x49, 0x92, 0xA4, 0x49, 0x02, 0xA8, 0x49, 0x92, 0x04, 0x48, +0x92, 0x64, 0x49, 0x90, 0x25, 0x4A, 0x92, 0x24, 0x51, 0x92, 0x24, 0x58, +0x82, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, +0x04, 0x20, 0xC8, 0xBE, 0xED, 0x03, 0x00, 0x22, 0xD1, 0xB6, 0x65, 0x57, +0x80, 0x62, 0x2A, 0xBC, 0x65, 0x1B, 0x06, 0x28, 0x00, 0x95, 0x6D, 0xDF, +0x72, 0x49, 0xD0, 0xA4, 0xF9, 0xB6, 0x6C, 0x01, 0x06, 0x14, 0xC0, 0xB4, +0x2D, 0x1B, 0xB8, 0x00, 0x4A, 0x94, 0xED, 0xDB, 0x23, 0x4C, 0x00, 0x82, +0x6D, 0xFB, 0x26, 0x80, 0x00, 0x14, 0xF8, 0xB7, 0x11, 0x03, 0xC0, 0xB2, +0xC0, 0xF7, 0xA4, 0x1C, 0x4A, 0x2C, 0x8D, 0x94, 0x6C, 0xE3, 0x72, 0x54, +0x78, 0x83, 0xAC, 0x7D, 0x31, 0x49, 0x00, 0x10, 0xBD, 0xAE, 0xAD, 0x03, +0x55, 0x51, 0x90, 0xB8, 0x3E, 0x5B, 0x99, 0x22, 0x28, 0x90, 0x65, 0x7B, +0xA6, 0xEB, 0x45, 0x92, 0xE7, 0xE9, 0x74, 0xB2, 0x28, 0xEB, 0x58, 0x13, +0x24, 0xB8, 0x2D, 0xD9, 0x43, 0x02, 0x2C, 0x01, 0x25, 0x99, 0x94, 0x90, +0x2C, 0x88, 0x68, 0xD3, 0x96, 0x98, 0x24, 0x49, 0x0E, 0x9A, 0x24, 0x49, +0x08, 0x82, 0x01, 0xB2, 0x20, 0xCB, 0x46, 0x81, 0x64, 0x05, 0x44, 0x4B, +0xF0, 0x28, 0x14, 0x01, 0x02, 0x93, 0xB2, 0x0C, 0x26, 0x00, 0x02, 0x32, +0x65, 0xCF, 0x00, 0x48, 0xC0, 0xB0, 0x24, 0x69, 0x06, 0x08, 0x79, 0x02, +0x25, 0xC1, 0x1A, 0x20, 0x01, 0x10, 0x00, 0x89, 0xCA, 0x8C, 0x63, 0x80, +0x04, 0xBF, 0x24, 0xCB, 0x00, 0xC2, 0x72, 0xB9, 0x28, 0x08, 0x02, 0x14, +0x41, 0x00, 0x24, 0x49, 0x9A, 0x24, 0x08, 0x88, 0xCA, 0x30, 0xB2, 0x1D, +0x28, 0x1A, 0x10, 0x9B, 0x90, 0x0D, 0x07, 0x45, 0x52, 0xD0, 0x92, 0x6B, +0x34, 0x49, 0x13, 0xA0, 0xF4, 0x0D, 0x29, 0x40, 0x10, 0x04, 0x99, 0x65, +0x58, 0x62, 0x12, 0x20, 0x89, 0x43, 0x72, 0x82, 0x81, 0x08, 0x4C, 0x40, +0x30, 0x00, 0x09, 0x41, 0x82, 0x34, 0x9A, 0x01, 0x80, 0x0C, 0x51, 0x96, +0x90, 0x00, 0x41, 0x40, 0x8A, 0x0C, 0x01, 0x01, 0x90, 0x00, 0x15, 0x68, +0x8B, 0x00, 0x02, 0x08, 0x80, 0x28, 0x10, 0x30, 0xD0, 0x10, 0x20, 0x40, +0x02, 0x00, 0x01, 0x0A, 0x00, 0x00, 0x02, 0x02, 0x00, 0xC0, 0x90, 0x00, +0x83, 0x40, 0x13, 0x40, 0x00, 0x20, 0x38, 0x03, 0x80, 0xB4, 0x80, 0x34, +0xC2, 0x08, 0x11, 0x04, 0x09, 0x04, 0x01, 0x46, 0x50, 0x00, 0x00, 0x00, +0x00, 0xA0, 0x37, 0x45, 0xD3, 0x08, 0x00, 0x00, 0x24, 0x49, 0x9B, 0xA4, +0x40, 0x02, 0x00, 0x61, 0x9B, 0xA4, 0x01, 0x00, 0x04, 0x50, 0x92, 0xA0, +0x8D, 0x08, 0x04, 0x10, 0xA5, 0x4D, 0x93, 0x02, 0x04, 0x10, 0x40, 0x69, +0xD2, 0x25, 0x60, 0x80, 0x44, 0x6C, 0x52, 0x2C, 0x01, 0x02, 0x00, 0x40, +0x92, 0x14, 0x0D, 0xA2, 0x48, 0x82, 0x15, 0x48, 0xD2, 0x00, 0x48, 0x22, +0x04, 0x0C, 0xDB, 0x22, 0x09, 0x00, 0x00, 0x68, 0xDB, 0xB4, 0x41, 0xD0, +0x00, 0x41, 0x5F, 0xB0, 0x0D, 0x05, 0x00, 0x00, 0x27, 0x45, 0x53, 0x28, +0x00, 0x10, 0x20, 0x45, 0xC9, 0xB6, 0x00, 0x13, 0x28, 0x6D, 0x9F, 0xB4, +0x01, 0xC3, 0x04, 0xD1, 0x9E, 0x16, 0x09, 0xB7, 0xDF, 0x1F, 0x80, 0x28, +0x08, 0xF3, 0xDB, 0xDB, 0x91, 0x24, 0x40, 0x12, 0x3F, 0xDD, 0x87, 0x0E, +0x40, 0x1A, 0xD2, 0xDF, 0xFB, 0x3C, 0x49, 0x16, 0x20, 0xA6, 0x6B, 0x4A, +0x50, 0x20, 0x48, 0x30, 0x79, 0xCB, 0x8E, 0x04, 0x29, 0x12, 0x01, 0x7B, +0xA2, 0x10, 0x89, 0x92, 0x50, 0x99, 0xBD, 0x09, 0x49, 0xA2, 0x20, 0x4C, +0x81, 0x44, 0xA0, 0x25, 0x09, 0x72, 0x11, 0x08, 0x81, 0x61, 0x00, 0x14, +0xC0, 0x9A, 0xA8, 0x04, 0x00, 0x03, 0x22, 0x2B, 0x5F, 0x0C, 0x80, 0x06, +0x30, 0xAA, 0x6B, 0xEA, 0x90, 0x28, 0x88, 0x02, 0x8E, 0xA6, 0x9C, 0x28, +0x12, 0x00, 0x44, 0x80, 0xD6, 0x02, 0x40, 0x02, 0xE0, 0x3C, 0x3A, 0x1C, +0x41, 0xA0, 0x24, 0x44, 0x43, 0x10, 0xA5, 0x61, 0x1B, 0x02, 0x40, 0x04, +0x8A, 0x6D, 0xD2, 0x72, 0x0A, 0x22, 0x50, 0x64, 0xD3, 0x36, 0x05, 0x00, +0x21, 0x51, 0xDB, 0xB2, 0xA9, 0x24, 0x89, 0x34, 0x15, 0x6D, 0x92, 0x80, +0xCB, 0x34, 0x80, 0x6D, 0x9B, 0x26, 0x01, 0xB4, 0x0D, 0x48, 0x1A, 0x2C, +0x40, 0x24, 0x0C, 0x47, 0xD3, 0x96, 0x3F, 0x4C, 0x0A, 0x3B, 0x84, 0x4E, +0x82, 0x42, 0xD9, 0xD6, 0x09, 0x0C, 0x12, 0x20, 0x0A, 0x26, 0x47, 0x4C, +0xDA, 0x86, 0xD1, 0xB4, 0xA5, 0x43, 0x1A, 0x10, 0x28, 0x10, 0x4F, 0x34, +0x50, 0x65, 0x1A, 0x92, 0xD3, 0x96, 0x85, 0x61, 0x88, 0x66, 0x5B, 0x82, +0x25, 0x48, 0xD2, 0x16, 0x15, 0x82, 0xCC, 0x50, 0x11, 0x8C, 0x2F, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, +0x80, 0x04, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, +0x04, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x80, 0x00, 0x08, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x02, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, +0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x24, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x80, 0x00, 0x08, 0x00, +0x00, 0x00, 0x80, 0x40, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, +0x41, 0x00, 0x00, 0x00, 0x04, 0x00, 0x48, 0x00, 0x09, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x25, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x48, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x01, 0x24, 0x40, 0x00, 0xA0, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x81, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x24, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x40, +0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x08, 0x00, +0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, +0x00, 0x00, 0x10, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x40, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x08, 0x60, 0x00, 0x80, +0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x41, 0x00, 0x00, +0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x20, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x08, 0x00, 0x22, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0A, 0x00, 0x02, +0x00, 0x00, 0x10, 0x00, 0x80, 0x28, 0x00, 0x10, 0x00, 0x00, 0x01, 0x06, +0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x20, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x20, 0x00, 0x08, +0x40, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x92, 0x00, 0x00, 0x44, 0x04, 0x00, 0x80, 0x01, 0x00, 0x80, 0x00, 0x85, +0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x24, 0x00, 0x00, 0x20, 0x00, +0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x02, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x06, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, +0x90, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x24, 0x00, +0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x04, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, +0x00, 0x40, 0x00, 0xA4, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0A, 0x00, 0x00, 0x00, 0x20, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x04, 0x01, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x08, +0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x30, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x20, +0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, +0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x01, +0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, +0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x48, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, +0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x80, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x82, 0x00, 0x44, +0x49, 0x82, 0x24, 0x69, 0x92, 0x28, 0x49, 0x12, 0x0C, 0x49, 0x92, 0x44, +0x49, 0x92, 0x24, 0x0A, 0x92, 0x64, 0x41, 0x92, 0x24, 0x58, 0x92, 0x24, +0x89, 0x04, 0x49, 0x84, 0x20, 0x49, 0x92, 0x00, 0x49, 0x10, 0x04, 0x49, +0x92, 0x20, 0x09, 0xA2, 0x24, 0x5C, 0x92, 0x00, 0x41, 0x92, 0x20, 0x48, +0x12, 0x24, 0x19, 0x24, 0x19, 0x82, 0x24, 0x41, 0x92, 0x60, 0x49, 0x80, +0x00, 0x59, 0x02, 0x0C, 0x40, 0x92, 0x24, 0x08, 0x92, 0x24, 0x41, 0x93, +0x04, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x96, 0x28, +0x50, 0x92, 0x04, 0x81, 0x92, 0x64, 0x48, 0x92, 0x24, 0xCA, 0x92, 0x24, +0x41, 0x12, 0x24, 0x58, 0x92, 0x64, 0x09, 0x64, 0x49, 0x92, 0x01, 0x48, +0x92, 0x28, 0x41, 0x92, 0x0C, 0x49, 0x92, 0x44, 0x49, 0x92, 0x04, 0x4A, +0x92, 0xB4, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0x96, +0x21, 0x49, 0x02, 0x20, 0x49, 0x92, 0x04, 0x48, 0x92, 0x24, 0x49, 0xB2, +0x24, 0x08, 0x12, 0x00, 0x41, 0x82, 0x24, 0x49, 0x82, 0x24, 0x09, 0x24, +0x19, 0x12, 0x25, 0x09, 0x92, 0x60, 0x49, 0x12, 0x00, 0x48, 0x92, 0x04, +0x49, 0x90, 0x24, 0x48, 0x92, 0x24, 0x41, 0x82, 0x20, 0x49, 0x92, 0x24, +0x01, 0x04, 0x49, 0x92, 0x25, 0x49, 0x92, 0x28, 0x51, 0x92, 0x04, 0x00, +0x91, 0x66, 0x49, 0x10, 0x24, 0x4A, 0x92, 0x24, 0x01, 0x12, 0x20, 0x59, +0x12, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x40, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x01, 0x00, 0x00, 0x00, +0x04, 0x49, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x44, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, +0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x01, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x02, 0x40, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x80, 0x00, 0x00, +0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x80, 0x82, 0x00, 0x00, 0x80, 0x00, 0x44, 0x80, 0x04, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, +0x00, 0x00, 0x00, 0x40, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, +0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 0x04, 0x00, +0x00, 0x00, 0x02, 0x00, 0x0C, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x14, +0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x48, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x24, 0x49, 0x12, 0x24, 0xC0, 0x92, 0x28, 0x49, 0x92, +0x00, 0x49, 0x92, 0x64, 0x41, 0x82, 0x24, 0x4A, 0x92, 0x20, 0x41, 0xD6, +0x24, 0xD1, 0x92, 0x04, 0x89, 0x04, 0x49, 0x92, 0x20, 0x08, 0x92, 0x20, +0x59, 0x92, 0x04, 0x41, 0x92, 0x24, 0x09, 0x92, 0x24, 0x08, 0x92, 0x24, +0x40, 0x90, 0x24, 0x49, 0x92, 0x24, 0x21, 0x24, 0x49, 0x92, 0x20, 0x49, +0x90, 0x20, 0x49, 0x92, 0x04, 0x48, 0xD2, 0x24, 0x49, 0x92, 0x24, 0x40, +0x82, 0x24, 0x41, 0x92, 0xD4, 0x43, 0x12, 0x24, 0x01, 0x24, 0x4B, 0x92, +0x24, 0x49, 0x92, 0x28, 0x49, 0x82, 0x04, 0x49, 0x92, 0x64, 0x59, 0x93, +0x24, 0x4A, 0x92, 0x24, 0x41, 0x96, 0x20, 0x19, 0x12, 0x04, 0x09, 0x24, +0x01, 0x9A, 0x24, 0x49, 0x92, 0xA8, 0x48, 0x92, 0x06, 0x49, 0x92, 0x60, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x97, 0xA4, 0x59, 0x92, 0x24, +0x89, 0xA4, 0x49, 0x93, 0x24, 0x49, 0x90, 0x30, 0x39, 0x9A, 0x04, 0x49, +0x82, 0x24, 0x49, 0x92, 0x02, 0x48, 0x92, 0x24, 0x41, 0xD3, 0x22, 0x49, +0x93, 0x24, 0x09, 0x24, 0x49, 0x52, 0x24, 0x48, 0x92, 0x20, 0x09, 0x90, +0x04, 0x48, 0xD0, 0x04, 0x41, 0x82, 0x24, 0x48, 0x92, 0x24, 0x41, 0x12, +0x60, 0x4B, 0x82, 0x24, 0x09, 0xA6, 0x43, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x06, 0x48, 0x92, 0x64, 0x5D, 0x92, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x94, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xA0, 0x00, 0x30, 0x79, 0xB6, 0x8D, 0x03, 0x10, 0x80, +0xD0, 0xB6, 0x6D, 0x51, 0x88, 0x21, 0xA8, 0xD4, 0x6D, 0x7B, 0x96, 0x00, +0x43, 0x96, 0x6D, 0xDB, 0x75, 0x61, 0x68, 0x00, 0x5C, 0x9E, 0x6E, 0x83, +0x1A, 0x34, 0x8A, 0x96, 0xAD, 0x1B, 0xB5, 0xAE, 0x80, 0xF0, 0xF5, 0xD1, +0x22, 0x00, 0x20, 0x80, 0x79, 0x72, 0x36, 0x61, 0x92, 0x25, 0x58, 0x94, +0x5D, 0x02, 0x8E, 0xA9, 0xCC, 0x96, 0xEF, 0x08, 0x30, 0x24, 0x85, 0xF4, +0x4D, 0xC1, 0x12, 0xE4, 0x79, 0x82, 0x71, 0x59, 0x3F, 0x19, 0x38, 0x2D, +0xF0, 0x86, 0xED, 0x63, 0xC8, 0x01, 0x50, 0x95, 0x6C, 0x53, 0xB8, 0x25, +0x70, 0x84, 0x7D, 0x5B, 0x7E, 0x21, 0x0B, 0xD0, 0xFC, 0xDA, 0x76, 0x16, +0x2C, 0xEB, 0xC8, 0x90, 0x44, 0x99, 0x6C, 0x59, 0x42, 0x80, 0x24, 0x23, +0x65, 0xDA, 0x1E, 0xB0, 0x24, 0xC9, 0x68, 0xCB, 0xF4, 0x91, 0x20, 0x48, +0x00, 0x97, 0x04, 0xC9, 0x88, 0x30, 0x01, 0x30, 0x64, 0x69, 0x00, 0x31, +0x40, 0x00, 0x18, 0x75, 0x12, 0x84, 0x0C, 0x47, 0x02, 0xC9, 0x92, 0x05, +0x22, 0x84, 0x19, 0x96, 0x6C, 0xCC, 0x88, 0x80, 0x00, 0x90, 0xE0, 0x60, +0x42, 0x62, 0x14, 0x1A, 0x1C, 0xCB, 0x12, 0x10, 0x02, 0x70, 0x60, 0x0F, +0xC2, 0x8F, 0x02, 0x82, 0x00, 0x8E, 0x44, 0x72, 0x00, 0xA1, 0x02, 0xD8, +0x25, 0xC8, 0x86, 0x20, 0x05, 0x81, 0x05, 0x4E, 0x82, 0x20, 0x20, 0x89, +0x12, 0x68, 0xB4, 0x1D, 0x25, 0x20, 0x10, 0x61, 0x96, 0x05, 0x07, 0x4D, +0x13, 0x50, 0xB2, 0x6D, 0x39, 0x09, 0x9A, 0xB4, 0xA6, 0x6C, 0x73, 0x08, +0x10, 0x04, 0xB9, 0x20, 0x18, 0x22, 0xD0, 0x20, 0x80, 0x2A, 0x0C, 0x32, +0x21, 0x40, 0xD0, 0x40, 0x01, 0x02, 0x09, 0x01, 0x02, 0x04, 0x03, 0x01, +0x55, 0x08, 0x00, 0x34, 0x91, 0x28, 0x41, 0x46, 0x8A, 0x14, 0x29, 0x08, +0x01, 0x20, 0x21, 0x20, 0x09, 0xC0, 0x00, 0x04, 0x89, 0x41, 0x51, 0x04, +0x86, 0x00, 0x18, 0x08, 0x0B, 0xA2, 0x21, 0x00, 0x05, 0x00, 0x0A, 0x00, +0x20, 0x00, 0x12, 0x04, 0x03, 0x1D, 0x03, 0x00, 0x80, 0x34, 0x38, 0x48, +0xD0, 0x24, 0x00, 0xE0, 0x82, 0x0C, 0x40, 0x34, 0x88, 0x00, 0x01, 0x00, +0x02, 0x0A, 0x09, 0x20, 0x08, 0x00, 0x87, 0x4D, 0xD3, 0x08, 0x08, 0x00, +0xA0, 0x4D, 0x9A, 0xB6, 0x00, 0x00, 0x00, 0x29, 0x92, 0xA4, 0x01, 0x00, +0x00, 0x50, 0xD2, 0x24, 0x89, 0x01, 0x00, 0x00, 0xA5, 0x65, 0x99, 0x00, +0x09, 0x30, 0x02, 0x69, 0xDA, 0x3E, 0x08, 0xB4, 0x00, 0x4C, 0x9B, 0x26, +0x01, 0x00, 0x04, 0x40, 0xCA, 0x84, 0x29, 0x00, 0x0C, 0x83, 0xA5, 0x4D, +0xD2, 0x00, 0x04, 0x10, 0x80, 0x6D, 0x9A, 0x36, 0x40, 0x82, 0xA0, 0x4C, +0xD2, 0x34, 0x03, 0x02, 0x12, 0x4A, 0xD2, 0xB6, 0x09, 0x00, 0x00, 0x30, +0xA7, 0x6D, 0x92, 0x42, 0x01, 0x10, 0xA4, 0xF9, 0x9B, 0x24, 0x21, 0x01, +0x00, 0x69, 0xD2, 0xB6, 0x11, 0x00, 0x02, 0x50, 0x83, 0x26, 0x0B, 0x9F, +0xF7, 0xE7, 0x78, 0x20, 0x08, 0x73, 0xE7, 0x7F, 0x15, 0x20, 0x41, 0x00, +0x7F, 0xDB, 0x1F, 0x46, 0x49, 0x12, 0x60, 0xFA, 0x7E, 0x3D, 0x09, 0x92, +0x34, 0x06, 0x87, 0x92, 0x10, 0x08, 0x42, 0xA2, 0x44, 0xC3, 0x85, 0x04, +0x05, 0x00, 0x70, 0x4B, 0xF4, 0x20, 0x40, 0x90, 0x72, 0xBE, 0x88, 0x8D, +0x11, 0x32, 0x04, 0x0E, 0x61, 0x14, 0x58, 0x30, 0x09, 0xF2, 0xE1, 0x2B, +0x43, 0x00, 0x41, 0x00, 0x3F, 0x10, 0x10, 0x20, 0x0D, 0x82, 0x60, 0x54, +0x44, 0x05, 0x09, 0x00, 0x24, 0x3C, 0x61, 0xCA, 0x50, 0x00, 0x69, 0x10, +0x28, 0xE7, 0x58, 0x04, 0x40, 0x12, 0x40, 0xDE, 0x96, 0x04, 0x09, 0x00, +0x20, 0xBF, 0xB4, 0x1D, 0x58, 0x90, 0x24, 0x08, 0x41, 0x18, 0x15, 0x69, +0x3A, 0x22, 0x01, 0x82, 0x86, 0x6D, 0xD3, 0x64, 0x18, 0x00, 0x00, 0x0C, +0xDB, 0x16, 0x05, 0x14, 0x81, 0x58, 0x9B, 0xB6, 0xAE, 0x40, 0xD3, 0x04, +0x30, 0x45, 0x98, 0x12, 0x9A, 0x94, 0x84, 0x4D, 0x1B, 0x36, 0xC0, 0x82, +0x2A, 0x28, 0x63, 0xAC, 0x41, 0x57, 0x2E, 0x48, 0xC3, 0x06, 0x0D, 0xE1, +0x9A, 0x5A, 0x34, 0x4D, 0xC2, 0x22, 0x1B, 0xD2, 0x04, 0x4D, 0x18, 0x24, +0x41, 0xBC, 0x67, 0x2C, 0xD2, 0x25, 0x91, 0xB3, 0x28, 0x40, 0xE3, 0x34, +0x04, 0x63, 0x8D, 0x80, 0x95, 0x49, 0x5A, 0xA2, 0x5A, 0x02, 0x03, 0x4C, +0x9A, 0x76, 0xDE, 0x10, 0x6D, 0xC8, 0x8B, 0x26, 0x45, 0xD6, 0x48, 0x12, +0x4A, 0xB4, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x08, +0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x10, 0x00, +0x00, 0x80, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x81, 0x30, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x01, +0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x83, 0x04, 0x00, 0x00, 0x22, 0x48, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x10, 0x18, 0x00, 0x00, 0x04, 0x40, 0x12, 0x00, 0x82, 0x10, 0x08, +0x08, 0x02, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x04, 0x20, 0x11, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x80, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x04, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, +0x00, 0x04, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x20, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x84, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x02, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x40, 0x10, +0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, +0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x19, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, 0x04, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x20, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, +0x81, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x82, 0x00, 0x00, +0x00, 0x40, 0x41, 0x01, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x41, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x04, +0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x00, 0x02, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, +0x00, 0x80, 0x81, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x80, 0x41, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x11, 0x40, 0x00, 0x02, +0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x01, 0x02, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x80, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, +0x20, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x08, 0x08, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, +0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x80, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x42, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, +0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x04, 0x04, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x01, 0x00, 0x00, 0x00, 0x80, +0x90, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x02, 0x04, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x82, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x10, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, +0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x84, +0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x02, 0x04, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, +0x80, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, +0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x00, 0x00, 0x40, +0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x44, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, +0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x80, 0x80, 0x40, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x40, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x24, 0x48, 0x92, 0x25, 0x4B, 0x92, 0x28, 0x41, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x64, 0x4A, 0x92, 0x24, 0x02, 0x90, +0xA4, 0x58, 0x96, 0x24, 0x89, 0xA4, 0xC9, 0xC0, 0x25, 0x49, 0x90, 0x30, +0x49, 0x90, 0x00, 0xCB, 0x12, 0x24, 0x40, 0x02, 0x21, 0x48, 0x92, 0x28, +0x41, 0x10, 0x24, 0x41, 0x92, 0x2C, 0x09, 0x26, 0x59, 0x92, 0x25, 0x49, +0x92, 0x20, 0x03, 0x82, 0x00, 0x41, 0x92, 0x24, 0xC1, 0x12, 0x04, 0x48, +0x12, 0x24, 0x41, 0x12, 0x24, 0x41, 0xB2, 0x64, 0x09, 0x04, 0x59, 0x82, +0x27, 0x09, 0x92, 0x2C, 0x99, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x93, +0x34, 0x4A, 0x92, 0x24, 0x41, 0x02, 0x04, 0x59, 0x90, 0x20, 0x09, 0x24, +0x48, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x12, 0x04, 0x49, 0x90, 0x64, +0x49, 0x92, 0x44, 0x4A, 0x93, 0x24, 0x40, 0x90, 0x20, 0x59, 0x92, 0x24, +0x81, 0x24, 0x89, 0x02, 0x20, 0x41, 0x95, 0x20, 0x49, 0x92, 0x04, 0x41, +0x90, 0x24, 0x40, 0x02, 0x25, 0x08, 0x82, 0x20, 0x40, 0x80, 0x24, 0x49, +0x92, 0x64, 0x09, 0x24, 0x59, 0x92, 0x24, 0x09, 0x92, 0x20, 0x4B, 0x92, +0x00, 0x41, 0x82, 0x24, 0xC9, 0x12, 0x04, 0x48, 0x00, 0x24, 0x41, 0x92, +0x24, 0x49, 0x92, 0x04, 0x09, 0x20, 0x51, 0x92, 0x26, 0x09, 0x90, 0x20, +0x99, 0x92, 0x04, 0x01, 0x90, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x10, 0x24, +0x41, 0x92, 0x04, 0x59, 0x92, 0xA4, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x10, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x20, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x28, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x20, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x20, 0x00, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x02, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x01, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, +0x00, 0x00, 0x00, 0xC0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x24, 0x48, 0xB2, 0x24, 0x49, +0x92, 0x28, 0x49, 0x94, 0x04, 0x4B, 0x92, 0x64, 0xC9, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x64, 0x59, 0x96, 0x24, 0x89, 0x0D, 0x59, 0x92, +0x24, 0x4A, 0x16, 0x20, 0x49, 0x92, 0x04, 0xC9, 0xB2, 0x24, 0x09, 0x32, +0x04, 0x48, 0x92, 0x24, 0x01, 0x92, 0x24, 0x49, 0x92, 0x26, 0x09, 0xA4, +0xE9, 0x32, 0x24, 0x49, 0x92, 0x22, 0x49, 0x92, 0x04, 0x49, 0x10, 0x24, +0x69, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x4B, 0x92, 0x24, +0x09, 0x26, 0x49, 0x92, 0x04, 0x4B, 0x80, 0x28, 0x49, 0xB2, 0x04, 0x49, +0x12, 0x64, 0x4B, 0x96, 0x24, 0x4A, 0x92, 0x24, 0x49, 0x52, 0x24, 0x59, +0x92, 0x34, 0x09, 0x24, 0x00, 0xB2, 0x24, 0x49, 0x92, 0x28, 0x41, 0x94, +0x04, 0x41, 0x12, 0x64, 0xC9, 0x92, 0x20, 0x0A, 0x92, 0x20, 0x41, 0x80, +0x64, 0x59, 0x92, 0x24, 0x89, 0x2D, 0x19, 0x12, 0x15, 0x49, 0x92, 0x20, +0x49, 0x92, 0x04, 0x41, 0x92, 0x24, 0x49, 0xB2, 0x04, 0x48, 0x82, 0x20, +0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0xC9, 0x30, 0x24, 0x49, +0x92, 0x20, 0x09, 0x92, 0x04, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x08, +0x92, 0x24, 0x41, 0x82, 0x04, 0x4B, 0x92, 0x24, 0x01, 0x24, 0x49, 0x90, +0x24, 0x65, 0x12, 0x20, 0x49, 0xB2, 0x04, 0x49, 0x92, 0x64, 0x4B, 0x86, +0x04, 0x4A, 0x92, 0x04, 0x01, 0x92, 0x24, 0x59, 0x82, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x2C, 0xD9, 0xBE, +0xED, 0x02, 0x04, 0x0C, 0xDD, 0xB6, 0x6D, 0x47, 0x00, 0x22, 0x28, 0xB4, +0x65, 0x1B, 0x06, 0x00, 0xC1, 0x93, 0x6D, 0xDB, 0x7A, 0x54, 0x90, 0x64, +0xC1, 0xB6, 0x7D, 0x23, 0x0C, 0x31, 0x40, 0x96, 0x2D, 0x1A, 0x06, 0x60, +0x0D, 0xBC, 0x6D, 0xCB, 0x92, 0x00, 0x41, 0x40, 0x7D, 0xFB, 0x36, 0xCA, +0x83, 0x01, 0xD8, 0xB3, 0x6F, 0x93, 0x53, 0x00, 0xC0, 0x82, 0x1E, 0x3B, +0x70, 0x81, 0x02, 0xB4, 0x6E, 0xD9, 0x12, 0x85, 0x0D, 0x8E, 0xEF, 0xC9, +0x16, 0x22, 0x60, 0x04, 0x5D, 0xA6, 0x6A, 0x03, 0x58, 0x30, 0xDB, 0x9E, +0x2E, 0x7B, 0x13, 0x80, 0x02, 0xF0, 0xED, 0xD9, 0x0C, 0xA2, 0x19, 0x98, +0xF1, 0xF9, 0x56, 0xB6, 0x0D, 0xE3, 0x48, 0x80, 0x24, 0xB8, 0x29, 0x51, +0x43, 0x02, 0x24, 0x11, 0x6D, 0x59, 0x92, 0x90, 0x28, 0x88, 0x6A, 0xDB, +0x32, 0x96, 0xA4, 0x49, 0x16, 0xA2, 0x2D, 0x8D, 0x50, 0x90, 0x00, 0x90, +0x60, 0xC8, 0xC6, 0xB2, 0x64, 0x00, 0x2B, 0x0B, 0xB2, 0x00, 0x04, 0x58, +0x72, 0x5B, 0x96, 0x0D, 0x20, 0x49, 0x12, 0x54, 0xE4, 0xD8, 0x0C, 0x44, +0x80, 0x01, 0x2C, 0x5B, 0x02, 0x86, 0x01, 0x00, 0x04, 0x48, 0x94, 0x10, +0x11, 0x46, 0x60, 0x58, 0xB2, 0x81, 0x00, 0x12, 0x23, 0x90, 0x04, 0xD9, +0xE0, 0xC8, 0x01, 0x98, 0x25, 0x49, 0x0C, 0x21, 0x41, 0x80, 0x74, 0x49, +0xB4, 0x04, 0x16, 0x4F, 0x20, 0x69, 0x8E, 0xD4, 0x08, 0x02, 0x23, 0x1B, +0x12, 0x05, 0x27, 0x41, 0x41, 0xD0, 0x82, 0x25, 0x3C, 0x49, 0x8A, 0x82, +0xB6, 0x2C, 0x4B, 0x48, 0x12, 0x16, 0xB9, 0x49, 0x5C, 0x64, 0x92, 0x30, +0xA0, 0x4D, 0x06, 0x00, 0x25, 0x08, 0x49, 0xD1, 0xB2, 0x00, 0x09, 0x4D, +0x1A, 0x26, 0x90, 0x25, 0xD4, 0x40, 0x12, 0x82, 0x81, 0x68, 0x00, 0x06, +0x80, 0x02, 0x08, 0x09, 0x09, 0x06, 0x85, 0x40, 0x90, 0x40, 0x00, 0x20, +0x81, 0x21, 0xC8, 0x14, 0x06, 0x04, 0x79, 0x28, 0x94, 0x24, 0x31, 0x80, +0xC4, 0x0A, 0x48, 0x00, 0x01, 0x78, 0x02, 0x04, 0x23, 0x49, 0x80, 0x20, +0x10, 0x24, 0x30, 0x01, 0x18, 0x00, 0x00, 0x44, 0x09, 0x00, 0x12, 0x34, +0xC9, 0x80, 0xC0, 0x40, 0x42, 0x80, 0x09, 0x00, 0x02, 0x00, 0x27, 0x43, +0xD3, 0x08, 0x00, 0x00, 0x20, 0x49, 0xBB, 0xB6, 0x00, 0x42, 0x00, 0x49, +0x9A, 0xB6, 0x01, 0x10, 0x00, 0x52, 0x92, 0x24, 0xAF, 0x00, 0x40, 0x16, +0x35, 0x49, 0x92, 0x00, 0x08, 0x12, 0x82, 0x6D, 0xF2, 0x24, 0x02, 0x80, +0x00, 0x48, 0xD3, 0x34, 0x01, 0x80, 0x00, 0x40, 0x82, 0xC4, 0x09, 0x20, +0x40, 0x00, 0x25, 0x6D, 0x9A, 0x00, 0x49, 0x12, 0xC4, 0x4D, 0x81, 0x06, +0x20, 0x00, 0x24, 0x68, 0xD9, 0xA6, 0x01, 0x13, 0x00, 0x48, 0x10, 0x36, +0x29, 0x00, 0x40, 0x00, 0xB3, 0x69, 0x91, 0x00, 0x08, 0x40, 0xAC, 0x61, +0xD9, 0x24, 0x01, 0x80, 0x00, 0x6D, 0x5A, 0x26, 0x41, 0x02, 0x08, 0x50, +0xCB, 0xA6, 0x2D, 0xBF, 0x79, 0xBB, 0x90, 0x2C, 0x08, 0xF2, 0xCF, 0xFB, +0x91, 0x24, 0x40, 0x00, 0xFF, 0x9D, 0xC7, 0x26, 0x41, 0x01, 0xF0, 0xCB, +0xBE, 0x3C, 0x49, 0x92, 0x00, 0x39, 0x2F, 0xC8, 0x80, 0x24, 0x49, 0x92, +0x75, 0x89, 0x0D, 0x00, 0x09, 0x12, 0xED, 0x5F, 0xF2, 0x24, 0x08, 0x82, +0x50, 0x7F, 0xBE, 0x0D, 0x59, 0x32, 0x24, 0xC6, 0xA9, 0xD3, 0x90, 0x00, +0x41, 0xE2, 0xA0, 0xC4, 0x09, 0x22, 0x5A, 0x31, 0x8F, 0x13, 0x1A, 0x04, +0x02, 0x10, 0xE0, 0xA0, 0xA6, 0x05, 0xCF, 0x80, 0x04, 0x15, 0xA9, 0xD2, +0x04, 0x84, 0x4A, 0x22, 0x87, 0x86, 0x12, 0x1C, 0x02, 0x13, 0x58, 0x73, +0x3E, 0x00, 0x81, 0xD0, 0xA0, 0xB4, 0xA4, 0x15, 0x10, 0x10, 0x00, 0x40, +0xC0, 0x50, 0xB5, 0x65, 0x1A, 0x02, 0x50, 0x82, 0x82, 0x6D, 0xD3, 0x60, +0x00, 0x82, 0x34, 0x6C, 0xD3, 0x24, 0x05, 0x24, 0x01, 0x59, 0xDB, 0xA6, +0x83, 0x02, 0xD0, 0x32, 0xA5, 0x6D, 0x82, 0x23, 0x09, 0x76, 0x00, 0x49, +0x93, 0x34, 0x40, 0x90, 0x09, 0x64, 0xDB, 0x24, 0x21, 0x84, 0x69, 0x00, +0xCB, 0x94, 0x2D, 0x20, 0x12, 0x20, 0x34, 0x68, 0xDD, 0x22, 0xDF, 0x9C, +0x0C, 0x49, 0x80, 0x06, 0xD9, 0xB2, 0x00, 0x4C, 0xD8, 0xB4, 0x81, 0x26, +0x09, 0x40, 0x11, 0xA4, 0x0D, 0x05, 0xDD, 0x23, 0x30, 0x6D, 0xD8, 0x42, +0xCA, 0x92, 0x81, 0x47, 0x90, 0x56, 0x8B, 0xB2, 0xC0, 0x28, 0x5B, 0xA4, +0x15, 0x17, 0x21, 0x5B, 0x03, 0x14, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x02, 0x00, 0x04, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x00, 0x88, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, +0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x88, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x80, 0x08, 0x00, 0x10, 0x80, 0x18, 0x02, 0x00, +0x40, 0x00, 0x00, 0x01, 0x40, 0x08, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, +0x80, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, 0x82, 0x10, 0x00, 0x80, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x04, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x02, 0x00, 0x10, 0x00, 0x00, +0x00, 0x10, 0x04, 0x00, 0x01, 0x00, 0x10, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x08, 0x20, 0x80, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x02, +0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, +0x01, 0x00, 0x11, 0x04, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x08, 0x00, 0x81, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, +0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, +0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x81, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x05, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x10, 0x00, 0x02, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x20, 0x04, +0x80, 0x00, 0x08, 0x88, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x40, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x08, 0x00, 0x04, 0x06, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x16, 0x00, 0x40, 0x40, +0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x44, 0x00, 0x00, +0x40, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x48, 0x10, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, +0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x80, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x48, +0x10, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x01, 0x02, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x21, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x01, 0x12, 0x02, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x81, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x04, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x80, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x41, 0x10, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, +0x02, 0x10, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0xA4, 0x09, 0x92, 0x24, 0x59, +0x9A, 0x2A, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x09, 0x92, 0x20, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x82, +0x25, 0x49, 0x92, 0x00, 0x49, 0x96, 0x04, 0x09, 0x90, 0x24, 0x48, 0x10, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0xA8, 0x48, 0x92, 0x24, 0x01, 0x20, +0x08, 0x12, 0x20, 0x49, 0x92, 0x00, 0x49, 0x9A, 0x00, 0x09, 0x96, 0x24, +0xC8, 0x82, 0xA4, 0xC8, 0xB0, 0x24, 0x43, 0x12, 0x20, 0x41, 0x92, 0x24, +0x09, 0x44, 0x09, 0x92, 0x2C, 0x48, 0xB2, 0x2C, 0x4A, 0x92, 0x00, 0x41, +0x92, 0x64, 0x59, 0x12, 0x24, 0x4A, 0x82, 0x24, 0x41, 0xB2, 0x27, 0x59, +0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x28, 0x09, 0x92, +0x04, 0x49, 0x92, 0x60, 0x49, 0x92, 0x04, 0x4A, 0x92, 0x04, 0x40, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x00, +0x49, 0x96, 0x04, 0x49, 0x88, 0x24, 0x48, 0x90, 0x04, 0x48, 0x90, 0x24, +0x41, 0x92, 0x2C, 0x49, 0x92, 0x00, 0x09, 0x24, 0x49, 0x02, 0x25, 0x49, +0x82, 0x20, 0x49, 0x92, 0x00, 0x49, 0x82, 0x24, 0xC9, 0x92, 0x24, 0x00, +0x80, 0x20, 0x40, 0x92, 0x20, 0x41, 0x92, 0x34, 0x09, 0x44, 0x40, 0x92, +0x25, 0x48, 0x92, 0x28, 0x4A, 0x12, 0x04, 0x41, 0x52, 0x64, 0x59, 0x92, +0x04, 0x0A, 0x82, 0x24, 0x41, 0xB2, 0x25, 0x59, 0x10, 0x20, 0x09, 0x00, +0x00, 0x00, 0x01, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x20, 0x00, 0x80, 0x00, 0x08, 0x01, 0x00, 0x40, 0x00, 0x00, 0x44, +0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x02, 0x40, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x84, +0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x10, +0x60, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, +0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x04, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, +0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, +0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x0C, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x24, +0x09, 0xA2, 0x24, 0x49, 0x82, 0x28, 0x49, 0x92, 0x00, 0x49, 0x92, 0x64, +0x49, 0x92, 0x04, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x58, 0x92, 0x24, +0x81, 0x01, 0x49, 0x9A, 0x24, 0x09, 0x12, 0x00, 0x49, 0x92, 0x04, 0x4D, +0x92, 0x04, 0x49, 0x92, 0x24, 0x08, 0x92, 0x26, 0x41, 0x92, 0x24, 0x49, +0x12, 0x24, 0x09, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x96, +0x04, 0x49, 0x80, 0x0C, 0x09, 0x12, 0x6C, 0x48, 0x12, 0x20, 0x41, 0x92, +0x24, 0x49, 0x90, 0x24, 0x09, 0x24, 0x41, 0x92, 0x0C, 0x49, 0x90, 0x08, +0x49, 0x92, 0x04, 0x49, 0x92, 0x6C, 0x49, 0x92, 0x24, 0x1A, 0x92, 0x24, +0x41, 0x12, 0x64, 0x59, 0x92, 0x04, 0x09, 0x24, 0x49, 0xB2, 0x24, 0x49, +0x92, 0xA8, 0x49, 0x92, 0x04, 0x49, 0x82, 0x64, 0x49, 0x90, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x25, 0x49, 0x92, +0x24, 0x09, 0x92, 0x20, 0x49, 0x92, 0x04, 0x48, 0x92, 0x24, 0x49, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0xA4, 0x09, 0x24, +0x08, 0x92, 0x20, 0x09, 0x92, 0x20, 0x49, 0x96, 0x04, 0x49, 0x92, 0x04, +0x49, 0x92, 0xFC, 0x48, 0x82, 0x24, 0x40, 0x92, 0xA4, 0x4D, 0x92, 0x24, +0x09, 0x24, 0x41, 0x92, 0x20, 0x49, 0x92, 0xA0, 0x69, 0x92, 0x04, 0x49, +0x92, 0x64, 0x49, 0x93, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x64, 0x59, +0x90, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x82, 0xB5, 0xF8, 0xB6, 0x3D, 0x00, 0x00, 0x04, 0xDD, 0xB6, 0x6D, 0x6A, +0x08, 0x40, 0x0C, 0x94, 0x6D, 0xE9, 0x05, 0x20, 0x03, 0x9A, 0x6D, 0xDB, +0x5C, 0x9D, 0xA0, 0x04, 0xE9, 0xBE, 0x69, 0x53, 0x12, 0x10, 0xC1, 0xB5, +0x2F, 0x3F, 0x1A, 0x46, 0x03, 0x8C, 0x65, 0x9B, 0xD2, 0xA4, 0x48, 0x09, +0x6C, 0xF9, 0x12, 0x27, 0x02, 0xB2, 0x68, 0xF6, 0xA5, 0x01, 0x0A, 0x80, +0xCD, 0xD6, 0xEF, 0x25, 0x2E, 0x74, 0x68, 0xDC, 0x2D, 0x3F, 0x01, 0xB0, +0x29, 0x09, 0x35, 0x59, 0x09, 0x19, 0x92, 0x0C, 0xF8, 0xBE, 0x6D, 0x03, +0x52, 0x22, 0xDB, 0x7D, 0x66, 0x5B, 0x0A, 0x42, 0x00, 0x14, 0x61, 0xDB, +0x46, 0x96, 0x02, 0x90, 0xA4, 0xDD, 0x76, 0xB6, 0x2D, 0x4E, 0x48, 0x92, +0x60, 0xBA, 0x2D, 0xC9, 0x4A, 0x90, 0x04, 0x18, 0x65, 0x99, 0x9A, 0xB0, +0xA0, 0x59, 0x68, 0xCB, 0xB0, 0x96, 0x04, 0x61, 0x20, 0x0A, 0x45, 0xCB, +0x58, 0x03, 0x20, 0xC0, 0x64, 0x4B, 0x47, 0x00, 0x60, 0x01, 0x26, 0x09, +0x90, 0xA0, 0x0C, 0x20, 0x20, 0x49, 0xBE, 0x04, 0x25, 0x03, 0x24, 0x90, +0x2C, 0x69, 0x90, 0x11, 0x4A, 0x92, 0x24, 0x5B, 0x4B, 0x20, 0x10, 0x12, +0x02, 0x0B, 0xDE, 0x20, 0x42, 0x80, 0x60, 0x4B, 0x92, 0x44, 0x42, 0x8A, +0x24, 0x8A, 0x2E, 0xD3, 0x00, 0x02, 0x80, 0xB8, 0x36, 0x59, 0x44, 0x00, +0x3D, 0x01, 0x64, 0x09, 0x92, 0x60, 0x0A, 0x48, 0x2A, 0x49, 0x90, 0x94, +0x4B, 0x03, 0x01, 0xD3, 0xD2, 0xA8, 0x07, 0x41, 0x00, 0x50, 0x86, 0x31, +0x31, 0x49, 0x8A, 0x80, 0x3E, 0xAC, 0x03, 0x48, 0x9A, 0x86, 0xB8, 0x45, +0x59, 0x60, 0x52, 0x30, 0x85, 0x40, 0x10, 0x14, 0x01, 0x41, 0x88, 0x00, +0x02, 0x10, 0x80, 0x24, 0x91, 0x00, 0xC8, 0x20, 0x68, 0x00, 0xC2, 0xA2, +0x91, 0x4C, 0x40, 0x02, 0x40, 0x04, 0x08, 0x41, 0x01, 0x06, 0x01, 0x21, +0x13, 0x20, 0x08, 0x84, 0x04, 0x01, 0x58, 0x01, 0x48, 0x20, 0x00, 0x04, +0x0A, 0x00, 0x00, 0xA0, 0x00, 0x40, 0x0A, 0x00, 0x10, 0x40, 0x01, 0x20, +0x03, 0x01, 0x80, 0x00, 0x00, 0x20, 0x30, 0x00, 0x10, 0x80, 0x80, 0x04, +0x09, 0x40, 0xD2, 0x36, 0x59, 0x42, 0x40, 0x40, 0x02, 0xA0, 0x29, 0x00, +0x40, 0x00, 0x07, 0x49, 0xD2, 0x0A, 0x00, 0x12, 0x20, 0x49, 0x93, 0xB4, +0x00, 0x00, 0x00, 0x69, 0x9A, 0xB5, 0x00, 0x10, 0x04, 0x50, 0x92, 0x2C, +0xAD, 0x08, 0x04, 0x00, 0xB5, 0x61, 0xD2, 0x00, 0x40, 0x00, 0x85, 0x6D, +0xD0, 0x06, 0x40, 0x92, 0x00, 0x6C, 0x9B, 0x34, 0x01, 0x80, 0x08, 0x48, +0xDB, 0x26, 0x2D, 0x20, 0x28, 0x21, 0xD5, 0x0D, 0xDB, 0x22, 0x20, 0x80, +0x04, 0x2D, 0x11, 0x36, 0x00, 0x10, 0x00, 0x2C, 0xD3, 0xA2, 0x41, 0x12, +0x20, 0x40, 0xC2, 0xA6, 0x24, 0x00, 0x01, 0x82, 0xB7, 0x49, 0x96, 0x09, +0x42, 0x02, 0x64, 0x6C, 0x99, 0xA4, 0x00, 0x80, 0x00, 0x6D, 0xDA, 0x34, +0x41, 0x80, 0x02, 0x50, 0x5B, 0xB2, 0x2D, 0xFF, 0x3D, 0x8E, 0xB0, 0x24, +0x09, 0x70, 0xEF, 0xA9, 0x9A, 0x24, 0x48, 0x02, 0x7F, 0xDF, 0x7B, 0x06, +0x41, 0x42, 0xF1, 0xCF, 0x70, 0x33, 0x49, 0x92, 0x00, 0xB2, 0x6B, 0xDA, +0x40, 0x0C, 0x09, 0x72, 0x89, 0xCB, 0x0A, 0x00, 0x0B, 0x30, 0xA3, 0x41, +0x26, 0x00, 0x40, 0x82, 0x00, 0x5B, 0x36, 0x04, 0x00, 0x90, 0x00, 0x08, +0x55, 0x02, 0x20, 0x60, 0x00, 0x10, 0xD9, 0x72, 0x89, 0x40, 0xCA, 0x00, +0x7F, 0x82, 0x4D, 0x40, 0x08, 0x14, 0x00, 0xC4, 0x46, 0x02, 0x19, 0x10, +0x09, 0xAE, 0x4A, 0x51, 0x00, 0x24, 0x49, 0x72, 0x9D, 0xD9, 0x90, 0x01, +0x42, 0x12, 0x41, 0x14, 0xB6, 0x02, 0x01, 0x82, 0x20, 0x60, 0xB5, 0x1D, +0x80, 0x04, 0x00, 0x08, 0x00, 0x50, 0x95, 0x6D, 0x8B, 0x00, 0x50, 0x46, +0x84, 0x6D, 0xD3, 0x46, 0x80, 0x02, 0xE4, 0x4C, 0xD3, 0x04, 0x04, 0x30, +0x84, 0x59, 0x9B, 0xA6, 0x81, 0x25, 0x8A, 0x21, 0x84, 0xE5, 0xD3, 0xA2, +0x99, 0xA4, 0x08, 0x48, 0x98, 0x12, 0x15, 0x96, 0x15, 0x44, 0x93, 0x34, +0x61, 0xB2, 0x01, 0xC9, 0x9E, 0x94, 0x0B, 0x2C, 0xD2, 0x90, 0x04, 0x0D, +0x12, 0x40, 0xD3, 0x20, 0x82, 0x1D, 0x11, 0x00, 0x91, 0x94, 0xB1, 0x00, +0x93, 0x12, 0xB0, 0x16, 0xED, 0x4F, 0x83, 0x34, 0x00, 0x25, 0xD0, 0x04, +0x94, 0x65, 0xDB, 0xC3, 0xE9, 0x86, 0x89, 0x24, 0xD4, 0x76, 0x3B, 0xB3, +0x64, 0x4C, 0x93, 0xAC, 0x85, 0xB4, 0x2D, 0x5B, 0x16, 0x78, 0x0D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x20, +0x00, 0x80, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2C, 0x00, 0x00, 0x40, 0x00, +0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x10, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, +0x00, 0x00, 0x00, 0x20, 0x0A, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x40, 0x02, 0x00, +0x00, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x20, +0x08, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x04, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x80, 0x00, 0x41, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x02, 0x01, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x82, 0x00, 0x10, 0x00, 0x00, 0x01, 0x92, 0x00, 0x00, 0x00, 0x00, +0x10, 0x20, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC1, 0x00, +0x41, 0x10, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x22, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x20, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x82, 0x00, 0x10, +0x01, 0x00, 0x01, 0x92, 0x00, 0x00, 0x00, 0x00, 0x11, 0x20, 0x08, 0x04, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x48, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, +0x04, 0x00, 0x20, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x09, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x04, +0x00, 0x82, 0x01, 0x00, 0x01, 0x20, 0x00, 0x04, 0x08, 0x01, 0x00, 0x00, +0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, +0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x40, 0x08, 0x00, 0x02, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, +0x10, 0x00, 0x00, 0x00, 0x04, 0x10, 0x08, 0x00, 0x00, 0x00, 0x08, 0x01, +0x20, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, +0x10, 0x40, 0x00, 0x0A, 0x00, 0x20, 0x80, 0x80, 0x00, 0x01, 0x00, 0x20, +0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA0, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x4C, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x08, 0x02, 0x00, 0x20, 0x00, +0x80, 0x40, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, +0x00, 0x00, 0x00, 0x40, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x12, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +0x04, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, +0x40, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x40, +0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x02, 0x10, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x40, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x41, 0x02, 0x00, 0x00, 0x40, 0x20, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x40, 0x40, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x48, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, +0x00, 0x20, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x02, 0x41, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, +0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x01, 0x08, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x41, 0x18, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x90, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, +0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, +0x09, 0x92, 0x24, 0x49, 0x82, 0x28, 0x49, 0xD2, 0x04, 0x49, 0x82, 0x64, +0x49, 0x12, 0x24, 0x4A, 0x92, 0x24, 0x51, 0x92, 0x24, 0x59, 0x92, 0x24, +0x81, 0x04, 0xC9, 0x92, 0x20, 0x48, 0x92, 0x40, 0x00, 0x82, 0x00, 0x41, +0x9A, 0x24, 0x21, 0xA2, 0x24, 0x48, 0xA2, 0x64, 0x43, 0x90, 0x0C, 0x09, +0x92, 0x24, 0x09, 0x20, 0x08, 0x82, 0x24, 0x43, 0x92, 0x20, 0x49, 0x96, +0x04, 0x01, 0x92, 0x24, 0xC1, 0x10, 0x00, 0x48, 0x92, 0x24, 0x11, 0x12, +0x03, 0x09, 0x9E, 0x24, 0x29, 0x20, 0x41, 0x90, 0x24, 0x49, 0x92, 0x28, +0x49, 0xD2, 0x04, 0x49, 0x92, 0x64, 0x09, 0x82, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x96, 0x20, 0x19, 0x92, 0x20, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, +0x81, 0x28, 0x09, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x12, 0x24, 0x4A, +0x92, 0x24, 0x51, 0x92, 0x24, 0x18, 0x92, 0x24, 0x80, 0x24, 0xC1, 0x92, +0x21, 0x41, 0x90, 0x60, 0x09, 0x92, 0x00, 0x48, 0x82, 0x24, 0x49, 0xB2, +0x24, 0x08, 0x13, 0x06, 0x41, 0x92, 0x2C, 0x49, 0x92, 0x04, 0x01, 0x24, +0x49, 0x82, 0x25, 0x41, 0x90, 0x20, 0x49, 0x96, 0x04, 0x09, 0x82, 0x34, +0xC1, 0x12, 0x04, 0x48, 0x90, 0x24, 0x51, 0x82, 0x21, 0x09, 0x92, 0x20, +0x09, 0x24, 0x41, 0x90, 0x25, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, +0x52, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x90, 0x20, 0x41, 0x96, 0x20, 0x19, +0x82, 0x20, 0x09, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x04, 0x20, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x04, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, +0x01, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, +0x80, 0x00, 0x00, 0x04, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x20, 0x40, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x60, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, +0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, +0x80, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x09, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x0C, 0x80, 0x10, +0x08, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x08, 0x90, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x48, 0x00, 0x20, 0x01, 0x80, 0x00, 0x05, +0x02, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x20, 0x01, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x20, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x48, 0x92, +0x00, 0x4B, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x26, 0x51, 0x8A, 0x24, 0x89, 0x24, 0x09, 0xD2, 0x20, 0x48, 0x92, 0x20, +0x40, 0x02, 0x04, 0x09, 0x92, 0x20, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, +0x01, 0x12, 0x34, 0x49, 0x90, 0x34, 0x01, 0x2C, 0x29, 0x92, 0xA4, 0x49, +0x92, 0x20, 0x59, 0x96, 0x06, 0x49, 0x82, 0x24, 0x49, 0xD2, 0x2C, 0x40, +0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x80, 0x34, 0x08, 0x24, 0x49, 0x92, +0x24, 0x48, 0x92, 0x28, 0x49, 0x90, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, +0x25, 0x4A, 0x92, 0x24, 0x41, 0x12, 0x24, 0x59, 0x82, 0x24, 0x09, 0xA4, +0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x4D, 0x92, 0x04, 0x49, 0x9A, 0x44, +0x49, 0x93, 0xB4, 0x4A, 0x92, 0x26, 0x60, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x24, 0x69, 0x9A, 0x20, 0x49, 0x92, 0x20, 0x4D, 0x93, 0x04, 0x49, +0x92, 0x04, 0x68, 0x9B, 0x24, 0x48, 0x92, 0x24, 0x41, 0x93, 0x26, 0x09, +0x92, 0x22, 0x09, 0xBC, 0x49, 0x93, 0x04, 0x49, 0x92, 0x20, 0x59, 0xD6, +0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x1E, 0x44, 0x12, 0x24, 0x61, 0x82, +0x20, 0x09, 0x82, 0x20, 0x08, 0x24, 0x49, 0x9A, 0x24, 0x49, 0x92, 0x38, +0x49, 0x9A, 0x06, 0x49, 0x90, 0x64, 0x69, 0x92, 0x35, 0x42, 0x92, 0x04, +0x41, 0x92, 0x26, 0x19, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x80, 0x00, 0x34, 0xA0, 0x68, 0x48, 0xB7, 0x6D, 0xC3, 0x0A, 0x10, +0xD9, 0xD6, 0x3D, 0x7F, 0x60, 0x00, 0x48, 0xFC, 0x6C, 0x9B, 0x84, 0x10, +0xD7, 0x9B, 0x3D, 0xEB, 0x52, 0xB3, 0xC0, 0x20, 0x58, 0x77, 0x6C, 0x43, +0x00, 0xAE, 0xC1, 0xFE, 0x67, 0x19, 0xC2, 0x10, 0x08, 0xF4, 0xAC, 0xDB, +0x32, 0xF6, 0x01, 0x84, 0x25, 0xDD, 0x37, 0x0C, 0xB2, 0x00, 0xC8, 0xB6, +0x5D, 0x02, 0x0B, 0x90, 0xC4, 0x92, 0xAD, 0x0D, 0x86, 0x64, 0x04, 0xBC, +0x6D, 0xCB, 0x12, 0x20, 0x60, 0x03, 0x7F, 0x7B, 0x3B, 0x4B, 0xD0, 0x20, +0xDC, 0xA6, 0xCE, 0x03, 0x56, 0xA5, 0x91, 0xFE, 0x4C, 0x55, 0x83, 0x88, +0x68, 0x30, 0xE9, 0x19, 0x8E, 0x3A, 0x58, 0x95, 0xA5, 0xDB, 0x73, 0x82, +0x4C, 0x01, 0xD8, 0x08, 0x20, 0x39, 0x24, 0x4B, 0x4B, 0x30, 0x64, 0x09, +0x05, 0x59, 0x96, 0x90, 0x23, 0x0C, 0x28, 0xC9, 0x20, 0x14, 0x40, 0x11, +0x36, 0x00, 0x2C, 0x49, 0x88, 0x10, 0x05, 0x90, 0x2C, 0x51, 0x46, 0x82, +0x28, 0x0A, 0x2C, 0x4B, 0x92, 0x10, 0x41, 0x4D, 0x00, 0x09, 0x93, 0x88, +0x6A, 0x02, 0x02, 0x92, 0x0D, 0x49, 0x18, 0x10, 0x80, 0x90, 0x24, 0x4B, +0x02, 0x66, 0x56, 0x32, 0x63, 0x8B, 0x92, 0x40, 0x00, 0x34, 0x61, 0x4B, +0xD2, 0x06, 0x00, 0x88, 0x04, 0xB5, 0xA4, 0xEB, 0x40, 0x88, 0x05, 0xB8, +0x32, 0x4A, 0x03, 0x13, 0x01, 0x02, 0x24, 0x51, 0x96, 0x04, 0x10, 0x8A, +0x22, 0xE1, 0xC6, 0x18, 0x7C, 0x00, 0x0E, 0x23, 0x90, 0x26, 0x27, 0x48, +0x50, 0x12, 0xD0, 0x71, 0x30, 0x00, 0x8B, 0x82, 0x42, 0x2C, 0x4B, 0x20, +0x92, 0x86, 0x98, 0x40, 0x40, 0x60, 0x81, 0x00, 0x80, 0x09, 0x82, 0x81, +0x31, 0x0C, 0x10, 0xC0, 0x21, 0x22, 0x80, 0x20, 0x01, 0x20, 0x02, 0x14, +0x05, 0x04, 0x10, 0x94, 0x11, 0x00, 0x08, 0x02, 0x03, 0xB0, 0x0C, 0x45, +0x00, 0x20, 0x05, 0x25, 0x80, 0x00, 0x00, 0x04, 0x80, 0xC1, 0x12, 0x20, +0x80, 0x00, 0x4C, 0x60, 0x0C, 0x26, 0x11, 0x20, 0x00, 0x09, 0x08, 0x04, +0x00, 0x08, 0x22, 0x04, 0x13, 0x0C, 0x10, 0x02, 0x80, 0xA4, 0x38, 0x05, +0x02, 0xA0, 0x92, 0x84, 0xE0, 0x70, 0x50, 0x04, 0x88, 0x05, 0x01, 0x42, +0x10, 0x9C, 0x08, 0x24, 0x60, 0x02, 0xB7, 0x4C, 0xDA, 0x0A, 0x18, 0x02, +0x20, 0x2D, 0xC2, 0xB6, 0x0A, 0x80, 0x00, 0x01, 0x9B, 0xA4, 0x41, 0x10, +0x04, 0x50, 0xCA, 0x14, 0xAD, 0xA0, 0x40, 0x80, 0xB5, 0x0C, 0xDB, 0x00, +0x01, 0x80, 0x80, 0x01, 0x99, 0x26, 0x40, 0x10, 0x20, 0x0C, 0x53, 0x26, +0x01, 0x90, 0x05, 0x4D, 0xDB, 0xA6, 0x08, 0x00, 0x00, 0x00, 0xB5, 0x49, +0xCB, 0x02, 0x09, 0x10, 0x80, 0x6D, 0x53, 0x32, 0x0B, 0x82, 0x00, 0x48, +0xD2, 0xB4, 0x01, 0x48, 0x20, 0x49, 0xC0, 0x86, 0x2D, 0x01, 0xC0, 0x20, +0x27, 0x6D, 0xD3, 0x08, 0x02, 0x01, 0x21, 0x4D, 0xD3, 0xA6, 0x00, 0x40, +0x04, 0x6D, 0x1B, 0xA7, 0x21, 0x00, 0x40, 0x54, 0xFA, 0xA4, 0x1D, 0x53, +0x1D, 0xDC, 0x00, 0x21, 0x21, 0xB1, 0xC1, 0xFD, 0x9F, 0x40, 0x19, 0x00, +0x75, 0x1E, 0x26, 0x6E, 0x40, 0x12, 0x10, 0xC6, 0xAA, 0x34, 0x11, 0xA2, +0x00, 0x4E, 0x1F, 0x53, 0x40, 0x61, 0x00, 0xB2, 0xFA, 0x58, 0x06, 0x6C, +0x42, 0x18, 0x1D, 0xE2, 0x96, 0x60, 0x88, 0x90, 0x60, 0x4A, 0xE8, 0x00, +0x00, 0x10, 0x25, 0x22, 0x6D, 0x96, 0x00, 0x24, 0x10, 0xB0, 0x64, 0x2B, +0x01, 0x00, 0x88, 0x04, 0x64, 0x10, 0x24, 0x24, 0x09, 0x02, 0xC0, 0x96, +0x4E, 0x02, 0x1B, 0x30, 0x00, 0x36, 0x29, 0x93, 0x90, 0x00, 0x08, 0xA2, +0x1D, 0x52, 0x9C, 0x20, 0x08, 0x11, 0x58, 0x3A, 0x82, 0x02, 0xC0, 0x10, +0x40, 0xA9, 0xB5, 0x18, 0x01, 0x12, 0x20, 0x4C, 0x03, 0x90, 0x25, 0x6C, +0x9B, 0x40, 0x0B, 0x84, 0x84, 0x0D, 0x82, 0x50, 0x98, 0x82, 0xB0, 0x04, +0xDA, 0x34, 0x45, 0x36, 0x0D, 0xDB, 0x8A, 0x86, 0x89, 0x64, 0x71, 0x36, +0x25, 0x28, 0xDA, 0x22, 0xD2, 0x84, 0x09, 0x05, 0xD0, 0x34, 0xD1, 0xA0, +0x68, 0x28, 0x1A, 0x26, 0xC1, 0xB6, 0x64, 0x41, 0x92, 0x20, 0x28, 0x28, +0xD2, 0xDE, 0xA5, 0x49, 0xCB, 0x62, 0xDB, 0xB0, 0x0D, 0x4B, 0x1B, 0x28, +0x18, 0x34, 0x21, 0x44, 0xD3, 0xA4, 0xA1, 0x94, 0x2D, 0x40, 0xC1, 0x16, +0x20, 0x40, 0x5D, 0x18, 0xA1, 0x69, 0x78, 0x50, 0x49, 0x18, 0x86, 0x21, +0xDA, 0x70, 0x69, 0x23, 0x19, 0x48, 0x1F, 0x74, 0x55, 0x12, 0x28, 0x51, +0x13, 0x26, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x02, 0x48, +0x00, 0x00, 0x20, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x48, 0x00, 0x00, +0x00, 0x82, 0x00, 0x81, 0x00, 0x00, 0x00, 0x30, 0x00, 0x09, 0x02, 0x00, +0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x04, 0x00, 0x20, 0x24, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x41, 0x86, 0x02, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x00, 0x10, 0x04, +0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, +0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, +0x84, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x04, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x48, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +0x01, 0x90, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, +0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x10, 0x00, 0x82, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x24, 0x00, +0x00, 0x00, 0x04, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x24, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, +0x01, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x80, 0x8C, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, +0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, +0x01, 0x10, 0x00, 0x12, 0x20, 0x04, 0x40, 0x80, 0x00, 0x00, 0x00, 0x09, +0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x04, 0x00, 0x00, +0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x08, 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x24, +0x00, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x01, 0x20, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x12, +0x20, 0x04, 0x40, 0x80, 0x00, 0x00, 0x00, 0x09, 0x00, 0x06, 0x04, 0x00, +0x00, 0x40, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x10, 0x00, 0x00, +0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x04, 0x04, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x08, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x02, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x20, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x40, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x01, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x04, 0x18, 0x00, +0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00, +0x80, 0x08, 0x80, 0x02, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, +0x00, 0x08, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x20, 0x00, +0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x48, 0x00, 0x02, 0x00, +0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, +0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, +0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, +0x20, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x80, 0x00, +0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x02, +0x00, 0x00, 0x20, 0x40, 0x00, 0x04, 0x08, 0x00, 0x20, 0x00, 0x48, 0x00, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, +0x08, 0x40, 0x03, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x40, 0x00, 0x80, 0x04, 0x08, 0x00, 0x40, 0xC0, 0x00, 0x04, 0x21, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, +0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, +0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x08, 0x00, 0x00, 0x40, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x90, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x14, 0x40, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x84, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x28, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x21, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, +0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, +0x02, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x10, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x20, 0x00, +0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, +0x04, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x14, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x20, 0x00, 0x01, 0x00, +0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x01, 0x80, 0x04, 0x15, 0x61, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x04, 0x00, +0x00, 0x00, 0x00, 0x20, 0x09, 0x93, 0x25, 0x4B, 0x92, 0x28, 0x43, 0x92, +0x04, 0x09, 0x92, 0x64, 0x49, 0x82, 0x04, 0x4A, 0x96, 0x64, 0x01, 0x92, +0x24, 0x59, 0x86, 0x24, 0x89, 0x04, 0x08, 0x96, 0x25, 0x49, 0x02, 0x20, +0x09, 0x92, 0x0E, 0x49, 0x90, 0x04, 0xA8, 0x43, 0x04, 0x48, 0x92, 0x24, +0x41, 0x90, 0x74, 0x43, 0x96, 0x24, 0x09, 0x24, 0x40, 0x92, 0x25, 0xC9, +0x92, 0x00, 0x49, 0x96, 0x44, 0x49, 0x92, 0x24, 0xC9, 0x80, 0x24, 0x48, +0x90, 0x64, 0x41, 0x80, 0x0C, 0x49, 0x92, 0x24, 0x00, 0x24, 0x41, 0x92, +0x25, 0x01, 0x12, 0x68, 0x08, 0x12, 0x49, 0x09, 0x92, 0x40, 0x48, 0x82, +0x1C, 0x4A, 0x92, 0x24, 0x01, 0x32, 0x00, 0x5E, 0x10, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0xD2, 0x28, 0x4B, 0x92, 0x04, 0x01, 0x92, 0x64, +0x49, 0x93, 0x24, 0x4A, 0x92, 0xA4, 0x01, 0x90, 0x20, 0x59, 0x92, 0x24, +0x8D, 0x24, 0x49, 0x96, 0x24, 0x49, 0x02, 0x00, 0x49, 0x82, 0x0C, 0x41, +0xD1, 0x04, 0xC9, 0x92, 0x24, 0x48, 0x91, 0x24, 0x41, 0x92, 0x40, 0x0B, +0x92, 0x20, 0x00, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x16, +0x04, 0x49, 0x82, 0x04, 0xC9, 0x90, 0x24, 0x48, 0x90, 0x24, 0x40, 0x92, +0x2E, 0x49, 0x92, 0x04, 0x05, 0x04, 0x49, 0x92, 0x24, 0x49, 0x12, 0x68, +0x49, 0x02, 0x0D, 0x08, 0x92, 0x42, 0x49, 0x92, 0x0C, 0x48, 0x92, 0x04, +0x41, 0xB0, 0x20, 0x53, 0x10, 0x24, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x10, 0x00, 0x01, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0C, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, +0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0C, +0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, +0x00, 0x40, 0x40, 0x00, 0x08, 0x00, 0x00, 0x24, 0x49, 0x92, 0x24, 0x4B, +0x92, 0x28, 0x49, 0x96, 0x04, 0x51, 0x92, 0x64, 0x49, 0x92, 0x24, 0x8A, +0x92, 0x24, 0x41, 0x92, 0x26, 0x55, 0x92, 0x24, 0x88, 0x04, 0x49, 0x92, +0x24, 0x09, 0xB2, 0x00, 0x09, 0xB6, 0x04, 0x59, 0x16, 0x24, 0x49, 0x92, +0x04, 0xC8, 0xB6, 0x24, 0x41, 0x92, 0x2C, 0x41, 0x96, 0x2E, 0x09, 0x24, +0x4B, 0x92, 0x60, 0x0A, 0x96, 0xA0, 0x49, 0x92, 0x04, 0x48, 0x82, 0x25, +0x49, 0x82, 0x24, 0x48, 0x12, 0x6C, 0x41, 0x92, 0x24, 0x49, 0x80, 0x24, +0x09, 0x24, 0x49, 0xE2, 0x22, 0x09, 0x92, 0x20, 0x49, 0x96, 0x04, 0x48, +0x92, 0x64, 0x59, 0x12, 0x24, 0x48, 0x92, 0x24, 0x01, 0x12, 0x24, 0x59, +0x92, 0x2C, 0x09, 0x24, 0x49, 0x92, 0x24, 0x59, 0x92, 0x28, 0x49, 0x96, +0x04, 0x48, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x81, 0x24, 0x49, 0x92, 0x24, 0x49, 0x90, 0x20, +0x49, 0xB6, 0x04, 0x49, 0x12, 0x24, 0x49, 0x12, 0x24, 0x48, 0x92, 0x24, +0x41, 0x92, 0x2C, 0x49, 0x12, 0x34, 0x01, 0x20, 0x4B, 0x92, 0x25, 0x49, +0x92, 0x20, 0x49, 0x92, 0x04, 0x48, 0x82, 0x20, 0x49, 0x92, 0x24, 0x48, +0x92, 0x24, 0x40, 0x92, 0x00, 0x09, 0x12, 0x00, 0x01, 0x24, 0x49, 0xB2, +0x06, 0x49, 0x80, 0x28, 0x49, 0x96, 0x04, 0x48, 0x82, 0x60, 0x59, 0x92, +0x24, 0x4A, 0x92, 0x20, 0x41, 0x92, 0x20, 0x59, 0x90, 0x24, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2C, 0x20, 0x30, 0x49, 0xBF, +0x2D, 0x02, 0x00, 0x2C, 0xDF, 0xBF, 0x6D, 0x6F, 0xC0, 0x22, 0x4A, 0xFC, +0x64, 0xBB, 0xC4, 0x02, 0x03, 0x9B, 0x64, 0xDB, 0x58, 0x8B, 0x93, 0x01, +0xDC, 0x32, 0x7F, 0xC3, 0x40, 0x22, 0x8A, 0xF7, 0x46, 0x1B, 0x23, 0xE0, +0x04, 0xA0, 0x6F, 0xC9, 0xD2, 0x91, 0x53, 0x80, 0xAC, 0xDD, 0x36, 0x4D, +0x80, 0x04, 0xCC, 0xBF, 0x7D, 0x02, 0x13, 0x04, 0x8D, 0xA2, 0x6F, 0x0E, +0x43, 0x26, 0x05, 0xB8, 0x64, 0x8B, 0x02, 0xA4, 0x09, 0x03, 0x6F, 0xD9, +0x3A, 0xE2, 0x50, 0x00, 0x38, 0xAE, 0x4C, 0x13, 0x43, 0xEC, 0xD2, 0xF2, +0x6E, 0x59, 0x2A, 0x22, 0x41, 0xD4, 0xE5, 0xDB, 0x8E, 0xB0, 0x41, 0x96, +0xAF, 0xD1, 0x77, 0x92, 0x4C, 0x4B, 0xD8, 0x12, 0x64, 0xB8, 0x6C, 0xD3, +0x49, 0x02, 0x04, 0x19, 0x25, 0xD9, 0x9C, 0x00, 0x29, 0x09, 0x28, 0xD9, +0x90, 0x16, 0x29, 0x41, 0x34, 0x31, 0xEC, 0xD8, 0x48, 0x04, 0x20, 0x50, +0x2C, 0x59, 0x00, 0x82, 0x0D, 0x00, 0x44, 0x09, 0xB2, 0x04, 0x00, 0x1E, +0x22, 0x4A, 0x81, 0x84, 0x41, 0x02, 0x10, 0xF3, 0x24, 0xDF, 0x10, 0x42, +0x80, 0xB0, 0x64, 0x5B, 0x03, 0x06, 0xA0, 0x10, 0x26, 0x49, 0x92, 0x84, +0x0B, 0x11, 0x62, 0x59, 0x92, 0x06, 0x04, 0x0B, 0x17, 0x10, 0x2C, 0xD9, +0x80, 0x80, 0x05, 0x89, 0x24, 0x11, 0x00, 0x14, 0x01, 0x02, 0x05, 0xF9, +0xB6, 0xB0, 0x0A, 0x09, 0xE2, 0x69, 0xD2, 0xD9, 0x50, 0x43, 0x00, 0x83, +0x16, 0x2D, 0x07, 0x40, 0x13, 0x12, 0x80, 0x61, 0x30, 0x40, 0x0A, 0x80, +0x92, 0x0C, 0x41, 0x20, 0x10, 0x84, 0xD8, 0x6C, 0x58, 0x60, 0x90, 0xA0, +0x81, 0x48, 0x00, 0x02, 0x11, 0x01, 0x81, 0x00, 0x20, 0x07, 0x84, 0x0C, +0x10, 0x15, 0x02, 0xA4, 0x49, 0x60, 0x10, 0x25, 0x91, 0x00, 0x08, 0x05, +0x30, 0xE0, 0x2C, 0x04, 0x80, 0x20, 0x01, 0x40, 0x88, 0x01, 0x02, 0x84, +0x08, 0x21, 0xC9, 0x00, 0x11, 0x24, 0x48, 0x40, 0x02, 0x60, 0x11, 0x01, +0xC0, 0x44, 0x48, 0x40, 0x21, 0x60, 0x41, 0x01, 0x07, 0x00, 0x92, 0x42, +0x08, 0x84, 0x38, 0x01, 0x08, 0xB4, 0x04, 0x04, 0xC0, 0x00, 0x52, 0x20, +0x18, 0x40, 0x08, 0x40, 0x10, 0xB0, 0x00, 0x24, 0x62, 0x00, 0xB7, 0x44, +0xD2, 0x0A, 0x00, 0x02, 0x20, 0x44, 0x92, 0xB4, 0x52, 0x02, 0x00, 0x21, +0x9B, 0xA4, 0x01, 0x02, 0x00, 0x50, 0x9B, 0xB4, 0xAD, 0x20, 0xC1, 0x00, +0x35, 0x4F, 0xAA, 0x00, 0x48, 0x10, 0x80, 0x0D, 0x99, 0x26, 0x40, 0x40, +0x04, 0x6C, 0xD8, 0x76, 0x01, 0x02, 0x23, 0x40, 0x57, 0x26, 0x29, 0x01, +0x04, 0x00, 0x35, 0x65, 0x93, 0x00, 0x09, 0x12, 0x00, 0x4D, 0x90, 0x36, +0x02, 0x03, 0x00, 0x6C, 0xDB, 0xB6, 0x01, 0x80, 0x10, 0x48, 0x98, 0xB6, +0x0D, 0x00, 0x01, 0x10, 0x97, 0x45, 0x9B, 0x00, 0x08, 0x01, 0x20, 0x0D, +0x99, 0x36, 0x09, 0x32, 0x04, 0x29, 0x9B, 0x24, 0x01, 0x90, 0x40, 0x55, +0xDA, 0xB6, 0x09, 0xD3, 0x1D, 0x8F, 0x00, 0x29, 0x09, 0xF0, 0xCB, 0xD9, +0x9B, 0x29, 0x49, 0x02, 0x09, 0xDD, 0x2F, 0x4E, 0x40, 0x1A, 0x50, 0xFC, +0x7E, 0x36, 0x40, 0x02, 0x00, 0x97, 0x08, 0xDF, 0x80, 0x20, 0x51, 0xE2, +0xB5, 0x81, 0x06, 0x60, 0x42, 0x10, 0xA8, 0x12, 0xF2, 0x00, 0x03, 0x80, +0x20, 0xF1, 0x84, 0x0D, 0x88, 0x90, 0x04, 0xE2, 0x6B, 0x97, 0x80, 0x08, +0x48, 0xA2, 0xC0, 0x88, 0x81, 0x20, 0x4B, 0x00, 0x3C, 0xD0, 0xE8, 0x00, +0x04, 0x00, 0xC0, 0x53, 0xA6, 0x06, 0x43, 0x00, 0x20, 0x2C, 0x2A, 0xC3, +0x20, 0x28, 0x40, 0x72, 0x94, 0x5A, 0x9E, 0x70, 0x42, 0x08, 0x74, 0xC4, +0xB2, 0x44, 0x40, 0x92, 0xE0, 0x62, 0xBC, 0x18, 0x01, 0x00, 0x34, 0x6C, +0x81, 0xD0, 0x25, 0x64, 0x9A, 0x40, 0x13, 0x04, 0x84, 0x64, 0xD3, 0x42, +0x48, 0x22, 0xB0, 0x04, 0xD2, 0x16, 0x05, 0x02, 0xA5, 0x59, 0xD2, 0x36, +0x81, 0x04, 0x33, 0x24, 0xA1, 0x69, 0xC8, 0x32, 0xD3, 0xA8, 0x49, 0x28, +0xD0, 0x26, 0x9D, 0x12, 0x04, 0x48, 0xD9, 0xA4, 0x41, 0xB4, 0x64, 0x4A, +0x1A, 0x30, 0x09, 0x08, 0x5B, 0x40, 0xA0, 0x64, 0xC3, 0x52, 0x9D, 0x60, +0x84, 0x49, 0x94, 0x2A, 0xC8, 0x92, 0x35, 0x60, 0xD2, 0xAE, 0xA1, 0xA6, +0x2D, 0x49, 0x91, 0xB4, 0x01, 0x1D, 0x96, 0x2E, 0x14, 0x65, 0xDA, 0x20, +0xD3, 0x22, 0xC5, 0x29, 0xD0, 0x64, 0xDA, 0x02, 0x09, 0x0C, 0x13, 0xB6, +0x05, 0x96, 0x27, 0x52, 0x19, 0x24, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x11, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x00, 0x80, 0x04, 0x08, 0x00, 0x40, 0x01, 0x04, 0x01, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x80, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x80, 0x20, 0x01, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x08, 0x22, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x10, 0x00, 0x08, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x83, 0x00, 0x04, 0x08, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x20, +0x40, 0x20, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, +0x00, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x20, 0x40, 0x40, 0x00, +0x00, 0x00, 0x28, 0x00, 0x00, 0x02, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, +0x04, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x11, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x10, 0x01, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x00, 0x00, +0x00, 0x08, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, +0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, +0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x20, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x02, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x84, +0x01, 0x00, 0x00, 0x04, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x12, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x01, 0x01, +0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x11, 0x00, 0x12, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x20, 0x01, +0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x80, +0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x01, 0x40, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, +0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, +0x04, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x12, 0x00, 0x20, 0x00, 0x0C, 0x10, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, +0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x01, 0x00, +0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, +0x05, 0x40, 0x00, 0x08, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, +0x00, 0x10, 0x24, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x02, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x85, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x09, 0x12, 0x20, 0x49, +0x92, 0x28, 0x49, 0x12, 0x04, 0x49, 0xB2, 0x64, 0x41, 0x82, 0x04, 0x4A, +0x92, 0x04, 0x43, 0x02, 0x24, 0x51, 0x92, 0x24, 0x08, 0x24, 0x5B, 0xD0, +0x24, 0x49, 0xD0, 0x30, 0x41, 0x82, 0x05, 0x49, 0x92, 0x28, 0x1C, 0x92, +0x2C, 0x48, 0x12, 0x34, 0x41, 0x92, 0x20, 0x4B, 0x92, 0xA1, 0x09, 0x44, +0x09, 0x92, 0x24, 0x49, 0xB2, 0x20, 0x09, 0x92, 0x04, 0xC9, 0x92, 0x24, +0x4B, 0x12, 0x04, 0x48, 0x92, 0x24, 0x41, 0x12, 0x00, 0x48, 0x92, 0xA4, +0x09, 0x2C, 0xC8, 0x92, 0x24, 0x49, 0x92, 0xAC, 0x48, 0x10, 0x04, 0x49, +0x92, 0x64, 0x49, 0x8A, 0x44, 0x4E, 0x96, 0x64, 0x51, 0x94, 0x24, 0x59, +0xD2, 0x04, 0x09, 0x64, 0x49, 0x92, 0x25, 0x48, 0x92, 0x28, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x41, 0x92, 0x24, 0x4A, 0x92, 0x04, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x88, 0x24, 0x1B, 0x90, 0x25, 0x01, 0x92, 0x20, +0x49, 0x92, 0x05, 0x49, 0x82, 0x20, 0x59, 0x82, 0x2C, 0x0C, 0x92, 0x04, +0x41, 0x92, 0x24, 0x4B, 0x92, 0x24, 0x01, 0x64, 0x09, 0x92, 0xA5, 0x48, +0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x14, 0x4A, 0x12, 0x04, 0x40, +0x92, 0x24, 0x01, 0x92, 0x20, 0x48, 0x92, 0x34, 0x09, 0x2C, 0xC8, 0x92, +0x01, 0x49, 0x90, 0x28, 0x49, 0x92, 0x04, 0x48, 0x93, 0x64, 0x09, 0x90, +0x64, 0x4A, 0x92, 0x24, 0x50, 0x94, 0x24, 0x19, 0x82, 0x24, 0x09, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x48, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x44, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, +0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, +0x00, 0x40, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x20, 0x00, 0x80, 0x40, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x49, 0x82, 0x24, 0x09, 0x92, 0x28, 0x49, 0x92, 0x00, 0x49, 0x92, 0x64, +0x09, 0x12, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x81, 0x24, 0x59, 0x92, 0x24, +0x89, 0x04, 0x58, 0x92, 0x20, 0x09, 0x92, 0x20, 0x49, 0x98, 0x04, 0x49, +0x92, 0x24, 0x4D, 0xB2, 0x25, 0x40, 0x82, 0x04, 0x41, 0x92, 0x26, 0x09, +0x92, 0x24, 0x08, 0x25, 0xC9, 0x92, 0x20, 0x49, 0x82, 0x20, 0x49, 0x96, +0x05, 0x49, 0x92, 0x24, 0x48, 0xA2, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, +0x24, 0x01, 0xB2, 0x24, 0x09, 0x66, 0x4B, 0x92, 0x20, 0x09, 0x92, 0x01, +0x49, 0x9A, 0x04, 0x09, 0xB2, 0x6C, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x2C, +0x41, 0x12, 0xA4, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0x82, 0x24, 0x49, +0x92, 0x28, 0x49, 0x9A, 0x04, 0x49, 0x92, 0x64, 0x49, 0xD2, 0x24, 0x6A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x20, 0x59, 0x92, +0x24, 0x49, 0x92, 0x20, 0x69, 0x92, 0x04, 0x49, 0x86, 0x24, 0x49, 0x33, +0x25, 0x48, 0x12, 0x20, 0x41, 0x92, 0x20, 0x49, 0x92, 0x04, 0x09, 0x21, +0xC9, 0x92, 0x24, 0x49, 0x92, 0x20, 0x4D, 0x96, 0x05, 0x49, 0x92, 0x24, +0x41, 0xB3, 0x24, 0x08, 0xD2, 0x20, 0x41, 0x92, 0x24, 0x49, 0x90, 0x04, +0x09, 0x64, 0x0B, 0x92, 0x24, 0x41, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, +0x92, 0x64, 0x49, 0x92, 0x24, 0x0A, 0x92, 0x20, 0x41, 0xD2, 0x24, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, +0x01, 0x25, 0xD9, 0xB2, 0x7F, 0xC2, 0x26, 0x00, 0xD6, 0xF6, 0x7D, 0x4A, +0xB0, 0xA0, 0x44, 0xB4, 0x6F, 0xC9, 0x06, 0x30, 0x4C, 0x92, 0x0D, 0xCB, +0x7E, 0x0B, 0x98, 0x2F, 0x9C, 0x9E, 0x65, 0xC3, 0x41, 0x28, 0x81, 0xF2, +0x6C, 0x1B, 0x17, 0x02, 0x01, 0xB0, 0x75, 0xDF, 0xB2, 0x10, 0x00, 0x82, +0xAF, 0x9B, 0x36, 0x4B, 0x90, 0x3C, 0xD8, 0xBF, 0x2D, 0x13, 0x92, 0x62, +0xC4, 0xE6, 0x75, 0x09, 0x42, 0x26, 0x01, 0xB4, 0x60, 0xFB, 0xB2, 0x30, +0x4C, 0x80, 0x2D, 0xCF, 0x3E, 0x05, 0x08, 0x08, 0xCD, 0x97, 0x69, 0x03, +0x52, 0x31, 0x91, 0xB6, 0xAC, 0x5F, 0xE3, 0x45, 0x09, 0xB8, 0x7C, 0x93, +0x16, 0x04, 0x3B, 0x11, 0xED, 0x7A, 0x72, 0x86, 0x6C, 0x5E, 0x00, 0x9E, +0x24, 0x38, 0x08, 0x4B, 0x40, 0x10, 0x04, 0x18, 0x85, 0x59, 0x92, 0x90, +0x20, 0x5A, 0x2A, 0xC9, 0xB2, 0x9F, 0x44, 0x51, 0x12, 0x91, 0x25, 0xC0, +0x08, 0x22, 0x08, 0x11, 0x2C, 0xD3, 0x02, 0x16, 0x05, 0x29, 0x60, 0xC9, +0x93, 0x94, 0x28, 0x60, 0x80, 0xCB, 0xB2, 0x84, 0x64, 0x00, 0x10, 0xF0, +0x6D, 0xC3, 0x48, 0x10, 0x44, 0x80, 0x3C, 0x89, 0x42, 0x02, 0x08, 0x1C, +0x24, 0xD9, 0x92, 0x80, 0x29, 0x00, 0x42, 0x49, 0xB2, 0x8C, 0x40, 0x10, +0x00, 0xB3, 0x24, 0xC3, 0x78, 0xA2, 0x00, 0x99, 0x25, 0x68, 0x07, 0x81, +0x43, 0x00, 0x06, 0x9E, 0xB6, 0x04, 0x85, 0x00, 0x2A, 0x4B, 0x8C, 0x1C, +0x24, 0x80, 0x17, 0x81, 0x31, 0x20, 0x27, 0x48, 0x01, 0x52, 0x92, 0x21, +0x39, 0x04, 0xC2, 0xA6, 0x12, 0xAE, 0xDB, 0x28, 0x11, 0xA4, 0x38, 0x74, +0xDD, 0x60, 0x13, 0x04, 0x80, 0xC0, 0xC8, 0x00, 0x91, 0x01, 0x01, 0x40, +0xC6, 0x04, 0x80, 0x08, 0x12, 0x30, 0xB2, 0x2A, 0x48, 0x20, 0xC2, 0xA2, +0x11, 0x1C, 0x05, 0x04, 0x11, 0xB4, 0x05, 0x08, 0x00, 0x30, 0x01, 0x20, +0x09, 0x40, 0x00, 0x00, 0x0C, 0x05, 0x00, 0x26, 0x90, 0x00, 0x80, 0x60, +0x46, 0x92, 0x81, 0x04, 0x08, 0x01, 0x18, 0x80, 0x00, 0x18, 0x02, 0x40, +0x23, 0x48, 0xDA, 0x00, 0xA0, 0x00, 0xB8, 0x21, 0x1A, 0xA0, 0x11, 0x20, +0xC1, 0x40, 0x80, 0x00, 0xC9, 0x05, 0x20, 0x06, 0x4A, 0x41, 0x09, 0x00, +0x00, 0x00, 0xA7, 0x5D, 0x90, 0x2A, 0x11, 0x00, 0x20, 0x09, 0xC3, 0xB6, +0x08, 0x00, 0x00, 0x49, 0x9B, 0xB6, 0x01, 0x00, 0x00, 0x50, 0xDB, 0x34, +0x89, 0x00, 0x00, 0x00, 0xB5, 0x61, 0xDA, 0x00, 0x00, 0x0A, 0x84, 0x0D, +0x93, 0x24, 0x00, 0x82, 0x21, 0x6C, 0xCA, 0x34, 0x01, 0x10, 0x20, 0x41, +0x53, 0x24, 0x09, 0x20, 0x48, 0x92, 0x35, 0x51, 0xD2, 0x00, 0x00, 0xC3, +0x84, 0x4D, 0xCB, 0x34, 0x00, 0x82, 0x26, 0x6C, 0x9B, 0x0C, 0x01, 0x02, +0x04, 0x41, 0xD2, 0x32, 0x05, 0x01, 0x00, 0x00, 0x37, 0x6C, 0xD2, 0x08, +0x40, 0x20, 0xA1, 0x69, 0xDB, 0xAD, 0x62, 0x80, 0x24, 0x6D, 0x93, 0x24, +0x41, 0x12, 0x1C, 0x50, 0x33, 0xA6, 0x0D, 0xB7, 0xFC, 0x9F, 0x10, 0x20, +0x4B, 0x90, 0xCC, 0xB7, 0x9B, 0x64, 0x18, 0x00, 0xE7, 0x9E, 0xBB, 0x36, +0x40, 0x00, 0x60, 0xD7, 0xB7, 0x3F, 0x00, 0x82, 0x34, 0xE7, 0x6B, 0xD9, +0x00, 0x8C, 0x01, 0xA2, 0xDE, 0xD1, 0x02, 0x60, 0x48, 0x12, 0xEC, 0x5C, +0x56, 0x00, 0x11, 0x82, 0xE0, 0xAF, 0x06, 0x0C, 0x8C, 0x92, 0x24, 0xD6, +0x07, 0x09, 0x88, 0x2C, 0x09, 0xB2, 0x59, 0x1C, 0x4A, 0x20, 0x10, 0x02, +0x2D, 0x18, 0x88, 0x00, 0x40, 0xB2, 0x60, 0xC9, 0x33, 0x8E, 0x2D, 0x84, +0x28, 0xF2, 0x63, 0xD2, 0x80, 0x03, 0x09, 0x22, 0x29, 0xCB, 0x1E, 0x04, +0x00, 0x12, 0x18, 0x57, 0xC0, 0x02, 0x48, 0x92, 0x80, 0xA9, 0x80, 0x1E, +0xC8, 0x10, 0x20, 0x68, 0x82, 0xC0, 0xB5, 0x69, 0xC8, 0x00, 0x41, 0xD4, +0x84, 0x29, 0x8B, 0x65, 0x48, 0x00, 0x24, 0x4C, 0xD8, 0x24, 0xC5, 0x0A, +0x00, 0x50, 0xBA, 0xA6, 0xA5, 0x3C, 0x12, 0x36, 0x21, 0x45, 0xD2, 0x32, +0x11, 0x20, 0x0D, 0x2B, 0xDA, 0x2E, 0x09, 0x14, 0x24, 0x48, 0x83, 0x30, +0x41, 0x20, 0x58, 0x4B, 0x18, 0x66, 0x2B, 0x05, 0x92, 0x04, 0xB4, 0x44, +0x92, 0x22, 0xC7, 0xB6, 0x81, 0x29, 0xC3, 0x24, 0x4B, 0x27, 0x6D, 0x4C, +0xB2, 0x04, 0x11, 0xB2, 0x45, 0x42, 0x93, 0x22, 0x35, 0x44, 0xD9, 0x35, +0xA0, 0x4C, 0x93, 0x72, 0x5A, 0x96, 0x00, 0x4F, 0x16, 0x73, 0xC8, 0x00, +0x1A, 0x60, 0xCA, 0xB6, 0x35, 0xF0, 0x41, 0x51, 0x13, 0x16, 0x29, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x20, 0x02, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x20, +0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x09, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, +0x24, 0x24, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, +0x80, 0x40, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x00, 0x02, 0x09, 0x10, +0x88, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x04, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x40, 0x04, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0B, 0x00, +0x00, 0x00, 0x04, 0x00, 0x40, 0x10, 0x08, 0x40, 0x00, 0x24, 0x00, 0x92, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x40, 0x00, 0x01, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x10, 0x00, 0x02, 0x00, 0x20, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x09, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x24, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, +0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, +0x00, 0x08, 0x45, 0x02, 0x08, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x24, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x08, 0x04, +0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x02, 0x00, 0x00, 0x41, 0x02, +0x08, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x24, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, +0x00, 0x08, 0x01, 0x00, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x90, 0x01, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, +0x00, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x20, 0x00, 0x00, 0x01, 0x02, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x09, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, +0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x28, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x10, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, +0x04, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x40, 0x10, 0x00, +0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x10, 0x40, +0x00, 0x04, 0x10, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x40, 0x95, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x08, 0x10, +0x08, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x24, +0x01, 0x82, 0x24, 0x49, 0x12, 0x29, 0x58, 0x92, 0x04, 0x49, 0x92, 0x60, +0x49, 0x90, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x26, 0x59, 0x92, 0x24, +0x89, 0x20, 0x09, 0xD0, 0x24, 0xC9, 0xB2, 0x20, 0x09, 0x86, 0x00, 0x49, +0x92, 0x24, 0x40, 0x12, 0x10, 0x48, 0x92, 0x24, 0x40, 0x92, 0x06, 0x4A, +0x92, 0x24, 0x09, 0x2C, 0x00, 0x12, 0x24, 0xC9, 0x92, 0x20, 0x09, 0x80, +0x00, 0x49, 0x92, 0x04, 0x03, 0x94, 0x04, 0x48, 0x92, 0x64, 0x40, 0x12, +0x60, 0x49, 0x32, 0x24, 0x01, 0x24, 0x41, 0x80, 0x24, 0x41, 0x96, 0x68, +0xC9, 0x82, 0x04, 0x59, 0x90, 0x65, 0x09, 0x02, 0x04, 0x48, 0x82, 0x24, +0x41, 0x10, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x09, 0x92, 0x25, 0x49, +0x12, 0x28, 0x59, 0x92, 0x04, 0x09, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x09, 0x90, +0x25, 0x49, 0x92, 0x20, 0x49, 0x96, 0x04, 0x49, 0x82, 0x24, 0x49, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x0B, 0x92, 0x04, 0x01, 0x2C, +0x48, 0x92, 0x05, 0x49, 0x92, 0x20, 0x49, 0x92, 0x00, 0x49, 0x13, 0x24, +0x0B, 0x96, 0x24, 0x40, 0x82, 0x20, 0x40, 0x12, 0x60, 0x41, 0x90, 0x24, +0x04, 0x24, 0x41, 0x92, 0x25, 0x49, 0x92, 0x68, 0xC9, 0x92, 0x04, 0x48, +0x90, 0x64, 0x09, 0x92, 0x24, 0x0A, 0x82, 0x24, 0x41, 0x10, 0x24, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x04, 0x24, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x90, 0x00, 0x00, 0x00, 0x20, 0x01, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x81, 0x00, 0x00, 0x10, +0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, +0x00, 0x10, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x01, 0x00, 0x00, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x42, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x20, 0x40, +0x00, 0x08, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x04, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x04, 0x02, 0x01, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x01, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, +0x00, 0x00, 0x20, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x14, +0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x40, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x24, 0x48, 0x92, 0x24, 0x49, 0x92, 0x28, 0x69, 0x92, +0x04, 0x49, 0xB2, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x25, 0x41, 0x92, +0x24, 0x58, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, 0x04, 0x49, 0x93, 0x20, +0x49, 0x90, 0x04, 0x89, 0x92, 0x24, 0x49, 0xB2, 0x24, 0x48, 0x96, 0x26, +0x41, 0x82, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x4D, 0x92, 0x24, 0x49, +0x92, 0x20, 0xC9, 0x86, 0x04, 0x49, 0x92, 0x24, 0xC9, 0x90, 0x24, 0x48, +0x92, 0x20, 0x41, 0x92, 0x26, 0x4B, 0x92, 0x24, 0x09, 0xE0, 0x49, 0x92, +0x24, 0x49, 0x92, 0x28, 0xC3, 0x9A, 0x04, 0x49, 0x92, 0x64, 0x4C, 0x96, +0x24, 0x4A, 0x92, 0x24, 0x61, 0x92, 0x24, 0x58, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x48, 0x92, 0x64, +0x69, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x5D, 0x92, 0x24, +0x88, 0x26, 0x49, 0x9B, 0x24, 0x49, 0x92, 0xA0, 0x49, 0x93, 0x06, 0x49, +0x92, 0x24, 0x45, 0xB2, 0x26, 0x48, 0x92, 0x20, 0x41, 0x93, 0x24, 0x49, +0x92, 0x24, 0x09, 0x34, 0x49, 0x93, 0x24, 0x49, 0x92, 0x20, 0xC9, 0x96, +0x06, 0x49, 0x92, 0x24, 0xC9, 0x92, 0x86, 0x48, 0xD2, 0x20, 0x40, 0x93, +0x24, 0x4B, 0x92, 0x24, 0x09, 0x74, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, +0xCB, 0x93, 0x04, 0x41, 0x92, 0x64, 0x49, 0xD6, 0x24, 0x4A, 0x92, 0x20, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, +0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x30, 0x80, 0xC0, 0x79, 0xB6, 0x6D, 0x11, 0x10, 0x0C, +0xD0, 0xBF, 0x6D, 0x5B, 0x08, 0x61, 0x40, 0xD4, 0x6D, 0xDB, 0xCF, 0x06, +0x0A, 0x92, 0x64, 0xDB, 0x66, 0x38, 0xB2, 0x04, 0x71, 0xF6, 0xC9, 0x63, +0x30, 0xBC, 0x40, 0xB5, 0xA9, 0x19, 0x18, 0x31, 0x29, 0xC4, 0x2D, 0x53, +0xD2, 0x20, 0x68, 0xC0, 0x68, 0x7B, 0x37, 0x60, 0x82, 0x34, 0x19, 0xBF, +0x8D, 0x03, 0x11, 0xD5, 0xC9, 0x22, 0xAD, 0x31, 0x44, 0x2A, 0x29, 0xF4, +0x64, 0x7B, 0x80, 0x00, 0x60, 0x8A, 0x6F, 0x7B, 0x15, 0xCA, 0x00, 0x00, +0xF9, 0xF6, 0x6D, 0x43, 0x97, 0x04, 0xD3, 0xF0, 0x7F, 0x5B, 0xBA, 0x30, +0x0A, 0x94, 0x09, 0xDA, 0x36, 0xB1, 0x0E, 0x90, 0x2F, 0xC9, 0x76, 0x86, +0x2D, 0x1B, 0xCC, 0x90, 0x20, 0xAB, 0x6C, 0xD3, 0x02, 0x00, 0x04, 0x09, +0x64, 0x98, 0xF6, 0x20, 0x24, 0x49, 0x22, 0xC9, 0xB0, 0x9D, 0x09, 0x49, +0x82, 0x8E, 0x1D, 0xD9, 0xC0, 0x12, 0x00, 0xD1, 0x0C, 0x63, 0xC6, 0x90, +0x60, 0x03, 0x75, 0x48, 0x92, 0xA0, 0x64, 0x81, 0x32, 0xCB, 0xDA, 0x8C, +0x21, 0xC9, 0x10, 0xD2, 0x2E, 0x69, 0xA0, 0x02, 0x40, 0x91, 0x2C, 0x08, +0x0A, 0x0C, 0x40, 0x02, 0x21, 0xD1, 0x9A, 0x08, 0x0F, 0x80, 0xE1, 0xC9, +0xD6, 0x45, 0x80, 0xCC, 0x20, 0x18, 0x6C, 0xC9, 0x04, 0x18, 0x04, 0xB9, +0xB0, 0x4D, 0x04, 0x04, 0x80, 0x00, 0x44, 0xC9, 0xB4, 0xB0, 0x40, 0x44, +0x0A, 0x48, 0x90, 0x9C, 0x74, 0x17, 0x13, 0x43, 0x34, 0x2C, 0x07, 0x4B, +0x91, 0x00, 0x90, 0x61, 0x3B, 0x20, 0xC2, 0xB4, 0x82, 0x2C, 0x9B, 0x08, +0x1A, 0x26, 0xB8, 0x66, 0xD9, 0x62, 0xE0, 0x14, 0x81, 0xC1, 0x80, 0x44, +0x05, 0x01, 0x40, 0x10, 0x96, 0x90, 0x08, 0x0C, 0x03, 0x24, 0xA2, 0x3C, +0xC0, 0x08, 0x1A, 0x02, 0xA1, 0x6C, 0x01, 0x07, 0x10, 0x04, 0x0C, 0x80, +0x00, 0x80, 0x25, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, +0x02, 0x04, 0x01, 0x08, 0x12, 0x12, 0x11, 0x04, 0x00, 0x42, 0xD0, 0x14, +0x04, 0x40, 0x02, 0x40, 0x17, 0x0C, 0x93, 0x40, 0x02, 0x20, 0xB9, 0x00, +0x81, 0xA1, 0x10, 0x24, 0xC9, 0x00, 0x11, 0x04, 0x09, 0x60, 0x41, 0x06, +0x19, 0x04, 0x09, 0x80, 0x00, 0x00, 0x87, 0x49, 0x93, 0x03, 0x08, 0x00, +0x20, 0x44, 0x92, 0x34, 0x00, 0x82, 0x00, 0x29, 0x92, 0x25, 0x01, 0x02, +0x00, 0x50, 0xDB, 0x34, 0x89, 0x00, 0x10, 0x00, 0xA5, 0x49, 0x1B, 0x00, +0x00, 0x22, 0x80, 0x4D, 0xD3, 0x26, 0x00, 0x00, 0x20, 0x68, 0xDA, 0xB6, +0x01, 0x00, 0x48, 0x40, 0xD3, 0xB4, 0x09, 0x20, 0x00, 0xA0, 0xA5, 0x4D, +0xDB, 0x22, 0x00, 0x58, 0x08, 0x4F, 0x5B, 0x36, 0x01, 0x40, 0x04, 0x08, +0xBB, 0xA4, 0xC1, 0x10, 0x20, 0xC1, 0x9A, 0xC4, 0x29, 0x02, 0x40, 0x00, +0xB7, 0x0D, 0xD2, 0x08, 0x05, 0x04, 0x20, 0x4D, 0xD3, 0xA4, 0x41, 0x90, +0x00, 0x6D, 0xDA, 0x24, 0x41, 0x00, 0x02, 0x50, 0xD8, 0x3E, 0x0D, 0x3E, +0x7D, 0x7F, 0x30, 0x24, 0x48, 0x60, 0xE7, 0xFB, 0xDF, 0x29, 0x49, 0x02, +0x5B, 0x5D, 0xFF, 0x44, 0x49, 0x92, 0x70, 0xF8, 0xF7, 0x19, 0x20, 0x82, +0x24, 0xDD, 0x6D, 0xF2, 0x10, 0x24, 0xC0, 0x52, 0xEF, 0x48, 0x0C, 0x20, +0x28, 0x10, 0xF3, 0xCF, 0xD4, 0x04, 0x05, 0x00, 0x30, 0xDE, 0x96, 0x0F, +0x08, 0x02, 0x26, 0xC4, 0x4B, 0x42, 0x10, 0x20, 0x00, 0x10, 0x48, 0x23, +0x84, 0x20, 0x80, 0x00, 0x1C, 0x99, 0x18, 0x64, 0x40, 0x12, 0x00, 0xC6, +0x5E, 0x00, 0x41, 0x32, 0x04, 0x2C, 0x1D, 0xD3, 0x00, 0x60, 0x09, 0x22, +0xD8, 0xDA, 0x9E, 0x20, 0x08, 0x12, 0x24, 0x06, 0xF4, 0x02, 0x01, 0x92, +0xA0, 0x4B, 0xA0, 0x1F, 0x23, 0x80, 0x20, 0x28, 0xC2, 0x80, 0x14, 0x6D, +0xDA, 0x40, 0x03, 0x04, 0x84, 0x44, 0x9B, 0x66, 0x19, 0x02, 0x00, 0x0C, +0xD3, 0xB4, 0x44, 0x10, 0x04, 0x54, 0x92, 0xA6, 0xBD, 0x22, 0x42, 0x2B, +0x15, 0x2D, 0x1B, 0xA2, 0x41, 0x05, 0x01, 0x68, 0x1E, 0x34, 0x0C, 0x82, +0x2F, 0x0C, 0x93, 0x34, 0x41, 0x11, 0x24, 0x00, 0xDA, 0x16, 0x28, 0x3D, +0xD1, 0x1E, 0x34, 0x64, 0x1B, 0x42, 0xF7, 0xB6, 0x87, 0x79, 0x1B, 0x14, +0xD8, 0x22, 0xE4, 0x2C, 0xD2, 0x04, 0x01, 0x32, 0xA9, 0x48, 0x99, 0x06, +0x08, 0x25, 0x91, 0x36, 0x85, 0x29, 0xDA, 0x82, 0x49, 0x92, 0x00, 0x29, +0xC8, 0x76, 0x8B, 0x5B, 0x00, 0x4C, 0x9A, 0xB7, 0xD5, 0x96, 0x2C, 0x51, +0x94, 0xA4, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, +0x00, 0x48, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x10, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0C, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x20, 0x00, 0x08, 0x90, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x08, 0x40, 0x00, 0x00, 0x02, 0x00, 0x08, 0x08, 0x90, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x01, 0x00, 0x90, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x80, 0x04, +0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x20, +0x00, 0x00, 0x90, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x12, +0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x10, 0x20, 0x00, 0x00, 0x00, 0x81, 0x04, 0x01, 0x04, 0x00, 0x00, +0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, +0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x20, 0x00, 0x00, 0x91, 0x00, +0x08, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, +0x01, 0x10, 0x00, 0x80, 0x00, 0x00, 0x20, 0x12, 0x20, 0x00, 0x00, 0x00, +0x01, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x20, 0x02, +0x00, 0x00, 0x41, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x41, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x02, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x02, 0x00, 0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, +0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x02, +0x04, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, +0x00, 0x00, 0x01, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, +0x20, 0x00, 0x00, 0x40, 0x00, 0x02, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x12, 0x10, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x23, 0x00, 0x00, 0x00, 0x00, 0x80, 0x46, +0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, +0x04, 0x00, 0x00, 0x00, 0x40, 0x04, 0x22, 0x00, 0x04, 0x80, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x01, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x20, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0x28, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x40, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x4A, 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x11, 0x00, 0x00, 0x00, 0x00, +0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, +0x00, 0x00, 0x40, 0x08, 0x00, 0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, +0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x90, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x08, 0x00, 0x04, 0x0A, 0x92, 0x25, 0x49, 0x92, 0x2C, 0x41, 0x90, +0x04, 0x49, 0x92, 0x64, 0xE9, 0xA0, 0x20, 0x4A, 0x92, 0x24, 0x41, 0x91, +0x24, 0x5C, 0x90, 0x24, 0x99, 0x24, 0x09, 0x1F, 0x25, 0x49, 0x92, 0x20, +0x49, 0x82, 0x04, 0x49, 0x92, 0x24, 0x4D, 0x12, 0x20, 0x48, 0x92, 0x24, +0x41, 0x92, 0x00, 0x41, 0x92, 0x24, 0x01, 0x00, 0x09, 0x10, 0x25, 0x49, +0x96, 0x20, 0x89, 0x92, 0x04, 0x49, 0x90, 0x24, 0x09, 0x86, 0x20, 0x08, +0x92, 0x24, 0x43, 0x10, 0x01, 0x41, 0x92, 0x24, 0x09, 0x24, 0x49, 0x90, +0x25, 0x49, 0xB2, 0x28, 0x49, 0x92, 0x06, 0x49, 0x92, 0x64, 0x49, 0x82, +0x24, 0x4A, 0x92, 0x2C, 0x01, 0x96, 0x20, 0x51, 0x92, 0x24, 0x09, 0x04, +0x03, 0x92, 0x24, 0x41, 0x93, 0x28, 0x41, 0x90, 0x04, 0x49, 0x92, 0x64, +0x89, 0xB0, 0x24, 0x4A, 0x10, 0x24, 0x41, 0x90, 0x24, 0x59, 0x92, 0x24, +0x89, 0x24, 0x09, 0x94, 0x24, 0x49, 0x8A, 0x20, 0x49, 0x92, 0x04, 0x49, +0x82, 0x04, 0x49, 0x02, 0x04, 0x48, 0x12, 0x20, 0x40, 0x92, 0x24, 0x41, +0x92, 0x04, 0x09, 0x04, 0x49, 0x12, 0x24, 0x49, 0x92, 0x20, 0xC9, 0x92, +0x04, 0x4D, 0x90, 0x24, 0x49, 0x96, 0x24, 0x08, 0x83, 0x26, 0x41, 0x82, +0x25, 0x49, 0x90, 0x20, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x24, 0x42, 0x92, 0x24, +0x41, 0x96, 0x20, 0x59, 0x82, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0C, 0x80, 0x19, +0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, +0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, +0x00, 0x08, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x70, 0x20, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x01, 0x00, 0x00, 0x04, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, +0x00, 0x00, 0x80, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x04, +0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x80, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x04, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, +0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x48, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x92, 0x24, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x86, 0x04, 0xC2, +0x12, 0x24, 0x41, 0x92, 0x24, 0x59, 0x12, 0x24, 0x81, 0x04, 0x49, 0xA2, +0x20, 0x01, 0x92, 0x20, 0x09, 0xD2, 0x04, 0x49, 0x92, 0x28, 0x49, 0x22, +0x21, 0x40, 0x12, 0x24, 0x41, 0x92, 0x34, 0x49, 0x92, 0x24, 0x09, 0x20, +0x49, 0xD2, 0x20, 0x48, 0x96, 0x20, 0x49, 0x92, 0x04, 0x49, 0x12, 0x24, +0x49, 0x92, 0x64, 0x00, 0x12, 0x28, 0x41, 0x92, 0x24, 0x41, 0x94, 0x04, +0x09, 0x24, 0x49, 0x82, 0x64, 0x49, 0x92, 0x28, 0x09, 0x92, 0x04, 0x49, +0x96, 0x64, 0x49, 0x92, 0x24, 0x42, 0x12, 0x24, 0x41, 0x92, 0x24, 0x59, +0x90, 0x24, 0x09, 0x64, 0x49, 0x92, 0x25, 0x49, 0x92, 0x20, 0x49, 0x12, +0x04, 0x49, 0x90, 0x44, 0x49, 0x96, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x04, 0x49, 0xB2, 0x24, 0x49, 0x92, 0x20, +0x49, 0x92, 0x04, 0x49, 0x90, 0x04, 0x49, 0xB2, 0x25, 0x48, 0x92, 0x24, +0x41, 0x92, 0x24, 0x41, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, +0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x90, 0x04, 0x49, 0x92, 0x64, 0x48, +0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x90, 0x64, 0x49, 0x92, +0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x02, 0x20, +0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x04, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0xC8, 0x80, 0x00, 0xD1, 0xB7, +0x6D, 0xA3, 0x02, 0x0C, 0x50, 0xA6, 0x6D, 0x5B, 0x40, 0x00, 0x00, 0xB4, +0x6C, 0xDB, 0x1E, 0x08, 0x00, 0xD0, 0x6D, 0xDB, 0x76, 0x09, 0x20, 0x24, +0xF1, 0xB6, 0x6D, 0x63, 0x50, 0x08, 0x44, 0xF4, 0x6C, 0x0B, 0x08, 0x20, +0x00, 0x94, 0x69, 0xDB, 0x92, 0x10, 0x4B, 0xC0, 0xAD, 0xDB, 0x3E, 0x19, +0xB3, 0x24, 0xD0, 0xBA, 0xCD, 0x73, 0x00, 0xA0, 0x48, 0x36, 0x6D, 0x31, +0x02, 0x26, 0x71, 0xB4, 0x67, 0x5B, 0x90, 0x00, 0x49, 0xCA, 0x6D, 0xDB, +0x17, 0x88, 0x80, 0x02, 0xF9, 0xB6, 0x65, 0x43, 0x12, 0x00, 0xD1, 0xD5, +0x6D, 0x5B, 0x8A, 0x00, 0x10, 0x84, 0x69, 0xDF, 0xCE, 0x1C, 0x00, 0x90, +0x2C, 0xDB, 0x76, 0x76, 0x6D, 0xDB, 0x40, 0x90, 0x24, 0x11, 0x6D, 0xD3, +0xC6, 0x02, 0x24, 0x89, 0x25, 0x5B, 0xB6, 0x90, 0x25, 0x48, 0x72, 0xD1, +0xB6, 0x9D, 0x04, 0x49, 0x12, 0xBE, 0x0D, 0xD9, 0x40, 0x82, 0x20, 0x90, +0x3C, 0x51, 0xC2, 0x90, 0x85, 0x19, 0x64, 0xDB, 0x92, 0xB0, 0x20, 0x45, +0x32, 0xCB, 0x94, 0x8D, 0x64, 0x09, 0x12, 0xA6, 0x46, 0x6B, 0x40, 0x06, +0x00, 0x81, 0x2C, 0x5B, 0x8A, 0x12, 0x24, 0x06, 0x65, 0x49, 0x86, 0x90, +0x0C, 0xA8, 0x30, 0xDB, 0xD6, 0x04, 0x84, 0x01, 0x30, 0x1A, 0x6C, 0xD9, +0x4C, 0x91, 0x28, 0xF1, 0x7C, 0xDB, 0x06, 0x80, 0x24, 0x09, 0x24, 0x5B, +0xA6, 0xE0, 0x20, 0x48, 0x22, 0xC1, 0xB6, 0x9C, 0x61, 0x01, 0x12, 0x19, +0x36, 0x6D, 0x07, 0x48, 0x90, 0x58, 0x92, 0x61, 0x3B, 0x41, 0x82, 0x24, +0xF6, 0x2D, 0xDB, 0x48, 0x92, 0x26, 0xA1, 0x65, 0xDB, 0x26, 0x92, 0x34, +0x89, 0xC1, 0x12, 0x04, 0x01, 0x49, 0x03, 0x40, 0xA6, 0x25, 0x09, 0x0C, +0xD2, 0x24, 0xB2, 0x4C, 0xD9, 0x4C, 0x12, 0xB4, 0xA1, 0x5D, 0xA0, 0x04, +0x11, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x11, 0x01, 0x09, 0x62, 0x96, 0x04, +0x00, 0x48, 0x5A, 0x05, 0x30, 0x01, 0x48, 0x64, 0x00, 0x30, 0x00, 0x25, +0x00, 0x03, 0x91, 0x00, 0x00, 0x23, 0x36, 0x6C, 0x07, 0x4D, 0x90, 0x08, +0xA8, 0x61, 0x3A, 0x24, 0x92, 0xA0, 0xC2, 0x0C, 0xCA, 0x40, 0x94, 0x20, +0x99, 0x60, 0xC9, 0x46, 0x80, 0x24, 0x09, 0x00, 0x01, 0x00, 0x27, 0x49, +0x92, 0x08, 0x08, 0x00, 0xA0, 0x49, 0x92, 0x24, 0x00, 0x42, 0x00, 0x69, +0x93, 0x26, 0x09, 0x00, 0x00, 0x50, 0x9A, 0x24, 0x89, 0x00, 0x00, 0x00, +0x25, 0x49, 0x9F, 0x00, 0x50, 0x10, 0x84, 0x4D, 0x9B, 0x36, 0x00, 0x00, +0x24, 0x6C, 0x92, 0x24, 0x01, 0x00, 0x00, 0x40, 0x53, 0xA4, 0x01, 0x04, +0x01, 0xA1, 0x25, 0x6D, 0xD2, 0x10, 0x00, 0x02, 0x80, 0x4D, 0x93, 0x36, +0x01, 0x00, 0x00, 0x68, 0xD8, 0xAE, 0x31, 0x00, 0x02, 0x41, 0x93, 0xA4, +0x2D, 0x20, 0x00, 0x02, 0x77, 0x4D, 0x9A, 0x00, 0x00, 0x00, 0x20, 0x4D, +0x92, 0x24, 0x00, 0x00, 0x00, 0x6F, 0x93, 0x22, 0x01, 0x00, 0x04, 0x50, +0xDB, 0x24, 0x0D, 0xF5, 0x7C, 0xFF, 0x90, 0x24, 0x49, 0xD2, 0xF1, 0xFB, +0x1F, 0x24, 0x49, 0x12, 0x3F, 0xBD, 0xFF, 0x06, 0x48, 0x90, 0xF0, 0xFB, +0xFF, 0x3F, 0x41, 0x92, 0x24, 0xFC, 0x7B, 0x9B, 0x90, 0xA4, 0x40, 0x12, +0xAF, 0xCF, 0x0B, 0x20, 0x40, 0x00, 0xF7, 0xDE, 0xD8, 0x00, 0x49, 0x92, +0x70, 0xEF, 0xA6, 0x0F, 0x88, 0x1A, 0x2C, 0xF0, 0x6A, 0x52, 0x90, 0x80, +0x09, 0x82, 0x5F, 0x59, 0x0C, 0x20, 0x4C, 0x00, 0xFC, 0xD9, 0x06, 0x04, +0x03, 0x10, 0x40, 0xD7, 0x74, 0x04, 0x48, 0x12, 0x00, 0x9E, 0x7F, 0xFD, +0x80, 0x20, 0x41, 0x62, 0xF9, 0xFB, 0x9E, 0x20, 0x49, 0x12, 0x61, 0xDE, +0xFF, 0x00, 0x48, 0x94, 0x30, 0xEA, 0xE3, 0x1F, 0x00, 0x92, 0x20, 0x02, +0x80, 0x00, 0xB4, 0x6C, 0xDB, 0x22, 0x04, 0x04, 0x00, 0x6D, 0xDB, 0x76, +0x08, 0x80, 0x00, 0x6C, 0xDA, 0xB4, 0x05, 0x02, 0x00, 0x10, 0xDB, 0xA6, +0xAD, 0x02, 0xC0, 0x22, 0x9D, 0x6D, 0xFA, 0xA2, 0x41, 0x82, 0x04, 0x2B, +0x9A, 0x26, 0x09, 0x21, 0x24, 0x48, 0xDB, 0x26, 0x41, 0x20, 0x49, 0x02, +0x1A, 0xB6, 0x25, 0x03, 0x99, 0x9C, 0xA5, 0x61, 0x52, 0x00, 0x61, 0xA0, +0x07, 0xED, 0x93, 0x14, 0x8A, 0xB6, 0xA1, 0x58, 0xD1, 0x26, 0xC1, 0x00, +0x29, 0x08, 0xDA, 0xB6, 0x0E, 0x44, 0x81, 0x02, 0x95, 0x69, 0xD3, 0x82, +0x03, 0x04, 0xC1, 0x08, 0xDB, 0x76, 0x1D, 0xA1, 0x01, 0x4C, 0xDB, 0xF2, +0x45, 0x16, 0x00, 0x51, 0x9A, 0xB6, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x50, 0x80, 0x00, 0x20, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x01, 0x80, 0x08, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, +0x04, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x08, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x04, 0x09, 0x00, 0x40, 0x00, +0x00, 0x00, 0x42, 0x02, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, +0x00, 0x00, 0x00, 0x92, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x01, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x11, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, +0x01, 0x80, 0x01, 0x04, 0x09, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x02, +0x00, 0x82, 0x00, 0x08, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, +0x00, 0x20, 0x00, 0x10, 0x01, 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0x05, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x41, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, +0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, +0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, +0x00, 0x40, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x82, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x82, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x20, 0x00, +0x81, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x20, 0x00, 0x22, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x02, 0x40, +0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, +0x48, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, +0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x05, 0x00, 0x80, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x24, 0x49, +0x92, 0x2C, 0x41, 0x92, 0x04, 0x59, 0x92, 0x64, 0x49, 0x82, 0x24, 0x4A, +0x92, 0x24, 0xD1, 0x82, 0x24, 0x59, 0x92, 0x24, 0x89, 0x20, 0x49, 0x82, +0x2C, 0x49, 0x92, 0x20, 0x48, 0x12, 0x04, 0x4B, 0x92, 0x24, 0x49, 0x12, +0x24, 0x48, 0x92, 0x24, 0x01, 0x90, 0x0C, 0x49, 0x92, 0x24, 0x09, 0x34, +0x08, 0x10, 0x24, 0x41, 0x90, 0x20, 0x49, 0x02, 0x00, 0x49, 0x92, 0x2C, +0x49, 0x02, 0x00, 0x48, 0x90, 0x24, 0x40, 0x30, 0x00, 0x49, 0x12, 0x24, +0x09, 0x24, 0x01, 0x82, 0x24, 0x49, 0x92, 0x2C, 0x48, 0x92, 0x44, 0x6D, +0x92, 0x64, 0x49, 0x92, 0x24, 0x08, 0x92, 0x04, 0x81, 0x82, 0x34, 0x58, +0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x28, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x90, 0x24, 0x4A, 0x92, 0x24, 0xD1, 0x92, +0x24, 0x19, 0x80, 0x24, 0x89, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x20, +0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x12, 0x24, 0x48, 0x12, 0x24, +0x41, 0x92, 0x2C, 0x49, 0x92, 0x04, 0x09, 0x24, 0x49, 0x82, 0x25, 0x49, +0x10, 0x20, 0x49, 0x92, 0x00, 0x49, 0x92, 0x24, 0x41, 0x12, 0x24, 0x08, +0x92, 0x04, 0x41, 0xB2, 0x20, 0x49, 0x12, 0x24, 0x01, 0x04, 0x49, 0x92, +0x25, 0x49, 0x92, 0x28, 0x48, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, +0x24, 0x4A, 0x92, 0x04, 0xC1, 0x92, 0x24, 0x59, 0x90, 0x24, 0x09, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x84, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x84, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0xC0, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x04, 0x00, 0x00, 0x82, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x80, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x4B, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x82, 0x24, +0x89, 0x24, 0xC9, 0x82, 0x20, 0x09, 0x92, 0x00, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0x41, 0x92, 0x24, 0x48, 0x92, 0x04, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x2C, 0xC9, 0x82, 0x20, 0x09, 0x92, 0x00, 0x49, 0x96, +0x00, 0x49, 0x92, 0x24, 0x49, 0x92, 0x2C, 0x48, 0x10, 0x64, 0x41, 0x12, +0x20, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x00, 0x09, 0x92, 0x20, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x59, 0x92, 0x04, 0x4A, 0x92, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x2C, 0x09, 0x24, 0x4B, 0x92, 0x24, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x41, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0xC9, 0x92, +0x24, 0x49, 0x90, 0x00, 0x49, 0x82, 0x04, 0x49, 0x92, 0x24, 0x41, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x0C, +0xC9, 0x92, 0x04, 0x49, 0x90, 0x00, 0x09, 0x86, 0x04, 0x49, 0x92, 0x24, +0x41, 0x12, 0x0C, 0x4C, 0x90, 0x04, 0x41, 0x92, 0x20, 0x49, 0x90, 0x04, +0x09, 0x24, 0x48, 0x92, 0x04, 0x41, 0x90, 0x38, 0x49, 0x92, 0x04, 0x49, +0x92, 0x64, 0x58, 0x92, 0x24, 0x4A, 0x92, 0x20, 0x41, 0x92, 0x24, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x02, 0x00, 0xD9, 0xBE, 0x6D, 0x03, 0x00, 0x00, 0xD0, 0x36, 0x6D, 0x5B, +0x00, 0x03, 0x00, 0xB4, 0x65, 0xDB, 0x0E, 0x04, 0x00, 0x90, 0x6D, 0xDB, +0x76, 0x20, 0x00, 0x00, 0x59, 0xB6, 0x6D, 0x03, 0x00, 0x00, 0xC0, 0xB6, +0x6D, 0x1B, 0x10, 0x00, 0x00, 0xF4, 0x6D, 0xDB, 0x02, 0x00, 0x00, 0x80, +0x69, 0xDB, 0x36, 0x00, 0xD8, 0x10, 0xD8, 0x96, 0x2C, 0x03, 0x00, 0x10, +0xC0, 0xB6, 0xAD, 0x1B, 0x00, 0x40, 0x00, 0xB4, 0xFD, 0xFB, 0x02, 0x00, +0x20, 0x80, 0x6D, 0x7B, 0x36, 0x25, 0x00, 0x00, 0x4D, 0xB7, 0x6D, 0x03, +0x02, 0x00, 0x90, 0xB6, 0x6D, 0x5B, 0x41, 0x40, 0x00, 0xF8, 0x6C, 0xDB, +0x16, 0x00, 0x00, 0x90, 0x6D, 0xDB, 0x76, 0x36, 0x6F, 0xDB, 0x48, 0x92, +0x24, 0xB1, 0x65, 0xDB, 0x46, 0x52, 0x24, 0x09, 0x6D, 0xD8, 0xB6, 0x90, +0x28, 0x49, 0x62, 0xCB, 0xB6, 0x9D, 0x24, 0x49, 0x12, 0x96, 0x6D, 0xDB, +0xC8, 0x92, 0x24, 0xB1, 0x6D, 0xDB, 0x46, 0x92, 0x24, 0x09, 0x7D, 0xDB, +0xB6, 0x90, 0x24, 0x49, 0x62, 0xDB, 0xB6, 0x8D, 0x20, 0x49, 0x12, 0xB6, +0x25, 0xC9, 0x48, 0x32, 0x61, 0xB1, 0x6D, 0xC9, 0x46, 0x92, 0x64, 0x09, +0x6D, 0x0B, 0xB6, 0x90, 0x04, 0x44, 0x62, 0xDB, 0x96, 0x8D, 0x24, 0x84, +0x10, 0x93, 0x6D, 0xDB, 0xD8, 0x92, 0x24, 0x99, 0x6D, 0xDB, 0x06, 0x83, +0x24, 0x09, 0x2C, 0x9B, 0xB6, 0x84, 0x25, 0x48, 0x2A, 0xD9, 0xB6, 0x1D, +0x20, 0x49, 0x12, 0x5B, 0xB4, 0x6D, 0x27, 0x41, 0x92, 0xD8, 0x96, 0x6D, +0x3B, 0x69, 0x92, 0xA4, 0xB6, 0x6C, 0xDB, 0x48, 0x92, 0x24, 0xB9, 0x6D, +0xDB, 0x66, 0x82, 0x24, 0x89, 0xDB, 0xB6, 0x6D, 0x25, 0x49, 0x92, 0xD0, +0xB6, 0x6D, 0x0B, 0x49, 0x92, 0x24, 0xA6, 0x6D, 0xDB, 0x08, 0x92, 0x24, +0xB1, 0x6C, 0xDB, 0x46, 0x92, 0x24, 0x09, 0xDB, 0x06, 0x7C, 0x25, 0x09, +0x90, 0xD0, 0x36, 0x40, 0x0B, 0x49, 0x12, 0x24, 0xB6, 0x01, 0xD0, 0x48, +0x22, 0x04, 0xB1, 0x2D, 0x40, 0x46, 0x92, 0x04, 0x09, 0xB8, 0xB6, 0x6D, +0x23, 0x48, 0x92, 0xC0, 0xB2, 0x69, 0xBB, 0x41, 0x92, 0xA4, 0x80, 0x2D, +0xDB, 0x00, 0x92, 0x24, 0x99, 0x6C, 0xDB, 0x06, 0x9A, 0x24, 0x09, 0x00, +0x00, 0x00, 0x27, 0x49, 0x92, 0x00, 0x00, 0x00, 0x20, 0x69, 0x92, 0x24, +0x00, 0x00, 0x00, 0x4B, 0x9A, 0x24, 0x01, 0x00, 0x00, 0x50, 0x92, 0x24, +0x89, 0x00, 0x00, 0x00, 0xA5, 0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x49, +0x92, 0x24, 0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x01, 0x00, 0x00, 0x40, +0x92, 0x24, 0x09, 0x00, 0x48, 0x10, 0x25, 0x69, 0xDB, 0x00, 0x00, 0x10, +0x00, 0x49, 0x5A, 0x24, 0x00, 0x00, 0x00, 0x48, 0x42, 0x06, 0x01, 0x00, +0x20, 0x40, 0x92, 0x84, 0x09, 0x04, 0x00, 0x00, 0xB7, 0x48, 0x92, 0x08, +0x00, 0x00, 0xA0, 0x49, 0x92, 0xA4, 0x40, 0x00, 0x00, 0x05, 0x93, 0x24, +0x01, 0x00, 0x04, 0x50, 0x9B, 0x24, 0x09, 0xFF, 0xFF, 0xFF, 0x90, 0x26, +0x49, 0xF2, 0xCF, 0xFF, 0x9F, 0x04, 0x49, 0x12, 0xFF, 0xFC, 0xFF, 0x24, +0x41, 0x92, 0xF0, 0xFB, 0xFF, 0x3F, 0x49, 0x92, 0x24, 0xDF, 0xFF, 0xFF, +0x10, 0x24, 0x49, 0xF2, 0xFF, 0xFF, 0x8F, 0x24, 0x49, 0x12, 0xFF, 0xFF, +0xFF, 0x24, 0x49, 0x92, 0xF0, 0xFE, 0xFF, 0x0F, 0x49, 0x92, 0x24, 0xFF, +0x07, 0xEE, 0x90, 0x04, 0x00, 0xF2, 0x7F, 0xEB, 0x8F, 0x24, 0xA5, 0x12, +0xFF, 0xFF, 0xFC, 0x24, 0x99, 0xB0, 0xF0, 0xBF, 0x4C, 0x0F, 0x49, 0x32, +0x24, 0xFB, 0xFF, 0xFF, 0x00, 0x25, 0x49, 0xA2, 0xF9, 0xFB, 0x1F, 0x24, +0x49, 0x12, 0xBA, 0xFF, 0xFF, 0xEA, 0x48, 0x92, 0xC0, 0xFE, 0xFB, 0x1F, +0x40, 0x92, 0x24, 0x00, 0x00, 0x00, 0xB5, 0x65, 0xDB, 0x02, 0x28, 0x00, +0x80, 0x4D, 0xDB, 0x76, 0x00, 0x02, 0x00, 0x6C, 0xD3, 0xB6, 0x05, 0x10, +0x00, 0x50, 0xDB, 0xB6, 0xAD, 0x20, 0x00, 0x00, 0x35, 0x6D, 0xDB, 0x02, +0x00, 0x00, 0x80, 0x6D, 0xDB, 0x36, 0x00, 0x00, 0x00, 0x2C, 0xDB, 0xB6, +0x01, 0x01, 0x00, 0x40, 0xDB, 0xB6, 0x2D, 0x00, 0xD8, 0x02, 0xB5, 0xCD, +0x9A, 0x02, 0x80, 0x36, 0x80, 0x6D, 0x1B, 0x36, 0x00, 0xB4, 0x09, 0x6C, +0x4B, 0x96, 0x01, 0x00, 0x29, 0x40, 0xDB, 0x16, 0x2D, 0x44, 0x00, 0x00, +0x21, 0x6C, 0xDB, 0x32, 0x00, 0x04, 0x00, 0x6D, 0xDB, 0x76, 0x53, 0x00, +0x00, 0x20, 0xDA, 0xB6, 0x45, 0x02, 0x00, 0x50, 0xD3, 0xB6, 0x2D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x20, 0x40, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, +0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x00, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, +0x49, 0x92, 0x24, 0x49, 0x92, 0x2C, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x20, 0x49, 0x90, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0x48, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x20, 0x49, +0x92, 0x24, 0x09, 0x20, 0x69, 0x92, 0x24, 0x49, 0x92, 0x20, 0x09, 0x92, +0x04, 0x49, 0x92, 0x24, 0x41, 0x82, 0x24, 0x48, 0x92, 0x24, 0x41, 0x02, +0x30, 0x49, 0x12, 0x24, 0x09, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x90, 0x24, 0x4A, 0x82, 0x24, +0x41, 0x82, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x25, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, +0x82, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x12, +0x25, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x25, 0x49, 0x92, 0x20, 0x09, 0x92, 0x04, 0x49, 0x92, 0x24, +0x49, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, +0x09, 0x24, 0x49, 0x92, 0x25, 0x49, 0x92, 0x28, 0x49, 0x90, 0x04, 0x41, +0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, +0x92, 0x24, 0x09, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x40, 0x01, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, +0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x04, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, +0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x09, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, +0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, +0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x09, 0x12, 0x24, 0x49, +0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x41, 0x92, 0x24, 0x48, +0x82, 0x24, 0x41, 0x32, 0x24, 0x49, 0x92, 0x04, 0x09, 0x24, 0x41, 0x92, +0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x09, 0x92, +0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x20, 0x09, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, +0x09, 0x04, 0x49, 0x92, 0x20, 0x09, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x24, 0x40, 0x92, 0x20, 0x09, 0x92, 0x20, 0x49, 0x92, +0x04, 0x49, 0x92, 0x24, 0x09, 0x92, 0x24, 0x48, 0x82, 0x24, 0x40, 0xB2, +0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x41, 0x92, 0x20, 0x01, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x09, 0x92, 0x04, 0x48, 0x92, 0x24, +0x41, 0x92, 0x24, 0x19, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00, 0x40, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xDA, 0xB6, 0x06, 0x00, 0x00, 0xCC, 0xFF, 0xFF, +0x9F, 0x24, 0x49, 0x52, 0xDB, 0xA6, 0x6D, 0x06, 0x00, 0x00, 0xF8, 0xFF, +0xFF, 0x7F, 0x49, 0x92, 0xE4, 0x6D, 0xDA, 0xB6, 0x00, 0x00, 0x00, 0xF0, +0xFF, 0xFF, 0x8F, 0x24, 0x49, 0x12, 0xDB, 0xB6, 0x6D, 0x00, 0x00, 0x00, +0xF0, 0xFF, 0xFF, 0x0F, 0x49, 0x92, 0x24, 0x6D, 0xDB, 0xB6, 0x00, 0x00, +0x00, 0xF0, 0xFF, 0xFF, 0x8F, 0x24, 0x49, 0x12, 0xDB, 0xB6, 0x6D, 0x00, +0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0x49, 0x92, 0x24, 0x0D, 0x00, 0x00, +0x02, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x98, 0x04, 0x00, 0x60, 0x0B, 0x00, +0x40, 0x02, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x18, 0x01, 0x00, 0x60, 0x00, +0x00, 0x00, 0x91, 0x24, 0x49, 0x62, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x49, 0x92, 0x80, 0x24, 0x49, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x42, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x90, 0x24, 0x49, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0x49, 0x42, 0x92, 0x24, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x90, 0x24, +0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x40, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, 0x01, 0x00, +0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x92, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, +0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x49, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xDA, 0xB6, 0x96, 0x24, 0xDB, 0x0E, 0x49, 0x92, +0x94, 0x00, 0x00, 0x40, 0x93, 0xA4, 0x6D, 0x2E, 0xD9, 0xB6, 0x59, 0x92, +0x24, 0x79, 0x00, 0x00, 0xC0, 0x6D, 0xDB, 0xB6, 0xB4, 0x6D, 0xDB, 0x22, +0x49, 0x92, 0x04, 0x00, 0x00, 0x00, 0xDB, 0xB6, 0x6D, 0x6C, 0xD9, 0xB6, +0x41, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x6D, 0xDB, 0xB6, 0xB4, 0x6D, +0xDB, 0x22, 0x49, 0x92, 0x04, 0x00, 0x00, 0x00, 0xDB, 0xB6, 0x6D, 0x6C, +0xDB, 0xB6, 0x41, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, +0x36, 0x00, 0x00, 0x2E, 0x01, 0x00, 0x18, 0x00, 0x00, 0x60, 0x0B, 0x00, +0x40, 0x2E, 0x00, 0x00, 0x49, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x69, +0x93, 0x24, 0xB7, 0x6D, 0x49, 0x4E, 0xDB, 0xB6, 0x9D, 0x6D, 0xDB, 0x76, +0xDB, 0x36, 0x49, 0x66, 0x4B, 0x92, 0xD8, 0xB6, 0x6D, 0x7B, 0xDB, 0xB6, +0xED, 0x49, 0x92, 0x24, 0x91, 0x24, 0x49, 0x62, 0xDB, 0xB6, 0x8D, 0x6D, +0xDB, 0x36, 0x92, 0x24, 0x49, 0x24, 0x4B, 0x92, 0xD0, 0xB6, 0x6D, 0x4B, +0xDB, 0xB6, 0x2D, 0x49, 0x92, 0x24, 0x91, 0x24, 0x49, 0x62, 0xDB, 0xB6, +0x8D, 0x6D, 0xDB, 0x36, 0x92, 0x24, 0x49, 0x24, 0x49, 0x92, 0xD0, 0xB6, +0x6D, 0x4B, 0xDB, 0xB6, 0x2D, 0x09, 0x00, 0x00, 0x13, 0x00, 0x00, 0x6E, +0x01, 0x00, 0x98, 0x05, 0x00, 0x60, 0x02, 0x00, 0x40, 0x26, 0x00, 0x00, +0xD9, 0x00, 0x00, 0x58, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x49, +0x92, 0x20, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, +0x92, 0x24, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x24, 0x49, 0x92, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x48, 0x92, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x24, 0x49, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, +0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x24, 0x49, 0x00, 0x08, 0x00, +0x00, 0x00, 0x49, 0x92, 0x64, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x92, 0x24, 0x00, 0x00, 0x00, +0x80, 0x24, 0x49, 0x02, 0x00, 0x00, 0x80, 0x24, 0x49, 0x12, 0x00, 0x00, +0x00, 0x00, 0x49, 0x92, 0x08, 0x00, 0x00, 0x00, 0x49, 0x92, 0x64, 0x00, +0x00, 0x00, 0x15, 0x20, 0xDB, 0x4E, 0x92, 0x24, 0x09, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x92, 0xB6, 0x81, 0x24, 0x49, 0x42, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0xB5, 0x69, 0xDB, 0x42, 0x92, 0x24, 0x09, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xDB, 0xB6, 0x91, 0x24, 0x49, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x6D, 0xDB, 0x42, 0x92, 0x24, +0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xDB, 0xB6, 0x91, 0x24, +0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x49, 0x92, 0x4C, +0x00, 0x00, 0x00, 0x48, 0x92, 0x24, 0x00, 0x00, 0x00, 0x6C, 0x92, 0x24, +0x91, 0x00, 0x00, 0x00, 0x90, 0x24, 0x09, 0xDA, 0xB6, 0x6D, 0xF8, 0xFF, +0x6D, 0x97, 0x24, 0x49, 0x62, 0x7F, 0xFF, 0xFF, 0xB6, 0x6D, 0xDB, 0xD1, +0x64, 0xDB, 0x26, 0x49, 0x92, 0x84, 0xFF, 0xFF, 0x3F, 0xDB, 0xB6, 0x6D, +0xD8, 0xB6, 0x6D, 0x93, 0x24, 0x49, 0xC2, 0xFF, 0xFF, 0x3F, 0xB6, 0x6D, +0xDB, 0xB4, 0x6D, 0xDB, 0x22, 0x49, 0x92, 0xC4, 0xFF, 0xFF, 0x3F, 0xDB, +0xB6, 0x6D, 0xD9, 0xB6, 0x6D, 0x93, 0x24, 0x49, 0xC2, 0xFF, 0xFF, 0x3F, +0xB6, 0x6D, 0xDB, 0xB4, 0x6D, 0xDB, 0x22, 0x49, 0x92, 0xC4, 0xFF, 0xFF, +0x3F, 0x9B, 0x24, 0x49, 0x58, 0x92, 0x24, 0x95, 0x24, 0x49, 0xE2, 0x97, +0x24, 0xC9, 0x26, 0x49, 0x92, 0xB5, 0x24, 0x49, 0x26, 0x49, 0x92, 0xC4, +0x27, 0x49, 0x12, 0xDA, 0xB6, 0x6D, 0x6D, 0x9B, 0xB6, 0xD9, 0xB6, 0x6D, +0xFB, 0x49, 0xB2, 0xED, 0xB6, 0x7D, 0xDB, 0xBD, 0xBD, 0x6D, 0xAF, 0x6D, +0xDB, 0xC6, 0x92, 0x6D, 0xDB, 0xDB, 0xB6, 0x6D, 0x6D, 0xDB, 0xB6, 0xD1, +0xB6, 0x6D, 0x4B, 0xDB, 0xB6, 0x2D, 0xB6, 0x6D, 0xDB, 0xD8, 0xB6, 0x6D, +0xB3, 0x6D, 0xDB, 0xC6, 0xB6, 0x6D, 0x1B, 0xDB, 0xB6, 0x6D, 0x6C, 0xDB, +0xB6, 0xD1, 0xB6, 0x6D, 0x4B, 0xDB, 0xB6, 0x2D, 0xB6, 0x6D, 0xDB, 0xD8, +0xB6, 0x6D, 0xB3, 0x6D, 0xDB, 0xC6, 0xB6, 0x6D, 0x1B, 0x9B, 0x24, 0x49, +0x6D, 0xDB, 0xB6, 0xDB, 0x24, 0x49, 0x72, 0xDB, 0xB6, 0xED, 0x26, 0x49, +0x92, 0xD9, 0xB6, 0x6D, 0xBF, 0x49, 0x92, 0xC4, 0xB6, 0x6D, 0x7B, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, +0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x04, +0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x41, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x82, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x82, 0x24, +0x89, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x12, 0x24, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, +0x00, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, 0x41, 0xB2, +0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x24, 0x0A, 0x92, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, +0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, +0x92, 0x24, 0x41, 0x82, 0x24, 0x59, 0x82, 0x24, 0x89, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, +0x24, 0x48, 0x92, 0x24, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, +0x49, 0x92, 0x24, 0x48, 0x82, 0x24, 0x41, 0xB2, 0x24, 0x49, 0x12, 0x24, +0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x90, 0x28, 0x49, 0x92, 0x04, 0x49, +0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, +0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x48, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, +0x04, 0x49, 0x92, 0x64, 0x49, 0x82, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, +0x24, 0x59, 0x92, 0x24, 0x89, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, +0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x92, 0x24, +0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x82, 0x24, 0x49, +0x92, 0x20, 0x49, 0x92, 0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, +0x92, 0x20, 0x41, 0x92, 0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, +0x04, 0x4A, 0x92, 0x24, 0x01, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x24, +0x49, 0x92, 0x24, 0x49, 0x92, 0x28, 0x49, 0x92, 0x04, 0x49, 0x92, 0x64, +0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, 0x41, 0x92, 0x24, 0x59, 0x92, 0x24, +0x89, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x49, 0x92, 0x04, 0x49, +0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x90, 0x04, 0x41, 0x92, 0x24, 0x49, +0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x20, 0x09, 0x92, +0x04, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x48, 0x90, 0x24, 0x41, 0x92, +0x24, 0x49, 0x92, 0x24, 0x09, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x28, +0x49, 0x92, 0x04, 0x49, 0x92, 0x64, 0x49, 0x92, 0x24, 0x4A, 0x92, 0x24, +0x41, 0x92, 0x24, 0x59, 0x92, 0x24, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x04, +0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, 0x00, +0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x01, 0x40, +0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x40, 0x00, 0x40, 0x00, +0x10, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, +0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x40, 0x00, +0x40, 0x00, 0x10, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, +0x00, 0x00, 0x01, 0x40, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, +0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, 0xFF, +0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, +0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, +0xCF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, +0xFF, 0xCF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, +0xFB, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x7F, 0x0C, 0xD6, +}; + +const unsigned long top_address[] = +{ +0x00000000, +}; +const unsigned long top_length_of_sections[] = +{ +0x0001FA9D, +}; +const unsigned long top_sections = 0x00000001; +const unsigned long top_termination = 0x00000000; +const unsigned long top_start = 0x00000000; +const unsigned long top_finish = 0x0001FA9D; +const unsigned long top_length = 0x0001FA9D; + +#define TOP_TERMINATION 0x00000000 +#define TOP_START 0x00000000 +#define TOP_FINISH 0x0001FA9D +#define TOP_LENGTH 0x0001FA9D +#define TOP_SECTIONS 0x00000001 diff --git a/Bios/src/funclets/DcoFllCal/DcoCal.s43 b/Bios/src/funclets/DcoFllCal/DcoCal.s43 index 51d4618..270e663 100644 --- a/Bios/src/funclets/DcoFllCal/DcoCal.s43 +++ b/Bios/src/funclets/DcoFllCal/DcoCal.s43 @@ -52,7 +52,8 @@ dint ;Disable interrupts. - mov.b #XT2OFF+RSEL2+RSEL1+RSEL0,&BCSCTL1 ;BCL12 Workaround + bic.b #0x3F,&BCSCTL1 ;BCL12 Workaround + bis.b #0x07,&BCSCTL1 ;BCL12 Workaround mov.b valDCO,&DCOCTL ;Load DCO value. mov.b valBCS1,&BCSCTL1 ;Load BCS1 value. diff --git a/Bios/src/funclets/DcoFllCal/FllCal.s43 b/Bios/src/funclets/DcoFllCal/FllCal.s43 index c892a54..c632b28 100644 --- a/Bios/src/funclets/DcoFllCal/FllCal.s43 +++ b/Bios/src/funclets/DcoFllCal/FllCal.s43 @@ -56,8 +56,8 @@ mov.b #80h ,&SCFQCTL ;D/FN_x. mov.b #0 ,&SCFI0 ;N(dco). mov.b valSCFI1,&SCFI1 ;N(dco). - mov.b #80h ,&FLL_CTL0 - mov.b #0 ,&FLL_CTL1 + bis.b #80h,&FLL_CTL0 + bic.b #5fh,&FLL_CTL1 xor R10,R10 ;Clear R10. xor R9,R9 ;Clear R9. diff --git a/Bios/src/funclets/FlashXv2/Flash.eww b/Bios/src/funclets/FlashXv2/Flash.eww index 36b8a63..b191b96 100644 --- a/Bios/src/funclets/FlashXv2/Flash.eww +++ b/Bios/src/funclets/FlashXv2/Flash.eww @@ -13,7 +13,8 @@ $WS_DIR$\FramErase.ewp + + $WS_DIR$\FramEraseFR41xx.ewp + - - diff --git a/Bios/src/funclets/FlashXv2/FramEraseFR41xx.ewp b/Bios/src/funclets/FlashXv2/FramEraseFR41xx.ewp new file mode 100644 index 0000000..8770b17 --- /dev/null +++ b/Bios/src/funclets/FlashXv2/FramEraseFR41xx.ewp @@ -0,0 +1,1770 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 7 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 4 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + MSP430 + + 0 + + General + 7 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 4 + + 13 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\msp430FR41xx_FramErase.s43 + + diff --git a/Bios/src/funclets/FlashXv2/config/lnk430FR41xx_obj.xcl b/Bios/src/funclets/FlashXv2/config/lnk430FR41xx_obj.xcl new file mode 100644 index 0000000..8dfa341 --- /dev/null +++ b/Bios/src/funclets/FlashXv2/config/lnk430FR41xx_obj.xcl @@ -0,0 +1,167 @@ +// ************************************************ +// +// XLINK configuration file for MSP430G6001 +// +// Copyright 1996-2010 IAR Systems AB +// +// $Revision: 5971 $ +// +// ************************************************ + +// --------------------------------------------------------- +// Description +// + +// +// Usage: +// +// xlink [file file ...] -f lnk430g6001.xcl +// +// ----------------------------------------------- +// Device summary +// + +// +// Core: MSP430 +// +// Peripheral units: 0-0FFF +// +// Information memory (FRAM) : 1800 - 19FF +// +// Read/write memory (RAM): 2000 - 21FF +// +// Read-only memory (FRAM) : F000 - FF7F +// + + +// ----------------------------------------------- +// Segments +// + +// ------------------------------------- +// Data read/write segments (RAM) +// + +// +// segment Usage +// ------- -------------------------- +// DATA16_Z Data initialized to zero +// DATA16_I Data initialized by copying from DATA16_ID +// DATA16_N Data defined using __no_init +// DATA16_HEAP The heap used by 'malloc' and 'free' +// CSTACK Runtime stack +// + + +// ------------------------------------- +// Program and data read-only segments (FRAM) +// + +// +// segment Usage +// ------- -------------------------- +// DATA16_C Constant data, including string literals +// DATA16_ID initializers for DATA_I +// INFO Information memory +// INFOx Information memory, bank x +// CSTART Program startup code +// CODE Program code +// ISR_CODE Program code for interrupt service routines +// DIFUNCT Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// SIGNATURE Signature memory +// INTVEC Interrupt vectors +// RESET The reset vector +// +// Notes: +// +// * The INFOx and INFO segments overlap, this allows data either to be +// placed in a specific bank or anywhere in the info memory. +// +// * The INTVEC and RESET segments overlap. This allows an application to +// either use the reset vector provided by the runtime library, or +// provide a reset function by defining an interrupt function associated +// with the reset vector. +// + + +// --------------------------------------------------------- +// Configuation +// + +// ----------------------------------------------- +// Stack and heap sizes +// + +// Uncomment for command line use +//-D_STACK_SIZE=160 +//-D_DATA16_HEAP_SIZE=160 + + +// ----------------------------------------------- +// Define cpu +// + +-cmsp430 + + +// ----------------------------------------------- +// Support for placing functions in read/write memory +// + +-QCODE_I=CODE_ID + + +// --------------------------------------------------------- +// Placement directives +// + +// ----------------------------------------------- +// Read/write memory +// + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2000-21FF +-Z(DATA)CODE_I +-Z(DATA)CSTACK+_STACK_SIZE# + + +// ----------------------------------------------- +// Read-only memory +// + +// ------------------------------------- +// Information memory +// + +-Z(CONST)INFO=1800-19FF +-Z(CONST)INFOA=1800-19FF + + + +// ------------------------------------- +// Constant data +// + +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=F000-FF7F + + +// ------------------------------------- +// Code +// + +-Z(CODE)CSTART,ISR_CODE,CODE_ID=F000-FF7F +-P(CODE)CODE=F000-FF7F + + +// ------------------------------------- +// Signatures +// + +-Z(CODE)SIGNATURE=FF80-FF87 + +// ------------------------------------- +// Interrupt vectors +// + +-Z(CODE)INTVEC=FF88-FFFF +-Z(CODE)RESET=FFFE-FFFF diff --git a/Bios/src/funclets/FlashXv2/msp430FR41xx_FramErase.s43 b/Bios/src/funclets/FlashXv2/msp430FR41xx_FramErase.s43 new file mode 100644 index 0000000..e7aef3b --- /dev/null +++ b/Bios/src/funclets/FlashXv2/msp430FR41xx_FramErase.s43 @@ -0,0 +1,97 @@ +/** +* \ingroup +* +* \file msp430FR41xx_FramErase.s43 +* +* \brief FRAM erase funclet +* +*/ +/* + * Copyright (C) 2012 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. + */ + +#include "config\msp430fr4133.h" +;------------------------------------------------------------------------------- + NAME FlashErase +;------------------------------------------------------------------------------- + +; must be set from calling marco +#define MyEraseAddr R5 +; must be set from calling marco +#define MyEraseLen R6 + +;------------------------------------------------------------------------------- + RSEG CODE +;------------------------------------------------------------------------------- +;--- [1] Erase Routine Start --------------------------------------------------- +PageErase +StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Make sure watchdog timer is stopped + +;--- [3] Wait for Erase comand in ------------------------------------------------- + +confMail MOV #JMBCLR0OFF+JMBCLR1OFF+JMBMODE,&SYSJMBC ; disable auto-clear feature, 16bit mode + +NotifyDriverStart + MOV #0xABAD,&SYSJMBO1 + MOV #0xBABE,&SYSJMBO0 + +Wcmd BIT #JMBIN1FG,&SYSJMBC ; Data available in mailbox? + + JZ Wcmd ; No, wait for data + CMP.W #0xBEEF ,&SYSJMBI0 ; Is first word ofcomand correct? + JNE Wcmd ; if incorrect jmp to wait for comand + CMP.W #0xDEAD, &SYSJMBI1 ; Is second word if comand correct? + JNE Wcmd ; if incorrect jmp to wait for comand + ; else erase flash 0xDEAD +;--- [4] Actual Erase Sequence ------------------------------------------------- +PreapareErase + MOVX.A MyEraseAddr,R10 ; The Address for the dummy write + MOVX.A MyEraseLen ,R11 ; The Address for the dummy write +DoErase + MOV.W #0xFFFF,0(R10) ; Dummy erase Adress + INCDX.A R10 ; count up adress + DECDX.A R11 ; decrement length + + CMP.W #0x0,R11 ; Is lengh equals zero + JNE DoErase ; No, continue + +;--- [6] Erase Routine End ----------------------------------------------------- +NotifyDriverStop + MOV #0xCAFE,&SYSJMBO1 + MOV #0xBABE,&SYSJMBO0 +TheEnd +#ifdef SUBROUTINE + RETA +#else + JMP TheEnd +#endif + END diff --git a/Bios/src/funclets/FlashXv2/msp430x5xx_FlashWrite.s43 b/Bios/src/funclets/FlashXv2/msp430x5xx_FlashWrite.s43 index 01b671f..7581144 100644 --- a/Bios/src/funclets/FlashXv2/msp430x5xx_FlashWrite.s43 +++ b/Bios/src/funclets/FlashXv2/msp430x5xx_FlashWrite.s43 @@ -104,39 +104,39 @@ DoTask MOVX.A MyWriteAddr,R10 ; The start address to write to MOVX.A MyWriteSize,R11 ; the number of words to be written -; MOV #FWKEY+WRT,&FCTL1 ; configure word-write access -#ifdef SUBROUTINE -W1 ; CMP.W @R12,0(R10) ; check if content is already there... - ; JEQ Next ; ...next word if already there - MOV #FWKEY+WRT,&FCTL1 ; configure word-write access - MOVX.W @R12+,0(R10) -Next -#else - MOV #JMBCLR0OFF+JMBCLR1OFF+JMBMODE,&SYSJMBC ; disable auto-clear feature, 16bit mode + MOV #JMBMODE,&SYSJMBC ; disable auto-clear feature, 16bit mode -W1 BIT #JMBIN1FG,&SYSJMBC ; Data available in mailbox? +W1 BIT #JMBIN0FG,&SYSJMBC ; Data available in mailbox? JZ W1 ; No, wait for data - ;----------Write two Words----------------------------------------; -MOV #FWKEY+BLKWRT,&FCTL1 ; configure Long-Word Write access + ;----------Write two Words----------------------------------------; - MOV.W &SYSJMBI0,0(R10) ; WRITE, move data into Flash +L2 BIT #BUSY,&FCTL3 + JNZ L2 + MOV #FWKEY,&FCTL1 ; disable word-write access + +MOV #FWKEY+BLKWRT,&FCTL1 ; configure Long-Word Write access + + MOV.W &SYSJMBI0,0(R10) ; WRITE, move data into Fl INCDX.A R10 ; count up adress - DECX.A R11 ; decrement length + DECX.A R11 ; decrement lengthash + +W2 BIT #JMBIN1FG,&SYSJMBC ; Data available in mailbox? + JZ W2 MOV.W &SYSJMBI1,0(R10) ; WRITE, move data into Flash -Next BIC #JMBIN1FG,&SYSJMBC ; clear the mailbox input flag - BIC #JMBIN0FG,&SYSJMBC ; clear the mailbox input flag -#endif -L2 BIT #BUSY,&FCTL3 - JNZ L2 - MOV #FWKEY,&FCTL1 ; disable word-write access - +;Next BIC #JMBIN1FG,&SYSJMBC ; clear the mailbox input flag +; BIC #JMBIN0FG,&SYSJMBC ; clear the mailbox input flag + INCDX.A R10 ; count up adress - DECX.A R11 ; decrement length + DECX.A R11 ; decrement length - JNZ W1 + JNZ W1 + +L3 BIT #BUSY,&FCTL3 + JNZ L3 + MOV #FWKEY,&FCTL1 ; disable word-write access ;--- [4] Restore Context Section ----------------------------------------------- RestoreR10 MOVX.A MyR10,R10 diff --git a/Bios/src/funclets/FlashXv2/path.txt b/Bios/src/funclets/FlashXv2/path.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Bios/src/funclets/eraseDco.s43 b/Bios/src/funclets/eraseDco.s43 index db8c71e..851c5e3 100644 --- a/Bios/src/funclets/eraseDco.s43 +++ b/Bios/src/funclets/eraseDco.s43 @@ -128,8 +128,6 @@ Loop dec R11 ; Loop on erase cycles. jnz Again - mov.b #XT2OFF+RSEL2+RSEL1+RSEL0,&BCSCTL1 ;BCL12 Workaround - jmp Stop ;------------------------------------------------------------------------------- ; Program End diff --git a/Bios/src/funclets/eraseDcoX.s43 b/Bios/src/funclets/eraseDcoX.s43 index 41828ca..d9d06f9 100644 --- a/Bios/src/funclets/eraseDcoX.s43 +++ b/Bios/src/funclets/eraseDcoX.s43 @@ -3,6 +3,7 @@ * * Funclet which gets uploaded onto the target and erases the * specified FLASH area + * * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * @@ -15,8 +16,7 @@ * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materiFunclet which gets uploaded onto the target and erases the -; specified FLASH areaals provided with the + * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of @@ -128,8 +128,6 @@ Loop decd R11 ; Loop on erase cycles. jnz Again - mov.b #XT2OFF+RSEL2+RSEL1+RSEL0,&BCSCTL1 ;BCL12 Workaround - jmp Stop ;------------------------------------------------------------------------------- diff --git a/Bios/src/funclets/writeDco.s43 b/Bios/src/funclets/writeDco.s43 index f825710..8d448fc 100644 --- a/Bios/src/funclets/writeDco.s43 +++ b/Bios/src/funclets/writeDco.s43 @@ -131,8 +131,6 @@ Next dec R6 ;Decrement word counter. jnz Prog ;Program Length words. - mov.b #XT2OFF+RSEL2+RSEL1+RSEL0,&BCSCTL1 ;BCL12 Workaround - jmp Stop ; Jump to the end of the program (must be located at offset EEh) ;------------------------------------------------------------------------------- ; End diff --git a/Bios/src/funclets/writeDcoX.s43 b/Bios/src/funclets/writeDcoX.s43 index 8ce7f9e..75d5b94 100644 --- a/Bios/src/funclets/writeDcoX.s43 +++ b/Bios/src/funclets/writeDcoX.s43 @@ -131,8 +131,6 @@ Next dec R6 ;Decrement word counter. jnz Prog ;Program Length words. - mov.b #XT2OFF+RSEL2+RSEL1+RSEL0,&BCSCTL1 ;BCL12 Workaround - jmp Stop ; Jump to the end of the program (must be located at offset EEh) ;------------------------------------------------------------------------------- diff --git a/Bios/src/fw/fet/EnergyTrace_TSPA/VCC_Current.c b/Bios/src/fw/fet/EnergyTrace_TSPA/VCC_Current.c new file mode 100644 index 0000000..b048044 --- /dev/null +++ b/Bios/src/fw/fet/EnergyTrace_TSPA/VCC_Current.c @@ -0,0 +1,766 @@ +/* + * VCC_Current.c + * + * Copyright (c) 2007 - 2013 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/*----------------------------------------------------------------------------+ +| | +| Texas Instruments +| | +| MSP430G2452 software controlled DCDC converter +| | ++-----------------------------------------------------------------------------+ +| Source: VCC_Current.h, File Version 1.0 2012/07/12 | +| Author: ANBR | +| | +| WHO WHEN WHAT | +| --- ---------- ------------------------------------------------ | +| ANBR 2012/07/12 born | ++-----------------------------------------------------------------------------+ +| Pin out table ++-----------------------------------------------------------------------------+ + MSP-FET 0.9 & eZ-FET 0.92 hardware + + Pin MSP430G2xxx Signal Note + 1 DVCC + 2 P1.0/CA0 A_VCC_OUT Target voltage feedback (divided by 2) + 3 P1.1 DCDC_CAL1 Calibration resistor 1 + 4 P1.2/TA0.1 DCDC_PULSE FET driver output + 5 P1.3 DCDC_IO0 Status bit0 (output, 1=overcurrent detected) + 6 P1.4 DCDC_IO1 Status bit1 (input, 1=overcurrent shutdown enable) + 7 P1.5/CA5 A_VCC_REF Reference voltage (divided by 2) + 8 P1.6/SCL HOST_SCL I2C clock + 9 P1.7/SDA HOST_SDA I2C data + 10 RST DCDC_RST SBWTDIO i/o (external pull-up resistor) + 11 TEST DCDC_TEST SBWTCK in (pull-down in host MCU) + 12 P2.7 DCDC_CAL2 Calibration resistor 2 + 13 P2.6 DCDC_CAL0 Calibration resistor 0 + 14 DVSS ++-----------------------------------------------------------------------------+ +Version history + +Version 1: Initial release +Version 2: Changed DCDC_CAL2 signal to output "1" on eZ-FET when inactive + (bug fix for P2.6 being 2.83V when it should be pulled to VCCOUT) +Version 3: Added pwm on duty and overcurrent table + Removed SDIO interface, timer-based PWM, eZ-FET ALPHA2 initialisation + Changed variable names and function headers to meet coding guidelines +Version 4: Modified drive strength and overcurrent table +Version 5: Added overcurrent calibration when configuring output voltage + Balanced DCDC regulation loop paths +Version 8: Reduced drive strength at 3600mV and increased regulation frequency + Overcurrent detection VCC=3.6V: VBUS=5V ~90mA, VBUS=4.5V ~60mA +Version 9: Added highres PWM mode. Commented LOW_USB_FIX lines. + Moved command handler to main loop. Added overcurrent shutdown after 15msec. + Every ca. 300msec s/w tries to restart voltage regulation. +Version 10: Changed overcurrent shutdown pin function to enable function. + Removed calibration for overcurrent detection. It will now trigger + at ca. 70mA (VUSB=4.5V) - 100mA (VUSB=5V) and will turn off voltage + regulation only if DCDC_IO1 input is high. ++----------------------------------------------------------------------------*/ + +#include "msp430.h" + +// Software configuration +#define USE_OVERCURRENT_PROTECTION +#define OVERCURRENT_SHUTDOWN + +// Sanity checks +#ifdef MSP_FET + #ifdef EZ_FET + #error "Wrong number of #defines" + #endif +#endif + +#ifndef MSP_FET + #ifndef EZ_FET + #error "Wrong number of #defines" + #endif +#endif + +// Software version (each version increments by 1) +#if defined(EZ_FET_V14) || defined(MSP_FET_V12) + #define VERSION 17 +#endif + +#ifdef EZ_FET_V2X + #define VERSION 80 +#endif + + +#ifdef MSP_FET_V2X + #define VERSION 52 +#endif + + +// Host commands +#define CMD_CONFIGURE 0x01 +#define CMD_SETPWM 0x02 +#define CMD_CALLOAD 0x03 +#define CMD_POWERDOWN 0x04 + +// I2C communication +#define I2C_SLAVE_ADDRESS 0x90 +#define I2C_PACKET_BYTES 3 +#define I2C_CMD_BYTE 0 +#define I2C_DATA_HI_BYTE 1 +#define I2C_DATA_LO_BYTE 2 + +// Status output to Host MCU +#define STATUS_OC_OFF { P1OUT &= ~BIT3; } +#define STATUS_OC_ON { P1OUT |= BIT3; } +#define OC_SHUTDOWN_ENABLE ((P1IN & BIT4)==0) + +// pwmPowerdown key +#define POWERDOWN_KEY 0x5a5a + +// Constants +const int fwVersion @0x1000 = VERSION; +const char i2cSlaveAddress = 0x90; // Address is 0x90<<1 for R/W + +// Global variables +__no_init unsigned int __regvar pwmTimerReg @ 4; +#ifdef USE_OVERCURRENT_PROTECTION +__no_init unsigned int __regvar pwmOffCount @ 5; +//__no_init unsigned int pwmTimeOut; +__no_init unsigned char pwmOcEvents; +#define OVERCURRENT_TIMEOUT 1 +#define OVERCURRENT_EVENT_LIMIT 3 +#endif +__no_init unsigned char i2cReceived[I2C_PACKET_BYTES]; +__no_init unsigned int i2cState; // State variable +__no_init unsigned i2cRxIndex; // Pointer to i2cReceived[] while receiving +__no_init int i2cCmd; // Received 8-bit command +__no_init unsigned int i2cData; // Received 16-bit data + +// Startup voltages +#define EZ_FET_VOLTAGE 3600 +#define MSP_FET_VOLTAGE 3000 + +// Configuration settings, in 100mV steps +// Format: pwm on duty, overcurrent limit +#define PWM_ARRAY_VCC_MIN 1200 +#define PWM_ARRAY_VCC_MAX 3600 + +#if defined(EZ_FET_V14) || defined(MSP_FET_V12) +const unsigned char pwmConfigTable[] = { 3, 2, // 1200mV + 3, 2, // 1300mV + 3, 2, // 1400mV + 3, 2, // 1500mV + 4, 2, // 1600mV + 4, 2, // 1700mV + 5, 2, // 1800mV + 5, 2, // 1900mV + 5, 2, // 2000mV + 5, 2, // 2100mV + 5, 2, // 2200mV + 5, 2, // 2300mV + 6, 2, // 2400mV + 6, 3, // 2500mV + 6, 3, // 2600mV + 6, 3, // 2700mV + 7, 3, // 2800mV + 7, 3, // 2900mV + 7, 3, // 3000mV + 8, 3, // 3100mV + 8, 3, // 3200mV + 8, 3, // 3300mV + 8, 3, // 3400mV + 9, 3, // 3500mV + 9, 3 }; // 3600mV +#endif + + +#ifdef EZ_FET_V2X +const unsigned char pwmConfigTable[] = { 3, 2, // 1200mV + 3, 2, // 1300mV + 3, 2, // 1400mV + 3, 2, // 1500mV + 4, 2, // 1600mV + 4, 2, // 1700mV + 5, 2, // 1800mV + 5, 2, // 1900mV + 5, 2, // 2000mV + 5, 2, // 2100mV + 5, 2, // 2200mV + 5, 2, // 2300mV + 6, 2, // 2400mV + 6, 3, // 2500mV + 6, 3, // 2600mV + 6, 3, // 2700mV + 7, 3, // 2800mV + 7, 3, // 2900mV + 7, 3, // 3000mV + 8, 3, // 3100mV + 9, 3, // 3200mV + 10, 3, // 3300mV + 11, 3, // 3400mV + 11, 3, // 3500mV + 11, 3 }; // 3600mV +#endif + +#ifdef MSP_FET_V2X +const unsigned char pwmConfigTable[] = { 3, 2, // 1200mV + 3, 2, // 1300mV + 3, 2, // 1400mV + 3, 2, // 1500mV + 4, 2, // 1600mV + 4, 2, // 1700mV + 6, 3, // 1800mV + 6, 3, // 1900mV + 6, 3, // 2000mV + 6, 3, // 2100mV + 7, 3, // 2200mV + 7, 3, // 2300mV + 7, 3, // 2400mV + 7, 3, // 2500mV + 7, 3, // 2600mV + 7, 3, // 2700mV + 8, 3, // 2800mV + 8, 3, // 2900mV + 8, 3, // 3000mV + 9, 3, // 3100mV + 9, 3, // 3200mV + 10, 3, // 3300mV + 11, 3, // 3400mV + 11, 3, // 3500mV + 11, 3 }; // 3600mV +#endif + +// Function prototypes +void calibrationSetLoad(int i2cData); + +/** +* \brief pwmConfigure +* +* PWM regulation and overcurrent detection requires voltage-dependend +* parameters. +* +* The pwmConfigure function accesses a configuration table +* to set the voltage-dependent PWM on duty. +* +* The calibration resistor #0 is then used to finetune the overcurrent +* detection threshold. Target power switch needs to be disconnected during +* this calibration! +* +* @param int i2cData [IN] Output voltage in mV (1200 - 3600, 100mV steps) +* +* @return void +*/ +int voltage; +unsigned char highresMode; + +void pwmConfigure(int i2cData) +{ + unsigned int index = 0; + voltage = i2cData&0x7FFF; // Mask MSB + highresMode = ((i2cData>>8)>>8)&0x01; // Extract MSB + + if ((voltage >= PWM_ARRAY_VCC_MIN) && (voltage <= PWM_ARRAY_VCC_MAX)) + { + // Find PWM on duty in configuration table + index = voltage - PWM_ARRAY_VCC_MIN; + index = index / 100; + TA0CCR0 = pwmConfigTable[index*2 + highresMode] + 1; + } +} + +/** +* \brief pwmSetOnTime +* +* Manually override the PWM on duty setting done by +* pwmConfigure() +* +* @param int i2cData [IN] 0 = PWM off, 1..10 = PWM on duty +* +* @return void +*/ +void pwmSetOnTime(int i2cData) +{ + if (i2cData == 0) + { + pwmTimerReg = TACLR; // Turn off PWM + } + else if (i2cData < 10) + { + TA0CCR0 = i2cData; + pwmTimerReg = TASSEL_2 + MC_2 + TACLR; // using register is faster than accessing a Flash-stored value + } +} + + +/** +* \brief calibrationSetLoad +* +* Connect one or more calibration resistors to the output voltage +* +* @param int i2cData [IN] 0 = disconnect all resistors +* 1 = connect resistor #0 +* 2 = connect resistor #1 +* 4 = connect resistor #2 +* +* @return void +*/ +#ifdef EZ_FET +void calibrationSetLoad(int i2cData) +{ + // eZ-FET: Set pin to output "0" + P1OUT &= ~BIT1; + P2OUT &= ~(BIT6+BIT7); + + // Calibration resistor 0 + if (i2cData & BIT0) { P2DIR |= BIT6; } + else { P2DIR &= ~BIT6; } + + // Calibration resistor 1 + if (i2cData & BIT1) { P1DIR |= BIT1; } + else { P1DIR &= ~BIT1; } + + // Calibration resistor 2 + if (i2cData & BIT2) { P2DIR |= BIT7; } + else { P2DIR &= ~BIT7; } +} +#endif +#ifdef MSP_FET +void calibrationSetLoad(int i2cData) +{ + // MSP-FET: Turn on calibration resistor switch + P1DIR |= BIT1; + P2DIR |= BIT6+BIT7; + + // Calibration resistor 0 + if (i2cData & BIT0) { P2OUT |= BIT6; } + else { P2OUT &= ~BIT6; } + + // Calibration resistor 1 + if (i2cData & BIT1) { P1OUT |= BIT1; } + else { P1OUT &= ~BIT1; } + + // Calibration resistor 2 + if (i2cData & BIT2) { P2OUT |= BIT7; } + else { P2OUT &= ~BIT7; } +} +#endif + + +/** +* \brief pwmPowerdown +* +* Go to LPM3 and wait there until I2C communication +* resumes +* +* @param int i2cData [IN] Powerdown key +* +* @return void +*/ +void pwmPowerdown(int i2cData) +{ + if (i2cData == POWERDOWN_KEY) + { + // To LPM - exit through next communication packet +#ifdef USE_OVERCURRENT_PROTECTION + IE1 &= ~WDTIE; +#endif + _BIS_SR(LPM3_bits+GIE); + __no_operation(); +#ifdef USE_OVERCURRENT_PROTECTION + IE1 |= WDTIE; +#endif + } +} + + +/** +* \brief commandHandler +* +* Evaluates command received through I2C +* +* @param int i2cData [IN] Data received through I2C +* +* @return void +*/ +void commandHandler(int i2cData) +{ + switch(i2cCmd) + { + // pwmConfigure PWM + case CMD_CONFIGURE: pwmConfigure(i2cData); + break; + // Set PWM manually + case CMD_SETPWM: pwmSetOnTime(i2cData); + break; + // Enable calibration loads + case CMD_CALLOAD: calibrationSetLoad(i2cData); + break; + // Powerdown device + case CMD_POWERDOWN: pwmPowerdown(i2cData); + break; + } + // Void command + i2cCmd = -1; +} + + +/** +* \brief main +* +* Initialises system, sets initial PWM parameters +* starts voltage regulation +* +* @param none +* +* @return none +*/ +int main( void ) +{ + // Stop watchdog timer to prevent time out reset + WDTCTL = WDTPW + WDTHOLD; + +#if defined MSP_FET + // Hardware initialisation + + // PORT1 + // P1.0 = A_VCC_OUT + // P1.1 = DCDC_CAL1 + // P1.2 = DCDC_PULSE + // P1.3 = DCDC_IO0 + // P1.4 = DCDC_IO1 + // P1.5 = A_VCCPOD + // P1.6 = HOST_SCL + // P1.7 = HOST_SDA + P1SEL |= BIT2; // DCDC_PULSE = TA0.1 output + P1OUT &= ~(BIT1+BIT3); // DCDC_CAL0, DCDC_IO0 are "0" + P1DIR = BIT1+BIT2+BIT3; // DCDC_PULSE, DCDC_IO0 are output + + // PORT2 + // P2.6 = DCDC_CAL1 + // P2.7 = DCDC_CAL2 + P2SEL &= ~(BIT6+BIT7); // XT1 pins to GPIO functionality + P2SEL2 &= ~(BIT6+BIT7); + P2OUT = 0; + P2DIR = BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7; +#endif +#ifdef EZ_FET + // Hardware initialisation + + // PORT1 + // P1.0 = A_VCC_OUT + // P1.1 = DCDC_CAL1 + // P1.2 = DCDC_PULSE + // P1.3 = DCDC_IO0 + // P1.4 = DCDC_IO1 + // P1.5 = A_VCCPOD + // P1.6 = HOST_SCL + // P1.7 = HOST_SDA + P1SEL |= BIT2; // DCDC_PULSE = TA0.1 output + P1OUT &= ~(BIT1+BIT3); // DCDC_CAL0, DCDC_IO0 are "0" + P1DIR = BIT2+BIT3; // DCDC_PULSE, DCDC_IO0, DCDC_IO1 are output + P1REN = 0; + + // PORT2 + // P2.6 = DCDC_CAL1 + // P2.7 = DCDC_CAL2 + P2SEL &= ~(BIT6+BIT7); // XT1 pins to GPIO functionality + P2SEL2 &= ~(BIT6+BIT7); + P2OUT &= ~(BIT6+BIT7); // DCDC_CAL0, DCDC_CAL1 are "0" + P2REN = 0; + P2DIR = BIT0+BIT1+BIT2+BIT3+BIT4+BIT5; +#endif + + // P1.0 & P1.5 = comparator inputs for regulation loop + CAPD = CAPD0 + CAPD5; + CACTL2 = P2CA0 + P2CA3 + P2CA1; + CACTL1 = CAON; + + // Set DCO to 16MHz + DCOCTL = CALDCO_16MHZ; + BCSCTL1 = CALBC1_16MHZ; + + // Setup timer (set at TA0CCR1, clear at TA0CCR0) + TA0CCTL1 = OUTMOD_3; + TA0CCR0 = 8; + TA0CCR1 = 2; + pwmTimerReg = TASSEL_2 + MC_2 + TACLR; // using register is faster than accessing a Flash-stored value + +#ifdef USE_OVERCURRENT_PROTECTION + // Start Watchdog timer to periodically check off count + // Watchdog timer runs off VLOCLK (12kHz), results in an ISR every 5.3msec + pwmOffCount = 0; + BCSCTL3 |= LFXT1S_2; + WDTCTL = WDTPW + WDTNMI + WDTTMSEL + WDTCNTCL + WDTSSEL + WDTIS1 + WDTIS0; + IE1 |= WDTIE; +#endif + +#ifdef OVERCURRENT_SHUTDOWN + pwmOcEvents = 0; +#endif + + // Enable I2C interface + i2cCmd = -1; + i2cState = 0; + i2cRxIndex = 0; + USICTL0 = USIPE6+USIPE7+USISWRST; // Port & USI mode setup + USICTL1 = USII2C+USIIE+USISTTIE; // Enable I2C mode & USI interrupts + USICKCTL = USIDIV_7+USISSEL_3+USICKPL;// SMCLK/128, inactive state is high + USICNT |= USIIFGCC; // Disable automatic clear control + USICTL0 &= ~USISWRST; // Enable USI + USICTL1 &= ~USIIFG; // Clear pending flag + _EINT(); + +#ifdef EZ_FET + // pwmConfigure PWM for 3.6V + pwmConfigure(EZ_FET_VOLTAGE); +#endif +#ifdef MSP_FET + // pwmConfigure PWM for 3.0V + pwmConfigure(MSP_FET_VOLTAGE); +#endif + + while(1) + { + // Main regulation loop - 12 cycles = 750nsec @ 16MHz (1.31MHz) + if ((CACTL2&CAOUT)==0) + { + // VCC_OUT too low? Trigger "one-shot" charge pulse + // 3.6V high=410nsec=7cycles, low=350nsec=5cycles + TA0CTL = pwmTimerReg; + _NOP(); + } + else + { + // VCC_OUT too high? Skip pulse! + TA0CTL = TACLR; + // Increase PWM off counter - used for overcurrent detection + #ifdef USE_OVERCURRENT_PROTECTION + pwmOffCount++; + #endif + } + +#define CMD_HANDLER +#ifdef CMD_HANDLER + if (i2cCmd != -1) + { + commandHandler(i2cData); + } +#endif + } +} + + +/** +* \brief wdtIsr +* +* Interrupt service routine for watchdog timer +* Checks every 5.3msec if the pwmOffCount is below a +* voltage dependent threshold. If TRUE, then the output +* current is too high, and the overcurrent detection signal +* is asserted +* +* @param none +* +* @return void +*/ +#ifdef USE_OVERCURRENT_PROTECTION +#pragma vector=WDT_VECTOR +__interrupt void wdtIsr(void) +{ + if (OC_SHUTDOWN_ENABLE) + { + // No off phases anymore? Then we have overcurrent! + if (pwmOffCount == 0) //pwmTimeOut) + { + if (++pwmOcEvents > OVERCURRENT_EVENT_LIMIT) + { + // Assert overcurrent detection + STATUS_OC_ON; + // Wait for overcurrent condition to heal + __delay_cycles(5000000); + pwmOcEvents = 0; + } + } + else + { + // Deassert overcurrent detection + STATUS_OC_OFF; + pwmOcEvents = 0; + } + } + + // Reset counter + pwmOffCount = 0; +} +#endif + + + + +/** +* \brief usiTxrxIsr +* +* Interrupt service routine for I2C communication +* +* All I2C packets to the DCDC MCU are 4 x 8bit long +* 1: slave address +* 2: command +* 3: dataH +* 4: dataL +* +* When reading from the DCDC MCU, it returns 2 x 8bit +* 1: software fwVersion H +* 2: software fwVersion L +* +* @param none +* +* @return void +*/ +#pragma vector = USI_VECTOR +__interrupt void usiTxrxIsr (void) +{ + // Start entry? + if (USICTL1 & USISTTIFG) + { + i2cState = 2; // Enter 1st state on start + i2cRxIndex = 0; + } + + switch(i2cState) + { + case 0: // Idle, should not get here + break; + + case 2: // RX Address + USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, RX address + USICTL1 &= ~USISTTIFG; // Clear start flag + i2cState = 4; // Go to next state: check address + break; + + case 4: // Process Address and send (N)Ack + USICTL0 |= USIOE; // SDA = output + if ((USISRL&0xFE) == i2cSlaveAddress) // Address match? + { + if (USISRL & 0x01) i2cState = 18; // Go to next state: TX data + else i2cState = 8; // Go to next state: RX data + USISRL = 0x00; // Send Ack + } + else + { + USISRL = 0xFF; // Send NAck + i2cState = 6; // Go to next state: prep for next Start + } + USICNT |= 0x01; // Bit counter = 1, send (N)Ack bit + break; + + case 6: // Prep for Start condition + USICTL0 &= ~USIOE; // SDA = input + i2cState = 0; // Reset state machine + break; + + case 8: // Receive data byte + USICTL0 &= ~USIOE; // SDA = input + USICNT |= 0x08; // Bit counter = 8, RX data + i2cState = 10; // Go to next state: Test data and (N)Ack + break; + + case 10:// Check Data & TX (N)Ack + USICTL0 |= USIOE; // SDA = output + if (i2cRxIndex < I2C_PACKET_BYTES) + { + i2cReceived[i2cRxIndex++] = USISRL; + } + USISRL = 0x00; // Send Ack + if (i2cRxIndex >= I2C_PACKET_BYTES) + { + // Evaluate command + i2cCmd = i2cReceived[I2C_CMD_BYTE]; + i2cData = ((unsigned int)i2cReceived[I2C_DATA_HI_BYTE])<<8; + i2cData += i2cReceived[I2C_DATA_LO_BYTE]; + i2cState = 6; // Go to next state: prep for next Start + i2cRxIndex = 0; + } + else + { + i2cState = 8; // Receive next byte + } + USICNT |= 0x01; // Bit counter = 1, send (N)Ack bit + break; + + case 18: // Send Version high byte + USICTL0 |= USIOE; // SDA = output + USISRL = fwVersion>>8; // Send data byte + USICNT |= 0x08; // Bit counter = 8, TX data + i2cState = 20; // Go to next state: receive (N)Ack + break; + + case 20:// Receive Data (N)Ack + USICTL0 &= ~USIOE; // SDA = input + USICNT |= 0x01; // Bit counter = 1, receive (N)Ack + i2cState = 22; // Go to next state: check (N)Ack + break; + + case 22:// Process Data Ack/NAck + // Prep for Start condition + if(USISRL & 0X01) + { + USICTL0 &= ~USIOE; // SDA = input + i2cState = 0; // Reset state machine + } + else // Send NextByte + { + // Send Version low byte + USICTL0 |= USIOE; // SDA = output + USISRL = fwVersion&0XFF; // Send data byte + USICNT |= 0x08; // Bit counter = 8, TX data + i2cState = 20; // Go to next state: receive (N)Ack + } + break; + } + + USICTL1 &= ~USIIFG; // Clear pending flags + LPM3_EXIT; // Clear LPM3 request +} diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_FLASH.c b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_FLASH.c new file mode 100644 index 0000000..b769ebd --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_FLASH.c @@ -0,0 +1,152 @@ +/******************************************************************************* + * + * HAL_FLASH.c + * Flash Library for flash memory controller of MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 01/18/2011 + * + ******************************************************************************/ + +#include "msp430.h" +#include "HAL_FLASH.h" + +void Flash_SegmentErase(unsigned short *Flash_ptr) +{ + FCTL3 = FWKEY; // Clear Lock bit + FCTL1 = FWKEY + ERASE; // Set Erase bit + *Flash_ptr = 0; // Dummy write to erase Flash seg + while (FCTL3 & BUSY); // test busy + FCTL1 = FWKEY; // Clear WRT bit + FCTL3 = FWKEY + LOCK; // Set LOCK bit +} + +uint8_t Flash_EraseCheck(unsigned char *Flash_ptr, unsigned long len) +{ + unsigned long i; + // wordwise erasecheck + for (i = 0; i < len; i++) + { // was erasing successfull? + if ((*(Flash_ptr + i) != 0xFF)) + { + return FLASH_STATUS_ERROR; + } + } + return FLASH_STATUS_OK; +} + +void FlashWrite_8(uint8_t *Data_ptr, uint8_t *Flash_ptr, uint16_t count) +{ + FCTL3 = FWKEY; // Clear Lock bit + FCTL1 = FWKEY+WRT; // Enable byte/word write mode + + while (count > 0) { + while (FCTL3 & BUSY); // test busy + *Flash_ptr++ = *Data_ptr++; // Write to Flash + count--; + } + + FCTL1 = FWKEY; // Clear write bit + FCTL3 = FWKEY + LOCK; // Set LOCK bit +} + +void FlashWrite_16(unsigned short *Data_ptr, unsigned short *Flash_ptr, unsigned long count) +{ + FCTL3 = FWKEY; // Clear Lock bit + FCTL1 = FWKEY+WRT; // Enable byte/word write mode + + while (count > 0) { + while (FCTL3 & BUSY); // test busy + *Flash_ptr++ = *Data_ptr++; // Write to Flash + count--; + } + + FCTL1 = FWKEY; // Clear Erase bit + FCTL3 = FWKEY + LOCK; // Set LOCK bit +} + +void FlashWrite_32(unsigned long *Data_ptr, unsigned long *Flash_ptr, unsigned long count) +{ + FCTL3 = FWKEY; // Clear Lock bit + FCTL1 = FWKEY + BLKWRT; // Enable long-word write + + while (count > 0) { + while (FCTL3 & BUSY); // test busy + *Flash_ptr++ = *Data_ptr++; // Write to Flash + count--; + } + + FCTL1 = FWKEY; // Clear Erase bit + FCTL3 = FWKEY + LOCK; // Set LOCK bit +} + +void FlashMemoryFill_32(uint32_t value, uint32_t *Flash_ptr, uint16_t count) +{ + FCTL3 = FWKEY; // Clear Lock bit + FCTL1 = FWKEY + BLKWRT; // Enable long-word write + + while (count > 0) { + while (FCTL3 & BUSY); // test busy + *Flash_ptr++ = value; // Write to Flash + count--; + } + + FCTL1 = FWKEY; // Clear Erase bit + FCTL3 = FWKEY + LOCK; // Set LOCK bit +} + +void UnlockInfoA() +{ + //Clear LOCKINFO, if set + FCTL4 = FWPW; + // egmentA is locked + if((FCTL3 & LOCKA)) + { + FCTL3 = FWPW+LOCKA; // Unlock info a + } +} + +void LockInfoA() +{ + //if egment A not Locked + if((FCTL3 & LOCKA)) + { + FCTL3 = FWPW+LOCKA; + } + else + { + FCTL4 = FWPW+LOCKINFO; + } +} diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_FLASH.h b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_FLASH.h new file mode 100644 index 0000000..63bc2d3 --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_FLASH.h @@ -0,0 +1,109 @@ +/******************************************************************************* + * + * HAL_FLASH.h + * Flash Library for flash memory controller of MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 01/18/2011 + * + ******************************************************************************/ + +#ifndef HAL_FLASH_H +#define HAL_FLASH_H + +#include + +//****************************************************************************** +// Defines +//****************************************************************************** + +#define FLASH_STATUS_OK 0 +#define FLASH_STATUS_ERROR 1 + +/******************************************************************************* + * \brief Erase a single segment of the flash memory + * + * \param *Flash_ptr Pointer into the flash segment to erase + ******************************************************************************/ +extern void Flash_SegmentErase(unsigned short *Flash_ptr); + +/******************************************************************************* + * \brief Erase Check of the flash memory + * + * \param *Flash_ptr Pointer into the flash segment to erase + * \param len give the len in word + ******************************************************************************/ +extern uint8_t Flash_EraseCheck(unsigned char *Flash_ptr, unsigned long len); + +/******************************************************************************* + * \brief Write data into the flash memory (Byte format) + * + * \param *Data_ptr Pointer to the Data to write + * \param *Flash_ptr Pointer into the flash to write data to + * \param count number of data to write + ******************************************************************************/ +extern void FlashWrite_8(uint8_t *Data_ptr, uint8_t *Flash_ptr, uint16_t count); + +/******************************************************************************* + * \brief Write data into the flash memory (Word format) + * + * \param *Data_ptr Pointer to the Data to write + * \param *Flash_ptr Pointer into the flash to write data to + * \param count number of data to write + ******************************************************************************/ +extern void FlashWrite_16(unsigned short *Data_ptr, unsigned short *Flash_ptr, unsigned long count); + +/******************************************************************************* + * \brief Write data into the flash memory (Long format) + * + * \param *Data_ptr Pointer to the Data to write + * \param *Flash_ptr Pointer into the flash to write data to + * \param count number of data to write + ******************************************************************************/ +extern void FlashWrite_32(unsigned long *Data_ptr, unsigned long *Flash_ptr, unsigned long count); + +/******************************************************************************* + * \brief Fill data into the flash memory (Long format) + * + * \param value Pointer to the Data to write + * \param *Flash_ptr pointer into the flash to write data to + * \param count number of data to write (= byte * 4) + ******************************************************************************/ +extern void FlashMemoryFill_32(uint32_t value, uint32_t *Flash_ptr, uint16_t count); + +extern void LockInfoA(); +extern void UnlockInfoA(); + +#endif /* HAL_FLASH_H */ diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_MACROS.h b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_MACROS.h new file mode 100644 index 0000000..ddf06b5 --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_MACROS.h @@ -0,0 +1,51 @@ +/* **************************************************************************** + * + * HAL_MACROS.h + * Flash Library for flash memory controller of MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * +******************************************************************************/ + +#ifndef HAL_MACROS_H +#define HAL_MACROS_H + +/* + * This macro is for use by other macros to form a fully valid C statement. + */ +#define st(x) do { x } while (__LINE__ == -1) + +#endif /* HAL_MACROS_H */ diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMAP.c b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMAP.c new file mode 100644 index 0000000..5a8d63a --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMAP.c @@ -0,0 +1,81 @@ +/******************************************************************************* + * + * HAL_PMAP.c + * Port Mapper Library for PMAP controller of MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * + ******************************************************************************/ + +#include "msp430.h" +#include "HAL_PMAP.h" +#include "hw_compiler_specific.h" + +// Check and define PMAP function only if the device has port mapping capability +// Note: This macro is defined in the device-specific header file if this +// feature is available on a given MSP430. +#ifdef __MSP430_HAS_PORT_MAPPING__ + +void configure_ports(const uint8_t *port_mapping, uint8_t *PxMAPy, + uint8_t num_of_ports, uint8_t port_map_reconfig) +{ + uint16_t i; + + // Store current interrupt state, then disable all interrupts + uint16_t globalInterruptState = __get_SR_register() & GIE; + _DINT_FET(); + + // Get write-access to port mapping registers: + PMAPPWD = PMAPPW; + + if (port_map_reconfig) { + // Allow reconfiguration during runtime: + PMAPCTL = PMAPRECFG; + } + + // Configure Port Mapping: + for (i = 0; i < num_of_ports * 8; i++) { + PxMAPy[i] = port_mapping[i]; + } + + // Disable write-access to port mapping registers: + PMAPPWD = 0; + + // Restore previous interrupt state + __bis_SR_register(globalInterruptState); +} + +#endif /* __MSP430_HAS_PORT_MAPPING__ */ diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMAP.h b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMAP.h new file mode 100644 index 0000000..a6f479f --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMAP.h @@ -0,0 +1,60 @@ +/******************************************************************************* + * + * HAL_PMAP.h + * Port Mapper Library for PMAP controller of MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * + ******************************************************************************/ + +#ifndef HAL_PMAP_H +#define HAL_PMAP_H + +#include + +/******************************************************************************* + * \brief Configures the MSP430 Port Mapper + * + * \param *port_mapping Pointer to init Data + * \param PxMAPy Pointer start of first Port Mapper to initialize + * \param num_of_ports Number of Ports to initialize + * \param port_map_reconfig Flag to enable/disable reconfiguration + * + ******************************************************************************/ +extern void configure_ports(const uint8_t *port_mapping, uint8_t *PxMAPy, + uint8_t num_of_ports, uint8_t port_map_reconfig); + +#endif /* HAL_PMAP_H */ diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMM.c b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMM.c new file mode 100644 index 0000000..d6ab880 --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMM.c @@ -0,0 +1,273 @@ +/******************************************************************************* + * + * HAL_PMM.c + * Power Management Module Library for MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * Modified SetVcoreUp() and SetVcoreDown() functions + * + ******************************************************************************/ + +#include "msp430.h" +#include "HAL_PMM.h" + +#define _HAL_PMM_DISABLE_SVML_ +#define _HAL_PMM_DISABLE_SVSL_ +#define _HAL_PMM_DISABLE_FULL_PERFORMANCE_ + +#ifdef _HAL_PMM_DISABLE_SVML_ +#define _HAL_PMM_SVMLE SVMLE +#else +#define _HAL_PMM_SVMLE 0 +#endif + +#ifdef _HAL_PMM_DISABLE_SVSL_ +#define _HAL_PMM_SVSLE SVSLE +#else +#define _HAL_PMM_SVSLE 0 +#endif + +#ifdef _HAL_PMM_DISABLE_FULL_PERFORMANCE_ +#define _HAL_PMM_SVSFP SVSLFP +#define _HAL_PMM_SVMFP SVMLFP +#else +#define _HAL_PMM_SVSFP 0 +#define _HAL_PMM_SVMFP 0 +#endif + +/******************************************************************************* + * \brief Increase Vcore by one level + * + * \param level Level to which Vcore needs to be increased + * \return status Success/failure + ******************************************************************************/ +static uint16_t SetVCoreUp(uint8_t level) +{ + uint16_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup; + + // The code flow for increasing the Vcore has been altered to work around + // the erratum FLASH37. + // Please refer to the Errata sheet to know if a specific device is affected + // DO NOT ALTER THIS FUNCTION + + // Open PMM registers for write access + PMMCTL0_H = 0xA5; + + // Disable dedicated Interrupts + // Backup all registers + PMMRIE_backup = PMMRIE; + PMMRIE &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE | SVSLPE | SVMHVLRIE | + SVMHIE | SVSMHDLYIE | SVMLVLRIE | SVMLIE | SVSMLDLYIE ); + SVSMHCTL_backup = SVSMHCTL; + SVSMLCTL_backup = SVSMLCTL; + + // Clear flags + PMMIFG = 0; + + // Set SVM highside to new level and check if a VCore increase is possible + SVSMHCTL = SVMHE | SVSHE | (SVSMHRRL0 * level); + + // Wait until SVM highside is settled + while ((PMMIFG & SVSMHDLYIFG) == 0); + + // Clear flag + PMMIFG &= ~SVSMHDLYIFG; + + // Check if a VCore increase is possible + if ((PMMIFG & SVMHIFG) == SVMHIFG) { // -> Vcc is too low for a Vcore increase + // recover the previous settings + PMMIFG &= ~SVSMHDLYIFG; + SVSMHCTL = SVSMHCTL_backup; + + // Wait until SVM highside is settled + while ((PMMIFG & SVSMHDLYIFG) == 0); + + // Clear all Flags + PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG); + + PMMRIE = PMMRIE_backup; // Restore PMM interrupt enable register + PMMCTL0_H = 0x00; // Lock PMM registers for write access + return PMM_STATUS_ERROR; // return: voltage not set + } + + // Set also SVS highside to new level + // Vcc is high enough for a Vcore increase + SVSMHCTL |= (SVSHRVL0 * level); + + // Wait until SVM highside is settled + while ((PMMIFG & SVSMHDLYIFG) == 0); + + // Clear flag + PMMIFG &= ~SVSMHDLYIFG; + + // Set VCore to new level + PMMCTL0_L = PMMCOREV0 * level; + + // Set SVM, SVS low side to new level + SVSMLCTL = SVMLE | (SVSMLRRL0 * level) | SVSLE | (SVSLRVL0 * level); + + // Wait until SVM, SVS low side is settled + while ((PMMIFG & SVSMLDLYIFG) == 0); + + // Clear flag + PMMIFG &= ~SVSMLDLYIFG; + // SVS, SVM core and high side are now set to protect for the new core level + + // Restore Low side settings + // Clear all other bits _except_ level settings + SVSMLCTL &= (SVSLRVL0+SVSLRVL1+SVSMLRRL0+SVSMLRRL1+SVSMLRRL2); + + // Clear level settings in the backup register,keep all other bits + SVSMLCTL_backup &= ~(SVSLRVL0+SVSLRVL1+SVSMLRRL0+SVSMLRRL1+SVSMLRRL2); + + // Restore low-side SVS monitor settings + SVSMLCTL |= SVSMLCTL_backup; + + // Restore High side settings + // Clear all other bits except level settings + SVSMHCTL &= (SVSHRVL0+SVSHRVL1+SVSMHRRL0+SVSMHRRL1+SVSMHRRL2); + + // Clear level settings in the backup register,keep all other bits + SVSMHCTL_backup &= ~(SVSHRVL0+SVSHRVL1+SVSMHRRL0+SVSMHRRL1+SVSMHRRL2); + + // Restore backup + SVSMHCTL |= SVSMHCTL_backup; + + // Wait until high side, low side settled + while (((PMMIFG & SVSMLDLYIFG) == 0) && ((PMMIFG & SVSMHDLYIFG) == 0)); + + // Clear all Flags + PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG); + + PMMRIE = PMMRIE_backup; // Restore PMM interrupt enable register + PMMCTL0_H = 0x00; // Lock PMM registers for write access + + return PMM_STATUS_OK; +} + +/******************************************************************************* + * \brief Decrease Vcore by one level + * + * \param level Level to which Vcore needs to be decreased + * \return status Success/failure + ******************************************************************************/ +static uint16_t SetVCoreDown(uint8_t level) +{ + uint16_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup; + + // The code flow for decreasing the Vcore has been altered to work around + // the erratum FLASH37. + // Please refer to the Errata sheet to know if a specific device is affected + // DO NOT ALTER THIS FUNCTION + + // Open PMM registers for write access + PMMCTL0_H = 0xA5; + + // Disable dedicated Interrupts + // Backup all registers + PMMRIE_backup = PMMRIE; + PMMRIE &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE | SVSLPE | SVMHVLRIE | + SVMHIE | SVSMHDLYIE | SVMLVLRIE | SVMLIE | SVSMLDLYIE ); + SVSMHCTL_backup = SVSMHCTL; + SVSMLCTL_backup = SVSMLCTL; + + // Clear flags + PMMIFG &= ~(SVMHIFG | SVSMHDLYIFG | SVMLIFG | SVSMLDLYIFG); + + // Set SVM, SVS high & low side to new settings in normal mode + SVSMHCTL = SVMHE | (SVSMHRRL0 * level) | SVSHE | (SVSHRVL0 * level); + SVSMLCTL = SVMLE | (SVSMLRRL0 * level) | SVSLE | (SVSLRVL0 * level); + + // Wait until SVM high side and SVM low side is settled + while ((PMMIFG & SVSMHDLYIFG) == 0 || (PMMIFG & SVSMLDLYIFG) == 0); + + // Clear flags + PMMIFG &= ~(SVSMHDLYIFG + SVSMLDLYIFG); + // SVS, SVM core and high side are now set to protect for the new core level + + // Set VCore to new level + PMMCTL0_L = PMMCOREV0 * level; + + // Restore Low side settings + // Clear all other bits _except_ level settings + SVSMLCTL &= (SVSLRVL0+SVSLRVL1+SVSMLRRL0+SVSMLRRL1+SVSMLRRL2); + + // Clear level settings in the backup register,keep all other bits + SVSMLCTL_backup &= ~(SVSLRVL0+SVSLRVL1+SVSMLRRL0+SVSMLRRL1+SVSMLRRL2); + + // Restore low-side SVS monitor settings + SVSMLCTL |= SVSMLCTL_backup; + + // Restore High side settings + // Clear all other bits except level settings + SVSMHCTL &= (SVSHRVL0+SVSHRVL1+SVSMHRRL0+SVSMHRRL1+SVSMHRRL2); + + // Clear level settings in the backup register, keep all other bits + SVSMHCTL_backup &= ~(SVSHRVL0+SVSHRVL1+SVSMHRRL0+SVSMHRRL1+SVSMHRRL2); + + // Restore backup + SVSMHCTL |= SVSMHCTL_backup; + + // Wait until high side, low side settled + while (((PMMIFG & SVSMLDLYIFG) == 0) && ((PMMIFG & SVSMHDLYIFG) == 0)); + + // Clear all Flags + PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG); + + PMMRIE = PMMRIE_backup; // Restore PMM interrupt enable register + PMMCTL0_H = 0x00; // Lock PMM registers for write access + return PMM_STATUS_OK; // Return: OK +} + +uint16_t SetVCore(uint8_t level) +{ + uint16_t actlevel; + uint16_t status = 0; + + level &= PMMCOREV_3; // Set Mask for Max. level + actlevel = (PMMCTL0 & PMMCOREV_3); // Get actual VCore + // step by step increase or decrease + while (((level != actlevel) && (status == 0)) || (level < actlevel)) { + if (level > actlevel) { + status = SetVCoreUp(++actlevel); + } + else { + status = SetVCoreDown(--actlevel); + } + } + + return status; +} diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMM.h b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMM.h new file mode 100644 index 0000000..fd1b01d --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_PMM.h @@ -0,0 +1,106 @@ +/******************************************************************************* + * + * HAL_PMM.h + * Power Management Module Library for MSP430F5xx/6xx family + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * + ******************************************************************************/ + +#ifndef HAL_PMM_H +#define HAL_PMM_H + +#include +#include "HAL_MACROS.h" + +/******************************************************************************* + * Macros + ******************************************************************************/ +#define ENABLE_SVSL() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVSLE; PMMCTL0_H = 0x00;) +#define DISABLE_SVSL() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~SVSLE; PMMCTL0_H = 0x00;) +#define ENABLE_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVMLE; PMMCTL0_H = 0x00;) +#define DISABLE_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~SVMLE; PMMCTL0_H = 0x00;) +#define ENABLE_SVSH() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVSHE; PMMCTL0_H = 0x00;) +#define DISABLE_SVSH() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~SVSHE; PMMCTL0_H = 0x00;) +#define ENABLE_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVMHE; PMMCTL0_H = 0x00;) +#define DISABLE_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~SVMHE; PMMCTL0_H = 0x00;) +#define ENABLE_SVSL_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL |= (SVSLE + SVMLE); PMMCTL0_H = 0x00;) +#define DISABLE_SVSL_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~(SVSLE + SVMLE); PMMCTL0_H = 0x00;) +#define ENABLE_SVSH_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL |= (SVSHE + SVMHE); PMMCTL0_H = 0x00;) +#define DISABLE_SVSH_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~(SVSHE + SVMHE); PMMCTL0_H = 0x00;) + +#define ENABLE_SVSL_RESET() st(PMMCTL0_H = 0xA5; PMMRIE |= SVSLPE; PMMCTL0_H = 0x00;) +#define DISABLE_SVSL_RESET() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVSLPE; PMMCTL0_H = 0x00;) +#define ENABLE_SVML_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE |= SVMLIE; PMMCTL0_H = 0x00;) +#define DISABLE_SVML_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVMLIE; PMMCTL0_H = 0x00;) +#define ENABLE_SVSH_RESET() st(PMMCTL0_H = 0xA5; PMMRIE |= SVSHPE; PMMCTL0_H = 0x00;) +#define DISABLE_SVSH_RESET() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVSHPE; PMMCTL0_H = 0x00;) +#define ENABLE_SVMH_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE |= SVMHIE; PMMCTL0_H = 0x00;) +#define DISABLE_SVMH_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVMHIE; PMMCTL0_H = 0x00;) +#define CLEAR_PMM_IFGS() st(PMMCTL0_H = 0xA5; PMMIFG = 0; PMMCTL0_H = 0x00;) + +// These settings use SVSH/LACE = 0 +#define SVSL_ENABLED_IN_LPM_FAST_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= (SVSLFP+SVSLMD); SVSMLCTL &= ~SVSMLACE; PMMCTL0_H = 0x00;) +#define SVSL_ENABLED_IN_LPM_SLOW_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVSLMD; SVSMLCTL &= ~(SVSLFP+SVSMLACE); PMMCTL0_H = 0x00;) + +#define SVSL_DISABLED_IN_LPM_FAST_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVSLFP; SVSMLCTL &= ~(SVSLMD+SVSMLACE); PMMCTL0_H = 0x00;) +#define SVSL_DISABLED_IN_LPM_SLOW_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~(SVSLFP+SVSMLACE+SVSLMD); PMMCTL0_H = 0x00;) + +#define SVSH_ENABLED_IN_LPM_NORM_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVSHMD; SVSMHCTL &= ~(SVSMHACE+SVSHFP); PMMCTL0_H = 0x00;) +#define SVSH_ENABLED_IN_LPM_FULL_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= (SVSHMD+SVSHFP); SVSMHCTL &= ~SVSMHACE; PMMCTL0_H = 0x00;) + +#define SVSH_DISABLED_IN_LPM_NORM_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~(SVSMHACE+SVSHFP+SVSHMD);PMMCTL0_H = 0x00;) +#define SVSH_DISABLED_IN_LPM_FULL_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVSHFP; SVSMHCTL &= ~(SVSMHACE+SVSHMD); PMMCTL0_H = 0x00;) + +// These setting use SVSH/LACE = 1 +#define SVSL_OPTIMIZED_IN_LPM_FAST_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= (SVSLFP+SVSLMD+SVSMLACE); PMMCTL0_H = 0x00;) +#define SVSH_OPTIMIZED_IN_LPM_FULL_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= (SVSHMD+SVSHFP+SVSMHACE); PMMCTL0_H = 0x00;) + +/******************************************************************************* + * Defines + ******************************************************************************/ +#define PMM_STATUS_OK 0 +#define PMM_STATUS_ERROR 1 + +/******************************************************************************* + * \brief Set Vcore to expected level + * + * \param level Level to which Vcore needs to be increased/decreased + * \return status Success/failure + ******************************************************************************/ +extern uint16_t SetVCore(uint8_t level); + +#endif /* HAL_PMM_H */ diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_TLV.c b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_TLV.c new file mode 100644 index 0000000..7acd7e3 --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_TLV.c @@ -0,0 +1,173 @@ +/******************************************************************************* + * + * HAL_TLV.c + * Provides Functions to Read the TLV Data Section of the MSP430 Devices + * + * + * Copyright (C) 2010 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. + * + * Updated: Version 2.0 01/17/2011 + * + ******************************************************************************/ + +#include "msp430.h" +#include "HAL_TLV.h" + +void Get_TLV_Info(uint8_t tag, uint8_t instance, uint8_t *length, uint16_t **data_address) +{ + unsigned char *TLV_address = (unsigned char *)TLV_START; // TLV Structure Start Address + + while((TLV_address < (unsigned char *)TLV_END) + && ((*TLV_address != tag) || instance) // check for tag and instance + && (*TLV_address != TLV_TAGEND)) // do range check first + { + if (*TLV_address == tag) instance--; // repeat till requested instance is reached + TLV_address += *(TLV_address + 1) + 2; // add (Current TAG address + LENGTH) + 2 + } + + if (*TLV_address == tag) // Check if Tag match happened.. + { + *length = *(TLV_address + 1); // Return length = Address + 1 + *data_address = (uint16_t *)(TLV_address + 2); // Return address of first data/value info = Address + 2 + } + else // If there was no tag match and the end of TLV structure was reached.. + { + *length = 0; // Return 0 for TAG not found + *data_address = 0; // Return 0 for TAG not found + } +} + +uint16_t Get_Device_Type(void) +{ + uint16_t *pDeviceType = (uint16_t *)DEVICE_ID_0; + return pDeviceType[0]; // Return Value from TLV Table +} + +uint16_t Get_TLV_Memory(uint8_t instance) +{ + uint8_t *pPDTAG; + uint8_t bPDTAG_bytes; + uint16_t count; + + instance *= 2; // set tag for word access comparison + + // TLV access Function Call + Get_TLV_Info(TLV_PDTAG, 0, &bPDTAG_bytes, (uint16_t **)&pPDTAG); // Get Peripheral data pointer + + if(pPDTAG == 0) + { + return 0; + } + + for (count = 0;count <= instance; count += 2) + { + if (pPDTAG[count] == 0) return 0; // Return 0 if end reached + if (count == instance) return (pPDTAG[count] | pPDTAG[count+1]<<8); + } + + return 0; // Return 0: not found +} + +uint16_t Get_TLV_Peripheral(uint8_t tag, uint8_t instance) +{ + uint8_t *pPDTAG; + uint8_t bPDTAG_bytes; + uint16_t count = 0; + uint16_t pcount = 0; + + Get_TLV_Info(TLV_PDTAG, 0, &bPDTAG_bytes, (uint16_t **)&pPDTAG); // Get Peripheral data pointer + + if(pPDTAG == 0) + { + return 0; + } + + // read memory configuration from TLV to get offset for Peripherals + while (Get_TLV_Memory(count)) { + count++; + } + + pcount = pPDTAG[count * 2 + 1]; // get number of Peripheral entries + count++; // inc count to first Periperal + pPDTAG += count*2; // adjust point to first address of Peripheral + count = 0; // set counter back to 0 + pcount *= 2; // align pcount for work comparision + + // TLV access Function Call + for (count = 0; count <= pcount; count += 2) { + if (pPDTAG[count+1] == tag) { // test if required Peripheral is found + if (instance > 0) { // test if required instance is found + instance--; + } + else { + return (pPDTAG[count] | pPDTAG[count + 1] << 8); // Return found data + } + } + } + + return 0; // Return 0: not found +} + +uint8_t Get_TLV_Interrupt(uint8_t tag) +{ + uint8_t *pPDTAG; + uint8_t bPDTAG_bytes; + uint16_t count = 0; + uint16_t pcount = 0; + + Get_TLV_Info(TLV_PDTAG, 0, &bPDTAG_bytes, (uint16_t **)&pPDTAG); // Get Peripheral data pointer + + if(pPDTAG == 0) + { + return 0; + } + + // read memory configuration from TLV to get offset for Peripherals + while (Get_TLV_Memory(count)) + { + count++; + } + + pcount = pPDTAG[count * 2 + 1]; + count++; // inc count to first Periperal + pPDTAG += (pcount + count) * 2; // adjust point to first address of Peripheral + count = 0; // set counter back to 0 + + // TLV access Function Call + for (count = 0; count <= tag; count += 2) + { + if (pPDTAG[count] == 0) return 0; // Return 0: not found/end of table + if (count == tag) return (pPDTAG[count]); // Return found data + } + + return 0; // Return 0: not found +} diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_TLV.h b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_TLV.h new file mode 100644 index 0000000..60e2778 --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_TLV.h @@ -0,0 +1,228 @@ +/******************************************************************************* + * + * HAL_TLV.c + * Provides Functions to Read the TLV Data Section of the MSP430 Devices + * + * + * Copyright (C) 2010 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. + * + * Updated: Version 2.0 01/17/2011 + * + ******************************************************************************/ + +#ifndef HAL_TLV_H +#define HAL_TLV_H + +#include + +/******************************************************************************* + * Device Descriptors - Fixed Memory Locations + ******************************************************************************/ +#define DEVICE_ID_0 (0x1A04) +#define DEVICE_ID_1 (0x1A05) + +/******************************************************************************* + * Data Types + ******************************************************************************/ +struct s_TLV_Die_Record { + uint8_t die_record[10]; +}; + +struct s_TLV_ADC_Cal_Data { + uint16_t adc_gain_factor; + uint16_t adc_offset; + uint16_t adc_ref15_30_temp; + uint16_t adc_ref15_85_temp; + uint16_t adc_ref20_30_temp; + uint16_t adc_ref20_85_temp; + uint16_t adc_ref25_30_temp; + uint16_t adc_ref25_85_temp; +}; + +struct s_TLV_Timer_D_Cal_Data { + uint16_t TDH0CTL1_64; + uint16_t TDH0CTL1_128; + uint16_t TDH0CTL1_200; + uint16_t TDH0CTL1_256; +}; + +struct s_TLV_REF_Cal_Data { + uint16_t ref_ref15; + uint16_t ref_ref20; + uint16_t adc_ref25; +}; + +/******************************************************************************* + * Tag Defines + ******************************************************************************/ +#define TLV_LDTAG (0x01) /* Legacy descriptor (1xx, 2xx, + 4xx families) */ +#define TLV_PDTAG (0x02) /* Peripheral discovery descriptor */ +#define TLV_Reserved3 (0x03) /* Future usage */ +#define TLV_Reserved4 (0x04) /* Future usage */ +#define TLV_BLANK (0x05) /* Blank descriptor */ +#define TLV_Reserved6 (0x06) /* Future usage */ +#define TLV_Reserved7 (0x07) /* Serial Number */ +#define TLV_DIERECORD (0x08) /* Die Record */ +#define TLV_ADCCAL (0x11) /* ADC12 calibration */ +#define TLV_ADC12CAL (0x11) /* ADC12 calibration */ +#define TLV_ADC10CAL (0x13) /* ADC10 calibration */ +#define TLV_REFCAL (0x12) /* REF calibration */ +#define TLV_TIMER_D_CAL (0x15) /* Timer_Dx calibration */ +#define TLV_TAGEXT (0xFE) /* Tag extender */ +#define TLV_TAGEND (0xFF) /* Tag End of Table */ + +/******************************************************************************* + * Peripheral Defines + ******************************************************************************/ +#define TLV_PID_NO_MODULE (0x00) /* No Module */ +#define TLV_PID_PORTMAPPING (0x10) /* Port Mapping */ +#define TLV_PID_MSP430CPUXV2 (0x23) /* MSP430CPUXV2 */ +#define TLV_PID_JTAG (0x09) /* JTAG */ +#define TLV_PID_SBW (0x0F) /* SBW */ +#define TLV_PID_EEM_XS (0x02) /* EEM X-Small */ +#define TLV_PID_EEM_S (0x03) /* EEM Small */ +#define TLV_PID_EEM_M (0x04) /* EEM Medium */ +#define TLV_PID_EEM_L (0x05) /* EEM Large */ +#define TLV_PID_PMM (0x30) /* PMM */ +#define TLV_PID_PMM_FR (0x32) /* PMM FRAM */ +#define TLV_PID_FCTL (0x39) /* Flash */ +#define TLV_PID_CRC16 (0x3C) /* CRC16 */ +#define TLV_PID_CRC16_RB (0x3D) /* CRC16 Reverse */ +#define TLV_PID_WDT_A (0x40) /* WDT_A */ +#define TLV_PID_SFR (0x41) /* SFR */ +#define TLV_PID_SYS (0x42) /* SYS */ +#define TLV_PID_RAMCTL (0x44) /* RAMCTL */ +#define TLV_PID_DMA_1 (0x46) /* DMA 1 */ +#define TLV_PID_DMA_3 (0x47) /* DMA 3 */ +#define TLV_PID_UCS (0x48) /* UCS */ +#define TLV_PID_DMA_6 (0x4A) /* DMA 6 */ +#define TLV_PID_DMA_2 (0x4B) /* DMA 2 */ +#define TLV_PID_PORT1_2 (0x51) /* Port 1 + 2 / A */ +#define TLV_PID_PORT3_4 (0x52) /* Port 3 + 4 / B */ +#define TLV_PID_PORT5_6 (0x53) /* Port 5 + 6 / C */ +#define TLV_PID_PORT7_8 (0x54) /* Port 7 + 8 / D */ +#define TLV_PID_PORT9_10 (0x55) /* Port 9 + 10 / E */ +#define TLV_PID_PORT11_12 (0x56) /* Port 11 + 12 / F */ +#define TLV_PID_PORTU (0x5E) /* Port U */ +#define TLV_PID_PORTJ (0x5F) /* Port J */ +#define TLV_PID_TA2 (0x60) /* Timer A2 */ +#define TLV_PID_TA3 (0x61) /* Timer A1 */ +#define TLV_PID_TA5 (0x62) /* Timer A5 */ +#define TLV_PID_TA7 (0x63) /* Timer A7 */ +#define TLV_PID_TB3 (0x65) /* Timer B3 */ +#define TLV_PID_TB5 (0x66) /* Timer B5 */ +#define TLV_PID_TB7 (0x67) /* Timer B7 */ +#define TLV_PID_RTC (0x68) /* RTC */ +#define TLV_PID_BT_RTC (0x69) /* BT + RTC */ +#define TLV_PID_BBS (0x6A) /* Battery Backup Switch */ +#define TLV_PID_RTC_B (0x6B) /* RTC_B */ +#define TLV_PID_TD2 (0x6C) /* Timer D2 */ +#define TLV_PID_TD3 (0x6D) /* Timer D1 */ +#define TLV_PID_TD5 (0x6E) /* Timer D5 */ +#define TLV_PID_TD7 (0x6F) /* Timer D7 */ +#define TLV_PID_TEC (0x70) /* Imer Event Control */ +#define TLV_PID_RTC_C (0x71) /* RTC_C */ +#define TLV_PID_AES (0x80) /* AES */ +#define TLV_PID_MPY16 (0x84) /* MPY16 */ +#define TLV_PID_MPY32 (0x85) /* MPY32 */ +#define TLV_PID_MPU (0x86) /* MPU */ +#define TLV_PID_USCI_AB (0x90) /* USCI_AB */ +#define TLV_PID_USCI_A (0x91) /* USCI_A */ +#define TLV_PID_USCI_B (0x92) /* USCI_B */ +#define TLV_PID_EUSCI_A (0x94) /* eUSCI_A */ +#define TLV_PID_EUSCI_B (0x95) /* eUSCI_B */ +#define TLV_PID_REF (0xA0) /* Shared Reference */ +#define TLV_PID_COMP_B (0xA8) /* COMP_B */ +#define TLV_PID_COMP_D (0xA9) /* COMP_D */ +#define TLV_PID_USB (0x98) /* USB */ +#define TLV_PID_LCD_B (0xB1) /* LCD_B */ +#define TLV_PID_LCD_C (0xB2) /* LCD_C */ +#define TLV_PID_DAC12_A (0xC0) /* DAC12_A */ +#define TLV_PID_SD16_B_1 (0xC8) /* SD16_B 1 Channel */ +#define TLV_PID_SD16_B_2 (0xC9) /* SD16_B 2 Channel */ +#define TLV_PID_SD16_B_3 (0xCA) /* SD16_B 3 Channel */ +#define TLV_PID_SD16_B_4 (0xCB) /* SD16_B 4 Channel */ +#define TLV_PID_SD16_B_5 (0xCC) /* SD16_B 5 Channel */ +#define TLV_PID_SD16_B_6 (0xCD) /* SD16_B 6 Channel */ +#define TLV_PID_SD16_B_7 (0xCE) /* SD16_B 7 Channel */ +#define TLV_PID_SD16_B_8 (0xCF) /* SD16_B 8 Channel */ +#define TLV_PID_ADC12_A (0xD1) /* ADC12_A */ +#define TLV_PID_ADC10_A (0xD3) /* ADC10_A */ +#define TLV_PID_ADC10_B (0xD4) /* ADC10_B */ +#define TLV_PID_SD16_A (0xD8) /* SD16_A */ +#define TLV_PID_TI_BSL (0xFC) /* BSL */ + +/******************************************************************************* + * \brief Get Information out of the TLV Table + * + * \param tag Tag of the TLV entry + * \param instance Instance of the Tag of the TLV entry + * \param *length return: Length of the information if found + * \param **data_address return: start pointer of Data + ******************************************************************************/ +void Get_TLV_Info(uint8_t tag, uint8_t instance, uint8_t *length, + uint16_t **data_address); + +/******************************************************************************* + * \brief Get Device Type out of the TLV Table + * + * \return Device dependent value + ******************************************************************************/ +uint16_t Get_Device_Type(void); + +/******************************************************************************* + * \brief Get Memory Info out of the TLV Table + * + * \param instance Index of the Instance [0..] + * \return Memory Data found + ******************************************************************************/ +uint16_t Get_TLV_Memory(uint8_t instance); + +/******************************************************************************* + * \brief Get Peripheral Info out of the TLV Table + * + * \param tag Tag of the TLV entry + * \param instance Index of the Instance [0..] + * \return Peripheral Data found + ******************************************************************************/ +uint16_t Get_TLV_Peripheral(uint8_t tag, uint8_t instance); + +/******************************************************************************* + * \brief Get Interrupt Info out of the TLV Table + * + * \param tag Tag of the TLV entry + * \return Interrupt Data found + ******************************************************************************/ +uint8_t Get_TLV_Interrupt(uint8_t tag); + +#endif /* HAL_TLV_H */ diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_UCS.c b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_UCS.c new file mode 100644 index 0000000..dcdb5da --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_UCS.c @@ -0,0 +1,299 @@ +/******************************************************************************* + * + * HAL_UCS.c + * Provides Functions to Initialize the UCS/FLL and clock sources + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * Added Functions: XT2_Stop() and XT1_Stop() + * Modified all functions to preserve drive settings + * + ******************************************************************************/ + +#include "msp430.h" +#include "HAL_UCS.h" + +/******************************************************************************* + * Check and define required Defines + ******************************************************************************/ +#ifndef XT1LFOFFG // Defines if not available in header file +#define XT1LFOFFG 0 +#endif + +#ifndef XT1HFOFFG // Defines if not available in header file +#define XT1HFOFFG 0 +#endif + +#ifndef XT2OFFG // Defines if not available in header file +#define XT2OFFG 0 +#endif + +#ifndef XTS // Defines if not available in header file +#define XTS 0 +#endif + +#ifndef XT2DRIVE_3 // Defines if not available in header file +#define XT2DRIVE_3 0 +#endif + +void LFXT_Start(uint16_t xtdrive) +{ + // If the drive setting is not already set to maximum + // Set it to max for LFXT startup + if ((UCSCTL6 & XT1DRIVE_3)!= XT1DRIVE_3) { + UCSCTL6_L |= XT1DRIVE1_L + XT1DRIVE0_L; // Highest drive setting for XT1startup + } + + while (SFRIFG1 & OFIFG) { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + + UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) | (xtdrive); // set requested Drive mode +} + +uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout) +{ + // If the drive setting is not already set to maximum + // Set it to max for LFXT startup + if ((UCSCTL6 & XT1DRIVE_3)!= XT1DRIVE_3) { + UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1startup + } + + while ((SFRIFG1 & OFIFG) && timeout--){ // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + + UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode + + if (timeout) + return (UCS_STATUS_OK); + else + return (UCS_STATUS_ERROR); +} + +void XT1_Start(uint16_t xtdrive) +{ + // Check if drive value is the expected one + if ((UCSCTL6 & XT1DRIVE_3) != xtdrive) { + UCSCTL6 &= ~XT1DRIVE_3; // Clear XT1drive field + UCSCTL6 |= xtdrive; // Set requested value + } + + UCSCTL6 &= ~XT1OFF; // Enable XT1 + UCSCTL6 |= XTS; // Enable HF mode + + while (SFRIFG1 & OFIFG) { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +} + +uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout) +{ + // Check if drive value is the expected one + if ((UCSCTL6 & XT1DRIVE_3) != xtdrive) { + UCSCTL6 &= ~XT1DRIVE_3; // Clear XT1drive field + UCSCTL6 |= xtdrive; // Set requested value + } + + UCSCTL6 &= ~XT1OFF; // Enable XT1 + UCSCTL6 |= XTS; // Enable HF mode + + while ((SFRIFG1 & OFIFG) && timeout--) { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + + if (timeout) { + return UCS_STATUS_OK; + } + else { + return UCS_STATUS_ERROR; + } +} + +void XT1_Bypass(void) +{ + UCSCTL6 |= XT1BYPASS; + + while (SFRIFG1 & OFIFG) { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +} + +void XT1_Stop(void) +{ + UCSCTL6 |= XT1OFF; // Switch off XT1 oscillator +} + +void XT2_Start(uint16_t xtdrive) +{ + // Check if drive value is the expected one + if ((UCSCTL6 & XT2DRIVE_3) != xtdrive) + { + UCSCTL6 &= ~XT2DRIVE_3; // Clear XT2drive field + UCSCTL6 |= xtdrive; // Set requested value + } + UCSCTL6 &= ~XT2OFF; + while (SFRIFG1 & OFIFG) + { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +} + +#pragma optimize = low +uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout) +{ + uint16_t timeoutint = timeout; + // Check if drive value is the expected one + if ((UCSCTL6 & XT2DRIVE_3) != xtdrive) + { + UCSCTL6 &= ~XT2DRIVE_3; // Clear XT2drive field + UCSCTL6 |= xtdrive; // Set requested value + } + + UCSCTL6 &= ~XT2OFF; + + while ((SFRIFG1 & OFIFG) && timeoutint--) + { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; + } + + if (timeoutint) + { + return UCS_STATUS_OK; + } + else + { + return UCS_STATUS_ERROR; + } +} + +void XT2_Bypass(void) +{ +#ifdef XT2BYPASS // On devices without XT2 this function will be empty + UCSCTL6 |= XT2BYPASS; + + while (SFRIFG1 & OFIFG) { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +#endif +} + +void XT2_Stop(void) +{ + UCSCTL6 |= XT2OFF; // Switch off XT2 oscillator +} + +void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio) +{ + volatile uint16_t x = ratio * 32; + + Init_FLL(fsystem, ratio); + + while (x--) { + __delay_cycles(30); + } +} + +void Init_FLL(uint16_t fsystem, uint16_t ratio) +{ + uint16_t d, dco_div_bits; + uint16_t mode = 0; + + // Save actual state of FLL loop control, then disable it. This is needed to + // prevent the FLL from acting as we are making fundamental modifications to + // the clock setup. + uint16_t srRegisterState = __get_SR_register() & SCG0; + __bic_SR_register(SCG0); + + d = ratio; + dco_div_bits = FLLD__2; // Have at least a divider of 2 + + if (fsystem > 16000) { + d >>= 1 ; + mode = 1; + } + else { + fsystem <<= 1; // fsystem = fsystem * 2 + } + + while (d > 512) { + dco_div_bits = dco_div_bits + FLLD0; // Set next higher div level + d >>= 1; + } + + UCSCTL0 = 0x0000; // Set DCO to lowest Tap + + UCSCTL2 &= ~(0x03FF); // Reset FN bits + UCSCTL2 = dco_div_bits | (d - 1); + + if (fsystem <= 630) // fsystem < 0.63MHz + UCSCTL1 = DCORSEL_0; + else if (fsystem < 1250) // 0.63MHz < fsystem < 1.25MHz + UCSCTL1 = DCORSEL_1; + else if (fsystem < 2500) // 1.25MHz < fsystem < 2.5MHz + UCSCTL1 = DCORSEL_2; + else if (fsystem < 5000) // 2.5MHz < fsystem < 5MHz + UCSCTL1 = DCORSEL_3; + else if (fsystem < 10000) // 5MHz < fsystem < 10MHz + UCSCTL1 = DCORSEL_4; + else if (fsystem < 20000) // 10MHz < fsystem < 20MHz + UCSCTL1 = DCORSEL_5; + else if (fsystem < 40000) // 20MHz < fsystem < 40MHz + UCSCTL1 = DCORSEL_6; + else + UCSCTL1 = DCORSEL_7; + + while (SFRIFG1 & OFIFG) { // Check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + + if (mode == 1) { // fsystem > 16000 + SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK); // Select DCOCLK + } + else { + SELECT_MCLK_SMCLK(SELM__DCOCLKDIV + SELS__DCOCLKDIV); // Select DCODIVCLK + } + + __bis_SR_register(srRegisterState); // Restore previous SCG0 +} diff --git a/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_UCS.h b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_UCS.h new file mode 100644 index 0000000..1ea6c39 --- /dev/null +++ b/Bios/src/fw/fet/F5xx_F6xx_Core_Lib/HAL_UCS.h @@ -0,0 +1,163 @@ +/******************************************************************************* + * + * HAL_UCS.h + * Provides Functions to Initialize the UCS/FLL and clock sources + * + * + * Copyright (C) 2010 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. + * + * Created: Version 1.0 11/24/2009 + * Updated: Version 2.0 12/15/2010 + * Added Functions: XT2_Stop() and XT1_Stop() + * + ******************************************************************************/ + +#ifndef HAL_UCS_H +#define HAL_UCS_H + +#include +#include "hal_macros.h" + +/******************************************************************************* + * Macros + ******************************************************************************/ + +/* Select source for FLLREF e.g. SELECT_FLLREF(SELREF__XT1CLK) */ +#define SELECT_FLLREF(source) st(UCSCTL3 = (UCSCTL3 & ~(SELREF_7)) | (source);) +/* Select source for ACLK e.g. SELECT_ACLK(SELA__XT1CLK) */ +#define SELECT_ACLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELA_7)) | (source);) +/* Select source for MCLK e.g. SELECT_MCLK(SELM__XT2CLK) */ +#define SELECT_MCLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7)) | (source);) +/* Select source for SMCLK e.g. SELECT_SMCLK(SELS__XT2CLK) */ +#define SELECT_SMCLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELS_7)) | (source);) +/* Select source for MCLK and SMCLK e.g. SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK) */ +#define SELECT_MCLK_SMCLK(sources) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7 + SELS_7)) | (sources);) + +/* set ACLK/x */ +#define ACLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVA_7)) | (DIVA__##x);) +/* set MCLK/x */ +#define MCLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM__##x);) +/* set SMCLK/x */ +#define SMCLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS__##x);) +/* Select divider for FLLREF e.g. SELECT_FLLREFDIV(2) */ +#define SELECT_FLLREFDIV(x) st(UCSCTL3 = (UCSCTL3 & ~(FLLREFDIV_7))|(FLLREFDIV__##x);) + +/******************************************************************************* + * Defines + ******************************************************************************/ +#define UCS_STATUS_OK 0 +#define UCS_STATUS_ERROR 1 + +/******************************************************************************* + * \brief Startup routine for 32kHz Crystal on LFXT1 + * + * \param xtdrive Bits defining the LFXT drive mode after startup + ******************************************************************************/ +extern void LFXT_Start(uint16_t xtdrive); + +/******************************************************************************* + * \brief Startup routine for 32kHz Crystal on LFXT1 with timeout counter + * + * \param xtdrive Bits defining the LFXT drive mode after startup + * \param timeout Value for the timeout counter + ******************************************************************************/ +extern uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout); + +/******************************************************************************* + * \brief Startup routine for XT1 + * + * \param xtdrive Bits defining the XT drive mode + ******************************************************************************/ +extern void XT1_Start(uint16_t xtdrive); + +/******************************************************************************* + * \brief Startup routine for XT1 with timeout counter + * + * \param xtdrive Bits defining the XT drive mode + * \param timeout Value for the timeout counter + ******************************************************************************/ +extern uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout); + +/******************************************************************************* + * \brief Use XT1 in Bypasss mode + ******************************************************************************/ +extern void XT1_Bypass(void); + +/******************************************************************************* + * \brief Stop XT1 oscillator + ******************************************************************************/ +extern void XT1_Stop(void); + +/******************************************************************************* + * \brief Startup routine for XT2 + * + * \param xtdrive Bits defining the XT drive mode + ******************************************************************************/ +extern void XT2_Start(uint16_t xtdrive); + +/******************************************************************************* + * \brief Startup routine for XT2 with timeout counter + * + * \param xtdrive Bits defining the XT drive mode + * \param timeout Value for the timeout counter + ******************************************************************************/ +extern uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout); + +/******************************************************************************* + * \brief Use XT2 in Bypasss mode for MCLK + ******************************************************************************/ +extern void XT2_Bypass(void); + +/******************************************************************************* + * \brief Stop XT2 oscillator + ******************************************************************************/ +extern void XT2_Stop(void); + +/******************************************************************************* + * \brief Initializes FLL of the UCS and wait till settled before allowing + * code execution to resume. The use of this function is preferred + * over the use of Init_FLL(). + * + * \param fsystem Required system frequency (MCLK) in kHz + * \param ratio Ratio between fsystem and FLLREFCLK + ******************************************************************************/ +extern void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio); + +/******************************************************************************* + * \brief Initializes FLL of the UCS + * + * \param fsystem Required system frequency (MCLK) in kHz + * \param ratio Ratio between fsystem and FLLREFCLK + ******************************************************************************/ +extern void Init_FLL(uint16_t fsystem, uint16_t ratio); + +#endif /* HAL_UCS_H */ diff --git a/Bios/src/fw/fet/FetIcc/Fet_IccMonitor.h b/Bios/src/fw/fet/FetIcc/Fet_IccMonitor.h new file mode 100644 index 0000000..0ea9af7 --- /dev/null +++ b/Bios/src/fw/fet/FetIcc/Fet_IccMonitor.h @@ -0,0 +1,48 @@ +/* + * MSP_IccMonitor.h + * + * Copyright (C) 2014 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. + */ + +#include "hil_Structs.h" + +#ifndef FETICC_H_ +#define FETICC_H_ + +void IccMonitor_StartVoltageSupervision(); +void IccMonitor_StopVoltageSupervision(); +void IccMonitor_TriggerAdc(); +short IccMonitor_Process(unsigned short flags); +void IccMonitor_setHilIterface(edt_common_methods_t *edt_c); +void IccMonitor_StopDcdcOvercurrentDetection(); +void IccMonitor_StartDcdcOvercurrentDetection(); +#endif /* FETICC_H_ */ diff --git a/Bios/src/fw/fet/FetIcc/MSP_FET_IccMonitor.c b/Bios/src/fw/fet/FetIcc/MSP_FET_IccMonitor.c new file mode 100644 index 0000000..4ce81b3 --- /dev/null +++ b/Bios/src/fw/fet/FetIcc/MSP_FET_IccMonitor.c @@ -0,0 +1,175 @@ +/* + * MSP_IccMonitor.c + * + * Copyright (C) 2014 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. + */ + +#include "Bios.h" +#include "Fet_IccMonitor.h" +#include "stream.h" + +static unsigned short voltageSupervsion; +static edt_common_methods_t edt_Common_Methods; + +void IccMonitor_setHilIterface(edt_common_methods_t *edt_c) +{ + edt_Common_Methods = *edt_c; +} +void IccMonitor_StartVoltageSupervision() +{ + voltageSupervsion = 1; +} +void IccMonitor_StopVoltageSupervision() +{ + voltageSupervsion = 0; +} +void IccMonitor_TriggerAdc() +{ + ADC12CTL0 |= ADC12SC; +} +void IccMonitor_StopDcdcOvercurrentDetection() +{ + P5DIR |= BIT7; + P5OUT |= BIT7; +} +void IccMonitor_StartDcdcOvercurrentDetection() +{ + P5DIR |= BIT7; + P5OUT &= ~BIT7; +} +void IccMonitor_SendOverCurrentEvent(unsigned short event) +{ + static unsigned long counter = 0; + if(counter == 0) + { + if(STREAM_out_init(0, RESPTYP_STATUS) != EXCEPTION_TX_NO_BUFFER) + { + STREAM_put_word(event); + STREAM_flush(); + } + } + if(counter++ > 100000) + { + counter = 0; + } +} + +short IccMonitor_Process(unsigned short flags) +{ + static short overcurrent = 0; + static short VccDtSampling = 0; + static short AdcTrigger = 1000; + short error = 0; + + AdcTrigger--; + if(AdcTrigger == 0) + { + IccMonitor_TriggerAdc(); + AdcTrigger = 1000; + } + + if(!voltageSupervsion) + { + return 0; + } + if(VccDtSampling++ > 50 || overcurrent) + { + //call VCC regulation algorithm + error = edt_Common_Methods.regulateVcc(); + IccMonitor_TriggerAdc(); + VccDtSampling = 0; + if(error) + { + if(overcurrent == 0) + { + IccMonitor_SendOverCurrentEvent(FET_OVERCURRENT); + } + overcurrent = 1; + BIOS_LedOff(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + return 0; + } + } + if((P8IN & BIT4) == BIT4) + { + //overcurrent detected -> Sub MCU swith off VCC -> Biso switch on READ LED -> switch of GREEN LED + BIOS_LedOff(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + if(overcurrent == 0) + { + IccMonitor_SendOverCurrentEvent(FET_OVERCURRENT); // callback + } + overcurrent = 1; + return 0; + } + else + { + // switch on LEDs. + BIOS_LedOn(BIOS_LED_POWER); + if(overcurrent) + { + overcurrent = 0; + BIOS_LedOff(BIOS_LED_MODE); + } + } + return 0; +} + +#pragma vector=ADC12_VECTOR +__interrupt void ADC12ISR (void) +{ + switch(__even_in_range(ADC12IV,34)) + { + case 0: break; // Vector 0: No interrupt + case 2: break; // Vector 2: ADC overflow + case 4: break; // Vector 4: ADC timing overflow + case 6: break; // Vector 6: ADC12IFG0 + case 8: break; // Vector 8: ADC12IFG1 + case 10: break; // Vector 10: ADC12IFG2 + case 12: // Vector 14: ADC12IFG3 + edt_Common_Methods.ReadADC12(); + ADC12CTL0 &= ~ADC12SC; + break; + case 14: break; // Vector 14: ADC12IFG4 + case 16: break; // Vector 16: ADC12IFG5 + case 18: break; // Vector 18: ADC12IFG6 + case 20: break; // Vector 20: ADC12IFG7 + case 22: break; // Vector 22: ADC12IFG8 + case 24: break; // Vector 24: ADC12IFG9 + case 26: break; // Vector 26: ADC12IFG10 + case 28: break; // Vector 28: ADC12IFG11 + case 30: break; // Vector 30: ADC12IFG12 + case 32: break; // Vector 32: ADC12IFG13 + case 34: break; // Vector 34: ADC12IFG14 + default: break; + } +} diff --git a/Bios/src/fw/fet/FetIcc/eZ_FET_IccMonitor.c b/Bios/src/fw/fet/FetIcc/eZ_FET_IccMonitor.c new file mode 100644 index 0000000..43ea5bb --- /dev/null +++ b/Bios/src/fw/fet/FetIcc/eZ_FET_IccMonitor.c @@ -0,0 +1,121 @@ +/* + * eZ_Fet_IccMonitor.c + * + * Copyright (C) 2014 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. + */ + +#include "Bios.h" +#include "Fet_IccMonitor.h" +#include "stream.h" + +static unsigned short voltageSupervsion; + +void IccMonitor_setHilIterface(edt_common_methods_t *edt_c) +{ + return; +} +void IccMonitor_StartVoltageSupervision() +{ + voltageSupervsion = 1; +} +void IccMonitor_StopVoltageSupervision() +{ + voltageSupervsion = 0; +} +void IccMonitor_TriggerAdc() +{ + ADC12CTL0 |= ADC12SC; +} + +void IccMonitor_SendOverCurrentEvent(unsigned short event) +{ + static unsigned long counter = 0; + if(counter == 0) + { + if(STREAM_out_init(0, RESPTYP_STATUS) != EXCEPTION_TX_NO_BUFFER) + { + STREAM_put_word(event); + STREAM_flush(); + } + } + if(counter++ > 100000) + { + counter = 0; + } +} + +void IccMonitor_StopDcdcOvercurrentDetection() +{ + // Switch off over-current detection + P6DIR |= BIT5; + P6OUT |= BIT5; +} +void IccMonitor_StartDcdcOvercurrentDetection() +{ + P6DIR |= BIT5; + P6OUT &= ~BIT5; +} + +short IccMonitor_Process(unsigned short flags) +{ + static short overcurrent = 0; + + if(!voltageSupervsion) + { + return 0; + } + if(((P6IN & BIT4) == BIT4) && Bios_getTool_id() == eZ_FET_WITH_DCDC + || ((P6IN & BIT4) == BIT4) && Bios_getTool_id() == eZ_FET_WITH_DCDC_NO_FLOWCTL + || ((P6IN & BIT4) == BIT4) && Bios_getTool_id() == eZ_FET_WITH_DCDC_V2x)//eZ-FET with DCDC + { + //overcurrent detected -> Sub MCU swith off VCC -> Biso switch on READ LED -> switch of GREEN LED + BIOS_LedOff(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + if(overcurrent == 0) + { + IccMonitor_SendOverCurrentEvent(FET_OVERCURRENT); + } + overcurrent = 1; + return 0; + } + else + { + // switch on LEDs. + BIOS_LedOn(BIOS_LED_POWER); + if(overcurrent) + { + overcurrent = 0; + BIOS_LedOff(BIOS_LED_MODE); + } + } + return 0; +} diff --git a/Bios/src/fw/fet/FetInit/Fet_initClock.c b/Bios/src/fw/fet/FetInit/Fet_initClock.c new file mode 100644 index 0000000..1fdc5ab --- /dev/null +++ b/Bios/src/fw/fet/FetInit/Fet_initClock.c @@ -0,0 +1,73 @@ +/* + * Fet_initClock.c + * + * Copyright (C) 2014 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. + */ + +#include "init.h" +#include "F5xx_F6xx_Core_Lib/HAL_UCS.h" +#include "F5xx_F6xx_Core_Lib/HAL_PMM.h" +#include "hw_compiler_specific.h" +#include "USB_config/descriptors.h" +#include "bios.h" +#include "USB_API/USB_Common/device.h" + +void init_Clock(void) +{ + XT2_Stop(); // stop X2 for default state + + SetVCore(3); + _DINT_FET(); + + //Initialization of clock module + #if defined (__MSP430F552x) || defined (__MSP430F550x) + P5SEL |= 0x0C; //enable XT2 pins for F5529 + #elif defined (__MSP430F563x_F663x) + P7SEL |= 0x0C; + #endif + + //use REFO for FLL and ACLK + UCSCTL3 = (UCSCTL3 & ~(SELREF_7)) | (SELREF__REFOCLK); + UCSCTL4 = (UCSCTL4 & ~(SELA_7)) | (SELA__REFOCLK); + + //MCLK will be driven by the FLL (not by XT2), referenced to the REFO + Init_FLL_Settle(USB_MCLK_FREQ / 1000, USB_MCLK_FREQ / 32768); //Start the FLL, at the freq indicated by the config + //constant USB_MCLK_FREQ + XT1_Stop(); // Stop xt1 to prevent any error + + if( UCS_STATUS_ERROR == XT2_Start_Timeout(XT2DRIVE_0, 0x4E20)) + { + BIOS_LedOff(0); + BIOS_LedOn(1); + while(1); + } +} diff --git a/Bios/src/fw/fet/FetInit/MSP_FET_init.c b/Bios/src/fw/fet/FetInit/MSP_FET_init.c new file mode 100644 index 0000000..900c08d --- /dev/null +++ b/Bios/src/fw/fet/FetInit/MSP_FET_init.c @@ -0,0 +1,114 @@ +/* + * MSP_FET_init.c + * + * Copyright (C) 2014 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. + */ + + +#include "init.h" +#include "hw_compiler_specific.h" + +void init_BiosPorts(void) +{ + // Ports all back to reset state + P1DIR = 0; P2DIR = 0; P3DIR = 0; // Reset all ports direction to be inputs + P4DIR = 0; P5DIR = 0; P6DIR = 0; + P7DIR = 0; P8DIR = 0; P9DIR = 0; + P1SEL = 0; P2SEL = 0; P3SEL = 0; // Reset all ports alternate function + P4SEL = 0; P5SEL = 0; P6SEL = 0; + P7SEL = 0; P8SEL = 0; P9SEL = 0; + P1OUT = 0; P2OUT = 0; P3OUT = 0; // Reset all port output registers + P4OUT = 0; P5OUT = 0; P6OUT = 0; + P7OUT = 0; P8OUT = 0; P9OUT = 0; + + // Port2 + // P2.0 <- DCDC_PULSE + // P2.1 <- UART_RTS + // P2.2 -> CMD[0] + // P2.3 -> CMD[1] + // P2.4 -> CMD[2] + // P2.5 -> CMD[3] + // P2.6 -> WR_TRIG + // P2.7 -> SYS_CLK + //P2SEL = BIT0; + + // Port5 + // P5.0 -> VREF+ (output of reference voltage to ADC) + // P5.1 -> FPGA_RESET + // P5.2 -> VF2TEST_CTRL + // P5.3 -> LED1 + // P5.4 -> VF2TDI_CTRL + // P5.5 -> TDIOFF_CTRL (0 = turns off TDI, after that ok to select VF for fuse blowing) + // P5.6 <- MCU_DMAE0 / RD_TRIG (DMA trigger input) + // P5.7 -> DCDC_IO1 + P5DIR |= (BIT3 | BIT4 | BIT5 | BIT7); // set pins initially to output direction + //P5SEL = (BIT0); + P5OUT = (BIT5); + P5OUT &= ~BIT7; + + + // Port6 + // P6.0 <- A_VBUS5 (input to ADC channel A0) + // P6.1 <- A_VCC_SUPPLY + // P6.2 <- A_VF + // P6.3 <- A_VCC_SENSE0_TRGT + // P6.4 <- A_VCC_DT + // P6.5 <- A_VCC_DT_BSR + // P6.6 -> VCC_JTAGLDO2TRGT_CTRL + // P6.7 -> LED0 + P6DIR |= (BIT7); // set pins initially to output direction + //P6SEL = (BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); + + // Port7 + // P7.0 -> n/c + // P7.1 -> n/c + // P7.2 <- XT2IN + // P7.3 -> XT2OUT + // P7.4 -> DCDC_TEST + // P7.5 -> DCDC_RST (0 = reset) + // P7.6 -> VCC_DT_REF + // P7.7 -> VCC_DCDC_REF + P7DIR |= (BIT0+BIT1); // set pins initially to output direction + P7SEL |= (BIT6+BIT7); // set pins to alternate port function BIT2+BIT3 + + // Port8 + // P8.0 -> VCC_DT2TRGT_CTRL (control signal to switches to provide debug signals to target via JTAG.x) + // P8.1 -> IO_CTRL + // P8.2 -> UART_TXD + P8DIR |= BIT3; // set UART_TXD to output direction\r + // P8.3 <- UART_RXD + // P8.4 <- DCDC_IO0 + // P8.5 -> HOST_SDA + // P8.6 -> HOST_SCL + // P8.7 -> VCC_SUPPLY2TRGT_CTRL (DCDC VCC to target VCC) + P8DIR |= (BIT0+BIT7); // set pins initially to output direction +} diff --git a/Bios/src/fw/fet/FetInit/eZ_FET_init.c b/Bios/src/fw/fet/FetInit/eZ_FET_init.c new file mode 100644 index 0000000..bf8a032 --- /dev/null +++ b/Bios/src/fw/fet/FetInit/eZ_FET_init.c @@ -0,0 +1,70 @@ +/* + * MSP_FET_init.c + * + * Copyright (C) 2014 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. + */ +#include "init.h" +#include "hw_compiler_specific.h" + +void init_BiosPorts(void) +{ + // Ports all back to reset state + P1DIR = 0; P2DIR = 0; P3DIR = 0; // Reset all ports direction to be inputs + P4DIR = 0; P5DIR = 0; P6DIR = 0; + //P7DIR = 0; P8DIR = 0; + P1SEL = 0; P2SEL = 0; P3SEL = 0; // Reset all ports alternate function + P4SEL = 0; P5SEL = 0; P6SEL = 0; + //P7SEL = 0; P8SEL = 0; + P1OUT = 0; P2OUT = 0; P3OUT = 0; // Reset all port output registers + P4OUT = 0; P5OUT = 0; P6OUT = 0; + //P7OUT = 0; P8OUT = 0; + + //Port1 + //LED's + P1DIR = (BIT2+BIT3+BIT4); + + // Port5 + P5DIR = (BIT0); // set pins initially to output direction + P5SEL = (BIT0+BIT6); + + // Port6 + P6DIR = (BIT5); // set pins initially to output direction + P6SEL = (BIT0+BIT1+BIT2); + + // set PORT6.4 to input for SUB mcu current reculation + P6DIR &= ~BIT4; + + P6OUT &= ~(BIT6); // set Reset to 1 -> drive device reset + __delay_cycles(20000); + P6OUT = (BIT6); // release Reset start Sub MCU + P2REN |= BIT6; // enable pull down for RTS uart line +} diff --git a/Bios/src/fw/fet/FetInit/init.h b/Bios/src/fw/fet/FetInit/init.h new file mode 100644 index 0000000..b41096e --- /dev/null +++ b/Bios/src/fw/fet/FetInit/init.h @@ -0,0 +1,42 @@ +/* + * inti.h + * + * Copyright (C) 2014 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 INIT_H_ +#define INIT_H_ + +void init_BiosPorts(void); +void init_Clock(void); + +#endif /* INIT_H_ */ diff --git a/Bios/src/fw/fet/FetUsb.h b/Bios/src/fw/fet/FetUsb.h new file mode 100644 index 0000000..8a22e93 --- /dev/null +++ b/Bios/src/fw/fet/FetUsb.h @@ -0,0 +1,52 @@ +/* + * FetUsb.h + * + * Copyright (C) 2014 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. + */ + +#include "USB_API/USB_Common/device.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations +#include "USB_config/descriptors.h" +#include "USB_API/USB_Common/usb.h" // USB-specific functions +#include "USB_API/USB_CDC_API/UsbCdc.h" + +/*----- FetUsb.h -----*/ +#ifndef FetUSB_H +#define FetUSB_H + +typedef struct FET_USB_INFOS +{ + BYTE(*FetUSB_bytesInUSBBuffer)(BYTE intfNum); + BYTE(*FetUSB_receiveData)(BYTE* data, WORD size, BYTE intfNum); + BYTE(*FetUsb_CdcSendDataInBackground)(BYTE* dataBuf,WORD size,BYTE intfNum,ULONG ulTimeout); +}FET_USB_INFOS_t; +#endif diff --git a/Bios/src/fw/fet/FetVersion.h b/Bios/src/fw/fet/FetVersion.h new file mode 100644 index 0000000..736c675 --- /dev/null +++ b/Bios/src/fw/fet/FetVersion.h @@ -0,0 +1,61 @@ +/* + * FetVersion.h + * + * Holds Version number. + * + * Copyright (C) 2016 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. + */ + +#pragma once + +#define VERSION_MAJOR 3 +#define VERSION_MINOR 12 +#define VERSION_PATCH 0 +#define VERSION_BUILD 000 + +#define VERSION_MAJOR_CMP 3 +#define VERSION_MINOR_CMP 11 +#define VERSION_PATCH_CMP 0 +#define VERSION_BUILD_CMP 001 + +#define CORE_VERSION 0x1D + +#define COM_LAYER_VERSION 0x0009 +#define DCDC_LAYER_VERSION 0x0005 +#define MSP_FET_HIL_VERSION 0x0012 +#define EZ_FET_HIL_VERSION 0x000D + +#define COM_LAYER_VERSION_CMP 0x0009 +#define DCDC_LAYER_VERSION_CMP 0x0005 +#define MSP_FET_HIL_VERSION_CMP 0x0010 +#define EZ_FET_HIL_VERSION_CMP 0x000B + diff --git a/Bios/src/fw/fet/Fet_cStartUp/cstartup.s43 b/Bios/src/fw/fet/Fet_cStartUp/cstartup.s43 new file mode 100644 index 0000000..c773562 --- /dev/null +++ b/Bios/src/fw/fet/Fet_cStartUp/cstartup.s43 @@ -0,0 +1,417 @@ +/************************************************** + * + * System initialization code for the MSP430 IAR C/EC++ Compiler. + * + * Copyright © 2002-2008 IAR Systems AB. + * + * $Revision: 7961 $ + * + **************************************************/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +//#ifdef DISABLE_WATCHDOG + #include "msp430.h" +//#endif + + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + // The CPU40 warning is issued when a Jxx instruction is place + // at the end of a segment part. However, this case is safe, + // as we have control of what will be placed right after the + // instruction. + SUPPRESS_CPU40_WARNING + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + RSEG TLS16_I:DATA:NOROOT + RSEG TLS16_ID:CONST:NOROOT + +// --------------------------------------------------------- +// System initialization. +// + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +//#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +//#endif + + // -------------------- + // Initialize SP to point to the top of the stack. + // + MOV #SFE(CSTACK), SP + + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XXCALL __low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + XMOVROPIADDR SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XXCALL __data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + XMOVROPIADDR SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XXCALL __data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XXCALL __data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + XMOVROPIADDR SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XXCALL __data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XXCALL __data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + XMOVROPIADDR SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XXCALL __data20_memcpy + +#endif // IGNORE_DATA20_DATA + +#endif // MSP430X + + + // -------------------- + // Thread-local storage + // + + // + // Copy TLS16_ID to TLS16_I + // + + XRSEGCSTART + PUBLIC __cstart_init_tls + EXTERN __data16_memcpy + +__cstart_init_tls + MOV.W #SFB TLS16_I, CW0 + XMOVROPIADDR SFB TLS16_ID, CW1 + MOV.W #sizeof TLS16_I, CW2 + + XXCALL __data16_memcpy + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + + XMOVROPIADDR SFB DIFUNCT, CW0 + XMOVROPIADDR SFE DIFUNCT, CW1 + + XXCALL __call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN main + EXTERN exit + +?cstart_call_main: + XXCALL main + XXCALL exit + + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC16 __program_start + + ENDMOD + + +// --------------------------------------------------------- +// ?CPU30_OFFSET +// +// The compiler compensates for the CPU30 hardware bug by adding or +// subtracting the symbol ?CPU30_OFFSET from certain immediates. Here, +// it is defined to the default value zero (0), for when the device is +// not affected by CPU30. If the device is affected, the value must be +// set to two (2) using a linker command line override: +// +// -D?CPU30_OFFSET=2. +// +// The override is normally placed in the device-specific .xcl file. + + MODULE ?cpu30_offset + + PUBLIC ?CPU30_OFFSET + +?CPU30_OFFSET EQU 0 + + ENDMOD + + END diff --git a/Bios/src/fw/fet/HalGlobalVars.c b/Bios/src/fw/fet/HalGlobalVars.c new file mode 100644 index 0000000..56ec5a6 --- /dev/null +++ b/Bios/src/fw/fet/HalGlobalVars.c @@ -0,0 +1,82 @@ +/* + * HalGlobalVars.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHAL +//! \file HalGlobalVars.c +//! \brief +//! +//! \author Detlef Fink (03/10/2011) + +#include "hw_compiler_specific.h" +#include +#include "stream.h" +#include "hal.h" +#include "HalGlobalVars.h" + + +//extern unsigned char TCLK_saved; +#ifndef UNIX +extern struct stream_funcs *_stream_Funcs; +#endif +extern HAL_INFOS hal_infos_in_ram_; +extern unsigned char mclk_modules[32]; +extern unsigned short activeDevice; +extern unsigned char numOfDevices; +extern unsigned short TCE; +extern unsigned long _hal_mclkCntrl0; +extern unsigned long lAddr; +extern unsigned long lLen; +extern unsigned long lLenWBlk; +extern unsigned short ret_len; +extern DevicePowerSettings devicePowerSettings; +// ARM specific +extern unsigned long cswValues[4]; +extern ARMConfigSettings armConfigSettings; + +void globalVarsInit(void) +{ + memset(&hal_infos_in_ram_, 0, sizeof(HAL_INFOS)); + + //SyncJtagAssertPor_SaveContextXv2.c + memset(mclk_modules, 0, sizeof(mclk_modules)); + memset(cswValues, 0, sizeof(cswValues)); + armConfigSettings.scsBase = 0xE000E000; // Default location of the SCS + activeDevice = 0; + numOfDevices = 0; + TCE = 0; + _hal_mclkCntrl0 = 0x0417; + // Disable device power settings by default + memset(&devicePowerSettings, 0, sizeof(devicePowerSettings)); +} diff --git a/Bios/src/hal/HalGlobalVars.h b/Bios/src/fw/fet/HalGlobalVars.h similarity index 53% rename from Bios/src/hal/HalGlobalVars.h rename to Bios/src/fw/fet/HalGlobalVars.h index 5ad11cb..4574883 100644 --- a/Bios/src/hal/HalGlobalVars.h +++ b/Bios/src/fw/fet/HalGlobalVars.h @@ -1,100 +1,91 @@ /* * HalGlobalVars.h - * - * * - * Copyright (C) 2012 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 + * Copyright (C) 2013 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - //! \ingroup MODULHAL //! \file HalGlobalVars.h //! \brief //! //! \author Detlef Fink (03/10/2011) -// var addresses -// unsigned char -#define HAL_ADDR_VAR_TCLK_SAVED 0x1100 -// unsigned char[16] -#define HAL_ADDR_VAR_MCLK_MODULES 0x1102 -// *to_struc -#define HAL_ADDR_VAR_STREAM_FUNCS 0x1112 -// struct (10 Bytes) -#define HAL_ADDR_VAR_HAL_INFOS_IN_RAM 0x1114 +// var addresses +// unsigned char + +//#define HAL_ADDR_VAR_MCLK_MODULES 0x2402 // union (char) 32 Bytes -#define HAL_ADDR_VAR_CHAIN_CONFIGURATION 0x111E +//#define HAL_ADDR_VAR_CHAIN_CONFIGURATION 0x2424 // unsigned short -#define HAL_ADDR_VAR_ACTIVE_DEVICE 0x113E -// unsigned char -#define HAL_ADDR_VAR_NUM_OF_DEVICES 0x1140 +//#define HAL_ADDR_VAR_ACTIVE_DEVICE 0x2444 // unsigned char -#define HAL_ADDR_ENTI2TDO 0x1141 +//#define HAL_ADDR_VAR_NUM_OF_DEVICES 0x2446 // unsigned short -#define HAL_ADDR_VAR_TCE 0x1142 +//#define HAL_ADDR_VAR_TCE 0x2448 // unsigned short -#define HALL_ADDR_VAR_HAL_MCLK_CNTRL0 0x1144 +//#define HALL_ADDR_VAR_HAL_MCLK_CNTRL0 0x244C + + // 512 -#define HAL_ADDR_VAR_HAL_FUNCTION 0x1146 +//#define HAL_ADDR_VAR_HAL_FUNCTION 0x00244Eul +// *to_struc +//#define HAL_ADDR_VAR_STREAM_FUNCS 0x0025FEul +// 18 bytes +//#define HAL_ADDR_CONST_ETD_COMMON_METHODS 0x002602ul +// 12 bytes +//#define HAL_ADDR_VAR_EDT_DISTINCT_METHODS 0x002652ul +// struct (10 Bytes) +//#define HAL_ADDR_VAR_HAL_INFOS_IN_RAM 0x00268Aul + + // unsigned short -#define HAL_ADDR_VAR_QPROTOCOL_ID 0x1346 +//#define HAL_ADDR_VAR_QPROTOCOL_ID 0x2698 // unsigned short -#define HAL_ADDR_VAR_B_VCC_ON 0x134A +//#define HAL_ADDR_VAR_B_VCC_ON 0x269A // unsigned char* -#define HL_ADDR_JTAG_PORT_OUT 0x134C -// 12 bytes -#define HAL_ADDR_VAR_EDT_DISTINCT_METHODS 0x134E +//#define HL_ADDR_JTAG_PORT_OUT 0x269C // unsigned long -#define HAL_ADDR_VAR_DEVICE_FLAGS 0x136C +//#define HAL_ADDR_VAR_DEVICE_FLAGS 0x269E // unsigned char * -#define HAL_ADDR_TSTCTRL_PORT 0x1370 +//#define HAL_ADDR_TSTCTRL_PORT 0x26A0 // unsigned short -#define HAL_ADDR_VAR_DELAY_LOOP_US 0x1374 +//#define HAL_ADDR_VAR_DELAY_LOOP_US 0x26A2 // unsigned short -#define HAL_ADDR_VAR_DELAY_LOOP_MS 0x1378 -// 4 byte -#define HAL_ADDR_VAR_DEVICE_SETTINGS 0x137C -// 20byte -#define HAL_ADDR_VAR_DEVICE_POWER_SETTINGS 0x1382 -// unsigned char -#define HAL_ADDR_CURRENT_INSTR 0x1396 -// unsigned short -#define HAL_ADDR_VAR_ROM_FOR_CPU_READ 0x1398 +//#define HAL_ADDR_VAR_DELAY_LOOP_MS 0x26A4 +//#define HAL_ADDR_VAR_DEVICE_POWER_SETTINGS 0x26A6ul // const addresses // short[5] -#define HAL_ADDR_CONST_HAL_INFOS 0x253A +//#define HAL_ADDR_CONST_HAL_INFOS 0x0D020ul//0x0026CAul // 512 bytes -#define HAL_ADDR_CONST_HAL_FUNCTION_DEFAULTS 0x2544 -// 18 bytes -#define HAL_ADDR_CONST_ETD_COMMON_METHODS 0x2748 +//#define HAL_ADDR_CONST_HAL_FUNCTION_DEFAULTS 0x0E02Eul//0x0D02Eul//0x0026D8ul diff --git a/Bios/src/fw/fet/MemorySegments.h b/Bios/src/fw/fet/MemorySegments.h new file mode 100644 index 0000000..0ddd9e9 --- /dev/null +++ b/Bios/src/fw/fet/MemorySegments.h @@ -0,0 +1,100 @@ +/* + * MemorySegments.h + * + * Copyright (C) 2013 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. + */ + +// This header file defines the memory segments for each FET +// The values are used during the firmware update process + +// Info memory +// Used for storing firmware module specific information (e.g. signature, checksum) +// These segments stay the same for both, eZ-FET and MSP-FET +const unsigned long INFO_SEGMENTS_COMCHANNEL[] = {0x1980,0x19FF}; // INFOA +const unsigned long INFO_SEGMENTS_HAL[] ={0x1900, 0x197F}; // INFOB +const unsigned long INFO_SEGMENTS_HIL[] ={0x1880, 0x18FF}; // INFOC +const unsigned long INFO_SEGMENTS_DCDC[] ={0x1800, 0x187F}; // INFOD + + +// Checksum address for each firmware module +const unsigned long CHECKSUM_COMCHANNEL[] = {0x19FA, 0x19FB}; +const unsigned long CHECKSUM_HAL[] = {0x197A, 0x197B}; +const unsigned long CHECKSUM_HIL[] = {0x18FA, 0x18FB}; +const unsigned long CHECKSUM_DCDC[] = {0x187A, 0x187B}; +// Core checksum is not FET independent because it's not stored in INFO memory +// but rather on the beginning of the core segment + + +// Flash segments for each firmware module +#ifdef eZ_FET + // Core checksum is not FET independent because it's not stored in INFO memory + // but rather on the beginning of the core segment + const unsigned long CHECKSUM_CORE[] = {0x4402, 0x4403}; + + const unsigned long HAL_SEGMENTS[] = {0x0E000, 0x0FDFF, 0x10000, 0x1DFFF}; + const unsigned long HIL_SEGMENTS[] = {0x8A00, 0xDFFF}; + const unsigned long DCDC_SEGMENTS[] = {0x23000,0x243FF}; + const unsigned long COMCHANNEL_SEGMENTS[] = {0x21000,0x22FFF}; + const unsigned long CORE_SEGMENTS[] = {0x4400,0x89FF}; + const unsigned long CORE_SEGMENTS_RESET[] = {0xFF80,0xFFFF}; +#endif + +#ifdef MSP_FET + const unsigned long CHECKSUM_CORE[] = {0x8002, 0x8003}; + + const unsigned long HAL_SEGMENTS[] = {0x18E00, 0x30DFF}; + const unsigned long HAL_FPGA_SEGMENTS[] = {0x18E00, 0x45FFF}; + const unsigned long HIL_SEGMENTS[] = {0xCC00, 0xFDFF, 0x10000, 0x18DFF}; + const unsigned long DCDC_SEGMENTS[] = {0x47200,0x47FFF}; + const unsigned long COMCHANNEL_SEGMENTS[] = {0x46000,0x471FF}; + const unsigned long CORE_SEGMENTS[] = {0x8000,0xCBFF}; + const unsigned long CORE_SEGMENTS_RESET[] = {0xFE00,0xFFFF}; +#endif + + +// Segment types +// These are used during the update process to determine which segments to erase +// or write +const unsigned char NO_SEGMENT = 0; +const unsigned char INFO_SEGMENT_HIL = 1; +const unsigned char INFO_SEGMENT_HAL = 2; +const unsigned char HAL_SEGMENT = 3; +const unsigned char HIL_SEGMENT = 4; +const unsigned char INFO_SEGMENT_DCDC = 5; +const unsigned char DCDC_SEGMENT = 6; +const unsigned char INFO_SEGMENT_COMCHANNEL = 7; +const unsigned char COMCHANNEL_SEGMENT = 8; +const unsigned char HAL_SEGMENT_FPGA = 9; + +// Segment size of different memory parts (e.g. INFO memory, Flash memory) +const unsigned short SEGMENT_SIZE_INFO = 128; // Segment size in bytes of Flash +const unsigned short SEGMENT_SIZE_HAL_HIL = 512; // Segment size in bytes of Flash diff --git a/Bios/src/fw/fet/USB_API/USB_CDC_API/UsbCdc.c b/Bios/src/fw/fet/USB_API/USB_CDC_API/UsbCdc.c new file mode 100644 index 0000000..bc44e72 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_CDC_API/UsbCdc.c @@ -0,0 +1,1139 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== UsbCdc.c ======== + */ +#include + +#ifdef _CDC_ + + +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" //USB-specific Data Structures +#include "../USB_CDC_API/UsbCdc.h" +#include "hw_compiler_specific.h" + +#include + +//Local Macros +#define INTFNUM_OFFSET(X) (X - CDC0_INTFNUM) //Get the CDC offset + +static struct _CdcControl { + ULONG lBaudrate; + BYTE bDataBits; + BYTE bStopBits; + BYTE bParity; +} CdcControl[CDC_NUM_INTERFACES]; + +struct _CdcWrite CdcWriteCtrl[CDC_NUM_INTERFACES]; + +struct _CdcRead CdcReadCtrl[CDC_NUM_INTERFACES]; + +#ifdef BRIDGE_CDC_PRESENT + +static struct _CdcBridgeCtrl { + BYTE *uartRx; + BYTE *uartTx; + BYTE *uartIFG; + WORD *usbToUartDmaChSz; + WORD *usbToUartDmaChCtl; + BYTE ctsState; +} CdcBridgeCtrl; + +#endif + +extern WORD wUsbEventMask; + +//function pointers +extern VOID *(*USB_TX_memcpy)(VOID * dest, const VOID * source, size_t count); +extern VOID *(*USB_RX_memcpy)(VOID * dest, const VOID * source, size_t count); + + +/*----------------------------------------------------------------------------+ + | Global Variables | + +----------------------------------------------------------------------------*/ + +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[]; + + +VOID CdcResetData () +{ + int i; + + //indicates which buffer is used by host to transmit data via OUT endpoint3 - X buffer is first + //CdcReadCtrl[intfIndex].bCurrentBufferXY = X_BUFFER; + + memset(&CdcWriteCtrl, 0, sizeof(CdcWriteCtrl)); + memset(&CdcReadCtrl, 0, sizeof(CdcReadCtrl)); + memset(&CdcControl, 0, sizeof(CdcControl)); + + for (i = 0; i < CDC_NUM_INTERFACES; i++){ + CdcControl[i].bDataBits = 8; + } +} + +/* + * Sends data over interface intfNum, of size size and starting at address data. + * Returns: kUSBCDC_sendStarted + * kUSBCDC_sendComplete + * kUSBCDC_intfBusyError + */ +BYTE USBCDC_sendData (const BYTE* data, WORD size, BYTE intfNum) +{ + BYTE edbIndex; + WORD state; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (size == 0) + { + return (kUSBCDC_generalError); + } + + state = usbDisableInEndpointInterrupt(edbIndex); + + //do not access USB memory if suspended (PLL uce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)) + { + //data can not be read because of USB suspended + usbRestoreInEndpointInterrupt(state); //restore interrupt status + return (kUSBCDC_busNotAvailable); + } + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft != 0) + { + //the USB still sends previous data, we have to wait + usbRestoreInEndpointInterrupt(state); //restore interrupt status + return (kUSBCDC_intfBusyError); + } + + //This function generate the USB interrupt. The data will be sent out from interrupt + + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend = size; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft = size; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend = data; + + //trigger Endpoint Interrupt - to start send operation + USBIEPIFG |= 1 << (edbIndex + 1); //IEPIFGx; + + usbRestoreInEndpointInterrupt(state); + + return (kUSBCDC_sendStarted); +} + +#define EP_MAX_PACKET_SIZE_CDC 0x40 + +//this function is used only by USB interrupt +BOOL CdcToHostFromBuffer (BYTE intfNum) +{ + BYTE byte_count, nTmp2; + BYTE * pEP1; + BYTE * pEP2; + BYTE * pCT1; + BYTE * pCT2; + BYTE bWakeUp = FALSE; //TRUE for wake up after interrupt + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft == 0){ //do we have somtething to send? + if (!CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent){ //zero packet was not yet sent + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent = TRUE; + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend == + EP_MAX_PACKET_SIZE_CDC){ + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == + X_BUFFER){ + if (tInputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK){ + tInputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + = Y_BUFFER; //switch buffer + } + } else { + if (tInputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK){ + tInputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + = X_BUFFER; //switch buffer + } + } + } + + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend = 0; //nothing to send + + //call event callback function + if (wUsbEventMask & kUSB_sendCompletedEvent){ + bWakeUp = USBCDC_handleSendCompleted(intfNum); + } + } //if (!bSentZeroPacket) + + return (bWakeUp); + } + + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent = FALSE; //zero packet will be not sent: we have data + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can send over one endpoint buffer + byte_count = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > + EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : CdcWriteCtrl[ + INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft; + nTmp2 = *pCT1; + + if (nTmp2 & EPBCNT_NAK){ + USB_TX_memcpy(pEP1, CdcWriteCtrl[INTFNUM_OFFSET( + intfNum)].pUsbBufferToSend, + byte_count); //copy data into IEP3 X or Y buffer + *pCT1 = byte_count; //Set counter for usb In-Transaction + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; //switch buffer + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft -= byte_count; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend += byte_count; //move buffer pointer + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend = byte_count; + + //try to send data over second buffer + nTmp2 = *pCT2; + if ((CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > 0) && //do we have more data to send? + (nTmp2 & EPBCNT_NAK)){ //if the second buffer is free? + //how many byte we can send over one endpoint buffer + byte_count = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > + EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : + CdcWriteCtrl[ + INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft; + + USB_TX_memcpy(pEP2, CdcWriteCtrl[INTFNUM_OFFSET( + intfNum)].pUsbBufferToSend, + byte_count); //copy data into IEP3 X or Y buffer + *pCT2 = byte_count; //Set counter for usb In-Transaction + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; //switch buffer + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft -= + byte_count; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend += + byte_count; //move buffer pointer + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend = byte_count; + } + } + return (bWakeUp); +} + +/* + * Aborts an active send operation on interface intfNum. + * Returns the number of bytes that were sent prior to the abort, in size. + */ +BYTE USBCDC_abortSend (WORD* size, BYTE intfNum) +{ + BYTE edbIndex; + WORD state; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + state = usbDisableInEndpointInterrupt(edbIndex); //disable interrupts - atomic operation + + *size = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend - + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft); + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend = 0; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft = 0; + + usbRestoreInEndpointInterrupt(state); + return (kUSB_succeed); +} + +//This function copies data from OUT endpoint into user's buffer +//Arguments: +//pEP - pointer to EP to copy from +//pCT - pointer to pCT control reg +// +VOID CopyUsbToBuff (BYTE* pEP, BYTE* pCT, BYTE intfNum) +{ + BYTE nCount; + + //how many byte we can get from one endpoint buffer + nCount = + (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp) ? CdcReadCtrl[ + INTFNUM_OFFSET(intfNum)].nBytesInEp : CdcReadCtrl[INTFNUM_OFFSET( + intfNum)]. + nBytesToReceiveLeft; + + USB_RX_memcpy(CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer, pEP, nCount); //copy data from OEP3 X or Y buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft -= nCount; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer += nCount; //move buffer pointer + //to read rest of data next time from this place + + if (nCount == CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp){ //all bytes are copied from receive buffer? + //switch current buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; + + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + + //clear NAK, EP ready to receive data + *pCT = 0x00; + } else { + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp -= nCount; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = pEP + nCount; + } +} + +/* + * Receives data over interface intfNum, of size size, into memory starting at address data. + * Returns: + * kUSBCDC_receiveStarted if the receiving process started. + * kUSBCDC_receiveCompleted all requested date are received. + * kUSBCDC_receiveInProgress previous receive opereation is in progress. The requested receive operation can be not started. + * kUSBCDC_generalError error occurred. + */ +BYTE USBCDC_receiveData (BYTE* data, WORD size, BYTE intfNum) +{ + BYTE nTmp1; + BYTE edbIndex; + WORD state; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if ((size == 0) || //read size is 0 + (data == NULL)){ + return (kUSBCDC_generalError); + } + + state = usbDisableOutEndpointInterrupt(edbIndex); + //atomic operation - disable interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //data can not be read because of USB suspended + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_busNotAvailable); + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL){ //receive process already started + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_intfBusyError); + } + + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive = size; //bytes to receive + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft = size; //left bytes to receive + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = data; //set user receive buffer + + //read rest of data from buffer, if any + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0){ + //copy data from pEP-endpoint into User's buffer + CopyUsbToBuff(CdcReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + CdcReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1, intfNum); + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBCDC_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_receiveCompleted); //receive completed + } + + //check other EP buffer for data - exchange pCT1 with pCT2 + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 == + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX){ + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + } else { + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + } + + nTmp1 = *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + //try read data from second buffer + if (nTmp1 & EPBCNT_NAK){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + CopyUsbToBuff(CdcReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1, intfNum); + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBCDC_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_receiveCompleted); //receive completed + } + } //read rest of data from buffer, if any + + //read 'fresh' data, if available + nTmp1 = 0; + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //this is current buffer + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + //this is the active EP buffer + //pEP1 + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + nTmp1 = 1; //indicate that data is available + } + } else { //Y_BUFFER + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ + //this is the active EP buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + nTmp1 = 1; //indicate that data is available + } + } + + if (nTmp1){ + //how many byte we can get from one endpoint buffer + nTmp1 = *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + while (nTmp1 == 0) + { + nTmp1 = *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + } + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + + CopyUsbToBuff(CdcReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1, intfNum); + + nTmp1 = *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + //try read data from second buffer + if ((CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > + 0) && //do we have more data to send? + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + CopyUsbToBuff(CdcReadCtrl[INTFNUM_OFFSET( + intfNum)].pEP2, + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2, intfNum); + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + } + } + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBCDC_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_receiveCompleted); + } + + //interrupts enable + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_receiveStarted); +} + +//this function is used only by USB interrupt. +//It fills user receiving buffer with received data +BOOL CdcToBufferFromHost (BYTE intfNum) +{ + BYTE * pEP1; + BYTE nTmp1; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //do we have somtething to receive? + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + return (bWakeUp); + } + + //No data to receive... + if (!((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX | + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY) + & 0x80)){ + return (bWakeUp); + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can get from one endpoint buffer + nTmp1 = *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + + CopyUsbToBuff(pEP1, CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1, intfNum); + + nTmp1 = *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + //try read data from second buffer + if ((CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > 0) && //do we have more data to send? + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + CopyUsbToBuff(CdcReadCtrl[INTFNUM_OFFSET( + intfNum)].pEP2, + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2, intfNum); + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + } + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + bWakeUp |= USBCDC_handleReceiveCompleted(intfNum); + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp){ //Is not read data still available in the EP? + if (wUsbEventMask & kUSB_dataReceivedEvent){ + bWakeUp |= USBCDC_handleDataReceived(intfNum); + } + } + } + return (bWakeUp); +} + +//helper for USB interrupt handler +BOOL CdcIsReceiveInProgress (BYTE intfNum) +{ + return (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL); +} + +/* + * Aborts an active receive operation on interface intfNum. + * Returns the number of bytes that were received and transferred + * to the data location established for this receive operation. + */ +BYTE USBCDC_abortReceive (WORD* size, BYTE intfNum) +{ + //interrupts disable + BYTE edbIndex; + WORD state; + + edbIndex = stUsbHandle[intfNum].edb_Index; + state = usbDisableOutEndpointInterrupt(edbIndex); + + *size = 0; //set received bytes count to 0 + + //is receive operation underway? + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer){ + //how many bytes are already received? + *size = CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive - + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft; + + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft = 0; + } + + //restore interrupt status + usbRestoreOutEndpointInterrupt(state); + return (kUSB_succeed); +} + +/* + * This function rejects payload data that has been received from the host. + */ +BYTE USBCDC_rejectData (BYTE intfNum) +{ + BYTE edbIndex; + WORD state; + + edbIndex = stUsbHandle[intfNum].edb_Index; + state = usbDisableOutEndpointInterrupt(edbIndex); + + //atomic operation - disable interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if (bFunctionSuspended){ + usbRestoreOutEndpointInterrupt(state); + return (kUSBCDC_busNotAvailable); + } + + //Is receive operation underway? + //- do not flush buffers if any operation still active. + if (!CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer){ + BYTE tmp1 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK; + BYTE tmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK; + + if (tmp1 ^ tmp2){ //switch current buffer if any and only ONE of buffers + //is full + //switch current buffer + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; + } + + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; //flush buffer X + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0; //flush buffer Y + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; //indicates that no more data available in the EP + } + + usbRestoreOutEndpointInterrupt(state); + return (kUSB_succeed); +} + +/* + * This function indicates the status of the itnerface intfNum. + * If a send operation is active for this interface, + * the function also returns the number of bytes that have been transmitted to the host. + * If a receiver operation is active for this interface, the function also returns + * the number of bytes that have been received from the host and are waiting at the assigned address. + * + * returns kUSBCDC_waitingForSend (indicates that a call to USBCDC_SendData() + * has been made, for which data transfer has not been completed) + * + * returns kUSBCDC_waitingForReceive (indicates that a receive operation + * has been initiated, but not all data has yet been received) + * + * returns kUSBCDC_dataWaiting (indicates that data has been received + * from the host, waiting in the USB receive buffers) + */ +BYTE USBCDC_intfStatus (BYTE intfNum, WORD* bytesSent, WORD* bytesReceived) +{ + BYTE ret = 0; + WORD stateIn, stateOut; + BYTE edbIndex; + + *bytesSent = 0; + *bytesReceived = 0; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + stateIn = usbDisableInEndpointInterrupt(edbIndex); + stateOut = usbDisableOutEndpointInterrupt(edbIndex); + + //Is send operation underway? + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft != 0){ + ret |= kUSBCDC_waitingForSend; + *bytesSent = CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend - + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft; + } + + //Is receive operation underway? + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL){ + ret |= kUSBCDC_waitingForReceive; + *bytesReceived = CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive - + CdcReadCtrl[INTFNUM_OFFSET(intfNum)]. + nBytesToReceiveLeft; + } + else + { //receive operation not started + //do not access USB memory if suspended (PLL off). + //It may produce BUS_ERROR + if (!bFunctionSuspended) + { + if ((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK) | //any of buffers has a valid data packet + (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK)){ + ret |= kUSBCDC_dataWaiting; + } + } + } + + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //if suspended or not enumerated - report no other tasks pending + ret = kUSBCDC_busNotAvailable; + } + + //restore interrupt status + usbRestoreInEndpointInterrupt(stateIn); + usbRestoreOutEndpointInterrupt(stateOut); + + __no_operation(); + return (ret); +} + +/* + * Returns how many bytes are in the buffer are received and ready to be read. + */ +BYTE USBCDC_bytesInUSBBuffer (BYTE intfNum) +{ + BYTE bTmp1 = 0; + WORD state; + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + state = usbDisableOutEndpointInterrupt(edbIndex); + //atomic operation - disable interrupts + + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + usbRestoreOutEndpointInterrupt(state); + //if suspended or not enumerated - report 0 bytes available + return (0); + } + + if (CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0){ //If a RX operation is underway, part of data may + //was read of the OEP buffer + bTmp1 = CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp; + if (*CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & EPBCNT_NAK){ //the next buffer has a valid data packet + bTmp1 += *CdcReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F; + } + } else { + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + bTmp1 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & 0x7F; + } + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ //this buffer has a valid data packet + bTmp1 += tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & 0x7F; + } + } + + usbRestoreOutEndpointInterrupt(state); + return (bTmp1); +} + +//---------------------------------------------------------------------------- +//Line Coding Structure +//dwDTERate | 4 | Data terminal rate, in bits per second +//bCharFormat | 1 | Stop bits, 0 = 1 Stop bit, 1 = 1,5 Stop bits, 2 = 2 Stop bits +//bParityType | 1 | Parity, 0 = None, 1 = Odd, 2 = Even, 3= Mark, 4 = Space +//bDataBits | 1 | Data bits (5,6,7,8,16) +//---------------------------------------------------------------------------- +BYTE usbGetLineCoding (VOID) +{ + BYTE infIndex; + + if(tSetupPacket.wIndex % 2) + { + infIndex = (tSetupPacket.wIndex-1) / 2; + } + else + { + infIndex = (tSetupPacket.wIndex) / 2; + } + + abUsbRequestReturnData[6] = + CdcControl[infIndex].bDataBits; //Data bits = 8 + abUsbRequestReturnData[5] = + CdcControl[infIndex].bParity; //No Parity + abUsbRequestReturnData[4] = + CdcControl[infIndex].bStopBits; //Stop bits = 1 + + abUsbRequestReturnData[3] = + CdcControl[infIndex].lBaudrate >> 24; + abUsbRequestReturnData[2] = + CdcControl[infIndex].lBaudrate >> 16; + abUsbRequestReturnData[1] = + CdcControl[infIndex].lBaudrate >> 8; + abUsbRequestReturnData[0] = + CdcControl[infIndex].lBaudrate; + + wBytesRemainingOnIEP0 = 0x07; //amount of data to be send over EP0 to host + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); //send data to host + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetLineCoding (VOID) +{ + usbReceiveDataPacketOnEP0((PBYTE)&abUsbRequestIncomingData); //receive data over EP0 from Host + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetControlLineState (VOID) +{ + USBCDC_handleSetControlLineState((BYTE)tSetupPacket.wIndex, + (BYTE)tSetupPacket.wValue); + usbSendZeroLengthPacketOnIEP0(); //Send ZLP for status stage + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE Handler_SetLineCoding (VOID) +{ + BYTE bWakeUp; + volatile BYTE infIndex; + + if(tSetupPacket.wIndex % 2) + { + infIndex = (tSetupPacket.wIndex-1) / 2; + } + else + { + infIndex = (tSetupPacket.wIndex) / 2; + } + + //Baudrate Settings + + CdcControl[infIndex].lBaudrate = + (ULONG)abUsbRequestIncomingData[3] << 24 | + (ULONG)abUsbRequestIncomingData[2] << 16 | + (ULONG) + abUsbRequestIncomingData[1] << 8 | abUsbRequestIncomingData[0]; + bWakeUp = + USBCDC_handleSetLineCoding(tSetupPacket.wIndex, + CdcControl[infIndex].lBaudrate); + + return (bWakeUp); +} + +#ifdef BRIDGE_CDC_PRESENT + +BYTE USBCDC_setupDMA_Bridge() +{ + CdcBridgeCtrl.ctsState = 0; + switch (BRIDGE_UART_USCI_NUM) { + case 0: + CdcBridgeCtrl.uartRx = (BYTE *)&UCA0RXBUF; + CdcBridgeCtrl.uartTx = (BYTE *)&UCA0TXBUF; + CdcBridgeCtrl.uartIFG = (BYTE *)&UCA0IFG; + break; + case 1: + CdcBridgeCtrl.uartRx = (BYTE *)&UCA1RXBUF; + CdcBridgeCtrl.uartTx = (BYTE *)&UCA1TXBUF; + CdcBridgeCtrl.uartIFG = (BYTE *)&UCA1IFG; + break; + case 2: + CdcBridgeCtrl.uartRx = (BYTE *)&UCB0RXBUF; + CdcBridgeCtrl.uartTx = (BYTE *)&UCB0TXBUF; + CdcBridgeCtrl.uartIFG = (BYTE *)&UCB0IFG; + break; + case 3: + CdcBridgeCtrl.uartRx = (BYTE *)&UCB1RXBUF; + CdcBridgeCtrl.uartTx = (BYTE *)&UCB1TXBUF; + CdcBridgeCtrl.uartIFG = (BYTE *)&UCB1IFG; + break; + } + switch (BRIDGE_UART_TO_USB_DMA_CHAN) + { + case 0: + DMACTL0 = DMA0TSEL_16; + __data16_write_addr((unsigned short) &DMA0SA,(unsigned long)CdcBridgeCtrl.uartRx); + __data16_write_addr((unsigned short) &DMA0DA,(unsigned long)USBCDC_Bridge_getInEndpointBufferXAddr(CDC0_INTFNUM)); + DMA0SZ = 16; + DMA0CTL = DMADT_0 + DMADSTINCR_3 + DMASBDB + DMAEN + DMAIE; + break; + case 1: + DMACTL0 = DMA1TSEL_16; + __data16_write_addr((unsigned short) &DMA1SA,(unsigned long)CdcBridgeCtrl.uartRx); + __data16_write_addr((unsigned short) &DMA1DA,(unsigned long)USBCDC_Bridge_getInEndpointBufferXAddr(CDC0_INTFNUM)); + DMA1SZ = 16; + DMA1CTL = DMADT_0 + DMADSTINCR_3 + DMASBDB + DMAEN + DMAIE; + break; + case 2: + DMACTL1 = DMA2TSEL_16; + __data16_write_addr((unsigned short) &DMA2SA,(unsigned long)CdcBridgeCtrl.uartRx); + __data16_write_addr((unsigned short) &DMA2DA,(unsigned long)USBCDC_Bridge_getInEndpointBufferXAddr(CDC0_INTFNUM)); + DMA2SZ = 16; + DMA2CTL = DMADT_0 + DMADSTINCR_3 + DMASBDB + DMAEN + DMAIE; + break; + } + + switch (BRIDGE_USB_TO_UART_DMA_CHAN) + { + case 0: + CdcBridgeCtrl.usbToUartDmaChSz = (WORD *)&DMA0SZ; + CdcBridgeCtrl.usbToUartDmaChCtl = (WORD *)&DMA0CTL; + DMACTL0 = DMA0TSEL_17; + __data16_write_addr((unsigned short) &DMA0SA,(unsigned long)(USBCDC_Bridge_getOutEndpointBufferXAddr(CDC0_INTFNUM) + 1)); + __data16_write_addr((unsigned short) &DMA0DA,(unsigned long)CdcBridgeCtrl.uartTx); + break; + case 1: + CdcBridgeCtrl.usbToUartDmaChSz = (WORD *)&DMA1SZ; + CdcBridgeCtrl.usbToUartDmaChCtl = (WORD *)&DMA1CTL; + DMACTL0 = DMA1TSEL_17; + __data16_write_addr((unsigned short) &DMA1SA,(unsigned long)(USBCDC_Bridge_getOutEndpointBufferXAddr(CDC0_INTFNUM) + 1)); + __data16_write_addr((unsigned short) &DMA1DA,(unsigned long)CdcBridgeCtrl.uartTx); + break; + case 2: + CdcBridgeCtrl.usbToUartDmaChSz = (WORD *)&DMA2SZ; + CdcBridgeCtrl.usbToUartDmaChCtl = (WORD *)&DMA2CTL; + DMACTL1 = DMA2TSEL_17; + __data16_write_addr((unsigned short) &DMA2SA,(unsigned long)(USBCDC_Bridge_getOutEndpointBufferXAddr(CDC0_INTFNUM) + 1)); + __data16_write_addr((unsigned short) &DMA2DA,(unsigned long)CdcBridgeCtrl.uartTx); + break; + } + + return (TRUE); +} + +BYTE USBCDC_Bridge_sendData (WORD size, BYTE intfNum) +{ + BYTE edbIndex; + WORD state; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + state = usbDisableInEndpointInterrupt(edbIndex); + //atomic operation - disable interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //data can not be read because of USB suspended + usbRestoreInEndpointInterrupt(state); + return (kUSBCDC_busNotAvailable); + } + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft != 0){ + //the USB still sends previous data, we have to wait + usbRestoreInEndpointInterrupt(state); + return (kUSBCDC_intfBusyError); + } + + //This function generate the USB interrupt. The data will be sent out from interrupt + + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend = size; + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft = size; + + //trigger Endpoint Interrupt - to start send operation + USBIEPIFG |= 1 << (edbIndex + 1); //IEPIFGx; + + usbRestoreInEndpointInterrupt(state); + + return (kUSBCDC_sendStarted); +} + +//this function is used only by USB interrupt +BOOL CdcToHostFromBuffer_Bridge (BYTE intfNum) +{ + BYTE byte_count, nTmp2; + BYTE * pCT1; + BYTE bWakeUp = FALSE; //TRUE for wake up after interrupt + BYTE edbIndex; + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft == 0){ + return (bWakeUp); + } + + edbIndex = stUsbHandle[intfNum].edb_Index; + + //this is the active EP buffer + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } else { + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } + + //how many byte we can send over one endpoint buffer + byte_count = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > + EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : CdcWriteCtrl[ + INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft; + nTmp2 = *pCT1; + + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; + + if (nTmp2 & EPBCNT_NAK){ //copy data into IEP3 X or Y buffer + *pCT1 = byte_count; //Set counter for usb In-Transaction + CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft -= byte_count; + } + + return (bWakeUp); +} + +BYTE *USBCDC_Bridge_getInEndpointBufferXAddr(BYTE intfNum) { + return ((BYTE *)stUsbHandle[CDC0_INTFNUM].iep_X_Buffer); +} + +BYTE *USBCDC_Bridge_getInEndpointBufferYAddr(BYTE intfNum) { + return ((BYTE *)stUsbHandle[CDC0_INTFNUM].iep_Y_Buffer); +} + +BYTE *USBCDC_Bridge_getOutEndpointBufferXAddr(BYTE intfNum) { + return ((BYTE *)stUsbHandle[CDC0_INTFNUM].oep_X_Buffer); +} + +BYTE *USBCDC_Bridge_getOutEndpointBufferYAddr(BYTE intfNum) { + return ((BYTE *)stUsbHandle[CDC0_INTFNUM].oep_Y_Buffer); +} + +//this function is used only by USB interrupt. +//It fills user receiving buffer with received data +BOOL CdcToBufferFromHost_Bridge (BYTE intfNum) +{ + BYTE *pEP1, *pCT1; + BYTE nTmp1; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + BYTE i; + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + //No data to receive... + if (!((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & 0x80))){ + return (bWakeUp); + } + + if (CdcBridgeCtrl.ctsState == 0) { + return (bWakeUp); + } + + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + pCT1 = &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + __no_operation(); + __no_operation(); + + //how many byte we can get from endpoint buffer + nTmp1 = *pCT1; + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + CdcReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + + if (nTmp1 > 0) { + //Start DMA + if (nTmp1 > 5 ) { + //Start DMA + while (!(*CdcBridgeCtrl.uartIFG & UCTXIFG)); + *CdcBridgeCtrl.uartTx = *pEP1; + *CdcBridgeCtrl.usbToUartDmaChSz = nTmp1 - 1; // Block size + *CdcBridgeCtrl.usbToUartDmaChCtl = DMADT_0 + DMASRCINCR_3 + DMASBDB + DMAEN + DMAIE;// Rpt, inc src, enable + } + else { + for (i = 0; i < nTmp1; i++) { + while (!(*CdcBridgeCtrl.uartIFG & UCTXIFG)); // USCI_A0 TX buffer ready? + *CdcBridgeCtrl.uartTx = *pEP1++; // TX -> RXed character + } + *pCT1 = 0x00; + } + } + else { + *pCT1 = 0x00; + } + } + + return (bWakeUp); +} + +BYTE USBCDC_Bridge_completeReceiveData (BYTE intfNum) +{ + BYTE *pCT1; + BYTE edbIndex; + + DMA2CTL = 0; + edbIndex = stUsbHandle[intfNum].edb_Index; + pCT1 = &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + *pCT1 = 0x00; + + return (FALSE); +} + +void USBCDC_setCTS(BYTE state) +{ + CdcBridgeCtrl.ctsState = state; + CdcToBufferFromHost_Bridge(CDC0_INTFNUM); +} +#endif //BRIDGE_CDC_PRESENT + +#endif //ifdef _CDC_ + +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_CDC_API/UsbCdc.h b/Bios/src/fw/fet/USB_API/USB_CDC_API/UsbCdc.h new file mode 100644 index 0000000..831994d --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_CDC_API/UsbCdc.h @@ -0,0 +1,241 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== UsbCdc.h ======== + */ +#ifndef _UsbCdc_H_ +#define _UsbCdc_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +#define kUSBCDC_sendStarted 0x01 +#define kUSBCDC_sendComplete 0x02 +#define kUSBCDC_intfBusyError 0x03 +#define kUSBCDC_receiveStarted 0x04 +#define kUSBCDC_receiveCompleted 0x05 +#define kUSBCDC_receiveInProgress 0x06 +#define kUSBCDC_generalError 0x07 +#define kUSBCDC_busNotAvailable 0x08 + +struct _CdcWrite { + WORD nCdcBytesToSend; //holds counter of bytes to be sent + WORD nCdcBytesToSendLeft; //holds counter how many bytes is still to be sent + const BYTE* pUsbBufferToSend; //holds the buffer with data to be sent + BYTE bCurrentBufferXY; //is 0 if current buffer to write data is X, or 1 if current buffer is Y + BYTE bZeroPacketSent; //= FALSE; + BYTE last_ByteSend; +}; + +struct _CdcRead { + BYTE *pUserBuffer; //holds the current position of user's receiving buffer. If NULL- no receiving + //operation started + BYTE *pCurrentEpPos; //current positon to read of received data from curent EP + WORD nBytesToReceive; //holds how many bytes was requested by receiveData() to receive + WORD nBytesToReceiveLeft; //holds how many bytes is still requested by receiveData() to receive + BYTE * pCT1; //holds current EPBCTxx register + BYTE * pCT2; //holds next EPBCTxx register + BYTE * pEP2; //holds addr of the next EP buffer + BYTE nBytesInEp; //how many received bytes still available in current EP + BYTE bCurrentBufferXY; //indicates which buffer is used by host to transmit data via OUT endpoint3 +}; + + +/*---------------------------------------------------------------------------- + * These functions can be used in application + +----------------------------------------------------------------------------*/ + +/* + * Sends data over interface intfNum, of size size and starting at address data. + * Returns: kUSBCDC_sendStarted + * kUSBCDC_sendComplete + * kUSBCDC_intfBusyError + */ +BYTE USBCDC_sendData (const BYTE* data, WORD size, BYTE intfNum); + +/* + * Receives data over interface intfNum, of size size, into memory starting at address data. + */ +BYTE USBCDC_receiveData (BYTE* data, WORD size, BYTE intfNum); + +/* + * Aborts an active receive operation on interface intfNum. + * size: the number of bytes that were received and transferred + * to the data location established for this receive operation. + */ +BYTE USBCDC_abortReceive (WORD* size, BYTE intfNum); + + +#define kUSBCDC_noDataWaiting 1 //returned by USBCDC_rejectData() if no data pending + +/* + * This function rejects payload data that has been received from the host. + */ +BYTE USBCDC_rejectData (BYTE intfNum); + +/* + * Aborts an active send operation on interface intfNum. Returns the number of bytes that were sent prior to the abort, in size. + */ +BYTE USBCDC_abortSend (WORD* size, BYTE intfNum); + + +#define kUSBCDC_waitingForSend 0x01 +#define kUSBCDC_waitingForReceive 0x02 +#define kUSBCDC_dataWaiting 0x04 +#define kUSBCDC_busNotAvailable 0x08 +#define kUSB_allCdcEvents 0xFF + +/* + * This function indicates the status of the interface intfNum. + * If a send operation is active for this interface, + * the function also returns the number of bytes that have been transmitted to the host. + * If a receiver operation is active for this interface, the function also returns + * the number of bytes that have been received from the host and are waiting at the assigned address. + * + * returns kUSBCDC_waitingForSend (indicates that a call to USBCDC_SendData() + * has been made, for which data transfer has not been completed) + * + * returns kUSBCDC_waitingForReceive (indicates that a receive operation + * has been initiated, but not all data has yet been received) + * + * returns kUSBCDC_dataWaiting (indicates that data has been received + * from the host, waiting in the USB receive buffers) + */ +BYTE USBCDC_intfStatus (BYTE intfNum, WORD* bytesSent, WORD* bytesReceived); + +/* + * Returns how many bytes are in the buffer are received and ready to be read. + */ +BYTE USBCDC_bytesInUSBBuffer (BYTE intfNum); + +/*---------------------------------------------------------------------------- + * Event-Handling routines + +----------------------------------------------------------------------------*/ + +/* + * This event indicates that data has been received for interface intfNum, but no data receive operation is underway. + * returns TRUE to keep CPU awake + */ +BYTE USBCDC_handleDataReceived (BYTE intfNum); + +/* + * This event indicates that a send operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBCDC_handleSendCompleted (BYTE intfNum); + +/* + * This event indicates that a receive operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBCDC_handleReceiveCompleted (BYTE intfNum); + +/* + * Toggle state variable for CTS in USB Stack + */ +void USBCDC_setCTS(BYTE state); + +/* + * This event indicates that a SetLineCoding request was received from the host and new values + * for line coding paramters are available. + * + */ +BYTE USBCDC_handleSetLineCoding (BYTE intfNum, ULONG lBaudrate); + +/* + * This event indicates that a SetControlLineState request was received from the host. + * Basically new RTS and DTR states have been sent. Bit 0 of lineState is DTR and Bit 1 is RTS. + * + */ +BYTE USBCDC_handleSetControlLineState (BYTE intfNum, BYTE lineState); + +/*---------------------------------------------------------------------------- + * These functions is to be used ONLY by USB stack, and not by application + +----------------------------------------------------------------------------*/ + +/** + * Send a packet with the settings of the second uart back to the usb host + */ +BYTE usbGetLineCoding(VOID); + +/** + * Prepare EP0 to receive a packet with the settings for the second uart + */ +BYTE usbSetLineCoding(VOID); + +/** + * Function set or reset RTS + */ +BYTE usbSetControlLineState(VOID); + +/** + * Readout the settings (send from usb host) for the second uart + */ +BYTE Handler_SetLineCoding(VOID); + +/** + * sets up dma for CDC interface used as usb to uart bridge + */ +BYTE USBCDC_setupDMA_Bridge(); +/** + * sends data alread present in endpoint buffer + */ +BYTE USBCDC_Bridge_sendData (WORD size, BYTE intfNum); +/** + * gets address of input endpoint X + */ +BYTE *USBCDC_Bridge_getInEndpointBufferXAddr(BYTE intfNum); +/** + * gets address of input endpoint Y + */ +BYTE *USBCDC_Bridge_getInEndpointBufferYAddr(BYTE intfNum); +/** + * gets address of output endpoint X + */ +BYTE *USBCDC_Bridge_getOutEndpointBufferXAddr(BYTE intfNum); +/** + * gets address of output endpoint Y + */ +BYTE *USBCDC_Bridge_getOutEndpointBufferYAddr(BYTE intfNum); +/** + * completes receive operation once data from endpoint has been transmitted thru uart + */ +BYTE USBCDC_Bridge_completeReceiveData(BYTE intfNum); + + +#ifdef __cplusplus +} +#endif +#endif //_UsbCdc_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/UsbIsr.h b/Bios/src/fw/fet/USB_API/USB_Common/UsbIsr.h new file mode 100644 index 0000000..0fc71f2 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/UsbIsr.h @@ -0,0 +1,78 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== UsbIsr.h ======== + */ +#ifndef _ISR_H_ +#define _ISR_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * Handle incoming setup packet. + * returns TRUE to keep CPU awake + */ +BYTE SetupPacketInterruptHandler(VOID); + +/** + * Handle VBuss on signal. + */ +VOID PWRVBUSonHandler(VOID); + +/** + * Handle VBuss off signal. + */ +VOID PWRVBUSoffHandler(VOID); + +/** + * Handle In-requests from control pipe. + */ +VOID IEP0InterruptHandler(VOID); + +/** + * Handle Out-requests from control pipe. + */ +BYTE OEP0InterruptHandler(VOID); + +/*----------------------------------------------------------------------------+ + | End of header file | + +----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif +#endif /* _ISR_H_ */ + +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/defMSP430USB.h b/Bios/src/fw/fet/USB_API/USB_Common/defMSP430USB.h new file mode 100644 index 0000000..125f12e --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/defMSP430USB.h @@ -0,0 +1,184 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== defMSP430USB.h ======== + */ +#ifndef _defMSP430USB_H +#define _defMSP430USB_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*----------------------------------------------------------------------------+ + | Constant Definitions | + +----------------------------------------------------------------------------*/ +#define YES 1 +#define NO 0 + +#define TRUE 1 +#define FALSE 0 + +#define NOERR 0 +#define ERR 1 + +#define NO_ERROR 0 +#define ERROR 1 + +#define DISABLE 0 +#define ENABLE 1 + + +/*----------------------------------------------------------------------------+ + | USB Constants, Type Definition & Macro | + +----------------------------------------------------------------------------*/ + +//USB related Constant +#define MAX_ENDPOINT_NUMBER 0x07 //A maximum of 7 endpoints is available +#define EP0_MAX_PACKET_SIZE 0x08 +#define EP0_PACKET_SIZE 0x08 +#define EP_MAX_PACKET_SIZE 0x40 + +//Base addresses of transmit and receive buffers +#define OEP1_X_BUFFER_ADDRESS 0x1C00 //Input Endpoint 1 X Buffer Base-address +#define OEP1_Y_BUFFER_ADDRESS 0x1C40 //Input Endpoint 1 Y Buffer Base-address +#define IEP1_X_BUFFER_ADDRESS 0x1C80 //Output Endpoint 1 X Buffer Base-address +#define IEP1_Y_BUFFER_ADDRESS 0x1CC0 //Output Endpoint 1 Y Buffer Base-address + +#define OEP2_X_BUFFER_ADDRESS 0x1D00 //Input Endpoint 2 X Buffer Base-address +#define OEP2_Y_BUFFER_ADDRESS 0x1D40 //Input Endpoint 2 Y Buffer Base-address +#define IEP2_X_BUFFER_ADDRESS 0x1D80 //Output Endpoint 2 X Buffer Base-address +#define IEP2_Y_BUFFER_ADDRESS 0x1DC0 //Output Endpoint 2 Y Buffer Base-address + +#define OEP3_X_BUFFER_ADDRESS 0x1E00 //Input Endpoint 2 X Buffer Base-address +#define OEP3_Y_BUFFER_ADDRESS 0x1E40 //Input Endpoint 2 Y Buffer Base-address +#define IEP3_X_BUFFER_ADDRESS 0x1E80 //Output Endpoint 2 X Buffer Base-address +#define IEP3_Y_BUFFER_ADDRESS 0x1EC0 //Output Endpoint 2 Y Buffer Base-address + +#define OEP4_X_BUFFER_ADDRESS 0x1F00 //Input Endpoint 2 X Buffer Base-address +#define OEP4_Y_BUFFER_ADDRESS 0x1F40 //Input Endpoint 2 Y Buffer Base-address +#define IEP4_X_BUFFER_ADDRESS 0x1F80 //Output Endpoint 2 X Buffer Base-address +#define IEP4_Y_BUFFER_ADDRESS 0x1FC0 //Output Endpoint 2 Y Buffer Base-address + +#define OEP5_X_BUFFER_ADDRESS 0x2000 //Input Endpoint 2 X Buffer Base-address +#define OEP5_Y_BUFFER_ADDRESS 0x2040 //Input Endpoint 2 Y Buffer Base-address +#define IEP5_X_BUFFER_ADDRESS 0x2080 //Output Endpoint 2 X Buffer Base-address +#define IEP5_Y_BUFFER_ADDRESS 0x20C0 //Output Endpoint 2 Y Buffer Base-address + +#define OEP6_X_BUFFER_ADDRESS 0x2100 //Input Endpoint 2 X Buffer Base-address +#define OEP6_Y_BUFFER_ADDRESS 0x2140 //Input Endpoint 2 Y Buffer Base-address +#define IEP6_X_BUFFER_ADDRESS 0x2180 //Output Endpoint 2 X Buffer Base-address +#define IEP6_Y_BUFFER_ADDRESS 0x21C0 //Output Endpoint 2 Y Buffer Base-address + +#define OEP7_X_BUFFER_ADDRESS 0x2200 //Input Endpoint 2 X Buffer Base-address +#define OEP7_Y_BUFFER_ADDRESS 0x2240 //Input Endpoint 2 Y Buffer Base-address +#define IEP7_X_BUFFER_ADDRESS 0x2280 //Output Endpoint 2 X Buffer Base-address +#define IEP7_Y_BUFFER_ADDRESS 0x22C0 //Output Endpoint 2 Y Buffer Base-address + +#define X_BUFFER 0 +#define Y_BUFFER 1 + +//Macros for end point numbers +#define EP1 1 +#define EP2 2 +#define EP3 3 +#define EP4 4 +#define EP5 5 +#define EP6 6 +#define EP7 7 + +//addresses of pipes for endpoints +#define EP1_OUT_ADDR 0x01 //address for endpoint 1 +#define EP2_OUT_ADDR 0x02 //address for endpoint 2 +#define EP3_OUT_ADDR 0x03 //address for endpoint 3 +#define EP4_OUT_ADDR 0x04 //address for endpoint 4 +#define EP5_OUT_ADDR 0x05 //address for endpoint 5 +#define EP6_OUT_ADDR 0x06 //address for endpoint 6 +#define EP7_OUT_ADDR 0x07 //address for endpoint 7 + +//Input end points +#define EP1_IN_ADDR 0x81 //address for endpoint 1 +#define EP2_IN_ADDR 0x82 //address for endpoint 2 +#define EP3_IN_ADDR 0x83 //address for endpoint 3 +#define EP4_IN_ADDR 0x84 //address for endpoint 4 +#define EP5_IN_ADDR 0x85 //address for endpoint 5 +#define EP6_IN_ADDR 0x86 //address for endpoint 6 +#define EP7_IN_ADDR 0x87 //address for endpoint 7 + + +//EDB Data Structure +typedef struct _tEDB { + BYTE bEPCNF; //Endpoint Configuration + BYTE bEPBBAX; //Endpoint X Buffer Base Address + BYTE bEPBCTX; //Endpoint X Buffer byte Count + BYTE bSPARE0; //no used + BYTE bSPARE1; //no used + BYTE bEPBBAY; //Endpoint Y Buffer Base Address + BYTE bEPBCTY; //Endpoint Y Buffer byte Count + BYTE bEPSIZXY; //Endpoint XY Buffer Size +} tEDB, *tpEDB; + +typedef struct _tEDB0 { + BYTE bIEPCNFG; //Input Endpoint 0 Configuration Register + BYTE bIEPBCNT; //Input Endpoint 0 Buffer Byte Count + BYTE bOEPCNFG; //Output Endpoint 0 Configuration Register + BYTE bOEPBCNT; //Output Endpoint 0 Buffer Byte Count +} tEDB0, *tpEDB0; + +//EndPoint Desciptor Block Bits +#define EPCNF_USBIE 0x04 //USB Interrupt on Transaction Completion. Set By MCU + //0:No Interrupt, 1:Interrupt on completion +#define EPCNF_STALL 0x08 //USB Stall Condition Indication. Set by UBM + //0: No Stall, 1:USB Install Condition +#define EPCNF_DBUF 0x10 //Double Buffer Enable. Set by MCU + //0: Primary Buffer Only(x-buffer only), 1:Toggle Bit Selects Buffer + +#define EPCNF_TOGGLE 0x20 //USB Toggle bit. This bit reflects the toggle sequence bit of DATA0 and DATA1. + +#define EPCNF_UBME 0x80 //UBM Enable or Disable bit. Set or Clear by MCU. + //0:UBM can't use this endpoint + //1:UBM can use this endpoint +#define EPBCNT_BYTECNT_MASK 0x7F //MASK for Buffer Byte Count +#define EPBCNT_NAK 0x80 //NAK, 0:No Valid in buffer, 1:Valid packet in buffer + +//definitions for MSP430 USB-module +#define START_OF_USB_BUFFER 0x1C00 + +//input and output buffers for EP0 +#define USBIEP0BUF 0x2378 +#define USBOEP0BUF 0x2370 + +#ifdef __cplusplus +} +#endif +#endif /*_defMSP430USB_H */ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/device.h b/Bios/src/fw/fet/USB_API/USB_Common/device.h new file mode 100644 index 0000000..7870e21 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/device.h @@ -0,0 +1,73 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== device.h ======== + */ +#include + +#if defined (__MSP430F6638__) || defined (__MSP430F6637__) || \ + defined (__MSP430F6636__) || \ + defined (__MSP430F6635__) || defined (__MSP430F6634__) || \ + defined (__MSP430F6633__) || \ + defined (__MSP430F6632__) || defined (__MSP430F6631__) || \ + defined (__MSP430F6630__) || \ + defined (__MSP430F5638__) || defined (__MSP430F5637__) || \ + defined (__MSP430F5636__) || \ + defined (__MSP430F5635__) || defined (__MSP430F5634__) || \ + defined (__MSP430F5633__) || \ + defined (__MSP430F5632__) || defined (__MSP430F5631__) || \ + defined (__MSP430F5630__) + #define __MSP430F563x_F663x +#elif defined (__MSP430F5510__) || defined (__MSP430F5509__) || \ + defined (__MSP430F5508__) || \ + defined (__MSP430F5507__) || defined (__MSP430F5506__) || \ + defined (__MSP430F5505__) || \ + defined (__MSP430F5504__) || defined (__MSP430F5503__) || \ + defined (__MSP430F5502__) || \ + defined (__MSP430F5501__) || defined (__MSP430F5500__) + #define __MSP430F550x +#elif defined (__MSP430F5529__) || defined (__MSP430F5528__) || \ + defined (__MSP430F5527__) || \ + defined (__MSP430F5526__) || defined (__MSP430F5525__) || \ + defined (__MSP430F5524__) || \ + defined (__MSP430F5522__) || defined (__MSP430F5521__) || \ + defined (__MSP430F5519__) || \ + defined (__MSP430F5517__) || defined (__MSP430F5515__) || \ + defined (__MSP430F5514__) || \ + defined (__MSP430F5513__) + #define __MSP430F552x +#else + #error \ + Define a constant of format __MSP430Fxxxx__ within the projects preprocessor settings, +according to the device being used. +#endif +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/dma.c b/Bios/src/fw/fet/USB_API/USB_Common/dma.c new file mode 100644 index 0000000..e7b0b36 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/dma.c @@ -0,0 +1,185 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== dma.c ======== + */ +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/defMSP430USB.h" +#include +#include + +#ifdef __REGISTER_MODEL__ +/* for IAR */ +# if __REGISTER_MODEL__ == __REGISTER_MODEL_REG20__ +# define __DMA_ACCESS_REG__ (void __data20 *) +# else +# define __DMA_ACCESS_REG__ (unsigned short) +# endif +#else +/* for CCS */ +# define __DMA_ACCESS_REG__ (__SFR_FARPTR)(unsigned long) +#endif + +//function pointers +VOID *(*USB_TX_memcpy)(VOID * dest, const VOID * source, size_t count); +VOID *(*USB_RX_memcpy)(VOID * dest, const VOID * source, size_t count); + +VOID * memcpyDMA0 (VOID * dest, const VOID * source, size_t count); +VOID * memcpyDMA1 (VOID * dest, const VOID * source, size_t count); +VOID * memcpyDMA2 (VOID * dest, const VOID * source, size_t count); + +//NOTE: this functin works only with data in the area <64k (small memory model) +VOID * memcpyV (VOID * dest, const VOID * source, size_t count) +{ + WORD i; + volatile BYTE bTmp; + + for (i = 0; i < count; i++) + { + bTmp = *((BYTE*)source + i); + *((BYTE*)dest + i) = bTmp; + } + return (dest); +} + +//this function inits the DMA +VOID USB_initMemcpy (VOID) +{ + USB_TX_memcpy = memcpyV; + USB_RX_memcpy = memcpyV; + + switch (USB_DMA_CHAN) + { + case 0: + DMACTL0 &= ~DMA0TSEL_31; //DMA0 is triggered by DMAREQ + DMACTL0 |= DMA0TSEL_0; //DMA0 is triggered by DMAREQ + DMA0CTL = (DMADT_1 + DMASBDB + DMASRCINCR_3 + //configure block transfer (byte-wise) with increasing source + DMADSTINCR_3 ); //and destination address + DMACTL4 |= ENNMI; //enable NMI interrupt + USB_TX_memcpy = memcpyDMA0; + USB_RX_memcpy = memcpyDMA0; + break; + case 1: + DMACTL0 &= ~DMA1TSEL_31; //DMA1 is triggered by DMAREQ + DMACTL0 |= DMA1TSEL_0; //DMA1 is triggered by DMAREQ + DMA1CTL = (DMADT_1 + DMASBDB + DMASRCINCR_3 + //configure block transfer (byte-wise) with increasing source + DMADSTINCR_3 ); //and destination address + DMACTL4 |= ENNMI; //enable NMI interrupt + USB_TX_memcpy = memcpyDMA1; + USB_RX_memcpy = memcpyDMA1; + break; + case 2: + DMACTL0 &= ~DMA2TSEL_31; //DMA2 is triggered by DMAREQ + DMACTL0 |= DMA2TSEL_0; //DMA2 is triggered by DMAREQ + DMA2CTL = (DMADT_1 + DMASBDB + DMASRCINCR_3 + //configure block transfer (byte-wise) with increasing source + DMADSTINCR_3 ); //and destination address + DMACTL4 |= ENNMI; //enable NMI interrupt + USB_TX_memcpy = memcpyDMA2; + USB_RX_memcpy = memcpyDMA2; + break; + } +} + +//this functions starts DMA transfer to/from USB memory into/from RAM +//Using DMA0 +//Support only for data in <64k memory area. +VOID * memcpyDMA0 (VOID * dest, const VOID * source, size_t count) +{ + if (count == 0){ //do nothing if zero bytes to transfer + return (dest); + } + + DMA0DA = __DMA_ACCESS_REG__ dest; //set destination for DMAx + DMA0SA = __DMA_ACCESS_REG__ source; //set source for DMAx + DMA0SZ = count; //how many bytes to transfer + + DMA0CTL |= DMAEN; //enable DMAx + DMA0CTL |= DMAREQ; //trigger DMAx + + //wait for DMA transfer finished + while (!(DMA0CTL & DMAIFG)) ; + + DMA0CTL &= ~DMAEN; //disable DMAx + return (dest); +} + +//this functions starts DMA transfer to/from USB memory into/from RAM +//Using DMA1 +//Support only for data in <64k memory area. +VOID * memcpyDMA1 (VOID * dest, const VOID * source, size_t count) +{ + if (count == 0){ //do nothing if zero bytes to transfer + return (dest); + } + + DMA1DA = __DMA_ACCESS_REG__ dest; //set destination for DMAx + DMA1SA = __DMA_ACCESS_REG__ source; //set source for DMAx + DMA1SZ = count; //how many bytes to transfer + + DMA1CTL |= DMAEN; //enable DMAx + DMA1CTL |= DMAREQ; //trigger DMAx + + //wait for DMA transfer finished + while (!(DMA1CTL & DMAIFG)) ; + + DMA1CTL &= ~DMAEN; //disable DMAx + return (dest); +} + +//this functions starts DMA transfer to/from USB memory into/from RAM +//Using DMA2 +//Support only for data in <64k memory area. +VOID * memcpyDMA2 (VOID * dest, const VOID * source, size_t count) +{ + if (count == 0){ //do nothing if zero bytes to transfer + return (dest); + } + + DMA2DA = __DMA_ACCESS_REG__ dest; //set destination for DMAx + DMA2SA = __DMA_ACCESS_REG__ source; //set source for DMAx + DMA2SZ = count; //how many bytes to transfer + + DMA2CTL |= DMAEN; //enable DMAx + DMA2CTL |= DMAREQ; //trigger DMAx + + //wait for DMA transfer finished + while (!(DMA2CTL & DMAIFG)) ; + + DMA2CTL &= ~DMAEN; //disable DMAx + return (dest); +} + +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/types.h b/Bios/src/fw/fet/USB_API/USB_Common/types.h new file mode 100644 index 0000000..2819606 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/types.h @@ -0,0 +1,131 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== types.h ======== + */ +#ifndef _TYPES_H_ +#define _TYPES_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TI_COMPILER_VERSION__ +#define __no_init +#define __data16 +#endif + +/*----------------------------------------------------------------------------+ + | Include files | + +----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ + | Function Prototype | + +----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ + | Type Definition & Macro | + +----------------------------------------------------------------------------*/ +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef short SHORT; +typedef unsigned short USHORT; +typedef long LONG; +typedef unsigned long ULONG; +typedef void VOID; +typedef unsigned long HANDLE; +typedef char * PSTR; +typedef int BOOL; +typedef double DOUBLE; +typedef unsigned char BYTE; +typedef unsigned char* PBYTE; +typedef unsigned int WORD; +typedef unsigned long DWORD; +typedef unsigned long* PDWORD; + +#define SUCCESS 0 +#define FAILURE 1 +#define VOID void + +//DEVICE_REQUEST Structure +typedef struct _tDEVICE_REQUEST { + BYTE bmRequestType; //See bit definitions below + BYTE bRequest; //See value definitions below + WORD wValue; //Meaning varies with request type + WORD wIndex; //Meaning varies with request type + WORD wLength; //Number of bytes of data to transfer +} tDEVICE_REQUEST, *ptDEVICE_REQUEST; + +typedef struct _tDEVICE_REQUEST_COMPARE { + BYTE bmRequestType; //See bit definitions below + BYTE bRequest; //See value definitions below + BYTE bValueL; //Meaning varies with request type + BYTE bValueH; //Meaning varies with request type + BYTE bIndexL; //Meaning varies with request type + BYTE bIndexH; //Meaning varies with request type + BYTE bLengthL; //Number of bytes of data to transfer (LSByte) + BYTE bLengthH; //Number of bytes of data to transfer (MSByte) + BYTE bCompareMask; //MSB is bRequest, if set 1, bRequest should be matched + BYTE (*pUsbFunction)(VOID); //function pointer +} tDEVICE_REQUEST_COMPARE, *ptDEVICE_REQUEST_COMPARE; + +//---------------------------------------------------------------------------- +typedef enum { + STATUS_ACTION_NOTHING, + STATUS_ACTION_DATA_IN, + STATUS_ACTION_DATA_OUT +} tSTATUS_ACTION_LIST; + +typedef enum { + DISABLE, + ENABLE +} tSTATUS_EN_DISABLED; + +#define FALSE 0 +#define TRUE 1 + +/*----------------------------------------------------------------------------+ + | Constant Definition | + +----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------+ + | End of header file | + +----------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +#endif /* + * _TYPES_H_ + *------------------------ Nothing Below This Line -------------------------- + */ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/usb.c b/Bios/src/fw/fet/USB_API/USB_Common/usb.c new file mode 100644 index 0000000..09e644c --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/usb.c @@ -0,0 +1,1423 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== usb.c ======== + */ +/*----------------------------------------------------------------------------+ + | Include files | + +----------------------------------------------------------------------------*/ + +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" //USB-specific Data Structures +#include "../USB_CDC_API/UsbCdc.h" +#include "../USB_PHDC_API/UsbPHDC.h" +#include "../USB_HID_API/UsbHidReq.h" +#include "../USB_MSC_API/UsbMscScsi.h" +#include "hw_compiler_specific.h" +#include + +#include +#include +#include +#include "../USB_CDC_API/UsbCdc.h" + +/*----------------------------------------------------------------------------+ + | Internal Constant Definition | + +----------------------------------------------------------------------------*/ +#define NO_MORE_DATA 0xFFFF +#define EPBCT_NAK 0x80 +#define EPCNF_TOGLE 0x20 + +#define DIRECTION_IN 0x80 +#define DIRECTION_OUT 0x00 + +/*----------------------------------------------------------------------------+ + | Internal Variables | + +----------------------------------------------------------------------------*/ + +static BYTE bConfigurationNumber; //Set to 1 when USB device has been +//configured, set to 0 when unconfigured + +static BYTE bInterfaceNumber; //interface number + +WORD wBytesRemainingOnIEP0; //For endpoint zero transmitter only + //Holds count of bytes remaining to be + //transmitted by endpoint 0. A value + //of 0 means that a 0-length data packet + //A value of 0xFFFF means that transfer + //is complete. + +WORD wBytesRemainingOnOEP0; //For endpoint zero transmitter only + //Holds count of bytes remaining to be + //received by endpoint 0. A value + //of 0 means that a 0-length data packet + //A value of 0xFFFF means that transfer + //is complete. + +static PBYTE pbIEP0Buffer; //A buffer pointer to input end point 0 + //Data sent back to host is copied from + //this pointed memory location + +static PBYTE pbOEP0Buffer; //A buffer pointer to output end point 0 + //Data sent from host is copied to + //this pointed memory location + +static BYTE bHostAskMoreDataThanAvailable = 0; + +BYTE abUsbRequestReturnData[USB_RETURN_DATA_LENGTH]; +BYTE abUsbRequestIncomingData[USB_RETURN_DATA_LENGTH]; + +__no_init BYTE abramSerialStringDescriptor[34]; + +BYTE bStatusAction; +BYTE bFunctionSuspended = FALSE; //TRUE if function is suspended +BYTE bEnumerationStatus = 0; //is 0 if not enumerated + +static BYTE bRemoteWakeup; + +WORD wUsbEventMask; //used by USB_getEnabledEvents() and USB_setEnabledEvents() + +#ifdef _MSC_ +extern BYTE USBMSC_reset (void); +void MscResetData (); +extern struct _MscState MscState; +#endif + +#ifdef _CDC_ +extern struct _CdcWrite CdcWriteCtrl[CDC_NUM_INTERFACES]; +extern struct _CdcRead CdcReadCtrl[CDC_NUM_INTERFACES]; +#endif + +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + +extern const void *usbConfigurationDescriptors[]; +extern const void *usbDeviceDescriptors[]; +extern const BYTE usbConfigurationsSizes[]; +BYTE activeInterfaceIndex = 0; + +#endif + +/*----------------------------------------------------------------------------+ + | Global Variables | + +----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ + | Hardware Related Structure Definition | + +----------------------------------------------------------------------------*/ + +#ifdef __IAR_SYSTEMS_ICC__ + +#pragma location = 0x2380 +__no_init tDEVICE_REQUEST __data16 tSetupPacket; + +#pragma location = 0x0920 +__no_init tEDB0 __data16 tEndPoint0DescriptorBlock; + +#pragma location = 0x23C8 +__no_init tEDB __data16 tInputEndPointDescriptorBlock[7]; + +#pragma location = 0x2388 +__no_init tEDB __data16 tOutputEndPointDescriptorBlock[7]; + +#pragma location = 0x2378 +__no_init BYTE __data16 abIEP0Buffer[EP0_MAX_PACKET_SIZE]; + +#pragma location = 0x2370 +__no_init BYTE __data16 abOEP0Buffer[EP0_MAX_PACKET_SIZE]; + +#pragma location = OEP1_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp1[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP1_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp1[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP1_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp81[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP1_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp81[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP2_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp2[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP2_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp2[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP2_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp82[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP2_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp82[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP3_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp3[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP3_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp3[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP3_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp83[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP3_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp83[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP4_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp4[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP4_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp4[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP4_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp84[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP4_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp84[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP5_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp5[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP5_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp5[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP5_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp85[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP5_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp85[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP6_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp6[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP6_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp6[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP6_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp86[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP6_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp86[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP7_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp7[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP7_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp7[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP7_X_BUFFER_ADDRESS +__no_init BYTE __data16 pbXBufferAddressEp87[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP7_Y_BUFFER_ADDRESS +__no_init BYTE __data16 pbYBufferAddressEp87[EP_MAX_PACKET_SIZE]; + + + +#endif + +#ifdef __TI_COMPILER_VERSION__ +extern __no_init tDEVICE_REQUEST tSetupPacket; +extern __no_init tEDB0 tEndPoint0DescriptorBlock; +extern __no_init tEDB tInputEndPointDescriptorBlock[7]; +extern __no_init tEDB tOutputEndPointDescriptorBlock[7]; +extern __no_init BYTE abIEP0Buffer[EP0_MAX_PACKET_SIZE]; +extern __no_init BYTE abOEP0Buffer[EP0_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp1[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp1[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp81[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp81[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp2[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp2[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp82[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp82[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp3[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp3[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp83[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp83[EP_MAX_PACKET_SIZE]; + +extern __no_init BYTE pbXBufferAddressEp4[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp4[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp84[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp84[EP_MAX_PACKET_SIZE]; + +extern __no_init BYTE pbXBufferAddressEp5[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp5[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbXBufferAddressEp85[EP_MAX_PACKET_SIZE]; +extern __no_init BYTE pbYBufferAddressEp85[EP_MAX_PACKET_SIZE]; + +#endif + +VOID CdcResetData (); +VOID HidResetData (); +VOID PHDCResetData(); + +VOID USB_InitSerialStringDescriptor (VOID); +VOID USB_initMemcpy (VOID); + +//---------------------------------------------------------------------------- +BYTE USB_init (VOID) +{ + WORD bGIE = __get_SR_register() & GIE; //save interrupt status + + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //configuration of USB module + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + /* To fix USB9 enumeration issue seen by Matrox*/ + USBPWRCTL = 0; + + USBPHYCTL = PUSEL; //use DP and DM as USB terminals (not needed + //because an external PHY is connected to port + //9) + + USBPWRCTL = VUSBEN + SLDOAON; //enable primary and secondary LDO (3.3 and 1.8 + //V) + { + volatile unsigned int i; + for (i = 0; i < USB_MCLK_FREQ / 1000 * 5 / 10; i++){ //wait some time for LDOs (5ms delay) + } + } + + USBPWRCTL = VUSBEN + SLDOAON + VBONIE; //enable interrupt VBUSon + USBKEYPID = 0x9600; //access to configuration registers disabled + + //reset events mask + wUsbEventMask = 0; + + //init Serial Number +#if (USB_STR_INDEX_SERNUM != 0) + USB_InitSerialStringDescriptor(); +#endif + + //init memcpy() function: DMA or non-DMA + USB_initMemcpy(); +#ifdef _MSC_ + MscResetCtrlLun(); +#endif + +#ifdef BRIDGE_CDC_PRESENT + USBCDC_setupDMA_Bridge(); +#endif + + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +//---------------------------------------------------------------------------- +//This function will be compiled only if +#if (USB_STR_INDEX_SERNUM != 0) +VOID USB_InitSerialStringDescriptor (VOID) +{ + BYTE i,j,hexValue; + PBYTE pbSerNum; + BYTE bBytes; + + j = 1; //we start with second byte, first byte (lenght) + //will be filled later + pbSerNum = 0; + abramSerialStringDescriptor[j++] = DESC_TYPE_STRING; + + //TLV access Function Call + Get_TLV_Info(TLV_DIERECORD, 0, (uint8_t *)&bBytes, (uint16_t **)&pbSerNum); //The die record used for serial number + if (bBytes == 0){ //no serial number available + //use 00 as serial number = no serial number available + abramSerialStringDescriptor[0] = 4; //length + abramSerialStringDescriptor[j++] = 0; //no serial number available + abramSerialStringDescriptor[j++] = 0; //no serial number available + } else { + for (i = 0; (i < bBytes) && (i < 8); i++,pbSerNum++) + { + hexValue = (*pbSerNum & 0xF0) >> 4; + if (hexValue < 10){ + abramSerialStringDescriptor[j++] = (hexValue + '0'); + } else { abramSerialStringDescriptor[j++] = (hexValue + 55);} + abramSerialStringDescriptor[j++] = 0x00; //needed for UNI-Code + + hexValue = (*pbSerNum & 0x0F); + if (hexValue < 10){ + abramSerialStringDescriptor[j++] = (hexValue + '0'); + } else { abramSerialStringDescriptor[j++] = (hexValue + 55);} + abramSerialStringDescriptor[j++] = 0x00; //needed for UNI-Code + } + abramSerialStringDescriptor[0] = i * 4 + 2; //calculate the length + } +} + +#endif + +extern short BIOS_LedOn(unsigned char no); +extern short BIOS_LedOff(unsigned char no); + + +//---------------------------------------------------------------------------- + +BYTE USB_enable () +{ + volatile unsigned int i; + volatile unsigned int j = 0; + + if (!(USBPWRCTL & USBBGVBV)){ //check USB Bandgap and VBUS valid + return (kUSB_generalError); + } + + if ((USBCNF & USB_EN) && + (USBPLLCTL & UPLLEN)) + { + return (kUSB_succeed); //exit if PLL is already enalbed + } + + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + USBPLLDIVB = USB_XT_FREQ; //Settings desired frequency + + USBPLLCTL = UPFDEN + UPLLEN; //Select XT2 as Ref / Select PLL for USB / Discrim. + + //Wait some time till PLL is settled + do + { + USBPLLIR = 0x0000; //make sure no interrupts can occur on + //PLL-module +#ifdef __MSP430F6638 + //wait 1 ms till enable USB + for (i = 0; i < USB_MCLK_FREQ / 1000 * 1 / 10; i++){} +#else + //wait 1/2 ms till enable USB + for (i = 0; i < USB_MCLK_FREQ / 1000 * 1 / 2 / 10; i++){} +#endif + + if (j++ > 10) + { + USBKEYPID = 0x9600; //access to configuration registers disabled + return (kUSB_generalError); + } + } while (USBPLLIR != 0); + + USBCNF |= USB_EN; //enable USB module + USBKEYPID = 0x9600; //access to configuration registers disabled + return (kUSB_succeed); +} + +/* + * Disables the USB module and PLL. + */ +BYTE USB_disable (VOID) +{ + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + USBCNF = 0; //disable USB module + USBPLLCTL &= ~UPLLEN; //disable PLL + USBKEYPID = 0x9600; //access to configuration registers disabled + bEnumerationStatus = 0x00; //device is not enumerated + bFunctionSuspended = FALSE; //device is not suspended + return (kUSB_succeed); +} + +/* + * Enables/disables various USB events. + */ +BYTE USB_setEnabledEvents (WORD events) +{ + wUsbEventMask = events; + return (kUSB_succeed); +} + +/* + * Returns which events are enabled and which are disabled. + */ +WORD USB_getEnabledEvents () +{ + return (wUsbEventMask); +} + +/* + * Reset USB-SIE and global variables. + */ +BYTE USB_reset () +{ + int i; + + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + + //reset should be on the bus after this! + bEnumerationStatus = 0x00; //Device not enumerated yet + bFunctionSuspended = FALSE; //Device is not in suspend mode + + bRemoteWakeup = DISABLE; + + bConfigurationNumber = 0x00; //device unconfigured + bInterfaceNumber = 0x00; + + //FRSTE handling: + //Clear FRSTE in the RESRIFG interrupt service routine before re-configuring USB control registers. + //Set FRSTE at the beginning of SUSRIFG, SETUP, IEPIFG.EP0 and OEPIFG.EP0 interrupt service routines. + USBCTL = 0; //Function Reset Connection disable (FRSTE) + + wBytesRemainingOnIEP0 = NO_MORE_DATA; + wBytesRemainingOnOEP0 = NO_MORE_DATA; + bStatusAction = STATUS_ACTION_NOTHING; + + //The address reset normally will be done automatically during bus function reset + USBFUNADR = 0x00; //reset address of USB device (unconfigured) + + /* Set settings for EP0 */ + //NAK both 0 endpoints and enable endpoint 0 interrupt + tEndPoint0DescriptorBlock.bIEPBCNT = EPBCNT_NAK; + tEndPoint0DescriptorBlock.bOEPBCNT = EPBCNT_NAK; + tEndPoint0DescriptorBlock.bIEPCNFG = EPCNF_USBIE | EPCNF_UBME | EPCNF_STALL; //8 byte data packet + tEndPoint0DescriptorBlock.bOEPCNFG = EPCNF_USBIE | EPCNF_UBME | EPCNF_STALL; //8 byte data packet + + USBOEPIE = USB_OUTEP_INT_EN; + USBIEPIE = USB_INEP_INT_EN; + + //loop for initialization all of used enpoints + for (i = 0; + i < (CDC_NUM_INTERFACES + HID_NUM_INTERFACES + MSC_NUM_INTERFACES + PHDC_NUM_INTERFACES); + i++) + { + BYTE edbIndex = stUsbHandle[i].edb_Index; + + /* Set settings for IEPx */ + tInputEndPointDescriptorBlock[edbIndex].bEPCNF = EPCNF_USBIE | + EPCNF_UBME | + EPCNF_DBUF; //double buffering + tInputEndPointDescriptorBlock[edbIndex].bEPBBAX = + (BYTE)(((stUsbHandle[i].iep_X_Buffer - + START_OF_USB_BUFFER) >> 3) & 0x00ff); + tInputEndPointDescriptorBlock[edbIndex].bEPBBAY = + (BYTE)(((stUsbHandle[i].iep_Y_Buffer - + START_OF_USB_BUFFER) >> 3) & 0x00ff); + tInputEndPointDescriptorBlock[edbIndex].bEPBCTX = EPBCNT_NAK; + tInputEndPointDescriptorBlock[edbIndex].bEPBCTY = EPBCNT_NAK; + tInputEndPointDescriptorBlock[edbIndex].bEPSIZXY = MAX_PACKET_SIZE; + + /* Set settings for OEPx */ +#ifdef BRIDGE_CDC_PRESENT + if (i == BRIDGE_CDC_INTFNUM) { + tOutputEndPointDescriptorBlock[edbIndex].bEPCNF = EPCNF_USBIE | + EPCNF_UBME; + } + else + { + tOutputEndPointDescriptorBlock[edbIndex].bEPCNF = EPCNF_USBIE | + EPCNF_UBME | + EPCNF_DBUF ; //double buffering + } +#else + tOutputEndPointDescriptorBlock[edbIndex].bEPCNF = EPCNF_USBIE | + EPCNF_UBME | + EPCNF_DBUF ; //double buffering +#endif + + tOutputEndPointDescriptorBlock[edbIndex].bEPBBAX = + (BYTE)(((stUsbHandle[i].oep_X_Buffer - + START_OF_USB_BUFFER) >> 3) & 0x00ff); + tOutputEndPointDescriptorBlock[edbIndex].bEPBBAY = + (BYTE)(((stUsbHandle[i].oep_Y_Buffer - + START_OF_USB_BUFFER) >> 3) & 0x00ff); + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0x00; + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0x00; + tOutputEndPointDescriptorBlock[edbIndex].bEPSIZXY = MAX_PACKET_SIZE; + +# ifdef _CDC_ + /* Additional interrupt end point for CDC */ + if (stUsbHandle[i].dev_Class == CDC_CLASS){ + //The decriptor tool always generates the managemnet endpoint before the data endpoint + tInputEndPointDescriptorBlock[edbIndex - + 1].bEPCNF = EPCNF_USBIE | + EPCNF_UBME | EPCNF_DBUF; //double buffering + tInputEndPointDescriptorBlock[edbIndex - + 1].bEPBBAX = + (BYTE)(((stUsbHandle[i].intepEP_X_Buffer - + START_OF_USB_BUFFER) >> 3) & 0x00ff); + tInputEndPointDescriptorBlock[edbIndex - + 1].bEPBBAY = + (BYTE)(((stUsbHandle[i].intepEP_Y_Buffer - + START_OF_USB_BUFFER) >> 3) & 0x00ff); + tInputEndPointDescriptorBlock[edbIndex - 1].bEPBCTX = EPBCNT_NAK; + tInputEndPointDescriptorBlock[edbIndex - 1].bEPBCTY = EPBCNT_NAK; + tInputEndPointDescriptorBlock[edbIndex - + 1].bEPSIZXY = MAX_PACKET_SIZE; + } +# endif + } + +# ifdef _HID_ + HidResetData(); //reset HID specific data structures +# endif //_HID_ + +# ifdef _MSC_ + MscState.isMSCConfigured = FALSE; + USBMSC_reset(); + MscResetData(); +# endif + +# ifdef _CDC_ + CdcResetData(); //reset CDC specific data structures +# endif //_CDC_ + +# ifdef _PHDC_ + PHDCResetData(); // reset CDC specific data structures +# endif // _PHDC_ + + USBCTL = FEN; //enable function + USBIFG = 0; //make sure no interrupts are pending + + USBIE = SETUPIE | RSTRIE | SUSRIE; //enable USB specific interrupts (setup, reset, + //suspend) + USBKEYPID = 0x9600; //access to configuration registers disabled + return (kUSB_succeed); +} + +/* + * Instruct USB module to make itself available to the PC for connection, by pulling PUR high. + */ +BYTE USB_connect () +{ + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + USBCNF |= PUR_EN; //generate rising edge on DP -> the host + //enumerates our device as full speed device + USBPWRCTL |= VBOFFIE; //enable interrupt VUSBoff + USBKEYPID = 0x9600; //access to configuration registers disabled + + return (kUSB_succeed); +} + +/* + * Force a disconnect from the PC by pulling PUR low. + */ +BYTE USB_disconnect () +{ + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + USBCNF &= ~PUR_EN; //disconnect pull up resistor - logical + //disconnect from HOST + USBPWRCTL &= ~VBOFFIE; //disable interrupt VUSBoff + USBKEYPID = 0x9600; //access to configuration registers disabled + bEnumerationStatus = 0; //not enumerated + bFunctionSuspended = FALSE; //device is not suspended + return (kUSB_succeed); +} + +/* + * Force a remote wakeup of the USB host. + */ +BYTE USB_forceRemoteWakeup () +{ + if (bFunctionSuspended == FALSE) + { //device is not suspended + return (kUSB_NotSuspended); + } + if (bRemoteWakeup == ENABLE) + { + USBCTL |= RWUP; //USB - Device Remote Wakeup Request - this bit + //is self-cleaned + return (kUSB_succeed); + } + return (kUSB_generalError); +} + +/* + * Returns the status of the USB connection. + */ +BYTE USB_connectionInfo () +{ + BYTE retVal = 0; + + if (USBPWRCTL & USBBGVBV) + { + retVal |= kUSB_vbusPresent; + } + if (bEnumerationStatus == ENUMERATION_COMPLETE) + { + retVal |= kUSB_Enumerated; + } + if (USBCNF & PUR_EN) + { + retVal |= kUSB_purHigh; + } + if (bFunctionSuspended == TRUE) + { + retVal |= kUSB_suspended; + } + else + { + retVal |= kUSB_NotSuspended; + } + return (retVal); +} + +/* + * Returns the state of the USB connection. + */ +BYTE USB_connectionState () +{ + //If no VBUS present + if (!(USBPWRCTL & USBBGVBV)){ + return (ST_USB_DISCONNECTED); + } + + //If VBUS present, but PUR is low + if ((USBPWRCTL & USBBGVBV) && (!(USBCNF & PUR_EN))){ + return (ST_USB_CONNECTED_NO_ENUM); + } + + //If VBUS present, PUR is high, and enumeration is complete, and not suspended + if ((USBPWRCTL & USBBGVBV) && (USBCNF & PUR_EN) + && (bEnumerationStatus == ENUMERATION_COMPLETE) + && (!(bFunctionSuspended == TRUE))){ + return (ST_ENUM_ACTIVE); + } + + //If VBUS present, PUR is high, and enumeration is NOT complete, and suspended + if ((USBPWRCTL & USBBGVBV) && (USBCNF & PUR_EN) + && (!(bEnumerationStatus == ENUMERATION_COMPLETE)) + && (bFunctionSuspended == TRUE)){ + return (ST_NOENUM_SUSPENDED); + } + + //If VBUS present, PUR is high, and enumeration is complete, and suspended + if ((USBPWRCTL & USBBGVBV) && (USBCNF & PUR_EN) + && (bEnumerationStatus == ENUMERATION_COMPLETE) + && (bFunctionSuspended == TRUE)){ + return (ST_ENUM_SUSPENDED); + } + + //If VBUS present, PUR is high, but no enumeration yet + if ((USBPWRCTL & USBBGVBV) && (USBCNF & PUR_EN) + && (!(bEnumerationStatus == ENUMERATION_COMPLETE))){ + return (ST_ENUM_IN_PROGRESS); + } + + return (ST_ERROR); +} + +//---------------------------------------------------------------------------- + +BYTE USB_suspend (VOID) +{ + bFunctionSuspended = TRUE; + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to configuration registers enabled + USBCTL |= FRSTE; //Function Reset Connection Enable + USBIFG &= ~SUSRIFG; //clear interrupt flag + + USBPLLCTL &= ~UPLLEN; + + if (USB_DISABLE_XT_SUSPEND){ + if (USB_PLL_XT == 2){ + UCSCTL6 |= XT2OFF; //disable XT2 + } else { + UCSCTL6 |= XT1OFF; + } + } + + USBIE = RESRIE; //disable USB specific interrupts (setup, suspend, reset), enable resume. + //If the reset occured during device in suspend, the resume-interrupt will come, after - + //reset interrupt + USBKEYPID = 0x9600; //access to configuration registers disabled + + return (kUSB_succeed); +} + +//---------------------------------------------------------------------------- + +BYTE USB_resume (VOID) +{ + USB_enable(); //enable PLL + + USBIFG &= ~(RESRIFG | SUSRIFG); //clear interrupt flags + USBIE = SETUPIE | RSTRIE | SUSRIE; //enable USB specific interrupts (setup, reset, suspend) + + bFunctionSuspended = FALSE; + return (kUSB_succeed); +} + +//---------------------------------------------------------------------------- + +VOID usbStallEndpoint0 (VOID) +{ + tEndPoint0DescriptorBlock.bIEPCNFG |= EPCNF_STALL; + tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_STALL; +} + +//---------------------------------------------------------------------------- + +VOID usbClearOEP0ByteCount (VOID) +{ + tEndPoint0DescriptorBlock.bOEPBCNT = 0x00; +} + +//---------------------------------------------------------------------------- + +VOID usbStallOEP0 (VOID) +{ + //in standard USB request, there is not control write request with data stage + //control write, stall output endpoint 0 + //wLength should be 0 in all cases + tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_STALL; +} + +//---------------------------------------------------------------------------- + +VOID usbSendNextPacketOnIEP0 (VOID) +{ + BYTE bPacketSize,bIndex; + + //First check if there are bytes remaining to be transferred + if (wBytesRemainingOnIEP0 != NO_MORE_DATA){ + if (wBytesRemainingOnIEP0 > EP0_PACKET_SIZE){ + //More bytes are remaining than will fit in one packet + //there will be More IN Stage + bPacketSize = EP0_PACKET_SIZE; + wBytesRemainingOnIEP0 -= EP0_PACKET_SIZE; + bStatusAction = STATUS_ACTION_DATA_IN; + } else if (wBytesRemainingOnIEP0 < EP0_PACKET_SIZE){ + //The remaining data will fit in one packet. + //This case will properly handle wBytesRemainingOnIEP0 == 0 + bPacketSize = (BYTE)wBytesRemainingOnIEP0; + wBytesRemainingOnIEP0 = NO_MORE_DATA; //No more data need to be Txed + bStatusAction = STATUS_ACTION_NOTHING; + } else { + bPacketSize = EP0_PACKET_SIZE; + if (bHostAskMoreDataThanAvailable == TRUE){ + wBytesRemainingOnIEP0 = 0; + bStatusAction = STATUS_ACTION_DATA_IN; + } else { + wBytesRemainingOnIEP0 = NO_MORE_DATA; + bStatusAction = STATUS_ACTION_NOTHING; + } + } + + for (bIndex = 0; bIndex < bPacketSize; bIndex++) + { + abIEP0Buffer[bIndex] = *pbIEP0Buffer; + pbIEP0Buffer++; + } + tEndPoint0DescriptorBlock.bIEPBCNT = bPacketSize; + } else { + bStatusAction = STATUS_ACTION_NOTHING; + } +} + +//---------------------------------------------------------------------------- + +VOID usbSendDataPacketOnEP0 (PBYTE pbBuffer) +{ + WORD wTemp; + + pbIEP0Buffer = pbBuffer; + wTemp = tSetupPacket.wLength; + + //Limit transfer size to wLength if needed + //this prevent USB device sending 'more than require' data back to host + if (wBytesRemainingOnIEP0 >= wTemp){ + wBytesRemainingOnIEP0 = wTemp; + bHostAskMoreDataThanAvailable = FALSE; + } else { + bHostAskMoreDataThanAvailable = TRUE; + } + usbSendNextPacketOnIEP0(); +} + +//---------------------------------------------------------------------------- +VOID usbReceiveNextPacketOnOEP0 (VOID) +{ + BYTE bIndex,bByte; + + bByte = tEndPoint0DescriptorBlock.bOEPBCNT & EPBCNT_BYTECNT_MASK; + + if (wBytesRemainingOnOEP0 >= (WORD)bByte){ + for (bIndex = 0; bIndex < bByte; bIndex++) + { + *pbOEP0Buffer = abOEP0Buffer[bIndex]; + pbOEP0Buffer++; + } + wBytesRemainingOnOEP0 -= (WORD)bByte; + + //clear the NAK bit for next packet + if (wBytesRemainingOnOEP0 > 0){ + usbClearOEP0ByteCount(); + bStatusAction = STATUS_ACTION_DATA_OUT; + } else { + usbStallOEP0(); + bStatusAction = STATUS_ACTION_NOTHING; + } + } else { + usbStallOEP0(); + bStatusAction = STATUS_ACTION_NOTHING; + } +} + +//---------------------------------------------------------------------------- + +VOID usbReceiveDataPacketOnEP0 (PBYTE pbBuffer) +{ + pbOEP0Buffer = pbBuffer; + + wBytesRemainingOnOEP0 = tSetupPacket.wLength; + bStatusAction = STATUS_ACTION_DATA_OUT; + + usbClearOEP0ByteCount(); +} + +//---------------------------------------------------------------------------- + +VOID usbSendZeroLengthPacketOnIEP0 (VOID) +{ + wBytesRemainingOnIEP0 = NO_MORE_DATA; + bStatusAction = STATUS_ACTION_NOTHING; + tEndPoint0DescriptorBlock.bIEPBCNT = 0x00; +} + +//---------------------------------------------------------------------------- + +BYTE usbClearEndpointFeature (VOID) +{ + BYTE i; + BYTE bEndpointNumber; + + //EP is from EP1 to EP7 while C language start from 0 + bEndpointNumber = (tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM); + if (bEndpointNumber == 0x00){ + usbSendZeroLengthPacketOnIEP0(); + } else { + bEndpointNumber--; + if (bEndpointNumber < MAX_ENDPOINT_NUMBER){ + if ((tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) == + EP_DESC_ADDR_DIR_IN){ +#ifdef _MSC_ + if (!MscState.bMscResetRequired){ +#endif + tInputEndPointDescriptorBlock[bEndpointNumber].bEPCNF &= + ~(EPCNF_STALL | EPCNF_TOGGLE ); +#ifdef _MSC_ + } +#endif +# ifdef _MSC_ + if (stUsbHandle[MSC0_INTFNUM].edb_Index == bEndpointNumber){ + MscReadControl.bCurrentBufferXY = 0; //Set current buffer to X + MscState.bMcsCommandSupported = TRUE; + } +# endif +#ifdef _CDC_ + /* search to EP correspdonding IF */ + for(i = 0; i < CDC_NUM_INTERFACES; ++i) + { + if(stUsbHandle[i].edb_Index == bEndpointNumber) + { + CdcReadCtrl[i].bCurrentBufferXY = X_BUFFER; + break; + } + + } +#endif + } else { +#ifdef _MSC_ + if (!MscState.bMscResetRequired){ +#endif + tOutputEndPointDescriptorBlock[bEndpointNumber].bEPCNF &= + ~(EPCNF_STALL | EPCNF_TOGGLE ); +#ifdef _MSC_ + tOutputEndPointDescriptorBlock[bEndpointNumber].bEPBCTX = 0; + tOutputEndPointDescriptorBlock[bEndpointNumber].bEPBCTY = 0; + MscState.stallEndpoint = FALSE; +#endif +#ifdef _MSC_ + } +#endif +# ifdef _MSC_ + if (stUsbHandle[MSC0_INTFNUM].edb_Index == bEndpointNumber){ + MscWriteControl.bCurrentBufferXY = 0; //Set current buffer to X + MscState.bMcsCommandSupported = TRUE; + } +# endif +#ifdef _CDC_ + /* search to EP correspdonding IF */ + for(i = 0; i < CDC_NUM_INTERFACES; ++i) + { + if(stUsbHandle[i].edb_Index == bEndpointNumber) + { + CdcWriteCtrl[i].bCurrentBufferXY = X_BUFFER; + break; + } + + } +#endif + } + usbSendZeroLengthPacketOnIEP0(); + } + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetConfiguration (VOID) +{ + usbClearOEP0ByteCount(); //for status stage + wBytesRemainingOnIEP0 = 1; + usbSendDataPacketOnEP0((PBYTE)&bConfigurationNumber); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetDeviceDescriptor (VOID) +{ + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = SIZEOF_DEVICE_DESCRIPTOR; +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + usbSendDataPacketOnEP0((PBYTE)usbDeviceDescriptors[activeInterfaceIndex]); +#else + usbSendDataPacketOnEP0((PBYTE)&abromDeviceDescriptor); +#endif + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetConfigurationDescriptor (VOID) +{ + usbClearOEP0ByteCount(); +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + wBytesRemainingOnIEP0 = usbConfigurationsSizes[activeInterfaceIndex]; + usbSendDataPacketOnEP0((PBYTE)usbConfigurationDescriptors[activeInterfaceIndex]); +#else + wBytesRemainingOnIEP0 = sizeof(abromConfigurationDescriptorGroup); + usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroup); +#endif + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetStringDescriptor (VOID) +{ + WORD bIndex; + BYTE bVal = (BYTE)tSetupPacket.wValue; + + usbClearOEP0ByteCount(); //for status stage +#if (USB_STR_INDEX_SERNUM != 0) + + if (bVal == 0x03){ + wBytesRemainingOnIEP0 = abramSerialStringDescriptor[0]; + usbSendDataPacketOnEP0((PBYTE)&abramSerialStringDescriptor); + } else +#endif + { + bIndex = 0x00; + while (bVal-- > 0x00) bIndex += abromStringDescriptor[bIndex]; + wBytesRemainingOnIEP0 = abromStringDescriptor[bIndex]; + usbSendDataPacketOnEP0((PBYTE)&abromStringDescriptor[bIndex]); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetInterface (VOID) +{ + //not fully supported, return one byte, zero + usbClearOEP0ByteCount(); //for status stage + wBytesRemainingOnIEP0 = 0x02; + abUsbRequestReturnData[0] = 0x00; //changed to report alternative setting byte + abUsbRequestReturnData[1] = bInterfaceNumber; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetDeviceStatus (VOID) +{ +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + if ((((struct abromConfigurationDescriptorGroup *) + usbConfigurationDescriptors[activeInterfaceIndex])-> + abromConfigurationDescriptorGenric.mattributes & + CFG_DESC_ATTR_SELF_POWERED) == CFG_DESC_ATTR_SELF_POWERED){ + abUsbRequestReturnData[0] = DEVICE_STATUS_SELF_POWER; + } +#else + if ((abromConfigurationDescriptorGroup.abromConfigurationDescriptorGenric. + mattributes & + CFG_DESC_ATTR_SELF_POWERED) == CFG_DESC_ATTR_SELF_POWERED){ + abUsbRequestReturnData[0] = DEVICE_STATUS_SELF_POWER; + } +#endif + if (bRemoteWakeup == ENABLE){ + abUsbRequestReturnData[0] |= DEVICE_STATUS_REMOTE_WAKEUP; + } + usbClearOEP0ByteCount(); //for status stage + + //Return self power status and remote wakeup status + wBytesRemainingOnIEP0 = 2; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetInterfaceStatus (VOID) +{ + //check bIndexL for index number (not supported) + usbClearOEP0ByteCount(); //for status stage + + //Return two zero bytes + wBytesRemainingOnIEP0 = 2; + abUsbRequestReturnData[0] = 0x00; //changed to support multiple interfaces + abUsbRequestReturnData[1] = bInterfaceNumber; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetEndpointStatus (VOID) +{ + BYTE bEndpointNumber; + + //Endpoint number is bIndexL + bEndpointNumber = tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM; + if (bEndpointNumber == 0x00){ + if ((tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) == + EP_DESC_ADDR_DIR_IN){ + //input endpoint 0 + abUsbRequestReturnData[0] = + (BYTE)(tEndPoint0DescriptorBlock.bIEPCNFG & EPCNF_STALL); + } else { + //output endpoint 0 + abUsbRequestReturnData[0] = + (BYTE)(tEndPoint0DescriptorBlock.bOEPCNFG & EPCNF_STALL); + } + abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; //STALL is on bit 3 + usbClearOEP0ByteCount(); //for status stage + wBytesRemainingOnIEP0 = 0x02; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + } else { + bEndpointNumber--; + //EP is from EP1 to EP7 while C language start from 0 + //Firmware should NOT response if specified endpoint is not supported. (charpter 8) + if (bEndpointNumber < MAX_ENDPOINT_NUMBER){ + if (tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN){ + //input endpoint + abUsbRequestReturnData[0] = + (BYTE)(tInputEndPointDescriptorBlock[bEndpointNumber]. + bEPCNF & + EPCNF_STALL); + } else { + //output endpoint + abUsbRequestReturnData[0] = + (BYTE)(tOutputEndPointDescriptorBlock[bEndpointNumber]. + bEPCNF & + EPCNF_STALL); + } + } //no response if endpoint is not supported. + abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; //STALL is on bit 3 + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = 0x02; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- +BYTE usbSetAddress (VOID) +{ + usbStallOEP0(); //control write without data stage + + //bValueL contains device address + if (tSetupPacket.wValue < 128){ + //hardware will update the address after status stage + //therefore, firmware can set the address now. + USBFUNADR = tSetupPacket.wValue; + usbSendZeroLengthPacketOnIEP0(); + } else { + usbStallEndpoint0(); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetConfiguration (VOID) +{ + usbStallOEP0(); //control write without data stage + + //configuration number is in bValueL + //change the code if more than one configuration is supported + bConfigurationNumber = tSetupPacket.wValue; + usbSendZeroLengthPacketOnIEP0(); + + if (bConfigurationNumber == 1){ + bEnumerationStatus = ENUMERATION_COMPLETE; //set device as enumerated + } else { + bEnumerationStatus = 0; //device is not configured == config # is zero + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbClearDeviceFeature (VOID) +{ + //bValueL contains feature selector + if (tSetupPacket.wValue == FEATURE_REMOTE_WAKEUP){ + bRemoteWakeup = DISABLE; + usbSendZeroLengthPacketOnIEP0(); + } else { + usbStallEndpoint0(); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetDeviceFeature (VOID) +{ + //bValueL contains feature selector + if (tSetupPacket.wValue == FEATURE_REMOTE_WAKEUP){ + bRemoteWakeup = ENABLE; + usbSendZeroLengthPacketOnIEP0(); + } else { + usbStallEndpoint0(); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetEndpointFeature (VOID) +{ + BYTE bEndpointNumber; + + //wValue contains feature selector + //bIndexL contains endpoint number + //Endpoint number is in low byte of wIndex + if (tSetupPacket.wValue == FEATURE_ENDPOINT_STALL){ + bEndpointNumber = tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM; + if (bEndpointNumber == 0x00){ + usbSendZeroLengthPacketOnIEP0(); //do nothing for endpoint 0 + } else { + bEndpointNumber--; + //Firmware should NOT response if specified endpoint is not supported. (charpter 8) + if (bEndpointNumber < MAX_ENDPOINT_NUMBER){ + if (tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN){ + //input endpoint + tInputEndPointDescriptorBlock[bEndpointNumber].bEPCNF |= + EPCNF_STALL; + } else { + //output endpoint + tOutputEndPointDescriptorBlock[bEndpointNumber].bEPCNF |= + EPCNF_STALL; + } + usbSendZeroLengthPacketOnIEP0(); + } //no response if endpoint is not supported. + } + } else { + usbStallEndpoint0(); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetInterface (VOID) +{ + //bValueL contains alternative setting + //bIndexL contains interface number + //change code if more than one interface is supported + usbStallOEP0(); //control write without data stage + bInterfaceNumber = tSetupPacket.wIndex; +#ifdef _MSC_ + tInputEndPointDescriptorBlock[stUsbHandle[MSC0_INTFNUM].edb_Index].bEPCNF + &= ~(EPCNF_TOGGLE); + tOutputEndPointDescriptorBlock[stUsbHandle[MSC0_INTFNUM].edb_Index].bEPCNF + &= ~(EPCNF_TOGGLE); + MscReadControl.bCurrentBufferXY = 0; //Set current buffer to X + MscWriteControl.bCurrentBufferXY = 0; //Set current buffer to X +#endif + usbSendZeroLengthPacketOnIEP0(); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbInvalidRequest (VOID) +{ + //check if setup overwrite is set + //if set, do nothing since we might decode it wrong + //setup packet buffer could be modified by hardware if another setup packet + //was sent while we are deocding setup packet + if ((USBIFG & STPOWIFG) == 0x00){ + usbStallEndpoint0(); + } + + return (FALSE); +} + +typedef BYTE (*tpF)(VOID); + +BYTE usbDecodeAndProcessUsbRequest (VOID) +{ + BYTE bMask,bResult,bTemp; + const BYTE* pbUsbRequestList; + BYTE bWakeUp = FALSE; + ptDEVICE_REQUEST ptSetupPacket = &tSetupPacket; + BYTE bRequestType,bRequest; + tpF lAddrOfFunction; + + //point to beginning of the matrix + pbUsbRequestList = (PBYTE)&tUsbRequestList[0]; + + while (1) + { + bRequestType = *pbUsbRequestList++; + bRequest = *pbUsbRequestList++; + + if (((bRequestType == 0xff) && (bRequest == 0xff)) || + (tSetupPacket.bmRequestType == + (USB_REQ_TYPE_INPUT | USB_REQ_TYPE_VENDOR | + USB_REQ_TYPE_DEVICE)) || + (tSetupPacket.bmRequestType == + (USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_VENDOR | + USB_REQ_TYPE_DEVICE))){ + pbUsbRequestList -= 2; + break; + } + + if ((bRequestType == tSetupPacket.bmRequestType) && + (bRequest == tSetupPacket.bRequest)){ + //compare the first two + bResult = 0xc0; + bMask = 0x20; + //first two bytes matched, compare the rest + for (bTemp = 2; bTemp < 8; bTemp++) + { + if (*((BYTE*)ptSetupPacket + bTemp) == *pbUsbRequestList){ + bResult |= bMask; + } + pbUsbRequestList++; + bMask = bMask >> 1; + } + //now we have the result + if ((*pbUsbRequestList & bResult) == *pbUsbRequestList){ + pbUsbRequestList -= 8; + break; + } else { + pbUsbRequestList += (sizeof(tDEVICE_REQUEST_COMPARE) - 8); + } + } else { + pbUsbRequestList += (sizeof(tDEVICE_REQUEST_COMPARE) - 2); + } + } + + //if another setup packet comes before we have the chance to process current + //setup request, we return here without processing the request + //this check is not necessary but still kept here to reduce response(or simulation) time + + if ((USBIFG & STPOWIFG) != 0x00){ + return (bWakeUp); + } + + //now we found the match and jump to the function accordingly. + lAddrOfFunction = + ((tDEVICE_REQUEST_COMPARE*)pbUsbRequestList)->pUsbFunction; + + //call function + bWakeUp = (*lAddrOfFunction)(); + + //perform enumeration complete event: + //when SetAddress was called and USBADDR is not zero + if ((lAddrOfFunction == &usbSetAddress) && (USBFUNADR != 0)){ + bWakeUp = USB_handleEnumCompleteEvent(); + } + return (bWakeUp); +} + +WORD usbDisableInEndpointInterrupt(BYTE edbIndex) +{ + WORD state; + //_DISABLE_UART(); + state = USBIEPIE & (1 << (edbIndex + 1)); + USBIEPIE &= ~(1 << (edbIndex + 1)); + return (state); +} +VOID usbRestoreInEndpointInterrupt(WORD state) +{ + USBIEPIE |= state; +} +WORD usbDisableOutEndpointInterrupt(BYTE edbIndex) +{ + WORD state; + //_DISABLE_UART(); + state = USBOEPIE & (1 << (edbIndex + 1)); + USBOEPIE &= ~(1 << (edbIndex + 1)); + return (state); +} +VOID usbRestoreOutEndpointInterrupt(WORD state) +{ + USBOEPIE |= state; +} +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + +BYTE USB_switchInterface(BYTE interfaceIndex) +{ + if (interfaceIndex < NONCOMP_NUM_USB_INTERFACES) { + activeInterfaceIndex = interfaceIndex; + return (TRUE); + } + else { + return (FALSE); + } +} + +#endif +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_Common/usb.h b/Bios/src/fw/fet/USB_API/USB_Common/usb.h new file mode 100644 index 0000000..df70fa9 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_Common/usb.h @@ -0,0 +1,483 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== usb.h ======== + */ +#ifndef _USB_H_ +#define _USB_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*----------------------------------------------------------------------------+ + | Constant Definition | + +----------------------------------------------------------------------------*/ +#define USB_RETURN_DATA_LENGTH 8 +#define SIZEOF_DEVICE_REQUEST 0x08 + +//Bit definitions for DEVICE_REQUEST.bmRequestType +//Bit 7: Data direction +#define USB_REQ_TYPE_OUTPUT 0x00 //0 = Host sending data to device +#define USB_REQ_TYPE_INPUT 0x80 //1 = Device sending data to host + +//Bit 6-5: Type +#define USB_REQ_TYPE_MASK 0x60 //Mask value for bits 6-5 +#define USB_REQ_TYPE_STANDARD 0x00 //00 = Standard USB request +#define USB_REQ_TYPE_CLASS 0x20 //01 = Class specific +#define USB_REQ_TYPE_VENDOR 0x40 //10 = Vendor specific + +//Bit 4-0: Recipient +#define USB_REQ_TYPE_RECIP_MASK 0x1F //Mask value for bits 4-0 +#define USB_REQ_TYPE_DEVICE 0x00 //00000 = Device +#define USB_REQ_TYPE_INTERFACE 0x01 //00001 = Interface +#define USB_REQ_TYPE_ENDPOINT 0x02 //00010 = Endpoint +#define USB_REQ_TYPE_OTHER 0x03 //00011 = Other + +//Values for DEVICE_REQUEST.bRequest +//Standard Device Requests +#define USB_REQ_GET_STATUS 0 +#define USB_REQ_CLEAR_FEATURE 1 +#define USB_REQ_SET_FEATURE 3 +#define USB_REQ_SET_ADDRESS 5 +#define USB_REQ_GET_DESCRIPTOR 6 +#define USB_REQ_SET_DESCRIPTOR 7 +#define USB_REQ_GET_CONFIGURATION 8 +#define USB_REQ_SET_CONFIGURATION 9 +#define USB_REQ_GET_INTERFACE 10 +#define USB_REQ_SET_INTERFACE 11 +#define USB_REQ_SYNCH_FRAME 12 + +//CDC CLASS Requests +#define USB_CDC_GET_LINE_CODING 0x21 +#define USB_CDC_SET_LINE_CODING 0x20 +#define USB_CDC_SET_CONTROL_LINE_STATE 0x22 + +//HID CLASS Requests +#define USB_HID_REQ 0x81 +#define USB_REQ_GET_REPORT 0x01 +#define USB_REQ_GET_IDLE 0x02 +#define USB_REQ_SET_REPORT 0x09 +#define USB_REQ_SET_IDLE 0x0A +#define USB_REQ_SET_PROTOCOL 0x0B +#define USB_REQ_GET_PROTOCOL 0x03 + +//MSC CLASS Requests +#define USB_MSC_RESET_BULK 0xFF +#define USB_MSC_GET_MAX_LUN 0xFE + +// PHDC CLASS Requests +#define USB_PHDC_GET_STATUS 0x00 + +//HID Values for HID Report Types (tSetup.bValueH) +#define USB_REQ_HID_INPUT 0x01 +#define USB_REQ_HID_OUTPUT 0x02 +#define USB_REQ_HID_FEATURE 0x03 + +#define USB_REQ_HID_BOOT_PROTOCOL 0x00 +#define USB_REQ_HID_REPORT_PROTOCOL 0x01 + + +//Descriptor Type Values +#define DESC_TYPE_DEVICE 1 //Device Descriptor (Type 1) +#define DESC_TYPE_CONFIG 2 //Configuration Descriptor (Type 2) +#define DESC_TYPE_STRING 3 //String Descriptor (Type 3) +#define DESC_TYPE_INTERFACE 4 //Interface Descriptor (Type 4) +#define DESC_TYPE_ENDPOINT 5 //Endpoint Descriptor (Type 5) +#define DESC_TYPE_DEVICE_QUALIFIER 6 //Endpoint Descriptor (Type 6) +#define DESC_TYPE_IAD 0x0B +#define DESC_TYPE_HUB 0x29 //Hub Descriptor (Type 6) +#define DESC_TYPE_HID 0x21 //HID Descriptor +#define DESC_TYPE_REPORT 0x22 //Report Descriptor +#define DESC_TYPE_PHYSICAL 0x23 //Physical Descriptor + +//Feature Selector Values +#define FEATURE_REMOTE_WAKEUP 1 //Remote wakeup (Type 1) +#define FEATURE_ENDPOINT_STALL 0 //Endpoint stall (Type 0) + +//Device Status Values +#define DEVICE_STATUS_REMOTE_WAKEUP 0x02 +#define DEVICE_STATUS_SELF_POWER 0x01 + +//Maximum descriptor size +#define MAX_DESC_SIZE 256 + +//DEVICE_DESCRIPTOR structure +#define SIZEOF_DEVICE_DESCRIPTOR 0x12 +#define OFFSET_DEVICE_DESCRIPTOR_VID_L 0x08 +#define OFFSET_DEVICE_DESCRIPTOR_VID_H 0x09 +#define OFFSET_DEVICE_DESCRIPTOR_PID_L 0x0A +#define OFFSET_DEVICE_DESCRIPTOR_PID_H 0x0B +#define OFFSET_CONFIG_DESCRIPTOR_POWER 0x07 +#define OFFSET_CONFIG_DESCRIPTOR_CURT 0x08 + +//CONFIG_DESCRIPTOR structure +#define SIZEOF_CONFIG_DESCRIPTOR 0x09 + +//HID DESCRIPTOR structure +//#define SIZEOF_HID_DESCRIPTOR 0x09 + +//Bit definitions for CONFIG_DESCRIPTOR.bmAttributes +#define CFG_DESC_ATTR_SELF_POWERED 0x40 //Bit 6: If set, device is self powered +#define CFG_DESC_ATTR_BUS_POWERED 0x80 //Bit 7: If set, device is bus powered +#define CFG_DESC_ATTR_REMOTE_WAKE 0x20 //Bit 5: If set, device supports remote wakeup + +//INTERFACE_DESCRIPTOR structure +#define SIZEOF_INTERFACE_DESCRIPTOR 0x09 + +//ENDPOINT_DESCRIPTOR structure +#define SIZEOF_ENDPOINT_DESCRIPTOR 0x07 + +//Bit definitions for EndpointDescriptor.EndpointAddr +#define EP_DESC_ADDR_EP_NUM 0x0F //Bit 3-0: Endpoint number +#define EP_DESC_ADDR_DIR_IN 0x80 //Bit 7: Direction of endpoint, 1/0 = In/Out + +//Bit definitions for EndpointDescriptor.EndpointFlags +#define EP_DESC_ATTR_TYPE_MASK 0x03 //Mask value for bits 1-0 +#define EP_DESC_ATTR_TYPE_CONT 0x00 //Bit 1-0: 00 = Endpoint does control transfers +#define EP_DESC_ATTR_TYPE_ISOC 0x01 //Bit 1-0: 01 = Endpoint does isochronous transfers +#define EP_DESC_ATTR_TYPE_BULK 0x02 //Bit 1-0: 10 = Endpoint does bulk transfers +#define EP_DESC_ATTR_TYPE_INT 0x03 //Bit 1-0: 11 = Endpoint does interrupt transfers + +//Definition to indicate valid/invalid data +#define DATA_VALID 1 +#define DATA_INVALID 0 + +extern __no_init tDEVICE_REQUEST __data16 tSetupPacket; +extern __no_init BYTE __data16 abIEP0Buffer[]; +extern __no_init BYTE __data16 abOEP0Buffer[]; +extern __no_init BYTE __data16 pbXBufferAddressEp1[]; +extern __no_init BYTE __data16 pbYBufferAddressEp1[]; +extern __no_init BYTE __data16 pbXBufferAddressEp81[]; +extern __no_init BYTE __data16 pbYBufferAddressEp81[]; +extern __no_init BYTE __data16 pbXBufferAddressEp2[]; +extern __no_init BYTE __data16 pbYBufferAddressEp2[]; +extern __no_init BYTE __data16 pbXBufferAddressEp82[]; +extern __no_init BYTE __data16 pbYBufferAddressEp82[]; + +extern __no_init BYTE __data16 pbXBufferAddressEp3[]; +extern __no_init BYTE __data16 pbYBufferAddressEp3[]; +extern __no_init BYTE __data16 pbXBufferAddressEp83[]; +extern __no_init BYTE __data16 pbYBufferAddressEp83[]; + +extern __no_init BYTE __data16 pbXBufferAddressEp4[]; +extern __no_init BYTE __data16 pbYBufferAddressEp4[]; +extern __no_init BYTE __data16 pbXBufferAddressEp84[]; +extern __no_init BYTE __data16 pbYBufferAddressEp84[]; + +extern __no_init BYTE __data16 pbXBufferAddressEp5[]; +extern __no_init BYTE __data16 pbYBufferAddressEp5[]; +extern __no_init BYTE __data16 pbXBufferAddressEp85[]; +extern __no_init BYTE __data16 pbYBufferAddressEp85[]; + + +extern __no_init BYTE __data16 pbXBufferAddressEp6[]; +extern __no_init BYTE __data16 pbYBufferAddressEp6[]; +extern __no_init BYTE __data16 pbXBufferAddressEp86[]; +extern __no_init BYTE __data16 pbYBufferAddressEp86[]; + +extern __no_init BYTE __data16 pbXBufferAddressEp7[]; +extern __no_init BYTE __data16 pbYBufferAddressEp7[]; +extern __no_init BYTE __data16 pbXBufferAddressEp87[]; +extern __no_init BYTE __data16 pbYBufferAddressEp87[]; + +extern WORD wBytesRemainingOnIEP0; +extern WORD wBytesRemainingOnOEP0; +extern BYTE abUsbRequestReturnData[]; +extern BYTE abUsbRequestIncomingData[]; +extern BYTE bEnumerationStatus; +extern BYTE bFunctionSuspended; + +//Function return values +#define kUSB_succeed 0x00 +#define kUSB_generalError 0x01 +#define kUSB_notEnabled 0x02 +//#define kUSB_VbusNotPresent 0x03 + +//return values USB_connectionInfo(), USB_connect() +#define kUSB_vbusPresent 0x01 +#define kUSB_busActive 0x02 //frame sync packets are being received +#define kUSB_ConnectNoVBUS 0x04 +#define kUSB_suspended 0x08 +#define kUSB_NotSuspended 0x10 +#define kUSB_Enumerated 0x20 +#define kUSB_purHigh 0x40 + +//Parameters for function USB_setEnabledEvents() +#define kUSB_clockFaultEvent 0x0001 +#define kUSB_VbusOnEvent 0x0002 +#define kUSB_VbusOffEvent 0x0004 +#define kUSB_UsbResetEvent 0x0008 +#define kUSB_UsbSuspendEvent 0x0010 +#define kUSB_UsbResumeEvent 0x0020 +#define kUSB_dataReceivedEvent 0x0040 +#define kUSB_sendCompletedEvent 0x0080 +#define kUSB_receiveCompletedEvent 0x0100 +#define kUSB_allUsbEvents 0x01FF + +//USB connection states +#define ST_USB_DISCONNECTED 0x80 +#define ST_USB_CONNECTED_NO_ENUM 0x81 +#define ST_ENUM_IN_PROGRESS 0x82 +#define ST_ENUM_ACTIVE 0x83 +#define ST_ENUM_SUSPENDED 0x84 +//#define ST_FAILED_ENUM 0x85 +#define ST_ERROR 0x86 +#define ST_NOENUM_SUSPENDED 0x87 + +VOID usbStallInEndpoint(BYTE); +VOID usbStallOutEndpoint(BYTE); +VOID usbStallEndpoint(BYTE); +VOID usbClearOEPByteCount(BYTE); + + +/*---------------------------------------------------------------------------- + * These functions can be used in application + +----------------------------------------------------------------------------*/ + +/* + * MSP430 USB Module Management functions + */ + +/** + * Init the USB HW interface. + */ +BYTE USB_init(VOID); + +/** + * Init and start the USB PLL. + */ +BYTE USB_enable (); + +/** + * Disables the USB module and PLL. + */ +BYTE USB_disable(VOID); + +/* + * Enables/disables various USB events. + */ +BYTE USB_setEnabledEvents (WORD events); + +/* + * Returns which events are enabled and which are disabled. + */ +WORD USB_getEnabledEvents (); + +/* + * Instruct USB module to make itself available to the PC for connection, by pulling PUR high. + */ +BYTE USB_connect (); + +/* + * Force a disconnect from the PC by pulling PUR low. + */ +BYTE USB_disconnect (); + +/** + * Reset USB-SIE and global variables. + */ +BYTE USB_reset (); + +/** + * Suspend USB. + */ +BYTE USB_suspend(VOID); + +/** + * Resume USB. + */ +BYTE USB_resume(VOID); + +/* + * Force a remote wakeup of the USB host. + * This method can be generated only if device supports + * remote wake-up feature in some of its configurations. + * The method wakes-up the USB bus only if wake-up feature is enabled by the host. + */ +BYTE USB_forceRemoteWakeup (); + +/* + * Returns the status of the USB connection. + */ +BYTE USB_connectionInfo (); + +/* + * Returns the state of the USB connection. + */ +BYTE USB_connectionState (); + +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES +/* + * Switch to a different USB configuration. Used only for non-composite devices with multiple configuratons. + */ +BYTE USB_switchInterface(BYTE interfaceIndex); + +#endif + +/* + * Event-Handling routines + */ + +/* + * If this function gets executed, it's a sign that the output of the USB PLL has failed. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleClockEvent (); + +/* + * If this function gets executed, it indicates that a valid voltage has just been applied to the VBUS pin. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleVbusOnEvent (); + +/* + * If this function gets executed, it indicates that a valid voltage has just been removed from the VBUS pin. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleVbusOffEvent (); + +/* + * If this function gets executed, it indicates that the USB host has issued a USB reset event to the device. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleResetEvent (); + +/* + * If this function gets executed, it indicates that the USB host has chosen to suspend this device after a period of active + * operation. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleSuspendEvent (); + +/* + * If this function gets executed, it indicates that the USB host has chosen to resume this device after a period of suspended + * operation. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleResumeEvent (); + +/* + * If this function gets executed, it indicates that the USB host has enumerated this device : + * after host assigned the address to the device. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleEnumCompleteEvent (); + +/** + * Send stall handshake for in- and out-endpoint0 (control pipe) + */ +VOID usbStallEndpoint0(VOID); + +/** + * Clear byte counter for endpoint0 (control pipe) + */ +VOID usbClearOEP0ByteCount(VOID); + +/** + * Send stall handshake for out-endpoint0 (control pipe) + */ +VOID usbStallOEP0(VOID); + +/** + * Send further data over control pipe if needed. + * Function is called from control-in IRQ. Do not call from user application + */ +VOID usbSendNextPacketOnIEP0(VOID); + +/** + * Send data over control pipe to host. + * Number of bytes to transmit should be set with + * global varible "wBytesRemainingOnIEP0" before function is called. + */ +VOID usbSendDataPacketOnEP0 (PBYTE pbBuffer); + +/** + * Receive further data from control pipe if needed. + * Function is called from control-out IRQ. Do not call from user application + */ +VOID usbReceiveNextPacketOnOEP0(VOID); + +/** + * Receive data from control pipe. + * Number of bytes to receive should be set with + * global varible "wBytesRemainingOnOEP0" before function is called. + */ +VOID usbReceiveDataPacketOnEP0 (PBYTE pbBuffer); + +/** + * Send zero length packet on control pipe. + */ +VOID usbSendZeroLengthPacketOnIEP0(VOID); + +/*Send data to host.*/ +BYTE MscSendData (const BYTE* data, WORD size); + +/** + * Decode incoming usb setup packet and call corresponding function + * usbDecodeAndProcessUsbRequest is called from IRQ. Do not call from user application + */ +BYTE usbDecodeAndProcessUsbRequest(VOID); +BYTE usbClearEndpointFeature(VOID); +BYTE usbGetConfiguration(VOID); +BYTE usbGetDeviceDescriptor(VOID); +BYTE usbGetConfigurationDescriptor(VOID); +BYTE usbGetStringDescriptor(VOID); +BYTE usbGetInterface(VOID); +BYTE usbGetDeviceStatus(VOID); +BYTE usbGetEndpointStatus(VOID); +BYTE usbGetInterfaceStatus(VOID); +BYTE usbSetAddress(VOID); +BYTE usbSetConfiguration(VOID); +BYTE usbClearDeviceFeature(VOID); +BYTE usbSetDeviceFeature(VOID); +BYTE usbSetEndpointFeature(VOID); +BYTE usbSetInterface(VOID); +BYTE usbInvalidRequest(VOID); +WORD usbDisableInEndpointInterrupt(BYTE edbIndex); +VOID usbRestoreInEndpointInterrupt(WORD state); +WORD usbDisableOutEndpointInterrupt(BYTE edbIndex); +VOID usbRestoreOutEndpointInterrupt(WORD state); + +#define ENUMERATION_COMPLETE 0x01 + +/*----------------------------------------------------------------------------+ + | End of header file | + +----------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +#endif /* + * _USB_H + *------------------------ Nothing Below This Line -------------------------- + */ diff --git a/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHid.c b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHid.c new file mode 100644 index 0000000..9b0d525 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHid.c @@ -0,0 +1,920 @@ +//(c)2009 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (HID Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbHid.c, File Version 1.00 2009/12/03 | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2009/02/20 ported from CdcHid | + | RSTO 2009/05/19 updated USBHID_intfStatus() | + | RSTO 2009/05/26 added USBHID_bytesInUSBBuffer() | + | RSTO 2009/05/28 changed USBHID_sendData() | + | RSTO 2009/06/09 updated USBHID_bytesInUSBBuffer() | + | MSP/Biju 2009/10/21 Changes for composite support | + | RSTO 2009/10/21 move __disable_interrupt() before | + | checking for suspend | + +----------------------------------------------------------------------------*/ + +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" //USB-specific Data Structures +#include "UsbHid.h" +#include +#include + +#ifdef _HID_ + +//function pointers +extern VOID *(*USB_TX_memcpy)(VOID * dest, const VOID * source, size_t count); +extern VOID *(*USB_RX_memcpy)(VOID * dest, const VOID * source, size_t count); + +//Local Macros +#define INTFNUM_OFFSET(X) (X - HID0_INTFNUM) //Get the HID offset + +extern BYTE const report_len_input[HID_NUM_INTERFACES]; + +static struct _HidWrite { + WORD nHidBytesToSend; //holds counter of bytes to be sent + WORD nHidBytesToSendLeft; //holds counter how many bytes is still to be sent + const BYTE* pHidBufferToSend; //holds the buffer with data to be sent + BYTE bCurrentBufferXY; //indicates which buffer is to use next for for write into IN OUT endpoint +} HidWriteCtrl[HID_NUM_INTERFACES]; + +static struct _HidRead { + BYTE *pUserBuffer; //holds the current position of user's receiving buffer. If NULL- no receiving + //operation started + BYTE *pCurrentEpPos; //current positon to read of received data from curent EP + WORD nBytesToReceive; //holds how many bytes was requested by receiveData() to receive + WORD nBytesToReceiveLeft; //holds how many bytes is still requested by receiveData() to receive + BYTE * pCT1; //holds current EPBCTxx register + BYTE * pCT2; //holds next EPBCTxx register + BYTE * pEP2; //holds addr of the next EP buffer + BYTE nBytesInEp; //how many received bytes still available in current EP + BYTE bCurrentBufferXY; //indicates which buffer is used by host to transmit data via OUT endpoint +} HidReadCtrl[HID_NUM_INTERFACES]; + +extern WORD wUsbEventMask; + +BYTE hidProtocol[HID_NUM_INTERFACES] = {0}; +BYTE hidIdleRate[HID_NUM_INTERFACES] = {0}; + +/*----------------------------------------------------------------------------+ + | Global Variables | + +----------------------------------------------------------------------------*/ + +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[]; + + +VOID HidCopyUsbToBuff (BYTE* pEP, BYTE* pCT, BYTE); + +/*----------------------------------------------------------------------------+ + | Functions' implementatin | + +----------------------------------------------------------------------------*/ + +//resets internal HID data structure +VOID HidResetData () +{ + int i; + + //indicates which buffer is used by host to transmit data via OUT endpoint3 - X buffer is first + //HidReadCtrl[intfIndex].bCurrentBufferXY = X_BUFFER; + + memset(&HidReadCtrl, 0, sizeof(HidReadCtrl)); + memset(&HidWriteCtrl, 0, sizeof(HidWriteCtrl)); + for (i = 0; i < HID_NUM_INTERFACES; i++){ + hidProtocol[i] = USB_REQ_HID_REPORT_PROTOCOL; + } +} + +/* + * Sends a pre-built report reportData to the host. + * Returns: kUSBHID_sendComplete + * kUSBHID_intfBusyError + * kUSBCDC_busNotAvailable + */ +BYTE USBHID_sendReport (const BYTE * reportData, BYTE intfNum) +{ + BYTE byte_count; + BYTE * pEP1; + BYTE * pCT1; + + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + return (kUSBHID_busNotAvailable); + } + + if (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } + + byte_count = report_len_input[INTFNUM_OFFSET(intfNum)]; + + if (*pCT1 & EPBCNT_NAK){ //if this EP is empty + USB_TX_memcpy(pEP1, reportData, byte_count); //copy data into IEP X or Y buffer + *pCT1 = byte_count; //Set counter for usb In-Transaction + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; //switch buffer + return (kUSBHID_sendComplete); + } + return (kUSBHID_intfBusyError); +} + +/* + * Receives report reportData from the host. + * Return: kUSBHID_receiveCompleted + * kUSBHID_generalError + * kUSBCDC_busNotAvailable + */ +BYTE USBHID_receiveReport (BYTE * reportData, BYTE intfNum) +{ + BYTE ret = kUSBHID_generalError; + BYTE nTmp1 = 0; + + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + return (kUSBHID_busNotAvailable); + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //this is current buffer + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + //this is the active EP buffer + //pEP1 + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + nTmp1 = 1; //indicate that data is available + } + } else { //Y_BUFFER + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ + //this is the active EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + nTmp1 = 1; //indicate that data is available + } + } + + if (nTmp1){ + //how many byte we can get from one endpoint buffer + nTmp1 = *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + + USB_RX_memcpy(reportData, HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + nTmp1); + //memcpy(reportData, HidReadCtrl.pEP1, nTmp1); + HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = 0; //clear NAK, EP ready to receive data + + ret = kUSBHID_receiveCompleted; + } + } + return (ret); +} + +/* + * Sends data over interface intfNum, of size size and starting at address data. + * Returns: kUSBHID_sendStarted + * kUSBHID_sendComplete + * kUSBHID_intBusyError + */ +BYTE USBHID_sendData (const BYTE* data, WORD size, BYTE intfNum) +{ + unsigned short bGIE; + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (size == 0){ + return (kUSBHID_generalError); + } + + bGIE = (__get_SR_register() & GIE); //save interrupt status + + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //data can not be read because of USB suspended + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_busNotAvailable); + } + + if (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft != 0){ + //the USB still sends previous data, we have to wait + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_intfBusyError); + } + + //This function generate the USB interrupt. The data will be sent out from interrupt + + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSend = size; + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft = size; + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].pHidBufferToSend = data; + + //trigger Endpoint Interrupt - to start send operation + USBIEPIFG |= 1 << (edbIndex + 1); //IEPIFGx; + + __bis_SR_register(bGIE); //restore interrupt status + + return (kUSBHID_sendStarted); +} + +//this function is used only by USB interrupt +BOOL HidToHostFromBuffer (BYTE intfNum) +{ + BYTE byte_count, nTmp2; + BYTE * pEP1; + BYTE * pEP2; + BYTE * pCT1; + BYTE * pCT2; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft == 0){ //do we have somtething to send? + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSend = 0; + + //call event callback function + if (wUsbEventMask & kUSB_sendCompletedEvent){ + bWakeUp = USBHID_handleSendCompleted(intfNum); + } + return (bWakeUp); + } + + if (!(tInputEndPointDescriptorBlock[edbIndex].bEPCNF & EPCNF_TOGGLE)){ + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can send over one endpoint buffer + //2 bytes a reserved: [0] - HID Report Descriptor, [1] - count of valid bytes + byte_count = + (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft > + EP_MAX_PACKET_SIZE - + 2) ? EP_MAX_PACKET_SIZE - + 2 : HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft; + nTmp2 = *pCT1; + + if (nTmp2 & EPBCNT_NAK){ + USB_TX_memcpy(pEP1 + 2, HidWriteCtrl[INTFNUM_OFFSET( + intfNum)].pHidBufferToSend, + byte_count); //copy data into IEP3 X or Y buffer + pEP1[0] = 0x3F; //set HID report descriptor: 0x3F + pEP1[1] = byte_count; //set HID report descriptor + + //64 bytes will be send: we use only one HID report descriptor + *pCT1 = 0x40; //Set counter for usb In-Transaction + + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft -= byte_count; + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].pHidBufferToSend += byte_count; //move buffer pointer + + //try to send data over second buffer + nTmp2 = *pCT2; + if ((HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft > 0) && //do we have more data to send? + (nTmp2 & EPBCNT_NAK)){ //if the second buffer is free? + //how many byte we can send over one endpoint buffer + byte_count = + (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft > + EP_MAX_PACKET_SIZE - + 2) ? EP_MAX_PACKET_SIZE - + 2 : HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft; + + USB_TX_memcpy(pEP2 + 2, HidWriteCtrl[INTFNUM_OFFSET( + intfNum)].pHidBufferToSend, + byte_count); //copy data into IEP3 X or Y buffer + pEP2[0] = 0x3F; //set HID report descriptor: 0x3F + pEP2[1] = byte_count; //set byte count of valid data + + //64 bytes will be send: we use only one HID report descriptor + *pCT2 = 0x40; //Set counter for usb In-Transaction + + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft -= + byte_count; + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].pHidBufferToSend += + byte_count; //move buffer pointer + } + } + return (bWakeUp); +} + +/* + * Aborts an active send operation on interface intfNum. + * Returns the number of bytes that were sent prior to the abort, in size. + */ +BYTE USBHID_abortSend (WORD* size, BYTE intfNum) +{ + unsigned short bGIE; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + + _DINT_FET(); //disable interrupts - atomic operation + + *size = + (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSend - + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft); + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSend = 0; + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft = 0; + + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +//This function copies data from OUT endpoint into user's buffer +//Arguments: +//pEP - pointer to EP to copy from +//pCT - pointer to pCT control reg +// +VOID HidCopyUsbToBuff (BYTE* pEP, BYTE* pCT,BYTE intfNum) +{ + BYTE nCount; + + //how many byte we can get from one endpoint buffer + nCount = + (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp) ? HidReadCtrl[ + INTFNUM_OFFSET(intfNum)].nBytesInEp : HidReadCtrl[INTFNUM_OFFSET( + intfNum)]. + nBytesToReceiveLeft; + + USB_RX_memcpy(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer, pEP, nCount); //copy data from OEPx X or Y buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft -= nCount; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer += nCount; //move buffer pointer + //to read rest of data next time from this place + + if (nCount == HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp){ //all bytes are copied from receive buffer? + //switch current buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; + + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + + //clear NAK, EP ready to receive data + *pCT = 0; + } else { + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp -= nCount; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = pEP + nCount; + } +} + +/* + * Receives data over interface intfNum, of size size, into memory starting at address data. + * Returns: + * kUSBHID_receiveStarted if the receiving process started. + * kUSBHID_receiveCompleted all requested date are received. + * kUSBHID_receiveInProgress previous receive opereation is in progress. The requested receive operation can be not started. + * kUSBHID_generalError error occurred. + */ +BYTE USBHID_receiveData (BYTE* data, WORD size, BYTE intfNum) +{ + BYTE nTmp1; + unsigned short bGIE; + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if ((size == 0) || //read size is 0 + (data == NULL)){ + return (kUSBHID_generalError); + } + + bGIE = (__get_SR_register() & GIE); //save interrupt status + + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_busNotAvailable); + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL){ //receive process already started + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_receiveInProgress); + } + + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive = size; //bytes to receive + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft = size; //left bytes to receive + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = data; //set user receive buffer + + //read rest of data from buffer, if any + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0){ + //copy data from pEP-endpoint into User's buffer + HidCopyUsbToBuff(HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + HidReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1,intfNum); + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + USBHID_handleReceiveCompleted(intfNum); //call event handler in interrupt context + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_receiveCompleted); //receive completed + } + + //check other EP buffer for data - exchange pCT1 with pCT2 + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 == + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX){ + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + } else { + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + } + nTmp1 = *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + //try read data from second buffer + if (nTmp1 & EPBCNT_NAK){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = + *(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos + 1); //holds how many valid bytes in the EP buffer + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > nTmp1 - 2){ + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1 - 2; + } + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos += 2; //here starts user data + HidCopyUsbToBuff(HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + HidReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1,intfNum); + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBHID_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_receiveCompleted); //receive completed + } + } //read rest of data from buffer, if any + + //read 'fresh' data, if available + nTmp1 = 0; + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //this is current buffer + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + //this is the active EP buffer + //pEP1 + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + nTmp1 = 1; //indicate that data is available + } + } else { //Y_BUFFER + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ + //this is the active EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + nTmp1 = 1; //indicate that data is available + } + } + + if (nTmp1){ + //how many byte we can get from one endpoint buffer + nTmp1 = *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = + *(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos + 1); //holds how many valid bytes in the EP buffer + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > nTmp1 - 2){ + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1 - 2; + } + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos += 2; //here starts user data + HidCopyUsbToBuff(HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + HidReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1,intfNum); + + nTmp1 = *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + //try read data from second buffer + if ((HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > + 0) && //do we have more data to receive? + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = + *(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 + 1); //holds how many valid bytes in the EP buffer + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > nTmp1 - + 2){ + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1 - 2; + } + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 += 2; //here starts user data + HidCopyUsbToBuff(HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pEP2, + HidReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT2,intfNum); + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + } + } + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBHID_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_receiveCompleted); + } + + //interrupts enable + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_receiveStarted); +} + +//this function is used only by USB interrupt. +//It fills user receiving buffer with received data +BOOL HidToBufferFromHost (BYTE intfNum) +{ + BYTE * pEP1; + BYTE nTmp1; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //do we have somtething to receive? + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + return (bWakeUp); + } + + //No data to receive... + if (!((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX | + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY) + & 0x80)){ + return (bWakeUp); + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can get from one endpoint buffer + nTmp1 = *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = *(pEP1 + 1); //holds how many valid bytes in the EP buffer + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > nTmp1 - 2){ + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1 - 2; + } + pEP1 += 2; //here starts user data + HidCopyUsbToBuff(pEP1, HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pCT1,intfNum); + + nTmp1 = *HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + //try read data from second buffer + if ((HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > 0) && //do we have more data to send? + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = *(pEP1 + 1); //holds how many valid bytes in the EP buffer + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > nTmp1 - 2){ + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1 - 2; + } + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 += 2; //here starts user data + HidCopyUsbToBuff(HidReadCtrl[INTFNUM_OFFSET( + intfNum)].pEP2, + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2,intfNum); + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + } + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + bWakeUp = USBHID_handleReceiveCompleted(intfNum); + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp){ //Is not read data still available in the EP? + if (wUsbEventMask & kUSB_dataReceivedEvent){ + bWakeUp = USBHID_handleDataReceived(intfNum); + } + } + } + return (bWakeUp); +} + +//helper for USB interrupt handler +BOOL HidIsReceiveInProgress (BYTE intfNum) +{ + return (HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL); +} + +/* + * Aborts an active receive operation on interface intfNum. + * Returns the number of bytes that were received and transferred + * to the data location established for this receive operation. + */ +BYTE USBHID_abortReceive (WORD* size, BYTE intfNum) +{ + unsigned short bGIE; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + _DINT_FET(); //disable interrupts - atomic operation + + *size = 0; //set received bytes count to 0 + + //is receive operation underway? + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer){ + //how many bytes are already received? + *size = HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive - + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft; + + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft = 0; + } + + //restore interrupt status + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +/* + * This function rejects payload data that has been received from the host. + */ +BYTE USBHID_rejectData (BYTE intfNum) +{ + unsigned short bGIE; + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + + //interrupts disable + _DINT_FET(); + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if (bFunctionSuspended){ + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBHID_busNotAvailable); + } + + //Is receive operation underway? + //- do not flush buffers if any operation still active. + if (!HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer){ + BYTE tmp1 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK; + BYTE tmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK; + + if (tmp1 ^ tmp2){ //switch current buffer if any and only ONE of the + //buffers is full + //switch current buffer + HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (HidReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; + } + + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; //flush buffer X + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0; //flush buffer Y + HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; //indicates that no more data available in the EP + } + + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +/* + * This function indicates the status of the interface intfNum. + * If a send operation is active for this interface, + * the function also returns the number of bytes that have been transmitted to the host. + * If a receiver operation is active for this interface, the function also returns + * the number of bytes that have been received from the host and are waiting at the assigned address. + * + * returns kUSBHID_waitingForSend (indicates that a call to USBHID_SendData() + * has been made, for which data transfer has not been completed) + * + * returns kUSBHID_waitingForReceive (indicates that a receive operation + * has been initiated, but not all data has yet been received) + * + * returns kUSBHID_dataWaiting (indicates that data has been received + * from the host, waiting in the USB receive buffers) + */ +BYTE USBHID_intfStatus (BYTE intfNum, WORD* bytesSent, WORD* bytesReceived) +{ + BYTE ret = 0; + unsigned short bGIE; + BYTE edbIndex; + + *bytesSent = 0; + *bytesReceived = 0; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + _DINT_FET(); //disable interrupts - atomic operation + + //Is send operation underway? + if (HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft != 0){ + ret |= kUSBHID_waitingForSend; + *bytesSent = HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSend - + HidWriteCtrl[INTFNUM_OFFSET(intfNum)].nHidBytesToSendLeft; + } + + //Is receive operation underway? + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL){ + ret |= kUSBHID_waitingForReceive; + *bytesReceived = HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive - + HidReadCtrl[INTFNUM_OFFSET(intfNum)]. + nBytesToReceiveLeft; + } else { //not receive operation started + //do not access USB memory if suspended (PLL off). + //It may produce BUS_ERROR + if (!bFunctionSuspended){ + if ((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK) | //any of buffers has a valid data packet + (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK)){ + ret |= kUSBHID_dataWaiting; + } + } + } + + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //if suspended or not enumerated - report no other tasks pending + ret = kUSBHID_busNotAvailable; + } + + //restore interrupt status + __bis_SR_register(bGIE); //restore interrupt status + + return (ret); +} + +/* + * Returns how many bytes are in the buffer are received and ready to be read. + */ +BYTE USBHID_bytesInUSBBuffer (BYTE intfNum) +{ + BYTE bTmp1 = 0; + BYTE bTmp2; + + BYTE edbIndex; + unsigned short bGIE; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + + edbIndex = stUsbHandle[intfNum].edb_Index; + + //interrupts disable + _DINT_FET(); + + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //if suspended or not enumerated - report 0 bytes available + __bis_SR_register(bGIE); //restore interrupt status + return (0); + } + + if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0){ //If a RX operation is underway, part of data may + //was read of the OEP buffer + bTmp1 = HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp; + if (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & EPBCNT_NAK){ //the next buffer has a valid data packet + bTmp2 = *(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 + 1); //holds how many valid bytes in the EP buffer + if (bTmp2 > + (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F) - 2){ //check if all data received correctly + bTmp1 += + (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F) - 2; + } else { + bTmp1 += bTmp2; + } + } + } else { + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + bTmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & 0x7F; + bTmp1 = *((BYTE*)stUsbHandle[intfNum].oep_X_Buffer + 1); + if (bTmp2 - 2 < bTmp1){ //check if the count (second byte) is valid + bTmp1 = bTmp2 - 2; + } + } + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ //this buffer has a valid data packet + bTmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & 0x7F; + if (bTmp2 - 2 > *((BYTE*)stUsbHandle[intfNum].oep_Y_Buffer + 1)){ //check if the count (second byte) is valid + bTmp1 += *((BYTE*)stUsbHandle[intfNum].oep_Y_Buffer + 1); + } else { + bTmp1 += bTmp2 - 2; + } + } + } + + //interrupts enable + __bis_SR_register(bGIE); //restore interrupt status + return (bTmp1); +} + +#endif //ifdef _HID_ + +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHid.h b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHid.h new file mode 100644 index 0000000..4a10826 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHid.h @@ -0,0 +1,155 @@ +//(c)2009 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (HID Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbHid.h, File Version 1.00 2009/12/03 | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2009/02/20 portet from UsbCdc.h | + | RSTO 2009/05/15 added param to USBHID_rejectData() | + | RSTO 2009/05/26 added USBHID_bytesInUSBBuffer() | + +----------------------------------------------------------------------------*/ +#ifndef _UsbHid_H_ +#define _UsbHid_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +#define kUSBHID_sendStarted 0x01 +#define kUSBHID_sendComplete 0x02 +#define kUSBHID_intfBusyError 0x03 +#define kUSBHID_receiveStarted 0x04 +#define kUSBHID_receiveCompleted 0x05 +#define kUSBHID_receiveInProgress 0x06 +#define kUSBHID_generalError 0x07 +#define kUSBHID_busNotAvailable 0x08 + +#define HID_BOOT_PROTOCOL 0x00 +#define HID_REPORT_PROTOCOL 0x01 + +/*---------------------------------------------------------------------------- + * These functions can be used in application + +----------------------------------------------------------------------------*/ + +/* + * Sends a pre-built report reportData to the host. + * Returns: kUSBHID_sendComplete + * kUSBHID_intfBusyError + * kUSBHID_busSuspended + */ +BYTE USBHID_sendReport (const BYTE * reportData, BYTE intfNum); + +/* + * Receives report reportData from the host. + * Return: kUSBHID_receiveCompleted + * kUSBHID_generalError + * kUSBHID_busSuspended + */ +BYTE USBHID_receiveReport (BYTE * reportData, BYTE intfNum); + +/* + * Sends data over interface intfNum, of size size and starting at address data. + * Returns: kUSBHID_sendStarted + * kUSBHID_sendComplete + * kUSBHID_intfBusyError + */ +BYTE USBHID_sendData (const BYTE* data, WORD size, BYTE intfNum); + +/* + * Receives data over interface intfNum, of size size, into memory starting at address data. + */ +BYTE USBHID_receiveData (BYTE* data, WORD size, BYTE intfNum); + +/* + * Aborts an active receive operation on interface intfNum. + * size: the number of bytes that were received and transferred + * to the data location established for this receive operation. + */ +BYTE USBHID_abortReceive (WORD* size, BYTE intfNum); + + +#define kUSBHID_noDataWaiting 1 //returned by USBHID_rejectData() if no data pending + +/* + * This function rejects payload data that has been received from the host. + */ +BYTE USBHID_rejectData (BYTE intfNum); + +/* + * Aborts an active send operation on interface intfNum. Returns the number of bytes that were sent prior to the abort, in size. + */ +BYTE USBHID_abortSend (WORD* size, BYTE intfNum); + + +#define kUSBHID_waitingForSend 0x01 +#define kUSBHID_waitingForReceive 0x02 +#define kUSBHID_dataWaiting 0x04 +#define kUSBHID_busNotAvailable 0x08 +#define kUSB_allHidEvents 0xFF +/* + * This function indicates the status of the interface intfNum. + * If a send operation is active for this interface, + * the function also returns the number of bytes that have been transmitted to the host. + * If a receiver operation is active for this interface, the function also returns + * the number of bytes that have been received from the host and are waiting at the assigned address. + * + * returns kUSBHID_waitingForSend (indicates that a call to USBHID_SendData() + * has been made, for which data transfer has not been completed) + * + * returns kUSBHID_waitingForReceive (indicates that a receive operation + * has been initiated, but not all data has yet been received) + * + * returns kUSBHID_dataWaiting (indicates that data has been received + * from the host, waiting in the USB receive buffers) + */ +BYTE USBHID_intfStatus (BYTE intfNum, WORD* bytesSent, WORD* bytesReceived); + +/* + * Returns how many bytes are in the buffer are received and ready to be read. + */ +BYTE USBHID_bytesInUSBBuffer (BYTE intfNum); + +/*---------------------------------------------------------------------------- + * Event-Handling routines + +----------------------------------------------------------------------------*/ + +/* + * This event indicates that data has been received for port port, but no data receive operation is underway. + * returns TRUE to keep CPU awake + */ +BYTE USBHID_handleDataReceived (BYTE intfNum); + +/* + * This event indicates that a send operation on port port has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBHID_handleSendCompleted (BYTE intfNum); + +/* + * This event indicates that a receive operation on port port has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBHID_handleReceiveCompleted (BYTE intfNum); + +/* + * This event indicates that a Set_Protocol request was received from the host + * The application may maintain separate reports for boot and report protocols. + * The protocol field is either HID_BOOT_PROTOCOL or + * HID_REPORT_PROTOCOL + */ +BYTE USBHID_handleBootProtocol (BYTE protocol, BYTE intfnum); + + +#ifdef __cplusplus +} +#endif +#endif //_UsbHid_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHidReq.c b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHidReq.c new file mode 100644 index 0000000..928fa11 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHidReq.c @@ -0,0 +1,196 @@ +//(c)2009 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (HID Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbHidReq.c, File Version 1.00 2009/12/03 | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2009/03/03 born | + | MSP/Biju 2009/10/21 Changes for composite support | + +----------------------------------------------------------------------------*/ + +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" //USB-specific Data Structures +#include "UsbHid.h" +#include "UsbHidReq.h" +#include + +#ifdef _HID_ + +VOID usbClearOEP0ByteCount (VOID); +VOID usbSendDataPacketOnEP0 (PBYTE pbBuffer); +VOID usbReceiveDataPacketOnEP0 (PBYTE pbBuffer); + +extern const BYTE report_desc_size[HID_NUM_INTERFACES]; +extern const PBYTE report_desc[HID_NUM_INTERFACES]; //KLQ +extern BYTE hidProtocol[]; +extern BYTE hidIdleRate[]; +extern WORD wUsbHidEventMask; + +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES +extern const struct abromConfigurationDescriptorGroupHID abromConfigurationDescriptorGroupHID; +#endif + +//Local Macros +#define INTERFACE_OFFSET(X) (X - HID0_REPORT_INTERFACE) //Get the HID offset + +BYTE usbGetHidDescriptor (VOID) +{ + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = 9; +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroupHID.stHid[ + INTERFACE_OFFSET(tSetupPacket.wIndex)].blength_hid_descriptor); +#else + usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroup.stHid[ + INTERFACE_OFFSET(tSetupPacket.wIndex)].blength_hid_descriptor); +#endif + return (FALSE); +} + +BYTE usbGetReportDescriptor (VOID) +{ + wBytesRemainingOnIEP0 = + report_desc_size[INTERFACE_OFFSET(tSetupPacket.wIndex)]; + usbSendDataPacketOnEP0(report_desc[INTERFACE_OFFSET(tSetupPacket.wIndex)]); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetReport (VOID) +{ + BYTE *buffer; + + //tSetupPacket.wValue = USB_REQ_HID_FEATURE or USB_REQ_HID_INPUT + buffer = Handler_SetReport(tSetupPacket.wValue, + tSetupPacket.wLength, + tSetupPacket.wIndex); + + //What if buffer is NULL? + if (buffer == 0){ + usbReceiveDataPacketOnEP0((PBYTE)&abUsbRequestIncomingData); + } else { + usbReceiveDataPacketOnEP0((PBYTE)buffer); //receive data over EP0 from Host + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetReport (VOID) +{ + BYTE *buffer; + + //tSetupPacket.wValue = USB_REQ_HID_FEATURE or USB_REQ_HID_INPUT + buffer = Handler_GetReport((BYTE)tSetupPacket.wValue, + tSetupPacket.wLength, + tSetupPacket.wIndex); + if (buffer != 0){ + usbSendDataPacketOnEP0((PBYTE)buffer); + } + + return (FALSE); +} + +BYTE usbSetProtocol (VOID) +{ + BYTE bWakeUp = FALSE; + + hidProtocol[INTERFACE_OFFSET(tSetupPacket.wIndex)] = + (BYTE)tSetupPacket.wValue; + //tSetupPacket.wValue = USB_REQ_HID_BOOT_PROTOCOL or USB_REQ_HID_REPORT_PROTOCOL + bWakeUp = USBHID_handleBootProtocol((BYTE)tSetupPacket.wValue, + tSetupPacket.wIndex); + usbSendZeroLengthPacketOnIEP0(); + + return (bWakeUp); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetProtocol (VOID) +{ + usbSendDataPacketOnEP0(&hidProtocol[INTERFACE_OFFSET(tSetupPacket.wIndex)]); + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbSetIdle (VOID) +{ + if (hidProtocol[INTERFACE_OFFSET(tSetupPacket.wIndex)] == + USB_REQ_HID_BOOT_PROTOCOL){ + hidIdleRate[INTERFACE_OFFSET(tSetupPacket.wIndex)] = + tSetupPacket.wValue >> 8; + usbSendZeroLengthPacketOnIEP0(); + } else { + usbInvalidRequest(); + } + + return (FALSE); +} + +//---------------------------------------------------------------------------- + +BYTE usbGetIdle (VOID) +{ + if (hidProtocol[INTERFACE_OFFSET(tSetupPacket.wIndex)] == + USB_REQ_HID_BOOT_PROTOCOL){ + usbSendDataPacketOnEP0(&hidIdleRate[INTERFACE_OFFSET(tSetupPacket. + wIndex)]); + } else { + usbInvalidRequest(); + } + + return (FALSE); +} + +BYTE setReportBuffer[64]; + +/* + * This event indicates that a Set_Report request was received from the host + */ +BYTE *Handler_SetReport (WORD reportType_reportId, + WORD dataLength, + BYTE intfnum) +{ + return (&setReportBuffer[0]); +} + +/* + * This event indicates that a Set_Report request data has been received + */ +BYTE Handler_SetReportDataAvailable (BYTE intfnum) +{ + return (FALSE); +} + +/* + * This event indicates that a Get_Report request was received from the host + */ +BYTE *Handler_GetReport (WORD reportType_reportId, + WORD requestedLength, + BYTE intfnum) +{ + return (&setReportBuffer[0]); +} + +//---------------------------------------------------------------------------- + +#endif //_HID_ +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHidReq.h b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHidReq.h new file mode 100644 index 0000000..aff85b2 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_HID_API/UsbHidReq.h @@ -0,0 +1,90 @@ +//(c)2009 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (HID Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbHidReq.h, File Version 1.00 2009/12/03 | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2009/03/03 born | + | MSP,Biju 2009/12/03 file versioning started | + +----------------------------------------------------------------------------*/ + +#ifndef _UsbHidReq_H_ +#define _UsbHidReq_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * Return Hid descriptor to host over control endpoint + */ +BYTE usbGetHidDescriptor(VOID); +/** + * Return HID report descriptor to host over control endpoint + */ +BYTE usbGetReportDescriptor(VOID); +/** + * Receive Set_Report from host over control endpoint + */ +BYTE usbSetReport(VOID); +/** + * Process Get_Report request from host over control endpoint + */ +BYTE usbGetReport(VOID); +/** + * Receive Set_Idle from host over control endpoint + */ +BYTE usbSetIdle(VOID); +/** + * Process Get_Idle request from host over control endpoint + */ +BYTE usbGetIdle(VOID); +/** + * Receive Set_Protocol from host over control endpoint + */ +BYTE usbSetProtocol(VOID); +/** + * Process Get_Protocol request from host over control endpoint + */ +BYTE usbGetProtocol(VOID); + +/* + * This event indicates that a Set_Report request was received from the host + * The application needs to supply a buffer to retrieve the report data that will be sent + * as part of this request. This handler is passed the wValue from the setup packet + * which contains the reportType (upper byte) and reportId(lower byte), the length of data + * phase as well as the interface number. + */ +BYTE *Handler_SetReport (WORD reportType_reportId, + WORD requestedLength, + BYTE intfnum); +/* + * This event indicates that data as part of Set_Report request was received from the host + * Tha application can return TRUE to wake up the CPU. If the application supplied a buffer + * as part of USBHID_handleSetReport, then this buffer will contain the Set Report data. + */ +BYTE Handler_SetReportDataAvailable (BYTE intfnum); +/* + * This event indicates that a Get_Report request was received from the host + * The application can supply a buffer of data that will be sent to the host. + * This handler is passed the wValue from the setup packet which contains the + * reportType(high byte) and reportId(low byte), the requested length as well + * as the interface number. + */ +BYTE *Handler_GetReport (WORD reportType_reportId, + WORD requestedLength, + BYTE intfnum); + +#ifdef __cplusplus +} +#endif +#endif //_UsbHidReq_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMsc.h b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMsc.h new file mode 100644 index 0000000..29014f5 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMsc.h @@ -0,0 +1,55 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbMsc.h, File Version 1.01 | + | Description: This file contains API declarations for function to use by | + | User Application. | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2010/10/29 Created | + +----------------------------------------------------------------------------*/ +#ifndef _USB_MSC_H_ +#define _USB_MSC_H_ + +#include "UsbMscScsi.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*Return values of getState() and USBMSC_poll() API */ +#define kUSBMSC_idle 0 +#define kUSBMSC_readInProgress 1 +#define kUSBMSC_writeInProgress 2 +#define kUSBMSC_cmdBeingProcessed 3 +#define kUSBMSC_okToSleep 4 +#define kUSBMSC_processBuffer 5 + +/*----------------------------------------------------------------------------+ + | Function Prototypes | + +----------------------------------------------------------------------------*/ +/*Function to handle the MSC SCSI state machine */ +BYTE USBMSC_poll(VOID); + +/* MSC functions */ +BOOL MSCToHostFromBuffer (); +BOOL MSCFromHostToBuffer (); +BYTE USBMSC_bufferProcessed(VOID); +BYTE USBMSC_getState (); +BYTE USBMSC_updateMediaInfo (BYTE lun, struct USBMSC_mediaInfoStr *info); + +BYTE USBMSC_handleBufferEvent(VOID); +BYTE USBMSC_registerBufInfo ( BYTE lun, BYTE* RWbuf_x, BYTE* RWbuf_y, WORD size); + +#ifdef __cplusplus +} +#endif +#endif //_USB_MSC_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscReq.c b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscReq.c new file mode 100644 index 0000000..881e57d --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscReq.c @@ -0,0 +1,76 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: Usb_Msc_Req.c, File Version 1.02 | + | Description: This file contains the APIs specific to MSC class | + | (Class specific requests) | + | Author: Biju,MSP | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | MSP 2010/02/01 born | + | Biju,MSP 2010/07/15 CV bug fix | + | | + +----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ + | Includes | + +----------------------------------------------------------------------------*/ + +#include + +#ifdef _MSC_ + +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/device.h" +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" //USB-specific Data Structures +#include "../USB_MSC_API/UsbMscScsi.h" +#include "../USB_MSC_API/UsbMscReq.h" +#include "../USB_MSC_API/UsbMsc.h" + +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[]; +extern struct _MscState MscState; + +/*----------------------------------------------------------------------------+ + | Functions | + +----------------------------------------------------------------------------*/ +BYTE USBMSC_reset (VOID) +{ + Msc_ResetStateMachine(); + Msc_ResetFlags(); + Msc_ResetStruct(); + MscState.isMSCConfigured = TRUE; + + MscState.bMscResetRequired = FALSE; + tInputEndPointDescriptorBlock[stUsbHandle[MSC0_INTFNUM].edb_Index].bEPCNF + &= ~(EPCNF_STALL | EPCNF_TOGGLE ); + tOutputEndPointDescriptorBlock[stUsbHandle[MSC0_INTFNUM].edb_Index].bEPCNF + &= ~(EPCNF_STALL | EPCNF_TOGGLE ); + usbSendZeroLengthPacketOnIEP0(); //status stage for control transfer + + return (FALSE); +} + +//---------------------------------------------------------------------------- +BYTE Get_MaxLUN (VOID) +{ + BYTE maxLunNumber = MSC_MAX_LUN_NUMBER - 1; + + wBytesRemainingOnIEP0 = 1; + MscState.isMSCConfigured = TRUE; + usbSendDataPacketOnEP0((PBYTE)&maxLunNumber); + + return (FALSE); +} + +#endif //_MSC_ +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscReq.h b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscReq.h new file mode 100644 index 0000000..8493b5b --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscReq.h @@ -0,0 +1,35 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: Usb_Msc_Req.h, File Version 1.0 | + | Description: This file contains function declarations of MSC class specific| + | Requests. | + | Author: MSP | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | MSP 01/02/2010 born | + +----------------------------------------------------------------------------*/ +#ifndef _USB_MSC_REQ_H_ +#define _USB_MSC_REQ_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* MSC Class defined Request.Reset State-Machine and makes endpoints ready again*/ +BYTE USBMSC_reset(VOID); + +/* MSC Class defined Request.Tells the host the number of supported logical units*/ +BYTE Get_MaxLUN(VOID); + +#ifdef __cplusplus +} +#endif +#endif //_USB_MSC_REQ_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscScsi.c b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscScsi.c new file mode 100644 index 0000000..1f9bdb9 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscScsi.c @@ -0,0 +1,1952 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: Msc_Scsi.c, File Version 1.03 | + | Description: This file contains the SCSI command handlers, MSC stack | + | internal functions. | + | Author: Biju, MSP | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | MSP 2010/02/16 Created | + | Biju,MSP 2010/07/15 Fixed CV bugs | + | RSTO 2010/10/15 Improving READ/WRITE functionality | + +----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------+ + | Includes | + +----------------------------------------------------------------------------*/ +#include "../USB_Common/types.h" +#include "../USB_Common/device.h" +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" +#include "../USB_MSC_API/UsbMscScsi.h" +#include "../USB_MSC_API/UsbMsc.h" +#include +#include + +#ifdef _MSC_ + +/*----------------------------------------------------------------------------+ + | Internal Definitions | + +----------------------------------------------------------------------------*/ +//Error codes +#define RESCODE_CURRENT_ERROR 0x70 + +#define S_NO_SENSE 0x00 +#define S_NOT_READY 0x02 +#define S_MEDIUM_ERROR 0x03 +#define S_ILLEGAL_REQUEST 0x05 +#define S_UNITATTN 0x06 +#define S_WRITE_PROTECTED 0x07 +#define S_ABORTED_COMMAND 0x0B + +#define ASC_NOT_READY 0x04 +#define ASCQ_NOT_READY 0x03 + +#define ASC_MEDIUM_NOT_PRESENT 0x3A +#define ASCQ_MEDIUM_NOT_PRESENT 0x00 + +#define ASC_INVALID_COMMAND_OP_CODE 0x20 +#define ASCQ_INVALID_COMMAND_OP_CODE 0x00 + +#define ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21 +#define ASCQ_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x00 + +#define ASC_INVALID_FIELD_IN_CDB 0x24 +#define ASCQ_INVALID_FIELD_IN_CDB 0x00 + +#define ASC_INVALID_PARAMETER_LIST 0x26 +#define ASCQ_INVALID_PARAMETER_LIST 0x02 + +#define ASC_ABORTED_DATAPHASE_ERROR 0x4B +#define ASCQ_ABORTED_DATAPHASE_ERROR 0x00 + +#define ASC_ILLEGAL_REQUEST 0x20 +#define ASCQ_ILLEGAL_REQUEST 0x00 + +#define ASC_UNITATTN_READY_NOTREADY 0x28 +#define ASCQ_UNITATTN_READY_NOTREADY 0x00 + +#define ASC_WRITE_PROTECTED 0X27 +#define ASCQ_WRITE_PROTECTED 0X00 + +#define ASC_WRITE_FAULT 0x03 +#define ASCQ_WRITE_FAULT 0x00 + +#define ASC_UNRECOVERED_READ 0x11 +#define ASCQ_UNRECOVERED_READ 0x00 + +#define DIRECTION_IN 0x80 +#define DIRECTION_OUT 0x00 + +#define EP_MAX_PACKET_SIZE 0x40 + +VOID usbStallEndpoint (BYTE); +BYTE Scsi_Verify_CBW (); + +extern struct config_struct USBMSC_config; + +extern VOID *(*USB_TX_memcpy)(VOID * dest, const VOID * source, size_t count); +extern VOID *(*USB_RX_memcpy)(VOID * dest, const VOID * source, size_t count); + +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[]; +/*----------------------------------------------------------------------------+ + | Global Variables | + +----------------------------------------------------------------------------*/ + +struct _MscWriteControl MscWriteControl; +struct _MscReadControl MscReadControl; +struct _MscControl MscControl[MSC_MAX_LUN_NUMBER] = {0}; + +/* Structure internal to stack for maintaining LBA info,buffer address etc */ +USBMSC_RWbuf_Info sRwbuf; + +__no_init CBW McsCbw; +__no_init CSW McsCsw; + +struct _MscState MscState; + +/*----------------------------------------------------------------------------+ + | Initiliazing Command data | + +----------------------------------------------------------------------------*/ +BYTE Scsi_Standard_Inquiry_Data[256]; + +REQUEST_SENSE_RESPONSE RequestSenseResponse; + +struct _Scsi_Read_Capacity Scsi_Read_Capacity_10[MSC_MAX_LUN_NUMBER]; + +const struct _Report_Luns Report_Luns = {{0x02,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00}}; + +BYTE Scsi_Mode_Sense_6[SCSI_MODE_SENSE_6_CMD_LEN] = {0x03,0,0,0 }; //No mode sense parameter + +BYTE Scsi_Mode_Sense_10[SCSI_MODE_SENSE_10_CMD_LEN] = {0,0x06,0,0,0,0,0,0 }; //No mode sense parameter + +BYTE Scsi_Read_Format_Capacity[SCSI_READ_FORMAT_CAPACITY_CMD_LEN] = +{0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00}; + +/*Default values initialized for SCSI Inquiry data */ +const BYTE bScsi_Standard_Inquiry_Data[SCSI_SCSI_INQUIRY_CMD_LEN] = { +#ifdef CDROM_SUPPORT + 0x05, //Peripheral qualifier & peripheral device type +#else + 0x00, //Peripheral qualifier & peripheral device type +#endif + 0x80, //Removable medium + 0x02, //Version of the standard (SPC-2) + 0x02, //No NormACA, No HiSup, response data format=2 + 0x1F, //No extra parameters + 0x00, //No flags + 0x00, //0x80 => BQue => Basic Task Management supported + 0x00, //No flags + /* 'T','I',' ',' ',' ',' ',' ',' ', + * 'M','a','s','s',' ','S','t','o','r','a','g','e', */ +}; + +#ifdef CDROM_SUPPORT + +/* SCSI TOC Record - Pg.459 of mmc6r02g.pdf */ +const BYTE Scsi_Read_TOC_PMA_ATIP_F1[Scsi_Read_TOC_PMA_ATIP_F1_LEN] = { + 0x00, 0x12, // Length + 0x01, // First Track + 0x01, // Last Track + + 0x00, // Reserved + 0x14, // ADR/CTL + 0x01, // Track Number + 0x00, // Reserved + 0x00, 0x00, 0x02, 0x00, // Track Address (TIME Form) + 0x00,0x00,0x00,0x00, // Padding + 0x00,0x00,0x00,0x00 +}; + +const BYTE Scsi_Read_TOC_PMA_ATIP_F2[Scsi_Read_TOC_PMA_ATIP_F2_LEN] = { + 0x00, 0x2E, // Length + 0x01, // First Track + 0x01, // Last Track + 0x01, // Reserved + 0x14, // ADR/CTL + 0x00, // Track Number + 0xA0, // Reserved + 0x00, 0x00, 0x00, 0x00, // Track Address (TIME Form) + 0x01,0x00,0x00,0x01, // Padding/Descriptors + 0x14,0x00,0xA1,0x00, + 0x00,0x00,0x00,0x01, + 0x00,0x00,0x01,0x14, + 0x00,0xA2,0x00,0x00, + 0x00,0x00,0x1C,0x35, + 0x30,0x01,0x14,0x00, + 0x01,0x00,0x00,0x00, + 0x00,0x00,0x02,0x00 +}; + +/* GET_CONFIGURATION Response Pg. 312 of mmc6r02g.pdf */ +const BYTE Scsi_Get_Configuration_Descriptor[SCSI_GET_CONFIGURATION_LEN] = { + + /* Feature Header */ + 0x00,0x00,0x00,0x00 // Length +}; + +/* EVENT STATUS Response Pg. 316 of mmc6r02g.pdf */ +const BYTE Scsi_Event_Status_Descriptor[SCSI_EVENT_STATUS_LEN] = { + + /* Feature Header */ + 0x00,0x06, // Event Descriptor Length + 0x04, // NEA/Reserved/Notification Class + 0x54, // Supported Event Classes + 0x02, // Reserved/Event Code + 0x02, + 0x00,0x00 +}; + + +/* READ_DISC_INFORMATION Response Pg. 374 of mmc6r02g.pdf */ +const BYTE Scsi_Disc_Information_Descriptor[SCSI_READ_DISC_INFORMATION_LEN] = { + + 0x00,0x00, // Disc Information Length + 0x00, // Disc Information Type, Non-Erasable, Last Session, Finalized + 0x00, // First Track on Disc + 0x00, // Number of Sessions + 0x00, // First Track Number in Last Session + 0x00, // Last Track Number in Last Session + 0x00, // BG/Barcode/ID Disable + 0x00, // Disc Type (CD-ROM) + 0x00, // Number of Sessions (MSB) + 0x00, // First Track Number in Last Session (MSB) + 0x00, // Last Track Number in Last Sessions (MSB) + 0x00,0x00,0x00,0x00, // Disc ID + 0x00,0x00,0x00,0x00, // Last Session Lead-In Address + 0x00,0x00,0x00,0x00, // Last Lead-Out Start Address + 0x00,0x00,0x00,0x00, // Bar Code (Not Supported) + 0x00,0x00,0x00,0x00, + 0x00, // Disc Application Code (Not Supported) + 0x00,0x00,0x00 // No OPC Entries +}; + +VOID Scsi_Read_TocPmaAtip(BYTE intfNum); +VOID Scsi_Get_Configuration(BYTE intfNum); +VOID Scsi_Event_Status_Notification(BYTE intfNum); +VOID Scsi_Read_Disc_Information(BYTE intfNum); + +#endif +/*----------------------------------------------------------------------------+ + | Functions | + +----------------------------------------------------------------------------*/ +VOID Reset_RequestSenseResponse (VOID) +{ + int i; + + RequestSenseResponse.ResponseCode = RESCODE_CURRENT_ERROR; + RequestSenseResponse.VALID = 0; //no data in the information field + RequestSenseResponse.Obsolete = 0x00; + RequestSenseResponse.SenseKey = S_NO_SENSE; + RequestSenseResponse.ILI = 0; + RequestSenseResponse.EOM = 0; + RequestSenseResponse.FILEMARK = 0; + RequestSenseResponse.Information[0] = 0x00; + RequestSenseResponse.Information[1] = 0x00; + RequestSenseResponse.Information[2] = 0x00; + RequestSenseResponse.Information[3] = 0x00; + RequestSenseResponse.AddSenseLen = 0x0a; + RequestSenseResponse.CmdSpecificInfo[0] = 0x00; + RequestSenseResponse.CmdSpecificInfo[1] = 0x00; + RequestSenseResponse.CmdSpecificInfo[2] = 0x00; + RequestSenseResponse.CmdSpecificInfo[3] = 0x00; + RequestSenseResponse.ASC = 0x00; + RequestSenseResponse.ASCQ = 0x00; + RequestSenseResponse.FRUC = 0x00; + RequestSenseResponse.SenseKeySpecific[0] = 0x00; + RequestSenseResponse.SenseKeySpecific[1] = 0x00; + RequestSenseResponse.SenseKeySpecific[2] = 0x00; + for (i = 0; i < 14; i++){ + RequestSenseResponse.padding[i] = 0x00; + } +} + +//---------------------------------------------------------------------------- + +BYTE Check_CBW (BYTE intfNum,BYTE Dir_Dev_Exp, DWORD Bytes_Dev_Exp) +{ + if (McsCbw.CBWCB[0] == SCSI_INQUIRY || McsCbw.CBWCB[0] == + SCSI_REQUEST_SENSE){ + return (SUCCESS); + } + + if (Dir_Dev_Exp == McsCbw.bmCBWFlags){ //all is right. Host is sending direction as expected by device + if (McsCbw.dCBWDataTransferLength < Bytes_Dev_Exp){ //Host expect less data to send or receive then device + MscState.Scsi_Status = SCSI_PHASE_ERROR; + MscState.Scsi_Residue = 0 ; + if (McsCbw.bmCBWFlags == DIRECTION_IN){ + usbStallInEndpoint(intfNum); + } else { + usbStallOutEndpoint(intfNum); + } + } else if ((McsCbw.dCBWDataTransferLength > Bytes_Dev_Exp) && + (McsCbw.CBWCB[0] != SCSI_MODE_SENSE_6) && + (McsCbw.CBWCB[0] != SCSI_MODE_SENSE_10) && + (McsCbw.CBWCB[0] != SCSI_READ_TOC_PMA_ATIP)){ + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = McsCbw.dCBWDataTransferLength - + Bytes_Dev_Exp; + if (McsCbw.bmCBWFlags == DIRECTION_IN){ + usbStallInEndpoint(intfNum); + } else { + usbStallOutEndpoint(intfNum); + } + } else { + return ( SUCCESS) ; + } + } else { //Direction mismatch + MscState.Scsi_Residue = McsCbw.dCBWDataTransferLength; + MscState.Scsi_Status = SCSI_FAILED; + if (McsCbw.bmCBWFlags == DIRECTION_IN){ + usbStallInEndpoint(intfNum); + } else if ((McsCbw.bmCBWFlags == DIRECTION_OUT) && + (McsCbw.CBWCB[0] == SCSI_READ_10)){ + usbStallOutEndpoint(intfNum); + } + } + + //Indicates a generic failure. Read/write failure/sense data is handled separately + if (MscState.Scsi_Status != SCSI_READWRITE_FAIL){ + RequestSenseResponse.ResponseCode = RESCODE_CURRENT_ERROR; + RequestSenseResponse.VALID = 1; + RequestSenseResponse.AddSenseLen = 0xA0; + RequestSenseResponse.SenseKey = S_ILLEGAL_REQUEST; + RequestSenseResponse.ASC = ASC_INVALID_PARAMETER_LIST; + RequestSenseResponse.ASCQ = ASCQ_INVALID_PARAMETER_LIST; + } + + return (FAILURE); +} + +//---------------------------------------------------------------------------- +BYTE Scsi_Verify_CBW () +{ + /*(5.2.3) Devices must consider the CBW meaningful if no reserved bits + * are set, the LUN number indicates a LUN supported by the device, + * bCBWCBLength is in the range of 1 through 16, and the length and + * content of the CBWCB field are appropriate to the SubClass. + */ + if ((MscState.bMscResetRequired || McsCbw.dCBWSignature != + CBW_SIGNATURE) || //Check for correct CBW signature + ((McsCbw.bmCBWFlags != DIRECTION_IN && McsCbw.bmCBWFlags != + DIRECTION_OUT) || + (McsCbw.bCBWLUN & 0xF0) || //Upper bits have to be zero + (McsCbw.bCBWCBLength > 16))){ //maximum length is 16 + MscState.bMscResetRequired = TRUE; + usbStallEndpoint(MSC0_INTFNUM); + usbClearOEPByteCount(MSC0_INTFNUM); + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + return (FAILURE); + } + MscState.Scsi_Status = SCSI_PASSED; + return (SUCCESS); +} + +//---------------------------------------------------------------------------- +BYTE Scsi_Send_CSW (BYTE intfNum) +{ + BYTE retval = 0; + + //Populate the CSW to be sent + McsCsw.dCSWSignature = CSW_SIGNATURE; + McsCsw.dCSWTag = McsCbw.dCBWTag; + McsCsw.bCSWStatus = MscState.Scsi_Status; + McsCsw.dCSWDataResidue = MscState.Scsi_Residue; + retval = MscSendData((PBYTE)&McsCsw, CSW_LENGTH); //Sending CSW + MscState.Scsi_Status = SCSI_PASSED; + return (retval); +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Inquiry (BYTE intfNum) +{ + //int index; + + //clear the inquiry array + memset(Scsi_Standard_Inquiry_Data, 256, 0); + //copy the inquiry data from flash to RAM + + memcpy(Scsi_Standard_Inquiry_Data, + bScsi_Standard_Inquiry_Data, + SCSI_SCSI_INQUIRY_CMD_LEN); + + + + //get the values from USB_Config + Scsi_Standard_Inquiry_Data[1] = USBMSC_config.LUN[McsCbw.bCBWLUN].removable; + memcpy(&Scsi_Standard_Inquiry_Data[8], + USBMSC_config.LUN[McsCbw.bCBWLUN].t10VID, + 8); + memcpy(&Scsi_Standard_Inquiry_Data[16], + USBMSC_config.LUN[McsCbw.bCBWLUN].t10PID, + 16); + memcpy(&Scsi_Standard_Inquiry_Data[32], + USBMSC_config.LUN[McsCbw.bCBWLUN].t10rev, + 4); + + if (McsCbw.dCBWDataTransferLength < SCSI_SCSI_INQUIRY_CMD_LEN){ + if (McsCbw.dCBWDataTransferLength == 0){ + MscState.Scsi_Residue = 0; + return; + } + if (SUCCESS == + MscSendData((PBYTE)Scsi_Standard_Inquiry_Data, + McsCbw.dCBWDataTransferLength)){ + MscState.Scsi_Residue = 0; + } else { + MscState.Scsi_Status = SCSI_FAILED; + } + } else if (McsCbw.dCBWDataTransferLength > SCSI_SCSI_INQUIRY_CMD_LEN){ + Reset_RequestSenseResponse(); + + RequestSenseResponse.ResponseCode = RESCODE_CURRENT_ERROR; + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_ILLEGAL_REQUEST; + RequestSenseResponse.ASC = ASC_INVALID_FIELD_IN_CDB; + RequestSenseResponse.ASCQ = ASCQ_INVALID_FIELD_IN_CDB; + usbStallInEndpoint(intfNum); + MscState.Scsi_Status = SCSI_FAILED; + } else { + if (SUCCESS == + MscSendData((PBYTE)Scsi_Standard_Inquiry_Data, + SCSI_SCSI_INQUIRY_CMD_LEN)){ + MscState.Scsi_Residue = 0; + } else { + MscState.Scsi_Status = SCSI_FAILED; + } + } +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Read_Capacity10 (BYTE intfNum) +{ + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_READ_CAPACITY_CMD_LEN)){ + return; + } + if (SUCCESS != + MscSendData( (PBYTE)&Scsi_Read_Capacity_10[McsCbw.bCBWLUN], + SCSI_READ_CAPACITY_CMD_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + + +//---------------------------------------------------------------------------- + +VOID Scsi_Read10 (BYTE intfNum) +{ + WORD wLBA_len; + unsigned short bGIE; + DWORD dLBA; + + /* Get first LBA: convert 4 bytes into DWORD */ + dLBA = McsCbw.CBWCB[2]; + dLBA <<= 8; + dLBA += McsCbw.CBWCB[3]; + dLBA <<= 8; + dLBA += McsCbw.CBWCB[4]; + dLBA <<= 8; + dLBA += McsCbw.CBWCB[5]; + + /* Get number of requested logical blocks */ + wLBA_len = McsCbw.CBWCB[7]; + wLBA_len <<= 8; + wLBA_len += McsCbw.CBWCB[8]; + + if (FAILURE == + Check_CBW( intfNum, DIRECTION_IN, ((DWORD)wLBA_len) * + MscControl[McsCbw.bCBWLUN].lbaSize)){ + return; + } + + bGIE = (__get_SR_register() & GIE); //save interrupt status + _DINT_FET(); + + //Populating stack internal structure required for READ/WRITE + MscReadControl.lba = dLBA; //the first LBA number. + MscReadControl.lbaCount = wLBA_len; //how many LBAs to read. + MscReadControl.XorY = 0; + + sRwbuf.bufferAddr = MscControl[McsCbw.bCBWLUN].xBufferAddr; + sRwbuf.lun = McsCbw.bCBWLUN; + + //set LBA count + sRwbuf.lbCount = wLBA_len > + MscControl[McsCbw.bCBWLUN].lbaBufCapacity ? + MscControl[McsCbw.bCBWLUN].lbaBufCapacity : wLBA_len; + sRwbuf.operation = kUSBMSC_READ; + sRwbuf.lba = dLBA; + sRwbuf.returnCode = kUSBMSC_RWSuccess; + sRwbuf.XorY = 0; + sRwbuf.xBufFull = 0; + sRwbuf.xWordCnt = 0; + sRwbuf.yBufFull = 0; + sRwbuf.yWordCnt = 0; + sRwbuf.bufferProcessed = 0; + sRwbuf.firstFlag = 0; + //buffer is prepared, let user's Application fill data. + USBMSC_handleBufferEvent(); + + __bis_SR_register(bGIE); //restore interrupt status +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Write10 (BYTE intfNum) +{ + WORD wLBA_len; + unsigned short bGIE; + /* Get first LBA: convert 4 bytes into DWORD */ + DWORD dLBA = McsCbw.CBWCB[2]; + + dLBA <<= 8; + dLBA += McsCbw.CBWCB[3]; + dLBA <<= 8; + dLBA += McsCbw.CBWCB[4]; + dLBA <<= 8; + dLBA += McsCbw.CBWCB[5]; + + /* Get number of requested logical blocks */ + wLBA_len = McsCbw.CBWCB[7]; + wLBA_len <<= 8; + wLBA_len += McsCbw.CBWCB[8]; + + if (FAILURE == + Check_CBW(intfNum,DIRECTION_OUT,((DWORD)wLBA_len) * + MscControl[McsCbw.bCBWLUN].lbaSize)){ + return; + } + bGIE = (__get_SR_register() & GIE); //save interrupt status + _DINT_FET(); + + //calculate the whole size to receive (Host to MSP430) + MscWriteControl.dwBytesToReceiveLeft = (DWORD)wLBA_len * + MscControl[McsCbw.bCBWLUN].lbaSize; + MscWriteControl.pUserBuffer = MscControl[McsCbw.bCBWLUN].xBufferAddr; + MscWriteControl.wFreeBytesLeft = + MscControl[McsCbw.bCBWLUN].wMscUserBufferSize; + + /*Populating stack internal structure required for READ/WRITE */ + + MscWriteControl.bWriteProcessing = TRUE; //indicate that we are in WRITE phase + MscWriteControl.lba = dLBA; + MscWriteControl.wCurrentByte = 0; //reset internal variable + MscWriteControl.lbaCount = 0; //reset internal variable + MscWriteControl.XorY = 0; + + sRwbuf.lun = McsCbw.bCBWLUN; + sRwbuf.operation = 0; + sRwbuf.lba = 0; + sRwbuf.lbCount = 0; + sRwbuf.bufferAddr = MscControl[McsCbw.bCBWLUN].xBufferAddr; + sRwbuf.returnCode = 0; + sRwbuf.XorY = 0; + sRwbuf.xBufFull = 0; + sRwbuf.yBufFull = 0; + sRwbuf.bufferProcessed = 0; + sRwbuf.firstFlag = 0; + sRwbuf.xlba = 0; + sRwbuf.xlbaCount = 0; + sRwbuf.ylba = 0; + sRwbuf.ylbaCount = 0; + + __bis_SR_register(bGIE); //restore interrupt status +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Mode_Sense6 (BYTE intfNum) +{ + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_MODE_SENSE_6_CMD_LEN)){ + return; + } + /* Fix for SDOCM00077834 - Set WP bit. WP bit is BIT7 in byte 3 */ + Scsi_Mode_Sense_6[2] |= (MscControl[McsCbw.bCBWLUN].bWriteProtected << 0x7); + + if (SUCCESS != + MscSendData((PBYTE)Scsi_Mode_Sense_6, SCSI_MODE_SENSE_6_CMD_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Mode_Sense10 (BYTE intfNum) +{ + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_MODE_SENSE_10_CMD_LEN)){ + return; + } + /* Fix for SDOCM00077834 - Set WP bit. WP bit is BIT7 in byte 3 */ + Scsi_Mode_Sense_10[4] |= (MscControl[McsCbw.bCBWLUN].bWriteProtected << 0x7); + + if (SUCCESS != + MscSendData((PBYTE)Scsi_Mode_Sense_10, SCSI_MODE_SENSE_10_CMD_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Request_Sense (BYTE intfNum) +{ + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_REQ_SENSE_CMD_LEN)){ + return; + } + + //If there is attention needed, setup the request sense response. The + //bUnitAttention flag is set in USBMSC_updateMediaInfo() when the volume + //is removed or inserted. Note that the response is different for the + //removed and inserted case. + if (MscState.bUnitAttention == TRUE){ + //Check if the volume was removed. + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_NOT_READY; + RequestSenseResponse.ASC = ASC_MEDIUM_NOT_PRESENT; + RequestSenseResponse.ASCQ = ASCQ_MEDIUM_NOT_PRESENT; + } + //Otherwise it was inserted. + else { + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_UNITATTN; + RequestSenseResponse.ASC = ASC_UNITATTN_READY_NOTREADY; + RequestSenseResponse.ASCQ = ASCQ_UNITATTN_READY_NOTREADY; + } + } + + if (McsCbw.dCBWDataTransferLength < SCSI_REQ_SENSE_CMD_LEN){ + if (SUCCESS == + MscSendData((PBYTE)&RequestSenseResponse, + McsCbw.dCBWDataTransferLength)){ + MscState.Scsi_Residue = 0; + } else { + MscState.Scsi_Status = SCSI_FAILED; + } + } else if (McsCbw.dCBWDataTransferLength > SCSI_REQ_SENSE_CMD_LEN){ + RequestSenseResponse.AddSenseLen += + (McsCbw.dCBWDataTransferLength - SCSI_REQ_SENSE_CMD_LEN); + if (SUCCESS == + MscSendData((PBYTE)&RequestSenseResponse, + McsCbw.dCBWDataTransferLength)){ + MscState.Scsi_Residue = 0; + } else { + MscState.Scsi_Status = SCSI_FAILED; + } + } else { + if (SUCCESS == + MscSendData((PBYTE)&RequestSenseResponse,SCSI_REQ_SENSE_CMD_LEN)){ + MscState.Scsi_Residue = 0; + } else { + MscState.Scsi_Status = SCSI_FAILED; + } + } + + //Clear the bUnitAttention flag after the response was properly sent via + //MscSendData(). + if (MscState.bUnitAttention == TRUE){ + MscState.bUnitAttention = FALSE; + } +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Test_Unit_Ready (BYTE intfNum) +{ + if (SUCCESS != Check_CBW(intfNum,DIRECTION_OUT,0)){ + MscState.Scsi_Status = SCSI_FAILED; + } + + Reset_RequestSenseResponse(); +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Unknown_Request (BYTE intfNum) +{ + Reset_RequestSenseResponse(); + + RequestSenseResponse.ResponseCode = RESCODE_CURRENT_ERROR; + RequestSenseResponse.VALID = 1; + RequestSenseResponse.AddSenseLen = 0xA0; + RequestSenseResponse.SenseKey = S_ILLEGAL_REQUEST; + RequestSenseResponse.ASC = ASC_INVALID_COMMAND_OP_CODE; + RequestSenseResponse.ASCQ = ASCQ_INVALID_COMMAND_OP_CODE; + MscState.Scsi_Residue = 0; + MscState.Scsi_Status = SCSI_FAILED; + + if (McsCbw.dCBWDataTransferLength && (McsCbw.bmCBWFlags == DIRECTION_IN)){ + MscState.bMcsCommandSupported = FALSE; + usbStallInEndpoint(intfNum); + } + if (McsCbw.dCBWDataTransferLength && (McsCbw.bmCBWFlags == DIRECTION_OUT)){ + MscState.bMcsCommandSupported = FALSE; + usbStallOutEndpoint(intfNum); + } +} + +//---------------------------------------------------------------------------- + +VOID Scsi_Report_Luns (BYTE intfNum) +{ + if (FAILURE == + Check_CBW( intfNum, DIRECTION_IN, SCSI_REPORT_LUNS_CMD_LEN)){ + return; + } + if (SUCCESS != + MscSendData( (PBYTE)&Report_Luns, SCSI_REPORT_LUNS_CMD_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + +//---------------------------------------------------------------------------- + +BYTE Scsi_Cmd_Parser (BYTE intfNum) +{ + BYTE ret = kUSBMSC_cmdBeingProcessed; + + //MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = McsCbw.dCBWDataTransferLength; + + //fails the commands during UNIT ATTENTION + if ((MscState.bUnitAttention) && (McsCbw.CBWCB[0] != SCSI_INQUIRY) && + (McsCbw.CBWCB[0] != SCSI_REQUEST_SENSE)){ + MscState.Scsi_Status = SCSI_FAILED; + return (kUSB_generalError); + } + + if (!McsCbw.bCBWCBLength){ + return (kUSB_generalError); + } + + switch (McsCbw.CBWCB[0]) //SCSI Operation code + { + case SCSI_READ_10: + if (MscControl[McsCbw.bCBWLUN].xBufferAddr == NULL){ //Check for null address. + ret = kUSB_generalError; + SET_RequestsenseNotReady(); + MscState.Scsi_Status = SCSI_FAILED; + usbStallInEndpoint(intfNum); + break; + } + + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses + //media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallInEndpoint(intfNum); + break; + } + Scsi_Read10(intfNum); + break; + + case SCSI_WRITE_10: + if (MscControl[McsCbw.bCBWLUN].xBufferAddr == NULL){ //Check for null address. + ret = kUSB_generalError; + SET_RequestsenseNotReady(); + MscState.Scsi_Status = SCSI_FAILED; + break; + } + + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses + //media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallOutEndpoint(intfNum); + break; + } + + if (MscControl[McsCbw.bCBWLUN].bWriteProtected){ //Do this only for WRITE + ret = kUSB_generalError; + //Set REQUEST SENSE with "write protected" + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_WRITE_PROTECTED; + RequestSenseResponse.ASC = ASC_WRITE_PROTECTED; + RequestSenseResponse.ASCQ = ASCQ_WRITE_PROTECTED; + MscWriteControl.bWriteProcessing = FALSE; + //Send CSW with error status + MscState.Scsi_Residue = 1; + MscState.Scsi_Status = SCSI_FAILED; + usbStallOutEndpoint(intfNum); + break; + } + + Scsi_Write10(intfNum); + break; + + case START_STOP_UNIT: + case PREVENT_ALLW_MDM: + case SCSI_MODE_SELECT_10: + case SCSI_MODE_SELECT_6: + case SCSI_TEST_UNIT_READY: + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses + //media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + break; + } + Scsi_Test_Unit_Ready(intfNum); + break; + + case SCSI_SET_CD_SPEED: + break; + case SCSI_INQUIRY: + Scsi_Inquiry(intfNum); + break; + + case SCSI_MODE_SENSE_6: + Scsi_Mode_Sense6(intfNum); + break; + + case SCSI_MODE_SENSE_10: + Scsi_Mode_Sense10(intfNum); + break; + + case SCSI_READ_CAPACITY_10: + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallInEndpoint(intfNum); + break; + } + Scsi_Read_Capacity10(intfNum); + break; + + case SCSI_REQUEST_SENSE: + Scsi_Request_Sense(intfNum); + break; + + case SCSI_REPORT_LUNS: + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + if (McsCbw.bmCBWFlags == DIRECTION_IN){ + usbStallInEndpoint(intfNum); + } else { + usbStallOutEndpoint(intfNum); + } + break; + } + Scsi_Report_Luns(intfNum); + break; + case SCSI_VERIFY: + /* Fix for SDOCM00078183 */ + /* NOTE: we are assuming that BYTCHK=0 and PASSing the command. */ + break; +#ifdef CDROM_SUPPORT + + case SCSI_READ_TOC_PMA_ATIP: + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallInEndpoint(intfNum); + break; + } + Scsi_Read_TocPmaAtip(intfNum); + break; + + case SCSI_GET_CONFIGURATION: + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallInEndpoint(intfNum); + break; + } + Scsi_Get_Configuration(intfNum); + break; + case SCSI_EVENT_STATUS: + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallInEndpoint(intfNum); + break; + } + Scsi_Event_Status_Notification(intfNum); + break; + + case SCSI_READ_DISC_INFORMATION: + + if (MscControl[McsCbw.bCBWLUN].bMediaPresent == + kUSBMSC_MEDIA_NOT_PRESENT){ //Check for media present. Do this for any command that accesses media. + ret = kUSB_generalError; + SET_RequestsenseMediaNotPresent(); + usbStallInEndpoint(intfNum); + break; + } + + Scsi_Read_Disc_Information(intfNum); + break; +#endif + default: + ret = kUSB_generalError; + Scsi_Unknown_Request(intfNum); + break; + } + return (ret); +} + +//------------------------------------------------------------------------------------------------------- +/* This function is called only from ISR(only on Input endpoint interrupt to transfer data to host) + * This function actually performs the data transfer to host Over USB */ +BOOL MSCToHostFromBuffer () +{ + //Check if there are any pending LBAs to process + BYTE * pEP1; + BYTE * pEP2; + BYTE * pCT1; + BYTE * pCT2; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + BYTE edbIndex; + BYTE bCount; + + if (MscControl[sRwbuf.lun].yBufferAddr == NULL) { + //Check if there are any pending data to send + if (MscReadControl.dwBytesToSendLeft == 0){ + //no more data to send - clear ready busy status + MscReadControl.bReadProcessing = FALSE; + + //check if more LBA to send out pending... + if (MscReadControl.lbaCount > 0){ + sRwbuf.lba = MscReadControl.lba; //update current lba + sRwbuf.lbCount = MscControl[sRwbuf.lun].lbaBufCapacity > + MscReadControl.lbaCount ? + MscReadControl.lbaCount : MscControl[sRwbuf.lun]. + lbaBufCapacity; //update LBA count + sRwbuf.operation = kUSBMSC_READ; //start data READ phase + sRwbuf.returnCode = kUSBMSC_RWSuccess; + sRwbuf.bufferAddr = MscControl[sRwbuf.lun].xBufferAddr; + sRwbuf.XorY = 0; //only one buffer is active + //buffer is prepared, let user's Application fill data. + USBMSC_handleBufferEvent(); + } + return (TRUE); //data sent out - wake up! + } + } + else { + if ((MscReadControl.lbaCount > 0) && (sRwbuf.bufferProcessed == 1)) { + if ((sRwbuf.XorY == 0) && (sRwbuf.yBufFull == 0)){ + sRwbuf.bufferProcessed = 0; + sRwbuf.XorY = 1; + sRwbuf.bufferAddr = MscControl[sRwbuf.lun].yBufferAddr; + sRwbuf.lba = MscReadControl.lba; //update current lba + sRwbuf.lbCount = MscControl[sRwbuf.lun].lbaBufCapacity > + MscReadControl.lbaCount ? + MscReadControl.lbaCount : MscControl[sRwbuf.lun]. + lbaBufCapacity; //update LBA count + sRwbuf.operation = kUSBMSC_READ; //start data READ phase + sRwbuf.returnCode = kUSBMSC_RWSuccess; + //buffer is prepared, let user's Application fill data. + USBMSC_handleBufferEvent(); + } + else if ((sRwbuf.XorY == 1) && (sRwbuf.xBufFull == 0)){ + sRwbuf.bufferProcessed = 0; + sRwbuf.XorY = 0; + sRwbuf.bufferAddr = MscControl[sRwbuf.lun].xBufferAddr; + sRwbuf.lba = MscReadControl.lba; //update current lba + sRwbuf.lbCount = MscControl[sRwbuf.lun].lbaBufCapacity > + MscReadControl.lbaCount ? + MscReadControl.lbaCount : MscControl[sRwbuf.lun]. + lbaBufCapacity; //update LBA count + sRwbuf.operation = kUSBMSC_READ; //start data READ phase + sRwbuf.returnCode = kUSBMSC_RWSuccess; + //buffer is prepared, let user's Application fill data. + USBMSC_handleBufferEvent(); + } + } + + //Check if there are any pending data to send + if (MscReadControl.dwBytesToSendLeft == 0){ + //no more data to send - clear ready busy status + MscReadControl.bReadProcessing = FALSE; + + if (MscReadControl.XorY == 0) { + sRwbuf.xBufFull = 0; + sRwbuf.xWordCnt = 0; + if (sRwbuf.yBufFull) { + MscSendData(MscControl[sRwbuf.lun].yBufferAddr, sRwbuf.yWordCnt); + MscReadControl.XorY = 1; + } + } + else { + sRwbuf.yBufFull = 0; + sRwbuf.yWordCnt = 0; + if (sRwbuf.xBufFull) { + MscSendData(MscControl[sRwbuf.lun].xBufferAddr, sRwbuf.xWordCnt); + MscReadControl.XorY = 0; + } + } + + return (TRUE); //data sent out - wake up! + } + } + + + edbIndex = stUsbHandle[MSC0_INTFNUM].edb_Index; + + //check if the endpoint is stalled = do not send data. + if (tInputEndPointDescriptorBlock[edbIndex].bEPCNF & EPCNF_STALL){ + return (TRUE); + } + + //send one chunk of 64 bytes + //check what is current buffer: X or Y + if (MscReadControl.bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].iep_X_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[MSC0_INTFNUM].iep_Y_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].iep_Y_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[MSC0_INTFNUM].iep_X_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can send over one endpoint buffer + bCount = + (MscReadControl.dwBytesToSendLeft > + EP_MAX_PACKET_SIZE) ? EP_MAX_PACKET_SIZE : MscReadControl. + dwBytesToSendLeft; + + if (*pCT1 & EPBCNT_NAK){ + USB_TX_memcpy(pEP1, MscReadControl.pUserBuffer, bCount); //copy data into IEPx X or Y buffer + *pCT1 = bCount; //Set counter for usb In-Transaction + MscReadControl.bCurrentBufferXY = + (MscReadControl.bCurrentBufferXY + 1) & 0x01; //switch buffer + MscReadControl.dwBytesToSendLeft -= bCount; + MscReadControl.pUserBuffer += bCount; //move buffer pointer + + //try to send data over second buffer + if ((MscReadControl.dwBytesToSendLeft > 0) && //do we have more data to send? + (*pCT2 & EPBCNT_NAK)){ //if the second buffer is free? + //how many byte we can send over one endpoint buffer + bCount = + (MscReadControl.dwBytesToSendLeft > + EP_MAX_PACKET_SIZE) ? EP_MAX_PACKET_SIZE : MscReadControl. + dwBytesToSendLeft; + //copy data into IEPx X or Y buffer + USB_TX_memcpy(pEP2, MscReadControl.pUserBuffer, bCount); + //Set counter for usb In-Transaction + *pCT2 = bCount; + //switch buffer + MscReadControl.bCurrentBufferXY = + (MscReadControl.bCurrentBufferXY + 1) & 0x01; + MscReadControl.dwBytesToSendLeft -= bCount; + //move buffer pointer + MscReadControl.pUserBuffer += bCount; + } + } //if(*pCT1 & EPBCNT_NAK) + return (bWakeUp); +} + +//------------------------------------------------------------------------------------------------------ + +//This function used to initialize the sending process. +//Use this by functiosn for send CSW or send LBA +//To use only by STACK itself, not by application +//Returns: SUCCESS or FAILURE +BYTE MscSendData (const BYTE* data, WORD size) +{ + BYTE edbIndex; + unsigned short bGIE; + + edbIndex = stUsbHandle[MSC0_INTFNUM].edb_Index; + + if (size == 0){ + return (FAILURE); + } + + bGIE = (__get_SR_register() & GIE); //save interrupt status + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //data can not be read because of USB suspended + __bis_SR_register(bGIE); //restore interrupt status + return (FAILURE); + } + + if ((MscReadControl.dwBytesToSendLeft != 0) || //data was not sent out + (MscReadControl.bReadProcessing == TRUE)){ //still processing previous data + //the USB still sends previous data, we have to wait + __bis_SR_register(bGIE); //restore interrupt status + return (FAILURE); + } + + //This function generate the USB interrupt. The data will be sent out from interrupt + + MscReadControl.bReadProcessing = TRUE; //set reading busy status. + MscReadControl.dwBytesToSendLeft = size; + MscReadControl.pUserBuffer = (BYTE*)data; + + //trigger Endpoint Interrupt - to start send operation + USBIEPIFG |= 1 << (edbIndex + 1); //IEPIFGx; + + __bis_SR_register(bGIE); //restore interrupt status + + return (SUCCESS); +} + +//This function copies data from OUT endpoint into user's buffer +//This function to call only from MSCFromHostToBuffer() +//Arguments: +//pEP - pointer to EP to copy from +//pCT - pointer to EP control reg +// +VOID MscCopyUsbToBuff (BYTE* pEP, BYTE* pCT) +{ + BYTE nCount; + + nCount = *pCT & (~EPBCNT_NAK); + + //how many bytes we can receive to avoid overflow + nCount = + (nCount > + MscWriteControl.dwBytesToReceiveLeft) ? MscWriteControl. + dwBytesToReceiveLeft : + nCount; + + USB_RX_memcpy(MscWriteControl.pUserBuffer, pEP, nCount); //copy data from OEPx X or Y buffer + MscWriteControl.dwBytesToReceiveLeft -= nCount; + MscWriteControl.pUserBuffer += nCount; //move buffer pointer + //to read rest of data next time from this place + MscWriteControl.wFreeBytesLeft -= nCount; //update counter + + MscWriteControl.wCurrentByte += nCount; + if (MscWriteControl.wCurrentByte >= MscControl[sRwbuf.lun].lbaSize){ + MscWriteControl.wCurrentByte = 0; + MscWriteControl.lbaCount++; + } + + //switch current buffer + MscWriteControl.bCurrentBufferXY = + (MscWriteControl.bCurrentBufferXY + 1) & 0x01; + + //clear NAK, EP ready to receive data + *pCT = 0x00; +} + +//------------------------------------------------------------------------------------------------------ +/* This function is called only from ISR(only on Output endpoint interrupt, to recv data from host) + * This function actually recieves the data from host Over USB */ +BOOL MSCFromHostToBuffer () +{ + BYTE * pEP1; + BYTE nTmp1; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + BYTE edbIndex; + + edbIndex = stUsbHandle[MSC0_INTFNUM].edb_Index; + + if (MscState.stallEndpoint == TRUE) { + tOutputEndPointDescriptorBlock[edbIndex].bEPCNF |= EPCNF_STALL; + return TRUE; + } + + if (MscState.bMscCbwReceived == TRUE){ + //previous CBW is not performed, so exit interrupt hendler + //and trigger it again later + return (TRUE); //true for wake up! + } + + if (!MscWriteControl.bWriteProcessing){ //receiving CBW + //CBW will be received here.... + //check what is current buffer: X or Y + if (MscWriteControl.bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_X_Buffer; + MscWriteControl.pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + MscWriteControl.pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_Y_Buffer; + MscWriteControl.pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + MscWriteControl.pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can get from one endpoint buffer + nTmp1 = *MscWriteControl.pCT1; + + if (nTmp1 & EPBCNT_NAK){ + BYTE nCount; + + //switch current buffer + MscWriteControl.bCurrentBufferXY = + (MscWriteControl.bCurrentBufferXY + 1) & 0x01; + + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + nCount = (nTmp1 > sizeof(McsCbw)) ? sizeof(McsCbw) : nTmp1; + USB_RX_memcpy(&McsCbw, pEP1, nCount); //copy data from OEPx X or Y buffer + + //clear NAK, EP ready to receive data + *MscWriteControl.pCT1 = 0x00; + + //set flag and check the CBW from the usbmsc_poll + MscState.bMscCbwReceived = TRUE; + + //second 64b buffer will be not read out here because the CBW is <64 bytes + } + + bWakeUp = TRUE; //wake up to perform CBW + return (bWakeUp); + } + + //if we are here - LBAs will be received + if (MscControl[sRwbuf.lun].yBufferAddr == NULL) { + + /*Check if there are any pending LBAs to process */ + if (MscWriteControl.dwBytesToReceiveLeft > 0){ + //read one chunk of 64 bytes + + //check what is current buffer: X or Y + if (MscWriteControl.bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_X_Buffer; + MscWriteControl.pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + MscWriteControl.pEP2 = + (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_Y_Buffer; + MscWriteControl.pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_Y_Buffer; + MscWriteControl.pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + MscWriteControl.pEP2 = + (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_X_Buffer; + MscWriteControl.pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can get from one endpoint buffer + nTmp1 = *MscWriteControl.pCT1; + + if ((nTmp1 & EPBCNT_NAK) && + (MscWriteControl.wFreeBytesLeft >= 64)){ + //copy data from Endpoint + MscCopyUsbToBuff(pEP1, MscWriteControl.pCT1); + + nTmp1 = *MscWriteControl.pCT2; + + //try read data from second buffer + if ((MscWriteControl.dwBytesToReceiveLeft > 0) && //do we have more data to send? + (MscWriteControl.wFreeBytesLeft >= 64) && + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + //copy data from Endpoint + MscCopyUsbToBuff(MscWriteControl.pEP2, MscWriteControl.pCT2); + //MscWriteControl.pCT1 = MscWriteControl.pCT2; + } + + if ((MscWriteControl.wFreeBytesLeft == 0) || //user's buffer is full, give it to User + (MscWriteControl.dwBytesToReceiveLeft == 0)){ //or no bytes to read left - give it to User + sRwbuf.operation = kUSBMSC_WRITE; + sRwbuf.lba = MscWriteControl.lba; //copy lba number + MscWriteControl.lba += MscWriteControl.lbaCount; + sRwbuf.lbCount = MscWriteControl.lbaCount; //copy lba count + MscWriteControl.wCurrentByte = 0; + MscWriteControl.lbaCount = 0; + + //call event handler, we are ready with data + bWakeUp = USBMSC_handleBufferEvent(); + } //if (wFreeBytesLeft == 0) + } + } //if (MscWriteControl.dwBytesToReceiveLeft > 0) + else { + //perform error handling here, if required. + bWakeUp = TRUE; + } + } + else { + //if we are here - LBAs will be received + if (sRwbuf.bufferProcessed == 1) { + if (sRwbuf.XorY == 0) { + sRwbuf.xBufFull = 0; + if (sRwbuf.yBufFull) { + sRwbuf.bufferProcessed = 0; + sRwbuf.XorY = 1; + sRwbuf.bufferAddr = MscControl[McsCbw.bCBWLUN].yBufferAddr; + sRwbuf.operation = kUSBMSC_WRITE; + sRwbuf.lba = sRwbuf.ylba; //copy lba number + sRwbuf.lbCount = sRwbuf.ylbaCount; //copy lba count + + //call event handler, we are ready with data + bWakeUp = USBMSC_handleBufferEvent(); + } + } + else { + sRwbuf.yBufFull = 0; + if (sRwbuf.xBufFull) { + sRwbuf.bufferProcessed = 0; + sRwbuf.XorY = 0; + sRwbuf.bufferAddr = MscControl[McsCbw.bCBWLUN].xBufferAddr; + sRwbuf.operation = kUSBMSC_WRITE; + sRwbuf.lba = sRwbuf.xlba; //copy lba number + sRwbuf.lbCount = sRwbuf.xlbaCount; //copy lba count + + //call event handler, we are ready with data + bWakeUp = USBMSC_handleBufferEvent(); + } + } + } + + /*Check if there are any pending LBAs to process */ + if (MscWriteControl.dwBytesToReceiveLeft > 0){ + //read one chunk of 64 bytes + + if (MscWriteControl.wFreeBytesLeft == 0) { + P7OUT &= ~BIT1; + P7OUT &= ~BIT2; + P7OUT &= ~BIT3; + if (MscWriteControl.XorY == 0) { + if (sRwbuf.yBufFull == 0) { + P7OUT |= BIT1; + P7OUT |= BIT3; + MscWriteControl.lba += MscWriteControl.lbaCount; + MscWriteControl.wCurrentByte = 0; + MscWriteControl.lbaCount = 0; + MscWriteControl.pUserBuffer = MscControl[sRwbuf.lun].yBufferAddr; + MscWriteControl.XorY = 1; + MscWriteControl.wFreeBytesLeft = + MscControl[sRwbuf.lun].wMscUserBufferSize; + } + } + else { + if (sRwbuf.xBufFull == 0) { + P7OUT |= BIT1; + P7OUT |= BIT2; + MscWriteControl.lba += MscWriteControl.lbaCount; + MscWriteControl.wCurrentByte = 0; + MscWriteControl.lbaCount = 0; + MscWriteControl.pUserBuffer = MscControl[sRwbuf.lun].xBufferAddr; + MscWriteControl.XorY = 0; + MscWriteControl.wFreeBytesLeft = + MscControl[sRwbuf.lun].wMscUserBufferSize; + } + } + } + + + //check what is current buffer: X or Y + if (MscWriteControl.bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_X_Buffer; + MscWriteControl.pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + MscWriteControl.pEP2 = + (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_Y_Buffer; + MscWriteControl.pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_Y_Buffer; + MscWriteControl.pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + MscWriteControl.pEP2 = + (BYTE*)stUsbHandle[MSC0_INTFNUM].oep_X_Buffer; + MscWriteControl.pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can get from one endpoint buffer + nTmp1 = *MscWriteControl.pCT1; + + if ((nTmp1 & EPBCNT_NAK) && + (MscWriteControl.wFreeBytesLeft >= 64)){ + //copy data from Endpoint + MscCopyUsbToBuff(pEP1, MscWriteControl.pCT1); + + nTmp1 = *MscWriteControl.pCT2; + + //try read data from second buffer + if ((MscWriteControl.dwBytesToReceiveLeft > 0) && //do we have more data to send? + (MscWriteControl.wFreeBytesLeft >= 64) && + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + //copy data from Endpoint + MscCopyUsbToBuff(MscWriteControl.pEP2, MscWriteControl.pCT2); + //MscWriteControl.pCT1 = MscWriteControl.pCT2; + } + + if ((MscWriteControl.wFreeBytesLeft == 0) || //user's buffer is full, give it to User + (MscWriteControl.dwBytesToReceiveLeft == 0)){ //or no bytes to read left - give it to User + + if (sRwbuf.firstFlag == 0) { + sRwbuf.firstFlag = 1; + sRwbuf.operation = kUSBMSC_WRITE; + sRwbuf.lba = MscWriteControl.lba; //copy lba number + sRwbuf.lbCount = MscWriteControl.lbaCount; //copy lba count + + //call event handler, we are ready with data + bWakeUp = USBMSC_handleBufferEvent(); + } + if (MscWriteControl.XorY == 0) { + sRwbuf.xBufFull = 1; + sRwbuf.xlba = MscWriteControl.lba; + sRwbuf.xlbaCount = MscWriteControl.lbaCount; + } + else { + sRwbuf.yBufFull = 1; + sRwbuf.ylba = MscWriteControl.lba; + sRwbuf.ylbaCount = MscWriteControl.lbaCount; + } + return (TRUE); + } //if (wFreeBytesLeft == 0) + } + } //if (MscWriteControl.dwBytesToReceiveLeft > 0) + else { + if (sRwbuf.xBufFull ==0 && sRwbuf.yBufFull == 0) { + MscWriteControl.pUserBuffer = NULL; //no more receiving pending + MscWriteControl.bWriteProcessing = FALSE; //ready to receive next CBW + } + bWakeUp = TRUE; + } + } + return (bWakeUp); +} + +//-------------------------------------------------------------------------------------- +/*This function is called by application to indicate buffer processed and ready for stack to operate on */ +BYTE USBMSC_bufferProcessed () +{ + unsigned short bGIE; + BYTE edbIndex; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + //Disable interrupt + _DINT_FET(); + + if (MscControl[sRwbuf.lun].yBufferAddr == NULL) { + /* + * Fix for SDOCM00078384 + * Reset bWriteProcessing after last buffer is processed by the application + */ + if (sRwbuf.operation == kUSBMSC_WRITE && + MscWriteControl.dwBytesToReceiveLeft == 0){ //the Receive opereation (MSC_WRITE) is completed + MscWriteControl.pUserBuffer = NULL; //no more receiving pending + MscWriteControl.bWriteProcessing = FALSE; //ready to receive next CBW + } + + if (sRwbuf.operation == kUSBMSC_WRITE && sRwbuf.returnCode == + kUSBMSC_RWSuccess){ + //initialize user buffer. + MscWriteControl.pUserBuffer = MscControl[sRwbuf.lun].xBufferAddr; + MscWriteControl.wFreeBytesLeft = + MscControl[sRwbuf.lun].wMscUserBufferSize; + sRwbuf.operation = NULL; //no operation pending... + //read out next portion of data if available. + MSCFromHostToBuffer(); + } else if (sRwbuf.operation == kUSBMSC_READ && sRwbuf.returnCode == + kUSBMSC_RWSuccess){ + WORD wCnt = sRwbuf.lbCount * MscControl[sRwbuf.lun].lbaSize; + + //trigger sending LBA(s) + MscSendData(sRwbuf.bufferAddr, wCnt); + + if (sRwbuf.lbCount >= MscReadControl.lbaCount){ + //all bytes sent, reset structure + MscReadControl.lbaCount = 0; + } else { + //update read structure + MscReadControl.lbaCount -= sRwbuf.lbCount; + MscReadControl.lba += sRwbuf.lbCount; + + } + sRwbuf.operation = NULL; //no operation pending... + } + } + else { + if (sRwbuf.operation == kUSBMSC_WRITE && sRwbuf.returnCode == + kUSBMSC_RWSuccess){ + P7OUT &= ~BIT0; + //initialize user buffer. + sRwbuf.bufferProcessed = 1; + if (sRwbuf.XorY == 0) { + sRwbuf.xBufFull = 0; + } + else { + sRwbuf.yBufFull = 0; + } + sRwbuf.operation = NULL; //no operation pending... + //read out next portion of data if available. + MSCFromHostToBuffer(); + } else if (sRwbuf.operation == kUSBMSC_READ && sRwbuf.returnCode == + kUSBMSC_RWSuccess){ + WORD wCnt = sRwbuf.lbCount * MscControl[sRwbuf.lun].lbaSize; + + sRwbuf.bufferProcessed = 1; + + if (sRwbuf.XorY == 0) { + sRwbuf.xBufFull = 1; + sRwbuf.xWordCnt = wCnt; + } + else { + sRwbuf.yBufFull = 1; + sRwbuf.yWordCnt = wCnt; + } + + if (sRwbuf.firstFlag == 0) { + //trigger sending LBA(s) + sRwbuf.firstFlag = 1; + MscSendData(sRwbuf.bufferAddr, wCnt); + } + else { + edbIndex = stUsbHandle[MSC0_INTFNUM].edb_Index; + //trigger Endpoint Interrupt - to start send operation + USBIEPIFG |= 1 << (edbIndex + 1); //IEPIFGx; + } + + if (sRwbuf.lbCount >= MscReadControl.lbaCount){ + //all bytes sent, reset structure + MscReadControl.lbaCount = 0; + sRwbuf.operation = NULL; + } else { + //update read structure + MscReadControl.lbaCount -= sRwbuf.lbCount; + MscReadControl.lba += sRwbuf.lbCount; + } + sRwbuf.operation = NULL; //no operation pending... + } + } + + switch (sRwbuf.returnCode) + { + case kUSBMSC_RWSuccess: + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + break; + //Set RequestSenseResponse if necessary? Maybe initialized values OK? + + case kUSBMSC_RWNotReady: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 1; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_NOT_READY; + RequestSenseResponse.ASC = ASC_NOT_READY; + RequestSenseResponse.ASCQ = ASCQ_NOT_READY; + break; + + case kUSBMSC_RWIllegalReq: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_ILLEGAL_REQUEST; + RequestSenseResponse.ASC = ASC_ILLEGAL_REQUEST; + RequestSenseResponse.ASCQ = ASCQ_ILLEGAL_REQUEST; + break; + + case kUSBMSC_RWUnitAttn: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_UNITATTN; + RequestSenseResponse.ASC = ASC_UNITATTN_READY_NOTREADY; + RequestSenseResponse.ASCQ = ASCQ_UNITATTN_READY_NOTREADY; + break; + + case kUSBMSC_RWLbaOutOfRange: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_ILLEGAL_REQUEST; + RequestSenseResponse.ASC = ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; + RequestSenseResponse.ASCQ = ASCQ_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; + break; + + case kUSBMSC_RWMedNotPresent: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_NOT_READY; + RequestSenseResponse.ASC = ASC_MEDIUM_NOT_PRESENT; + RequestSenseResponse.ASCQ = ASCQ_MEDIUM_NOT_PRESENT; + break; + + case kUSBMSC_RWDevWriteFault: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_MEDIUM_ERROR; + RequestSenseResponse.ASC = ASC_WRITE_FAULT; + RequestSenseResponse.ASCQ = ASCQ_WRITE_FAULT; + break; + + case kUSBMSC_RWUnrecoveredRead: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_MEDIUM_ERROR; + RequestSenseResponse.ASC = ASC_UNRECOVERED_READ; + RequestSenseResponse.ASCQ = ASCQ_UNRECOVERED_READ; + break; + + case kUSBMSC_RWWriteProtected: + MscState.Scsi_Status = SCSI_FAILED; + MscState.Scsi_Residue = 0; + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_WRITE_PROTECTED; + RequestSenseResponse.ASC = ASC_WRITE_PROTECTED; + RequestSenseResponse.ASCQ = ASCQ_WRITE_PROTECTED; + break; + //case breakouts for all the codes + } + + if (sRwbuf.returnCode != kUSBMSC_RWSuccess){ + sRwbuf.operation = NULL; //no operation pending... + if (McsCbw.bmCBWFlags == DIRECTION_IN){ + usbStallInEndpoint(MSC0_INTFNUM); + MscReadControl.bReadProcessing = FALSE; //ready to receive next CBW + MscReadControl.pUserBuffer = NULL; //no more receiving pending + MscReadControl.lbaCount = 0; + } else { + //we need to stall only if not all af data was transfered + if (MscWriteControl.dwBytesToReceiveLeft > 0){ + usbStallOutEndpoint(MSC0_INTFNUM); + } + MscWriteControl.bWriteProcessing = FALSE; //ready to receive next CBW + MscWriteControl.pUserBuffer = NULL; //no more receiving pending + *MscWriteControl.pCT1 = 0x00; //clear NAK, EP ready to receive next data + *MscWriteControl.pCT2 = 0x00; //clear NAK, EP ready to receive next data + } + } + + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +//------------------------------------------------------------------------------------------- +VOID Msc_ResetFlags () +{ + MscState.bMscCbwReceived = FALSE; +} + +//------------------------------------------------------------------------------------------- +VOID Msc_ResetStruct () +{ + memset(&sRwbuf,0,sizeof(USBMSC_RWbuf_Info)); + memset(&McsCbw,0,sizeof(CBW)); + memset(&McsCsw,0,sizeof(CSW)); + + MscReadControl.pUserBuffer = NULL; + MscReadControl.dwBytesToSendLeft = 0; + MscReadControl.bReadProcessing = FALSE; + + MscWriteControl.bWriteProcessing = FALSE; + MscWriteControl.pUserBuffer = NULL; + MscWriteControl.dwBytesToReceiveLeft = 0; //holds how many bytes is still requested by WRITE operation (Host to MSP430) + //we do not reset the bCurrentBufferXY, becuase the buffer doesnt changed if he MSC reseted. + //The bCurrentBufferXY should be reseted in USB_Reset() + + Reset_RequestSenseResponse(); +} + +//------------------------------------------------------------------------------------------- +VOID MscResetData () +{ + Msc_ResetStruct(); + + memset(&MscWriteControl, 0, sizeof(MscWriteControl)); + memset(&MscReadControl, 0, sizeof(MscReadControl)); +} + +//------------------------------------------------------------------------------------------- +VOID MscResetCtrlLun () +{ + int i; + + for (i = 0; i < MSC_MAX_LUN_NUMBER; i++) + { + MscControl[i].bMediaPresent = 0x80; + MscControl[i].bWriteProtected = FALSE; + } +} + +//------------------------------------------------------------------------------------------- +/* This function can be called by application to get the current status of stack operation */ +BYTE USBMSC_getState () +{ + BYTE state; + + if (sRwbuf.operation == 0 && MscState.bMscSendCsw == FALSE){ + state = kUSBMSC_idle; + } else if (sRwbuf.operation == kUSBMSC_READ && sRwbuf.lbCount > 0){ + state = kUSBMSC_readInProgress; + } else if (sRwbuf.operation == kUSBMSC_WRITE && sRwbuf.lbCount > 0){ + state = kUSBMSC_writeInProgress; + } else if (sRwbuf.operation == 0 && MscState.bMscSendCsw == TRUE){ + state = kUSBMSC_cmdBeingProcessed; + } + return (state); +} + +//------------------------------------------------------------------------------------------- +BYTE USBMSC_updateMediaInfo ( BYTE lun, struct USBMSC_mediaInfoStr *info) +{ + BYTE state; + + Scsi_Read_Capacity_10[lun].lLba[0] = (BYTE)(info->lastBlockLba >> 24); + Scsi_Read_Capacity_10[lun].lLba[1] = (BYTE)(info->lastBlockLba >> 16); + Scsi_Read_Capacity_10[lun].lLba[2] = (BYTE)(info->lastBlockLba >> 8); + Scsi_Read_Capacity_10[lun].lLba[3] = (BYTE)(info->lastBlockLba); + + Scsi_Read_Capacity_10[lun].bLength[0] = (BYTE)(info->bytesPerBlock >> 24); + Scsi_Read_Capacity_10[lun].bLength[1] = (BYTE)(info->bytesPerBlock >> 16); + Scsi_Read_Capacity_10[lun].bLength[2] = (BYTE)(info->bytesPerBlock >> 8); + Scsi_Read_Capacity_10[lun].bLength[3] = (BYTE)(info->bytesPerBlock); + + MscControl[lun].lbaSize = (WORD)Scsi_Read_Capacity_10[lun].bLength[2] << + 8 | Scsi_Read_Capacity_10[lun].bLength[3]; + + //If the LUN was reported as not removable, then leave mediaPresent/mediaChanged as + //their initialized defaults. + if (USBMSC_config.LUN[lun].removable){ + if (((MscControl[lun].bMediaPresent == kUSBMSC_MEDIA_NOT_PRESENT)) && + (info->mediaPresent == kUSBMSC_MEDIA_PRESENT)){ //If media was inserted... + //Set Unit Attention flag. This flag is used in Scsi_Request_Sense(). + MscState.bUnitAttention = TRUE; + MscState.Scsi_Status = SCSI_FAILED; + } + + if ((MscControl[lun].bMediaPresent == kUSBMSC_MEDIA_PRESENT && + ((info->mediaPresent == kUSBMSC_MEDIA_NOT_PRESENT))) || //If media was removed... + ((info->mediaPresent == kUSBMSC_MEDIA_PRESENT) && + (info->mediaChanged))){ //Or if media still present, but has changed... + //Set Unit Attention flag. This flag is used in Scsi_Request_Sense(). + MscState.bUnitAttention = TRUE; + MscState.Scsi_Status = SCSI_FAILED; + state = USBMSC_getState(); + + if (state == kUSBMSC_readInProgress || state == + kUSBMSC_writeInProgress){ + if (McsCbw.bmCBWFlags == DIRECTION_IN){ + usbStallInEndpoint(MSC0_INTFNUM); + } else { + usbStallOutEndpoint(MSC0_INTFNUM); + } + + Msc_ResetStateMachine(); + Msc_ResetFlags(); + Msc_ResetStruct(); + MscState.isMSCConfigured = TRUE; + + Scsi_Send_CSW(MSC0_INTFNUM); + } + } + MscControl[lun].bMediaPresent = info->mediaPresent; + } + + MscControl[lun].bWriteProtected = info->writeProtected; + return (kUSB_succeed); +} + +//------------------------------------------------------------------------------------------- +BYTE USBMSC_registerBufInfo (BYTE lun, BYTE *RWbuf_x, BYTE *RWbuf_y, WORD size) +{ + MscControl[lun].wMscUserBufferSize = 0; + MscControl[lun].xBufferAddr = NULL; + MscControl[lun].yBufferAddr = NULL; //this version supports only X buffer. + + //check if arguments are valid + if ((size < MscControl[lun].lbaSize) || + (RWbuf_x == NULL)){ //Need at least one buffer + return (kUSB_generalError); + } + + MscControl[lun].wMscUserBufferSize = size; + MscControl[lun].lbaBufCapacity = MscControl[lun].wMscUserBufferSize / + MscControl[lun].lbaSize; + MscControl[lun].xBufferAddr = RWbuf_x; + MscControl[lun].yBufferAddr = RWbuf_y; + return (kUSB_succeed); +} + +//------------------------------------------------------------------------------------------- +VOID SET_RequestsenseNotReady () +{ + //Set REQUEST SENSE with "not ready" + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_NOT_READY; + RequestSenseResponse.ASC = ASC_NOT_READY; + RequestSenseResponse.ASCQ = ASCQ_NOT_READY; + //Send CSW with error status + MscState.Scsi_Status = SCSI_FAILED; +} + +//------------------------------------------------------------------------------------------- +VOID SET_RequestsenseMediaNotPresent () +{ + //Set REQUEST SENSE with "not ready" + Reset_RequestSenseResponse(); + RequestSenseResponse.VALID = 1; + RequestSenseResponse.SenseKey = S_NOT_READY; + RequestSenseResponse.ASC = ASC_MEDIUM_NOT_PRESENT; + RequestSenseResponse.ASCQ = ASCQ_MEDIUM_NOT_PRESENT; + //Send CSW with error status + MscState.Scsi_Status = SCSI_FAILED; +} + +//------------------------------------------------------------------------------------------- +VOID usbClearOEPByteCount (BYTE intfNum) +{ + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; +} + +//------------------------------------------------------------------------------------------- +VOID usbStallEndpoint (BYTE intfNum) +{ + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + tOutputEndPointDescriptorBlock[edbIndex].bEPCNF |= EPCNF_STALL; + tInputEndPointDescriptorBlock[edbIndex].bEPCNF |= EPCNF_STALL; +} + +//------------------------------------------------------------------------------------------- +VOID usbStallInEndpoint (BYTE intfNum) +{ + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + tInputEndPointDescriptorBlock[edbIndex].bEPCNF |= EPCNF_STALL; +} + +//------------------------------------------------------------------------------------------- +VOID usbStallOutEndpoint (BYTE intfNum) +{ + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + tOutputEndPointDescriptorBlock[edbIndex].bEPCNF |= EPCNF_STALL; + MscState.stallEndpoint = TRUE; +} + +//------------------------------------------------------------------------------------------- +USBMSC_RWbuf_Info* USBMSC_fetchInfoStruct (VOID) +{ + return (&sRwbuf); +} + +#ifdef CDROM_SUPPORT +//---------------------------------------------------------------------------- + +VOID Scsi_Read_TocPmaAtip(BYTE intfNum) +{ + if(McsCbw.CBWCB[2] & 0x01) { + + if (SUCCESS != + MscSendData( (PBYTE)&Scsi_Read_TOC_PMA_ATIP_F1[McsCbw.bCBWLUN], + Scsi_Read_TOC_PMA_ATIP_F1_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } + } else { + + if (SUCCESS != + MscSendData( (PBYTE)&Scsi_Read_TOC_PMA_ATIP_F2[McsCbw.bCBWLUN], + Scsi_Read_TOC_PMA_ATIP_F2_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } + } +} + +VOID Scsi_Get_Configuration(BYTE intfNum) { + + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_GET_CONFIGURATION_LEN)){ + return; + } + + if (SUCCESS != + MscSendData( (PBYTE)&Scsi_Get_Configuration_Descriptor[McsCbw.bCBWLUN], + SCSI_GET_CONFIGURATION_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + +VOID Scsi_Event_Status_Notification(BYTE intfNum) { + + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_EVENT_STATUS_LEN)){ + return; + } + if (SUCCESS != + MscSendData( (PBYTE)&Scsi_Event_Status_Descriptor[McsCbw.bCBWLUN], + SCSI_EVENT_STATUS_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + +VOID Scsi_Read_Disc_Information(BYTE intfNum) { + + + if (FAILURE == Check_CBW(intfNum,DIRECTION_IN,SCSI_READ_DISC_INFORMATION_LEN)){ + return; + } + if (SUCCESS != + MscSendData( (PBYTE)&Scsi_Disc_Information_Descriptor[McsCbw.bCBWLUN], + SCSI_READ_DISC_INFORMATION_LEN)){ + MscState.Scsi_Status = SCSI_FAILED; + } +} + +#endif + +#endif //_MSC_ + +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscScsi.h b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscScsi.h new file mode 100644 index 0000000..9cdd072 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscScsi.h @@ -0,0 +1,305 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: Msc_Scsi.h, File Version 1.02 | + | Description: This file contains all the structure,function declarations | + | used by stack | + | Author: Biju,MSP | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | MSP 2010/02/16 Created | + | Biju,MSP 2010/07/15 CV bug fix | + +----------------------------------------------------------------------------*/ +#ifndef _UMSC_SCSI_H_ +#define _UMSC_SCSI_H_ + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*Macros for CBW, CSW signatures */ +#define CBW_SIGNATURE 0x43425355u +#define CSW_SIGNATURE 0x53425355u + +/*CBW, CSW length in bytes */ +#define CBW_LENGTH 31 +#define CSW_LENGTH 13 + +/*SCSI Commands - Mandatory only implemented */ +#define SCSI_TEST_UNIT_READY 0x00 +#define SCSI_REQUEST_SENSE 0x03 +#define SCSI_INQUIRY 0x12 +#define SCSI_MODE_SENSE_6 0x1A +#define SCSI_MODE_SENSE_10 0x5A +#define SCSI_READ_CAPACITY_10 0x25 +#define SCSI_READ_10 0x28 +#define SCSI_WRITE_10 0x2A +#define SCSI_READ_FORMAT_CAPACITIES 0x23 +#define SCSI_MODE_SELECT_6 0x15 +#define SCSI_MODE_SELECT_10 0x55 +#define PREVENT_ALLW_MDM 0x1E +#define START_STOP_UNIT 0x1B +#define SCSI_REPORT_LUNS 0xA0 +#define SCSI_VERIFY 0x2F + +#define SCSI_READ_TOC_PMA_ATIP 0x43 +#define Scsi_Read_TOC_PMA_ATIP_F1_LEN 20 +#define Scsi_Read_TOC_PMA_ATIP_F2_LEN 48 +#define SCSI_GET_CONFIGURATION 0x46 +#define SCSI_GET_CONFIGURATION_LEN 4 +#define SCSI_EVENT_STATUS 0x4A +#define SCSI_EVENT_STATUS_LEN 8 +#define SCSI_READ_DISC_INFORMATION 0x51 +#define SCSI_SET_CD_SPEED 0xBB +#define SCSI_READ_DISC_INFORMATION_LEN 36 + +/*SCSI Status codes. Used in CSW response */ +#define SCSI_PASSED 0 +#define SCSI_FAILED 1 +#define SCSI_PHASE_ERROR 2 +#define SCSI_READWRITE_FAIL 2 + +#define kUSBMSC_RWSuccess 0 +#define kUSBMSC_RWNotReady 1 +#define kUSBMSC_RWIllegalReq 2 +#define kUSBMSC_RWUnitAttn 3 +#define kUSBMSC_RWLbaOutOfRange 4 +#define kUSBMSC_RWMedNotPresent 5 +#define kUSBMSC_RWDevWriteFault 6 +#define kUSBMSC_RWUnrecoveredRead 7 +#define kUSBMSC_RWWriteProtected 8 + + +/* Macros to indicate READ or WRITE operation */ +#define kUSBMSC_READ 1 +#define kUSBMSC_WRITE 2 + +#define kUSBMSC_MEDIA_PRESENT 0x81 +#define kUSBMSC_MEDIA_NOT_PRESENT 0x82 + +#define kUSBMSC_WRITE_PROTECTED 0x00 + +/* Defines for MSC SCSI State-Machine */ +#define MSC_READY 0x00 +#define MSC_COMMAND_TRANSPORT 0x01 +#define MSC_DATA_IN 0x02 +#define MSC_DATA_OUT 0x03 +#define MSC_STATUS_TRANSPORT 0x04 +#define MSC_DATA 0x05 +#define MSC_WAIT4RESET 0x06 + +/*Lengths of SCSI commands(in bytes) */ +#define SCSI_SCSI_INQUIRY_CMD_LEN 36 +#define SCSI_READ_CAPACITY_CMD_LEN 8 +#define SCSI_MODE_SENSE_6_CMD_LEN 4 +#define SCSI_MODE_SENSE_10_CMD_LEN 8 +#define SCSI_REQ_SENSE_CMD_LEN 18 +#define SCSI_READ_FORMAT_CAPACITY_CMD_LEN 12 +#define SCSI_REPORT_LUNS_CMD_LEN 16 + +/*----------------------------------------------------------------------------+ + | Type defines and structures | + +----------------------------------------------------------------------------*/ +/*CBW Structure */ +typedef struct { + DWORD dCBWSignature; + DWORD dCBWTag; + DWORD dCBWDataTransferLength; + BYTE bmCBWFlags; + BYTE bCBWLUN; + BYTE bCBWCBLength; + BYTE CBWCB[16]; +} CBW, *pCBW; + +/*CSW structure */ +typedef struct { + DWORD dCSWSignature; + DWORD dCSWTag; + DWORD dCSWDataResidue; + BYTE bCSWStatus; +} CSW, *pCSW; + +/*Request Response union(Required for Request sense command) */ +typedef struct { + BYTE ResponseCode : 7; + BYTE VALID : 1; + BYTE Obsolete; + BYTE SenseKey : 4; + BYTE Resv : 1; + BYTE ILI : 1; + BYTE EOM : 1; + BYTE FILEMARK : 1; + BYTE Information[4]; + BYTE AddSenseLen; + BYTE CmdSpecificInfo[4]; + BYTE ASC; + BYTE ASCQ; + BYTE FRUC; + BYTE SenseKeySpecific[3]; + BYTE padding[14]; /* padding to cover case where host requests 24 bytes of sense data */ +} REQUEST_SENSE_RESPONSE; + +/*Read capacity union(Required for READ CAPACITY command)*/ +typedef struct { + DWORD Last_LBA; + BYTE Resv; + BYTE Size_LBA[3]; +} SCSI_READ_CAPACITY; + +/*Structure internal to stack for holding LBA,buffer addr etc information*/ +typedef struct { + //BYTE intfNum; + BYTE lun; + BYTE operation; + DWORD lba; + BYTE lbCount; + BYTE *bufferAddr; + BYTE returnCode; + BYTE XorY; + BYTE xBufFull; + WORD xWordCnt; + BYTE yBufFull; + WORD yWordCnt; + BYTE bufferProcessed; + BYTE firstFlag; + DWORD xlba; + BYTE xlbaCount; + DWORD ylba; + BYTE ylbaCount; + +}USBMSC_RWbuf_Info; + +/*Media info structure */ +struct USBMSC_mediaInfoStr { + DWORD lastBlockLba; + DWORD bytesPerBlock; + BYTE mediaPresent; + BYTE mediaChanged; + BYTE writeProtected; +}; + +/*Lun entry Structures */ +struct _LUN_entry_struct { + BYTE number; + BYTE PDT; + BYTE removable; + char t10VID[8]; + char t10PID[16]; + char t10rev[4]; +}; + +struct config_struct { + struct _LUN_entry_struct LUN[MSC_MAX_LUN_NUMBER]; +}; + +struct _Report_Luns { + BYTE LunListLength[4]; + BYTE Reserved[4]; + BYTE LunList1[8]; +}; + +struct _Scsi_Read_Capacity { + BYTE lLba[4]; //Last logical block address + BYTE bLength[4]; //Block length, in this case 0x200 = 512 bytes for each Logical Block +}; + +//structure for controlling WRITE phase (HOST to MSP430) +struct _MscWriteControl { + DWORD dwBytesToReceiveLeft; //holds how many bytes is still requested by WRITE operation: + //Host to MSP430. + WORD wFreeBytesLeft; //free bytes left in UserBuffer + DWORD lba; //holds the current LBA number. This is the first LBA in the UserBuffer + BYTE *pUserBuffer; //holds the current position of user's receiving buffer. + //If NULL- no receiving operation started + WORD wCurrentByte; //how many bytes in current LBA are received + WORD lbaCount; //how many LBA we have received in current User Buffer + BYTE * pCT1; //holds current EPBCTxx register + BYTE * pCT2; //holds next EPBCTxx register + BYTE * pEP2; //holds addr of the next EP buffer + BYTE bCurrentBufferXY; //indicates which buffer is used by host to transmit data via OUT + BYTE bWriteProcessing; //indicated if the current state is DATA WRITE phase or CBW receiwing + BYTE XorY; +}; + +//structure for controlling READ phase (MSP430 to HOST) +struct _MscReadControl { + DWORD dwBytesToSendLeft; //holds how many bytes is still requested by WRITE operation (Host to MSP430) + BYTE *pUserBuffer; //holds the current position of user's receiving buffer. + //If NULL- no receiving operation started + DWORD lba; //holds the current LBA number. This is the first LBA in the UserBuffer. + BYTE * pCT1; //holds current EPBCTxx register + BYTE * pCT2; //holds next EPBCTxx register + BYTE * pEP2; //holds addr of the next EP buffer + WORD lbaCount; //how many LBA we have to send to Host + BYTE bCurrentBufferXY; //indicates which buffer is used by host to transmit data via OUT + BYTE bReadProcessing; //indicated if the current state is DATA READ phase or CSW sending + //initiated by McsDataSend() + BYTE XorY; +}; + +//structure for common control of MSC stack +struct _MscControl { + WORD wMscUserBufferSize; + WORD lbaSize; //limitid to WORD, but could be increased if required. + BYTE lbaBufCapacity; //how many LBAs (max) contains UserBuffer for read/write operation (>=1) + BYTE *xBufferAddr; + BYTE *yBufferAddr; + BYTE bMediaPresent; + BYTE bWriteProtected; +}; + +struct _MscState { + volatile DWORD Scsi_Residue; + volatile BYTE Scsi_Status; /*Variable to track command status */ + BOOL bMcsCommandSupported; /*Flag to indicate read/write command is recieved from host */ + BOOL bMscCbwReceived; /*Flag to inidicate whether any CBW recieved from host*/ + BOOL bMscSendCsw; + BOOL isMSCConfigured; + BYTE bUnitAttention; + BYTE bMscCbwFailed; + BYTE bMscResetRequired; + BYTE stallEndpoint; +}; + +extern struct _MscWriteControl MscWriteControl; +extern struct _MscReadControl MscReadControl; +extern struct _MscControl MscControl[]; + +/*----------------------------------------------------------------------------+ + | Extern Variables | + +----------------------------------------------------------------------------*/ + +extern CBW cbw; +extern CSW csw; +extern REQUEST_SENSE_RESPONSE RequestSenseResponse; + +/*----------------------------------------------------------------------------+ + | Function Prototypes | + +----------------------------------------------------------------------------*/ + +/*SCSI Wrapper functions */ +BYTE Scsi_Cmd_Parser (BYTE opcode); +BYTE Scsi_Send_CSW (BYTE intfNum); + +/*Function to reset MSC SCSI state machine */ +VOID Msc_ResetStateMachine(VOID); +VOID Msc_ResetFlags(VOID); +VOID Msc_ResetStruct(VOID); +VOID SET_RequestsenseNotReady(VOID); +VOID SET_RequestsenseMediaNotPresent(VOID); +VOID MscResetCtrlLun(VOID); + +USBMSC_RWbuf_Info* USBMSC_fetchInfoStruct(VOID); +#ifdef __cplusplus +} +#endif +#endif //_MSC_SCSI_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscStateMachine.c b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscStateMachine.c new file mode 100644 index 0000000..adf4c03 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscStateMachine.c @@ -0,0 +1,143 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: Msc_State_Machine.c, File Version 1.01 | + | Description: This file contains the core function that handles the MSC SCSI| + | state machine. | + | Author: Biju,MSP | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | MSP 2010/02/16 Created | + | Biju,MSP 2010/07/15 CV Bug fix | + | RSTO 2010/10/30 state machine rework | + +----------------------------------------------------------------------------*/ +/*File includes */ +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" +#include "../USB_Common/defMSP430USB.h" +#include "../USB_MSC_API/UsbMscScsi.h" +#include "../USB_MSC_API/UsbMsc.h" +#include "../USB_Common/usb.h" +#include +#include + +#ifdef _MSC_ + +/*Macros to indicate data direction */ +#define DIRECTION_IN 0x80 +#define DIRECTION_OUT 0x00 + +/*Buffer pointers passed by application */ +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern struct _MscState MscState; + +BYTE Scsi_Verify_CBW (); + +/*----------------------------------------------------------------------------+ + | Functions | + +----------------------------------------------------------------------------*/ +VOID Msc_ResetStateMachine (VOID) +{ + MscState.bMscSendCsw = FALSE; + MscState.Scsi_Residue = 0; + MscState.Scsi_Status = SCSI_PASSED; /*Variable to track command status */ + MscState.bMcsCommandSupported = TRUE; /*Flag to indicate read/write command is recieved from host */ + MscState.bMscCbwReceived = 0; /*Flag to inidicate whether any CBW recieved from host*/ + MscState.bMscSendCsw = FALSE; + MscState.isMSCConfigured = FALSE; + MscState.bUnitAttention = FALSE; + MscState.bMscCbwFailed = FALSE; + MscState.bMscResetRequired = FALSE; + MscState.stallEndpoint = FALSE; +} + +//---------------------------------------------------------------------------- +/*This is the core function called by application to handle the MSC SCSI state + * machine */ +BYTE USBMSC_poll () +{ + BYTE edbIndex; + + edbIndex = stUsbHandle[MSC0_INTFNUM].edb_Index; + + //check if currently transmitting data.. + if (MscReadControl.bReadProcessing == TRUE){ + BYTE bGIE; + bGIE = (__get_SR_register() & GIE); //save interrupt status + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + if ((MscReadControl.dwBytesToSendLeft == 0) && + (MscReadControl.lbaCount == 0)){ + //data is no more processing - clear flags.. + MscReadControl.bReadProcessing = FALSE; + __bis_SR_register(bGIE); //restore interrupt status + } else { + if (!(tInputEndPointDescriptorBlock[edbIndex].bEPCNF & + EPCNF_STALL)){ //if it is not stalled - contiune communication + USBIEPIFG |= 1 << (edbIndex + 1); //trigger IN interrupt to finish data tranmition + } + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBMSC_processBuffer); + } + } + + if (MscState.isMSCConfigured == FALSE){ + return (kUSBMSC_okToSleep); + } + + if (!MscState.bMscSendCsw){ + if (MscState.bMscCbwReceived){ + if (Scsi_Verify_CBW() == SUCCESS){ + //Successful reception of CBW + //Parse the CBW opcode and invoke the right command handler function + Scsi_Cmd_Parser(MSC0_INTFNUM); + MscState.bMscSendCsw = TRUE; + } + MscState.bMscCbwReceived = FALSE; //CBW is performed! + } else { + return (kUSBMSC_okToSleep); + } + //check if any of out pipes has pending data and trigger interrupt + + if ((MscWriteControl.pCT1 != NULL) && + ((*MscWriteControl.pCT1 & EPBCNT_NAK ) || + (*MscWriteControl.pCT2 & EPBCNT_NAK ))){ + USBOEPIFG |= 1 << (edbIndex + 1); //trigger OUT interrupt again + return (kUSBMSC_okToSleep); //do not asleep, as data is coming in + //and follow up data perform will be required. + } + } + + if (MscState.bMscSendCsw){ + if (MscState.bMcsCommandSupported == TRUE){ + //watiting till transport is finished! + if ((MscWriteControl.bWriteProcessing == FALSE) && + (MscReadControl.bReadProcessing == FALSE) && + (MscReadControl.lbaCount == 0)){ + //Send CSW + if (SUCCESS == Scsi_Send_CSW(MSC0_INTFNUM)){ + MscState.bMscSendCsw = FALSE; + return (kUSBMSC_okToSleep); + } + } + else { + MSCFromHostToBuffer(); + } + } + } + + return (kUSBMSC_processBuffer); //When MscState.bMcsCommandSupported = FALSE, bReadProcessing became true, and + //bWriteProcessing = true. +} + +#endif //_MSC_ +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscStateMachine.h b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscStateMachine.h new file mode 100644 index 0000000..fbf5803 --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_MSC_API/UsbMscStateMachine.h @@ -0,0 +1,31 @@ +//(c)2010 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (MSC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbMsc.h, File Version 1.01 | + | Description: This file contains API declarations for function to use by | + | User Application. | + | Author: Biju,MSP | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2010/10/29 Created | + +----------------------------------------------------------------------------*/ +#ifndef _USB_MSCSTATE_H_ +#define _USB_MSCSTATE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//this file is obsolete. To delete in next version. + +#ifdef __cplusplus +} +#endif +#endif //_USB_MSCSTATE_H_ diff --git a/Bios/src/fw/fet/USB_API/USB_PHDC_API/UsbPHDC.c b/Bios/src/fw/fet/USB_API/USB_PHDC_API/UsbPHDC.c new file mode 100644 index 0000000..9e706ad --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_PHDC_API/UsbPHDC.c @@ -0,0 +1,857 @@ +//(c)2009 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (PHDC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbPHDC.c, File Version 1.01 2009/12/03 | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2008/09/03 born | + | RSTO 2008/09/19 Changed USBPHDC_sendData to send more then 64bytes| + | RSTO 2008/12/23 enhancements of PHDC API | + | RSTO 2008/05/19 updated USBPHDC_intfStatus() | + | RSTO 2009/05/26 added USBPHDC_bytesInUSBBuffer() | + | RSTO 2009/05/28 changed USBPHDC_sendData() | + | RSTO 2009/07/17 updated USBPHDC_bytesInUSBBuffer() | + | RSTO 2009/10/21 move __disable_interrupt() before | + | checking for suspend | + +----------------------------------------------------------------------------*/ +#include + +#ifdef _PHDC_ + + +#include "../USB_Common/device.h" +#include "../USB_Common/types.h" //Basic Type declarations +#include "../USB_Common/defMSP430USB.h" +#include "../USB_Common/usb.h" //USB-specific Data Structures +#include "..\USB_PHDC_API\UsbPHDC.h" +#include + +//Local Macros +#define INTFNUM_OFFSET(X) (X - PHDC0_INTFNUM) //Get the PHDC offset + +static struct _PHDCWrite { + WORD nPHDCBytesToSend; //holds counter of bytes to be sent + WORD nPHDCBytesToSendLeft; //holds counter how many bytes is still to be sent + const BYTE* pUsbBufferToSend; //holds the buffer with data to be sent + BYTE bCurrentBufferXY; //is 0 if current buffer to write data is X, or 1 if current buffer is Y + BYTE bZeroPacketSent; //= FALSE; + BYTE last_ByteSend; +} PHDCWriteCtrl[PHDC_NUM_INTERFACES]; + +static struct _PHDCRead { + BYTE *pUserBuffer; //holds the current position of user's receiving buffer. If NULL- no receiving + //operation started + BYTE *pCurrentEpPos; //current positon to read of received data from curent EP + WORD nBytesToReceive; //holds how many bytes was requested by receiveData() to receive + WORD nBytesToReceiveLeft; //holds how many bytes is still requested by receiveData() to receive + BYTE * pCT1; //holds current EPBCTxx register + BYTE * pCT2; //holds next EPBCTxx register + BYTE * pEP2; //holds addr of the next EP buffer + BYTE nBytesInEp; //how many received bytes still available in current EP + BYTE bCurrentBufferXY; //indicates which buffer is used by host to transmit data via OUT endpoint3 +} PHDCReadCtrl[PHDC_NUM_INTERFACES]; + +extern WORD wUsbEventMask; + +//function pointers +extern VOID *(*USB_TX_memcpy)(VOID * dest, const VOID * source, size_t count); +extern VOID *(*USB_RX_memcpy)(VOID * dest, const VOID * source, size_t count); + +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES +extern const struct abromConfigurationDescriptorGroupPHDC abromConfigurationDescriptorGroupPHDC; +#endif +/*----------------------------------------------------------------------------+ + | Global Variables | + +----------------------------------------------------------------------------*/ + +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[]; + + +VOID PHDCResetData () +{ + //indicates which buffer is used by host to transmit data via OUT endpoint3 - X buffer is first + //PHDCReadCtrl[intfIndex].bCurrentBufferXY = X_BUFFER; + + memset(&PHDCWriteCtrl, 0, sizeof(PHDCWriteCtrl)); + memset(&PHDCReadCtrl, 0, sizeof(PHDCReadCtrl)); +} + +/* + * Sends data over interface intfNum, of size size and starting at address data. + * Returns: kUSBPHDC_sendStarted + * kUSBPHDC_sendComplete + * kUSBPHDC_intfBusyError + */ +BYTE USBPHDC_sendData (const BYTE* data, WORD size, BYTE intfNum) +{ + BYTE edbIndex; + unsigned short bGIE; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (size == 0){ + return (kUSBPHDC_generalError); + } + + bGIE = (__get_SR_register() & GIE); //save interrupt status + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //data can not be read because of USB suspended + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_busNotAvailable); + } + + if (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft != 0){ + //the USB still sends previous data, we have to wait + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_intfBusyError); + } + + //This function generate the USB interrupt. The data will be sent out from interrupt + + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSend = size; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft = size; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend = data; + + //trigger Endpoint Interrupt - to start send operation + USBIEPIFG |= 1 << (edbIndex + 1); //IEPIFGx; + + __bis_SR_register(bGIE); //restore interrupt status + + return (kUSBPHDC_sendStarted); +} + +//workaround for PHDC windows driver: it doesn't give data to Application if was sent 64 byte +#define EP_MAX_PACKET_SIZE_PHDC 0x40 + +//this function is used only by USB interrupt +BOOL PHDCToHostFromBuffer (BYTE intfNum) +{ + BYTE byte_count, nTmp2; + BYTE * pEP1; + BYTE * pEP2; + BYTE * pCT1; + BYTE * pCT2; + BYTE bWakeUp = FALSE; //TRUE for wake up after interrupt + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft == 0){ //do we have somtething to send? + if (!PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent){ //zero packet was not yet sent + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent = TRUE; + + if (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend == + EP_MAX_PACKET_SIZE_PHDC){ + if (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == + X_BUFFER){ + if (tInputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK){ + tInputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + = Y_BUFFER; //switch buffer + } + } else { + if (tInputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK){ + tInputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + = X_BUFFER; //switch buffer + } + } + } + + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSend = 0; //nothing to send + + //call event callback function + if (wUsbEventMask & kUSB_sendCompletedEvent){ + bWakeUp = USBPHDC_handleSendCompleted(intfNum); + } + } //if (!bSentZeroPacket) + + return (bWakeUp); + } + + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent = FALSE; //zero packet will be not sent: we have data + + if (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; + pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + pEP2 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; + pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can send over one endpoint buffer + byte_count = + (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft > + EP_MAX_PACKET_SIZE_PHDC) ? EP_MAX_PACKET_SIZE_PHDC : PHDCWriteCtrl[ + INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft; + nTmp2 = *pCT1; + + if (nTmp2 & EPBCNT_NAK){ + USB_TX_memcpy(pEP1, PHDCWriteCtrl[INTFNUM_OFFSET( + intfNum)].pUsbBufferToSend, + byte_count); //copy data into IEP3 X or Y buffer + *pCT1 = byte_count; //Set counter for usb In-Transaction + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; //switch buffer + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft -= + byte_count; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend += byte_count; //move buffer pointer + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend = byte_count; + + //try to send data over second buffer + nTmp2 = *pCT2; + if ((PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft > + 0) && //do we have more data to send? + (nTmp2 & EPBCNT_NAK)){ //if the second buffer is free? + //how many byte we can send over one endpoint buffer + byte_count = + (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft > + EP_MAX_PACKET_SIZE_PHDC) ? EP_MAX_PACKET_SIZE_PHDC : + PHDCWriteCtrl[ + INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft; + + USB_TX_memcpy(pEP2, PHDCWriteCtrl[INTFNUM_OFFSET( + intfNum)].pUsbBufferToSend, + byte_count); //copy data into IEP3 X or Y buffer + *pCT2 = byte_count; //Set counter for usb In-Transaction + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; //switch buffer + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft -= + byte_count; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend += + byte_count; //move buffer pointer + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend = byte_count; + } + } + return (bWakeUp); +} + +/* + * Aborts an active send operation on interface intfNum. + * Returns the number of bytes that were sent prior to the abort, in size. + */ +BYTE USBPHDC_abortSend (WORD* size, BYTE intfNum) +{ + unsigned short bGIE; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + _DINT_FET(); //disable interrupts - atomic operation + + *size = + (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSend - + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft); + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSend = 0; + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft = 0; + + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +//This function copies data from OUT endpoint into user's buffer +//Arguments: +//pEP - pointer to EP to copy from +//pCT - pointer to pCT control reg +// +VOID PHDCCopyUsbToBuff (BYTE* pEP, BYTE* pCT, BYTE intfNum) +{ + BYTE nCount; + + //how many byte we can get from one endpoint buffer + nCount = + (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp) ? PHDCReadCtrl[ + INTFNUM_OFFSET(intfNum)].nBytesInEp : PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)]. + nBytesToReceiveLeft; + + USB_RX_memcpy(PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pUserBuffer, pEP, nCount); //copy data from OEP3 X or Y buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft -= nCount; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer += nCount; //move buffer pointer + //to read rest of data next time from this place + + if (nCount == PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp){ //all bytes are copied from receive buffer? + //switch current buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; + + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + + //clear NAK, EP ready to receive data + *pCT = 0x00; + } else { + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp -= nCount; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = pEP + nCount; + } +} + +/* + * Receives data over interface intfNum, of size size, into memory starting at address data. + * Returns: + * kUSBPHDC_receiveStarted if the receiving process started. + * kUSBPHDC_receiveCompleted all requested date are received. + * kUSBPHDC_receiveInProgress previous receive opereation is in progress. The requested receive operation can be not started. + * kUSBPHDC_generalError error occurred. + */ +BYTE USBPHDC_receiveData (BYTE* data, WORD size, BYTE intfNum) +{ + BYTE nTmp1; + BYTE edbIndex; + unsigned short bGIE; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if ((size == 0) || //read size is 0 + (data == NULL)){ + return (kUSBPHDC_generalError); + } + + bGIE = (__get_SR_register() & GIE); //save interrupt status + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //data can not be read because of USB suspended + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_busNotAvailable); + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL){ //receive process already started + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_intfBusyError); + } + + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive = size; //bytes to receive + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft = size; //left bytes to receive + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = data; //set user receive buffer + + //read rest of data from buffer, if any4 + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0){ + //copy data from pEP-endpoint into User's buffer + PHDCCopyUsbToBuff(PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + PHDCReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1, intfNum); + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBPHDC_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_receiveCompleted); //receive completed + } + + //check other EP buffer for data - exchange pCT1 with pCT2 + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 == + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX){ + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + } else { + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + } + + nTmp1 = *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + //try read data from second buffer + if (nTmp1 & EPBCNT_NAK){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + PHDCCopyUsbToBuff(PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + PHDCReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1, intfNum); + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBPHDC_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_receiveCompleted); //receive completed + } + } //read rest of data from buffer, if any + + //read 'fresh' data, if available + nTmp1 = 0; + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //this is current buffer + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + //this is the active EP buffer + //pEP1 + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + nTmp1 = 1; //indicate that data is available + } + } else { //Y_BUFFER + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ + //this is the active EP buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCurrentEpPos = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + nTmp1 = 1; //indicate that data is available + } + } + if (nTmp1){ + //how many byte we can get from one endpoint buffer + nTmp1 = *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + while (nTmp1 == 0) + { + nTmp1 = *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + } + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + + PHDCCopyUsbToBuff(PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pCurrentEpPos, + PHDCReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT1, intfNum); + + nTmp1 = *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + //try read data from second buffer + if ((PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > + 0) && //do we have more data to send? + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + PHDCCopyUsbToBuff(PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pEP2, + PHDCReadCtrl[INTFNUM_OFFSET( + intfNum) + ].pCT2, intfNum); + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + } + } + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + USBPHDC_handleReceiveCompleted(intfNum); //call event handler in interrupt context + } + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_receiveCompleted); + } + + //interrupts enable + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_receiveStarted); +} + +//this function is used only by USB interrupt. +//It fills user receiving buffer with received data +BOOL PHDCToBufferFromHost (BYTE intfNum) +{ + BYTE * pEP1; + BYTE nTmp1; + BYTE bWakeUp = FALSE; //per default we do not wake up after interrupt + + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //do we have somtething to receive? + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + return (bWakeUp); + } + + //No data to receive... + if (!((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX | + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY) + & 0x80)){ + return (bWakeUp); + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //X is current buffer + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + + //second EP buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + } else { + //this is the active EP buffer + pEP1 = (BYTE*)stUsbHandle[intfNum].oep_Y_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY; + + //second EP buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 = + (BYTE*)stUsbHandle[intfNum].oep_X_Buffer; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 = + &tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX; + } + + //how many byte we can get from one endpoint buffer + nTmp1 = *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1; + + if (nTmp1 & EPBCNT_NAK){ + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + + PHDCCopyUsbToBuff(pEP1, PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pCT1, intfNum); + + nTmp1 = *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + //try read data from second buffer + if ((PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft > 0) && //do we have more data to send? + (nTmp1 & EPBCNT_NAK)){ //if the second buffer has received data? + nTmp1 = nTmp1 & 0x7f; //clear NAK bit + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = nTmp1; //holds how many valid bytes in the EP buffer + PHDCCopyUsbToBuff(PHDCReadCtrl[INTFNUM_OFFSET( + intfNum)].pEP2, + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2, intfNum); + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT1 = + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2; + } + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft == 0){ //the Receive opereation is completed + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; //no more receiving pending + if (wUsbEventMask & kUSB_receiveCompletedEvent){ + bWakeUp = USBPHDC_handleReceiveCompleted(intfNum); + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp){ //Is not read data still available in the EP? + if (wUsbEventMask & kUSB_dataReceivedEvent){ + bWakeUp = USBPHDC_handleDataReceived(intfNum); + } + } + } + return (bWakeUp); +} + +//helper for USB interrupt handler +BOOL PHDCIsReceiveInProgress (BYTE intfNum) +{ + return (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL); +} + +/* + * Aborts an active receive operation on interface intfNum. + * Returns the number of bytes that were received and transferred + * to the data location established for this receive operation. + */ +BYTE USBPHDC_abortReceive (WORD* size, BYTE intfNum) +{ + //interrupts disable + unsigned short bGIE; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + *size = 0; //set received bytes count to 0 + + //is receive operation underway? + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer){ + //how many bytes are already received? + *size = PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive - + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft; + + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer = NULL; + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft = 0; + } + + //restore interrupt status + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +/* + * This function rejects payload data that has been received from the host. + */ +BYTE USBPHDC_rejectData (BYTE intfNum) +{ + BYTE edbIndex; + unsigned short bGIE; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + //do not access USB memory if suspended (PLL off). It may produce BUS_ERROR + if (bFunctionSuspended){ + __bis_SR_register(bGIE); //restore interrupt status + return (kUSBPHDC_busNotAvailable); + } + + //Is receive operation underway? + //- do not flush buffers if any operation still active. + if (!PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer){ + BYTE tmp1 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK; + BYTE tmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK; + + if (tmp1 ^ tmp2){ //switch current buffer if any and only ONE of buffers is full + //switch current buffer + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = + (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + + 1) & 0x01; + } + + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; //flush buffer X + tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0; //flush buffer Y + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp = 0; //indicates that no more data available in the EP + } + + __bis_SR_register(bGIE); //restore interrupt status + return (kUSB_succeed); +} + +/* + * This function indicates the status of the itnerface intfNum. + * If a send operation is active for this interface, + * the function also returns the number of bytes that have been transmitted to the host. + * If a receiver operation is active for this interface, the function also returns + * the number of bytes that have been received from the host and are waiting at the assigned address. + * + * returns kUSBPHDC_waitingForSend (indicates that a call to USBPHDC_SendData() + * has been made, for which data transfer has not been completed) + * + * returns kUSBPHDC_waitingForReceive (indicates that a receive operation + * has been initiated, but not all data has yet been received) + * + * returns kUSBPHDC_dataWaiting (indicates that data has been received + * from the host, waiting in the USB receive buffers) + */ +BYTE USBPHDC_intfStatus (BYTE intfNum, WORD* bytesSent, WORD* bytesReceived) +{ + BYTE ret = 0; + unsigned short bGIE; + + *bytesSent = 0; + *bytesReceived = 0; + + BYTE edbIndex; + edbIndex = stUsbHandle[intfNum].edb_Index; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + _DINT_FET(); //disable interrupts - atomic operation + + //Is send operation underway? + if (PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSendLeft != 0){ + ret |= kUSBPHDC_waitingForSend; + *bytesSent = PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)].nPHDCBytesToSend - + PHDCWriteCtrl[INTFNUM_OFFSET(intfNum)]. + nPHDCBytesToSendLeft; + } + + //Is receive operation underway? + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pUserBuffer != NULL){ + ret |= kUSBPHDC_waitingForReceive; + *bytesReceived = + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceive - + PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesToReceiveLeft; + } else { //receive operation not started + //do not access USB memory if suspended (PLL off). It may produce + //BUS_ERROR + if (!bFunctionSuspended){ + if ((tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & + EPBCNT_NAK) | //any of buffers has a valid data packet + (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & + EPBCNT_NAK)){ + ret |= kUSBPHDC_dataWaiting; + } + } + } + + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + //if suspended or not enumerated - report no other tasks pending + ret = kUSBPHDC_busNotAvailable; + } + + //restore interrupt status + __bis_SR_register(bGIE); //restore interrupt status + + __no_operation(); + return (ret); +} + +/* + * Returns how many bytes are in the buffer are received and ready to be read. + */ +BYTE USBPHDC_bytesInUSBBuffer (BYTE intfNum) +{ + BYTE bTmp1 = 0; + unsigned short bGIE; + BYTE edbIndex; + + edbIndex = stUsbHandle[intfNum].edb_Index; + + bGIE = (__get_SR_register() & GIE); //save interrupt status + //atomic operation - disable interrupts + _DINT_FET(); //Disable global interrupts + + if ((bFunctionSuspended) || + (bEnumerationStatus != ENUMERATION_COMPLETE)){ + __bis_SR_register(bGIE); //restore interrupt status + //if suspended or not enumerated - report 0 bytes available + return (0); + } + + if (PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0){ //If a RX operation is underway, part of data may was read of the + //OEP buffer + bTmp1 = PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp; + if (*PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & EPBCNT_NAK){ //the next buffer has a valid data packet + bTmp1 += *PHDCReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F; + } + } else { + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ //this buffer has a valid data packet + bTmp1 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & 0x7F; + } + if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ //this buffer has a valid data packet + bTmp1 += tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & 0x7F; + } + } + + __bis_SR_register(bGIE); //restore interrupt status + return (bTmp1); +} + +//---------------------------------------------------------------------------- +//Line Coding Structure +//dwDTERate | 4 | Data terminal rate, in bits per second +//bCharFormat | 1 | Stop bits, 0 = 1 Stop bit, 1 = 1,5 Stop bits, 2 = 2 Stop bits +//bParityType | 1 | Parity, 0 = None, 1 = Odd, 2 = Even, 3= Mark, 4 = Space +//bDataBits | 1 | Data bits (5,6,7,8,16) +//---------------------------------------------------------------------------- +BYTE USBPHDC_GetDataStatusReq (VOID) +{ + BYTE i; + + //Initialize response + abUsbRequestReturnData[0] = 0; + abUsbRequestReturnData[1] = 0; + + for (i = 0; i < PHDC_NUM_INTERFACES; i++) + { +#ifdef NON_COMPOSITE_MULTIPLE_INTERFACES + if (abromConfigurationDescriptorGroupPHDC.stPhdc[i].bInterfaceNumber == + tSetupPacket.wIndex){ +#else + if (abromConfigurationDescriptorGroup.stPhdc[i].bInterfaceNumber == + tSetupPacket.wIndex){ +#endif + if (PHDCWriteCtrl[i].nPHDCBytesToSendLeft){ + abUsbRequestReturnData[0] |= 1 << + (stUsbHandle[PHDC0_INTFNUM + + i].ep_Out_Addr); + } + + if (PHDCReadCtrl[i].nBytesInEp){ + abUsbRequestReturnData[0] |= 1 << + (stUsbHandle[PHDC0_INTFNUM + + i].ep_In_Addr & 0x7F); + } + break; + } + } + + /* + * edbIndex = stUsbHandle[intfNum].edb_Index; + * tInputEndPointDescriptorBlock[edbIndex].bEPCNF = 0; + * + * abromConfigurationDescriptorGroup.stPhdc[0].bEndpointAddress_intp + #ifdef PHDC_USE_INT_ENDPOINT + * // ENDPOINT #1 INPUT DESCRIPTOR, (7 bytes) + * SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + * DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + * PHDC0_INTEP_ADDR, // bEndpointAddress: + * + * for (i=0; i < PHDC_NUM_INTERFACES; i++) + * { + * for (j=0; j< abromConfigurationDescriptorGroup.stPhdc[i].bNumEndpoints; j++) + * { + * + * } + * } + * bNumEndpoints + * abromConfigurationDescriptorGroup.stPhdc[PHDC_NUM_INTERFACES] + * if(tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) + * { + * // input endpoint + * abUsbRequestReturnData[0] = (BYTE)(tInputEndPointDescriptorBlock[bEndpointNumber].bEPCNF & EPCNF_STALL); + * }else + * { + * // output endpoint + * abUsbRequestReturnData[0] = (BYTE)(tOutputEndPointDescriptorBlock[bEndpointNumber].bEPCNF & EPCNF_STALL); + * } + * } // no response if endpoint is not supported. + * abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; // STALL is on bit 3 + */ + wBytesRemainingOnIEP0 = 0x02; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + return (FALSE); +} + +#endif //ifdef _PHDC_ + +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_API/USB_PHDC_API/UsbPHDC.h b/Bios/src/fw/fet/USB_API/USB_PHDC_API/UsbPHDC.h new file mode 100644 index 0000000..2cb5abc --- /dev/null +++ b/Bios/src/fw/fet/USB_API/USB_PHDC_API/UsbPHDC.h @@ -0,0 +1,137 @@ +//(c)2009 by Texas Instruments Incorporated, All Rights Reserved. +/*----------------------------------------------------------------------------+ + | | + | Texas Instruments | + | | + | MSP430 USB-Example (PHDC Driver) | + | | + +-----------------------------------------------------------------------------+ + | Source: UsbPHDC.h, File Version 1.00 2009/12/03 | + | Author: RSTO | + | | + | WHO WHEN WHAT | + | --- ---------- ------------------------------------------------ | + | RSTO 2008/09/03 born | + | | + +----------------------------------------------------------------------------*/ +#ifndef _UsbPHDC_H_ +#define _UsbPHDC_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +#define kUSBPHDC_sendStarted 0x01 +#define kUSBPHDC_sendComplete 0x02 +#define kUSBPHDC_intfBusyError 0x03 +#define kUSBPHDC_receiveStarted 0x04 +#define kUSBPHDC_receiveCompleted 0x05 +#define kUSBPHDC_receiveInProgress 0x06 +#define kUSBPHDC_generalError 0x07 +#define kUSBPHDC_busNotAvailable 0x08 + + + +/*---------------------------------------------------------------------------- + * These functions can be used in application + +----------------------------------------------------------------------------*/ + +/* + * Sends data over interface intfNum, of size size and starting at address data. + * Returns: kUSBPHDC_sendStarted + * kUSBPHDC_sendComplete + * kUSBPHDC_intfBusyError + */ +BYTE USBPHDC_sendData (const BYTE* data, WORD size, BYTE intfNum); + +/* + * Receives data over interface intfNum, of size size, into memory starting at address data. + */ +BYTE USBPHDC_receiveData (BYTE* data, WORD size, BYTE intfNum); + +/* + * Aborts an active receive operation on interface intfNum. + * size: the number of bytes that were received and transferred + * to the data location established for this receive operation. + */ +BYTE USBPHDC_abortReceive (WORD* size, BYTE intfNum); + + +#define kUSBPHDC_noDataWaiting 1 //returned by USBPHDC_rejectData() if no data pending + +/* + * This function rejects payload data that has been received from the host. + */ +BYTE USBPHDC_rejectData (BYTE intfNum); + +/* + * Aborts an active send operation on interface intfNum. Returns the number of bytes that were sent prior to the abort, in size. + */ +BYTE USBPHDC_abortSend (WORD* size, BYTE intfNum); + + +#define kUSBPHDC_waitingForSend 0x01 +#define kUSBPHDC_waitingForReceive 0x02 +#define kUSBPHDC_dataWaiting 0x04 +#define kUSBPHDC_busNotAvailable 0x08 +#define kUSB_allPHDCEvents 0xFF + +/* + * This function indicates the status of the interface intfNum. + * If a send operation is active for this interface, + * the function also returns the number of bytes that have been transmitted to the host. + * If a receiver operation is active for this interface, the function also returns + * the number of bytes that have been received from the host and are waiting at the assigned address. + * + * returns kUSBPHDC_waitingForSend (indicates that a call to USBPHDC_SendData() + * has been made, for which data transfer has not been completed) + * + * returns kUSBPHDC_waitingForReceive (indicates that a receive operation + * has been initiated, but not all data has yet been received) + * + * returns kUSBPHDC_dataWaiting (indicates that data has been received + * from the host, waiting in the USB receive buffers) + */ +BYTE USBPHDC_intfStatus (BYTE intfNum, WORD* bytesSent, WORD* bytesReceived); + +/* + * This function is called when the device receives a Get_Status request + */ +BYTE USBPHDC_GetDataStatusReq(VOID); + + +/* + * Returns how many bytes are in the buffer are received and ready to be read. + */ +BYTE USBPHDC_bytesInUSBBuffer (BYTE intfNum); + + +/*---------------------------------------------------------------------------- + * Event-Handling routines + +----------------------------------------------------------------------------*/ + +/* + * This event indicates that data has been received for interface intfNum, but no data receive operation is underway. + * returns TRUE to keep CPU awake + */ +BYTE USBPHDC_handleDataReceived (BYTE intfNum); + +/* + * This event indicates that a send operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBPHDC_handleSendCompleted (BYTE intfNum); + +/* + * This event indicates that a receive operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBPHDC_handleReceiveCompleted (BYTE intfNum); + + +#ifdef __cplusplus +} +#endif +#endif //_UsbPHDC_H_ diff --git a/Bios/src/fw/fet/USB_config/1CDC_descTool.inf b/Bios/src/fw/fet/USB_config/1CDC_descTool.inf new file mode 100644 index 0000000..f02377d --- /dev/null +++ b/Bios/src/fw/fet/USB_config/1CDC_descTool.inf @@ -0,0 +1,92 @@ +; Copyright (c) 2010 Texas Instruments +; MSP430 Virtual COM Port Installation file for Win2000/XP/Vista/7 +; +; Port drivers setup +; +; Supported operating systems: +; Windows 32-bit and 64-bit +[Version] + +Signature="$Windows NT$" +CatalogFile=MSP430_CDC.cat +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%TI% +DriverVer=09/06/2010, 1.02 + +[Manufacturer] +%TI%=DeviceList, NTamd64 + +[DestinationDirs] +FakeModemCopyFileSection=12 +DefaultDestDir=12 + +[SourceDisksNames] + +[SourceDisksFiles] + +;You can modify next string and place your VID and PID +[DeviceList] +%DESCRIPTION0%=TIUSB, USB\Vid_2047&Pid_0300 + +[DeviceList.NTamd64] +%DESCRIPTION0%=TIUSB.NTamd64, USB\Vid_2047&Pid_0300 + + ;------------------------------------------------------------------------------ +; Windows 32-bit Sections +;------------------------------------------------------------------------------ + +[TIUSB.nt] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=TIUSB.nt.AddReg + +[TIUSB.nt.AddReg] +HKR,,NTMPDriver,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" +HKR,,PortSubClass,1,01 + +[TIUSB.nt.Services] +AddService=usbser, 0x00000002, DriverService + +[TIUSB.nt.HW] +include=mdmcpq.inf + +[DriverService] +DisplayName=%DESCRIPTION% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\usbser.sys +LoadOrderGroup=Base + +;------------------------------------------------------------------------------ +; Windows 64-bit Sections +;------------------------------------------------------------------------------ + +[TIUSB.NTamd64] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=TIUSB.NTamd64.AddReg + +[TIUSB.NTamd64.AddReg] +HKR,,NTMPDriver,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" +HKR,,PortSubClass,1,01 + +[TIUSB.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService + +[TIUSB.NTamd64.HW] +include=mdmcpq.inf + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ + +[Strings] +TI="Texas Instruments" +DESCRIPTION="MSP430-USB Example" +DESCRIPTION0="Virtual COM Port (CDC)" diff --git a/Bios/src/fw/fet/USB_config/MSP430_CDC.inf b/Bios/src/fw/fet/USB_config/MSP430_CDC.inf new file mode 100644 index 0000000..ccb30e4 --- /dev/null +++ b/Bios/src/fw/fet/USB_config/MSP430_CDC.inf @@ -0,0 +1,95 @@ +; Copyright (c) 2010 Texas Instruments +; MSP430 Virtual COM Port Installation file for Win2000/XP/Vista/7 +; +; Port drivers setup +; +; Supported operating systems: +; Windows 32-bit and 64-bit +[Version] + +Signature="$Windows NT$" +CatalogFile=MSP430_CDC.cat +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%TI% +DriverVer=09/06/2010, 1.02 + +[Manufacturer] +%TI%=DeviceList, NTamd64 + +[DestinationDirs] +FakeModemCopyFileSection=12 +DefaultDestDir=12 + +[SourceDisksNames] + +[SourceDisksFiles] + +;You can modify next string and place your VID and PID +[DeviceList] +%DESCRIPTION0%=TIUSB, USB\Vid_2047&Pid_0013&MI_00 +%DESCRIPTION1%=TIUSB, USB\Vid_2047&Pid_0013&MI_02 + +[DeviceList.NTamd64] +%DESCRIPTION0%=TIUSB.NTamd64, USB\Vid_2047&Pid_0013&MI_00 +%DESCRIPTION1%=TIUSB.NTamd64, USB\Vid_2047&Pid_0013&MI_02 + + ;------------------------------------------------------------------------------ +; Windows 32-bit Sections +;------------------------------------------------------------------------------ + +[TIUSB.nt] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=TIUSB.nt.AddReg + +[TIUSB.nt.AddReg] +HKR,,NTMPDriver,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" +HKR,,PortSubClass,1,01 + +[TIUSB.nt.Services] +AddService=usbser, 0x00000002, DriverService + +[TIUSB.nt.HW] +include=mdmcpq.inf + +[DriverService] +DisplayName=%DESCRIPTION% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\usbser.sys +LoadOrderGroup=Base + +;------------------------------------------------------------------------------ +; Windows 64-bit Sections +;------------------------------------------------------------------------------ + +[TIUSB.NTamd64] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=TIUSB.NTamd64.AddReg + +[TIUSB.NTamd64.AddReg] +HKR,,NTMPDriver,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" +HKR,,PortSubClass,1,01 + +[TIUSB.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService + +[TIUSB.NTamd64.HW] +include=mdmcpq.inf + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ + +[Strings] +TI="Texas Instruments" +DESCRIPTION="MSP Tools Driver" +DESCRIPTION0="MSP Debug Interface" +DESCRIPTION1="MSP Application UART" diff --git a/Bios/src/fw/fet/USB_config/UsbIsr.c b/Bios/src/fw/fet/USB_config/UsbIsr.c new file mode 100644 index 0000000..ccdaef9 --- /dev/null +++ b/Bios/src/fw/fet/USB_config/UsbIsr.c @@ -0,0 +1,351 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ + +/*-----------------------------------------------------------------------------+ +| Include files | +|-----------------------------------------------------------------------------*/ +#include +#include // Basic Type declarations +#include +#include "descriptors.h" +#include //USB-specific Data Structures +#include +#include + +#include +#include +#include +/*----------------------------------------------------------------------------+ +| External Variables | ++----------------------------------------------------------------------------*/ +extern BYTE bFunctionSuspended; +extern __no_init tEDB0 __data16 tEndPoint0DescriptorBlock; +extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[]; +extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[]; +extern volatile BYTE bHostAsksUSBData; +extern volatile BYTE bTransferInProgress; +extern volatile BYTE bSecondUartTxDataCounter[]; +extern volatile PBYTE pbSecondUartTxData; +extern BYTE bStatusAction; +extern WORD wUsbEventMask; +BOOL CdcToHostFromBuffer(BYTE); +BOOL CdcToBufferFromHost(BYTE); +BOOL CdcIsReceiveInProgress(BYTE); +BOOL HidToHostFromBuffer(BYTE); +BOOL HidToBufferFromHost(BYTE); +BOOL HidIsReceiveInProgress(BYTE); +extern WORD wUsbHidEventMask; +BOOL PHDCToHostFromBuffer(BYTE); +BOOL PHDCToBufferFromHost(BYTE); +BOOL PHDCIsReceiveInProgress(BYTE); +/*----------------------------------------------------------------------------+ +| General Subroutines | ++----------------------------------------------------------------------------*/ +#pragma vector=USB_UBM_VECTOR +__interrupt VOID iUsbInterruptHandler(VOID) +{ + BYTE bWakeUp = FALSE; + //Check if the setup interrupt is pending. + //We need to check it before other interrupts, + //to work around that the Setup Int has lower priority then Input Endpoint 0 + if (USBIFG & SETUPIFG) + { + bWakeUp = SetupPacketInterruptHandler(); + // Workaround as described in errata USB10 + tEndPoint0DescriptorBlock.bIEPCNFG &= ~EPCNF_UBME; + tEndPoint0DescriptorBlock.bOEPCNFG &= ~EPCNF_UBME; + USBIFG &= ~SETUPIFG; // clear the interrupt bit + tEndPoint0DescriptorBlock.bIEPCNFG |= EPCNF_UBME; + tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_UBME; + } + switch (__even_in_range(USBVECINT & 0x3f, USBVECINT_OUTPUT_ENDPOINT7)) + { + case USBVECINT_NONE: + break; + case USBVECINT_PWR_DROP: + __no_operation(); + break; + case USBVECINT_PLL_LOCK: + break; + case USBVECINT_PLL_SIGNAL: + break; + case USBVECINT_PLL_RANGE: + if (wUsbEventMask & kUSB_clockFaultEvent) + { + bWakeUp = USB_handleClockEvent(); + } + break; + case USBVECINT_PWR_VBUSOn: + PWRVBUSonHandler(); + if (wUsbEventMask & kUSB_VbusOnEvent) + { + bWakeUp = USB_handleVbusOnEvent(); + } + break; + case USBVECINT_PWR_VBUSOff: + PWRVBUSoffHandler(); + if (wUsbEventMask & kUSB_VbusOffEvent) + { + bWakeUp = USB_handleVbusOffEvent(); + } + break; + case USBVECINT_USB_TIMESTAMP: + break; + case USBVECINT_INPUT_ENDPOINT0: + IEP0InterruptHandler(); + break; + case USBVECINT_OUTPUT_ENDPOINT0: + OEP0InterruptHandler(); + break; + case USBVECINT_RSTR: + USB_reset(); + if (wUsbEventMask & kUSB_UsbResetEvent) + { + bWakeUp = USB_handleResetEvent(); + } + break; + case USBVECINT_SUSR: + USB_suspend(); + if (wUsbEventMask & kUSB_UsbSuspendEvent) + { + bWakeUp = USB_handleSuspendEvent(); + } + break; + case USBVECINT_RESR: + USB_resume(); + if (wUsbEventMask & kUSB_UsbResumeEvent) + { + bWakeUp = USB_handleResumeEvent(); + } + //-- after resume we will wake up! Independ what event handler says. + bWakeUp = TRUE; + break; + case USBVECINT_SETUP_PACKET_RECEIVED: + // NAK both IEP and OEP enpoints + tEndPoint0DescriptorBlock.bIEPBCNT = EPBCNT_NAK; + tEndPoint0DescriptorBlock.bOEPBCNT = EPBCNT_NAK; + SetupPacketInterruptHandler(); + break; + case USBVECINT_STPOW_PACKET_RECEIVED: + break; + case USBVECINT_INPUT_ENDPOINT1: + break; + case USBVECINT_INPUT_ENDPOINT2: + //send saved bytes from buffer... + bWakeUp = CdcToHostFromBuffer(CDC0_INTFNUM); + break; + case USBVECINT_INPUT_ENDPOINT3: + break; + case USBVECINT_INPUT_ENDPOINT4: + //send saved bytes from buffer... + bWakeUp = CdcToHostFromBuffer(CDC1_INTFNUM); + break; + case USBVECINT_INPUT_ENDPOINT5: + break; + case USBVECINT_INPUT_ENDPOINT6: + break; + case USBVECINT_INPUT_ENDPOINT7: + break; + case USBVECINT_OUTPUT_ENDPOINT1: + break; + case USBVECINT_OUTPUT_ENDPOINT2: + //call callback function if no receive operation is underway + if (!CdcIsReceiveInProgress(CDC0_INTFNUM) && USBCDC_bytesInUSBBuffer(CDC0_INTFNUM)) + { + if (wUsbEventMask & kUSB_dataReceivedEvent) + { + bWakeUp = USBCDC_handleDataReceived(CDC0_INTFNUM); + } + } + else + { + //complete receive opereation - copy data to user buffer + bWakeUp = CdcToBufferFromHost(CDC0_INTFNUM); + } + break; + case USBVECINT_OUTPUT_ENDPOINT3: + break; + case USBVECINT_OUTPUT_ENDPOINT4: + //call callback function if no receive operation is underway + if (!CdcIsReceiveInProgress(CDC1_INTFNUM) && USBCDC_bytesInUSBBuffer(CDC1_INTFNUM)) + { + if (wUsbEventMask & kUSB_dataReceivedEvent) + { + bWakeUp = USBCDC_handleDataReceived(CDC1_INTFNUM); + } + } + else + { + //complete receive opereation - copy data to user buffer + bWakeUp = CdcToBufferFromHost(CDC1_INTFNUM); + } + break; + case USBVECINT_OUTPUT_ENDPOINT5: + break; + case USBVECINT_OUTPUT_ENDPOINT6: + break; + case USBVECINT_OUTPUT_ENDPOINT7: + break; + default: + break; + } + if (bWakeUp) + { + __bic_SR_register_on_exit(LPM3_bits); // Exit LPM0-3 + __no_operation(); // Required for debugger + } +} + +/*----------------------------------------------------------------------------+ +| Interrupt Sub-routines | ++----------------------------------------------------------------------------*/ +BYTE SetupPacketInterruptHandler(VOID) +{ + BYTE bTemp; + BYTE bWakeUp = FALSE; + USBCTL |= FRSTE; // Function Reset Connection Enable - set enable after first setup packet was received + usbProcessNewSetupPacket: + // copy the MSB of bmRequestType to DIR bit of USBCTL + if((tSetupPacket.bmRequestType & USB_REQ_TYPE_INPUT) == USB_REQ_TYPE_INPUT) + { + USBCTL |= DIR; + } + else + { + USBCTL &= ~DIR; + } + bStatusAction = STATUS_ACTION_NOTHING; + // clear out return data buffer + for(bTemp=0; bTemp access to configuration registers enabled + bEnumerationStatus = 0x00; // device is not enumerated + bFunctionSuspended = FALSE; // device is not suspended + USBCNF = 0; // disable USB module + USBPLLCTL &= ~UPLLEN; // disable PLL + USBPWRCTL &= ~(VBOFFIE + VBOFFIFG + SLDOEN); // disable interrupt VBUSoff + USBKEYPID = 0x9600; // access to configuration registers disabled + } +} + +//---------------------------------------------------------------------------- +VOID PWRVBUSonHandler(VOID) +{ + volatile unsigned int i; + for (i =0; i < USB_MCLK_FREQ/1000*1/10; i++); // waiting till voltage will be stable (1ms delay) + USBKEYPID = 0x9628; // set KEY and PID to 0x9628 -> access to configuration registers enabled + USBPWRCTL |= VBOFFIE; // enable interrupt VBUSoff + USBPWRCTL &= ~ (VBONIFG + VBOFFIFG); // clean int flag (bouncing) + USBKEYPID = 0x9600; // access to configuration registers disabled +} + +//---------------------------------------------------------------------------- +VOID IEP0InterruptHandler(VOID) +{ + USBCTL |= FRSTE; // Function Reset Connection Enable + tEndPoint0DescriptorBlock.bOEPBCNT = 0x00; + if(bStatusAction == STATUS_ACTION_DATA_IN) + { + usbSendNextPacketOnIEP0(); + } + else + { + tEndPoint0DescriptorBlock.bIEPCNFG |= EPCNF_STALL; // no more data + } +} + +//---------------------------------------------------------------------------- +BYTE OEP0InterruptHandler(VOID) +{ + BYTE bWakeUp = FALSE; + USBCTL |= FRSTE; // Function Reset Connection Enable + tEndPoint0DescriptorBlock.bIEPBCNT = 0x00; + if(bStatusAction == STATUS_ACTION_DATA_OUT) + { + usbReceiveNextPacketOnOEP0(); + if(bStatusAction == STATUS_ACTION_NOTHING) + { +# ifdef _CDC_ + if(tSetupPacket.bRequest == USB_CDC_SET_LINE_CODING) + { + bWakeUp = Handler_SetLineCoding(); + } +# endif +#ifdef _HID_ + if (tSetupPacket.bRequest == USB_REQ_SET_REPORT) { + bWakeUp = Handler_SetReportDataAvailable(tSetupPacket.wIndex); + } +#endif + } + } + else + { + tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_STALL; // no more data + } + return (bWakeUp); +} + + + +/*----------------------------------------------------------------------------+ +| End of source file | ++----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/USB_config/descriptors.c b/Bios/src/fw/fet/USB_config/descriptors.c new file mode 100644 index 0000000..1738762 --- /dev/null +++ b/Bios/src/fw/fet/USB_config/descriptors.c @@ -0,0 +1,532 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ + +/*-----------------------------------------------------------------------------+ +| Include files | +|-----------------------------------------------------------------------------*/ +#include +#include // Basic Type declarations +#include +#include // USB-specific Data Structures +#include "descriptors.h" +#include +#include + +/*-----------------------------------------------------------------------------+ +| Device Descriptor | +|-----------------------------------------------------------------------------*/ +BYTE const abromDeviceDescriptor[SIZEOF_DEVICE_DESCRIPTOR] = { + SIZEOF_DEVICE_DESCRIPTOR, // Length of this descriptor + DESC_TYPE_DEVICE, // Type code of this descriptor + 0x00, 0x02, // Release of USB spec + 0xef, // Device's base class code + 0x02, // Device's sub class code + 0x01, // Device's protocol type code + EP0_PACKET_SIZE, // End point 0's packet size + USB_VID&0xFF, USB_VID>>8, // Vendor ID for device, TI=0x0451 + // You can order your own VID at www.usb.org + USB_PID&0xFF, USB_PID>>8, // Product ID for device, + // this ID is to only with this example + VER_FW_L, VER_FW_H, // Revision level of device + 1, // Index of manufacturer name string desc + 2, // Index of product name string desc + USB_STR_INDEX_SERNUM, // Index of serial number string desc + 1 // Number of configurations supported +}; + +/*-----------------------------------------------------------------------------+ +| Configuration Descriptor | +|-----------------------------------------------------------------------------*/ +const struct abromConfigurationDescriptorGroup abromConfigurationDescriptorGroup= +{ + /* Generic part */ + { + // CONFIGURATION DESCRIPTOR (9 bytes) + SIZEOF_CONFIG_DESCRIPTOR, // bLength + DESC_TYPE_CONFIG, // bDescriptorType + DESCRIPTOR_TOTAL_LENGTH, 0x00, // wTotalLength + USB_NUM_INTERFACES, // bNumInterfaces + USB_CONFIG_VALUE, // bConfigurationvalue + CONFIG_STRING_INDEX, // iConfiguration Description offset + USB_SUPPORT_SELF_POWERED | USB_SUPPORT_REM_WAKE, // bmAttributes, bus power, remote wakeup + USB_MAX_POWER // Max. Power Consumption + }, + + /******************************************************* start of CDC*************************************/ + + { + /* start CDC[0] */ + { + + //Interface Association Descriptor + 0X08, // bLength + DESC_TYPE_IAD, // bDescriptorType = 11 + CDC0_COMM_INTERFACE, // bFirstInterface + 0x02, // bInterfaceCount + 0x02, // bFunctionClass (Communication Class) + 0x02, // bFunctionSubClass (Abstract Control Model) + 0x01, // bFunctionProcotol (V.25ter, Common AT commands) + INTF_STRING_INDEX + 0, // iInterface + + //INTERFACE DESCRIPTOR (9 bytes) + 0x09, // bLength: Interface Descriptor size + DESC_TYPE_INTERFACE, // bDescriptorType: Interface + CDC0_COMM_INTERFACE, // bInterfaceNumber + 0x00, // bAlternateSetting: Alternate setting + 0x01, // bNumEndpoints: Three endpoints used + 0x02, // bInterfaceClass: Communication Interface Class + 0x02, // bInterfaceSubClass: Abstract Control Model + 0x01, // bInterfaceProtocol: Common AT commands + INTF_STRING_INDEX + 0, // iInterface: + + //Header Functional Descriptor + 0x05, // bLength: Endpoint Descriptor size + 0x24, // bDescriptorType: CS_INTERFACE + 0x00, // bDescriptorSubtype: Header Func Desc + 0x10, // bcdCDC: spec release number + 0x01, + + //Call Managment Functional Descriptor + 0x05, // bFunctionLength + 0x24, // bDescriptorType: CS_INTERFACE + 0x01, // bDescriptorSubtype: Call Management Func Desc + 0x00, // bmCapabilities: D0+D1 + CDC0_DATA_INTERFACE, // bDataInterface: 0 + + //ACM Functional Descriptor + 0x04, // bFunctionLength + 0x24, // bDescriptorType: CS_INTERFACE + 0x02, // bDescriptorSubtype: Abstract Control Management desc + 0x02, // bmCapabilities + + // Union Functional Descriptor + 0x05, // Size, in bytes + 0x24, // bDescriptorType: CS_INTERFACE + 0x06, // bDescriptorSubtype: Union Functional Desc + CDC0_COMM_INTERFACE, // bMasterInterface -- the controlling intf for the union + CDC0_DATA_INTERFACE, // bSlaveInterface -- the controlled intf for the union + + //EndPoint Descriptor for Interrupt endpoint + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + CDC0_INTEP_ADDR, // bEndpointAddress: (IN2) + EP_DESC_ATTR_TYPE_INT, // bmAttributes: Interrupt + 0x40, 0x00, // wMaxPacketSize, 64 bytes + 0xFF, // bInterval + + //DATA INTERFACE DESCRIPTOR (9 bytes) + 0x09, // bLength: Interface Descriptor size + DESC_TYPE_INTERFACE, // bDescriptorType: Interface + CDC0_DATA_INTERFACE, // bInterfaceNumber + 0x00, // bAlternateSetting: Alternate setting + 0x02, // bNumEndpoints: Three endpoints used + 0x0A, // bInterfaceClass: Data Interface Class + 0x00, // bInterfaceSubClass: + 0x00, // bInterfaceProtocol: No class specific protocol required + 0x00, // iInterface: + + //EndPoint Descriptor for Output endpoint + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + CDC0_OUTEP_ADDR, // bEndpointAddress: (OUT3) + EP_DESC_ATTR_TYPE_BULK, // bmAttributes: Bulk + 0x40, 0x00, // wMaxPacketSize, 64 bytes + 0xFF, // bInterval: ignored for Bulk transfer + + //EndPoint Descriptor for Input endpoint + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + CDC0_INEP_ADDR, // bEndpointAddress: (IN3) + EP_DESC_ATTR_TYPE_BULK, // bmAttributes: Bulk + 0x40, 0x00, // wMaxPacketSize, 64 bytes + 0xFF // bInterval: ignored for bulk transfer + }, + + /* end CDC[0]*/ + + /* start CDC[1] */ + { + + //Interface Association Descriptor + 0X08, // bLength + DESC_TYPE_IAD, // bDescriptorType = 11 + CDC1_COMM_INTERFACE, // bFirstInterface + 0x02, // bInterfaceCount + 0x02, // bFunctionClass (Communication Class) + 0x02, // bFunctionSubClass (Abstract Control Model) + 0x01, // bFunctionProcotol (V.25ter, Common AT commands) + INTF_STRING_INDEX + 1, // iInterface + + //INTERFACE DESCRIPTOR (9 bytes) + 0x09, // bLength: Interface Descriptor size + DESC_TYPE_INTERFACE, // bDescriptorType: Interface + CDC1_COMM_INTERFACE, // bInterfaceNumber + 0x00, // bAlternateSetting: Alternate setting + 0x01, // bNumEndpoints: Three endpoints used + 0x02, // bInterfaceClass: Communication Interface Class + 0x02, // bInterfaceSubClass: Abstract Control Model + 0x01, // bInterfaceProtocol: Common AT commands + INTF_STRING_INDEX + 1, // iInterface: + + //Header Functional Descriptor + 0x05, // bLength: Endpoint Descriptor size + 0x24, // bDescriptorType: CS_INTERFACE + 0x00, // bDescriptorSubtype: Header Func Desc + 0x10, // bcdCDC: spec release number + 0x01, + + //Call Managment Functional Descriptor + 0x05, // bFunctionLength + 0x24, // bDescriptorType: CS_INTERFACE + 0x01, // bDescriptorSubtype: Call Management Func Desc + 0x00, // bmCapabilities: D0+D1 + CDC1_DATA_INTERFACE, // bDataInterface: 0 + + //ACM Functional Descriptor + 0x04, // bFunctionLength + 0x24, // bDescriptorType: CS_INTERFACE + 0x02, // bDescriptorSubtype: Abstract Control Management desc + 0x02, // bmCapabilities + + // Union Functional Descriptor + 0x05, // Size, in bytes + 0x24, // bDescriptorType: CS_INTERFACE + 0x06, // bDescriptorSubtype: Union Functional Desc + CDC1_COMM_INTERFACE, // bMasterInterface -- the controlling intf for the union + CDC1_DATA_INTERFACE, // bSlaveInterface -- the controlled intf for the union + + //EndPoint Descriptor for Interrupt endpoint + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + CDC1_INTEP_ADDR, // bEndpointAddress: (IN2) + EP_DESC_ATTR_TYPE_INT, // bmAttributes: Interrupt + 0x40, 0x00, // wMaxPacketSize, 64 bytes + 0xFF, // bInterval + + //DATA INTERFACE DESCRIPTOR (9 bytes) + 0x09, // bLength: Interface Descriptor size + DESC_TYPE_INTERFACE, // bDescriptorType: Interface + CDC1_DATA_INTERFACE, // bInterfaceNumber + 0x00, // bAlternateSetting: Alternate setting + 0x02, // bNumEndpoints: Three endpoints used + 0x0A, // bInterfaceClass: Data Interface Class + 0x00, // bInterfaceSubClass: + 0x00, // bInterfaceProtocol: No class specific protocol required + 0x00, // iInterface: + + //EndPoint Descriptor for Output endpoint + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + CDC1_OUTEP_ADDR, // bEndpointAddress: (OUT3) + EP_DESC_ATTR_TYPE_BULK, // bmAttributes: Bulk + 0x40, 0x00, // wMaxPacketSize, 64 bytes + 0xFF, // bInterval: ignored for Bulk transfer + + //EndPoint Descriptor for Input endpoint + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength: Endpoint Descriptor size + DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint + CDC1_INEP_ADDR, // bEndpointAddress: (IN3) + EP_DESC_ATTR_TYPE_BULK, // bmAttributes: Bulk + 0x40, 0x00, // wMaxPacketSize, 64 bytes + 0xFF // bInterval: ignored for bulk transfer + } + + /* end CDC[1]*/ + + } + /******************************************************* end of CDC**************************************/ + +}; +/*-----------------------------------------------------------------------------+ +| String Descriptor | +|-----------------------------------------------------------------------------*/ +BYTE const abromStringDescriptor[] = { + + // String index0, language support + 4, // Length of language descriptor ID + 3, // LANGID tag + 0x09, 0x04, // 0x0409 for English + + // String index1, Manufacturer + 36, // Length of this string descriptor + 3, // bDescriptorType + 'T',0x00,'e',0x00,'x',0x00,'a',0x00,'s',0x00,' ',0x00, + 'I',0x00,'n',0x00,'s',0x00,'t',0x00,'r',0x00,'u',0x00, + 'm',0x00,'e',0x00,'n',0x00,'t',0x00,'s',0x00, + + // String index2, Product + 34, // Length of this string descriptor + 3, // bDescriptorType + 'M',0x00,'S',0x00,'P',0x00,' ',0x00,'T',0x00,'o',0x00, + 'o',0x00,'l',0x00,'s',0x00,' ',0x00,'D',0x00,'r',0x00, + 'i',0x00,'v',0x00,'e',0x00,'r',0x00, + + // String index3, Serial Number + 4, // Length of this string descriptor + 3, // bDescriptorType + '0',0x00, + + // String index4, Configuration String + 22, // Length of this string descriptor + 3, // bDescriptorType + 'M',0x00,'S',0x00,'P',0x00,'4',0x00,'3',0x00,'0',0x00, + ' ',0x00,'U',0x00,'S',0x00,'B',0x00, + + // String index5, Interface String + 40, // Length of this string descriptor + 3, // bDescriptorType + 'M',0x00,'S',0x00,'P',0x00,' ',0x00,'D',0x00,'e',0x00, + 'b',0x00,'u',0x00,'g',0x00,' ',0x00,'I',0x00,'n',0x00, + 't',0x00,'e',0x00,'r',0x00,'f',0x00,'a',0x00,'c',0x00, + 'e',0x00, + + // String index6, Interface String + 42, // Length of this string descriptor + 3, // bDescriptorType + 'M',0x00,'S',0x00,'P',0x00,' ',0x00,'A',0x00,'p',0x00, + 'p',0x00,'l',0x00,'i',0x00,'c',0x00,'a',0x00,'t',0x00, + 'i',0x00,'o',0x00,'n',0x00,' ',0x00,'U',0x00,'A',0x00, + 'R',0x00,'T',0x00 +}; + +/**** Populating the endpoint information handle here ****/ + +const struct tUsbHandle stUsbHandle[]= +{ + { + CDC0_INEP_ADDR, + CDC0_OUTEP_ADDR, + 1, + CDC_CLASS, + IEP1_X_BUFFER_ADDRESS, + IEP1_Y_BUFFER_ADDRESS, + OEP2_X_BUFFER_ADDRESS, + OEP2_Y_BUFFER_ADDRESS, + IEP2_X_BUFFER_ADDRESS, + IEP2_Y_BUFFER_ADDRESS + }, + { + CDC1_INEP_ADDR, + CDC1_OUTEP_ADDR, + 3, + CDC_CLASS, + IEP3_X_BUFFER_ADDRESS, + IEP3_Y_BUFFER_ADDRESS, + OEP4_X_BUFFER_ADDRESS, + OEP4_Y_BUFFER_ADDRESS, + IEP4_X_BUFFER_ADDRESS, + IEP4_Y_BUFFER_ADDRESS + } +}; +//-------------DEVICE REQUEST LIST--------------------------------------------- + +const tDEVICE_REQUEST_COMPARE tUsbRequestList[] = +{ + + //---- CDC 0 Class Requests -----// + // GET LINE CODING + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_CDC_GET_LINE_CODING, + 0x00,0x00, // always zero + CDC0_COMM_INTERFACE,0x00, // CDC interface is 0 + 0x07,0x00, // Size of Structure (data length) + 0xff,&usbGetLineCoding, + + // SET LINE CODING + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_CDC_SET_LINE_CODING, + 0x00,0x00, // always zero + CDC0_COMM_INTERFACE,0x00, // CDC interface is 0 + 0x07,0x00, // Size of Structure (data length) + 0xff,&usbSetLineCoding, + + // SET CONTROL LINE STATE + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_CDC_SET_CONTROL_LINE_STATE, + 0xff,0xff, // Contains data + CDC0_COMM_INTERFACE,0x00, // CDC interface is 0 + 0x00,0x00, // No further data + 0xcf,&usbSetControlLineState, + + //---- CDC 1 Class Requests -----// + // GET LINE CODING + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_CDC_GET_LINE_CODING, + 0x00,0x00, // always zero + CDC1_COMM_INTERFACE,0x00, // CDC interface is 1 + 0x07,0x00, // Size of Structure (data length) + 0xff,&usbGetLineCoding, + + // SET LINE CODING + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_CDC_SET_LINE_CODING, + 0x00,0x00, // always zero + CDC1_COMM_INTERFACE,0x00, // CDC interface is 0 + 0x07,0x00, // Size of Structure (data length) + 0xff,&usbSetLineCoding, + + // SET CONTROL LINE STATE + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_CDC_SET_CONTROL_LINE_STATE, + 0xff,0xff, // Contains data + CDC1_COMM_INTERFACE,0x00, // CDC interface is 1 + 0x00,0x00, // No further data + 0xcf,&usbSetControlLineState, + + //---- USB Standard Requests -----// + // clear device feature + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_CLEAR_FEATURE, + FEATURE_REMOTE_WAKEUP,0x00, // feature selector + 0x00,0x00, + 0x00,0x00, + 0xff,&usbClearDeviceFeature, + + // clear endpoint feature + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_ENDPOINT, + USB_REQ_CLEAR_FEATURE, + FEATURE_ENDPOINT_STALL,0x00, + 0xff,0x00, + 0x00,0x00, + 0xf7,&usbClearEndpointFeature, + + // get configuration + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_GET_CONFIGURATION, + 0x00,0x00, + 0x00,0x00, + 0x01,0x00, + 0xff,&usbGetConfiguration, + + // get device descriptor + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_GET_DESCRIPTOR, + 0xff,DESC_TYPE_DEVICE, // bValueL is index and bValueH is type + 0xff,0xff, + 0xff,0xff, + 0xd0,&usbGetDeviceDescriptor, + + // get configuration descriptor + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_GET_DESCRIPTOR, + 0xff,DESC_TYPE_CONFIG, // bValueL is index and bValueH is type + 0xff,0xff, + 0xff,0xff, + 0xd0,&usbGetConfigurationDescriptor, + + // get string descriptor + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_GET_DESCRIPTOR, + 0xff,DESC_TYPE_STRING, // bValueL is index and bValueH is type + 0xff,0xff, + 0xff,0xff, + 0xd0,&usbGetStringDescriptor, + + // get interface + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_INTERFACE, + USB_REQ_GET_INTERFACE, + 0x00,0x00, + 0xff,0xff, + 0x01,0x00, + 0xf3,&usbGetInterface, + + // get device status + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_GET_STATUS, + 0x00,0x00, + 0x00,0x00, + 0x02,0x00, + 0xff,&usbGetDeviceStatus, + // get interface status + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_INTERFACE, + USB_REQ_GET_STATUS, + 0x00,0x00, + 0xff,0x00, + 0x02,0x00, + 0xf7,&usbGetInterfaceStatus, + // get endpoint status + USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_ENDPOINT, + USB_REQ_GET_STATUS, + 0x00,0x00, + 0xff,0x00, + 0x02,0x00, + 0xf7,&usbGetEndpointStatus, + + // set address + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_SET_ADDRESS, + 0xff,0x00, + 0x00,0x00, + 0x00,0x00, + 0xdf,&usbSetAddress, + + // set configuration + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_SET_CONFIGURATION, + 0xff,0x00, + 0x00,0x00, + 0x00,0x00, + 0xdf,&usbSetConfiguration, + + // set device feature + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE, + USB_REQ_SET_FEATURE, + 0xff,0x00, // feature selector + 0x00,0x00, + 0x00,0x00, + 0xdf,&usbSetDeviceFeature, + + // set endpoint feature + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_ENDPOINT, + USB_REQ_SET_FEATURE, + 0xff,0x00, // feature selector + 0xff,0x00, // endpoint number <= 127 + 0x00,0x00, + 0xd7,&usbSetEndpointFeature, + + // set interface + USB_REQ_TYPE_OUTPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_INTERFACE, + USB_REQ_SET_INTERFACE, + 0xff,0x00, // feature selector + 0xff,0x00, // interface number + 0x00,0x00, + 0xd7,&usbSetInterface, + + // end of usb descriptor -- this one will be matched to any USB request + // since bCompareMask is 0x00. + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00,&usbInvalidRequest // end of list +}; + +/*-----------------------------------------------------------------------------+ +| END OF Descriptor.c FILE | +|-----------------------------------------------------------------------------*/ diff --git a/Bios/src/fw/fet/USB_config/descriptors.h b/Bios/src/fw/fet/USB_config/descriptors.h new file mode 100644 index 0000000..71040d1 --- /dev/null +++ b/Bios/src/fw/fet/USB_config/descriptors.h @@ -0,0 +1,398 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*-----------------------------------------------------------------------------+ +| Include files | +|-----------------------------------------------------------------------------*/ +#include + +//*********************************************************************************************** +// CDC or HID - Define both for composite support +//*********************************************************************************************** +#define _CDC_ // Needed for CDC inteface +//*********************************************************************************************** +// CONFIGURATION CONSTANTS +//*********************************************************************************************** +// These constants configure the API stack and help define the USB descriptors. +// Refer to Sec. 6 of the MSP430 USB CDC API Programmer's Guide for descriptions of these constants. + +// Configuration Constants that can change +// #define that relates to Device Descriptor +#define USB_VID 0x2047 // Vendor ID (VID) + +#ifdef eZ_FET + #define USB_PID 0x0013 // Product ID for eZ-FET +#endif +#ifdef MSP_FET + #define USB_PID 0x0014 // Product ID for MSP-FET +#endif +/*----------------------------------------------------------------------------+ +| Firmware Version | +| How to detect version number of the FW running on MSP430? | +| on Windows Open ControlPanel->Systems->Hardware->DeviceManager->Ports-> | +| Msp430->ApplicationUART->Details | ++----------------------------------------------------------------------------*/ +#define VER_FW_H 0x02 // Device release number, in binary-coded decimal +#define VER_FW_L 0x00 // Device release number, in binary-coded decimal +// If a serial number is to be reported, set this to the index within the string descriptor +//of the dummy serial number string. It will then be automatically handled by the API. +// If no serial number is to be reported, set this to 0. +#define USB_STR_INDEX_SERNUM 3 + #define PHDC_ENDPOINTS_NUMBER 2 // bulk in, bulk out + + +#define DESCRIPTOR_TOTAL_LENGTH 141 // wTotalLength, This is the sum of configuration descriptor length + CDC descriptor length + HID descriptor length +#define USB_NUM_INTERFACES 4 // Number of implemented interfaces. + +#define CDC0_COMM_INTERFACE 0 // Comm interface number of CDC0 +#define CDC0_DATA_INTERFACE 1 // Data interface number of CDC0 +#define CDC0_INTEP_ADDR 0x81 // Interrupt Endpoint Address of CDC0 +#define CDC0_OUTEP_ADDR 0x02 // Output Endpoint Address of CDC0 +#define CDC0_INEP_ADDR 0x82 // Input Endpoint Address of CDC0 + +#define CDC1_COMM_INTERFACE 2 // Comm interface number of CDC1 +#define CDC1_DATA_INTERFACE 3 // Data interface number of CDC1 +#define CDC1_INTEP_ADDR 0x83 // Interrupt Endpoint Address of CDC1 +#define CDC1_OUTEP_ADDR 0x04 // Output Endpoint Address of CDC1 +#define CDC1_INEP_ADDR 0x84 // Input Endpoint Address of CDC1 + +#define CDC_NUM_INTERFACES 2 // Total Number of CDCs implemented. should set to 0 if there are no CDCs implemented. +#define HID_NUM_INTERFACES 0 // Total Number of HIDs implemented. should set to 0 if there are no HIDs implemented. +#define MSC_NUM_INTERFACES 0 // Total Number of MSCs implemented. should set to 0 if there are no MSCs implemented. +#define PHDC_NUM_INTERFACES 0 // Total Number of PHDCs implemented. should set to 0 if there are no PHDCs implemented. +// Interface numbers for the implemented CDSs and HIDs, This is to use in the Application(main.c) and in the interupt file(UsbIsr.c). +#define CDC0_INTFNUM 0 +#define CDC1_INTFNUM 1 +#define MSC_MAX_LUN_NUMBER 1 // Maximum number of LUNs supported + +#define PUTWORD(x) ((x)&0xFF),((x)>>8) + +#define USB_OUTEP_INT_EN BIT0 | BIT2 | BIT4 +#define USB_INEP_INT_EN BIT0 | BIT1 | BIT2 | BIT3 | BIT4 +// MCLK frequency of MCU, in Hz +// For running higher frequencies the Vcore voltage adjustment may required. +// Please refer to Data Sheet of the MSP430 device you use +#ifdef eZ_FET + #define USB_MCLK_FREQ 25000000 // MCLK frequency in Hz(eZ-FET, 5528) +#endif +#ifdef MSP_FET + #define USB_MCLK_FREQ 22000000 // MCLK frequency in Hz(MSP-FET, 6638) +#endif + +#define USB_PLL_XT 2 // Defines which XT is used by the PLL (1=XT1, 2=XT2) +#define USB_XT_FREQ USBPLL_SETCLK_4_0 // Indicates the freq of the crystal on the oscillator indicated by USB_PLL_XT +#define USB_DISABLE_XT_SUSPEND 0 // If non-zero, then USB_suspend() will disable the oscillator + // that is designated by USB_PLL_XT; if zero, USB_suspend won't + // affect the oscillator +#define USB_DMA_CHAN 0x00 // Set to 0xFF if no DMA channel will be used 0..7 for selected DMA channel + + + +// Controls whether the remote wakeup feature is supported by this device. +// A value of 0x20 indicates that is it supported (this value is the mask for +// the bmAttributes field in the configuration descriptor). +// A value of zero indicates remote wakeup is not supported. +// Other values are undefined, as they will interfere with bmAttributes. +#define USB_SUPPORT_REM_WAKE 0x00 + +// Controls whether the application is self-powered to any degree. Should be +// set to 0x40, unless the USB device is fully supplied by the bus. +#define USB_SUPPORT_SELF_POWERED 0x80 + +// Controls what the device reports to the host regarding how much power it will +// consume from VBUS. Expressed in 2mA units; that is, the number of mA +// communicated is twice the value of this field. +#define USB_MAX_POWER 0x32 +//Configuration constants that can not change ( Fixed Values) +#define CDC_CLASS 2 +#define HID_CLASS 3 +#define MSC_CLASS 4 +#define PHDC_CLASS 5 + + #define MAX_PACKET_SIZE 0x40 // Max size of the USB packets. + +//*********************************************************************************************** +// DESCRIPTOR CONSTANTS +//*********************************************************************************************** +#define SIZEOF_DEVICE_DESCRIPTOR 0x12 +//#define SIZEOF_REPORT_DESCRIPTOR 36 +//#define USBHID_REPORT_LENGTH 64 // length of whole HID report (including Report ID) +#define CONFIG_STRING_INDEX 4 +#define INTF_STRING_INDEX 5 +#define USB_CONFIG_VALUE 0x01 +//*********************************************************************************************** +// OUTWARD DECLARATIONS +//*********************************************************************************************** + +//Calculates the endpoint descriptor block number from given address +#define EDB(addr) ((addr&0x07)-1) + +/* Structure for generic part of configuration descriptor */ +struct abromConfigurationDescriptorGenric +{ + BYTE sizeof_config_descriptor; // bLength + BYTE desc_type_config; // bDescriptorType: 2 + BYTE sizeof_configuration_descriptor1; // wTotalLength + BYTE sizeof_configuration_descriptor2; + BYTE usb_num_configurations; // bNumInterfaces + BYTE bconfigurationvalue; // bConfigurationValue + BYTE config_string_index; // iConfiguration Description offset + BYTE mattributes; // bmAttributes, bus power, remote wakeup + BYTE usb_max_power; // Max. Power Consumption at 2mA unit +}; + +/************************************************CDC Descriptor**************************/ +struct abromConfigurationDescriptorCdc +{ +//Interface Association Descriptor + BYTE bLength; // Size of this Descriptor in Bytes + BYTE bDescriptorType; // Descriptor Type (=11) + BYTE bFirstInterface; // Interface number of the first one associated with this function + BYTE bInterfaceCount; // Numver of contiguous interface associated with this function + BYTE bFunctionClass; // The class triad of this interface, + BYTE bFunctionSubClass; // usually same as the triad of the first interface + BYTE bFunctionProcotol; + BYTE iInterface; // Index of String Desc for this function +// interface descriptor (9 bytes) + BYTE blength_intf; // blength: interface descriptor size + BYTE desc_type_interface; // bdescriptortype: interface + BYTE interface_number_cdc; // binterfacenumber + BYTE balternatesetting; // balternatesetting: alternate setting + BYTE bnumendpoints; // bnumendpoints: three endpoints used + BYTE binterfaceclass; // binterfaceclass: communication interface class + BYTE binterfacesubclass; // binterfacesubclass: abstract control model + BYTE binterfaceprotocol; // binterfaceprotocol: common at commands + BYTE intf_string_index; // interface: +//header functional descriptor + BYTE blength_header; // blength: endpoint descriptor size + BYTE bdescriptortype_header; // bdescriptortype: cs_interface + BYTE bdescriptorsubtype_header; // bdescriptorsubtype: header func desc + BYTE bcdcdc1; + BYTE bcdcdc2; // bcdcdc: spec release number + +//call managment functional descriptor + BYTE bfunctionlength; // bfunctionlength + BYTE bdescriptortype_c; // bdescriptortype: cs_interface + BYTE bdescriptorsubtype_c; // bdescriptorsubtype: call management func desc + BYTE bmcapabilities; // bmcapabilities: d0+d1 + BYTE intf_number_cdc; // bdatainterface: 0 + +//acm functional descriptor + BYTE bfunctionlength_acm; // bfunctionlength + BYTE bdescriptortype_acm; // bdescriptortype: cs_interface + BYTE bdescriptorsubtype_acm; // bdescriptorsubtype: abstract control management desc + BYTE bmcapabilities_acm; // bmcapabilities + +// Union Functional Descriptor + BYTE bLength_ufd; // Size, in bytes + BYTE bdescriptortype_ufd; // bDescriptorType: CS_INTERFACE + BYTE bdescriptorsubtype_ufd; // bDescriptorSubtype: Union Functional Desc + BYTE bmasterinterface_ufd; // bMasterInterface -- the controlling intf for the union + BYTE bslaveinterface_ufd; // bSlaveInterface -- the controlled intf for the union + +//Interrupt end point related fields + BYTE sizeof_epintep_descriptor; // blength: endpoint descriptor size + BYTE desc_type_epintep; // bdescriptortype: endpoint + BYTE cdc_intep_addr; // bendpointaddress: (in2) + BYTE epintep_desc_attr_type_int; // bmattributes: interrupt + BYTE epintep_wmaxpacketsize1; + BYTE epintep_wmaxpacketsize; // wmaxpacketsize, 64 bytes + BYTE epintep_binterval; // binterval + +// Data interface descriptor (9 bytes) + BYTE blength_slaveintf; // blength: interface descriptor size + BYTE desc_type_slaveinterface; // bdescriptortype: interface + BYTE interface_number_slavecdc; // binterfacenumber + BYTE balternatesetting_slave; // balternatesetting: alternate setting + BYTE bnumendpoints_slave; // bnumendpoints: three endpoints used + BYTE binterfaceclass_slave; // binterfaceclass: data interface class + BYTE binterfacesubclass_slave; // binterfacesubclass: abstract control model + BYTE binterfaceprotocol_slave; // binterfaceprotocol: common at commands + BYTE intf_string_index_slave; // interface: + +// Bulk out end point related fields + BYTE sizeof_outep_descriptor; // blength: endpoint descriptor size + BYTE desc_type_outep; // bdescriptortype: endpoint + BYTE cdc_outep_addr; // bendpointaddress: (out3) + BYTE outep_desc_attr_type_bulk; // bmattributes: bulk + BYTE outep_wmaxpacketsize1; + BYTE outep_wmaxpacketsize2; // wmaxpacketsize, 64 bytes + BYTE outep_binterval; // binterval: ignored for bulk transfer + +// Bulk in related fields + BYTE sizeof_inep_descriptor; // blength: endpoint descriptor size + BYTE desc_type_inep; // bdescriptortype: endpoint + BYTE cdc_inep_addr; // bendpointaddress: (in3) + BYTE inep_desc_attr_type_bulk; // bmattributes: bulk + BYTE inep_wmaxpacketsize1; + BYTE inep_wmaxpacketsize2; // wmaxpacketsize, 64 bytes + BYTE inep_binterval; // binterval: ignored for bulk transfer +}; + +/**************************************HID descriptor structure *************************/ +struct abromConfigurationDescriptorHid +{ +//INTERFACE DESCRIPTOR (9 bytes) + BYTE sizeof_interface_descriptor; // Desc Length + BYTE desc_type_interface; // DescriptorType + BYTE interface_number_hid; // Interface number + BYTE balternatesetting; // Any alternate settings if supported + BYTE bnumendpoints; // Number of end points required + BYTE binterfaceclass; // Class ID + BYTE binterfacesubclass; // Sub class ID + BYTE binterfaceprotocol; // Protocol + BYTE intf_string_index; // String Index + +//hid descriptor (9 bytes) + BYTE blength_hid_descriptor; // HID Desc length + BYTE hid_descriptor_type; // HID Desc Type + BYTE hidrevno1; // Rev no + BYTE hidrevno2; // Rev no - 2nd part + BYTE tcountry; // Country code + BYTE numhidclasses; // Number of HID classes to follow + BYTE report_descriptor_type; // Report desc type + BYTE tlength; // Total length of report descriptor + BYTE size_rep_desc; + +//input end point descriptor (7 bytes) + BYTE size_inp_endpoint_descriptor; // End point desc size + BYTE desc_type_inp_endpoint; // Desc type + BYTE hid_inep_addr; // Input end point address + BYTE ep_desc_attr_type_inp_int; // Type of end point + BYTE inp_wmaxpacketsize1; // Max packet size + BYTE inp_wmaxpacketsize2; + BYTE inp_binterval; // bInterval in ms + + // Output end point descriptor; (7 bytes) + BYTE size_out_endpoint_descriptor; // Output endpoint desc size + BYTE desc_type_out_endpoint; // Desc type + BYTE hid_outep_addr; // Output end point address + BYTE ep_desc_attr_type_out_int; // End point type + BYTE out_wmaxpacketsize1; // Max packet size + BYTE out_wmaxpacketsize2; + BYTE out_binterval; // bInterval in ms +}; + +/**************************************MSC descriptor structure *************************/ +struct abromConfigurationDescriptorMsc +{ +// INTERFACE DESCRIPTOR (9 bytes) + BYTE sizeof_interface_descriptor; // Desc Length + BYTE desc_type_interface; // DescriptorType + BYTE interface_number_hid; // Interface number + BYTE balternatesetting; // Any alternate settings if supported + BYTE bnumendpoints; // Number of end points required + BYTE binterfaceclass; // Class ID + BYTE binterfacesubclass; // Sub class ID + BYTE binterfaceprotocol; // Protocol + BYTE intf_string_index; // String Index + +// input end point descriptor (7 bytes) + BYTE size_inp_endpoint_descriptor; // End point desc size + BYTE desc_type_inp_endpoint; // Desc type + BYTE hid_inep_addr; // Input end point address + BYTE ep_desc_attr_type_inp_int; // Type of end point + BYTE inp_wmaxpacketsize1; // Max packet size + BYTE inp_wmaxpacketsize2; + BYTE inp_binterval; // bInterval in ms + +// Output end point descriptor; (7 bytes) + BYTE size_out_endpoint_descriptor; // Output endpoint desc size + BYTE desc_type_out_endpoint; // Desc type + BYTE hid_outep_addr; // Output end point address + BYTE ep_desc_attr_type_out_int; // End point type + BYTE out_wmaxpacketsize1; // Max packet size + BYTE out_wmaxpacketsize2; + BYTE out_binterval; // bInterval in ms +}; + +/* Global structure having Generic,CDC,HID, MSC structures */ +struct abromConfigurationDescriptorGroup +{ + /* Generic part of config descriptor */ + const struct abromConfigurationDescriptorGenric abromConfigurationDescriptorGenric; +#ifdef _MSC_ + /* MSC descriptor structure */ + const struct abromConfigurationDescriptorMsc stMsc[MSC_NUM_INTERFACES]; +#endif +#ifdef _CDC_ + /* CDC descriptor structure */ + const struct abromConfigurationDescriptorCdc stCdc[CDC_NUM_INTERFACES]; +#endif +#ifdef _HID_ + /* HID descriptor structure */ + const struct abromConfigurationDescriptorHid stHid[HID_NUM_INTERFACES]; +#endif +#ifdef _PHDC_ +/* PDC descriptor structure */ + const struct abromConfigurationDescriptorPhdc stPhdc[PHDC_NUM_INTERFACES]; +#endif +}; + +extern const struct abromConfigurationDescriptorGroup abromConfigurationDescriptorGroup; +extern BYTE const abromDeviceDescriptor[SIZEOF_DEVICE_DESCRIPTOR]; +extern BYTE const abromStringDescriptor[]; +//extern BYTE const abromReportDescriptor[SIZEOF_REPORT_DESCRIPTOR]; + +/* Handle Structure - Will be populated in descriptors.c based on number of CDC,HID interfaces */ +struct tUsbHandle +{ + BYTE ep_In_Addr; // Input EP Addr + BYTE ep_Out_Addr; // Output EP Addr + BYTE edb_Index; // The EDB index + BYTE dev_Class; // Device Class- 2 for CDC, 3 for HID + WORD intepEP_X_Buffer; // Interupt X Buffer Addr + WORD intepEP_Y_Buffer; // Interupt Y Buffer Addr + WORD oep_X_Buffer; // Output X buffer Addr + WORD oep_Y_Buffer; // Output Y buffer Addr + WORD iep_X_Buffer; // Input X Buffer Addr + WORD iep_Y_Buffer; // Input Y Buffer Addr +}; + +extern const struct tUsbHandle stUsbHandle[CDC_NUM_INTERFACES + HID_NUM_INTERFACES + MSC_NUM_INTERFACES + PHDC_NUM_INTERFACES]; +extern const tDEVICE_REQUEST_COMPARE tUsbRequestList[]; + +#ifdef __cplusplus +} +#endif + +#endif + +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/bios.c b/Bios/src/fw/fet/bios.c new file mode 100644 index 0000000..848b4be --- /dev/null +++ b/Bios/src/fw/fet/bios.c @@ -0,0 +1,923 @@ +/* + * bios.c + * + * Copyright (C) 2013 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. + */ + +#include "hw_compiler_specific.h" +#include "bios.h" +#include + +#include "USB_API/USB_Common/types.h" +#include "USB_API/USB_CDC_API/UsbCdc.h" +#include "USB_config/descriptors.h" +#include "usbConstructs.h" +#include "USB_API/USB_Common/usb.h" +#include "communicationDefs.h" +#include "protocol.h" +#include "FetVersion.h" + +//! \brief count of LED from uif +#define BIOS_LED_COUNT 2 + +//! \brief pin (from TUSB) for hardware handshake for TX cannel +//! \details also used as TRUE value for bios_xoff_ +#define BIOS_HARD_RTS_BIT 3 + +//! \brief version of bios code +const unsigned short core_version_ @ "COREVERSION" = CORE_VERSION; +#pragma required=core_version_ + +unsigned short tool_id_; +#pragma required=tool_id_ + +//! \brief chars for flow control +const unsigned char BIOS_DLE_CHAR = 0x10; +//! \brief chars for flow control +const unsigned char BIOS_XON_CHAR = 0x11; +//! \brief chars for flow control +const unsigned char BIOS_XOFF_CHAR = 0x13; + +//**************************** Internal function prototypes + +//! \brief clears the TX software buffer +void bios_UsbTxClear(void); + +//! \brief dummy to catch all irq +//! \details biosHalInterfaceClear set all by bios unused irqs to dummy +INTERRUPT_PROTO void dummyIsr (void); + +//! \brief receive char form UART +//! \details get chars form hardware RX buffer and stor them in the RX software buffer(s). +//! Messages are checked on crc. and ack/exceptions processed in this function. +void usbRxIsr (unsigned char receivedByte); + +//! \brief 10ms timer interrupt +//! \details count all 10ms the timer for RX and TX timeouts. +//! Also the timer for LED drive. +INTERRUPT_PROTO void timerB1Isr (void); + +//! \brief function is called by hardware interrupt if TX buffer goes empty +//! \details move a char from the TX software buffer to the hardware TX buffer. +void BIOS_usbTxData (void); + +//! \brief Buffer for the RX cannel +//! \details actual two buffers used, one for working, the second to catch char which receivend before +//! the cts signal have an effect. +volatile BiosRxRecord bios_rx_record_ = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, 0, {0,0,0,0}, 0, 0, 0, {0,0,0,0}}; +//! \brief Buffer for the TX cannel +//! \details only one buffer in uif. There is no need for a second. The dll play ping pong with the uif +volatile BiosTxRecord bios_tx_record_ = {0, 0, {0}, {0}, {0}, {0}, {0}, NULL, 0}; + +//! \brief Timer for RX and TX timeouts +//! \details timebase 10ms +volatile BiosGlobalTimer bios_global_timer_[BIOS_TIMER_COUNT]; +//! \brief uif is under control of the eg. workbench +//! \details \li 0, not under control, reset by EXCEPTION NULL +//! \li 1, set in v3opRx with the first valid command +char bios_wb_control_ = 0; + +//! \brief values for (re)set LEDs +const unsigned char BIOS_LED_OFF = 0x00; +//! \brief values for (re)set LEDs +const unsigned char BIOS_LED_ON = 0x01; +//! \brief values for (re)set LEDs +const unsigned char BIOS_LED_BLINK = 0x02; + +volatile SystemEventMsp system_event_msp_; + +//! \brief for LED driving +struct _BiosLedTimer_ +{ + unsigned char mode; + unsigned short load; + unsigned short counter; + unsigned char *addr; + unsigned char bit; +}; +typedef struct _BiosLedTimer_ BiosLedTimer; + +//! \brief for LED driving +volatile BiosLedTimer bios_leds_[BIOS_LED_COUNT]; + +//! \brief the LED from the EASY :-) +//! \details The EASY haven't LEDs, this var is a replacment for the port to catch +//! the LED driving +unsigned char bios_led_dummy_; + +//! \brief Hold the crystal frequency +//! \details will set in biosInitSystem depended for the detected hardware +//! will used eg. from timers and UART +unsigned long crystal_; + +//! \brief modulation register value +//! \details will set in biosInitSystem depended for the detected hardware +unsigned char baudmod_ = 0; + +//! \brief flags for hardware features +//! \details will set in biosInitSystem depended for the detected hardware +//! \li bit 0 -> handshake xon/xoff = 1, hw handshake = 0 +//! \li bit 1 -> 4 wire +//! \li bit 2 -> 2 wire +unsigned long bios_device_flags_ = 0; + +//! \brief hardware version +//! \details will set in biosInitSystem depended for the detected hardware +unsigned short bios_info_hw_0_; + +//! \brief hardware version +//! \details will set in biosInitSystem depended for the detected hardware +unsigned short bios_info_hw_1_; + +//! \brief gets the received char +unsigned char bios_rx_char_; + +//! \brief dummy to switch of XON/XOFF in easy +const unsigned char bios_rx_char_always_0 = 0; + +//! \brief points to bios_rx_char_ if XON/XOFF is active +//! \details on EASY it points to bios_rx_char_always_0 to disable XON/XOFF functionality +//! will set in biosInitSystem depended for the detected hardware +unsigned char *bios_rx_char_ptr_; + +//! \brief Flag for XON/XOFF status +//! \li 0, TX can send +//! \li 1, TX must not be send +//! \details between receiving xoff and sending chars is a delay (by program flow). This +//! is not a problem, because the TUSB has enougth reserve in the buffer. +unsigned char bios_xoff_ = 0; + +//! \brief pointer to active TX flow control +//! \details \li on EASY it points to the PORT with the handshakesignals +//! \li on uif it points to the (software)flag bios_xoff_ +//! will set in biosInitSystem depended for the detected hardware +unsigned char *bios_xoff_ptr_ = &bios_xoff_; + +//! \brief Flag for error indication +//! \details \li 1, an error message is to send. Set by every function which can generate an error +//! \li 0, reset in biosmainLoop, if error message was send +volatile char bios_rx_err_set_ = 0; + +//! \brief Message ID from received message which provoke the error. +volatile unsigned char bios_rx_err_id_ = 0; + +//! \brief error code +//! \li EXCEPTION_NOT_IMPLEMENT_ERR 0x8001 +//! \li EXCEPTION_MSGID_ERR 0x8002 +//! \li EXCEPTION_CRC_ERR 0x8003 +//! \li EXCEPTION_RX_TIMEOUT_ERR 0x8004 +//! \li EXCEPTION_TX_TIMEOUT_ERR 0x8005 +//! \li EXCEPTION_RX_OVERFLOW_ERR 0x8006 +//! \li EXCEPTION_TX_NO_BUFFER 0x8007 +//! \li EXCEPTION_COM_RESET 0x8008 +//! \li EXCEPTION_RX_NO_BUFFER 0x8009 +//! \li EXCEPTION_RX_TO_SMALL_BUFFER 0x800A +//! \li EXCEPTION_RX_LENGTH 0x800B +//! \li HAL specific exceptions 0xFFFF to 0xFF00 (-1 to -255) +volatile BIOS_RxError_t BIOS_RxEr; + +//! \brief Pointer to additional information +//! \details if an error provide more information about the error +volatile unsigned short *bios_rx_err_payload_ = NULL; + +//! \brief target for dummyread form UART +volatile unsigned char usb_read_dummy_; + +volatile unsigned short CTS_LINE = 0; + +//**************************** Module Implementation ******************/ +void BIOS_InitSystem (void) +{ //Init Timer A1 (currently used for TX and RX timeouts and LED's) + //generates interrupt every 10ms + TA1CCR0 = USB_MCLK_FREQ / (8 * 100) - 1; + TA1CTL = TASSEL__SMCLK | ID__8 | MC__UP/*MC__CONTINOUS*/ | TACLR | TAIE; + +#ifdef eZ_FET + // LED assignments for eZ-FET + bios_leds_[0].addr = (unsigned char*)&P1OUT; + bios_leds_[0].bit = BIT2; + bios_leds_[1].addr = (unsigned char*)&P1OUT; + bios_leds_[1].bit = BIT3; +#endif + +#ifdef MSP_FET + // LED assignments for MSP-FET + bios_leds_[0].addr = (unsigned char*)&P6OUT; + bios_leds_[0].bit = BIT7; + bios_leds_[1].addr = (unsigned char*)&P5OUT; + bios_leds_[1].bit = BIT3; +#endif + + /// is detected!! + // char set to rx input for xon/xoff + bios_rx_char_ptr_ = &bios_rx_char_; + + // disalbe BSL protection + SYSBSLC &= ~SYSBSLPE; + // get tool id stored in BSL area + tool_id_ = *(unsigned short*)0x100e; + + // enable BSL protection again + SYSBSLC |= SYSBSLPE; + + bios_info_hw_0_ = tool_id_; + bios_info_hw_1_ = tool_id_; +} + +void BIOS_SuspendSystem(void) +{} + +void BIOS_ResumeSystem(void) +{} + +void BIOS_SetCts() +{ + CTS_LINE = FALSE; bios_global_timer_[0].state |= BIOS_TIMER_BREAK; +} +void BIOS_ResetCts() +{ + CTS_LINE = TRUE; bios_global_timer_[0].state &= ~BIOS_TIMER_BREAK; +} + +unsigned short Bios_getCore_version() +{ + return CORE_VERSION; +} +unsigned short Bios_getTool_id() +{ + return tool_id_; +} +unsigned short Bios_getInfo_hw_0() +{ + return bios_info_hw_0_; +} +unsigned short Bios_getInfo_hw_1() +{ + return bios_info_hw_1_; +} + +//************************************* +short BIOS_LedOn(unsigned char no) +{ + if(no < BIOS_LED_COUNT) + { + bios_leds_[no].mode = BIOS_LED_ON; + bios_leds_[no].load = 0; + bios_leds_[no].counter = 0; + } + return(0); +} + +//************************************ +short BIOS_LedOff(unsigned char no) +{ + if(no < BIOS_LED_COUNT) + { + bios_leds_[no].mode = BIOS_LED_OFF; + bios_leds_[no].load = 0; + bios_leds_[no].counter = 0; + } + return(0); +} + +//************************************ +short BIOS_LedBlink(unsigned char no,unsigned short time) +{ + if(no < BIOS_LED_COUNT) + { + bios_leds_[no].load = time * 2; + bios_leds_[no].counter = time * 2; + bios_leds_[no].mode = BIOS_LED_BLINK; + } + return(0); +} + +//************************************ +short BIOS_LedFlash(unsigned char no,unsigned short time) +{ + if((no < BIOS_LED_COUNT) && !bios_leds_[no].counter) + { + bios_leds_[no].load = time * 2; + bios_leds_[no].counter = time * 2; + bios_leds_[no].mode &= ~BIOS_LED_BLINK; + } + return(0); +} + +//************************************ +short BIOS_LedAlternate(unsigned short time) +{ + bios_leds_[0].load = time * 2; + bios_leds_[0].counter = time; + bios_leds_[1].load = time * 2; + bios_leds_[1].counter = time; + if(time) + { + bios_leds_[0].mode = BIOS_LED_ON | BIOS_LED_BLINK; + bios_leds_[1].mode = BIOS_LED_OFF | BIOS_LED_BLINK; + } + else + { + bios_leds_[0].mode = BIOS_LED_OFF; + bios_leds_[1].mode = BIOS_LED_OFF; + } + return(0); + } + +//************************************ +void BIOS_GlobalError(void) +{ + BIOS_LedOn(BIOS_LED_MODE); + BIOS_LedOff(BIOS_LED_POWER); + while(1); +} + +//INTERRUPT(TIMER1_A1_VECTOR) void timerB1Isr (void) +//*********************************************** +INTERRUPT(TIMER1_A1_VECTOR) void timerB1Isr (void) +{ + if(TA1IV == TA1IV_TA1IFG) + { + // process global timers + if((bios_global_timer_[BIOS_TIMER_RX].count > 1) && !(bios_global_timer_[BIOS_TIMER_RX].state & BIOS_TIMER_BREAK)) + { + bios_global_timer_[BIOS_TIMER_RX].count--; + } + else if(bios_global_timer_[BIOS_TIMER_RX].count == 1) + { + bios_global_timer_[0].count = 0; + BIOS_UsbRxError(EXCEPTION_RX_TIMEOUT_ERR); + } + if((bios_global_timer_[BIOS_TIMER_TX].count > 1) && !(bios_xoff_)) + { + bios_global_timer_[BIOS_TIMER_TX].count--; + } + // LED mode + DIAG_SUPPRESS(Pa082) + if((bios_leds_[BIOS_LED_MODE].mode & BIOS_LED_ON) ^ (bios_leds_[BIOS_LED_MODE].counter > (bios_leds_[BIOS_LED_MODE].load/2))) + { + *bios_leds_[BIOS_LED_MODE].addr |= bios_leds_[BIOS_LED_MODE].bit; + } + else + { + *bios_leds_[BIOS_LED_MODE].addr &= ~bios_leds_[BIOS_LED_MODE].bit; + } + DIAG_DEFAULT(Pa082) + if(bios_leds_[BIOS_LED_MODE].counter > 0) + { + bios_leds_[BIOS_LED_MODE].counter--; + } + else if(bios_leds_[BIOS_LED_MODE].mode & BIOS_LED_BLINK) + { + bios_leds_[BIOS_LED_MODE].counter = bios_leds_[BIOS_LED_MODE].load; + } + + // LED power + DIAG_SUPPRESS(Pa082) + if((bios_leds_[BIOS_LED_POWER].mode & BIOS_LED_ON) ^ (bios_leds_[BIOS_LED_POWER].counter > (bios_leds_[BIOS_LED_POWER].load/2))) + { + *bios_leds_[BIOS_LED_POWER].addr |= bios_leds_[BIOS_LED_POWER].bit; + } + else + { + *bios_leds_[BIOS_LED_POWER].addr &= ~bios_leds_[BIOS_LED_POWER].bit; + } + DIAG_DEFAULT(Pa082) + if(bios_leds_[BIOS_LED_POWER].counter > 0) + { + bios_leds_[BIOS_LED_POWER].counter--; + } + else if(bios_leds_[BIOS_LED_POWER].mode & BIOS_LED_BLINK) + { + bios_leds_[BIOS_LED_POWER].counter = bios_leds_[BIOS_LED_POWER].load; + } + } +} + +//********************************************************** +INTERRUPT_PROTO void dummyIsr (void) +{ + ; +} +const volatile unsigned short *bios_intvec_ = (unsigned short*)0xFF80; + +//! \brief Pointer to HAL IRQ vector table +RO_PLACEMENT_NO_INIT volatile const unsigned long hal_intvec_ @ "HALINTVEC"; +RO_PLACEMENT_NO_INIT volatile const unsigned long hal_signature_ @ "HALSIGNATURE"; + +RO_PLACEMENT_NO_INIT volatile const unsigned long dcdc_intvec_ @ "DCDCIVEC"; +RO_PLACEMENT_NO_INIT volatile const unsigned long dcdc_signature_ @ "DCDCSIGNATURE"; + +RO_PLACEMENT_NO_INIT volatile const unsigned long hil_signature_ @ "HILSIGNATURE"; +RO_PLACEMENT_NO_INIT volatile const unsigned short hil_Start_UP_ @ "HILINIT"; + +RO_PLACEMENT_NO_INIT volatile const unsigned long com_intvec_ @ "COMINTVEC"; +RO_PLACEMENT_NO_INIT volatile const unsigned long com_signature_ @ "COMSIGNATURE"; +RO_PLACEMENT_NO_INIT volatile const long com_semaphore_ @ "COM_SEMAPHOREADRESS"; + +unsigned long Bios_getHal_intvec() +{ + return hal_intvec_; +} +unsigned short Bios_getHil_intvec() +{ + return hil_Start_UP_; +} +unsigned long Bios_getDcdc_intvec() +{ + return dcdc_intvec_; +} +unsigned long Bios_getCom_intvec() +{ + return com_intvec_; +} +unsigned long Bios_getDcdc_signature() +{ + return dcdc_signature_; +} +unsigned long Bios_getHal_signature() +{ + return hal_signature_; +} +unsigned long Bios_getHil_signature() +{ + return hil_signature_; +} +unsigned long Bios_getCom_signature() +{ + return com_signature_; +} +//*************************************** +unsigned short tempInDataRx[4][BIOS_RX_SIZE]= {0x0,0x0}; + +//*************************************** +void BIOS_InitCom(void) +{ + unsigned char i; + + for(i = 0; i < BIOS_RX_QUEUS; i++) + { + bios_rx_record_.datas[i] = tempInDataRx[i]; + if(bios_rx_record_.datas[i] == NULL) + { + BIOS_GlobalError(); + } + bios_rx_record_.data[i] = (unsigned char*)bios_rx_record_.datas[i]; + } + for(i = 0; i < BIOS_TX_QUEUS; i++) + { + bios_tx_record_.data[i] = (unsigned char*)bios_tx_record_.datas[i]; + } +} +//***************************************** +void BIOS_PrepareTx(unsigned int size) +{ + bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] = 0; + DIAG_SUPPRESS(Pa082) + bios_tx_record_.count[bios_tx_record_.active] = size; + bios_tx_record_.state[bios_tx_record_.active] |= BIOS_TX_TO_SEND; + DIAG_DEFAULT(Pa082) +} + +//******************************************** +void BIOS_StartTx(void) +{ + bios_global_timer_[BIOS_TIMER_TX].count = BIOS_TX_TIMEOUT; + BIOS_usbTxData(); +} + +//********************************************* +void BIOS_UsbTxError(void) +{ + BIOS_UsbTxClear(); +} + +//********************************************* +void BIOS_UsbTxClear(void) +{ + unsigned char i; + + memset((unsigned char*)&bios_tx_record_, 0, sizeof(bios_tx_record_)); + bios_global_timer_[BIOS_TIMER_TX].count = 0; + bios_rx_char_ = 0; + for(i = 0; i < BIOS_TX_QUEUS; i++) + { + bios_tx_record_.data[i] = (unsigned char*)bios_tx_record_.datas[i]; + bios_tx_record_.state[i] = 0; + } +} + +//*************************************** +void BIOS_UsbRxClear(void) +{ + unsigned char i; + + bios_rx_record_.active = 0; + for(i = 0; i < BIOS_RX_QUEUS; i++) + { + bios_rx_record_.state[i] = 0; + bios_rx_record_.last_cmd_typ = 0; + bios_rx_record_.last_msg_id = 0; + bios_rx_record_.data[i][0] = 0; + bios_rx_record_.crc[i] = 0; + bios_rx_record_.count[i] = 0; + bios_rx_record_.size[i] = 0; + } + bios_global_timer_[0].count = 0; +} + +short BIOS_IsUsbRxError() +{ + if(BIOS_RxEr.bios_rx_err_set_) + { + return TRUE; + } + return FALSE; +} + +void BIOS_ClearUsbRxError() +{ + BIOS_RxEr.bios_rx_err_code_ = 0; + BIOS_RxEr.bios_rx_err_id_ = 0; + BIOS_RxEr.bios_rx_err_payload_ = NULL; + BIOS_RxEr.bios_rx_err_set_ = 0; +} + +BIOS_RxError_t BIOS_getRxError() +{ + return BIOS_RxEr; +} +//******************************************** +void BIOS_UsbRxError(unsigned short code) +{ + BIOS_UsbRxClear(); + BIOS_RxEr.bios_rx_err_code_ = code; + BIOS_RxEr.bios_rx_err_id_ = 0; + BIOS_RxEr.bios_rx_err_payload_ = NULL; + BIOS_RxEr.bios_rx_err_set_ = 1; +} +//************************************************************ +void BIOS_usbTxData (void) +{ + unsigned char first_cannel; + // some thing to send in active send buffer? + first_cannel = bios_tx_record_.cannel_to_send; + while(!(bios_tx_record_.state[bios_tx_record_.cannel_to_send] & BIOS_TX_TO_SEND)) + { + + bios_tx_record_.cannel_to_send++; + if(bios_tx_record_.cannel_to_send >= BIOS_TX_QUEUS) + { + bios_tx_record_.cannel_to_send = 0; + } + + if(bios_tx_record_.cannel_to_send == first_cannel) + { + return; + } + } + // test on chars in software TX buffer + DIAG_SUPPRESS(Pa082) + if(bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] < bios_tx_record_.count[bios_tx_record_.cannel_to_send]) + { + WORD x; + + // send char from software buffer + if(cdcSendDataInBackground((BYTE*)&bios_tx_record_.data[bios_tx_record_.cannel_to_send][0],bios_tx_record_.count[bios_tx_record_.cannel_to_send],0,10)) //Send the response over USB + { + USBCDC_abortSend(&x,0); // It failed for some reason; abort and leave the main loop + } + // no char to send ***anymore*** in actual TX software buffer + // we don't clear TX software buffer, reset only flags. If need we can + // send the buffer again. (resending in not implemented) + bios_tx_record_.state[bios_tx_record_.cannel_to_send] &= ~BIOS_TX_TO_SEND; + bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] = 0; + first_cannel = bios_tx_record_.cannel_to_send; + if(!(bios_tx_record_.state[bios_tx_record_.cannel_to_send] & BIOS_TX_WAIT_ON_ACK)) + { + bios_global_timer_[BIOS_TIMER_TX].count = 0; + } + // search in TX software buffer for data to send. If no data found, it was the + // last TX buffer empty interrupt. + do + { + + bios_tx_record_.cannel_to_send++; + if(bios_tx_record_.cannel_to_send >= BIOS_TX_QUEUS) + { + bios_tx_record_.cannel_to_send = 0; + } + + if(bios_tx_record_.state[bios_tx_record_.cannel_to_send] & BIOS_TX_TO_SEND) + { + if(bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] <= ((unsigned short)bios_tx_record_.data[bios_tx_record_.cannel_to_send][0])) // add left side +1, if crc active + { + bios_global_timer_[BIOS_TIMER_TX].count = BIOS_TX_TIMEOUT; + } + } + } + while(!(bios_tx_record_.state[bios_tx_record_.cannel_to_send] & BIOS_TX_TO_SEND) && (bios_tx_record_.cannel_to_send != first_cannel)); + } + DIAG_DEFAULT(Pa082) +} + +short BIOS_UsbRxData() +{ + BYTE count = 0; + BYTE usbDataPointer = 0; + BYTE sizeToCopy = 0; + short returnError = 0; + + BIOS_SetCts(); + count = USBCDC_bytesInUSBBuffer(DEBUG_CHANNEL); + if(count) + { + #pragma data_alignment=4 + static BYTE recivedData[260] = {0}; + + USBCDC_receiveData(recivedData, count , DEBUG_CHANNEL); + + while(count) + { + // get char from hardwarebuffer + bios_rx_char_ = recivedData[usbDataPointer]; + // test for xon/xoff flow control char + + // test for free buffer + if(bios_rx_record_.state[bios_rx_record_.active] & BIOS_RX_RDY) + { + BIOS_UsbRxError(EXCEPTION_RX_NO_BUFFER); + returnError = EXCEPTION_RX_NO_BUFFER; + goto usbRxIsrExit; + } + // test for first char in a message + if(!bios_rx_record_.count[bios_rx_record_.active]) + { + // a message must received in 100ms completely + // if not a timeout error generate by timerB1Isr + bios_global_timer_[0].count = 50; // start timeout timer 500ms + bios_rx_record_.crc[1] = 0; + // length of messages must be even + if(bios_rx_char_ & 0x01) + { + bios_rx_record_.size[bios_rx_record_.active] = bios_rx_char_ + 0; + } + else + { + bios_rx_record_.size[bios_rx_record_.active] = bios_rx_char_ + 1; + } + } + // test for buffer size + if(bios_rx_record_.size[bios_rx_record_.active] < (BIOS_RX_SIZE + 2)) + { + DIAG_SUPPRESS(Pa082) + sizeToCopy = bios_rx_record_.size[bios_rx_record_.active] + 1 - bios_rx_record_.count[bios_rx_record_.active]; + if(sizeToCopy > count) + { + sizeToCopy = count; + } + BYTE numWords = sizeToCopy/sizeof(unsigned int); + unsigned int *pDest = (unsigned int*) &bios_rx_record_.data[bios_rx_record_.active][bios_rx_record_.count[bios_rx_record_.active]]; + unsigned int *pSrc = (unsigned int*) &recivedData[usbDataPointer]; + for(unsigned char i = 0; i < numWords; ++i) + { + *pDest++ = *pSrc++; + } + for(unsigned char i = numWords*sizeof(unsigned int); i < sizeToCopy; ++i) + { + bios_rx_record_.data[bios_rx_record_.active][bios_rx_record_.count[bios_rx_record_.active]+i] = recivedData[usbDataPointer+i]; + } + bios_rx_record_.count[bios_rx_record_.active] += sizeToCopy; + usbDataPointer += sizeToCopy; + count -= sizeToCopy; + DIAG_DEFAULT(Pa082) + } + else + { + BIOS_UsbRxError(EXCEPTION_RX_TO_SMALL_BUFFER); + returnError = EXCEPTION_RX_TO_SMALL_BUFFER; + goto usbRxIsrExit; + } + + // test for completly message + DIAG_SUPPRESS(Pa082) + if(bios_rx_record_.count[bios_rx_record_.active] > (bios_rx_record_.size[bios_rx_record_.active])) + DIAG_DEFAULT(Pa082) + { + bios_global_timer_[0].count = 0; // stop timeout timer + + if(bios_rx_record_.data[bios_rx_record_.active][MESSAGE_CMDTYP_POS] == RESPTYP_ACKNOWLEDGE) + { + // search for message which are waiting on a ack + for(unsigned char i = 0; i < BIOS_TX_QUEUS; i++) + { + DIAG_SUPPRESS(Pa082) + // waits a transmited message for a ACK? + if((bios_tx_record_.state[i] & BIOS_TX_WAIT_ON_ACK) && + ((bios_tx_record_.data[i][MESSAGE_MSG_ID_POS] & 0x3F) == bios_rx_record_.data[bios_rx_record_.active][MESSAGE_MSG_ID_POS])) + { + // if the transmited message are a member of a multi package message, the ack provide the package number + if( bios_tx_record_.data[i][3] || (bios_rx_record_.data[bios_rx_record_.active][0] > 3) ) + { + // package number are in byte 4 + if(bios_tx_record_.data[i][3] == bios_rx_record_.data[bios_rx_record_.active][4]) + DIAG_DEFAULT(Pa082) + { + bios_tx_record_.state[i] &= ~(BIOS_TX_WAIT_ON_ACK | BIOS_TX_TO_SEND | BIOS_TX_NO_SEND); + bios_global_timer_[BIOS_TIMER_TX].count = 0; + break; + } + } + else + { + bios_tx_record_.state[i] &= ~(BIOS_TX_WAIT_ON_ACK | BIOS_TX_TO_SEND | BIOS_TX_NO_SEND); + break; + } + } + } + } + else if(bios_rx_record_.data[bios_rx_record_.active][MESSAGE_CMDTYP_POS] == RESPTYP_EXCEPTION) + { + // exception with message ID = 0 always reset the communication + // also all user macros in the loop are terminated + if(bios_rx_record_.data[bios_rx_record_.active][MESSAGE_MSG_ID_POS] == 0) + { + BIOS_LedOn(BIOS_LED_POWER); + BIOS_LedOff(BIOS_LED_MODE); + bios_wb_control_ = 0; + returnError = RESPTYP_EXCEPTION; + + } + else + { + // search for message which are waiting on a ack + for(unsigned char i = 0; i < BIOS_TX_QUEUS; i++) + { + DIAG_SUPPRESS(Pa082) + if(((bios_tx_record_.state[i] & (BIOS_TX_WAIT_ON_ACK | BIOS_TX_TO_SEND)) == (BIOS_TX_WAIT_ON_ACK | BIOS_TX_TO_SEND)) && + (bios_tx_record_.data[i][MESSAGE_MSG_ID_POS] == bios_rx_record_.data[bios_rx_record_.active][MESSAGE_MSG_ID_POS]) && + (bios_tx_record_.data[i][3] == bios_rx_record_.data[bios_rx_record_.active][4])) + DIAG_DEFAULT(Pa082) + { + bios_tx_record_.state[i] &= ~BIOS_TX_WAIT_ON_ACK; + break; + } + } + } + } + else if((bios_rx_record_.data[bios_rx_record_.active][MESSAGE_MSG_ID_POS] == 0) && (bios_rx_record_.data[bios_rx_record_.active][MESSAGE_CMDTYP_POS] ==CMDTYP_COMRESET)) + { + // clear RX cannel + BIOS_UsbRxClear(); + returnError = CMDTYP_COMRESET; + goto usbRxIsrExit; + } + else + { + // mark message as ready + // BIOS_MainLoop pass the message to v3opRx for macro execution + DIAG_SUPPRESS(Pa082) + bios_rx_record_.state[bios_rx_record_.active] |= BIOS_RX_RDY; + DIAG_DEFAULT(Pa082) + // switch to the next Rx buffer + + bios_rx_record_.active++; + if(bios_rx_record_.active >= BIOS_RX_QUEUS) + { + bios_rx_record_.active = 0; + } + } + // no size error + bios_rx_record_.count[bios_rx_record_.active] = 0; + bios_rx_record_.crc[1] = 0; + } + usbRxIsrExit: + _NOP(); + } + } + BIOS_ResetCts(); // release TUSB RX + return returnError; +} + +// MSP-FET specifc bios ISR +#ifdef MSP_FET + +// Dummy ISR +#pragma optimize = low +#pragma vector=TIMER2_A1_VECTOR +__interrupt void TIMER2_A1_ISR(void) +{ + switch (__even_in_range(TA2IV, TA2IV_TA2IFG)) + { + case TA2IV_TA2IFG: + _NOP(); + break; + default: + _NOP(); + break; + } +} +#pragma vector=TIMER0_B0_VECTOR +__interrupt void TIMER0_B0_ISR_(void) +{ + _NOP(); +} +#endif + +// Dummy ISR +#pragma optimize = low +#pragma vector=TIMER0_A0_VECTOR +__interrupt void TIMER0_A0_ISR(void) +{ + _NOP(); +} +/**************************************** + * \brief Interrupt function for NMI events +*/ +#pragma vector = UNMI_VECTOR +__interrupt VOID UNMI_ISR(VOID) +{ + _DINT_FET(); + switch (__even_in_range(SYSUNIV, SYSUNIV_BUSIFG)) + { + case SYSUNIV_NONE: + __no_operation(); + break; + case SYSUNIV_NMIIFG: + __no_operation(); + break; + case SYSUNIV_OFIFG: + UCSCTL7 &= ~(DCOFFG + XT1LFOFFG + XT2OFFG); //Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; //Clear OFIFG fault flag + BIOS_LedOn(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + break; + case SYSUNIV_ACCVIFG: + __no_operation(); + break; + case SYSUNIV_BUSIFG: + SYSBERRIV = 0; // clear bus error flag + USB_disable(); // Disable + BIOS_LedOn(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + break; + } +} + +#pragma vector=SYSNMI_VECTOR +__interrupt void SysNmiHandler(void) +{ + switch (__even_in_range(SYSUNIV, SYSUNIV_BUSIFG)) + { + case SYSUNIV_NONE: + __no_operation(); + break; + case SYSUNIV_NMIIFG: + __no_operation(); + break; + case SYSUNIV_OFIFG: + UCSCTL7 &= ~(DCOFFG + XT1LFOFFG + XT2OFFG); //Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; //Clear OFIFG fault flag + BIOS_LedOn(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + break; + case SYSUNIV_ACCVIFG: + __no_operation(); + break; + case SYSUNIV_BUSIFG: //USB is required. + SYSBERRIV = 0; //clear bus error flag + USB_disable(); //Disable + BIOS_LedOn(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + break; + } +} diff --git a/Bios/src/fw/fet/bios.h b/Bios/src/fw/fet/bios.h new file mode 100644 index 0000000..f3d1678 --- /dev/null +++ b/Bios/src/fw/fet/bios.h @@ -0,0 +1,247 @@ +/* + * bios.h + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULBIOS +//! \file bios.h +//! \brief + +#ifndef _V3_BIOS_H_ +#define _V3_BIOS_H_ + +#include "hw_compiler_specific.h" +#include "hil_Structs.h" + +//*********** Defines *********** +#define BIOS_LED_MODE 0 +#define BIOS_LED_POWER 1 + +#define BIOS_RX_SIZE 258 +#define BIOS_RX_QUEUS 4 +#define BIOS_TX_SIZE 258 +#define BIOS_TX_QUEUS 1 +#define BIOS_TX_FLAGS 1 + +#define BIOS_RX_RDY 0x01 +#define BIOS_RX_CRC_ERROR 0x02 +#define BIOS_RX_SIZE_ERROR 0x04 +#define BIOS_TX_TO_SEND 0x01 +#define BIOS_TX_WAIT_ON_ACK 0x02 +#define BIOS_TX_NO_SEND 0x04 +#define BIOS_TX_BUSY 0x08 + +#define BIOS_TX_TIMEOUT 50 + +#define BIOS_TIMER_BREAK 0x01 +#define BIOS_TIMER_COUNT 2 +#define BIOS_TIMER_RX 0 +#define BIOS_TIMER_TX 1 + +#define COM_CHANNEL 2 +#define DEBUG_CHANNEL 0 + +//*********** Structure definitions *********** +//! \struct Contains received messages +typedef struct _BiosRxRecord_ +{ + unsigned char *data[BIOS_RX_QUEUS]; + unsigned short *datas[BIOS_RX_QUEUS]; + unsigned short count[BIOS_RX_QUEUS]; + unsigned short size[BIOS_RX_QUEUS]; + unsigned short last_msg_call; + unsigned short crc[BIOS_RX_QUEUS]; + unsigned char active; + unsigned char last_cmd_typ; + unsigned char last_msg_id; + unsigned char state[BIOS_RX_QUEUS]; +} BiosRxRecord; + + + +//! \struct Contains messages to be transmitted +typedef struct _BiosTxRecord_ +{ + unsigned char active; + unsigned char cannel_to_send; + unsigned short send_counter[BIOS_TX_QUEUS]; + unsigned short ack_timeout[BIOS_TX_QUEUS]; + unsigned char state[BIOS_TX_QUEUS]; + unsigned short count[BIOS_TX_QUEUS]; + unsigned short datas[BIOS_TX_QUEUS][BIOS_TX_SIZE/sizeof(unsigned short)]; + unsigned char *data[BIOS_TX_QUEUS]; + unsigned short *ext_data; + unsigned short ext_size; + unsigned short ext_counter; +} BiosTxRecord; + +// System events +typedef enum SYSTEM_EVENT_MSP +{ + /// System event FET connection is lost + FET_CONNECTION_LOST = 0, + /// System event device connection is lost + DEVICE_CONNECTION_LOST, + /// System event FET restart needed + FET_RESTART_NEEDED, + /// System event device entered LPMx.5 + DEVICE_IN_LPM5_MODE, + /// System event devices wakes up from LPMx.5 + DEVICE_WAKEUP_LPM5_MODE, + /// System event - overcurrent detection on JTAG lines or VCC line + FET_OVERCURRENT, + /// System event - Timout occourt during FPGA DR/IR shift + FET_FPGA_TIMOUT, +} SystemEventMsp; + +struct BIOS_RxError +{ + unsigned short bios_rx_err_code_; + unsigned short *bios_rx_err_payload_; + unsigned short bios_rx_err_id_; + unsigned short bios_rx_err_set_; +}; +typedef struct BIOS_RxError BIOS_RxError_t; + +//! \struct Global timer used for timeouts +struct _BiosGlobalTimer_ +{ + unsigned short count; + unsigned char state; +}; +typedef struct _BiosGlobalTimer_ BiosGlobalTimer; + +//*********** Function protoypes *********** + +//! \brief System start up +void BIOS_InitSystem(void); +void BIOS_SuspendSystem(void); +void BIOS_ResumeSystem(void); + +//! \brief setup receiver buffers +void BIOS_InitCom(void); + +//! \brief switch LED on +//! \details only the LED control struc are manipulated. The +//! hardware are in timerB1Isr driven +//! \param[in] LED no 0 = BIOS_LED_MODE (red)\n +//! 1 = BIOS_LED_POWER (green) +//! \return always 0 +short BIOS_LedOn(unsigned char no); + +//! \brief switch LED off +//! \details only the LED control struc are manipulated. The +//! hardware are in timerB1Isr driven +//! \param[in] no 0 = BIOS_LED_MODE (red)\n +//! 1 = BIOS_LED_POWER (green) +//! \return always 0 +short BIOS_LedOff(unsigned char no); + +//! \brief LED blink continuous +//! \param[in] no 0 = BIOS_LED_MODE (red)\n +//! 1 = BIOS_LED_POWER (green) +//! \param[in] time (*20ms) +//! \return always 0 +short BIOS_LedBlink(unsigned char no,unsigned short time); + +//! \brief LED flashes for a time +//! \param[in] no 0 = BIOS_LED_MODE (red)\n +//! 1 = BIOS_LED_POWER (green) +//! \param[in] time (*20ms) +//! \return always 0 +//! \details if the LED is on, the LED goes off for "time" +//! if the LED is off, the LED goes on for "time" +short BIOS_LedFlash(unsigned char no,unsigned short time); + +//! \brief LEDs blink alternated +//! \param[in] time (*20ms) +//! \return always 0 +//! \details both LED are alternated on. +short BIOS_LedAlternate(unsigned short time); + +//! \brief fatal error +//! \details LED are alternated, function never return +void BIOS_GlobalError(void); + +//! \brief clear RX hard and software buffer +void BIOS_UsbRxClear(void); + +//! \brief trigger a error message +//! \details trigger a error message and clear the RX hard and software buffers +void BIOS_UsbRxError(unsigned short code); + +void BIOS_UsbTxClear(void); +//! \brief clears the TX software buffer +void BIOS_UsbTxError(void); + +//! \brief finsh record to send +void BIOS_PrepareTx(unsigned int size); + +//! \brief Stop RX +//! \details set CTS to TUSB and break RX timeout timer +void BIOS_SetCts(); + +//! \brief release (restart) RX +//! \details reset CTS to TUSB and RX timeout timer running +void BIOS_ResetCts(); + +//! \brief trigger sending of TX buffer +//! \details to send the first char we set UTXIFG, followed char loaded by +//! true TX buffer empty interrupt +void BIOS_StartTx(void); +short BIOS_UsbRxData(void); + +unsigned long Bios_getDcdc_signature(); +unsigned long Bios_getHal_signature(); +unsigned long Bios_getHil_signature(); +unsigned long Bios_getCom_signature(); + +unsigned long Bios_getHal_intvec(); +unsigned short Bios_getHil_intvec(); +unsigned long Bios_getDcdc_intvec(); +unsigned long Bios_getCom_intvec(); + +unsigned short Bios_getCore_version(); +unsigned short Bios_getTool_id(); +unsigned short Bios_getInfo_hw_0(); +unsigned short Bios_getInfo_hw_1(); + +short BIOS_IsUsbRxError(); +BIOS_RxError_t BIOS_getRxError(); +void BIOS_ClearUsbRxError(); + +extern volatile BiosRxRecord bios_rx_record_; +extern volatile BiosTxRecord bios_tx_record_; +extern volatile BiosGlobalTimer bios_global_timer_[BIOS_TIMER_COUNT]; +extern char bios_wb_control_; +#endif diff --git a/Bios/src/fw/fet/communicationDefs.h b/Bios/src/fw/fet/communicationDefs.h new file mode 100644 index 0000000..fafac19 --- /dev/null +++ b/Bios/src/fw/fet/communicationDefs.h @@ -0,0 +1,61 @@ +/* + * communicationDefs.h + * + * Copyright (C) 2014 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 communicationDefs_H_ +#define communicationDefs_H_ + +#define MESSAGE_SIZE_POS 0 +#define MESSAGE_CMDTYP_POS 1 +#define MESSAGE_MSG_ID_POS 2 +#define MESSAGE_INSIZE_POS 3 +#define MESSAGE_PAYLOAD_POS 4 +#define MESSAGE_EXECUTE_CALL_ADDR_POS 4 +#define MESSAGE_EXECUTE_ZERO_ADDR_POS 6 +#define MESSAGE_EXECUTE_PAYLOAD_POS 6 + +#define MESSAGE_NO_RESPONSE 0x8000 +#define EXCEPTION_NOT_IMPLEMENT_ERR 0x8001 +#define EXCEPTION_MSGID_ERR 0x8002 +#define EXCEPTION_CRC_ERR 0x8003 +#define EXCEPTION_RX_TIMEOUT_ERR 0x8004 +#define EXCEPTION_TX_TIMEOUT_ERR 0x8005 +#define EXCEPTION_RX_OVERFLOW_ERR 0x8006 +#define EXCEPTION_TX_NO_BUFFER 0x8007 +#define EXCEPTION_COM_RESET 0x8008 +#define EXCEPTION_RX_NO_BUFFER 0x8009 +#define EXCEPTION_RX_TO_SMALL_BUFFER 0x800A +#define EXCEPTION_RX_LENGTH 0x800B + +#endif /* communicationDefs_H_ */ diff --git a/Bios/src/fw/fet/cstartup_Hal.s43 b/Bios/src/fw/fet/cstartup_Hal.s43 new file mode 100644 index 0000000..0655e97 --- /dev/null +++ b/Bios/src/fw/fet/cstartup_Hal.s43 @@ -0,0 +1,417 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +#ifdef DISABLE_WATCHDOG +#include "msp430.h" +#endif + + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + pushx R4 + pushx R5 + pushx R6 + pushx R7 + pushx R8 + pushx R9 + pushx R10 + pushx R11 + pushx R12 + pushx R13 + pushx R14 + pushx R15 + // -------------------- + // Initialize SP to point to the top of the stack. + // +// no stack pointer, stack pointer is administered from bios +// MOV #SFE(CSTACK), SP + + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + NOP + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + MOV #SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XCALL #__data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + MOVA #SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XCALL #__data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy + +#endif // IGNORE_DATA16_DATA + +#endif // MSP430X + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + +// EXTERN main + EXTERN ResetFirmware +?cstart_call_main: +// XCALL + popx R15 + popx R14 + popx R13 + popx R12 + popx R11 + popx R10 + popx R9 + popx R8 + popx R7 + popx R6 + popx R5 + popx R4 + + movx.a #ResetFirmware,PC +// mov #main,PC + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC32 __program_start + + ENDMOD + + END diff --git a/Bios/src/fw/fet/hal.c b/Bios/src/fw/fet/hal.c new file mode 100644 index 0000000..6518a9a --- /dev/null +++ b/Bios/src/fw/fet/hal.c @@ -0,0 +1,203 @@ +/* + * hal.c + * + * Copyright (C) 2015 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. + */ + +//! \ingroup MODULHAL +//! \file hal.c +//! + +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "string.h" + + +// global variables to handle JTAG chain +unsigned short activeDevice; +REQUIRED(activeDevice) + +unsigned char numOfDevices; +REQUIRED(numOfDevices) + +unsigned short TCE; +REQUIRED(TCE) + +DevicePowerSettings devicePowerSettings; +REQUIRED(devicePowerSettings) + +DeviceSettings deviceSettings; +REQUIRED(deviceSettings) + +// global variables to handle Emulation clock control +unsigned long _hal_mclkCntrl0; +REQUIRED(_hal_mclkCntrl0) + +HalRec hal_functions_[HAL_FUNCTIONS_SIZE]; + +unsigned short setPCclockBeforeCapture = 0; +REQUIRED(setPCclockBeforeCapture) + +unsigned short altRomAddressForCpuRead; +REQUIRED(altRomAddressForCpuRead) + +unsigned short wdtctlAddress5xx = 0x15C; +REQUIRED(wdtctlAddress5xx) + +unsigned short enhancedPsa = 0; +REQUIRED(enhancedPsa) + +char traceBuffer[256]; ///< Trace buffer used to print out JTAG IR and DR shofts to debug port + +// global variables use for JTAG/SWD DAP +unsigned long cswValues[4]; +REQUIRED(cswValues) + +ARMConfigSettings armConfigSettings; +REQUIRED(armConfigSettings) + +#ifndef __data20 +#define __data20 +#endif + +#define MACRO(x) {ID_##x, (void __data20 *)_hal_##x }, +HalRec hal_functions_default_[HAL_FUNCTIONS_DEFAULT_SIZE] = +{ + MACRO(Zero) + MACRO_LIST +}; +#undef MACRO + +REQUIRED(_init_Hal) + + +void _init_Hal(void) +{ + unsigned char i; + + for(i=0; i < (sizeof(hal_functions_)/sizeof(HalRec)); i++) + { + if(i < (sizeof(hal_functions_default_)/sizeof(HalRec))) + { + hal_functions_[i].id = hal_functions_default_[i].id; + hal_functions_[i].function = hal_functions_default_[i].function; + } + else + { + hal_functions_[i].id = 0xFFFF; + hal_functions_[i].function = NULL; + } + } +} + +HAL_FUNCTION(_hal_Zero) +{ + return 0; +} + +HAL_FUNCTION(_hal_Init) +{ + //EDT_Init(); + return 0; +} + +extern unsigned int LPMx5_DEVICE_STATE; +extern int intstate; +extern unsigned long long prevJState; +extern unsigned short lastTraceWritePos; + + +HAL_FUNCTION(_hal_ResetStaticGlobalVars) +{ + LPMx5_DEVICE_STATE = 1; + intstate = 0; + prevJState = 0x0000000000000000; + lastTraceWritePos = 0; + return 0; +} + +HAL_FUNCTION(_hal_SetVcc) +{ + unsigned short vcc; + STREAM_get_word(&vcc); + IHIL_SetVcc(vcc); + return 0; +} + + +HAL_FUNCTION(_hal_SwitchMosfet) +{ +#ifdef MSP_FET + unsigned short on = 0; + STREAM_get_word(&on); + if (on) + { + IHIL_SwitchVccFET(1); + } + else + { + IHIL_SwitchVccFET(0); + } + return 0; +#else + return -1; +#endif +} + + +HAL_FUNCTION(_hal_GetVcc) +{ + double vcc = 0; + double ext_vcc = 0; + + IHIL_GetVcc(&vcc, &ext_vcc); + STREAM_put_word((unsigned short)vcc); + STREAM_put_word((unsigned short)ext_vcc); + return 0; +} + +HAL_FUNCTION(_hal_GetFuses) +{ + config_fuses(); + STREAM_put_byte((unsigned char)SetReg_8Bits(0)); + return 0; +} + +HAL_FUNCTION(_hal_DummyMacro) +{ + return -1; +} +/* EOF */ diff --git a/Bios/src/fw/fet/halMain.c b/Bios/src/fw/fet/halMain.c new file mode 100644 index 0000000..9409ed8 --- /dev/null +++ b/Bios/src/fw/fet/halMain.c @@ -0,0 +1,262 @@ +/* + * halMain.c + * + * Copyright (C) 2012 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. + */ + +//! \ingroup MODULHAL +//! \file halMain.c +//! \brief +//! +//! files\n +//! \li startup.s43 +//! \li halMain.c +//! \li hal.c +//! \li halGlobalVars.c + +#include "hw_compiler_specific.h" +#include "stream.h" +#include "hal.h" +#include "edt.h" +#include "stdlib.h" +#include "string.h" +#include "HalGlobalVars.h" +#include "../fw/fet/FetVersion.h" +#include "arch.h" + +#define HAL_SIGNATURE 0xBEEFBEEFul + +extern void globalVarsInit(void); + +REQUIRED(_edt_Common_Methods) +edt_common_methods_t _edt_Common_Methods; + +REQUIRED(_edt_Distinct_Methods) +edt_distinct_methods_t _edt_Distinct_Methods; + +extern short _hil_Init( void ); +extern unsigned long _hal_mclkCntrl0; + +// prototypes for core/HAL interface +void *ResetFirmware(void *stream_adr, unsigned long device_flags, unsigned char v3opHilCrcOk, unsigned char v3opDcdcCcOk); + +CONST_AT(HAL_INFOS hal_infos_, 0x1904) = +{ + ResetFirmware, // _initTask + (VERSION_MAJOR - 1) << 14 | + (VERSION_MINOR << 8) | + VERSION_PATCH, + VERSION_BUILD +}; +REQUIRED(hal_infos_) + +const unsigned long hal_Signature_ @ "HALSIGNATURE" = HAL_SIGNATURE; +#pragma required = hal_Signature_ + +//! \brief Pointer to HAL IRQ vector table +RO_PLACEMENT_NO_INIT volatile const unsigned short hil_Start_UP_ @ "HILINIT"; +RO_PLACEMENT_NO_INIT volatile const unsigned long hil_signature_ @ "HILSIGNATURE"; +RO_PLACEMENT_NO_INIT volatile const unsigned short hil_version_ @ "HILVERSION"; +RO_PLACEMENT_NO_INIT volatile const unsigned short hil_versionCmp_ @ "HILVERSIONCMP"; + + +short _dummy_Init( void ){return 0;}; +short _dummy_SetVcc(unsigned short Vcc){return 0;}; +void _dummy_SwitchVccFET(unsigned short state) {return;}; +short _dummy_GetVcc(double* Vcc, double* ExtVcc){return 0;}; + +short _dummy_SetProtocol(unsigned short protocol_id){return 0;}; +void _dummy_SetPsaSetup(unsigned short enhanced){return;}; +void _dummy_SetPsaTCLK(unsigned short tclkValue){return;}; + +short _dummy_Open( unsigned char state ){return 0;}; +short _dummy_Close( void ){return 0;}; +short _dummy_IccMonitor_Process(unsigned short flags){return 0;}; // flags: to be compatible with HIL calls +void _dummy_EntrySequences(unsigned char states){return;}; + +void _dummy_SetReset(unsigned char value){return;}; +void _dummy_SetTest(unsigned char value){return;}; +void _dummy_SetTMS(unsigned char value){return;}; +void _dummy_SetTDI(unsigned char value){return;}; +void _dummy_SetTCK(unsigned char value){return;}; + +void _dummy_SetJtagSpeed(unsigned short jtagSpeed, unsigned short sbwSpeed){return;}; +void _dummy_ConfigureSetPc (unsigned short PCclockBeforeCapture){return;}; + +void _dummy_initDelayTimer(void) {return;}; +short _dummy_regulateVcc(void) {return 0;}; +unsigned short _dummy_getFpgaVersion(void) {return 0;}; + +void _dummy(unsigned short dummy){return;}; + +short _dummy_TapReset_Dma(void){return 0;} +short _dummy_CheckJtagFuse_Dma(void){return 0;} +unsigned char _dummy_Instr_Dma(unsigned char Instruction){return 0;} +unsigned char _dummy_SetReg_XBits08_Dma(unsigned char Data){return 0;} +unsigned short _dummy_SetReg_XBits16_Dma(unsigned short Data){return 0;} +unsigned long _dummy_SetReg_XBits20_Dma(unsigned long Data){return 0;} +unsigned long _dummy_SetReg_XBits32_Dma(unsigned long Data){return 0;} +unsigned long long _dummy_SetReg_XBits64_Dma(unsigned long long Data){return 0;} +unsigned long long _dummy_SetReg_XBits8_64_Dma(unsigned long long Data, unsigned short loopCount, unsigned short Pg){return 0;} +void _dummy_Tclk_Dma(unsigned char state){return;} +void _dummy_StepPsa_Dma(unsigned long length){return;} +void _dummy_StepPsaTclkHigh_Dma(unsigned long length){return;} +short _dummy_BlowFuse_Dma(unsigned char targetHasTestVpp){return 0;} +void _dummy_ConfigureSpeed_Dma(unsigned short speed){return;} +void _dummy_initTimerB0(void){return;} +void _dummy_BSL_EntrySequence(unsigned short switchBypassOff){return;} +unsigned char _dummy_GetPrevInstruction (void){return 0;} +void _dummy_ReadADC12(void){return;} +void _dummy_ConfigFpgaIoMode(unsigned short mode){return;} + +unsigned long long _dummy_SetReg_XBits(unsigned long long *data, unsigned short count){return 0;} +unsigned char _dummy_Instr_4(unsigned char Data){return 0;} + +short _dummy_write_read_Dp(unsigned char address, unsigned long *data, unsigned short rnw) {return -1;} +short _dummy_write_read_Ap(unsigned long address, unsigned long *data, unsigned short rnw) {return -1;} +short _dummy_write_read_mem_Ap(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw) {return -1;} + +void _dummy_setFpgaTimeOut(unsigned short state) {return;}; + +struct stream_funcs *_stream_Funcs; + +HAL_INFOS hal_infos_in_ram_; + +// called via cstartup form BIOS_HalInterfaceInit +REQUIRED(ResetFirmware) +void *ResetFirmware(void *stream_adr, unsigned long device_flags, unsigned char v3opHilCrcOk, unsigned char v3opDcdcCcOk) +{ + globalVarsInit(); + memcpy((HAL_INFOS*)&hal_infos_in_ram_,&hal_infos_, sizeof(hal_infos_)); + // save address of stream funcs, located in core + _stream_Funcs=(struct stream_funcs *)stream_adr; + _init_Hal(); + hal_infos_in_ram_.swCmp_0 = (VERSION_MAJOR_CMP - 1) << 14 | (VERSION_MINOR_CMP << 8) | VERSION_PATCH_CMP; + hal_infos_in_ram_.swCmp_1 = VERSION_BUILD_CMP; + + { + // check if we have a valid hil layer programmed into our tool + if(hil_signature_ == 0xF00DF00D && hil_Start_UP_ != 0xFFFF && v3opHilCrcOk) + { + // INIT HIL layer + HilInitGetEdtCommenFunc hilEdtCom = NULL; + // set pointer to edt commen functions + hilEdtCom = (HilInitGetEdtCommenFunc)0x18A0; + hilEdtCom(&_edt_Common_Methods); + hal_infos_in_ram_.hil_version = hil_version_; + hal_infos_in_ram_.hil_versionCmp = hil_versionCmp_; +#ifdef eZ_FET + if(v3opDcdcCcOk) + { + _edt_Common_Methods.SwitchVccFET(LDO_ON); + } +#endif + + +#ifdef MSP_FET + // Force to not update for Beta1 + hal_infos_in_ram_.fpga_version = _edt_Common_Methods.getFpgaVersion(); + // power up VCC as FET power supply + if(v3opDcdcCcOk) + { + _edt_Common_Methods.SetVcc(3300); + _edt_Common_Methods.SwitchVccFET(1); + } +#else + hal_infos_in_ram_.fpga_version = 0; +#endif + } + else + { + // if hil layer is not valid or no startup address was found + hal_infos_in_ram_.hil_version = 0; + hal_infos_in_ram_.fpga_version = 0; + + _edt_Common_Methods.Init = _dummy_Init; + _edt_Common_Methods.SetVcc = _dummy_SetVcc; + _edt_Common_Methods.GetVcc = _dummy_GetVcc; + _edt_Common_Methods.SetProtocol = _dummy_SetProtocol; + _edt_Common_Methods.SetPsaTCLK = _dummy_SetPsaTCLK; + _edt_Common_Methods.Open = _dummy_Open; + _edt_Common_Methods.Close = _dummy_Close; + _edt_Common_Methods.Delay_1us = _dummy; + _edt_Common_Methods.Delay_1ms = _dummy; + _edt_Common_Methods.Loop = _dummy_IccMonitor_Process; + _edt_Common_Methods.EntrySequences = _dummy_EntrySequences; + _edt_Common_Methods.SetReset = _dummy_SetReset; + _edt_Common_Methods.SetTest = _dummy_SetTest; + _edt_Common_Methods.SetTMS = _dummy_SetTMS; + _edt_Common_Methods.SetTDI = _dummy_SetTDI; + _edt_Common_Methods.SetTCK = _dummy_SetTCK; + _edt_Common_Methods.SetJtagSpeed = _dummy_SetJtagSpeed; + _edt_Common_Methods.ConfigureSetPc = _dummy_ConfigureSetPc; + _edt_Common_Methods.initDelayTimer = _dummy_initDelayTimer; + _edt_Common_Methods.regulateVcc = _dummy_regulateVcc; + _edt_Common_Methods.getFpgaVersion = _dummy_getFpgaVersion; + _edt_Common_Methods.BSL_EntrySequence = _dummy_BSL_EntrySequence; + _edt_Common_Methods.SwitchVccFET = _dummy_SwitchVccFET; + _edt_Common_Methods.setFpgaTimeOut = _dummy_setFpgaTimeOut; + _edt_Common_Methods.regulateVcc = _dummy_regulateVcc; + _edt_Common_Methods.ReadADC12 = _dummy_ReadADC12; + _edt_Common_Methods.ConfigFpgaIoMode = _dummy_ConfigFpgaIoMode; + + _edt_Distinct_Methods.TapReset = _dummy_TapReset_Dma; + _edt_Distinct_Methods.CheckJtagFuse = _dummy_CheckJtagFuse_Dma; + _edt_Distinct_Methods.Instr = _dummy_Instr_Dma; + _edt_Distinct_Methods.SetReg_XBits08 = _dummy_SetReg_XBits08_Dma; + _edt_Distinct_Methods.SetReg_XBits16 = _dummy_SetReg_XBits16_Dma; + _edt_Distinct_Methods.SetReg_XBits20 = _dummy_SetReg_XBits20_Dma; + _edt_Distinct_Methods.SetReg_XBits32 = _dummy_SetReg_XBits32_Dma; + _edt_Distinct_Methods.SetReg_XBits64 = _dummy_SetReg_XBits64_Dma; + _edt_Distinct_Methods.SetReg_XBits8_64 = _dummy_SetReg_XBits8_64_Dma; + _edt_Distinct_Methods.Tclk = _dummy_Tclk_Dma; + _edt_Distinct_Methods.StepPsa = _dummy_StepPsaTclkHigh_Dma; + _edt_Distinct_Methods.BlowFuse = _dummy_BlowFuse_Dma; + _edt_Distinct_Methods.GetPrevInstruction = _dummy_GetPrevInstruction; + _edt_Distinct_Methods.SetReg_XBits = _dummy_SetReg_XBits; + _edt_Distinct_Methods.Instr04 = _dummy_Instr_4; + _edt_Distinct_Methods.write_read_Dp = _dummy_write_read_Dp; + _edt_Distinct_Methods.write_read_Ap = _dummy_write_read_Ap; + _edt_Distinct_Methods.write_read_mem_Ap = _dummy_write_read_mem_Ap; + } + } + + _hal_mclkCntrl0=0x040f; + hal_infos_in_ram_.hal_size = sizeof(hal_functions_)/sizeof(HalRec); + hal_infos_in_ram_.hal_list_ptr = hal_functions_; + return((void*)&hal_infos_in_ram_); // return software infos +} + +unsigned short hal_GetHilVersion() +{ + return 0; +} diff --git a/Bios/src/fw/fet/main.c b/Bios/src/fw/fet/main.c new file mode 100644 index 0000000..e87a9a3 --- /dev/null +++ b/Bios/src/fw/fet/main.c @@ -0,0 +1,159 @@ +/* + * main.c + * + * Copyright (C) 2014 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. + */ + +#include "USB_API/USB_Common/types.h" //Basic Type declarations +#include "USB_API/USB_Common/usb.h" //USB-specific functions +#include "Bios.h" +#include "init.h" +#include "usbMain.h" +#include "v3_0p_hw_FET.h" +#include "v3_0p.h" +#include "Fet_IccMonitor.h" +/****************************************/ + +void dummy_Scheduler(void){}; +void dummy_UsbLoop(void){}; + +short debuggerOff = 0; + +struct LOOP_INFOS +{ + void (*Scheduler)(void); + void (*UsbLoop)(void); +}; +typedef struct LOOP_INFOS LOOP_INFOS_t; + +LOOP_INFOS_t loopInfos_ = +{ + V3OP_Scheduler, + dummy_UsbLoop, +}; + +void main(void) +{ + WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer + + if(!V3OP_SystemOk()) + { + WDTCTL = 0; + } + + init_BiosPorts(); + init_Clock(); + + BIOS_LedOff(BIOS_LED_MODE); + BIOS_LedOn(BIOS_LED_POWER); + + // Initialize USB and enable various events + USB_init(); + WORD USBEVIE = kUSB_VbusOnEvent+kUSB_VbusOffEvent+kUSB_dataReceivedEvent+kUSB_UsbSuspendEvent+kUSB_UsbResumeEvent+kUSB_UsbResetEvent; + USB_setEnabledEvents(USBEVIE); + // See if we're already attached physically to USB, and if so, connect to it + // Normally applications don't invoke the event handlers, but this is an exception. + if (USB_connectionInfo() & kUSB_vbusPresent) + { + if (USB_enable() == kUSB_succeed) + { + USB_reset(); + USB_connect(); + } + else + { + BIOS_LedOff(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + while(1); + } + } + else + { + BIOS_LedOff(BIOS_LED_POWER); + BIOS_LedOn(BIOS_LED_MODE); + while(1); + } + + // init Bios + BIOS_InitSystem(); + BIOS_InitCom(); + + V3OP_ComInterfaceClear(); + V3OP_DcdcInterfaceClear(); + + // int Sw Layers + V3OP_DcdcInterfaceInit(); + V3OP_HalInterfaceInit(); + V3OP_ComInterfaceInit(); + + IccMonitor_StartVoltageSupervision(); + _EINT_FET(); + + IccMonitor_TriggerAdc(); + + while(1) + { + loopInfos_.UsbLoop(); + loopInfos_.Scheduler(); + } +} + +void switchDebugerOff() +{ + TA1CTL &= ~TAIE; + TB0CTL &= ~TBIE; + TA0CTL &= ~TAIE; + + loopInfos_.Scheduler = dummy_Scheduler; + loopInfos_.UsbLoop = USB_MainLoop; + debuggerOff = 1; +} + + +void switchDebugerOn() +{ + loopInfos_.Scheduler = V3OP_Scheduler; + loopInfos_.UsbLoop = dummy_UsbLoop; + TA1CTL |= TAIE; + TB0CTL |= TBIE; + TA0CTL |= TAIE; + debuggerOff = 0; +} + +void switchOnUart() +{ + if(!debuggerOff) + { + loopInfos_.Scheduler = V3OP_Scheduler; + loopInfos_.UsbLoop = USB_MainLoop; + } +} diff --git a/Bios/src/fw/fet/stream.c b/Bios/src/fw/fet/stream.c new file mode 100644 index 0000000..2cf0a7e --- /dev/null +++ b/Bios/src/fw/fet/stream.c @@ -0,0 +1,701 @@ +/* + * stream.c + * + * Copyright (C) 2013 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. + */ +//! \ingroup MODULBIOS +//! \file stream.c +//! \brief managment of input and output data between USB and HAL, and HAL and HAL +//! \details Get/put a data stream (message packet) form/to the bios rx/tx layer. Monitor both streams +//! and send response packets and request next message packets. Also is stream.c the interface to HAL. On +//! HAL init the call addresses are handover to the HAL. +//! \author Detlef Fink (09/21/2010) + + +#include "bios.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations +#include "usbConstructs.h" +#include "hw_compiler_specific.h" // included from bios.h?, not needed for LPT +#include "stream.h" +#include "string.h" + +struct _StreamInput_ +{ + unsigned char *data_start; + unsigned char *data_end; + unsigned char *data_ptr; +}; +typedef struct _StreamInput_ StreamInput; +StreamInput stream_input_; + +// prototyes +unsigned char _stream_out_change_type(unsigned char res_type); +unsigned char _stream_out_change_msg_id(unsigned char msg_id); +short _stream_out_init(unsigned char msg_id, unsigned char res_type); +short _stream_flush(void); +short _stream_put_bytes(void* data, unsigned short size); +short _stream_put_byte(unsigned char data); +short _stream_put_word(unsigned short data); +short _stream_put_long(unsigned long data); +short _stream_in_init(void *ptr, unsigned char no); +short _stream_internal_stream(unsigned char *data_in, unsigned short size_in, unsigned char *data_out, unsigned short size_out, StreamSafe *tmp_record); +short _stream_external_stream(StreamSafe *tmp_record); +short _stream_get_byte(unsigned char *data ); +short _stream_get_word(unsigned short *data); +short _stream_get_long(unsigned long *data); +short _stream_get_buffer(void **buffer, unsigned short *size); +short _stream_discard_bytes(unsigned short count); +short _stream_memcpy(unsigned char* destination, unsigned char* source, unsigned short count); +short _stream_getFlags(void); +short _stream_putFlags(short flags, short mask); + +short _stream_getSharedVariable(unsigned short IdMemoryType, unsigned short** Address); +short _stream_deleteSharedVariable(unsigned short IdMemoryType); + +short _stream_send_debug(char *buffer, unsigned short size); + +// stream functions +struct stream_funcs _stream_Funcs = +{ + _stream_out_init, + _stream_flush, + _stream_put_byte, + _stream_put_bytes, + _stream_put_word, + _stream_put_long, + _stream_in_init, + _stream_internal_stream, + _stream_external_stream, + _stream_out_change_type, + _stream_get_byte, + _stream_get_word, + _stream_get_long, + _stream_get_buffer, + _stream_discard_bytes, + _stream_memcpy, + // used form downgrader + BIOS_LedOn, + BIOS_LedOff, + BIOS_LedBlink, + BIOS_LedFlash, + BIOS_LedAlternate, + _stream_send_debug, + _stream_getSharedVariable, + _stream_deleteSharedVariable +}; + +#define SHARED_VARIABLES_SIZE 128 // words -> 256 bytes + +__no_init unsigned short sharedVariables_[128] @ "SHARED_VARIABLES"; +#pragma required = sharedVariables_ + +void STREAM_resetSharedVariables() +{ + short i = 0; + for(i = 0; i < SHARED_VARIABLES_SIZE; i++) + { + sharedVariables_[i] = 0x00; + } +} + +#pragma optimize = low +short _stream_deleteSharedVariable(unsigned short IdMemoryType) +{ + short i = 0; + for(i = 0; i < SHARED_VARIABLES_SIZE ; i = i+2 ) + { + // check if Shared Memory Type is already requested + if(sharedVariables_[i] == IdMemoryType) + { + // if yes set to init value 0x00 + sharedVariables_[i] = 0x00; + sharedVariables_[i+1] = 0x00; + return 1; + } + } + return 0; +} + +#pragma optimize = low +short _stream_getSharedVariable(unsigned short IdMemoryType, unsigned short** Address) +{ + short i = 0; + for(i = 0; i < SHARED_VARIABLES_SIZE ; i = i+2 ) + { + // check if Shared Memory Type is already requested + if(sharedVariables_[i] == IdMemoryType) + { + // if yes just return the address of the requested variable + *Address = &sharedVariables_[i+1]; + return 1; + } + } + + // if Shared Memory Type was not requested -> request it + for(i = 0; i < SHARED_VARIABLES_SIZE ; i = i+2 ) + { + // check for free space to place requested variable + if(sharedVariables_[i] == 0x00) + { + // set Shared Memory Type of variable + sharedVariables_[i] = IdMemoryType; + // return the address of the requested variable + *Address = &sharedVariables_[i+1]; + sharedVariables_[i+1] = 0x0000; + return 1; + } + } + *Address = 0; + return 0; +} + +//! \brief Change the type of the active response +//! \param[in] res_type new type of response +//! \return type before change +unsigned char _stream_out_change_type(unsigned char res_type) +{ + unsigned char ret_value; + + ret_value = bios_tx_record_.data[bios_tx_record_.active][1]; + bios_tx_record_.data[bios_tx_record_.active][1] = res_type; + return(ret_value); +} + +//! \brief Change the message id of the active response +//! \param[in] msg_id new message id of response +//! \return message id before change +unsigned char _stream_out_change_msg_id(unsigned char msg_id) +{ + unsigned char ret_value; + + ret_value = bios_tx_record_.data[bios_tx_record_.active][2]; + bios_tx_record_.data[bios_tx_record_.active][2] = msg_id; + return(ret_value); +} + +//! \brief Setup a transmit buffer (response) +//! \details Setup a response with given id and response typ. The function blocks until a output buffer is free. +//! \param[in] msg_id id of response +//! \param[in] res_typ response type of response +//! \return always 0 +short _stream_out_init(unsigned char msg_id, unsigned char res_type) +{ + while((bios_tx_record_.state[bios_tx_record_.active] & (BIOS_TX_BUSY | BIOS_TX_TO_SEND | BIOS_TX_WAIT_ON_ACK)) && (bios_global_timer_[BIOS_TIMER_TX].count > 1)); + + if ((bios_tx_record_.state[bios_tx_record_.active] & (BIOS_TX_BUSY | BIOS_TX_TO_SEND | BIOS_TX_WAIT_ON_ACK)) && res_type != RESPTYP_STATUS) + { + BIOS_UsbTxError(); + return(EXCEPTION_TX_NO_BUFFER); + } // status message could not be send. Do not clear TX buffer - perhaps other message send acitve + else if((bios_tx_record_.state[bios_tx_record_.active] & (BIOS_TX_BUSY | BIOS_TX_TO_SEND | BIOS_TX_WAIT_ON_ACK)) && res_type == RESPTYP_STATUS) + { + return(EXCEPTION_TX_NO_BUFFER); + } + bios_tx_record_.data[bios_tx_record_.active][1] = res_type; + bios_tx_record_.data[bios_tx_record_.active][2] = msg_id; + bios_tx_record_.data[bios_tx_record_.active][3] = 0x00; + bios_tx_record_.count[bios_tx_record_.active] = 3; // header + crc sended ever + return(0); +} + +//! \brief Finish writing to transmit buffer +//! \details Calculate the CRC, sets the output state machine and start transmiting. Inserts between payload and crc a byte if the payload is odd. +//! \return status (error/ok) of function +short _stream_flush(void) +{ + static unsigned char resp_id = 0; + unsigned short i; + unsigned short crc; + + if(!(bios_tx_record_.state[bios_tx_record_.active] & BIOS_TX_TO_SEND)) + { + DIAG_SUPPRESS(Pa082) + if(bios_tx_record_.data[bios_tx_record_.active][MESSAGE_CMDTYP_POS] != RESPTYP_DATA) + { + bios_tx_record_.data[bios_tx_record_.active][MESSAGE_MSG_ID_POS] &= ~0x80; + } + else if((bios_tx_record_.data[bios_tx_record_.active][MESSAGE_MSG_ID_POS] & 0x80) || resp_id) + { + if(resp_id < 255) + { + resp_id++; + } + else + { + resp_id = 1; + } + bios_tx_record_.data[bios_tx_record_.active][3] = resp_id; + } + bios_tx_record_.data[bios_tx_record_.active][0] = bios_tx_record_.count[bios_tx_record_.active]; + if(!(bios_tx_record_.data[bios_tx_record_.active][0] & 0x01)) // payload must be a multiply of word size for CRC + { + bios_tx_record_.data[bios_tx_record_.active][++bios_tx_record_.count[bios_tx_record_.active]] = 0x00; + } + crc = 0x0000; + for(i = 0; i < (bios_tx_record_.count[bios_tx_record_.active]+1) / 2; i++) + { + crc ^= bios_tx_record_.datas[bios_tx_record_.active][i]; + } + crc ^= 0xFFFF; + bios_tx_record_.datas[bios_tx_record_.active][bios_tx_record_.count[bios_tx_record_.active] / 2 + 1] = crc; + bios_tx_record_.state[bios_tx_record_.active] |= BIOS_TX_TO_SEND; + bios_tx_record_.state[bios_tx_record_.active] &= ~BIOS_TX_BUSY; + if(!(bios_tx_record_.data[bios_tx_record_.active][MESSAGE_MSG_ID_POS] & 0x80)) + { + resp_id = 0; + } + if(!(bios_tx_record_.data[bios_tx_record_.active][MESSAGE_MSG_ID_POS] & 0x40)) + { + if(bios_tx_record_.data[bios_tx_record_.active][MESSAGE_CMDTYP_POS] == RESPTYP_DATA) + { + bios_tx_record_.state[bios_tx_record_.active] |= BIOS_TX_WAIT_ON_ACK; + } + } + else + { + bios_tx_record_.state[bios_tx_record_.active] &= ~BIOS_TX_WAIT_ON_ACK; + } + + DIAG_DEFAULT(Pa082) + BIOS_PrepareTx(bios_tx_record_.count[bios_tx_record_.active] + 3); + bios_tx_record_.active++; + if(bios_tx_record_.active >= BIOS_TX_QUEUS) + { + bios_tx_record_.active = 0; + } + BIOS_StartTx(); + } + return(0); +} + +//! \brief Write one or more bytes to the output(transmit) buffer +//! \details Write data to the output buffer. If the output buffer is full, the buffer is flush and a new buffer are allocated. +//! \param[in] *data pointer to data to write to the buffer +//! \param[in] size count of data to write to buffer +//! \return status (error/ok) of function +short _stream_put_bytes(void *data, unsigned short size) +{ + unsigned short size_counter; + unsigned char tmp_id; + unsigned char tmp_type; + int ret_value = 0; + unsigned char *pData = data; + unsigned short current_count; + + if(bios_tx_record_.ext_data == NULL) + { + size_counter = size; + do + { + current_count = bios_tx_record_.count[bios_tx_record_.active]; + if((current_count + size_counter) >= (BIOS_TX_SIZE-3)) + { + tmp_type = bios_tx_record_.data[bios_tx_record_.active][1]; + tmp_id = bios_tx_record_.data[bios_tx_record_.active][2]; + + bios_tx_record_.data[bios_tx_record_.active][2] |= 0x80; // mark one or more packet follow + memcpy(&bios_tx_record_.data[bios_tx_record_.active][current_count+1],pData,(BIOS_TX_SIZE-3) - current_count); + bios_tx_record_.count[bios_tx_record_.active] = (BIOS_TX_SIZE-3); + + BIOS_LedFlash(BIOS_LED_MODE,20); + _stream_flush(); + ret_value = _stream_out_init(tmp_id,tmp_type); + size_counter -= ((BIOS_TX_SIZE-3) - current_count); + pData += ((BIOS_TX_SIZE-3) - current_count); // Advance the data pointer; + } + else + { + memcpy(&bios_tx_record_.data[bios_tx_record_.active][current_count+1],pData,size_counter); + bios_tx_record_.count[bios_tx_record_.active] = current_count + size_counter; + size_counter = 0; + } + + } while(size_counter); + } + else if(bios_tx_record_.ext_data != (unsigned short*)0xFFFF) + { + DIAG_SUPPRESS(Pa082) + for(size_counter = 0; + (size_counter < size) && (bios_tx_record_.ext_counter < bios_tx_record_.ext_size); + size_counter++, bios_tx_record_.ext_counter++) + { + *((unsigned char*)bios_tx_record_.ext_data+bios_tx_record_.ext_counter) = *((unsigned char*)data+size_counter); + } + DIAG_DEFAULT(Pa082) + } + return(ret_value); +} + +//! \brief Write one byte to the output(transmit) buffer, by using _stream_put_bytes +//! \param[in] data byto to write into the buffer +//! \return status (error/ok) of function +short _stream_put_byte(unsigned char data) +{ + return(_stream_put_bytes(&data,sizeof(unsigned char))); +} + +//! \brief Write a short value (16 bit value ) to the output(transmit) buffer, by using _stream_put_bytes +//! \param[in] data short value to write into the buffer +//! \return status (error/ok) of function +short _stream_put_word(unsigned short data) +{ + return(_stream_put_bytes(&data,sizeof(unsigned short))); +} + +//! \brief Write a long value (32 bit value ) to the output(transmit) buffer, by using _stream_put_bytes +//! \param[in] data long value to write into the buffer +//! \return status (error/ok) of function +short _stream_put_long(unsigned long data) +{ + return(_stream_put_bytes(&data,sizeof(unsigned long))); +} + +//! \brief Setup rx buffer for using by HAL +//! \param[in] *ptr pointer to BiosRxRecord structure +//! \param[in] no number(index) of rx buffer to process +//! \return status (error/ok) of function +short _stream_in_init(void *ptr, unsigned char no) +{ + BiosRxRecord *ptr_tmp; + ptr_tmp = (BiosRxRecord*)ptr; + + stream_input_.data_start =(*ptr_tmp).data[no]; + stream_input_.data_end = stream_input_.data_start + stream_input_.data_start[MESSAGE_SIZE_POS]; + stream_input_.data_ptr = &stream_input_.data_start[MESSAGE_PAYLOAD_POS]; + return(0); +} + +//! \brief Set up a internal stream +//! \details and safe the active stream paramters/status to a external buffer. +//! \param[in] *data_in, pointer to new stream data, they haven't a header and CRC (matchable to payload of stream from USB) +//! \param[in] size_in, size of data +//! \param[out] *data_out, pointer to a output buffer +//! \n NULL = not output data, if output data generate they are droped +//! \n 1 = output data are routed to originale output +//! \param[out] size_out, size of output buffer +//! \n must be 0, if data_out NULL or 1 +//! \param[out] *tmp_record, pointer to a buffer to store current stream settings +//! \return always 0 +short _stream_internal_stream(unsigned char *data_in, unsigned short size_in, unsigned char *data_out, unsigned short size_out, StreamSafe *tmp_record) +{ + // safe Rx + memcpy((StreamSafe*)tmp_record, (StreamInput*)&stream_input_, sizeof(stream_input_)); + // safe Tx + (*tmp_record).ext_data = bios_tx_record_.ext_data; + (*tmp_record).ext_size = bios_tx_record_.ext_size; + (*tmp_record).ext_counter = bios_tx_record_.ext_counter; + stream_input_.data_start = data_in; + stream_input_.data_end = stream_input_.data_start + size_in; + stream_input_.data_ptr = data_in; + // set temporary output for stream + if(data_out != (unsigned char*)0x0001) + { + if(data_out == NULL) + { + bios_tx_record_.ext_data = (unsigned short*)0xFFFF; + } + else + { + bios_tx_record_.ext_data = (unsigned short*)data_out; + } + bios_tx_record_.ext_size = size_out; + bios_tx_record_.ext_counter = 0; + } + return(0); +} + +//! \brief retore stream to previous stream +//! \param[in] *tmp_record, pointer to a buffer with stored stream settings +//! \return always 0 +short _stream_external_stream(StreamSafe *tmp_record) +{ + // restore Rx + memcpy((StreamInput*)&stream_input_, (StreamSafe*)tmp_record, sizeof(stream_input_)); + // restore Tx + bios_tx_record_.ext_data = (*tmp_record).ext_data; + bios_tx_record_.ext_size = (*tmp_record).ext_size; + bios_tx_record_.ext_counter = (*tmp_record).ext_counter; + return(0); +} + +//! \brief Get a byte from active input buffer +//! \details Get a byte from active buffer. If buffer is empty, the next message is requested if it is a multipacket message. +//! \param[out] *data pointer to a byte to return value +//! \return 0 = more data avaible, 1 = last data, -1 = failed +short _stream_get_byte(unsigned char *data) +{ + short ret_value = 0; + + if(stream_input_.data_ptr > stream_input_.data_end) + { + ret_value = -1; + } + else + { + *data = *stream_input_.data_ptr++; + if(stream_input_.data_ptr > stream_input_.data_end) + { + ret_value = 1; + } + } + return(ret_value); +} + +//! \brief Get a short from active input buffer (stream) +//! \details Get a short (16 bit value) from active buffer. If buffer is empty, the next message is requested +//! \param[out] *data pointer to short to return value +//! \return status, 0 = ok, 1 = last data, -1 = faild +short _stream_get_word(unsigned short *data) +{ + short ret_value = 0; + + unsigned short Word; + unsigned char tmp_char; + + if((PTR_FOR_CMP)stream_input_.data_ptr & 1) + { + ret_value = _stream_get_byte(&tmp_char); + Word = tmp_char; + if(!ret_value) + { + ret_value = _stream_get_byte(&tmp_char); + Word += tmp_char << 8; + } + else + { + ret_value = -1; + } + *data = Word; + } + else + { + if(stream_input_.data_ptr > stream_input_.data_end) + { + ret_value = -2; + } + else + { + *data = *(unsigned short*)stream_input_.data_ptr; + stream_input_.data_ptr +=2; + if(stream_input_.data_ptr > stream_input_.data_end) + { + ret_value = 1; + } + } + } + return(ret_value); +} + + + +//! \brief Get a long from active input buffer (stream) +//! \details Get a long (32 bit value) from active buffer. If buffer is empty, the next message is requested +//! \param[out] *data pointer to a long to return value +//! \return status, 0 = ok, 1 = last data, -1 = faild +short _stream_get_long(unsigned long *data) +{ + short ret_value = 0; + + unsigned char *tmp_char; + + if((PTR_FOR_CMP)stream_input_.data_ptr & 1) + { + tmp_char = (unsigned char*)data; + *data = 0; + if(_stream_get_byte(tmp_char) != 0) + { + ret_value = -1; + goto stream_get_long_exit; + } + if(_stream_get_byte(tmp_char+1) != 0) + { + ret_value = -2; + goto stream_get_long_exit; + } + if(_stream_get_byte(tmp_char+2) != 0) + { + ret_value = -3; + goto stream_get_long_exit; + } + ret_value = _stream_get_byte(tmp_char+3); + } + else + { + if(stream_input_.data_ptr > stream_input_.data_end) + { + ret_value = -5; + } + else + { + *data = *(unsigned long*)stream_input_.data_ptr; + stream_input_.data_ptr +=4; + if(stream_input_.data_ptr > stream_input_.data_end) + { + ret_value = 1; + } + } + } +stream_get_long_exit: + return(ret_value); +} + +//! \brief Get a pointer to the data buffer +short _stream_get_buffer(void **buffer, unsigned short *size) +{ + *buffer = stream_input_.data_ptr; + *size = stream_input_.data_end - stream_input_.data_ptr + 1; + + stream_input_.data_ptr = stream_input_.data_end + 4; + + return 1; +} + +//! \brief Skip byte(s) to read form rx buffer +//! \details If more bytes discarded as in the buffer, the next message is requested. +//! \param[in] count count of bytes to skip +//! \return status, 0 = ok, 1 = last data, -1 = faild +short _stream_discard_bytes(unsigned short count) +{ + short ret_value = -1; + unsigned char dummy; + + for(;count; count--) + { + ret_value = _stream_get_byte(&dummy); + if(ret_value == -1) + { + break; + } + } + return(ret_value); +} + +//! \brief Copy count byte form source to destination +//! \param[out] destination copy to ... +//! \param[in] source copy from ... +//! \param[in] count count of byte to copy +//! \return status +short _stream_memcpy(unsigned char* destination, unsigned char* source, unsigned short count) +{ + while(count) + { + *destination++ = *source++; + --count; + } + return(0); +} + +short _stream_send_debug(char *buffer, unsigned short size) +{ + return cdcSendDataInBackground((BYTE *)buffer, size, 1, 3); +} + +static unsigned short * ITick = 0; +static unsigned short * TimerTick = 0; +static unsigned short * TimeTick = 0; + +#pragma vector=TIMER0_A1_VECTOR +__interrupt void TIMER0_A1_ISR(void) +{ + switch (__even_in_range(TA0IV, TA0IV_TA0IFG)) + { + case TA0IV_TA0IFG: + if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_TIME_TICK, &TimeTick)) + { + if(*(unsigned short*)TimeTick == 0) + { + ++(*(unsigned short*)TimeTick); + } + ++(*(unsigned short*)TimeTick); + } + break; + default: + break; + } +} + +// MSP-FET specific interrupts ------------------------------------------------- +#ifdef MSP_FET + +#pragma vector=TIMER2_A0_VECTOR +__interrupt void TIMER2_A0_ISR(void) +{ + if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_TIMER_TICK, &TimerTick)) + { + (*(unsigned short*)TimerTick)++; + } +} +#pragma vector=TIMER0_B1_VECTOR +__interrupt void TIMER0_B1_ISR_(void) +{ + switch (__even_in_range(TB0IV, TB0IV_TB0IFG)) + { + case TB0IV_TB0IFG: + if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_I_TICK, &ITick)) + { + ++(*(unsigned short*)ITick); + } + break; + default: + break; + } +} +#endif + +// eZ-FET specific interrupts ------------------------------------------------- +#ifdef eZ_FET + +#pragma vector=TIMER0_B0_VECTOR +__interrupt void TIMER0_B0_ISR_(void) +{ + if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_TIMER_TICK, &TimerTick)) + { + (*(unsigned short*)TimerTick)++; + } +} + +#pragma vector=TIMER2_A1_VECTOR +__interrupt void TIMER2_A1_ISR(void) +{ + switch (__even_in_range(TA2IV, TA2IV_TA2IFG)) + { + case TA2IV_TA2IFG: + if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_I_TICK, &ITick)) + { + ++(*(unsigned short*)ITick); + } + break; + default: + break; + } +} +#endif diff --git a/Bios/src/fw/fet/stream.h b/Bios/src/fw/fet/stream.h new file mode 100644 index 0000000..bc2eca8 --- /dev/null +++ b/Bios/src/fw/fet/stream.h @@ -0,0 +1,211 @@ +/* + * stream.h + * + * Copyright (C) 2013 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. + */ + + +//! \ingroup MODULBIOS +//! \file stream.h +//! \brief +//! +//! \author Detlef Fink (03/10/2011) +#ifndef _STREAM_H_ +#define _STREAM_H_ + +#include "../include/protocol.h" +#include "communicationDefs.h" + +#define MESSAGE_NEW_MSG 0x0001 +#define MESSAGE_LAST_MSG 0x0002 +#define MESSAGE_OUT_TO_DLL (unsigned char*)0x0001 +#define MESSAGE_NO_OUT (unsigned char*)0x0000 + +#define ID_SHARED_MEMORY_TYPE_SYNC_RUN 0xAA01 +#define ID_SHARED_MEMORY_TYPE_TIMER_TICK 0xAA02 +#define ID_SHARED_MEMORY_TYPE_I_TICK 0xAA03 +#define ID_SHARED_MEMORY_TYPE_TIME_TICK 0xAA04 + +struct _StreamSafe_ +{ + unsigned char rx[12]; + unsigned short *ext_data; + unsigned short ext_size; + unsigned short ext_counter; +}; +typedef struct _StreamSafe_ StreamSafe; + +struct stream_funcs +{ + short (*out_init)(unsigned char, unsigned char); + short (*flush)(void); + short (*put_byte)(unsigned char); + short (*put_bytes)(void*, unsigned short); + short (*put_word)(unsigned short); + short (*put_long)(unsigned long); + short (*in_init)(void *, unsigned char); + short (*internal_stream)(unsigned char *, unsigned short, unsigned char *, unsigned short, StreamSafe *); + short (*external_stream)(StreamSafe *); + unsigned char (*change_type)(unsigned char); + short (*get_byte)(unsigned char *); + short (*get_word)(unsigned short *); + short (*get_long)(unsigned long *); + short (*get_buffer)(void **, unsigned short *); + short (*discard_bytes)(unsigned short); + short (*memcpy)(unsigned char*, unsigned char*, unsigned short); + short (*biosLedOn)(unsigned char); + short (*biosLedOff)(unsigned char); + short (*biosLedBlink)(unsigned char, unsigned short); + short (*biosLedFlash)(unsigned char, unsigned short); + short (*biosLedAlternate)(unsigned short); + short (*sendDebug)(char *, unsigned short size); + short (*getSharedVariable)(unsigned short IdMemoryType, unsigned short** Address); + short (*deleteSharedVariable)(unsigned short IdMemoryType); +}; + +void STREAM_resetSharedVariables(); + +#ifdef HAL_STREAM + +extern struct stream_funcs * _stream_Funcs; + +// add definitions for external use +// functions are located in core module + +/** + * STREAM Function Pointer - these are the STREAM Exports + */ +#define STREAM_out_init (*_stream_Funcs->out_init) +#define STREAM_flush (*_stream_Funcs->flush) +#define STREAM_put_byte (*_stream_Funcs->put_byte) +#define STREAM_put_bytes (*_stream_Funcs->put_bytes) +#define STREAM_put_word (*_stream_Funcs->put_word) +#define STREAM_put_long (*_stream_Funcs->put_long) +#define STREAM_get_buffer (*_stream_Funcs->get_buffer) +#define STREAM_in_init (*_stream_Funcs->in_init) +#define STREAM_internal_stream (*_stream_Funcs->internal_stream) +#define STREAM_external_stream (*_stream_Funcs->external_stream) +#define STREAM_out_change_type (*_stream_Funcs->change_type) +#define STREAM_get_byte (*_stream_Funcs->get_byte) +#define STREAM_get_word (*_stream_Funcs->get_word) +#define STREAM_get_long (*_stream_Funcs->get_long) +#define STREAM_discard_bytes (*_stream_Funcs->discard_bytes) +#define STREAM_memcpy (*_stream_Funcs->memcpy) +#define STREAM_biosLedOn (*_stream_Funcs->biosLedOn) +#define STREAM_biosLedOff (*_stream_Funcs->biosLedOff) +#define STREAM_biosLedBlink (*_stream_Funcs->biosLedBlink) +#define STREAM_biosLedFlash (*_stream_Funcs->biosLedFlash) +#define STREAM_biosLedAlternate (*_stream_Funcs->biosLedAlternate) +#define STREAM_getSharedVariable (*_stream_Funcs->getSharedVariable) +#define STREAM_deleteSharedVariable (*_stream_Funcs->deleteSharedVariable) + + + +/**** Debug & Trace Functionality ****/ +#define STREAM_sendDebug (*_stream_Funcs->sendDebug) +/**** Debug & Trace Functionality ****/ + +#else // HAL_STREAM +extern struct stream_funcs _stream_Funcs; +/** + * STREAM Function Pointer - these are the STREAM Exports + */ +#define STREAM_out_init (*_stream_Funcs.out_init) +#define STREAM_flush (*_stream_Funcs.flush) +#define STREAM_put_byte (*_stream_Funcs.put_byte) +#define STREAM_put_bytes (*_stream_Funcs.put_bytes) +#define STREAM_put_word (*_stream_Funcs.put_word) +#define STREAM_put_long (*_stream_Funcs.put_long) +#define STREAM_in_init (*_stream_Funcs.in_init) +#define STREAM_internal_stream (*_stream_Funcs.internal_stream) +#define STREAM_external_stream (*_stream_Funcs.external_stream) +#define STREAM_out_change_type (*_stream_Funcs.change_type) +#define STREAM_get_byte (*_stream_Funcs.get_byte) +#define STREAM_get_word (*_stream_Funcs.get_word) +#define STREAM_get_long (*_stream_Funcs.get_long) +#define STREAM_get_buffer (*_stream_Funcs->get_buffer) +#define STREAM_discard_bytes (*_stream_Funcs.discard_bytes) +#define STREAM_memcpy (*_stream_Funcs.memcpy) +#define STREAM_biosLedOn (*_stream_Funcs.biosLedOn) +#define STREAM_biosLedOff (*_stream_Funcs.biosLedOff) +#define STREAM_biosLedBlink (*_stream_Funcs.biosLedBlink) +#define STREAM_biosLedFlash (*_stream_Funcs.biosLedFlash) +#define STREAM_biosLedAlternate (*_stream_Funcs.biosLedAlternate) +#define STREAM_sendDebug (*_stream_Funcs.sendDebug) +#define STREAM_getSharedVariable (*_stream_Funcs.getSharedVariable) +#define STREAM_deleteSharedVariable (*_stream_Funcs.deleteSharedVariable) + +#define STREAM_CORE_ZERO_VERSION 0x00 +#define STREAM_CORE_ZERO_MACRO_SIZE 0x01 +#define STREAM_CORE_ZERO_MACRO_ADDR 0x02 +#define STREAM_CORE_ZERO_PUC_RESET 0x03 +// function numbers in "zero function(s) in HAL modul" must start at 0xFF and count downward +#endif // HAL_STREAM + +typedef void *(*HalMainFunc)(void *stream_adr, unsigned long, unsigned char v3opHilCrcOk, unsigned char v3opDcdcCrcOk); +typedef short (*FuncInOut) (unsigned short id); + +#ifndef HAL_REC +#define HAL_REC +struct _HalRec_ +{ + unsigned short id; + void *function; +}; +typedef struct _HalRec_ HalRec; +#endif + +#define DEVICE_FLAG_XONOFF 0x00000001 +#define DEVICE_FLAG_SBW4 0x00000002 +#define DEVICE_FLAG_SBW2 0x00000004 +#define DEVICE_FLAG_EASY 0x00000008 + +#define DEVICE_FLAG_MSPFET 0x00000010 +#define DEVICE_FLAG_EZFET 0x00000020 + +struct _HAL_INFOS_ +{ + HalMainFunc init; + short sw_0; + short sw_1; + unsigned short hal_size; + HalRec *hal_list_ptr; + unsigned short hil_version; + unsigned short fpga_version; + short swCmp_0; + short swCmp_1; + unsigned short hil_versionCmp; +}; +typedef struct _HAL_INFOS_ *HAL_INFOS_PTR; +typedef struct _HAL_INFOS_ HAL_INFOS; + +#endif diff --git a/Bios/src/fw/fet/usbConstructs.c b/Bios/src/fw/fet/usbConstructs.c new file mode 100644 index 0000000..c730898 --- /dev/null +++ b/Bios/src/fw/fet/usbConstructs.c @@ -0,0 +1,409 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== usbConstructs.c ======== + */ +#include "USB_API/USB_Common/device.h" +#include "USB_API/USB_Common/types.h" //Basic Type declarations + +#include "USB_config/descriptors.h" +#include "USB_API/USB_Common/usb.h" //USB-specific functions + +#ifdef _CDC_ + #include "USB_API/USB_CDC_API/UsbCdc.h" +#endif +#ifdef _HID_ + #include "USB_API/USB_HID_API/UsbHid.h" +#endif +#ifdef _PHDC_ + #include "USB_API/USB_PHDC_API/UsbPHDC.h" +#endif + +#include +#include "usbConstructs.h" + + +/************************************************************************************************** + * These are example, user-editable construct functions for calling the API. + * + * In cases where fast development is the priority, it's usually best to use these sending + * construct functions, rather than calling USBCDC_sendData() or USBHID_sendData() + * directly. This is because they put boundaries on the "background execution" of sends, + * simplfying the application. + * + * xxxsendDataWaitTilDone() essentially eliminates background processing altogether, always + * polling after the call to send and not allowing execution to resume until it's done. This + * allows simpler coding at the expense of wasted MCU cycles, and MCU execution being "locked" + * to the host (also called "synchronous" operation). + * + * xxxsendDataInBackground() takes advantage of background processing ("asynchronous" operation) + * by allowing sending to happen during application execution; while at the same time ensuring + * that the sending always definitely occurs. It provides most of the simplicity of + * xxxsendDataWaitTilDone() while minimizing wasted cycles. It's probably the best choice + * for most applications. + * + * A true, asynchronous implementation would be the most cycle-efficient, but is the most + * difficult to code; and can't be "contained" in an example function as these other approaches + * are. Such an implementation might be advantageous in RTOS-based implementations or those + * requiring the highest levels of efficiency. + * + * These functions take into account all the pertinent return codes, toward ensuring fully + * robust operation. The send functions implement a timeout feature, using a loose "number of + * retries" approach. This was done in order to avoid using additional hardware resources. A + * more sophisticated approach, which the developer might want to implement, would be to use a + * hardware timer. + * + * Please see the MSP430 CDC/HID/MSC USB API Programmer's Guide for a full description of these + * functions, how they work, and how to use them. + **************************************************************************************************/ + + + +#ifdef _HID_ +/* This construct implements post-call polling to ensure the sending completes before the function + * returns. It provides the simplest coding, at the expense of wasted cycles and potentially + * allowing MCU execution to become "locked" to the host, a disadvantage if the host (or bus) is + * slow. The function also checks all valid return codes, and returns non-zero if an error occurred. + * It assumes no previous send operation is underway; also assumes size is non-zero. */ +BYTE hidSendDataWaitTilDone (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout) +{ + ULONG sendCounter = 0; + WORD bytesSent, bytesReceived; + + switch (USBHID_sendData(dataBuf,size,intfNum)){ + case kUSBHID_sendStarted: + break; + case kUSBHID_busNotAvailable: + return ( 2) ; + case kUSBHID_intfBusyError: + return ( 3) ; + case kUSBHID_generalError: + return ( 4) ; + default:; + } + + /* If execution reaches this point, then the operation successfully started. Now wait til it's finished. */ + while (1){ + BYTE ret = USBHID_intfStatus(intfNum,&bytesSent,&bytesReceived); + if (ret & kUSBHID_busNotAvailable){ /* This may happen at any time */ + return ( 2) ; + } + if (ret & kUSBHID_waitingForSend){ + if (ulTimeout && (sendCounter++ >= ulTimeout)){ /* Incr counter & try again */ + return ( 1) ; /* Timed out */ + } + } else { + return ( 0) ; /* If neither busNotAvailable nor waitingForSend, it succeeded */ + } + } +} + +/* This construct implements pre-call polling to ensure the sending completes before the function + * returns. It provides simple coding while also taking advantage of the efficiencies of background + * processing. If a previous send operation is underway, this function does waste cycles polling, + * like xxxsendDataWaitTilDone(); however it's less likely to do so since much of the sending + * presumably took place in the background since the last call to xxxsendDataInBackground(). + * The function also checks all valid return codes, and returns non-zero if an error occurred. + * It assumes no previous send operation is underway; also assumes size is non-zero. + * This call assumes a previous send operation might be underway; also assumes size is non-zero. + * Returns zero if send completed; non-zero if it failed, with 1 = timeout and 2 = bus is gone. */ +BYTE hidSendDataInBackground (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout) +{ + ULONG sendCounter = 0; + WORD bytesSent, bytesReceived; + + while (USBHID_intfStatus(intfNum,&bytesSent, + &bytesReceived) & kUSBHID_waitingForSend){ + if (ulTimeout && ((sendCounter++) > ulTimeout)){ /* A send operation is underway; incr counter & try again */ + return ( 1) ; /* Timed out */ + } + } + + /* The interface is now clear. Call sendData(). */ + switch (USBHID_sendData(dataBuf,size,intfNum)){ + case kUSBHID_sendStarted: + return ( 0) ; + case kUSBHID_busNotAvailable: + return ( 2) ; + default: + return ( 4) ; + } +} + +/* This call only retrieves data that is already waiting in the USB buffer -- that is, data that has + * already been received by the MCU. It assumes a previous, open receive operation (began by a direct + * call to USBxxx_receiveData()) is NOT underway on this interface; and no receive operation remains + * open after this call returns. It doesn't check for kUSBxxx_busNotAvailable, because it doesn't + * matter if it's not. size is the maximum that is allowed to be received before exiting; i.e., it + * is the size allotted to dataBuf. Returns the number of bytes received. */ +WORD hidReceiveDataInBuffer (BYTE* dataBuf, WORD size, BYTE intfNum) +{ + WORD bytesInBuf,rxCount; + BYTE* currentPos = dataBuf; + + while (bytesInBuf = USBHID_bytesInUSBBuffer(intfNum)) + { + if ((WORD)(currentPos - dataBuf + bytesInBuf) <= size){ + rxCount = bytesInBuf; + } else { + rxCount = size; + } + + USBHID_receiveData(currentPos,rxCount,intfNum); + currentPos += bytesInBuf; + } + return (rxCount); +} + +#endif + +/********************************************************************************************* + * Please see the MSP430 USB CDC API Programmer's Guide Sec. 9 for a full description of these + * functions, how they work, and how to use them. + **********************************************************************************************/ + +#ifdef _CDC_ +/* This construct implements post-call polling to ensure the sending completes before the function + * returns. It provides the simplest coding, at the expense of wasted cycles and potentially + * allowing MCU execution to become "locked" to the host, a disadvantage if the host (or bus) is + * slow. The function also checks all valid return codes, and returns non-zero if an error occurred. + * It assumes no previous send operation is underway; also assumes size is non-zero. */ +BYTE cdcSendDataWaitTilDone (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout) +{ + ULONG sendCounter = 0; + WORD bytesSent, bytesReceived; + + switch (USBCDC_sendData(dataBuf,size,intfNum)) + { + case kUSBCDC_sendStarted: + break; + case kUSBCDC_busNotAvailable: + return ( 2) ; + case kUSBCDC_intfBusyError: + return ( 3) ; + case kUSBCDC_generalError: + return ( 4) ; + default:; + } + + /* If execution reaches this point, then the operation successfully started. Now wait til it's finished. */ + while (1){ + BYTE ret = USBCDC_intfStatus(intfNum,&bytesSent,&bytesReceived); + if (ret & kUSBCDC_busNotAvailable){ /* This may happen at any time */ + return ( 2) ; + } + if (ret & kUSBCDC_waitingForSend){ + if (ulTimeout && (sendCounter++ >= ulTimeout)){ /* Incr counter & try again */ + return ( 1) ; /* Timed out */ + } + } else { + return ( 0) ; /* If neither busNotAvailable nor waitingForSend, it succeeded */ + } + } +} + +/* This construct implements pre-call polling to ensure the sending completes before the function + * returns. It provides simple coding while also taking advantage of the efficiencies of background + * processing. If a previous send operation is underway, this function does waste cycles polling, + * like xxxsendDataWaitTilDone(); however it's less likely to do so since much of the sending + * presumably took place in the background since the last call to xxxsendDataInBackground(). + * The function also checks all valid return codes, and returns non-zero if an error occurred. + * It assumes no previous send operation is underway; also assumes size is non-zero. + * This call assumes a previous send operation might be underway; also assumes size is non-zero. + * Returns zero if send completed; non-zero if it failed, with 1 = timeout and 2 = bus is gone. */ +BYTE cdcSendDataInBackground (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout) +{ + ULONG sendCounter = 0; + WORD bytesSent, bytesReceived; + + while (USBCDC_intfStatus(intfNum,&bytesSent, + &bytesReceived) & kUSBCDC_waitingForSend) + { + if (ulTimeout && ((sendCounter++) > ulTimeout)) + { /* A send operation is underway; incr counter & try again */ + return ( 1) ; /* Timed out */ + } + } + + /* The interface is now clear. Call sendData(). */ + switch (USBCDC_sendData(dataBuf,size,intfNum)) + { + case kUSBCDC_sendStarted: + return ( 0) ; + case kUSBCDC_busNotAvailable: + return ( 2) ; + default: + return ( 4) ; + } +} + +/* This call only retrieves data that is already waiting in the USB buffer -- that is, data that has + * already been received by the MCU. It assumes a previous, open receive operation (began by a direct + * call to USBxxx_receiveData()) is NOT underway on this interface; and no receive operation remains + * open after this call returns. It doesn't check for kUSBxxx_busNotAvailable, because it doesn't + * matter if it's not. size is the maximum that is allowed to be received before exiting; i.e., it + * is the size allotted to dataBuf. Returns the number of bytes received. */ +WORD cdcReceiveDataInBuffer (BYTE* dataBuf, WORD size, BYTE intfNum) +{ + WORD bytesInBuf,rxCount = 0; + BYTE* currentPos = dataBuf; + + while (bytesInBuf = USBCDC_bytesInUSBBuffer(intfNum)){ + if ((WORD)(currentPos - dataBuf + bytesInBuf) <= size){ + rxCount = bytesInBuf; + } else { + rxCount = size; + } + + USBCDC_receiveData(currentPos,rxCount,intfNum); + currentPos += bytesInBuf; + } + return (rxCount); +} + +#endif + +#ifdef _PHDC_ +/* This construct implements post-call polling to ensure the sending completes before the function + * returns. It provides the simplest coding, at the expense of wasted cycles and potentially + * allowing MCU execution to become "locked" to the host, a disadvantage if the host (or bus) is + * slow. The function also checks all valid return codes, and returns non-zero if an error occurred. + * It assumes no previous send operation is underway; also assumes size is non-zero. */ +BYTE phdcSendDataWaitTilDone (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout) +{ + ULONG sendCounter = 0; + WORD bytesSent, bytesReceived; + + switch (USBPHDC_sendData(dataBuf,size,intfNum)) + { + case kUSBPHDC_sendStarted: + break; + case kUSBPHDC_busNotAvailable: + return ( 2) ; + case kUSBPHDC_intfBusyError: + return ( 3) ; + case kUSBPHDC_generalError: + return ( 4) ; + default:; + } + + /* If execution reaches this point, then the operation successfully started. Now wait til it's finished. */ + while (1){ + BYTE ret = USBPHDC_intfStatus(intfNum,&bytesSent,&bytesReceived); + if (ret & kUSBPHDC_busNotAvailable){ /* This may happen at any time */ + return ( 2) ; + } + if (ret & kUSBPHDC_waitingForSend){ + if (ulTimeout && (sendCounter++ >= ulTimeout)){ /* Incr counter & try again */ + return ( 1) ; /* Timed out */ + } + } else { + return ( 0) ; /* If neither busNotAvailable nor waitingForSend, it succeeded */ + } + } +} + +/* This construct implements pre-call polling to ensure the sending completes before the function + * returns. It provides simple coding while also taking advantage of the efficiencies of background + * processing. If a previous send operation is underway, this function does waste cycles polling, + * like xxxsendDataWaitTilDone(); however it's less likely to do so since much of the sending + * presumably took place in the background since the last call to xxxsendDataInBackground(). + * The function also checks all valid return codes, and returns non-zero if an error occurred. + * It assumes no previous send operation is underway; also assumes size is non-zero. + * This call assumes a previous send operation might be underway; also assumes size is non-zero. + * Returns zero if send completed; non-zero if it failed, with 1 = timeout and 2 = bus is gone. */ +BYTE phdcSendDataInBackground (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout) +{ + ULONG sendCounter = 0; + WORD bytesSent, bytesReceived; + + while (USBPHDC_intfStatus(intfNum,&bytesSent, + &bytesReceived) & kUSBPHDC_waitingForSend){ + if (ulTimeout && ((sendCounter++) > ulTimeout)){ /* A send operation is underway; incr counter & try again */ + return ( 1) ; /* Timed out */ + } + } + + /* The interface is now clear. Call sendData(). */ + switch (USBPHDC_sendData(dataBuf,size,intfNum)){ + case kUSBPHDC_sendStarted: + return ( 0) ; + case kUSBPHDC_busNotAvailable: + return ( 2) ; + default: + return ( 4) ; + } +} + +/* This call only retrieves data that is already waiting in the USB buffer -- that is, data that has + * already been received by the MCU. It assumes a previous, open receive operation (began by a direct + * call to USBxxx_receiveData()) is NOT underway on this interface; and no receive operation remains + * open after this call returns. It doesn't check for kUSBxxx_busNotAvailable, because it doesn't + * matter if it's not. size is the maximum that is allowed to be received before exiting; i.e., it + * is the size allotted to dataBuf. Returns the number of bytes received. */ +WORD phdcReceiveDataInBuffer (BYTE* dataBuf, WORD size, BYTE intfNum) +{ + WORD bytesInBuf,rxCount; + BYTE* currentPos = dataBuf; + + while (bytesInBuf = USBPHDC_bytesInUSBBuffer(intfNum)){ + if ((WORD)(currentPos - dataBuf + bytesInBuf) <= size){ + rxCount = bytesInBuf; + } else { + rxCount = size; + } + + USBPHDC_receiveData(currentPos,rxCount,intfNum); + currentPos += bytesInBuf; + } + return (currentPos - dataBuf); +} + +#endif diff --git a/Bios/src/fw/fet/usbConstructs.h b/Bios/src/fw/fet/usbConstructs.h new file mode 100644 index 0000000..e198977 --- /dev/null +++ b/Bios/src/fw/fet/usbConstructs.h @@ -0,0 +1,63 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== usbConstructs.h ======== + */ +BYTE hidSendDataWaitTilDone (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout); +BYTE hidSendDataInBackground (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout); +WORD hidReceiveDataInBuffer(BYTE *,WORD,BYTE); + +BYTE cdcSendDataWaitTilDone (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout); +BYTE cdcSendDataInBackground (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout); +WORD cdcReceiveDataInBuffer(BYTE *,WORD,BYTE); + +BYTE phdcSendDataWaitTilDone (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout); +BYTE phdcSendDataInBackground (BYTE* dataBuf, + WORD size, + BYTE intfNum, + ULONG ulTimeout); +WORD phdcReceiveDataInBuffer(BYTE *,WORD,BYTE); diff --git a/Bios/src/fw/fet/usbEventHandling.c b/Bios/src/fw/fet/usbEventHandling.c new file mode 100644 index 0000000..8fb221f --- /dev/null +++ b/Bios/src/fw/fet/usbEventHandling.c @@ -0,0 +1,333 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2012, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 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. + * --/COPYRIGHT--*/ +/* + * ======== usbEventHandling.c ======== + * Event-handling placeholder functions. + * All functios are called in interrupt context. + */ + +#include "USB_API/USB_Common/device.h" +#include "USB_API/USB_Common/types.h" +#include "USB_API/USB_Common/defMSP430USB.h" +#include "USB_config/descriptors.h" +#include "USB_API/USB_Common/usb.h" +#include "F5xx_F6xx_Core_Lib/HAL_UCS.h" +#include "bios.h" +#include "stream.h" +#include "usbMain.h" +#include "v3_0p.h" +#include "communicationDefs.h" + + +#ifdef _CDC_ +#include "USB_API/USB_CDC_API/UsbCdc.h" +#endif + +#ifdef _HID_ +#include "USB_API/USB_HID_API/UsbHid.h" +#endif + +#ifdef _MSC_ +#include "USB_API/USB_MSC_API/UsbMsc.h" +#endif + +#ifdef _PHDC_ +#include "USB_API/USB_PHDC_API/UsbPHDC.h" +#endif + +/* + * If this function gets executed, it's a sign that the output of the USB PLL has failed. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleClockEvent () +{ + //TO DO: You can place your code here + + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +/* + * If this function gets executed, it indicates that a valid voltage has just been applied to the VBUS pin. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleVbusOnEvent () +{ + //TO DO: You can place your code here + + //We switch on USB and connect to the BUS + if (USB_enable() == kUSB_succeed){ + USB_reset(); + USB_connect(); //generate rising edge on DP -> the host enumerates our device as full speed device + } + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +/* + * If this function gets executed, it indicates that a valid voltage has just been removed from the VBUS pin. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleVbusOffEvent () +{ + //TO DO: You can place your code here + + XT2_Stop(); + + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +/* + * If this function gets executed, it indicates that the USB host has issued a USB reset event to the device. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleResetEvent () +{ + //TO DO: You can place your code here + + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +/* + * If this function gets executed, it indicates that the USB host has chosen to suspend this device after a period of active + * operation. + * returns TRUE to keep CPU awake + */ + +BYTE USB_handleSuspendEvent () +{ + BIOS_SuspendSystem(); + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +/* + * If this function gets executed, it indicates that the USB host has chosen to resume this device after a period of suspended + * operation. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleResumeEvent () +{ + BIOS_ResumeSystem(); + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +/* + * If this function gets executed, it indicates that the USB host has enumerated this device : + * after host assigned the address to the device. + * returns TRUE to keep CPU awake + */ +BYTE USB_handleEnumCompleteEvent () +{ + //TO DO: You can place your code here + + return (TRUE); //return TRUE to wake the main loop (in the case the CPU slept before interrupt) +} + +#ifdef _CDC_ + +/* + * This event indicates that data has been received for interface intfNum, but no data receive operation is underway. + * returns TRUE to keep CPU awake + */ +BYTE USBCDC_handleDataReceived (BYTE intfNum) +{ + if (intfNum == DEBUG_CHANNEL) //this is our debug channel + { + if(BIOS_UsbRxData() == RESPTYP_EXCEPTION ) + { + V3OP_KillLoop(0); + BIOS_UsbRxClear(); + BIOS_UsbTxClear(); + BIOS_InitCom(); + } + } + return (TRUE); +} +/* + * This event indicates that a send operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBCDC_handleSendCompleted (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +/* + * This event indicates that a receive operation on interface intfNum has just been completed. + */ +BYTE USBCDC_handleReceiveCompleted (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} +extern void switchDebugerOff(); +extern void switchOnUart(); +extern void switchDebugerOn(); + +/* + * This event indicates that new line coding params have been received from the host + */ +BYTE USBCDC_handleSetLineCoding (BYTE intfNum, ULONG lBaudrate) +{ + if(intfNum == COM_CHANNEL) + { + if(lBaudrate == BSL_UART_INVOKE_SEQUENCE || lBaudrate == BSL_I2C_INVOKE_SEQUENCE1 || lBaudrate == BSL_I2C_INVOKE_SEQUENCE2 + || lBaudrate == BSL_I2C_INVOKE_SEQUENCE3 || lBaudrate == BSL_I2C_INVOKE_SEQUENCE4 || lBaudrate == BSL_I2C_SEQUENCE1 || lBaudrate == BSL_I2C_SEQUENCE2 || lBaudrate == BSL_UART_SEQUENCE) + { + switchDebugerOff(); + } + else if(lBaudrate == BSL_DISABLE) + { + switchDebugerOn(); + } + else + { + switchOnUart(); + } + UsbMain_ComConfig(lBaudrate, USB_MCLK_FREQ, Bios_getTool_id()); + } + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} +/* + * This event indicates that new line state has been received from the host + */ +BYTE USBCDC_handleSetControlLineState (BYTE intfNum, BYTE lineState) +{ + return FALSE; +} + +#endif //_CDC_ + +#ifdef _HID_ +/* + * This event indicates that data has been received for interface intfNum, but no data receive operation is underway. + * returns TRUE to keep CPU awake + */ +BYTE USBHID_handleDataReceived (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +/* + * This event indicates that a send operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBHID_handleSendCompleted (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +/* + * This event indicates that a receive operation on interface intfNum has just been completed. + */ +BYTE USBHID_handleReceiveCompleted (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +/* + * This event indicates that a request to switch to or from Boot protocol + * was received from the host + */ +BYTE USBHID_handleBootProtocol (BYTE protocol, BYTE intfnum) +{ + return (FALSE); +} + +#endif //_HID_ + +#ifdef _MSC_ +BYTE USBMSC_handleBufferEvent (VOID) +{ + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +#endif //_MSC_ + + +#ifdef _PHDC_ + +/* + * This event indicates that data has been received for interface intfNum, but no data receive operation is underway. + * returns TRUE to keep CPU awake + */ +BYTE USBPHDC_handleDataReceived (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (TRUE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +/* + * This event indicates that a send operation on interface intfNum has just been completed. + * returns TRUE to keep CPU awake + */ +BYTE USBPHDC_handleSendCompleted (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +/* + * This event indicates that a receive operation on interface intfNum has just been completed. + */ +BYTE USBPHDC_handleReceiveCompleted (BYTE intfNum) +{ + //TO DO: You can place your code here + + return (FALSE); //return FALSE to go asleep after interrupt (in the case the CPU slept before + //interrupt) +} + +#endif //_PHDC_ + +/*----------------------------------------------------------------------------+ + | End of source file | + +----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/Bios/src/fw/fet/usbMain.c b/Bios/src/fw/fet/usbMain.c new file mode 100644 index 0000000..383c0a9 --- /dev/null +++ b/Bios/src/fw/fet/usbMain.c @@ -0,0 +1,94 @@ +/* + * usbMain.c + * + * Copyright (C) 2013 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. + */ +#include "USB_API/USB_Common/device.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations +#include "USB_config/descriptors.h" +#include "USB_API/USB_Common/usb.h" // USB-specific functions +#include "USB_API/USB_CDC_API/UsbCdc.h" +#include "usbMain.h" +#include "usbConstructs.h" + +COM_INFOS_t com_ins; + +void UsbMain_setComIterface(COM_INFOS_t *ui_c) +{ + com_ins = *ui_c; +} +void UsbMain_ComConfig(unsigned long Baudrate, unsigned long MCLK_Frequency, unsigned short toolId) +{ + com_ins.comConfig(Baudrate,MCLK_Frequency, toolId); +} + +void USB_MainLoop(void) +{ + com_ins.comLoop(); +} + +#ifdef eZ_FET +// Interrupt service routines for UART handling +#pragma vector=USCI_A0_VECTOR +__interrupt void UART_RxIsr(void) +{ + com_ins.comReceive(UCA0RXBUF); +} + +#pragma vector=PORT2_VECTOR +__interrupt void UART_RtsIsr(void) +{ + if((P2IFG & BIT6) == BIT6) + { + com_RtsIfgClear(); + com_ins.comSetRts(); + } +} +#endif + +#ifdef MSP_FET + #pragma vector=USCI_A1_VECTOR + __interrupt void UART_RxIsr(void) + { + com_ins.comReceive(UCA1RXBUF); + } + + #pragma vector=PORT2_VECTOR + __interrupt void UART_RtsIsr(void) + { + if((P2IFG & BIT1) == BIT1) + { + com_RtsIfgClear(); + com_ins.comSetRts(); + } + } +#endif diff --git a/Bios/src/fw/fet/usbMain.h b/Bios/src/fw/fet/usbMain.h new file mode 100644 index 0000000..2054efc --- /dev/null +++ b/Bios/src/fw/fet/usbMain.h @@ -0,0 +1,47 @@ +/* + * usbMain.h + * + * Copyright (C) 2014 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. + */ + +#include "hil_Structs.h" +#include "../Uart/FetCom.h" +#include "../dcdc/FetDcdc.h" + +#ifndef USBMAIN_H_ +#define USBMAIN_H_ + +void USB_MainLoop(void); +void UsbMain_setComIterface(COM_INFOS_t *ui_c); +unsigned short UsbMain_evaluateBaudRateCommand(unsigned long Baudrate); +void UsbMain_ComConfig(unsigned long Baudrate, unsigned long MCLK_Frequency, unsigned short toolId); +#endif /* USBMAIN_H_ */ diff --git a/Bios/src/fw/fet/v3_0p.c b/Bios/src/fw/fet/v3_0p.c new file mode 100644 index 0000000..39afabf --- /dev/null +++ b/Bios/src/fw/fet/v3_0p.c @@ -0,0 +1,1136 @@ +/* + * v3_0p.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULBIOS +//! \file v3_0p.c +//! \brief process and route the different message types +//! \li forwarding (execute) messages to HAL +//! \li upload of HAL macros +//! \li loop management + +#include "fet/v3_0p_hw_fet.h" +#include "fet/bios.h" +#include "v3_0p.h" +#include "stream.h" +#include +#include "Fet_IccMonitor.h" +#include "USB_API/USB_Common/types.h" +#include "USB_API/USB_CDC_API/UsbCdc.h" +#include +#include "../dcdc/FetDcdc.h" +#include "../Uart/FetCom.h" +#include "FetUsb.h" +#include "usbMain.h" +#include "usbConstructs.h" + + // module handling +typedef void *(*DcdcInit)(DCDC_INFOS_t* dcdcInfos_Pointer); +DCDC_INFOS_t dcdcInfos_; +#pragma required=dcdcInfos_ + +typedef void *(*ComInit)(COM_INFOS_t* comInfos_Pointer); + + +edt_common_methods_t _edt_Common_Methods; +typedef void (*HilInitGetEdtCommenFunc)(edt_common_methods_t* edt_commen); // * hal_size, void * stream_adr) +HilInitGetEdtCommenFunc hilEdtCom = NULL; + +typedef short (*HalFpgaUpdateFunc)(void);// FPGA update function + +short _dummy_shortOutVoidIn(void) {return 0;} +void _dummy_voidOutVoidIn(void){}; +short _dummy_comConfig (unsigned long Baudrate, unsigned long MCLK_Frequency, unsigned short toolId){return 0;}; +short _dummy_comTransmit(void){return 0;}; +short _dummy_comReceive (unsigned char character){return 0;}; +unsigned char *_dummy_comGetBuffer (){return 0;}; + +short _dummy_dcdcCalibrate(unsigned short resistor[4], unsigned short resCount, unsigned short vcc){return 0;} +short _dummy_dcdcSetVcc(unsigned short vcc ){return 0;} +short _dummy_dcdcRestart(unsigned short fetType_){return 0;}; +void _dummy_dcdc_getCalibrationValues(unsigned short vcc, unsigned short resistor, unsigned short resCount, unsigned long *ticks, unsigned long *time){return;} + +void _dummy_comSetHil(edt_common_methods_t* dummy){}; +void _dummy_comSetDcdc(DCDC_INFOS_t* dummy){}; +void _dummy_comSetUSB(FET_USB_INFOS_t* dummy){}; +void _dummy_comLoop(void){}; +short _dummy_comConfig2(unsigned long Baudrate){return 0;}; + +short _dummy_InitHil( void ){return 0;}; +short _dummy_SetVcc(unsigned short Vcc){return 0;}; +void _dummy_SwitchVccFET(unsigned short state) {return;}; +short _dummy_GetVcc(double* Vcc, double* ExtVcc){return 0;}; +void _dummy_setFpgaTimeOut(unsigned short state) {return;}; +short _dummy_regulateVcc(void) { return 0; } + +unsigned char rx_queu_counter_public_; + +COM_INFOS_t comInfos_ = +{ + _dummy_shortOutVoidIn, + _dummy_comConfig, + _dummy_comTransmit, + _dummy_comReceive, + _dummy_voidOutVoidIn, + _dummy_comSetHil, + _dummy_comSetDcdc, + _dummy_comSetUSB, + _dummy_comLoop, + _dummy_comConfig2, + _dummy_comTransmit, + _dummy_comTransmit, + _dummy_voidOutVoidIn +}; +#pragma required=comInfos_ + +FET_USB_INFOS_t fetUsbInfos_ = +{ + USBCDC_bytesInUSBBuffer, + USBCDC_receiveData, + cdcSendDataInBackground, +}; +#pragma required=fetUsbInfos_ + +//------------------------------------------------------------------------------ +// Global Variables - Data Memory used by this module +// +V3opLoopArray v3op_loop_array_[V3OP_LOOP_ARRAY_COUNT] = { + { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, + { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, + { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, + { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 } +}; + +HAL_INFOS no_hal_infos_ = {NULL, 0, 0, 0, NULL, 0, 0}; + +HAL_INFOS_PTR hal_infos_ = &no_hal_infos_; +// ID from and pointer to all HAL functions +HAL_REC_ARRAY hal_ptr_ = NULL; +// informations about first and last measages +unsigned short v30p_stream_flags_ = 0; + +short HAL_Zero(unsigned char *data); + +void V3OP_HwReset(void) +{ + STREAM_resetSharedVariables(); + BIOS_UsbTxClear(); + BIOS_UsbRxClear(); + BIOS_InitCom(); +} + +#pragma optimize = low +short HAL_Zero(unsigned char *data) +{ + short ret_value = 0; + unsigned short i; + if(data[MESSAGE_EXECUTE_ZERO_ADDR_POS] == STREAM_CORE_ZERO_VERSION) // call for SW version + { + if(STREAM_out_init(data[MESSAGE_MSG_ID_POS], RESPTYP_DATA) >= 0) + { + unsigned long coreVersion_ToolId = Bios_getCore_version(); + coreVersion_ToolId =(coreVersion_ToolId<<16) + Bios_getTool_id(); + if(Bios_getHal_signature() == 0xBEEFBEEF && V3OP_HalCrcOk() && + Bios_getHil_signature() == 0xF00DF00D && V3OP_HilCrcOk()) + { + STREAM_put_word((*hal_infos_).sw_0); + STREAM_put_word((*hal_infos_).sw_1); + } + else + { + STREAM_put_word(Bios_getTool_id()); + STREAM_put_word(Bios_getTool_id()); + } + STREAM_put_word(Bios_getInfo_hw_0()); + STREAM_put_word(Bios_getInfo_hw_1()); + + STREAM_put_bytes((unsigned char*)&coreVersion_ToolId,sizeof(coreVersion_ToolId)); + STREAM_put_word((*hal_infos_).hil_version); + + if(Bios_getDcdc_signature() == 0xABBAABBA && V3OP_DcdcCrcOk()) + { + STREAM_put_word(dcdcInfos_.getLayerVersion()); + } + else + { + STREAM_put_word(-1); + } + if(Bios_getDcdc_signature() == 0xABBAABBA && V3OP_DcdcCrcOk() && Bios_getTool_id() != eZ_FET_NO_DCDC) + { + STREAM_put_word(dcdcInfos_.getSubMcuVersion()); + + } + else + { + STREAM_put_word(-1); + } + // return dummy value for Uart version module + if(Bios_getCom_signature() == 0xACDCACDC && V3OP_ComChannelCrcOk()) + { + STREAM_put_word(comInfos_.comGetLayerVersion()); + } + else + { + STREAM_put_word(-1); + } + + // return CRC's for core and all firmware modules + STREAM_put_word(V3OP_GetHilCrc()); + STREAM_put_word(V3OP_GetHalCrc()); + STREAM_put_word(V3OP_GetDcdcCrc()); + STREAM_put_word(V3OP_GetCoreCrc()); + STREAM_put_word(V3OP_GetComChannelCrc()); + STREAM_put_word((*hal_infos_).fpga_version); + + STREAM_put_word(BIOS_RX_QUEUS); + STREAM_put_word(BIOS_RX_SIZE); + STREAM_put_long(0); + + // reset static vars + STREAM_resetSharedVariables(); + ret_value = 1; + } + else + { + ret_value = -3; + } + } + else if(data[MESSAGE_EXECUTE_ZERO_ADDR_POS] == STREAM_CORE_ZERO_MACRO_SIZE) + { + if((*hal_infos_).hal_size) + { + if(STREAM_out_init(data[MESSAGE_MSG_ID_POS], RESPTYP_DATA) >= 0) + { + STREAM_put_word((*hal_infos_).hal_size); + ret_value = 1; + } + else + { + ret_value = -4; + } + } + else + { + ret_value = -2; + } + } + else if(data[MESSAGE_EXECUTE_ZERO_ADDR_POS] == STREAM_CORE_ZERO_MACRO_ADDR) + { + if(STREAM_out_init(data[MESSAGE_MSG_ID_POS], RESPTYP_DATA) >= 0) + { + for(i =0;i<(*hal_infos_).hal_size;i++) + { + STREAM_put_word(i); + STREAM_put_word((*hal_ptr_)[i].id); + } + ret_value = 1; + } + else + { + ret_value = -5; + } + } + else if(data[MESSAGE_EXECUTE_ZERO_ADDR_POS] == STREAM_CORE_ZERO_PUC_RESET) + { + if(STREAM_out_init(data[MESSAGE_MSG_ID_POS], RESPTYP_ACKNOWLEDGE) >= 0) + { + STREAM_flush(); + ret_value = -6; + } + V3OP_HwReset(); + // there can't send a ret_value + } + if(ret_value == 1) + { + ret_value = MESSAGE_NO_RESPONSE; + STREAM_flush(); + } + return(ret_value); +} + +short V3OP_PauseLoop(unsigned char msg_id) +{ + if ( msg_id != 0x40 ) + { + int i = 0; + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if(v3op_loop_array_[i].msg_id == msg_id) + { + v3op_loop_array_[i].active = 0; + break; + } + } + } + return 1; +} + +short V3OP_ResumeLoop(unsigned char msg_id) +{ + if ( msg_id != 0x40 ) + { + int i = 0; + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if(v3op_loop_array_[i].msg_id == msg_id) + { + v3op_loop_array_[i].active = 1; + break; + } + } + } + return 1; +} + +//! \brief kill all loop functions, including vcc monitor +void V3OP_KillAllLoops(void) +{ + int i = 0; + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if(v3op_loop_array_[i].indata != NULL) + { + free(v3op_loop_array_[i].indata); + } + v3op_loop_array_[i].indata = NULL; + v3op_loop_array_[i].addr = 0xFFFF; + v3op_loop_array_[i].active = 1; + } +} + +//! \brief kill (stop) functions in loop +//! \param[in] addr index of function to kill +//! \param[in] id with there the function was install in the loop +//! \details if addr and id are zero, all function in loop are killed +//! \return 0 -> no function found in loop to kill (only posible if addr and id 0) +//! \return >0 -> count of functions in loop who killed +//! \return <0 -> no function to kill +short V3OP_KillLoop(unsigned char msg_id) +{ + unsigned short i; + short ret_value = -1; + + if(msg_id == 0) + { + ret_value = 0; + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if((v3op_loop_array_[i].addr != 0xFFFF) && ((*hal_ptr_)[v3op_loop_array_[i].addr].id < 0xFF00)) + { + if(v3op_loop_array_[i].indata != NULL) + { + //free(v3op_loop_array_[i].indata); + } + v3op_loop_array_[i].indata = NULL; + v3op_loop_array_[i].addr = 0xFFFF; + v3op_loop_array_[i].active = 0; + + ret_value++; + } + } + } + else + { + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if(v3op_loop_array_[i].msg_id == msg_id) break; + } + if(i < V3OP_LOOP_ARRAY_COUNT) // addr found + { + if(v3op_loop_array_[i].indata != NULL) + { + free(v3op_loop_array_[i].indata); + } + v3op_loop_array_[i].indata = NULL; + v3op_loop_array_[i].addr = 0xFFFF; + v3op_loop_array_[i].active = 0; + } + ret_value = 1; + } + return(ret_value); +} + +//! \brief install a HAL function in loop +//! \param[in] *addr id (addr) to receive buffer +//! \param[in] flags 0 -> function in loop until kill +//! \param[in] flags 1 -> function in loop until function returns with !=0 +//! \return <0 -> function not install +//! \return 1 -> function install in loop + +unsigned static char tempInData[4][100]= {0x0,0x0}; + +short V3OP_SetLoop(unsigned char *payload_incl_addr, unsigned char flags) +{ + unsigned short i, j; + unsigned char payload_size; + short ret_value = -1; + + // search for same running function + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if((v3op_loop_array_[i].addr == *(unsigned short*)&payload_incl_addr[MESSAGE_EXECUTE_CALL_ADDR_POS]) && + (v3op_loop_array_[i].msg_id == payload_incl_addr[MESSAGE_MSG_ID_POS])) + { + ret_value = -2; + break; + } + } + // search free slot + for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) + { + if(v3op_loop_array_[i].addr == 0xFFFF) + { + break; + } + } + if(i < V3OP_LOOP_ARRAY_COUNT) // free slot found + { + if(payload_incl_addr[0] >= MESSAGE_EXECUTE_PAYLOAD_POS) + { + payload_size = payload_incl_addr[0]+1; + v3op_loop_array_[i].indata = tempInData[i];// (unsigned char*)malloc(payload_size); + if(v3op_loop_array_[i].indata) + { + for(j = 0; j < payload_size; j++) + { + v3op_loop_array_[i].indata[j] = payload_incl_addr[j]; + } + v3op_loop_array_[i].flags = flags & V3OP_LOOP_WAIT_FLAG; + v3op_loop_array_[i].msg_id = payload_incl_addr[2] | 0x40; + v3op_loop_array_[i].msg_type = RESPTYP_DATA; + v3op_loop_array_[i].addr = *(unsigned short*)&payload_incl_addr[MESSAGE_EXECUTE_CALL_ADDR_POS]; + v3op_loop_array_[i].active = 1; + ret_value = 1; + } + else + { + ret_value = -4; + } + } + else + { + v3op_loop_array_[i].indata = NULL; + v3op_loop_array_[i].flags = flags & V3OP_LOOP_WAIT_FLAG; + v3op_loop_array_[i].msg_id = payload_incl_addr[2] | 0x40; + v3op_loop_array_[i].msg_type = RESPTYP_DATA; + v3op_loop_array_[i].addr = *(unsigned short*)&payload_incl_addr[MESSAGE_EXECUTE_CALL_ADDR_POS]; + v3op_loop_array_[i].active = 1; + ret_value = 1; + } + } + else + { + ret_value = -3; + } + return(ret_value); +} + +short V3OP_Calibrate(unsigned char *str); + +//! \brief process message type +//! \param[in] *str pointer on received buffer +//! \li str[1] message type +//! \li str[2] message id +//! \li str[3] function timeout (not used) +//! \li str[4...] message type (function) depended payload +//! \return 0 +short V3OP_Rx (unsigned char *str) +{ + unsigned char tmp_char; + unsigned short call_addr; + short ret_value = -1; + //short ret_value = 0x8000; + short ret_value_tmp = 0; + HalFuncInOut pCallAddr; + + if((bios_rx_record_.last_cmd_typ != str[MESSAGE_CMDTYP_POS]) || !(bios_rx_record_.last_msg_id & 0x80)) + { + bios_rx_record_.last_cmd_typ = str[MESSAGE_CMDTYP_POS]; + bios_rx_record_.last_msg_call = str[MESSAGE_EXECUTE_CALL_ADDR_POS]; + v30p_stream_flags_ |= MESSAGE_NEW_MSG; + } + else + { + v30p_stream_flags_ &= ~MESSAGE_NEW_MSG; + } + if(!(str[MESSAGE_MSG_ID_POS] & 0x80)) + { + v30p_stream_flags_ |= MESSAGE_LAST_MSG; + } + else + { + v30p_stream_flags_ &= ~MESSAGE_LAST_MSG; + } + bios_rx_record_.last_msg_id = str[MESSAGE_MSG_ID_POS]; + + if(!bios_wb_control_) + { + BIOS_LedOn(BIOS_LED_MODE); + bios_wb_control_ = 1; + } + if(str[MESSAGE_CMDTYP_POS] == CMDTYP_EXECUTE) // bypass CMDTYP_EXECUTE at switch instruction + { + if(v30p_stream_flags_ & MESSAGE_NEW_MSG) + { + call_addr = *(unsigned short*)&str[MESSAGE_EXECUTE_CALL_ADDR_POS]; // first short is on a word boundary + STREAM_discard_bytes(2); + } + else + { + call_addr = bios_rx_record_.last_msg_call; + } + if(call_addr == 0) + { + ret_value_tmp = HAL_Zero(str); + } + if(!ret_value_tmp) + { + // adjust to payload for HAL (payload without cmd-index) + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + #ifdef HAL_HISTORY + if(hal_history_count_ >= sizeof(hal_history_)/2) + { + hal_history_count_=0; + } + hal_history_[hal_history_count_++] = call_addr; + hal_history_last_ = call_addr; + #endif + if(call_addr < (*hal_infos_).hal_size) + { + pCallAddr = (HalFuncInOut)(*hal_ptr_)[call_addr].function; + if(pCallAddr != NULL) + { + ret_value = pCallAddr(v30p_stream_flags_); + if(!ret_value) + { + STREAM_flush(); + ret_value = MESSAGE_NO_RESPONSE; + } + } + } + } + else + { + ret_value = ret_value_tmp; + } + } + else + { + switch(str[MESSAGE_CMDTYP_POS]) + { + case CMDTYP_EXECUTELOOP: + ret_value = V3OP_SetLoop(str, V3OP_LOOP_WAIT_FLAG); + break; + case CMDTYP_EXECUTEEVER: + ret_value = V3OP_SetLoop(str, 0); + break; + case CMDTYP_KILL: + ret_value = V3OP_KillLoop(str[MESSAGE_EXECUTE_CALL_ADDR_POS+2]); + break; + case CMDTYP_KILL_ALL: + V3OP_KillAllLoops(); + ret_value = 1; + break; + case CMDTYP_PAUSE_LOOP: + { + unsigned char msgId = str[MESSAGE_EXECUTE_CALL_ADDR_POS+2]; + ret_value = V3OP_PauseLoop( msgId | 0x40 ); + } + break; + case CMDTYP_RESUME_LOOP: + { + unsigned char msgId = str[MESSAGE_EXECUTE_CALL_ADDR_POS+2]; + ret_value = V3OP_ResumeLoop( msgId | 0x40 ); + } + break; + case CMDTYP_UPINIT: // init update + ret_value = V3OP_CoreFlashFunctionInit(str); + break; + case CMDTYP_UPERASE: // erase HAL part + ret_value = V3OP_CoreFlashFunctionErase(str); + if(ret_value == 1) // tell Bios that Hal is dead + { + V3OP_HalInterfaceClear(); + } + break; + case CMDTYP_UPWRITE: // write into HAL part + ret_value = V3OP_CoreFlashFunctionWrite(str,v30p_stream_flags_); + break; + case CMDTYP_UPREAD: // read HAL part + ret_value = V3OP_CoreFlashFunctionRead(str); + break; + case CMDTYP_UPCORE: + // Erase Segment with Core Signature, to start install new core on restart + V3OP_UpCore(); + break; + case CMDTYP_DCDC_RESTART: + // restart sub mcu + ret_value = dcdcInfos_.dcdcRestart(*(unsigned short*)&str[4]); + break; + case CMDTYP_DCDC_CALIBRATE: + // Start DCDC mcu calibaration function + ret_value = V3OP_Calibrate(str); + break; + case CMDTYP_DCDC_INIT_INTERFACE: + V3OP_DcdcInterfaceInit(); + break; + case CMDTYP_DCDC_SUB_MCU_VERSION: + ret_value = dcdcInfos_.getSubMcuVersion(); + break; + case CMDTYP_DCDC_LAYER_VERSION: + ret_value = dcdcInfos_.getLayerVersion(); + break; + case CMDTYP_DCDC_POWER_DOWN: + ret_value = dcdcInfos_.dcdcPowerDown(); + break; + case CMDTYP_DCDC_SET_VCC: + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + ret_value = dcdcInfos_.dcdcSetVcc(*(unsigned short*)&str[6]); + break; + case CMDTYP_OVER_CURRENT: + { + unsigned short state = 0; + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + state = (*(unsigned short*)&str[6]); + if(state) + { + IccMonitor_StartVoltageSupervision(); + } + else + { + IccMonitor_StopVoltageSupervision(); + } + break; + } + case CMDTYP_HIL_SET_VCC: + { + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + if(_edt_Common_Methods.SetVcc) + { + ret_value = _edt_Common_Methods.SetVcc(*(unsigned short*)&str[6]); + } + break; + } + case CMDTYP_HIL_GET_VCC: + { + double vcc = 0; + double ext_vcc = 0; + if(_edt_Common_Methods.GetVcc) + { + ret_value = _edt_Common_Methods.GetVcc(&vcc, &ext_vcc); + } + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + STREAM_put_word((unsigned short)vcc); + STREAM_put_word((unsigned short)ext_vcc); + STREAM_flush(); + break; + } + + case CMDTYP_HIL_SWITCH_FET: + { + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + if(_edt_Common_Methods.SwitchVccFET) + { + _edt_Common_Methods.SwitchVccFET(*(unsigned short*)&str[6]); + } + ret_value = 0; + break; + } + case CMDTYP_CMP_VERSIONS: + { + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + if(Bios_getHal_signature() == 0xBEEFBEEF && V3OP_HalCrcOk() && + Bios_getHil_signature() == 0xF00DF00D && V3OP_HilCrcOk()) + { + STREAM_put_word((*hal_infos_).swCmp_0); + STREAM_put_word((*hal_infos_).swCmp_1); + STREAM_put_word((unsigned short)(*hal_infos_).hil_versionCmp); + } + else + { + STREAM_put_word(0); + STREAM_put_word(0); + STREAM_put_word(0); + } + STREAM_put_word((unsigned short) dcdcInfos_.getLayerVersionCmp()); + STREAM_put_word((unsigned short) comInfos_.comGetLayerVersionCmp()); + STREAM_flush(); + + ret_value = 0; + break; + } + } + } + + if(ret_value != MESSAGE_NO_RESPONSE) + { + if(ret_value >= 0) + { + if(STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_ACKNOWLEDGE) >= 0) + { + STREAM_put_word(ret_value); + STREAM_flush(); + } + } + else + { + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_EXCEPTION); + STREAM_put_word(ret_value); + if(ret_value == EXCEPTION_MSGID_ERR) + { + tmp_char = (bios_rx_record_.last_msg_id + 1) & 0x3F; + if(!tmp_char) + { + tmp_char++; + } + STREAM_put_word(tmp_char); + } + STREAM_flush(); + } + } + return(0); +} + +short V3OP_Calibrate(unsigned char *str) +{ // Calibration values retreived form the DCDC + unsigned long ticks; + unsigned long time; + // Start DCDC mcu calibaration function + STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_DATA); + + unsigned short countRes = *(unsigned short*)&str[4]; + unsigned short res[5] = {0,0,0,0,0}; + unsigned short vcc = 0; + short ret_value = -1; + // Resistors + int i, pos; + for (i = 0, pos = 6; i < countRes; ++i, pos += 2) + { + res[i] = *(unsigned short*)&str[pos]; + } + vcc = *(unsigned short*)&str[pos]; + + ret_value = dcdcInfos_.dcdcCalibrate(res, countRes, vcc); + if(!ret_value) + { + int y = 0; + for(y =0; y < countRes; y++) + { + dcdcInfos_.dcdc_getCalibrationValues(vcc, res[y], countRes, &ticks, &time); + STREAM_put_long(ticks); + STREAM_put_long(time); + } + STREAM_flush(); + ret_value = MESSAGE_NO_RESPONSE; + } + else + { + STREAM_put_long(0xDEAD); + STREAM_put_long(0xBABE); + STREAM_flush(); + ret_value = MESSAGE_NO_RESPONSE; + } + return ret_value; +} + +//! \brief sends exceptions with details in payload +//! \param[in] msg_id message id +//! \param[in] code if payload = NULL, 'code' is sendet in as payload +//! \param[in] *payload if !=NULL payload is sendet with the length 'code' +//! \return 0 exception sended +//! \return -1 exception not sended, no output buffer aviable +short V3OP_SendException(unsigned char msg_id, unsigned short code, unsigned short *payload) +{ + unsigned short i; + + if(STREAM_out_init(msg_id, RESPTYP_EXCEPTION) >= 0) + { + if(payload == NULL) + { + STREAM_put_word(code); + } + else + { + for(i = 0;(i < code) && (i < 126); i++) + { + STREAM_put_word(payload[i]); + } + } + STREAM_flush(); + return(0); + } + return(-1); +} + +// Sw layer init + +//***************************************** +short V3OP_HalInterfaceClear(void) +{ + V3OP_KillAllLoops(); + hal_infos_ = &no_hal_infos_; + hal_ptr_ = NULL; + return(0); +} + +typedef void (*HilInitFunc)(); + +short V3OP_HalInterfaceInit(void) +{ + HalMainFunc halStartUpCode = NULL; + HilInitFunc hilInit = NULL; + + unsigned char cmd[6] = {0x05, CMDTYP_EXECUTELOOP, 0, 0, 0, 0}; + unsigned char i; + + V3OP_HalInterfaceClear(); + //set shared mem Variables to 0x00 + STREAM_resetSharedVariables(); + + + // if hil is not loaded - did not make sence to init hal + if(Bios_getHil_signature() != 0xF00DF00D || Bios_getHil_intvec() == 0xFFFF || !V3OP_HilCrcOk()) + { + _edt_Common_Methods.Init = _dummy_InitHil; + _edt_Common_Methods.SetVcc = _dummy_SetVcc; + _edt_Common_Methods.GetVcc = _dummy_GetVcc; + _edt_Common_Methods.setFpgaTimeOut = _dummy_setFpgaTimeOut; + _edt_Common_Methods.SwitchVccFET = _dummy_SwitchVccFET; + _edt_Common_Methods.regulateVcc = _dummy_regulateVcc; + _edt_Common_Methods.SetToolID = _dummy_SwitchVccFET; + return -1; + } + hilInit = (HilInitFunc)Bios_getHil_intvec(); + // call startup of HIL layer + hilInit(); + hilEdtCom = (HilInitGetEdtCommenFunc)0x18A0; + hilEdtCom(&_edt_Common_Methods); + + // check if rest vector is not FFFF and if a valid Hal/Programm signature was found + if(Bios_getHal_intvec() == 0xFFFF || Bios_getHal_signature() != 0xBEEFBEEF || !V3OP_HalCrcOk()) + { + return -1; + } + + _edt_Common_Methods.SetToolID(Bios_getTool_id()); + + halStartUpCode = (HalMainFunc)Bios_getHal_intvec(); // calls the (modified) startup code of HAL + hal_infos_ = halStartUpCode((struct stream_funcs*)&_stream_Funcs, 0, V3OP_HilCrcOk(), V3OP_DcdcCrcOk()); // return HAL sw infos + hal_ptr_ = (HAL_REC_ARRAY)(*hal_infos_).hal_list_ptr; + + IccMonitor_setHilIterface(&_edt_Common_Methods); + comInfos_.comSetHil(&_edt_Common_Methods); + + if(hal_ptr_ != NULL) + { + //configure ICC monitor process + (*hal_ptr_)[(*hal_infos_).hal_size-1].id = 0xFFFE; + (*hal_ptr_)[(*hal_infos_).hal_size-1].function = (void*)IccMonitor_Process; + + for(i=0; i <(*hal_infos_).hal_size; i++) + { + if(((*hal_ptr_)[i].id != 0xFFFF) && ((*hal_ptr_)[i].id >= 0xFF00)) + { + cmd[4] = i; + cmd[5] = 0; + V3OP_SetLoop(cmd, 0); + break; + } + } + } + return 0; +} + +void V3OP_DcdcInterfaceClear(void) +{ + dcdcInfos_.getSubMcuVersion = _dummy_shortOutVoidIn; + dcdcInfos_.getLayerVersion = _dummy_shortOutVoidIn; + dcdcInfos_.dcdcCalibrate = _dummy_dcdcCalibrate; + dcdcInfos_.dcdcPowerDown = _dummy_shortOutVoidIn; + dcdcInfos_.dcdcSetVcc = _dummy_dcdcSetVcc; + dcdcInfos_.dcdcRestart = _dummy_dcdcRestart; + dcdcInfos_.dcdc_getCalibrationValues = _dummy_dcdc_getCalibrationValues; + dcdcInfos_.getLayerVersionCmp = _dummy_shortOutVoidIn; + //dcdcInfos_.getLayerVersion = _dummy_shortOutVoidIn; + comInfos_.comSetDcdc(&dcdcInfos_); + +} + +short V3OP_DcdcInterfaceInit(void) +{ + DcdcInit dcdc_Init_ = NULL; + if(Bios_getDcdc_intvec() == 0xFFFF || Bios_getDcdc_signature() != 0xABBAABBA || !V3OP_DcdcCrcOk()) + { + V3OP_DcdcInterfaceClear(); + return -1; + } + dcdc_Init_ = (DcdcInit)Bios_getDcdc_intvec(); // calls the (modified) startup code of HAL + dcdc_Init_(&dcdcInfos_); + + comInfos_.comSetDcdc(&dcdcInfos_); + dcdcInfos_.dcdcRestart(Bios_getTool_id()); + + return 0; +} + +//******************** Module Implementation ************** +short V3OP_ComInterfaceInit(void) +{ + ComInit com_Init_ = NULL; + if((Bios_getCom_intvec() == 0xFFFF) || (Bios_getCom_signature() != 0xACDCACDC)|| ! V3OP_ComChannelCrcOk()) + { + V3OP_ComInterfaceClear(); + return -1; + } + com_Init_ = (ComInit)Bios_getCom_intvec(); + com_Init_(&comInfos_); + + UsbMain_setComIterface(&comInfos_); + comInfos_.comSetUSB(&fetUsbInfos_); + + comInfos_.comSetHil(&_edt_Common_Methods); + comInfos_.comSetDcdc(&dcdcInfos_); + + return 0; +} + +void V3OP_ComInterfaceClear(void) +{ + comInfos_.comGetLayerVersion = _dummy_shortOutVoidIn; + comInfos_.comGetLayerVersionCmp = _dummy_shortOutVoidIn; + comInfos_.comConfig = _dummy_comConfig; + comInfos_.comTransmit = _dummy_comTransmit; + comInfos_.comReceive = _dummy_comReceive; + comInfos_.comClose = _dummy_voidOutVoidIn; + comInfos_.comSetHil = _dummy_comSetHil; + comInfos_.comSetDcdc = _dummy_comSetDcdc; + comInfos_.comSetUSB = _dummy_comSetUSB; + comInfos_.comLoop = _dummy_comLoop; + comInfos_.comSetCts = _dummy_comTransmit; + comInfos_.comClearCts = _dummy_comTransmit; + comInfos_.comSetRts = _dummy_voidOutVoidIn; + UsbMain_setComIterface(&comInfos_); +} + +//***************************************** +short V3OP_HalFpgaUpdate(void) +{ + HalFpgaUpdateFunc halFpgaUpdateCode = NULL; + short retVal; + + // check if rest vector is not FFFF and if a valid Hal/Programm signature was found + if(Bios_getHal_intvec() == 0xFFFF || Bios_getHal_signature() != 0xADACADAC || !V3OP_HalFpgaCrcOk()) + { + return -1; + } + + halFpgaUpdateCode = (HalFpgaUpdateFunc)Bios_getHal_intvec(); // calls the (modified) startup code of HAL + retVal = halFpgaUpdateCode(); // return update status, input parameters are don't care + + return retVal; +} + +//****************************************** +void V3OP_Scheduler(void) +{ + unsigned char loop_array_counter; + unsigned char rx_queu_counter = 0; + unsigned char rx_queu_counter_tmp; + StreamSafe stream_tmp; + HalFuncInOut pCallAddr; + + BIOS_ResetCts(); // release CTS line + { + // send error messages + if(BIOS_IsUsbRxError()) + { + V3OP_SendException(BIOS_getRxError().bios_rx_err_id_, BIOS_getRxError().bios_rx_err_code_, BIOS_getRxError().bios_rx_err_payload_); + BIOS_ClearUsbRxError(); + BIOS_ResetCts(); + } + // search for and execute "commands in loop" + + for(loop_array_counter = 0; loop_array_counter < V3OP_LOOP_ARRAY_COUNT; loop_array_counter++) + { + if((v3op_loop_array_[loop_array_counter].active) && + (v3op_loop_array_[loop_array_counter].addr < (*hal_infos_).hal_size)) + { + pCallAddr = (HalFuncInOut)(*hal_ptr_)[v3op_loop_array_[loop_array_counter].addr].function; + if(pCallAddr != NULL) + { + if(STREAM_out_init(v3op_loop_array_[loop_array_counter].msg_id, v3op_loop_array_[loop_array_counter].msg_type) >= 0) + { + STREAM_internal_stream(&v3op_loop_array_[loop_array_counter].indata[MESSAGE_EXECUTE_PAYLOAD_POS], v3op_loop_array_[loop_array_counter].indata[0]-3, (unsigned char*)0x0001, 0, &stream_tmp); + if(pCallAddr(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG) == 1) + { + STREAM_flush(); + if(v3op_loop_array_[loop_array_counter].flags & V3OP_LOOP_WAIT_FLAG) + { + V3OP_KillLoop(v3op_loop_array_[loop_array_counter].msg_id); + } + } + STREAM_external_stream(&stream_tmp); + } + } + } + } + + // test on new messages from dll and execute + rx_queu_counter_tmp = rx_queu_counter; + do + { + if(bios_rx_record_.state[rx_queu_counter] & BIOS_RX_RDY) + { + BIOS_LedFlash(BIOS_LED_MODE,20); + STREAM_in_init((BiosRxRecord*)&bios_rx_record_, rx_queu_counter); + rx_queu_counter_public_ = rx_queu_counter; + V3OP_Rx(bios_rx_record_.data[rx_queu_counter]); + rx_queu_counter = rx_queu_counter_public_; + bios_rx_record_.state[rx_queu_counter] &= ~BIOS_RX_RDY; + break; + } + rx_queu_counter++; + if(rx_queu_counter >= BIOS_RX_QUEUS) + { + rx_queu_counter = 0; + } + } + while(rx_queu_counter_tmp != rx_queu_counter); + } +} + +// System events +typedef enum FET_UPDATE_CONFIG +{ + FET_INIT_ALL_MODULES = 0, + FET_DE_INIT_ALL_MODULES, + FET_DE_INIT_DCDC_MCU, + FET_FPGA_UPDATE, + FET_STOP_VOLTAGE_SUPERVISION, + FET_START_VOLTAGE_SUPERVISION, +} FetUpdateConfig; + + +//! \brief lock/unlock write/erase to UIF (HAL) flash memory +//! \param[in] *payload pointer to receive buffer +//! \return 0 -> flash write/erase locked +//! \return 1 -> flash write/erase released +//! \return <0 -> error +short V3OP_CoreFlashFunctionInit(unsigned char *payload) +{ + short ret_value = -1; + + if(payload[4] == FET_INIT_ALL_MODULES) + { + // init communicaiton to DCDC sub mcu + V3OP_DcdcInterfaceInit(); + dcdcInfos_.dcdcRestart(Bios_getTool_id()); + // will init hil layer as well if valid + V3OP_HalInterfaceInit(); + V3OP_ComInterfaceInit(); + + BIOS_LedAlternate(0); + BIOS_LedOff(BIOS_LED_MODE); + BIOS_LedOn(BIOS_LED_POWER); + ret_value = 1; + } + else if(payload[4] == FET_DE_INIT_ALL_MODULES)//used for HAL HIL DCDC & COM Channel update + { + V3OP_KillAllLoops(); + V3OP_HalInterfaceClear(); + STREAM_resetSharedVariables(); + dcdcInfos_.dcdcPowerDown(); + V3OP_ComInterfaceClear(); + V3OP_DcdcInterfaceClear(); + BIOS_LedAlternate(30); + ret_value = 1; + } + else if(payload[4] == FET_DE_INIT_DCDC_MCU) // Just for Sub MCU update don't clear Hal HIl you need it for SBW communication + { + V3OP_KillAllLoops(); + STREAM_resetSharedVariables(); + dcdcInfos_.dcdcPowerDown(); + V3OP_DcdcInterfaceClear(); + BIOS_LedAlternate(30); + ret_value = 1; + } + else if(payload[4] == FET_FPGA_UPDATE) // Used for FPGA updates + { + V3OP_KillAllLoops(); + V3OP_HalInterfaceClear(); + STREAM_resetSharedVariables(); + dcdcInfos_.dcdcPowerDown(); + V3OP_ComInterfaceClear(); + V3OP_DcdcInterfaceClear(); + IccMonitor_StopDcdcOvercurrentDetection(); + BIOS_LedAlternate(5); + ret_value = V3OP_HalFpgaUpdate() ? -1 : 1; + } + else if(payload[4] == FET_STOP_VOLTAGE_SUPERVISION) // Used for FPGA updates + { + V3OP_KillAllLoops(); + IccMonitor_StopVoltageSupervision(); + IccMonitor_StopDcdcOvercurrentDetection(); + BIOS_LedAlternate(30); + ret_value = 1; + } + else if(payload[4] == FET_START_VOLTAGE_SUPERVISION) // Used for FPGA updates + { + IccMonitor_StartDcdcOvercurrentDetection(); + BIOS_LedOff(BIOS_LED_MODE); + BIOS_LedOn(BIOS_LED_POWER); + //~1.6 s delay + __delay_cycles(40000000); + IccMonitor_StartVoltageSupervision(); + __delay_cycles(40000000); + ret_value = 1; + } + return(ret_value); +} + +#ifdef MSP_FET +#pragma optimize = low +#pragma vector=WDT_VECTOR +__interrupt void TimeoutFpgaShift_(void) +{ + SFRIFG1 &= ~WDTIFG; + + if(STREAM_out_init(0, RESPTYP_STATUS) != EXCEPTION_TX_NO_BUFFER) + { + STREAM_put_word(FET_FPGA_TIMOUT); + STREAM_flush(); + } + _edt_Common_Methods.setFpgaTimeOut(1); +} +#endif diff --git a/Bios/src/fw/fet/v3_0p.h b/Bios/src/fw/fet/v3_0p.h new file mode 100644 index 0000000..7b9048e --- /dev/null +++ b/Bios/src/fw/fet/v3_0p.h @@ -0,0 +1,88 @@ +/* + * v3_0p.h + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULBIOS +//! \file v3_0p.h +//! \brief + +#ifndef _V3_0P_HEADER_ +#define _V3_0P_HEADER_ + +#include "stream.h" + +#define V3OP_LOOP_WAIT_FLAG 0x01 +#define V3OP_LOOP_ARRAY_COUNT 4 + +struct _V3opLoopArray_ +{ + unsigned short addr; + unsigned char *indata; + unsigned char flags; + unsigned char msg_id; + unsigned char msg_type; + unsigned char active; +}; +typedef struct _V3opLoopArray_ V3opLoopArray; +typedef HalRec (*HAL_REC_ARRAY)[]; + +#define HAL_FUNCTION_PTR(x) short (*x)(unsigned short) +typedef HAL_FUNCTION_PTR(HalFuncInOut); + +// functions +short V3OP_Rx(unsigned char *str); +short V3OP_SendException(unsigned char msg_id, unsigned short code, unsigned short *payload); +short V3OP_SetLoop(unsigned char *payload_incl_addr, unsigned char flags); +short V3OP_KillLoop(unsigned char msg_id); +short V3OP_PauseLoop(unsigned char msg_id); +short V3OP_ResumeLoop(unsigned char msg_id); +void V3OP_KillAllLoops(void); + +void V3OP_Scheduler(void); + +short V3OP_HalInterfaceClear(void); +short V3OP_HalInterfaceInit(void); + +void V3OP_DcdcInterfaceClear(void); +short V3OP_DcdcInterfaceInit(void); + +short V3OP_ComInterfaceInit(void); +void V3OP_ComInterfaceClear(void); + +short V3OP_HalFpgaUpdate(void); +void V3OP_HwReset(void); + +short V3OP_CoreFlashFunctionInit(unsigned char *payload); + +#endif // _V3_0P_HEADER_ diff --git a/Bios/src/fw/fet/v3_0p_hw_fet.c b/Bios/src/fw/fet/v3_0p_hw_fet.c new file mode 100644 index 0000000..aa81393 --- /dev/null +++ b/Bios/src/fw/fet/v3_0p_hw_fet.c @@ -0,0 +1,534 @@ +/* + * v3_0p_hw_nguif.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULBIOS +//! \file v3_0p_hw_uif.c +//! \brief Bios included HAL (zero) and update function +//! \li forwarding (execute) messages to HAL +//! \li upload of HAL macros +//! \li loop management + +#include "hw_compiler_specific.h" +#include + +#include "bios.h" +#include "v3_0p.h" +#include "HAL_FLASH.h" +#include "MemorySegments.h" +#include "../../hil/msp_fet/archFpga.h" +#include "../fet/v3_0p_hw_fet.h" + +#include "USB_API/USB_Common/types.h" +#include "USB_API/USB_Common/usb.h" //USB-specific functions +#include "F5xx_F6xx_Core_Lib/HAL_UCS.h" + + +unsigned short calculateCrc(unsigned short sum, unsigned short *adress, unsigned long segmentLength) +{ + //Initialize CRC register + CRCINIRES = sum; + + //Compute CRC over the given segment + while (segmentLength--) + { + CRCDIRB = *adress++; + } + //Return CRC result + return CRCINIRES; +} + +unsigned short V3OP_GetHilCrc() +{ + unsigned short hilCrc = 0x0000; + unsigned long segmentLength = 0; + unsigned short *address = 0; + + //calculate CRC for HIL info segment 1 ------------------------------------- + segmentLength = (CHECKSUM_HIL[0] - INFO_SEGMENTS_HIL[0])/2; + address = (unsigned short*)INFO_SEGMENTS_HIL[0]; + hilCrc = calculateCrc(hilCrc, address, segmentLength); + + //calculate CRC for HIL info segment 2 + segmentLength = (INFO_SEGMENTS_HIL[1] - CHECKSUM_HIL[1])/2; + address = (unsigned short*)(CHECKSUM_HIL[1] + 1); + hilCrc = calculateCrc(hilCrc, address, segmentLength); + + //calculate CRC for HIL main segment + segmentLength = (HIL_SEGMENTS[1] - HIL_SEGMENTS[0]+1)/2; + address = (unsigned short*)HIL_SEGMENTS[0]; + hilCrc = calculateCrc(hilCrc, address, segmentLength); + +#ifdef MSP_FET + //calculate CRC for Hil main segment 2 + segmentLength = (HIL_SEGMENTS[3] - HIL_SEGMENTS[2] + 1)/2; + address = (unsigned short*)HIL_SEGMENTS[2]; + hilCrc = calculateCrc(hilCrc, address, segmentLength); +#endif + //-------------------------------------------------------------------------- + + return hilCrc; +} + +unsigned short V3OP_GetHalFpgaCrc() +{ + unsigned short halCrc = 0x0000; +#ifdef MSP_FET + unsigned long segmentLength = 0; + unsigned short *address = 0; + + //calculate CRC for Hal info segment 1 -------------------------------------- + segmentLength = (CHECKSUM_HAL[0] - INFO_SEGMENTS_HAL[0])/2; + address = (unsigned short*)INFO_SEGMENTS_HAL[0]; + halCrc = calculateCrc(halCrc, address, segmentLength); + //calculate CRC for Hal info segment 2 + segmentLength = (INFO_SEGMENTS_HAL[1] - CHECKSUM_HAL[1])/2; + address = (unsigned short*)(CHECKSUM_HAL[1] + 1); + halCrc = calculateCrc(halCrc, address, segmentLength); + + //calculate CRC for Hal main segment 1 + segmentLength = (HAL_FPGA_SEGMENTS[1] - HAL_FPGA_SEGMENTS[0] + 1)/2; + address = (unsigned short*)HAL_FPGA_SEGMENTS[0]; + halCrc = calculateCrc(halCrc, address, segmentLength); + //-------------------------------------------------------------------------- +#endif + return halCrc; +} + +unsigned short V3OP_GetHalCrc() +{ + unsigned short halCrc = 0x0000; + unsigned long segmentLength = 0; + unsigned short *address = 0; + + //calculate CRC for Hal info segment 1 -------------------------------------- + segmentLength = (CHECKSUM_HAL[0] - INFO_SEGMENTS_HAL[0])/2; + address = (unsigned short*)INFO_SEGMENTS_HAL[0]; + halCrc = calculateCrc(halCrc, address, segmentLength); + //calculate CRC for Hal info segment 2 + segmentLength = (INFO_SEGMENTS_HAL[1] - CHECKSUM_HAL[1])/2; + address = (unsigned short*)(CHECKSUM_HAL[1] + 1); + halCrc = calculateCrc(halCrc, address, segmentLength); + + //calculate CRC for Hal main segment 1 + segmentLength = (HAL_SEGMENTS[1] - HAL_SEGMENTS[0] + 1)/2; + address = (unsigned short*)HAL_SEGMENTS[0]; + halCrc = calculateCrc(halCrc, address, segmentLength); +#ifdef eZ_FET + //calculate CRC for Hal main segment 2 + segmentLength = (HAL_SEGMENTS[3] - HAL_SEGMENTS[2] + 1)/2; + address = (unsigned short*)HAL_SEGMENTS[2]; + halCrc = calculateCrc(halCrc, address, segmentLength); +#endif + //-------------------------------------------------------------------------- + + return halCrc; +} + +unsigned short V3OP_GetCoreCrc() +{ + unsigned short coreCrc = 0x0000; + unsigned long segmentLength = 0; + unsigned short *address = 0; + + //calculate CRC for core info segment 1 ------------------------------------ + segmentLength = (CHECKSUM_CORE[0] - CORE_SEGMENTS[0])/2; + address = (unsigned short*)CORE_SEGMENTS[0]; + coreCrc = calculateCrc(coreCrc, address, segmentLength); + + //calculate CRC for core main segment + segmentLength = (CORE_SEGMENTS[1] - CHECKSUM_CORE[1] + 1)/2; + address = (unsigned short*) (CHECKSUM_CORE[1] + 1); + coreCrc = calculateCrc(coreCrc, address, segmentLength); + + //calculate CRC for reset vector segment + segmentLength = (CORE_SEGMENTS_RESET[1] - CORE_SEGMENTS_RESET[0] + 1)/2; + address = (unsigned short*)CORE_SEGMENTS_RESET[0]; + coreCrc = calculateCrc(coreCrc, address, segmentLength); + //-------------------------------------------------------------------------- + + return coreCrc; +} + +unsigned short V3OP_GetDcdcCrc() +{ + unsigned short dcdcCrc = 0x0000; + unsigned long segmentLength = 0; + unsigned short *address = 0; + + //calculate CRC for dcdc info segment 1 ------------------------------------- + segmentLength = (CHECKSUM_DCDC[0] - INFO_SEGMENTS_DCDC[0])/2; + address = (unsigned short*)INFO_SEGMENTS_DCDC[0]; + dcdcCrc = calculateCrc(dcdcCrc, address, segmentLength); + + //calculate CRC for dcdc info segment 1 + segmentLength = (INFO_SEGMENTS_DCDC[1] - CHECKSUM_DCDC[1])/2; + address = (unsigned short*)(CHECKSUM_DCDC[1] + 1); + dcdcCrc = calculateCrc(dcdcCrc, address, segmentLength); + + //calculate CRC for dcdc main segment + segmentLength = (DCDC_SEGMENTS[1] - DCDC_SEGMENTS[0] + 1)/2; + address = (unsigned short*)DCDC_SEGMENTS[0]; + dcdcCrc = calculateCrc(dcdcCrc, address, segmentLength); + //-------------------------------------------------------------------------- + + return dcdcCrc; +} + +unsigned short V3OP_GetComChannelCrc() +{ + unsigned short comChannelCrc = 0x0000; + unsigned long segmentLength = 0; + unsigned short *address = 0; + + //calculate CRC for comchannel info segment 1 ------------------------------------- + segmentLength = (CHECKSUM_COMCHANNEL[0] - INFO_SEGMENTS_COMCHANNEL[0])/2; + address = (unsigned short*)INFO_SEGMENTS_COMCHANNEL[0]; + comChannelCrc = calculateCrc(comChannelCrc, address, segmentLength); + + //calculate CRC for comchannel info segment 1 + segmentLength = (INFO_SEGMENTS_COMCHANNEL[1] - CHECKSUM_COMCHANNEL[1])/2; + address = (unsigned short*)(CHECKSUM_COMCHANNEL[1] + 1); + comChannelCrc = calculateCrc(comChannelCrc, address, segmentLength); + + //calculate CRC for comchannel main segment + segmentLength = (COMCHANNEL_SEGMENTS[1] - COMCHANNEL_SEGMENTS[0] + 1)/2; + address = (unsigned short*)COMCHANNEL_SEGMENTS[0]; + comChannelCrc = calculateCrc(comChannelCrc, address, segmentLength); + //-------------------------------------------------------------------------- + + return comChannelCrc; +} + +unsigned char V3OP_HilCrcOk() +{ + return(V3OP_GetHilCrc() == *((unsigned short*)CHECKSUM_HIL[0])); +} + +unsigned char V3OP_HalCrcOk() +{ + return(V3OP_GetHalCrc() == *((unsigned short*)CHECKSUM_HAL[0])); +} + +unsigned char V3OP_HalFpgaCrcOk() +{ + return(V3OP_GetHalFpgaCrc() == *((unsigned short*)CHECKSUM_HAL[0])); +} + +unsigned char V3OP_coreCrcOk() +{ + return(V3OP_GetCoreCrc() == *((unsigned short*)CHECKSUM_CORE[0])); +} + +unsigned char V3OP_DcdcCrcOk() +{ + return(V3OP_GetDcdcCrc() == *((unsigned short*)CHECKSUM_DCDC[0])); +} + +unsigned char V3OP_ComChannelCrcOk() +{ + return(V3OP_GetComChannelCrc() == *((unsigned short*)CHECKSUM_COMCHANNEL[0])); +} +//! \brief test address on memory type +//! \param[in] addr address to test +//! \return 0 -> flash memory +//! \return 1 -> info memory +//! \return 2 -> RAM +#pragma optimize = low +unsigned long V3OP_GetSegmentType(unsigned long addr) +{ + unsigned short i = 0; + for(i = 0; i < (sizeof(INFO_SEGMENTS_HIL)/sizeof(unsigned long)); i+=2) + { + if((addr >= INFO_SEGMENTS_HIL[i]) && (addr <= INFO_SEGMENTS_HIL[i+1])) + { + return (INFO_SEGMENT_HIL); + } + } + for(i = 0; i < (sizeof(INFO_SEGMENTS_HAL)/sizeof(unsigned long)); i+=2) + { + if((addr >= INFO_SEGMENTS_HAL[i]) && (addr <= INFO_SEGMENTS_HAL[i+1])) + { + return (INFO_SEGMENT_HAL); + } + } + for(i = 0; i < (sizeof(HAL_SEGMENTS)/sizeof(unsigned long)); i+=2) + { + if((addr >= HAL_SEGMENTS[i]) && (addr <= HAL_SEGMENTS[i+1])) + { + return (HAL_SEGMENT); + } + } + #ifdef MSP_FET + for(i = 0; i < (sizeof(HAL_FPGA_SEGMENTS)/sizeof(unsigned long)); i+=2) + { + if((addr >= HAL_FPGA_SEGMENTS[i]) && (addr <= HAL_FPGA_SEGMENTS[i+1])) + { + return (HAL_SEGMENT_FPGA); + } + } + #endif + for(i = 0; i < (sizeof(HIL_SEGMENTS)/sizeof(unsigned long)); i+=2) + { + if((addr >= HIL_SEGMENTS[i]) && (addr <= HIL_SEGMENTS[i+1])) + { + return (HIL_SEGMENT); + } + } + // dcdc segments + for(i = 0; i < (sizeof(DCDC_SEGMENTS)/sizeof(unsigned long)); i+=2) + { + if((addr >= DCDC_SEGMENTS[i]) && (addr <= DCDC_SEGMENTS[i+1])) + { + return (DCDC_SEGMENT); + } + } + for(i = 0; i < (sizeof(INFO_SEGMENTS_DCDC)/sizeof(unsigned long)); i+=2) + { + if((addr >= INFO_SEGMENTS_DCDC[i]) && (addr <= INFO_SEGMENTS_DCDC[i+1])) + { + return (INFO_SEGMENT_DCDC); + } + } + // comchannel segments + for(i = 0; i < (sizeof(COMCHANNEL_SEGMENTS)/sizeof(unsigned long)); i+=2) + { + if((addr >= COMCHANNEL_SEGMENTS[i]) && (addr <= COMCHANNEL_SEGMENTS[i+1])) + { + return (COMCHANNEL_SEGMENT); + } + } + // INFO comchannel segments + for(i = 0; i < (sizeof(INFO_SEGMENTS_COMCHANNEL)/sizeof(unsigned long)); i+=2) + { + if((addr >= INFO_SEGMENTS_COMCHANNEL[i]) && (addr <= INFO_SEGMENTS_COMCHANNEL[i+1])) + { + return (INFO_SEGMENT_COMCHANNEL); + } + } + return 0; +} + +//! \brief test address on write access +//! \param[in] addr address to test +//! \return 0 -> no write access +//! \return 1 -> write allow +unsigned char V3OP_WriteAllowed(unsigned short addr) +{ + return(0); +} +//! \brief test address on erase access +//! \param[in] addr address to test +//! \return 0 -> no erase access +//! \return 1 -> erase allow +unsigned char V3OP_EraseAllowed(unsigned short StartAddr) +{ + return(0); +} + +//! \brief erase on UIF (HAL) all blocks which included in start address + size +//! \param[in] *payload pointer to receive buffer +//! \return 1 -> flash erase done +//! \return <0 -> error +#pragma optimize = low +short V3OP_CoreFlashFunctionErase(unsigned char *payload) +{ + unsigned long address_pointer; + unsigned long start_addr = (*(unsigned long*)&payload[4] & 0xFFFFF); + unsigned long end_addr = start_addr + (*(unsigned long*)&payload[8] & 0xFFFFF)-2; + unsigned char segment_type; + unsigned long segmentSize =0; + + segment_type = V3OP_GetSegmentType(start_addr); + + if(segment_type == NO_SEGMENT) + { + return -1; + } + + // erase INFO mem + if(segment_type == HAL_SEGMENT || segment_type == INFO_SEGMENT_HAL) + { + segmentSize = SEGMENT_SIZE_HAL_HIL; + // First erase entry point into Hil Layer + // IF firmware update is interrupted HIL could not be started + Flash_SegmentErase((unsigned short*)INFO_SEGMENTS_HAL[1]); + } + + if(segment_type == HIL_SEGMENT || segment_type == INFO_SEGMENT_HIL) + { + segmentSize = SEGMENT_SIZE_HAL_HIL; + // First erase entry point into HAL Layer + // IF firmware update is interrupted HAL could not be started + Flash_SegmentErase((unsigned short*)INFO_SEGMENTS_HIL[0]); + } + + if(segment_type == INFO_SEGMENT_DCDC || segment_type == DCDC_SEGMENT) + { + segmentSize = SEGMENT_SIZE_HAL_HIL; + // First erase entry point into HAL Layer + // IF firmware update is interrupted HAL could not be started + Flash_SegmentErase((unsigned short*)INFO_SEGMENTS_DCDC[0]); + } + + if(segment_type == COMCHANNEL_SEGMENT || segment_type == INFO_SEGMENT_COMCHANNEL) + { + segmentSize = SEGMENT_SIZE_HAL_HIL; + // First erase entry point into HAL Layer + // IF firmware update is interrupted HAL could not be started + UnlockInfoA(); + Flash_SegmentErase((unsigned short*)INFO_SEGMENTS_COMCHANNEL[0]); + } + + // Erase HIL/HAL/DCDC/COM + for(address_pointer = start_addr; address_pointer < end_addr; address_pointer += segmentSize) + { + if(V3OP_GetSegmentType(address_pointer) != NO_SEGMENT) + { + Flash_SegmentErase((unsigned short*)address_pointer); + } + } + + // Do erase check of HIL/HAL/DCDC + for(address_pointer = start_addr; address_pointer < end_addr; address_pointer += segmentSize) + { + if(V3OP_GetSegmentType(address_pointer) != NO_SEGMENT) + { + Flash_EraseCheck((unsigned char*)address_pointer, (segmentSize+1)); // (unsigned long *Flash_ptr, unsigned long len) + } + } + LockInfoA(); + return(1); +} +//! \brief write payload to UIF (HAL) flash memory, RAM is allowed, too +//! \param[in] *payload pointer to receive buffer +//! \details on first function call the: +//! \li bytes 4 -7: the flash address +//! \li bytes 8 -11: data length +//! \li bytes 12 ... payload +//! \details if data length is larger then message size the function returns after writing the message. Direct follow calls +//! of this function continue writing. +//! \return 1 -> flash write done +//! \return <0 -> error +#pragma optimize = low +short V3OP_CoreFlashFunctionWrite(unsigned char *payload, unsigned short v30p_stream_flags_) +{ + static unsigned long address_pointer; + static unsigned long start_addr = 0; //(*(unsigned long*)&payload[4] & 0xFFFFF); + static unsigned long end_addr = 0; //start_addr + (*(unsigned long*)&payload[8] & 0xFFFFF); + unsigned char segment_type; + unsigned short *data_ptr = NULL; + unsigned short *data_ptr_end = NULL; + static unsigned long segmentSize =0; + + + if(v30p_stream_flags_ & MESSAGE_NEW_MSG) + { + start_addr = (*(unsigned long*)&payload[4] & 0xFFFFF); + end_addr = start_addr + (*(unsigned long*)&payload[8] & 0xFFFFF); + data_ptr = (unsigned short*)&payload[12]; + data_ptr_end = data_ptr + (payload[0] - 11) / sizeof(unsigned short); // write words /2 + segment_type = V3OP_GetSegmentType(start_addr); + + if(segment_type == NO_SEGMENT) + { + return -1; + } + // 2 bytes are written in one line + segmentSize = 2; + address_pointer = start_addr; + UnlockInfoA(); + } + else + { + data_ptr = (unsigned short*)&payload[4]; + data_ptr_end = data_ptr + (payload[0] - 3) / sizeof(unsigned short); + LockInfoA(); + } + for(;(address_pointer < end_addr) && (data_ptr < (data_ptr_end)); address_pointer += segmentSize) + { + // check if wirte is going into info or HAL/Hil segment + // don't programm any core segment + if(V3OP_GetSegmentType(address_pointer) != NO_SEGMENT) + { + FlashWrite_16(data_ptr, (unsigned short*)address_pointer, 1); + data_ptr++; + } + } + return 0; +} + +//! \brief reads UIF memory, inclusive BIOS area +//! \param[in] *payload pointer to receive buffer +//! \li bytes 4 -7: the flash address +//! \li bytes 8 -11: data length +//! \return 0 +short V3OP_CoreFlashFunctionRead(unsigned char *payload) +{ + return(0); +} + +void V3OP_UpCore(void) +{ + _DINT_FET(); // Ensure no application interrupts fire during stop + USB_disconnect(); + FPGA_RESET_ASSERT + //~1.6 s delay + __delay_cycles(40000000); + + USB_disable(); + XT2_Stop(); + //erase infoB + Flash_SegmentErase((unsigned short*)0x197F); + //erase infoC + Flash_SegmentErase((unsigned short*)0x18FF); + //erase infoD + Flash_SegmentErase((unsigned short*)0x187F); + // erase flash reset vector to invoke usb bsl by next startup + Flash_SegmentErase((unsigned short*)0xFFFE); + + //~1.6 s delay + __delay_cycles(40000000); + PMMCTL0 = PMMPW | PMMSWBOR; // generate BOR for reseting device +} + +unsigned short V3OP_SystemOk(void) +{ + if(!V3OP_coreCrcOk()) + { + Flash_SegmentErase((unsigned short*)0xFFFE); + return 0; + } + return 1; +} diff --git a/Bios/src/fw/fet/v3_0p_hw_fet.h b/Bios/src/fw/fet/v3_0p_hw_fet.h new file mode 100644 index 0000000..d92a1e7 --- /dev/null +++ b/Bios/src/fw/fet/v3_0p_hw_fet.h @@ -0,0 +1,67 @@ +/* + * v3_0p_hw_nguif.h + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULBIOS +//! \file v3_0p_hw_uif.h +//! \brief +#ifndef V3_0P_HW_FET_H_ +#define V3_0P_HW_FET_H_ + +unsigned long V3OP_GetSegmentType(unsigned long addr); +unsigned char V3OP_pWriteAllowed(unsigned short addr); +unsigned char V3OP_EraseAllowed(unsigned short addr); + +short V3OP_CoreFlashFunctionErase(unsigned char *payload); +short V3OP_CoreFlashFunctionWrite(unsigned char *payload,unsigned short v30p_stream_flags_); +short V3OP_CoreFlashFunctionRead(unsigned char *payload); +void V3OP_UpCore(void); + +unsigned short V3OP_GetHilCrc(); +unsigned short V3OP_GetHalCrc(); +unsigned short V3OP_GetCoreCrc(); +unsigned short V3OP_GetDcdcCrc(); +unsigned short V3OP_GetComChannelCrc(); +unsigned short V3OP_GetHalFpgaCrc(); + +unsigned char V3OP_HilCrcOk(); +unsigned char V3OP_HalCrcOk(); +unsigned char V3OP_CoreCrcOk(); +unsigned char V3OP_DcdcCrcOk(); +unsigned char V3OP_ComChannelCrcOk(); +unsigned char V3OP_HalFpgaCrcOk(); + +unsigned short V3OP_SystemOk(void); + +#endif /* V3_0P_HW_FET_H_ */ diff --git a/Bios/src/fw/uifv1/HalGlobalVars.h b/Bios/src/fw/uifv1/HalGlobalVars.h new file mode 100644 index 0000000..8fbadab --- /dev/null +++ b/Bios/src/fw/uifv1/HalGlobalVars.h @@ -0,0 +1,45 @@ +/* + * HalGlobalVars432.h + * + * + * + * Copyright (C) 2012 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. + */ + + +//! \ingroup MODULHAL +//! \file HalGlobalVars432.h + +#define HAL_ADDR_VAR_HAL_INFOS_IN_RAM 0x1114 +#define HAL_ADDR_VAR_HAL_FUNCTION 0x1146 +#define HAL_ADDR_CONST_HAL_INFOS 0x253A +#define HAL_ADDR_CONST_HAL_FUNCTION_DEFAULTS 0x2548 diff --git a/Bios/src/hal/HalGlobalVars.c b/Bios/src/fw/uifv1/HalGlobalVars430.c similarity index 69% rename from Bios/src/hal/HalGlobalVars.c rename to Bios/src/fw/uifv1/HalGlobalVars430.c index 9126b5a..5bfc615 100644 --- a/Bios/src/hal/HalGlobalVars.c +++ b/Bios/src/fw/uifv1/HalGlobalVars430.c @@ -1,74 +1,58 @@ /* * HalGlobalVars.c - * + * * * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - -//! \ingroup MODULHAL -//! \file HalGlobalVars.c -//! \brief -//! -//! \author Detlef Fink (03/10/2011) - #include "hw_compiler_specific.h" #include #include "stream.h" #include "hal.h" #include "HalGlobalVars.h" - -extern unsigned char TCLK_saved; -extern unsigned char current_Instr; -#ifndef UNIX -extern struct stream_funcs *_stream_Funcs; -#endif extern HAL_INFOS hal_infos_in_ram_; -extern unsigned char mclk_modules[16]; -extern union _chain_Configuration chain_Configuration[32]; +extern unsigned char mclk_modules[32]; extern unsigned short activeDevice; extern unsigned char numOfDevices; extern unsigned short TCE; -extern unsigned short _hal_mclkCntrl0; +extern unsigned long _hal_mclkCntrl0; extern unsigned short gprotocol_id; extern unsigned short bVccOn; extern char bIccMonitorOn; // Icc Monitor is switched on by default extern char bHighCurrent; -extern unsigned long hil_device_flags_; extern signed short last_ext_vcc; -extern unsigned char over_current_count; +extern unsigned short over_current_count; extern unsigned short last_vcc; extern unsigned long lAddr; extern unsigned long lLen; @@ -77,44 +61,32 @@ extern unsigned short ret_len; extern DeviceSettings deviceSettings; extern DevicePowerSettings devicePowerSettings; extern unsigned short altRomAddressForCpuRead; +extern unsigned short wdtctlAddress5xx; void globalVarsInit(void) { - // hil_2w.c - TCLK_saved = 0; - current_Instr = 0; - - // halmain.c -#ifndef UNIX - _stream_Funcs = NULL; -#endif + // used by halmain memset(&hal_infos_in_ram_, 0, sizeof(HAL_INFOS)); - - //SyncJtagAssertPor_SaveContextXv2.c + + // used SyncJtagAssertPor_SaveContextXv2 for module clock control memset(mclk_modules, 0, sizeof(mclk_modules)); - - // hal.c - memset(&chain_Configuration, 0, sizeof(chain_Configuration)); - activeDevice = 0; - numOfDevices = 0; - TCE = 0; + _hal_mclkCntrl0 = 0x0417; - - // hil.c + gprotocol_id = 0; - bVccOn = 3000; // Target Vcc is switched off by default + bVccOn = 3300; // Target Vcc is switched to 3.3V by default bIccMonitorOn = 1; bHighCurrent = 0; - hil_device_flags_ = 0; last_ext_vcc = 0; over_current_count = 0; last_vcc = 0; - + // Currently only sets clock control type to none memset(&deviceSettings, 0, sizeof(deviceSettings)); // Disable device power settings by default memset(&devicePowerSettings, 0, sizeof(devicePowerSettings)); - + altRomAddressForCpuRead = 1; + wdtctlAddress5xx = 0x015C; } diff --git a/Bios/src/fw/uifv1/HalGlobalVars432.c b/Bios/src/fw/uifv1/HalGlobalVars432.c new file mode 100644 index 0000000..2ffe68b --- /dev/null +++ b/Bios/src/fw/uifv1/HalGlobalVars432.c @@ -0,0 +1,78 @@ +/* + * HalGlobalVars432.c + * + * + * + * Copyright (C) 2012 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. + */ + + + +//! \ingroup MODULHAL +//! \file HalGlobalVars432.c +//! \brief + +#include "hw_compiler_specific.h" +#include +#include "stream.h" +#include "hal.h" +#include "HalGlobalVars.h" + +#ifndef UNIX +extern struct stream_funcs *_stream_Funcs; +#endif +extern HAL_INFOS hal_infos_in_ram_; +extern unsigned short gprotocol_id; +extern unsigned short bVccOn; +extern char bIccMonitorOn; // Icc Monitor is switched on by default +extern char bHighCurrent; +extern signed short last_ext_vcc; +extern unsigned short over_current_count; +extern unsigned short last_vcc; +extern unsigned long lAddr; +extern unsigned long lLen; +extern unsigned long lLenWBlk; +extern unsigned short ret_len; + +unsigned short targetIsRunning; + +void globalVarsInit(void) +{ + gprotocol_id = 0; + bVccOn = 3300; // Target Vcc is switched to 3.3V by default + bIccMonitorOn = 1; + bHighCurrent = 0; + last_ext_vcc = 0; + over_current_count = 0; + last_vcc = 0; + targetIsRunning = 0; +} diff --git a/Bios/src/fw/uifv1/bios.c b/Bios/src/fw/uifv1/bios.c index ca53311..f6f34bc 100644 --- a/Bios/src/fw/uifv1/bios.c +++ b/Bios/src/fw/uifv1/bios.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -49,12 +49,11 @@ #include "hw_compiler_specific.h" #include "bios.h" -#include "../v3_0p.h" -#include "../stream.h" +#include "v3_0p.h" +#include "stream.h" #include #include - -#define CORE_VERSION 0x000B +#include "uifVersion.h" typedef short (*HalFuncInOut)(unsigned short); @@ -62,10 +61,16 @@ typedef short (*HalFuncInOut)(unsigned short); //! \details this words indicate a valid bios const unsigned short identify_[3] @ "IDENTIFY" = {0x000F,0x2112,0xFEDF}; REQUIRED(identify_) -//! \brief version of bios code +//! \brief version of bios code const unsigned short core_version_ @ "COREVERSION" = CORE_VERSION; RO_PLACEMENT_NO_INIT volatile const unsigned short safe_core_version_ @ "SAFECOREVERSION"; +//MSP430 FET tool ID +#define TOOL_ID 0xCCCC + +const unsigned short tool_id_ @ "TOOLID" = TOOL_ID; +#pragma required=tool_id_ + //! \brief chars for flow control const unsigned char BIOS_DLE_CHAR = 0x10; //! \brief chars for flow control @@ -178,7 +183,7 @@ unsigned char *bios_rx_char_ptr_; //! \brief Flag for XON/XOFF status //! \li 0, TX can send //! \li 1, TX must not be send -//! \details between receiving xoff and sending chars is a delay (by program flow). This +//! \details between receiving xoff and sending chars is a delay (by program flow). This //! is not a problem, because the TUSB has enougth reserve in the buffer. unsigned char bios_xoff_ = 0; @@ -238,222 +243,132 @@ void biosInitSystem (void) // won't work without it P1DIR = 0; P2DIR = 0; P3DIR = 0; // Reset all ports direction to be inputs P4DIR = 0; P5DIR = 0; P6DIR = 0; - + P1SEL = 0; P2SEL = 0; P3SEL = 0; // Reset all ports selection P4SEL = 0; P5SEL = 0; P6SEL = 0; - + P1OUT = 0; P2OUT = 0; P3OUT = 0; //! 0; i--) __no_operation(); // Time for flag to set } - if((IFG1 & OFIFG) == 0) // XT2 found, it can be only on EASY - { // E2 - // drive TUSB3410 reset low - P4DIR |= BIT6; - IFG1 &= ~OFIFG; // Clear OSCFault flag again - BCSCTL2 |= SELM1 + SELS; // MCLK = XT2, provide clock for TUSB - // setup TUSB3410 clock - P5DIR |= BIT5; - P5SEL |= BIT5; - // here setup E2 specific stuff - crystal_ = CRYSTAL_E2; - baudmod_ = BAUDMOD_E2; - // Port1 - // P1.0 -> - // P1.1 -> - // P1.2 <- - // P1.3 <- URTS - // P1.4 <- UDTR - // P1.5 -> UDSR - // P1.6 -> UCTS - // P1.7 <- - // init handshake lines from MSP430 -> TUSB3410 - P1OUT &= ~BIT5; //! - // P2.1 -> - // P2.2 -> - // P2.3 -> - // P2.4 -> - // P2.5 -> SELT - // P2.6 -> TGTRST - // P2.7 -> - P2DIR = 0; - // Port3 - // P3.0 <- - // P3.1 <- - // P3.2 <- - // P3.3 <- - // P3.4 -> TXD - // P3.5 <- RXD - // P3.6 <- TXD backcannel unused, handled by TUSB3410 direct - // P3.7 <- RXD backcannel unused, handled by TUSB3410 direct - P3SEL |= BIT4 + BIT5; - P3DIR |= BIT4; - // Port4 - // P4.0 -> - // P4.1 -> - // P4.2 -> - // P4.3 -> - // P4.4 -> - // P4.5 -> - // P4.6 <- RST3410 - // P4.7 <- - P4OUT |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5; //! - // P5.1 -> TDI - // P5.2 <- TDO - // P5.3 -> TCK - // P5.4 <- - // P5.5 -> clk3410 - // P5.6 <- - // P5.7 <- - P5DIR |= BIT0 + BIT1 + BIT3; - bios_leds_[0].addr = &bios_led_dummy_; - bios_leds_[0].bit = BIT0; - bios_leds_[1].addr = &bios_led_dummy_; - bios_leds_[1].bit = BIT1; - for(j = 0; (j < 0xFFFF); j++) + + P3OUT &= ~BIT6; + BCSCTL1 |= XT2OFF; // XT2 off + BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL + _BIC_SR(OSCOFF); // turn on XT1 oscillator + // oscillator start, the fault flag must be at ten times valid, because the + // oscillator starts very slow and is for short times valid in this time, + // but faults again. + j = 0; + do + { + IFG1 &= ~OFIFG; + for (i = 0xFF; i>0; i--) { __no_operation(); } - P4DIR &= ~BIT6; // release TUSB3410 reset - // char set to rx input for xon/xoff - bios_rx_char_ptr_ = &bios_rx_char_; - // Rts map to software (xon/xoff - bios_xoff_ptr_ = &bios_xoff_; - bios_info_hw_0_ = INFO_E2_HW_0; - bios_info_hw_1_ = INFO_E2_HW_1; - bios_device_flags_ = DEVICE_FLAG_SBW2 | DEVICE_FLAG_EASY;; - // init timer b for 100hz interrupt - TBCCTL0 = 0; - TBCCR0 = crystal_ / (8 * 100) - 1; - TBCTL = TBSSEL_2 | ID_3 | MC_1 | TBCLR | TBIE; // alck, div 8, up-mode, clear, irq on - } - else - { // U1 - P3OUT &= ~BIT6; - BCSCTL1 |= XT2OFF; // XT2 off - BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL - _BIC_SR(OSCOFF); // turn on XT1 oscillator - // oscillator start, the fault flag must be at ten times valid, because the - // oscillator starts very slow and is for short times valid in this time, - // but faults again. - j = 0; - do + if(IFG1 & OFIFG) { - IFG1 &= ~OFIFG; - for (i = 0xFF; i>0; i--) - { - __no_operation(); - } - if(IFG1 & OFIFG) - { - j = 0; - } - else - { - j++; - } + j = 0; + } + else + { + j++; } - while (j < 10); - IE1 |= OFIE; // restart the oscillator on fault - BCSCTL2 |= SELM1+SELM0; // HF XTAL (safe) - // here setup U1 specific stuff - crystal_ = CRYSTAL_U1; - baudmod_ = 0x57; //BAUDMOD_U1; - // Port1 - // P1.0 -> MODE - // P1.1 -> POWER - // P1.2 <- nc - // P1.3 <- nc - // P1.4 <- ??? - // P1.5 -> UDSR - // P1.6 -> UCTS - // P1.7 <- MU2 - P1OUT = ~(unsigned char)(BIT0+BIT1); //! TUSB3410 - P1OUT &= ~BIT5; - P1OUT |= BIT6; // set CTS to block receiving anything from TUSB (RX overflow on start up problem) - P1DIR |= (BIT5+BIT6); - // Port2 - // P2.0 -> - // P2.1 -> - // P2.2 -> - // P2.3 -> - // P2.4 -> - // P2.5 -> SELT - // P2.6 -> TGTRST - // P2.7 -> - P2OUT |= (BIT5+BIT6); //! TXD - // P3.5 <- RXD - // P3.6 <- Rst3410 - // P3.7 <- - P3SEL |= (BIT4 + BIT5); - P3DIR |= (BIT4); - // Port4 - // P4.0 -> TEST - // P4.1 <- - // P4.2 -> ENTDI2TDO - // P4.3 -> VCCTON - // P4.4 -> TDIOFF - // P4.5 -> VF2TDI - // P4.6 -> VF2TEST - // P4.7 <- - P4OUT |= (BIT0+BIT2+BIT4); //! TMS - // P5.1 -> TDI - // P5.2 <- TDO - // P5.3 -> TCK - // P5.4 <- - // P5.5 <- - // P5.6 <- - // P5.7 <- - P5DIR |= (BIT0+BIT1+BIT3); - bios_leds_[0].addr = (unsigned char*)&P1OUT; - bios_leds_[0].bit = BIT0; - bios_leds_[1].addr = (unsigned char*)&P1OUT; - bios_leds_[1].bit = BIT1; - // char set to rx input for xon/xoff - bios_rx_char_ptr_ = &bios_rx_char_; - // Rts map to software (xon/xoff - bios_xoff_ptr_ = &bios_xoff_; - // sw & hw infos - bios_info_hw_0_ = INFO_U1_HW_0; - bios_info_hw_1_ = INFO_U1_HW_1; - bios_device_flags_ = DEVICE_FLAG_SBW2 | DEVICE_FLAG_SBW4 | DEVICE_FLAG_XONOFF; - // init timer b for 100hz interrupt - TBCCTL0 = 0; - TBCCR0 = crystal_ / (8 * 100) - 1; - TBCTL = TBSSEL_1 | ID_3 | MC_1 | TBCLR | TBIE; // alck, div 8, up-mode, clear, irq on - P3OUT |= BIT6; // release TUSB3410 } + while (j < 10); + IE1 |= OFIE; // restart the oscillator on fault + BCSCTL2 |= SELM1+SELM0; // HF XTAL (safe) + // here setup U1 specific stuff + crystal_ = CRYSTAL_U1; + baudmod_ = 0x57; //BAUDMOD_U1; + // Port1 + // P1.0 -> MODE + // P1.1 -> POWER + // P1.2 <- nc + // P1.3 <- nc + // P1.4 <- ??? + // P1.5 -> UDSR + // P1.6 -> UCTS + // P1.7 <- MU2 + P1OUT = ~(unsigned char)(BIT0+BIT1); //! TUSB3410 + P1OUT &= ~BIT5; + P1OUT |= BIT6; // set CTS to block receiving anything from TUSB (RX overflow on start up problem) + P1DIR |= (BIT5+BIT6); + // Port2 + // P2.0 -> + // P2.1 -> + // P2.2 -> + // P2.3 -> + // P2.4 -> + // P2.5 -> SELT + // P2.6 -> TGTRST + // P2.7 -> + P2OUT |= (BIT5+BIT6); //! TXD + // P3.5 <- RXD + // P3.6 <- Rst3410 + // P3.7 <- + P3SEL |= (BIT4 + BIT5); + P3DIR |= (BIT4); + // Port4 + // P4.0 -> TEST + // P4.1 <- + // P4.2 -> ENTDI2TDO + // P4.3 -> VCCTON + // P4.4 -> TDIOFF + // P4.5 -> VF2TDI + // P4.6 -> VF2TEST + // P4.7 <- + P4OUT |= (BIT0+BIT2+BIT4); //! TMS + // P5.1 -> TDI + // P5.2 <- TDO + // P5.3 -> TCK + // P5.4 <- + // P5.5 <- + // P5.6 <- + // P5.7 <- + P5DIR |= (BIT0+BIT1+BIT3); + bios_leds_[0].addr = (unsigned char*)&P1OUT; + bios_leds_[0].bit = BIT0; + bios_leds_[1].addr = (unsigned char*)&P1OUT; + bios_leds_[1].bit = BIT1; + // char set to rx input for xon/xoff + bios_rx_char_ptr_ = &bios_rx_char_; + // Rts map to software (xon/xoff + bios_xoff_ptr_ = &bios_xoff_; + // sw & hw infos + bios_info_hw_0_ = INFO_U1_HW_0; + bios_info_hw_1_ = INFO_U1_HW_1; + bios_device_flags_ = DEVICE_FLAG_SBW2 | DEVICE_FLAG_SBW4 | DEVICE_FLAG_XONOFF; + // init timer b for 100hz interrupt + TBCCTL0 = 0; + TBCCR0 = crystal_ / (8 * 100) - 1; + TBCTL = TBSSEL_1 | ID_3 | MC_1 | TBCLR | TBIE; // alck, div 8, up-mode, clear, irq on + P3OUT |= BIT6; // release TUSB3410 __enable_interrupt(); } //! \brief restore Xt1 clocks -//! \details if a ozcillator fault occur, the fault flag is cleared and the +//! \details if a ozcillator fault occur, the fault flag is cleared and the //! SMCLOCK switch back to XT1 source INTERRUPT(NMI_VECTOR)void nmiIsr (void) { @@ -568,7 +483,7 @@ short biosLedAlternate(unsigned short time) { bios_leds_[0].mode = BIOS_LED_OFF; bios_leds_[1].mode = BIOS_LED_OFF; - } + } ENABLE_INTERRUPT; return(0); } @@ -595,7 +510,7 @@ INTERRUPT(TIMERB1_VECTOR) void timerB1Isr (void) { bios_global_timer_[BIOS_TIMER_TX].count--; } - // LED mode + // LED mode DIAG_SUPPRESS(Pa082) if((bios_leds_[BIOS_LED_MODE].mode & BIOS_LED_ON) ^ (bios_leds_[BIOS_LED_MODE].counter > (bios_leds_[BIOS_LED_MODE].load/2))) { @@ -665,9 +580,9 @@ short biosHalInterfaceInit(void) HalMainFunc halStartUpCode = NULL; unsigned char cmd[6] = {0x05, CMDTYP_EXECUTELOOP, 0, 0, 0, 0}; unsigned char i; - + biosHalInterfaceClear(); - if((hal_intvec_[15] >= 0x2520) && (hal_intvec_[15] <= 0xFDD9)) + if((hal_intvec_[15] >= 0x2520) && (hal_intvec_[15] <= 0xFDD9)) { if(*hal_signature == 0x5137) { @@ -679,11 +594,11 @@ short biosHalInterfaceInit(void) irq_forward_[i] = hal_intvec_[i]; } } - + halStartUpCode = (HalMainFunc)hal_intvec_[15]; // calls the (modified) startup code of HAL hal_infos_ = halStartUpCode((struct stream_funcs*)&_stream_Funcs, bios_device_flags_); // return HAL sw infos } - if(hal_infos_ != NULL) + if(hal_infos_ != &no_hal_infos_) { hal_ptr_ = (HAL_REC_ARRAY)(*hal_infos_).hal_list_ptr; if(hal_ptr_ != NULL) @@ -728,7 +643,7 @@ short biosHalInterfaceClear(void) } //! \brief main loop -//! \details returns never. +//! \details returns never. //! \li send error messages //! \li execute "commands in loop", eg. voltage regulation, wait(poll) for hit breakpoints //! \li execute commands send from dll @@ -739,7 +654,7 @@ void biosmainLoop(void) unsigned char rx_queu_counter_tmp; StreamSafe stream_tmp; HalFuncInOut pCallAddr; - + biosResetCts(); // release CTS line while(1) { @@ -811,7 +726,7 @@ char biosUsbOverflow(void) //! \details init hardware and (software)buffers //! \param[in] baudrate speed in bit/s void biosInitCom (unsigned long baudrate) -{ +{ unsigned char i; DIAG_SUPPRESS(Pe550) unsigned char dummy; @@ -863,7 +778,7 @@ void biosPrepareTx(unsigned int size) } //! \brief trigger sending of TX buffer -//! \details to send the first char we set UTXIFG, followed char loaded by +//! \details to send the first char we set UTXIFG, followed char loaded by //! true TX buffer empty interrupt void biosStartTx(void) { @@ -881,7 +796,7 @@ void biosUsbTxError(void) void biosUsbTxClear(void) { unsigned char i; - + memset((unsigned char*)&bios_tx_record_, 0, sizeof(bios_tx_record_)); bios_global_timer_[BIOS_TIMER_TX].count = 0; bios_rx_char_ = 0; @@ -900,13 +815,13 @@ void biosUsbRxClear(void) unsigned char i; unsigned short j; unsigned char mark = 0; - + if(IE1 & URXIE0) { - IE1 &= ~URXIE0; + IE1 &= ~URXIE0; mark = 1; } - + bios_rx_record_.active = 0; for(i = 0; i < BIOS_RX_QUEUS; i++) { @@ -936,20 +851,20 @@ void biosUsbRxClear(void) while(j && (IFG1 & URXIFG0)); if(mark) { - IE1 |= URXIE0; + IE1 |= URXIE0; } } //! \brief trigger a error message //! \details trigger a error message and clear the RX hard and software buffers void biosUsbRxError(unsigned short code) { - IE1 &= ~URXIE0; + IE1 &= ~URXIE0; biosUsbRxClear(); bios_rx_err_code_ = code; bios_rx_err_set_ = 1; bios_rx_err_payload_ = NULL; bios_rx_err_id_ = 0; - IE1 |= URXIE0; + IE1 |= URXIE0; } //! \brief receive char form UART @@ -976,14 +891,14 @@ INTERRUPT(USART0RX_VECTOR)void usbRxIsr (void) if(bios_rx_char_ == BIOS_XON_CHAR) { // test for continue transmiting - if(bios_xoff_ & 0x02) + if(bios_xoff_ & 0x02) { biosStartTx(); } bios_xoff_ = 0; goto usbRxIsrExit; } - else if (bios_rx_char_ == BIOS_XOFF_CHAR) + else if (bios_rx_char_ == BIOS_XOFF_CHAR) { // block sending to TUSB bios_xoff_ = 1 << BIOS_HARD_RTS_BIT; @@ -1058,8 +973,8 @@ INTERRUPT(USART0RX_VECTOR)void usbRxIsr (void) if(bios_rx_record_.data[bios_rx_record_.active][MESSAGE_CMDTYP_POS] == RESPTYP_ACKNOWLEDGE) { // search for message which are waiting on a ack - for(unsigned char i = 0; i < BIOS_TX_QUEUS; i++) - { + for(unsigned char i = 0; i < BIOS_TX_QUEUS; i++) + { DIAG_SUPPRESS(Pa082) // waits a transmited message for a ACK? if((bios_tx_record_.state[i] & BIOS_TX_WAIT_ON_ACK) && @@ -1101,7 +1016,7 @@ INTERRUPT(USART0RX_VECTOR)void usbRxIsr (void) else { // search for message which are waiting on a ack - for(unsigned char i = 0; i < BIOS_TX_QUEUS; i++) + for(unsigned char i = 0; i < BIOS_TX_QUEUS; i++) { DIAG_SUPPRESS(Pa082) if(((bios_tx_record_.state[i] & (BIOS_TX_WAIT_ON_ACK | BIOS_TX_TO_SEND)) == (BIOS_TX_WAIT_ON_ACK | BIOS_TX_TO_SEND)) && @@ -1109,7 +1024,7 @@ INTERRUPT(USART0RX_VECTOR)void usbRxIsr (void) (bios_tx_record_.data[i][3] == bios_rx_record_.data[bios_rx_record_.active][4])) DIAG_DEFAULT(Pa082) { - // only reset the wait_on_ack flag, + // only reset the wait_on_ack flag, //! \todo add a resend function bios_tx_record_.state[i] &= ~BIOS_TX_WAIT_ON_ACK; break; @@ -1137,7 +1052,7 @@ INTERRUPT(USART0RX_VECTOR)void usbRxIsr (void) bios_rx_record_.active = 0; } } - } + } else { // set a crc error @@ -1155,7 +1070,7 @@ INTERRUPT(USART0RX_VECTOR)void usbRxIsr (void) bios_rx_record_.count[bios_rx_record_.active] = 0; bios_rx_record_.crc[1] = 0; } - usbRxIsrExit: + usbRxIsrExit: biosResetCts(); // release TUSB RX } @@ -1175,7 +1090,7 @@ INTERRUPT(USART0TX_VECTOR)void usbTxIsr (void) while(!(bios_tx_record_.state[bios_tx_record_.cannel_to_send] & BIOS_TX_TO_SEND)) { bios_tx_record_.cannel_to_send++; - if(bios_tx_record_.cannel_to_send >= BIOS_TX_QUEUS) + if(bios_tx_record_.cannel_to_send >= BIOS_TX_QUEUS) { bios_tx_record_.cannel_to_send = 0; } @@ -1186,7 +1101,7 @@ INTERRUPT(USART0TX_VECTOR)void usbTxIsr (void) } // test on chars in software TX buffer DIAG_SUPPRESS(Pa082) - if(bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] < bios_tx_record_.count[bios_tx_record_.cannel_to_send]) + if(bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] < bios_tx_record_.count[bios_tx_record_.cannel_to_send]) { // send char from software buffer USB_WRITE = bios_tx_record_.data[bios_tx_record_.cannel_to_send][bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send]++]; @@ -1194,21 +1109,21 @@ INTERRUPT(USART0TX_VECTOR)void usbTxIsr (void) else { // no char to send in actual TX software buffer - // we don't clear TX software buffer, reset only flags. If need we can + // we don't clear TX software buffer, reset only flags. If need we can // send the buffer again. (resending in not implemented) bios_tx_record_.state[bios_tx_record_.cannel_to_send] &= ~BIOS_TX_TO_SEND; - bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] = 0; + bios_tx_record_.send_counter[bios_tx_record_.cannel_to_send] = 0; first_cannel = bios_tx_record_.cannel_to_send; if(!(bios_tx_record_.state[bios_tx_record_.cannel_to_send] & BIOS_TX_WAIT_ON_ACK)) { bios_global_timer_[BIOS_TIMER_TX].count = 0; } - // search in TX software buffer for data to send. If no data found, it was the + // search in TX software buffer for data to send. If no data found, it was the // last TX buffer empty interrupt. do { bios_tx_record_.cannel_to_send++; - if(bios_tx_record_.cannel_to_send >= BIOS_TX_QUEUS) + if(bios_tx_record_.cannel_to_send >= BIOS_TX_QUEUS) { bios_tx_record_.cannel_to_send = 0; } diff --git a/Bios/src/fw/uifv1/bios.h b/Bios/src/fw/uifv1/bios.h index 97d8239..df20619 100644 --- a/Bios/src/fw/uifv1/bios.h +++ b/Bios/src/fw/uifv1/bios.h @@ -137,4 +137,5 @@ extern __ro_placement volatile const unsigned short safe_core_version_; extern unsigned long bios_device_flags_; extern unsigned short bios_info_hw_0_; extern unsigned short bios_info_hw_1_; +extern const unsigned short tool_id_; #endif diff --git a/Bios/src/hal/cstartup.s43 b/Bios/src/fw/uifv1/cstartup.s43 similarity index 100% rename from Bios/src/hal/cstartup.s43 rename to Bios/src/fw/uifv1/cstartup.s43 diff --git a/Bios/src/fw/uifv1/hal430.c b/Bios/src/fw/uifv1/hal430.c new file mode 100644 index 0000000..4d2e68e --- /dev/null +++ b/Bios/src/fw/uifv1/hal430.c @@ -0,0 +1,159 @@ +/* + * hal.c + * + * + * + * Copyright (C) 2012 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. + */ + + +//! \ingroup MODULHAL +//! \file hal.c + +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "string.h" +DeviceSettings deviceSettings; +REQUIRED(deviceSettings) + +DevicePowerSettings devicePowerSettings; +REQUIRED(devicePowerSettings) + +unsigned short altRomAddressForCpuRead; +REQUIRED(altRomAddressForCpuRead) + +unsigned short wdtctlAddress5xx; +REQUIRED(wdtctlAddress5xx) + +unsigned short enhancedPsa; +REQUIRED(enhancedPsa) + +// global variables to handle Emulation clock control +unsigned long _hal_mclkCntrl0; +REQUIRED(_hal_mclkCntrl0) + +VAR_AT(HalRec hal_functions_[HAL_FUNCTIONS_SIZE], HAL_ADDR_VAR_HAL_FUNCTION); + +#define MACRO(x) {ID_##x, (void*)_hal_##x }, +HalRec hal_functions_default_[HAL_FUNCTIONS_DEFAULT_SIZE] = +{ + MACRO(Zero) + MACRO_LIST +}; +#undef MACRO + +REQUIRED(_init_Hal) + +void _init_Hal(void) +{ + unsigned char i; + + for(i=0; i < (sizeof(hal_functions_)/sizeof(HalRec)); i++) + { + if(i < (sizeof(hal_functions_default_)/sizeof(HalRec))) + { + hal_functions_[i].id = hal_functions_default_[i].id; + hal_functions_[i].function = hal_functions_default_[i].function; + } + else + { + hal_functions_[i].id = 0xFFFF; + hal_functions_[i].function = NULL; + } + } +} + +HAL_FUNCTION(_hal_Zero) +{ + return 0; +} + +HAL_FUNCTION(_hal_Init) +{ + IHIL_Init(); + return 0; +} +extern unsigned int LPMx5_DEVICE_STATE; +extern int intstate; +extern unsigned long long prevJState; +extern unsigned short lastTraceWritePos; + +HAL_FUNCTION(_hal_ResetStaticGlobalVars) +{ + LPMx5_DEVICE_STATE = 1; + intstate = 0; + prevJState = 0x0000000000000000; + lastTraceWritePos = 0; + return 0; +} + +HAL_FUNCTION(_hal_SetVcc) +{ + unsigned short vcc; + STREAM_get_word(&vcc); + IHIL_SetVcc(vcc); + return 0; +} + +HAL_FUNCTION(_hal_SwitchMosfet) +{ + return -1; +} + +HAL_FUNCTION(_hal_GetVcc) +{ + double vcc = 0; + double ext_vcc = 0; + + IHIL_GetVcc(&vcc, &ext_vcc); + STREAM_put_word((unsigned short)vcc); // this is a workaround + STREAM_put_word((unsigned short)ext_vcc); + return 0; +} + +HAL_FUNCTION(_hal_GetFuses) +{ + config_fuses(); + STREAM_put_byte(SetReg_8Bits(0)); + return 0; +} + +HAL_FUNCTION(_hal_DummyMacro) +{ + return -1; +} + +/* EOF */ diff --git a/Bios/src/fw/uifv1/hal432.c b/Bios/src/fw/uifv1/hal432.c new file mode 100644 index 0000000..46c9604 --- /dev/null +++ b/Bios/src/fw/uifv1/hal432.c @@ -0,0 +1,151 @@ +/* + * hal432.c + * + * + * + * Copyright (C) 2012 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. + */ + + +//! \ingroup MODULHAL +//! \file hal432.c + +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "string.h" + +DeviceSettings deviceSettings; +REQUIRED(deviceSettings) + +DevicePowerSettings devicePowerSettings; +REQUIRED(devicePowerSettings) + +unsigned short altRomAddressForCpuRead; +REQUIRED(altRomAddressForCpuRead) + +unsigned short wdtctlAddress5xx; +REQUIRED(wdtctlAddress5xx) + +unsigned short enhancedPsa; +REQUIRED(enhancedPsa) +// global variables use for JTAG/SWD DAP +unsigned long cswValues[4]; +REQUIRED(cswValues) +ARMConfigSettings armConfigSettings; +REQUIRED(armConfigSettings) + +VAR_AT(HalRec hal_functions_[HAL_FUNCTIONS_SIZE], HAL_ADDR_VAR_HAL_FUNCTION); + +#define MACRO(x) {ID_##x, (void*)_hal_##x }, +HalRec hal_functions_default_[HAL_FUNCTIONS_DEFAULT_SIZE] = +{ + MACRO(Zero) + MACRO_LIST +}; +#undef MACRO + +REQUIRED(_init_Hal) + +void _init_Hal(void) +{ + unsigned char i; + + for(i=0; i < (sizeof(hal_functions_)/sizeof(HalRec)); i++) + { + if(i < (sizeof(hal_functions_default_)/sizeof(HalRec))) + { + hal_functions_[i].id = hal_functions_default_[i].id; + hal_functions_[i].function = hal_functions_default_[i].function; + } + else + { + hal_functions_[i].id = 0xFFFF; + hal_functions_[i].function = NULL; + } + } +} + +HAL_FUNCTION(_hal_Zero) +{ + return 0; +} + +HAL_FUNCTION(_hal_Init) +{ + IHIL_Init(); + return 0; +} + +HAL_FUNCTION(_hal_ResetStaticGlobalVars) +{ + return -1; +} + +HAL_FUNCTION(_hal_SetVcc) +{ + unsigned short vcc; + STREAM_get_word(&vcc); + IHIL_SetVcc(vcc); + return 0; +} + +HAL_FUNCTION(_hal_SwitchMosfet) +{ + return -1; +} + +HAL_FUNCTION(_hal_GetVcc) +{ + double vcc = 0; + double ext_vcc = 0; + + IHIL_GetVcc(&vcc, &ext_vcc); + STREAM_put_word((unsigned short)vcc); // this is a workaround + STREAM_put_word((unsigned short)ext_vcc); + return 0; +} + +HAL_FUNCTION(_hal_GetFuses) +{ + return -1; +} + +HAL_FUNCTION(_hal_DummyMacro) +{ + return -1; +} + +/* EOF */ diff --git a/Bios/src/fw/uifv1/halMain430.c b/Bios/src/fw/uifv1/halMain430.c new file mode 100644 index 0000000..c5a170c --- /dev/null +++ b/Bios/src/fw/uifv1/halMain430.c @@ -0,0 +1,99 @@ +/* + * halMain430.c + * + * + * + * Copyright (C) 2012 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. + */ + +#include "hw_compiler_specific.h" +#include "stream.h" +#include "hal.h" +#include "edt.h" +#include "stdlib.h" +#include "string.h" +#include "HalGlobalVars.h" +#include "../fw/uifv1/uifVersion.h" + +extern void globalVarsInit(void); + +extern short _hil_Init( void ); +extern unsigned long _hal_mclkCntrl0; + +// prototypes for core/HAL interface +void *ResetFirmware(void *stream_adr, unsigned long device_flags); + +CONST_AT(HAL_INFOS hal_infos_, HAL_ADDR_CONST_HAL_INFOS) = +{ + ResetFirmware, // _initTask + (VERSION_MAJOR - 1) << 14 | + (VERSION_MINOR << 8) | + VERSION_PATCH, + VERSION_BUILD +}; +REQUIRED(hal_infos_) + +//HAL signature, indicates HAL part is valid +const unsigned short hal_signature @ "HALSIG" = 0x5137; +REQUIRED(hal_signature) + +struct stream_funcs *_stream_Funcs; +HAL_INFOS hal_infos_in_ram_; +unsigned short hal_delay_loop_us_; +unsigned short hal_delay_loop_ms_; + +// called via cstartup form biosHalInterfaceInit +REQUIRED(ResetFirmware) +void *ResetFirmware(void *stream_adr, unsigned long device_flags) +{ + globalVarsInit(); + + hal_delay_loop_us_ = 1; + hal_delay_loop_ms_ = 0x7CF; + + memcpy((HAL_INFOS*)&hal_infos_in_ram_,&hal_infos_, sizeof(hal_infos_)); + _stream_Funcs=(struct stream_funcs *)stream_adr; + _init_Hal(); + if((hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].function == NULL)) + { + hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].id = 0xFFFE; + hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].function = (void*)_edt_Common_Methods.Loop; + } + _hil_Init(); + _hal_mclkCntrl0=0; + + hal_infos_in_ram_.hal_size = sizeof(hal_functions_)/sizeof(HalRec); + hal_infos_in_ram_.hal_list_ptr = hal_functions_; + hal_infos_in_ram_.arch = T_ARCH_MSP430; + + return((void*)&hal_infos_in_ram_); // return software infos +} diff --git a/Bios/src/hal/halMain.c b/Bios/src/fw/uifv1/halMain432.c similarity index 60% rename from Bios/src/hal/halMain.c rename to Bios/src/fw/uifv1/halMain432.c index 2abbbee..271add4 100644 --- a/Bios/src/hal/halMain.c +++ b/Bios/src/fw/uifv1/halMain432.c @@ -1,56 +1,40 @@ /* - * halMain.c + * halMain432.c * * * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -//! \ingroup MODULHAL -//! \file halMain.c -//! \brief -//! -//! \author Detlef Fink (03/10/2011) - -//! \page hal_page1 Hardware Abstraction Layer (HAL) -//! \brief The HAL ... -//! \author Detlef Fink (03/10/2011) -//! -//! files\n -//! \li startup.s43 -//! \li halMain.c -//! \li hal.c -//! \li halGlobalVars.c - #include "hw_compiler_specific.h" #include "stream.h" #include "hal.h" @@ -59,25 +43,22 @@ #include "string.h" #include "HalGlobalVars.h" - - -// include the version info here to write it to the info mem -#include "../../../DLL430_v3/version.h" +#include "../fw/uifv1/uifVersion.h" extern void globalVarsInit(void); extern short _hil_Init( void ); -extern unsigned short _hal_mclkCntrl0; -extern unsigned long hil_device_flags_; // prototypes for core/HAL interface void *ResetFirmware(void *stream_adr, unsigned long device_flags); -CONST_AT(HAL_INFOS hal_infos_, HAL_ADDR_CONST_HAL_INFOS) = +CONST_AT(HAL_INFOS hal_infos_, HAL_ADDR_CONST_HAL_INFOS) = { ResetFirmware, // _initTask - 0x8200 | VERSION_PATCH, // import from DLL by version.h - VERSION_BUILD // import from DLL by version.h + (VERSION_MAJOR - 1) << 14 | + (VERSION_MINOR << 8) | + VERSION_PATCH, + VERSION_BUILD }; REQUIRED(hal_infos_) @@ -85,46 +66,32 @@ REQUIRED(hal_infos_) const unsigned short hal_signature @ "HALSIG" = 0x5137; REQUIRED(hal_signature) -// vars -#ifndef UNIX -VAR_AT(struct stream_funcs *_stream_Funcs, HAL_ADDR_VAR_STREAM_FUNCS); -#endif -VAR_AT(HAL_INFOS hal_infos_in_ram_, HAL_ADDR_VAR_HAL_INFOS_IN_RAM); -VAR_AT(unsigned short hal_delay_loop_us_, HAL_ADDR_VAR_DELAY_LOOP_US); -VAR_AT(unsigned short hal_delay_loop_ms_, HAL_ADDR_VAR_DELAY_LOOP_MS); +struct stream_funcs *_stream_Funcs; +HAL_INFOS hal_infos_in_ram_; +unsigned short hal_delay_loop_us_; +unsigned short hal_delay_loop_ms_; // called via cstartup form biosHalInterfaceInit REQUIRED(ResetFirmware) void *ResetFirmware(void *stream_adr, unsigned long device_flags) { globalVarsInit(); - hil_device_flags_ = device_flags; - if(hil_device_flags_ & DEVICE_FLAG_EASY) - { - hal_delay_loop_us_ = 2; - hal_delay_loop_ms_ = 0x535; - } - else - { + hal_delay_loop_us_ = 1; hal_delay_loop_ms_ = 0x7CF; - } - + memcpy((HAL_INFOS*)&hal_infos_in_ram_,&hal_infos_, sizeof(hal_infos_)); - // save address of stream funcs, located in core -#ifndef UNIX _stream_Funcs=(struct stream_funcs *)stream_adr; -#endif _init_Hal(); - if((hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].function == NULL) && !(hil_device_flags_ & DEVICE_FLAG_EASY)) + if((hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].function == NULL)) { - hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].id = 0xFFFE; - hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].function = (void*)_edt_Common_Methods.Loop; + hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].id = 0xFFFE; + hal_functions_[sizeof(hal_functions_)/sizeof(HalRec)-1].function = (void*)_edt_Common_Methods.Loop; } _hil_Init(); - _hal_mclkCntrl0=0x040f; - + hal_infos_in_ram_.hal_size = sizeof(hal_functions_)/sizeof(HalRec); hal_infos_in_ram_.hal_list_ptr = hal_functions_; - return((void*)&hal_infos_in_ram_); // return software infos + hal_infos_in_ram_.arch = T_ARCH_MSP432; + return((void*)&hal_infos_in_ram_); // return software info } diff --git a/Bios/src/fw/uifv1/main.c b/Bios/src/fw/uifv1/main.c index cee4423..0d920a8 100644 --- a/Bios/src/fw/uifv1/main.c +++ b/Bios/src/fw/uifv1/main.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -52,11 +52,11 @@ //! \li bios (core) -> \ref bios_page1 //! \li HAL -> \ref hal_page1 //! \li HIL -> \ref hil_page1 -//! +//! //! two additional parts: //! \li uif update -> \ref update_page1 //! \li uif downgrade -> \ref downgrate_page1 -//! +//! //! and for internal use: //! \li uif eeprom update -> \ref eepromupdate_page1 @@ -79,7 +79,7 @@ #include "bios.h" -#include "../v3_0p.h" +#include "v3_0p.h" void main ( void ); diff --git a/Bios/src/fw/stream.c b/Bios/src/fw/uifv1/stream.c similarity index 91% rename from Bios/src/fw/stream.c rename to Bios/src/fw/uifv1/stream.c index f5abdf2..9d7da33 100644 --- a/Bios/src/fw/stream.c +++ b/Bios/src/fw/uifv1/stream.c @@ -9,45 +9,45 @@ * HAL init the call addresses are handover to the HAL. */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef uController_uif - #include "uifv1/bios.h" + #include "bios.h" #elif uController_uifplus - #include "uifplus/bios.h" + #include "../uifplus/bios.h" #else // windows area - #include "lpt/bios.h" + #include "../lpt/bios.h" #endif #include "hw_compiler_specific.h" // included from bios.h?, not needed for LPT @@ -84,6 +84,7 @@ short _stream_discard_bytes(unsigned short count); short _stream_memcpy(unsigned char* destination, unsigned char* source, unsigned short count); short _stream_getFlags(void); short _stream_putFlags(short flags, short mask); +short _stream_get_buffer(void **buffer, unsigned short *size); // stream functions const struct stream_funcs _stream_Funcs = { @@ -100,6 +101,7 @@ const struct stream_funcs _stream_Funcs = { _stream_get_byte, _stream_get_word, _stream_get_long, + _stream_get_buffer, _stream_discard_bytes, _stream_memcpy, // used form downgrater @@ -116,7 +118,7 @@ const struct stream_funcs _stream_Funcs = { unsigned char _stream_out_change_type(unsigned char res_type) { unsigned char ret_value; - + ret_value = bios_tx_record_.data[bios_tx_record_.active][1]; bios_tx_record_.data[bios_tx_record_.active][1] = res_type; return(ret_value); @@ -128,7 +130,7 @@ unsigned char _stream_out_change_type(unsigned char res_type) unsigned char _stream_out_change_msg_id(unsigned char msg_id) { unsigned char ret_value; - + ret_value = bios_tx_record_.data[bios_tx_record_.active][2]; bios_tx_record_.data[bios_tx_record_.active][2] = msg_id; return(ret_value); @@ -163,7 +165,7 @@ short _stream_flush(void) static unsigned char resp_id = 0; unsigned short i; unsigned short crc; - + if(!(bios_tx_record_.state[bios_tx_record_.active] & BIOS_TX_TO_SEND)) { DIAG_SUPPRESS(Pa082) @@ -172,7 +174,7 @@ short _stream_flush(void) bios_tx_record_.data[bios_tx_record_.active][MESSAGE_MSG_ID_POS] &= ~0x80; } else if((bios_tx_record_.data[bios_tx_record_.active][MESSAGE_MSG_ID_POS] & 0x80) || resp_id) - { + { if(resp_id < 255) { resp_id++; @@ -183,7 +185,7 @@ short _stream_flush(void) } bios_tx_record_.data[bios_tx_record_.active][3] = resp_id; } - bios_tx_record_.data[bios_tx_record_.active][0] = bios_tx_record_.count[bios_tx_record_.active]; + bios_tx_record_.data[bios_tx_record_.active][0] = bios_tx_record_.count[bios_tx_record_.active]; if(!(bios_tx_record_.data[bios_tx_record_.active][0] & 0x01)) // payload must be a multiply of word size for CRC { bios_tx_record_.data[bios_tx_record_.active][++bios_tx_record_.count[bios_tx_record_.active]] = 0x00; @@ -193,7 +195,7 @@ short _stream_flush(void) { crc ^= bios_tx_record_.datas[bios_tx_record_.active][i]; } - crc ^= 0xFFFF; + crc ^= 0xFFFF; bios_tx_record_.datas[bios_tx_record_.active][bios_tx_record_.count[bios_tx_record_.active] / 2 + 1] = crc; bios_tx_record_.state[bios_tx_record_.active] |= BIOS_TX_TO_SEND; bios_tx_record_.state[bios_tx_record_.active] &= ~BIOS_TX_BUSY; @@ -228,12 +230,12 @@ short _stream_put_bytes(void *data, unsigned short size) unsigned char tmp_id; unsigned char tmp_type; int ret_value = 0; - + if(bios_tx_record_.ext_data == NULL) { for(size_counter = 0; size_counter < size; size_counter++) { - if(bios_tx_record_.count[bios_tx_record_.active] >= (BIOS_TX_SIZE-3)) + if(bios_tx_record_.count[bios_tx_record_.active] >= (BIOS_TX_SIZE-3)) { tmp_type = bios_tx_record_.data[bios_tx_record_.active][1]; tmp_id = bios_tx_record_.data[bios_tx_record_.active][2]; @@ -253,8 +255,8 @@ short _stream_put_bytes(void *data, unsigned short size) else if(bios_tx_record_.ext_data != (unsigned short*)0xFFFF) { DIAG_SUPPRESS(Pa082) - for(size_counter = 0; - (size_counter < size) && (bios_tx_record_.ext_counter < bios_tx_record_.ext_size); + for(size_counter = 0; + (size_counter < size) && (bios_tx_record_.ext_counter < bios_tx_record_.ext_size); size_counter++, bios_tx_record_.ext_counter++) { *((unsigned char*)bios_tx_record_.ext_data+bios_tx_record_.ext_counter) = *((unsigned char*)data+size_counter); @@ -296,7 +298,7 @@ short _stream_in_init(void *ptr, unsigned char no) { BiosRxRecord *ptr_tmp; ptr_tmp = (BiosRxRecord*)ptr; - + stream_input_.data_start =(*ptr_tmp).data[no]; stream_input_.data_end = stream_input_.data_start + stream_input_.data_start[MESSAGE_SIZE_POS]; stream_input_.data_ptr = &stream_input_.data_start[MESSAGE_PAYLOAD_POS]; @@ -321,6 +323,7 @@ short _stream_internal_stream(unsigned char *data_in, unsigned short size_in, un // safe Tx (*tmp_record).ext_data = bios_tx_record_.ext_data; (*tmp_record).ext_size = bios_tx_record_.ext_size; + (*tmp_record).ext_counter = bios_tx_record_.ext_counter; stream_input_.data_start = data_in; stream_input_.data_end = stream_input_.data_start + size_in; stream_input_.data_ptr = data_in; @@ -351,6 +354,7 @@ short _stream_external_stream(StreamSafe *tmp_record) // restore Tx bios_tx_record_.ext_data = (*tmp_record).ext_data; bios_tx_record_.ext_size = (*tmp_record).ext_size; + bios_tx_record_.ext_counter = (*tmp_record).ext_counter; return(0); } @@ -361,7 +365,7 @@ short _stream_external_stream(StreamSafe *tmp_record) short _stream_get_byte(unsigned char *data) { short ret_value = 0; - + if(stream_input_.data_ptr > stream_input_.data_end) { ret_value = -1; @@ -384,10 +388,10 @@ short _stream_get_byte(unsigned char *data) short _stream_get_word(unsigned short *data) { short ret_value = 0; - + unsigned short Word; unsigned char tmp_char; - + if((PTR_FOR_CMP)stream_input_.data_ptr & 1) { ret_value = _stream_get_byte(&tmp_char); @@ -403,7 +407,7 @@ short _stream_get_word(unsigned short *data) } *data = Word; } - else + else { if(stream_input_.data_ptr > stream_input_.data_end) { @@ -431,7 +435,7 @@ short _stream_get_word(unsigned short *data) short _stream_get_long(unsigned long *data) { short ret_value = 0; - + unsigned char *tmp_char; if((PTR_FOR_CMP)stream_input_.data_ptr & 1) @@ -471,19 +475,32 @@ short _stream_get_long(unsigned long *data) } } } -stream_get_long_exit: - return(ret_value); +stream_get_long_exit: + return(ret_value); +} + +//! \brief Get a pointer to the data buffer +//! \details make sure that input stream pointer is incremented to point on next buffer element. +short _stream_get_buffer(void **buffer, unsigned short +*size) +{ + *buffer = stream_input_.data_ptr; + *size = stream_input_.data_end - stream_input_.data_ptr + 1; + + stream_input_.data_ptr = stream_input_.data_end + 4; + + return 1; } //! \brief Skip byte(s) to read form rx buffer -//! \details If more bytes discarded as in the buffer, the next message is requested. +//! \details If more bytes discarded as in the buffer, the next message is requested. //! \param[in] count count of bytes to skip //! \return status, 0 = ok, 1 = last data, -1 = faild short _stream_discard_bytes(unsigned short count) { short ret_value = -1; unsigned char dummy; - + for(;count; count--) { ret_value = _stream_get_byte(&dummy); diff --git a/Bios/src/fw/stream.h b/Bios/src/fw/uifv1/stream.h similarity index 89% rename from Bios/src/fw/stream.h rename to Bios/src/fw/uifv1/stream.h index 1c87a49..a30d73c 100644 --- a/Bios/src/fw/stream.h +++ b/Bios/src/fw/uifv1/stream.h @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -53,6 +53,7 @@ struct _StreamSafe_ unsigned char rx[12]; unsigned short *ext_data; unsigned short ext_size; + unsigned short ext_counter; }; typedef struct _StreamSafe_ StreamSafe; @@ -71,6 +72,7 @@ struct stream_funcs short (*get_byte)(unsigned char *); short (*get_word)(unsigned short *); short (*get_long)(unsigned long *); + short (*get_buffer)(void **, unsigned short *); short (*discard_bytes)(unsigned short); short (*memcpy)(unsigned char*, unsigned char*, unsigned short); short (*biosLedOn)(unsigned char); @@ -86,7 +88,7 @@ struct stream_funcs extern struct stream_funcs * _stream_Funcs; // add definitions for external use -// functions are located in core module +// functions are located in core module /** * STREAM Function Pointer - these are the STREAM Exports @@ -104,6 +106,7 @@ extern struct stream_funcs * _stream_Funcs; #define STREAM_get_byte (*_stream_Funcs->get_byte) #define STREAM_get_word (*_stream_Funcs->get_word) #define STREAM_get_long (*_stream_Funcs->get_long) +#define STREAM_get_buffer (*_stream_Funcs->get_buffer) #define STREAM_discard_bytes (*_stream_Funcs->discard_bytes) #define STREAM_memcpy (*_stream_Funcs->memcpy) #define STREAM_biosLedOn (*_stream_Funcs->biosLedOn) @@ -130,6 +133,7 @@ extern const struct stream_funcs _stream_Funcs; #define STREAM_get_byte (*_stream_Funcs.get_byte) #define STREAM_get_word (*_stream_Funcs.get_word) #define STREAM_get_long (*_stream_Funcs.get_long) +#define STREAM_get_buffer (*_stream_Funcs->get_buffer) #define STREAM_discard_bytes (*_stream_Funcs.discard_bytes) #define STREAM_memcpy (*_stream_Funcs.memcpy) #define STREAM_biosLedOn (*_stream_Funcs.biosLedOn) @@ -154,11 +158,11 @@ extern const struct stream_funcs _stream_Funcs; #define MESSAGE_EXECUTE_ZERO_ADDR_POS 6 #define MESSAGE_EXECUTE_PAYLOAD_POS 6 #define MESSAGE_NO_RESPONSE 0x8000 -#define EXCEPTION_NOT_IMPLEMENT_ERR 0x8001 -#define EXCEPTION_MSGID_ERR 0x8002 -#define EXCEPTION_CRC_ERR 0x8003 -#define EXCEPTION_RX_TIMEOUT_ERR 0x8004 -#define EXCEPTION_TX_TIMEOUT_ERR 0x8005 +#define EXCEPTION_NOT_IMPLEMENT_ERR 0x8001 +#define EXCEPTION_MSGID_ERR 0x8002 +#define EXCEPTION_CRC_ERR 0x8003 +#define EXCEPTION_RX_TIMEOUT_ERR 0x8004 +#define EXCEPTION_TX_TIMEOUT_ERR 0x8005 #define EXCEPTION_RX_OVERFLOW_ERR 0x8006 #define EXCEPTION_TX_NO_BUFFER 0x8007 #define EXCEPTION_COM_RESET 0x8008 @@ -189,6 +193,7 @@ struct _HAL_INFOS_ HalMainFunc init; short sw_0; short sw_1; + char arch; unsigned short hal_size; HalRec *hal_list_ptr; }; @@ -205,4 +210,3 @@ extern short _stream_out_init(unsigned char msg_id, unsigned char res_type); extern unsigned char rx_queu_counter_public_; #endif - diff --git a/Bios/src/fw/uifv1/uifVersion.h b/Bios/src/fw/uifv1/uifVersion.h new file mode 100644 index 0000000..8ad5302 --- /dev/null +++ b/Bios/src/fw/uifv1/uifVersion.h @@ -0,0 +1,46 @@ +/* + * FetVersion.h + * + * Holds Version number. + * + * Copyright (C) 2016 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. + */ + +#pragma once + +#define VERSION_MAJOR 3 +#define VERSION_MINOR 11 +#define VERSION_PATCH 0 +#define VERSION_BUILD 001 + +#define CORE_VERSION 0x16 + diff --git a/Bios/src/fw/v3_0p.c b/Bios/src/fw/uifv1/v3_0p.c similarity index 85% rename from Bios/src/fw/v3_0p.c rename to Bios/src/fw/uifv1/v3_0p.c index 58b1fb2..2511346 100644 --- a/Bios/src/fw/v3_0p.c +++ b/Bios/src/fw/uifv1/v3_0p.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,13 +44,13 @@ //! \li loop management #ifdef uController_uif - #include "uifv1/v3_0p_hw_uif.h" - #include "uifv1/bios.h" + #include "v3_0p_hw_uif.h" + #include "bios.h" #elif uController_uifplus - #include "uifplus/v3_0p_hw_uifplus.h" - #include "uifplus/bios.h" + #include "../uifplus/v3_0p_hw_uifplus.h" + #include "../uifplus/bios.h" #else - #include "lpt/bios.h" + #include "../lpt/bios.h" #endif #include "v3_0p.h" #include "stream.h" @@ -62,19 +62,19 @@ typedef short (*HalFuncInOut)(unsigned short); //------------------------------------------------------------------------------ // Global Variables - Data Memory used by this module // -V3opLoopArray v3op_loop_array_[V3OP_LOOP_ARRAY_COUNT] = { - { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, +V3opLoopArray v3op_loop_array_[V3OP_LOOP_ARRAY_COUNT] = { + { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 }, { 0xFFFF, (unsigned char*)0xFFFF, 0x00, 0x00, 0x00, 1 } }; -HAL_INFOS no_hal_infos_ = {0, 0, 0, 0, NULL}; +HAL_INFOS no_hal_infos_ = {0, 0, 0, 0, 0, NULL}; HAL_INFOS_PTR hal_infos_ = &no_hal_infos_; -// ID from and pointer to all HAL functions +// ID from and pointer to all HAL functions HAL_REC_ARRAY hal_ptr_ = NULL; -// informations about first and last measages +// informations about first and last measages unsigned short v30p_stream_flags_ = 0; short v3opKillLoop(unsigned char msg_id); @@ -85,6 +85,8 @@ short HAL_Zero(unsigned char *data); short v3opRx(unsigned char *str); short v3opSendException(unsigned char msg_id, unsigned short code, unsigned short *payload); +extern const unsigned short *hal_signature; + //! \brief some (HAL)zero functions are handled in bios //! \details \li 0 -> versions //! \li 1 -> count of installed HAL macros @@ -98,17 +100,47 @@ short HAL_Zero(unsigned char *data) { short ret_value = 0; unsigned short i; - + if(data[MESSAGE_EXECUTE_ZERO_ADDR_POS] == STREAM_CORE_ZERO_VERSION) // call for SW version { if(STREAM_out_init(data[MESSAGE_MSG_ID_POS], RESPTYP_DATA) >= 0) { - STREAM_put_word((*hal_infos_).sw_0); - STREAM_put_word((*hal_infos_).sw_1); + unsigned long coreVersion_ToolId = core_version_; + coreVersion_ToolId =(coreVersion_ToolId<<16) + tool_id_; + if(hal_infos_ != &no_hal_infos_) + { + STREAM_put_word((*hal_infos_).sw_0); + STREAM_put_word((*hal_infos_).sw_1); + } + else + { + STREAM_put_word(tool_id_); + STREAM_put_word(tool_id_); + } + STREAM_put_word(bios_info_hw_0_); STREAM_put_word(bios_info_hw_1_); - STREAM_put_bytes((unsigned char*)&core_version_,sizeof(core_version_)); - STREAM_put_bytes((unsigned char*)&core_version_,sizeof(safe_core_version_)); + + STREAM_put_bytes((unsigned char*)&coreVersion_ToolId,sizeof(coreVersion_ToolId)); + STREAM_put_word(safe_core_version_); + + // return dummy value for Sub mcu & DCDC layer + STREAM_put_word(0x0000); + STREAM_put_word(0x0000); + + // return dummy value for Uart version module + STREAM_put_word(0x0000); + + // return CRC's for core and all firmware modules + STREAM_put_word(0x0000); + STREAM_put_word(0x0000); + STREAM_put_word(0x0000); + STREAM_put_word(0x0000); + STREAM_put_word(0x0000); + + // return dummy FPGA version + STREAM_put_word((*hal_infos_).arch); + STREAM_put_word(BIOS_RX_QUEUS); STREAM_put_word(BIOS_RX_SIZE); STREAM_put_long(bios_device_flags_); @@ -179,7 +211,7 @@ short v3opPauseLoop(unsigned char msg_id) int i = 0; for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) { - if(v3op_loop_array_[i].msg_id == msg_id) + if(v3op_loop_array_[i].msg_id == msg_id) { v3op_loop_array_[i].active = 0; break; @@ -196,7 +228,7 @@ short v3opResumeLoop(unsigned char msg_id) int i = 0; for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) { - if(v3op_loop_array_[i].msg_id == msg_id) + if(v3op_loop_array_[i].msg_id == msg_id) { v3op_loop_array_[i].active = 1; break; @@ -233,13 +265,13 @@ short v3opKillLoop(unsigned char msg_id) { unsigned short i; short ret_value = -1; - + if(msg_id == 0) { ret_value = 0; for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) { - if((v3op_loop_array_[i].addr != 0xFFFF) && ((*hal_ptr_)[v3op_loop_array_[i].addr].id < 0xFF00)) + if((v3op_loop_array_[i].addr != 0xFFFF) && ((*hal_ptr_)[v3op_loop_array_[i].addr].id < 0xFF00)) { if(v3op_loop_array_[i].indata != NULL) { @@ -248,7 +280,7 @@ short v3opKillLoop(unsigned char msg_id) v3op_loop_array_[i].indata = NULL; v3op_loop_array_[i].addr = 0xFFFF; v3op_loop_array_[i].active = 1; - + ret_value++; } } @@ -286,11 +318,11 @@ short v3opSetLoop(unsigned char *payload_incl_addr, unsigned char flags) unsigned short i, j; unsigned char payload_size; short ret_value = -1; - + // search for same running function for(i = 0; i < V3OP_LOOP_ARRAY_COUNT; i++) { - if((v3op_loop_array_[i].addr == *(unsigned short*)&payload_incl_addr[MESSAGE_EXECUTE_CALL_ADDR_POS]) && + if((v3op_loop_array_[i].addr == *(unsigned short*)&payload_incl_addr[MESSAGE_EXECUTE_CALL_ADDR_POS]) && (v3op_loop_array_[i].msg_id == payload_incl_addr[MESSAGE_MSG_ID_POS])) { ret_value = -2; @@ -331,7 +363,6 @@ short v3opSetLoop(unsigned char *payload_incl_addr, unsigned char flags) } else { - payload_size = 0; v3op_loop_array_[i].indata = NULL; v3op_loop_array_[i].flags = flags & V3OP_LOOP_WAIT_FLAG; v3op_loop_array_[i].msg_id = payload_incl_addr[2] | 0x40; @@ -429,7 +460,7 @@ short v3opRx (unsigned char *str) } hal_history_[hal_history_count_++] = call_addr; hal_history_last_ = call_addr; - #endif + #endif if(call_addr < (*hal_infos_).hal_size) { pCallAddr = (HalFuncInOut)(*hal_ptr_)[call_addr].function; @@ -442,7 +473,7 @@ short v3opRx (unsigned char *str) ret_value = MESSAGE_NO_RESPONSE; } } - } + } } else { @@ -477,8 +508,8 @@ short v3opRx (unsigned char *str) case CMDTYP_UPINIT: // init update ret_value = v3opCoreFlashFunctionInit(str); break; - case CMDTYP_UPERASE: // erase HAL part - ret_value = v3opCoreFlashFunctionErase(str); + case CMDTYP_UPERASE: // erase HAL part + ret_value = v3opCoreFlashFunctionErase(str); if(ret_value == 1) // tell Bios that Hal is dead { biosHalInterfaceClear(); @@ -501,7 +532,7 @@ short v3opRx (unsigned char *str) { if(ret_value >= 0) { - if(STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_ACKNOWLEDGE) >= 0); + if(STREAM_out_init(str[MESSAGE_MSG_ID_POS], RESPTYP_ACKNOWLEDGE) >= 0) { STREAM_put_word(ret_value); STREAM_flush(); @@ -535,7 +566,7 @@ short v3opRx (unsigned char *str) short v3opSendException(unsigned char msg_id, unsigned short code, unsigned short *payload) { unsigned short i; - + if(STREAM_out_init(msg_id, RESPTYP_EXCEPTION) >= 0) { if(payload == NULL) diff --git a/Bios/src/fw/v3_0p.h b/Bios/src/fw/uifv1/v3_0p.h similarity index 100% rename from Bios/src/fw/v3_0p.h rename to Bios/src/fw/uifv1/v3_0p.h diff --git a/Bios/src/fw/uifv1/v3_0p_hw_uif.c b/Bios/src/fw/uifv1/v3_0p_hw_uif.c index 4aff3a7..61a3551 100644 --- a/Bios/src/fw/uifv1/v3_0p_hw_uif.c +++ b/Bios/src/fw/uifv1/v3_0p_hw_uif.c @@ -47,8 +47,8 @@ #include "hw_compiler_specific.h" #include "bios.h" -#include "../v3_0p.h" -#include "../stream.h" +#include "v3_0p.h" +#include "stream.h" #include diff --git a/Bios/include/EEM_defs.h b/Bios/src/hal/EEM_defs.h similarity index 96% rename from Bios/include/EEM_defs.h rename to Bios/src/hal/EEM_defs.h index 229851c..950c2f9 100644 --- a/Bios/include/EEM_defs.h +++ b/Bios/src/hal/EEM_defs.h @@ -42,9 +42,6 @@ #define FALSE 0 #define TRUE 1 -#define WRITE 0 -#define READ 1 - #define TRIGFLAG 0x8E #define EEMVER 0x86 /* Definition for EEM General Clock Control Register */ @@ -188,5 +185,6 @@ #define GCC_NONE 0x0000 // No clock control #define GCC_STANDARD 0x0001 // Standard clock control #define GCC_EXTENDED 0x0002 // Extended clock control +#define GCC_STANDARD_I 0x0003 // Standard clock control, special handling Note 1793 #endif diff --git a/Bios/src/hal/JTAG_defs.h b/Bios/src/hal/JTAG_defs.h index e4b1c14..40c3b19 100644 --- a/Bios/src/hal/JTAG_defs.h +++ b/Bios/src/hal/JTAG_defs.h @@ -1,38 +1,38 @@ /* * JTAG_defs.h - * + * * * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*========================================================================*\ @@ -86,109 +86,39 @@ #define JTAGVERSION8D 0x8D #define JTAGVERSION91 0x91 #define JTAGVERSION95 0x95 +#define JTAGVERSION98 0x98 #define JTAGVERSION99 0x99 -#if !uController_uif -// Instructions to access the Emex registers -#define IR_EMEX_DATA_EXCHANGE 0x09 -#define IR_EMEX_READ_TRIGGER 0x0A -#define IR_EMEX_READ_CONTROL 0x0B -#define IR_EMEX_WRITE_CONTROL 0x0C -#define IR_EMEX_DATA_EXCHANGE32 0x0D - -#define IR_TEST_REG 0x2A //Select the 32-bit JTAG test register -#define IR_TEST_3V_REG 0x2F -// Instructions for the address register -#define IR_ADDR_HIGH_BYTE 0x81 -#define IR_ADDR_LOW_BYTE 0x82 -#define IR_ADDR_16BIT 0x83 -#define IR_ADDR_CAPTURE 0x84 -#define IR_DATA_TO_ADDR 0x85 -#define IR_CAPTURE_CPU_REG 0x86 -#define IR_DEVICE_ID 0x87 +#define F_BYTE 8 +#define F_WORD 16 +#define F_ADDR 20 +#define F_LONG 32 +#define F_LONG_LONG 64 -// Instructions for the data register -#define IR_DATA_16BIT 0x41 -#define IR_DATA_CAPTURE 0x42 -#define IR_DATA_QUICK 0x43 -#define IR_DATA_PSA 0x44 -#define IR_DATA_16BIT_OPT 0x45 -#define IR_SHIFT_OUT_PSA 0x46 -#define IR_DTA 0x47 +#define SBW1200KHz 0x800A +#define SBW600KHz 0x600A +#define SBW400KHz 0x400A +#define SBW200KHz 0x200A +#define SBW100KHz 0x100A -// Instructions for the breakpoint logic -#define IR_BP_CNTL_16BIT 0x09 -#define IR_BP_CNTL_CAPTURE 0x0A -#define IR_BP1_16BIT 0x0B -#define IR_BP1_CAPTURE 0x0C -#define IR_BP2_16BIT 0x0D -#define IR_BP2_CAPTURE 0x0E +#define JTAG15MHz 1 +#define JTAG8MHz 2 +#define JTAG4MHz 4 +#define JTAG2MHz 8 +#define JTAG1MHz 16 +#define JTAG500KHz 32 +#define JTAG250KHz 64 +#define JTAG750KHz 128 -// Instructions for the FLASH register -#define IR_FLASH_16BIT_UPDATE 0x19 -#define IR_FLASH_CAPTURE 0x1A -#define IR_FLASH_16BIT_IN 0x1B -#define IR_FLASH_UPDATE 0x1C -// Bits of the FLASH register -#define FLASH_SESEL1 0x0080 -#define FLASH_TMR 0x0800 +#define RSTLOW_SBW 0 +#define RSTLOW_JTAG 1 +#define RSTHIGH_SBW 2 +#define RSTHIGH_JTAG 3 -// Instructions for the control signal register -#define IR_CNTRL_SIG_HIGH_BYTE 0x11 -#define IR_CNTRL_SIG_LOW_BYTE 0x12 -#define IR_CNTRL_SIG_16BIT 0x13 -#define IR_CNTRL_SIG_CAPTURE 0x14 -#define IR_CNTRL_SIG_RELEASE 0x15 -#define IR_COREIP_ID 0x17 -#define IR_JSTATE_ID 0x18 +#define SAFE_PC_ADDRESS (0x00000004ul) -// Bits of the control signal register -#define CNTRL_SIG_READ 0x0001 -#define CNTRL_SIG_CPU_HALT 0x0002 -#define CNTRL_SIG_INTR_REQ 0x0004 -#define CNTRL_SIG_HALT_JTAG 0x0008 -#define CNTRL_SIG_BYTE 0x0010 -#define CNTRL_SIG_CPU_OFF 0x0020 -#define CNTRL_SIG_MCLKON 0x0040 -#define CNTRL_SIG_INSTRLOAD 0x0080 -#define CNTRL_SIG_TMODE 0x0100 -#define CNTRL_SIG_TCE 0x0200 -#define CNTRL_SIG_TCE1 0x0400 -#define CNTRL_SIG_PUC 0x0800 -#define CNTRL_SIG_CPU 0x1000 -#define CNTRL_SIG_TAGFUNCSAT 0x2000 -#define CNTRL_SIG_SWITCH 0x4000 -#define CNTRL_SIG_STOP_SEL 0x8000 -#define CNTRL_SIG_CPUSUSP (0x0001<<8) -#define CNTRL_SIG_CPUOFF (0x0001<<5) -#define CNTRL_SIG_INTREQ (0x0001<<2) -#define CNTRL_SIG_HALT (0x0001<<1) - -// Instructions for the fuse control -#define IR_CNTRL 0x21 -#define IR_PREPARE_BLOW 0x22 -#define IR_EX_BLOW 0x24 - -// Instructions for the configuration fuse register -#define IR_CONFIG_FUSES 0x29 +/*--------------------------start if uController_uif--------------------------*/ -// Instructions for the control of the Embedded Signal Processing Cell -#define IR_DUAL_8BIT 0x31 -#define IR_DUAL_CAPTURE 0x32 -#define IR_SELECT_MAIN 0x33 -#define IR_SELECT_ESP 0x34 - -// Bypass instruction -#define IR_BYPASS 0xFF - -// Accept Key Instruction for SPMA devices -#define IR_ACCEPT_KEY 0x59 - -#define IR_JMB_EXCHANGE 0x61 -#define IR_JMB_WRITE_32BIT_MODE 0x88 -#define IR_TDO_EVENT 0x64 -#define IR_TDO_EVENT_CTL 0x65 -#else // uController_uif // Instructions to access the Emex registers #define IR_EMEX_DATA_EXCHANGE 0x90 // 09 #define IR_EMEX_READ_TRIGGER 0x50 // 0A @@ -289,8 +219,6 @@ #define IR_TDO_EVENT 0x26 // 64 #define IR_TDO_EVENT_CTL 0xA6 // 65 -#endif - #define EEMEV 0x0100 // Registers in the EMEX logic #define MX_WRITE 0 // Write offset @@ -371,12 +299,13 @@ #define STATUS_REG_V 0x0100 #define WDTCTL_ADDRESS 0x120 // Watchdog Timer control register address for 1xx/2xx/4xx family -#define WDTCTL_ADDRESS_5XX 0x15C // Watchdog Timer control register address for 5xx family #define WDTPW_DEF 0x5a // Watchdog Timer password. #define WDTHOLD_DEF 0x80 // Watchdog Timer hold. #define WDTSSEL_ACLK 0x03 // Watchdog Timer Clock Source #define SYSBSLC_ADDRESS 0x182 // SYS Module Bootstrap Loader control register address +#ifndef SYSBSLPE #define SYSBSLPE 0x8000 // SYS - BSL Memory protection enalbed +#endif #define FLASHPW_DEF 0xa5 // Flash password. @@ -425,7 +354,177 @@ //#define INFO_SEGMENT_SIZE 128 // And Information segments are 128 bytes in size. //JMB DR Requests -#define DR_JMB_PASSWORD_EXCHANGE_REQUEST 0x1E1E +#define DR_JMB_PASSWORD_EXCHANGE_REQUEST 0x1E1E #define MAGIC_PATTERN 0xA55A + +//******************************************************************************************************** +// MSP432 +//******************************************************************************************************** +// General purpose definitions +#define READ 0x1 +#define WRITE 0x0 +#define MAX_RETRY 40 +#define ACK 0x2 +#define SWD_ACK 0x1 + +#define DAPABORT 0x01 +#define STKCMPCLR 0x02 +#define STKERRCLR 0x04 +#define WDERRCLR 0x08 +#define ORUNERRCLR 0x10 + +// JTAG Instruction Register definitions +#define IR4_ABORT 0x8 // Used to force an AP abort +#define IR4_DPACC 0xA // DP IR dpacc +#define IR4_APACC 0xB // AP IR apacc +#define IR4_IDCODE 0xE // JTAG-DP TAP identification +#define IR4_BYPASS 0xF // Bypasses the device, by providing a direct path between DBGTDI and DBGTDO. + +// Debug Port register addresses +#define DP_DPIDR 0x00 // DP architecture register +#define DP_CTRL_STAT 0x04 // Control & Status +#define DP_SELECT 0x08 // Select Register (JTAG R/W & SW W) +#define DP_RDBUFF 0x0C // Read Buffer (Read Only) + +// CTRL_STAT register bits +#define DP_CTRL_STAT_CSYSPWRUPACK 0x80000000 +#define DP_CTRL_STAT_CSYSPWRUPREQ 0x40000000 +#define DP_CTRL_STAT_CDBGPWRUPACK 0x20000000 +#define DP_CTRL_STAT_CDBGPWRUPREQ 0x10000000 +#define DP_CTRL_STAT_CDBGRSTACK 0x08000000 +#define DP_CTRL_STAT_CDBGRSTREQ 0x04000000 +#define DP_CTRL_STAT_WDATAERR 0x00000080 +#define DP_CTRL_STAT_STICKYERR 0x00000020 +#define DP_CTRL_STAT_STICKYCMP 0x00000010 +#define DP_CTRL_STAT_STICKYORUN 0x00000002 + +// Access Port register addresses +#define AP_CSW 0x00 // Control/Status word +#define AP_TAR 0x04 // Transfer Address Register +#define AP_DRW 0x0C // Data Read/Write Register +#define AP_BD0 0x10 // Banked data 0 +#define AP_BD1 0x14 // Banked data 1 +#define AP_BD2 0x18 // Banked data 2 +#define AP_BD3 0x1C // Banked data 3 +#define AP_CFG 0xF4 // Configuration register +#define AP_BASE 0xF8 // Debug Base Address register +#define AP_IDR 0xFC // Indentification register + +// CSW bits +#define AP_CSW_SIZE_MASK 0x0000000F +#define AP_CSW_SIZE_8BIT 0x00000000 // Byte 8-bit transfer mode +#define AP_CSW_SIZE_16BIT 0x00000001 // Halfword 16-bit transfer mode +#define AP_CSW_SIZE_32BIT 0x00000002 // Word 32-bit transfer mode + +#define AP_CSW_ADDRINC_MASK 0x00000030 +#define AP_CSW_ADDRINC_OFF 0x00000000 // Auto-increment off +#define AP_CSW_ADDRINC_SINGLE 0x00000010 // Increment single +#define AP_CSW_ADDRINC_PACKED 0x00000020 // Increment packed + +#define AP_CSW_MODE_MASK 0x00000F00 +#define AP_CSW_MODE_BASIC 0x00000000 // Basic mode +#define AP_CSW_MODE_BARRIER 0x00000001 // Barrier mode + +// SCS Register offsets +#define AIRCR (0xe000e000 + 0x00000D0C) // Application Interrupt and Reset Control Register +#define DFSR (0xe000e000 + 0x00000D30) // Debug Fault Status Register +#define DHCSR (0xe000e000 + 0x00000DF0) // Debug Halting Control and Status Register +#define DCRSR (0xe000e000 + 0x00000DF4) // Debug Core Register Selector Register +#define DCRDR (0xe000e000 + 0x00000DF8) // Debug Core Register Data Register +#define DEMCR (0xe000e000 + 0x00000DFC) // Debug Exception and Monitor Control Register +#define SCB_SCR (0xe000e000 + +0x00000D00 + 0x10) // System Control Register + +#define SCB_SCR_SLEEPONEXIT_Msk 0x00000002 + +//DEMCR regs +#define xPSR_REG 0x10 +#define MSP_SP 0x11 +#define PSP_SP 0x12 +#define spec_REG 0x14 + +// AIRCR bits +#define VECTKEY 0x05FA0000 // Vector Key. 0x05FA must be written anytime this register + // is written, otherwise the write is ignored (no bits are + // changed in the register). +#define VECTKEYSTAT 0xFFFF0000 // Reads as 0xFA05. +#define SYSRESETREQ 0x00000004 // Writing this bit 1 will cause a signal to be asserted to the external system to indicate a reset is requested. +#define VECTCLRACTIVE 0x00000002 // Clears all active state information for fixed and configurable exceptions. This bit self-clears. +#define VECTRESET 0x00000001 // Local system reset + +// DFSR bits +#define EXTERNAL 0x00000010 // An asynchronous exception generated due to the assertion of EDBGRQ. +#define VCATCH 0x00000008 // Vector catch triggered. Corresponding FSR will contain the primary cause of the exception. +#define DWTTRAP 0x00000004 // Data Watchpoint and Trace trap. Indicates that the core halted due to at least one DWT trap event. +#define BKPT 0x00000002 // BKPT instruction executed or breakpoint match in FPB. +#define HALTED 0x00000001 // Halt request, including step debug command. Stopped on next instruction. + +// DHCSR bits +#define DBGKEY 0xA05F0000 // Debug Key. The value 0xA05F must be written to enable write + // accesses to bits [15:0], otherwise the write access will be ignored. +#define S_RESET_ST 0x02000000 // Core reset since the last time this bit was read. This is a sticky bit, which clears on read. +#define S_RETIRE_ST 0x01000000 // Instruction has completed (retired) since last read. This is a sticky bit, which clears on read. + // This bit can be used to determine if the core is stalled on a load/store or fetch. +#define S_LOCKUP 0x00080000 // Core is locked up due to an unrecoverable exception. +#define S_SLEEP 0x00040000 // Core is sleeping. Must set the C_HALT bit to gain control, or wait for an interrupt + // (WFI instruction response) to wake-up the system. +#define S_HALT 0x00020000 // Core is in Debug state. +#define S_REGRDY 0x00010000 // A handshake flag. The bit is cleared to ’0’ on a write to the + // Debug Core Register Selector Register and is set to ’1’ when + // the transfer to/from the Debug Core Register Data Register is complete. +#define C_SNAPSTALL 0x00000020 // If the core is stalled on a load/store operation (see S_RETIRE_ST), setting this bit will break + // the stall and force the instruction to complete. This bit can only be set if C_DEBUGEN and C_HALT are set, + // and S_RETIRE_ST is clear. The bus state is UNPREDICTABLE when C_SNAPSTALL is set. +#define C_MASKINTS 0x00000008 // Mask PendSV, SysTick and external configurable interrupts when debug is enabled. The bit does not affect NMI. When + // C_DEBUGEN==0, this bit is UNKNOWN. +#define C_STEP 0x00000004 // Step the core. +#define C_HALT 0x00000002 // Halt the core. +#define C_DEBUGEN 0x00000001 // Enable halting debug. + +// DCRSR bits +#define REG_WnR 0x00010000 // Write = 1, Read = 0 + +// DEMCR bits +#define TRCENA 0x01000000 // Global enable for all features configured and controlled by the DWT and ITM blocks. +#define MON_REQ 0x00080000 // A DebugMonitor semaphore bit. +#define MON_STEP 0x00040000 // When MON_EN is set, this bit is used to step the core. +#define MON_PEND 0x00020000 // Pend the DebugMonitor exception to activate when priority allows. +#define MON_EN 0x00010000 // Enable the DebugMonitor exception. +#define VC_HARDERR 0x00000400 // Debug trap on a HardFault exception. +#define VC_INTERR 0x00000200 // Debug trap on a fault occurring during an exception entry or return sequence. +#define VC_BUSERR 0x00000100 // Debug trap on a BusFault exception. +#define VC_STATERR 0x00000080 // Debug trap on a UsageFault exception due to a state information error (for example an UNDEFINED instruction). +#define VC_CHKERR 0x00000040 // Debug trap on a UsageFault exception due to a checking error (for example an alignment check error). +#define VC_NOCPERR 0x00000020 // Debug trap on a UsageFault access to a Coprocessor. +#define VC_MMERR 0x00000010 // Debug trap on a MemManage exception. +#define VC_CORERESET 0x00000001 // Reset Vector Catch. Halt a running system when a Local Reset occurs. + +// FPB definitions +#define FP_CTRL (armConfigSettings.fpbBase + 0x00000000) // FlashPatch control +#define FP_REMAP (armConfigSettings.fpbBase + 0x00000004) // FlashPatch remapping address +#define FP_COMP(i) (armConfigSettings.fpbBase + 0x00000008 + i * 4) // FlashPatch comparator (i) control + +// FP_CTRL bits +#define KEY 0x00000002 +#define ENABLE 0x00000001 + +// JTAG Instruction Register definitions +#define ABORT (0x8) // Used to force an AP abort +#define DPACC (0xA) // DP IR dpacc +#define APACC (0xB) // AP IR apacc +#define IDCODE (0xE) // JTAG-DP TAP identification +#define BYPASS (0xF) // Bypasses the device, by providing a direct path between DBGTDI and DBGTDO. + +// DP_SELECT Register bits +#define DP_SELECT_APBANKSEL_MASK (0x000000F0) // APBANKSEL Mask +#define DP_SELECT_APSEL_MASK (0xFF000000) // APBANKSEL Mask + +// SWD register access +#define SWD_AP (1) +#define SWD_DP (0) + +// SWD register access +#define SWD_AP (1) +#define SWD_DP (0) + #endif /* _JTAG_defs_H_ */ diff --git a/Bios/src/hal/UifHal.h b/Bios/src/hal/UifHal.h deleted file mode 100644 index 2d6cf63..0000000 --- a/Bios/src/hal/UifHal.h +++ /dev/null @@ -1,2623 +0,0 @@ -/* - * UIFHal.h - * - * Copyright (C) 2007 - 2011 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. - */ - -/* http://srecord.sourceforge.net/ */ -const unsigned short halImage[] = -{ -0xD75E, 0x45DE, 0x2918, 0xC48C, 0x8205, 0x0004, 0x0000, 0x0000, 0x0000, -0xDA36, 0x0001, 0xD92C, 0x0002, 0xD15A, 0x0003, 0xCE0E, 0x0004, 0xCBBE, -0x0005, 0x9C78, 0x0006, 0xD994, 0x0007, 0xAAE4, 0x0008, 0xD126, 0x0009, -0xCEEE, 0x000A, 0xBABA, 0x000B, 0xAF0E, 0x000C, 0x95DC, 0x000D, 0xD4A4, -0x000E, 0xD8CC, 0x000F, 0xD5E8, 0x0010, 0xB8CA, 0x0011, 0x6676, 0x0012, -0x4F68, 0x0013, 0x5F3A, 0x0014, 0xAD68, 0x0015, 0xA18C, 0x0016, 0x9942, -0x0017, 0x9F8E, 0x0018, 0xA474, 0x0019, 0xC50C, 0x001A, 0xC5FC, 0x001B, -0x8222, 0x001C, 0xC060, 0x001D, 0xBE36, 0x001E, 0xA566, 0x001F, 0x3838, -0x0020, 0x2F0E, 0x0021, 0xC960, 0x0022, 0xC946, 0x0023, 0x8D64, 0x0024, -0x8D5C, 0x0025, 0x910C, 0x0026, 0x5CB6, 0x0027, 0x54EC, 0x0028, 0x7102, -0x0029, 0xAA04, 0x002A, 0xB178, 0x002B, 0x9248, 0x002C, 0x9B6C, 0x002D, -0xA658, 0x002E, 0xBEC2, 0x002F, 0x7BA2, 0x0030, 0xB972, 0x0031, 0xB610, -0x0032, 0x8FCC, 0x0033, 0x33D4, 0x0034, 0xC916, 0x0035, 0x8D52, 0x0036, -0x8BF4, 0x0037, 0xA748, 0x0038, 0xC588, 0x0039, 0x6CF6, 0x003A, 0x40B0, -0x003B, 0x68C8, 0x003C, 0xBFD6, 0x003D, 0xB3D4, 0x003E, 0xB30C, 0x003F, -0xB81C, 0x0040, 0x74AC, 0x0041, 0xA380, 0x0042, 0xB0AC, 0x0043, 0x8944, -0x0044, 0x485A, 0x0045, 0x9A5A, 0x0046, 0x9D84, 0x0047, 0x79EE, 0x0048, -0x523E, 0x0049, 0x5790, 0x004A, 0xAE3C, 0x004B, 0xCAE6, 0x004C, 0xBA1A, -0x004D, 0x7EFE, 0x004E, 0xA920, 0x004F, 0x6F06, 0xAFDE, 0x46F0, 0x406E, -0x3F54, 0x3F34, 0x3EFC, 0x3DC2, 0xD8C4, 0xD1EA, 0xD1BA, 0x4762, 0x8678, -0x4534, 0x452C, 0x4526, 0x4520, 0x4516, 0x450E, 0x44CA, 0x448E, 0xDA10, -0x5555, 0x5555, 0x1711, 0x1711, 0x1B16, 0x1711, 0x0108, 0x0402, 0x0030, -0x0031, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, -0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, 0x0000, 0x0120, -0x5A80, 0x0000, 0x0000, 0x015C, 0x5A80, 0x0000, 0x0000, 0x015C, 0x5A80, -0x0000, 0x0000, 0x015C, 0x5A80, 0x0000, 0x0000, 0x0120, 0x5A80, 0x0000, -0x0000, 0x015C, 0x5A80, 0x0000, 0x0000, 0x015C, 0x5A83, 0x0000, 0x0000, -0x0120, 0x5A80, 0x0120, 0x5A80, 0x015C, 0x5A80, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0301, 0x0705, 0x0281, -0x0000, 0x0000, 0xFF04, 0x0FFF, 0x0600, 0x0001, 0x0000, 0x0180, 0x0000, -0x0000, 0x0000, 0x0000, 0x0109, 0x0503, 0x8107, 0x0002, 0x0000, 0x0400, -0xFFFF, 0x000F, 0x0106, 0x0000, 0x8000, 0x0001, 0x0000, 0x0000, 0x0000, -0x0A00, 0x0A02, 0x020A, 0x0A0A, 0x0A02, 0x0008, 0x0808, 0x0800, 0x020A, -0x080A, 0x0800, 0x0008, 0x0108, 0x0109, 0x0009, 0x0008, 0x0308, 0x030B, -0x020B, 0x020A, 0x010A, 0x0009, 0x0008, 0x0308, 0x020B, 0x020A, 0x010A, -0x0009, 0x0308, 0x020B, 0xFF0A, 0x40B2, 0x5A80, 0x0120, 0xC232, 0x40F2, -0x0087, 0x0057, 0x45C2, 0x0056, 0x46C2, 0x0057, 0x43C2, 0x0058, 0xEA0A, -0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x40B2, 0x5A80, -0x0120, 0xC232, 0xD072, 0x0040, 0x4032, 0x0040, 0x40F2, 0x0080, 0x0052, -0x43C2, 0x0050, 0x45C2, 0x0051, 0x40F2, 0x0080, 0x0053, 0x43C2, 0x0054, -0xEA0A, 0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF, 0x0001, -0x0A00, 0x401E, 0x8B60, 0x8D8C, 0x8F8E, 0x8890, 0x9291, 0x9493, 0x9695, -0x7574, 0x7776, 0x9897, 0x9A99, 0x9C9B, 0x9E9D, 0x289F, 0x2A29, 0x2C2B, -0x2E2D, 0x302F, 0x8A8A, 0xA8A8, 0xB5B0, 0xBDBC, 0xBFBE, 0xC1C0, 0xD5D4, -0xD6D6, 0x8ED8, 0x318F, 0xFF01, 0x1204, 0x1205, 0x1206, 0x1207, 0x1208, -0x1209, 0x120A, 0x120B, 0x120C, 0x120D, 0x120E, 0x120F, 0x403C, 0x139A, -0x403D, 0x017A, 0x12B0, 0xD346, 0x403C, 0x128E, 0x403D, 0x2876, 0x403E, -0x00A1, 0x12B0, 0xDA32, 0x413F, 0x413E, 0x413D, 0x413C, 0x413B, 0x413A, -0x4139, 0x4138, 0x4137, 0x4136, 0x4135, 0x4134, 0x4030, 0xC48C, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8221, 0xB2D2, -0x2780, 0x1100, 0x2404, 0x40B2, 0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x403A, 0x150C, 0x403B, -0x1504, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0x4259, 0x277E, 0x4946, -0xE376, 0x4218, 0x2784, 0xF6C8, 0x0000, 0xD9C8, 0x0000, 0xD232, 0x4B27, -0xEAE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B27, 0xEAE7, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B27, 0xEAE7, 0x0000, 0x4C81, 0x0000, 0x4D81, 0x0002, -0x4304, 0x4305, 0x430C, 0x430D, 0x430E, 0x403F, 0x8000, 0xBC81, 0x0000, -0x2019, 0xBD81, 0x0002, 0x240D, 0x3C15, 0xB31C, 0x2BF7, 0xBC81, 0x0000, -0x2003, 0xBD81, 0x0002, 0x240A, 0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, -0x0010, 0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, -0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, -0xF6C8, 0x0000, 0x5404, 0x6505, 0x4217, 0x2782, 0xB2D7, 0x2781, 0x0000, -0x2002, 0x4347, 0x3C01, 0x4357, 0xD704, 0xD9C8, 0x0000, 0xD232, 0x4B27, -0xEAE7, 0x0000, 0xC312, 0x100F, 0x100E, 0x100D, 0x100C, 0x4C07, 0xDD07, -0xDE07, 0xDF07, 0x9307, 0x23C2, 0xB2D2, 0x2780, 0x1100, 0x241E, 0x40B2, -0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, -0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, 0x0000, 0xD232, 0x4B2F, -0xEAEF, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4B2F, 0xEAEF, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, -0x01F0, 0x4B2F, 0xEAEF, 0x0000, 0xC232, 0x4303, 0xF6C8, 0x0000, 0xD9C8, -0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0x440C, 0x450D, 0x430E, 0x430F, -0x5221, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x120D, 0x120C, 0xB2D2, 0x2780, 0x1100, 0x2404, 0x40B2, -0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x403A, 0x150C, 0x403B, 0x1504, 0x4B2F, 0xEAEF, 0x0000, -0xC232, 0x4303, 0x4258, 0x277E, 0x4846, 0xE376, 0x4219, 0x2784, 0xF6C9, -0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0x40B2, 0x2845, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, -0xC232, 0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, -0xC232, 0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, -0x0000, 0x4304, 0x4305, 0x430C, 0x403D, 0x8000, 0xBC81, 0x0000, 0x2019, -0xBD81, 0x0002, 0x240D, 0x3C15, 0xB31C, 0x2BF7, 0xBC81, 0x0000, 0x2003, -0xBD81, 0x0002, 0x240A, 0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, 0x0010, -0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4B27, 0xEAE7, 0x0000, 0xC232, 0x4303, 0xF6C9, -0x0000, 0x5404, 0x6505, 0x4217, 0x2782, 0xB2D7, 0x2781, 0x0000, 0x2002, -0x4347, 0x3C01, 0x4357, 0xD704, 0xD8C9, 0x0000, 0xD232, 0x4B27, 0xEAE7, -0x0000, 0xC312, 0x100D, 0x100C, 0x4C07, 0xDD07, 0x9307, 0x23C6, 0xB2D2, -0x2780, 0x1100, 0x241E, 0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, 0xC232, 0x4303, 0xF6C9, 0x0000, -0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, 0x40B2, 0x2845, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4B2F, 0xEAEF, 0x0000, 0xC232, -0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, -0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4B2F, 0xEAEF, 0x0000, 0xC232, -0x4303, 0xF6C9, 0x0000, 0xD8C9, 0x0000, 0xD232, 0x4B2F, 0xEAEF, 0x0000, -0x440C, 0x450D, 0x3F13, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x120D, 0x120C, 0xB2D2, 0x2780, 0x1100, 0x2404, 0x40B2, -0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x403F, 0x150C, 0x403E, 0x1504, 0x4E2B, 0xEFEB, 0x0000, -0xC232, 0x4303, 0x425A, 0x277E, 0x421B, 0x2784, 0xCACB, 0x0000, 0xDACB, -0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, -0x0010, 0x01E8, 0xD392, 0x01E8, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, -0xCACB, 0x0000, 0xDACB, 0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0xD0B2, -0x0010, 0x01E8, 0xD392, 0x01E8, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, -0xCACB, 0x0000, 0xDACB, 0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0x430C, -0x430D, 0x4304, 0x4235, 0xB481, 0x0000, 0x2019, 0xB581, 0x0002, 0x240D, -0x3C15, 0xB314, 0x2BF7, 0xB481, 0x0000, 0x2003, 0xB581, 0x0002, 0x240A, -0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, -0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4E28, 0xEFE8, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, 0x5C0C, 0x6D0D, -0x4218, 0x2782, 0xB2D8, 0x2781, 0x0000, 0x2002, 0x4348, 0x3C01, 0x4358, -0xD80C, 0xDACB, 0x0000, 0xD232, 0x4E28, 0xEFE8, 0x0000, 0xC312, 0x1005, -0x1004, 0x4408, 0xD508, 0x9308, 0x23C6, 0xB2D2, 0x2780, 0x1100, 0x241E, -0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4E27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, 0xDACB, 0x0000, 0xD232, -0x4E27, 0xEFE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, -0xDACB, 0x0000, 0xD232, 0x4E27, 0xEFE7, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x4E27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xCACB, 0x0000, -0xDACB, 0x0000, 0xD232, 0x4E2B, 0xEFEB, 0x0000, 0x4C0F, 0xC312, 0x100D, -0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, 0xF03D, -0x000F, 0x3E21, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x120C, 0x8031, 0x0034, 0x4381, 0x0006, 0x4381, 0x000C, 0x4381, -0x000A, 0x40B1, 0x0BB8, 0x0004, 0x403A, 0x1360, 0x403B, 0x1358, 0x4038, -0x1354, 0x4074, 0x0042, 0x4075, 0x0021, 0x4037, 0x2401, 0x4079, 0x00C8, -0x4076, 0x0082, 0xB31C, 0x29A9, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD8BC, -0x2404, 0x403C, 0xFFFE, 0x4030, 0x33CC, 0x403C, 0x142C, 0x12B0, 0xD8BC, -0x2404, 0x403C, 0xFFFD, 0x4030, 0x33CC, 0x403C, 0x1432, 0x12B0, 0xD8BC, -0x2404, 0x403C, 0xFFFC, 0x4030, 0x33CC, 0x403C, 0x1428, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2404, 0x403C, 0xFFFB, 0x4030, 0x33CC, 0x403C, -0x1424, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2404, 0x403C, 0xFFFA, -0x4030, 0x33CC, 0x403C, 0x1430, 0x12B0, 0xD8BC, 0x2403, 0x403C, 0xFFF9, -0x3DFD, 0x403C, 0x142E, 0x12B0, 0xD8E4, 0x2003, 0x403C, 0xFFF8, 0x3DF5, -0x403C, 0x1436, 0x12B0, 0xD8E4, 0x27F8, 0x403C, 0x1434, 0x12B0, 0xD8E4, -0x27F3, 0x464C, 0x12A8, 0x403C, 0x4030, 0x12B0, 0x8E8E, 0x403C, 0x0C04, -0x12B0, 0x8E8E, 0x12B0, 0x8F56, 0x435C, 0x12AA, 0x4381, 0x0000, 0x412F, -0x5F0F, 0x4F81, 0x0002, 0x421F, 0x1432, 0x511F, 0x0002, 0x4F81, 0x0008, -0x12B0, 0x8E8A, 0x12B0, 0x8F96, 0x411C, 0x0008, 0x12B0, 0x8F1A, 0x411F, -0x0002, 0x4C8F, 0x13C4, 0x12B0, 0xD8EC, 0x5391, 0x0000, 0x90B1, 0x0030, -0x0000, 0x3BE2, 0x12B0, 0x8EEE, 0x403C, 0x4582, 0x12B0, 0x8F26, 0x4C82, -0x1438, 0x12B0, 0x8EE6, 0x403C, 0x4682, 0x12B0, 0x8F26, 0x4C82, 0x143A, -0x12B0, 0x8EE6, 0x403C, 0x4982, 0x12B0, 0x8F26, 0x4C82, 0x143C, 0x12B0, -0x8EE6, 0x403C, 0x4882, 0x12B0, 0x8F26, 0x4C82, 0x143E, 0x12B0, 0x8EE6, -0x403C, 0x4A82, 0x12B0, 0x8F26, 0x4C82, 0x1440, 0x12B0, 0x8EE6, 0x403C, -0x4B82, 0x12B0, 0x8F26, 0x4C82, 0x1442, 0x12B0, 0x8EE6, 0x403C, 0x4C82, -0x12B0, 0x8F26, 0x4C82, 0x1444, 0x12B0, 0x8EDA, 0x12B0, 0x8EB8, 0x403C, -0x0128, 0x12B0, 0x8F1A, 0x4C82, 0x1446, 0x12B0, 0x8EDA, 0x454C, 0x12A8, -0x12B0, 0x8EB8, 0x403C, 0x012A, 0x12B0, 0x8F1A, 0x4C82, 0x1448, 0x12B0, -0x8F02, 0x4C82, 0x144A, 0x12B0, 0xD8EC, 0xE0B2, 0x3300, 0x1446, 0xE0B2, -0x3300, 0x1448, 0xE0B2, 0x3300, 0x144A, 0x12B0, 0x8F5E, 0x403C, 0xA544, -0x12B0, 0x8EC8, 0x12B0, 0x8FA6, 0x12B0, 0x8EFC, 0x4C81, 0x0000, 0x12B0, -0xD8EC, 0x91E2, 0x142E, 0x2404, 0x12B0, 0x8FA6, 0x12B0, 0x8EC4, 0x410C, -0x503C, 0x000E, 0x403E, 0x0007, 0x12B0, 0xD494, 0x4291, 0x1428, 0x000E, -0x4291, 0x1424, 0x0010, 0x4291, 0x1430, 0x0012, 0x4291, 0x142E, 0x0014, -0x4291, 0x1436, 0x0018, 0x4291, 0x1434, 0x001A, 0x410C, 0x503C, 0x000E, -0x12B0, 0xA096, 0x12B0, 0x8EEE, 0x403C, 0x4032, 0x12B0, 0xD6D6, 0x430C, -0x12B0, 0x8EA8, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, 0x240B, 0x9382, -0x1380, 0x2408, 0x407C, 0x0090, 0x12A8, 0x403C, 0x0088, 0x12AB, 0x431C, -0x12AB, 0x12B0, 0x8F42, 0x12B0, 0x8E94, 0x12B0, 0xD8A8, 0x53B1, 0x0004, -0x421E, 0x1432, 0x4E0F, 0x503F, 0x0020, 0x9F0C, 0x2805, 0x4E0F, 0x503F, -0x0026, 0x9C0F, 0x2C03, 0x9381, 0x0004, 0x23ED, 0x4E0C, 0x12B0, 0xABBC, -0x3C68, 0x410C, 0x503C, 0x000A, 0x12B0, 0xD8D4, 0x4C81, 0x0006, 0x12B0, -0x8F96, 0x411C, 0x0002, 0x12B0, 0x8FBC, 0x411C, 0x000A, 0x12B0, 0x8E8E, -0x53A1, 0x0002, 0x9191, 0x0008, 0x0002, 0x2C03, 0x9381, 0x0006, 0x27E6, -0x12B0, 0xD8EC, 0x411F, 0x0002, 0x821F, 0x1432, 0x503F, 0xFFA0, 0xC312, -0x100F, 0x4F81, 0x0000, 0x12B0, 0x8EEE, 0x403C, 0x4036, 0x12B0, 0xD6D6, -0x412C, 0x12B0, 0xD6D6, 0x12B0, 0xD5A2, 0x435C, 0x12AA, 0x12B0, 0x8EE6, -0x403C, 0x4035, 0x12B0, 0xD6D6, 0x421C, 0x1428, 0x12B0, 0x8EA8, 0x412E, -0x5E0E, 0x5E82, 0x1428, 0x6382, 0x142A, 0x412E, 0x8E82, 0x1424, 0x7382, -0x1426, 0x12B0, 0x8F42, 0x503C, 0x0028, 0x12B0, 0x8E94, 0x40B1, 0x0BB8, -0x0004, 0x12B0, 0xD8A8, 0x53B1, 0x0004, 0x421F, 0x1432, 0x503F, 0x005C, -0x9F0C, 0x2403, 0x9381, 0x0004, 0x23F3, 0x421C, 0x1432, 0x12B0, 0xABBC, -0x9381, 0x0004, 0x2003, 0x40B1, 0xFFF7, 0x0006, 0x421F, 0x1424, 0xD21F, -0x1426, 0x930F, 0x2424, 0x9381, 0x0006, 0x2021, 0x9381, 0x0004, 0x241E, -0x421F, 0x1432, 0x503F, 0x0060, 0x4F81, 0x0002, 0x421C, 0x1424, 0x421D, -0x1426, 0x5C0C, 0x6D0D, 0x421E, 0x142C, 0x930D, 0x2003, 0x9E0C, 0x2C01, -0x4C0E, 0x5F0E, 0x4E81, 0x0008, 0x12B0, 0x8E8A, 0x494C, 0x12A8, 0x403C, -0x2408, 0x12AB, 0x3F81, 0xB3A1, 0x0034, 0x2C03, 0x9391, 0x0006, 0x2452, -0x410C, 0x503C, 0x001C, 0x403E, 0x2796, 0x423D, 0x12B0, 0xD454, 0x410F, -0x503F, 0x0024, 0x120F, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x001E, -0x4214, 0x1112, 0x1294, 0x000E, 0x403C, 0x0003, 0x1292, 0x1190, 0x410C, -0x503C, 0x0026, 0x421F, 0x1112, 0x129F, 0x0010, 0x403C, 0x1438, 0x12B0, -0xA096, 0x12B0, 0x8E8A, 0x12B0, 0x8F8A, 0x403C, 0x0128, 0x12B0, 0x8FBC, -0x421C, 0x1446, 0x12B0, 0x8EC8, 0x12B0, 0x8F5E, 0x421C, 0x1448, 0x12B0, -0x8EC8, 0x12B0, 0x8F9C, 0x12B0, 0x8EFC, 0x4C44, 0x12B0, 0xD8EC, 0x5321, -0x94C2, 0x144A, 0x2404, 0x12B0, 0x8F9C, 0x12B0, 0x8EC4, 0xB3A1, 0x0034, -0x2806, 0x430C, 0x421F, 0x1112, 0x129F, 0x0008, 0x3C0F, 0x9391, 0x0006, -0x2009, 0x407C, 0x0091, 0x421F, 0x1112, 0x129F, 0x0012, 0x4381, 0x0006, -0x3C03, 0x40B1, 0xFFF6, 0x0006, 0x411C, 0x0006, 0x5031, 0x0036, 0x4030, -0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, -0x120C, 0x8031, 0x0042, 0x4381, 0x0006, 0x4381, 0x000C, 0x4381, 0x000A, -0x40B1, 0x0BB8, 0x0004, 0x4037, 0x1356, 0x403A, 0x1360, 0x403B, 0x1358, -0x4038, 0x1354, 0x4075, 0x0021, 0x4079, 0x00C8, 0x4076, 0x0082, 0x4074, -0x0088, 0xB31C, 0x2931, 0x410C, 0x503C, 0x000C, 0x12B0, 0xD94C, 0x2403, -0x403C, 0xFFFE, 0x3DFF, 0x403C, 0x1456, 0x12B0, 0xD94C, 0x2403, 0x403C, -0xFFFD, 0x3DF7, 0x403C, 0x145C, 0x12B0, 0xD94C, 0x2403, 0x403C, 0xFFFC, -0x3DEF, 0x403C, 0x1452, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFFB, 0x3DE4, 0x403C, 0x144C, 0x421F, 0x1112, 0x129F, 0x0018, -0x930C, 0x2403, 0x403C, 0xFFFA, 0x3DD9, 0x403C, 0x145A, 0x12B0, 0xD94C, -0x2403, 0x403C, 0xFFF9, 0x3DD1, 0x403C, 0x1458, 0x12B0, 0xD924, 0x2003, -0x403C, 0xFFF8, 0x3DC9, 0x403C, 0x1460, 0x12B0, 0xD924, 0x27F8, 0x403C, -0x145E, 0x12B0, 0xD924, 0x27F3, 0x12B0, 0x5A32, 0x403C, 0x0560, 0x12B0, -0x5A9C, 0x4E82, 0x1462, 0x4F82, 0x1464, 0x12B0, 0x5A32, 0x403C, 0x0660, -0x12B0, 0x5A7E, 0x4E82, 0x1466, 0x4F82, 0x1468, 0x12B0, 0x5A32, 0x403C, -0x0960, 0x12B0, 0x5A9C, 0x4E82, 0x146A, 0x4F82, 0x146C, 0x12B0, 0x5A32, -0x403C, 0x0860, 0x12B0, 0x5A7E, 0x4E82, 0x146E, 0x4F82, 0x1470, 0x12B0, -0x5A32, 0x403C, 0x0A60, 0x12B0, 0x5A9C, 0x4E82, 0x1472, 0x4F82, 0x1474, -0x12B0, 0x5A32, 0x403C, 0x0B60, 0x12B0, 0x5A7E, 0x4E82, 0x1476, 0x4F82, -0x1478, 0x12B0, 0x5A32, 0x403C, 0x0C60, 0x12B0, 0x5A9C, 0x4E82, 0x147A, -0x4F82, 0x147C, 0x12B0, 0x5A42, 0x12B0, 0x5A24, 0x403C, 0x0128, 0x12B0, -0x5A4A, 0x4C82, 0x147E, 0x12B0, 0x5B48, 0x12B0, 0x5A24, 0x403C, 0x012A, -0x12B0, 0x5A4A, 0x4C82, 0x1480, 0x12B0, 0x5BC2, 0x4C82, 0x1482, 0x12B0, -0x5B38, 0xE0B2, 0x3300, 0x147E, 0xE0B2, 0x3300, 0x1480, 0xE0B2, 0x3300, -0x1482, 0x12B0, 0x5A5C, 0x403C, 0x012A, 0x12B0, 0x5C46, 0x403C, 0xA544, -0x12B0, 0x5B32, 0x12B0, 0x5B48, 0x12B0, 0x5C60, 0x12B0, 0x5A24, 0x12B0, -0x5A2A, 0x421C, 0x1458, 0x12B0, 0x5B32, 0x12B0, 0x5BC2, 0x4C81, 0x0000, -0x12B0, 0x5B38, 0x91E2, 0x1458, 0x2408, 0x12B0, 0x5A5C, 0x12B0, 0x5A2A, -0x421C, 0x1458, 0x12B0, 0x5B26, 0x410C, 0x503C, 0x0016, 0x403E, 0x000E, -0x12B0, 0xD494, 0x4291, 0x1452, 0x0016, 0x4291, 0x1454, 0x0018, 0x4291, -0x144C, 0x001A, 0x4291, 0x144E, 0x001C, 0x4291, 0x145A, 0x001E, 0x4381, -0x0020, 0x4291, 0x1458, 0x0022, 0x4381, 0x0024, 0x4291, 0x1460, 0x002A, -0x4381, 0x002C, 0x4291, 0x145E, 0x002E, 0x4381, 0x0030, 0x410C, 0x503C, -0x0016, 0x12B0, 0x9702, 0x12B0, 0x5AE2, 0x460C, 0x12B0, 0x5A56, 0x430C, -0x12B0, 0x5A66, 0x4291, 0x145C, 0x0000, 0x12B0, 0x5B76, 0x494C, 0x12A8, -0x403C, 0x0401, 0x12AB, 0x454C, 0x12A8, 0x407C, 0x00A8, 0x12A8, 0x12B0, -0x5AFA, 0x503E, 0x0022, 0x430F, 0x930D, 0x2002, 0x9E0C, 0x2809, 0x421E, -0x145C, 0x503E, 0x002C, 0x9D0F, 0x2803, 0x2005, 0x9C0E, 0x2C03, 0x9381, -0x0004, 0x23EB, 0x421F, 0x144C, 0xD21F, 0x144E, 0x930F, 0x2492, 0x9381, -0x0006, 0x208F, 0x9381, 0x0004, 0x248C, 0x421F, 0x145C, 0x503F, 0x006C, -0x4F81, 0x0008, 0x421C, 0x144C, 0x421D, 0x144E, 0x5C0C, 0x6D0D, 0x421E, -0x1456, 0x930D, 0x2003, 0x9E0C, 0x2C01, 0x4C0E, 0x5F0E, 0x4E81, 0x0002, -0x421F, 0x145C, 0x503F, 0x0068, 0x12B0, 0x5B72, 0x12B0, 0x5A42, 0x407C, -0x0048, 0x12A8, 0x423C, 0x12AB, 0x3C13, 0x410C, 0x503C, 0x000A, 0x12B0, -0xD944, 0x4C81, 0x0006, 0x12B0, 0x5A24, 0x411C, 0x0008, 0x12B0, 0x5C46, -0x411C, 0x000A, 0x12B0, 0x5B6C, 0x53A1, 0x0008, 0x9191, 0x0002, 0x0008, -0x2C03, 0x9381, 0x0006, 0x27E6, 0x12B0, 0x5B38, 0x411F, 0x0008, 0x821F, -0x145C, 0x503F, 0xFF94, 0xC312, 0x100F, 0x4F81, 0x0002, 0x12B0, 0x5AE2, -0x403C, 0x0086, 0x12B0, 0x5A56, 0x411C, 0x0002, 0x12B0, 0x5A66, 0x421C, -0x1452, 0x421D, 0x1454, 0x12B0, 0x5B3E, 0xD03C, 0x0085, 0x4C81, 0x0000, -0x12B0, 0x5AE2, 0x412C, 0x12B0, 0x5A56, 0x421C, 0x1452, 0x12B0, 0x5A66, -0x411E, 0x0002, 0x5E0E, 0x5E82, 0x1452, 0x6382, 0x1454, 0x411E, 0x0002, -0x8E82, 0x144C, 0x7382, 0x144E, 0x421F, 0x145C, 0x503F, 0x002E, 0x12B0, -0x5B72, 0x407C, 0x00A8, 0x12A8, 0x40B1, 0x0BB8, 0x0004, 0x12B0, 0x5AFA, -0x503E, 0x0068, 0x9E0C, 0x2002, 0x930D, 0x276C, 0x9381, 0x0004, 0x23F5, -0x3F68, 0xB3A1, 0x0042, 0x2819, 0x410C, 0x503C, 0x000E, 0x403E, 0x279E, -0x12B0, 0xD586, 0x120F, 0x12B0, 0xD298, 0x12B0, 0x5BC8, 0x5321, 0x91E2, -0x1482, 0x2402, 0x12B0, 0x5B16, 0x421C, 0x1450, 0x421F, 0x1112, 0x129F, -0x0008, 0x3C21, 0x9391, 0x0006, 0x2009, 0x407C, 0x0091, 0x421F, 0x1112, -0x129F, 0x0012, 0x4381, 0x0006, 0x3C15, 0x410C, 0x503C, 0x000E, 0x403E, -0x27A6, 0x12B0, 0xD586, 0x120F, 0x12B0, 0xD298, 0x12B0, 0x5BC8, 0x5321, -0x91E2, 0x1482, 0x2402, 0x12B0, 0x5B16, 0x40B1, 0xFFF6, 0x0006, 0x411C, -0x0006, 0x5031, 0x0044, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x120C, 0x8031, 0x0032, 0x4381, 0x0004, -0x4381, 0x000A, 0x4381, 0x0008, 0x40B1, 0x0BB8, 0x0000, 0x403A, 0x1360, -0x403B, 0x1358, 0x4038, 0x1354, 0x4074, 0x0021, 0x4037, 0x2401, 0x4075, -0x0042, 0x4079, 0x0082, 0x4076, 0x00C8, 0xB31C, 0x2926, 0x410C, 0x503C, -0x000A, 0x12B0, 0x80B0, 0x2403, 0x403C, 0xFFFE, 0x3DFA, 0x403C, 0x13A4, -0x12B0, 0x80B0, 0x2403, 0x403C, 0xFFFD, 0x3DF2, 0x403C, 0x13AA, 0x12B0, -0x80B0, 0x2403, 0x403C, 0xFFFC, 0x3DEA, 0x403C, 0x13A0, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFB, 0x3DDF, 0x403C, 0x139A, -0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, 0x3DD4, -0x403C, 0x13A8, 0x12B0, 0x80B0, 0x2403, 0x403C, 0xFFF9, 0x3DCC, 0x403C, -0x13A6, 0x12B0, 0x80A0, 0x2003, 0x403C, 0xFFF8, 0x3DC4, 0x403C, 0x13AE, -0x12B0, 0x80A0, 0x27F8, 0x403C, 0x13AC, 0x12B0, 0x80A0, 0x27F3, 0x12B0, -0xD314, 0x403C, 0x4582, 0x12B0, 0x8100, 0x4C82, 0x13B0, 0x12B0, 0xD310, -0x403C, 0x4682, 0x12B0, 0x8100, 0x4C82, 0x13B2, 0x12B0, 0xD310, 0x403C, -0x4982, 0x12B0, 0x8100, 0x4C82, 0x13B4, 0x12B0, 0xD310, 0x403C, 0x4882, -0x12B0, 0x8100, 0x4C82, 0x13B6, 0x12B0, 0xD310, 0x403C, 0x4A82, 0x12B0, -0x8100, 0x4C82, 0x13B8, 0x12B0, 0xD310, 0x403C, 0x4B82, 0x12B0, 0x8100, -0x4C82, 0x13BA, 0x12B0, 0xD310, 0x403C, 0x4C82, 0x12B0, 0x8100, 0x4C82, -0x13BC, 0x12B0, 0x812C, 0x12B0, 0x809A, 0x403C, 0x0128, 0x12B0, 0x80B8, -0x4C82, 0x13BE, 0x12B0, 0x8174, 0x12B0, 0x8130, 0x12B0, 0x809A, 0x403C, -0x012A, 0x12B0, 0x80B8, 0x4C82, 0x13C0, 0x12B0, 0x815E, 0x4C82, 0x13C2, -0x12B0, 0x8174, 0xE0B2, 0x3300, 0x13BE, 0xE0B2, 0x3300, 0x13C0, 0xE0B2, -0x3300, 0x13C2, 0x12B0, 0x8130, 0x12B0, 0xD646, 0x12B0, 0x809A, 0x403C, -0x012A, 0x12B0, 0x8184, 0x403C, 0xA544, 0x12B0, 0x8146, 0x12B0, 0x8154, -0x12B0, 0x814E, 0x12B0, 0x815E, 0x4C81, 0x0002, 0x12B0, 0x8174, 0x91D2, -0x0002, 0x13A6, 0x2406, 0x12B0, 0x8154, 0xD03C, 0x0040, 0x12B0, 0x8146, -0x410C, 0x503C, 0x0014, 0x403E, 0x0007, 0x12B0, 0xD494, 0x4291, 0x13A0, -0x0014, 0x4291, 0x139A, 0x0016, 0x4291, 0x13A8, 0x0018, 0x4291, 0x13A6, -0x001A, 0x4291, 0x13AE, 0x001E, 0x4291, 0x13AC, 0x0020, 0x410C, 0x503C, -0x0014, 0x12B0, 0xB49C, 0x12B0, 0xD314, 0x403C, 0x4032, 0x12B0, 0x80F8, -0x430C, 0x12B0, 0x8114, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, 0x240B, -0x9382, 0x1380, 0x2408, 0x407C, 0x0090, 0x12A8, 0x403C, 0x0088, 0x12AB, -0x431C, 0x12AB, 0x12B0, 0xD2AC, 0x12AB, 0x9382, 0x1506, 0x2402, 0x12B0, -0x80DC, 0x12B0, 0x80E4, 0x12B0, 0x811C, 0x435C, 0x12B0, 0x8200, 0x403C, -0x0401, 0x12AB, 0x444C, 0x12A8, 0x407C, 0x00A8, 0x12A8, 0x12B0, 0x80C4, -0x503F, 0x0020, 0x9F0C, 0x2806, 0x421F, 0x13AA, 0x503F, 0x0026, 0x9C0F, -0x2C03, 0x9381, 0x0000, 0x23F1, 0x421F, 0x139A, 0xD21F, 0x139C, 0x930F, -0x2498, 0x9381, 0x0004, 0x2095, 0x9381, 0x0000, 0x2492, 0x421F, 0x13AA, -0x503F, 0x0060, 0x4F81, 0x0006, 0x421C, 0x139A, 0x421D, 0x139C, 0x5C0C, -0x6D0D, 0x421E, 0x13A4, 0x930D, 0x2003, 0x9E0C, 0x2C01, 0x4C0E, 0x5F0E, -0x4E81, 0x0002, 0x12B0, 0xD2AC, 0x503C, 0x005C, 0x12AB, 0x9382, 0x1506, -0x2402, 0x12B0, 0x80DC, 0x12B0, 0x80E4, 0x12B0, 0x812C, 0x464C, 0x12A8, -0x403C, 0x2408, 0x12AB, 0x3C14, 0x410C, 0x523C, 0x12B0, 0x80A8, 0x4C81, -0x0004, 0x12B0, 0x809A, 0x411C, 0x0006, 0x12B0, 0x8184, 0x411C, 0x0008, -0x12B0, 0x814E, 0x434C, 0x12AA, 0x53A1, 0x0006, 0x9191, 0x0002, 0x0006, -0x2C03, 0x9381, 0x0004, 0x27E5, 0x12B0, 0x8174, 0x411F, 0x0006, 0x821F, -0x13AA, 0x503F, 0xFFA0, 0xC312, 0x100F, 0x4F81, 0x0002, 0x12B0, 0xD314, -0x403C, 0x4036, 0x12B0, 0x80F8, 0x411C, 0x0002, 0x12B0, 0x80F8, 0x12B0, -0xD36A, 0x12B0, 0xD310, 0x403C, 0x4035, 0x12B0, 0x80F8, 0x421C, 0x13A0, -0x12B0, 0x8114, 0x411E, 0x0002, 0x5E0E, 0x5E82, 0x13A0, 0x6382, 0x13A2, -0x411E, 0x0002, 0x8E82, 0x139A, 0x7382, 0x139C, 0x12B0, 0xD2AC, 0x503C, -0x0028, 0x12AB, 0x9382, 0x1506, 0x2402, 0x12B0, 0x80DC, 0x12B0, 0x80E4, -0x12B0, 0x811C, 0x407C, 0x00A8, 0x12A8, 0x40B1, 0x0BB8, 0x0000, 0x12B0, -0x80C4, 0x503F, 0x005C, 0x9F0C, 0x2766, 0x9381, 0x0000, 0x23F7, 0x3F62, -0xB3A1, 0x0032, 0x2819, 0x410C, 0x503C, 0x000C, 0x403E, 0x2786, 0x12B0, -0xD5DA, 0x120F, 0x12B0, 0xD2D4, 0x12B0, 0x818C, 0x5321, 0x91E2, 0x13C2, -0x2402, 0x12B0, 0x8164, 0x421C, 0x139E, 0x421F, 0x1112, 0x129F, 0x0008, -0x3C21, 0x9391, 0x0004, 0x2009, 0x407C, 0x0091, 0x421F, 0x1112, 0x129F, -0x0012, 0x4381, 0x0004, 0x3C15, 0x410C, 0x503C, 0x000C, 0x403E, 0x278E, -0x12B0, 0xD5DA, 0x120F, 0x12B0, 0xD2D4, 0x12B0, 0x818C, 0x5321, 0x91E2, -0x13C2, 0x2402, 0x12B0, 0x8164, 0x40B1, 0xFFF6, 0x0004, 0x411C, 0x0004, -0x5031, 0x0034, 0x4030, 0xD41E, 0x120A, 0x120B, 0x425E, 0x2780, 0x421A, -0x2784, 0x403F, 0x150C, 0x403B, 0x1504, 0x934C, 0x204F, 0x9392, 0x14FE, -0x201E, 0x4B2D, 0xD3DD, 0x0000, 0xDECA, 0x0000, 0xB2B2, 0x136C, 0x4B2B, -0x2803, 0xDFEB, 0x0000, 0x3C02, 0xCFEB, 0x0000, 0x431C, 0x12B0, 0xD1BA, -0xC2DA, 0x277E, 0x0000, 0xC0F2, 0x0020, 0x0029, 0x431C, 0x12B0, 0xD1BA, -0x436C, 0x12B0, 0x8678, 0x3DDF, 0x425D, 0x277E, 0x525D, 0x277F, 0x5E4D, -0xDDCA, 0x0000, 0xB2B2, 0x136C, 0x4B2E, 0x2803, 0xCFEE, 0x0000, 0x3C02, -0xDFEE, 0x0000, 0xD0F2, 0x0040, 0x0029, 0xC0F2, 0x0020, 0x0029, 0x431C, -0x12B0, 0xD1BA, 0x93A2, 0x14FE, 0x2003, 0x407C, 0x0003, 0x3FDE, 0x9392, -0x14FE, 0x2004, 0xD2DA, 0x277E, 0x0000, 0x3C03, 0x4B2F, 0xC3DF, 0x0000, -0x403C, 0x0005, 0x12B0, 0xD1BA, 0x3FD1, 0x9392, 0x14FE, 0x201C, 0x4B2D, -0xD3DD, 0x0000, 0xDECA, 0x0000, 0xB2B2, 0x136C, 0x4B2B, 0x2803, 0xDFEB, -0x0000, 0x3C02, 0xCFEB, 0x0000, 0x431C, 0x12B0, 0xD1BA, 0xC2DA, 0x277E, -0x0000, 0xC0F2, 0x0020, 0x0029, 0x431C, 0x12B0, 0xD1BA, 0x434C, 0x3FB0, -0x425D, 0x277E, 0x525D, 0x277F, 0x5E4D, 0xDDCA, 0x0000, 0xB2B2, 0x136C, -0x4B2E, 0x2803, 0xCFEE, 0x0000, 0x3C02, 0xDFEE, 0x0000, 0xD0F2, 0x0040, -0x0029, 0xC0F2, 0x0020, 0x0029, 0x431C, 0x12B0, 0xD1BA, 0x93A2, 0x14FE, -0x23B6, 0x435C, 0x3F92, 0x12B0, 0x3C92, 0x430C, 0x4130, 0x434C, 0x1292, -0x1360, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x2401, 0x1292, 0x1358, -0x407C, 0x0021, 0x1292, 0x1354, 0x435C, 0x1292, 0x1360, 0x407C, 0x0028, -0x1292, 0x1354, 0x430C, 0x4210, 0x1358, 0x4130, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x4C0A, 0x4038, 0x1354, 0x407C, 0x00C8, 0x12A8, 0x4039, -0x1358, 0x403C, 0x3401, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, -0x12A9, 0x4036, 0x1360, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x4A0C, 0x822C, -0x12A9, 0x9382, 0x1506, 0x2404, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x434C, -0x12A6, 0x407C, 0x0021, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A6, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x435C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, 0x12A9, 0x434C, 0x12A6, -0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A6, 0x434C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x4A0C, 0x832C, 0x12A9, 0x4030, 0xD424, -0x120A, 0x120B, 0x1208, 0x4C0A, 0x407C, 0x0082, 0x1292, 0x1354, 0x4038, -0x1360, 0x435C, 0x12A8, 0x403C, 0x4030, 0x1292, 0x1358, 0x434C, 0x12A8, -0x435C, 0x12A8, 0x4A0C, 0x832C, 0x1292, 0x1358, 0x434C, 0x12A8, 0x435C, -0x12A8, 0x434C, 0x12A8, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x407C, 0x0021, -0x1292, 0x1354, 0x430C, 0x1292, 0x1358, 0x4030, 0xD428, 0x930C, 0x2002, -0x430F, 0x3C01, 0x431F, 0x4F82, 0x1500, 0x9392, 0x14FE, 0x2008, 0x930F, -0x2403, 0x403F, 0x6418, 0x3C0A, 0x403F, 0x654A, 0x3C07, 0x930F, 0x2403, -0x403F, 0x937E, 0x3C02, 0x403F, 0x941A, 0x4F82, 0x1364, 0x4130, 0x930C, -0x2405, 0x403F, 0x3DFE, 0x403E, 0x3DCA, 0x3C04, 0x403F, 0x3EA6, 0x403E, -0x3DFC, 0x4E82, 0x1366, 0x4F82, 0x1362, 0x4130, 0x430F, 0xB3A2, 0x136C, -0x2805, 0x930C, 0x2003, 0x4382, 0x14FE, 0x3C11, 0xB2A2, 0x136C, 0x2805, -0x931C, 0x2003, 0x4392, 0x14FE, 0x3C09, 0xB3A2, 0x136C, 0x2805, 0x932C, -0x2003, 0x43A2, 0x14FE, 0x3C01, 0x433F, 0xB2B2, 0x136C, 0x2804, 0x403E, -0x0032, 0x436D, 0x3C03, 0x403E, 0x001D, 0x426D, 0x4DC2, 0x150C, 0x4E82, -0x1504, 0x9392, 0x14FE, 0x2032, 0x40B2, 0x7434, 0x134E, 0x40B2, 0x72E0, -0x1350, 0x40B2, 0xDA2E, 0x1352, 0x40B2, 0x6AE4, 0x1354, 0x40B2, 0x7838, -0x1356, 0x40B2, 0x7D52, 0x1358, 0x40B2, 0x2D2A, 0x135A, 0x40B2, 0x2B56, -0x135C, 0x40B2, 0x2968, 0x135E, 0x40B2, 0xB6C0, 0x1360, 0x9382, 0x1500, -0x2003, 0x403E, 0x654A, 0x3C02, 0x403E, 0x6418, 0x403D, 0xC6DC, 0x40B2, -0x0006, 0x01EE, 0x40B2, 0x0006, 0x01F6, 0x40B2, 0x284B, 0x01F2, 0x3C2A, -0x40B2, 0xCA04, 0x134E, 0x40B2, 0xCEC6, 0x1350, 0x40B2, 0x9824, 0x1352, -0x40B2, 0xC40A, 0x1354, 0x40B2, 0xC1FA, 0x1356, 0x40B2, 0xB76E, 0x1358, -0x40B2, 0x850C, 0x135A, 0x40B2, 0xAC92, 0x135C, 0x40B2, 0x94B2, 0x135E, -0x40B2, 0xD4C4, 0x1360, 0x9382, 0x1500, 0x2003, 0x403E, 0x941A, 0x3C02, -0x403E, 0x937E, 0x403D, 0xC7A6, 0x42A2, 0x01F6, 0x4D82, 0x1368, 0x4E82, -0x1364, 0x4F0C, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0xB2B2, 0x136C, -0x2807, 0x429C, 0x1502, 0x0000, 0x429D, 0x1502, 0x0000, 0x3C0F, 0xB2F2, -0x001D, 0x2804, 0x431C, 0x12B0, 0x4620, 0x3C01, 0x430C, 0x4C8A, 0x0000, -0x430C, 0x12B0, 0x4620, 0x4C8B, 0x0000, 0x430C, 0x413B, 0x413A, 0x4130, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, -0x0020, 0x4381, 0x000C, 0x4381, 0x000E, 0x4038, 0x1358, 0x4039, 0x1354, -0x9382, 0x138E, 0x2412, 0x407C, 0x00F4, 0x12B0, 0xD3AC, 0x4C0B, 0x407C, -0x00F4, 0x12A9, 0xC21B, 0x138E, 0xD21B, 0x1392, 0x4B0C, 0x12A8, 0x403C, -0x0014, 0x1292, 0x275A, 0x4037, 0x135C, 0x421F, 0x1382, 0xD21F, 0x1384, -0x930F, 0x2419, 0x407C, 0x0054, 0x12A9, 0x12B0, 0xBFBC, 0x4C0A, 0x4D0B, -0x407C, 0x0054, 0x12A9, 0xC21A, 0x1382, 0xC21B, 0x1384, 0xD21A, 0x138A, -0xD21B, 0x138C, 0x4A0C, 0x4B0D, 0x12A7, 0x403C, 0x0014, 0x1292, 0x275A, -0x407C, 0x00D0, 0x12B0, 0xD3AC, 0x4074, 0x0028, 0x934C, 0x3882, 0x444C, -0x12B0, 0xD3AC, 0xB03C, 0x0020, 0x2C7C, 0x407C, 0x00B0, 0x12A9, 0x431C, -0x12B0, 0xBFB8, 0x4C81, 0x001C, 0x4D81, 0x001E, 0x403C, 0x0003, 0x12B0, -0xBFB8, 0x4C81, 0x0018, 0x4D81, 0x001A, 0x403C, 0x0005, 0x12B0, 0xBFB8, -0x4C81, 0x0014, 0x4D81, 0x0016, 0x403C, 0x0007, 0x12B0, 0xBFB8, 0x4C81, -0x0010, 0x4D81, 0x0012, 0x403C, 0x0081, 0x12B0, 0xBFB8, 0x4C0A, 0x4D0B, -0x432C, 0x12B0, 0xBFB8, 0x422C, 0x430D, 0x12A7, 0x433C, 0x403D, 0x000F, -0x12A7, 0x403C, 0x0006, 0x12B0, 0xBF66, 0x403C, 0x0080, 0x12B0, 0xBF66, -0x403C, 0x0088, 0x430D, 0x12A7, 0x403C, 0x000E, 0x430D, 0x12A7, 0x12B0, -0xBF7E, 0x403C, 0x0007, 0x12A8, 0x4306, 0x407C, 0x00D0, 0x12B0, 0xD3AC, -0x5316, 0x934C, 0x3803, 0x9036, 0x0BB8, 0x3BF6, 0x407C, 0x00B0, 0x12A9, -0x12B0, 0xBFBC, 0x411C, 0x001C, 0x411D, 0x001E, 0x12A7, 0x432C, 0x430D, -0x12A7, 0x411C, 0x0018, 0x411D, 0x001A, 0x12A7, 0x422C, 0x430D, 0x12A7, -0x411C, 0x0014, 0x411D, 0x0016, 0x12A7, 0x403C, 0x0006, 0x430D, 0x12A7, -0x411C, 0x0010, 0x411D, 0x0012, 0x12A7, 0x403C, 0x0080, 0x430D, 0x12A7, -0x4A0C, 0x4B0D, 0x12A7, 0x12B0, 0xBF7E, 0x403C, 0x0005, 0x12A8, 0x4077, -0x00C8, 0x12B0, 0xBF5C, 0x444C, 0x12A9, 0x403A, 0x0032, 0x430B, 0x430C, -0x12A8, 0x533A, 0x633B, 0x933C, 0x2403, 0xB03C, 0x0200, 0x2C04, 0x4A0F, -0xDB0F, 0x930F, 0x23F3, 0x12B0, 0xBF7E, 0x403C, 0x0007, 0x12A8, 0x403C, -0x0006, 0x12A8, 0x12B0, 0xBF5C, 0x444C, 0x12B0, 0xD3AC, 0x4036, 0x1360, -0xB23C, 0x2C06, 0x3C18, 0x12B0, 0xBFB0, 0x444C, 0x12B0, 0xD3AC, 0xB23C, -0x2811, 0x411C, 0x000C, 0x411D, 0x000E, 0x4C0E, 0x4D0F, 0x531E, 0x630F, -0x4E81, 0x000C, 0x4F81, 0x000E, 0x930D, 0x2003, 0x903C, 0x7530, 0x2BE8, -0x444C, 0x12A9, 0x434C, 0x12A6, 0x430C, 0x12A8, 0xB03C, 0x0100, 0x2002, -0x4345, 0x3C01, 0x4355, 0x435C, 0x12A6, 0x531A, 0x630B, 0x9345, 0x2005, -0x930B, 0x2003, 0x903A, 0x2710, 0x2BEB, 0x12B0, 0xBFA6, 0x407C, 0x0021, -0x12A9, 0x4035, 0x135A, 0x430C, 0x430D, 0x12A5, 0x4C0A, 0x4D0B, 0x444C, -0x12B0, 0xD3AC, 0xB03C, 0x0020, 0x2803, 0x503A, 0xFFFE, 0x3C02, 0x503A, -0xFFFC, 0x633B, 0x903A, 0xFFFE, 0x2010, 0x930B, 0x200E, 0x12B0, 0xBF84, -0x403C, 0xFFFE, 0x12B0, 0xD3A0, 0x4C0B, 0x12B0, 0xBF4C, 0x4B81, 0x0006, -0x4381, 0x0008, 0x3C04, 0x4A81, 0x0006, 0x4B81, 0x0008, 0x12B0, 0xBF7E, -0x403C, 0x000E, 0x12A8, 0x444C, 0x12B0, 0xD3AC, 0x410C, 0x532C, 0x421F, -0x1112, 0x129F, 0x0016, 0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x12B0, -0xBF84, 0x411C, 0x0002, 0x12B0, 0xD3A0, 0x4C81, 0x0004, 0x12B0, 0xBF4C, -0x415F, 0x0004, 0xDF81, 0x0000, 0x434C, 0x12A6, 0x474C, 0x12A9, 0x403C, -0x0500, 0x12A8, 0x12B0, 0xBF88, 0x411C, 0x0002, 0x12B0, 0xD9E4, 0x407C, -0x00A1, 0x12A9, 0x412C, 0xD03C, 0x0080, 0x12A8, 0x434C, 0x12A6, 0x12B0, -0xBF9C, 0x435C, 0x12A6, 0x12B0, 0xBF54, 0x4074, 0x0082, 0x444C, 0x12B0, -0xBF96, 0x403C, 0x0260, 0x12B0, 0xBFC2, 0x9382, 0x1398, 0x2403, 0x403C, -0x0FF6, 0x3C02, 0x403C, 0x018C, 0x12B0, 0xBF70, 0x9382, 0x1398, 0x2402, -0x12B0, 0xBF9C, 0x12B0, 0xBF92, 0x430C, 0x12A8, 0x4C0A, 0x12B0, 0xBFB0, -0x430C, 0x12A8, 0x12B0, 0xBF54, 0x12B0, 0xBF4C, 0x9382, 0x1398, 0x2002, -0x12B0, 0xBF9C, 0x12B0, 0xBF8E, 0x4A81, 0x000A, 0x434C, 0x12A6, 0x444C, -0x12B0, 0xBF96, 0x440C, 0x12B0, 0xBFC2, 0x4A0C, 0xF03C, 0xFFEF, 0x12B0, -0xBF70, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0021, 0x12A9, 0x430C, -0x12B0, 0xD9E4, 0x12B0, 0xBFA6, 0x12B0, 0xBF8E, 0x423D, 0x410C, 0x522C, -0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, 0x0020, 0x4030, 0xD41E, -0x934C, 0x240E, 0x9392, 0x14FE, 0x2006, 0x421F, 0x2784, 0xD2DF, 0x277E, -0x0000, 0x3C04, 0x421F, 0x1504, 0xC3DF, 0x0000, 0x3DD2, 0x9392, 0x14FE, -0x2006, 0x421F, 0x2784, 0xC2DF, 0x277E, 0x0000, 0x3FF6, 0x421F, 0x1504, -0xD3DF, 0x0000, 0x3FF1, 0x934C, 0x2410, 0x9392, 0x14FE, 0x2006, 0x421F, -0x2784, 0xD2DF, 0x2780, 0x0000, 0x3C06, 0xC0F2, 0x0020, 0x0029, 0xD0F2, -0x0040, 0x0029, 0x3DB2, 0x9392, 0x14FE, 0x2006, 0x421F, 0x2784, 0xC2DF, -0x2780, 0x0000, 0x3FF6, 0xC0F2, 0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, -0x3FEF, 0x421F, 0x1504, 0x4F6C, 0x4130, 0x421F, 0x1504, 0x4CCF, 0x0000, -0x4130, 0x425C, 0x0029, 0x4130, 0x4CC2, 0x0029, 0x4130, 0x421F, 0x2784, -0x4F6C, 0x4130, 0x421F, 0x2784, 0x3FF0, 0x934C, 0x2407, 0xD2E2, 0x001D, -0xD0F2, 0x0010, 0x001D, 0x434E, 0x3C06, 0xC0F2, 0x0010, 0x001D, 0xC2E2, -0x001D, 0x435E, 0x4EC2, 0x150E, 0x4130, 0x403E, 0xBAEC, 0x403F, 0x0041, -0x43D2, 0x150D, 0xD0F2, 0x0080, 0x002A, 0xD0F2, 0x0080, 0x002E, 0x40B2, -0x0028, 0x0172, 0x40B2, 0x0090, 0x0162, 0x40B2, 0x0114, 0x0160, 0x3C02, -0x533E, 0x633F, 0x93C2, 0x150D, 0x2404, 0x4E0D, 0xDF0D, 0x930D, 0x23F7, -0x4382, 0x0162, 0xC0F2, 0x0080, 0x002E, 0xC0F2, 0x0080, 0x002A, 0x4130, -0x4C0F, 0xDD0F, 0x930F, 0x2410, 0x12B0, 0x455E, 0x93C2, 0x150E, 0x2404, -0xD0F2, 0x0020, 0x001D, 0x3C03, 0xD0F2, 0x0040, 0x001D, 0x403C, 0x000A, -0x4030, 0xD1BA, 0xF0F2, 0x009F, 0x001D, 0x4130, 0x53D2, 0x1512, 0x90F2, -0x000A, 0x1512, 0x201A, 0x43C2, 0x1512, 0x4382, 0x0160, 0xC3A2, 0x01A0, -0x40F2, 0x0012, 0x0080, 0xD3A2, 0x01A0, 0xD392, 0x01A0, 0xB392, 0x01A4, -0x2BFD, 0x90B2, 0x0FFF, 0x0140, 0x3404, 0x40B2, 0x0114, 0x0160, 0x1300, -0x43C2, 0x150D, 0x1300, 0x4C0F, 0x430C, 0x922F, 0x2C14, 0x5F0F, 0x4F1C, -0x0140, 0x5F1C, 0x0148, 0x5F1C, 0x0150, 0x5F1C, 0x0158, 0x4F1E, 0x2776, -0x12B0, 0xD08A, 0x108C, 0x108D, 0xED4C, 0xED0C, 0xF37D, 0x12B0, 0xD0D8, -0x4130, 0x120A, 0x120B, 0x1208, 0x4C0A, 0x9A82, 0x1508, 0x242C, 0x4A0C, -0x430D, 0x12B0, 0xBC0C, 0x403E, 0x41A3, 0x403F, 0xC4D6, 0x12B0, 0x87E6, -0x4C0E, 0x4D0F, 0x403C, 0xF000, 0x403D, 0x457F, 0x12B0, 0x87E2, 0x12B0, -0xD712, 0x4C08, 0x5038, 0x0055, 0x4A0C, 0x403E, 0x0014, 0x12B0, 0xD036, -0x8C08, 0x9038, 0x1000, 0x3802, 0x4038, 0x0FFF, 0x9308, 0x3401, 0x4308, -0x4882, 0x01C8, 0xD3A2, 0x01C0, 0x4A82, 0x1508, 0x3C1A, 0x431C, 0x12B0, -0x4620, 0x4C0B, 0x4A0F, 0x503F, 0x000A, 0x9B0F, 0x2C07, 0x90B2, 0x0FFF, -0x01C8, 0x2C0D, 0x5392, 0x01C8, 0x3C0A, 0x4A0F, 0x503F, 0xFFF6, 0x9F0B, -0x2C05, 0x9382, 0x01C8, 0x2402, 0x53B2, 0x01C8, 0x4030, 0xD428, 0x120A, -0x4C0A, 0x930A, 0x2428, 0x93C2, 0x132E, 0x2419, 0xC2F2, 0x0031, 0xC0F2, -0x0020, 0x0029, 0x4A82, 0x1502, 0x4A0C, 0x503C, 0x0032, 0x12B0, 0x4652, -0x421F, 0x1504, 0xD2FF, 0x0000, 0x431C, 0x12B0, 0xD1BA, 0xD0F2, 0x0020, -0x0029, 0x43C2, 0x132E, 0x3C16, 0x4A82, 0x1502, 0x4A0C, 0x503C, 0x0032, -0x12B0, 0x4652, 0x421F, 0x1504, 0xD2FF, 0x0000, 0x3C0A, 0x421F, 0x1504, -0xC2FF, 0x0000, 0x1292, 0x2756, 0x4382, 0x1502, 0x43D2, 0x132E, 0x430C, -0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x430C, 0x12B0, 0x4620, 0x4C0A, -0x431C, 0x12B0, 0x4620, 0x4C0B, 0x403C, 0x0003, 0x12B0, 0x4620, 0x4C08, -0x903A, 0x06A4, 0x3813, 0x421F, 0x150A, 0x503F, 0xFFF6, 0x9F0A, 0x3806, -0x421F, 0x150A, 0x503F, 0x000A, 0x9A0F, 0x3402, 0x4A82, 0x150A, 0x421C, -0x150A, 0x12B0, 0x4652, 0x3C07, 0x9382, 0x1502, 0x2422, 0x421C, 0x1502, -0x12B0, 0x46F0, 0x9382, 0x1502, 0x241B, 0x93C2, 0x150F, 0x2418, 0x8B08, -0x9038, 0x0097, 0x3814, 0x53D2, 0x1511, 0x90F2, 0x000B, 0x1511, 0x2810, -0x43D2, 0x1510, 0x12B0, 0xD8C4, 0xC2F2, 0x001D, 0x4382, 0x1502, 0x435C, -0x421F, 0x1112, 0x129F, 0x0020, 0x3C02, 0x43C2, 0x1511, 0x430C, 0x4030, -0xD428, 0x9392, 0x14FE, 0x2016, 0x421F, 0x2784, 0xD2DF, 0x2780, 0x0000, -0x421F, 0x1504, 0xD2DF, 0x150C, 0x0000, 0x431C, 0x12B0, 0xD1BA, 0x421F, -0x2784, 0xC2DF, 0x277E, 0x0000, 0xD0F2, 0x0020, 0x0029, 0x3C0F, 0x421F, -0x1504, 0xD2DF, 0x150C, 0x0000, 0xD0F2, 0x0020, 0x0029, 0x431C, 0x12B0, -0xD1BA, 0x421F, 0x1504, 0xD3DF, 0x0000, 0x403C, 0x0005, 0x4030, 0xD1BA, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x120C, -0x8031, 0x003A, 0x4381, 0x000C, 0x4381, 0x0016, 0x4381, 0x0018, 0x4381, -0x000A, 0x4381, 0x0008, 0x430A, 0x403B, 0x1360, 0x4038, 0x1358, 0x4039, -0x1354, 0x4036, 0x1112, 0xB31C, 0x28B3, 0x410C, 0x503C, 0x000C, 0x12B0, -0xD768, 0x2403, 0x403C, 0xFFFE, 0x3DA5, 0x432C, 0x462F, 0x129F, 0x001A, -0x410C, 0x503C, 0x0006, 0x12B0, 0xD768, 0x2403, 0x403C, 0xFFFC, 0x3D98, -0x410C, 0x503C, 0x0016, 0x462F, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, -0xFFFB, 0x3D8D, 0x403C, 0x1484, 0x462F, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFFA, 0x3D83, 0x410C, 0x523C, 0x12B0, 0xD768, 0x2403, 0x403C, -0xFFF9, 0x3D7B, 0x410C, 0x503C, 0x000A, 0x462F, 0x129F, 0x0016, 0x933C, -0x2003, 0x403C, 0xFFF8, 0x3D70, 0x422C, 0x462F, 0x129F, 0x001A, 0x933C, -0x27F7, 0x4191, 0x0016, 0x001A, 0x4191, 0x0018, 0x001C, 0x4291, 0x1484, -0x001E, 0x4291, 0x1486, 0x0020, 0x4191, 0x0008, 0x0022, 0x4381, 0x0024, -0x4191, 0x000A, 0x0026, 0x4381, 0x0028, 0x410C, 0x503C, 0x001A, 0x12B0, -0xC388, 0x407C, 0x0028, 0x12A9, 0x430C, 0x12A8, 0x12B0, 0xC966, 0x403C, -0x0080, 0x12A8, 0x434C, 0x12B0, 0xD9BC, 0x403C, 0x1400, 0x12B0, 0xD0FE, -0x411C, 0x0006, 0x12A8, 0x12B0, 0xD106, 0x403C, 0x4303, 0x12A8, 0x434C, -0x12AB, 0x12B0, 0xD430, 0x12B0, 0xD9BC, 0x403C, 0x0401, 0x12A8, 0x407C, -0x0021, 0x12A9, 0x407C, 0x00A8, 0x12A9, 0x4381, 0x0002, 0x4381, 0x0004, -0x4304, 0x4305, 0x403C, 0x0005, 0x12B0, 0xCDD8, 0x2004, 0x90B1, 0xABAD, -0x0004, 0x2405, 0x9305, 0x2003, 0x9034, 0x012C, 0x2BF2, 0x9305, 0x2003, -0x9034, 0x012C, 0x2802, 0x403A, 0xFFF7, 0xB392, 0x1484, 0x280E, 0x53B2, -0x1484, 0x63B2, 0x1486, 0x4392, 0x149A, 0x3C07, 0x470C, 0x128F, 0x4C0A, -0x53B2, 0x1484, 0x63B2, 0x1486, 0x4624, 0x4037, 0x149C, 0x421F, 0x1484, -0xD21F, 0x1486, 0x930F, 0x2426, 0x930A, 0x2024, 0x441F, 0x0016, 0xB392, -0x1484, 0x2BE9, 0x403C, 0x149E, 0x128F, 0x4C0A, 0x4304, 0x4305, 0x47A1, -0x0000, 0x4217, 0x149E, 0x407C, 0x0086, 0x12A9, 0x430C, 0x12A8, 0x5314, -0x6305, 0x23DA, 0x9034, 0x0BB8, 0x2FD7, 0xB32C, 0x2BF6, 0x403C, 0x0011, -0x12A8, 0x412C, 0x12A8, 0x470C, 0x12A8, 0x3FCD, 0x9382, 0x149A, 0x242D, -0x930A, 0x202B, 0x421F, 0x1484, 0xD21F, 0x1486, 0x930F, 0x2025, 0xB3A1, -0x003A, 0x28AC, 0x470C, 0x1294, 0x0016, 0x4C0A, 0x4304, 0x4305, 0x4727, -0x407C, 0x0086, 0x12A9, 0x430C, 0x12A8, 0x5314, 0x6305, 0x2003, 0x9034, -0x0BB8, 0x2803, 0x403C, 0xFFBF, 0x3CA9, 0xB32C, 0x2BF3, 0x403C, 0x0011, -0x12A8, 0x470C, 0x12A8, 0x403C, 0xAAAA, 0x12A8, 0x4382, 0x149A, 0x3C03, -0xB3A1, 0x003A, 0x287F, 0x4304, 0x4305, 0x4381, 0x0002, 0x4381, 0x0004, -0x403C, 0x000A, 0x12B0, 0xCDD8, 0x2004, 0x90B1, 0xCAFE, 0x0004, 0x2405, -0x9305, 0x2003, 0x9034, 0x012C, 0x2BF2, 0x9305, 0x2003, 0x9034, 0x012C, -0x2851, 0x403A, 0xFFBF, 0x410C, 0x503C, 0x000E, 0x403E, 0x27AE, 0x12B0, -0xD540, 0x120F, 0x12B0, 0xD578, 0x4627, 0x1297, 0x000E, 0x12B0, 0xD25C, -0x12B0, 0xC966, 0x403C, 0x0A60, 0x12B0, 0xD0F2, 0x5321, 0x12B0, 0xD37C, -0x12B0, 0xD38E, 0x4034, 0x0501, 0x9382, 0x1398, 0x2404, 0x12B0, 0xD9BE, -0x440C, 0x12A8, 0x4077, 0x0042, 0x12B0, 0xC974, 0x41A2, 0x148A, 0x4582, -0x148C, 0x12B0, 0xC966, 0x403C, 0x0B60, 0x12B0, 0xD0F2, 0x12B0, 0xD37C, -0x12B0, 0xD38E, 0x9382, 0x1398, 0x2404, 0x12B0, 0xD9BE, 0x440C, 0x12A8, -0x12B0, 0xC974, 0x412F, 0x4F82, 0x148E, 0x4582, 0x1490, 0xD50F, 0x930F, -0x2409, 0x90B2, 0xFFFE, 0x148A, 0x2003, 0x9382, 0x148C, 0x2402, 0x403A, -0xFFF6, 0x410C, 0x503C, 0x000E, 0x403E, 0x27B6, 0x12B0, 0xD540, 0x120F, -0x12B0, 0xD578, 0x462B, 0x129B, 0x000E, 0x12B0, 0xD25C, 0x421C, 0x1488, -0x462F, 0x129F, 0x0008, 0x3C18, 0x931A, 0x2006, 0x407C, 0x0091, 0x1294, -0x0012, 0x430A, 0x3C11, 0x410C, 0x503C, 0x000E, 0x403E, 0x27BE, 0x12B0, -0xD540, 0x120F, 0x12B0, 0xD578, 0x1294, 0x000E, 0x12B0, 0xD25C, 0x403A, -0xFFF6, 0x5321, 0x4A0C, 0x5031, 0x003C, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x407A, 0x0006, 0x403B, 0x150C, 0x4038, 0x1504, -0x4039, 0x0190, 0xD0F2, 0x0040, 0x0029, 0x4216, 0x2758, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, -0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0x537A, 0x23CE, 0xC0F2, 0x0040, -0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xD0F2, -0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, -0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, -0xC0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, -0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, -0x0000, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, -0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xCBEF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, -0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xCBEF, 0x0000, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xCBEF, 0x0000, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, -0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x490C, -0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0x403C, 0x000A, 0x1292, -0x275A, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x0010, 0x410C, 0x503C, 0x0006, 0x403E, 0x0005, -0x12B0, 0xD494, 0x4381, 0x0004, 0x410C, 0x532C, 0x421F, 0x1112, 0x129F, -0x0016, 0x930C, 0x2403, 0x403C, 0xFFD3, 0x3D49, 0x410C, 0x421F, 0x1112, -0x129F, 0x0016, 0x933C, 0x2003, 0x403C, 0xFFD2, 0x3D3F, 0x403A, 0x1360, -0x435C, 0x12AA, 0x403B, 0x1354, 0x4074, 0x0028, 0x444C, 0x12AB, 0x4038, -0x1358, 0x430C, 0x12A8, 0x4079, 0x00C8, 0xB03C, 0x0200, 0x2C1D, 0x407C, -0x0088, 0x12AB, 0x407C, 0x0034, 0x1292, 0x1356, 0x12B0, 0xD5FA, 0x444C, -0x12AB, 0x4036, 0x0032, 0x3C02, 0x9306, 0x240A, 0x430C, 0x12A8, 0x5336, -0x933C, 0x27F9, 0xB03C, 0x0200, 0x2BF6, 0x9306, 0x2003, 0x403C, 0xFFD4, -0x3D0F, 0xB32C, 0x2807, 0x434C, 0x12AA, 0x12B0, 0xCAB0, 0x435C, 0x12AA, -0x3C02, 0x12B0, 0xCAB0, 0x407C, 0x0048, 0x12AB, 0x435C, 0x1292, 0x1356, -0x435C, 0x12AA, 0x4307, 0x12B0, 0xC2A6, 0x2406, 0x12B0, 0xC2C8, 0x5317, -0x9037, 0x000A, 0x2BF7, 0x9037, 0x000A, 0x2003, 0x403C, 0xFFD1, 0x3CEC, -0x12B0, 0xC292, 0x407C, 0x0030, 0x12AB, 0x403C, 0x0003, 0x12A8, 0x430C, -0x12A8, 0x4076, 0x0090, 0x93A2, 0x137C, 0x200D, 0x9382, 0x137E, 0x200A, -0x12B0, 0xCAA6, 0x403C, 0x000F, 0x12A8, 0x12B0, 0xCAA6, 0x403C, 0x000C, -0x12A8, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, 0x2414, 0x9382, 0x1380, -0x2411, 0x464C, 0x12AB, 0x403C, 0x0089, 0x12A8, 0x430C, 0x12A8, 0x4C07, -0x464C, 0x12AB, 0x403C, 0x0088, 0x12A8, 0xD037, 0x0010, 0x470C, 0x12A8, -0x4077, 0x0082, 0x12B0, 0xC286, 0x4035, 0xC0EA, 0x12B0, 0xCA9C, 0x239B, -0x12B0, 0xCABA, 0x934C, 0x3405, 0x12B0, 0xC286, 0x12B0, 0xCA9C, 0x2392, -0x12B0, 0xC280, 0x430C, 0x12B0, 0xCAE2, 0x238C, 0x4306, 0x444C, 0x12AB, -0x3C04, 0x12B0, 0xCA9C, 0x2385, 0x5316, 0x430C, 0x12A8, 0x934C, 0x3803, -0x9036, 0x000A, 0x2BF5, 0x9036, 0x000A, 0x277A, 0x407C, 0x0021, 0x12B0, -0xCABC, 0x822C, 0x4C81, 0x0008, 0x4381, 0x000A, 0x9306, 0x2019, 0x12B0, -0xCABA, 0xB03C, 0x0020, 0x2818, 0x53A1, 0x0008, 0x12B0, 0xC280, 0x403C, -0xC032, 0x12B0, 0xCAE2, 0x2361, 0x12B0, 0xC280, 0x403C, 0x0010, 0x12B0, -0xCAE2, 0x235A, 0x40B1, 0x0010, 0x0004, 0x3C04, 0x12B0, 0xC292, 0x4391, -0x000E, 0x12B0, 0xD5FA, 0x12B0, 0xC2A6, 0x2370, 0x12B0, 0xC2D8, 0x12B0, -0xCAC2, 0x12B0, 0xC2C2, 0x434C, 0x12AA, 0x430C, 0x12A8, 0x4C81, 0x0006, -0x12B0, 0xC2F8, 0x415F, 0x0006, 0xDF81, 0x0000, 0x12B0, 0xC2D8, 0x407C, -0x0048, 0x12AB, 0x427C, 0x1292, 0x1356, 0x12B0, 0xCAC2, 0x12AB, 0x412C, -0x12A8, 0x435C, 0x12AA, 0x12B0, 0xC2F8, 0x12B0, 0xCAD4, 0x403C, 0x4030, -0x12A8, 0x12B0, 0xC2C8, 0x403C, 0x0C04, 0x12A8, 0x9382, 0x1506, 0x2402, -0x12B0, 0xC2C8, 0x434C, 0x12AA, 0x407C, 0x0021, 0x12AB, 0x9382, 0x1506, -0x2002, 0x435C, 0x12AA, 0x12B0, 0xC2D0, 0x12B0, 0xCAD4, 0x403C, 0x4282, -0x12B0, 0xC2B8, 0x474C, 0x12AB, 0x403C, 0x00FE, 0x12B0, 0xC2B8, 0x12B0, -0xC2C8, 0x430C, 0x12A8, 0x4C81, 0x000C, 0x12B0, 0xC2D0, 0xD191, 0x0004, -0x000C, 0x403D, 0x000A, 0x410C, 0x503C, 0x0006, 0x421F, 0x1112, 0x129F, -0x0006, 0x430C, 0x5031, 0x0010, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x001A, 0x4308, 0x4309, -0x430A, 0x430B, 0x4381, 0x000A, 0x4381, 0x000C, 0x4381, 0x0002, 0x4381, -0x0004, 0x4381, 0x000E, 0x4381, 0x0010, 0x40B1, 0x0010, 0x0006, 0x4381, -0x0008, 0x4304, 0x4305, 0x4306, 0x4307, 0x410C, 0x503C, 0x000A, 0x12B0, -0xD66A, 0x3403, 0x403C, 0xFFC6, 0x3C7B, 0x410C, 0x532C, 0x12B0, 0xD66A, -0x3403, 0x403C, 0xFFC4, 0x3C73, 0x410C, 0x503C, 0x000E, 0x12B0, 0xD66A, -0x3BF7, 0x410C, 0x503C, 0x0006, 0x12B0, 0xD66A, 0x3403, 0x403C, 0xFFC3, -0x3C64, 0x411C, 0x0002, 0x411D, 0x0004, 0x411E, 0x000E, 0x411F, 0x0010, -0x4C81, 0x0012, 0x4D81, 0x0014, 0x4E81, 0x0016, 0x4F81, 0x0018, 0x92A1, -0x000A, 0x2033, 0x9381, 0x000C, 0x2030, 0x42B1, 0x0006, 0x4381, 0x0008, -0x43C1, 0x0000, 0x411C, 0x0012, 0x411D, 0x0014, 0x411E, 0x0016, 0x411F, -0x0018, 0x416B, 0x12B0, 0xCF16, 0xF31C, 0x5404, 0x6505, 0x6606, 0x6707, -0xDC04, 0x53D1, 0x0000, 0x92F1, 0x0000, 0x2BEA, 0x444C, 0x1292, 0x1354, -0x4C48, 0x4309, 0x430A, 0x430B, 0x480C, 0x490D, 0x421F, 0x1112, 0x129F, -0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, 0x000A, 0x3C1D, 0x4C04, -0x4D05, 0x4E06, 0x4F07, 0x411E, 0x000A, 0x411F, 0x000C, 0x930F, 0x20C1, -0x903E, 0x000B, 0x2CBE, 0x5E0E, 0x4E10, 0x5370, 0x5386, 0x5394, 0x5394, -0x539C, 0x5328, 0x53B4, 0x5418, 0x542A, 0x543A, 0x544C, 0x54C4, 0x1292, -0x134E, 0x430C, 0x5031, 0x001A, 0x4030, 0xD41E, 0x434C, 0x1292, 0x2754, -0x3FF7, 0x1292, 0x2756, 0x411F, 0x0002, 0xD11F, 0x0004, 0x930F, 0x27EF, -0x430C, 0x1292, 0x274A, 0x3FEB, 0x411E, 0x0006, 0x411F, 0x0008, 0x830F, -0x2029, 0x823E, 0x240B, 0x823E, 0x240D, 0x822E, 0x240F, 0x803E, 0x000C, -0x2414, 0x803E, 0x0020, 0x2414, 0x3C1C, 0x1292, 0x1356, 0x4C48, 0x3FAA, -0x1292, 0x1358, 0x4C08, 0x3FA6, 0xF035, 0x000F, 0x450D, 0x1292, 0x135A, -0x4C08, 0x4D09, 0x3F9E, 0x1292, 0x135C, 0x3FFA, 0x460E, 0x470F, 0x1292, -0x135E, 0x4C08, 0x4D09, 0x4E0A, 0x4F0B, 0x3F92, 0x403C, 0xFFC2, 0x3FBA, -0x407C, 0x0054, 0x1292, 0x1354, 0x440C, 0x450D, 0x1292, 0x135C, 0x3FB0, -0x407C, 0x00F4, 0x1292, 0x1354, 0x440C, 0x1292, 0x1358, 0x3FA8, 0x407C, -0x0046, 0x1292, 0x1354, 0x430C, 0x430D, 0x430E, 0x430F, 0x3FDC, 0x90B1, -0x0010, 0x0006, 0x2015, 0x9381, 0x0008, 0x2012, 0x4C07, 0x12B0, 0xD954, -0x12B0, 0xDA04, 0x531A, 0x630B, 0x202A, 0x903A, 0x0BB8, 0x2C27, 0xB31C, -0x2BF6, 0x431C, 0x1292, 0x1358, 0x470C, 0x3FDB, 0x90B1, 0x0020, 0x0006, -0x201C, 0x9381, 0x0008, 0x2019, 0x4C07, 0x4D08, 0x12B0, 0xD954, 0x12B0, -0xDA04, 0x531A, 0x630B, 0x2010, 0x903A, 0x0BB8, 0x2C0D, 0xB32C, 0x2BF6, -0x403C, 0x0011, 0x1292, 0x1358, 0x470C, 0x1292, 0x1358, 0x480C, 0x1292, -0x1358, 0x3F66, 0x403C, 0xFFCF, 0x3F64, 0x12B0, 0xD954, 0x12B0, 0xDA04, -0xB23C, 0x2B33, 0x403C, 0x0014, 0x1292, 0x1358, 0x12B0, 0xDA04, 0x4C08, -0x12B0, 0xDA04, 0x4C09, 0x3F28, 0x403C, 0xFFC5, 0x3F50, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0010, 0x410C, -0x503C, 0x0006, 0x403E, 0x0005, 0x12B0, 0xD494, 0x4381, 0x0004, 0x410C, -0x532C, 0x421F, 0x1112, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFD3, -0x3D30, 0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x933C, 0x2003, 0x403C, -0xFFD2, 0x3D26, 0x403A, 0x1360, 0x435C, 0x12AA, 0x403B, 0x1354, 0x4075, -0x0028, 0x454C, 0x12AB, 0x4038, 0x1358, 0x430C, 0x12A8, 0x4034, 0x1356, -0x4077, 0x00C8, 0xB03C, 0x0200, 0x2C18, 0x12B0, 0xD69A, 0x12B0, 0xD790, -0x454C, 0x12AB, 0x4039, 0x0032, 0x3C02, 0x9309, 0x240A, 0x430C, 0x12A8, -0x5339, 0x933C, 0x27F9, 0xB03C, 0x0200, 0x2BF6, 0x9309, 0x2003, 0x403C, -0xFFD4, 0x3CF9, 0xB32C, 0x2807, 0x434C, 0x12AA, 0x12B0, 0xD79A, 0x435C, -0x12AA, 0x3C02, 0x12B0, 0xD79A, 0x407C, 0x0048, 0x12AB, 0x435C, 0x12A4, -0x435C, 0x12AA, 0x4309, 0x12B0, 0xBB78, 0x2406, 0x12B0, 0xBB8A, 0x5319, -0x9039, 0x000A, 0x2BF7, 0x9039, 0x000A, 0x2003, 0x403C, 0xFFD1, 0x3CD7, -0x12B0, 0xBB92, 0x407C, 0x0030, 0x12AB, 0x403C, 0x0003, 0x12A8, 0x430C, -0x12A8, 0x93A2, 0x137C, 0x201B, 0x9382, 0x137E, 0x2018, 0x407C, 0x00B0, -0x12AB, 0x4039, 0x135C, 0x403C, 0x0082, 0x430D, 0x12A9, 0x403C, 0x000F, -0x430D, 0x12A9, 0x407C, 0x00B0, 0x12AB, 0x403C, 0x0082, 0x430D, 0x12A9, -0x403C, 0x000C, 0x430D, 0x12A9, 0x4076, 0x0082, 0x12B0, 0xBB5A, 0x403C, -0x4303, 0x12B0, 0xBBDE, 0x4309, 0x454C, 0x12AB, 0x3C07, 0x12B0, 0xC172, -0x4C0F, 0xDD0F, 0x930F, 0x23A1, 0x5319, 0x430C, 0x12A8, 0x934C, 0x3803, -0x9039, 0x000A, 0x2BF2, 0x9039, 0x000A, 0x2796, 0x407C, 0x0021, 0x12AB, -0x430C, 0x430D, 0x1292, 0x135A, 0x503C, 0xFFFE, 0x633D, 0x4C81, 0x0008, -0x4D81, 0x000A, 0x9309, 0x201B, 0x454C, 0x12AB, 0x430C, 0x12A8, 0xB03C, -0x0020, 0x2818, 0x53A1, 0x0008, 0x12B0, 0xBB5A, 0x403C, 0xC032, 0x12B0, -0xD5CC, 0x2376, 0x12B0, 0xBB5A, 0x403C, 0x0010, 0x12B0, 0xD5CC, 0x236F, -0x40B1, 0x0010, 0x0004, 0x3C04, 0x12B0, 0xBB92, 0x4391, 0x000E, 0x12B0, -0xD790, 0x12B0, 0xBB78, 0x2384, 0x12B0, 0xBBBE, 0x12B0, 0xBB62, 0x435C, -0x12AA, 0x434C, 0x12AA, 0x430C, 0x12A8, 0x4C81, 0x0006, 0x12B0, 0xBBEA, -0x415F, 0x0006, 0xDF81, 0x0000, 0x12B0, 0xBBBE, 0x407C, 0x0048, 0x12AB, -0x427C, 0x12A4, 0x12B0, 0xBB62, 0x412C, 0x12A8, 0x435C, 0x12AA, 0x12B0, -0xBBEA, 0x12B0, 0xD69A, 0x464C, 0x12AB, 0x403C, 0x0080, 0x12A8, 0x12B0, -0xBB8A, 0x403C, 0x0C04, 0x12A8, 0x434C, 0x12AA, 0x407C, 0x0021, 0x12B0, -0xBB5C, 0x12B0, 0xBBAA, 0x407C, 0x0088, 0x12AB, 0x403C, 0x0034, 0x12A8, -0x12B0, 0xBB5A, 0x403C, 0x0260, 0x12B0, 0xBBDE, 0x12B0, 0xBB5A, 0x403C, -0x00FC, 0x12B0, 0xBBDE, 0x430C, 0x12A8, 0x4C07, 0x12B0, 0xBB8A, 0x430C, -0x12A8, 0x12B0, 0xBBAA, 0xD117, 0x0004, 0x4781, 0x000C, 0x403D, 0x000A, -0x410C, 0x503C, 0x0006, 0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, -0x0010, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x0022, 0x4381, 0x0006, 0x4381, 0x0008, 0x4381, -0x0002, 0x4381, 0x0004, 0x4381, 0x0000, 0x410C, 0x503C, 0x0006, 0x421F, -0x1112, 0x129F, 0x0018, 0x410C, 0x532C, 0x421F, 0x1112, 0x129F, 0x0018, -0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x407C, 0x0046, 0x1292, 0x1354, -0x430C, 0x430D, 0x430E, 0x430F, 0x1292, 0x135E, 0x4C08, 0x4D09, 0x4E0A, -0x4F0B, 0x9381, 0x0000, 0x2022, 0x421E, 0x14B2, 0xF31E, 0x4A06, 0xF316, -0x960E, 0x241B, 0xB31A, 0x2819, 0x431C, 0x421F, 0x1112, 0x129F, 0x0008, -0x403C, 0x0080, 0x421F, 0x1112, 0x129F, 0x0008, 0x480C, 0x490D, 0x421F, -0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, 0x000A, -0x431C, 0x3CE0, 0x9381, 0x0000, 0x2009, 0x421F, 0x14B4, 0xF03F, 0x8000, -0x4B07, 0xF037, 0x8000, 0x970F, 0x24D3, 0x422C, 0x421F, 0x1112, 0x129F, -0x0008, 0x480C, 0x490D, 0x421F, 0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, -0x421F, 0x1112, 0x129F, 0x000A, 0x930B, 0x38BE, 0x9381, 0x0000, 0x20BB, -0x410C, 0x503C, 0x000A, 0x403E, 0x27CE, 0x423D, 0x12B0, 0xD454, 0x410F, -0x503F, 0x0012, 0x120F, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x000C, -0x4217, 0x1112, 0x1297, 0x000E, 0x403C, 0x0003, 0x1292, 0x1230, 0x410C, -0x503C, 0x0014, 0x421F, 0x1112, 0x129F, 0x0010, 0x4036, 0x1360, 0x434C, -0x12A6, 0x407C, 0x00C1, 0x1292, 0x1354, 0x403C, 0xFFFE, 0x430D, 0x1292, -0x135A, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0042, 0x1292, 0x1354, -0x4037, 0x1358, 0x430C, 0x12A7, 0x4C05, 0x435C, 0x12A6, 0x434C, 0x12A6, -0x435C, 0x12A6, 0x407C, 0x0028, 0x1292, 0x1354, 0x430C, 0x12A7, 0x434C, -0x12A6, 0x4074, 0x0082, 0x444C, 0x1292, 0x1354, 0x435C, 0x12A6, 0x403C, -0x0080, 0x12A7, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, -0x1400, 0x12A7, 0x444C, 0x1292, 0x1354, 0x434C, 0x12A6, 0x435C, 0x12A6, -0x5325, 0x450C, 0x12A7, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x403C, 0x4303, -0x12A7, 0x434C, 0x12A6, 0x407C, 0x0021, 0x1292, 0x1354, 0x430C, 0x430D, -0x1292, 0x135A, 0x434C, 0x12A6, 0x444C, 0x1292, 0x1354, 0x435C, 0x12A6, -0x432C, 0x12A7, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x1401, 0x12A7, -0x444C, 0x1292, 0x1354, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x430C, 0x12A7, -0x434C, 0x12A6, 0x435C, 0x12A6, 0x403C, 0x3FFD, 0x12A7, 0x434C, 0x12A6, -0x435C, 0x12A6, 0x434C, 0x12A6, 0x407C, 0x0021, 0x1292, 0x1354, 0x430C, -0x430D, 0x1292, 0x135A, 0x435C, 0x12A6, 0x407C, 0x00C8, 0x1292, 0x1354, -0x403C, 0x0501, 0x12A7, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x434C, 0x12A6, -0x407C, 0x0042, 0x1292, 0x1354, 0x435C, 0x12A6, 0x5321, 0x431C, 0x3C01, -0x432C, 0x9381, 0x0000, 0x2402, 0x430C, 0x3C08, 0x4882, 0x14AE, 0x4982, -0x14B0, 0x4A82, 0x14B2, 0x4B82, 0x14B4, 0x5031, 0x0022, 0x4030, 0xD41E, -0x407C, 0x00C1, 0x4820, 0x403C, 0x012C, 0x4030, 0x5C46, 0x444C, 0x12A8, -0x403C, 0x0034, 0x12AB, 0x464C, 0x4030, 0x5AF4, 0x12B0, 0x5B54, 0x4030, -0x5B6C, 0x12B0, 0x5C46, 0x12B0, 0x5CAE, 0x430C, 0x4B20, 0x12B0, 0x5AEA, -0x3FF0, 0x12B0, 0x5B54, 0x12B0, 0x5C38, 0x4820, 0x12B0, 0x5A56, 0x403C, -0x3FFD, 0x12AB, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12B0, 0x5BA6, 0x4A20, -0x12B0, 0x5AD2, 0x4C81, 0x0002, 0x12B0, 0x5ABA, 0x4C81, 0x0004, 0x12B0, -0x5AC6, 0x411E, 0x0002, 0x411F, 0x0004, 0x4130, 0x12B0, 0x5AD2, 0x4C81, -0x0004, 0x12B0, 0x5ABA, 0x4C81, 0x0002, 0x12B0, 0x5AC6, 0x411E, 0x0004, -0x411F, 0x0002, 0x4130, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x430C, 0x4B20, -0x434C, 0x12AA, 0x12B0, 0x5BB2, 0x435C, 0x4A20, 0x12B0, 0x5A56, 0x403C, -0x00FC, 0x12B0, 0x5AEA, 0x430C, 0x4B20, 0x12B0, 0x5B98, 0x4030, 0x5AF4, -0x12AB, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12A8, 0x435C, 0x4A20, 0x431C, -0x1292, 0x275A, 0x454C, 0x12A8, 0x430C, 0x430D, 0x1292, 0x135A, 0x53B1, -0x0006, 0x421E, 0x145C, 0x4130, 0x12B0, 0x5A5C, 0x403C, 0x012C, 0x12B0, -0x5C46, 0x421C, 0x1482, 0xD03C, 0x0040, 0x12B0, 0x5B32, 0x4030, 0x5B38, -0x12AB, 0x435C, 0x4A20, 0x12B0, 0x5C2E, 0x4A20, 0x12B0, 0xD196, 0xF03C, -0x0F00, 0x4130, 0x12B0, 0x5B38, 0x12B0, 0x5B54, 0x4030, 0x5B6C, 0x464C, -0x12A8, 0x403C, 0x3FFF, 0x12AB, 0x434C, 0x12AA, 0x494C, 0x12A8, 0x403C, -0x2409, 0x4130, 0x12AB, 0x4030, 0x5CAE, 0x4F81, 0x0002, 0x12B0, 0x5B98, -0x12A8, 0x403C, 0x0080, 0x12AB, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x411C, -0x0002, 0x12AB, 0x434C, 0x12AA, 0x454C, 0x3F70, 0x444C, 0x12A8, 0x407C, -0x0034, 0x12A7, 0x464C, 0x4130, 0x12B0, 0x5BBC, 0x12B0, 0x5BB2, 0x435C, -0x4130, 0x444C, 0x12A8, 0x407C, 0x0024, 0x4720, 0x12A8, 0x4030, 0x5CAE, -0x12B0, 0x5C6A, 0x4B20, 0x403C, 0x0003, 0x1292, 0x11E4, 0x410C, 0x503C, -0x0036, 0x421F, 0x1112, 0x129F, 0x0010, 0x403C, 0x1462, 0x12B0, 0x9702, -0x12B0, 0x5B54, 0x12B0, 0x5C38, 0x12A8, 0x403C, 0x0128, 0x12B0, 0x5C46, -0x421C, 0x147E, 0x12B0, 0x5C52, 0x403C, 0x012A, 0x12B0, 0x5C46, 0x421C, -0x1480, 0x12B0, 0x5C52, 0x403C, 0x012C, 0x12B0, 0x5C46, 0x421C, 0x1482, -0x12AB, 0x435C, 0x12AA, 0x12B0, 0x5C6A, 0x12AB, 0x4C81, 0x0004, 0x3F85, -0x12B0, 0x5C9A, 0x12A8, 0x435C, 0x4130, 0x12B0, 0x5CAC, 0x12B0, 0x5C60, -0x407C, 0x00C1, 0x4130, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x4820, -0x12B0, 0x5B32, 0x12B0, 0x5C8A, 0x12B0, 0x5C60, 0x3EE2, 0x407C, 0x0048, -0x12A8, 0x427C, 0x4720, 0x12B0, 0x5C8A, 0x407C, 0x00C1, 0x12A8, 0x403C, -0x012C, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12B0, 0x5BBC, 0x430C, -0x4130, 0x12B0, 0x5C9A, 0x12B0, 0x5AF4, 0x12B0, 0x5B54, 0x4030, 0x5CAC, -0x434C, 0x12AA, 0x494C, 0x12A8, 0x403C, 0x2401, 0x12AB, 0x454C, 0x4130, -0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x000C, 0x410C, 0x532C, 0x421F, -0x1112, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFDA, 0x3D29, 0x410C, -0x421F, 0x1112, 0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFD9, 0x3D1F, -0x403A, 0x1354, 0x407B, 0x00C8, 0x4B4C, 0x12AA, 0x4038, 0x1358, 0x403C, -0x2401, 0x12A8, 0x407C, 0x0028, 0x12AA, 0x907C, 0x0089, 0x2403, 0x403C, -0xFFD0, 0x3D0B, 0x12B0, 0xD7D6, 0x4C04, 0x4039, 0x1360, 0x435C, 0x12A9, -0x4037, 0x135C, 0x4035, 0x1356, 0xB034, 0x0200, 0x2C34, 0x12B0, 0xB564, -0x407C, 0x0034, 0x12A5, 0x4C44, 0x407C, 0x00B0, 0x12AA, 0x403C, 0x0089, -0x430D, 0x12A7, 0x430C, 0x430D, 0x12A7, 0xD034, 0x0040, 0x12B0, 0xB578, -0x12B0, 0xD6A6, 0x12B0, 0xB578, 0xF034, 0xFFBF, 0x12B0, 0xD6A6, 0x12B0, -0xB5EC, 0x407C, 0x0028, 0x12AA, 0x4036, 0x0032, 0x3C02, 0x9306, 0x240B, -0x430C, 0x12A8, 0x4C04, 0x5336, 0x933C, 0x27F8, 0xB03C, 0x0200, 0x2BF5, -0x9306, 0x2003, 0x403C, 0xFFDB, 0x3CC9, 0xB324, 0x2807, 0x434C, 0x12A9, -0x12B0, 0xB5EC, 0x435C, 0x12A9, 0x3C02, 0x12B0, 0xB5EC, 0x407C, 0x0082, -0x12B0, 0xB5AE, 0x403C, 0x4303, 0x12B0, 0xB5B4, 0x407C, 0x0042, 0x12AA, -0x12B0, 0xCCFA, 0x2003, 0x403C, 0xFFD1, 0x3CAD, 0x93A2, 0x137C, 0x200F, -0x9382, 0x137E, 0x200C, 0x12B0, 0xB56A, 0x403C, 0x000F, 0x430D, 0x12A7, -0x12B0, 0xB56A, 0x403C, 0x000C, 0x430D, 0x12A7, 0x12B0, 0xB5DA, 0x12B0, -0xB5DA, 0x403C, 0x0401, 0x12A8, 0x407C, 0x0098, 0x12AA, 0x12B0, 0xD68E, -0x12B0, 0xD68E, 0x12B0, 0xB564, 0x407C, 0x0024, 0x12A5, 0x4306, 0x4077, -0x0021, 0x12B0, 0xB586, 0x903C, 0xFFFE, 0x2002, 0x930D, 0x240B, 0x903C, -0x0F00, 0x2002, 0x930D, 0x2406, 0x12B0, 0xD9F4, 0x5316, 0x9036, 0x000A, -0x2BEE, 0x9036, 0x000A, 0x27C0, 0x434C, 0x12A9, 0x12B0, 0xB55C, 0x12B0, -0xB55C, 0x474C, 0x12AA, 0x430C, 0x12A8, 0x12B0, 0xCCFA, 0x27B3, 0x12B0, -0xB5F6, 0x12B0, 0xB5BA, 0x12B0, 0xB55C, 0x430C, 0x12A8, 0x4C81, 0x0004, -0x12B0, 0xB5D0, 0x415F, 0x0004, 0xDF81, 0x0000, 0x12B0, 0xB5F6, 0x407C, -0x0048, 0x12AA, 0x427C, 0x12A5, 0x12B0, 0xB5BA, 0x412C, 0x12A8, 0x435C, -0x12A9, 0x12B0, 0xB5D0, 0x12B0, 0xB586, 0x4C81, 0x0006, 0x4D81, 0x0008, -0x12B0, 0xB564, 0x407C, 0x0034, 0x12A5, 0x407C, 0x0082, 0x12AA, 0x403C, -0x0080, 0x12A8, 0x12B0, 0xD9F4, 0x403C, 0x0C04, 0x12B0, 0xB5B4, 0x474C, -0x12B0, 0xB5AE, 0x12B0, 0xB592, 0x12B0, 0xB564, 0x403C, 0x0034, 0x12A8, -0x407C, 0x0082, 0x12B0, 0xB5AE, 0x403C, 0x0260, 0x12B0, 0xB5A6, 0x407C, -0x0082, 0x12B0, 0xB5AE, 0x403C, 0x00FC, 0x12B0, 0xB5A6, 0x430C, 0x12A8, -0x4C0B, 0x12B0, 0xD9F4, 0x430C, 0x12A8, 0x12B0, 0xB592, 0x4B81, 0x000A, -0x423D, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, -0x000C, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x0016, 0x403B, 0x1112, 0x410C, 0x503C, 0x000A, -0x12B0, 0xD7B8, 0x2403, 0x403C, 0xFFE8, 0x3D25, 0x410C, 0x523C, 0x12B0, -0xD7B8, 0x2403, 0x403C, 0xFFE7, 0x3D1D, 0x410C, 0x503C, 0x0012, 0x4B2F, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3D12, 0x410C, 0x503C, -0x0006, 0x12B0, 0xD7B8, 0x2403, 0x403C, 0xFFE5, 0x3D09, 0x410C, 0x522C, -0x12B0, 0xD7B8, 0x2403, 0x403C, 0xFFE4, 0x3D01, 0x410C, 0x532C, 0x4B2F, -0x129F, 0x0016, 0x933C, 0x2003, 0x403C, 0xFFE3, 0x3CF7, 0x410C, 0x4B2F, -0x129F, 0x0016, 0x933C, 0x2002, 0x4381, 0x0000, 0x403A, 0x1354, 0x4077, -0x00C8, 0x474C, 0x12AA, 0x403B, 0x1358, 0x403C, 0x3401, 0x12AB, 0x4078, -0x0082, 0x484C, 0x12AA, 0x403C, 0x4032, 0x12AB, 0x4039, 0x1360, 0x12B0, -0xD984, 0x411C, 0x0006, 0x12AB, 0x12B0, 0xD984, 0x403C, 0x3FFD, 0x12AB, -0x12B0, 0xD620, 0x12B0, 0xD3C4, 0x484C, 0x12AA, 0x403C, 0x3FFF, 0x12AB, -0x12B0, 0xD98C, 0x403C, 0x2409, 0x12AB, 0x435C, 0x12A9, 0x434C, 0x12A9, -0x407C, 0x0048, 0x12AA, 0x427C, 0x1292, 0x1356, 0x407C, 0x00C1, 0x12AA, -0x411C, 0x000A, 0x12AB, 0x407C, 0x00A1, 0x12AA, 0x411C, 0x0008, 0x12AB, -0x435C, 0x12A9, 0x12B0, 0xD98C, 0x403C, 0x2401, 0x12AB, 0x4076, 0x0021, -0x464C, 0x12AA, 0x435C, 0x12B0, 0xD98E, 0x403C, 0x3401, 0x12AB, 0x484C, -0x12AA, 0x403C, 0x4030, 0x12AB, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x411C, -0x0012, 0x12AB, 0x9382, 0x1506, 0x2404, 0x434C, 0x12A9, 0x435C, 0x12A9, -0x434C, 0x12A9, 0x464C, 0x12AA, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A9, -0x12B0, 0xD3C4, 0x4381, 0x000C, 0x4381, 0x000E, 0x4381, 0x0010, 0x4077, -0x0090, 0x474C, 0x12AA, 0x403C, 0x0003, 0x12B0, 0xDA28, 0x4C81, 0x000C, -0x403C, 0x000B, 0x12B0, 0xDA28, 0x4C04, 0x4C81, 0x000E, 0x403C, 0x0013, -0x12B0, 0xDA28, 0x4C05, 0x4C81, 0x0010, 0x432C, 0x12B0, 0xDA28, 0x403C, -0x000A, 0x12B0, 0xDA28, 0x403C, 0x0012, 0x12B0, 0xDA28, 0x432C, 0x12AB, -0x411C, 0x000C, 0x12AB, 0x403C, 0x000A, 0x12AB, 0x440C, 0x12AB, 0x403C, -0x0012, 0x12AB, 0x450C, 0x12AB, 0x421F, 0x137C, 0xD21F, 0x137E, 0x930F, -0x2420, 0x9382, 0x1380, 0x2410, 0x474C, 0x12AA, 0x403C, 0x0089, 0x12B0, -0xDA28, 0x4C04, 0x474C, 0x12AA, 0x403C, 0x0088, 0x12AB, 0xF034, 0xFFEF, -0x440C, 0x12AB, 0x93A2, 0x137C, 0x200A, 0x9382, 0x137E, 0x2007, 0x474C, -0x12AA, 0x480C, 0x12AB, 0x403C, 0x000F, 0x12AB, 0x407C, 0x0030, 0x12AA, -0x411C, 0x0004, 0x12AB, 0x9381, 0x0002, 0x240C, 0x484C, 0x12AA, 0x411C, -0x0002, 0x12AB, 0x434C, 0x12A9, 0x464C, 0x12AA, 0x435C, 0x12A9, 0x3C02, -0x464C, 0x12AA, 0x407C, 0x00A8, 0x12AA, 0x9381, 0x0000, 0x2402, 0x1292, -0x2756, 0x430C, 0x5031, 0x0016, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x8221, 0x4E0A, 0x4F0B, 0x4C0F, 0x823F, -0x2408, 0x823F, 0x2434, 0x822F, 0x2436, 0x803F, 0x000C, 0x2438, 0x3CDA, -0x40B1, 0x0080, 0x0000, 0x4381, 0x0002, 0x4C08, 0x4039, 0x150C, 0x4036, -0x1504, 0x4037, 0x0190, 0x930C, 0x246A, 0x4A0E, 0x4B0F, 0xF12E, 0xF11F, -0x0002, 0x9318, 0x4E0D, 0xDF0D, 0x2026, 0x930D, 0xD0F2, 0x0040, 0x0029, -0x4214, 0x2758, 0x470C, 0x2026, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xC0F2, 0x0040, 0x0029, -0x3C25, 0x40B1, 0x8000, 0x0000, 0x3FD1, 0x4381, 0x0000, 0x42B1, 0x0002, -0x3FCE, 0x4381, 0x0000, 0x40B1, 0x8000, 0x0002, 0x3FC8, 0x930D, 0xC0F2, -0x0040, 0x0029, 0x4214, 0x2758, 0x470C, 0x27DA, 0x1284, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, -0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x421F, 0x2782, 0x4FE2, 0x1513, 0x462F, -0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC9EF, 0x0000, 0x5A0A, 0x6B0B, -0x5338, 0x9308, 0x2396, 0xB0F2, 0x0040, 0x1100, 0xD0F2, 0x0040, 0x0029, -0x4214, 0x2758, 0x470C, 0x285D, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, 0x0040, 0x0029, -0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, 0xD3DF, 0x0000, -0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC9EF, -0x0000, 0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, -0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, 0x0040, -0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, -0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, -0xC9EF, 0x0000, 0x430C, 0x430D, 0x5221, 0x4030, 0xD420, 0x1284, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, -0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, -0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC9EF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, -0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, -0x1284, 0xC0F2, 0x0040, 0x0029, 0x3FA2, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x4C0A, 0x4D0B, 0x4218, 0x01F2, 0x40B2, 0x2839, 0x01EA, 0x40B2, -0x2845, 0x01F2, 0x4C0F, 0xDD0F, 0x930F, 0x2482, 0x4039, 0x150C, 0x4036, -0x1504, 0x533A, 0x633B, 0x435C, 0x1292, 0x1360, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x462F, 0xE9EF, 0x0000, 0xC232, 0x4303, 0x425E, 0x277E, -0x4E4F, 0xE37F, 0x421D, 0x2784, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x462C, -0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, 0xDECD, 0x0000, 0xD232, -0x462F, 0xE9EF, 0x0000, 0x434C, 0x1292, 0x1360, 0x4A0F, 0xDB0F, 0x930F, -0x2382, 0x4882, 0x01F2, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x4C0A, 0x4D0B, 0x4218, 0x01F2, 0x40B2, 0x283F, 0x01EA, 0x40B2, -0x284B, 0x01F2, 0x4C0F, 0xDD0F, 0x930F, 0x2482, 0x4039, 0x150C, 0x4036, -0x1504, 0x533A, 0x633B, 0x435C, 0x1292, 0x1360, 0x434C, 0x1292, 0x1360, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x462F, 0xE9EF, 0x0000, 0xC232, -0x4303, 0x425E, 0x277E, 0x4E4F, 0xE37F, 0x421D, 0x2784, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01E8, -0xD392, 0x01E8, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462C, 0xE9EC, 0x0000, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01F0, 0x462C, 0xE9EC, 0x0000, 0xC232, 0x4303, 0xFFCD, 0x0000, -0xDECD, 0x0000, 0xD232, 0x462F, 0xE9EF, 0x0000, 0x4A0F, 0xDB0F, 0x930F, -0x2382, 0x3F66, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x000C, 0x410C, 0x532C, 0x421F, 0x1112, 0x129F, 0x0016, -0x930C, 0x2403, 0x403C, 0xFFDA, 0x3D10, 0x410C, 0x421F, 0x1112, 0x129F, -0x0016, 0x930C, 0x2403, 0x403C, 0xFFD9, 0x3D06, 0x403A, 0x1354, 0x407B, -0x00C8, 0x4B4C, 0x12AA, 0x4038, 0x1358, 0x4039, 0x2401, 0x12B0, 0xD736, -0x907C, 0x0089, 0x2403, 0x403C, 0xFFD0, 0x3CF4, 0x407C, 0x0028, 0x12B0, -0xD9EE, 0x4C04, 0x4036, 0x1360, 0x435C, 0x12A6, 0x4075, 0x0090, 0xB034, -0x0200, 0x2C2F, 0x407C, 0x0088, 0x12AA, 0x407C, 0x0034, 0x1292, 0x1356, -0x454C, 0x12AA, 0x403C, 0x0089, 0x12A8, 0x430C, 0x12B0, 0xD612, 0xD037, -0x0040, 0x470C, 0x12B0, 0xD612, 0xF037, 0xFFBF, 0x470C, 0x12A8, 0x4B4C, -0x12AA, 0x12B0, 0xD736, 0x4037, 0x0032, 0x3C02, 0x9307, 0x240B, 0x430C, -0x12A8, 0x4C04, 0x5337, 0x933C, 0x27F8, 0xB03C, 0x0200, 0x2BF5, 0x9307, -0x2003, 0x403C, 0xFFDB, 0x3CB7, 0xB324, 0x2803, 0x12B0, 0xCF4A, 0x3C02, -0x12B0, 0xCF42, 0x12B0, 0xD48E, 0x435C, 0x12A6, 0x403C, 0x4303, 0x12B0, -0xD71E, 0x12B0, 0xCC02, 0x2003, 0x403C, 0xFFD1, 0x3CA2, 0x93A2, 0x137C, -0x200D, 0x9382, 0x137E, 0x200A, 0x12B0, 0xD89E, 0x403C, 0x000F, 0x12A8, -0x12B0, 0xD89E, 0x403C, 0x000C, 0x12A8, 0x12B0, 0xCF52, 0x12B0, 0xCF52, -0x403C, 0x0401, 0x12A8, 0x407C, 0x0098, 0x12AA, 0x12B0, 0xD6EE, 0x12B0, -0xD6EE, 0x407C, 0x0088, 0x12AA, 0x407C, 0x0024, 0x1292, 0x1356, 0x4307, -0x4075, 0x0021, 0x12B0, 0xD9EC, 0x903C, 0xFFFE, 0x2409, 0x903C, 0x0F00, -0x2406, 0x12B0, 0xD9AC, 0x5317, 0x9037, 0x000A, 0x2BF2, 0x9037, 0x000A, -0x27C4, 0x434C, 0x12A6, 0x12B0, 0xD9CC, 0x434C, 0x12A6, 0x12B0, 0xD9EC, -0x12B0, 0xCC02, 0x27B9, 0x12B0, 0xCFD6, 0x12B0, 0xD3B2, 0x12B0, 0xCFEE, -0x430C, 0x12A8, 0x4C81, 0x0004, 0x12B0, 0xD6BE, 0x415F, 0x0004, 0xDF81, -0x0000, 0x12B0, 0xCFD6, 0x407C, 0x0048, 0x12AA, 0x427C, 0x1292, 0x1356, -0x12B0, 0xD3B2, 0x412C, 0x12A8, 0x435C, 0x12A6, 0x12B0, 0xD6BE, 0x12B0, -0xD9EC, 0x4C81, 0x0006, 0x4381, 0x0008, 0x12B0, 0xD484, 0x403C, 0x4030, -0x12A8, 0x12B0, 0xD9AC, 0x403C, 0x0C04, 0x12A8, 0x9382, 0x1506, 0x2402, -0x12B0, 0xD9AC, 0x434C, 0x12A6, 0x454C, 0x12AA, 0x9382, 0x1506, 0x2002, -0x435C, 0x12A6, 0x12B0, 0xCF4A, 0x12B0, 0xD484, 0x403C, 0x4282, 0x12B0, -0xD71E, 0x435C, 0x12A6, 0x12B0, 0xD48E, 0x403C, 0x00FE, 0x12B0, 0xD71E, -0x12B0, 0xD9CC, 0x430C, 0x12A8, 0x4C81, 0x000A, 0x12B0, 0xCF4A, 0x423D, -0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0006, 0x430C, 0x5031, 0x000C, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x0010, 0x4381, 0x000A, 0x4381, 0x0004, 0x403B, 0x1112, -0x410C, 0x503C, 0x000E, 0x12B0, 0xDA22, 0x410C, 0x503C, 0x000C, 0x12B0, -0xDA22, 0x410C, 0x503C, 0x0006, 0x4B2F, 0x129F, 0x0018, 0x410C, 0x532C, -0x12B0, 0xDA22, 0x410C, 0x503C, 0x000A, 0x12B0, 0xDA22, 0x410C, 0x12B0, -0xDA22, 0x410C, 0x522C, 0x12B0, 0xDA22, 0x403B, 0x1360, 0x434C, 0x12AB, -0x4038, 0x1354, 0x407A, 0x0082, 0x12B0, 0xD934, 0x4039, 0x1358, 0x4A0C, -0x12A9, 0x4076, 0x00C8, 0x464C, 0x12A8, 0x403C, 0x1401, 0x12B0, 0xD604, -0x411C, 0x0002, 0x12A9, 0x12B0, 0xD60A, 0x403C, 0x3FFD, 0x12B0, 0xD62E, -0x4077, 0x0021, 0x12B0, 0xD63A, 0x435C, 0x12AB, 0x464C, 0x12A8, 0x403C, -0x0501, 0x12B0, 0xD62E, 0x407C, 0x0042, 0x12A8, 0x435C, 0x12AB, 0x12B0, -0xD864, 0x403C, 0x0500, 0x12A9, 0x407C, 0x00C1, 0x12A8, 0x411C, 0x000E, -0x430D, 0x1292, 0x135A, 0x435C, 0x12AB, 0x407C, 0x00A1, 0x12A8, 0x411C, -0x000C, 0x12B0, 0xD862, 0x403C, 0x0501, 0x12A9, 0x435C, 0x12AB, 0x12B0, -0xD60A, 0xB0B1, 0x0010, 0x0002, 0x2805, 0x50B1, 0xFFFE, 0x0006, 0x63B1, -0x0008, 0x411C, 0x0006, 0x411D, 0x0008, 0x12B0, 0xD196, 0x4C04, 0xF034, -0x0F00, 0x5034, 0x0080, 0x4115, 0x0006, 0x407C, 0x0028, 0x12A8, 0x430C, -0x12B0, 0xDA1C, 0x12B0, 0xD934, 0x440C, 0x12B0, 0xD862, 0x403C, 0x1400, -0x12B0, 0xD604, 0x450C, 0x12A9, 0x12B0, 0xD60A, 0x403C, 0x4303, 0x12B0, -0xDA1C, 0x12B0, 0xD63A, 0x9381, 0x0000, 0x240A, 0x12B0, 0xD830, 0x12B0, -0xD934, 0x412C, 0x12B0, 0xDA1C, 0x474C, 0x12A8, 0x3C08, 0x435C, 0x12AB, -0x12B0, 0xD830, 0x474C, 0x12A8, 0x434C, 0x12AB, 0x435C, 0x12AB, 0x407C, -0x0030, 0x12A8, 0x411C, 0x000A, 0x12A9, 0x9382, 0x138E, 0x2413, 0x407C, -0x00F4, 0x12A8, 0x430C, 0x12A9, 0x4C0B, 0x407C, 0x00F4, 0x12A8, 0xC21B, -0x138E, 0xD21B, 0x1390, 0x4B0C, 0x12A9, 0x403C, 0x0014, 0x1292, 0x275A, -0x421F, 0x1382, 0xD21F, 0x1384, 0x930F, 0x241C, 0x407C, 0x0054, 0x12A8, -0x430C, 0x430D, 0x1292, 0x135C, 0x4C0A, 0x4D0B, 0x407C, 0x0054, 0x12A8, -0xC21A, 0x1382, 0xC21B, 0x1384, 0xD21A, 0x1386, 0xD21B, 0x1388, 0x4A0C, -0x4B0D, 0x1292, 0x135C, 0x403C, 0x0014, 0x1292, 0x275A, 0x407C, 0x00A8, -0x12A8, 0x9381, 0x0004, 0x2402, 0x1292, 0x2756, 0x430C, 0x5031, 0x0010, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x403F, -0x150C, 0x403D, 0x1504, 0x403A, 0x2839, 0x403B, 0x277E, 0xB2D2, 0x2780, -0x1100, 0x2419, 0x4A82, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0x4217, 0x2784, 0xCBE7, 0x0000, -0x4217, 0x2784, 0xDBE7, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x3C1B, -0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0x4217, 0x2784, 0xCBE7, 0x0000, 0x4217, -0x2784, 0xDBE7, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x4A82, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, -0x4303, 0x4B68, 0xE378, 0x4219, 0x2784, 0xF8C9, 0x0000, 0xDBE9, 0x0000, -0xD232, 0x4D27, 0xEFE7, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, 0x4076, 0x0080, -0xB64C, 0x2408, 0x3C10, 0xB356, 0x2BFB, 0xB64C, 0x2409, 0x4A82, 0x01EA, -0x3C09, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, -0xC232, 0x4303, 0xF8C9, 0x0000, 0x5E4E, 0x4217, 0x2782, 0xB2D7, 0x2781, -0x0000, 0x2002, 0x4347, 0x3C01, 0x4357, 0xD74E, 0xDBE9, 0x0000, 0xD232, -0x4D27, 0xEFE7, 0x0000, 0x1106, 0x23D1, 0x93D2, 0x1396, 0x2004, 0x43C2, -0x1100, 0x43C2, 0x1396, 0xB2D2, 0x2780, 0x1100, 0x241D, 0x4A82, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, 0xEFE7, 0x0000, 0xC232, -0x4303, 0xF8C9, 0x0000, 0xDBE9, 0x0000, 0xD232, 0x4D27, 0xEFE7, 0x0000, -0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x3C1A, -0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBE9, 0x0000, 0xD232, -0x4D27, 0xEFE7, 0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D27, -0xEFE7, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBE9, 0x0000, 0xD232, -0x4D2B, 0xEFEB, 0x0000, 0x4E4C, 0x4030, 0xD422, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0010, 0x403A, 0x1354, -0x407C, 0x0028, 0x12AA, 0x4C4C, 0x4036, 0x135C, 0x403B, 0x1358, 0x903C, -0x0091, 0x2003, 0x12B0, 0xBCBA, 0x3C0B, 0x903C, 0x0099, 0x2008, 0x12B0, -0xBCBA, 0x407C, 0x0054, 0x12AA, 0x430C, 0x431D, 0x12A6, 0x12B0, 0xBCC6, -0x403C, 0x6D8E, 0x430D, 0x12A6, 0x407C, 0x0030, 0x12AA, 0x403C, 0x0005, -0x12AB, 0x4078, 0x00C8, 0x484C, 0x12AA, 0x403C, 0x1501, 0x12AB, 0x4307, -0x12B0, 0xBCB0, 0x3C03, 0x430C, 0x12AB, 0x5317, 0xB03C, 0x0200, 0x2C03, -0x9037, 0x0032, 0x3BF7, 0x9037, 0x0032, 0x34BB, 0x4039, 0x1360, 0x12B0, -0xBC9C, 0x403C, 0x0C01, 0x12AB, 0x403C, 0x0028, 0x1292, 0x275A, 0x403C, -0x0401, 0x12B0, 0xBCA6, 0x12B0, 0xBCA8, 0x12B0, 0xBCA8, 0x12B0, 0xBCA8, -0x12B0, 0xBC9C, 0x403C, 0x0501, 0x12B0, 0xBCA6, 0x407C, 0x0030, 0x12AA, -0x403C, 0x000E, 0x12AB, 0x12B0, 0xBCB0, 0x4035, 0x1112, 0x410C, 0x532C, -0x452F, 0x129F, 0x0016, 0x410C, 0x452F, 0x129F, 0x0016, 0x12B0, 0xBC92, -0x4034, 0x135A, 0x411C, 0x0002, 0x12B0, 0xBCD4, 0x4C81, 0x0006, 0x12B0, -0xBC8A, 0x415F, 0x0006, 0xDF81, 0x0000, 0x12B0, 0xBCF4, 0x411C, 0x0002, -0x12B0, 0xBCE6, 0x412C, 0x12B0, 0xBD08, 0x407C, 0x0021, 0x12AA, 0x430C, -0x430D, 0x12A4, 0x903C, 0xFFFE, 0x200F, 0x930D, 0x200D, 0x12B0, 0xBC92, -0x403C, 0xFFFE, 0x12B0, 0xBCD4, 0x4C81, 0x0008, 0x12B0, 0xBC8A, 0x4381, -0x000A, 0x3C07, 0x503C, 0xFFFC, 0x633D, 0x4C81, 0x0008, 0x4D81, 0x000A, -0x4381, 0x000C, 0x431C, 0x452F, 0x129F, 0x001A, 0x4307, 0x470C, 0x503C, -0x1102, 0x452F, 0x129F, 0x0014, 0x475F, 0x1102, 0x907F, 0x003C, 0x2C28, -0x4FD1, 0x12F2, 0x0004, 0x93C1, 0x0004, 0x2422, 0x431C, 0x474E, 0x12B0, -0xD6CA, 0xBC82, 0x1144, 0x2002, 0x430F, 0x3C01, 0x431F, 0x4F81, 0x000E, -0x12B0, 0xBCF4, 0x403C, 0x0110, 0x12B0, 0xBCE6, 0x415C, 0x0004, 0x503C, -0x9600, 0x12B0, 0xBD08, 0x12B0, 0xBCF4, 0x403C, 0x011E, 0x12B0, 0xBCE6, -0x411C, 0x000E, 0x12B0, 0xBD08, 0x5317, 0x9037, 0x0010, 0x3BC9, 0x12B0, -0xBCC6, 0x403C, 0x000E, 0x430D, 0x12A6, 0x403C, 0x00B0, 0x430D, 0x12A6, -0x403C, 0x0045, 0x430D, 0x12A6, 0x423D, 0x410C, 0x503C, 0x0006, 0x452F, -0x129F, 0x0006, 0x430C, 0x3C01, 0x433C, 0x5031, 0x0010, 0x4030, 0xD41E, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, -0x005C, 0x4334, 0x410C, 0x503C, 0x0016, 0x403E, 0x27FB, 0x403D, 0x001F, -0x12B0, 0xD454, 0x430A, 0x3C08, 0x410C, 0x503C, 0x0036, 0x5A0C, 0x4B2F, -0x129F, 0x0014, 0x531A, 0x403B, 0x1112, 0x4036, 0x0016, 0x960A, 0x2BF2, -0x4039, 0x0003, 0x4108, 0x5038, 0x004C, 0xB0F1, 0x0010, 0x003E, 0x2C14, -0x1208, 0x460F, 0x410E, 0x532E, 0x403D, 0x001F, 0x410C, 0x503C, 0x0018, -0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1244, 0x480C, 0x4B2F, 0x129F, -0x0010, 0x5321, 0x4107, 0x5037, 0x0036, 0x1208, 0x430F, 0x430E, 0x460D, -0x470C, 0x4B25, 0x1295, 0x000E, 0x490C, 0x1292, 0x1234, 0x480C, 0x4B2F, -0x129F, 0x0010, 0x407C, 0x0046, 0x1292, 0x1354, 0x430C, 0x430D, 0x430E, -0x430F, 0x1292, 0x135E, 0x5321, 0x930F, 0x3402, 0x430C, 0x3C98, 0xB0F1, -0x0010, 0x003E, 0x2C82, 0x407C, 0x0046, 0x1292, 0x1354, 0x430C, 0x430D, -0x430E, 0x430F, 0x1292, 0x135E, 0x531A, 0xB31E, 0x2C03, 0x903A, 0x01F4, -0x2BF4, 0x903A, 0x01F4, 0x2C80, 0x1208, 0x430F, 0x431E, 0x460D, 0x470C, -0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1230, 0x4C04, 0x480C, 0x4B2F, -0x129F, 0x0010, 0x40F1, 0x0005, 0x0018, 0x43C1, 0x0019, 0x41D1, 0x0002, -0x001A, 0x41D1, 0x0003, 0x001B, 0x41D1, 0x0004, 0x001C, 0x41D1, 0x0005, -0x001D, 0x43E1, 0x001E, 0x41D1, 0x0006, 0x001F, 0x41D1, 0x0007, 0x0020, -0x41D1, 0x0008, 0x0021, 0x41D1, 0x0009, 0x0022, 0x42E1, 0x0023, 0x41D1, -0x000A, 0x0024, 0x41D1, 0x000B, 0x0025, 0x41D1, 0x000C, 0x0026, 0x41D1, -0x000D, 0x0027, 0x40F1, 0x0006, 0x0028, 0x41D1, 0x000E, 0x0029, 0x41D1, -0x000F, 0x002A, 0x41D1, 0x0010, 0x002B, 0x41D1, 0x0011, 0x002C, 0x40F1, -0x0080, 0x002D, 0x41D1, 0x0012, 0x002E, 0x41D1, 0x0013, 0x002F, 0x41D1, -0x0014, 0x0030, 0x41D1, 0x0015, 0x0031, 0x1208, 0x430F, 0x430E, 0x403D, -0x001F, 0x410C, 0x503C, 0x001A, 0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, -0x1244, 0x480C, 0x4B2F, 0x129F, 0x0010, 0x5221, 0x3C11, 0x1208, 0x430F, -0x431E, 0x460D, 0x470C, 0x4B27, 0x1297, 0x000E, 0x490C, 0x1292, 0x1230, -0x480C, 0x4B2F, 0x129F, 0x0010, 0x4304, 0x5321, 0x440C, 0x5031, 0x005C, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x0012, 0x403B, 0x1112, 0x410C, 0x503C, 0x000A, 0x12B0, -0xCCD2, 0x2403, 0x403C, 0xFFE8, 0x3CD6, 0x410C, 0x523C, 0x12B0, 0xCCD2, -0x2403, 0x403C, 0xFFE7, 0x3CCE, 0x410C, 0x503C, 0x000E, 0x4B2F, 0x129F, -0x0018, 0x930C, 0x2403, 0x403C, 0xFFE6, 0x3CC3, 0x410C, 0x503C, 0x0006, -0x12B0, 0xCCD2, 0x2403, 0x403C, 0xFFE5, 0x3CBA, 0x410C, 0x522C, 0x12B0, -0xCCD2, 0x2403, 0x403C, 0xFFE4, 0x3CB2, 0x410C, 0x532C, 0x4B2F, 0x129F, -0x0016, 0x933C, 0x2003, 0x403C, 0xFFE3, 0x3CA8, 0x410C, 0x4B2F, 0x129F, -0x0016, 0x933C, 0x2002, 0x4381, 0x0000, 0x403A, 0x1354, 0x4074, 0x0088, -0x444C, 0x12AA, 0x403B, 0x1356, 0x407C, 0x0034, 0x12AB, 0x4078, 0x0082, -0x484C, 0x12AA, 0x4039, 0x1360, 0x435C, 0x12A9, 0x4036, 0x1358, 0x480C, -0x12B0, 0xCCBE, 0x411C, 0x0006, 0x12B0, 0xCCBE, 0x403C, 0x3FFD, 0x12B0, -0xDA0A, 0x407C, 0x0042, 0x12B0, 0xCCDC, 0x484C, 0x12AA, 0x403C, 0x3FFF, -0x12A6, 0x12B0, 0xD812, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12A9, 0x434C, -0x12A9, 0x407C, 0x0048, 0x12AA, 0x427C, 0x12AB, 0x407C, 0x00C1, 0x12AA, -0x411C, 0x000A, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12AA, 0x411C, -0x0008, 0x12A6, 0x435C, 0x12A9, 0x12B0, 0xD812, 0x403C, 0x2401, 0x12A6, -0x4077, 0x0021, 0x12B0, 0xCCF2, 0x411C, 0x000E, 0x411D, 0x0010, 0x12B0, -0xD196, 0x4C05, 0xF035, 0x0F00, 0xD035, 0x0080, 0x4191, 0x000E, 0x000C, -0x444C, 0x12AA, 0x407C, 0x0034, 0x12AB, 0x484C, 0x12AA, 0x450C, 0x12B0, -0xDA0A, 0x435C, 0x12A9, 0x411C, 0x000C, 0x12B0, 0xDA0A, 0x474C, 0x12B0, -0xCCDC, 0x93A2, 0x137C, 0x200F, 0x9382, 0x137E, 0x200C, 0x407C, 0x00B0, -0x12AA, 0x480C, 0x430D, 0x1292, 0x135C, 0x403C, 0x000F, 0x430D, 0x1292, -0x135C, 0x407C, 0x0030, 0x12AA, 0x411C, 0x0004, 0x12A6, 0x9381, 0x0002, -0x2409, 0x484C, 0x12AA, 0x411C, 0x0002, 0x12B0, 0xDA0A, 0x12B0, 0xCCF2, -0x3C02, 0x474C, 0x12AA, 0x407C, 0x00A8, 0x12AA, 0x9381, 0x0000, 0x2402, -0x1292, 0x2756, 0x430C, 0x5031, 0x0012, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x421F, 0x01F2, 0x40B2, 0x2839, 0x01EA, 0x40B2, 0x2845, 0x01F2, -0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x403E, 0x150C, 0x403D, 0x1504, -0x4D2B, 0xEEEB, 0x0000, 0xC232, 0x4303, 0x425C, 0x277E, 0x4C4A, 0xE37A, -0x421B, 0x2784, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEEE8, -0x0000, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x4D28, 0xEEE8, 0x0000, -0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D2B, 0xEEEB, -0x0000, 0x4F82, 0x01F2, 0x430C, 0x4030, 0xD428, 0x120A, 0x120B, 0x1208, -0x40B2, 0x2839, 0x01EA, 0x407E, 0x0006, 0x403F, 0x150C, 0x403D, 0x1504, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2B, 0xEFEB, 0x0000, 0xC232, -0x4303, 0x425C, 0x277E, 0x4C4A, 0xE37A, 0x421B, 0x2784, 0xFACB, 0x0000, -0xDCCB, 0x0000, 0xD232, 0x4D28, 0xEFE8, 0x0000, 0x537E, 0x23E6, 0x40B2, -0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2E, 0xEFEE, -0x0000, 0xC232, 0x4303, 0xFACB, 0x0000, 0xDCCB, 0x0000, 0xD232, 0x4D2B, -0xEFEB, 0x0000, 0x3FC1, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x005C, 0x4337, 0x410C, 0x503C, 0x0016, 0x403E, -0x281A, 0x403D, 0x001F, 0x12B0, 0xD454, 0x4304, 0x403A, 0x0016, 0x403B, -0x1112, 0x4108, 0x5038, 0x0036, 0x480C, 0x540C, 0x4B2F, 0x129F, 0x0014, -0x5314, 0x9A04, 0x2BF8, 0x4039, 0x0003, 0x4106, 0x5036, 0x004C, 0xB0F1, -0x0010, 0x003E, 0x2C0F, 0x1206, 0x4A0F, 0x410E, 0x532E, 0x403D, 0x001F, -0x410C, 0x503C, 0x0018, 0x4B25, 0x1295, 0x000E, 0x12B0, 0xD55C, 0x5321, -0x1206, 0x430F, 0x430E, 0x4A0D, 0x480C, 0x4B25, 0x1295, 0x000E, 0x490C, -0x1292, 0x1234, 0x12B0, 0xD562, 0x5321, 0xB0F1, 0x0010, 0x003E, 0x2C73, -0x407C, 0x00D0, 0x1292, 0x1354, 0x430C, 0x1292, 0x1358, 0x5314, 0x934C, -0x3803, 0x9034, 0x01F4, 0x2BF7, 0x9034, 0x01F4, 0x2C81, 0x1206, 0x12B0, -0xD56A, 0x490C, 0x1292, 0x1230, 0x4C07, 0x12B0, 0xD562, 0x40F1, 0x0005, -0x0018, 0x43C1, 0x0019, 0x41D1, 0x0002, 0x001A, 0x41D1, 0x0003, 0x001B, -0x41D1, 0x0004, 0x001C, 0x41D1, 0x0005, 0x001D, 0x43E1, 0x001E, 0x41D1, -0x0006, 0x001F, 0x41D1, 0x0007, 0x0020, 0x41D1, 0x0008, 0x0021, 0x41D1, -0x0009, 0x0022, 0x42E1, 0x0023, 0x41D1, 0x000A, 0x0024, 0x41D1, 0x000B, -0x0025, 0x41D1, 0x000C, 0x0026, 0x41D1, 0x000D, 0x0027, 0x40F1, 0x0006, -0x0028, 0x41D1, 0x000E, 0x0029, 0x41D1, 0x000F, 0x002A, 0x41D1, 0x0010, -0x002B, 0x41D1, 0x0011, 0x002C, 0x40F1, 0x0080, 0x002D, 0x41D1, 0x0012, -0x002E, 0x41D1, 0x0013, 0x002F, 0x41D1, 0x0014, 0x0030, 0x41D1, 0x0015, -0x0031, 0x1206, 0x430F, 0x430E, 0x403D, 0x001F, 0x410C, 0x503C, 0x001A, -0x4B2A, 0x129A, 0x000E, 0x12B0, 0xD55C, 0x5221, 0x3C1E, 0x407C, 0x0028, -0x1292, 0x1354, 0x4C4C, 0x903C, 0x0089, 0x240C, 0x903C, 0x008D, 0x2409, -0x903C, 0x0091, 0x2406, 0x903C, 0x0095, 0x2403, 0x903C, 0x0099, 0x2009, -0x1206, 0x12B0, 0xD56A, 0x490C, 0x1292, 0x1230, 0x12B0, 0xD562, 0x5321, -0x4307, 0x470C, 0x5031, 0x005C, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x4C4A, 0x403B, 0x150C, 0x4038, 0x1504, 0x4039, 0x0190, -0xB0F2, 0x0040, 0x1100, 0xD0F2, 0x0040, 0x0029, 0x4216, 0x2758, 0x490C, -0x280F, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x3C0E, 0x1286, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0xC0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xCBEF, 0x0000, 0xD0F2, 0x0040, 0x0029, 0x4216, 0x2758, -0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, -0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, 0x482F, -0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xC0F2, 0x0040, -0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, -0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, 0x1286, -0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, 0xC0F2, -0x0040, 0x0029, 0x490C, 0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, -0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0xD0F2, 0x0040, 0x0029, 0x490C, -0x1286, 0x482F, 0xD3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xC3DF, 0x0000, -0x431C, 0x1286, 0x482F, 0xDBEF, 0x0000, 0x482F, 0xD3DF, 0x0000, 0x431C, -0x1286, 0x482F, 0xC3DF, 0x0000, 0x431C, 0x1286, 0x482F, 0xCBEF, 0x0000, -0x4A4E, 0x430F, 0x423C, 0x12B0, 0x61B6, 0x4030, 0xD424, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0xB2D2, 0x2780, 0x1100, 0x2404, 0x40B2, 0x2839, -0x01EA, 0x3C03, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x403F, 0x150C, 0x403D, 0x1504, 0x4D2B, 0xEFEB, 0x0000, 0xC232, -0x4303, 0x425A, 0x277E, 0x4A4B, 0xE37B, 0x4218, 0x2784, 0xFBC8, 0x0000, -0xDAC8, 0x0000, 0xD232, 0x4D2E, 0xEFEE, 0x0000, 0x40B2, 0x2845, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2E, 0xEFEE, 0x0000, 0xC232, -0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D2E, 0xEFEE, 0x0000, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4D2E, 0xEFEE, 0x0000, 0xC232, -0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D2E, 0xEFEE, 0x0000, -0x4079, 0x0080, 0xB94C, 0x2409, 0x3C11, 0xB359, 0x2BFB, 0xB94C, 0x240A, -0x40B2, 0x2839, 0x01EA, 0x3C09, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, -0x3C08, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4D26, 0xEFE6, 0x0000, 0xC232, 0x4303, 0xFBC8, 0x0000, 0x5E4E, 0x4216, -0x2782, 0xB2D6, 0x2781, 0x0000, 0x2002, 0x4346, 0x3C01, 0x4356, 0xD64E, -0xDAC8, 0x0000, 0xD232, 0x4D26, 0xEFE6, 0x0000, 0x1109, 0x23D0, 0x93D2, -0x1396, 0x2004, 0x43C2, 0x1100, 0x43C2, 0x1396, 0xB2D2, 0x2780, 0x1100, -0x241E, 0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, 0x0000, 0xDAC8, 0x0000, -0xD232, 0x4D29, 0xEFE9, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, -0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D29, 0xEFE9, 0x0000, 0xD0B2, 0x0010, -0x01F0, 0xD392, 0x01F0, 0x4D29, 0xEFE9, 0x0000, 0xC232, 0x4303, 0xFBC8, -0x0000, 0xDAC8, 0x0000, 0xD232, 0x4D2B, 0xEFEB, 0x0000, 0x4E4C, 0x4030, -0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, -0x000A, 0x4381, 0x0000, 0x430B, 0x430A, 0x4309, 0x4338, 0x4381, 0x0002, -0x4381, 0x0004, 0x4381, 0x0006, 0x4381, 0x0008, 0x410C, 0x421F, 0x1112, -0x129F, 0x0016, 0x930C, 0x2403, 0x403C, 0xFFC1, 0x3CB5, 0x430B, 0x3C01, -0x531B, 0x912B, 0x2C0E, 0x410C, 0x532C, 0x4B0F, 0x5F0F, 0x5F0C, 0x421F, -0x1112, 0x129F, 0x0016, 0x930C, 0x37F2, 0x403C, 0xFFC0, 0x3CA2, 0x430C, -0x1292, 0x274E, 0x434C, 0x1292, 0x276C, 0x434C, 0x1292, 0x2754, 0x1292, -0x134E, 0x434C, 0x1292, 0x276C, 0x1292, 0x1350, 0x430A, 0x430B, 0x4308, -0x4116, 0x0002, 0x4117, 0x0004, 0x4039, 0x0011, 0x407C, 0x0086, 0x1292, -0x1354, 0x430C, 0x1292, 0x1358, 0x4C09, 0x531A, 0x630B, 0x930B, 0x2806, -0x2003, 0x903A, 0x0BB8, 0x2802, 0x4318, 0x3C08, 0xB329, 0x2C06, 0x930B, -0x2BEE, 0x2003, 0x903A, 0x0BB8, 0x2BEA, 0x930B, 0x2804, 0x2011, 0x903A, -0x0BB8, 0x2C0E, 0x4039, 0x0011, 0x490C, 0x1292, 0x1358, 0x4C09, 0x460C, -0x1292, 0x1358, 0x4C09, 0x470C, 0x1292, 0x1358, 0x4C09, 0x9318, 0x2003, -0x403C, 0xFFCE, 0x3C56, 0x90B1, 0x0003, 0x0000, 0x2843, 0x435C, 0x1292, -0x276C, 0x403C, 0x00C8, 0x1292, 0x275A, 0x430A, 0x430B, 0x4308, 0x4116, -0x0006, 0x4114, 0x0008, 0x4037, 0x0011, 0x407C, 0x0086, 0x1292, 0x1354, -0x430C, 0x1292, 0x1358, 0x4C09, 0x531A, 0x630B, 0x930B, 0x2806, 0x2003, -0x903A, 0x0BB8, 0x2802, 0x4318, 0x3C08, 0xB329, 0x2C06, 0x930B, 0x2BEE, -0x2003, 0x903A, 0x0BB8, 0x2BEA, 0x930B, 0x2804, 0x2011, 0x903A, 0x0BB8, -0x2C0E, 0x4037, 0x0011, 0x470C, 0x1292, 0x1358, 0x4C09, 0x460C, 0x1292, -0x1358, 0x4C09, 0x440C, 0x1292, 0x1358, 0x4C09, 0x9318, 0x2003, 0x403C, -0xFFCE, 0x3C0F, 0x407C, 0x0028, 0x1292, 0x1354, 0x4C4A, 0x903A, 0x0095, -0x2403, 0x403C, 0xFFCE, 0x3C04, 0x435C, 0x1292, 0x276C, 0x430C, 0x5031, -0x000A, 0x4030, 0xD420, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x003A, 0x4306, 0x4304, 0x430A, 0x403B, 0x1112, -0x4107, 0x5037, 0x0014, 0x470C, 0x5A0C, 0x4B2F, 0x129F, 0x0014, 0x531A, -0x903A, 0x0016, 0x2BF7, 0x4038, 0x1354, 0xB0F1, 0x0010, 0x001C, 0x2807, -0x4226, 0x407C, 0x0028, 0x12A8, 0xB26C, 0x2C01, 0x4314, 0x407C, 0x00B0, -0x12A8, 0x4039, 0x135C, 0x403C, 0x0003, 0x12B0, 0xD7CC, 0x4C81, 0x0010, -0x4D81, 0x0012, 0x403C, 0x0005, 0x12B0, 0xD7CC, 0x4C81, 0x000C, 0x4D81, -0x000E, 0x403C, 0x0007, 0x12B0, 0xD7CC, 0x4C81, 0x0008, 0x4D81, 0x000A, -0x403C, 0x0081, 0x12B0, 0xD7CC, 0x4C81, 0x0004, 0x4D81, 0x0006, 0x431C, -0x12B0, 0xD7CC, 0x4C81, 0x0000, 0x4D81, 0x0002, 0x12B0, 0xD652, 0x460C, -0x430D, 0x12A9, 0x422C, 0x430D, 0x12A9, 0x433C, 0x433D, 0x12A9, 0x403C, -0x0006, 0x12B0, 0xD7EA, 0x403C, 0x0080, 0x12B0, 0xD7EA, 0x4106, 0x5036, -0x002A, 0x1206, 0x430F, 0x430E, 0x403D, 0x0016, 0x470C, 0x4B25, 0x1295, -0x000E, 0x403C, 0x0003, 0x1292, 0x11E8, 0x12B0, 0xD858, 0x5321, 0x9305, -0x2409, 0x450C, 0x3C56, 0x4304, 0x407C, 0x0021, 0x12A8, 0x407C, 0x00A8, -0x12A8, 0x407C, 0x00D0, 0x12A8, 0x430C, 0x1292, 0x1358, 0x531A, 0x934C, -0x3803, 0x903A, 0x0064, 0x2BF7, 0x903A, 0x0064, 0x2803, 0x403C, 0xFFCC, -0x3C3D, 0x9304, 0x23E5, 0x12B0, 0xD652, 0x411C, 0x0010, 0x411D, 0x0012, -0x12A9, 0x422C, 0x430D, 0x12A9, 0x411C, 0x000C, 0x411D, 0x000E, 0x12A9, -0x403C, 0x0006, 0x430D, 0x12A9, 0x411C, 0x0008, 0x411D, 0x000A, 0x12A9, -0x403C, 0x0080, 0x430D, 0x12A9, 0x411C, 0x0004, 0x411D, 0x0006, 0x12A9, -0x430C, 0x430D, 0x12A9, 0x412C, 0x411D, 0x0002, 0x12A9, 0x1206, 0x430F, -0x431E, 0x403D, 0x0016, 0x470C, 0x4B27, 0x1297, 0x000E, 0x403C, 0x0003, -0x1292, 0x11E4, 0x12B0, 0xD858, 0x5321, 0x9305, 0x23A9, 0x430C, 0x5031, -0x003A, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0xB2D2, -0x2780, 0x1100, 0x2404, 0x40B2, 0x2839, 0x01EA, 0x3C03, 0x40B2, 0x283F, -0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x403D, 0x150C, 0x403A, -0x1504, 0x4A2F, 0xEDEF, 0x0000, 0xC232, 0x4303, 0x425B, 0x277E, 0x4B48, -0xE378, 0x4219, 0x2784, 0xF8C9, 0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2F, -0xEDEF, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4A2F, 0xEDEF, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, -0x0000, 0xD232, 0x4A2F, 0xEDEF, 0x0000, 0xD0B2, 0x0010, 0x01E8, 0xD392, -0x01E8, 0x4A2F, 0xEDEF, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, -0x0000, 0xD232, 0x4A2F, 0xEDEF, 0x0000, 0x4036, 0x8000, 0xB60C, 0x2409, -0x3C11, 0xB316, 0x2BFB, 0xB60C, 0x240A, 0x40B2, 0x2839, 0x01EA, 0x3C09, -0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01F0, 0x3C08, 0x40B2, 0x283F, 0x01EA, -0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, 0x4A2E, 0xEDEE, 0x0000, 0xC232, -0x4303, 0xF8C9, 0x0000, 0x5F0F, 0x421E, 0x2782, 0xB2DE, 0x2781, 0x0000, -0x2002, 0x434E, 0x3C01, 0x435E, 0xDE0F, 0xDBC9, 0x0000, 0xD232, 0x4A2E, -0xEDEE, 0x0000, 0xC312, 0x1006, 0x9306, 0x23CE, 0xB2D2, 0x2780, 0x1100, -0x241E, 0x40B2, 0x2839, 0x01EA, 0xD0B2, 0x0010, 0x01E8, 0xD392, 0x01E8, -0x4A2E, 0xEDEE, 0x0000, 0xC232, 0x4303, 0xF8C9, 0x0000, 0xDBC9, 0x0000, -0xD232, 0x4A2E, 0xEDEE, 0x0000, 0x40B2, 0x2845, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x3C1A, 0x40B2, 0x283F, 0x01EA, 0xD0B2, 0x0010, -0x01E8, 0xD392, 0x01E8, 0x4A2E, 0xEDEE, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2E, 0xEDEE, 0x0000, 0xD0B2, 0x0010, -0x01F0, 0xD392, 0x01F0, 0x4A2E, 0xEDEE, 0x0000, 0xC232, 0x4303, 0xF8C9, -0x0000, 0xDBC9, 0x0000, 0xD232, 0x4A2B, 0xEDEB, 0x0000, 0x4F0C, 0x4030, -0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x4C0A, 0x430B, -0xB31C, 0x287C, 0x4037, 0x14CA, 0x470C, 0x421F, 0x1112, 0x129F, 0x0018, -0x930C, 0x2403, 0x403C, 0xFFFB, 0x3CB6, 0x403C, 0x14C6, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFFA, 0x3CAB, 0x472E, 0x471F, -0x0002, 0x108E, 0x108F, 0xEF4E, 0xEF0E, 0xF03E, 0x0F00, 0x503E, 0x0080, -0x4E82, 0x14D2, 0x47A2, 0x14CA, 0x4382, 0x14CC, 0x4038, 0x1354, 0x407C, -0x0028, 0x12A8, 0x4039, 0x1358, 0x430C, 0x12A9, 0x4036, 0x1360, 0x434C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x435C, 0x12A6, 0x421C, 0x14D2, 0x12A9, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x1400, 0x12A9, 0x407C, -0x0082, 0x12A8, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x472C, 0x12A9, 0x434C, -0x12A6, 0x435C, 0x12A6, 0x403C, 0x4303, 0x12A9, 0x434C, 0x12A6, 0x407C, -0x0021, 0x12A8, 0x430C, 0x430D, 0x1292, 0x135A, 0x407C, 0x00C8, 0x12A8, -0x403C, 0x0500, 0x12A9, 0x435C, 0x12A6, 0x407C, 0x00C2, 0x12A8, 0x3C12, -0x403C, 0x14CE, 0x421F, 0x1112, 0x129F, 0x0016, 0x4C0B, 0x421C, 0x14CE, -0x1292, 0x1358, 0x434C, 0x1292, 0x1360, 0x53B2, 0x14C6, 0x63B2, 0x14C8, -0x421F, 0x14C6, 0xD21F, 0x14C8, 0x930F, 0x2414, 0x930B, 0x2012, 0x435C, -0x1292, 0x1360, 0xB392, 0x14C6, 0x2BE0, 0x403C, 0x14D0, 0x421F, 0x1112, -0x129F, 0x0016, 0x4C0B, 0x421C, 0x14D0, 0x1292, 0x1358, 0x3FDF, 0xB32A, -0x2812, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x0501, 0x1292, 0x1358, -0x421C, 0x14D4, 0x421F, 0x1112, 0x129F, 0x0008, 0x435C, 0x1292, 0x1360, -0x3C17, 0x931B, 0x2008, 0x407C, 0x0091, 0x421F, 0x1112, 0x129F, 0x0012, -0x430B, 0x3C0D, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x0501, 0x1292, -0x1358, 0x403B, 0xFFF6, 0x435C, 0x1292, 0x1360, 0x4B0C, 0x4030, 0xD422, -0x407C, 0x00C1, 0x4820, 0x12B0, 0x80A8, 0x933C, 0x4130, 0x421F, 0x1112, -0x4F10, 0x0016, 0x12B0, 0x80A8, 0x930C, 0x4130, 0x12B0, 0x8184, 0x12B0, -0x813E, 0x430C, 0x4B20, 0x431C, 0x1292, 0x275A, 0x444C, 0x12A8, 0x430C, -0x12AB, 0x53B1, 0x0002, 0x421F, 0x13AA, 0x4130, 0x434C, 0x12AA, 0x435C, -0x4A20, 0x434C, 0x12AA, 0x444C, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, -0x12AA, 0x4130, 0x12B0, 0xD36E, 0x494C, 0x4820, 0x12B0, 0x80F8, 0x403C, -0x00FE, 0x12B0, 0xD36E, 0x12B0, 0x80DC, 0x430C, 0x4B20, 0x12B0, 0x80F8, -0x12B0, 0xD36A, 0x12B0, 0x8126, 0x470C, 0x4030, 0x814E, 0x434C, 0x4030, -0x8200, 0x12B0, 0x811C, 0x12B0, 0xD84E, 0x12B0, 0x8126, 0x403C, 0x2409, -0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12B0, 0x814E, 0x4030, 0x8174, -0x12AB, 0x435C, 0x4A20, 0x12B0, 0x817A, 0x421C, 0x13A6, 0x4130, 0x12B0, -0xD2E8, 0x4B20, 0x12B0, 0x817A, 0x421C, 0x13C2, 0xD03C, 0x0040, 0x12B0, -0x814E, 0x12B0, 0x81EE, 0x4A20, 0x12B0, 0x8206, 0x12A8, 0x403C, 0x012C, -0x12AB, 0x407C, 0x00A1, 0x4820, 0x403C, 0x0003, 0x1292, 0x1190, 0x410C, -0x503C, 0x0026, 0x421F, 0x1112, 0x129F, 0x0010, 0x403C, 0x13B0, 0x12B0, -0xB49C, 0x12B0, 0x8206, 0x12A8, 0x403C, 0x0128, 0x12B0, 0x8184, 0x421C, -0x13BE, 0x12B0, 0x8214, 0x403C, 0x012A, 0x12B0, 0x8184, 0x421C, 0x13C0, -0x12B0, 0x8214, 0x403C, 0x012C, 0x12B0, 0x8184, 0x421C, 0x13C2, 0x12AB, -0x435C, 0x12AA, 0x12B0, 0xD2E8, 0x12AB, 0x4C81, 0x0004, 0x3FC3, 0x12B0, -0x81FE, 0x470C, 0x12AB, 0x444C, 0x12A8, 0x435C, 0x4130, 0x434C, 0x12AA, -0x464C, 0x4820, 0x12B0, 0xD146, 0x12B0, 0xD646, 0x407C, 0x00C1, 0x4130, -0x12B0, 0x814E, 0x12B0, 0xD140, 0x12B0, 0xD646, 0x3F3C, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x0030, 0x4304, -0x430A, 0x430B, 0x4038, 0x1112, 0x4109, 0x5039, 0x000A, 0x490C, 0x5B0C, -0x482F, 0x129F, 0x0014, 0x531B, 0x903B, 0x0016, 0x2BF7, 0x4036, 0x1354, -0xB0F1, 0x0010, 0x0012, 0x2807, 0x4224, 0x407C, 0x0028, 0x12A6, 0xB26C, -0x2C01, 0x431A, 0x407C, 0x0090, 0x12A6, 0x4037, 0x1358, 0x403C, 0x0003, -0x12B0, 0xDA16, 0x4C81, 0x0008, 0x403C, 0x0005, 0x12B0, 0xDA16, 0x4C81, -0x0006, 0x403C, 0x0007, 0x12B0, 0xDA16, 0x4C81, 0x0004, 0x403C, 0x0081, -0x12B0, 0xDA16, 0x4C81, 0x0002, 0x431C, 0x12B0, 0xDA16, 0x4C81, 0x0000, -0x12B0, 0xD880, 0x440C, 0x12A7, 0x422C, 0x12A7, 0x433C, 0x12A7, 0x403C, -0x0006, 0x12A7, 0x431C, 0x12A7, 0x403C, 0x0080, 0x12A7, 0x431C, 0x12A7, -0x4104, 0x5034, 0x0020, 0x1204, 0x430F, 0x430E, 0x403D, 0x0016, 0x490C, -0x4825, 0x1295, 0x000E, 0x403C, 0x0003, 0x1292, 0x1194, 0x12B0, 0xD88A, -0x5321, 0x9305, 0x2409, 0x450C, 0x3C46, 0x430A, 0x407C, 0x0021, 0x12A6, -0x407C, 0x00A8, 0x12A6, 0x407C, 0x00D0, 0x12A6, 0x430C, 0x12A7, 0x531B, -0x934C, 0x3803, 0x903B, 0x0032, 0x2BF8, 0x903B, 0x0032, 0x2803, 0x403C, -0xFFCC, 0x3C2E, 0x930A, 0x23E6, 0x12B0, 0xD880, 0x411C, 0x0008, 0x12A7, -0x422C, 0x12A7, 0x411C, 0x0006, 0x12A7, 0x403C, 0x0006, 0x12A7, 0x411C, -0x0004, 0x12A7, 0x403C, 0x0080, 0x12A7, 0x411C, 0x0002, 0x12B0, 0xDA16, -0x412C, 0x12A7, 0x1204, 0x430F, 0x431E, 0x403D, 0x0016, 0x490C, 0x482B, -0x129B, 0x000E, 0x403C, 0x0003, 0x1292, 0x1190, 0x12B0, 0xD88A, 0x5321, -0x9305, 0x23B9, 0x430C, 0x5031, 0x0030, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x4C08, 0x4E0A, 0x4F0B, 0x4039, -0x150C, 0x4036, 0x1504, 0x4037, 0x0190, 0xB0F2, 0x0040, 0x1100, 0xD0F2, -0x0040, 0x0029, 0x4214, 0x2758, 0x470C, 0x280F, 0x1284, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, -0x0040, 0x0029, 0x3C0E, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xC0F2, 0x0040, 0x0029, 0x470C, -0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, -0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC9EF, 0x0000, -0xC0F2, 0x0040, 0x0029, 0x4214, 0x2758, 0x470C, 0x1284, 0x462F, 0xD3DF, -0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0xD0F2, -0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, -0x462F, 0xC9EF, 0x0000, 0xC0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, -0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, -0xD0F2, 0x0040, 0x0029, 0x470C, 0x1284, 0x462F, 0xD3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xD9EF, 0x0000, -0x462F, 0xD3DF, 0x0000, 0x431C, 0x1284, 0x462F, 0xC3DF, 0x0000, 0x431C, -0x1284, 0x462F, 0xC9EF, 0x0000, 0x4A0E, 0x4B0F, 0x480C, 0x12B0, 0x61B6, -0x4030, 0xD420, 0x120D, 0x120C, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, -0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2867, 0x01EA, -0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, 0x40B2, 0x286D, -0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, -0xB27D, 0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0x4EC1, 0x0002, 0xB26D, -0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0x51D1, 0x0002, 0x0002, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xDEC1, -0x0002, 0xB36D, 0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, 0x0031, 0xC2F2, -0x0031, 0xD2F2, 0x0031, 0x51D1, 0x0002, 0x0002, 0xB2E2, 0x0030, 0x7E4E, -0x535E, 0xDEC1, 0x0002, 0xB35D, 0x2803, 0xD3E2, 0x0031, 0x3C02, 0xC3E2, -0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0x51D1, 0x0002, 0x0002, 0xB2E2, -0x0030, 0x7E4E, 0x535E, 0xDEC1, 0x0002, 0xD0F2, 0x000E, 0x0033, 0xD0F2, -0x0010, 0x0078, 0x41D2, 0x0005, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x42D1, -0x007E, 0x0001, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, -0x2BFD, 0x425E, 0x007E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, -0xB31C, 0x2804, 0xD0F2, 0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, -0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, -0xDEC1, 0x0000, 0xD392, 0x01F0, 0x412F, 0x4F0C, 0x411D, 0x0002, 0xC312, -0x100D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0xDF0D, -0xF03D, 0x000F, 0x5231, 0x4130, 0x120A, 0x120B, 0x1208, 0x4C4A, 0x9392, -0x14FE, 0x2006, 0x421F, 0x2784, 0xC2DF, 0x277E, 0x0000, 0x3C04, 0x421F, -0x1504, 0xD3DF, 0x0000, 0x403B, 0xD1BA, 0x4038, 0x0005, 0x480C, 0x128B, -0x431C, 0x128B, 0x934A, 0x2402, 0x935A, 0x201A, 0x9392, 0x14FE, 0x2006, -0x421F, 0x2784, 0xC2DF, 0x2780, 0x0000, 0x3C06, 0xC0F2, 0x0020, 0x0029, -0xC0F2, 0x0040, 0x0029, 0x480C, 0x128B, 0x9392, 0x14FE, 0x2016, 0x421F, -0x2784, 0xD2DF, 0x277E, 0x0000, 0x3C14, 0x9392, 0x14FE, 0x2006, 0x421F, -0x2784, 0xD2DF, 0x2780, 0x0000, 0x3FEC, 0xC0F2, 0x0020, 0x0029, 0xD0F2, -0x0040, 0x0029, 0x3FE5, 0x421F, 0x1504, 0xC3DF, 0x0000, 0x480C, 0x128B, -0x403C, 0x0064, 0x128B, 0x935A, 0x2403, 0x907A, 0x0003, 0x2021, 0x9392, -0x14FE, 0x2006, 0x421F, 0x2784, 0xC2DF, 0x2780, 0x0000, 0x3C06, 0xC0F2, -0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, 0x480C, 0x128B, 0x403C, 0x0028, -0x12B0, 0xD1EA, 0x934A, 0x2402, 0x936A, 0x2018, 0xC232, 0x4303, 0x421F, -0x2784, 0xC2DF, 0x277E, 0x0000, 0x3C14, 0x9392, 0x14FE, 0x2006, 0x421F, -0x2784, 0xD2DF, 0x2780, 0x0000, 0x3FE5, 0xC0F2, 0x0020, 0x0029, 0xD0F2, -0x0040, 0x0029, 0x3FDE, 0x421F, 0x1504, 0xD3DF, 0x0000, 0x935A, 0x2006, -0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x431C, 0x12B0, 0xD1EA, -0x934A, 0x2402, 0x936A, 0x2007, 0x421F, 0x2784, 0xD2DF, 0x277E, 0x0000, -0xD232, 0x3C04, 0x421F, 0x1504, 0xC3DF, 0x0000, 0x403C, 0x0028, 0x12B0, -0xD1EA, 0x907A, 0x0003, 0x2006, 0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, -0x0029, 0x480C, 0x128B, 0x4030, 0xD428, 0xE03F, 0x8000, 0x1206, 0x4D06, -0x5606, 0x9036, 0xFF01, 0x2C9E, 0x4F06, 0x5606, 0x9036, 0xFF01, 0x2C0E, -0x4D06, 0x5606, 0x9036, 0xFF00, 0x200B, 0x4F06, 0x5606, 0x9036, 0xFF00, -0x208F, 0x4D06, 0xEF06, 0x5606, 0x288B, 0x433D, 0x3C89, 0x4F06, 0x5606, -0x9036, 0xFF00, 0x2407, 0xB03F, 0x7FFF, 0x2007, 0x4D06, 0x5606, 0x207E, -0x287D, 0x4E0C, 0x4F0D, 0x3C7A, 0xB03D, 0x7FFF, 0x27FA, 0x1209, 0x1208, -0x1207, 0x4D06, 0x4F07, 0x5606, 0x5707, 0x9607, 0x2809, 0x2002, 0x9C0E, -0x2806, 0xED0F, 0xEF0D, 0xED0F, 0xEC0E, 0xEE0C, 0xEC0E, 0x4F06, 0x5606, -0x6909, 0x1086, 0xD07F, 0x0080, 0x4D08, 0x5808, 0x6909, 0x1088, 0xF378, -0xD07D, 0x0080, 0x4307, 0x8846, 0x2415, 0x9076, 0xFFF1, 0x2C0D, 0x9076, -0xFFE8, 0x283D, 0x4E07, 0x4F0E, 0x430F, 0x5076, 0x0010, 0x2409, 0x9347, -0x2402, 0xD037, 0x0100, 0x110F, 0x100E, 0x1007, 0x5356, 0x23FB, 0x4906, -0x1106, 0xE906, 0xB316, 0x2426, 0xE337, 0x5317, 0x7E0C, 0x7F4D, 0x2010, -0x930C, 0x2007, 0x9307, 0x242F, 0x1087, 0x474D, 0x8038, 0x0018, 0x3C06, -0x108C, 0x4C4D, 0xED0C, 0x1087, 0xD70C, 0x8238, 0x4307, 0x5707, 0x6C0C, -0x6D4D, 0x2C09, 0x8318, 0x5707, 0x6C0C, 0x6D4D, 0x2C04, 0x8318, 0x5C0C, -0x6D4D, 0x2BFC, 0x9318, 0x3408, 0x430D, 0x3C1C, 0x5E0C, 0x6F4D, 0x2C14, -0x5707, 0x6C0C, 0x6D4D, 0x1088, 0xD80D, 0x1009, 0x100D, 0x100C, 0x2806, -0x9307, 0x2002, 0xB31C, 0x2402, 0x531C, 0x630D, 0x4137, 0x4138, 0x4139, -0x4136, 0x4130, 0x5358, 0x9378, 0x23EC, 0x403D, 0xFF00, 0x430C, 0x1009, -0x100D, 0x3FF2, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x002E, 0x410C, 0x503C, 0x0018, 0x403E, 0x27E6, 0x403D, -0x0015, 0x12B0, 0xD454, 0x403A, 0x1112, 0x410C, 0x4A2F, 0x129F, 0x0018, -0x410C, 0x522C, 0x4A2F, 0x129F, 0x0018, 0x430F, 0x410B, 0x503B, 0x0018, -0x4B07, 0x5F07, 0x4FD7, 0x1102, 0x0005, 0x531F, 0x903F, 0x0010, 0x3BF7, -0x4107, 0x5237, 0x1207, 0x430F, 0x430E, 0x403D, 0x0015, 0x4B0C, 0x4A28, -0x1298, 0x000E, 0x12B0, 0xD4F4, 0x411C, 0x0002, 0x411D, 0x0004, 0x12B0, -0xD196, 0x4C04, 0xF034, 0x0F00, 0x5034, 0x0080, 0x4115, 0x0002, 0x4038, -0x1354, 0x407C, 0x0028, 0x12A8, 0x4039, 0x1358, 0x430C, 0x12A9, 0x4036, -0x1360, 0x434C, 0x12A6, 0x12B0, 0xD8DE, 0x435C, 0x12A6, 0x440C, 0x12A9, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x1400, 0x12B0, 0xD8DC, -0x434C, 0x12A6, 0x435C, 0x12A6, 0x450C, 0x12A9, 0x434C, 0x12A6, 0x435C, -0x12A6, 0x403C, 0x4303, 0x12A9, 0x434C, 0x12A6, 0x407C, 0x0021, 0x12A8, -0x430C, 0x430D, 0x1292, 0x135A, 0x435C, 0x12A6, 0x407C, 0x00C8, 0x12A8, -0x403C, 0x0501, 0x12B0, 0xD8DC, 0x411C, 0x0002, 0x832C, 0x12A9, 0x407C, -0x0022, 0x12A8, 0x411C, 0x0006, 0x411D, 0x0008, 0x1292, 0x1364, 0x407C, -0x0062, 0x12A8, 0x430C, 0x12A9, 0x4A2F, 0x129F, 0x0008, 0x430F, 0x5321, -0x4B0E, 0x5F0E, 0x4FDE, 0x1102, 0x0005, 0x531F, 0x903F, 0x0010, 0x3BF7, -0x1207, 0x430F, 0x430E, 0x403D, 0x0015, 0x4B0C, 0x4A2B, 0x129B, 0x000E, -0x12B0, 0xD4F4, 0x430C, 0x5031, 0x0030, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C4A, 0x425B, 0x2780, -0x4218, 0x2784, 0x4259, 0x277E, 0x494E, 0x525E, 0x277F, 0x5B4E, 0xDEC8, -0x0000, 0x4036, 0x1504, 0xB2B2, 0x136C, 0x462F, 0x2804, 0xC2DF, 0x150C, -0x0000, 0x3C03, 0xD2DF, 0x150C, 0x0000, 0xD0F2, 0x0040, 0x0029, 0xC0F2, -0x0020, 0x0029, 0x4037, 0xD1BA, 0x403C, 0x000A, 0x1287, 0x9392, 0x14FE, -0x2003, 0xC9C8, 0x0000, 0x3C03, 0x462F, 0xD3DF, 0x0000, 0x4034, 0x0005, -0x440C, 0x1287, 0x431C, 0x1287, 0x934A, 0x2402, 0x935A, 0x2004, 0xC0F2, -0x0040, 0x0029, 0x3C0E, 0x9392, 0x14FE, 0x2003, 0xDBC8, 0x0000, 0x3C06, -0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x440C, 0x1287, 0x4035, -0xD1EA, 0x403C, 0x000A, 0x1285, 0x9392, 0x14FE, 0x2003, 0xD9C8, 0x0000, -0x3C03, 0x462F, 0xC3DF, 0x0000, 0x440C, 0x1287, 0x403C, 0x0019, 0x1287, -0x935A, 0x2403, 0x907A, 0x0003, 0x2031, 0x9392, 0x14FE, 0x2003, 0xCBC8, -0x0000, 0x3C06, 0xC0F2, 0x0020, 0x0029, 0xC0F2, 0x0040, 0x0029, 0x440C, -0x1287, 0x403C, 0x0028, 0x1285, 0x462F, 0xD3DF, 0x0000, 0x935A, 0x2006, -0xC0F2, 0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x431C, 0x1285, 0x462F, -0xC3DF, 0x0000, 0x403C, 0x0028, 0x1285, 0x907A, 0x0003, 0x2006, 0xC0F2, -0x0020, 0x0029, 0xD0F2, 0x0040, 0x0029, 0x440C, 0x1287, 0x4030, 0xD41E, -0x9392, 0x14FE, 0x2003, 0xDBC8, 0x0000, 0x3FD5, 0xC0F2, 0x0020, 0x0029, -0xD0F2, 0x0040, 0x0029, 0x3FCE, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x1204, 0x1205, 0x4327, 0x407C, 0x0028, 0x1292, 0x1354, 0x4C4C, -0x903C, 0x0089, 0x240B, 0x903C, 0x0091, 0x2408, 0x903C, 0x0095, 0x2405, -0x903C, 0x0099, 0x2402, 0x432C, 0x3C30, 0x407C, 0x00B0, 0x1292, 0x1354, -0x403B, 0x135C, 0x403C, 0x009F, 0x12B0, 0xD6E4, 0x4C0A, 0xB03C, 0x0100, -0x2821, 0x4034, 0x009D, 0x4038, 0x1112, 0x4C4E, 0xF07E, 0x0006, 0x926E, -0x201B, 0x423C, 0x12B0, 0xD1D2, 0x403C, 0x009E, 0x430D, 0x12AB, 0x12B0, -0xD74A, 0x4307, 0x403C, 0x009A, 0x430D, 0x12AB, 0x470C, 0x5C0C, 0x5C0C, -0x430D, 0x12B0, 0xD1D8, 0x5317, 0x9237, 0x2BF3, 0x4317, 0x470C, 0x4030, -0xD41E, 0x4309, 0x403C, 0x009B, 0x12B0, 0xD6E4, 0x12B0, 0xD18A, 0x4C06, -0x421F, 0x14C0, 0xB23A, 0x2813, 0xB03A, 0x0200, 0x280B, 0x403C, 0x009E, -0x430D, 0x12AB, 0xC31A, 0x12B0, 0xD74A, 0x4239, 0x8219, 0x14C0, 0x3C1A, -0x9F0C, 0x2418, 0x4C09, 0x8F09, 0x3C15, 0x9F0C, 0x2405, 0x4382, 0x14C4, -0x4C82, 0x14C0, 0x3FD7, 0x5392, 0x14C4, 0x90B2, 0x0014, 0x14C4, 0x2008, -0xB03A, 0x0200, 0x2804, 0x4239, 0x4C82, 0x14C0, 0x3C05, 0x4C09, 0x4682, -0x14C0, 0x9319, 0x3BC5, 0x460A, 0x432C, 0x12B0, 0xD1D2, 0x490C, 0x12B0, -0xD1D2, 0x533A, 0x930A, 0x3402, 0x403A, 0x0007, 0x403C, 0x009A, 0x430D, -0x12AB, 0x4A0C, 0x5C0C, 0x5C0C, 0x4C0D, 0xE33D, 0x5D0D, 0x7D0D, 0x12B0, -0xD1D8, 0x440C, 0x12B0, 0xD6E4, 0x12B0, 0xD1D2, 0x960A, 0x23E7, 0x3FA3, -0x403E, 0x001C, 0x403D, 0x12B8, 0x411C, 0x0002, 0x4210, 0x14A8, 0x12B0, -0xC920, 0x430C, 0x4030, 0xA286, 0x12B0, 0xC94E, 0x4030, 0xA286, 0x12B0, -0xCE3E, 0x3FF6, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x8031, 0x0040, 0x4C05, 0x40B1, 0x0007, 0x0002, 0x4308, 0x4036, -0x0006, 0x4381, 0x0000, 0x4039, 0x1112, 0x410C, 0x492F, 0x129F, 0x0016, -0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C6A, 0x410C, 0x532C, 0x492F, 0x129F, -0x0016, 0x930C, 0x3403, 0x403C, 0xFFBE, 0x3C60, 0x90B1, 0x000F, 0x0002, -0x2002, 0x4036, 0x0009, 0x12B0, 0xD86C, 0x4034, 0x0015, 0x440E, 0x410D, -0x522D, 0x412C, 0x1292, 0x14AA, 0x12B0, 0x8E82, 0x4037, 0x0028, 0x460E, -0xD03E, 0x0080, 0x480C, 0x12B0, 0xD4B8, 0x12B0, 0xD40C, 0x2402, 0x12B0, -0x8E82, 0x4A0F, 0xDB0F, 0x930F, 0x2002, 0x433C, 0x3C3B, 0x903B, 0x0020, -0x280F, 0x2003, 0x903A, 0xA761, 0x280B, 0x480F, 0x5338, 0x930F, 0x2015, -0x4038, 0x0007, 0x460F, 0x5336, 0x930F, 0x200F, 0x3FEC, 0x940B, 0x2804, -0x200E, 0x903A, 0x83D0, 0x2C0B, 0x5318, 0x9238, 0x2805, 0x4308, 0x5316, -0x9681, 0x0002, 0x2BDE, 0x5337, 0x9317, 0x37CC, 0x440E, 0x410D, 0x522D, -0x12B0, 0x8D4A, 0x9317, 0x3BD4, 0x480C, 0x12B0, 0xD4B8, 0x492F, 0x129F, -0x0008, 0xD036, 0x0080, 0x460C, 0x492F, 0x129F, 0x0008, 0x430C, 0x492F, -0x129F, 0x0008, 0x430C, 0x5031, 0x0040, 0x4030, 0xD41E, 0x440E, 0x403D, -0x128E, 0x3F60, 0x12B0, 0x8F72, 0x12AB, 0x4030, 0x8F56, 0x12AB, 0x12B0, -0x8F3A, 0x434C, 0x12AA, 0x407C, 0x00A8, 0x12A8, 0x454C, 0x4820, 0x12B0, -0xD6D6, 0x12B0, 0xD5A2, 0x12B0, 0x8ED6, 0x435C, 0x4A20, 0x435C, 0x12AA, -0x12B0, 0x8FC4, 0x4030, 0x8F96, 0xD03C, 0x0040, 0x12AB, 0x12B0, 0x8ED6, -0x454C, 0x12A8, 0x435C, 0x4A20, 0x435C, 0x12AA, 0x434C, 0x12AA, 0x494C, -0x12A8, 0x470C, 0x4B20, 0x12B0, 0x8EDA, 0x435C, 0x12AA, 0x494C, 0x12A8, -0x403C, 0x3401, 0x12AB, 0x464C, 0x4820, 0x12AB, 0x435C, 0x12AA, 0x12B0, -0x8F12, 0x12B0, 0x8EB8, 0x403C, 0x012C, 0x4030, 0x8F1A, 0x12B0, 0x8EDA, -0x454C, 0x4820, 0x12B0, 0x8FBC, 0x12B0, 0x8F56, 0x430C, 0x4B20, 0x12B0, -0xD6D6, 0x403C, 0x00FE, 0x12B0, 0xD5A6, 0x12B0, 0x8F3A, 0x430C, 0x4B20, -0x12B0, 0x8F56, 0x435C, 0x4A20, 0x464C, 0x12A8, 0x403C, 0x4030, 0x12B0, -0x8F54, 0x421C, 0x1432, 0x4130, 0x12AB, 0x435C, 0x12AA, 0x434C, 0x4A20, -0x12B0, 0x8F72, 0x12B0, 0x8F54, 0x12B0, 0x8F8A, 0x403C, 0x012A, 0x4030, -0x8FBC, 0x464C, 0x12A8, 0x403C, 0x3FFF, 0x12AB, 0x434C, 0x12AA, 0x494C, -0x12A8, 0x403C, 0x2409, 0x4130, 0x407C, 0x0048, 0x12A8, 0x427C, 0x1292, -0x1356, 0x407C, 0x00C1, 0x4820, 0x12B0, 0x8FB0, 0x421C, 0x144A, 0x4130, -0x12B0, 0x8FB0, 0x421C, 0x142E, 0x4130, 0x12B0, 0x8FC4, 0x12B0, 0x8F8A, -0x403C, 0x012C, 0x12AB, 0x407C, 0x00A1, 0x4820, 0x12B0, 0x8F72, 0x12AB, -0x3FC5, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8031, 0x001C, -0x403F, 0x27E2, 0x4FF1, 0x0008, 0x4FF1, 0x0009, 0x4FF1, 0x000A, 0x4FF1, -0x000B, 0x403B, 0x1112, 0x410C, 0x4B2F, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFDD, 0x3C7F, 0x410C, 0x522C, 0x4B2F, 0x129F, 0x0018, 0x930C, -0x3403, 0x403C, 0xFFDC, 0x3C75, 0x4108, 0x5038, 0x000C, 0x1208, 0x12B0, -0xD3D6, 0x12B0, 0xD3FA, 0x5321, 0x930A, 0x3402, 0x4A0C, 0x3C68, 0x412C, -0x411D, 0x0002, 0x503C, 0xFFFC, 0x633D, 0x12B0, 0xD196, 0x4C0A, 0xF03A, -0x0F00, 0xD03A, 0x0080, 0x4127, 0x8227, 0x4039, 0x1354, 0x407C, 0x0088, -0x12A9, 0x407C, 0x0034, 0x1292, 0x1356, 0x12B0, 0xD966, 0x4036, 0x1358, -0x4A0C, 0x12A6, 0x403A, 0x1360, 0x434C, 0x12AA, 0x435C, 0x12AA, 0x470C, -0x12A6, 0x434C, 0x12AA, 0x407C, 0x0021, 0x12A9, 0x435C, 0x12AA, 0x434C, -0x12AA, 0x407C, 0x0088, 0x12A9, 0x407C, 0x0024, 0x1292, 0x1356, 0x435C, -0x12B0, 0xD964, 0x403C, 0x3FFF, 0x12A6, 0x434C, 0x12AA, 0x407C, 0x00C8, -0x12A9, 0x403C, 0x2409, 0x12A6, 0x435C, 0x12AA, 0x434C, 0x12B0, 0xD964, -0x412C, 0x832C, 0x12A6, 0x407C, 0x0022, 0x12A9, 0x411C, 0x0004, 0x411D, -0x0006, 0x1292, 0x1364, 0x407C, 0x0062, 0x12A9, 0x430C, 0x12A6, 0x4B2F, -0x129F, 0x0008, 0x435C, 0x12AA, 0x1292, 0x1366, 0x1208, 0x12B0, 0xD3D6, -0x12B0, 0xD3FA, 0x4A0C, 0x5321, 0x5031, 0x001C, 0x4030, 0xD422, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x4327, 0x407C, 0x0028, -0x1292, 0x1354, 0x4C46, 0x9036, 0x0089, 0x240B, 0x9036, 0x0091, 0x2408, -0x9036, 0x0095, 0x2405, 0x9036, 0x0099, 0x2402, 0x432C, 0x3C2D, 0x407C, -0x0090, 0x1292, 0x1354, 0x403A, 0x1358, 0x403C, 0x009F, 0x12B0, 0xD9C6, -0x4C06, 0xB03C, 0x0100, 0x281E, 0x403B, 0x009D, 0x4038, 0x1112, 0x4C4E, -0xF07E, 0x0006, 0x926E, 0x2018, 0x423C, 0x12B0, 0xD014, 0x403C, 0x009E, -0x12AA, 0xD036, 0x0040, 0x460C, 0x12AA, 0x4309, 0x403C, 0x009A, 0x12AA, -0x490C, 0x12B0, 0xD01A, 0x5319, 0x9239, 0x2BF7, 0x4317, 0x470C, 0x4030, -0xD420, 0x4304, 0x403C, 0x009B, 0x12B0, 0xD9C6, 0x4C09, 0x1089, 0x1189, -0x1109, 0x1109, 0x421F, 0x14C0, 0xB236, 0x2814, 0xB036, 0x0200, 0x280C, -0x403C, 0x009E, 0x12AA, 0xC316, 0xD036, 0x0040, 0x460C, 0x12AA, 0x4234, -0x8214, 0x14C0, 0x3C1A, 0x9F09, 0x2418, 0x4904, 0x8F04, 0x3C15, 0x9F09, -0x2405, 0x4382, 0x14C2, 0x4982, 0x14C0, 0x3FD4, 0x5392, 0x14C2, 0x90B2, -0x0014, 0x14C2, 0x2008, 0xB036, 0x0200, 0x2804, 0x4234, 0x4982, 0x14C0, -0x3C05, 0x4904, 0x4982, 0x14C0, 0x9314, 0x3BC2, 0x4906, 0x432C, 0x12B0, -0xD014, 0x440C, 0x12B0, 0xD014, 0x5336, 0x9306, 0x3402, 0x4036, 0x0007, -0x403C, 0x009A, 0x12AA, 0x460C, 0x12B0, 0xD01A, 0x12B0, 0xD9C4, 0x12B0, -0xD014, 0x9906, 0x23EF, 0x3FA8, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x8231, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x410C, 0x522C, 0x421F, -0x1112, 0x129F, 0x0018, 0x4038, 0x1354, 0x407C, 0x0048, 0x12A8, 0x435C, -0x1292, 0x1356, 0x4039, 0x1360, 0x435C, 0x12A9, 0x430B, 0x4036, 0x1358, -0x407C, 0x0028, 0x12A8, 0x430C, 0x12A6, 0xF07C, 0x0081, 0x907C, 0x0081, -0x2408, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x531B, 0x903B, 0x000A, 0x2BEE, -0x412C, 0x411D, 0x0002, 0x503C, 0xFFFE, 0x633D, 0x12B0, 0xD196, 0x4C0B, -0xF03B, 0x0F00, 0xD03B, 0x0080, 0x412A, 0x832A, 0x407C, 0x0088, 0x12A8, -0x407C, 0x0034, 0x1292, 0x1356, 0x407C, 0x0082, 0x12A8, 0x4B0C, 0x12A6, -0x434C, 0x12A9, 0x435C, 0x12A9, 0x4A0C, 0x12A6, 0x434C, 0x12A9, 0x407C, -0x0021, 0x12A8, 0x12B0, 0xD99C, 0x407C, 0x0088, 0x12A8, 0x407C, 0x0024, -0x1292, 0x1356, 0x435C, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, -0x12A6, 0x434C, 0x12A9, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A6, -0x435C, 0x12A9, 0x407C, 0x00C2, 0x12A8, 0x430A, 0x430B, 0x3C0A, 0x12B0, -0xD99C, 0x430C, 0x12A6, 0x421F, 0x1112, 0x129F, 0x0008, 0x531A, 0x630B, -0x911B, 0x0006, 0x2BF3, 0x2003, 0x911A, 0x0004, 0x2BEF, 0x12B0, 0xD99C, -0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, 0x12A8, -0x435C, 0x12A9, 0x430C, 0x5231, 0x4030, 0xD424, 0x120A, 0x120B, 0x4C0A, -0x4D0B, 0x4C0F, 0xDD0F, 0x930F, 0x2443, 0x533A, 0x633B, 0x435C, 0x1292, -0x1360, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, 0xD2F2, -0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, 0xD2F2, -0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC2F2, -0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC2F2, -0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, 0xC2F2, -0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, -0x4303, 0x434C, 0x1292, 0x1360, 0x4303, 0x4A0F, 0xDB0F, 0x930F, 0x23BD, -0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x4C0A, 0x4D0B, 0x4C0F, 0xDD0F, -0x930F, 0x2443, 0x533A, 0x633B, 0x435C, 0x1292, 0x1360, 0x4303, 0x434C, -0x1292, 0x1360, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, -0xD2F2, 0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, -0xD2F2, 0x0031, 0x4303, 0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, -0xC2F2, 0x0031, 0x4303, 0xD3D2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, -0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0xC3D2, 0x0031, 0x4303, -0xC2F2, 0x0031, 0x4303, 0xD2F2, 0x0031, 0x4303, 0x4303, 0x4303, 0x4303, -0x4303, 0x4303, 0x4A0F, 0xDB0F, 0x930F, 0x23BD, 0x3FB1, 0x120F, 0x120E, -0x120D, 0x120C, 0x8231, 0x4381, 0x0000, 0x4381, 0x0002, 0x4381, 0x0004, -0x4381, 0x0006, 0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, -0x2867, 0x01EA, 0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, -0x40B2, 0x286D, 0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x41D2, -0x000F, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x403F, 0x007E, 0x4FE1, 0x0007, -0x41D2, 0x000E, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0006, 0x41D2, -0x000D, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0005, 0x4EC2, 0x007F, -0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0004, 0x41D2, 0x000B, 0x007F, 0xB3D2, -0x0079, 0x2BFD, 0x4FE1, 0x0003, 0x4DC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, -0x4FE1, 0x0002, 0x41D2, 0x0009, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, -0x0001, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, -0x4F6E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, 0xB31C, 0x2804, -0xD0F2, 0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, -0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xDEC1, 0x0000, -0xD392, 0x01F0, 0x412C, 0x411D, 0x0002, 0x411E, 0x0004, 0x411F, 0x0006, -0x5031, 0x0010, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x4306, 0x4307, 0x4308, 0x4309, 0x430A, 0x430B, 0x430F, 0x430C, -0x430D, 0x4304, 0x3C01, 0x5314, 0x9224, 0x347B, 0x407C, 0x0028, 0x1292, -0x1354, 0x4C46, 0x9036, 0x0089, 0x2403, 0x9036, 0x008D, 0x201E, 0x4307, -0x4308, 0x4309, 0x403A, 0x0FF0, 0x430B, 0x460C, 0x421F, 0x1112, 0x129F, -0x0008, 0x470C, 0x421F, 0x1112, 0x129F, 0x0008, 0x480C, 0x490D, 0x421F, -0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, 0x000A, -0x430C, 0x3C53, 0x9036, 0x0091, 0x2406, 0x9036, 0x0099, 0x2403, 0x9036, -0x0095, 0x23CB, 0x407C, 0x00E8, 0x1292, 0x1354, 0x430C, 0x1292, 0x1358, -0x4C0F, 0x4F07, 0x407C, 0x00E1, 0x1292, 0x1354, 0x430C, 0x430D, 0x1292, -0x135A, 0x4C08, 0x4D09, 0x480C, 0x490D, 0xF33C, 0xF30D, 0x5C0C, 0x6D0D, -0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x5C0C, 0x6D0D, 0x480E, 0x490F, 0x4F0E, -0xE33F, 0x5F0F, 0x7F0F, 0x4C08, 0x4D09, 0x5E08, 0x6F09, 0x480F, 0xD90F, -0x930F, 0x2404, 0x480A, 0x490B, 0x522A, 0x630B, 0x460C, 0x421F, 0x1112, -0x129F, 0x0008, 0x470C, 0x421F, 0x1112, 0x129F, 0x0008, 0x480C, 0x490D, -0x421F, 0x1112, 0x129F, 0x000A, 0x4A0C, 0x4B0D, 0x421F, 0x1112, 0x129F, -0x000A, 0x430C, 0x3C01, 0x433C, 0x4030, 0xD420, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8321, 0x4C0A, 0x4A2C, 0x4A1D, -0x0002, 0x12B0, 0xD196, 0x4C06, 0xF036, 0x0F00, 0xD036, 0x0085, 0x403B, -0x1354, 0x4075, 0x0088, 0x454C, 0x12AB, 0x4034, 0x1356, 0x407C, 0x0034, -0x12A4, 0x4077, 0x0082, 0x474C, 0x12AB, 0x4038, 0x1360, 0x435C, 0x12A8, -0x4039, 0x1358, 0x460C, 0x12B0, 0xC9E6, 0x4076, 0x0042, 0x12B0, 0xC9B6, -0x4A2C, 0x12B0, 0xC9BC, 0x4A1C, 0x0004, 0x4A1D, 0x0006, 0x12B0, 0x5B3E, -0xD03C, 0x0086, 0x12B0, 0xC9EC, 0x4A1C, 0x0004, 0x12B0, 0xC9BC, 0x4A1C, -0x0008, 0x4A1D, 0x000A, 0x12B0, 0x5B3E, 0xD03C, 0x0089, 0x12B0, 0xC9EC, -0x4A1C, 0x0008, 0x12B0, 0xC9BC, 0x4A1C, 0x000C, 0x4A1D, 0x000E, 0x12B0, -0x5B3E, 0xD50C, 0x4C81, 0x0000, 0x12B0, 0xD0CE, 0x12A8, 0x412C, 0x12B0, -0xC9E6, 0x12B0, 0xC9B6, 0x4A1C, 0x000C, 0x12B0, 0xC9BC, 0x4A1C, 0x0010, -0x4A1D, 0x0012, 0x12B0, 0x5B3E, 0xD03C, 0x008A, 0x12B0, 0xC9EC, 0x4A1C, -0x0010, 0x12B0, 0xC9BC, 0x4A1C, 0x0014, 0x4A1D, 0x0016, 0x12B0, 0x5B3E, -0xD03C, 0x008B, 0x12B0, 0xC9EC, 0x4A1C, 0x0014, 0x12B0, 0xC9BC, 0x4A1C, -0x0018, 0x4A1D, 0x001A, 0x12B0, 0x5B3E, 0xD03C, 0x008C, 0x12B0, 0xC9EC, -0x4A1C, 0x0018, 0x12B0, 0xC9BC, 0x5321, 0x4030, 0xD41E, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x8321, 0x430A, 0x430B, -0x4378, 0x4345, 0x43C1, 0x0000, 0x4304, 0x12B0, 0xCA04, 0xD3D2, 0x0031, -0x4216, 0x2758, 0x4037, 0x000A, 0x470C, 0x1286, 0xC2F2, 0x0031, 0x470C, -0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xC3D2, 0x0031, 0x470C, 0x1286, -0xC2F2, 0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xC2F2, -0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xB318, 0x2C03, -0xC3E2, 0x0031, 0x3C02, 0xD3E2, 0x0031, 0xC312, 0x1008, 0xC2F2, 0x0031, -0x470C, 0x1286, 0xD2F2, 0x0031, 0xC312, 0x100B, 0x100A, 0xB2E2, 0x0030, -0x2809, 0xD03B, 0x8000, 0x93C1, 0x0000, 0x2008, 0x4345, 0x43D1, 0x0000, -0x3C04, 0x93C1, 0x0000, 0x2001, 0x5314, 0x5165, 0x9075, 0x0020, 0x2009, -0x43C1, 0x0000, 0x4345, 0x4A4E, 0xC35E, 0x907E, 0x00FE, 0x2405, 0x5314, -0x9034, 0x00FF, 0x23CE, 0x4304, 0xD3D2, 0x0031, 0x470C, 0x1286, 0xC2F2, -0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0xC2F2, 0x0031, 0x470C, 0x1286, -0xD2F2, 0x0031, 0x470C, 0x1286, 0xC3D2, 0x0031, 0x470C, 0x1286, 0xC2F2, -0x0031, 0x470C, 0x1286, 0xD2F2, 0x0031, 0x470C, 0x1286, 0xD3D2, 0x0031, -0x470C, 0x1286, 0x440C, 0x5321, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x8231, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, -0x0018, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x411B, 0x0004, 0x832B, -0x4038, 0x1354, 0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1356, 0x4039, -0x1360, 0x435C, 0x12A9, 0x4307, 0x4036, 0x1358, 0x407C, 0x0028, 0x12A8, -0x430C, 0x12A6, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2406, 0x12B0, 0xD96C, -0x5317, 0x9037, 0x000A, 0x2BF0, 0x4077, 0x00C8, 0x474C, 0x12A8, 0x403C, -0x3401, 0x12A6, 0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, 0x12A6, 0x12B0, -0xD96C, 0x4B0C, 0x12A6, 0x9382, 0x1506, 0x2402, 0x12B0, 0xD96C, 0x434C, -0x12A9, 0x407C, 0x0021, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A9, -0x12B0, 0xD524, 0x435C, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x403C, 0x3FFF, -0x12A6, 0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, 0x2409, 0x12A6, 0x435C, -0x12A9, 0x407C, 0x00C2, 0x12A8, 0x430A, 0x430B, 0x3C0C, 0x435C, 0x12A9, -0x434C, 0x12A9, 0x430C, 0x12A6, 0x421F, 0x1112, 0x129F, 0x0008, 0x531A, -0x630B, 0x911B, 0x0002, 0x2BF1, 0x2002, 0x912A, 0x2BEE, 0x435C, 0x12A9, -0x12B0, 0xD524, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A9, 0x430C, 0x5231, -0x4030, 0xD422, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8031, -0x007C, 0x4381, 0x0000, 0x410C, 0x522C, 0x403E, 0x003C, 0x12B0, 0xD494, -0x410C, 0x532C, 0x12B0, 0xD706, 0x3403, 0x403C, 0xFFEB, 0x3C6D, 0x410C, -0x12B0, 0xD706, 0x2403, 0x403C, 0xFFC1, 0x3C66, 0x4306, 0x3C01, 0x5316, -0x9126, 0x2C0B, 0x410C, 0x522C, 0x460F, 0x5F0F, 0x5F0C, 0x12B0, 0xD706, -0x37F5, 0x403C, 0xFFC0, 0x3C56, 0x411C, 0x0002, 0x1292, 0x274E, 0x4216, -0x2754, 0x12B0, 0xD9DC, 0x435C, 0x12B0, 0xD9DE, 0x430A, 0x430B, 0x4038, -0x1354, 0x407C, 0x0086, 0x12A8, 0x4039, 0x1358, 0x430C, 0x12A9, 0x531A, -0x630B, 0x2014, 0x903A, 0x0BB8, 0x2C11, 0xB32C, 0x2BF6, 0x403C, 0x0011, -0x12A9, 0x403C, 0xA55A, 0x12A9, 0x403C, 0x1E1E, 0x12A9, 0x407C, 0x0028, -0x12A8, 0x907C, 0x0091, 0x2403, 0x403C, 0xFFCE, 0x3C26, 0x12B0, 0xD9DC, -0x4306, 0x3C19, 0x430A, 0x430B, 0x460F, 0x5F0F, 0x510F, 0x4F17, 0x0004, -0x407C, 0x0086, 0x12A8, 0x430C, 0x12A9, 0x531A, 0x630B, 0x23EA, 0x903A, -0x0BB8, 0x2FE7, 0xB31C, 0x2BF6, 0x431C, 0x12A9, 0x470C, 0x12A9, 0x5316, -0x9126, 0x2BE5, 0x407C, 0x0028, 0x12A8, 0x907C, 0x0091, 0x23D8, 0x430C, -0x5031, 0x007C, 0x4030, 0xD422, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x8321, 0x4C0A, 0x4306, 0x403B, 0x1360, 0x4038, 0x1358, 0x4039, 0x1354, -0xB31C, 0x282B, 0x403C, 0x14E2, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x2403, 0x403C, 0xFFF5, 0x3C68, 0x403C, 0x14DE, 0x421F, 0x1112, 0x129F, -0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C5D, 0x407C, 0x0082, 0x12A9, -0x403C, 0x3FFF, 0x12A8, 0x12B0, 0xD7F4, 0x403C, 0x2409, 0x12A8, 0x435C, -0x12AB, 0x434C, 0x12AB, 0x407C, 0x0048, 0x12A9, 0x403C, 0x0018, 0x12A8, -0x5292, 0x14DE, 0x14DE, 0x6292, 0x14E0, 0x14E0, 0x3C1F, 0x410C, 0x129F, -0x0014, 0x4C06, 0x407C, 0x00C1, 0x12A9, 0x421C, 0x14E2, 0x421D, 0x14E4, -0x1292, 0x135A, 0x407C, 0x00A1, 0x12A9, 0x416C, 0x1292, 0x1356, 0x435C, -0x12AB, 0x434C, 0x12AB, 0x5392, 0x14E2, 0x6382, 0x14E4, 0x53B2, 0x14DE, -0x63B2, 0x14E0, 0x421F, 0x1112, 0x421E, 0x14DE, 0xD21E, 0x14E0, 0x930E, -0x2402, 0x9306, 0x27D7, 0xB32A, 0x280B, 0x12B0, 0xD7F4, 0x403C, 0x2401, -0x12A8, 0x407C, 0x0021, 0x12A9, 0x435C, 0x12AB, 0x3C0A, 0x9316, 0x2006, -0x407C, 0x0091, 0x129F, 0x0012, 0x4306, 0x3C02, 0x4036, 0xFFF3, 0x460C, -0x5321, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x1204, 0x1205, 0x8031, 0x000A, 0x4338, 0x4039, 0x1112, 0x410C, 0x522C, -0x492F, 0x129F, 0x0014, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C6B, 0x431C, -0x492F, 0x129F, 0x001A, 0x410C, 0x492F, 0x129F, 0x0018, 0x930C, 0x3403, -0x403C, 0xFFCD, 0x3C5E, 0x43C1, 0x0004, 0x430C, 0x1292, 0x274E, 0x930C, -0x2403, 0x403C, 0xFFEA, 0x3C54, 0x90B1, 0xA55A, 0x0000, 0x2004, 0x90B1, -0xA55A, 0x0002, 0x2408, 0x90B1, 0x5AA5, 0x0000, 0x2040, 0x90B1, 0x5AA5, -0x0002, 0x203C, 0x4216, 0x276C, 0x434C, 0x1286, 0x435C, 0x1292, 0x2754, -0x1292, 0x134E, 0x434C, 0x1286, 0x4357, 0x1292, 0x1350, 0x430A, 0x430B, -0x4304, 0x4191, 0x0002, 0x0008, 0x41A1, 0x0006, 0x407C, 0x0086, 0x1292, -0x1354, 0x4035, 0x1358, 0x430C, 0x12A5, 0x531A, 0x630B, 0x2003, 0x903A, -0x0BB8, 0x2802, 0x4314, 0x3C0B, 0xB32C, 0x2BF4, 0x403C, 0x0011, 0x12A5, -0x411C, 0x0008, 0x12A5, 0x411C, 0x0006, 0x12A5, 0x435C, 0x1286, 0x403C, -0x0BB8, 0x1292, 0x275A, 0x9314, 0x2003, 0x403C, 0xFFCE, 0x3C08, 0x474C, -0x492F, 0x129F, 0x0004, 0x9347, 0x2401, 0x4308, 0x480C, 0x5031, 0x000A, -0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x1205, 0x4335, 0x4309, 0x4036, 0x1358, 0x4037, 0x1354, 0x3C06, 0x9309, -0x2404, 0x9319, 0x2402, 0x4308, 0x3C01, 0x4318, 0x480C, 0x1292, 0x274E, -0x4214, 0x2754, 0x435C, 0x12B0, 0xD740, 0x430A, 0x430B, 0x407C, 0x0086, -0x12A7, 0x430C, 0x12A6, 0x531A, 0x630B, 0x2003, 0x903A, 0x0BB8, 0x2803, -0x4035, 0xFFCF, 0x3C07, 0xB31C, 0x2BF3, 0x431C, 0x12A6, 0x403C, 0xA55A, -0x12A6, 0x12B0, 0xD284, 0x240F, 0x903A, 0x0091, 0x2413, 0x903A, 0x0099, -0x2013, 0x12B0, 0xD682, 0x407C, 0x0054, 0x12A7, 0x430C, 0x431D, 0x1292, -0x135C, 0x12B0, 0xD474, 0x484C, 0x12B0, 0xD47C, 0x430C, 0x3C34, 0x12B0, -0xD682, 0x3FF6, 0x5319, 0x9229, 0x3BBB, 0x4309, 0x432C, 0x1292, 0x274E, -0x434C, 0x12B0, 0x8AA4, 0x12B0, 0x4BFE, 0x12B0, 0xCC42, 0x403C, 0x000A, -0x1292, 0x275A, 0x12B0, 0xCF8C, 0x436C, 0x12B0, 0x8AA4, 0x12B0, 0x4BFE, -0x12B0, 0xCF66, 0x403C, 0x000A, 0x1292, 0x275A, 0x12B0, 0xD284, 0x2406, -0x903A, 0x0091, 0x2403, 0x903A, 0x0099, 0x2004, 0x12B0, 0xD474, 0x436C, -0x3FCD, 0x5319, 0x9039, 0x0003, 0x3BD7, 0x450C, 0x4030, 0xD41E, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x8031, 0x0018, 0x4C0B, 0x4E0A, 0x4D0E, -0x430F, 0x403C, 0x0005, 0x1292, 0x14A4, 0x4A0E, 0x430F, 0x403C, 0x0006, -0x1292, 0x14A4, 0x4B0C, 0x430D, 0x1292, 0x14A6, 0x407C, 0x00A8, 0x1292, -0x1354, 0x4382, 0x0160, 0xC392, 0x0160, 0x40B2, 0x0200, 0x0160, 0x40B2, -0x02E9, 0x0172, 0x4382, 0x0170, 0xD0B2, 0x0016, 0x0160, 0x4218, 0x14A0, -0x4309, 0x403F, 0xEA5E, 0x4303, 0x430B, 0x533F, 0x633B, 0x2FFD, 0x421A, -0x14A0, 0x430B, 0xC0B2, 0x0010, 0x0160, 0xC3A2, 0x0160, 0x410C, 0x403E, -0x27C6, 0x423D, 0x12B0, 0xD454, 0x410F, 0x523F, 0x120F, 0x430F, 0x430E, -0x423D, 0x410C, 0x532C, 0x4216, 0x1112, 0x1296, 0x000E, 0x403C, 0x0003, -0x1292, 0x14AC, 0x410C, 0x503C, 0x000A, 0x421F, 0x1112, 0x129F, 0x0010, -0x5321, 0x9309, 0x2005, 0x9A08, 0x2C03, 0x880A, 0x790B, 0x3C04, 0x8A08, -0x7309, 0x480A, 0x490B, 0x1292, 0x14A2, 0x4382, 0x14A0, 0x4C0E, 0x4D0F, -0x5C0C, 0x6D0D, 0x5E0C, 0x6F0D, 0x503C, 0x001F, 0x630D, 0x403E, 0x03E8, -0x430F, 0x12B0, 0xCE6E, 0x4A0E, 0x4B0F, 0x12B0, 0xCD32, 0x5031, 0x0018, -0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, -0x430B, 0x4038, 0x1360, 0x4039, 0x1358, 0x4036, 0x1354, 0xB31C, 0x2828, -0x403C, 0x14DA, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, -0xFFF5, 0x3C62, 0x403C, 0x14D6, 0x421F, 0x1112, 0x129F, 0x0018, 0x933C, -0x2003, 0x403C, 0xFFF4, 0x3C57, 0x407C, 0x0082, 0x12A6, 0x403C, 0x3FFF, -0x12A9, 0x12B0, 0xD7E0, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x12B0, -0xD7E0, 0x403C, 0x2418, 0x12A9, 0x5292, 0x14D6, 0x14D6, 0x6292, 0x14D8, -0x14D8, 0x3C1C, 0x410C, 0x129F, 0x0014, 0x4C0B, 0x407C, 0x00C1, 0x12A6, -0x421C, 0x14DA, 0x12A9, 0x407C, 0x00A1, 0x12A6, 0x416C, 0x1292, 0x1356, -0x435C, 0x12A8, 0x434C, 0x12A8, 0x5392, 0x14DA, 0x6382, 0x14DC, 0x53B2, -0x14D6, 0x63B2, 0x14D8, 0x421F, 0x1112, 0x421E, 0x14D6, 0xD21E, 0x14D8, -0x930E, 0x2402, 0x930B, 0x27DA, 0xB32A, 0x280B, 0x12B0, 0xD7E0, 0x403C, -0x2401, 0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x12A8, 0x3C0A, 0x931B, -0x2006, 0x407C, 0x0091, 0x129F, 0x0012, 0x430B, 0x3C02, 0x403B, 0xFFF3, -0x4B0C, 0x5321, 0x4030, 0xD424, 0x434C, 0x12A7, 0x484C, 0x4B20, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C0A, 0x403B, -0x1354, 0x12B0, 0xA15C, 0x403C, 0x3401, 0x12A9, 0x4076, 0x0082, 0x464C, -0x12AB, 0x403C, 0x4035, 0x12A9, 0x4037, 0x1360, 0x434C, 0x12A7, 0x4074, -0x0042, 0x12B0, 0xA170, 0x4A2C, 0x12B0, 0xA178, 0x4035, 0x2401, 0x450C, -0x12A9, 0x435C, 0x12B0, 0xA090, 0x12B0, 0xD252, 0x403C, 0x4036, 0x12B0, -0xA16A, 0x4A1C, 0x0002, 0x12B0, 0xD246, 0x403C, 0x4039, 0x12B0, 0xA16A, -0x4A1C, 0x0004, 0x12B0, 0xD246, 0x403C, 0x4038, 0x12B0, 0xA16A, 0x4A1C, -0x0006, 0x12B0, 0xD246, 0x403C, 0x403A, 0x12B0, 0xA16A, 0x4A1C, 0x0008, -0x12B0, 0xD246, 0x403C, 0x403B, 0x12B0, 0xA16A, 0x4A1C, 0x000A, 0x12B0, -0xD246, 0x403C, 0x403C, 0x12B0, 0xA16A, 0x4A1C, 0x000C, 0x12B0, 0xA178, -0x12B0, 0xA154, 0x4030, 0xD41E, 0x450C, 0x12A9, 0x435C, 0x4720, 0x4078, -0x00C8, 0x484C, 0x12AB, 0x4039, 0x1358, 0x4130, 0x12A9, 0x434C, 0x12A7, -0x12B0, 0xD5B6, 0x464C, 0x4B20, 0x12B0, 0xD5B0, 0x464C, 0x12AB, 0x403C, -0x3FFD, 0x12B0, 0xD5B0, 0x434C, 0x3F82, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x8231, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, -0x403C, 0xFFF2, 0x3C6A, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0018, -0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C5F, 0x4038, 0x1354, 0x407C, 0x0082, -0x12A8, 0x4039, 0x1358, 0x403C, 0x3FFF, 0x12A9, 0x4036, 0x1360, 0x434C, -0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2409, 0x12A9, 0x12B0, 0xD9D4, -0x430A, 0x430B, 0x3C16, 0x407C, 0x00C1, 0x12A8, 0x412C, 0x12A9, 0x407C, -0x00A1, 0x12A8, 0x12B0, 0xD9D4, 0x430C, 0x12A9, 0x421F, 0x1112, 0x129F, -0x0008, 0x53A1, 0x0000, 0x6381, 0x0002, 0x531A, 0x630B, 0x911B, 0x0006, -0x2BE7, 0x2003, 0x911A, 0x0004, 0x2BE3, 0x12B0, 0xD9D4, 0x407C, 0x00C8, -0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, -0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1356, 0x435C, 0x12A6, 0x430B, -0x407C, 0x0028, 0x12A8, 0x430C, 0x12A9, 0xF07C, 0x0081, 0x907C, 0x0081, -0x2408, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x531B, 0x903B, 0x000A, 0x2BEE, -0x430C, 0x5231, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x1204, 0x1205, 0x8031, 0x003E, 0x4C05, 0x4308, 0x4039, 0x001B, -0x4381, 0x0000, 0x430A, 0x430B, 0x4036, 0x1112, 0x410C, 0x462F, 0x129F, -0x0016, 0x930C, 0x3403, 0x403C, 0xFFFE, 0x3C5C, 0x12B0, 0xD86C, 0x403E, -0x001C, 0x410D, 0x532D, 0x412C, 0x1292, 0x14AA, 0x12B0, 0x8D42, 0x3C02, -0x4709, 0x4314, 0x480F, 0x531F, 0x990F, 0x2C1B, 0x4907, 0x5807, 0xC312, -0x1007, 0x4304, 0x430E, 0x470C, 0x12B0, 0xD4BC, 0x12B0, 0xD40C, 0x2402, -0x12B0, 0x8D42, 0x4A0F, 0xDB0F, 0x930F, 0x2415, 0x903B, 0x0020, 0x2804, -0x23E4, 0x903A, 0xA761, 0x2FE1, 0x4708, 0x3FE1, 0x9304, 0x240A, 0x430E, -0x480C, 0x12B0, 0xD4BC, 0x4C0D, 0x412C, 0x12B0, 0x9E8C, 0x4C0A, 0x4D0B, -0x403E, 0x0015, 0x410D, 0x532D, 0x12B0, 0x8D4A, 0x503A, 0x6478, 0x603B, -0xFFEC, 0x903B, 0x0010, 0x2806, 0x2003, 0x903A, 0xB559, 0x2802, 0x433C, -0x3C10, 0x430C, 0x12B0, 0xD8B6, 0x480C, 0x12B0, 0xD4BC, 0x12B0, 0xD8B6, -0x12B0, 0xD8B2, 0x12B0, 0xD8B2, 0x430C, 0x12B0, 0xD8B6, 0x430C, 0x5031, -0x003E, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x8221, 0x4316, 0x403B, 0x1358, 0x4038, 0x1354, 0x4039, 0x1360, 0x3C03, -0x9326, 0x2001, 0x4226, 0x434C, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x435C, -0x12A9, 0x464C, 0x108C, 0xF03C, 0x0F00, 0x503C, 0x0060, 0x12AB, 0x407C, -0x00C8, 0x12A8, 0x403C, 0x1401, 0x12AB, 0x407C, 0x0082, 0x12A8, 0x12B0, -0xD914, 0x9382, 0x1398, 0x2403, 0x403C, 0x0FF6, 0x3C02, 0x403C, 0x018C, -0x12AB, 0x12B0, 0xD914, 0x403C, 0x3FFD, 0x12AB, 0x434C, 0x12A9, 0x9382, -0x1398, 0x2402, 0x12B0, 0xD65E, 0x12B0, 0xD876, 0x430C, 0x12AB, 0x4C07, -0x12B0, 0xD914, 0x430C, 0x12AB, 0x4C0A, 0x12B0, 0xD914, 0x12B0, 0xD914, -0x12B0, 0xD914, 0x9382, 0x1398, 0x2002, 0x12B0, 0xD65E, 0x434C, 0x12A9, -0x12B0, 0xD876, 0x4781, 0x0000, 0x4A81, 0x0002, 0x403D, 0x0003, 0x410C, -0x421F, 0x1112, 0x129F, 0x0006, 0x5316, 0x9036, 0x0010, 0x2BA7, 0x407C, -0x0086, 0x12A8, 0x430C, 0x12AB, 0xB23C, 0x2807, 0x403C, 0x0014, 0x12AB, -0x430C, 0x12AB, 0x430C, 0x12AB, 0x430C, 0x5221, 0x4030, 0xD422, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, 0x430B, 0x4038, 0x1360, -0x4039, 0x1358, 0x4036, 0x1354, 0xB31C, 0x2844, 0x403C, 0x14EA, 0x421F, -0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C5B, 0x403C, -0x14E6, 0x421F, 0x1112, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, -0x3C50, 0x407C, 0x0082, 0x12A6, 0x403C, 0x3FFF, 0x12A9, 0x12B0, 0xD808, -0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x12B0, 0xD808, 0x403C, 0x2408, -0x12A9, 0x3C1B, 0x410C, 0x129F, 0x0016, 0x4C0B, 0x407C, 0x00C1, 0x12A6, -0x421C, 0x14EA, 0x12A9, 0x407C, 0x00A1, 0x12A6, 0x412C, 0x12A9, 0x435C, -0x12A8, 0x434C, 0x12A8, 0x53A2, 0x14EA, 0x6382, 0x14EC, 0x53B2, 0x14E6, -0x63B2, 0x14E8, 0x421F, 0x1112, 0x421E, 0x14E6, 0xD21E, 0x14E8, 0x930E, -0x2402, 0x930B, 0x27DB, 0xB32A, 0x280B, 0x12B0, 0xD808, 0x403C, 0x2401, -0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x12A8, 0x3C0A, 0x931B, 0x2006, -0x407C, 0x0091, 0x129F, 0x0012, 0x430B, 0x3C02, 0x403B, 0xFFF3, 0x4B0C, -0x5321, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8031, -0x001C, 0x403F, 0x27DE, 0x4FF1, 0x0008, 0x4FF1, 0x0009, 0x4FF1, 0x000A, -0x4FF1, 0x000B, 0x403A, 0x1112, 0x410C, 0x522C, 0x4A2F, 0x129F, 0x0018, -0x930C, 0x2403, 0x403C, 0xFFDD, 0x3C58, 0x410C, 0x4A2F, 0x129F, 0x0018, -0x930C, 0x3403, 0x403C, 0xFFDC, 0x3C4F, 0x410B, 0x503B, 0x000C, 0x120B, -0x12B0, 0xD442, 0x12B0, 0xD334, 0x5321, 0x9308, 0x3402, 0x480C, 0x3C42, -0x4038, 0x1354, 0x407C, 0x0048, 0x12A8, 0x435C, 0x1292, 0x1356, 0x4039, -0x1360, 0x435C, 0x12A9, 0x4306, 0x407C, 0x0028, 0x12A8, 0x430C, 0x1292, -0x1358, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2408, 0x434C, 0x12A9, 0x435C, -0x12A9, 0x5316, 0x9036, 0x000A, 0x2BED, 0x411C, 0x0004, 0x411D, 0x0006, -0x1292, 0x1362, 0x407C, 0x0022, 0x12A8, 0x412C, 0x411D, 0x0002, 0x1292, -0x1364, 0x407C, 0x0062, 0x12A8, 0x430C, 0x1292, 0x1358, 0x4A2F, 0x129F, -0x0008, 0x435C, 0x12A9, 0x1292, 0x1366, 0x120B, 0x12B0, 0xD442, 0x12B0, -0xD334, 0x480C, 0x5321, 0x5031, 0x001C, 0x4030, 0xD424, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x8321, 0x4C0A, 0x4306, 0x403B, 0x1360, 0x4038, -0x1358, 0x4039, 0x1354, 0xB31C, 0x2843, 0x403C, 0x14F2, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF5, 0x3C5A, 0x403C, 0x14EE, -0x421F, 0x1112, 0x129F, 0x0018, 0x933C, 0x2003, 0x403C, 0xFFF4, 0x3C4F, -0x407C, 0x0082, 0x12A9, 0x403C, 0x3FFF, 0x12A8, 0x12B0, 0xD81C, 0x403C, -0x2409, 0x12B0, 0xD826, 0x407C, 0x0048, 0x12A9, 0x423C, 0x12A8, 0x3C1B, -0x410C, 0x129F, 0x0016, 0x4C06, 0x407C, 0x00C1, 0x12A9, 0x421C, 0x14F2, -0x421D, 0x14F4, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12A9, 0x412C, 0x12B0, -0xD826, 0x53A2, 0x14F2, 0x6382, 0x14F4, 0x53B2, 0x14EE, 0x63B2, 0x14F0, -0x421F, 0x1112, 0x421E, 0x14EE, 0xD21E, 0x14F0, 0x930E, 0x2402, 0x9306, -0x27DB, 0xB32A, 0x280B, 0x12B0, 0xD81C, 0x403C, 0x2401, 0x12A8, 0x407C, -0x0021, 0x12A9, 0x435C, 0x12AB, 0x3C0A, 0x9316, 0x2006, 0x407C, 0x0091, -0x129F, 0x0012, 0x4306, 0x3C02, 0x4036, 0xFFF3, 0x460C, 0x5321, 0x4030, -0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x8031, 0x002A, 0x430A, 0x4038, -0x1360, 0x434C, 0x12A8, 0x403B, 0x1354, 0x407C, 0x00C8, 0x12AB, 0x4039, -0x1358, 0x403C, 0x0500, 0x12A9, 0x12B0, 0xD2FC, 0x407C, 0x00A1, 0x12AB, -0x403C, 0x0003, 0x12A9, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x12AB, 0x403C, -0x0501, 0x12A9, 0x12B0, 0xD676, 0x434C, 0x12A8, 0x12B0, 0xD2FC, 0x434C, -0x12A8, 0x407C, 0x0042, 0x12AB, 0x430C, 0x12A9, 0x4C09, 0x12B0, 0xD676, -0x9309, 0x383B, 0x4308, 0x4109, 0x5039, 0x0010, 0x490C, 0x580C, 0x421F, -0x1112, 0x129F, 0x0014, 0x5318, 0x9038, 0x0016, 0x2BF6, 0x490F, 0x580F, -0x40FF, 0x00DE, 0x0000, 0x40FF, 0x00AD, 0x0001, 0x40FF, 0x00BA, 0x0002, -0x40FF, 0x00BE, 0x0003, 0x410F, 0x120F, 0x430F, 0x431E, 0x403D, 0x001A, -0x490C, 0x4218, 0x1112, 0x1298, 0x000E, 0x403C, 0x0003, 0x1292, 0x1258, -0x410C, 0x532C, 0x421F, 0x1112, 0x129F, 0x0010, 0x407C, 0x0054, 0x12AB, -0x403C, 0x0200, 0x430D, 0x1292, 0x135C, 0x5321, 0x3C01, 0x433A, 0x4A0C, -0x5031, 0x002A, 0x4030, 0xD426, 0x120A, 0x120B, 0x8031, 0x001C, 0x43C1, -0x0000, 0x4381, 0x0002, 0x403C, 0x0005, 0x1292, 0x275A, 0x407C, 0x0028, -0x1292, 0x1354, 0x4CC1, 0x0000, 0x407A, 0x0091, 0x9AC1, 0x0000, 0x2002, -0x430F, 0x3C07, 0x421F, 0x14B6, 0x531F, 0x931F, 0x2002, 0x43F1, 0x0000, -0x4F82, 0x14B6, 0x932F, 0x384A, 0x4382, 0x14B6, 0x1292, 0x2756, 0x434C, -0x1292, 0x2754, 0x1292, 0x134E, 0x407C, 0x00C8, 0x1292, 0x1354, 0x4CC1, -0x0000, 0x9AC1, 0x0000, 0x2038, 0x407C, 0x0086, 0x1292, 0x1354, 0x9A4C, -0x2032, 0x422C, 0x1292, 0x1358, 0x903C, 0x1207, 0x202C, 0x430C, 0x1292, -0x1358, 0x903C, 0xA55A, 0x2024, 0x410C, 0x522C, 0x403E, 0x27D6, 0x423D, -0x12B0, 0xD454, 0x410F, 0x503F, 0x000C, 0x120F, 0x430F, 0x430E, 0x423D, -0x410C, 0x503C, 0x0006, 0x421B, 0x1112, 0x129B, 0x000E, 0x403C, 0x0003, -0x1292, 0x1230, 0x410C, 0x503C, 0x000E, 0x421F, 0x1112, 0x129F, 0x0010, -0x4AC1, 0x0002, 0x5321, 0x3C02, 0x43F1, 0x0000, 0x416C, 0x5031, 0x001C, -0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, -0x403B, 0x1112, 0x403C, 0x14B8, 0x12B0, 0xD894, 0x2402, 0x433C, 0x3C61, -0x403C, 0x14BC, 0x12B0, 0xD894, 0x23F9, 0x403C, 0x14BE, 0x12B0, 0xD894, -0x23F4, 0x403C, 0x14BA, 0x4B2F, 0x129F, 0x0016, 0x933C, 0x27ED, 0x9382, -0x14BA, 0x2402, 0x435C, 0x3C01, 0x434C, 0x1292, 0x2754, 0x1292, 0x134E, -0x4038, 0x1358, 0x4216, 0x14BC, 0x90B2, 0x0011, 0x14B8, 0x430A, 0x430B, -0x4309, 0x2019, 0x4217, 0x14BE, 0x407C, 0x0086, 0x1292, 0x1354, 0x430C, -0x12A8, 0x531A, 0x630B, 0x2003, 0x903A, 0x0BB8, 0x2802, 0x4319, 0x3C1B, -0xB32C, 0x2BF4, 0x403C, 0x0011, 0x12A8, 0x460C, 0x12A8, 0x470C, 0x3C11, -0x407C, 0x0086, 0x1292, 0x1354, 0x430C, 0x12A8, 0x531A, 0x630B, 0x23EC, -0x903A, 0x0BB8, 0x2FE9, 0xB31C, 0x2BF6, 0x431C, 0x12A8, 0x460C, 0x12A8, -0x9382, 0x14BA, 0x2406, 0x434C, 0x1292, 0x276E, 0x435C, 0x1292, 0x276C, -0x403C, 0x003C, 0x1292, 0x275A, 0x9309, 0x239E, 0x430C, 0x4030, 0xD422, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8231, 0x410C, 0x522C, 0x421F, -0x1112, 0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C5C, 0x410C, -0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C52, -0x4038, 0x1354, 0x407C, 0x0082, 0x12A8, 0x4039, 0x1358, 0x403C, 0x3FFF, -0x12A9, 0x4036, 0x1360, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, -0x2409, 0x12A9, 0x12B0, 0xD93C, 0x407C, 0x0048, 0x12A8, 0x403C, 0x0019, -0x12A9, 0x51A1, 0x0000, 0x6191, 0x0002, 0x0002, 0x430A, 0x430B, 0x3C1A, -0x407C, 0x00C1, 0x12A8, 0x411C, 0x0004, 0x411D, 0x0006, 0x1292, 0x135A, -0x407C, 0x00A1, 0x12A8, 0x12B0, 0xD93C, 0x430C, 0x12A9, 0x421F, 0x1112, -0x129F, 0x0004, 0x5391, 0x0004, 0x6381, 0x0006, 0x531A, 0x630B, 0x911B, -0x0002, 0x2BE3, 0x2002, 0x912A, 0x2BE0, 0x12B0, 0xD93C, 0x407C, 0x00C8, -0x12A8, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, -0x430C, 0x5231, 0x4030, 0xD424, 0x8231, 0x410C, 0x522C, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFCB, 0x3C29, 0x410C, 0x421F, -0x1112, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFCA, 0x3C1F, 0x411E, -0x0004, 0x411F, 0x0006, 0x930F, 0x204D, 0x903E, 0x000F, 0x2C4A, 0x5E0E, -0x4E10, 0xAB28, 0xABB6, 0xAB46, 0xAB52, 0xAB4C, 0xAB66, 0xAB72, 0xAB7E, -0xAB8A, 0xAB90, 0xAB96, 0xAB5A, 0xAB9C, 0xABA4, 0xABAA, 0xABB0, 0x412C, -0x1292, 0x2750, 0x430C, 0x5231, 0x4130, 0x412C, 0x1292, 0x2752, 0x3FF9, -0x41A2, 0x137C, 0x4192, 0x0002, 0x137E, 0x3FF3, 0x41A2, 0x1382, 0x4192, -0x0002, 0x1384, 0x3FED, 0x41A2, 0x1386, 0x4192, 0x0002, 0x1388, 0x3FE7, -0x41A2, 0x138A, 0x4192, 0x0002, 0x138C, 0x3FE1, 0x41A2, 0x138E, 0x3FDE, -0x41A2, 0x1390, 0x3FDB, 0x41A2, 0x1392, 0x3FD8, 0x412C, 0x1292, 0x2770, -0x3FD4, 0x41A2, 0x1380, 0x3FD1, 0x41A2, 0x1506, 0x3FCE, 0x41A2, 0x1398, -0x3FCB, 0x403C, 0xFFC9, 0x3FC9, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x1204, 0x4C0A, 0x403B, 0x1354, 0x407C, 0x0088, 0x12AB, 0x407C, -0x0034, 0x1292, 0x1356, 0x12B0, 0xA15C, 0x403C, 0x2401, 0x12A9, 0x407C, -0x0028, 0x12AB, 0x4036, 0x0032, 0x430C, 0x12A9, 0x5336, 0x933C, 0x2403, -0xB03C, 0x0200, 0x2C02, 0x9306, 0x23F6, 0x407C, 0x0082, 0x12AB, 0x403C, -0x4030, 0x12A9, 0x4037, 0x1360, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x403C, -0x0C04, 0x12B0, 0xD8FC, 0x435C, 0x12A7, 0x434C, 0x12A7, 0x435C, 0x12A7, -0x407C, 0x0082, 0x12AB, 0x403C, 0x3FFF, 0x12A9, 0x12B0, 0xA08E, 0x403C, -0x2409, 0x12B0, 0xA156, 0x12B0, 0xA08E, 0x403C, 0x2408, 0x12A9, 0x4306, -0x407C, 0x00C1, 0x12AB, 0x4604, 0x5404, 0x4A0C, 0x540C, 0x12A9, 0x407C, -0x00A1, 0x12AB, 0x441C, 0x13C4, 0x12B0, 0xD8FC, 0x5316, 0x9036, 0x0030, -0x3BED, 0x12B0, 0xA08E, 0x403C, 0x2401, 0x12A9, 0x407C, 0x0021, 0x12B0, -0xD5B8, 0x4030, 0xD420, 0x120D, 0x120C, 0x8221, 0x4381, 0x0000, 0x4381, -0x0002, 0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2867, -0x01EA, 0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, 0x40B2, -0x286D, 0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, -0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x41D2, 0x0007, -0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x403F, 0x007E, 0x4FE1, 0x0003, 0x4DC2, -0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0002, 0x41D2, 0x0005, 0x007F, -0xB3D2, 0x0079, 0x2BFD, 0x4FE1, 0x0001, 0xC0F2, 0x0010, 0x0078, 0x4CC2, -0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x4F6E, 0x5E4E, 0x4EC1, 0x0000, 0xF0F2, -0x00F1, 0x0033, 0xB31C, 0x2804, 0xD0F2, 0x0003, 0x0031, 0x3C04, 0xC3E2, -0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xB2E2, 0x0030, -0x7E4E, 0x535E, 0xDEC1, 0x0000, 0xD392, 0x01F0, 0x412C, 0x411D, 0x0002, -0x5231, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x8231, -0x4308, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x2403, -0x4038, 0xFFDF, 0x3C53, 0x410C, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x3403, 0x4038, 0xFFDE, 0x3C49, 0x4039, 0x1354, 0x407C, 0x0082, 0x12A9, -0x4036, 0x1358, 0x403C, 0x3FFF, 0x12A6, 0x4037, 0x1360, 0x12B0, 0xD7AE, -0x403C, 0x2409, 0x12A6, 0x435C, 0x12A7, 0x12B0, 0xD7AE, 0x403C, 0x2419, -0x12A6, 0x51A1, 0x0000, 0x6191, 0x0002, 0x0002, 0x430A, 0x430B, 0x3C19, -0x407C, 0x00C1, 0x12A9, 0x411C, 0x0004, 0x12A6, 0x407C, 0x00A1, 0x12A9, -0x435C, 0x12A7, 0x434C, 0x12A7, 0x430C, 0x12A6, 0x421F, 0x1112, 0x129F, -0x0004, 0x5391, 0x0004, 0x6381, 0x0006, 0x531A, 0x630B, 0x911B, 0x0002, -0x2BE4, 0x2002, 0x912A, 0x2BE1, 0x12B0, 0xD7AE, 0x403C, 0x2401, 0x12A6, -0x407C, 0x0021, 0x12A9, 0x435C, 0x12A7, 0x480C, 0x5231, 0x4030, 0xD422, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x8031, 0x000C, -0x4337, 0x4381, 0x0008, 0x4381, 0x000A, 0x4381, 0x0004, 0x4381, 0x0006, -0x43C1, 0x0000, 0x4214, 0x12F0, 0x4381, 0x0002, 0x4036, 0x1112, 0x410C, -0x523C, 0x462F, 0x129F, 0x0018, 0x410C, 0x522C, 0x462F, 0x129F, 0x0018, -0x410C, 0x532C, 0x462F, 0x129F, 0x0016, 0x411B, 0x0006, 0x12B0, 0xA838, -0x4CC1, 0x0000, 0xF03B, 0xC000, 0x9381, 0x0002, 0x2415, 0x462F, 0x4F1F, -0x0008, 0x90F1, 0x0091, 0x0000, 0x422C, 0x2005, 0x12B0, 0xD6FA, 0x430C, -0x430D, 0x3C04, 0x12B0, 0xD6FA, 0x430C, 0x4B0D, 0x12B0, 0xD700, 0x4307, -0x3C1B, 0x90F1, 0x0091, 0x0000, 0x2402, 0x432F, 0x3C01, 0x431F, 0x4F82, -0x12F0, 0x9F04, 0x2410, 0x931F, 0x2005, 0x12B0, 0xD21A, 0x12B0, 0xD6FE, -0x4317, 0x93A2, 0x12F0, 0x2006, 0x12B0, 0xD21A, 0x4B0D, 0x12B0, 0xD700, -0x4317, 0x470C, 0x5031, 0x000C, 0x4030, 0xD420, 0x120A, 0x120B, 0x1208, -0x8231, 0x403A, 0x1112, 0x410C, 0x522C, 0x4A2F, 0x129F, 0x0014, 0x930C, -0x342B, 0x403C, 0xFFC8, 0x3C55, 0x434C, 0x1292, 0x276E, 0x1292, 0x2762, -0x4C4B, 0x415E, 0x0002, 0xF07E, 0x000F, 0x416F, 0xF07F, 0x000F, 0xCF4B, -0xDE4B, 0x1292, 0x276A, 0x4C48, 0x415E, 0x0003, 0xF07E, 0x007C, 0x415F, -0x0001, 0xF07F, 0x007C, 0xCF48, 0xDE48, 0x4B4C, 0x1292, 0x2760, 0x484C, -0x1292, 0x2768, 0x53F1, 0x0004, 0x411C, 0x0006, 0x1292, 0x275A, 0x93C1, -0x0004, 0x2429, 0x410C, 0x532C, 0x12B0, 0xD77C, 0x3403, 0x403C, 0xFFC7, -0x3C22, 0x410C, 0x12B0, 0xD77C, 0x3BF9, 0x410C, 0x503C, 0x0006, 0x12B0, -0xD77C, 0x3BF3, 0xB0B1, 0x0040, 0x0000, 0x2809, 0xB0B1, 0x0040, 0x0002, -0x2802, 0x435C, 0x3C01, 0x434C, 0x1292, 0x276C, 0xB0B1, 0x0100, 0x0000, -0x2BB5, 0xB0B1, 0x0100, 0x0002, 0x2BAE, 0x435C, 0x3FAD, 0x430C, 0x5231, -0x4030, 0xD428, 0xC3A2, 0x01A0, 0x40B2, 0x22F0, 0x01A0, 0x40B2, 0x0206, -0x01A2, 0x407E, 0x0010, 0x4EC2, 0x0080, 0x407F, 0x0011, 0x4FC2, 0x0081, -0x407D, 0x0012, 0x4DC2, 0x0082, 0x407C, 0x0013, 0x4CC2, 0x0083, 0x4EC2, -0x0084, 0x4FC2, 0x0085, 0x4DC2, 0x0086, 0x4CC2, 0x0087, 0x4EC2, 0x0088, -0x4FC2, 0x0089, 0x4DC2, 0x008A, 0x4CC2, 0x008B, 0x4EC2, 0x008C, 0x4FC2, -0x008D, 0x4DC2, 0x008E, 0x4CC2, 0x008F, 0xD3A2, 0x01A0, 0xD392, 0x01A0, -0x40B2, 0x0FFF, 0x01C8, 0x40B2, 0x03A0, 0x01C0, 0xD3D2, 0x0078, 0x40F2, -0x0017, 0x0078, 0x40F2, 0x0053, 0x0079, 0x43E2, 0x007C, 0x43C2, 0x007D, -0x43C2, 0x007B, 0xC3D2, 0x0078, 0xDEC2, 0x0005, 0x4382, 0x0122, 0x4382, -0x0124, 0x40B2, 0x13C0, 0x01E8, 0x4292, 0x2784, 0x01EC, 0x40B2, 0x13C0, -0x01F0, 0x4292, 0x2784, 0x01F4, 0x42A2, 0x01F6, 0x4382, 0x14FE, 0x4382, -0x1500, 0x430C, 0x12B0, 0x3F54, 0x430C, 0x4130, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x8221, 0x4319, 0x403A, 0x1358, 0x403B, 0x1354, -0x4038, 0x1360, 0x3C03, 0x9329, 0x2001, 0x4229, 0x410C, 0x12B0, 0xD97C, -0x410C, 0x531C, 0x12B0, 0xD97C, 0x410C, 0x532C, 0x12B0, 0xD97C, 0x43C1, -0x0003, 0x412C, 0x411D, 0x0002, 0x12B0, 0xD196, 0x4C06, 0xF036, 0x0F00, -0x5036, 0x0080, 0x4127, 0x434C, 0x12A8, 0x407C, 0x0082, 0x12AB, 0x435C, -0x12A8, 0x490F, 0xF03F, 0x000F, 0x5F06, 0x460C, 0x12AA, 0x407C, 0x00C8, -0x12AB, 0x403C, 0x1401, 0x12AA, 0x407C, 0x0082, 0x12AB, 0x12B0, 0xD7C4, -0x470C, 0x12B0, 0xD7C2, 0x403C, 0x3FFD, 0x12B0, 0xD974, 0x407C, 0x0021, -0x12AB, 0x430C, 0x430D, 0x1292, 0x135A, 0x435C, 0x12A8, 0x407C, 0x00C8, -0x12AB, 0x403C, 0x0501, 0x12B0, 0xD974, 0x407C, 0x0042, 0x12AB, 0x435C, -0x12A8, 0x5319, 0x9039, 0x0010, 0x2BAD, 0x430C, 0x5221, 0x4030, 0xD422, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x8231, 0x410C, 0x421F, 0x1112, -0x129F, 0x0018, 0x930C, 0x2403, 0x403C, 0xFFF2, 0x3C52, 0x410C, 0x522C, -0x421F, 0x1112, 0x129F, 0x0018, 0x930C, 0x3403, 0x403C, 0xFFF1, 0x3C47, -0x4038, 0x1354, 0x407C, 0x0082, 0x12A8, 0x4039, 0x1358, 0x403C, 0x3FFF, -0x12A9, 0x4036, 0x1360, 0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, -0x2409, 0x12A9, 0x12B0, 0xD9B4, 0x430A, 0x430B, 0x3C19, 0x407C, 0x00C1, -0x12A8, 0x412C, 0x411D, 0x0002, 0x1292, 0x135A, 0x407C, 0x00A1, 0x12A8, -0x12B0, 0xD9B4, 0x430C, 0x12A9, 0x421F, 0x1112, 0x129F, 0x0008, 0x53A1, -0x0000, 0x6381, 0x0002, 0x531A, 0x630B, 0x911B, 0x0006, 0x2BE4, 0x2003, -0x911A, 0x0004, 0x2BE0, 0x12B0, 0xD9B4, 0x407C, 0x00C8, 0x12A8, 0x403C, -0x2401, 0x12A9, 0x407C, 0x0021, 0x12A8, 0x435C, 0x12A6, 0x430C, 0x5231, -0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C0A, 0x4038, -0x1354, 0x407C, 0x00C8, 0x12A8, 0x4039, 0x1358, 0x403C, 0x3401, 0x12A9, -0x407C, 0x0082, 0x12A8, 0x403C, 0x4030, 0x12A9, 0x4036, 0x1360, 0x12B0, -0xD91C, 0x4A0C, 0x12A9, 0x9382, 0x1506, 0x2402, 0x12B0, 0xD91C, 0x434C, -0x12A6, 0x407C, 0x0021, 0x12A8, 0x9382, 0x1506, 0x2002, 0x435C, 0x12A6, -0x434C, 0x12A6, 0x407C, 0x00C8, 0x12A8, 0x403C, 0x2401, 0x12A9, 0x435C, -0x12A6, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C08, -0x4E0A, 0x4F0B, 0x4039, 0x1354, 0x407C, 0x0088, 0x12A9, 0x407C, 0x0034, -0x1292, 0x1356, 0x12B0, 0xD53A, 0x4036, 0x1360, 0x435C, 0x12A6, 0x12B0, -0xD54E, 0xDC08, 0xD038, 0x0080, 0x480C, 0x12B0, 0xD04E, 0x4A0C, 0x12B0, -0xD04E, 0x403C, 0x3FFD, 0x12B0, 0xD05C, 0x434C, 0x12A6, 0x407C, 0x0088, -0x12A9, 0x12B0, 0xD9FC, 0x3FCE, 0x120A, 0x120B, 0x1208, 0x8321, 0x430A, -0xB31C, 0x2851, 0x403C, 0x14F6, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x2403, 0x403C, 0xFFD7, 0x3C4F, 0x403C, 0x14FA, 0x421F, 0x1112, 0x129F, -0x0018, 0x933C, 0x203E, 0x403C, 0xFFD6, 0x3C44, 0x410C, 0x421F, 0x1112, -0x129F, 0x0016, 0x4C0A, 0x403B, 0x1360, 0x434C, 0x12AB, 0x4038, 0x1354, -0x407C, 0x00C8, 0x12A8, 0x403C, 0x0500, 0x1292, 0x1358, 0x407C, 0x00C1, -0x12A8, 0x421C, 0x14F6, 0x421D, 0x14F8, 0x1292, 0x135A, 0x435C, 0x12AB, -0x407C, 0x00A1, 0x12A8, 0x412C, 0x1292, 0x1358, 0x434C, 0x12AB, 0x407C, -0x00C8, 0x12A8, 0x403C, 0x0501, 0x1292, 0x1358, 0x435C, 0x12AB, 0x434C, -0x12AB, 0x435C, 0x12AB, 0x53A2, 0x14F6, 0x6382, 0x14F8, 0x53B2, 0x14FA, -0x63B2, 0x14FC, 0x421F, 0x14FA, 0xD21F, 0x14FC, 0x930F, 0x2402, 0x930A, -0x27BD, 0x4A0C, 0x5321, 0x4030, 0xD428, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x8031, 0x000C, 0x4037, 0x1112, 0x410C, -0x522C, 0x472F, 0x129F, 0x0018, 0x410C, 0x523C, 0x472F, 0x129F, 0x0018, -0x410C, 0x472F, 0x129F, 0x0018, 0x411C, 0x0004, 0x411D, 0x0006, 0x12B0, -0xD464, 0x411B, 0x0004, 0x4038, 0x1354, 0x407C, 0x0028, 0x12A8, 0x4039, -0x1358, 0x430C, 0x12A9, 0x4036, 0x1360, 0x12B0, 0xC808, 0x4075, 0x00C8, -0x12B0, 0xC83C, 0x4074, 0x0021, 0x12B0, 0xC81E, 0x407C, 0x00C2, 0x12A8, -0x430A, 0x430B, 0x3C0B, 0x435C, 0x12A6, 0x434C, 0x12A6, 0x430C, 0x12A9, -0x472F, 0x129F, 0x0008, 0x531A, 0x630B, 0x911B, 0x000A, 0x2BF2, 0x2003, -0x911A, 0x0008, 0x2BEE, 0x12B0, 0xD786, 0x412C, 0x411D, 0x0002, 0x12B0, -0xD464, 0x412B, 0x12B0, 0xD786, 0x12B0, 0xC808, 0x12B0, 0xC83C, 0x12B0, -0xC81E, 0x430C, 0x5031, 0x000C, 0x4030, 0xD41E, 0x120A, 0x120B, 0x1208, -0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C0A, 0x403B, 0x1354, 0x4078, -0x00C8, 0x484C, 0x12AB, 0x4039, 0x1358, 0x403C, 0x3401, 0x12A9, 0x4076, -0x0082, 0x464C, 0x12AB, 0x403C, 0x4035, 0x12A9, 0x4037, 0x1360, 0x434C, -0x12A7, 0x4074, 0x0042, 0x12B0, 0xD3EE, 0x4A2C, 0x12B0, 0xD172, 0x4035, -0x2401, 0x12B0, 0xD110, 0x403C, 0x4036, 0x12B0, 0xD3E8, 0x4A1C, 0x0002, -0x12B0, 0xD10C, 0x403C, 0x4039, 0x12B0, 0xD3E8, 0x4A1C, 0x0004, 0x12B0, -0xD10C, 0x403C, 0x4038, 0x12B0, 0xD3E8, 0x4A1C, 0x0006, 0x12B0, 0xD10C, -0x403C, 0x403A, 0x12B0, 0xD3E8, 0x4A1C, 0x0008, 0x12B0, 0xD10C, 0x403C, -0x403B, 0x12B0, 0xD3E8, 0x4A1C, 0x000A, 0x12B0, 0xD10C, 0x403C, 0x403C, -0x12B0, 0xD3E8, 0x4A1C, 0x000C, 0x12B0, 0xD172, 0x450C, 0x12A9, 0x435C, -0x12A7, 0x4030, 0xD41E, 0x435C, 0x12A9, 0x434C, 0x4920, 0x407C, 0x0088, -0x4A20, 0x407C, 0x00B0, 0x12AA, 0x403C, 0x0082, 0x430D, 0x4720, 0x407C, -0x00B0, 0x12AA, 0x403C, 0x0088, 0x430D, 0x4720, 0x474C, 0x12AA, 0x430C, -0x430D, 0x4210, 0x135A, 0x434C, 0x12A9, 0x407C, 0x0088, 0x12AA, 0x407C, -0x0024, 0x12A5, 0x435C, 0x4920, 0x12B0, 0xB5B4, 0x407C, 0x0042, 0x12AA, -0x435C, 0x4920, 0x12A8, 0x434C, 0x4920, 0x407C, 0x00C1, 0x12AA, 0x411C, -0x0004, 0x430D, 0x1292, 0x135A, 0x407C, 0x00A1, 0x4A20, 0x434C, 0x12B0, -0xB5EA, 0x474C, 0x3FEA, 0x434C, 0x12A9, 0x4B4C, 0x12AA, 0x403C, 0x2C01, -0x12A8, 0x435C, 0x12A9, 0x4B4C, 0x12AA, 0x403C, 0x2401, 0x4820, 0x407C, -0x0082, 0x12AA, 0x403C, 0x3FFF, 0x12B0, 0xB5B4, 0x4B4C, 0x12AA, 0x403C, -0x2409, 0x12A8, 0x3FA6, 0x120A, 0x120B, 0x1208, 0x1209, 0x8221, 0x4381, -0x0000, 0x4381, 0x0002, 0x4318, 0x403A, 0x1360, 0x403B, 0x1354, 0x3C03, -0x9328, 0x2001, 0x4228, 0x410C, 0x12B0, 0xD9A4, 0x410C, 0x531C, 0x12B0, -0xD9A4, 0x410C, 0x532C, 0x12B0, 0xD9A4, 0x9038, 0x000F, 0x2433, 0x930C, -0x2033, 0x412C, 0x411D, 0x0002, 0x12B0, 0xD196, 0xF03C, 0x0F00, 0x4809, -0xD039, 0x0080, 0xDC09, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0034, 0x1292, -0x1356, 0x12B0, 0xD06E, 0x490C, 0x12B0, 0xD06A, 0x412C, 0x12B0, 0xD06A, -0x403C, 0x3FFD, 0x12B0, 0xD078, 0x434C, 0x12AA, 0x407C, 0x0088, 0x12AB, -0x407C, 0x0024, 0x1292, 0x1356, 0x435C, 0x12AA, 0x5318, 0x9038, 0x0010, -0x2BC0, 0x430C, 0x5221, 0x4030, 0xD426, 0x930C, 0x37CD, 0x403C, 0xFFD8, -0x3FF8, 0x120A, 0x120B, 0x1208, 0xC232, 0x4303, 0x425E, 0x2780, 0x4E4F, -0xE37F, 0x421D, 0x2784, 0x403A, 0x277E, 0xBEC2, 0x1100, 0x2407, 0xFFCD, -0x0000, 0xCAED, 0x0000, 0xDECD, 0x0000, 0x3C04, 0xFFCD, 0x0000, 0xCAED, -0x0000, 0xDAED, 0x0000, 0x403B, 0x150C, 0x4038, 0x1504, 0x934C, 0x2418, -0xDECD, 0x0000, 0xDECD, 0x0000, 0x4A6C, 0xE37C, 0xFCCD, 0x0000, 0xDAED, -0x0000, 0x482F, 0xEBEF, 0x0000, 0xC232, 0x4303, 0xFCCD, 0x0000, 0xDAED, -0x0000, 0xD232, 0x482F, 0xEBEF, 0x0000, 0x3C18, 0xFFCD, 0x0000, 0xFFCD, -0x0000, 0x4A6C, 0xE37C, 0xFCCD, 0x0000, 0xDAED, 0x0000, 0x482E, 0xEBEE, -0x0000, 0xC232, 0x4303, 0xFCCD, 0x0000, 0xDAED, 0x0000, 0xD232, 0x482E, -0xEBEE, 0x0000, 0x4F4E, 0x4EC2, 0x1100, 0x4030, 0xD428, 0x120C, 0x8321, -0x4381, 0x0000, 0x40B2, 0x0006, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, -0x2867, 0x01EA, 0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, -0x40B2, 0x286D, 0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, -0xD392, 0x01E8, 0xD0F2, 0x000E, 0x0033, 0xD0F2, 0x0010, 0x0078, 0x41D2, -0x0003, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x42D1, 0x007E, 0x0001, 0xC0F2, -0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, 0x425E, 0x007E, -0x5E4E, 0x4EC1, 0x0000, 0xF0F2, 0x00F1, 0x0033, 0xB31C, 0x2804, 0xD0F2, -0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xDEC1, 0x0000, 0xD392, -0x01F0, 0x412C, 0x5221, 0x4130, 0x120A, 0x8031, 0x0006, 0x403A, 0x1112, -0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, 0x00B0, 0x1292, 0x1354, -0x3C16, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, 0x0040, 0x0002, 0x2802, -0x4382, 0x14C0, 0x416C, 0x430D, 0x1292, 0x135C, 0x411C, 0x0002, 0x411D, -0x0004, 0x1292, 0x135C, 0x53F1, 0x0001, 0x93C1, 0x0001, 0x242A, 0x410C, -0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2815, 0x416E, 0xC35E, 0x907E, -0x008A, 0x2004, 0x421C, 0x1144, 0x430D, 0x3C08, 0x416C, 0x430D, 0x1292, -0x135C, 0x430C, 0x430D, 0x1292, 0x135C, 0x4A2F, 0x129F, 0x000A, 0x3FDF, -0x410C, 0x532C, 0x4A2F, 0x129F, 0x0018, 0x416E, 0xC35E, 0x907E, 0x008A, -0x23C1, 0x4192, 0x0002, 0x1144, 0x3FD1, 0x430C, 0x5031, 0x0006, 0x413A, -0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1292, 0x2756, 0x430B, 0x3C05, -0x930B, 0x2403, 0x903B, 0x0003, 0x2005, 0x4308, 0x4219, 0x274E, 0x430C, -0x3C11, 0x931B, 0x2402, 0x922B, 0x2003, 0x4318, 0x431C, 0x3C0A, 0x932B, -0x2406, 0x903B, 0x0005, 0x2403, 0x903B, 0x0006, 0x2003, 0x4328, 0x432C, -0x1289, 0x434C, 0x1292, 0x2754, 0x1292, 0x134E, 0x1292, 0x1350, 0x407C, -0x0028, 0x1292, 0x1354, 0x4C4A, 0x1292, 0x2756, 0x903A, 0x0089, 0x2409, -0x903A, 0x0091, 0x2406, 0x903A, 0x0095, 0x2403, 0x903A, 0x0099, 0x2008, -0x4A0C, 0x12B0, 0xD904, 0x480C, 0x12B0, 0xD904, 0x430C, 0x3C0C, 0x531B, -0x903B, 0x0007, 0x2BBE, 0x433C, 0x12B0, 0xD904, 0x403C, 0xAAAA, 0x12B0, -0xD904, 0x433C, 0x4030, 0xD426, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x8221, 0x4381, 0x0000, 0x4381, 0x0002, 0x435B, 0x4038, 0x1360, -0x4039, 0x1358, 0x4036, 0x1354, 0x3C03, 0x936B, 0x2001, 0x426B, 0x407C, -0x0088, 0x12A6, 0x403C, 0x0034, 0x12A9, 0x12B0, 0xD230, 0x4B4C, 0x108C, -0xF03C, 0x0F00, 0xD03C, 0x0060, 0x12B0, 0xD23A, 0x12B0, 0xD230, 0x403C, -0x00FC, 0x12B0, 0xD23A, 0x430C, 0x12A9, 0x4C07, 0x434C, 0x12A8, 0x435C, -0x12A8, 0x430C, 0x12A9, 0x4C0A, 0x434C, 0x12A8, 0x407C, 0x0088, 0x12A6, -0x407C, 0x0024, 0x1292, 0x1356, 0x435C, 0x12A8, 0x4781, 0x0000, 0x4A81, -0x0002, 0x403D, 0x0003, 0x410C, 0x421F, 0x1112, 0x129F, 0x0006, 0x535B, -0x907B, 0x0010, 0x2BC3, 0x430C, 0x5221, 0x4030, 0xD422, 0x120A, 0x120B, -0x1208, 0x1209, 0x434C, 0x1292, 0x276E, 0x4218, 0x275A, 0x4039, 0x0028, -0x490C, 0x1288, 0x434C, 0x1292, 0x276C, 0x490C, 0x1288, 0x435C, 0x1292, -0x276C, 0x490C, 0x1288, 0x435C, 0x1292, 0x276E, 0x490C, 0x1288, 0x435C, -0x12B0, 0xD6B2, 0x430A, 0x430B, 0x407C, 0x0086, 0x1292, 0x1354, 0x430C, -0x1292, 0x1358, 0x531A, 0x630B, 0x2020, 0x903A, 0x0BB8, 0x2C1D, 0xB31C, -0x2BF5, 0x431C, 0x1292, 0x1358, 0x403C, 0xA55A, 0x1292, 0x1358, 0x1292, -0x2756, 0x490C, 0x1288, 0x434C, 0x12B0, 0xD6B2, 0x494C, 0x1292, 0x1354, -0x4C4C, 0x903C, 0x0095, 0x2408, 0x903C, 0x0091, 0x2405, 0x903C, 0x0099, -0x2402, 0x433C, 0x3C01, 0x430C, 0x4030, 0xD426, 0x120A, 0x120B, 0x1208, -0x8221, 0x430A, 0x430B, 0x4381, 0x0000, 0x4381, 0x0002, 0x410C, 0x421F, -0x1112, 0x129F, 0x0016, 0x407C, 0x0028, 0x1292, 0x1354, 0x4C48, 0x9038, -0x0089, 0x240B, 0x9038, 0x0091, 0x2408, 0x9038, 0x0095, 0x2405, 0x9038, -0x0099, 0x2402, 0x432C, 0x3C2B, 0x407C, 0x00D0, 0x1292, 0x1354, 0x430C, -0x1292, 0x1358, 0x4C08, 0x531A, 0x630B, 0x4C0F, 0xE33F, 0x5F0F, 0x7F0F, -0xB12C, 0x2008, 0xB11F, 0x0002, 0x2005, 0x930B, 0x2003, 0x903A, 0x000A, -0x2BEC, 0x930B, 0x200F, 0x903A, 0x000A, 0x2C0C, 0x431B, 0x431C, 0x421F, -0x1112, 0x129F, 0x0008, 0x480C, 0x421F, 0x1112, 0x129F, 0x0008, 0x3C01, -0x432B, 0x4B0C, 0x5221, 0x4030, 0xD428, 0x464C, 0x12AB, 0x435C, 0x4A20, -0x407C, 0x00C1, 0x12AB, 0x411C, 0x0004, 0x430D, 0x1292, 0x135A, 0x407C, -0x00A1, 0x4B20, 0x454C, 0x12AB, 0x430C, 0x12A8, 0xF07C, 0x0081, 0x907C, -0x0081, 0x4130, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x407C, 0x0021, 0x12AB, -0x430C, 0x430D, 0x1292, 0x135A, 0x4C81, 0x000A, 0x4D81, 0x000C, 0x4130, -0x434C, 0x12AA, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0024, 0x12A4, 0x435C, -0x4A20, 0x464C, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12AA, 0x474C, -0x12AB, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12A8, -0x434C, 0x12AA, 0x407C, 0x0042, 0x3FB9, 0x434C, 0x12AA, 0x12B0, 0xD790, -0x407C, 0x0021, 0x3FB2, 0x930D, 0x3408, 0x1208, 0xE33C, 0xE33D, 0x531C, -0x630D, 0x4038, 0x0197, 0x3C03, 0x1208, 0x4038, 0x0097, 0x903D, 0x0100, -0x2C1C, 0x930D, 0x200F, 0x903C, 0x0100, 0x2806, 0x108C, 0x4C4D, 0xC03C, -0x00FF, 0x8238, 0x3C06, 0x930C, 0x240D, 0x4C0D, 0x430C, 0x8038, 0x0010, -0x8318, 0x5C0C, 0x6D4D, 0x2BFC, 0x1108, 0x104D, 0x100C, 0x1088, 0xD80D, -0x4138, 0x4130, 0x1207, 0x4347, 0x903D, 0x0200, 0x2808, 0xC312, 0x100D, -0x100C, 0x1047, 0x5318, 0x903D, 0x0200, 0x2FF8, 0x1108, 0x104D, 0x100C, -0x1088, 0xD80D, 0x6747, 0x2806, 0xC312, 0x1047, 0x2001, 0x2802, 0x531C, -0x630D, 0x4137, 0x4138, 0x4130, 0x435C, 0x12A9, 0x4030, 0xBCA8, 0x434C, -0x12A9, 0x407C, 0x00C1, 0x4A20, 0x434C, 0x12A9, 0x435C, 0x4030, 0xBD02, -0x12AB, 0x434C, 0x12A9, 0x435C, 0x4920, 0x407C, 0x0028, 0x12AA, 0x430C, -0x4B20, 0x407C, 0x00F4, 0x12AA, 0x403C, 0x4020, 0x4B20, 0x407C, 0x00B0, -0x12AA, 0x403C, 0x0088, 0x430D, 0x4620, 0x430D, 0x12A4, 0x435C, 0x12A9, -0x434C, 0x12A9, 0x407C, 0x0042, 0x3FE7, 0x430D, 0x12A4, 0x435C, 0x12A9, -0x407C, 0x00A1, 0x4A20, 0x12B0, 0xBD00, 0x403C, 0x0500, 0x12AB, 0x3FCB, -0x434C, 0x12A9, 0x484C, 0x4A20, 0x12AB, 0x12B0, 0xBD00, 0x403C, 0x0501, -0x12AB, 0x435C, 0x12A9, 0x4030, 0xBCA8, 0x120A, 0x43C2, 0x1100, 0x43C2, -0x1396, 0x4382, 0x1112, 0x403A, 0xD202, 0x403E, 0x000A, 0x430D, 0x403C, -0x1114, 0x128A, 0x403E, 0x0010, 0x430D, 0x403C, 0x1102, 0x128A, 0x403E, -0x0020, 0x430D, 0x403C, 0x111E, 0x128A, 0x4382, 0x113E, 0x43C2, 0x1140, -0x4382, 0x1142, 0x40B2, 0x0417, 0x1144, 0x4382, 0x14FE, 0x40B2, 0x0BB8, -0x1502, 0x43D2, 0x150F, 0x43C2, 0x1510, 0x4382, 0x136C, 0x4382, 0x136E, -0x4382, 0x150A, 0x43C2, 0x1511, 0x4382, 0x1508, 0x403E, 0x0006, 0x430D, -0x403C, 0x137C, 0x128A, 0x403E, 0x0012, 0x430D, 0x403C, 0x1382, 0x128A, -0x4392, 0x1398, 0x413A, 0x4130, 0x435C, 0x12A9, 0x434C, 0x4920, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x12B0, 0xD270, 0x3C0F, 0x12B0, -0xBE18, 0x12B0, 0xBDEE, 0x12B0, 0xBDAA, 0x430C, 0x12A6, 0x4C8B, 0x0000, -0x434C, 0x12A9, 0x12B0, 0xBDFE, 0x532B, 0x480F, 0x5338, 0x930F, 0x23ED, -0x4030, 0xD422, 0x407C, 0x00C1, 0x12A7, 0x4A0C, 0x12A6, 0x407C, 0x00A1, -0x4720, 0x407C, 0x00C8, 0x12A7, 0x403C, 0x2401, 0x12A6, 0x407C, 0x0021, -0x12A7, 0x435C, 0x12A9, 0x532A, 0x4130, 0x407C, 0x0082, 0x12A7, 0x403C, -0x3FFF, 0x12A6, 0x434C, 0x12A9, 0x407C, 0x00C8, 0x12A7, 0x403C, 0x2409, -0x12A6, 0x3FBA, 0x120A, 0x120B, 0x1208, 0x1209, 0x8321, 0x431A, 0x403B, -0x1360, 0x4038, 0x1358, 0x4039, 0x1354, 0x3C03, 0x932A, 0x2001, 0x422A, -0x410C, 0x421F, 0x1112, 0x129F, 0x0016, 0x903A, 0x000F, 0x2429, 0x930C, -0x2029, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x3401, 0x12A8, 0x407C, 0x0082, -0x12A9, 0x4A0C, 0xD03C, 0x4030, 0x12B0, 0xD772, 0x412C, 0x12B0, 0xD772, -0x403C, 0x3FFD, 0x12B0, 0xD4E4, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x12A9, -0x403C, 0x2401, 0x12A8, 0x435C, 0x12AB, 0x531A, 0x903A, 0x0010, 0x2BD0, -0x430C, 0x5321, 0x4030, 0xD426, 0x930C, 0x37D7, 0x403C, 0xFFD8, 0x3FF8, -0x120A, 0x120B, 0x8031, 0x0006, 0x403A, 0x1112, 0x410C, 0x531C, 0x4A2F, -0x129F, 0x0014, 0x407C, 0x00B0, 0x1292, 0x1354, 0x403B, 0x135C, 0x3C19, -0x410C, 0x532C, 0x4A2F, 0x129F, 0x0018, 0x416C, 0x430D, 0x12AB, 0x411C, -0x0002, 0x411D, 0x0004, 0x12AB, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, -0x0040, 0x0002, 0x2802, 0x4382, 0x14C0, 0x53F1, 0x0001, 0x93C1, 0x0001, -0x2411, 0x410C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BDD, 0x416C, -0x430D, 0x12AB, 0x430C, 0x430D, 0x12AB, 0x4A2F, 0x129F, 0x000A, 0x3FEA, -0x430C, 0x5031, 0x0006, 0x413B, 0x413A, 0x4130, 0x435C, 0x12A6, 0x4030, -0xBFB0, 0x12B0, 0xBFB0, 0x434C, 0x4620, 0x474C, 0x12A9, 0x403C, 0x1501, -0x4820, 0x430D, 0x12A7, 0x431C, 0x430D, 0x4720, 0x12B0, 0xBFAE, 0x403C, -0x3FFD, 0x12A8, 0x434C, 0x4620, 0x407C, 0x0030, 0x4920, 0x434C, 0x12A6, -0x407C, 0x00C1, 0x4920, 0x434C, 0x12A6, 0x407C, 0x0042, 0x12A9, 0x435C, -0x4620, 0x474C, 0x12A9, 0x403C, 0x0501, 0x4820, 0x474C, 0x12A9, 0x403C, -0x0501, 0x12A8, 0x434C, 0x12A6, 0x435C, 0x4620, 0x430D, 0x12A7, 0x430C, -0x430D, 0x4720, 0x12A8, 0x474C, 0x12A9, 0x403C, 0x1401, 0x12A8, 0x444C, -0x12A9, 0x4030, 0xBFB0, 0x120A, 0x120B, 0x1208, 0x8231, 0x410C, 0x421F, -0x1112, 0x129F, 0x0018, 0x410C, 0x522C, 0x421F, 0x1112, 0x129F, 0x0018, -0x4038, 0x1360, 0x434C, 0x12A8, 0x430A, 0x430B, 0x3C1E, 0x407C, 0x00C1, -0x1292, 0x1354, 0x412C, 0x411D, 0x0002, 0x1292, 0x135A, 0x435C, 0x12A8, -0x434C, 0x12A8, 0x407C, 0x0042, 0x1292, 0x1354, 0x430C, 0x1292, 0x1358, -0x421F, 0x1112, 0x129F, 0x0008, 0x53A1, 0x0000, 0x6381, 0x0002, 0x531A, -0x630B, 0x911B, 0x0006, 0x2BDF, 0x2003, 0x911A, 0x0004, 0x2BDB, 0x435C, -0x12A8, 0x434C, 0x12A8, 0x435C, 0x12A8, 0x430C, 0x5231, 0x4030, 0xD428, -0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x435A, 0x403B, 0x1360, 0x4038, -0x1358, 0x4039, 0x1354, 0x3C03, 0x936A, 0x2001, 0x426A, 0x407C, 0x00C8, -0x12A9, 0x403C, 0x3401, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x4A4C, 0x108C, -0xF03C, 0x0F00, 0xD03C, 0x4082, 0x12B0, 0xD514, 0x407C, 0x0082, 0x12A9, -0x403C, 0x00FE, 0x12B0, 0xD514, 0x434C, 0x12AB, 0x435C, 0x12AB, 0x430C, -0x12A8, 0x4C06, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x12A9, 0x403C, 0x2401, -0x12A8, 0x435C, 0x12AB, 0x460C, 0x421F, 0x1112, 0x129F, 0x0008, 0x535A, -0x907A, 0x0010, 0x2BCB, 0x430C, 0x4030, 0xD424, 0x120A, 0x120B, 0x1208, -0x1209, 0x4308, 0x430A, 0x430B, 0x3C08, 0xB329, 0x2836, 0x930B, 0x3804, -0x2033, 0x903A, 0x1388, 0x2C30, 0x434C, 0x1292, 0x1360, 0x407C, 0x0028, -0x1292, 0x1354, 0x430C, 0x1292, 0x1358, 0x4C09, 0x9318, 0x380B, 0xB32C, -0x2C16, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x3400, 0x1292, 0x1358, -0x3C0D, 0x9308, 0x200B, 0xB32C, 0x2809, 0x407C, 0x00C8, 0x1292, 0x1354, -0x403C, 0x3402, 0x1292, 0x1358, 0x4318, 0x435C, 0x1292, 0x1360, 0x531A, -0x630B, 0x9038, 0x000A, 0x3BCB, 0x433C, 0x433D, 0x3C02, 0x430C, 0x430D, -0x4030, 0xD426, 0x120A, 0x120B, 0x1208, 0x1209, 0x4308, 0x430A, 0x430B, -0x3C08, 0xB329, 0x2836, 0x930B, 0x3804, 0x2033, 0x903A, 0x1388, 0x2C30, -0x434C, 0x1292, 0x1360, 0x407C, 0x0028, 0x1292, 0x1354, 0x430C, 0x1292, -0x1358, 0x4C09, 0x9318, 0x380B, 0xB32C, 0x2C16, 0x407C, 0x00C8, 0x1292, -0x1354, 0x403C, 0x3400, 0x1292, 0x1358, 0x3C0D, 0x9308, 0x200B, 0xB32C, -0x2809, 0x407C, 0x00C8, 0x1292, 0x1354, 0x403C, 0x3402, 0x1292, 0x1358, -0x4318, 0x435C, 0x1292, 0x1360, 0x531A, 0x630B, 0x9038, 0x000A, 0x3BCB, -0x433C, 0x433D, 0x3C02, 0x430C, 0x430D, 0x4030, 0xD426, 0x40B2, 0x0006, -0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2867, 0x01EA, 0x40B2, 0x2871, -0x01F2, 0x3C06, 0x40B2, 0x2861, 0x01EA, 0x40B2, 0x286D, 0x01F2, 0xD0B2, -0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, 0xD0F2, 0x000E, -0x0033, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, 0x0079, 0x2BFD, -0x425E, 0x007E, 0x5E4E, 0xF0F2, 0x00F1, 0x0033, 0xB35C, 0x2804, 0xD0F2, -0x0003, 0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xB2E2, 0x0030, 0x7F4F, 0x535F, 0xD392, 0x01F0, 0xDF4E, -0x4E4C, 0x4130, 0x474C, 0x4030, 0xC2C2, 0x474C, 0x12B0, 0xC2C2, 0x403C, -0xD034, 0x4820, 0x407C, 0x0021, 0x12AB, 0x430C, 0x12A8, 0x4C81, 0x000A, -0x4381, 0x000C, 0x4130, 0x444C, 0x12AB, 0x430C, 0x12A8, 0xF07C, 0x0081, -0x907C, 0x0081, 0x4130, 0x12A8, 0x434C, 0x12AA, 0x407C, 0x0042, 0x12AB, -0x435C, 0x4A20, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x12B0, 0xD5F6, 0x435C, -0x4A20, 0x474C, 0x12AB, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12AA, 0x494C, -0x12AB, 0x403C, 0x2409, 0x12A8, 0x435C, 0x12AA, 0x434C, 0x4A20, 0x12B0, -0xD5F6, 0x407C, 0x0021, 0x4030, 0xC2C2, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x1207, 0x1204, 0x1205, 0x403A, 0x1354, 0x407B, 0x0088, 0x4B4C, -0x12AA, 0x4038, 0x1358, 0x403C, 0x0034, 0x12A8, 0x4079, 0x0082, 0x494C, -0x12AA, 0x4036, 0x1360, 0x435C, 0x12A6, 0x403C, 0x0960, 0x12A8, 0x434C, -0x12A6, 0x4077, 0x0042, 0x12B0, 0xCFF6, 0x4C04, 0x12B0, 0xD90C, 0x4C05, -0x12B0, 0xD4D4, 0x4B4C, 0x12AA, 0x403C, 0x0034, 0x12A8, 0x12B0, 0xD8F4, -0x403C, 0x0A60, 0x12A8, 0x434C, 0x12A6, 0x12B0, 0xCFF6, 0x4C07, 0x12B0, -0xD90C, 0x12B0, 0xD4D4, 0x470D, 0x440C, 0xD50D, 0x4030, 0xD41E, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, 0x1205, 0x4C05, 0x4C2A, -0x4C1B, 0x0002, 0x4038, 0x1360, 0x434C, 0x12A8, 0x4039, 0x1354, 0x4074, -0x0082, 0x12B0, 0xC866, 0x4036, 0x1358, 0x12B0, 0xC876, 0x503C, 0x0085, -0x12A6, 0x4077, 0x00C8, 0x12B0, 0xC886, 0x451A, 0x0004, 0x451B, 0x0006, -0x12B0, 0xC86E, 0x503C, 0x0086, 0x12B0, 0xC884, 0x451A, 0x0008, 0x451B, -0x000A, 0x12B0, 0xC86E, 0x503C, 0x0089, 0x12B0, 0xC884, 0x451A, 0x000C, -0x451B, 0x000E, 0x12B0, 0xC86E, 0x503C, 0x0088, 0x12B0, 0xC884, 0x4030, -0xD41E, 0x42B2, 0x01EE, 0xB3E2, 0x0031, 0x2807, 0x40B2, 0x2859, 0x01EA, -0x40B2, 0x2871, 0x01F2, 0x3C06, 0x40B2, 0x2851, 0x01EA, 0x40B2, 0x286D, -0x01F2, 0xD0B2, 0x0010, 0x01E8, 0xD0B2, 0x0010, 0x01F0, 0xD392, 0x01E8, -0xD0F2, 0x000E, 0x0033, 0xC0F2, 0x0010, 0x0078, 0x4CC2, 0x007F, 0xB3D2, -0x0079, 0x2BFD, 0xF0F2, 0x00F1, 0x0033, 0xB35C, 0x2804, 0xD0F2, 0x0003, -0x0031, 0x3C04, 0xC3E2, 0x0031, 0xD3D2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0x425C, 0x007E, 0x5C4C, 0xB2E2, 0x0030, 0x7E4E, 0x535E, 0xD392, -0x01F0, 0xDE4C, 0x4130, 0x120A, 0x120B, 0x1208, 0x4C08, 0x4E0A, 0x4F0B, -0x12B0, 0xBD1C, 0x4A82, 0x136C, 0x4B82, 0x136E, 0xB23A, 0x2804, 0x432F, -0x403B, 0x0535, 0x3C03, 0x431F, 0x403B, 0x07CF, 0x4B82, 0x1378, 0x4F82, -0x1374, 0x403E, 0x000A, 0x403D, 0x253A, 0x403C, 0x1114, 0x12B0, 0xD1A2, -0x4882, 0x1112, 0x12B0, 0xCD6A, 0x9382, 0x128C, 0x2009, 0xB2B2, 0x136C, -0x2C06, 0x40B2, 0xFFFE, 0x128A, 0x4292, 0x275C, 0x128C, 0x12B0, 0xAFDE, -0x40B2, 0x040F, 0x1144, 0x40B2, 0x0052, 0x111A, 0x40B2, 0x1146, 0x111C, -0x403C, 0x1114, 0x4030, 0xD428, 0x120A, 0x120B, 0x8221, 0x403A, 0x1112, -0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, 0x0090, 0x1292, 0x1354, -0x403B, 0x1358, 0x3C16, 0x410C, 0x532C, 0x4A2F, 0x129F, 0x0016, 0x416C, -0x12AB, 0x411C, 0x0002, 0x12AB, 0x90F1, 0x009E, 0x0000, 0x2006, 0xB0B1, -0x0040, 0x0002, 0x2802, 0x4382, 0x14C0, 0x53F1, 0x0001, 0x93C1, 0x0001, -0x240F, 0x410C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BE0, 0x416C, -0x12AB, 0x430C, 0x12AB, 0x4A2F, 0x129F, 0x0008, 0x3FEC, 0x430C, 0x5221, -0x413B, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x8221, 0x4291, -0x2772, 0x0000, 0x4291, 0x2774, 0x0002, 0x403A, 0x1360, 0x434C, 0x12AA, -0x403B, 0x1354, 0x4078, 0x00C8, 0x484C, 0x12AB, 0x4039, 0x1358, 0x12B0, -0xD72A, 0x403C, 0xFF80, 0x12B0, 0xD504, 0x412C, 0x12B0, 0xD0A2, 0x434C, -0x12AA, 0x484C, 0x12AB, 0x12B0, 0xD72A, 0x403C, 0xFF82, 0x12B0, 0xD504, -0x411C, 0x0002, 0x12B0, 0xD0A2, 0x407C, 0x0054, 0x12AB, 0x403C, 0x0200, -0x430D, 0x1292, 0x135C, 0x430C, 0x5221, 0x4030, 0xD426, 0x120A, 0x120B, -0x8221, 0x403A, 0x1112, 0x410C, 0x531C, 0x4A2F, 0x129F, 0x0014, 0x407C, -0x0090, 0x1292, 0x1354, 0x403B, 0x1358, 0x3C12, 0x410C, 0x532C, 0x4A2F, -0x129F, 0x0016, 0x90F1, 0x0088, 0x0000, 0x2002, 0xD391, 0x0002, 0x416C, -0x12AB, 0x411C, 0x0002, 0x12AB, 0x53F1, 0x0001, 0x93C1, 0x0001, 0x240F, -0x410C, 0x4A2F, 0x129F, 0x0014, 0xB3D1, 0x0000, 0x2BE4, 0x416C, 0x12AB, -0x430C, 0x12AB, 0x4A2F, 0x129F, 0x0008, 0x3FEC, 0x430C, 0x5221, 0x413B, -0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x1204, -0x4038, 0x1354, 0x4079, 0x00C8, 0x494C, 0x12A8, 0x12B0, 0xD844, 0x407B, -0x0082, 0x4B4C, 0x12A8, 0x403C, 0x4982, 0x12A6, 0x4037, 0x1360, 0x434C, -0x12A7, 0x4074, 0x0042, 0x12B0, 0xCE9C, 0x4C0A, 0x12B0, 0xD322, 0x494C, -0x12A8, 0x403C, 0x3401, 0x12A6, 0x4B4C, 0x12A8, 0x403C, 0x4A82, 0x12A6, -0x434C, 0x12A7, 0x12B0, 0xCE9C, 0x4C0B, 0x12B0, 0xD322, 0x4A0C, 0x4B0D, -0x4030, 0xD420, 0x120A, 0x407C, 0x0044, 0x1292, 0x1354, 0x431C, 0x1292, -0x275A, 0x43D2, 0x1396, 0x407C, 0x0024, 0x1292, 0x1354, 0x421A, 0x2784, -0xC2DA, 0x2780, 0x0000, 0xC2DA, 0x277E, 0x0000, 0xD2DA, 0x277E, 0x0000, -0x431C, 0x430D, 0x12B0, 0x45AE, 0xD2DA, 0x2780, 0x0000, 0x403C, 0x0003, -0x1292, 0x275A, 0x430C, 0x430D, 0x12B0, 0x45AE, 0x407C, 0x0054, 0x1292, -0x1354, 0x403C, 0x0200, 0x430D, 0x1292, 0x135C, 0x430C, 0x413A, 0x4130, -0x120A, 0x120B, 0x1208, 0x1209, 0x4C0A, 0x4D0B, 0x4038, 0x1354, 0x407C, -0x0088, 0x12A8, 0x407C, 0x0034, 0x1292, 0x1356, 0x407C, 0x0082, 0x12A8, -0x12B0, 0xD54E, 0xD03C, 0x0080, 0x1292, 0x1358, 0x4039, 0x1360, 0x434C, -0x12A9, 0x435C, 0x12A9, 0x4A0C, 0x1292, 0x1358, 0x434C, 0x12A9, 0x407C, -0x0021, 0x12A8, 0x12B0, 0xBDAA, 0x407C, 0x0088, 0x12A8, 0x12B0, 0xD9FC, -0x435C, 0x12A9, 0x4030, 0xD426, 0x120A, 0x403A, 0x1354, 0x934C, 0x200A, -0x407C, 0x00C8, 0x12AA, 0x403C, 0x7401, 0x1292, 0x1358, 0x434C, 0x12B0, -0x453A, 0x407C, 0x0044, 0x12AA, 0x431C, 0x1292, 0x275A, 0x431C, 0x430D, -0x12B0, 0x45AE, 0x407C, 0x0024, 0x12AA, 0x431C, 0x1292, 0x275A, 0x430C, -0x430D, 0x12B0, 0x45AE, 0x435C, 0x12B0, 0x453A, 0x407C, 0x0054, 0x12AA, -0x403C, 0x0200, 0x430D, 0x1292, 0x135C, 0x430C, 0x413A, 0x4130, 0x434C, -0x12A6, 0x407C, 0x0082, 0x12A8, 0x435C, 0x12A6, 0x4A0C, 0x12A9, 0x434C, -0x4620, 0x444C, 0x12A8, 0x430C, 0x430D, 0x1292, 0x135A, 0x454C, 0x12A8, -0x403C, 0x0501, 0x12A9, 0x435C, 0x12A6, 0x444C, 0x4820, 0x454C, 0x12A8, -0x403C, 0x1400, 0x12A9, 0x407C, 0x0082, 0x12A8, 0x434C, 0x12A6, 0x435C, -0x12A6, 0x4B0C, 0x12A9, 0x434C, 0x12A6, 0x435C, 0x12A6, 0x403C, 0x4303, -0x3FD9, 0x444C, 0x12A9, 0x435C, 0x4820, 0x434C, 0x12A8, 0x12B0, 0xC866, -0x4A0C, 0x4B0D, 0x12B0, 0xD196, 0xF03C, 0x0F00, 0x4130, 0x12A6, 0x474C, -0x12A9, 0x403C, 0x1401, 0x12A6, 0x444C, 0x12A9, 0x12B0, 0xD800, 0x4A0C, -0x12B0, 0xD7FE, 0x403C, 0x3FFD, 0x12B0, 0xD95C, 0x12B0, 0xD430, 0x12A8, -0x474C, 0x12A9, 0x403C, 0x0501, 0x12B0, 0xD95C, 0x407C, 0x0042, 0x4030, -0xC868, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C08, 0x4E0A, 0x4039, -0x1354, 0x407C, 0x00C8, 0x12A9, 0x12B0, 0xD844, 0x12B0, 0xD53A, 0xD038, -0x4030, 0x480C, 0x12A6, 0x4038, 0x1360, 0x12B0, 0xD532, 0x4A0C, 0x12A6, -0x12B0, 0xD532, 0x403C, 0x3FFD, 0x12A6, 0x12B0, 0xD7A4, 0x12B0, 0xD83A, -0x12A9, 0x403C, 0x2401, 0x12A6, 0x435C, 0x12A8, 0x4030, 0xD424, 0x12B0, -0xC920, 0x430C, 0x4030, 0x8D6A, 0x40B2, 0xC304, 0x14A2, 0x40B2, 0xB2B0, -0x14A4, 0x40B2, 0xC744, 0x14A6, 0x40B2, 0xCB78, 0x14A8, 0x40B2, 0xCB30, -0x14AA, 0x4292, 0x11E4, 0x14AC, 0x4130, 0x12B0, 0xC94E, 0x4030, 0x8D6A, -0x12B0, 0xCE4C, 0x40B2, 0xCDA2, 0x14A6, 0x12B0, 0xCE5A, 0x431C, 0x4130, -0x12B0, 0xCE3E, 0x3FDA, 0x434C, 0x12AB, 0x407C, 0x0082, 0x12A9, 0x435C, -0x4B20, 0x474C, 0x12A9, 0x435C, 0x12AB, 0x430C, 0x12A8, 0x4C81, 0x0002, -0x12B0, 0xD756, 0x12AB, 0x430C, 0x12A8, 0x4C05, 0x12B0, 0xD756, 0x12B0, -0xD754, 0x12B0, 0xD754, 0x12AB, 0x9382, 0x1398, 0x2005, 0x407C, 0x00C8, -0x12A9, 0x440C, 0x12A8, 0x434C, 0x12AB, 0x474C, 0x3FDC, 0x12B0, 0xD0BE, -0x4820, 0x12B0, 0xC9E6, 0x12B0, 0xC9B6, 0x403C, 0x3FFD, 0x12B0, 0xC9E6, -0x464C, 0x12AB, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x454C, 0x12AB, 0x407C, -0x0024, 0x12A4, 0x435C, 0x4820, 0x12A9, 0x434C, 0x4820, 0x4C81, 0x0002, -0x454C, 0x12B0, 0xD0CE, 0x12A8, 0x411C, 0x0002, 0x12A9, 0x434C, 0x12A8, -0x3FD9, 0xD3E2, 0x0031, 0xD3D2, 0x0031, 0xD2F2, 0x0031, 0xC2F2, 0x0031, -0xD2F2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, 0x0031, -0xC2F2, 0x0031, 0xD2F2, 0x0031, 0xC3D2, 0x0031, 0xC2F2, 0x0031, 0xD2F2, -0x0031, 0x430C, 0x4130, 0x1206, 0x1207, 0x4D06, 0xD07D, 0x0080, 0x6606, -0x6707, 0x1086, 0xF376, 0x8076, 0x007F, 0x2814, 0x8076, 0x0018, 0x280A, -0x9236, 0x3412, 0x5C0C, 0x6D0D, 0x8356, 0x2FFC, 0x1007, 0x4137, 0x4136, -0x4130, 0xE376, 0x27FA, 0x110D, 0x100C, 0x8356, 0x23FC, 0x3FF5, 0x430C, -0x430D, 0x3FF2, 0x433C, 0x433D, 0x3FEF, 0x1285, 0x4C0F, 0xDD0F, 0x930F, -0x4130, 0x464C, 0x12AB, 0x403C, 0x0082, 0x4820, 0x494C, 0x12AB, 0x403C, -0x3400, 0x4820, 0x444C, 0x12AB, 0x430C, 0x4820, 0x407C, 0x00C1, 0x12AB, -0x411C, 0x0004, 0x12A8, 0x407C, 0x00A1, 0x4130, 0x494C, 0x12AB, 0x403C, -0x3401, 0x12A8, 0x474C, 0x4B20, 0x12A8, 0x3FDB, 0x120A, 0x120B, 0x1292, -0x134E, 0x1292, 0x1350, 0x407A, 0x0003, 0x407C, 0x0028, 0x1292, 0x1354, -0x403C, 0xAAAA, 0x1292, 0x1358, 0x4C0B, 0x903C, 0x5555, 0x2006, 0x403C, -0x5555, 0x421F, 0x1112, 0x129F, 0x0008, 0x537A, 0x23EC, 0x4B0C, 0x421F, -0x1112, 0x129F, 0x0008, 0x430C, 0x413B, 0x413A, 0x4130, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x4C0A, 0x4D0B, 0x4E07, 0x12B0, 0xD5BE, -0x3C12, 0x12B0, 0xCFB2, 0x12B0, 0xD2C0, 0x12B0, 0xCFCE, 0x430C, 0x12A9, -0x4C8B, 0x0000, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x12B0, 0xD358, 0x532A, -0x532B, 0x470F, 0x5337, 0x930F, 0x23EA, 0x4030, 0xD422, 0x120A, 0x120B, -0x1208, 0x1209, 0x1206, 0x1207, 0x4C0A, 0x4D07, 0x4E0B, 0x12B0, 0xD5BE, -0x3C11, 0x12B0, 0xCFB2, 0x407C, 0x0048, 0x12A6, 0x427C, 0x1292, 0x1356, -0x12B0, 0xD2C0, 0x473C, 0x12A9, 0x12B0, 0xD83A, 0x12B0, 0xD358, 0x532A, -0x4B0F, 0x533B, 0x930F, 0x23EB, 0x4030, 0xD422, 0x8321, 0x410C, 0x421F, -0x1112, 0x129F, 0x0014, 0x930C, 0x3403, 0x403C, 0xFFEB, 0x3C15, 0x416C, -0x1292, 0x274E, 0x930C, 0x2403, 0x403C, 0xFFEA, 0x3C0D, 0x434C, 0x1292, -0x2754, 0x1292, 0x134E, 0x1292, 0x1350, 0x435C, 0x421F, 0x1112, 0x129F, -0x0004, 0x430C, 0x5321, 0x4130, 0x435C, 0x12A6, 0x407C, 0x0048, 0x12AA, -0x435C, 0x1292, 0x1356, 0x435C, 0x12A6, 0x4307, 0x407C, 0x0028, 0x12AA, -0x430C, 0x12A8, 0xF07C, 0x0081, 0x907C, 0x0081, 0x2408, 0x434C, 0x12A6, -0x435C, 0x12A6, 0x5317, 0x9037, 0x000A, 0x2BEE, 0x9037, 0x000A, 0x4130, -0x120A, 0x407C, 0x0086, 0x12B0, 0x7674, 0x421A, 0x275A, 0x403C, 0x000A, -0x128A, 0x431E, 0x430F, 0x403C, 0x0010, 0x12B0, 0x839C, 0x403C, 0x000A, -0x128A, 0x403E, 0xA55A, 0x430F, 0x403C, 0x0010, 0x12B0, 0x839C, 0x403C, -0x000F, 0x128A, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, -0x1207, 0x12B0, 0xD270, 0x3C10, 0x12B0, 0xBE18, 0x407C, 0x0048, 0x12A7, -0x427C, 0x1292, 0x1356, 0x12B0, 0xBDEE, 0x4B3C, 0x12A6, 0x12B0, 0xBDAA, -0x12B0, 0xBDFE, 0x480F, 0x5338, 0x930F, 0x23EC, 0x4030, 0xD422, 0x12A6, -0x434C, 0x12A9, 0x407C, 0x0042, 0x12B0, 0xCCF4, 0x484C, 0x4030, 0xCCF4, -0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x12B0, 0xCCF4, 0x434C, 0x12A9, -0x444C, 0x12AA, 0x407C, 0x0024, 0x12AB, 0x435C, 0x4920, 0x474C, 0x12AA, -0x435C, 0x4920, 0x435C, 0x12A9, 0x407C, 0x0048, 0x12AA, 0x435C, 0x12A5, -0x435C, 0x12A9, 0x4306, 0x12B0, 0xD7D6, 0xF07C, 0x0081, 0x907C, 0x0081, -0x2408, 0x434C, 0x12A9, 0x435C, 0x12A9, 0x5316, 0x9036, 0x000A, 0x2BF1, -0x9036, 0x000A, 0x4130, 0x1209, 0x120A, 0x120B, 0x430A, 0x430B, 0x4039, -0x0020, 0x5C0C, 0x6D0D, 0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, -0x5339, 0x23F6, 0x3C04, 0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, -0x413B, 0x413A, 0x4139, 0x4130, 0x434E, 0x4E4F, 0x5F0F, 0x5F0F, 0x4F9F, -0x2544, 0x1146, 0x4F9F, 0x2546, 0x1148, 0x535E, 0x907E, 0x0050, 0x2BF3, -0x407E, 0x0050, 0x4E4F, 0x5F0F, 0x5F0F, 0x43BF, 0x1146, 0x438F, 0x1148, -0x535E, 0x907E, 0x0052, 0x2BF5, 0x4130, 0x120A, 0x120B, 0x1208, 0x4C0A, -0x407C, 0x0082, 0x1292, 0x1354, 0x403C, 0x4030, 0x1292, 0x1358, 0x4038, -0x1360, 0x12B0, 0xCFCE, 0x4A0C, 0x1292, 0x1358, 0x12B0, 0xCFCE, 0x12B0, -0xCFCE, 0x435C, 0x12A8, 0x4030, 0xD428, 0x1292, 0x275A, 0x407C, 0x0086, -0x12A9, 0x430C, 0x12A8, 0xB23C, 0x280C, 0x403C, 0x0014, 0x12A8, 0x430C, -0x12A8, 0x4C07, 0x430C, 0x12A8, 0x4781, 0x0004, 0x4C81, 0x0006, 0x5314, -0x6305, 0x90B1, 0xBABE, 0x0004, 0x4130, 0x8221, 0x4381, 0x0002, 0x4381, -0x0000, 0x410D, 0x410C, 0x532C, 0x1292, 0x274C, 0x411C, 0x0002, 0x421F, -0x1112, 0x129F, 0x0008, 0x412C, 0x421F, 0x1112, 0x129F, 0x0008, 0x430C, -0x5221, 0x4130, 0x12B0, 0xCE4C, 0x40B2, 0xB242, 0x14A6, 0x4030, 0xCE5A, -0x40B2, 0xC670, 0x14A2, 0x40B2, 0xC8C0, 0x14A4, 0x4130, 0x40B2, 0xCC80, -0x14A8, 0x40B2, 0xBDB2, 0x14AA, 0x4292, 0x1190, 0x14AC, 0x4130, 0x1202, -0xC232, 0x4303, 0x4C82, 0x0130, 0x4E82, 0x0138, 0x4C82, 0x0134, 0x421C, -0x013A, 0x4292, 0x013C, 0x013A, 0x4F82, 0x0138, 0x4D82, 0x0134, 0x4E82, -0x0138, 0x421D, 0x013A, 0x1300, 0x444C, 0x12A8, 0x435C, 0x12A7, 0x4B4C, -0x12A8, 0x403C, 0x00FE, 0x12A6, 0x434C, 0x12A7, 0x444C, 0x12A8, 0x435C, -0x12A7, 0x434C, 0x12A7, 0x435C, 0x12A7, 0x430C, 0x4620, 0xD3D2, 0x0031, -0xC3D2, 0x0031, 0x403C, 0x0005, 0x1292, 0x2758, 0xD3D2, 0x0031, 0xC3D2, -0x0031, 0x403C, 0x0005, 0x1292, 0x2758, 0xD3D2, 0x0031, 0x430C, 0x4130, -0x120A, 0x8321, 0x433A, 0x43C1, 0x0000, 0x410C, 0x421F, 0x1112, 0x129F, -0x0014, 0x933C, 0x2404, 0x416C, 0x1292, 0x1368, 0x430A, 0x4A0C, 0x5321, -0x413A, 0x4130, 0x907B, 0x0010, 0x2807, 0x4D0C, 0x4E0D, 0x4F0E, 0x430F, -0x807B, 0x0010, 0x3FF6, 0x934B, 0x2407, 0xC312, 0x100F, 0x100E, 0x100D, -0x100C, 0x835B, 0x23F9, 0x4130, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x490C, -0x4820, 0x12B0, 0xCF3E, 0x435C, 0x4620, 0x434C, 0x12A6, 0x4B4C, 0x12AA, -0x403C, 0x2C01, 0x12A8, 0x435C, 0x4030, 0xCF40, 0x407C, 0x00F4, 0x12B0, -0x7674, 0x403C, 0x000A, 0x1292, 0x275A, 0x403E, 0x4020, 0x430F, 0x403C, -0x0010, 0x12B0, 0x839C, 0x403C, 0x000A, 0x4210, 0x275A, 0xD0F2, 0x0040, -0x0029, 0x421F, 0x1504, 0xC2DF, 0x150C, 0x0000, 0x431C, 0x1292, 0x275A, -0x421F, 0x1504, 0xD3DF, 0x0000, 0xC0F2, 0x0020, 0x0029, 0x4130, 0x407C, -0x0082, 0x12A6, 0x403C, 0x3FFF, 0x12A9, 0x434C, 0x12A8, 0x407C, 0x00C8, -0x12A6, 0x403C, 0x2409, 0x12A9, 0x435C, 0x12A8, 0x434C, 0x4820, 0x12B0, -0xD48E, 0x403C, 0x3FFF, 0x12A8, 0x434C, 0x12A6, 0x4B4C, 0x12AA, 0x403C, -0x2409, 0x12A8, 0x435C, 0x12A6, 0x434C, 0x4620, 0x474C, 0x12B0, 0xD8F6, -0x12B0, 0xD8F4, 0x403C, 0x00FC, 0x12A8, 0x434C, 0x12A6, 0x474C, 0x12B0, -0xD8F6, 0x430C, 0x4820, 0x482F, 0x4F10, 0x0008, 0x5C0C, 0x5C0C, 0x12AA, -0x12B0, 0xD9C4, 0x430D, 0x482F, 0x129F, 0x000A, 0x12B0, 0xD9C4, 0x3FF1, -0xF37C, 0xF37E, 0x4E0F, 0x4C0D, 0x430E, 0x431C, 0x5D0D, 0x6E0E, 0x9F0E, -0x2801, 0x8F0E, 0x6C0C, 0x2BF9, 0x4130, 0x12B0, 0xD05C, 0x407C, 0x0082, -0x12A9, 0x435C, 0x4620, 0x1292, 0x1358, 0x434C, 0x12A6, 0x407C, 0x0042, -0x3FF6, 0x12B0, 0xD078, 0x407C, 0x0082, 0x12AB, 0x435C, 0x4A20, 0x1292, -0x1358, 0x434C, 0x12AA, 0x407C, 0x0042, 0x3FF6, 0xF37C, 0xF37E, 0x1202, -0xC232, 0x4303, 0x4C82, 0x0130, 0x4E82, 0x0138, 0x421C, 0x013A, 0x421D, -0x013C, 0x1300, 0x12A9, 0x434C, 0x12AA, 0x484C, 0x12AB, 0x403C, 0x0501, -0x12A9, 0x435C, 0x12AA, 0x434C, 0x12AA, 0x435C, 0x4A20, 0x464C, 0x12AB, -0x435C, 0x12A8, 0x474C, 0x12AB, 0x435C, 0x4130, 0x12AB, 0x407C, 0x0034, -0x12A4, 0x3FF7, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x110D, -0x100C, 0x110D, 0x100C, 0x110D, 0x100C, 0x4130, 0x12A8, 0x407C, 0x00C8, -0x12A9, 0x403C, 0x1401, 0x12A8, 0x407C, 0x0082, 0x12A9, 0x12B0, 0xD756, -0x4B20, 0x12B0, 0xD172, 0x450C, 0x12A9, 0x435C, 0x12A7, 0x484C, 0x12AB, -0x403C, 0x3401, 0x12A9, 0x464C, 0x4B20, 0x407C, 0x0094, 0x1292, 0x1354, -0x434C, 0x1292, 0x1356, 0x421F, 0x1112, 0x129F, 0x0004, 0x430C, 0x4130, -0x12B0, 0x81EE, 0x12AA, 0x12B0, 0xD84E, 0x12B0, 0x81FE, 0x403C, 0x2409, -0x12B0, 0x814E, 0x434C, 0x4A20, 0x8321, 0x410C, 0x421F, 0x1112, 0x129F, -0x0016, 0x412C, 0x1292, 0x274A, 0x430C, 0x5321, 0x4130, 0x12B0, 0xD594, -0x464C, 0x12AB, 0x403C, 0x3FFD, 0x12B0, 0xD594, 0x434C, 0x12A7, 0x484C, -0x4B20, 0xC312, 0x100D, 0x100C, 0xC312, 0x100D, 0x100C, 0x108C, 0x108D, -0xED4C, 0xED0C, 0xF37D, 0x4130, 0x120A, 0x4C0A, 0x3C03, 0x4DFA, 0x0000, -0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, 0x4130, 0x4C0F, 0x930F, -0x2408, 0x421E, 0x1378, 0x930E, 0x2402, 0x533E, 0x3FFC, 0x533F, 0x3FF6, -0x4130, 0x482F, 0x4F10, 0x0008, 0x12AB, 0x12B0, 0xD6E2, 0x482F, 0x129F, -0x000A, 0x12B0, 0xD6E2, 0x3FF4, 0x4C0F, 0x930F, 0x2408, 0x421E, 0x1374, -0x930E, 0x2402, 0x533E, 0x3FFC, 0x533F, 0x3FF6, 0x4130, 0x120A, 0x4C0A, -0x3C03, 0x4DCA, 0x0000, 0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, -0x4130, 0x422C, 0x462F, 0x129F, 0x0008, 0x430C, 0x430D, 0x462F, 0x129F, -0x000A, 0x430C, 0x4130, 0x407C, 0x0082, 0x12A6, 0x435C, 0x4820, 0x12A9, -0x434C, 0x12A8, 0x407C, 0x0042, 0x3FF7, 0x12B0, 0xA178, 0x12B0, 0xA154, -0x484C, 0x12AB, 0x403C, 0x3401, 0x12A9, 0x464C, 0x4B20, 0x403C, 0x0003, -0x1292, 0x1230, 0x410C, 0x503C, 0x002E, 0x462F, 0x4F10, 0x0010, 0x4C0A, -0x4D0B, 0x4E08, 0x4039, 0x1360, 0x4036, 0x1358, 0x4037, 0x1354, 0x4130, -0x434C, 0x12B0, 0xD740, 0x407C, 0x0028, 0x12A7, 0x4C4A, 0x903A, 0x0095, -0x4130, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x0012, 0x4214, 0x1112, -0x4410, 0x000E, 0x12B0, 0xD314, 0x403C, 0x4030, 0x12AB, 0x12B0, 0x80DC, -0x421C, 0x13AA, 0x4130, 0x407C, 0x00C1, 0x12A6, 0x4A0C, 0x430D, 0x1292, -0x135A, 0x407C, 0x00A1, 0x4620, 0x430F, 0x430E, 0x423D, 0x410C, 0x503C, -0x0010, 0x4215, 0x1112, 0x4510, 0x000E, 0x12B0, 0xD140, 0x407C, 0x00C1, -0x12B0, 0x817E, 0x12B0, 0x813E, 0x430C, 0x4130, 0x407C, 0x00C1, 0x12AB, -0x403C, 0x0182, 0x430D, 0x1292, 0x135A, 0x435C, 0x4820, 0x12B0, 0x811C, -0x464C, 0x12A8, 0x403C, 0x3401, 0x12AB, 0x494C, 0x4820, 0x434C, 0x12A7, -0x494C, 0x12A8, 0x403C, 0x2401, 0x12A6, 0x435C, 0x4720, 0x403C, 0x0003, -0x1292, 0x118C, 0x4C08, 0x4B0C, 0x4A2F, 0x4F10, 0x0010, 0x4C0F, 0x5D0F, -0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, 0x23FB, 0x4130, 0x12A6, 0x403C, -0x2401, 0x12A9, 0x407C, 0x0021, 0x12A6, 0x435C, 0x4820, 0x403C, 0x3FFD, -0x12AB, 0x434C, 0x12AA, 0x454C, 0x12A8, 0x435C, 0x4A20, 0x9382, 0x1398, -0x2403, 0x403C, 0x0FF6, 0x4130, 0x403C, 0x018C, 0x4130, 0x12A8, 0x12B0, -0xD756, 0x12AB, 0x403C, 0x3FFD, 0x12A8, 0x434C, 0x4B20, 0x12B0, 0xD9E4, -0x434C, 0x12A6, 0x407C, 0x0042, 0x12A9, 0x430C, 0x4820, 0x407C, 0x00C1, -0x12AA, 0x411C, 0x0004, 0x12A8, 0x407C, 0x00A1, 0x4A20, 0x434C, 0x12A9, -0x474C, 0x12AA, 0x403C, 0x2401, 0x12AB, 0x435C, 0x4920, 0x430F, 0x430E, -0x422D, 0x410C, 0x503C, 0x000C, 0x4B27, 0x4710, 0x000E, 0x12A9, 0x434C, -0x12A7, 0x444C, 0x12AB, 0x435C, 0x12A7, 0x464C, 0x4B20, 0x403C, 0x0003, -0x1292, 0x11E0, 0x4C0A, 0x480C, 0x4B2F, 0x4F10, 0x0010, 0x4C0D, 0x411C, -0x0002, 0x12B0, 0x9E8C, 0x4C0A, 0x4D0B, 0x9305, 0x4130, 0x4135, 0x4134, -0x4137, 0x4136, 0x4139, 0x4138, 0x413B, 0x413A, 0x4130, 0x407C, 0x0021, -0x12A9, 0x430C, 0x430D, 0x1292, 0x135A, 0x435C, 0x4130, 0x430F, 0x430E, -0x422D, 0x410C, 0x503C, 0x000C, 0x4A28, 0x4810, 0x000E, 0x120C, 0x4EFC, -0x0000, 0x531C, 0x831D, 0x23FB, 0x413C, 0x4130, 0x12B0, 0xD196, 0x4C0A, -0xF03A, 0x0F00, 0x503A, 0x0080, 0x4130, 0x435C, 0x12B0, 0xD47C, 0x4A4C, -0x421F, 0x1112, 0x4F10, 0x0004, 0x4B4C, 0x12AA, 0x403C, 0x3401, 0x12A8, -0x407C, 0x0082, 0x4A20, 0x120C, 0x438C, 0x0000, 0x532C, 0x831E, 0x23FB, -0x413C, 0x4130, 0x403C, 0x113E, 0x421F, 0x1112, 0x129F, 0x0016, 0x430C, -0x4130, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x5C0C, 0x4130, -0x934C, 0x2403, 0xD3E2, 0x0031, 0x4130, 0xC3E2, 0x0031, 0x4130, 0x434C, -0x12A6, 0x4B4C, 0x12AA, 0x12B0, 0xD9FC, 0x435C, 0x4620, 0x12A8, 0x434C, -0x12AB, 0x407C, 0x0042, 0x12A9, 0x435C, 0x4B20, 0x403C, 0x0003, 0x1292, -0x122C, 0x470C, 0x4A2F, 0x4F10, 0x0010, 0x430D, 0x1292, 0x135A, 0x435C, -0x12AA, 0x407C, 0x00A1, 0x4B20, 0x12A8, 0x434C, 0x12AB, 0x407C, 0x0042, -0x12A9, 0x435C, 0x4B20, 0x434C, 0x12A9, 0x474C, 0x12A8, 0x403C, 0x2401, -0x4620, 0x12B0, 0xD7A4, 0x435C, 0x12A8, 0x407C, 0x0082, 0x4920, 0x423D, -0x12B0, 0xD454, 0x410F, 0x503F, 0x002C, 0x4130, 0x4A0C, 0x4B0D, 0x12B0, -0xD196, 0xF03C, 0x0F00, 0x4130, 0x490C, 0x1292, 0x1244, 0x460C, 0x4B2F, -0x4F10, 0x0010, 0x430F, 0x431E, 0x4A0D, 0x480C, 0x4B27, 0x4710, 0x000E, -0x430F, 0x430E, 0x423D, 0x410C, 0x503C, 0x0012, 0x4130, 0x423D, 0x12B0, -0xD454, 0x410F, 0x503F, 0x0034, 0x4130, 0x12A9, 0x434C, 0x12A7, 0x444C, -0x12AB, 0x435C, 0x4720, 0x403C, 0x3FFD, 0x12AB, 0x434C, 0x12AA, 0x444C, -0x4820, 0x12A9, 0x434C, 0x12A7, 0x444C, 0x12AB, 0x435C, 0x4720, 0x4038, -0x1360, 0x4039, 0x1358, 0x4036, 0x1354, 0x4130, 0x12A8, 0x12B0, 0xC172, -0x4C0F, 0xDD0F, 0x930F, 0x4130, 0x423D, 0x12B0, 0xD454, 0x410F, 0x503F, -0x0024, 0x4130, 0x435C, 0x421F, 0x1112, 0x129F, 0x0004, 0x430C, 0x4130, -0x434C, 0x12AA, 0x494C, 0x12AB, 0x403C, 0x2401, 0x4820, 0x12A9, 0x4A4C, -0x12A8, 0x434C, 0x12AB, 0x435C, 0x4B20, 0x12A8, 0x4C07, 0x454C, 0x12AA, -0x403C, 0x0088, 0x4820, 0x434C, 0x12A9, 0x407C, 0x0042, 0x12AA, 0x435C, -0x4920, 0x12B0, 0xDA1C, 0x435C, 0x12AB, 0x434C, 0x4B20, 0x474C, 0x12A8, -0x430C, 0x430D, 0x4210, 0x135A, 0x407C, 0x0048, 0x12A8, 0x427C, 0x4210, -0x1356, 0x407C, 0x00B0, 0x12A8, 0x432C, 0x430D, 0x4920, 0x407C, 0x00C8, -0x12A8, 0x403C, 0x0501, 0x4B20, 0x421F, 0x1112, 0x129F, 0x0018, 0x930C, -0x4130, 0x435C, 0x12A8, 0x434C, 0x12A8, 0x435C, 0x4820, 0x407C, 0x00F4, -0x12A7, 0x403C, 0x4020, 0x4620, 0x403C, 0x0080, 0x12A8, 0x403C, 0x0880, -0x4820, 0x407C, 0x0088, 0x12AB, 0x407C, 0x0034, 0x4420, 0x440C, 0x440D, -0xE33D, 0x5D0D, 0x7D0D, 0x4720, 0x1292, 0x2754, 0x1292, 0x134E, 0x4210, -0x1350, 0x12B0, 0xCF3E, 0x454C, 0x12AA, 0x435C, 0x4620, 0x934E, 0x2403, -0x5C0C, 0x835E, 0x23FD, 0x4130, 0x12B0, 0xD5A6, 0x435C, 0x12AA, 0x464C, -0x4820, 0x440C, 0x430D, 0x12AB, 0x430C, 0x430D, 0x4B20, 0x403C, 0x0080, -0x12A8, 0x403C, 0x0880, 0x4820, 0x128F, 0x430C, 0x430D, 0x462F, 0x4F10, -0x000A, 0x421F, 0x1112, 0x129F, 0x0016, 0x930C, 0x4130, 0x12B0, 0xCA50, -0x2802, 0x430C, 0x430D, 0x4130, 0x12A8, 0x434C, 0x12A6, 0x407C, 0x0042, -0x4A20, 0x403C, 0x0500, 0x12A9, 0x407C, 0x00C1, 0x4B20, 0x490C, 0x12A8, -0x407C, 0x0028, 0x4A20, 0x1284, 0x1292, 0x134E, 0x4210, 0x1350, 0xD03A, -0x0040, 0x4A0C, 0x430D, 0x4B20, 0x12AB, 0x434C, 0x12AB, 0x435C, 0x4130, -0x5392, 0x14A0, 0xC392, 0x0160, 0x1300, 0x462F, 0x129F, 0x0016, 0x930C, -0x4130, 0x12B0, 0xD4E4, 0x407C, 0x0082, 0x4920, 0x4A2F, 0x129F, 0x0016, -0x930C, 0x4130, 0x407C, 0x0028, 0x12A8, 0x430C, 0x4920, 0x474C, 0x12AB, -0x403C, 0x2401, 0x4820, 0x474C, 0x12AB, 0x403C, 0x3400, 0x4820, 0x434C, -0x12A8, 0x407C, 0x0042, 0x4920, 0x434C, 0x12A7, 0x407C, 0x00C8, 0x4920, -0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x12AA, 0x434C, 0x12A8, 0x435C, -0x4820, 0x430D, 0x12A9, 0x430C, 0x430D, 0x4920, 0x407C, 0x0028, 0x12AA, -0x430C, 0x4820, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x4620, 0x430D, 0x12A9, -0x431C, 0x430D, 0x4920, 0x434C, 0x12AB, 0x407C, 0x00C8, 0x4920, 0x12A6, -0x434C, 0x12A8, 0x435C, 0x4820, 0x434C, 0x12A8, 0x407C, 0x00C8, 0x4620, -0x434C, 0x12A9, 0x407C, 0x00C8, 0x4A20, 0x434C, 0x12AB, 0x407C, 0x00C8, -0x4920, 0x12A8, 0x435C, 0x12AB, 0x434C, 0x4B20, 0x464C, 0x12A8, 0x403C, -0x0401, 0x4920, 0x12B0, 0xCFCE, 0x407C, 0x00C8, 0x4130, 0x4036, 0x1358, -0x403C, 0x3401, 0x4620, 0x494C, 0x12A8, 0x403C, 0x3FFF, 0x4B20, 0x4C05, -0x460C, 0x4B2F, 0x4F10, 0x0010, 0x12A9, 0x434C, 0x12AB, 0x464C, 0x4820, -0x403C, 0x0C04, 0x430D, 0x4210, 0x14A6, 0x407C, 0x0042, 0x12A8, 0x435C, -0x4920, 0x407C, 0x0090, 0x12A6, 0x432C, 0x4720, 0x4C05, 0x440C, 0x482F, -0x4F10, 0x0010, 0x4B2F, 0x129F, 0x0016, 0x930C, 0x4130, 0x454C, 0x12AA, -0x403C, 0x0082, 0x4820, 0x431C, 0x1292, 0x275A, 0x430C, 0x4B20, 0x403C, -0x0080, 0x462F, 0x4F10, 0x0008, 0x12B0, 0xD8D4, 0x930C, 0x4130, 0x12B0, -0x4802, 0x430C, 0x4130, 0x43D2, 0x1140, 0x430C, 0x4130, 0x421F, 0x1112, -0x4F10, 0x0016, 0x12A9, 0x407C, 0x0082, 0x4820, 0x12B0, 0xD8D4, 0x933C, -0x4130, 0x12B0, 0x8F12, 0x435C, 0x4A20, 0x494C, 0x12AA, 0x435C, 0x4620, -0x12B0, 0xA156, 0x434C, 0x4720, 0x421F, 0x1112, 0x4F10, 0x0008, 0x12B0, -0xD91C, 0x430C, 0x4820, 0x434C, 0x12A9, 0x435C, 0x4920, 0x434C, 0x12A6, -0x435C, 0x4620, 0x12B0, 0xD944, 0x933C, 0x4130, 0x1292, 0x2748, 0x430C, -0x4130, 0x4A4C, 0x12A8, 0x435C, 0x4B20, 0x435C, 0x12A6, 0x434C, 0x4620, -0x421F, 0x1112, 0x4F10, 0x0016, 0x12B0, 0xD944, 0x930C, 0x4130, 0x407C, -0x0086, 0x4210, 0x1354, 0x12B0, 0xD7FE, 0x434C, 0x4820, 0x12AA, 0x407C, -0x0082, 0x4920, 0x434C, 0x12A9, 0x435C, 0x4920, 0x12B0, 0xD7C2, 0x434C, -0x4820, 0x421F, 0x1112, 0x4F10, 0x0014, 0x12B0, 0xD620, 0x484C, 0x4A20, -0x434C, 0x12A9, 0x474C, 0x4A20, 0x1292, 0x2756, 0x430C, 0x4130, 0x435C, -0x12A9, 0x434C, 0x4920, 0x421F, 0x1112, 0x4F10, 0x0014, 0x434C, 0x12A6, -0x435C, 0x4620, 0x435C, 0x12A6, 0x434C, 0x4620, 0x12AB, 0x407C, 0x00C8, -0x4920, 0x4B0C, 0x12AA, 0x430C, 0x4A20, 0x12B0, 0xCFEE, 0x435C, 0x4620, -0x435C, 0x12A6, 0x434C, 0x4620, 0x434C, 0x1286, 0x4210, 0x134E, 0x430D, -0x12A5, 0x435C, 0x4620, 0x454C, 0x12AA, 0x430C, 0x4820, 0x434C, 0x12A9, -0x435C, 0x4920, 0x407C, 0x0024, 0x4210, 0x1356, 0x430C, 0x4210, 0x1358, -0x12A6, 0x434C, 0x4920, 0x4CC2, 0x007C, 0x4130, 0x12A7, 0x430C, 0x4720, -0x12A9, 0x434C, 0x4B20, 0x4B2F, 0x4F10, 0x0016, 0x12AB, 0x430C, 0x4B20, -0x431C, 0x4130, 0x4030, 0xD1A2, 0x430C, 0x4130, 0x5137, -}; - -const unsigned long halImage_address[] = -{ -0x0000250A, 0x0000251E, 0x0000253A, 0x00002748, 0x0000DFFE, -}; -const unsigned long halImage_length_of_sections[] = -{ -0x00000002, 0x00000001, 0x000000A5, 0x00005979, 0x00000001, -}; -const unsigned long halImage_sections = 0x00000005; -const unsigned long halImage_termination = 0x00000000; -const unsigned long halImage_start = 0x0000250A; -const unsigned long halImage_finish = 0x0000E000; -const unsigned long halImage_length = 0x0000BAF6; - -#define HALIMAGE_TERMINATION 0x00000000 -#define HALIMAGE_START 0x0000250A -#define HALIMAGE_FINISH 0x0000E000 -#define HALIMAGE_LENGTH 0x0000BAF6 -#define HALIMAGE_SECTIONS 0x00000005 diff --git a/Bios/src/hal/global_variables.h b/Bios/src/hal/global_variables.h new file mode 100644 index 0000000..8fc1802 --- /dev/null +++ b/Bios/src/hal/global_variables.h @@ -0,0 +1,70 @@ +/* + * global_variables.h + * + * + * + * Copyright (C) 2012 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. + */ + +//! \ingroup MODULHAL +//! \file global_variables.h +//! +//! + +#if defined(eZ_FET) || defined(MSP_FET) +#include "stream.h" +#pragma inline=forced +unsigned short* getTargetRunningVar(void) +{ + unsigned short* syncWithRunVarAddress; + if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_SYNC_RUN, &syncWithRunVarAddress)) + { + return syncWithRunVarAddress; + } + return 0; +} + +#endif + + + +#ifdef MSP430_UIF + +extern unsigned short targetIsRunning; + +#pragma inline=forced +unsigned short* getTargetRunningVar(void) +{ + return &targetIsRunning; +} + +#endif diff --git a/Bios/src/hal/hal.c b/Bios/src/hal/hal.c deleted file mode 100644 index 0fbcf9f..0000000 --- a/Bios/src/hal/hal.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * hal.c - * - * - * - * Copyright (C) 2012 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. - */ - - -//! \ingroup MODULHAL -//! \file hal.c -//! \author Detlef Fink (09/21/2010) -//! - -#include "hw_compiler_specific.h" -#include "HalGlobalVars.h" -#include "edt.h" -#include "hal.h" -#include "hal_ref.h" -#include "stream.h" -#include "string.h" - - -// global variables to handle JTAG chain -VAR_AT(union _chain_Configuration chain_Configuration[32], HAL_ADDR_VAR_CHAIN_CONFIGURATION); -REQUIRED(chain_Configuration) -VAR_AT(unsigned short activeDevice, HAL_ADDR_VAR_ACTIVE_DEVICE); -REQUIRED(activeDevice) -VAR_AT(unsigned char numOfDevices, HAL_ADDR_VAR_NUM_OF_DEVICES); -REQUIRED(numOfDevices) -VAR_AT(unsigned short TCE, HAL_ADDR_VAR_TCE); -REQUIRED(TCE) -VAR_AT(DeviceSettings deviceSettings, HAL_ADDR_VAR_DEVICE_SETTINGS); -REQUIRED(deviceSettings) -VAR_AT(DevicePowerSettings devicePowerSettings, HAL_ADDR_VAR_DEVICE_POWER_SETTINGS); -REQUIRED(devicePowerSettings) -VAR_AT(unsigned short altRomAddressForCpuRead, HAL_ADDR_VAR_ROM_FOR_CPU_READ); -REQUIRED(altRomAddressForCpuRead) - -// global variables to handle Emulation clock control -VAR_AT(unsigned short _hal_mclkCntrl0, HALL_ADDR_VAR_HAL_MCLK_CNTRL0); -REQUIRED(_hal_mclkCntrl0) -VAR_AT(HalRec hal_functions_[HAL_FUNCTIONS_SIZE], HAL_ADDR_VAR_HAL_FUNCTION); - -#define MACRO(x) {ID_##x, (void*)_hal_##x }, -CONST_AT(HalRec hal_functions_default_[HAL_FUNCTIONS_DEFAULT_SIZE], HAL_ADDR_CONST_HAL_FUNCTION_DEFAULTS) = -{ - MACRO(Zero) - MACRO_LIST -}; -#undef MACRO - -/* -CONST_AT(HalRec hal_functions_default_[HAL_FUNCTIONS_DEFAULT_SIZE], HAL_ADDR_CONST_HAL_FUNCTION_DEFAULTS) = -{ - { 0x00, (void*)_hal_Zero }, - { 0x01, (void*)_hal_Init }, - { 0x02, (void*)_hal_SetVcc }, - { 0x03, (void*)_hal_GetVcc }, - { 0x04, (void*)_hal_StartJtag }, - { 0x05, (void*)_hal_StopJtag }, - { 0x06, (void*)_hal_Configure }, - { 0x06, (void*)_hal_GetFuses }, - { 0x07, (void*)_hal_BlowFuse }, - { 0x08, (void*)_hal_WaitForEem }, - { 0x09, (void*)_hal_BitSequence }, - { 0x0A, (void*)_hal_GetJtagId }, - { 0x0B, (void*)_hal_SetDeviceChainInfo }, - { 0x0C, (void*)_hal_SetChainConfiguration }, - { 0x0D, (void*)_hal_GetNumOfDevices }, - { 0x0E, (void*)_hal_GetInterfaceMode}, - // MSP430 architecture - { 0x0E, (void*)_hal_SyncJtag_AssertPor_SaveContext }, - { 0x0F, (void*)_hal_SyncJtag_Conditional_SaveContext }, - { 0x10, (void*)_hal_RestoreContext_ReleaseJtag }, - { 0x11, (void*)_hal_ReadMemBytes }, - { 0x12, (void*)_hal_ReadMemWords }, - { 0x13, (void*)_hal_ReadMemQuick }, - { 0x14, (void*)_hal_WriteMemBytes }, - { 0x15, (void*)_hal_WriteMemWords }, - { 0x16, (void*)_hal_WriteMemQuick }, - { 0x17, (void*)_hal_EemDataExchange }, - { 0x18, (void*)_hal_SingleStep }, - { 0x19, (void*)_hal_ReadAllCpuRegs }, - { 0x1A, (void*)_hal_WriteAllCpuRegs }, - { 0x1B, (void*)_hal_Psa }, - { 0x1C, (void*)_hal_SetFrequency }, - { 0x1D, (void*)_hal_EraseFlash }, - { 0x1E, (void*)_hal_WriteFlashBlock }, - { 0x1F, (void*)_hal_WriteFlashWord }, - { 0x20, (void*)_hal_ExecFunclet }, - // MSP430X architecture - { 0x21, (void*)_hal_SyncJtag_AssertPor_SaveContextX }, - { 0x22, (void*)_hal_SyncJtag_Conditional_SaveContextX }, - { 0x23, (void*)_hal_RestoreContext_ReleaseJtagX }, - { 0x24, (void*)_hal_ReadMemBytesX }, - { 0x25, (void*)_hal_ReadMemWordsX }, - { 0x26, (void*)_hal_ReadMemQuickX }, - { 0x27, (void*)_hal_WriteMemBytesX }, - { 0x28, (void*)_hal_WriteMemWordsX }, - { 0x29, (void*)_hal_WriteMemQuickX }, - { 0x2A, (void*)_hal_EemDataExchangeX }, - { 0x2B, (void*)_hal_SingleStepX }, - { 0x2C, (void*)_hal_ReadAllCpuRegsX }, - { 0x2D, (void*)_hal_WriteAllCpuRegsX }, - { 0x2E, (void*)_hal_PsaX }, - { 0x2F, (void*)_hal_SetFrequencyX }, - { 0x30, (void*)_hal_EraseFlashX }, - { 0x31, (void*)_hal_WriteFlashBlockX }, - { 0x32, (void*)_hal_WriteFlashWordX }, - { 0x33, (void*)_hal_ExecFuncletX }, - // MSP430Xv2 architecture - { 0x34, (void*)_hal_SyncJtag_AssertPor_SaveContextXv2 }, - { 0x35, (void*)_hal_SyncJtag_Conditional_SaveContextXv2 }, - { 0x36, (void*)_hal_RestoreContext_ReleaseJtagXv2 }, - { 0x37, (void*)_hal_ReadMemBytesXv2 }, - { 0x38, (void*)_hal_ReadMemWordsXv2 }, - { 0x39, (void*)_hal_ReadMemQuickXv2 }, - { 0x3A, (void*)_hal_WriteMemBytesXv2 }, - { 0x3B, (void*)_hal_WriteMemWordsXv2 }, - { 0x3C, (void*)_hal_WriteMemQuickXv2 }, - { 0x3D, (void*)_hal_EemDataExchangeXv2 }, - { 0x3E, (void*)_hal_SingleStepXv2 }, - { 0x3F, (void*)_hal_ReadAllCpuRegsXv2 }, - { 0x40, (void*)_hal_WriteAllCpuRegsXv2 }, - { 0x41, (void*)_hal_PsaXv2 }, - { 0x42, (void*)_hal_SetFrequencyXv2 }, - { 0x43, (void*)_hal_EraseFlashXv2 }, - { 0x44, (void*)_hal_WriteFlashBlockXv2 }, - { 0x45, (void*)_hal_WriteFlashWordXv2 }, - { 0x46, (void*)_hal_ExecFuncletXv2 }, - { 0x47, (void*)_hal_ExecuteFuncletXv2 }, - { 0x48, (void*)_hal_UnlockDeviceXv2 }, -};*/ - -REQUIRED(_init_Hal) - - -void _init_Hal(void) -{ - unsigned char i; - - for(i=0; i < (sizeof(hal_functions_)/sizeof(HalRec)); i++) - { - if(i < (sizeof(hal_functions_default_)/sizeof(HalRec))) - { - hal_functions_[i].id = hal_functions_default_[i].id; - hal_functions_[i].function = hal_functions_default_[i].function; - } - else - { - hal_functions_[i].id = 0xFFFF; - hal_functions_[i].function = NULL; - } - } -} - -HAL_FUNCTION(_hal_Zero) -{ - return 0; -} - -HAL_FUNCTION(_hal_Init) -{ - EDT_Init(); - return 0; -} - -HAL_FUNCTION(_hal_SetVcc) -{ - unsigned short vcc; - STREAM_get_word(&vcc); - EDT_SetVcc(vcc); - return 0; -} - -HAL_FUNCTION(_hal_GetVcc) -{ - unsigned short vcc = 0; - unsigned short ext_vcc = 0; - - EDT_GetVcc(&vcc, &ext_vcc); - STREAM_put_word(vcc); - STREAM_put_word(ext_vcc); - return 0; -} - -HAL_FUNCTION(_hal_GetFuses) -{ - decl_out - config_fuses - - SetReg_8Bits(0); - STREAM_put_byte((unsigned char)lOut); - return 0; -} - -/* EOF */ diff --git a/Bios/src/hal/hal_ref.h b/Bios/src/hal/hal_ref.h index bd790ad..1608eb9 100644 --- a/Bios/src/hal/hal_ref.h +++ b/Bios/src/hal/hal_ref.h @@ -3,42 +3,42 @@ * * * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ //! \ingroup MODULHAL //! \file hal_ref.h -//! -//! +//! +//! #ifndef _HAL_REF_H_ #define _HAL_REF_H_ @@ -48,7 +48,7 @@ * HAL Function Prototypes */ #define MACRO(x) short _hal_##x (unsigned short flags); -MACRO(Zero) +MACRO(Zero) MACRO_LIST #undef MACRO @@ -60,8 +60,8 @@ void _init_Hal(void); // common macros #define HAL_Zero ((HalFuncInOut)hal_functions_[ID_Zero].function) #define HAL_Init ((HalFuncInOut)hal_functions_[ID_Init].function) -#define HAL_SetVcc ((HalFuncInOut)hal_functions_[ID_SetVcc].function) -#define HAL_GetVcc ((HalFuncInOut)hal_functions_[ID_GetVcc].function) +//#define HAL_SetVcc ((HalFuncInOut)hal_functions_[ID_SetVcc].function) +//#define HAL_GetVcc ((HalFuncInOut)hal_functions_[ID_GetVcc].function) #define HAL_StartJtag ((HalFuncInOut)hal_functions_[ID_StartJtag].function) #define HAL_StartJtagActivationCode ((HalFuncInOut)hal_functions_[ID_StartJtagActivationCode].function) #define HAL_StopJtag ((HalFuncInOut)hal_functions_[ID_StopJtag].function) @@ -125,7 +125,9 @@ void _init_Hal(void); #define HAL_UnlockC092 ((HalFuncInOut)hal_functions_[ID_UnlockC092].function) #define HAL_HilCommand ((HalFuncInOut)hal_functions_[ID_HilCommand].function) #define HAL_PollJStateRegFR57xx ((HalFuncInOut)hal_functions_[ID_PollJStateRegFR57xx].function) -#define HAL_PollJStateReg ((HalFuncInOut)hal_functions_[ID_PollJStateReg].function) +#define Hal_PollDStatePCRegEt ((HalFuncInOut)hal_functions_[ID_PollDStatePCRegEt].function) +#define Hal_PollJStateRegEt8 ((HalFuncInOut)hal_functions_[ID_PollJStateRegEt8].function) +#define Hal_PollJStateReg ((HalFuncInOut)hal_functions_[ID_PollJStateReg].function) #define HAL_IsJtagFuseBlown ((HalFuncInOut)hal_functions_[ID_IsJtagFuseBlown].function) #define HAL_ResetXv2 ((HalFuncInOut)hal_functions_[ID_ResetXv2].function) @@ -136,7 +138,10 @@ void _init_Hal(void); #define HAL_WriteFramQuickXv2 ((HalFuncInOut)hal_functions_[ID_WriteFramQuickXv2].function) #define HAL_SendJtagMailboxXv2 ((HalFuncInOut)hal_functions_[ID_SendJtagMailboxXv2].function) -#define HAL_ReadAllCpuRegsNon1377Xv2 ((HalFuncInOut)hal_functions_[ID_ReadAllCpuRegsNon1377Xv].function) -#define HAL_SingleStepJStateXv2 ((HalFuncInOut)hal_functions_[ID_SingleStepJStateXv2].function) +#define HAL_ReadAllCpuRegsNon1377Xv2 ((HalFuncInOut)hal_functions_[ID_ReadAllCpuRegsNon1377Xv].function) +#define HAL_SingleStepJStateXv2 ((HalFuncInOut)hal_functions_[ID_SingleStepJStateXv2].function) +#define HAL_ResetMsp430I ((HalFuncInOut)hal_functions_[ID_ResetMsp430I].function) +#define HAL_PollMSP430I40xx ((HalFuncInOut)hal_functions_[ID_PollMSP430I40xx].function) + +#define HAL_LeaSyncConditional ((HalFuncInOut)hal_functions_[ID_LeaSyncConditional].function) #endif - \ No newline at end of file diff --git a/Bios/src/hal/macros/BitSequence.c b/Bios/src/hal/macros/BitSequence.c index 43c7910..dc97e38 100644 --- a/Bios/src/hal/macros/BitSequence.c +++ b/Bios/src/hal/macros/BitSequence.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -78,85 +78,112 @@ Bit 15- ------ */ +#define PinTMS 0x01 //Bit0 +#define PinTDI 0x02 //Bit1 +#define PinTDO 0x04 //Bit2 +#define PinTCK 0x08 //Bit3 +#define PinTGTRST 0x040 //Bit6 +#define PinTest 0x0100 //Bit8 + HAL_FUNCTION(_hal_BitSequence) { unsigned char numBitSequences; unsigned short writeBits; unsigned short maskBits; unsigned short delay; - unsigned char jtagPortOutput = 0; -// unsigned char controlPortOutput = 0; - unsigned char testPortOutput = 0; if(STREAM_get_byte(&numBitSequences) < 0) { return HALERR_NO_NUM_BITS; } - + while(numBitSequences) { if(STREAM_get_word(&writeBits) < 0) { return HALERR_ARRAY_SIZE_MISMATCH; } - + if(STREAM_get_word(&maskBits) < 0) { return HALERR_ARRAY_SIZE_MISMATCH; } - + if(STREAM_get_word(&delay) < 0) { return HALERR_ARRAY_SIZE_MISMATCH; } - + // Set reset bit using macros - automatically handles SBW/JTAG mode - if(maskBits & 0x0040) + if(maskBits & PinTGTRST) + { + if(writeBits & PinTGTRST) + { + IHIL_SetReset(1); + } + else + { + IHIL_SetReset(0); + } + } + + // Set test bit using macros - automatically handles SBW/JTAG mode + if(maskBits & PinTest) + { + if(writeBits & PinTest) + { + IHIL_SetTest(1); + } + else + { + IHIL_SetTest(0); + } + } + + // Set TMS bit using macros - automatically handles SBW/JTAG mode + if(maskBits & PinTMS) { - if(writeBits & 0x0040) + if(writeBits & PinTMS) { - EDT_SetReset(1); + IHIL_SetTMS(1); } else { - EDT_SetReset(0); + IHIL_SetTMS(0); } } - // Set test bit using macros - automatically handles SBW/JTAG mode - if(maskBits & 0x100) + // Set TCK bit using macros - automatically handles SBW/JTAG mode + if(maskBits & PinTCK) { - if(writeBits & 0x100) + if(writeBits & PinTCK) { - EDT_SetTest(1); + IHIL_SetTCK(1); } else { - EDT_SetTest(0); + IHIL_SetTCK(0); } } - - // Capture current output value for TMS,TDI,TDO and TCK - jtagPortOutput = EDT_GetJtagBits(); - - jtagPortOutput &= ~(maskBits & 0x000F); // Only lower 4 bits are relevant - jtagPortOutput |= (writeBits & 0x000F); - - // Decode Test control bits - testPortOutput = EDT_GetTestBits(); - - testPortOutput &= ~((maskBits & 0x7C00) >> 8); // Only bits 8,10,11,12,13 vand 14 are relevant - testPortOutput |= ((writeBits & 0x7C00) >> 8); - - // Write the resultant values to the ports - EDT_SetJtagBits(jtagPortOutput); - EDT_SetTestBits(testPortOutput); - + + // Set TDI bit using macros - automatically handles SBW/JTAG mode + if(maskBits & PinTDI) + { + if(writeBits & PinTDI) + { + IHIL_SetTDI(1); + } + else + { + IHIL_SetTDI(0); + } + } + + --numBitSequences; - - EDT_Delay_1ms(delay); + + IHIL_Delay_1ms(delay); } - return 0; } diff --git a/Bios/src/hal/macros/BlowFuse.c b/Bios/src/hal/macros/BlowFuse.c index 8a6d094..799c569 100644 --- a/Bios/src/hal/macros/BlowFuse.c +++ b/Bios/src/hal/macros/BlowFuse.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -49,7 +49,7 @@ #endif /** - BlowFuse + BlowFuse Blow JTAG security fuse. After calling this function JTAG access is not possible anymore. inData: @@ -57,15 +57,26 @@ tgtHasTest: specifies if target device has TEST pin or not (bool) */ +#if defined(MSP430_UIF) || defined(MSP_FET) HAL_FUNCTION(_hal_BlowFuse) { short ret_value = HALERR_UNDEFINED_ERROR; unsigned char hasTestVpp = 0; - + if ( STREAM_get_byte(&hasTestVpp) != -1 ) { - EDT_BlowFuse(hasTestVpp); + IHIL_BlowFuse(hasTestVpp); ret_value = 0; } return ret_value; } +#endif + +// Fuse blow disabled for of E-FET +#ifdef eZ_FET +HAL_FUNCTION(_hal_BlowFuse) +{ + // fuseblow is not supported on eZ-FET + return API_CALL_NOT_SUPPORTED; +} +#endif diff --git a/Bios/src/hal/macros/BlowFuseFram.c b/Bios/src/hal/macros/BlowFuseFram.c index f347af1..bddfc40 100644 --- a/Bios/src/hal/macros/BlowFuseFram.c +++ b/Bios/src/hal/macros/BlowFuseFram.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,6 +44,7 @@ #include "hal.h" #include "stream.h" #include "hal_ref.h" +#include "error_def.h" #ifdef DB_PRINT #include "debug.h" #endif @@ -58,6 +59,7 @@ */ //! \todo implementation & rename to jtag access protection +#if defined(MSP430_UIF) || defined(MSP_FET) HAL_FUNCTION(_hal_BlowFuseFram) { short ret_value = 0; @@ -65,11 +67,20 @@ HAL_FUNCTION(_hal_BlowFuseFram) // Write password into device WriteMemWordXv2(0xFF80,lockKey[0]); - WriteMemWordXv2(0xFF82,lockKey[1]); - + WriteMemWordXv2(0xFF82,lockKey[1]); + // now perform a BOR via JTAG - we loose control of the device then... - test_reg - SetReg_32Bits_(0x00000200); + test_reg(); + SetReg_32Bits(0x00000200); return ret_value; } +#endif + +#ifdef eZ_FET +HAL_FUNCTION(_hal_BlowFuseFram) +{ + // fuseblow is not supported on eZ-FET + return API_CALL_NOT_SUPPORTED; +} +#endif diff --git a/Bios/src/hal/macros/BlowFuseXv2.c b/Bios/src/hal/macros/BlowFuseXv2.c index e9de52f..e87a005 100644 --- a/Bios/src/hal/macros/BlowFuseXv2.c +++ b/Bios/src/hal/macros/BlowFuseXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -50,7 +50,7 @@ #endif /** - BlowFuse + BlowFuse Blow JTAG security fuse. After calling this function JTAG access is not possible anymore. inData: @@ -58,19 +58,21 @@ tgtHasTest: specifies if target device has TEST pin or not (bool) */ +extern unsigned long JTAGLock5xx; + //! \todo implementation & rename to jtag access protection +#if defined(MSP430_UIF) || defined(MSP_FET) HAL_FUNCTION(_hal_BlowFuseXv2) { - decl_out_long short ret_value = 0; short bslValue = 0; - StreamSafe stream_tmp; - unsigned char stream_in_tmp[26]; + StreamSafe stream_tmp; + unsigned char stream_in_tmp[26]; unsigned short i =0; - + WriteMemWordXv2(0x182, 0x0003); - ReadMemWordXv2(0x182, bslValue); - + bslValue = ReadMemWordXv2(0x182); + if( (bslValue & 0x8000) == 0 ) { // Coppy incoming stream to forward it to HAL_ExecuteFuncletXv2 @@ -79,19 +81,19 @@ HAL_FUNCTION(_hal_BlowFuseXv2) STREAM_get_byte(&stream_in_tmp[i]); } // add Password to stream - stream_in_tmp[i] = 0xDE; - stream_in_tmp[i+1] = 0xAD; - stream_in_tmp[i+2] = 0xBA; - stream_in_tmp[i+3] = 0xBE; - + stream_in_tmp[i] = (unsigned char) (JTAGLock5xx & 0xFF); + stream_in_tmp[i+1] = (unsigned char) ((JTAGLock5xx >> 8) & 0xFF); + stream_in_tmp[i+2] = (unsigned char) ((JTAGLock5xx >> 16) & 0xFF); + stream_in_tmp[i+3] = (unsigned char) ((JTAGLock5xx >> 24) & 0xFF); + // Write password into device STREAM_internal_stream(stream_in_tmp, sizeof(stream_in_tmp), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); HAL_ExecuteFuncletXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); // Data from DLL Stream STREAM_external_stream(&stream_tmp); - + // now perform a BOR via JTAG - we loose control of the device then... - test_reg - SetReg_32Bits_(0x00000200); + test_reg(); + SetReg_32Bits(0x00000200); } else { @@ -99,3 +101,12 @@ HAL_FUNCTION(_hal_BlowFuseXv2) } return ret_value; } +#endif + +#ifdef eZ_FET +HAL_FUNCTION(_hal_BlowFuseXv2) +{ + // fuseblow is not supported on eZ-FET + return API_CALL_NOT_SUPPORTED; +} +#endif diff --git a/Bios/src/hal/macros/Configure.c b/Bios/src/hal/macros/Configure.c index 56549c6..6fbf10c 100644 --- a/Bios/src/hal/macros/Configure.c +++ b/Bios/src/hal/macros/Configure.c @@ -3,39 +3,39 @@ * * \file Configure.c * -* \brief Set certain parameters to spcified values +* \brief Set certain parameters to spcified values * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -58,15 +58,31 @@ value: specifies the vlaue to which to set the parameter */ +#if defined(MSP430_UIF) + #ifdef ARCH_MSP432 + extern ARMConfigSettings armConfigSettings; + #endif +#endif + +#if defined(MSP_FET) + extern ARMConfigSettings armConfigSettings; +#endif + +extern ARMConfigSettings armConfigSettings; + extern DeviceSettings deviceSettings; extern DevicePowerSettings devicePowerSettings; extern unsigned short altRomAddressForCpuRead; +extern unsigned short wdtctlAddress5xx; +extern unsigned short assertBslValidBit; +extern unsigned short enhancedPsa; +unsigned long JTAGLock5xx = 0xCACACACA; HAL_FUNCTION(_hal_Configure) { unsigned long configureParameter; unsigned long value; - + // Retrieve parameters from stream if(STREAM_get_long(&configureParameter) < 0) { @@ -77,19 +93,19 @@ HAL_FUNCTION(_hal_Configure) { return (HALERR_CONFIG_NO_VALUE); } - + // Decode and parameter and set value switch(configureParameter) { case (CONFIG_PARAM_ENHANCED_PSA): - EDT_SetPsaSetup(value); + enhancedPsa = value; break; - + case (CONFIG_PARAM_PSA_TCKL_HIGH): - EDT_SetPsaTCLK(value); + IHIL_SetPsaTCLK(value); break; - - case (CONFIG_PARAM_CLK_CONTROL_TYPE): + + case (CONFIG_PARAM_CLK_CONTROL_TYPE): deviceSettings.clockControlType = value; break; @@ -99,47 +115,102 @@ HAL_FUNCTION(_hal_Configure) case (CONFIG_PARAM_POWER_TESTREG_MASK): devicePowerSettings.powerTestRegMask = value; break; - + + case (CONFIG_PARAM_POWER_TESTREG_DEFAULT): + devicePowerSettings.powerTestRegDefault = value; + break; + case (CONFIG_PARAM_TESTREG_ENABLE_LPMX5): devicePowerSettings.enableLpmx5TestReg = value; break; - + case (CONFIG_PARAM_TESTREG_DISABLE_LPMX5): devicePowerSettings.disableLpmx5TestReg = value; break; - + case (CONFIG_PARAM_POWER_TESTREG3V_MASK): devicePowerSettings.powerTestReg3VMask = value; break; - + + case (CONFIG_PARAM_POWER_TESTREG3V_DEFAULT): + devicePowerSettings.powerTestReg3VDefault = value; + break; + case (CONFIG_PARAM_TESTREG3V_ENABLE_LPMX5): devicePowerSettings.enableLpmx5TestReg3V = value; break; - + case (CONFIG_PARAM_TESTREG3V_DISABLE_LPMX5): devicePowerSettings.disableLpmx5TestReg3V = value; break; case (CONFIG_PARAM_JTAG_SPEED): - EDT_SetJtagSpeed(value); - break; + { + unsigned long sbwValue = 0; + if(STREAM_get_long(&sbwValue) < 0) + { + return (HALERR_CONFIG_NO_VALUE); + } + IHIL_SetJtagSpeed(value, sbwValue); + break; + } case (CONFIG_PARAM_SFLLDEH): deviceSettings.stopFLL = value; break; - case (CONFIG_NO_BSL): - setPCclockBeforeCapture = value; - break; - case (CONFIG_ALT_ROM_ADDR_FOR_CPU_READ): altRomAddressForCpuRead = value; break; + case (CONFIG_WDT_ADDRESS_5XX): + wdtctlAddress5xx = value; + break; + + case (CONFIG_ASSERT_BSL_VALID_BIT): + deviceSettings.assertBslValidBit = value; + break; + + case (CONFIG_PARAM_SCS_BASE_ADDRESS): +#if defined(MSP430_UIF) || defined(MSP_FET) + #ifdef ARCH_MSP432 + armConfigSettings.scsBase = value; + #endif +#endif + break; + + case (CONFIG_PARAM_FPB_BASE_ADDRESS): +#if defined(MSP430_UIF) || defined(MSP_FET) + #ifdef ARCH_MSP432 + armConfigSettings.fpbBase = value; + #endif +#endif + break; + + case (CONFIG_PARAM_INTERRUPT_OPTIONS): +#if defined(MSP430_UIF) || defined(MSP_FET) + #ifdef ARCH_MSP432 + armConfigSettings.interruptOptions = value | 0x80; + #endif +#endif + break; + + case (CONFIG_PARAM_ULP_MSP432): +#if defined(MSP430_UIF) || defined(MSP_FET) + #ifdef ARCH_MSP432 + armConfigSettings.ulpDebug = value; + #endif +#endif + break; + + case (CONFIG_PARAM_JTAG_LOCK_5XX): + JTAGLock5xx = value; + break; + default: return (CONFIG_PARAM_UNKNOWN_PARAMETER); } - + return(0); } diff --git a/Bios/src/hal/macros/DisableDebugArm.c b/Bios/src/hal/macros/DisableDebugArm.c new file mode 100644 index 0000000..bb4c1b7 --- /dev/null +++ b/Bios/src/hal/macros/DisableDebugArm.c @@ -0,0 +1,74 @@ +/* + * \ingroup MODULMACROS + * + * \file DisableDebugArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + DisableDebugArm: disables Debug +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +HAL_FUNCTION(_hal_DisableDebugArm) +{ + +#if defined(MSP430_UIF) || defined(MSP_FET) + // Disable breakpoints + unsigned long data = KEY; + if(IHIL_Write_Read_Mem_Ap(0, FP_CTRL, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + // Disable Debug + data = DBGKEY; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } +#endif + + return 0; +} diff --git a/Bios/src/hal/macros/DummyHal430.c b/Bios/src/hal/macros/DummyHal430.c new file mode 100644 index 0000000..951d649 --- /dev/null +++ b/Bios/src/hal/macros/DummyHal430.c @@ -0,0 +1,124 @@ +/** + * \ingroup MODULMACROS + * + * \file DummyHal430.c + * + * \brief Set certain parameters to spcified values + * + * Copyright (C) 2012 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. + */ + +#include "edt.h" +#include "hal.h" + +#ifdef MSP430_UIF + HAL_FUNCTION(_hal_BlowFuse) {return -1;} + HAL_FUNCTION(_hal_StartJtagActivationCode) {return -1;} + HAL_FUNCTION(_hal_WaitForEem) {return -1;} + HAL_FUNCTION(_hal_GetJtagId) {return -1;} + HAL_FUNCTION(_hal_SetDeviceChainInfo) {return -1;} + HAL_FUNCTION(_hal_SetChainConfiguration) {return -1;} + HAL_FUNCTION(_hal_GetNumOfDevices) {return -1;} + HAL_FUNCTION(_hal_GetDeviceIdPtr) {return -1;} + HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContext) {return -1;} + HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContext) {return -1;} + HAL_FUNCTION(_hal_RestoreContext_ReleaseJtag) {return -1;} + HAL_FUNCTION(_hal_ReadMemBytes) {return -1;} + HAL_FUNCTION(_hal_ReadMemWords) {return -1;} + HAL_FUNCTION(_hal_ReadMemQuick) {return -1;} + HAL_FUNCTION(_hal_WriteMemBytes) {return -1;} + HAL_FUNCTION(_hal_WriteMemWords) {return -1;} + HAL_FUNCTION(_hal_EemDataExchange) {return -1;} + HAL_FUNCTION(_hal_EemDataExchangeAFE2xx) {return -1;} + HAL_FUNCTION(_hal_SingleStep) {return -1;} + HAL_FUNCTION(_hal_ReadAllCpuRegs) {return -1;} + HAL_FUNCTION(_hal_WriteAllCpuRegs) {return -1;} + HAL_FUNCTION(_hal_Psa) {return -1;} + HAL_FUNCTION(_hal_ExecuteFunclet) {return -1;} + HAL_FUNCTION(_hal_ExecuteFuncletJtag) {return -1;} + HAL_FUNCTION(_hal_GetDcoFrequency) {return -1;} + HAL_FUNCTION(_hal_GetDcoFrequencyJtag) {return -1;} + HAL_FUNCTION(_hal_GetFllFrequency) {return -1;} + HAL_FUNCTION(_hal_GetFllFrequencyJtag) {return -1;} + HAL_FUNCTION(_hal_WaitForStorage) {return -1;} + HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextX) {return -1;} + HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextX) {return -1;} + HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagX) {return -1;} + HAL_FUNCTION(_hal_ReadMemBytesX) {return -1;} + HAL_FUNCTION(_hal_ReadMemWordsX) {return -1;} + HAL_FUNCTION(_hal_ReadMemQuickX) {return -1;} + HAL_FUNCTION(_hal_WriteMemBytesX) {return -1;} + HAL_FUNCTION(_hal_WriteMemWordsX) {return -1;} + HAL_FUNCTION(_hal_EemDataExchangeX) {return -1;} + HAL_FUNCTION(_hal_SingleStepX) {return -1;} + HAL_FUNCTION(_hal_ReadAllCpuRegsX) {return -1;} + HAL_FUNCTION(_hal_WriteAllCpuRegsX) {return -1;} + HAL_FUNCTION(_hal_PsaX) {return -1;} + HAL_FUNCTION(_hal_ExecuteFuncletX) {return -1;} + HAL_FUNCTION(_hal_GetDcoFrequencyX) {return -1;} + HAL_FUNCTION(_hal_GetFllFrequencyX) {return -1;} + HAL_FUNCTION(_hal_WaitForStorageX) {return -1;} + HAL_FUNCTION(_hal_BlowFuseXv2) {return -1;} + HAL_FUNCTION(_hal_BlowFuseFram) {return -1;} + HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextXv2) {return -1;} + HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2){return -1;} + HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagXv2) {return -1;} + HAL_FUNCTION(_hal_ReadMemWordsXv2) {return -1;} + HAL_FUNCTION(_hal_ReadMemQuickXv2) {return -1;} + HAL_FUNCTION(_hal_WriteMemWordsXv2) {return -1;} + HAL_FUNCTION(_hal_EemDataExchangeXv2) {return -1;} + HAL_FUNCTION(_hal_SingleStepXv2) {return -1;} + HAL_FUNCTION(_hal_ReadAllCpuRegsXv2) {return -1;} + HAL_FUNCTION(_hal_WriteAllCpuRegsXv2) {return -1;} + HAL_FUNCTION(_hal_PsaXv2) {return -1;} + HAL_FUNCTION(_hal_ExecuteFuncletXv2) {return -1;} + HAL_FUNCTION(_hal_UnlockDeviceXv2) {return -1;} + HAL_FUNCTION(_hal_MagicPattern) {return -1;} + HAL_FUNCTION(_hal_UnlockC092) {return -1;} + HAL_FUNCTION(_hal_PollJStateReg) {return -1;} + HAL_FUNCTION(_hal_PollJStateRegFR57xx) {return -1;} + HAL_FUNCTION(_hal_IsJtagFuseBlown) {return -1;} + HAL_FUNCTION(_hal_ResetXv2) {return -1;} + HAL_FUNCTION(_hal_WriteFramQuickXv2) {return -1;} + HAL_FUNCTION(_hal_SendJtagMailboxXv2) {return -1;} + HAL_FUNCTION(_hal_SingleStepJStateXv2) {return -1;} + HAL_FUNCTION(_hal_PollJStateRegEt8) {return -1;} + HAL_FUNCTION(_hal_Reset430I) {return -1;} + HAL_FUNCTION(_hal_PollJStateReg430I) {return -1;} + HAL_FUNCTION(_hal_PollJStateReg20) {return -1;} + HAL_FUNCTION(_hal_ResetL092) {return -1;} + HAL_FUNCTION(_hal_Reset5438Xv2) {return -1;} + HAL_FUNCTION(_hal_LeaSyncConditional) {return -1;} + HAL_FUNCTION(_hal_PollDStatePCRegEt) {return -1;} + HAL_FUNCTION(_hal_UssSyncConditional) {return -1;} +#endif + diff --git a/Bios/src/hal/macros/DummyHal432.c b/Bios/src/hal/macros/DummyHal432.c new file mode 100644 index 0000000..3409b31 --- /dev/null +++ b/Bios/src/hal/macros/DummyHal432.c @@ -0,0 +1,61 @@ +/** + * \ingroup MODULMACROS + * + * \file DummyHal432.c + * + * \brief Set certain parameters to spcified values + * + * Copyright (C) 2012 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. + */ + +#include "edt.h" +#include "hal.h" + +#ifdef MSP430_UIF + HAL_FUNCTION(_hal_WriteAllCpuRegsArm) {return -1;} + HAL_FUNCTION(_hal_WaitForDebugHaltArm) {return -1;} + HAL_FUNCTION(_hal_SingleStepArm) {return -1;} + HAL_FUNCTION(_hal_ScanApArm) {return -1;} + HAL_FUNCTION(_hal_RunArm) {return -1;} + HAL_FUNCTION(_hal_ResetArm) {return -1;} + HAL_FUNCTION(_hal_ReadAllCpuRegsArm) {return -1;} + HAL_FUNCTION(_hal_MemApTransactionArm) {return -1;} + HAL_FUNCTION(_hal_HaltArm) {return -1;} + HAL_FUNCTION(_hal_GetJtagIdCodeArm) {return -1;} + HAL_FUNCTION(_hal_EnableDebugArm) {return -1;} + HAL_FUNCTION(_hal_DisableDebugArm) {return -1;} + HAL_FUNCTION(_hal_MemApTransactionArmSwd) {return -1;} + HAL_FUNCTION(_hal_GetInterfaceModeArm) {return -1;} + HAL_FUNCTION(_hal_GetCpuIdArm) {return -1;} + HAL_FUNCTION(_hal_CheckDapLockArm) {return -1;} + HAL_FUNCTION(_hal_UnlockDap) {return -1;} +#endif diff --git a/Bios/src/hal/macros/EemDataExchange.c b/Bios/src/hal/macros/EemDataExchange.c index d61c801..46024eb 100644 --- a/Bios/src/hal/macros/EemDataExchange.c +++ b/Bios/src/hal/macros/EemDataExchange.c @@ -8,38 +8,38 @@ */ /* * EemDataExchange.c - * + * * * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -65,38 +65,37 @@ extern unsigned short lastTraceWritePos; HAL_FUNCTION(_hal_EemDataExchange) { - decl_out unsigned char NumberOfExchanges; - unsigned char tmp_char; - unsigned short tmp_uint; - + unsigned char tmp_char; + unsigned short tmp_uint; + STREAM_get_byte(&NumberOfExchanges); - eem_data_exchange - + eem_data_exchange(); + while(NumberOfExchanges) { STREAM_get_byte(&tmp_char); if(tmp_char & 0x01) { // read access SetReg_16Bits(tmp_char); // load address - SetReg_16Bits(0); // shift in dummy 0 - STREAM_put_word(lOut); // put output into stream + // shift in dummy 0 + STREAM_put_word(SetReg_16Bits(0)); // put output into stream } else { // write access STREAM_get_word(&tmp_uint); SetReg_16Bits(tmp_char); // load address SetReg_16Bits(tmp_uint); // shift in value - + //Reset when state storage is reset - if (tmp_char == 0x9E && tmp_uint & 0x40) + if ((tmp_char == 0x9E) && (tmp_uint & 0x40)) { lastTraceWritePos = 0; } } NumberOfExchanges--; } - + return 0; } diff --git a/Bios/src/hal/macros/EemDataExchangeAFE2xx.c b/Bios/src/hal/macros/EemDataExchangeAFE2xx.c index 98183a6..c907353 100644 --- a/Bios/src/hal/macros/EemDataExchangeAFE2xx.c +++ b/Bios/src/hal/macros/EemDataExchangeAFE2xx.c @@ -7,96 +7,42 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "arch.h" -#include "edt.h" #include "hal.h" -#include "hal_ref.h" -#include "stream.h" -#include "EEM_defs.h" - -/** - EemDataExchangeAFE2xx - Streaming read and write of EEM register values. This function is for - 16bit CPUs. - inData: ( []){*} - outData: {*} - count: number of the following exchanges - addr: address to read from or write to, the LSB marks a read operation - ivalue: only present for write operations - ovalue: one for each read operation -*/ -//! \todo change API from 16 to 32 bit to be compatible to the X version -//! of this macro. -//! \todo function mapping in host DLL, currently remapped to EemDataExchangeXv2 -//! to test dll with EW430...for single steps with Xv2 the orginal version -//! of this macro is required...there must be a bug in the X version!!! +//Dummy implementation to retain macro numbers HAL_FUNCTION(_hal_EemDataExchangeAFE2xx) { - decl_out - unsigned char NumberOfExchanges; - unsigned char registerAddress; - unsigned short value; - - STREAM_get_byte(&NumberOfExchanges); - eem_data_exchange - - while(NumberOfExchanges) - { - STREAM_get_byte(®isterAddress); - if (registerAddress & 0x01) - { // read access - SetReg_16Bits(registerAddress); // load address - SetReg_16Bits(0); // shift in dummy 0 - STREAM_put_word(lOut); // put output into stream - } - else - { // write access - STREAM_get_word(&value); - - if (registerAddress == GENCLKCTRL) - { - value |= 0x1; - } - - SetReg_16Bits(registerAddress); // load address - SetReg_16Bits(value); // shift in value - } - NumberOfExchanges--; - } - - return 0; + return 0; } - diff --git a/Bios/src/hal/macros/EemDataExchangeX.c b/Bios/src/hal/macros/EemDataExchangeX.c index 8ec8245..d6966ef 100644 --- a/Bios/src/hal/macros/EemDataExchangeX.c +++ b/Bios/src/hal/macros/EemDataExchangeX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -59,38 +59,36 @@ extern unsigned short lastTraceWritePos; HAL_FUNCTION(_hal_EemDataExchangeX) { - decl_out_long - unsigned char NumberOfExchanges; - unsigned char tmp_char; - unsigned long tmp_ulong; + unsigned char NumberOfExchanges = 0; + unsigned char tmp_char= 0; + unsigned long tmp_ulong= 0; STREAM_get_byte(&NumberOfExchanges); - - eem_data_exchange32 - + + eem_data_exchange32(); + while(NumberOfExchanges) { STREAM_get_byte(&tmp_char); if(tmp_char & 0x01) { // read access SetReg_32Bits(tmp_char); // load address - SetReg_32Bits(0); // shift in dummy 0 - STREAM_put_long(lOut_long); // put output into stream + STREAM_put_long(SetReg_32Bits(0)); // put output into stream } else { // write access STREAM_get_long(&tmp_ulong); SetReg_32Bits(tmp_char); // load address SetReg_32Bits(tmp_ulong); // shift in value - - if (tmp_char == 0x9E && tmp_ulong & 0x40) + + if ((tmp_char == 0x9E) && (tmp_ulong & 0x40)) { lastTraceWritePos = 0; } } NumberOfExchanges--; } - + return 0; } diff --git a/Bios/src/hal/macros/EemDataExchangeXv2.c b/Bios/src/hal/macros/EemDataExchangeXv2.c index 80b2614..814a888 100644 --- a/Bios/src/hal/macros/EemDataExchangeXv2.c +++ b/Bios/src/hal/macros/EemDataExchangeXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -45,10 +45,6 @@ #include "stream.h" #include "EEM_defs.h" -//#define EEM_DEBUG -#ifdef EEM_DEBUG -#include "intrinsics.h" -#endif /** EemDataExchangeXv2 Streaming read and write of EEM register values. This function is for @@ -61,82 +57,57 @@ ovalue: one for each read operation */ extern unsigned short lastTraceWritePos; -extern unsigned short _hal_mclkCntrl0; -#ifdef EEM_DEBUG -volatile unsigned long eems_[140]; -volatile unsigned char eems_count_ = 0; -volatile unsigned short eems_sum_ = 0; -#endif +extern unsigned long _hal_mclkCntrl0; + HAL_FUNCTION(_hal_EemDataExchangeXv2) { - decl_out_long - unsigned char NumberOfExchanges; - unsigned char tmp_char; - unsigned long tmp_ulong; + unsigned char tmp_char= 0 , NumberOfExchanges = 0; + unsigned long lOut_long = 0, tmp_ulong = 0; - STREAM_get_byte(&NumberOfExchanges); - #ifdef EEM_DEBUG - eems_sum_ += NumberOfExchanges; - #endif - //eem_data_exchange - eem_data_exchange32 - #ifdef EEM_DEBUG - if(!NumberOfExchanges) - __no_operation(); - #endif - while(NumberOfExchanges) - { - STREAM_get_byte(&tmp_char); - if(tmp_char & 0x01) - { // read access - #ifdef EEM_DEBUG - eems_[eems_count_++] = tmp_char | NumberOfExchanges << 8 | 0xEE000000; - eems_[eems_count_++] = 0; - #endif - if((tmp_char&0xfe)==MODCLKCTRL0) - { // read access - lOut_long=_hal_mclkCntrl0; - } - else - { - SetReg_32Bits(tmp_char); // load address - SetReg_32Bits(0); - } - STREAM_put_long(lOut_long); // put output into stream - } - else - { // write access - STREAM_get_long(&tmp_ulong); - #ifdef EEM_DEBUG - eems_[eems_count_++] = tmp_char | NumberOfExchanges << 8; - eems_[eems_count_++] = tmp_ulong; - if(eems_count_ >= (sizeof(eems_)/sizeof(unsigned long))) - eems_count_ = 0; - if(tmp_char == 0x88) - __no_operation(); - #endif - if((tmp_char&0xfe)==MODCLKCTRL0) - { - - _hal_mclkCntrl0 = (unsigned short)tmp_ulong; - } - else - { - if (tmp_char == 0x9E && tmp_ulong & 0x40) - { - lastTraceWritePos = 0; + STREAM_get_byte(&NumberOfExchanges); + + //eem_data_exchange + eem_data_exchange32(); + + while(NumberOfExchanges) + { + STREAM_get_byte(&tmp_char); + if(tmp_char & 0x01) + { // read access + if((tmp_char & 0xfe) == MODCLKCTRL0) + { // read access + lOut_long = _hal_mclkCntrl0; + } + else + { + SetReg_32Bits(tmp_char); // load address + lOut_long = SetReg_32Bits(0); + } + STREAM_put_long(lOut_long); // put output into stream } - - SetReg_32Bits(tmp_char); // load address - SetReg_32Bits(tmp_ulong); // shift in value - } - } - NumberOfExchanges--; - } - - return 0; + else + { // write access + STREAM_get_long(&tmp_ulong); + + if((tmp_char & 0xfe) == MODCLKCTRL0) + { + + _hal_mclkCntrl0 = tmp_ulong; + } + else + { + if ((tmp_char == 0x9E) && (tmp_ulong & 0x40)) + { + lastTraceWritePos = 0; + } -// return HAL_EemDataExchangeX(In,Out); + SetReg_32Bits(tmp_char); // load address + SetReg_32Bits(tmp_ulong); // shift in value + } + } + NumberOfExchanges--; + } + return 0; } diff --git a/Bios/src/hal/macros/EnableDebugArm.c b/Bios/src/hal/macros/EnableDebugArm.c new file mode 100644 index 0000000..e1c7579 --- /dev/null +++ b/Bios/src/hal/macros/EnableDebugArm.c @@ -0,0 +1,79 @@ +/* + * \ingroup MODULMACROS + * + * \file EnableDebugArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + EnableDebug: halts the CPU and enables Debug +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +HAL_FUNCTION(_hal_EnableDebugArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long data = DBGKEY | C_DEBUGEN; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Configure which vectors to catch + data = TRCENA | VC_HARDERR | VC_CORERESET; + if(IHIL_Write_Read_Mem_Ap(0, DEMCR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Clear all fault flags + data = EXTERNAL | VCATCH | DWTTRAP | BKPT | HALTED; + if(IHIL_Write_Read_Mem_Ap(0, DFSR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } +#endif + return 0; +} diff --git a/Bios/src/hal/macros/ExecuteFunclet.c b/Bios/src/hal/macros/ExecuteFunclet.c index ed9734c..701de41 100644 --- a/Bios/src/hal/macros/ExecuteFunclet.c +++ b/Bios/src/hal/macros/ExecuteFunclet.c @@ -3,39 +3,39 @@ * * \file ExecuteFunclet.c * -* \brief Execute a funclet on the target +* \brief Execute a funclet on the target * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -52,7 +52,7 @@ //! General Purpose Registers used by funclet //! ========================================= //! The following registers are used by the funclet for general purpose. The -//! debugger is responsible for restoring the value of the registers after +//! debugger is responsible for restoring the value of the registers after //! completion. //! //! R10 Memory pointer @@ -112,18 +112,19 @@ extern DeviceSettings deviceSettings; static void setFuncletRegisters(const unsigned short* registerData) { - WriteCpuReg(REG_ADDRESS, registerData[0]) - WriteCpuReg(REG_SIZE, registerData[1]) - WriteCpuReg(REG_TYPE, registerData[2]) - WriteCpuReg(REG_LOCKA, registerData[3]) - WriteCpuReg(REG_GP1, registerData[4]) - WriteCpuReg(REG_GP2, registerData[5]) - WriteCpuReg(REG_GP3, registerData[6]) + WriteCpuReg(REG_ADDRESS, registerData[0]); + WriteCpuReg(REG_SIZE, registerData[1]); + WriteCpuReg(REG_TYPE, registerData[2]); + WriteCpuReg(REG_LOCKA, registerData[3]); + WriteCpuReg(REG_GP1, registerData[4]); + WriteCpuReg(REG_GP2, registerData[5]); + WriteCpuReg(REG_GP3, registerData[6]); } HAL_FUNCTION(_hal_ExecuteFunclet) { short ret_value = 0; + unsigned short lOut; static unsigned long lLen; static unsigned short ret_len = 0; static unsigned long Addr = 0x0; @@ -132,23 +133,23 @@ HAL_FUNCTION(_hal_ExecuteFunclet) static unsigned short usType =0x0; static unsigned short startAddr; static unsigned short R12_BCSLTC1; - static unsigned short R11_DCO; - + static unsigned short R11_DCO; + static unsigned short registerBackups[7] = {0}; static unsigned short FCTL1Value; static unsigned short FCTL2Value; - static unsigned short FCTL3Value; + static unsigned short FCTL3Value; + + unsigned short tmpFCTL3Value; - unsigned short tmpFCTL3Value; - unsigned short tgtStart =0x0; unsigned short data =0x0; unsigned short timeOut =3000; - decl_out + StreamSafe stream_tmp; - + if(flags & MESSAGE_NEW_MSG) { // get target RAM start @@ -157,12 +158,12 @@ HAL_FUNCTION(_hal_ExecuteFunclet) return(HALERR_EXECUTE_FUNCLET_NO_RAM_START); } /// get available RAM size (ram - funclet size) - if(STREAM_get_word(&memSize)!= 0) + if(STREAM_get_word(&memSize)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_RAM_SIZE); - } - /// get RAM Start + Code offset - if(STREAM_get_word(&startAddr)!= 0) + } + /// get RAM Start + Code offset + if(STREAM_get_word(&startAddr)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_OFFSET); } @@ -174,89 +175,89 @@ HAL_FUNCTION(_hal_ExecuteFunclet) // get length ot be flashed if(STREAM_get_long(&lLen) != 0) { - return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); - } - if(STREAM_get_word(&usType) != 0) + return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); + } + if(STREAM_get_word(&usType) != 0) { return(HALERR_EXECUTE_FUNCLET_NO_TYPE); } - // lock A handling + // lock A handling if(STREAM_get_word(&LockA) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + if(STREAM_get_word(&R11_DCO) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + if(STREAM_get_word(&R12_BCSLTC1) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - - ReadCpuReg(REG_ADDRESS, registerBackups[0]) - ReadCpuReg(REG_SIZE, registerBackups[1]) - ReadCpuReg(REG_TYPE, registerBackups[2]) - ReadCpuReg(REG_LOCKA, registerBackups[3]) - ReadCpuReg(REG_GP1, registerBackups[4]) - ReadCpuReg(REG_GP2, registerBackups[5]) - ReadCpuReg(REG_GP3, registerBackups[6]) - + + registerBackups[0] = ReadCpuReg(REG_ADDRESS); + registerBackups[1] = ReadCpuReg(REG_SIZE); + registerBackups[2] = ReadCpuReg(REG_TYPE); + registerBackups[3] = ReadCpuReg(REG_LOCKA); + registerBackups[4] = ReadCpuReg(REG_GP1); + registerBackups[5] = ReadCpuReg(REG_GP2); + registerBackups[6] = ReadCpuReg(REG_GP3); + // Setup the Flash Controller // Read FCTL registers for later restore - ReadMemWord(0x128,FCTL1Value) - ReadMemWord(0x12A,FCTL2Value) - ReadMemWord(0x12C,FCTL3Value) + FCTL1Value = ReadMemWord(0x128); + FCTL2Value = ReadMemWord(0x12A); + FCTL3Value = ReadMemWord(0x12C); // Restore password byte FCTL1Value ^= 0x3300; FCTL2Value ^= 0x3300; FCTL3Value ^= 0x3300; - - WriteMemWord(0x12A,0xA544) // Source = MCLK, DIV = 5. - WriteMemWord(0x12C,LockA) // Set LockA - ReadMemWord(0x12C,tmpFCTL3Value) // Read out register again - + + WriteMemWord(0x12A,0xA544); // Source = MCLK, DIV = 5. + WriteMemWord(0x12C,LockA); // Set LockA + tmpFCTL3Value = ReadMemWord(0x12C); // Read out register again + if((LockA & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWord(0x12C,LockA | 0x40); } { - unsigned short registerValues[7] = {Addr, lLen, usType, LockA, 0,R11_DCO,R12_BCSLTC1}; + unsigned short registerValues[7] = {Addr, lLen, usType, LockA, 0,R11_DCO,R12_BCSLTC1}; setFuncletRegisters(registerValues); WriteCpuReg(2, 0); - } + } if (deviceSettings.clockControlType != GCC_NONE) { if(deviceSettings.stopFLL) - { - unsigned short clkCntrl = 0x11; + { + unsigned short clkCntrl = 0x11; clkCntrl &= ~0x10; - eem_data_exchange - SetReg_16Bits_(MX_GCLKCTRL + MX_WRITE) - SetReg_16Bits_(clkCntrl); + eem_data_exchange(); + SetReg_16Bits(MX_GCLKCTRL + MX_WRITE); + SetReg_16Bits(clkCntrl); } - } + } // i_SetPcRel SetPc(startAddr); - TCLKset1 - + IHIL_Tclk(1); + // prepare release & release - cntrl_sig_16bit - SetReg_16Bits_(0x0401) - addr_capture - cntrl_sig_release - - // Poll until the funclet reaches the WaitForDead loop, + cntrl_sig_16bit(); + SetReg_16Bits(0x0401); + addr_capture(); + cntrl_sig_release(); + + // Poll until the funclet reaches the WaitForDead loop, // ie. it is ready to process data do { - EDT_Delay_1ms(1); - addr_capture - SetReg_16Bits(0) + IHIL_Delay_1ms(1); + addr_capture(); + lOut = SetReg_16Bits(0); timeOut--; - } + } while(!((lOut >= (startAddr + WAIT_FOR_DEAD_START)) && (lOut <= (startAddr + WAIT_FOR_DEAD_END))) && timeOut); } @@ -265,54 +266,54 @@ HAL_FUNCTION(_hal_ExecuteFunclet) unsigned short writePos = startAddr + DATA_OFFSET; const unsigned short writeEndPos = writePos + (2*lLen < memSize ? 2*lLen : memSize); unsigned short numWordsToWrite = 0; - + SetPc(startAddr + FINISHED_OFFSET); // The device has limited RAM available to write updates to, // make sure we stay within this limit: Total memory size - 96 bytes for the funclet - halt_cpu - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x2408) - + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2408); + while( (writePos < writeEndPos) && (ret_value == 0) ) { ret_value = STREAM_get_word(&data); - addr_16bit - SetReg_16Bits_(writePos) - data_to_addr - SetReg_16Bits_(data); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_16Bits(writePos); + data_to_addr(); + SetReg_16Bits(data); + IHIL_Tclk(1); + IHIL_Tclk(0); writePos += 2; - } - release_cpu - + } + release_cpu(); + numWordsToWrite = (writePos - (startAddr + DATA_OFFSET)) / 2; - WriteCpuReg(REG_SIZE, numWordsToWrite) - WriteCpuReg(REG_ADDRESS, Addr) + WriteCpuReg(REG_SIZE, numWordsToWrite); + WriteCpuReg(REG_ADDRESS, Addr); Addr += 2 * numWordsToWrite; lLen -= numWordsToWrite; - - SetPc(startAddr + EXECUTE_FUNCLET); - cntrl_sig_release - - // Poll until the funclet reaches the Stop loop, + + SetPc(startAddr + EXECUTE_FUNCLET); + cntrl_sig_release(); + + // Poll until the funclet reaches the Stop loop, // ie. it is finished timeOut = 3000; do { - EDT_Delay_1ms(1); - addr_capture - SetReg_16Bits(0) + IHIL_Delay_1ms(1); + addr_capture(); + lOut = SetReg_16Bits(0); timeOut--; } while(!(lOut == (startAddr + FINISHED_OFFSET)) && timeOut); } - + if(flags & MESSAGE_LAST_MSG ) { // ExitFlashWrite { //Setup values for watchdog control regsiters @@ -324,16 +325,16 @@ HAL_FUNCTION(_hal_ExecuteFunclet) } setFuncletRegisters(registerBackups); // Restore the Flash controller registers - WriteMemWord(0x128,FCTL1Value) - WriteMemWord(0x12A,FCTL2Value) - WriteMemWord(0x12C,FCTL3Value) - ReadMemWord(0x12C,tmpFCTL3Value) // Read out register again - + WriteMemWord(0x128,FCTL1Value); + WriteMemWord(0x12A,FCTL2Value); + WriteMemWord(0x12C,FCTL3Value); + tmpFCTL3Value = ReadMemWord(0x12C); // Read out register again + if((FCTL3Value & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWord(0x12C,FCTL3Value | 0x40); - } - + } + STREAM_put_word(ret_len); } else if(ret_value == 1) @@ -349,20 +350,20 @@ HAL_FUNCTION(_hal_ExecuteFunclet) STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContext(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - + setFuncletRegisters(registerBackups); // Restore the Flash controller registers - WriteMemWord(0x128,FCTL1Value) - WriteMemWord(0x12A,FCTL2Value) - WriteMemWord(0x12C,FCTL3Value) - ReadMemWord(0x12C,tmpFCTL3Value) // Read out register again - + WriteMemWord(0x128,FCTL1Value); + WriteMemWord(0x12A,FCTL2Value); + WriteMemWord(0x12C,FCTL3Value); + tmpFCTL3Value = ReadMemWord(0x12C); // Read out register again + if((FCTL3Value & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWord(0x12C,FCTL3Value | 0x40); - } - + } + ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_ERROR; - } + } return(ret_value); } diff --git a/Bios/src/hal/macros/ExecuteFuncletJtag.c b/Bios/src/hal/macros/ExecuteFuncletJtag.c index ad4e513..0e744ab 100644 --- a/Bios/src/hal/macros/ExecuteFuncletJtag.c +++ b/Bios/src/hal/macros/ExecuteFuncletJtag.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -51,7 +51,7 @@ //! General Purpose Registers used by funclet //! ========================================= //! The following registers are used by the funclet for general purpose. The -//! debugger is responsible for restoring the value of the registers after +//! debugger is responsible for restoring the value of the registers after //! completion. //! //! R10 Memory pointer @@ -111,13 +111,13 @@ extern DeviceSettings deviceSettings; static void setFuncletRegisters(const unsigned short* registerData) { - WriteCpuReg(REG_ADDRESS, registerData[0]) - WriteCpuReg(REG_SIZE, registerData[1]) - WriteCpuReg(REG_TYPE, registerData[2]) - WriteCpuReg(REG_LOCKA, registerData[3]) - WriteCpuReg(REG_GP1, registerData[4]) - WriteCpuReg(REG_GP2, registerData[5]) - WriteCpuReg(REG_GP3, registerData[6]) + WriteCpuReg(REG_ADDRESS, registerData[0]); + WriteCpuReg(REG_SIZE, registerData[1]); + WriteCpuReg(REG_TYPE, registerData[2]); + WriteCpuReg(REG_LOCKA, registerData[3]); + WriteCpuReg(REG_GP1, registerData[4]); + WriteCpuReg(REG_GP2, registerData[5]); + WriteCpuReg(REG_GP3, registerData[6]); } static unsigned short funcletBackup[0x30] = {0}; @@ -125,30 +125,28 @@ static unsigned short funcletBackup[0x30] = {0}; void stopAndRestoreRam(unsigned short startAddr) { int i = 0; - decl_out - cntrl_sig_high_byte + cntrl_sig_high_byte(); SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8); - SyncJtag() + SyncJtag(); SetPcJtagBug(ROM_ADDR); - TCLKset1 - - halt_cpu - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x2408) + IHIL_Tclk(1); + + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2408); for (i = 0; i < 0x30; ++i) { - const unsigned short addr = startAddr + i*2; - addr_16bit - SetReg_16Bits_(addr) - data_to_addr - SetReg_16Bits_(funcletBackup[i]); - TCLKset1 - TCLKset0 + const unsigned short addr = startAddr + i * 2; + addr_16bit(); + SetReg_16Bits(addr); + data_to_addr(); + SetReg_16Bits(funcletBackup[i]); + IHIL_Tclk(1); + IHIL_Tclk(0); } - - release_cpu + release_cpu(); } HAL_FUNCTION(_hal_ExecuteFuncletJtag) @@ -161,25 +159,23 @@ HAL_FUNCTION(_hal_ExecuteFuncletJtag) static unsigned short usType =0x0; static unsigned short startAddr; static unsigned short R12_BCSLTC1; - static unsigned short R11_DCO; + static unsigned short R11_DCO; + - static unsigned short registerBackups[7] = {0}; static unsigned short FCTL1Value; static unsigned short FCTL2Value; - static unsigned short FCTL3Value; + static unsigned short FCTL3Value; - unsigned short tmpFCTL3Value; - - unsigned short tgtStart =0x0; - unsigned short data =0x0; - unsigned short timeOut =3000; - int i = 0; - decl_out + unsigned short tmpFCTL3Value, lOut = 0; + unsigned short tgtStart = 0x0; + unsigned short data = 0x0; + unsigned short timeOut = 3000; + int i = 0; StreamSafe stream_tmp; - + if(flags & MESSAGE_NEW_MSG) { // get target RAM start @@ -188,12 +184,12 @@ HAL_FUNCTION(_hal_ExecuteFuncletJtag) return(HALERR_EXECUTE_FUNCLET_NO_RAM_START); } /// get available RAM size (ram - funclet size) - if(STREAM_get_word(&memSize)!= 0) + if(STREAM_get_word(&memSize)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_RAM_SIZE); - } - /// get RAM Start + Code offset - if(STREAM_get_word(&startAddr)!= 0) + } + /// get RAM Start + Code offset + if(STREAM_get_word(&startAddr)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_OFFSET); } @@ -205,99 +201,100 @@ HAL_FUNCTION(_hal_ExecuteFuncletJtag) // get length ot be flashed if(STREAM_get_long(&lLen) != 0) { - return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); - } - if(STREAM_get_word(&usType) != 0) + return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); + } + if(STREAM_get_word(&usType) != 0) { return(HALERR_EXECUTE_FUNCLET_NO_TYPE); } - // lock A handling + // lock A handling if(STREAM_get_word(&LockA) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + if(STREAM_get_word(&R11_DCO) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + if(STREAM_get_word(&R12_BCSLTC1) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + SetPcJtagBug(ROM_ADDR); - TCLKset1 - + IHIL_Tclk(1); + for (i = 0; i < 0x30; ++i) { - const unsigned short addr = startAddr + i*2; - ReadMemWord(addr, funcletBackup[i]); + const unsigned short addr = startAddr + i*2; + funcletBackup[i] = ReadMemWord(addr); } - ReadCpuReg(REG_ADDRESS, registerBackups[0]) - ReadCpuReg(REG_SIZE, registerBackups[1]) - ReadCpuReg(REG_TYPE, registerBackups[2]) - ReadCpuReg(REG_LOCKA, registerBackups[3]) - ReadCpuReg(REG_GP1, registerBackups[4]) - ReadCpuReg(REG_GP2, registerBackups[5]) - ReadCpuReg(REG_GP3, registerBackups[6]) + registerBackups[0] = ReadCpuReg(REG_ADDRESS); + registerBackups[1] = ReadCpuReg(REG_SIZE); + registerBackups[2] = ReadCpuReg(REG_TYPE); + registerBackups[3] = ReadCpuReg(REG_LOCKA); + registerBackups[4] = ReadCpuReg(REG_GP1); + registerBackups[5] = ReadCpuReg(REG_GP2); + registerBackups[6] = ReadCpuReg(REG_GP3); // Setup the Flash Controller // Read FCTL registers for later restore - ReadMemWord(0x128,FCTL1Value) - ReadMemWord(0x12A,FCTL2Value) - ReadMemWord(0x12C,FCTL3Value) + FCTL1Value = ReadMemWord(0x128); + FCTL2Value = ReadMemWord(0x12A); + FCTL3Value = ReadMemWord(0x12C); + // Restore password byte FCTL1Value ^= 0x3300; FCTL2Value ^= 0x3300; FCTL3Value ^= 0x3300; - - WriteMemWord(0x12A,0xA544) // Source = MCLK, DIV = 5. - WriteMemWord(0x12C,LockA) // Set LockA - ReadMemWord(0x12C,tmpFCTL3Value) // Read out register again - + + WriteMemWord(0x12A,0xA544); // Source = MCLK, DIV = 5. + WriteMemWord(0x12C,LockA); // Set LockA + tmpFCTL3Value = ReadMemWord(0x12C) ; // Read out register again + if((LockA & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWord(0x12C,LockA | 0x40); } { - unsigned short registerValues[7] = {Addr, lLen, usType, LockA, 0, R11_DCO, R12_BCSLTC1}; + unsigned short registerValues[7] = {Addr, lLen, usType, LockA, 0, R11_DCO, R12_BCSLTC1}; setFuncletRegisters(registerValues); WriteCpuReg(2, 0); } - + if (deviceSettings.clockControlType != GCC_NONE) { if(deviceSettings.stopFLL) - { - unsigned short clkCntrl = 0x11; + { + unsigned short clkCntrl = 0x11; clkCntrl &= ~0x10; - eem_data_exchange - SetReg_16Bits_(MX_GCLKCTRL + MX_WRITE) - SetReg_16Bits_(clkCntrl); + eem_data_exchange(); + SetReg_16Bits(MX_GCLKCTRL + MX_WRITE); + SetReg_16Bits(clkCntrl); } } - + SetPcJtagBug(startAddr); - cntrl_sig_release - addr_capture - - // Poll until the funclet reaches the WaitForDead loop, + cntrl_sig_release(); + addr_capture(); + + // Poll until the funclet reaches the WaitForDead loop, // ie. it is ready to process data do { - EDT_Delay_1ms(1); - SetReg_16Bits(0) + IHIL_Delay_1ms(1); + lOut = SetReg_16Bits(0); timeOut--; - } + } while(!((lOut >= (startAddr + WAIT_FOR_DEAD_START)) && (lOut <= (startAddr + WAIT_FOR_DEAD_END))) && timeOut); - + stopAndRestoreRam(startAddr); } - + while(lLen && (ret_value == 0) && timeOut) { unsigned short writePos = startAddr + DATA_OFFSET; @@ -306,50 +303,50 @@ HAL_FUNCTION(_hal_ExecuteFuncletJtag) // The device has limited RAM available to write updates to, // make sure we stay within this limit: Total memory size - 96 bytes for the funclet - halt_cpu - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x2408) - + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2408); + while( (writePos < writeEndPos) && (ret_value == 0) ) { ret_value = STREAM_get_word(&data); - addr_16bit - SetReg_16Bits_(writePos) - data_to_addr - SetReg_16Bits_(data); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_16Bits(writePos); + data_to_addr(); + SetReg_16Bits(data); + IHIL_Tclk(1); + IHIL_Tclk(0); writePos += 2; } - - release_cpu - + + release_cpu(); + numWordsToWrite = (writePos - (startAddr + DATA_OFFSET)) / 2; - WriteCpuReg(REG_SIZE, numWordsToWrite) - WriteCpuReg(REG_ADDRESS, Addr) + WriteCpuReg(REG_SIZE, numWordsToWrite); + WriteCpuReg(REG_ADDRESS, Addr); Addr += 2 * numWordsToWrite; lLen -= numWordsToWrite; SetPcJtagBug(startAddr + EXECUTE_FUNCLET); - cntrl_sig_release - addr_capture + cntrl_sig_release(); + addr_capture(); - // Poll until the funclet reaches the Stop loop, + // Poll until the funclet reaches the Stop loop, // ie. it is finished timeOut = 3000; do { - EDT_Delay_1ms(1); - SetReg_16Bits(0) + IHIL_Delay_1ms(1); + lOut = SetReg_16Bits(0); timeOut--; } while(!(lOut == (startAddr + FINISHED_OFFSET)) && timeOut); - + stopAndRestoreRam(startAddr); - + if ( timeOut == 0) ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_TIMEOUT; } @@ -365,19 +362,19 @@ HAL_FUNCTION(_hal_ExecuteFuncletJtag) } setFuncletRegisters(registerBackups); // Restore the Flash controller registers - WriteMemWord(0x128,FCTL1Value) - WriteMemWord(0x12A,FCTL2Value) - WriteMemWord(0x12C,FCTL3Value) - ReadMemWord(0x12C,tmpFCTL3Value) // Read out register again - + WriteMemWord(0x128,FCTL1Value); + WriteMemWord(0x12A,FCTL2Value); + WriteMemWord(0x12C,FCTL3Value); + tmpFCTL3Value = ReadMemWord(0x12C); // Read out register again + if((FCTL3Value & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWord(0x12C,FCTL3Value | 0x40); - } + } } if(flags & MESSAGE_LAST_MSG) - { + { STREAM_put_word(0); } else if(ret_value == 1) @@ -388,6 +385,6 @@ HAL_FUNCTION(_hal_ExecuteFuncletJtag) else { ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_ERROR; - } + } return(ret_value); } diff --git a/Bios/src/hal/macros/ExecuteFuncletX.c b/Bios/src/hal/macros/ExecuteFuncletX.c index 5fa370d..15d0edb 100644 --- a/Bios/src/hal/macros/ExecuteFuncletX.c +++ b/Bios/src/hal/macros/ExecuteFuncletX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -51,7 +51,7 @@ //! General Purpose Registers used by funclet //! ========================================= //! The following registers are used by the funclet for general purpose. The -//! debugger is responsible for restoring the value of the registers after +//! debugger is responsible for restoring the value of the registers after //! completion. //! //! R10 Memory pointer @@ -108,18 +108,19 @@ static void setFuncletRegisters(const unsigned long* registerData) { - WriteCpuRegX(REG_ADDRESS, registerData[0]) - WriteCpuRegX(REG_SIZE, registerData[1]) - WriteCpuRegX(REG_TYPE, registerData[2]) - WriteCpuRegX(REG_LOCKA, registerData[3]) - WriteCpuRegX(REG_GP1, registerData[4]) - WriteCpuRegX(REG_GP2, registerData[5]) - WriteCpuRegX(REG_GP3, registerData[6]) + WriteCpuRegX(REG_ADDRESS, registerData[0]); + WriteCpuRegX(REG_SIZE, registerData[1]); + WriteCpuRegX(REG_TYPE, registerData[2]); + WriteCpuRegX(REG_LOCKA, registerData[3]); + WriteCpuRegX(REG_GP1, registerData[4]); + WriteCpuRegX(REG_GP2, registerData[5]); + WriteCpuRegX(REG_GP3, registerData[6]); } HAL_FUNCTION(_hal_ExecuteFuncletX) { short ret_value = 0; + unsigned long lOut_long = 0; static unsigned long lLen; static unsigned short ret_len = 0; static unsigned long Addr = 0x0; @@ -128,25 +129,23 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) static unsigned short usType =0x0; static unsigned short startAddr; static unsigned short R12_BCSLTC1; - static unsigned short R11_DCO; + static unsigned short R11_DCO; + - static unsigned long registerBackups[7] = {0}; static unsigned short FCTL1Value; static unsigned short FCTL2Value; - static unsigned short FCTL3Value; + static unsigned short FCTL3Value; + + unsigned short tmpFCTL3Value; - unsigned short tmpFCTL3Value; - unsigned short tgtStart =0x0; unsigned short data =0x0; unsigned short timeOut =3000; - decl_out - decl_out_long StreamSafe stream_tmp; - + if(flags & MESSAGE_NEW_MSG) { // get target RAM start @@ -155,12 +154,12 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) return(HALERR_EXECUTE_FUNCLET_NO_RAM_START); } /// get available RAM size (ram - funclet size) - if(STREAM_get_word(&memSize)!= 0) + if(STREAM_get_word(&memSize)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_RAM_SIZE); - } - /// get RAM Start + Code offset - if(STREAM_get_word(&startAddr)!= 0) + } + /// get RAM Start + Code offset + if(STREAM_get_word(&startAddr)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_OFFSET); } @@ -172,50 +171,50 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) // get length ot be flashed if(STREAM_get_long(&lLen) != 0) { - return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); - } - if(STREAM_get_word(&usType) != 0) + return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); + } + if(STREAM_get_word(&usType) != 0) { return(HALERR_EXECUTE_FUNCLET_NO_TYPE); } - // lock A handling + // lock A handling if(STREAM_get_word(&LockA) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + if(STREAM_get_word(&R11_DCO) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - + if(STREAM_get_word(&R12_BCSLTC1) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - ReadCpuRegX(REG_ADDRESS, registerBackups[0]) - ReadCpuRegX(REG_SIZE, registerBackups[1]) - ReadCpuRegX(REG_TYPE, registerBackups[2]) - ReadCpuRegX(REG_LOCKA, registerBackups[3]) - ReadCpuRegX(REG_GP1, registerBackups[4]) - ReadCpuRegX(REG_GP2, registerBackups[5]) - ReadCpuRegX(REG_GP3, registerBackups[6]) + registerBackups[0] = ReadCpuRegX(REG_ADDRESS); + registerBackups[1] = ReadCpuRegX(REG_SIZE); + registerBackups[2] = ReadCpuRegX(REG_TYPE); + registerBackups[3] = ReadCpuRegX(REG_LOCKA); + registerBackups[4] = ReadCpuRegX(REG_GP1); + registerBackups[5] = ReadCpuRegX(REG_GP2); + registerBackups[6] = ReadCpuRegX(REG_GP3); // Setup the Flash Controller // Read FCTL registers for later restore - ReadMemWordX(0x128,FCTL1Value) - ReadMemWordX(0x12A,FCTL2Value) - ReadMemWordX(0x12C,FCTL3Value) + FCTL1Value = ReadMemWordX(0x128); + FCTL2Value = ReadMemWordX(0x12A); + FCTL3Value = ReadMemWordX(0x12C); // Restore password byte FCTL1Value ^= 0x3300; FCTL2Value ^= 0x3300; FCTL3Value ^= 0x3300; - - WriteMemWordX(0x12A,0xA544) // Source = MCLK, DIV = 5. - WriteMemWordX(0x12C,LockA) // Set LockA - ReadMemWordX(0x12C,tmpFCTL3Value) // Read out register again - + + WriteMemWordX(0x12A,0xA544); // Source = MCLK, DIV = 5. + WriteMemWordX(0x12C,LockA); // Set LockA + tmpFCTL3Value = ReadMemWordX(0x12C); // Read out register again + if((LockA & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWordX(0x12C,LockA | 0x40); @@ -227,23 +226,23 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) WriteCpuRegX(2, 0); } - // i_SetPcRel + // i_SetPcRel SetPcX(startAddr); // prepare release & release - cntrl_sig_16bit - SetReg_16Bits_(0x0401) - addr_capture - cntrl_sig_release - - // Poll until the funclet reaches the WaitForDead loop, + cntrl_sig_16bit(); + SetReg_16Bits(0x0401); + addr_capture(); + cntrl_sig_release(); + + // Poll until the funclet reaches the WaitForDead loop, // ie. it is ready to process data do { - EDT_Delay_1ms(1); - addr_capture - SetReg_20Bits(0) + IHIL_Delay_1ms(1); + addr_capture(); + lOut_long = SetReg_20Bits(0); timeOut--; - } + } while(!((lOut_long >= (startAddr + WAIT_FOR_DEAD_START)) && (lOut_long <= (startAddr + WAIT_FOR_DEAD_END))) && timeOut); } @@ -254,52 +253,52 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) unsigned short numWordsToWrite = 0; SetPcX(startAddr + FINISHED_OFFSET); - + // The device has limited RAM available to write updates to, // make sure we stay within this limit: Total memory size - 96 bytes for the funclet - halt_cpu - TCLKset0 - cntrl_sig_low_byte - SetReg_16Bits_(0x08) - + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_low_byte(); + SetReg_16Bits(0x08); + while( (writePos < writeEndPos) && (ret_value == 0) ) { ret_value = STREAM_get_word(&data); - addr_16bit - SetReg_20Bits_(writePos) - data_to_addr - SetReg_16Bits_(data); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_20Bits(writePos); + data_to_addr(); + SetReg_16Bits(data); + IHIL_Tclk(1); + IHIL_Tclk(0); writePos += 2; } - - release_cpu - + + release_cpu(); + numWordsToWrite = (writePos - (startAddr + DATA_OFFSET)) / 2; - WriteCpuRegX(REG_SIZE, numWordsToWrite) - WriteCpuRegX(REG_ADDRESS, Addr) + WriteCpuRegX(REG_SIZE, numWordsToWrite); + WriteCpuRegX(REG_ADDRESS, Addr); Addr += 2 * numWordsToWrite; lLen -= numWordsToWrite; SetPcX(startAddr + EXECUTE_FUNCLET); - cntrl_sig_release + cntrl_sig_release(); - // Poll until the funclet reaches the Stop loop, + // Poll until the funclet reaches the Stop loop, // ie. it is finished timeOut = 3000; do { - EDT_Delay_1ms(1); - addr_capture - SetReg_20Bits(0) + IHIL_Delay_1ms(1); + addr_capture(); + lOut_long = SetReg_20Bits(0); timeOut--; } while(!(lOut_long == (startAddr + FINISHED_OFFSET)) && timeOut); } - + if(flags & MESSAGE_LAST_MSG ) { // ExitFlashWrite { //Setup values for watchdog control regsiters @@ -311,16 +310,16 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) } setFuncletRegisters(registerBackups); // Restore the Flash controller registers - WriteMemWordX(0x128,FCTL1Value) - WriteMemWordX(0x12A,FCTL2Value) - WriteMemWordX(0x12C,FCTL3Value) - ReadMemWordX(0x12C,tmpFCTL3Value) // Read out register again - + WriteMemWordX(0x128,FCTL1Value); + WriteMemWordX(0x12A,FCTL2Value); + WriteMemWordX(0x12C,FCTL3Value); + tmpFCTL3Value = ReadMemWordX(0x12C); // Read out register again + if((FCTL3Value & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWordX(0x12C,FCTL3Value | 0x40); - } - + } + STREAM_put_word(ret_len); } else if(ret_value == 1) @@ -329,27 +328,27 @@ HAL_FUNCTION(_hal_ExecuteFuncletX) ret_value = 0; } else - { + { //Setup values for watchdog control regsiters unsigned char DummyIn[8] = {WDTCTL_ADDRESS & 0xFF,(WDTCTL_ADDRESS >> 8) & 0xFF, WDTHOLD_DEF,WDTPW_DEF,0,0,0,0}; STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContextX(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - + setFuncletRegisters(registerBackups); // Restore the Flash controller registers - WriteMemWordX(0x128,FCTL1Value) - WriteMemWordX(0x12A,FCTL2Value) - WriteMemWordX(0x12C,FCTL3Value) - ReadMemWordX(0x12C,tmpFCTL3Value) // Read out register again - + WriteMemWordX(0x128,FCTL1Value); + WriteMemWordX(0x12A,FCTL2Value); + WriteMemWordX(0x12C,FCTL3Value); + tmpFCTL3Value = ReadMemWordX(0x12C); // Read out register again + if((FCTL3Value & 0xff) != (tmpFCTL3Value & 0xff)) { // Value of lockA is not as expected, so toggle it WriteMemWordX(0x12C,FCTL3Value | 0x40); - } - + } + ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_ERROR; - } + } return(ret_value); } diff --git a/Bios/src/hal/macros/ExecuteFuncletXv2.c b/Bios/src/hal/macros/ExecuteFuncletXv2.c index fd958e5..fa7b5c0 100644 --- a/Bios/src/hal/macros/ExecuteFuncletXv2.c +++ b/Bios/src/hal/macros/ExecuteFuncletXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -49,6 +49,7 @@ #include "stddef.h" #include "error_def.h" #include "JTAG_defs.h" +#include "global_variables.h" #define startAddrOfs FlashWrite_o_[4] @@ -76,10 +77,6 @@ static void setFuncletRegisters(const unsigned long* registerData) unsigned short Rx_l; unsigned short Register; - DIAG_SUPPRESS(Pe550) - decl_out_long - DIAG_DEFAULT(Pe550) - Mova = 0x0080; Rx = registerData[0]; Register = REG_ADDRESS; @@ -87,7 +84,7 @@ static void setFuncletRegisters(const unsigned long* registerData) Mova += (Register & 0x000F); Rx_l = (unsigned short)Rx; WriteCpuRegXv2(Mova, Rx_l); - + Mova = 0x0080; Rx = registerData[1]; Register = REG_SIZE; @@ -95,7 +92,7 @@ static void setFuncletRegisters(const unsigned long* registerData) Mova += (Register & 0x000F); Rx_l = (unsigned short)Rx; WriteCpuRegXv2(Mova, Rx_l); - + Mova = 0x0080; Rx = registerData[2]; // erase type Register = REG_TYPE; @@ -103,7 +100,7 @@ static void setFuncletRegisters(const unsigned long* registerData) Mova += (Register & 0x000F); Rx_l = (unsigned short)Rx; WriteCpuRegXv2(Mova, Rx_l); - + Mova = 0x0080; Rx = registerData[3]; Register = REG_LOCKA; @@ -119,7 +116,7 @@ static void setFuncletRegisters(const unsigned long* registerData) inData: {*} outData: tgtStart: target memory start address used to load erase code to. - tgtLen: available target memory + tgtLen: available target memory addr: the address to start writing to length: number of words to write data: data to write to the given location @@ -131,9 +128,10 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) { static unsigned long lLen; static unsigned short ret_len = 0; - + unsigned char jtagMailboxIn = 0; + static unsigned long registerBackups[4] = {0}; - + unsigned short tgtStart =0x0 ; unsigned long Addr =0x0 ; unsigned short LockA =0x0 ; @@ -144,11 +142,9 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) static unsigned short allignNeed = 0x0; static unsigned short dataL; static unsigned short dataH; - decl_out - decl_jtagMailboxIn short ret_value = 0; StreamSafe stream_tmp; - + if(flags & MESSAGE_NEW_MSG) { // get target RAM start @@ -157,8 +153,8 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) return(HALERR_EXECUTE_FUNCLET_NO_RAM_START); } STREAM_discard_bytes(2); // Ram size - /// get RAM Start + Code offset - if(STREAM_get_word(&startAddr)!= 0) + /// get RAM Start + Code offset + if(STREAM_get_word(&startAddr)!= 0) { return(HALERR_EXECUTE_FUNCLET_NO_OFFSET); } @@ -170,13 +166,13 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) // get length ot be flashed if(STREAM_get_long(&lLen) != 0) { - return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); - } - if(STREAM_get_word(&usType) != 0) + return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); + } + if(STREAM_get_word(&usType) != 0) { return(HALERR_EXECUTE_FUNCLET_NO_TYPE); } - // lock A handling + // lock A handling if(STREAM_get_word(&LockA) == -1) { return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); @@ -187,40 +183,27 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) return(HALERR_EXECUTE_FUNCLET_NO_LOCKA); } - /*Mova = 0x0060 | (REG_ADDRESS << 8) & 0x0F00; - ReadCpuRegXv2(Mova, registerBackups[0]) - Mova = 0x0060 | (REG_SIZE << 8) & 0x0F00; - ReadCpuRegXv2(Mova, registerBackups[1]) - Mova = 0x0060 | (REG_TYPE << 8) & 0x0F00; - ReadCpuRegXv2(Mova, registerBackups[2]) - Mova = 0x0060 | (REG_LOCKA << 8) & 0x0F00; - ReadCpuRegXv2(Mova, registerBackups[3])*/ - { - unsigned long registerValues[4] = {Addr, lLen, usType, LockA}; + unsigned long registerValues[4] = {Addr, lLen, usType, LockA}; setFuncletRegisters(registerValues); } - - //WriteMemWordXv2(0xFFFE,0xFFFF) // Source = MCLK, DIV = 5. - // i_SetPcRel + // i_SetPcRel SetPcXv2(0x0080, startAddr); - TCLKset1 + IHIL_Tclk(1); // prepare release & release - cntrl_sig_16bit - SetReg_16Bits_(0x0401) - addr_capture - cntrl_sig_release + cntrl_sig_16bit(); + SetReg_16Bits(0x0401); + addr_capture(); + cntrl_sig_release(); { - unsigned long Jmb = 0; - unsigned long Timeout = 0; + unsigned long Timeout = 0; do { - EDT_Delay_1ms(5); // Delay determined experimentally on FR5729 device - i_ReadJmbOut(Jmb) + IHIL_Delay_1ms(5); // Delay determined experimentally on FR5729 device Timeout++; - } - while(Jmb != 0xABADBABE && Timeout < TIMEOUT_COUNT); + } + while(i_ReadJmbOut() != 0xABADBABE && Timeout < TIMEOUT_COUNT); if(Timeout >= TIMEOUT_COUNT) { ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_TIMEOUT; @@ -228,85 +211,78 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) } if(lLen%2) { - lLen--; // allign lLen - allignNeed = 1; + lLen--; // allign lLen + allignNeed = 1; } - //i_InitStreamJmbIn32() } - // Excecute funclet + // Excecute funclet for(; lLen && (ret_value == 0); lLen--) { if (lLen%2) { ret_value = STREAM_get_word(&dataH); - //i_StreamDataJmbIn32(dataL,dataH) - i_WriteJmbIn32(dataL,dataH) + i_WriteJmbIn32(dataL,dataH); } else { ret_value = STREAM_get_word(&dataL); } } - + if(allignNeed && ret_value == 0 && lLen == 0 && flags & MESSAGE_LAST_MSG ) { ret_value = STREAM_get_word(&dataL); - i_WriteJmbIn32(dataL,0xAAAA); - + jtagMailboxIn = i_WriteJmbIn32(dataL,0xAAAA); + if(jtagMailboxIn == 1) { return (HALERR_EXECUTE_FUNCLET_FINISH_TIMEOUT); - } + } allignNeed = 0; - } - + } + if(flags & MESSAGE_LAST_MSG )//|| lLen == 0) { // ExitFlashWrite unsigned long Timeout = 0; - unsigned long Jmb = 0; do { - EDT_Delay_1ms(10); // Delay determined experimentally on FR5729 device - i_ReadJmbOut(Jmb) - Timeout++; + IHIL_Delay_1ms(10); // Delay determined experimentally on FR5729 device + Timeout++; } - while(Jmb != 0xCAFEBABE && Timeout < TIMEOUT_COUNT); + while(i_ReadJmbOut() != 0xCAFEBABE && Timeout < TIMEOUT_COUNT); if(Timeout >= TIMEOUT_COUNT) { ret_value = HALERR_EXECUTE_FUNCLET_FINISH_TIMEOUT; - //Setup values for watchdog control regsiters - - unsigned char DummyIn[8] = {WDTCTL_ADDRESS_5XX & 0xFF,(WDTCTL_ADDRESS_5XX >> 8) & 0xFF, + //Setup values for watchdog control regsiters + + unsigned char DummyIn[8] = {wdtctlAddress5xx & 0xFF, (wdtctlAddress5xx >> 8) & 0xFF, WDTHOLD_DEF,WDTPW_DEF,0,0,0,0}; - + STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - + Mova = 0x0060 | (10 << 8) & 0x0F00; - ReadCpuRegXv2(Mova, registerBackups[0]) + registerBackups[0] = ReadCpuRegXv2(Mova); Mova = 0x0060 | (11 << 8) & 0x0F00; - ReadCpuRegXv2(Mova, registerBackups[1]) - + registerBackups[1] = ReadCpuRegXv2(Mova); + if( registerBackups[1] != 0 && registerBackups[0] != 0xFFFE) { ret_value = -10; } - } { //Setup values for watchdog control regsiters - unsigned char DummyIn[8] = {WDTCTL_ADDRESS_5XX & 0xFF,(WDTCTL_ADDRESS_5XX >> 8) & 0xFF, + unsigned char DummyIn[8] = {wdtctlAddress5xx & 0xFF,(wdtctlAddress5xx >> 8) & 0xFF, WDTHOLD_DEF,WDTPW_DEF,0,0,0,0}; - + STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - } - //setFuncletRegisters(registerBackups); - + STREAM_put_word(ret_len); } else if(ret_value == 1) @@ -317,16 +293,14 @@ HAL_FUNCTION(_hal_ExecuteFuncletXv2) else { //Setup values for watchdog control regsiters - unsigned char DummyIn[8] = {WDTCTL_ADDRESS_5XX & 0xFF,(WDTCTL_ADDRESS_5XX >> 8) & 0xFF, + unsigned char DummyIn[8] = {wdtctlAddress5xx & 0xFF,(wdtctlAddress5xx >> 8) & 0xFF, WDTHOLD_DEF,WDTPW_DEF,0,0,0,0}; - + STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - - //setFuncletRegisters(registerBackups); - + ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_ERROR; - } + } return(ret_value); } diff --git a/Bios/src/hal/macros/GetCpuIdArm.c b/Bios/src/hal/macros/GetCpuIdArm.c new file mode 100644 index 0000000..37b56f7 --- /dev/null +++ b/Bios/src/hal/macros/GetCpuIdArm.c @@ -0,0 +1,108 @@ +/* + * \ingroup MODULMACROS + * + * \file GetCpuIdArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + GetJtagIdCode: get the JEP idcode from the debug port +*/ +HAL_FUNCTION(_hal_GetCpuIdArm) +{ +#ifdef MSP_FET + unsigned long cpuId = 0, revision = 0; + unsigned short timeout = 20; + + do + { + short result1 = IHIL_Write_Read_Mem_Ap(0, 0x0020100C, &cpuId, READ); + short result2 =IHIL_Write_Read_Mem_Ap(0, 0x00201010, &revision, READ); + if(!result2 || !result1) + { + return HALERR_UNDEFINED_ERROR; + } + } + while((!cpuId || !revision ) && --timeout ); + + if (cpuId && revision) + { + STREAM_put_long(cpuId); + STREAM_put_long(revision); + return 0; + } +#endif + return HALERR_UNDEFINED_ERROR; +} + +HAL_FUNCTION(_hal_CheckDapLockArm) +{ +#ifdef MSP_FET + unsigned long lock = 0; + unsigned long pw = 0x0000695A; + + IHIL_Write_Read_Mem_Ap(0, 0xE0044000, &pw, WRITE); + IHIL_Write_Read_Mem_Ap(0, 0xE0044020, &lock, READ); + STREAM_put_long(lock); +#endif + return 0; +} + +HAL_FUNCTION(_hal_UnlockDap) +{ +#ifdef MSP_FET + unsigned long pw = 0x0000695A; + + unsigned long fa1 = 0x1; + unsigned long fa2 = 0x0; + unsigned long fa4 = 0x6902; + + IHIL_Write_Read_Mem_Ap(0, 0xE0044000, &pw, WRITE); + + IHIL_Write_Read_Mem_Ap(0, 0xE0044004, &fa1, WRITE); + IHIL_Write_Read_Mem_Ap(0, 0xE0044008, &fa2, WRITE); + IHIL_Write_Read_Mem_Ap(0, 0xE0044010, &fa4, WRITE); + +#endif + return 0; +} diff --git a/Bios/src/hal/macros/GetDcoFrequency.c b/Bios/src/hal/macros/GetDcoFrequency.c index 3b643bb..44908b8 100644 --- a/Bios/src/hal/macros/GetDcoFrequency.c +++ b/Bios/src/hal/macros/GetDcoFrequency.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -51,61 +51,94 @@ #define FlashUpperBoarder 2140000ul // 2,14 MHz #define FlashLowerBoarder 1410000ul // 1,41 MHz -static unsigned short Time = 0; -/* clock on pin -static unsigned short loopDco[] = -{ - 0x40B2, 0x5A80, 0x0120, 0xC232, 0x45C2, 0x0056, 0x46C2, 0x0057, - 0x43C2, 0x0058, 0x40F2, 0x0010, 0x0022, 0x40F2, 0x0010, 0x0026, - 0xEA0A, 0xE909, 0x5319, 0x23FE, 0x531A, 0x23FC, 0x4303, 0x3FFF -}; -*/ - static unsigned short loopDco[] = { - 0x40b2, 0x5a80, 0x0120, 0xc232, 0x40f2, 0x0087, 0x0057, 0x45c2, - 0x0056, 0x46c2, 0x0057, 0x43c2, 0x0058, 0xea0a, 0xe909, 0x5319, - 0x23fe, 0x531a, 0x23fc, 0x4303, 0x3fff + 0x40b2, 0x5a80, 0x0120, 0xc232, 0xc0f2, 0x003f, 0x0057, 0xd0f2, + 0x0007, 0x0057, 0x45c2, 0x0056, 0x46c2, 0x0057, 0x43c2, 0x0058, + 0xea0a, 0xe909, 0x5319, 0x23fe, 0x531a, 0x23fc, 0x4303, 0x3fff }; static const unsigned short sizeLoopDco = (unsigned short)(sizeof(loopDco)/sizeof(*loopDco)); static unsigned short loopFll[] = { - 0x40b2, 0x5a80, 0x0120, 0xc232, 0xd072, 0x0040, 0x4032, 0x0040, - 0x40f2, 0x0080, 0x0052, 0x43c2, 0x0050, 0x45c2, 0x0051, 0x40f2, - 0x0080, 0x0053, 0x43c2, 0x0054, 0xea0a, 0xe909, 0x5319, 0x23fe, - 0x531a, 0x23fc, 0x4303, 0x3fff - /*0x40b2, 0x5a80, 0x0120, 0xc232, 0xd072, 0x0040, 0x4032, 0x0040, - 0x40f2, 0x0080, 0x0052, 0x43c2, 0x0050, 0x45c2, 0x0051, 0x40f2, - 0x0080, 0x0053, 0x43c2, 0x0054, 0xd0f2, 0x0010, 0x0022, 0xd0f2, - 0x0010, 0x0026, 0xea0a, 0xe909, 0x5319, 0x23fe, 0x531a, 0x23fc, - 0x4303, 0x3fff*/ + 0x40b2, 0x5a80, 0x0120, 0xc232, 0xd072, 0x0040, 0x4032, 0x0040, + 0x40f2, 0x0080, 0x0052, 0x43c2, 0x0050, 0x45c2, 0x0051, 0xd0f2, + 0x0080, 0x0053, 0xc0f2, 0x005f, 0x0054, 0xea0a, 0xe909, 0x5319, + 0x23fe, 0x531a, 0x23fc, 0x4303, 0x3fff }; static const unsigned short sizeLoopFll = (unsigned short)(sizeof(loopFll)/sizeof(*loopFll)); +/*--------------------------------------------------------------------------------*/ +#ifdef MSP430_UIF + static unsigned short Time = 0; -#pragma vector=TIMERA1_VECTOR -__interrupt void TIMER_A_ISR_(void) -{ - Time++; - TACTL &= ~TAIFG; -} + #pragma vector=TIMERA1_VECTOR + __interrupt void TIMER_A_ISR_(void) + { + Time++; + TACTL &= ~TAIFG; + } -static void StartTimer() -{ - TACTL = 0; // STOP Timer - TACTL &= ~CCIFG; // Clear the interrupt flag - TACTL = TASSEL_2; // Timer is runnig at 1 Mhz - TACCR0 = 0x2E9; // Load CCR0 with delay... (1ms delay) - TAR = 0; - TACTL |= TACLR + MC_1 + TAIE; // Start Timer -} + static void StartTimer() + { + TACTL = 0; // STOP Timer + TACTL &= ~CCIFG; // Clear the interrupt flag + TACTL = TASSEL_2; // Timer is runnig at 1 Mhz + TACCR0 = 0x2E9; // Load CCR0 with delay... (1ms delay) + TAR = 0; + TACTL |= TACLR + MC_1 + TAIE; // Start Timer + } -static void StopTimer() -{ - TACTL &= ~MC_1; - TACTL &= ~TAIE; // Start Timer -} + static void StopTimer() + { + TACTL &= ~MC_1; + TACTL &= ~TAIE; // Start Timer + } +#endif + +/*--------------------------------------------------------------------------------*/ + +#ifdef eZ_FET + static void StartTimer() + { + TB0CTL = 0; // STOP Timer + TB0CTL = ID__8 + TBSSEL__SMCLK; // Timer_B source:SMCLK ,SMCLK/0 = 25 + TB0CCR0 = 0x9cf; // Load CCR0 with delay... (1ms delay) + TB0CCTL0 &= ~CCIFG; // Clear the interrupt flag + TB0CCTL0 |= CCIE ; + TB0CTL |= TBCLR + MC__UP; + } + + static void StopTimer() + { + TB0CTL &= ~MC__UP; + TB0CTL = 0; // STOP Timer + // restore timer B0 1ms delay value + IHIL_InitDelayTimer(); + } +#endif + +/*--------------------------------------------------------------------------------*/ + +#ifdef MSP_FET + static void StartTimer() + { + TA2CTL = 0; // STOP Timer + TA2CTL = ID__8 + TASSEL__SMCLK; // Timer_A source:SMCLK ,SMCLK/0 = 25 + TA2CCR0 = 0x7d8; // Load CCR0 with delay... (1ms delay) + TA2CCTL0 &= ~CCIFG; // Clear the interrupt flag + TA2CCTL0 |= CCIE ; + TA2CTL |= TACLR + MC__UP; + } + + static void StopTimer() + { + TA2CTL &= ~MC__UP; + TA2CTL = 0; // STOP Timer + // restore timer A2 1ms delay value + IHIL_InitDelayTimer(); + } +#endif static unsigned long (*ReadCounterRegsFunc)() = 0; @@ -118,10 +151,9 @@ static HalFuncInOut SyncFunc = 0; static void readFromRam(unsigned short address, unsigned short* buffer, unsigned short numWords) { - decl_out while (numWords-- > 0) { - ReadMemWord(address, *buffer); + *buffer = ReadMemWord(address); address += 2; ++buffer; } @@ -131,7 +163,7 @@ static void writeToRam(unsigned short address, unsigned short* data, unsigned sh { while (numWords-- > 0) { - WriteMemWord(address, *data); + WriteMemWord(address, *data); address += 2; ++data; } @@ -139,11 +171,9 @@ static void writeToRam(unsigned short address, unsigned short* data, unsigned sh static void readFromRamX(unsigned short address, unsigned short* buffer, unsigned short numWords) { - decl_out - decl_out_long while (numWords-- > 0) { - ReadMemWordX(address, *buffer); + *buffer = ReadMemWordX(address); address += 2; ++buffer; } @@ -161,23 +191,21 @@ static void writeToRamX(unsigned short address, unsigned short* data, unsigned s static unsigned long readCounterRegisters() { - decl_out - unsigned short r9, r10; + unsigned short r9 = 0 , r10 = 0; unsigned long counter = 0; - ReadCpuReg_uShort(9, r9); - ReadCpuReg_uShort(10, r10); + r9 = ReadCpuReg_uShort(9); + r10 = ReadCpuReg_uShort(10); counter = r10; return (counter << 16) | r9; } static unsigned long readCounterRegistersX() { - decl_out - unsigned long r9, r10; + unsigned long r9 = 0, r10 = 0; - ReadCpuRegX(9, r9); - ReadCpuRegX(10, r10); + r9 = ReadCpuRegX(9); + r10 = ReadCpuRegX(10); return (r10 << 16) | r9; } @@ -204,7 +232,7 @@ static void setPCX(unsigned long address) static void setPCJtag(unsigned long address) { SetPcJtagBug(address); - TCLKset1 + IHIL_Tclk(1); } @@ -217,21 +245,35 @@ static unsigned long measureFrequency(unsigned short RamStart, unsigned short DC unsigned long counter = 0; unsigned long freq = 0; + #if defined(eZ_FET) || defined(MSP_FET) + unsigned short *TimerTick = 0; + #endif WriteRegFunc(5, DCO); WriteRegFunc(6, BCS1); - + SetPCFunc(RamStart); - cntrl_sig_release - + cntrl_sig_release(); + + #if defined(eZ_FET) || defined(MSP_FET) + STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_TIMER_TICK, &TimerTick); + #endif + StartTimer(); // Time the delay (as we could be interrupted, etc.). - startTime = Time; // System timestamp (in milliseconds). - __delay_cycles(240000ul); //~30ms + #if defined(eZ_FET) || defined(MSP_FET) + startTime = *(unsigned short*)TimerTick; // System timestamp (in milliseconds). + __delay_cycles(800000ul); + stopTime = *(unsigned short*)TimerTick; + #endif - stopTime = Time; - StopTimer(); - - { + #ifdef MSP430_UIF + startTime = Time; // System timestamp (in milliseconds). + __delay_cycles(240000ul); //~30ms + stopTime = Time; + #endif + + StopTimer(); + { StreamSafe stream_tmp; unsigned char DummyIn[8] = {0x20,0x01,0x80,0x5A,0,0,0,0}; // wdtAddr, wdtCtrl STREAM_internal_stream(DummyIn, sizeof(DummyIn), 0, 0, &stream_tmp); @@ -245,13 +287,16 @@ static unsigned long measureFrequency(unsigned short RamStart, unsigned short DC // Calculate a device speed (cycles/second). Multiply counter value by 3 (3 clock cycles per loop), // and add 31 cycles for funclet setup, then normalize to one second. - Time = 0; freq = ((counter * 3 + 31) * 1000) / elapseTime; + #if defined(eZ_FET) || defined(MSP_FET) + STREAM_deleteSharedVariable(ID_SHARED_MEMORY_TYPE_TIMER_TICK); + #endif return freq; } + short findDcoSettings(unsigned short jtagBug) { unsigned short MAXRSEL = 0x7; @@ -260,7 +305,7 @@ short findDcoSettings(unsigned short jtagBug) unsigned short BackupRam[30]; unsigned short RamStart = 0; unsigned long DcoFreq = 0; - + // get target RAM start if(STREAM_get_word(&RamStart) < 0) { @@ -271,14 +316,14 @@ short findDcoSettings(unsigned short jtagBug) { return(HALERR_EXECUTE_FUNCLET_NO_MAXRSEL); } - + if (MAXRSEL == 0xF) { BCS1 = 0x9; } - + SetPCFunc(ROM_ADDR); //Prevent Ram corruption on F123/F413 - + //----------------Backup original Ram content-------------- ReadRamFunc(RamStart, BackupRam, sizeLoopDco); @@ -297,23 +342,23 @@ short findDcoSettings(unsigned short jtagBug) { WriteRamFunc(RamStart, loopDco, sizeLoopDco); } - + if (DcoFreq == 0) { return (-1); } - + if (DcoFreq > FlashUpperBoarder) // Check for upper limit - 10%. { if(DCO-- == 0) { DCO = 7; if (BCS1-- == 0) - { + { return (-1); // Couldn't get DCO working with correct frequency. } - } - } + } + } else if (DcoFreq < FlashLowerBoarder) // Check for lower limit + 10%. { if(++DCO > 7) @@ -327,12 +372,12 @@ short findDcoSettings(unsigned short jtagBug) } else { - break; + break; } } while (--allowedSteps > 0); - // restore Ram content + // restore Ram content WriteRamFunc(RamStart, BackupRam, sizeLoopDco); if (allowedSteps <= 0) @@ -340,7 +385,7 @@ short findDcoSettings(unsigned short jtagBug) return (-1); // Couldn't get DCO working with correct frequency. } // measurement end - + // return measured values STREAM_put_word( (DCO<<5) ); STREAM_put_word( (0x80|BCS1) ); @@ -355,7 +400,7 @@ short findFllSettings(unsigned short jtagBug) unsigned short BackupRam[30]; unsigned short RamStart = 0; unsigned long DcoFreq = 0; - + // get target RAM start if(STREAM_get_word(&RamStart) < 0) { @@ -366,19 +411,19 @@ short findFllSettings(unsigned short jtagBug) //----------------Backup original Ram content-------------- ReadRamFunc(RamStart, BackupRam, sizeLoopFll); - + // ----------------Download FLL measure funclet------------ WriteRamFunc(RamStart, loopFll, sizeLoopFll); - + // Binary search through the available frequencies selecting the highest frequency < (476KHz - 10%). while (first + 1 < last) { mid = (last + first) / 2; reload = 0; - + // Select DCO range from 0.23MHz to 11.2MHz. Specify frequency via Ndco. Disable Modulation. Enable DCO+. DcoFreq = measureFrequency(RamStart, (mid << 3), 0); - + //Ram content will probably be corrupted after each measurement on devices with jtag bug //Reupload on every iteration if (jtagBug) @@ -409,10 +454,10 @@ short findFllSettings(unsigned short jtagBug) DcoFreq = measureFrequency(RamStart, (first << 3), 0); } - // restore Ram content + // restore Ram content WriteRamFunc(RamStart, BackupRam, sizeLoopDco); - if (((DcoFreq < 257000 * 5) || (DcoFreq > 476000 * 5))) + if (((DcoFreq < 257000 * 5) || (DcoFreq > 476000 * 5))) { return -1; } @@ -423,7 +468,7 @@ short findFllSettings(unsigned short jtagBug) STREAM_put_word( (first << 3) ); STREAM_put_word(0x80); STREAM_put_word(0x80); - STREAM_put_word(0); + STREAM_put_word(0); return 0; } diff --git a/Bios/src/hal/macros/GetDeviceIdPtr.c b/Bios/src/hal/macros/GetDeviceIdPtr.c new file mode 100644 index 0000000..138af83 --- /dev/null +++ b/Bios/src/hal/macros/GetDeviceIdPtr.c @@ -0,0 +1,96 @@ +/** +* \ingroup MODULMACROS +* +* \file GetDeviceIdPtr.c +* +* \brief +* +*/ +/* + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" +#include "../include/hw_compiler_specific.h" +#include "JtagId.h" + +/** + GetJtagId: required as separate macro beside StartJtag to get the JtagId + of an individual device in the JTAG chain +*/ +HAL_FUNCTION(_hal_GetDeviceIdPtr) +{ + unsigned short JtagId = 0; + unsigned short CoreIpId = 0; + long DeviceIpPointer = 0; + long IdDataAddr = 0; + unsigned long lOut_long = 0; + + JtagId = cntrl_sig_capture(); + if (!jtagIdIsValid(JtagId)) + { + return HALERR_UNDEFINED_ERROR; + } + else if (jtagIdIsXv2(JtagId)) + { + // Get Core identification info + core_ip_pointer(); + CoreIpId = SetReg_16Bits(0); + // Get device identification pointer + if(JtagId == JTAGVERSION95) + { + IHIL_Delay_1ms(1500); + } + device_ip_pointer(); + lOut_long = SetReg_20Bits(0); + // The ID pointer is an un-scrambled 20bit value + DeviceIpPointer = ((lOut_long & 0xFFFF) << 4 ) + (lOut_long >> 16 ); + if(DeviceIpPointer) + { + IdDataAddr = DeviceIpPointer + 4; + } + } + else + { + IdDataAddr = 0xFF0; + } + + STREAM_put_long(DeviceIpPointer); + STREAM_put_long(IdDataAddr); + STREAM_put_word(CoreIpId); + return 0; +} diff --git a/Bios/src/hal/macros/GetInterfaceMode.c b/Bios/src/hal/macros/GetInterfaceMode.c index c139402..286d084 100644 --- a/Bios/src/hal/macros/GetInterfaceMode.c +++ b/Bios/src/hal/macros/GetInterfaceMode.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -48,57 +48,79 @@ #include "stream.h" #include "stddef.h" #include "error_def.h" +#include "JtagId.h" +#if defined(MSP430_UIF) || defined(MSP_FET) HAL_FUNCTION(_hal_GetInterfaceMode) { unsigned short id=0, loopCount=7,i=0, protocol =0; - - // create known state! - EDT_Close(); + #ifdef MSP_FET + HilInitGetEdtDistinctFunc hilEdtDis = ((void*)0); + #endif + // create known state + #ifndef MSP_FET + IHIL_Close(); + #endif for (i = 0; i < loopCount; i++) { // set JTAG mode 1xx- 4xx if(i == 0 || i == 3)// set JTAG { - protocol = JTAG_IF; - EDT_SetProtocol(protocol); + protocol = JTAG; } - else + else { // set SBW2 mode all devices - if(i == 1 || i == 4) + if(i == 2 || i == 5) { - protocol = SPYBIWIRE_IF; - EDT_SetProtocol(protocol); + protocol = SPYBIWIRE; } // set SBW4 mode all devices - else if(i == 2|| i ==5 || i ==6) + else if(i == 1|| i ==4 || i ==6) { - protocol = SPYBIWIREJTAG_IF; - EDT_SetProtocol(protocol); + protocol = SPYBIWIREJTAG; } } + IHIL_SetProtocol(protocol); + #ifdef MSP_FET + hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + #endif + // Run 4wire/SBW entry Sequence & Reset high - EDT_Open(RSTHIGH); + IHIL_Open(RSTHIGH); // Reset TAP state machine -> Run-Test/Idle - EDT_TapReset(); + IHIL_TapReset(); // Run Fuse Check - EDT_CheckJtagFuse(); + IHIL_CheckJtagFuse(); // shift out JTAG ID - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - // Release JTAG, to set the interface into an known state / - EDT_Close(); + id = cntrl_sig_capture(); + // Release JTAG, to set the interface into an known state / + #ifndef MSP_FET + IHIL_Close(); + #endif // now check for vaild JTAG ID - if (id == JTAGVERSION || id == JTAGVERSION91 || id == JTAGVERSION95 ||id == JTAGVERSION99 ) + if (jtagIdIsValid(id)) { STREAM_put_word(id); STREAM_put_word(protocol); return 0; - } + } } - // Error no mode found; Just dummy values for id and protocoll + // Error no mode found STREAM_put_word(0xFFFF); STREAM_put_word(0xAAAA); - return HALERR_UNDEFINED_ERROR; + return HALERR_UNDEFINED_ERROR; +} +#endif + +#if defined(eZ_FET) +HAL_FUNCTION(_hal_GetInterfaceMode) +{ + STREAM_put_word(0x99); + STREAM_put_word(SPYBIWIRE); + return 0; + } +#endif diff --git a/Bios/src/hal/macros/GetInterfaceModeArm.c b/Bios/src/hal/macros/GetInterfaceModeArm.c new file mode 100644 index 0000000..51a8c47 --- /dev/null +++ b/Bios/src/hal/macros/GetInterfaceModeArm.c @@ -0,0 +1,109 @@ +/** +* \ingroup MODULMACROSXV2 +* +* \file GetInterfaceModeArm.c +* +* \brief +* +*/ +/* + * Copyright (C) 2012 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. + */ + +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "stddef.h" +#include "error_def.h" +#include "JtagId.h" + +HAL_FUNCTION(_hal_GetInterfaceModeArm) +{ + #if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long idCode = 0; + unsigned short loopCount = 4, i = 0, protocol = 0; + + #ifdef MSP_FET + HilInitGetEdtDistinctFunc hilEdtDis = ((void*)0); + #endif + + // create known state + #ifndef MSP_FET + IHIL_Close(); + #endif + for (i = 0; i < loopCount; i++) + { + // set JTAG 4 mode all ARM devices + if(i == 1 || i == 3) + { + #ifdef MSP_FET + protocol = SWD_432; + #endif + } + // set SWD mode for all devices + else if(i == 0|| i == 2 ) + { + protocol = JTAG_432; + } + + IHIL_SetProtocol(protocol); + #ifdef MSP_FET + hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + #endif + + + IHIL_Open(RSTHIGH); + // Reset TAP state machine -> Run-Test/Idle + IHIL_TapReset(); + // Run Fuse Check + idCode = _edt_Distinct_Methods.GetJtagIdCode(); + + if (idCode != 0xFFFFFFFE) + { + STREAM_put_word(idCode); + STREAM_put_word(protocol); + return 0; + } + } + #endif + // Error no mode found + STREAM_put_word(0xFFFF); + STREAM_put_word(0xAAAA); + return HALERR_UNDEFINED_ERROR; +} + + diff --git a/Bios/src/hal/macros/GetJtagId.c b/Bios/src/hal/macros/GetJtagId.c index 715b201..f568075 100644 --- a/Bios/src/hal/macros/GetJtagId.c +++ b/Bios/src/hal/macros/GetJtagId.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permittUpdate License Headered provided that the following conditions + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "JTAG_defs.h" #include "error_def.h" #include "../include/hw_compiler_specific.h" +#include "JtagId.h" /** GetJtagId: required as seperate macro beside StartJtag to get the JtagId @@ -55,58 +56,16 @@ HAL_FUNCTION(_hal_GetJtagId) { short i; unsigned short JtagId = 0; - unsigned short CoreIpId = 0; - long DeviceIpPointer = 0; - long IdDataAddr = 0; - - decl_out - decl_out_long - - //To make really sure to get the valid information - for (i = 0; i < 4; ) + + for (i = 0; i < 4; ++i) { - JtagId = EDT_Instr(IR_CNTRL_SIG_CAPTURE); + JtagId = cntrl_sig_capture(); // now get device id pointer and core ip id - if (JtagId == JTAGVERSION || JtagId == JTAGVERSION8D ) + if (jtagIdIsValid(JtagId)) { - CoreIpId = 0; - DeviceIpPointer = 0; - IdDataAddr = 0xFF0; - - //retrun values STREAM_put_word(JtagId); - STREAM_put_word(CoreIpId); - STREAM_put_long(DeviceIpPointer); - STREAM_put_long(IdDataAddr); - return 0; - } - else if(JtagId == JTAGVERSION91 || JtagId == JTAGVERSION99 || JtagId == JTAGVERSION95) - { - // Get Core identification info - core_ip_pointer - SetReg_16Bits(0); - CoreIpId = lOut; - // Get device identification pointer - device_ip_pointer - SetReg_20Bits(0); - DeviceIpPointer = lOut_long; - // The ID pointer is an un-scrambled 20bit value - DeviceIpPointer = ((DeviceIpPointer & 0xFFFF) << 4 ) + (DeviceIpPointer >> 16 ); - if(DeviceIpPointer) - { - IdDataAddr = DeviceIpPointer + 4; - } - //retrun values - STREAM_put_word(JtagId); - STREAM_put_word(CoreIpId); - STREAM_put_long(DeviceIpPointer); - STREAM_put_long(IdDataAddr); return 0; } - else - { - i++; // no valid JtagId was found - } }// end of JTAG id scan - return HALERR_UNDEFINED_ERROR; + return HALERR_UNDEFINED_ERROR; } diff --git a/Bios/src/hal/macros/GetJtagIdCodeArm.c b/Bios/src/hal/macros/GetJtagIdCodeArm.c new file mode 100644 index 0000000..19258f1 --- /dev/null +++ b/Bios/src/hal/macros/GetJtagIdCodeArm.c @@ -0,0 +1,62 @@ +/* + * \ingroup MODULMACROS + * + * \file GetJtagIdCodeArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + GetJtagIdCode: get the JEP idcode from the debug port +*/ +HAL_FUNCTION(_hal_GetJtagIdCodeArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long JtagId = _edt_Distinct_Methods.GetJtagIdCode(); + if (JtagId) + { + STREAM_put_long(JtagId); + return 0; + } +#endif + return HALERR_UNDEFINED_ERROR; +} diff --git a/Bios/src/hal/macros/GetNumOfDevices.c b/Bios/src/hal/macros/GetNumOfDevices.c index 7173e84..83d0e6b 100644 --- a/Bios/src/hal/macros/GetNumOfDevices.c +++ b/Bios/src/hal/macros/GetNumOfDevices.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -61,10 +61,10 @@ HAL_FUNCTION(_hal_GetNumOfDevices) unsigned char numOfDevices; #ifdef DB_PRINT prtstr(" @ID_GetNumOfDevices<"); -#endif - - numOfDevices = 1;//;(unsigned char)EDT_EnumChain(); - +#endif + + numOfDevices = 1; + STREAM_put_byte((unsigned char)numOfDevices); return 0; } diff --git a/Bios/src/hal/macros/HaltArm.c b/Bios/src/hal/macros/HaltArm.c new file mode 100644 index 0000000..8276dab --- /dev/null +++ b/Bios/src/hal/macros/HaltArm.c @@ -0,0 +1,96 @@ +/* + * \ingroup MODULMACROS + * + * \file HaltArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" +#include "global_variables.h" + +/** + Halt: Halts the Core +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +HAL_FUNCTION(_hal_HaltArm) +{ + short retVal = 0; +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned short* syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + // Set system and debug power up if cleared + if( powerUpArm() != 0) + { + return HALERR_UNDEFINED_ERROR; + } + + if(checkWakeup() != 0) + { + retVal = HALERR_UNDEFINED_ERROR; + } + + unsigned char retry = MAX_RETRY; + + unsigned long data = DBGKEY | C_HALT | C_DEBUGEN; + IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE); + + do + { + IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, READ); + } while(!(data & S_HALT) && --retry); + + if(!retry) + { + retVal = HALERR_UNDEFINED_ERROR; + } + + // Read out why did we halt? + IHIL_Write_Read_Mem_Ap(0, DFSR, &data, READ); + STREAM_put_long(data); +#endif + return retVal; +} diff --git a/Bios/src/hal/macros/HilCommand.c b/Bios/src/hal/macros/HilCommand.c index f72715e..8470284 100644 --- a/Bios/src/hal/macros/HilCommand.c +++ b/Bios/src/hal/macros/HilCommand.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -56,17 +56,26 @@ */ typedef enum { - HIL_CMD_RESET_JTAG_TAP, - HIL_CMD_OPEN, - HIL_CMD_CONNECT, - HIL_CMD_CLOSE, - HIL_CMD_JTAG_IR, - HIL_CMD_JTAG_DR, - HIL_TEST_REG, - HIL_TEST_REG_3V, + HIL_CMD_RESET_JTAG_TAP, + HIL_CMD_OPEN, + HIL_CMD_CONNECT, + HIL_CMD_CLOSE, + HIL_CMD_JTAG_IR, + HIL_CMD_JTAG_DR, + HIL_TEST_REG, + HIL_TEST_REG_3V, HIL_CMD_QUERY_JSTATE, HIL_CMD_WRITE_JMB, - HIL_CMD_READ_JMB, + HIL_CMD_READ_JMB, + HIL_CMD_CONFIGURE, + HIL_CMD_BSL, + HIL_CMD_FUSE_CHECK, + HIL_CMD_JTAG_IR4, + HIL_CMD_DPACC, + HIL_CMD_APACC, + HIL_CMD_MEM_AP, + HIL_CMD_BSL_1XX_4XX, + HIL_CMD_TCLK, } HIL_COMMAND; HAL_FUNCTION(_hal_HilCommand) @@ -77,148 +86,212 @@ HAL_FUNCTION(_hal_HilCommand) unsigned long dataHigh = 0; unsigned long long data = 0; unsigned long bits = 16; - unsigned char bitCounter; - unsigned long long value = 0; - - decl_jtagMailboxIn - decl_out - - - if( STREAM_get_long(&command) < 0 ) - { - return HALERR_NO_COMMAND; - } - if ( STREAM_get_long(&dataLow) < 0 ) - { - return HALERR_NO_DATA; - } - if ( STREAM_get_long(&dataHigh) < 0 ) - { - return HALERR_NO_DATA; - } - if ( STREAM_get_long(&bits) < 0 ) - { - return HALERR_NO_BIT_SIZE; - } - - data = dataLow | ((unsigned long long)dataHigh << 32); // 31 ??? - - if (command == HIL_CMD_JTAG_IR) + short streamResult = 0; + short retVal = 0; + + while (streamResult == 0) { - // Force 8-bits for IR shifts - // This is necessary because the instruction is shifted into the target MSB-first - // by the SPI interface - bits = 8; + unsigned long long value = 0; - for(bitCounter = 0; bitCounter < bits; ++bitCounter) + if( STREAM_get_long(&command) < 0 ) { - value <<= 1; - value |= (data >> bitCounter) & 1; + return HALERR_NO_COMMAND; } - } - else - { - value = data; - } - - switch (command) - { - case HIL_CMD_RESET_JTAG_TAP: - EDT_TapReset(); - break; - - case HIL_CMD_OPEN: - case HIL_CMD_CONNECT: - EDT_Open(RSTHIGH); - break; - - case HIL_CMD_CLOSE: - EDT_Close(); - if (dataLow != 0) + if ( STREAM_get_long(&dataLow) < 0 ) { - EDT_SetVcc(0); + return HALERR_NO_DATA; } - break; - - case HIL_CMD_JTAG_IR: - shiftedOut = EDT_Instr((unsigned char)value); - STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); - STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); - break; - - case HIL_CMD_JTAG_DR: - switch (bits) + if ( STREAM_get_long(&dataHigh) < 0 ) { - case 8: - shiftedOut = EDT_SetReg_XBits08((unsigned char)value & 0xFF); - break; - case 16: - shiftedOut = EDT_SetReg_XBits16((unsigned short)value & 0xFFFF); - break; - case 20: - shiftedOut = EDT_SetReg_XBits20((unsigned long)value & 0xFFFFF); - break; - case 32: - shiftedOut = EDT_SetReg_XBits32((unsigned long)value & 0xFFFFFFFF); - break; - case 64: - shiftedOut = EDT_SetReg_XBits64(value); - break; - default: - return HALERR_INVALID_BIT_SIZE; - } - STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); - STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); - break; - - case HIL_TEST_REG: - test_reg - SetReg_32Bits_((unsigned long)value) - break; - - case HIL_TEST_REG_3V: - test_reg_3V - SetReg_16Bits_((unsigned short)value) - break; - - case HIL_CMD_QUERY_JSTATE: - jstate_read - shiftedOut = EDT_SetReg_XBits64(0x0000000000000000); - STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); - STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); - break; - - case HIL_CMD_WRITE_JMB: - if(bits == 16) + return HALERR_NO_DATA; + } + streamResult = STREAM_get_long(&bits); + if (streamResult < 0) { - i_WriteJmbIn((unsigned short)dataLow); + return HALERR_NO_BIT_SIZE; } - else if(bits == 32) + + data = dataLow | ((unsigned long long)dataHigh << 32); + + if (command == HIL_CMD_JTAG_IR) { - i_WriteJmbIn32((unsigned short)dataLow, (unsigned short)(dataLow >> 16)); + unsigned char bitCounter; + + // Force 8-bits for IR shifts + // This is necessary because the instruction is shifted into the target MSB-first + // by the SPI interface + bits = 8; + + for(bitCounter = 0; bitCounter < bits; ++bitCounter) + { + value <<= 1; + value |= (data >> bitCounter) & 1; + } } else { - return (HALERR_JTAG_MAILBOX_IN_TIMOUT); + value = data; } - - if(jtagMailboxIn == 1) + + switch (command) { - return (HALERR_JTAG_MAILBOX_IN_TIMOUT); - } - break; - - case HIL_CMD_READ_JMB: - i_ReadJmbOut(shiftedOut); - STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); - STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); - break; - - - default: - return HALERR_UNKNOWN_COMMAND; + case HIL_CMD_RESET_JTAG_TAP: + IHIL_TapReset(); + break; + + case HIL_CMD_FUSE_CHECK: + IHIL_CheckJtagFuse(); + break; + + case HIL_CMD_OPEN: + case HIL_CMD_CONNECT: + IHIL_Open((unsigned char)dataLow); + break; + + case HIL_CMD_BSL: + IHIL_BSL_EntrySequence(1); + break; + + case HIL_CMD_BSL_1XX_4XX: + IHIL_BSL_EntrySequence1xx_4xx(); + break; + + case HIL_CMD_CLOSE: + IHIL_Close(); + if (dataLow != 0) + { + IHIL_SetVcc(0); + } + break; + + case HIL_CMD_JTAG_IR: + shiftedOut = _edt_Distinct_Methods.Instr((unsigned char)value); + STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); + STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); + break; + + case HIL_CMD_JTAG_IR4: + shiftedOut = IHIL_Instr4((unsigned char)value); + STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); + STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); + break; + + case HIL_CMD_JTAG_DR: + switch (bits) + { + case 8: + shiftedOut = SetReg_8Bits((unsigned char)value & 0xFF); + break; + case 16: + shiftedOut = SetReg_16Bits((unsigned short)value & 0xFFFF); + break; + case 20: + shiftedOut = SetReg_20Bits((unsigned long)value & 0xFFFFF); + break; + case 32: + shiftedOut = SetReg_32Bits((unsigned long)value & 0xFFFFFFFF); + break; + case 64: + shiftedOut = SetReg_64Bits(value); + break; + case 35: + shiftedOut = SetReg_35Bits(&value); + break; + default: + return HALERR_INVALID_BIT_SIZE; + } + STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); + STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); + break; + + case HIL_TEST_REG: + test_reg(); + SetReg_32Bits((unsigned long)value); + break; + + case HIL_TEST_REG_3V: + test_reg_3V(); + SetReg_16Bits((unsigned short)value); + break; + + case HIL_CMD_QUERY_JSTATE: + jstate_read(); + shiftedOut = SetReg_64Bits(0x0000000000000000); + STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); + STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); + break; + + case HIL_CMD_TCLK: + IHIL_Tclk((unsigned char)dataLow); + break; + + case HIL_CMD_WRITE_JMB: + { + unsigned char jtagMailboxIn = 0; + if(bits == 16) + { + jtagMailboxIn = i_WriteJmbIn((unsigned short)dataLow); + } + else if(bits == 32) + { + jtagMailboxIn = i_WriteJmbIn32((unsigned short)dataLow, (unsigned short)(dataLow >> 16)); + } + else + { + return (HALERR_JTAG_MAILBOX_IN_TIMOUT); + } + + if(jtagMailboxIn == 1) + { + return (HALERR_JTAG_MAILBOX_IN_TIMOUT); + } + break; + } + case HIL_CMD_READ_JMB: + shiftedOut = i_ReadJmbOut(); + STREAM_put_long( (unsigned long)(shiftedOut &0xFFFFFFFF) ); + STREAM_put_long( (unsigned long)(shiftedOut >> 32) ); + break; + + case HIL_CMD_CONFIGURE: + IHIL_SetProtocol(dataLow); + + { + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + } + break; + + case HIL_CMD_DPACC: + retVal = (IHIL_Write_Read_Dp((unsigned char)dataLow, // address + &dataHigh, // data + (unsigned short)bits) // rnw + > 0) ? 0 : HALERR_DAP_NACK; + STREAM_put_long(dataHigh); + break; + + case HIL_CMD_APACC: + retVal = (IHIL_Write_Read_Ap(dataLow, // address | APSEL + &dataHigh, // data + (unsigned short)bits) // rnw + > 0) ? 0 : HALERR_DAP_NACK; + STREAM_put_long(dataHigh); + break; + + case HIL_CMD_MEM_AP: + retVal = (IHIL_Write_Read_Mem_Ap((unsigned short)(bits >> 16),// ap_sel + dataLow, // address + &dataHigh, // data + (unsigned short)bits) // rnw + > 0) ? 0 : HALERR_DAP_NACK; + STREAM_put_long(dataHigh); + + break; + + default: + retVal = HALERR_UNKNOWN_COMMAND; + } } - - return 0; + return retVal; } diff --git a/Bios/src/hal/macros/IsJtagFuseBlown.c b/Bios/src/hal/macros/IsJtagFuseBlown.c index 0a0bfd6..0426cc7 100644 --- a/Bios/src/hal/macros/IsJtagFuseBlown.c +++ b/Bios/src/hal/macros/IsJtagFuseBlown.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -48,22 +48,24 @@ #endif /** - IsJtagFuseBlown + IsJtagFuseBlown */ HAL_FUNCTION(_hal_IsJtagFuseBlown) { - int i; - decl_out; - - EDT_TapReset(); // reset TAP state machine -> Run-Test/Idle - EDT_CheckJtagFuse(); // check security fuse - + unsigned short i = 0, lOut = 0; + unsigned short jtagId = 0; + for (i = 0; i < 3; i++) // First test could be negative. { - cntrl_sig_capture - SetReg_16Bits(0xaaaa); + jtagId = cntrl_sig_capture(); + if(jtagId != JTAGVERSION99 && jtagId != JTAGVERSION98 && jtagId != JTAGVERSION95 && jtagId != JTAGVERSION91 && jtagId != JTAGVERSION) + { + return -1; + } + + lOut = SetReg_16Bits(0xaaaa); // If the fuse is blown, the device will be in JTAG bypass mode, and data // input to the device will be echoed with a one-bit delay. if (lOut == 0x5555) diff --git a/Bios/src/hal/macros/LeaSyncConditional.c b/Bios/src/hal/macros/LeaSyncConditional.c new file mode 100644 index 0000000..12ccda9 --- /dev/null +++ b/Bios/src/hal/macros/LeaSyncConditional.c @@ -0,0 +1,95 @@ +/** +* \ingroup MODULMACROSXV2 +* +* \file LeaSyncConditional.c +* +* \brief +* +*/ +/* + * Copyright (C) 2015 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "EEM_defs.h" +#include "global_variables.h" + +#define LEASCCNF1 0x08 +#define LEASCBSY 0x01 + +HAL_FUNCTION(_hal_LeaSyncConditional) +{ + unsigned long baseAddres = 0; + unsigned short tclkCycles = 20000; + volatile unsigned long currentPcAddress = 0; + unsigned short leaReg = 0; + + STREAM_get_long(&baseAddres); + + leaReg = ReadMemWordXv2(baseAddres | LEASCCNF1); + if(!(leaReg & LEASCBSY)) + { + STREAM_put_word((leaReg & LEASCBSY)); + return 0; + } + + // Set PC to "safe" address + SetPcXv2(0x0080, SAFE_PC_ADDRESS); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); + + cntrl_sig_16bit(); + SetReg_16Bits(0x1501); + + while(tclkCycles-- > 0) + { + IHIL_TCLK(); + } + addr_capture(); + currentPcAddress = SetReg_20Bits(0x0); + + if((currentPcAddress != SAFE_PC_ADDRESS) && (currentPcAddress != SAFE_PC_ADDRESS+2)) + { + return -1; + } + + leaReg = ReadMemWordXv2(baseAddres | LEASCCNF1); + STREAM_put_word((leaReg & LEASCBSY)); + return 0; +} diff --git a/Bios/src/hal/macros/MagicPattern.c b/Bios/src/hal/macros/MagicPattern.c index 07ccfe0..4da9643 100644 --- a/Bios/src/hal/macros/MagicPattern.c +++ b/Bios/src/hal/macros/MagicPattern.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,16 +44,17 @@ #include "edt.h" #include "hal.h" #include "stream.h" +#include "JtagId.h" #ifdef DB_PRINT #include "debug.h" #endif /** - MagicPattern + MagicPattern This function will try to get control over the device. It will try to reset and stop the device. It will automatically switch between the different JTAG protocols also it handles - the LPMx.5 + the LPMx.5 inData: void outData: @@ -63,6 +64,8 @@ jtagId: the Jtag identifier value */ +#define BOOT_DATA_CRC_WRONG 0xC3C3 + #ifdef uController_uif extern void JSBW_EntrySequences(unsigned char states); extern void JSBW_TapReset(void); @@ -71,125 +74,170 @@ extern void JSBW_JtagUnlock(void); extern void jRelease(void); #endif -extern DevicePowerSettings devicePowerSettings; +#define BOOT_DATA_CRC_WRONG 0xC3C3 +unsigned short magicPattern = 0; + +#ifdef MSP430_UIF + short magicPatternJsbw2(); +#endif + +#pragma optimize = medium HAL_FUNCTION(_hal_MagicPattern) { - short ret_value = HALERR_UNDEFINED_ERROR; - short i = 0; - decl_out - decl_out_long - - unsigned short id=0; - unsigned char chainLen; - unsigned short protocol = JTAG_IF; + unsigned short id = 0; + unsigned char chainLen = 1; + unsigned short protocol = SPYBIWIRE; + + STREAM_get_word(&protocol); + +#ifdef eZ_FET + if(protocol != SPYBIWIRE) + { + return HALERR_MAGIC_PATTERN; + } +#endif + +#ifdef MSP430_UIF + if(protocol == SPYBIWIRE_MSP_FET) + { + return magicPatternJsbw2(); + } +#endif + + IHIL_SetProtocol(protocol); +#if defined(eZ_FET) || defined(MSP_FET) + { + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + } +#endif + // run entry sequnce but pull rst low during the sequence to wake-up the device + + IHIL_Close(); + + _edt_Common_Methods.regulateVcc(); - while( i < 4) - { - decl_jtagMailboxIn - if( i == 0 || i == 1) + IHIL_Open(RSTLOW); + IHIL_TapReset(); + IHIL_CheckJtagFuse(); + // put in magic pattern to stop user code execution + + if(i_WriteJmbIn(MAGIC_PATTERN) == 1) + { + return (HALERR_JTAG_MAILBOX_IN_TIMOUT); + } + + // run entry sequnce but pull rst high during the sequence + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + IHIL_CheckJtagFuse(); + + // Corrupted CRC handling - start -------------------------------------- + // read JTAG mailbox to see if CRC of Bootdata is damaged. + if(i_ReadJmbOut16() == BOOT_DATA_CRC_WRONG) + { + return (HALERR_MAGIC_PATTERN_BOOT_DATA_CRC_WRONG); + } + // Corrupted CRC handling - end ---------------------------------------- + + id = cntrl_sig_capture() ; + if (jtagIdIsXv2(id)) + { + //Disable Lpmx5 and power gaiting settings + if(id == JTAGVERSION98) { - protocol = SPYBIWIRE_IF; + // just disable JTAG io lock + test_reg_3V(); + SetReg_16Bits(0x4020); } - else - { - protocol = JTAG_IF; + if(id == JTAGVERSION99) + { + test_reg_3V(); + SetReg_16Bits(0x40A0); + test_reg(); + SetReg_32Bits(0x00010000); } + STREAM_put_byte((unsigned char)chainLen); + STREAM_put_byte((unsigned char)id); - EDT_SetProtocol(protocol); - - // run entry sequnce but pull rst low during the sequence to wake-up the device - EDT_Open(RSTLOW); - EDT_TapReset(); - chainLen = 1; //;(unsigned char)EDT_EnumChain(); - EDT_CheckJtagFuse(); - // put in magic pattern to stop user code execution - i_WriteJmbIn(MAGIC_PATTERN) - - if(jtagMailboxIn == 1) +#ifdef MSP_FET + if (protocol == SPYBIWIRE_MSP_FET) { - ret_value = (HALERR_JTAG_MAILBOX_IN_TIMOUT); + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + protocol = SPYBIWIREJTAG; + IHIL_SetProtocol(protocol); + hilEdtDis(&_edt_Distinct_Methods); + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + IHIL_CheckJtagFuse(); } - - //EDT_Close(); - // run entry sequnce but pull rst high during the sequence - EDT_Open(RSTHIGH); - EDT_TapReset(); - chainLen = 1; //;(unsigned char)EDT_EnumChain(); - EDT_CheckJtagFuse(); - - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if (id == JTAGVERSION95 || id == JTAGVERSION91 || id == JTAGVERSION99) - { - //Disable Lpmx5 and power gaiting settings - if(id == JTAGVERSION91) - { - // just disable JTAG i lock - test_reg_3V - SetReg_16Bits(0x4020); - } - if(id == JTAGVERSION99) - { - test_reg_3V - SetReg_16Bits(0x4020); - test_reg - SetReg_32Bits(0x00010000); - } +#endif + STREAM_put_byte((unsigned char)protocol); + + return 0; + } + return (HALERR_MAGIC_PATTERN); +} + +#ifdef MSP430_UIF + +// Force wakeup in SBW4 mode for LPMx.5 because JTAG pins are locked by LPMx.5 +// This case happens if the device is woken up, but goes into LPMx.5 very quickly +// and the device wasn't under JTAG control from a previous debug session +short magicPatternJsbw2() +{ + unsigned short i = 0; + unsigned short id = 0; + unsigned char chainLen = 1; + unsigned short protocol = SPYBIWIREJTAG; + IHIL_SetProtocol(protocol); - STREAM_put_byte((unsigned char)chainLen); - STREAM_put_byte((unsigned char)id); - STREAM_put_byte((unsigned char)protocol); - - return 0; - } - i++; - } - - // Force wakeup in SBW4 mode for LPMx.5 because JTAG pins are locked by LPMx.5 - // This case happens if the device is woken up, but goes into LPMx.5 very quickly - // and the device wasn't under JTAG control from a previous debug session -#ifdef uController_uif - - i = 0; - protocol = SPYBIWIREJTAG_IF; - EDT_SetProtocol(protocol); - while( i < 3) { - // feet in JSBW magic pattern Use real RST and TST pin of TOOL - JSBW_EntrySequences(0); + // feet in JSBW magic pattern Use real RST and TST pin of TOOL + JSBW_EntrySequences(0); JSBW_TapReset(); JSBW_MagicPattern(); - EDT_Delay_1ms(10); - jRelease(); - + IHIL_Delay_1ms(10); + jRelease(); + // disable JTAG lock - JSBW_EntrySequences(2); + JSBW_EntrySequences(2); JSBW_TapReset(); JSBW_JtagUnlock(); - EDT_Delay_1ms(10); - - // reconnect in normal JTAG 4 wire mode - EDT_Open(RSTHIGH); - EDT_TapReset(); - chainLen = 1; //;(unsigned char)EDT_EnumChain(); - EDT_CheckJtagFuse(); - - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if (id == JTAGVERSION95 || id == JTAGVERSION91 || id == JTAGVERSION99) + IHIL_Delay_1ms(10); + + // reconnect in normal JTAG 4 wire mode + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + IHIL_CheckJtagFuse(); + + id = cntrl_sig_capture(); + if (jtagIdIsXv2(id)) { - // Disable JTAG lock - // DisableLpmx5(); - - STREAM_put_byte((unsigned char)chainLen); + //Disable Lpmx5 and power gaiting settings + if(id == JTAGVERSION98) + { + // just disable JTAG i lock + test_reg_3V(); + SetReg_16Bits(0x4020); + } + if(id == JTAGVERSION99) + { + test_reg_3V(); + SetReg_16Bits(0x40A0); + test_reg(); + SetReg_32Bits(0x00010000); + } + STREAM_put_byte((unsigned char)chainLen); STREAM_put_byte((unsigned char)id); - STREAM_put_byte((unsigned char)protocol); + STREAM_put_byte((unsigned char)protocol); + return 0; - } - i++; - } -#endif - - return(ret_value); + } + i++; + } + return (HALERR_MAGIC_PATTERN); } - +#endif diff --git a/Bios/src/hal/macros/MemApTransactionArm.c b/Bios/src/hal/macros/MemApTransactionArm.c new file mode 100644 index 0000000..42aee71 --- /dev/null +++ b/Bios/src/hal/macros/MemApTransactionArm.c @@ -0,0 +1,541 @@ +/* + * \ingroup MODULMACROS + * + * \file MEMAPTransactionArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" +#include + +/** + MEMAPTransaction + Performs a memory transaction (Read/Write) on the specified port + PortNum<8>: selects the port number + RnW<8>: selects whether to perform a Read or a Write trasaction + Datawidth<16>: Indicates the width of the data transaction (8-/16-/32-bits) + Address<32>: Destination address + Count<32>: The number of bytes to write +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) + extern unsigned long cswValues[4]; +#endif + +#define ADDRESS_WRAPPING 0x00000FFFul + +/// \brief Low-level write function with timeout +/// \return 0 if timeout occured and non-zero if success +#pragma inline=forced +unsigned char writeLowLevel(unsigned char address, unsigned long dataIn) +{ + unsigned char retry = MAX_RETRY; + unsigned char ack = 0; + unsigned long long dataIn64 = ((unsigned long long)dataIn) << 3; + + do + { + unsigned long long tmp = dataIn64 | (address >> 1) | WRITE; + ack = SetReg_35Bits(&tmp) & 0x7; + } while((ack != ACK) && (--retry)); + + return retry; +} + +/// \brief Low-level read function with timeout +/// \return 0 if timeout occured and non-zero if success +#pragma inline=forced +unsigned char readLowLevel(unsigned char address, unsigned long *dataInOut) +{ + unsigned char retry = MAX_RETRY; + unsigned long long dataIn64 = ((unsigned long long)*dataInOut) << 3; + unsigned long long dataOut64; + + do + { + unsigned long long tmp = dataIn64 | (address >> 1) | READ; + dataOut64 = SetReg_35Bits(&tmp); + } + while((dataOut64 & 0x7 != ACK) && (--retry)); + + *dataInOut = dataOut64 >> 3; + + return retry; +} + +void SwdHandleError() +{ + unsigned long errorCheck = 0, resetError = 0; + // hanlde locked out state + IHIL_Write_Read_Dp(DP_DPIDR, &errorCheck, READ); + // read + IHIL_Write_Read_Dp(DP_CTRL_STAT, &errorCheck, READ); + + if(errorCheck & DP_CTRL_STAT_STICKYCMP) + { + resetError |= STKCMPCLR; + } + if(errorCheck & DP_CTRL_STAT_STICKYERR) + { + resetError |= STKERRCLR; + } + if(errorCheck & DP_CTRL_STAT_WDATAERR) + { + resetError |= WDERRCLR; + } + if(errorCheck & DP_CTRL_STAT_STICKYORUN) + { + resetError |= ORUNERRCLR; + } + if(resetError != 0) + { + IHIL_Write_Read_Dp(DP_DPIDR, &resetError, WRITE); + } +} + +short JtagHandleError() +{ + short retVal = 0; + unsigned long errorCheck = 0, resetError = 0; + // Check for errors + //prepare read CTRL/STAT reg + IHIL_Write_Read_Dp(DP_CTRL_STAT, &errorCheck, READ); + //read CTRL/STAT reg + IHIL_Write_Read_Dp(DP_CTRL_STAT, &errorCheck, READ); + + resetError = errorCheck; + if(errorCheck & DP_CTRL_STAT_STICKYCMP) + { + resetError |= DP_CTRL_STAT_STICKYCMP; + } + if(errorCheck & DP_CTRL_STAT_STICKYERR) + { + resetError |= DP_CTRL_STAT_STICKYERR; + } + if(errorCheck & DP_CTRL_STAT_WDATAERR) + { + resetError |= DP_CTRL_STAT_WDATAERR; + } + if(errorCheck & DP_CTRL_STAT_STICKYORUN) + { + resetError |= DP_CTRL_STAT_STICKYORUN; + } + if(resetError != 0) + { + IHIL_Write_Read_Dp(DP_CTRL_STAT, &resetError, WRITE); + + //prepare read CTRL/STAT reg + IHIL_Write_Read_Dp(DP_CTRL_STAT, &errorCheck, READ); + //read CTRL/STAT reg + IHIL_Write_Read_Dp(DP_CTRL_STAT, &errorCheck, READ); + if(errorCheck & DP_CTRL_STAT_STICKYERR || + errorCheck & DP_CTRL_STAT_STICKYORUN || + errorCheck & DP_CTRL_STAT_STICKYCMP || + errorCheck & DP_CTRL_STAT_WDATAERR) + { + retVal = -1; + } + else + { + retVal = 0; + } + } + else + { + retVal = 0; + } + return retVal; +} + +/// \brief Stream the correct data size back to the DLL +#define STREAM_DATA(data) \ + do \ + { \ + data >>= (address & 0x3) * 8; \ + switch(dataWidth) \ + { \ + case AP_CSW_SIZE_8BIT: \ + STREAM_put_byte((unsigned char)data); \ + break; \ + case AP_CSW_SIZE_16BIT: \ + STREAM_put_word((unsigned short)data); \ + break; \ + case AP_CSW_SIZE_32BIT: \ + STREAM_put_long((unsigned long)data); \ + break; \ + } \ + } while(0) + + +HAL_FUNCTION(_hal_MemApTransactionArm) +{ + short retVal = 0; +#if defined(MSP430_UIF) || defined(MSP_FET) + static unsigned long long apsel; + static unsigned short rnw; + static unsigned short dataWidth; + static unsigned long address; + static unsigned long count; + + unsigned char *pBuf; + unsigned short sizeOfBuf; + + unsigned long data; + + if(flags & MESSAGE_NEW_MSG) + { // Do initial setup + apsel = 0ull; + if(STREAM_get_word((unsigned short *)&apsel) == -1) + { + return -1; + } + if(STREAM_get_word(&rnw) == -1) + { + return -1; + } + if(STREAM_get_word(&dataWidth) == -1) + { + return -1; + } + if(STREAM_get_long(&address) == -1) + { + return -1; + } + if(STREAM_get_long(&count) == -1) + { + return -1; + } + if(!count) + { // Nothing to do, just return without failure + return 0; + } + + apsel <<= 24; + count >>= dataWidth; // Calculate the number of transactions needed + + JtagHandleError(); + + // Write CSW register + data = cswValues[apsel & 0x3] | ((count == 1) ? AP_CSW_ADDRINC_OFF : AP_CSW_ADDRINC_SINGLE) | dataWidth; + IHIL_Write_Read_Ap(AP_CSW, &data, WRITE); + + // Write TAR register + IHIL_Write_Read_Ap(AP_TAR, &address, WRITE); + + } + + // Now that the setup is done, do the actual data transfer + if(rnw == WRITE) + { + STREAM_out_change_type(RESPTYP_ACKNOWLEDGE); + STREAM_flush(); + STREAM_get_buffer((void **)&pBuf,&sizeOfBuf); + while(count && sizeOfBuf) + { + switch(dataWidth) + { + case 0: + data = (*((unsigned char*) pBuf)); + break; + case 1: + data = (*((unsigned short*) pBuf)); + break; + default: + data = (*((unsigned long*) pBuf)); + break; + } + data <<= (address & 0x3) * 8; // Move to correct byte lane + + writeLowLevel(AP_DRW, data); + + pBuf += (1 << dataWidth); + address += (1 << dataWidth); + if(sizeOfBuf >= (1 << dataWidth)) + { + sizeOfBuf -= (1 << dataWidth); + } + else + { + sizeOfBuf = 0; + } + --count; + + // Check for address wrapping + if(count && !(address & ADDRESS_WRAPPING)) + { // Write TAR register + writeLowLevel(AP_TAR, address); + } + } + } + else + { // READ + data = 0; + // Initiate read + readLowLevel(AP_DRW,&data); + + while(--count) + { + readLowLevel(AP_DRW,&data); + STREAM_DATA(data); + // Check for address wrapping + if(count) + { + address += (1 << dataWidth); + if(!(address & ADDRESS_WRAPPING)) + { // Write TAR register + JtagHandleError(); + IHIL_Instr4(IR4_APACC); + writeLowLevel(AP_TAR, address); + readLowLevel(AP_DRW,&data); + } + } + } + IHIL_Instr4(IR4_DPACC); + readLowLevel(DP_RDBUFF,&data); + STREAM_DATA(data); + } + + if(count) + { // More data expected + retVal = 1; + } + else + { + data = 0; + IHIL_Write_Read_Dp(DP_RDBUFF, &data, READ); + retVal = JtagHandleError(); + } + +#endif + return retVal; +} + + + +HAL_FUNCTION(_hal_MemApTransactionArmSwd) +{ + short retVal = 0; +#ifdef MSP_FET + static unsigned long long apsel; + static unsigned short rnw; + static unsigned short dataWidth; + static unsigned long address; + static unsigned long count; + + unsigned char *pBuf; + unsigned short sizeOfBuf; + + unsigned long data; + + if(flags & MESSAGE_NEW_MSG) + { // Do initial setup + apsel = 0ull; + if(STREAM_get_word((unsigned short *)&apsel) == -1) + { + return -1; + } + if(STREAM_get_word(&rnw) == -1) + { + return -1; + } + if(STREAM_get_word(&dataWidth) == -1) + { + return -1; + } + if(STREAM_get_long(&address) == -1) + { + return -1; + } + if(STREAM_get_long(&count) == -1) + { + return -1; + } + if(!count) + { // Nothing to do, just return without failure + return 0; + } + count >>= dataWidth; // Calculate the number of transactions needed + + // enalbe ORUNDETECT in CTRL/STAT + IHIL_Write_Read_Dp(DP_CTRL_STAT, &data, READ); + data |= 0x00000001; + IHIL_Write_Read_Dp(DP_CTRL_STAT, &data, WRITE); + + + // Write CSW register + data = cswValues[apsel & 0x3] | ((count == 1) ? AP_CSW_ADDRINC_OFF : AP_CSW_ADDRINC_SINGLE) | dataWidth; + IHIL_Write_Read_Ap(AP_CSW, &data, WRITE); + + // Write TAR register + IHIL_Write_Read_Ap(AP_TAR, &address, WRITE); + + if(rnw == READ) + { + unsigned long long retVal = 0, i = 0; + // dummy read + unsigned char regiser = SWD_AP | READ << 1 | (AP_DRW & 0x0c); + do + { + retVal = IHIL_SwdTransferData(regiser, &data, READ); + SwdHandleError(); + } + while(++i < MAX_RETRY && retVal != SWD_ACK); + + if(i == MAX_RETRY) + { + return -1; + } + // dummy read end + } + } + if(rnw == WRITE) + { + STREAM_get_buffer((void **)&pBuf,&sizeOfBuf); + while(count && sizeOfBuf) + { + unsigned long long retVal = 0, i = 0; + // Move to correct byte lane + switch(dataWidth) + { + case 0: + data = (*((unsigned char*) pBuf)); + break; + case 1: + data = (*((unsigned short*) pBuf)); + break; + default: + data = (*((unsigned long*) pBuf)); + break; + } + data <<= (address & 0x3) * 8; + + unsigned char regiser = SWD_AP | WRITE << 1 | (AP_DRW & 0x0c); + do + { + retVal = IHIL_SwdTransferData(regiser, &data, WRITE); + } + while(++i < MAX_RETRY && retVal != SWD_ACK); + + if(i == MAX_RETRY) + { + return -1; + } + + pBuf += (1 << dataWidth); + address += (1 << dataWidth); + if(sizeOfBuf >= (1 << dataWidth)) + { + sizeOfBuf -= (1 << dataWidth); + } + else + { + sizeOfBuf = 0; + } + --count; + + // Check for address wrapping + if(count && !(address & ADDRESS_WRAPPING)) + { // Write TAR register + IHIL_Write_Read_Ap(AP_TAR, &address, WRITE); + SwdHandleError(); + } + } + } + else + { + //Read + unsigned long long retVal = 0, i = 0; + unsigned char regiser = SWD_AP | READ << 1 | (AP_DRW & 0x0c); + + while(--count) + { + i = 0; + data = 0; + do + { + retVal = IHIL_SwdTransferData(regiser, &data, READ); + } + while(++i < MAX_RETRY && retVal != SWD_ACK); + if(i == MAX_RETRY) + { + data = 0; + } + STREAM_DATA(data); + + if(count) + { + address += (1 << dataWidth); + if(!(address & ADDRESS_WRAPPING)) + { + SwdHandleError(); + + // Write TAR register + IHIL_Write_Read_Ap(AP_TAR, &address, WRITE); + //Trigger new read + i = 0; + do + { + retVal = IHIL_SwdTransferData(regiser, &data, READ); + SwdHandleError(); + } + while(++i < MAX_RETRY && retVal != SWD_ACK); + } + } + } + } + + if(count) + { // More data expected + retVal = 1; + } + else + { + IHIL_Write_Read_Dp(DP_RDBUFF, &data, READ); + STREAM_DATA(data); + SwdHandleError(); + + // disable ORUNDETECT in CTRL/STAT + IHIL_Write_Read_Dp(DP_CTRL_STAT, &data, READ); + data &= ~0x00000001; + IHIL_Write_Read_Dp(DP_CTRL_STAT, &data, WRITE); + } +#endif + return retVal; +} diff --git a/Bios/src/hal/macros/PollJStateReg.c b/Bios/src/hal/macros/PollJStateReg.c index fbc738a..8661177 100644 --- a/Bios/src/hal/macros/PollJStateReg.c +++ b/Bios/src/hal/macros/PollJStateReg.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -49,95 +49,441 @@ #include "stddef.h" #include "error_def.h" #include "JTAG_defs.h" +#include "global_variables.h" -/** - PollJStateReg - Queries the JSTATE register and reports any changes in the relevant bits - inData: - outData: -*/ -#define BP_HIT_MASK 0x100000000ull -#define LPMX5_MASK 0x8000000000000000ull +#define JSTATE20 0x20 +#define JSTATE21 0x21 +#define DSTATE_PC 0x00 -HAL_FUNCTION(_hal_PollJStateReg) +#define ARM_PCMCTL0 (0x40010000UL) +#define ARM_PCSR (0xE000101CUL) + +//----------------------------------------------------------------------------- +#if defined(eZ_FET) || defined(MSP_FET) +//----------------------------------------------------------------------------- + +#pragma pack(1) +typedef struct DState432 { - decl_out - decl_out_long - decl_out_long_long - short RetState = HALERR_UNDEFINED_ERROR; - unsigned long lMaskLow = 0, lMaskHigh = 0; - unsigned long long JStateMask = 0; - unsigned short forceSendState = 0; - StreamSafe stream_tmp; + unsigned long pc; + unsigned long pstate; +} DState432_t; +#pragma pack() + +#pragma pack(1) +typedef struct DState430 +{ + unsigned long long JState; +} DState430_t; +#pragma pack() + +#pragma pack(1) +typedef struct EnergyTraceRecordEt7 +{ + unsigned char eventID; + unsigned long TimeStamp; + union + { + DState430_t dstate430; + DState432_t dstate432; + }; + unsigned long currentTicks; + unsigned int voltage; +} EnergyTraceRecordEt7_t; +#pragma pack() - // Contains the previously recorded JSTATE - static unsigned long long prevJState = 0x0000000000000000; +#pragma pack(1) +typedef struct EnergyTraceRecordEt8 +{ + unsigned char eventID; + unsigned long TimeStamp; + unsigned long currentTicks; + unsigned int voltage; +} EnergyTraceRecordEt8_t; +#pragma pack() - STREAM_get_long(&lMaskLow); - STREAM_get_long(&lMaskHigh); - - STREAM_get_word(&forceSendState); +#define NUM_RECORDS_TO_CAPTURE 5 - JStateMask = ((unsigned long long)lMaskHigh << 32) | lMaskLow; +typedef enum ETMode +{ + ET_OFF_MODE = 0, +} ETMode_t; - // Query new JSTATE - jstate_read - SetReg_64Bits(0x0000000000000000) - - if(!forceSendState && ((prevJState & BP_HIT_MASK) != (lOut_long_long & BP_HIT_MASK))&&(lOut_long_long & BP_HIT_MASK)) + +unsigned long getTimeStamp(); +unsigned long getIMeasure(); + +#pragma inline=forced +unsigned long getTimeStamp() +{ + unsigned long TimeStamp = 0; + unsigned short currentTA0R = TA0R; + unsigned short currentTA0R2 = TA0R; + unsigned short * TimeTick = 0; + unsigned short testa = 0; + + if (currentTA0R2 < currentTA0R) { - STREAM_put_word(BP_HIT_FLAG); - STREAM_put_word(0x80); - STREAM_put_long(lOut_long_long & 0xFFFFFFFF); - STREAM_put_long(lOut_long_long >> 32); - - RetState = 1; - } - else if(forceSendState || ((prevJState & LPMX5_MASK) != (lOut_long_long & LPMX5_MASK))) - { - STREAM_put_word(JSTATE_CAPTURE_FLAG); - STREAM_put_long(lOut_long_long & 0xFFFFFFFF); - STREAM_put_long(lOut_long_long >> 32); - - if (((lOut_long_long & LPMX5_MASK) == 0) && !forceSendState) - { // Device woke up on its own, so sync again + currentTA0R = currentTA0R2; + } + + STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_TIME_TICK, &TimeTick); + testa = *(unsigned short*)TimeTick; + + TimeStamp = (((unsigned long)testa) << 16) + (unsigned long)(currentTA0R & 0xFFFF); + return TimeStamp; +} + +#pragma inline=forced +unsigned long getIMeasure() +{ + unsigned long IMeasure = 0; +#ifdef MSP_FET + unsigned short currentIClocks = TB0R; + unsigned short currentIClocks2 = TB0R; +#else + unsigned short currentIClocks = TA2R; + unsigned short currentIClocks2 = TA2R; +#endif + unsigned short* ITick = 0; + unsigned short testt = 0; + + if (currentIClocks2 < currentIClocks) + { + currentIClocks = currentIClocks2; + } + + STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_I_TICK, &ITick); + testt = *(unsigned short*)ITick; + + IMeasure = (((unsigned long)testt) << 16) + (unsigned long)(currentIClocks & 0xFFFF); + return IMeasure; +} +//-----------------------------------------------------------------Event type 8 only analog ------------------------------------------------------------------ + +HAL_FUNCTION(_hal_PollJStateRegEt8) +{ + static EnergyTraceRecordEt8_t buffer[NUM_RECORDS_TO_CAPTURE] = {0}; + static unsigned short currentIndex = 0; + double vcc = 0; + double extVcc= 0 ; + unsigned short mEtGatedMode = 0; + unsigned short* syncWithRunVarAddress = 0; + + if(STREAM_discard_bytes(8) == -1) + { + return -1; + } + // request shared var from bios to sync with RestoreContextRun function + + STREAM_get_word(&mEtGatedMode); + + if(mEtGatedMode) + { + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + if(!(*syncWithRunVarAddress)) + { + currentIndex = 0; + return 2; + } + } + else + { + return -1; + } + } + + buffer[currentIndex].eventID = 8; + + while(TA0R > 0xFFA0 || TA0R < 2) + { + IHIL_Delay_1us(3); + } + + _DINT_FET(); + + buffer[currentIndex].TimeStamp = getTimeStamp(); + buffer[currentIndex].currentTicks = getIMeasure(); + + IHIL_GetVcc(&vcc, &extVcc); + + _EINT_FET(); + buffer[currentIndex].voltage = (unsigned int)(vcc ? vcc : extVcc); + + // Energy trace data is available send it first -> don't check LPMx.5 or Breakpoint hit + if(++currentIndex == NUM_RECORDS_TO_CAPTURE) + { + currentIndex = 0; + STREAM_put_word(ENERGYTRACE_INFO); // Event ID + STREAM_put_byte(NUM_RECORDS_TO_CAPTURE); // Number of records that is sent + STREAM_put_byte(sizeof(EnergyTraceRecordEt8_t)); // Size of Record + STREAM_put_bytes((void *)buffer, sizeof(EnergyTraceRecordEt8_t) * NUM_RECORDS_TO_CAPTURE); + return 1; + } + + return 2; +} +//----------------------------------------------------------------------------- +#endif +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +#ifdef MSP430_UIF +//----------------------------------------------------------------------------- +unsigned short targetIsRunning = 0; + +HAL_FUNCTION(_hal_PollJStateRegEt8) +{ + return -1; +} +//----------------------------------------------------------------------------- +#endif +//----------------------------------------------------------------------------- + +#pragma inline=forced +short PollforBpHit(unsigned long long JStateValue) +{ + unsigned short* syncWithRunVarAddress = 0; + if((!(JStateValue & LPMX5_MASK_J)) && (JStateValue & BP_HIT_MASK_J)) + { + STREAM_put_word(BP_HIT_FLAG); + STREAM_put_long(JStateValue & 0xFFFFFFFF); + STREAM_put_long(JStateValue >> 32); + + // Stop polling in next loop run --> Device CPU is stoped due to BP Hit + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + return 1; + } + return 2; +} + +unsigned long long prevJState = 0x0000000000000000; + +#pragma inline=forced +short PollforLPMx5(unsigned long long JStateValue, unsigned short forceSendState) +{ + StreamSafe stream_tmp; + short RetState = -1, LPMx5Wakeup = 0; + + unsigned short* syncWithRunVarAddress = 0; + + // if we enter an LPM4 and the PC indicates taht the device wakes up form + // LPMx.5 scan mailbox for Bootcode pattern + if (!(JStateValue & LPMX5_MASK_J) && + (((JStateValue & LPM4_1MASK_J) == LPM4_1MASK_J) || ((JStateValue & LPM4_2MASK_J) == LPM4_2MASK_J))) + { + if (jmb_exchange() == JTAGVERSION99) + { + // check if JTAG mailbox is ready & perform input request + if (SetReg_16Bits(0x0004) == 0x1207) + { + if (SetReg_16Bits(0x0000) == 0xA55A) + { + LPMx5Wakeup = 1; + } + } + } + } + + if(forceSendState || ((prevJState & LPMX5_MASK_J) != (JStateValue & LPMX5_MASK_J)) || LPMx5Wakeup) + { + STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_long(JStateValue & 0xFFFFFFFF); + STREAM_put_long(JStateValue >> 32); + + if(((!(JStateValue & LPMX5_MASK_J)) && !forceSendState) || (LPMx5Wakeup && !forceSendState)) + { //Device woke up on its own, so sync again //Setup values for watchdog control regsiters - unsigned char DummyIn[8] = {WDTCTL_ADDRESS_5XX & 0xFF,(WDTCTL_ADDRESS_5XX >> 8) & 0xFF, + unsigned char DummyIn[8] = {wdtctlAddress5xx & 0xFF,(wdtctlAddress5xx >> 8) & 0xFF, WDTHOLD_DEF,WDTPW_DEF,0,0,0,0}; - unsigned short read = 0; - unsigned short Mova; - unsigned short Pc_l; - STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - // Read and Set the Program counter - ReadMemWordXv2(0xFFFE, read) - Mova = 0x0080; - Mova += (unsigned short)((read >> 8) & 0x00000F00); - Pc_l = (unsigned short)((read & 0xFFFF)); - SetPcXv2(Mova, (Pc_l+2)); - - // Set status register - WriteCpuRegXv2(2,0) - } + // Stop polling in next loop run --> Device CPU is stoped due to BP Hit + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + } RetState = 1; } else { RetState = 2; } - if(forceSendState) { RetState = 0; } else { - prevJState = lOut_long_long; + prevJState = JStateValue; } - return RetState; } + +//-----------------------------------------------------------------Event type 7---------------------------------------------------------------------- + +/** + PollJStateReg + Queries the JSTATE register and reports any changes in the relevant bits + inData: + outData: [ / ] +*/ +short PollJStateReg(unsigned short JStateVersion); + +HAL_FUNCTION(_hal_PollJStateReg20) +{ + return PollJStateReg(JSTATE20); +} + +HAL_FUNCTION(_hal_PollJStateReg) +{ + return PollJStateReg(JSTATE21); +} + +HAL_FUNCTION(_hal_PollDStatePCRegEt) +{ + return PollJStateReg(DSTATE_PC); +} + +short PollJStateReg(unsigned short JStateVersion) +{ + unsigned long long lOut_long_long = 0; +#if defined(MSP_FET) + unsigned long lOut_long = 0; +#endif + short RetState = -1; + unsigned short forceSendState = 0; + + unsigned short mBreakpointPollingActive = 0; + unsigned short mLpmPollingActive = 0; + unsigned short mEtActive = 0; + unsigned short* syncWithRunVarAddress = 0; + + STREAM_get_word(&forceSendState); + STREAM_get_word(&mBreakpointPollingActive); + STREAM_get_word(&mLpmPollingActive); + STREAM_get_word(&mEtActive); + + if(STREAM_discard_bytes(2) == -1) + { + return -1; + } + + syncWithRunVarAddress = getTargetRunningVar(); + if(!syncWithRunVarAddress) + { + return -1; + } + + if(IHIL_GetPrevInstruction() != IR_JSTATE_ID) + { + // Query new JSTATE + jstate_read(); + } + +#if defined(eZ_FET) || defined(MSP_FET) + // check if Energy Trace should be enabled + if(*syncWithRunVarAddress && mEtActive) + { + static EnergyTraceRecordEt7_t buffer[NUM_RECORDS_TO_CAPTURE] = {0}; + static unsigned short currentIndex = 0; + double vcc = 0; + double extVcc = 0; + + buffer[currentIndex].eventID = 7; + + while(TA0R > 0xFFA0 || TA0R < 2) + { + IHIL_Delay_1us(3); + } + + _DINT_FET(); + + buffer[currentIndex].TimeStamp = getTimeStamp(); + buffer[currentIndex].currentTicks = getIMeasure(); + + IHIL_GetVcc(&vcc, &extVcc); + + _EINT_FET(); + +#if defined(MSP_FET) + if(JStateVersion == DSTATE_PC) + { + // read out PC sampling register + IHIL_Write_Read_Mem_Ap(0, ARM_PCSR, &lOut_long, READ); + buffer[currentIndex].dstate432.pc = lOut_long; + // get PCMCTL0 register + IHIL_Write_Read_Mem_Ap(0, ARM_PCMCTL0, &lOut_long, READ); + buffer[currentIndex].dstate432.pstate = lOut_long; + } + else + { +#endif + lOut_long_long = SetReg8_64Bits(0xFFFFFFFFFFFFFFFF,30,JStateVersion); + buffer[currentIndex].dstate430.JState = lOut_long_long; +#if defined(MSP_FET) + } +#endif + buffer[currentIndex].voltage = (unsigned short)(vcc ? vcc : extVcc); + + // Energy trace data is available send it first -> don't check LPMx.5 or Breakpoint hit + if(++currentIndex == NUM_RECORDS_TO_CAPTURE) + { + currentIndex = 0; + STREAM_put_word(ENERGYTRACE_INFO); // Event ID + STREAM_put_byte(NUM_RECORDS_TO_CAPTURE); // Number of records that is sent + STREAM_put_byte(sizeof(EnergyTraceRecordEt7_t)); // Size of Record + STREAM_put_bytes((void *)buffer, sizeof(EnergyTraceRecordEt7_t) * NUM_RECORDS_TO_CAPTURE); + return 1; + } + } + else +#endif + { + if(!(*syncWithRunVarAddress)) + { + if(forceSendState) + { + STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_long(0); + STREAM_put_long(0); + return 0; + } + else + { + return 2; + } + } + lOut_long_long = SetReg_64Bits(0xFFFFFFFFFFFFFFFF); + } + + if(*syncWithRunVarAddress && mBreakpointPollingActive) + { + RetState = PollforBpHit(lOut_long_long); + if(RetState == 1) + { + return RetState; + } + } + + if((*syncWithRunVarAddress || forceSendState) && mLpmPollingActive && (lOut_long_long>>56 & 0xC0) != 0x40) + { + RetState = PollforLPMx5(lOut_long_long, forceSendState); + if(RetState == 1 || RetState == 0) + { + return RetState; + } + } + return 2; +} diff --git a/Bios/src/hal/macros/PollJStateReg430I.c b/Bios/src/hal/macros/PollJStateReg430I.c new file mode 100644 index 0000000..20b1ab6 --- /dev/null +++ b/Bios/src/hal/macros/PollJStateReg430I.c @@ -0,0 +1,93 @@ +/** +* \file PollStateReg430I.c +* +* \brief Write words (16bit values) to a memory mapped location +* +*/ +/* + * Copyright (C) 2012 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. + */ + +//! \ingroup MODULMACROS +//! \file PollJStateReg430I.c +//! \brief + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" + +/** + PollJStateReg430I + Queries the JSTATE register and reports any changes in the relevant bits + inData: + outData: +*/ + +HAL_FUNCTION(_hal_PollJStateReg430I) +{ + short RetState = -1; + unsigned short forceSendState = 0; + unsigned short lOut = 0; + + STREAM_get_word(&forceSendState); + + if(forceSendState) + { + lOut = cntrl_sig_capture(); + + //To check if the device woke up in the meantime + //and prevent an unwanted reset/BSL entry sequence + if (lOut != JTAGVERSION) + { + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + IHIL_CheckJtagFuse(); + lOut = cntrl_sig_capture(); + } + + if(lOut == JTAGVERSION) + { // Active + STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_long(0x00000000); + STREAM_put_long(0x00000000); + } + else + { // LPMx.5 + STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_long(0x00000000); + STREAM_put_long(0xC0000000); + } + RetState = 0; + } + return RetState; +} diff --git a/Bios/src/hal/macros/PollJStateRegFR57xx.c b/Bios/src/hal/macros/PollJStateRegFR57xx.c index 70bf7cb..36e1c23 100644 --- a/Bios/src/hal/macros/PollJStateRegFR57xx.c +++ b/Bios/src/hal/macros/PollJStateRegFR57xx.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -45,71 +45,67 @@ #include "hal_ref.h" #include "stream.h" #include "error_def.h" +#include "global_variables.h" +#include "JtagId.h" #define ACTIVE 1 #define LPM5_MODE 2 +int intstate = 0; + unsigned char getSystemState() { - volatile unsigned char TDO_Value = 0; - static int intstate = 0; - volatile unsigned short internalPC =0; - - decl_out - - EDT_Delay_1ms(5); - TDO_Value = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if(TDO_Value == JTAGVERSION91) + volatile unsigned char TDO_Value = 0; + unsigned char state = ACTIVE; + + IHIL_Delay_1ms(5); + if (jtagIdIsXv2(cntrl_sig_capture())) { - intstate = 0; // Active mode + intstate = 0; // Active mode } - else - { + else + { intstate++; - if (intstate == 1) - { - TDO_Value = 0xFF; - } + state = LPM5_MODE; } + if (intstate > 1) // device is in LPMx. now { - intstate = 0; - EDT_Close(); - EDT_Open(RSTHIGH); - EDT_TapReset(); - TDO_Value = EDT_Instr(IR_CNTRL_SIG_16BIT); - if ( (TDO_Value == JTAGVERSION91) && (EDT_Instr(IR_JMB_EXCHANGE) == JTAGVERSION91)) // if device wakeup in between check content of jtag mailbox - { + intstate = 0; + IHIL_EntrySequences(RSTHIGH); + IHIL_TapReset(); + + TDO_Value = cntrl_sig_capture(); + if ( jtagIdIsXv2(TDO_Value) && (jmb_exchange() == TDO_Value)) // if device wakeup in between check content of jtag mailbox + { + state = ACTIVE; // check if JTAG mailbox is ready & perform input request - SetReg_16Bits(0x0004) - if (lOut == 0x1207) - { - SetReg_16Bits(0x0000) - if (lOut == 0xA55A) - { + if(SetReg_16Bits(0x0004) == 0x1207) // OUTRDY | INRDY JMB_OUTREQ + { + if (SetReg_16Bits(0x0000) == 0xA55A) + { StreamSafe stream_tmp; - + //Setup values for watchdog control regsiters - unsigned char Dummy[8] = {WDTCTL_ADDRESS_5XX & 0xFF,(WDTCTL_ADDRESS_5XX >> 8) & 0xFF, + unsigned char Dummy[8] = {wdtctlAddress5xx & 0xFF,(wdtctlAddress5xx >> 8) & 0xFF, WDTHOLD_DEF|WDTSSEL_ACLK,WDTPW_DEF,0,0,0,0}; STREAM_internal_stream(Dummy, sizeof(Dummy), 0, 0, &stream_tmp); HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); - - // Back to active mode - TDO_Value = JTAGVERSION91; } else { TDO_Value = 0xFF; + state = LPM5_MODE; } } } } - return TDO_Value; + return state; } +unsigned int LPMx5_DEVICE_STATE = ACTIVE; // Assume device starts in Wake-up mode /** PollJStateReg Queries the JSTATE register and reports any changes in the relevant bits @@ -119,68 +115,51 @@ unsigned char getSystemState() HAL_FUNCTION(_hal_PollJStateRegFR57xx) { short RetState = HALERR_UNDEFINED_ERROR; - unsigned long lMaskLow = 0, lMaskHigh = 0; - unsigned long long JStateMask = 0; - - volatile unsigned char TDO_Value = 0; - - static unsigned int LPMx5_DEVICE_STATE = ACTIVE; // Assume device starts in Wake-up mode + + volatile unsigned char state = LPM5_MODE; + unsigned int oldLPMx5_DEVICE_STATE = LPMx5_DEVICE_STATE; // Initialize to not transition - - unsigned short forceSendState = 0; - STREAM_get_long(&lMaskLow); - STREAM_get_long(&lMaskHigh); - - STREAM_get_word(&forceSendState); + unsigned short forceSendState = 0; + STREAM_get_word(&forceSendState); + state = getSystemState(); - JStateMask = ((unsigned long long)lMaskHigh << 32) | lMaskLow; - - TDO_Value = getSystemState(); - // this is for querry LPMx.5 just one time if(forceSendState) { - if(TDO_Value == JTAGVERSION91) + if (state == ACTIVE) { // Active - STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_word(JSTATE_CAPTURE_FLAG); STREAM_put_long(0x00000000); STREAM_put_long(0x00000000); } else { // LPMx.5 - STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_word(JSTATE_CAPTURE_FLAG); STREAM_put_long(0x00000000); - STREAM_put_long(0xC0000000 & (unsigned long)(JStateMask >> 32 & 0xFFFFFFFF)); - } + STREAM_put_long(0x40000000); + } RetState = 0; } else { - if(TDO_Value == JTAGVERSION91) - { - LPMx5_DEVICE_STATE = ACTIVE; - } - else - { - LPMx5_DEVICE_STATE = LPM5_MODE; - } - + LPMx5_DEVICE_STATE = state; + if(oldLPMx5_DEVICE_STATE != LPMx5_DEVICE_STATE) { if( LPMx5_DEVICE_STATE == ACTIVE ) { - - STREAM_put_word(JSTATE_CAPTURE_FLAG); + + STREAM_put_word(JSTATE_CAPTURE_FLAG); STREAM_put_long(0x00000000); STREAM_put_long(0x00000000); RetState = 1; } - if( LPMx5_DEVICE_STATE == LPM5_MODE ) + else { - STREAM_put_word(JSTATE_CAPTURE_FLAG); + STREAM_put_word(JSTATE_CAPTURE_FLAG); STREAM_put_long(0x00000000); - STREAM_put_long(0xC0000000 & (unsigned long)(JStateMask >> 32 & 0xFFFFFFFF)); + STREAM_put_long(0x40000000); RetState = 1; } } diff --git a/Bios/src/hal/macros/Psa.c b/Bios/src/hal/macros/Psa.c index bd10d03..93c50cf 100644 --- a/Bios/src/hal/macros/Psa.c +++ b/Bios/src/hal/macros/Psa.c @@ -8,35 +8,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -62,18 +62,24 @@ psaCrc: CRC-16 value */ + +extern unsigned short enhancedPsa; + HAL_FUNCTION(_hal_Psa) { //Setup values for watchdog control regsiters unsigned char DummyIn[4] = {WDTCTL_ADDRESS & 0xFF, (WDTCTL_ADDRESS >> 8) & 0xFF, WDTHOLD_DEF, WDTPW_DEF}; - decl_out - decl_instrLoad unsigned long addr; unsigned long length; StreamSafe stream_tmp; short ret_value = 0; - + +#if defined(eZ_FET) || defined(MSP_FET) + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); +#endif + if(STREAM_get_long(&addr) != 0) { return HALERR_PSA_NO_ADDRESS; @@ -91,20 +97,35 @@ HAL_FUNCTION(_hal_Psa) return ret_value; } - instrLoad - EDT_SetupPsa(addr); - - data_psa + instrLoad(); - EDT_StepPsa(length); + if(enhancedPsa) + { + SetPc(addr - 4); + JTAG_EnhancedPsaSetup(addr); + } + else + { + JTAG_PsaSetup(addr); + } + + data_psa(); + + IHIL_StepPsa(length); + + shift_out_psa(); + STREAM_put_word(SetReg_16Bits(0)); - shift_out_psa - SetReg_16Bits(0) - STREAM_put_word(lOut); - - TCLKset1 + IHIL_Tclk(1); - EDT_EndPsa(); + if(enhancedPsa) + { + JTAG_EnhancedPsaEnd(); + } + else + { + JTAG_PsaEnd(); + } STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); ret_value = HAL_SyncJtag_AssertPor_SaveContext(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); diff --git a/Bios/src/hal/macros/PsaX.c b/Bios/src/hal/macros/PsaX.c index 55126a8..7be7c3d 100644 --- a/Bios/src/hal/macros/PsaX.c +++ b/Bios/src/hal/macros/PsaX.c @@ -8,35 +8,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -54,12 +54,16 @@ HAL_FUNCTION(_hal_PsaX) //Setup values for watchdog control regsiters unsigned char DummyIn[4] = {WDTCTL_ADDRESS & 0xFF, (WDTCTL_ADDRESS >> 8) & 0xFF, WDTHOLD_DEF, WDTPW_DEF}; - decl_out unsigned long addr; unsigned long length; StreamSafe stream_tmp; short ret_value = 0; - + +#if defined(eZ_FET) || defined(MSP_FET) + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); +#endif + if(STREAM_get_long(&addr) != 0) { return HALERR_PSA_NO_ADDRESS; @@ -77,23 +81,19 @@ HAL_FUNCTION(_hal_PsaX) return ret_value; } - SetPcX(addr - 4) - halt_cpu - TCLKset0 - data_16bit - SetReg_16Bits_((unsigned short)(addr - 2)) - - data_psa + SetPcX(addr - 4); + JTAG_EnhancedPsaSetup(addr); + + data_psa(); + + IHIL_StepPsa(length); - EDT_StepPsa(length); + shift_out_psa(); + STREAM_put_word(SetReg_16Bits(0)); - shift_out_psa - SetReg_16Bits(0) - STREAM_put_word(lOut); - - TCLKset1 + IHIL_Tclk(1); - EDT_EndPsa(); + JTAG_EnhancedPsaEnd(); STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); ret_value = HAL_SyncJtag_AssertPor_SaveContextX(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); diff --git a/Bios/src/hal/macros/PsaXv2.c b/Bios/src/hal/macros/PsaXv2.c index 8e2fe16..448fdbc 100644 --- a/Bios/src/hal/macros/PsaXv2.c +++ b/Bios/src/hal/macros/PsaXv2.c @@ -8,35 +8,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -47,7 +47,7 @@ #include "stream.h" #include "stddef.h" -extern unsigned char mclk_modules[16]; +extern unsigned char mclk_modules[32]; /** PsaXv2 @@ -63,62 +63,65 @@ extern unsigned char mclk_modules[16]; */ HAL_FUNCTION(_hal_PsaXv2) { - //Setup values for watchdog control regsiters - unsigned char DummyIn[21] = {WDTCTL_ADDRESS_5XX & 0xFF, (WDTCTL_ADDRESS_5XX >> 8) & 0xFF, + //Setup values for watchdog control regsiters + unsigned char DummyIn[37] = {wdtctlAddress5xx & 0xFF, (wdtctlAddress5xx >> 8) & 0xFF, WDTHOLD_DEF, WDTPW_DEF}; - decl_out - unsigned long addr; - unsigned long length; - int i; - StreamSafe stream_tmp; - - STREAM_get_long(&addr); - STREAM_get_long(&length); - - for(i=0;i<16;i++) - { - DummyIn[5+i]=mclk_modules[i]; - } - STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); - HAL_SyncJtag_AssertPor_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); - STREAM_external_stream(&stream_tmp); + unsigned long addr; + unsigned long length; + int i; + StreamSafe stream_tmp; + +#if defined(eZ_FET) || defined(MSP_FET) + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); +#endif + + STREAM_get_long(&addr); + STREAM_get_long(&length); + + for(i=0;i<32;i++) + { + DummyIn[5+i]=mclk_modules[i]; + } + STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); + HAL_SyncJtag_AssertPor_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); + STREAM_external_stream(&stream_tmp); + + { + unsigned short Mova; + unsigned short Pc_l; + + Mova = 0x0080; + Mova += (unsigned short)(((addr)>>8) & 0x00000F00); + Pc_l = (unsigned short)(((addr) & 0xFFFF)); + /** + * Start of macro: i_SetPc + */ + SetPcXv2(Mova, Pc_l); + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + /** + * End of macro: i_SetPc + */ + } + + data_16bit(); + SetReg_16Bits((unsigned short)(addr - 2)); + data_psa(); - { - unsigned short Mova; - unsigned short Pc_l; + IHIL_StepPsa(length); - Mova = 0x0080; - Mova += (unsigned short)(((addr)>>8) & 0x00000F00); - Pc_l = (unsigned short)(((addr) & 0xFFFF)); - /** - * Start of macro: i_SetPc - */ - SetPcXv2(Mova, Pc_l); - TCLKset1 - cntrl_sig_16bit - SetReg_16Bits_(0x0501) - /** - * End of macro: i_SetPc - */ - } + shift_out_psa(); + STREAM_put_word(SetReg_16Bits(0)); - data_16bit - SetReg_16Bits_((unsigned short)(addr - 2)); - data_psa + for(i=0;i<32;i++) + { + DummyIn[5+i] = mclk_modules[i]; + } + STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); + HAL_SyncJtag_AssertPor_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); + STREAM_external_stream(&stream_tmp); - EDT_StepPsa(length); - - shift_out_psa - SetReg_16Bits(0) - STREAM_put_word(lOut); - - for(i=0;i<16;i++) - { - DummyIn[5+i] = mclk_modules[i]; - } - STREAM_internal_stream(DummyIn, sizeof(DummyIn), NULL, 0, &stream_tmp); - HAL_SyncJtag_AssertPor_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); - STREAM_external_stream(&stream_tmp); - - return 0; + return 0; } diff --git a/Bios/src/hal/macros/ReadAllCpuRegs.c b/Bios/src/hal/macros/ReadAllCpuRegs.c index e8221b2..0bc7556 100644 --- a/Bios/src/hal/macros/ReadAllCpuRegs.c +++ b/Bios/src/hal/macros/ReadAllCpuRegs.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -58,19 +58,14 @@ */ HAL_FUNCTION(_hal_ReadAllCpuRegs) { - decl_out unsigned char Registers; - unsigned short tmp; - for (Registers = 1; Registers < 16; Registers++) { if(Registers == 2) { Registers += 2; } - ReadCpuReg(Registers, tmp); - STREAM_put_word(tmp); -// STREAM_put_byte(0); + STREAM_put_word(ReadCpuReg(Registers)); } return 0; diff --git a/Bios/src/hal/macros/ReadAllCpuRegsArm.c b/Bios/src/hal/macros/ReadAllCpuRegsArm.c new file mode 100644 index 0000000..8b69687 --- /dev/null +++ b/Bios/src/hal/macros/ReadAllCpuRegsArm.c @@ -0,0 +1,120 @@ +/* + * \ingroup MODULMACROSMSP432 + * + * \file ReadAllCpuRegsArm.c + * + * \brief Read CPU register values, except R0 and R2 + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "error_def.h" + +/** + ReadAllCpuRegsArm + Read CPU register values. + inData: - + outData: R0-R12, SP, LR, PC, SR, XPRS,SpecialRegs, MSP_SP, PSP_SP +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +short ReadCpurRegArm(unsigned long *data, unsigned long Rx) +{ + unsigned char retry = 0; + IHIL_Write_Read_Mem_Ap(0, DCRSR, &Rx, WRITE); // Request Read + + retry = MAX_RETRY; + + // check if wirte was sucessfully + unsigned long returnVal = 0; + do + { + IHIL_Write_Read_Mem_Ap(0, DHCSR, &returnVal, READ); + } while(--retry && !(returnVal & S_REGRDY)); + + IHIL_Write_Read_Mem_Ap(0, DCRDR, data, READ); // Read value + + if(!retry) + { + return 0; + } + return 1; +} + + +HAL_FUNCTION(_hal_ReadAllCpuRegsArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long data = 0; + // Read the General Purpose registers. + for (unsigned short Rx = 0; Rx < 16; ++Rx) + { + if(!ReadCpurRegArm(&data, Rx)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_put_long(data); + } + + if(!ReadCpurRegArm(&data, xPSR_REG)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_put_long(data); + + if(!ReadCpurRegArm(&data, spec_REG)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_put_long(data); + + if(!ReadCpurRegArm(&data, MSP_SP)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_put_long(data); + + if(!ReadCpurRegArm(&data, PSP_SP)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_put_long(data); +#endif + return 0; +} diff --git a/Bios/src/hal/macros/ReadAllCpuRegsX.c b/Bios/src/hal/macros/ReadAllCpuRegsX.c index a008c25..f53d8e8 100644 --- a/Bios/src/hal/macros/ReadAllCpuRegsX.c +++ b/Bios/src/hal/macros/ReadAllCpuRegsX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -48,7 +48,6 @@ HAL_FUNCTION(_hal_ReadAllCpuRegsX) { - decl_out unsigned char Registers; unsigned long tmp = 0; @@ -58,7 +57,7 @@ HAL_FUNCTION(_hal_ReadAllCpuRegsX) { Registers += 2; } - ReadCpuRegX(Registers, tmp); + tmp = ReadCpuRegX(Registers); STREAM_put_bytes((unsigned char*)&tmp, 3); } return 0; diff --git a/Bios/src/hal/macros/ReadAllCpuRegsXv2.c b/Bios/src/hal/macros/ReadAllCpuRegsXv2.c index 619641e..3209eeb 100644 --- a/Bios/src/hal/macros/ReadAllCpuRegsXv2.c +++ b/Bios/src/hal/macros/ReadAllCpuRegsXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -47,37 +47,46 @@ extern unsigned short altRomAddressForCpuRead; /** - ReadAllCpuRegsXv2 - Read CPU register values, except R0 and R2. This function is for 16bit CPUs with note 1377. - inData: - - outData: {12} - SP: stack pointer register (R1) - Rn: registers R4-R15 +ReadAllCpuRegsXv2 +Read CPU register values, except R0 and R2. This function is for 16bit CPUs with note 1377. +inData: - +outData: {12} +SP: stack pointer register (R1) +Rn: registers R4-R15 */ HAL_FUNCTION(_hal_ReadAllCpuRegsXv2) { - decl_out - unsigned short Registers; - unsigned short Mova; - unsigned long Rx; + unsigned short Registers; + unsigned short Mova; + unsigned long Rx; + unsigned short id = cntrl_sig_capture(); - // Read the General Purpose registers. - for (Registers = 1; Registers < 16; Registers++) // Read registers SP, and R4 through R15. - { - if(Registers == 2) + // Read the General Purpose registers. + for (Registers = 1; Registers < 16; Registers++) // Read registers SP, and R4 through R15. { - Registers += 2; - } - Mova = 0x0060; - Mova += (Registers << 8) & 0x0F00; - ReadCpuRegXv2(Mova, Rx); - STREAM_put_bytes((unsigned char*)&Rx, 3); - } + if(Registers == 2) + { + Registers += 2; + } + Mova = 0x0060; + Mova += (Registers << 8) & 0x0F00; + Rx = ReadCpuRegXv2(Mova); + STREAM_put_bytes((unsigned char*)&Rx, 3); - // all CPU register values have been moved to the JMBOUT register address - // -> JMB needs to be cleared again!! - i_ReadJmbOut(Rx) - return 0; + if(id == JTAGVERSION91 || id == JTAGVERSION99 || id == JTAGVERSION98) + { + // Set PC to "safe" address + SetPcXv2(0x0080, SAFE_PC_ADDRESS); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); + } + } + // all CPU register values have been moved to the JMBOUT register address + // -> JMB needs to be cleared again!! + Rx = i_ReadJmbOut(); + return 0; } diff --git a/Bios/src/hal/macros/ReadMemBytes.c b/Bios/src/hal/macros/ReadMemBytes.c index 4d91e24..1d20d16 100644 --- a/Bios/src/hal/macros/ReadMemBytes.c +++ b/Bios/src/hal/macros/ReadMemBytes.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -57,12 +57,11 @@ HAL_FUNCTION(_hal_ReadMemBytes) { - decl_out short ret_value = 0; unsigned long i; unsigned long lAddr; unsigned long lLen; - + if(STREAM_get_long(&lAddr) != 0) { ret_value = HALERR_READ_MEM_BYTES_NO_ADDRESS; @@ -73,25 +72,24 @@ HAL_FUNCTION(_hal_ReadMemBytes) ret_value = HALERR_READ_MEM_BYTES_NO_SIZE; goto exit; } - halt_cpu - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits(0x2419) - + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2419); + lLen *= 2; //DLL always sends size in word for(i = 0; i < lLen; i++) { - addr_16bit - SetReg_16Bits((unsigned short)lAddr) - data_to_addr - TCLKset1 - TCLKset0 - SetReg_16Bits(0) - STREAM_put_byte((unsigned char)(lOut & 0xFF)); - lAddr += 1; + addr_16bit(); + SetReg_16Bits((unsigned short)lAddr); + data_to_addr(); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_byte((unsigned char)(SetReg_16Bits(0) & 0xFF)); + lAddr += 1; } - release_cpu -exit: + release_cpu(); +exit: return(ret_value); } diff --git a/Bios/src/hal/macros/ReadMemBytesX.c b/Bios/src/hal/macros/ReadMemBytesX.c index dba4a9f..5226e1a 100644 --- a/Bios/src/hal/macros/ReadMemBytesX.c +++ b/Bios/src/hal/macros/ReadMemBytesX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -50,12 +50,10 @@ HAL_FUNCTION(_hal_ReadMemBytesX) { - decl_out unsigned long i; unsigned long lAddr; unsigned long lLen; - - + if(STREAM_get_long(&lAddr) != 0) { return HALERR_READ_MEM_WORD_NO_ADDRESS; @@ -64,27 +62,26 @@ HAL_FUNCTION(_hal_ReadMemBytesX) { return HALERR_READ_MEM_WORD_NO_SIZE; } - - halt_cpu - TCLKset0 - cntrl_sig_low_byte - SetReg_16Bits_(0x19) + + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_low_byte(); + SetReg_16Bits(0x19); lLen *= 2; //DLL always sends size in word for(i = 0; i < lLen; i++) { - addr_16bit - SetReg_20Bits_(lAddr) - data_to_addr - TCLKset1 - TCLKset0 - SetReg_16Bits(0); - STREAM_put_byte((unsigned char)(lOut & 0xFF)); + addr_16bit(); + SetReg_20Bits(lAddr); + data_to_addr(); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_byte((unsigned char)(SetReg_16Bits(0) & 0xFF)); lAddr += 1; } - TCLKset1 - - release_cpu + IHIL_Tclk(1); + + release_cpu(); return 0; } diff --git a/Bios/src/hal/macros/ReadMemQuick.c b/Bios/src/hal/macros/ReadMemQuick.c index 4943768..e6ba30f 100644 --- a/Bios/src/hal/macros/ReadMemQuick.c +++ b/Bios/src/hal/macros/ReadMemQuick.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -61,36 +61,33 @@ HAL_FUNCTION(_hal_ReadMemQuick) { - decl_out - decl_instrLoad unsigned long i; unsigned long lAddr; unsigned long lLen; unsigned short Pc; - + STREAM_get_long(&lAddr); STREAM_get_long(&lLen); - + Pc = (unsigned short)((lAddr-2 & 0xFFFF)); - - instrLoad - SetPc(Pc) + instrLoad(); + + SetPc(Pc); + + halt_cpu(); - halt_cpu + data_quick(); - data_quick - for (i = 0; i < lLen; i++) { - TCLKset1 - TCLKset0 - SetReg_16Bits(0); // Read data from memory. - STREAM_put_word(lOut); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_word(SetReg_16Bits(0)); } - TCLKset1 + IHIL_Tclk(1); - release_cpu + release_cpu(); return 0; } diff --git a/Bios/src/hal/macros/ReadMemQuickX.c b/Bios/src/hal/macros/ReadMemQuickX.c index 59f3326..63454d2 100644 --- a/Bios/src/hal/macros/ReadMemQuickX.c +++ b/Bios/src/hal/macros/ReadMemQuickX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -48,8 +48,6 @@ HAL_FUNCTION(_hal_ReadMemQuickX) { - decl_out - decl_instrLoad unsigned long i; unsigned long lAddr; unsigned long lLen; @@ -57,24 +55,23 @@ HAL_FUNCTION(_hal_ReadMemQuickX) STREAM_get_long(&lAddr); STREAM_get_long(&lLen); - instrLoad + instrLoad(); + + SetPcX(lAddr - 2); - SetPcX(lAddr - 2) + halt_cpu(); - halt_cpu + data_quick(); - data_quick - for (i = 0; i < lLen; i++) { - TCLKset1 - TCLKset0 - SetReg_16Bits(0); // Read data from memory. - STREAM_put_word(lOut); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_word(SetReg_16Bits(0)); } - TCLKset1 + IHIL_Tclk(1); - release_cpu + release_cpu(); return 0; } diff --git a/Bios/src/hal/macros/ReadMemQuickXv2.c b/Bios/src/hal/macros/ReadMemQuickXv2.c index 97e26f6..bd8da35 100644 --- a/Bios/src/hal/macros/ReadMemQuickXv2.c +++ b/Bios/src/hal/macros/ReadMemQuickXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -57,54 +57,57 @@ HAL_FUNCTION(_hal_ReadMemQuickXv2) { - decl_out unsigned long i; unsigned long lAddr; unsigned long lLen; unsigned long lPc; unsigned short Mova; unsigned short Pc_l; - + unsigned short id = cntrl_sig_capture(); + STREAM_get_long(&lAddr); STREAM_get_long(&lLen); STREAM_get_long(&lPc); - + if(id == JTAGVERSION91 || id == JTAGVERSION99 || id == JTAGVERSION98) + { // Set PC to "safe" address + lPc = SAFE_PC_ADDRESS; + } + Mova = 0x0080; Mova += (unsigned short)((lAddr>>8) & 0x00000F00); Pc_l = (unsigned short)((lAddr & 0xFFFF)); - + // SET PROGRAM COUNTER for QUICK ACCESS SetPcXv2(Mova, Pc_l); - cntrl_sig_16bit - SetReg_16Bits(0x0501) - TCLKset1 - addr_capture + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); // END OF SETTING THE PROGRAM COUNTER - data_quick - + data_quick(); + // DATA QUICK LOOP for (i = 0; i < lLen; i++) { - TCLKset1 - TCLKset0 - SetReg_16Bits(0); // Read data from memory. - STREAM_put_word(lOut); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_word( SetReg_16Bits(0)); } // Check save State - cntrl_sig_capture - SetReg_16Bits_(0x0000); + cntrl_sig_capture(); + SetReg_16Bits(0x0000); // Restore PC Mova = 0x0080; Mova += (unsigned short)((lPc>>8) & 0x00000F00); Pc_l = (unsigned short)((lPc & 0xFFFF)); - - // SET PROGRAM COUNTER for QUICK ACCESS + + // SET PROGRAM COUNTER for Backup SetPcXv2(Mova, Pc_l); - cntrl_sig_16bit - SetReg_16Bits(0x0501) - TCLKset1 - addr_capture - + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); + return 0; } diff --git a/Bios/src/hal/macros/ReadMemWords.c b/Bios/src/hal/macros/ReadMemWords.c index 5902d79..5c8d2c8 100644 --- a/Bios/src/hal/macros/ReadMemWords.c +++ b/Bios/src/hal/macros/ReadMemWords.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -58,16 +58,13 @@ length: number of words to read data: requested data */ - + HAL_FUNCTION(_hal_ReadMemWords) { - decl_out - decl_instrLoad unsigned long i; unsigned long lAddr; unsigned long lLen; - - + if(STREAM_get_long(&lAddr) != 0) { return HALERR_READ_MEM_WORD_NO_ADDRESS; @@ -77,23 +74,22 @@ HAL_FUNCTION(_hal_ReadMemWords) return HALERR_READ_MEM_WORD_NO_SIZE; } - halt_cpu - TCLKset0 + halt_cpu(); + IHIL_Tclk(0); for(i = 0; i < lLen; i++) { - addr_16bit - SetReg_16Bits_((unsigned short)lAddr) - data_to_addr - TCLKset1 - TCLKset0 - SetReg_16Bits(0); - STREAM_put_word(lOut); + addr_16bit(); + SetReg_16Bits((unsigned short)lAddr); + data_to_addr(); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_word(SetReg_16Bits(0)); lAddr += 2; } - TCLKset1 - release_cpu + IHIL_Tclk(1); + release_cpu(); - instrLoad + instrLoad(); return 0; } diff --git a/Bios/src/hal/macros/ReadMemWordsX.c b/Bios/src/hal/macros/ReadMemWordsX.c index f766a9f..f88b24b 100644 --- a/Bios/src/hal/macros/ReadMemWordsX.c +++ b/Bios/src/hal/macros/ReadMemWordsX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -48,12 +48,10 @@ HAL_FUNCTION(_hal_ReadMemWordsX) { - decl_out unsigned long i; unsigned long lAddr; unsigned long lLen; - - + if(STREAM_get_long(&lAddr) != 0) { return HALERR_READ_MEM_WORD_NO_ADDRESS; @@ -62,24 +60,23 @@ HAL_FUNCTION(_hal_ReadMemWordsX) { return HALERR_READ_MEM_WORD_NO_SIZE; } - - halt_cpu - TCLKset0 + + halt_cpu(); + IHIL_Tclk(0); for(i = 0; i < lLen; i++) { - addr_16bit - SetReg_20Bits_(lAddr) - data_to_addr - TCLKset1 - TCLKset0 - SetReg_16Bits(0); - STREAM_put_word(lOut); + addr_16bit(); + SetReg_20Bits(lAddr); + data_to_addr(); + IHIL_Tclk(1); + IHIL_Tclk(0); + STREAM_put_word(SetReg_16Bits(0)); lAddr += 2; } - TCLKset1 - - release_cpu + IHIL_Tclk(1); + + release_cpu(); return 0; } diff --git a/Bios/src/hal/macros/ReadMemWordsXv2.c b/Bios/src/hal/macros/ReadMemWordsXv2.c index a04b710..4a9efce 100644 --- a/Bios/src/hal/macros/ReadMemWordsXv2.c +++ b/Bios/src/hal/macros/ReadMemWordsXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -56,32 +56,28 @@ HAL_FUNCTION(_hal_ReadMemWordsXv2) { - decl_out unsigned long i; unsigned long lAddr; unsigned long lLen; STREAM_get_long(&lAddr); STREAM_get_long(&lLen); -//! \todo remove lines below after checking JTAG-chain requirements -// cntrl_sig_16bit -// SetReg_16Bits(0x0101 | TCE) - TCLKset0 - + + IHIL_Tclk(0); + for(i = 0; i < lLen; i++) { - addr_16bit - SetReg_20Bits_(lAddr) - TCLKset1 - TCLKset0 - data_capture - SetReg_16Bits(0); - STREAM_put_word(lOut); + addr_16bit(); + SetReg_20Bits(lAddr); + IHIL_Tclk(1); + IHIL_Tclk(0); + data_capture(); + STREAM_put_word(SetReg_16Bits(0)); lAddr += 2; } - TCLKset1 + IHIL_Tclk(1); // one or more cycle, so CPU is driving correct MAB - TCLK + IHIL_TCLK(); return 0; } diff --git a/Bios/src/hal/macros/Reset430I.c b/Bios/src/hal/macros/Reset430I.c new file mode 100644 index 0000000..2394e73 --- /dev/null +++ b/Bios/src/hal/macros/Reset430I.c @@ -0,0 +1,81 @@ +/** +* \file Reset430I.c +* +* \brief Write words (16bit values) to a memory mapped location +* +*/ +/* + * Copyright (C) 2012 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. + */ + +//! \ingroup MODULMACROS +//! \file Reset430I.c +//! \brief + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "../include/hw_compiler_specific.h" + +/** + _hal_Reset430I + this macro will apply a BSL sequence to reset the + device and keep it in LPM4 afterwards + +*/ + +HAL_FUNCTION(_hal_Reset430I) +{ + volatile unsigned short id=0; + + /* Apply BSL Entry Sequence to Stop device execution */ + IHIL_BSL_EntrySequence(1); + /* Now the device should be in LPM4 */ + + IHIL_Delay_1ms(500); + + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + IHIL_CheckJtagFuse(); + + id = cntrl_sig_capture(); + if (id == JTAGVERSION) + { + STREAM_put_byte((unsigned char)0x1); + STREAM_put_byte((unsigned char)0x89); + STREAM_put_byte((unsigned char)SPYBIWIREJTAG); + return 0; + } + return -1; +} diff --git a/Bios/src/hal/macros/ResetArm.c b/Bios/src/hal/macros/ResetArm.c new file mode 100644 index 0000000..b549cf8 --- /dev/null +++ b/Bios/src/hal/macros/ResetArm.c @@ -0,0 +1,83 @@ +/* + * \ingroup MODULMACROS + * + * \file ResetArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + Halt: Resets and Halts the Core +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +HAL_FUNCTION(_hal_ResetArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned short resetType = 0; + + if(STREAM_get_word(&resetType) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + unsigned long data = VECTKEY | (resetType ? SYSRESETREQ : VECTRESET); + if(IHIL_Write_Read_Mem_Ap(0, AIRCR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, READ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + if(resetType == 0) + { + if(((data & 0xFF000000) >> 24) != 0x2) + { + return HALERR_UNDEFINED_ERROR; + } + } + +#endif + return 0; +} diff --git a/Bios/src/hal/macros/ResetXv2.c b/Bios/src/hal/macros/ResetXv2.c index f5b9293..08f5826 100644 --- a/Bios/src/hal/macros/ResetXv2.c +++ b/Bios/src/hal/macros/ResetXv2.c @@ -7,38 +7,41 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#define L092 1 +#define GENERIC_XV2 0 + #include "arch.h" #include "edt.h" #include "hal.h" @@ -46,53 +49,81 @@ #include "stream.h" #include "error_def.h" #include "../include/hw_compiler_specific.h" +#include "JtagId.h" /** _hal_ResetXv2 this macro will applay an RST NMI to a CPUxv2 device. after the reset the device execution will be stopped - by using the JTAG mailbox + by using the JTAG mailbox */ - HAL_FUNCTION(_hal_ResetXv2) -{ - decl_out - unsigned short id=0; - decl_jtagMailboxIn - - EDT_SetTest(0); - EDT_Delay_1ms(40); - EDT_SetReset(0); - EDT_Delay_1ms(40); - EDT_SetReset(1); - EDT_Delay_1ms(40); - EDT_SetTest(1); - EDT_Delay_1ms(40); - - EDT_Open(RSTLOW); - EDT_TapReset(); - EDT_CheckJtagFuse(); - // put in magic pattern to stop user code execution - i_WriteJmbIn(MAGIC_PATTERN); - +{ + // put in magic pattern to stop user code execution + IHIL_EntrySequences(RSTLOW); + IHIL_TapReset(); + + if(i_WriteJmbIn(MAGIC_PATTERN) == 1) + { + return HALERR_UNDEFINED_ERROR; + } + IHIL_Delay_1ms(40); + + IHIL_SetReset(1); + if (jtagIdIsXv2(cntrl_sig_capture())) + { + return 0; + } + return HALERR_UNDEFINED_ERROR; +} + +HAL_FUNCTION(_hal_Reset5438Xv2) +{ + IHIL_SetReset(0); + IHIL_Delay_1ms(40); + + IHIL_SetTest(0); + IHIL_Delay_1ms(40); + + IHIL_EntrySequences(RSTHIGH); + IHIL_TapReset(); + + if (jtagIdIsXv2(cntrl_sig_capture())) + { + return 0; + } + return HALERR_UNDEFINED_ERROR; +} + +HAL_FUNCTION(_hal_ResetL092) +{ + unsigned char jtagMailboxIn = 0; + unsigned long activationKey = 0; + if(STREAM_get_long(&activationKey) < 0) + { + return(HALERR_START_JTAG_NO_ACTIVATION_CODE); + } + if(activationKey == L092_MODE || activationKey == C092_MODE) + { + // L092 has no JTAG chain support + IHIL_SetReset(0); + IHIL_Open(RSTLOW); + IHIL_TapReset(); + IHIL_SetReset(0); + + jtagMailboxIn = i_WriteJmbIn32(activationKey>>16 , activationKey); + // check for Timeout issue during mailbox request + IHIL_SetReset(1); + IHIL_Delay_1ms(3000); if(jtagMailboxIn == 1) { - return HALERR_UNDEFINED_ERROR; - } - // close connection after the device has been send to LPM4 - EDT_Close(); - - EDT_Delay_1ms(40); - // run entry sequnce but pull rst high during the sequence - EDT_Open(RSTHIGH); - EDT_TapReset(); - EDT_CheckJtagFuse(); - - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if (id == JTAGVERSION95 || id == JTAGVERSION91 || id == JTAGVERSION99) - { + return (HALERR_JTAG_PASSWORD_WRONG); + } + if (jtagIdIsXv2(cntrl_sig_capture())) + { return 0; - } - return HALERR_UNDEFINED_ERROR; + } + } + return HALERR_UNDEFINED_ERROR; } diff --git a/Bios/src/hal/macros/RestoreContext_ReleaseJtag.c b/Bios/src/hal/macros/RestoreContext_ReleaseJtag.c index 0ba62a2..cf887d1 100644 --- a/Bios/src/hal/macros/RestoreContext_ReleaseJtag.c +++ b/Bios/src/hal/macros/RestoreContext_ReleaseJtag.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "hal_ref.h" #include "stream.h" #include "EEM_defs.h" +#include "global_variables.h" extern DeviceSettings deviceSettings; @@ -70,8 +71,8 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtag) unsigned short control_mask; unsigned short mdb; unsigned short releaseJtag; - decl_out - + unsigned short* syncWithRunVarAddress = 0; + // Check all the input parameters if(STREAM_get_word(&wdt_addr) != 0) { @@ -93,7 +94,7 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtag) { return (HALERR_RESTORECONTEXT_RELEASE_JTAG_NO_CONTROL_MASK); } - if(STREAM_get_word(&mdb) == -1) + if(STREAM_get_word(&mdb) != 0) { return (HALERR_RESTORECONTEXT_RELEASE_JTAG_NO_MDB); } @@ -101,84 +102,98 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtag) { releaseJtag = 0; } + STREAM_discard_bytes(2); + // Write back Status Register - WriteCpuReg(2, sr) - + WriteCpuReg(2, sr); + // Restore Watchdog Control Register WriteMemWord(wdt_addr, wdt_value); - + // restore Program Counter SetPc(pc[0]); // High part is not relevant for MSP430 original architecture /* Workaround for MSP430F149 derivatives */ { - decl_out unsigned short backup[3] = {0}; - eem_data_exchange - SetReg_16Bits_(0x03) SetReg_16Bits(0) backup[0] = lOut; - SetReg_16Bits_(0x0B) SetReg_16Bits(0) backup[1] = lOut; - SetReg_16Bits_(0x13) SetReg_16Bits(0) backup[2] = lOut; - - SetReg_16Bits_(0x02) SetReg_16Bits_(0) - SetReg_16Bits_(0x0A) SetReg_16Bits_(0) - SetReg_16Bits_(0x12) SetReg_16Bits_(0) - - SetReg_16Bits_(0x02) SetReg_16Bits_(backup[0]) - SetReg_16Bits_(0x0A) SetReg_16Bits_(backup[1]) - SetReg_16Bits_(0x12) SetReg_16Bits_(backup[2]) + eem_data_exchange(); + SetReg_16Bits(0x03); backup[0] = SetReg_16Bits(0); + SetReg_16Bits(0x0B); backup[1] = SetReg_16Bits(0); + SetReg_16Bits(0x13); backup[2] = SetReg_16Bits(0); + + SetReg_16Bits(0x02); SetReg_16Bits(0); + SetReg_16Bits(0x0A); SetReg_16Bits(0); + SetReg_16Bits(0x12); SetReg_16Bits(0); + + SetReg_16Bits(0x02); SetReg_16Bits(backup[0]); + SetReg_16Bits(0x0A); SetReg_16Bits(backup[1]); + SetReg_16Bits(0x12); SetReg_16Bits(backup[2]); } /**/ - + if (deviceSettings.clockControlType != GCC_NONE) { if(deviceSettings.stopFLL) - { + { unsigned short clkCntrl = 0; // read access to EEM General Clock Control Register (GCLKCTRL) - eem_data_exchange - SetReg_16Bits_(MX_GCLKCTRL + MX_READ) - SetReg_16Bits(0) + eem_data_exchange(); + SetReg_16Bits(MX_GCLKCTRL + MX_READ); + clkCntrl = SetReg_16Bits(0); + // added UPSF: FE427 does regulate the FLL to the upper boarder - // added the switch off and release of FLL (JTFLLO) - clkCntrl = lOut; + // added the switch off and release of FLL (JTFLLO) clkCntrl &= ~0x10; - eem_data_exchange - SetReg_16Bits_(MX_GCLKCTRL + MX_WRITE) - SetReg_16Bits_(clkCntrl); + eem_data_exchange(); + SetReg_16Bits(MX_GCLKCTRL + MX_WRITE); + SetReg_16Bits(clkCntrl); } } - + if (deviceSettings.clockControlType == GCC_EXTENDED) { - eem_data_exchange - SetReg_16Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_16Bits_(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN) // write into MX_GENCNTRL + eem_data_exchange(); + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN); // write into MX_GENCNTRL } - + if (deviceSettings.clockControlType == GCC_STANDARD_I) + { + eem_data_exchange(); + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN); // write into MX_GENCNTRL + } + // activate EEM - eem_write_control - SetReg_16Bits_(control_mask) - + eem_write_control(); + SetReg_16Bits(control_mask); + // Pre-initialize MDB before release if if(mdb) { - data_16bit - SetReg_16Bits_(mdb) - TCLKset0 - addr_capture - TCLKset1 + data_16bit(); + SetReg_16Bits(mdb); + IHIL_Tclk(0); + addr_capture(); + IHIL_Tclk(1); } else { - addr_capture - } + addr_capture(); + } + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0001; + } + // release target device from JTAG control - cntrl_sig_release - + cntrl_sig_release(); + if(releaseJtag) { - EDT_Close(); // release JTAG on go + IHIL_Close(); // release JTAG on go } return (0); } diff --git a/Bios/src/hal/macros/RestoreContext_ReleaseJtagX.c b/Bios/src/hal/macros/RestoreContext_ReleaseJtagX.c index 32b0333..096b807 100644 --- a/Bios/src/hal/macros/RestoreContext_ReleaseJtagX.c +++ b/Bios/src/hal/macros/RestoreContext_ReleaseJtagX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "hal_ref.h" #include "stream.h" #include "EEM_defs.h" +#include "global_variables.h" extern DeviceSettings deviceSettings; @@ -59,6 +60,7 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagX) unsigned short control_mask; unsigned short mdb; unsigned short releaseJtag; + unsigned short* syncWithRunVarAddress = 0; if(STREAM_get_word(&wdt_addr) != 0) { @@ -80,7 +82,7 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagX) { return HALERR_RESTORECONTEXT_RELEASE_JTAG_NO_CONTROL_MASK; } - if(STREAM_get_word(&mdb) == -1) + if(STREAM_get_word(&mdb) != 0) { return HALERR_RESTORECONTEXT_RELEASE_JTAG_NO_MDB; } @@ -88,9 +90,10 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagX) { releaseJtag = 0; } + STREAM_discard_bytes(2); // Write back Status Register - WriteCpuRegX(2, sr) + WriteCpuRegX(2, sr); // Restore Watchdog Control Register WriteMemWordX(wdt_addr, wdt_value); @@ -100,35 +103,41 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagX) if (deviceSettings.clockControlType == GCC_EXTENDED) { - eem_data_exchange32 - SetReg_32Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_32Bits_(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN) + eem_data_exchange32(); + SetReg_32Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_32Bits(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN); } // activate EEM - eem_write_control - SetReg_16Bits_(control_mask) - + eem_write_control(); + SetReg_16Bits(control_mask); + // Pre-initialize MDB before release if if(mdb) { - data_16bit - SetReg_16Bits_(mdb) - TCLKset0 - addr_capture - TCLKset1 + data_16bit(); + SetReg_16Bits(mdb); + IHIL_Tclk(0); + addr_capture(); + IHIL_Tclk(1); } else { - addr_capture + addr_capture(); + } + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0001; } // release target device from JTAG control - cntrl_sig_release - + cntrl_sig_release(); + if(releaseJtag) { - EDT_Close(); // release JTAG on go + IHIL_Close(); // release JTAG on go } return(0); diff --git a/Bios/src/hal/macros/RestoreContext_ReleaseJtagXv2.c b/Bios/src/hal/macros/RestoreContext_ReleaseJtagXv2.c index be223f0..6f7761e 100644 --- a/Bios/src/hal/macros/RestoreContext_ReleaseJtagXv2.c +++ b/Bios/src/hal/macros/RestoreContext_ReleaseJtagXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,9 +44,12 @@ #include "hal.h" #include "hal_ref.h" #include "stream.h" +#include "global_variables.h" #include "../include/hw_compiler_specific.h" +#include "EEM_defs.h" #define CPUOFF (0x0010u) +#define DBGJTAGON (0x0080u) /** RestoreContext_ReleaseJtagXv2 @@ -65,11 +68,6 @@ extern DevicePowerSettings devicePowerSettings; HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagXv2) { - DIAG_SUPPRESS(Pe550) - decl_out - decl_out_long - DIAG_DEFAULT(Pe550) - unsigned short wdt_addr; unsigned short wdt_value; unsigned short Sr; @@ -79,17 +77,21 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagXv2) unsigned short Pc_l; unsigned short Mdb; unsigned short releaseJtag = 0; - + unsigned short ulpDebug = 0; + unsigned short* syncWithRunVarAddress = 0; + + STREAM_get_word(&wdt_addr); // 0 STREAM_get_word(&wdt_value); // 2 - STREAM_get_long(&lPc); // 4-7 + STREAM_get_long(&lPc); // 4-7 STREAM_get_word(&Sr); // 8 STREAM_get_word(&control_mask); // 10 - STREAM_get_word(&Mdb); + STREAM_get_word(&Mdb); STREAM_get_word(&releaseJtag); + STREAM_get_word(&ulpDebug); // Write back Status Register WriteCpuRegXv2(0x0082, Sr); - + // Restore Watchdog Control Register WriteMemWordXv2(wdt_addr,wdt_value); @@ -97,61 +99,98 @@ HAL_FUNCTION(_hal_RestoreContext_ReleaseJtagXv2) /* check if CPU is OFF, and decrement PC = PC-2 */ if(Sr & CPUOFF) { - lPc -= 2; + lPc -= 2; } /* End of note 1411 */ - + Mova = 0x0080; Mova += (unsigned short)((lPc>>8) & 0x00000F00); Pc_l = (unsigned short)((lPc & 0xFFFF)); - + // restore Program Counter SetPcXv2(Mova, Pc_l); - + // prepare release if(Mdb) { - cntrl_sig_16bit - SetReg_16Bits_(0x0401) + cntrl_sig_16bit(); + SetReg_16Bits(0x0401); // preload the MDB before releasing the CPU - data_16bit - TCLKset1 - SetReg_16Bits_(Mdb) - TCLKset0 + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(Mdb); + IHIL_Tclk(0); // release the busses - otherwise modules/flash can't control the MDB // = get out of DATA_* instruction - addr_capture - // here one more clock cycle is required to advance the CPU + addr_capture(); + // here one more clock cycle is required to advance the CPU // otherwise enabling the EEM can stop the device again - TCLKset1 + { + cntrl_sig_capture(); + if(SetReg_16Bits(0) & CNTRL_SIG_HALT) + { + cntrl_sig_16bit(); + SetReg_16Bits(0x0403); + } + } + IHIL_Tclk(1); } else { - TCLKset1 - cntrl_sig_16bit - SetReg_16Bits_(0x0401) - addr_capture - // here one more clock cycle is required to advance the CPU - // otherwise enabling the EEM would stop the device again, because - TCLKset0 - TCLKset1 + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(0x0401); + addr_capture(); + // here one more clock cycle is required to advance the CPU + // otherwise enabling the EEM would stop the device again, because + { + cntrl_sig_capture(); + IHIL_Tclk(0); + + // shift out current control signal register value + if(SetReg_16Bits(0) & CNTRL_SIG_HALT) + { + cntrl_sig_16bit(); + SetReg_16Bits(0x0403); + } + IHIL_Tclk(1); + } } // now we can enable the EEM // --> this should work asynchronously - eem_write_control - SetReg_16Bits_(control_mask) - + eem_write_control(); + SetReg_16Bits(control_mask); + // -------------------------Power mode handling start ---------------------- - // Set LPMx.5 settings - EnableLpmx5(); + if(ulpDebug) + { + // Set LPMx.5 settings + EnableLpmx5(); + } + else + { + unsigned short id = cntrl_sig_capture(); + DisableLpmx5(); + //Manually disable DBGJTAGON bit + if(id == JTAGVERSION99) + { + test_reg_3V(); + SetReg_16Bits(SetReg_16Bits(0x0000) & ~DBGJTAGON); + } + } // -------------------------Power mode handling end ------------------------ - - // release target device from JTAG control - cntrl_sig_release - + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0001; + } + // release target device from JTAG control + cntrl_sig_release(); + if(releaseJtag) { - EDT_Close(); // release JTAG on go - } + IHIL_Close(); // release JTAG on go + } return 0; } diff --git a/Bios/src/hal/macros/RunArm.c b/Bios/src/hal/macros/RunArm.c new file mode 100644 index 0000000..3973cda --- /dev/null +++ b/Bios/src/hal/macros/RunArm.c @@ -0,0 +1,230 @@ +/* + * \ingroup MODULMACROS + * + * \file RunArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" +#include "global_variables.h" +#include "error_def.h" + +/** + Run: Runs the Core Debug +*/ +#define DISABLE_INTERRUPTS_RUN 0x02 +#define DISABLE_INTERRUPTS_UPDATE_PRIMSK 0x80 + +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +extern short writeCpuRegsArm(unsigned long data, unsigned long Rx); +extern short ReadCpurRegArm(unsigned long *data, unsigned long Rx); +#endif + +short confSystemHighPower() +{ + // Set system and debug power up if cleared + unsigned long data = 0; + unsigned short* syncWithRunVarAddress = getTargetRunningVar(); + + //force high system power + if( powerUpArm() != 0) + { + return -1; + } + // Clear sleep on ISR exit if it was set by user code + if(IHIL_Write_Read_Mem_Ap(0, SCB_SCR, &data, READ) == -1) + { + return -1; + } + if(data & SCB_SCR_SLEEPONEXIT_Msk) + { + data &= ~SCB_SCR_SLEEPONEXIT_Msk; + if(IHIL_Write_Read_Mem_Ap(0, SCB_SCR, &data, WRITE) == -1) + { + return - 1; + } + } + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0001; + } + // Do the actual run + data = DBGKEY | C_DEBUGEN; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE) == -1) + { + return -1; + } + return 0; +} + +short confSystemLowPower() +{ + // Set system and debug power up if cleared + unsigned long val = 0; + unsigned long data = 0; + unsigned short* syncWithRunVarAddress = getTargetRunningVar(); + + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, READ); + + // Request system power state tansitiopn + + // deassert CSYSPWRUPREQ + val &= ~DP_CTRL_STAT_CSYSPWRUPREQ; + // keep CDBGPWRUPREQ asserted + val |= DP_CTRL_STAT_CDBGPWRUPREQ; + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, WRITE); + + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0001; + } + // Do the actual run + data = DBGKEY | C_DEBUGEN; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE) == -1) + { + return -1; + } + // deassert CDBGPWRUPREQ + val &= ~DP_CTRL_STAT_CDBGPWRUPREQ; + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, WRITE); + + // wait some time for ACK to settle + IHIL_Delay_1ms(200); + + return 0; +} + +HAL_FUNCTION(_hal_RunArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long data = 0; + unsigned short releaseJtag = 0; + unsigned short retry = MAX_RETRY; + + STREAM_get_word(&releaseJtag); + + // First Disable all breakpoints + data = KEY; + if(IHIL_Write_Read_Mem_Ap(0, FP_CTRL, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + if (armConfigSettings.interruptOptions & DISABLE_INTERRUPTS_UPDATE_PRIMSK) + { + if (armConfigSettings.interruptOptions & DISABLE_INTERRUPTS_RUN) + { + // Making PRIMASK be effective requires one single step before + ReadCpurRegArm(&data, spec_REG); + data |= 0x01; + writeCpuRegsArm(data, spec_REG); + } + else + { + // Making PRIMASK be effective requires one single step before + ReadCpurRegArm(&data, spec_REG); + data &= ~0x01; + writeCpuRegsArm(data, spec_REG); + } + + armConfigSettings.interruptOptions &= ~DISABLE_INTERRUPTS_UPDATE_PRIMSK; + } + + // Perform single step with interrupts disabled to step over current hw breakpoint + data = DBGKEY | C_DEBUGEN | C_MASKINTS | C_HALT; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + data &= ~(C_HALT); + data |= C_STEP; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Wait for step to finish + do + { + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, READ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + } while(!(data & S_HALT) && --retry); + + // disbale masking of interrupts + data = DBGKEY | C_DEBUGEN | C_HALT; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Re-enable all breakpoints + data = KEY | ENABLE; + if(IHIL_Write_Read_Mem_Ap(0, FP_CTRL, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + if(armConfigSettings.ulpDebug) + { + if(confSystemLowPower() != 0) + { + return HALERR_UNDEFINED_ERROR; + } + } + else + { + if(confSystemHighPower() != 0) + { + return HALERR_UNDEFINED_ERROR; + } + } + + if(releaseJtag) + { + IHIL_Close(); // release JTAG on go + } +#endif + return 0; +} diff --git a/Bios/src/hal/macros/ScanApArm.c b/Bios/src/hal/macros/ScanApArm.c new file mode 100644 index 0000000..b54e504 --- /dev/null +++ b/Bios/src/hal/macros/ScanApArm.c @@ -0,0 +1,87 @@ +/* + * \ingroup MODULMACROS + * + * \file ScanAPArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + ScanAP: Scan access port and provide back nil terminated list +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) + extern unsigned long cswValues[4]; +#endif + +HAL_FUNCTION(_hal_ScanApArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long val = 0; + unsigned long apsel = 0; + + // Set system and debug power up if cleared + if( powerUpArm() != 0) + { + return HALERR_UNDEFINED_ERROR; + } + + IHIL_Write_Read_Ap(AP_IDR | apsel, &val, READ); + if(val) + { + STREAM_put_long(val); // IDR value + + IHIL_Write_Read_Ap(AP_BASE | apsel, &val, READ); + STREAM_put_long(val); // BASE value + + IHIL_Write_Read_Ap(AP_CFG | apsel, &val, READ); + STREAM_put_long(val); // CFG value + + STREAM_put_byte(apsel >> 24); // Port number + + // Read and save CSW value + IHIL_Write_Read_Ap(AP_CSW | apsel, &val, READ); + cswValues[(apsel >> 24) & 0x3] = val & ~(AP_CSW_SIZE_MASK | AP_CSW_ADDRINC_MASK); + } + STREAM_put_long(val); +#endif + return 0; +} diff --git a/Bios/src/hal/macros/SendJtagMailboxXv2.c b/Bios/src/hal/macros/SendJtagMailboxXv2.c index 984f49d..805ff34 100644 --- a/Bios/src/hal/macros/SendJtagMailboxXv2.c +++ b/Bios/src/hal/macros/SendJtagMailboxXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,6 +44,7 @@ #include "hal.h" #include "stream.h" #include "error_def.h" +#include "JtagId.h" #ifdef DB_PRINT #include "debug.h" #endif @@ -57,15 +58,12 @@ length: number of bytes to write data: data to write to the given location */ - HAL_FUNCTION(_hal_SendJtagMailboxXv2) { static unsigned short MailBoxMode; - static unsigned short PorDevice; static unsigned short DATA1 = 0x0, DATA2 = 0x0; - decl_out - decl_jtagMailboxIn - + unsigned char jtagMailboxIn = 0; + if(STREAM_get_word(&MailBoxMode) != 0) { return(HALERR_UNDEFINED_ERROR); @@ -73,46 +71,39 @@ HAL_FUNCTION(_hal_SendJtagMailboxXv2) // get length ot be flashed if(STREAM_get_word(&DATA1) != 0) { - return(HALERR_UNDEFINED_ERROR); - } - if(STREAM_get_word(&DATA2) != 0) - { - return(HALERR_UNDEFINED_ERROR); - } - if(STREAM_get_word(&PorDevice) == -1) - { - return(HALERR_UNDEFINED_ERROR); - } - if(PorDevice) - { - EDT_Open(RSTLOW); - EDT_TapReset(); + return(HALERR_UNDEFINED_ERROR); } - else + if(STREAM_get_word(&DATA2) == -1) { - EDT_Open(RSTHIGH); - EDT_TapReset(); + return(HALERR_UNDEFINED_ERROR); } + IHIL_EntrySequences(RSTLOW); + IHIL_TapReset(); + if(MailBoxMode == 0x11)// 32Bit Mode { - i_WriteJmbIn32(DATA1,DATA2) + jtagMailboxIn = i_WriteJmbIn32(DATA1,DATA2); } else // 16 Bit Mode { - i_WriteJmbIn(DATA1) + jtagMailboxIn = i_WriteJmbIn(DATA1); } - if(PorDevice) - { - // restart device - EDT_SetTest(0); - EDT_SetReset(1); - } - EDT_Delay_1ms(60); - // check if mailbox input was ok if(jtagMailboxIn) { - return(HALERR_UNDEFINED_ERROR); - } - return 0; + return(HALERR_UNDEFINED_ERROR); + } + IHIL_SetReset(1); + IHIL_Delay_1ms(40); + + IHIL_EntrySequences(RSTHIGH); + IHIL_Delay_1ms(200); + IHIL_TapReset(); + + + if (jtagIdIsXv2(cntrl_sig_capture())) + { + return 0; + } + return HALERR_UNDEFINED_ERROR; } diff --git a/Bios/src/hal/macros/SetChainConfiguration.c b/Bios/src/hal/macros/SetChainConfiguration.c index 537d5e1..46bb8d9 100644 --- a/Bios/src/hal/macros/SetChainConfiguration.c +++ b/Bios/src/hal/macros/SetChainConfiguration.c @@ -1,41 +1,40 @@ -/** -* \ingroup MODULMACROS -* -* \file SetChainConfiguration.c -* -* \brief -* -*/ /* - * Copyright (C) 2012 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 + * \ingroup MODULMACROS + * + * \file SetChainConfiguration.c + * + * \brief + * + * + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,38 +43,8 @@ #include "edt.h" #include "hal.h" #include "stream.h" -#ifdef DB_PRINT -#include "debug.h" -#endif - -// required global variables of the HAL layer -extern union _chain_Configuration chain_Configuration[]; -extern unsigned char numOfDevices; - -/** - SetChainConfiguration - \todo add description and paramter list -*/ HAL_FUNCTION(_hal_SetChainConfiguration) { - short ret_value = 0; - numOfDevices = 1; - - - return (ret_value); - /*do - { - if(STREAM_get_byte(&chain_Configuration[numOfDevices].byteAccess) < 0) - { - ret_value = HALERR_SET_CHAIN_CONFIGURATION_STREAM; - break; - } - numOfDevices++; - } - while((numOfDevices < 31) && (0 != chain_Configuration[numOfDevices-1].byteAccess)); - - numOfDevices--; - - return (ret_value); */ + return (0); } diff --git a/Bios/src/hal/macros/SetDeviceChainInfo.c b/Bios/src/hal/macros/SetDeviceChainInfo.c index 657896c..ace125b 100644 --- a/Bios/src/hal/macros/SetDeviceChainInfo.c +++ b/Bios/src/hal/macros/SetDeviceChainInfo.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -43,27 +43,8 @@ #include "edt.h" #include "hal.h" #include "stream.h" -#ifdef DB_PRINT -#include "debug.h" -#endif - -// required global variables of the HAL layer -extern unsigned short activeDevice; -extern unsigned short TCE; - -/** - SetDeviceChainInfo - \todo add description and paramter list -*/ HAL_FUNCTION(_hal_SetDeviceChainInfo) { - STREAM_get_word(&activeDevice); - - /*if ((0 == activeDevice)) - TCE = TCE1; // TCLK via TDI (is first device after TDI) - else - TCE = TCE0 | TCE1; // TCLK via instruction -*/ - return 0; + return 0; } diff --git a/Bios/src/hal/macros/SingleStep.c b/Bios/src/hal/macros/SingleStep.c index a8bcc00..94ba4cb 100644 --- a/Bios/src/hal/macros/SingleStep.c +++ b/Bios/src/hal/macros/SingleStep.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -60,84 +60,86 @@ */ HAL_FUNCTION(_hal_SingleStep) { - decl_out short RetState = HALERR_UNDEFINED_ERROR; unsigned short i = 0; unsigned short bpCntrlType = BPCNTRL_IF; unsigned short extraStep = 0; - + // local variables to enable preserve of EEM trigger block 0 unsigned short trig0_Bckup_cntrl; unsigned short trig0_Bckup_mask; unsigned short trig0_Bckup_comb; unsigned short trig0_Bckup_cpuStop; unsigned short trig0_Bckup_value; - + StreamSafe stream_tmp; - unsigned char stream_in_tmp[22]; - for(i=0;i= 50) { return (HALERR_SINGLESTEP_WAITFOREEM_TIMEOUT); } - + // check if an extra step was required if(extraStep) { extraStep = 0; // reset the "extra step" flag - + // release the CPU once again for an "extra step" from JTAG control - addr_capture - cntrl_sig_release + addr_capture(); + cntrl_sig_release(); } else { @@ -179,26 +180,26 @@ HAL_FUNCTION(_hal_SingleStep) } { // Restore Trigger Block 0 - eem_data_exchange + eem_data_exchange(); // write control register - SetReg_16Bits(MX_CNTRL + MX_WRITE) - SetReg_16Bits(trig0_Bckup_cntrl) + SetReg_16Bits(MX_CNTRL + MX_WRITE); + SetReg_16Bits(trig0_Bckup_cntrl); // write mask register - SetReg_16Bits(MX_MASK + MX_WRITE) - SetReg_16Bits(trig0_Bckup_mask) + SetReg_16Bits(MX_MASK + MX_WRITE); + SetReg_16Bits(trig0_Bckup_mask); // write combination register - SetReg_16Bits(MX_COMB + MX_WRITE) - SetReg_16Bits(trig0_Bckup_comb) + SetReg_16Bits(MX_COMB + MX_WRITE); + SetReg_16Bits(trig0_Bckup_comb); // write CPU stop reaction register - SetReg_16Bits(MX_CPUSTOP + MX_WRITE) - SetReg_16Bits(trig0_Bckup_cpuStop) + SetReg_16Bits(MX_CPUSTOP + MX_WRITE); + SetReg_16Bits(trig0_Bckup_cpuStop); // write trigger block value register - SetReg_16Bits(MX_BP + MX_WRITE) - SetReg_16Bits(trig0_Bckup_value) + SetReg_16Bits(MX_BP + MX_WRITE); + SetReg_16Bits(trig0_Bckup_value); } - + // now sync the CPU again to JTAG control and save the current context - STREAM_internal_stream(stream_in_tmp, sizeof(stream_in_tmp), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); + STREAM_internal_stream(stream_in_sync, sizeof(stream_in_sync), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); RetState = HAL_SyncJtag_Conditional_SaveContext(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); // In STREAM_external_stream(&stream_tmp); diff --git a/Bios/src/hal/macros/SingleStepArm.c b/Bios/src/hal/macros/SingleStepArm.c new file mode 100644 index 0000000..bc7b528 --- /dev/null +++ b/Bios/src/hal/macros/SingleStepArm.c @@ -0,0 +1,120 @@ +/* + * \ingroup MODULMACROS + * + * \file SingleStepArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "error_def.h" + +/** + SingleStepMSP432: Single Steps the Core Debug +*/ + +#define DISABLE_INTERRUPTS_SINGLE_STEP 0x01 + +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +HAL_FUNCTION(_hal_SingleStepArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long data; + unsigned short retry = MAX_RETRY; + + // First Disable all breakpoints + data = KEY; + if(IHIL_Write_Read_Mem_Ap(0, FP_CTRL, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Perform actual single step with interrupts disabled + data = DBGKEY | C_DEBUGEN | C_HALT; + + if (armConfigSettings.interruptOptions & DISABLE_INTERRUPTS_SINGLE_STEP) + { + data |= C_MASKINTS; + } + + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + data &= ~(C_HALT); + data |= C_STEP; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Wait for step to finish + do + { + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, READ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + } while(!(data & S_HALT) && --retry); + + // disbale masking of interrupts + data = DBGKEY | C_DEBUGEN | C_HALT; + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &data, WRITE ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + + // Re-enable all breakpoints + data = KEY | ENABLE; + if(IHIL_Write_Read_Mem_Ap(0, FP_CTRL, &data, WRITE) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + if(!retry) + { + return HALERR_UNDEFINED_ERROR; + } +#endif + + return 0; +} diff --git a/Bios/src/hal/macros/SingleStepJState.c b/Bios/src/hal/macros/SingleStepJState.c index 655094b..a1d2446 100644 --- a/Bios/src/hal/macros/SingleStepJState.c +++ b/Bios/src/hal/macros/SingleStepJState.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -47,22 +47,15 @@ #include "stddef.h" #include "error_def.h" -#define CPUOFF 0x10 - /** - SingleStepXv2 + SingleStepJStateXv2 Same description and parameter list as SingleStep. Refer to SingleStep for details. */ - -#define BP_HIT_MASK 0x100000000ull -#define LPMX5_MASK 0x8000000000000000ull - HAL_FUNCTION(_hal_SingleStepJStateXv2) { - decl_out_long_long short RetState = HALERR_UNDEFINED_ERROR; - unsigned short i = 0; + unsigned short i = 0; StreamSafe stream_tmp; unsigned char MyIn[31] = { /*Number of EEM Data Exchanges*/ @@ -76,47 +69,54 @@ HAL_FUNCTION(_hal_SingleStepJStateXv2) 0x80,0x01,0x00, 0x00,0x00, }; unsigned char MyOut[22]; // large enough to hold all EEM registers being read - unsigned char stream_in_tmp[22]; + unsigned char stream_in_release[18]; + unsigned char stream_in_sync[4]; + unsigned short irRequest = 0; + + for(i=0;iLpmx.5 will reset the device eem module RetState = 0; - return RetState; + return RetState; } //check end - - if(!(stream_in_tmp[8] & CPUOFF)) // low byte of SR - { + + if((!(stream_in_release[8] & CPUOFF)) || (irRequest & 0x4)) + { // poll for CPU stop reaction - jstate_read + jstate_read(); do - { - SetReg_64Bits(0x0000000000000000) + { i++; } - while((BP_HIT_MASK != (lOut_long_long & BP_HIT_MASK)) && (i < 500)); + while((BP_HIT_MASK_J != (SetReg_64Bits(0x0000000000000000) & BP_HIT_MASK_J)) && (i < 500)); if(i < 500) { // take target under JTAG control - STREAM_internal_stream(stream_in_tmp, sizeof(stream_in_tmp), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); + STREAM_internal_stream(stream_in_sync, sizeof(stream_in_sync), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); RetState = HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); // In STREAM_external_stream(&stream_tmp); // restore EEM Trigger Block 0 @@ -146,19 +146,18 @@ HAL_FUNCTION(_hal_SingleStepJStateXv2) MyIn[23] = MyOut[17]; MyIn[24] = MyOut[18]; MyIn[25] = MyOut[19]; - + STREAM_internal_stream(MyIn, sizeof(MyIn), MESSAGE_NO_OUT, 0, &stream_tmp); HAL_EemDataExchangeXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); STREAM_external_stream(&stream_tmp); } - } + } else { // take target under JTAG control - STREAM_internal_stream(stream_in_tmp, sizeof(stream_in_tmp), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); + STREAM_internal_stream(stream_in_sync, sizeof(stream_in_sync), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); RetState = HAL_SyncJtag_Conditional_SaveContextXv2(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); // In STREAM_external_stream(&stream_tmp); - RetState = 0; } return RetState; } diff --git a/Bios/src/hal/macros/SingleStepX.c b/Bios/src/hal/macros/SingleStepX.c index 6f3462a..dbc2e10 100644 --- a/Bios/src/hal/macros/SingleStepX.c +++ b/Bios/src/hal/macros/SingleStepX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -61,82 +61,83 @@ */ HAL_FUNCTION(_hal_SingleStepX) { - decl_out - decl_out_long short RetState = HALERR_UNDEFINED_ERROR; unsigned short i = 0; unsigned short bpCntrlType = BPCNTRL_IF; unsigned short extraStep = 0; - + // local variables to enable preserve of EEM trigger block 0 unsigned long trig0_Bckup_cntrl; unsigned long trig0_Bckup_mask; unsigned long trig0_Bckup_comb; unsigned long trig0_Bckup_cpuStop; unsigned long trig0_Bckup_value; - + StreamSafe stream_tmp; - unsigned char stream_in_tmp[22]; - for(i=0;i= 100) { return (HALERR_SINGLESTEP_WAITFOREEM_TIMEOUT); } - + // check if an extra step was required if(extraStep) { extraStep = 0; // reset the "extra step" flag - + // release the CPU once again for an "extra step" from JTAG control - addr_capture - cntrl_sig_release + addr_capture(); + cntrl_sig_release(); } else { @@ -178,26 +178,26 @@ HAL_FUNCTION(_hal_SingleStepX) } { // Restore Trigger Block 0 - eem_data_exchange32 + eem_data_exchange32(); // write control register - SetReg_32Bits(MX_CNTRL + MX_WRITE) - SetReg_32Bits(trig0_Bckup_cntrl) + SetReg_32Bits(MX_CNTRL + MX_WRITE); + SetReg_32Bits(trig0_Bckup_cntrl); // write mask register - SetReg_32Bits(MX_MASK + MX_WRITE) - SetReg_32Bits(trig0_Bckup_mask) + SetReg_32Bits(MX_MASK + MX_WRITE); + SetReg_32Bits(trig0_Bckup_mask); // write combination register - SetReg_32Bits(MX_COMB + MX_WRITE) - SetReg_32Bits(trig0_Bckup_comb) + SetReg_32Bits(MX_COMB + MX_WRITE); + SetReg_32Bits(trig0_Bckup_comb); // write CPU stop reaction register - SetReg_32Bits(MX_CPUSTOP + MX_WRITE) - SetReg_32Bits(trig0_Bckup_cpuStop) + SetReg_32Bits(MX_CPUSTOP + MX_WRITE); + SetReg_32Bits(trig0_Bckup_cpuStop); // write trigger block value register - SetReg_32Bits(MX_BP + MX_WRITE) - SetReg_32Bits(trig0_Bckup_value) + SetReg_32Bits(MX_BP + MX_WRITE); + SetReg_32Bits(trig0_Bckup_value); } - + // now sync the CPU again to JTAG control and save the current context - STREAM_internal_stream(stream_in_tmp, sizeof(stream_in_tmp), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); + STREAM_internal_stream(stream_in_sync, sizeof(stream_in_sync), MESSAGE_OUT_TO_DLL, 0, &stream_tmp); RetState = HAL_SyncJtag_Conditional_SaveContextX(MESSAGE_NEW_MSG | MESSAGE_LAST_MSG); // In STREAM_external_stream(&stream_tmp); diff --git a/Bios/src/hal/macros/SingleStepXv2.c b/Bios/src/hal/macros/SingleStepXv2.c index c7e71d7..82d3f41 100644 --- a/Bios/src/hal/macros/SingleStepXv2.c +++ b/Bios/src/hal/macros/SingleStepXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,8 +46,8 @@ #include "stream.h" #include "stddef.h" #include "error_def.h" - -#define CPUOFF 0x10 +#include "hw_compiler_specific.h" +#include "JtagId.h" /** SingleStepXv2 @@ -56,9 +56,8 @@ */ HAL_FUNCTION(_hal_SingleStepXv2) { - decl_out short RetState = HALERR_UNDEFINED_ERROR; - unsigned short i = 0; + unsigned short i = 0; StreamSafe stream_tmp; unsigned char MyIn[31] = { /*Number of EEM Data Exchanges*/ @@ -72,37 +71,44 @@ HAL_FUNCTION(_hal_SingleStepXv2) 0x80,0x01,0x00, 0x00,0x00, }; unsigned char MyOut[22]; // large enough to hold all EEM registers being read - unsigned char stream_in_tmp[22]; + unsigned char stream_in_release[18]; + unsigned char stream_in_sync[4]; + unsigned short irRequest = 0; + + for(i=0;i @@ -58,28 +55,34 @@ jtagId: the Jtag identifier value */ +#if defined(eZ_FET) || defined(MSP_FET) HAL_FUNCTION(_hal_StartJtag) { unsigned char chainLen; unsigned char protocol; - short ret_value = HALERR_UNDEFINED_ERROR; - + short ret_value = -1; + HilInitGetEdtDistinctFunc hilEdtDis = ((void*)0); + if(STREAM_get_byte(&protocol) < 0) { ret_value = HALERR_START_JTAG_NO_PROTOCOL; return(ret_value); } - if(EDT_SetProtocol(protocol)) + + if(IHIL_SetProtocol(protocol)) { ret_value = HALERR_START_JTAG_PROTOCOL_UNKNOWN; return(ret_value); } - - EDT_Open(RSTHIGH); - EDT_TapReset(); - chainLen = 1; //;(unsigned char)EDT_EnumChain(); - EDT_CheckJtagFuse(); - + + hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + chainLen = 1; + IHIL_CheckJtagFuse(); + STREAM_put_byte((unsigned char)chainLen); if (chainLen > 0) { @@ -87,4 +90,36 @@ HAL_FUNCTION(_hal_StartJtag) } return(ret_value); } +#endif +#ifdef MSP430_UIF +HAL_FUNCTION(_hal_StartJtag) +{ + unsigned char chainLen; + unsigned char protocol; + short ret_value = HALERR_UNDEFINED_ERROR; + + if(STREAM_get_byte(&protocol) < 0) + { + ret_value = HALERR_START_JTAG_NO_PROTOCOL; + return(ret_value); + } + if(IHIL_SetProtocol(protocol)) + { + ret_value = HALERR_START_JTAG_PROTOCOL_UNKNOWN; + return(ret_value); + } + + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + chainLen = 1; + IHIL_CheckJtagFuse(); + + STREAM_put_byte((unsigned char)chainLen); + if (chainLen > 0) + { + ret_value = 0; + } + return(ret_value); +} +#endif diff --git a/Bios/src/hal/macros/StartJtagActivationCode.c b/Bios/src/hal/macros/StartJtagActivationCode.c index 86c3267..9c4a839 100644 --- a/Bios/src/hal/macros/StartJtagActivationCode.c +++ b/Bios/src/hal/macros/StartJtagActivationCode.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -49,11 +49,8 @@ #include "debug.h" #endif -#define L092_MODE 0xA55AA55A -#define C092_MODE 0x5AA55AA5 - /** - StartJtag + StartJtag Open and reset the physical connection to the target device JTAG interface. Implies release of the target from JTAG control. inData: @@ -64,53 +61,59 @@ HAL_FUNCTION(_hal_StartJtagActivationCode) { - unsigned char chainLen; + unsigned char chainLen = 0; unsigned char protocol; unsigned long ActivationCode; short ret_value = HALERR_UNDEFINED_ERROR; - decl_out - decl_jtagMailboxIn - + unsigned char jtagMailboxIn = 0; + if(STREAM_get_byte(&protocol) < 0) { ret_value = HALERR_START_JTAG_NO_PROTOCOL; return(ret_value); } STREAM_discard_bytes(1); - + if(STREAM_get_long(&ActivationCode) < 0) { ret_value = HALERR_START_JTAG_NO_ACTIVATION_CODE; return(ret_value); } - // LO92 could just operrate in JTAG mode. Perhaps this must be changed for + // LO92 could just operrate in JTAG mode. Perhaps this must be changed for // feature devices protocol = 0; - if(EDT_SetProtocol(protocol)) + if(IHIL_SetProtocol(protocol)) { ret_value = HALERR_START_JTAG_PROTOCOL_UNKNOWN; return(ret_value); } + +#if defined(eZ_FET) || defined(MSP_FET) + { + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + } +#endif + // check if activation code is valid if(ActivationCode == L092_MODE || ActivationCode == C092_MODE) { // L092 has no JTAG chain support - EDT_SetReset(0); - EDT_Open(RSTLOW); - EDT_TapReset(); - EDT_SetReset(0); + IHIL_SetReset(0); + IHIL_Open(RSTLOW); + IHIL_TapReset(); + IHIL_SetReset(0); chainLen = 1; - EDT_CheckJtagFuse(); - - i_WriteJmbIn32(ActivationCode>>16 , ActivationCode); - // check for Timeout issue during mailbox request - EDT_SetReset(1); - EDT_Delay_1ms(3000); + + jtagMailboxIn = i_WriteJmbIn32(ActivationCode>>16 , ActivationCode); + // check for Timeout issue during mailbox request + IHIL_SetReset(1); + IHIL_Delay_1ms(3000); if(jtagMailboxIn == 1) { return (HALERR_JTAG_PASSWORD_WRONG); - } - } + } + } STREAM_put_byte((unsigned char)chainLen); if (chainLen > 0) { diff --git a/Bios/src/hal/macros/StopJtag.c b/Bios/src/hal/macros/StopJtag.c index 88e542c..d3064bf 100644 --- a/Bios/src/hal/macros/StopJtag.c +++ b/Bios/src/hal/macros/StopJtag.c @@ -7,58 +7,53 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "arch.h" #include "edt.h" #include "hal.h" -#ifdef DB_PRINT -#include "debug.h" -#endif + +extern DevicePowerSettings devicePowerSettings; /** - StopJtag + StopJtag Close the physical connection to the target JTAG interface. - inData: - - outData: - */ HAL_FUNCTION(_hal_StopJtag) -{ -#ifdef DB_PRINT - prtstr("@ID_StopJtag "); -#endif - EDT_Close(); +{ + RestoreTestRegs(); + IHIL_Close(); return 0; } diff --git a/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContext.c b/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContext.c index 18246e5..4c0b822 100644 --- a/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContext.c +++ b/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContext.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "hal_ref.h" #include "stream.h" #include "EEM_defs.h" +#include "global_variables.h" extern DeviceSettings deviceSettings; @@ -60,13 +61,12 @@ extern DeviceSettings deviceSettings; */ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContext) { - decl_out - decl_instrLoad - unsigned short i = 0; + unsigned short i = 0, lOut = 0, ctl_sync = 0; unsigned short MyOut[4]; //! Output unsigned short address; unsigned short wdtVal; - + unsigned short* syncWithRunVarAddress = 0; + // Check input parameters before we proceed if(STREAM_get_word(&address) != 0) { @@ -76,83 +76,91 @@ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContext) { return (HALERR_SYNC_JTAG_ASSERT_POR_NO_WDT_VALUE); } - + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + // Sync the JTAG - cntrl_sig_16bit - SetReg_16Bits(0x2401) - cntrl_sig_capture - - if(lOut != JTAGVERSION) + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + + if(cntrl_sig_capture() != JTAGVERSION) { return (HALERR_JTAG_VERSION_MISMATCH); } - cntrl_sig_capture - SetReg_16Bits(0x0000) // read control register once + cntrl_sig_capture(); + lOut = SetReg_16Bits(0x0000); // read control register once + + IHIL_Tclk(1); - TCLKset1 - if(!(lOut & CNTRL_SIG_TCE)) { // If the JTAG and CPU are not already synchronized ... // Initiate Jtag and CPU synchronization. Read/Write is under CPU control. Source TCLK via TDI. // Do not effect bits used by DTC (CPU_HALT, MCLKON). - cntrl_sig_high_byte - SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8) // initiate CPU synchronization but release low byte of CNTRL sig register to CPU control - + cntrl_sig_high_byte(); + SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8); // initiate CPU synchronization but release low byte of CNTRL sig register to CPU control + // Address Force Sync special handling - eem_data_exchange // read access to EEM General Clock Control Register (GCLKCTRL) - SetReg_16Bits_(MX_GCLKCTRL + MX_READ) - SetReg_16Bits(0) // read the content of GCLKCNTRL into lOUt + eem_data_exchange(); // read access to EEM General Clock Control Register (GCLKCTRL) + SetReg_16Bits(MX_GCLKCTRL + MX_READ); + lOut = SetReg_16Bits(0); // read the content of GCLKCNTRL into lOUt // Set Force Jtag Synchronization bit in Emex General Clock Control register. lOut |= 0x0040; // 0x0040 = FORCE_SYN in DLLv2 - eem_data_exchange // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_16Bits_(MX_GCLKCTRL + MX_WRITE) // write access to EEM General Clock Control Register (GCLKCTRL) - SetReg_16Bits(lOut) // write into GCLKCNTRL + eem_data_exchange(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_16Bits(MX_GCLKCTRL + MX_WRITE); // write access to EEM General Clock Control Register (GCLKCTRL) + lOut = SetReg_16Bits(lOut); // write into GCLKCNTRL // Reset Force Jtag Synchronization bit in Emex General Clock Control register. lOut &= ~0x0040; - eem_data_exchange // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_16Bits_(MX_GCLKCTRL + MX_WRITE) // write access to EEM General Clock Control Register (GCLKCTRL) - SetReg_16Bits(lOut) // write into GCLKCNTRL - - SyncJtag(); - - if(!i) + eem_data_exchange(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_16Bits(MX_GCLKCTRL + MX_WRITE); // write access to EEM General Clock Control Register (GCLKCTRL) + lOut = SetReg_16Bits(lOut); // write into GCLKCNTRL + + ctl_sync = SyncJtag(); + + if(!(ctl_sync & CNTRL_SIG_CPU_HALT)) { // Synchronization failed! return (HALERR_SYNC_JTAG_ASSERT_POR_JTAG_TIMEOUT); } }// end of if(!(lOut & CNTRL_SIG_TCE)) - if(lOut & CNTRL_SIG_CPU_HALT) + if(ctl_sync & CNTRL_SIG_CPU_HALT) { - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits(0x2401) - TCLKset1 + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + IHIL_Tclk(1); } else { - cntrl_sig_16bit - SetReg_16Bits(0x2401) + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); } -/* - isInstrLoad // Test if we are on an instruction load boundary - if(lIsInstrLoad != 0) + + if (deviceSettings.assertBslValidBit) { - return (HALERR_INSTRUCTION_BOUNDARY_ERROR); + // here we add bit de assert bit 7 in JTAG test reg to enalbe clocks again + test_reg(); + lOut = SetReg_8Bits(0x00); + lOut |= 0x80; //DE_ASSERT_BSL_VALID; + test_reg(); + SetReg_8Bits(lOut); // Bit 7 is de asserted now } -*/ + // execute a dummy instruction here - data_16bit - TCLKset1 // Stability improvement: should be possible to remove this TCLK is already 1 - SetReg_16Bits_(0x4303) // 0x4303 = NOP - TCLKset0 - data_capture - TCLKset1 + data_16bit(); + IHIL_Tclk(1); // Stability improvement: should be possible to remove this TCLK is already 1 + SetReg_16Bits(0x4303); // 0x4303 = NOP + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); // step until next instruction load boundary if not being already there - instrLoad - if(lInstrLoad != 0) + if(instrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } @@ -160,91 +168,96 @@ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContext) if (deviceSettings.clockControlType == GCC_EXTENDED) { // Perform the POR - eem_data_exchange - SetReg_16Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_16Bits_(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN) // write into MX_GENCNTRL - - eem_data_exchange // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_16Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_16Bits_(EMU_FEAT_EN | EMU_CLK_EN) // write into MX_GENCNTRL + eem_data_exchange(); + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN); // write into MX_GENCNTRL + + eem_data_exchange(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN | EMU_CLK_EN); // write into MX_GENCNTRL + } + if (deviceSettings.clockControlType == GCC_STANDARD_I) + { + eem_data_exchange(); + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN); // write into MX_GENCNTRL } - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC - TCLKset1 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC - TCLKset1 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC // Explicitly set TMR SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1); // Enable access to Flash registers - - flash_16bit_update // Disable flash test mode - SetReg_16Bits_(FLASH_SESEL1) // Pulse TMR - SetReg_16Bits_(FLASH_SESEL1 | FLASH_TMR) - SetReg_16Bits_(FLASH_SESEL1) - SetReg_16Bits_(FLASH_SESEL1 | FLASH_TMR) // Set TMR to user mode - - cntrl_sig_high_byte - SetReg_8Bits_((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1) >> 8) // Disable access to Flash register - + + flash_16bit_update(); // Disable flash test mode + SetReg_16Bits(FLASH_SESEL1); // Pulse TMR + SetReg_16Bits(FLASH_SESEL1 | FLASH_TMR); + SetReg_16Bits(FLASH_SESEL1); + SetReg_16Bits(FLASH_SESEL1 | FLASH_TMR); // Set TMR to user mode + + cntrl_sig_high_byte(); + SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1) >> 8); // Disable access to Flash register + // step until an appropriate instruction load boundary for(i = 0; i < 10; i++) { - addr_capture - SetReg_16Bits(0x0000) + addr_capture(); + lOut = SetReg_16Bits(0x0000); if(lOut == 0xFFFE || lOut == 0x0F00) { break; } - TCLK + IHIL_TCLK(); } if(i == 10) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } - TCLK - TCLK + IHIL_TCLK(); + IHIL_TCLK(); - TCLKset0 - addr_capture - SetReg_16Bits(0x0000) - TCLKset1 + IHIL_Tclk(0); + addr_capture(); + SetReg_16Bits(0x0000); + IHIL_Tclk(1); // step until next instruction load boundary if not being already there - instrLoad - if(lInstrLoad != 0) + + if(instrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } // Hold Watchdog - ReadMemWord (address, MyOut[0]); // safe WDT value + MyOut[0] = ReadMemWord(address); // safe WDT value wdtVal |= (MyOut[0] & 0xFF); // set original bits in addition to stop bit WriteMemWord(address, wdtVal); // read MAB = PC here - addr_capture - SetReg_16Bits(0) - MyOut[1] = lOut; + addr_capture(); + MyOut[1] = SetReg_16Bits(0); MyOut[2] = 0; // high PC always 0 for MSP430 architecture - + // set PC to a save address pointing to ROM to avoid RAM corruption on certain devices - SetPc(ROM_ADDR) + SetPc(ROM_ADDR); // read status register - ReadCpuReg(2,MyOut[3]); + MyOut[3] = ReadCpuReg(2); // return output STREAM_put_bytes((unsigned char*)MyOut,8); - + return(0); } diff --git a/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextX.c b/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextX.c index 9b59815..ce5d14c 100644 --- a/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextX.c +++ b/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "hal_ref.h" #include "stream.h" #include "EEM_defs.h" +#include "global_variables.h" extern DeviceSettings deviceSettings; @@ -60,14 +61,13 @@ extern DeviceSettings deviceSettings; */ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextX) { - decl_out - decl_out_long - decl_instrLoad - unsigned short i = 0; + unsigned short i = 0, ctl_sync = 0; unsigned short MyOut[4]; //! Output unsigned short address; - unsigned short wdtVal; - + unsigned short wdtVal, lOut = 0; + unsigned short* syncWithRunVarAddress = 0; + unsigned long lOut_long = 0; + // Check input parameters before we proceed if(STREAM_get_word(&address) != 0) { @@ -77,172 +77,174 @@ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextX) { return (HALERR_SYNC_JTAG_ASSERT_POR_NO_WDT_VALUE); } - + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + // Sync the JTAG - cntrl_sig_16bit - SetReg_16Bits(0x2401) - cntrl_sig_capture - - if(lOut != JTAGVERSION) + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + if(cntrl_sig_capture() != JTAGVERSION) { return (HALERR_JTAG_VERSION_MISMATCH); } - cntrl_sig_capture - SetReg_16Bits(0x0000) // read control register once + cntrl_sig_capture(); + lOut = SetReg_16Bits(0x0000); // read control register once + + IHIL_Tclk(1); - TCLKset1 - if(!(lOut & CNTRL_SIG_TCE)) { // If the JTAG and CPU are not already synchronized ... // Initiate Jtag and CPU synchronization. Read/Write is under CPU control. Source TCLK via TDI. // Do not effect bits used by DTC (CPU_HALT, MCLKON). - cntrl_sig_high_byte - SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8) // initiate CPU synchronization but release low byte of CNTRL sig register to CPU control + cntrl_sig_high_byte(); + SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8); // initiate CPU synchronization but release low byte of CNTRL sig register to CPU control // Address Force Sync special handling - eem_data_exchange32 // read access to EEM General Clock Control Register (GCLKCTRL) - SetReg_32Bits_(MX_GCLKCTRL + MX_READ) - SetReg_32Bits(0) // read the content of GCLKCNTRL into lOUt + eem_data_exchange32(); // read access to EEM General Clock Control Register (GCLKCTRL) + SetReg_32Bits(MX_GCLKCTRL + MX_READ); + lOut = SetReg_32Bits(0); // read the content of GCLKCNTRL into lOUt // Set Force Jtag Synchronization bit in Emex General Clock Control register. lOut |= 0x0040; // 0x0040 = FORCE_SYN in DLLv2 - eem_data_exchange32 // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_32Bits_(MX_GCLKCTRL + MX_WRITE) // write access to EEM General Clock Control Register (GCLKCTRL) - SetReg_32Bits(lOut) // write into GCLKCNTRL + eem_data_exchange32(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_32Bits(MX_GCLKCTRL + MX_WRITE); // write access to EEM General Clock Control Register (GCLKCTRL) + lOut = SetReg_32Bits(lOut); // write into GCLKCNTRL // Reset Force Jtag Synchronization bit in Emex General Clock Control register. lOut &= ~0x0040; - eem_data_exchange32 // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_32Bits_(MX_GCLKCTRL + MX_WRITE) // write access to EEM General Clock Control Register (GCLKCTRL) - SetReg_32Bits(lOut) // write into GCLKCNTRL + eem_data_exchange32(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_32Bits(MX_GCLKCTRL + MX_WRITE); // write access to EEM General Clock Control Register (GCLKCTRL) + SetReg_32Bits(lOut); // write into GCLKCNTRL + + ctl_sync = SyncJtag(); - SyncJtag(); - - if(!i) + if(!ctl_sync) { // Synchronization failed! return (HALERR_SYNC_JTAG_ASSERT_POR_JTAG_TIMEOUT); } }// end of if(!(lOut & CNTRL_SIG_TCE)) - if(lOut & CNTRL_SIG_CPU_HALT) + if(ctl_sync & CNTRL_SIG_CPU_HALT) { - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits(0x2401) - TCLKset1 + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + IHIL_Tclk(1); } else { - cntrl_sig_16bit - SetReg_16Bits(0x2401) + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); } // execute a dummy instruction here - data_16bit - TCLKset1 // Stability improvement: should be possible to remove this TCLK is already 1 - SetReg_16Bits_(0x4303) // 0x4303 = NOP - TCLKset0 - data_capture - TCLKset1 + data_16bit(); + IHIL_Tclk(1); // Stability improvement: should be possible to remove this TCLK is already 1 + SetReg_16Bits(0x4303); // 0x4303 = NOP + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); // step until next instruction load boundary if not being already there - instrLoad - if(lInstrLoad != 0) + if( instrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } if (deviceSettings.clockControlType == GCC_EXTENDED) { - eem_data_exchange32 - SetReg_32Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_32Bits_(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN) // write into MX_GENCNTRL - - eem_data_exchange32 // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_32Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_32Bits_(EMU_FEAT_EN | EMU_CLK_EN) // write into MX_GENCNTRL + eem_data_exchange32(); + SetReg_32Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_32Bits(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN); // write into MX_GENCNTRL + + eem_data_exchange32(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_32Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_32Bits(EMU_FEAT_EN | EMU_CLK_EN); // write into MX_GENCNTRL } - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC - TCLKset1 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC - TCLKset1 - cntrl_sig_16bit - SetReg_16Bits_(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_PUC | CNTRL_SIG_TAGFUNCSAT); // Assert PUC + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1 | CNTRL_SIG_TAGFUNCSAT); // Negate PUC // Explicitly set TMR SetReg_16Bits(CNTRL_SIG_READ | CNTRL_SIG_TCE1); // Enable access to Flash registers - - flash_16bit_update // Disable flash test mode - SetReg_16Bits_(FLASH_SESEL1) // Pulse TMR - SetReg_16Bits_(FLASH_SESEL1 | FLASH_TMR) - SetReg_16Bits_(FLASH_SESEL1) - SetReg_16Bits_(FLASH_SESEL1 | FLASH_TMR) // Set TMR to user mode - - cntrl_sig_high_byte - SetReg_8Bits_((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1) >> 8) // Disable access to Flash register + + flash_16bit_update(); // Disable flash test mode + SetReg_16Bits(FLASH_SESEL1); // Pulse TMR + SetReg_16Bits(FLASH_SESEL1 | FLASH_TMR); + SetReg_16Bits(FLASH_SESEL1); + SetReg_16Bits(FLASH_SESEL1 | FLASH_TMR); // Set TMR to user mode + + cntrl_sig_high_byte(); + SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1) >> 8); // Disable access to Flash register // step until an appropriate instruction load boundary for(i = 0; i < 10; i++) { - addr_capture - SetReg_20Bits(0x0000) - if(lOut_long == 0xFFFE || lOut_long == 0x0F00) + addr_capture(); + lOut_long = SetReg_20Bits(0x0000); + if((lOut_long & 0xFFFF) == 0xFFFE || (lOut_long & 0xFFFF) == 0x0F00) { break; } - TCLK + IHIL_TCLK(); } if(i == 10) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } - TCLK - TCLK + IHIL_TCLK(); + IHIL_TCLK(); - TCLKset0 - addr_capture - SetReg_16Bits(0x0000) - TCLKset1 + IHIL_Tclk(0); + addr_capture(); + SetReg_16Bits(0x0000); + IHIL_Tclk(1); // step until next instruction load boundary if not being already there - instrLoad - if(lInstrLoad != 0) + if(instrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } // Hold Watchdog - ReadMemWordX(address, MyOut[0]); // safe WDT value + MyOut[0] = ReadMemWordX(address); // safe WDT value wdtVal |= (MyOut[0] & 0x00FF); // set original bits in addition to stop bit WriteMemWordX(address, wdtVal); // read MAB = PC here - addr_capture - SetReg_20Bits(0) + addr_capture(); + lOut_long = SetReg_20Bits(0); MyOut[1] = (unsigned short)(lOut_long & 0xFFFF); MyOut[2] = (unsigned short)(lOut_long >> 16); - + // set PC to a save address pointing to ROM to avoid RAM corruption on certain devices - SetPcX(ROM_ADDR) + SetPcX(ROM_ADDR); { unsigned long Rx; // read status register - ReadCpuRegX(2,Rx); + Rx = ReadCpuRegX(2); MyOut[3] = (unsigned short)Rx; } // return output STREAM_put_bytes((unsigned char*)MyOut,8); - + return(0); } diff --git a/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextXv2.c b/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextXv2.c index 07bfa87..a5a103c 100644 --- a/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextXv2.c +++ b/Bios/src/hal/macros/SyncJtag_AssertPor_SaveContextXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -49,49 +49,9 @@ #include "HalGlobalVars.h" #include "error_def.h" -extern unsigned short _hal_mclkCntrl0; -VAR_AT(unsigned char mclk_modules[16], HAL_ADDR_VAR_MCLK_MODULES); - -static unsigned char clkModuleMapping[] = -{ - 0x00, 0x0a, 0x1e, 0x40, 0x60, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x88, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x74, 0x75, - 0x76, 0x77, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, - 0x9f, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x8a, 0x8a, 0xa8, 0xa8, 0xb0, 0xb5, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xd4, 0xd5, 0xd6, 0xd6, 0xd8, 0x8e, 0x8f, 0x31 -}; - -#define CLOCK_MAPPING_TABLE_SIZE (sizeof(clkModuleMapping)/sizeof(*clkModuleMapping)) -/*#define wait_for_synch { decl_out \ - cntrl_sig_capture \ - SetReg_16Bits(0) \ - while(!(lOut & 0x0200)) \ - { \ - SetReg_16Bits(0) \ - }; \ - }*/ - -#define wait_for_synch { decl_out \ - int i = 0; \ - lPASS = lFAIL = 0; \ - cntrl_sig_capture \ - SetReg_16Bits(0) \ - while(!(lOut & 0x0200) && i < 50) \ - { \ - SetReg_16Bits(0) \ - i++; \ - }; \ - if(i >= 50) \ - { \ - lFAIL++; \ - } \ - else \ - { \ - lPASS++; \ - } \ - } +extern unsigned long _hal_mclkCntrl0; +unsigned char mclk_modules[32]; /** SyncJtag_AssertPor_SaveContextXv2 @@ -107,101 +67,106 @@ extern DevicePowerSettings devicePowerSettings; HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextXv2) { - decl_out - decl_out_long - unsigned short MyOut[4]; - int i; - unsigned short address; - unsigned short wdtVal; - - long lPASS = 0; - long lFAIL = 0; + unsigned short MyOut[4]; + int i; + unsigned short address; + unsigned short wdtVal; + unsigned short id = cntrl_sig_capture(); + unsigned long lOut_long = 0; - // -------------------------Power mode handling start ---------------------- - unsigned short id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - //Disable Lpmx5 and power gaiting settings - if(id == JTAGVERSION91) + // -------------------------Power mode handling start ---------------------- + //Disable Lpmx5 and power gaiting settings + if( id == JTAGVERSION99) { - // just disable JTAG i lock - test_reg_3V - SetReg_16Bits(0x4020); + test_reg_3V(); + SetReg_16Bits(0x40A0); + test_reg(); + SetReg_32Bits(0x00010000); } - if(id == JTAGVERSION99) - { - test_reg_3V - SetReg_16Bits(0x4020); - test_reg - SetReg_32Bits(0x00010000); - } // -------------------------Power mode handling end ------------------------ // enable clock control before sync // switch all functional clocks to JCK = 1 and stop them - eem_data_exchange32 - SetReg_32Bits_(GENCLKCTRL + WRITE); - SetReg_32Bits_(MCLK_SEL3 + SMCLK_SEL3 + ACLK_SEL3 + STOP_MCLK + STOP_SMCLK + STOP_ACLK); + eem_data_exchange32(); + SetReg_32Bits(GENCLKCTRL + WRITE); + SetReg_32Bits(MCLK_SEL3 + SMCLK_SEL3 + ACLK_SEL3 + STOP_MCLK + STOP_SMCLK + STOP_ACLK); // enable Emualtion Clocks - eem_write_control - SetReg_16Bits_(EMU_CLK_EN + EEM_EN); + eem_write_control(); + SetReg_16Bits(EMU_CLK_EN + EEM_EN); + cntrl_sig_16bit(); + // release RW and BYTE control signals in low byte, set TCE1 & CPUSUSP(!!) & RW + SetReg_16Bits(0x1501); + + if(wait_for_synch()) { - cntrl_sig_16bit - // release RW and BYTE control signals in low byte, set TCE1 & CPUSUSP(!!) & RW - SetReg_16Bits_(0x1501) - wait_for_synch - } - if(lPASS > 0 && lFAIL == 0) - { // provide one more clock to empty the pipe - TCLK - - cntrl_sig_16bit + IHIL_TCLK(); + + cntrl_sig_16bit(); // release CPUFLUSH(=CPUSUSP) signal and apply POR signal - SetReg_16Bits_(0x0C01) - EDT_Delay_1ms(40); - + SetReg_16Bits(0x0C01); + IHIL_Delay_1ms(40); + // release POR signal again - SetReg_16Bits_(0x0401) // disable fetch of CPU // changed from 401 to 501 - TCLK - // drive save adress into pc - //addr_16bit - //SetReg_16Bits_(0xFFF0) - // dreiver end - TCLK - TCLK + SetReg_16Bits(0x0401); // disable fetch of CPU // changed from 401 to 501 + + if(id == JTAGVERSION91 || id == JTAGVERSION99 || id == JTAGVERSION98) + { // Force PC so safe value memory location, JMP $ + data_16bit(); + IHIL_TCLK(); + IHIL_TCLK(); + SetReg_16Bits(SAFE_PC_ADDRESS); + // drive safe address into pc end + IHIL_TCLK(); + + if(id == JTAGVERSION91) + { + IHIL_TCLK(); + } + + data_capture(); + } + else + { + IHIL_TCLK(); + IHIL_TCLK(); + IHIL_TCLK(); + } + // TWO more to release CPU internal POR delay signals - TCLK - TCLK + IHIL_TCLK(); + IHIL_TCLK(); + // set CPUFLUSH signal - cntrl_sig_16bit - SetReg_16Bits_(0x0501) - TCLK - + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_TCLK(); + // set EEM FEATURE enable now!!! - eem_write_control - SetReg_16Bits_(EMU_FEAT_EN + EMU_CLK_EN + CLEAR_STOP); - + eem_write_control(); + SetReg_16Bits(EMU_FEAT_EN + EMU_CLK_EN + CLEAR_STOP); + // Check that sequence exits on Init State - cntrl_sig_capture - SetReg_16Bits_(0x0000); + cntrl_sig_capture(); + SetReg_16Bits(0x0000); // lout == 0x0301,0x3fd3 - // hold Watchdog Timer STREAM_get_word(&address); STREAM_get_word(&wdtVal); - - ReadMemWordXv2(address,MyOut[0]); + + MyOut[0] = ReadMemWordXv2(address); wdtVal |= (MyOut[0] & 0xFF); // set original bits in addition to stop bit WriteMemWordXv2(address, wdtVal); - + // Capture MAB - the actual PC value is (MAB - 4) - addr_capture - SetReg_20Bits(0) + addr_capture(); + lOut_long = SetReg_20Bits(0); /*****************************************/ /* Note 1495, 1637 special handling */ /*****************************************/ - if(lOut_long == 0xFFFE) + if(((lOut_long & 0xFFFF) == 0xFFFE) || (id == JTAGVERSION91) || (id == JTAGVERSION99) || (id == JTAGVERSION98)) { - ReadMemWordXv2(0xFFFE,MyOut[1]); + MyOut[1] = ReadMemWordXv2(0xFFFE); MyOut[2] = 0; } /*********************************/ @@ -214,42 +179,46 @@ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextXv2) // Status Register should be always 0 after a POR MyOut[3] = 0; STREAM_discard_bytes(1); - for(i=0; i<16; i++) + for(i=0; i<32; i++) { unsigned short v; - unsigned char clkModule = 0; STREAM_get_byte(&mclk_modules[i]); - - //Map received index to actual clock module - if ( mclk_modules[i] < CLOCK_MAPPING_TABLE_SIZE ) - { - clkModule = clkModuleMapping[ mclk_modules[i] ]; - } - if(clkModule != 0) + if(mclk_modules[i] != 0) { - if(_hal_mclkCntrl0 & (0x0001 << i)) + // check if module clock control is enabled for corresponding module + if(_hal_mclkCntrl0 & ((unsigned long) 0x00000001 << i)) v = 1; else v = 0; - WriteMemWordXv2(ETKEYSEL, ETKEY + clkModule); + WriteMemWordXv2(ETKEYSEL, ETKEY + mclk_modules[i]); WriteMemWordXv2(ETCLKSEL, v); } } // switch back system clocks to original clock source but keep them stopped - eem_data_exchange32 - SetReg_32Bits_(GENCLKCTRL + WRITE); - SetReg_32Bits_(MCLK_SEL0 + SMCLK_SEL0 + ACLK_SEL0 + STOP_MCLK + STOP_SMCLK + STOP_ACLK); - // configure cycle counter - // Increment on all bus cycles (including DMA cycles) - // Start when CPU released from JTAG/EEM - // Stop when CPU is stopped by EEM or under JTAG control - - SetReg_32Bits_(CCNT0CTL + WRITE); - SetReg_32Bits_(CCNT_RST + CCNTMODE5); - + eem_data_exchange32(); + SetReg_32Bits(GENCLKCTRL + WRITE); + SetReg_32Bits(MCLK_SEL0 + SMCLK_SEL0 + ACLK_SEL0 + STOP_MCLK + STOP_SMCLK + STOP_ACLK); + + // reset Vacant Memory Interrupt Flag inside SFRIFG1 + if(id == JTAGVERSION91) + { + volatile unsigned short specialFunc = ReadMemWordXv2(0x0102); + if(specialFunc & 0x8) + { + SetPcXv2(0x80, SAFE_PC_ADDRESS); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); + + specialFunc &= ~0x8; + WriteMemWordXv2(0x0102, specialFunc); + } + } + STREAM_put_bytes((unsigned char*)MyOut,8); - + return 0; // retrun status OK } else @@ -257,4 +226,3 @@ HAL_FUNCTION(_hal_SyncJtag_AssertPor_SaveContextXv2) return HALERR_UNDEFINED_ERROR; // return errer in case if syc fails } } - diff --git a/Bios/src/hal/macros/SyncJtag_Conditional_SaveContext.c b/Bios/src/hal/macros/SyncJtag_Conditional_SaveContext.c index 762f515..285ba66 100644 --- a/Bios/src/hal/macros/SyncJtag_Conditional_SaveContext.c +++ b/Bios/src/hal/macros/SyncJtag_Conditional_SaveContext.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "stream.h" #include "error_def.h" #include "EEM_defs.h" +#include "global_variables.h" #define MAX_TCE1 10 /** @@ -62,42 +63,38 @@ extern DeviceSettings deviceSettings; //-------------------------------------------------------------------------- // static STATUS_T clkTclkAndCheckDTC(void) -// \todo Günther: Seems to only apply to devices with the DTC bug, determine the effect +// \todo Günther: Seems to only apply to devices with the DTC bug, determine the effect // this code has on devices that do not have the DTC bug static long clkTclkAndCheckDTC(void) { #define MAX_DTC_CYCLE 10 - - decl_out - unsigned int cntrlSig; + unsigned short cntrlSig; int dtc_cycle_cnt = 0; long timeOut =0; do { - TCLKset0 + IHIL_Tclk(0); - cntrl_sig_capture - SetReg_16Bits(0) - - cntrlSig = lOut; + cntrl_sig_capture(); + cntrlSig = SetReg_16Bits(0); if ((dtc_cycle_cnt > 0) && ((cntrlSig & CNTRL_SIG_CPU_HALT) == 0)) { // DTC cycle completed, take over control again... - cntrl_sig_16bit + cntrl_sig_16bit(); SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); } if ((dtc_cycle_cnt == 0) && ((cntrlSig & CNTRL_SIG_CPU_HALT) == CNTRL_SIG_CPU_HALT)) { // DTC cycle requested, grant it... - cntrl_sig_16bit - SetReg_16Bits(CNTRL_SIG_CPU_HALT | CNTRL_SIG_TCE1 | + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_CPU_HALT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); dtc_cycle_cnt++; } - TCLKset1 + IHIL_Tclk(1); timeOut++; } while ((dtc_cycle_cnt < MAX_DTC_CYCLE) && @@ -114,108 +111,127 @@ static long clkTclkAndCheckDTC(void) } HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContext) -{ - decl_out - decl_isInstrLoad - decl_instrLoad - unsigned short i = 0; +{ + unsigned short i = 0, lOut = 0, ctl_sync = 0; short MyOut[5] = {0}; unsigned short address; unsigned short wdtVal; unsigned short statusReg = 0; - - if(STREAM_get_word(&address) != 0) + unsigned short* syncWithRunVarAddress = 0; + + if(STREAM_get_word(&address) != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_NO_WDT_ADDRESS); } - + if(STREAM_get_word(&wdtVal) == -1) { return (HALERR_SYNC_JTAG_CONDITIONAL_NO_WDT_VALUE); - } - - TCLKset1 // Stability improvent: should be possible to remove this here, default state of TCLK should be one - - cntrl_sig_capture - SetReg_16Bits(0x0000) - - if(!(lOut & CNTRL_SIG_TCE)) { + } + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + + IHIL_Tclk(1); // Stability improvent: should be possible to remove this here, default state of TCLK should be one + + cntrl_sig_capture(); + + if(!(SetReg_16Bits(0x0000) & CNTRL_SIG_TCE)) + { // If the JTAG and CPU are not already synchronized ... // Initiate Jtag and CPU synchronization. Read/Write is under CPU control. Source TCLK via TDI. // Do not effect bits used by DTC (CPU_HALT, MCLKON). - cntrl_sig_high_byte + cntrl_sig_high_byte(); SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8); // A bug in first F43x and F44x silicon requires that Jtag synchronization be forced /* when the CPU is Off */. // Since the JTAG and CPU are not yet synchronized, the CPUOFF bit in the lower byte of the cntrlSig // register is not valid. // TCE eventually set indicates synchronization (and clocking via TCLK). - SyncJtag() - if(!i) + ctl_sync = SyncJtag(); + + if(!ctl_sync) { // Synchronization failed! return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } }// end of if(!(lOut & CNTRL_SIG_TCE)) - - if(lOut & CNTRL_SIG_CPU_HALT) + + if(ctl_sync & CNTRL_SIG_CPU_HALT) { - TCLKset0 - cntrl_sig_16bit + IHIL_Tclk(0); + cntrl_sig_16bit(); // Clear HALT. Read/Write is under CPU control. As a precaution, disable interrupts. - SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT) - TCLKset1 + SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); + IHIL_Tclk(1); } else { - cntrl_sig_16bit - // Clear HALT. Read/Write is under CPU control. As a precaution, disable interrupts. - SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT) + cntrl_sig_16bit(); + // Clear HALT. Read/Write is under CPU control. As a precaution, disable interrupts. + SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); } - instrLoad // step until next instruction load boundary if not being already there - if(lInstrLoad != 0) + if (deviceSettings.assertBslValidBit) + { + // here we add bit de assert bit 7 in JTAG test reg to enalbe clocks again + test_reg(); + lOut = SetReg_8Bits(0x00); + lOut |= 0x80; //DE_ASSERT_BSL_VALID; + test_reg(); + SetReg_8Bits(lOut); // Bit 7 is de asserted now + } + + // step until next instruction load boundary if not being already there + if(instrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); - } - + } + // read MAB = PC here - addr_capture - SetReg_16Bits(0x000) - MyOut[1] = lOut; - MyOut[2] = 0; // High part for MSP430 devices is always 0 - + addr_capture(); + MyOut[1] = SetReg_16Bits(0x0000); + MyOut[2] = 0; // High part for MSP430 devices is always 0 + // disable EEM and clear stop reaction - eem_write_control - SetReg_16Bits(0x0003) - SetReg_16Bits(0x0000) - - if (deviceSettings.clockControlType == GCC_EXTENDED) - { - eem_data_exchange - SetReg_16Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_16Bits_(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN) // write into MX_GENCNTRL - - eem_data_exchange // Stability improvent: should be possible to remove this, required only once at the beginning - SetReg_16Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_16Bits_(EMU_FEAT_EN | EMU_CLK_EN) // write into MX_GENCNTRL - } - + eem_write_control(); + SetReg_16Bits(0x0003); + SetReg_16Bits(0x0000); + + if (deviceSettings.clockControlType == GCC_EXTENDED) + { + eem_data_exchange(); + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN); // write into MX_GENCNTRL + + eem_data_exchange(); // Stability improvent: should be possible to remove this, required only once at the beginning + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN | EMU_CLK_EN); // write into MX_GENCNTRL + } + if (deviceSettings.clockControlType == GCC_STANDARD_I) + { + eem_data_exchange(); + SetReg_16Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_16Bits(EMU_FEAT_EN); // write into MX_GENCNTRL + } + if (deviceSettings.clockControlType != GCC_NONE) { if(deviceSettings.stopFLL) - { + { unsigned short clkCntrl = 0; // read access to EEM General Clock Control Register (GCLKCTRL) - eem_data_exchange - SetReg_16Bits_(MX_GCLKCTRL + MX_READ) - SetReg_16Bits(0) + eem_data_exchange(); + SetReg_16Bits(MX_GCLKCTRL + MX_READ); + clkCntrl = SetReg_16Bits(0); // added UPSF: FE427 does regulate the FLL to the upper boarder // added the switch off and release of FLL (JTFLLO) - clkCntrl = lOut; clkCntrl |= 0x10; - eem_data_exchange - SetReg_16Bits_(MX_GCLKCTRL + MX_WRITE) - SetReg_16Bits_(clkCntrl) + eem_data_exchange(); + SetReg_16Bits(MX_GCLKCTRL + MX_WRITE); + SetReg_16Bits(clkCntrl); } } //----------------------------------------------------------------------- @@ -226,29 +242,28 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContext) // The dummy instruction also provides a needed extra clock when the device is stopped by the Emex module and it is OFF. // The dummy instruction also possibly initiates processing of a pending interrupt. #define BIS_IMM_0_R4 0xd034 - data_16bit - TCLKset1 // Added for 2xx support - SetReg_16Bits(BIS_IMM_0_R4) + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support + SetReg_16Bits(BIS_IMM_0_R4); if(clkTclkAndCheckDTC() != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } - - cntrl_sig_capture - SetReg_16Bits(0x0000) - if(lOut & CNTRL_SIG_INSTRLOAD) // Still on an instruction load boundary? + + cntrl_sig_capture(); + if(SetReg_16Bits(0x0000) & CNTRL_SIG_INSTRLOAD) // Still on an instruction load boundary? { - data_16bit - TCLKset1 // Added for 2xx support - SetReg_16Bits(BIS_IMM_0_R4) + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support + SetReg_16Bits(BIS_IMM_0_R4); if(clkTclkAndCheckDTC() != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } } - data_16bit - TCLKset1 // Added for 2xx support - SetReg_16Bits(0x0000) + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support + SetReg_16Bits(0x0000); if(clkTclkAndCheckDTC() != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); @@ -257,55 +272,50 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContext) // The CPUOff bit will be cleared. // Basically, if there is an interrupt pending, the above dummy instruction // will have initialted its processing, and the CPU will not be on an - // instruction load boundary following the dummy instruction. - + // instruction load boundary following the dummy instruction. + i = 0; - cntrl_sig_capture - SetReg_16Bits(0); - while(!(lOut & CNTRL_SIG_INSTRLOAD) && (i < MAX_TCE1)) + cntrl_sig_capture(); + while(!(SetReg_16Bits(0) & CNTRL_SIG_INSTRLOAD) && (i < MAX_TCE1)) { if(clkTclkAndCheckDTC() != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } i++; - - SetReg_16Bits(0); } - - if(i == MAX_TCE1) + + if(i == MAX_TCE1) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } - + // Read PC now!!! Only the NOP or BIS #0,R4 instruction above was clocked into the device // The PC value should now be (OriginalValue + 2) // read MAB = PC here - addr_capture - SetReg_16Bits(0x0000) - MyOut[1] = lOut - 4; - MyOut[2] = 0; // High part for MSP430 devices is always 0 - + addr_capture(); + MyOut[1] = SetReg_16Bits(0x0000) - 4; + MyOut[2] = 0; // High part for MSP430 devices is always 0 + if(i == 0) { // An Interrupt was not detected // lOut does not contain the content of the CNTRL_SIG register anymore at this point // need to capture it again...different to DLLv3 sequence but don't expect any negative effect due to recapturing - cntrl_sig_capture - SetReg_16Bits(0x0000) - if(lOut & CNTRL_SIG_CPU_OFF) + cntrl_sig_capture(); + if(SetReg_16Bits(0x0000) & CNTRL_SIG_CPU_OFF) { MyOut[1] += 2; - - data_16bit - TCLKset1 // Added for 2xx support + + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support SetReg_16Bits(0xC032); if(clkTclkAndCheckDTC() != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } - data_16bit - TCLKset1 // Added for 2xx support + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support \Günther: Why set TCLK 1 again? SetReg_16Bits(0x0010); if(clkTclkAndCheckDTC() != 0) { @@ -317,37 +327,36 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContext) } else { - addr_capture - SetReg_16Bits(0) - MyOut[1] = lOut; + addr_capture(); + MyOut[1] = SetReg_16Bits(0); MyOut[2] = 0; // High part for MSP430 devices is always 0 MyOut[4] = 1; // Inform DLL about interrupt } - + // DLL v2: deviceHasDTCBug // Configure the DTC so that it transfers after the present CPU instruction is complete (ADC10FETCH). // Save and clear ADC10CTL0 and ADC10CTL1 to switch off DTC (Note: Order matters!). // Regain control of the CPU. Read/Write will be set, and source TCLK via TDI. - cntrl_sig_16bit - SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_READ | CNTRL_SIG_TAGFUNCSAT) - - isInstrLoad // Test if we are on an instruction load boundary - if(lIsInstrLoad != 0) + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_READ | CNTRL_SIG_TAGFUNCSAT); + + // Test if we are on an instruction load boundary + if(isInstrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } - + // Hold Watchdog - ReadMemWord (address, MyOut[0]); // safe WDT value + MyOut[0] = ReadMemWord (address); // safe WDT value wdtVal |= (MyOut[0] & 0xFF); // set original bits in addition to stop bit WriteMemWord(address, wdtVal); - + // set PC to a save address pointing to ROM to avoid RAM corruption on certain devices - SetPc(ROM_ADDR) + SetPc(ROM_ADDR); // read status register - ReadCpuReg(2,MyOut[3]); + MyOut[3] = ReadCpuReg(2); MyOut[3] |= statusReg; // compine with preserved CPUOFF bit setting // return output @@ -355,4 +364,3 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContext) return (0); } - diff --git a/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextX.c b/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextX.c index 5d1f48b..147f06c 100644 --- a/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextX.c +++ b/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,6 +46,7 @@ #include "stream.h" #include "error_def.h" #include "EEM_defs.h" +#include "global_variables.h" #define MAX_TCE1 10 /** @@ -67,38 +68,35 @@ extern DeviceSettings deviceSettings; static long clkTclkAndCheckDTC(void) { #define MAX_DTC_CYCLE 10 - - decl_out unsigned int cntrlSig; int dtc_cycle_cnt = 0; long timeOut= 0; - + + do { - TCLKset0 + IHIL_Tclk(0); - cntrl_sig_capture - SetReg_16Bits(0) - - cntrlSig = lOut; + cntrl_sig_capture(); + cntrlSig = SetReg_16Bits(0); if ((dtc_cycle_cnt > 0) && ((cntrlSig & CNTRL_SIG_CPU_HALT) == 0)) { // DTC cycle completed, take over control again... - cntrl_sig_16bit + cntrl_sig_16bit(); SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); } if ((dtc_cycle_cnt == 0) && ((cntrlSig & CNTRL_SIG_CPU_HALT) == CNTRL_SIG_CPU_HALT)) { // DTC cycle requested, grant it... - cntrl_sig_16bit - SetReg_16Bits(CNTRL_SIG_CPU_HALT | CNTRL_SIG_TCE1 | + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_CPU_HALT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); dtc_cycle_cnt++; } - TCLKset1 + IHIL_Tclk(1); timeOut++; } while ((dtc_cycle_cnt < MAX_DTC_CYCLE) && @@ -116,116 +114,120 @@ static long clkTclkAndCheckDTC(void) HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextX) -{ - decl_out - decl_out_long - decl_isInstrLoad - decl_instrLoad +{ + unsigned short ctl_sync = 0; unsigned short i = 0; short MyOut[5] = {0}; unsigned short address; unsigned short wdtVal; unsigned short statusReg = 0; - - if(STREAM_get_word(&address) != 0) + unsigned short* syncWithRunVarAddress = 0; + unsigned long lOut_long = 0; + + if(STREAM_get_word(&address) != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_NO_WDT_ADDRESS); } - + if(STREAM_get_word(&wdtVal) == -1) { return (HALERR_SYNC_JTAG_CONDITIONAL_NO_WDT_VALUE); - } + } + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } // DLLv2 syncCPUAndCyclesAfterDebug() - TCLKset1 // Stability improvement: should be possible to remove this here, default state of TCLK should be one - - cntrl_sig_capture - SetReg_16Bits(0x0000) - - if(!(lOut & CNTRL_SIG_TCE)) { + IHIL_Tclk(1); // Stability improvement: should be possible to remove this here, default state of TCLK should be one + + cntrl_sig_capture(); + if(!(SetReg_16Bits(0x0000) & CNTRL_SIG_TCE)) + { // If the JTAG and CPU are not already synchronized ... // Initiate Jtag and CPU synchronization. Read/Write is under CPU control. Source TCLK via TDI. // Do not effect bits used by DTC (CPU_HALT, MCLKON). - cntrl_sig_high_byte + cntrl_sig_high_byte(); SetReg_8Bits((CNTRL_SIG_TAGFUNCSAT | CNTRL_SIG_TCE1 | CNTRL_SIG_CPU) >> 8); // TCE eventually set indicates synchronization (and clocking via TCLK). - SyncJtag() - if(!i) + ctl_sync = SyncJtag(); + + if(!ctl_sync) { // Synchronization failed! return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } }// end of if(!(lOut & CNTRL_SIG_TCE)) - - if(lOut & CNTRL_SIG_CPU_HALT) + + if(ctl_sync & CNTRL_SIG_CPU_HALT) { - TCLKset0 - cntrl_sig_16bit + IHIL_Tclk(0); + cntrl_sig_16bit(); // Clear HALT. Read/Write is under CPU control. As a precaution, disable interrupts. - SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT) - TCLKset1 + SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); + IHIL_Tclk(1); } else { - cntrl_sig_16bit - // Clear HALT. Read/Write is under CPU control. As a precaution, disable interrupts. - SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT) + cntrl_sig_16bit(); + // Clear HALT. Read/Write is under CPU control. As a precaution, disable interrupts. + SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU | CNTRL_SIG_TAGFUNCSAT); } - instrLoad // step until next instruction load boundary if not being already there - if(lInstrLoad != 0) + // step until next instruction load boundary if not being already there + if(instrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); - } + } // read MAB = PC here - addr_capture - SetReg_20Bits(0x000) + addr_capture(); + lOut_long = SetReg_20Bits(0x000); MyOut[1] = (unsigned short)(lOut_long & 0xFFFF); MyOut[2] = (unsigned short)(lOut_long >> 16); // DLLv2: Check if a breakpoint was hit // \todo Determine if this is needed - + // disable EEM and clear stop reaction - eem_write_control - SetReg_16Bits(0x0003) - SetReg_16Bits(0x0000) - + eem_write_control(); + SetReg_16Bits(0x0003); + SetReg_16Bits(0x0000); + if (deviceSettings.clockControlType == GCC_EXTENDED) { - eem_data_exchange32 - SetReg_32Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_32Bits_(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN) // write into MX_GENCNTRL - - eem_data_exchange32 // Stability improvement: should be possible to remove this, required only once at the beginning - SetReg_32Bits_(MX_GENCNTRL + MX_WRITE) // write access to EEM General Control Register (MX_GENCNTRL) - SetReg_32Bits_(EMU_FEAT_EN | EMU_CLK_EN) // write into MX_GENCNTRL + eem_data_exchange32(); + SetReg_32Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_32Bits(EMU_FEAT_EN | EMU_CLK_EN | CLEAR_STOP | EEM_EN); // write into MX_GENCNTRL + + eem_data_exchange32(); // Stability improvement: should be possible to remove this, required only once at the beginning + SetReg_32Bits(MX_GENCNTRL + MX_WRITE); // write access to EEM General Control Register (MX_GENCNTRL) + SetReg_32Bits(EMU_FEAT_EN | EMU_CLK_EN); // write into MX_GENCNTRL } - + //----------------------------------------------------------------------- - data_16bit - TCLKset1 // added for 2xx support - SetReg_16Bits_(0x4303) - TCLKset0 - data_capture - TCLKset1 + data_16bit(); + IHIL_Tclk(1); // added for 2xx support + SetReg_16Bits(0x4303); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); // Advance to an instruction load boundary if an interrupt is detected. // The CPUOff bit will be cleared. // Basically, if there is an interrupt pending, the above dummy instruction // will have initialted its processing, and the CPU will not be on an - // instruction load boundary following the dummy instruction. - + // instruction load boundary following the dummy instruction. + // \Günther: Looks a lot like clckToInstrLoad(), with the exception that clkTclkAndCheckDTC() // is called continuously // \WLUT : Correct;-) i = 0; - cntrl_sig_capture - SetReg_16Bits(0); - while(!(lOut & CNTRL_SIG_INSTRLOAD) && (i < MAX_TCE1)) + cntrl_sig_capture(); + while(!(SetReg_16Bits(0) & CNTRL_SIG_INSTRLOAD) && (i < MAX_TCE1)) { if(clkTclkAndCheckDTC() != 0) { @@ -235,41 +237,40 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextX) SetReg_16Bits(0); } - - if(i == MAX_TCE1) + + if(i == MAX_TCE1) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } - + // Read PC now!!! Only the NOP or BIS #0,R4 instruction above was clocked into the device // The PC value should now be (OriginalValue + 2) // read MAB = PC here - addr_capture - SetReg_20Bits(0x0000) + addr_capture(); + lOut_long = SetReg_20Bits(0x0000); lOut_long -= 2; MyOut[1] = (unsigned short)(lOut_long & 0xFFFF); MyOut[2] = (unsigned short)(lOut_long >> 16); - + if(i == 0) { // An Interrupt was not detected // WLUT: lOut does not contain the content of the CNTRL_SIG register anymore at this point // need to capture it again...different to DLLv3 sequence but don't expect any negative effect due to recapturing - cntrl_sig_capture - SetReg_16Bits(0x0000) - if(lOut & CNTRL_SIG_CPU_OFF) + cntrl_sig_capture(); + if(SetReg_16Bits(0x0000) & CNTRL_SIG_CPU_OFF) { MyOut[1] += 2; - - data_16bit - TCLKset1 // Added for 2xx support + + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support SetReg_16Bits(0xC032); if(clkTclkAndCheckDTC() != 0) { return (HALERR_SYNC_JTAG_CONDITIONAL_JTAG_TIMEOUT); } - data_16bit - TCLKset1 // Added for 2xx support \Günther: Why set TCLK 1 again? + data_16bit(); + IHIL_Tclk(1); // Added for 2xx support \Günther: Why set TCLK 1 again? SetReg_16Bits(0x0010); if(clkTclkAndCheckDTC() != 0) { @@ -281,37 +282,37 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextX) } else { - addr_capture - SetReg_20Bits(0) + addr_capture(); + lOut_long = SetReg_20Bits(0); MyOut[1] = (unsigned short)(lOut_long & 0xFFFF); MyOut[2] = (unsigned short)(lOut_long >> 16); MyOut[4] = 1; // Inform DLL about interrupt } - + // DLL v2: deviceHasDTCBug // Configure the DTC so that it transfers after the present CPU instruction is complete (ADC10FETCH). // Save and clear ADC10CTL0 and ADC10CTL1 to switch off DTC (Note: Order matters!). // Regain control of the CPU. Read/Write will be set, and source TCLK via TDI. - cntrl_sig_16bit - SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_READ | CNTRL_SIG_TAGFUNCSAT) - - isInstrLoad // Test if we are on an instruction load boundary - if(lIsInstrLoad != 0) + cntrl_sig_16bit(); + SetReg_16Bits(CNTRL_SIG_TCE1 | CNTRL_SIG_READ | CNTRL_SIG_TAGFUNCSAT); + + // Test if we are on an instruction load boundary + if(isInstrLoad() != 0) { return (HALERR_INSTRUCTION_BOUNDARY_ERROR); } - + // Hold Watchdog - ReadMemWordX(address, MyOut[0]); // safe WDT value + MyOut[0] = ReadMemWordX(address); // safe WDT value wdtVal |= (MyOut[0] & 0x00FF); // set original bits in addition to stop bit WriteMemWordX(address, wdtVal); - + // set PC to a save address pointing to ROM to avoid RAM corruption on certain devices - SetPcX(ROM_ADDR) + SetPcX(ROM_ADDR); // read status register - ReadCpuRegX(2,MyOut[3]); + MyOut[3] = ReadCpuRegX(2); MyOut[3] |= statusReg; // compine with preserved CPUOFF bit setting // return output diff --git a/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextXv2.c b/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextXv2.c index 6f56468..8012a9b 100644 --- a/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextXv2.c +++ b/Bios/src/hal/macros/SyncJtag_Conditional_SaveContextXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -46,10 +46,11 @@ #include "stream.h" #include "JTAG_defs.h" #include "EEM_defs.h" +#include "global_variables.h" #define SR 2 -#define EEM_STOPPED 0x0080 +#define EEM_STOPPED 0x0080 extern unsigned short altRomAddressForCpuRead; @@ -68,39 +69,38 @@ extern DevicePowerSettings devicePowerSettings; //! \todo EEM cycle counter, decide if it should be handled by host DLL! HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) { - decl_out - decl_out_long - unsigned char pipe_empty = 0; unsigned char cpuoff = 0; - unsigned char intreq = 0; - unsigned char halt = 0; - unsigned long halt_count = 0; + unsigned short irRequest = 0; const unsigned long MaxCyclesForSync = 10000; // must be defined, dependant on DMA (burst transfer)!!! unsigned long i = 0; - unsigned short MyOut[4]; - unsigned short wdt_addr; - unsigned short wdt_value; + unsigned short MyOut[5]; + unsigned short wdt_addr = 0; + unsigned short wdt_value = 0; unsigned long TimeOut = 0; + unsigned short* syncWithRunVarAddress = getTargetRunningVar(); + unsigned short lOut = 0; + unsigned long lOut_long = 0; //------------------------------------------------------------------------------ // Start note 822: Special handling ynchronize to JTAG - + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } // -------------------------Power mode handling start ---------------------- DisableLpmx5(); // -------------------------Power mode handling end ------------------------ - + // read out EEM control register... - eem_read_control - SetReg_16Bits(0x0000) + eem_read_control(); // ... and check if device got already stopped by the EEM - if (!(lOut & EEM_STOPPED)) + if (!(SetReg_16Bits(0x0000) & EEM_STOPPED)) { // do this only if the device is NOT already stopped. // read out control signal register first - cntrl_sig_capture - SetReg_16Bits(0x0000) + cntrl_sig_capture(); // check if CPUOFF bit is set - if(!(lOut & CNTRL_SIG_CPUOFF)) + if(!(SetReg_16Bits(0x0000) & CNTRL_SIG_CPUOFF)) { // do the following only if the device is NOT in Low Power Mode unsigned long tbValue; unsigned long tbCntrl; @@ -108,28 +108,24 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) unsigned long tbComb; unsigned long tbBreak; - // Trigger Block 0 value register - eem_data_exchange32 + // Trigger Block 0 value register + eem_data_exchange32(); SetReg_32Bits(MBTRIGxVAL + READ + TB0); // load address - SetReg_32Bits(0); // shift in dummy 0 - tbValue = lOut_long; - // Trigger Block 0 control register + // shift in dummy 0 + tbValue = SetReg_32Bits(0); // Trigger Block 0 control register SetReg_32Bits(MBTRIGxCTL + READ + TB0); // load address - SetReg_32Bits(0); // shift in dummy 0 - tbCntrl = lOut_long; - // Trigger Block 0 mask register + // shift in dummy 0 + tbCntrl = SetReg_32Bits(0); // Trigger Block 0 mask register SetReg_32Bits(MBTRIGxMSK + READ + TB0); // load address - SetReg_32Bits(0); // shift in dummy 0 - tbMask = lOut_long; - // Trigger Block 0 combination register + // shift in dummy 0 + tbMask = SetReg_32Bits(0); + // Trigger Block 0 combination register SetReg_32Bits(MBTRIGxCMB + READ + TB0); // load address - SetReg_32Bits(0); // shift in dummy 0 - tbComb = lOut_long; - // Trigger Block 0 combination register + tbComb = SetReg_32Bits(0); // shift in dummy 0 + // Trigger Block 0 combination register SetReg_32Bits(BREAKREACT + READ); // load address - SetReg_32Bits(0); // shift in dummy 0 - tbBreak = lOut_long; - + tbBreak = SetReg_32Bits(0); // shift in dummy 0 + // now configure a trigger on the next instruction fetch SetReg_32Bits(MBTRIGxCTL + WRITE + TB0); // load address SetReg_32Bits(CMP_EQUAL + TRIG_0 + MAB); @@ -139,26 +135,25 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) SetReg_32Bits(EN0); SetReg_32Bits(BREAKREACT + WRITE); // load address SetReg_32Bits(EN0); - + // enable EEM to stop the device SetReg_32Bits(GENCLKCTRL + WRITE); // load address SetReg_32Bits(MCLK_SEL0 + SMCLK_SEL0 + ACLK_SEL0 + STOP_MCLK + STOP_SMCLK + STOP_ACLK); - eem_write_control - SetReg_16Bits_(EMU_CLK_EN + CLEAR_STOP + EEM_EN); - + eem_write_control(); + SetReg_16Bits(EMU_CLK_EN + CLEAR_STOP + EEM_EN); + { short lTimeout = 0; do { - eem_read_control - SetReg_16Bits(0x0000) + eem_read_control(); lTimeout++; } - while(!(lOut & EEM_STOPPED) && lTimeout < 3000); + while(!(SetReg_16Bits(0x0000) & EEM_STOPPED) && lTimeout < 3000); } // restore the setting of Trigger Block 0 previously stored - // Trigger Block 0 value register - eem_data_exchange32 + // Trigger Block 0 value register + eem_data_exchange32(); SetReg_32Bits(MBTRIGxVAL + WRITE + TB0); // load address SetReg_32Bits(tbValue); SetReg_32Bits(MBTRIGxCTL + WRITE + TB0); // load address @@ -173,27 +168,28 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) } // End: special handling note 822 //------------------------------------------------------------------------------ - + // enable clock control before sync - eem_write_control - SetReg_16Bits_(EMU_CLK_EN + EEM_EN); + eem_write_control(); + SetReg_16Bits(EMU_CLK_EN + EEM_EN); - // sync device to JTAG + // sync device to JTAG SyncJtagXv2(); - + // reset CPU stop reaction - CPU is now under JTAG control // Note: does not work on F5438 due to note 772, State storage triggers twice on single stepping - eem_write_control - SetReg_16Bits(EMU_CLK_EN + CLEAR_STOP + EEM_EN) - SetReg_16Bits(EMU_CLK_EN + CLEAR_STOP) + eem_write_control(); + SetReg_16Bits(EMU_CLK_EN + CLEAR_STOP + EEM_EN); + SetReg_16Bits(EMU_CLK_EN + CLEAR_STOP); - cntrl_sig_16bit - SetReg_16Bits(0x1501) + cntrl_sig_16bit(); + SetReg_16Bits(0x1501); // clock system into Full Emulation State now... - // while checking control signals CPUSUSP (pipe_empty), CPUOFF, INTREQ and HALT - - cntrl_sig_capture - SetReg_16Bits(0) + // while checking control signals CPUSUSP (pipe_empty), CPUOFF and HALT + + cntrl_sig_capture(); + lOut = SetReg_16Bits(0); + /////////////////////////////////////////// // Note 805: check if wait is set if((lOut & 0x8) == 0x8) @@ -201,55 +197,39 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) // wait until wait is end while((lOut & 0x8) == 0x8 && TimeOut++ < 30000) { - TCLKset0 // provide falling clock edge - TCLKset1 // provide rising clock edge - cntrl_sig_capture - SetReg_16Bits(0) + IHIL_Tclk(0); // provide falling clock edge + IHIL_Tclk(1); // provide rising clock edge + cntrl_sig_capture(); + lOut = SetReg_16Bits(0); } } //Note 805 end: Florian, 21 Dec 2010 - /////////////////////////////////////////// - - cntrl_sig_capture + /////////////////////////////////////////// + + cntrl_sig_capture(); do { - TCLKset0 // provide falling clock edge + IHIL_Tclk(0); // provide falling clock edge // check control signals during clock low phase - SetReg_16Bits(0) // shift out current control signal register value - (lOut & CNTRL_SIG_CPUSUSP) ? (pipe_empty = TRUE) : (pipe_empty = FALSE); - (lOut & CNTRL_SIG_INTREQ) ? (intreq = TRUE) : (intreq = FALSE); - (lOut & CNTRL_SIG_HALT) ? (halt = TRUE) : (halt = FALSE); - - TCLKset1 // provide rising clock edge - - if(halt) - { - halt_count = 0; // reset counter when DMA transfer is active - } - else - { - halt_count++; // increment counter when no DMA request is available - } - + // shift out current control signal register value + (SetReg_16Bits(0x000) & CNTRL_SIG_CPUSUSP) ? (pipe_empty = TRUE) : (pipe_empty = FALSE); + IHIL_Tclk(1); // provide rising clock edge i++; // increment loop counter for braek condition } // break condition: // pipe_empty = 1 - // intreq = 0 - // halt_count > 3 // or an error occured (MaxCyclesForSync exeeded!!) - //df while(!(pipe_empty && !intreq && halt_count > 3) && i < MaxCyclesForSync); - while(!pipe_empty && (i < MaxCyclesForSync)); + while(!pipe_empty && (i < MaxCyclesForSync)); //! \todo check error condition if(i >= MaxCyclesForSync) { ; } - + // the interrupts will be diabled now - JTAG takes over control of the control signals - cntrl_sig_16bit - SetReg_16Bits(0x0501) + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); // recall an interrupt request /** @@ -260,12 +240,13 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) * Begin of: i_SaveContext */ // provide 1 clock in order to have the data ready in the first transaction slot - TCLK - addr_capture - SetReg_20Bits(0) + IHIL_TCLK(); + addr_capture(); + lOut_long = SetReg_20Bits(0); - cntrl_sig_capture - SetReg_16Bits(0) // shift out current control signal register value + cntrl_sig_capture(); + lOut = SetReg_16Bits(0); + // shift out current control signal register value if(lOut & CNTRL_SIG_CPUOFF) { cpuoff = TRUE; @@ -274,6 +255,7 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) { cpuoff = FALSE; } + irRequest = (lOut & 0x4); // adjust program counter according to control signals if(cpuoff) @@ -283,48 +265,47 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) else { lOut_long -= 4; - } + } { - unsigned long tempPc = lOut_long; + unsigned long tempPc = lOut_long; /********************************************************/ /* Note 1495, 1637 special handling for program counter */ /********************************************************/ - if(tempPc == 0xFFFE) + if((tempPc & 0xFFFF) == 0xFFFE) { - unsigned long tempPc = 0; - unsigned short read = 0; - ReadMemWordXv2(0xFFFE,read); + unsigned long tempPc = 0; + unsigned short read = ReadMemWordXv2(0xFFFE); tempPc = (0x00000000 | read); - + MyOut[1] = (unsigned short)(tempPc & 0xFFFF); MyOut[2] = (unsigned short)(tempPc >>16); } /* End note 1495, 1637 */ else - { + { MyOut[1] = (unsigned short)(tempPc & 0xFFFF); MyOut[2] = (unsigned short)(tempPc >>16); - } + } } /** * End of : i_SaveContext */ - + // set EEM FEATURE enable now!!! - eem_write_control - SetReg_16Bits(EMU_FEAT_EN + EMU_CLK_EN + CLEAR_STOP) - + eem_write_control(); + SetReg_16Bits(EMU_FEAT_EN + EMU_CLK_EN + CLEAR_STOP); + // check for Init State - cntrl_sig_capture - SetReg_16Bits(0) + cntrl_sig_capture(); + SetReg_16Bits(0); // hold Watchdog Timer STREAM_get_word(&wdt_addr); STREAM_get_word(&wdt_value); - ReadMemWordXv2(wdt_addr, MyOut[0]); + MyOut[0] = ReadMemWordXv2(wdt_addr); wdt_value |= (MyOut[0] & 0xFF); // set original bits in addition to stop bit - WriteMemWordXv2(wdt_addr, wdt_value | 0x80); + WriteMemWordXv2(wdt_addr, wdt_value); { unsigned short Mova; @@ -333,16 +314,16 @@ HAL_FUNCTION(_hal_SyncJtag_Conditional_SaveContextXv2) // save Status Register content Mova = 0x0060; Mova += (SR<<8) & 0x0F00; - ReadCpuRegXv2(Mova, Rx); + Rx = ReadCpuRegXv2(Mova); MyOut[3] = (unsigned short)Rx; // reset Status Register to 0 - needs to be restored again for release Mova = 0x0080; Mova += (SR & 0x000F); - Rx_l = (((unsigned short)Rx) & 0xFFEF); // reset CPUOFF bit + Rx_l = (((unsigned short)Rx) & 0xFFE7); // clear CPUOFF/GIE bit WriteCpuRegXv2(Mova, Rx_l); } - - STREAM_put_bytes((unsigned char*)MyOut,8); + MyOut[4] = irRequest; + + STREAM_put_bytes((unsigned char*)MyOut,10); return 0; } - diff --git a/Bios/src/hal/macros/UnlockC092.c b/Bios/src/hal/macros/UnlockC092.c index 530cd77..1880c88 100644 --- a/Bios/src/hal/macros/UnlockC092.c +++ b/Bios/src/hal/macros/UnlockC092.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -54,61 +54,64 @@ HAL_FUNCTION(_hal_UnlockC092) unsigned short passwordLenght= 0x0 ; unsigned short i = 0x0; unsigned short id = 0; - decl_out - decl_jtagMailboxIn //StreamSafe stream_tmp; unsigned short Password[4] = {0}; - + // steam get password length if(STREAM_get_word(&passwordLenght) != 0) { return(HALERR_UNLOCK_NO_PASSWORD_LENGTH); - } + } // steam get password itself for(i =0; i < passwordLenght; i++) { if(STREAM_get_word(&Password[i]) < 0) { return(HALERR_UNLOCK_INVALID_PASSWORD_LENGTH); - } - } - //-------------------------------------------------------------------------- + } + } + //-------------------------------------------------------------------------- //phase 0 if device was in LPMx5 - //-------------------------------------------------------------------------- - - EDT_SetProtocol(0); // C092 can just operrate in SBW4 Mode + //-------------------------------------------------------------------------- - //-------------------------------------------------------------------------- + IHIL_SetProtocol(0); // C092 can just operrate in SBW4 Mode +#if defined(eZ_FET) || defined(MSP_FET) + { + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + } +#endif + + //-------------------------------------------------------------------------- //phase 1 of device entry using a user password - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- // Apply 4wire/SBW entry Sequence & holt Reset low - EDT_SetReset(0); - EDT_Open(RSTHIGH); - EDT_TapReset(); - EDT_SetReset(0); - EDT_CheckJtagFuse(); - i_WriteJmbIn32(Password[0], Password[1]); - // check for Timeout issue during mailbox request - if(jtagMailboxIn == 1) + IHIL_SetReset(0); + IHIL_Open(RSTHIGH); + IHIL_TapReset(); + IHIL_SetReset(0); + IHIL_CheckJtagFuse(); + + // check for Timeout issue during mailbox request + if(i_WriteJmbIn32(Password[0], Password[1]) == 1) { return (HALERR_JTAG_PASSWORD_WRONG); - } + } if(passwordLenght > 2) { // now feed in last 2 words of password - EDT_SetReset(1); - EDT_Delay_1ms(200); - i_WriteJmbIn32(Password[2], Password[3]); - if(jtagMailboxIn == 1) + IHIL_SetReset(1); + IHIL_Delay_1ms(200); + if(i_WriteJmbIn32(Password[2], Password[3]) == 1) { return (HALERR_JTAG_PASSWORD_WRONG); - } + } } - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); + id = cntrl_sig_capture(); if(id != 0x95) { - return (HALERR_JTAG_PASSWORD_WRONG); + return (HALERR_JTAG_PASSWORD_WRONG); } - EDT_SetReset(1); + IHIL_SetReset(1); return(0); } diff --git a/Bios/src/hal/macros/UnlockDeviceXv2.c b/Bios/src/hal/macros/UnlockDeviceXv2.c index 9a10d95..1654431 100644 --- a/Bios/src/hal/macros/UnlockDeviceXv2.c +++ b/Bios/src/hal/macros/UnlockDeviceXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -53,13 +53,10 @@ HAL_FUNCTION(_hal_UnlockDeviceXv2) { unsigned short passwordLenght= 0x0 ; unsigned short i = 0x0; - unsigned short id = 0; - decl_out - decl_jtagMailboxIn unsigned short Password[60] = {0}; unsigned short protocol; - - + + // get the protocol if(STREAM_get_word(&protocol) < 0) { @@ -69,70 +66,63 @@ HAL_FUNCTION(_hal_UnlockDeviceXv2) if(STREAM_get_word(&passwordLenght) != 0) { return (HALERR_UNLOCK_NO_PASSWORD_LENGTH); - } + } // steam get password itself for(i =0; i < passwordLenght; i++) { if(STREAM_get_word(&Password[i]) < 0) { return (HALERR_UNLOCK_INVALID_PASSWORD_LENGTH); - } - } - //-------------------------------------------------------------------------- + } + } + //-------------------------------------------------------------------------- //phase 0 if device was in LPMx5 or camping in an endless loop - //-------------------------------------------------------------------------- - - EDT_SetProtocol(protocol); // this is jsut for debug must be changed - EDT_Open(RSTHIGH); - EDT_TapReset(); - //EDT_EnumChain(); + //-------------------------------------------------------------------------- + + IHIL_SetProtocol(protocol); // this is jsut for debug must be changed +#if defined(eZ_FET) || defined(MSP_FET) + { + HilInitGetEdtDistinctFunc hilEdtDis = (HilInitGetEdtDistinctFunc)0x1880; + hilEdtDis(&_edt_Distinct_Methods); + } +#endif + IHIL_Open(RSTHIGH); + IHIL_TapReset(); - //-------------------------------------------------------------------------- + IHIL_Close(); + //-------------------------------------------------------------------------- //phase 1 of device entry using a user password - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- // Apply 4wire/SBW entry Sequence & holt Reset low - EDT_Open(RSTLOW); + IHIL_Open(RSTLOW); // reset TAP state machine -> Run-Test/Idle - EDT_TapReset(); + IHIL_TapReset(); // start JTAG mailbox & feed in password exchange request - i_WriteJmbIn32(MAGIC_PATTERN , DR_JMB_PASSWORD_EXCHANGE_REQUEST); - // check for Timeout issue during mailbox request - if(jtagMailboxIn == 1) + // check for Timeout issue during mailbox request + if(i_WriteJmbIn32(MAGIC_PATTERN , DR_JMB_PASSWORD_EXCHANGE_REQUEST) == 1) { return (HALERR_JTAG_PASSWORD_WRONG); - } - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - - if(id != 0x91) - { - return (HALERR_JTAG_PASSWORD_WRONG); } - //------------------------------------------------------------------------- + + //------------------------------------------------------------------------- //phase 2 of device entry using a user password //------------------------------------------------------------------------- // Apply again 4wire/SBW entry Sequence & Reset high - EDT_Open(RSTHIGH); + IHIL_Open(RSTHIGH); // Reset TAP state machine -> Run-Test/Idle - EDT_TapReset(); + IHIL_TapReset(); i = 0x0; // start JTAG mailbox & feed in password & make sure that you are faster - // then 1.2 seconds if not the bootcode will kick you out & Use 16Bit JBM mode + // then 1.2 seconds if not the bootcode will kick you out & Use 16Bit JBM mode while(i < passwordLenght) { - i_WriteJmbIn(Password[i]) - // check for Timeout becuase of wong passord which was shifted in - if(jtagMailboxIn == 1) + // check for Timeout becuase of wong passord which was shifted in + if(i_WriteJmbIn(Password[i]) == 1) { return (HALERR_JTAG_PASSWORD_WRONG); } i++; - } - id = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - - if(id != 0x91) - { - return (HALERR_JTAG_PASSWORD_WRONG); - } - + } + return (0); } diff --git a/Bios/src/hal/macros/UssSyncConditional.c b/Bios/src/hal/macros/UssSyncConditional.c new file mode 100644 index 0000000..1cfad7d --- /dev/null +++ b/Bios/src/hal/macros/UssSyncConditional.c @@ -0,0 +1,78 @@ +/** +* \ingroup MODULMACROSXV2 +* +* \file LeaSyncConditional.c +* +* \brief +* +*/ +/* + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "hal_ref.h" +#include "stream.h" +#include "JTAG_defs.h" +#include "EEM_defs.h" +#include "global_variables.h" + +#define UUPSRIS (0x0EC4) +#define STPBYDB (0x0004) + +HAL_FUNCTION(_hal_UssSyncConditional) +{ + unsigned short tclkCycles = 200; + unsigned long baseAddress = 0; + + STREAM_get_long(&baseAddress); + + //Read UUPS_CTL regsier and check for USS_Busy bit + unsigned short ussReg = ReadMemWordXv2(UUPSRIS); + if(!(ussReg & STPBYDB)) + { + STREAM_put_word(ussReg & STPBYDB); + return 0; + } + // apply TCLK cycles + while(tclkCycles-- > 0) + { + IHIL_TCLK(); + } + + IHIL_Tclk(1); + + STREAM_put_word(0); + return 0; +} diff --git a/Bios/src/hal/macros/WaitForDebugHaltArm.c b/Bios/src/hal/macros/WaitForDebugHaltArm.c new file mode 100644 index 0000000..4240b47 --- /dev/null +++ b/Bios/src/hal/macros/WaitForDebugHaltArm.c @@ -0,0 +1,121 @@ +/* + * \ingroup MODULMACROS + * + * \file WaitForDebugHaltArm.c + * + * \brief + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "error_def.h" +#include "global_variables.h" + +/** + WaitForDebugHalt + Test the DHCSR register for specific bits and + return if one of them is set. + This is best used with the ExecLoop command type. + inData: + outData: + Mask: the bits to look for + Ctrl: the read DHCSR register +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +short checkDhcsrRegForBbHit() +{ + unsigned long dhcsrValue = 0; + unsigned short* syncWithRunVarAddress = getTargetRunningVar(); + + if(syncWithRunVarAddress) + { + if(!(*syncWithRunVarAddress)) + { + return 2; + } + } + + if(IHIL_Write_Read_Mem_Ap(0, DHCSR, &dhcsrValue, READ) == -1) + { + return HALERR_UNDEFINED_ERROR; + } + if(dhcsrValue & S_HALT) + { + + STREAM_put_long(dhcsrValue); + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + return 1; + } + return 2; +} + + +HAL_FUNCTION(_hal_WaitForDebugHaltArm) +{ + short RetState = HALERR_UNDEFINED_ERROR; +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long val = 0; + if(armConfigSettings.ulpDebug) + { + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, READ); + + if(val & DP_CTRL_STAT_CDBGPWRUPACK ) + { + if( powerUpArm() != 0) + { + return RetState = 2; + } + if(checkWakeup() != 0) + { + return RetState = 2; + } + RetState = checkDhcsrRegForBbHit(); + } + } + else // high power force + { + RetState = checkDhcsrRegForBbHit(); + } +#endif + return RetState; +} diff --git a/Bios/src/hal/macros/WaitForEem.c b/Bios/src/hal/macros/WaitForEem.c index 7f817e8..cb98ed9 100644 --- a/Bios/src/hal/macros/WaitForEem.c +++ b/Bios/src/hal/macros/WaitForEem.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,6 +44,8 @@ #include "hal.h" #include "stream.h" #include "error_def.h" +#include "global_variables.h" +#include "JtagId.h" /** WaitForEem @@ -58,45 +60,52 @@ HAL_FUNCTION(_hal_WaitForEem) { - decl_out + short RetState = HALERR_UNDEFINED_ERROR; + unsigned long lMask = 0; + unsigned short sGenCtrl = 0, lOut = 0; + unsigned short eventMask = 0; + unsigned short* syncWithRunVarAddress = 0; + + STREAM_get_word((unsigned short*)&lMask); + + syncWithRunVarAddress = getTargetRunningVar(); + if(syncWithRunVarAddress) + { + if(!(*syncWithRunVarAddress)) + { + return 2; + } + } + else + { + return -1; + } + + if(!jtagIdIsValid(cntrl_sig_capture())) + { + return 2; + } + + // poll for bits in EEM GENCTRL register + eem_read_control(); + lOut = SetReg_16Bits(0x0000); - short RetState = HALERR_UNDEFINED_ERROR; - unsigned long i = 0; - unsigned long lMask = 0; - unsigned short sGenCtrl = 0; - unsigned short eventMask = 0; + if(lOut & lMask) + { + if(syncWithRunVarAddress) + { + *syncWithRunVarAddress = 0x0000; + } + sGenCtrl |= lOut; + eventMask |= BP_HIT_FLAG; + STREAM_put_word(eventMask); + STREAM_put_word(sGenCtrl); + RetState = 1; + } + else + { + RetState = 2; + } - STREAM_get_word((unsigned short*)&lMask); - - lOut = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if(lOut != JTAGVERSION && lOut != JTAGVERSION91 && lOut != JTAGVERSION95 && lOut != JTAGVERSION99) - { - return 2; - } - - - // poll for bits in EEM GENCTRL register - eem_read_control - do - { - SetReg_16Bits(0x0000) - i++; - } - while(!(lOut & lMask) && i < 10); - if(i < 10) - { - sGenCtrl = lOut; - - eventMask |= BP_HIT_FLAG; - RetState = 1; - - STREAM_put_word(eventMask); - STREAM_put_word(sGenCtrl); - } - else - { - RetState = 2; - } - - return RetState; + return RetState; } diff --git a/Bios/src/hal/macros/WaitForStorage.c b/Bios/src/hal/macros/WaitForStorage.c index 792f93a..f4bba84 100644 --- a/Bios/src/hal/macros/WaitForStorage.c +++ b/Bios/src/hal/macros/WaitForStorage.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,6 +44,7 @@ #include "hal.h" #include "stream.h" #include "error_def.h" +#include "JtagId.h" unsigned short lastTraceWritePos = 0; @@ -55,32 +56,25 @@ unsigned short lastTraceWritePos = 0; HAL_FUNCTION(_hal_WaitForStorage) { - decl_out - short RetState = 2; unsigned short sStStorCtrl = 0; - - lOut = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if(lOut != JTAGVERSION && lOut != JTAGVERSION91 && lOut != JTAGVERSION95 && lOut != JTAGVERSION99) + + if(!jtagIdIsValid(cntrl_sig_capture())) { - return 2; + return 2; } - - - eem_data_exchange + eem_data_exchange(); SetReg_16Bits(0x9F); - SetReg_16Bits(0); - - sStStorCtrl = lOut; - + sStStorCtrl = SetReg_16Bits(0); + //Storage written bit - if (lOut & 0x100) + if (sStStorCtrl & 0x100) { //Variable watch mode if ( (sStStorCtrl & 0x6) == 0x4 ) { unsigned short readPos = 0; - + STREAM_put_word(VARIABLE_WATCH_FLAG); //Reset storage @@ -90,26 +84,22 @@ HAL_FUNCTION(_hal_WaitForStorage) for (readPos = 0; readPos < 8; ++readPos) { //Slice bits autoincrement on reading - + SetReg_16Bits(0x9A); SetReg_16Bits(readPos << 2); - + //Read MAB value SetReg_16Bits(0x9D); - SetReg_16Bits(0); - - STREAM_put_long((unsigned short)lOut); - + STREAM_put_long(SetReg_16Bits(0)); //Read MDB value - SetReg_16Bits(0x9D); - SetReg_16Bits(0); - STREAM_put_word((unsigned short)lOut); + SetReg_16Bits(0x9D); + STREAM_put_word(SetReg_16Bits(0)); } - + RetState = 1; } - + //Trace mode else { @@ -117,21 +107,20 @@ HAL_FUNCTION(_hal_WaitForStorage) short newEntries = 0; SetReg_16Bits(0x9B); - SetReg_16Bits(0); - - writePos = lOut >> 10; - + + writePos = SetReg_16Bits(0) >> 10; + //store until full bit if (sStStorCtrl & 0x8) { - //storage full bit - if (sStStorCtrl & 0x200) + //storage full bit (or writePos = 0, if written after polling storage control) + if ((sStStorCtrl & 0x200) || (writePos == 0)) { //Disable and reset bits when full to avoid further events //Enable bit will be set again with next reset from DLL SetReg_16Bits(0x9E); SetReg_16Bits((sStStorCtrl | 0x40) & ~0x1); - + newEntries = 8 - lastTraceWritePos; } else if (writePos != lastTraceWritePos) @@ -143,7 +132,7 @@ HAL_FUNCTION(_hal_WaitForStorage) else { static unsigned int noChangeSince = 0; - + if (writePos != lastTraceWritePos) { noChangeSince = 0; @@ -153,46 +142,43 @@ HAL_FUNCTION(_hal_WaitForStorage) newEntries = (sStStorCtrl & 0x200) ? 8 : writePos; } } - + lastTraceWritePos = writePos; - + if (newEntries > 0) { - short readPos = writePos; + unsigned short readPos = (writePos - newEntries) & 0x7; STREAM_put_word(STATE_STORAGE_FLAG); STREAM_put_word(newEntries); - + do { - if (--readPos < 0) - readPos = 7; - //Slice bits autoincrement on reading - + SetReg_16Bits(0x9A); SetReg_16Bits(readPos << 2); - + //Read MAB value SetReg_16Bits(0x9D); - SetReg_16Bits(0); - - STREAM_put_long((unsigned short)lOut); - - //Read MDB value + STREAM_put_long(SetReg_16Bits(0)); + + //Read MDB value SetReg_16Bits(0x9D); - SetReg_16Bits(0); - - STREAM_put_word((unsigned short)lOut); - - //Read Ctrl value + STREAM_put_word(SetReg_16Bits(0)); + + //Read Ctrl value SetReg_16Bits(0x9D); - SetReg_16Bits(0); - - STREAM_put_word((unsigned short)lOut); + STREAM_put_word(SetReg_16Bits(0)); + + if (++readPos > 7) + { + readPos = 0; + } + } while (readPos != writePos); - - RetState = 1; + + RetState = 1; } } } diff --git a/Bios/src/hal/macros/WaitForStorageX.c b/Bios/src/hal/macros/WaitForStorageX.c index 7cb2c31..d70adba 100644 --- a/Bios/src/hal/macros/WaitForStorageX.c +++ b/Bios/src/hal/macros/WaitForStorageX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -44,6 +44,7 @@ #include "hal.h" #include "stream.h" #include "error_def.h" +#include "JtagId.h" extern unsigned short lastTraceWritePos; @@ -55,25 +56,19 @@ extern unsigned short lastTraceWritePos; HAL_FUNCTION(_hal_WaitForStorageX) { - decl_out - decl_out_long - short RetState = 2; unsigned short sStStorCtrl = 0; - - lOut = EDT_Instr(IR_CNTRL_SIG_CAPTURE); - if(lOut != JTAGVERSION && lOut != JTAGVERSION91 && lOut != JTAGVERSION95 && lOut != JTAGVERSION99) + + if(!jtagIdIsValid(cntrl_sig_capture())) { - return 2; + return 2; } - - - eem_data_exchange32 + + eem_data_exchange32(); SetReg_32Bits(0x9F); - SetReg_32Bits(0); - - sStStorCtrl = (unsigned short)lOut_long; - + + sStStorCtrl = (unsigned short)SetReg_32Bits(0); + //Storage written bit if (sStStorCtrl & 0x100) { @@ -81,7 +76,7 @@ HAL_FUNCTION(_hal_WaitForStorageX) if ( (sStStorCtrl & 0x6) == 0x4 ) { unsigned short readPos = 0; - + STREAM_put_word(VARIABLE_WATCH_FLAG); //Reset storage @@ -91,26 +86,22 @@ HAL_FUNCTION(_hal_WaitForStorageX) for (readPos = 0; readPos < 8; ++readPos) { //Slice bits autoincrement on reading - + SetReg_32Bits(0x9A); SetReg_32Bits(readPos << 2); - + //Read MAB value SetReg_32Bits(0x9D); - SetReg_32Bits(0); - - STREAM_put_long(lOut_long); - + STREAM_put_long(SetReg_32Bits(0)); + //Read MDB value SetReg_32Bits(0x9D); - SetReg_32Bits(0); - - STREAM_put_word(lOut_long & 0xFFFF); + STREAM_put_word(SetReg_32Bits(0) & 0xFFFF); } - + RetState = 1; } - + //Trace mode else { @@ -118,21 +109,19 @@ HAL_FUNCTION(_hal_WaitForStorageX) short newEntries = 0; SetReg_32Bits(0x9B); - SetReg_32Bits(0); - - writePos = (short)(lOut_long >> 10); - + writePos = (short)(SetReg_32Bits(0) >> 10); + //store until full bit if (sStStorCtrl & 0x8) { - //storage full bit - if (sStStorCtrl & 0x200) + //storage full bit (or writePos = 0, if written after polling storage control) + if ((sStStorCtrl & 0x200) || (writePos == 0)) { //Disable and reset bits when full to avoid further events //Enable bit will be set again with next reset from DLL SetReg_32Bits(0x9E); SetReg_32Bits((sStStorCtrl | 0x40) & ~0x1); - + newEntries = 8 - lastTraceWritePos; } else if (writePos != lastTraceWritePos) @@ -144,7 +133,7 @@ HAL_FUNCTION(_hal_WaitForStorageX) else { static unsigned int noChangeSince = 0; - + if (writePos != lastTraceWritePos) { noChangeSince = 0; @@ -154,46 +143,41 @@ HAL_FUNCTION(_hal_WaitForStorageX) newEntries = (sStStorCtrl & 0x200) ? 8 : writePos; } } - + lastTraceWritePos = writePos; - + if (newEntries > 0) { - short readPos = writePos; + unsigned short readPos = (writePos - newEntries) & 0x7; STREAM_put_word(STATE_STORAGE_FLAG); STREAM_put_word(newEntries); - + do { - if (--readPos < 0) - readPos = 7; - //Slice bits autoincrement on reading - + SetReg_32Bits(0x9A); SetReg_32Bits(readPos << 2); - + //Read MAB value SetReg_32Bits(0x9D); - SetReg_32Bits(0); - - STREAM_put_long(lOut_long); - - //Read MDB value + STREAM_put_long(SetReg_32Bits(0)); + + //Read MDB value SetReg_32Bits(0x9D); - SetReg_32Bits(0); - - STREAM_put_word(lOut_long & 0xFFFF); - - //Read Ctrl value + STREAM_put_word(SetReg_32Bits(0) & 0xFFFF); + + //Read Ctrl value SetReg_32Bits(0x9D); - SetReg_32Bits(0); - - STREAM_put_word(lOut_long & 0xFFFF); + STREAM_put_word(SetReg_32Bits(0) & 0xFFFF); + + if (++readPos > 7) + readPos = 0; + } while (readPos != writePos); - - RetState = 1; + + RetState = 1; } } } diff --git a/Bios/src/hal/macros/WriteAllCpuRegsArm.c b/Bios/src/hal/macros/WriteAllCpuRegsArm.c new file mode 100644 index 0000000..a213f23 --- /dev/null +++ b/Bios/src/hal/macros/WriteAllCpuRegsArm.c @@ -0,0 +1,114 @@ +/* + * \ingroup MODULMACROSMSP432 + * + * \file ReadAllCpuRegsArm.c + * + * \brief Read CPU register values, except R0 and R2 + * + * + * Copyright (C) 2012 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. + */ + +#include "arch.h" +#include "edt.h" +#include "hal.h" +#include "stream.h" +#include "error_def.h" + +/** + WriteAllCpuRegsMSP432 + Write CPU register values + inData: R0-R12, SP, LR, PC, SR, XPRS, SpecialRegs, MSP_SP, PSP_SP + outData: - +*/ +#if defined(MSP430_UIF) || defined(MSP_FET) +extern ARMConfigSettings armConfigSettings; +#endif + +short writeCpuRegsArm(unsigned long data, unsigned long Rx) +{ + unsigned char retry = MAX_RETRY; + unsigned long returnVal = 0; + IHIL_Write_Read_Mem_Ap(0, DCRDR, &data, WRITE); // Write value + data = Rx | REG_WnR; + IHIL_Write_Read_Mem_Ap(0, DCRSR, &data, WRITE); // Request Write + + // check if wirte was sucessfully + do + { + IHIL_Write_Read_Mem_Ap(0, DHCSR, &returnVal, READ); + } while(--retry && !(returnVal & S_REGRDY)); + + if(!retry) + { + return 0; + } + return 1; +} + +HAL_FUNCTION(_hal_WriteAllCpuRegsArm) +{ +#if defined(MSP430_UIF) || defined(MSP_FET) + unsigned long data = 0; + // Read the General Purpose registers. + for (unsigned long Rx = 0; Rx < 16; ++Rx) + { + STREAM_get_long(&data); + if(!writeCpuRegsArm(data, Rx)) + { + return HALERR_UNDEFINED_ERROR; + } + } + STREAM_get_long(&data); + if(!writeCpuRegsArm(data, xPSR_REG)) + { + return HALERR_UNDEFINED_ERROR; + } + + STREAM_get_long(&data); + if(!writeCpuRegsArm(data, spec_REG)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_get_long(&data); + if(!writeCpuRegsArm(data, MSP_SP)) + { + return HALERR_UNDEFINED_ERROR; + } + STREAM_get_long(&data); + if(!writeCpuRegsArm(data, PSP_SP)) + { + return HALERR_UNDEFINED_ERROR; + } +#endif + return 0; +} \ No newline at end of file diff --git a/Bios/src/hal/macros/WriteAllCpuRegsXv2.c b/Bios/src/hal/macros/WriteAllCpuRegsXv2.c index e69fe41..df2740e 100644 --- a/Bios/src/hal/macros/WriteAllCpuRegsXv2.c +++ b/Bios/src/hal/macros/WriteAllCpuRegsXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -59,9 +59,6 @@ HAL_FUNCTION(_hal_WriteAllCpuRegsXv2) { - DIAG_SUPPRESS(Pe550) - decl_out_long - DIAG_DEFAULT(Pe550) unsigned short Registers; unsigned long Rx; unsigned short Mova; diff --git a/Bios/src/hal/macros/WriteFramQuickXv2.c b/Bios/src/hal/macros/WriteFramQuickXv2.c index 2bc5203..8c47bc1 100644 --- a/Bios/src/hal/macros/WriteFramQuickXv2.c +++ b/Bios/src/hal/macros/WriteFramQuickXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -60,17 +60,15 @@ HAL_FUNCTION(_hal_WriteFramQuickXv2) { - + static unsigned long lLen; static unsigned long Addr = 0x0 ; - static unsigned short dataL; - static unsigned short dataH,Mova; - static unsigned short ret_len = 0; - - decl_out + static unsigned short Mova; + static unsigned short ret_len = 0; + static unsigned short id; short ret_value = 0; - //unsigned short BackupData = 0x0; - + unsigned short *pBuf; + unsigned short sizeOfBuf; // fist message-------------------------------------------- if(flags & MESSAGE_NEW_MSG) { @@ -81,57 +79,77 @@ HAL_FUNCTION(_hal_WriteFramQuickXv2) // get length ot be flashed if(STREAM_get_long(&lLen) != 0) { - return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); - } - // i_SetPcRel + return(HALERR_EXECUTE_FUNCLET_NO_LENGTH); + } + + id = cntrl_sig_capture(); + + // i_SetPcRel Mova = 0x0080; Mova += (unsigned short)((Addr>>8) & 0x00000F00); Addr = (unsigned short)((Addr & 0xFFFF)); - + SetPcXv2(Mova, Addr); - - cntrl_sig_16bit - SetReg_16Bits_(0x0500) - TCLKset1 - - data_quick + + cntrl_sig_16bit(); + SetReg_16Bits(0x0500); + IHIL_Tclk(1); + + data_quick(); + } + if(!(flags & MESSAGE_LAST_MSG )) + { + STREAM_out_change_type(RESPTYP_ACKNOWLEDGE); + STREAM_flush(); } + // not first and not last message - for(; lLen && (ret_value == 0); lLen--) + STREAM_get_buffer((void **)&pBuf,&sizeOfBuf); + for(; lLen && sizeOfBuf; lLen--) { - TCLKset1 - if (lLen%2) - { - ret_value = STREAM_get_word(&dataH); - SetReg_16Bits_(dataH); // write data to memory. - } - else - { - ret_value = STREAM_get_word(&dataL); - SetReg_16Bits_(dataL); // write data to memory. - } - TCLKset0 + IHIL_Tclk(1); + SetReg_16Bits(*pBuf++); + sizeOfBuf -= 2; + IHIL_Tclk(0); } - + // last message if(flags & MESSAGE_LAST_MSG ) { - cntrl_sig_16bit - SetReg_16Bits_(0x0501) + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + if(id == JTAGVERSION91 || id == JTAGVERSION99 || id == JTAGVERSION98) + { + SetPcXv2(0x80, SAFE_PC_ADDRESS); // Set PC to "safe" JMP $ address + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); + } + STREAM_put_word(ret_len); - TCLKset1 - } - else if(ret_value == 1) + } + else if(lLen != 0) { STREAM_out_change_type(RESPTYP_ACKNOWLEDGE); ret_value = 0; } else { - cntrl_sig_16bit - SetReg_16Bits_(0x0501) + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + if(id == JTAGVERSION91 || id == JTAGVERSION99 || id == JTAGVERSION98) + { + SetPcXv2(0x80, SAFE_PC_ADDRESS); // Set PC to "safe" JMP $ address + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + addr_capture(); + } + ret_value = HALERR_EXECUTE_FUNCLET_EXECUTION_ERROR; - TCLKset1 - } + } return(ret_value); } diff --git a/Bios/src/hal/macros/WriteMemBytes.c b/Bios/src/hal/macros/WriteMemBytes.c index 494b552..21ce4b8 100644 --- a/Bios/src/hal/macros/WriteMemBytes.c +++ b/Bios/src/hal/macros/WriteMemBytes.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -63,7 +63,7 @@ HAL_FUNCTION(_hal_WriteMemBytes) short ret_value = 0; unsigned char value; - + if(flags & MESSAGE_NEW_MSG) { if(STREAM_get_long(&lAddr) != 0) @@ -74,28 +74,28 @@ HAL_FUNCTION(_hal_WriteMemBytes) { return HALERR_WRITE_MEM_WORD_NO_RAM_SIZE; } - halt_cpu - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x2418) + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2418); } - + lLen *= 2; //DLL always sends size in word for(; lLen && (ret_value == 0); lLen--) { ret_value = STREAM_get_byte(&value); - addr_16bit - SetReg_16Bits_((unsigned short)lAddr) - data_to_addr - SetReg_8Bits_(value); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_16Bits((unsigned short)lAddr); + data_to_addr(); + SetReg_8Bits(value); + IHIL_Tclk(1); + IHIL_Tclk(0); lAddr += 1; } if(flags & MESSAGE_LAST_MSG) { - release_cpu + release_cpu(); } else if(ret_value == 1) { diff --git a/Bios/src/hal/macros/WriteMemBytesX.c b/Bios/src/hal/macros/WriteMemBytesX.c index 7483d00..d1fe6ee 100644 --- a/Bios/src/hal/macros/WriteMemBytesX.c +++ b/Bios/src/hal/macros/WriteMemBytesX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -54,7 +54,7 @@ HAL_FUNCTION(_hal_WriteMemBytesX) static unsigned long lAddr; short ret_value = 0; unsigned char tmp_uchar; - + if(flags & MESSAGE_NEW_MSG) { if(STREAM_get_long(&lAddr) != 0) @@ -65,28 +65,28 @@ HAL_FUNCTION(_hal_WriteMemBytesX) { return HALERR_WRITE_MEM_WORD_NO_RAM_SIZE; } - halt_cpu - TCLKset0 - cntrl_sig_low_byte - SetReg_16Bits_(0x18) + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_low_byte(); + SetReg_16Bits(0x18); } - + lLen *= 2; //DLL always sends size in word for(; lLen && (ret_value == 0); lLen--) { ret_value = STREAM_get_byte(&tmp_uchar); - addr_16bit - SetReg_20Bits_(lAddr) - data_to_addr - SetReg_8Bits_(tmp_uchar); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_20Bits(lAddr); + data_to_addr(); + SetReg_8Bits(tmp_uchar); + IHIL_Tclk(1); + IHIL_Tclk(0); lAddr += 1; } if(flags & MESSAGE_LAST_MSG) { - release_cpu + release_cpu(); } else if(ret_value == 1) { diff --git a/Bios/src/hal/macros/WriteMemBytesXv2.c b/Bios/src/hal/macros/WriteMemBytesXv2.c index 7035cd7..dd4556f 100644 --- a/Bios/src/hal/macros/WriteMemBytesXv2.c +++ b/Bios/src/hal/macros/WriteMemBytesXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -60,6 +60,6 @@ HAL_FUNCTION(_hal_WriteMemBytesXv2) { - //! \todo not supported for Xv2 + //! \not supported for Xv2 return HALERR_UNDEFINED_ERROR; } diff --git a/Bios/src/hal/macros/WriteMemWords.c b/Bios/src/hal/macros/WriteMemWords.c index 4637a0d..9e1efc9 100644 --- a/Bios/src/hal/macros/WriteMemWords.c +++ b/Bios/src/hal/macros/WriteMemWords.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 Write words (16bit values) to a memory mapped locationCONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -64,7 +64,7 @@ HAL_FUNCTION(_hal_WriteMemWords) short ret_value = 0; unsigned short tmp_uint; - + if(flags & MESSAGE_NEW_MSG) { if(STREAM_get_long(&lAddr) != 0) @@ -75,27 +75,27 @@ HAL_FUNCTION(_hal_WriteMemWords) { return HALERR_WRITE_MEM_WORD_NO_RAM_SIZE; } - halt_cpu - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x2408) + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2408); } - + for(; lLen && (ret_value == 0); lLen--) { ret_value = STREAM_get_word(&tmp_uint); - addr_16bit - SetReg_16Bits_((unsigned short)lAddr) - data_to_addr - SetReg_16Bits_(tmp_uint); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_16Bits((unsigned short)lAddr); + data_to_addr(); + SetReg_16Bits(tmp_uint); + IHIL_Tclk(1); + IHIL_Tclk(0); lAddr += 2; } if(flags & MESSAGE_LAST_MSG) { - release_cpu + release_cpu(); } else if(ret_value == 1) { diff --git a/Bios/src/hal/macros/WriteMemWordsX.c b/Bios/src/hal/macros/WriteMemWordsX.c index 3c9deb7..fd8051e 100644 --- a/Bios/src/hal/macros/WriteMemWordsX.c +++ b/Bios/src/hal/macros/WriteMemWordsX.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -51,7 +51,7 @@ HAL_FUNCTION(_hal_WriteMemWordsX) static unsigned long lAddr; short ret_value = 0; unsigned short tmp_uint; - + if(flags & MESSAGE_NEW_MSG) { if(STREAM_get_long(&lAddr) != 0) @@ -62,27 +62,27 @@ HAL_FUNCTION(_hal_WriteMemWordsX) { return HALERR_WRITE_MEM_WORD_NO_RAM_SIZE; } - halt_cpu - TCLKset0 - cntrl_sig_low_byte - SetReg_16Bits_(0x08) + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_low_byte(); + SetReg_16Bits(0x08); } - + for(; lLen && (ret_value == 0); lLen--) { ret_value = STREAM_get_word(&tmp_uint); - addr_16bit - SetReg_20Bits_(lAddr) - data_to_addr - SetReg_16Bits_(tmp_uint); - TCLKset1 - TCLKset0 + addr_16bit(); + SetReg_20Bits(lAddr); + data_to_addr(); + SetReg_16Bits(tmp_uint); + IHIL_Tclk(1); + IHIL_Tclk(0); lAddr += 2; } if(flags & MESSAGE_LAST_MSG) { - release_cpu + release_cpu(); } else if(ret_value == 1) { diff --git a/Bios/src/hal/macros/WriteMemWordsXv2.c b/Bios/src/hal/macros/WriteMemWordsXv2.c index e39d3b0..2a6fd27 100644 --- a/Bios/src/hal/macros/WriteMemWordsXv2.c +++ b/Bios/src/hal/macros/WriteMemWordsXv2.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -59,9 +59,11 @@ HAL_FUNCTION(_hal_WriteMemWordsXv2) { static unsigned long lAddr; static unsigned long lLen; - unsigned short tmp_uint; + unsigned short *pBuf; + unsigned short sizeOfBuf; int ret_value = 0; + if(flags & MESSAGE_NEW_MSG) { if(STREAM_get_long(&lAddr) != 0) @@ -73,27 +75,30 @@ HAL_FUNCTION(_hal_WriteMemWordsXv2) return HALERR_WRITE_MEM_WORD_XV2_NO_RAM_SIZE; } } - - for(; lLen && (ret_value == 0); lLen--) + + STREAM_out_change_type(RESPTYP_ACKNOWLEDGE); + STREAM_flush(); + + STREAM_get_buffer((void **)&pBuf,&sizeOfBuf); + for(; lLen && sizeOfBuf; lLen--) { //! \todo check correct loop cycle with design for performance optimization - ret_value = STREAM_get_word(&tmp_uint); - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x0500) - addr_16bit - SetReg_20Bits_(lAddr) - TCLKset1 - data_to_addr - SetReg_16Bits_(tmp_uint); - TCLKset0 - cntrl_sig_16bit - SetReg_16Bits_(0x0501) - TCLKset1 + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x0500); + addr_16bit(); + SetReg_20Bits(lAddr); + IHIL_Tclk(1); + data_to_addr(); + SetReg_16Bits(*pBuf++); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); // one or more cycle, so CPU is driving correct MAB - TCLK + IHIL_TCLK(); lAddr += 2; + sizeOfBuf -= 2; } return(ret_value); } - diff --git a/Bios/src/hil/edt.c b/Bios/src/hil/edt.c new file mode 100644 index 0000000..3121e68 --- /dev/null +++ b/Bios/src/hil/edt.c @@ -0,0 +1,174 @@ +/** +* \ingroup MODULHAL +* +* \file edt.c +* +* \brief +* +*/ +/* + * Copyright (C) 2012 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. + */ + +#include "edt.h" + +unsigned long i_ReadJmbOut() +{ + unsigned short sJMBOUT0 = 0, sJMBOUT1 = 0, sJMBINCTL = 0; + jmb_exchange(); + if(SetReg_16Bits(sJMBINCTL) & OUT1RDY) + { + sJMBINCTL |= JMB32B + OUTREQ; + SetReg_16Bits(sJMBINCTL); + sJMBOUT0 = SetReg_16Bits(0); + sJMBOUT1 = SetReg_16Bits(0); + return ((unsigned long)sJMBOUT1<<16) + sJMBOUT0; + } + return 0; +} + +unsigned short i_ReadJmbOut16() +{ + unsigned short sJMBINCTL = 0; + jmb_exchange(); + if(SetReg_16Bits(sJMBINCTL) & OUT0RDY) + { + sJMBINCTL |= OUTREQ; + SetReg_16Bits(sJMBINCTL); + return SetReg_16Bits(0); + } + return 0; +} + +short i_WriteJmbIn(unsigned short data) +{ + volatile unsigned short sJMBINCTL = INREQ, sJMBIN0 = (unsigned short)(data & 0x0000FFFF); + volatile unsigned short lOut = 0; + volatile unsigned long Timeout = 0; + + jmb_exchange(); + do + { + lOut = SetReg_16Bits(0x0000); + if(Timeout++ >= 3000) + { + return 1; + } + } + while(!(lOut & IN0RDY) && Timeout < 3000); + + if(Timeout < 3000) + { + SetReg_16Bits(sJMBINCTL); + SetReg_16Bits(sJMBIN0); + } + return 0; +} + +short i_WriteJmbIn32(unsigned short dataA, unsigned short dataB) +{ + volatile unsigned short sJMBINCTL = JMB32B | INREQ; + volatile unsigned short sJMBIN0 = 0 ,sJMBIN1 = 0, lOut = 0; + volatile unsigned long Timeout = 0; + + sJMBIN0 = (unsigned short)(dataA & 0x0000FFFF); + sJMBIN1 = (unsigned short)(dataB & 0x0000FFFF); + + jmb_exchange(); + do + { + lOut = SetReg_16Bits(0x0000); + if(Timeout++ >= 3000) + { + return 1; + } + } + while(!(lOut & IN1RDY) && Timeout < 3000); + if(Timeout < 3000) + { + sJMBINCTL = 0x11; + SetReg_16Bits(sJMBINCTL); + SetReg_16Bits(sJMBIN0); + SetReg_16Bits(sJMBIN1); + } + return 0; +} + +short checkWakeup() +{ + unsigned long UNLOCK_ADDRESS = 0xE0044000; + unsigned long SYS_SYSTEM_STAT = 0xE0044020; + unsigned long PWD = 0x695A; + unsigned short DBG_SEC_ACT_MASK = 0x8; + + unsigned long val = 0; + unsigned short timeout = 100; + + //unlock Sys master + IHIL_Write_Read_Mem_Ap(0, UNLOCK_ADDRESS, &PWD, WRITE); + + do + { + IHIL_Write_Read_Mem_Ap(0, SYS_SYSTEM_STAT, &val, READ); + timeout--; + }while((val & DBG_SEC_ACT_MASK) && --timeout); + + if(!timeout) + { + return -1; + } + return 0; +} + +short powerUpArm() +{ + unsigned long val = 0; + unsigned short timeout = 200; + + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, READ); + // Request system and debug power up + val |= DP_CTRL_STAT_CSYSPWRUPREQ | DP_CTRL_STAT_CDBGPWRUPREQ; + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, WRITE); + // Wait for acknowledge + do + { + IHIL_Write_Read_Dp(DP_CTRL_STAT, &val, READ); + timeout--; + } while(((val & (DP_CTRL_STAT_CSYSPWRUPACK | DP_CTRL_STAT_CDBGPWRUPACK)) != + (DP_CTRL_STAT_CSYSPWRUPACK | DP_CTRL_STAT_CDBGPWRUPACK)) && timeout); + + if(!timeout) + { + return -1; + } + return 0; +} diff --git a/Bios/src/hil/edt.h b/Bios/src/hil/edt.h index 464ec05..886040d 100644 --- a/Bios/src/hil/edt.h +++ b/Bios/src/hil/edt.h @@ -7,835 +7,269 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** - @page edt Enhanced Device Test layer (EDT) - The EDT layer is sort of abstraction of the target devices' JTAG interface. - Beside some initialization and configuration functions it provides both - high level functions to access the JTAG Instruction/Data registers plus - a set of low level symbols to manipulate individual signals of the JTAG - interface. The EDT layer is described in detail via @ref edt.h. - - Proceed to the @ref hal. -*/ - -/** - @file edt.h - @brief Enhanced Device Test layer (EDT) - - This file defines and exports all the objects and symbols required to use - the Enhanced Device Test layer (EDT). - - All access to EDT high level functions and low level symbols is realized - through function/variable pointers. This enables straight forward update - strategies as none of the resources are accessed via absolute addresses. - Refer to @ref update for more details on this topic. -*/ #ifndef _EDT_H_ #define _EDT_H_ #include "JTAG_defs.h" +#include "hil_Structs.h" +#include "hal.h" -/** - @brief Structure of pointers to all exported EDT functions. -*/ -struct edt_common_methods { - short (*Init)(void); - short (*SetVcc)(unsigned short); - short (*GetVcc)(unsigned short*, unsigned short*); - short (*SetProtocol)(unsigned short); - void (*SetPsaSetup)(unsigned short); - void (*SetPsaTCLK)(unsigned short); - short (*Open)(unsigned char state); - short (*Close)(void); - void (*Delay_1us)(unsigned short); - void (*Delay_1ms)(unsigned short); - short (*Loop)(unsigned short); - void (*EntrySequences)(unsigned char); - - void (*SetJtagBits)(unsigned char); // Set discreet JTAG bits according to the input - unsigned char (*GetJtagBits)(void); // Read the current output of the JTAG port - - void (*SetTgtCtrlBits)(unsigned char);// Set discreet Target Control bits according to the input - unsigned char (*GetTgtCtrlBits)(void);// Read the current output of the TargetControl port - - void (*SetTestBits)(unsigned char); // Set discreet Test Control bits according to the input - unsigned char (*GetTestBits)(void); // Read the current output of the Test Control port - - void (*SetReset)(unsigned char); // Set the Reset pin to the specified value - void (*SetTest)(unsigned char); // Set the Test pin to the specified value - void (*SetJtagSpeed)(unsigned short); -}; -typedef struct edt_common_methods edt_common_methods_t; - -struct edt_distinct_methods -{ - short (*TapReset)(void); - short (*CheckJtagFuse)(void); - unsigned short (*EnumChain)(void); - unsigned char (*Instr)(unsigned char); - unsigned char (*SetReg_XBits08)(unsigned char); - unsigned short (*SetReg_XBits16)(unsigned short); - unsigned long (*SetReg_XBits20)(unsigned long); - unsigned long (*SetReg_XBits32)(unsigned long); - unsigned long long (*SetReg_XBits64)(unsigned long long); - void (*Tclk)(unsigned char); - void (*SetupPsa)(unsigned long); - void (*StepPsa)(unsigned long); - void (*EndPsa)(void); - short (*BlowFuse)(unsigned char); // Blow the JTAG acces fuse -}; -typedef struct edt_distinct_methods edt_distinct_methods_t; +typedef void (*HilInitFunc)(); +typedef void (*HilInitGetEdtCommenFunc)(edt_common_methods_t* edt_commen); +typedef void (*HilInitGetEdtDistinctFunc)(edt_distinct_methods_t* edt_distinct); -/** - @brief Constant structure holding all EDT function pointers. +extern edt_common_methods_t _edt_Common_Methods; +extern edt_distinct_methods_t _edt_Distinct_Methods; - One constant structure of type \a edt_common_methods. It holds all EDT - function pointers that are independant from the low level JTAG communication - protocol (4-wire JTAG or Spy-Bi-Wire). - Another variable structure of type \a edt_distinct_methods. It holds all EDT - function pointers that are remapped depending on the low level JTAG prtocol - selection (4-wire JTAG or Spy-Bi-Wire). +extern unsigned short altRomAddressForCpuRead; +extern unsigned short wdtctlAddress5xx; +extern DevicePowerSettings devicePowerSettings; - @warning It is not recommended to use symbols of this structure in other - modules direclty! Use the hash define symbols instead. -*/ -extern const edt_common_methods_t _edt_Common_Methods; -extern edt_distinct_methods_t _edt_Distinct_Methods; -extern unsigned short setPCclockBeforeCapture; - -#define EDT_Init (*_edt_Common_Methods.Init) -#define EDT_SetJtagSpeed (*_edt_Common_Methods.SetJtagSpeed) -#define EDT_SetVcc (*_edt_Common_Methods.SetVcc) -#define EDT_GetVcc (*_edt_Common_Methods.GetVcc) -#define EDT_SetProtocol (*_edt_Common_Methods.SetProtocol) -#define EDT_SetPsaSetup (*_edt_Common_Methods.SetPsaSetup) -#define EDT_SetPsaTCLK (*_edt_Common_Methods.SetPsaTCLK) -#define EDT_Open (*_edt_Common_Methods.Open) -#define EDT_Close (*_edt_Common_Methods.Close) -#define EDT_Delay_1us (*_edt_Common_Methods.Delay_1us) -#define EDT_Delay_1ms (*_edt_Common_Methods.Delay_1ms) -#define EDT_Loop (*_edt_Common_Methods.Loop) -#define EDT_EntrySequences (*_edt_Common_Methods.EntrySequences) -#define EDT_SetJtagBits (*_edt_Common_Methods.SetJtagBits) -#define EDT_GetJtagBits (*_edt_Common_Methods.GetJtagBits) -#define EDT_SetTgtCtrlBits (*_edt_Common_Methods.SetTgtCtrlBits) -#define EDT_GetTgtCtrlBits (*_edt_Common_Methods.GetTgtCtrlBits) -#define EDT_SetTestBits (*_edt_Common_Methods.SetTestBits) -#define EDT_GetTestBits (*_edt_Common_Methods.GetTestBits) - -#define EDT_SetReset (*_edt_Common_Methods.SetReset) -#define EDT_SetTest (*_edt_Common_Methods.SetTest) - -#define EDT_TapReset (*_edt_Distinct_Methods.TapReset) -#define EDT_CheckJtagFuse (*_edt_Distinct_Methods.CheckJtagFuse) -#define EDT_EnumChain (*_edt_Distinct_Methods.EnumChain) -#define EDT_Instr (*_edt_Distinct_Methods.Instr) -#define EDT_SetReg_XBits (*_edt_Distinct_Methods.SetReg_XBits) -#define EDT_SetReg_XBits08 (*_edt_Distinct_Methods.SetReg_XBits08) -#define EDT_SetReg_XBits16 (*_edt_Distinct_Methods.SetReg_XBits16) -#define EDT_SetReg_XBits20 (*_edt_Distinct_Methods.SetReg_XBits20) -#define EDT_SetReg_XBits32 (*_edt_Distinct_Methods.SetReg_XBits32) -#define EDT_SetReg_XBits64 (*_edt_Distinct_Methods.SetReg_XBits64) -#define EDT_Tclk (*_edt_Distinct_Methods.Tclk) -#define EDT_SetupPsa (*_edt_Distinct_Methods.SetupPsa) -#define EDT_StepPsa (*_edt_Distinct_Methods.StepPsa) -#define EDT_EndPsa (*_edt_Distinct_Methods.EndPsa) -#define EDT_BlowFuse (*_edt_Distinct_Methods.BlowFuse) - -// further definitions and macros - -#define decl_io short lIn; short lOut; -#define decl_in short lIn; -#define decl_out short lOut = 0; -#define decl_out_long unsigned long lOut_long = 0; -#define decl_out_long_long unsigned long long lOut_long_long = 0; -#define decl_state short lPass = 0; short lFail = 0; -#define decl_pass short lPass = 0; -#define decl_fail short lFail = 0; -#define decl_isInstrLoad short lIsInstrLoad = -1; -#define decl_instrLoad short lInstrLoad = -1; -#define decl_jtagMailboxIn short jtagMailboxIn = -1; -#define decl_jtagMailboxOut short jtagMailboxOu = -1; +// Hil common methods +#pragma inline=forced +short IHIL_Init(void) { return _edt_Common_Methods.Init();} + +#pragma inline=forced +short IHIL_SetVcc(unsigned short vcc){ return _edt_Common_Methods.SetVcc(vcc); } + +#pragma inline=forced +void IHIL_SwitchVccFET(unsigned short switchVccFET){ _edt_Common_Methods.SwitchVccFET(switchVccFET);} + +#pragma inline=forced +short IHIL_GetVcc(double* Vcc, double* ExtVcc){ return _edt_Common_Methods.GetVcc(Vcc, ExtVcc);} + +#pragma inline=forced +short IHIL_SetProtocol(unsigned short protocol_id){ return _edt_Common_Methods.SetProtocol(protocol_id);} + +#pragma inline=forced +void IHIL_SetPsaTCLK(unsigned short tclkValue){_edt_Common_Methods.SetPsaTCLK(tclkValue);} + +#pragma inline=forced +short IHIL_Open(unsigned char state){ return _edt_Common_Methods.Open(state);} + +#pragma inline=forced +short IHIL_Close(void){return _edt_Common_Methods.Close();} + +#pragma inline=forced +void IHIL_Delay_1us(unsigned short usecs){_edt_Common_Methods.Delay_1us(usecs);} + +#pragma inline=forced +void IHIL_Delay_1ms(unsigned short msecs){_edt_Common_Methods.Delay_1ms(msecs);} + +#pragma inline=forced +short IHIL_IccMonitor_Process(unsigned short flags){ return _edt_Common_Methods.Loop(flags);} + +#pragma inline=forced +void IHIL_EntrySequences(unsigned char states){_edt_Common_Methods.EntrySequences(states);} + +#pragma inline=forced +void IHIL_BSL_EntrySequence(unsigned short switchBypassOff){_edt_Common_Methods.BSL_EntrySequence(switchBypassOff);} + +#pragma inline=forced +void IHIL_BSL_EntrySequence1xx_4xx(){ _edt_Common_Methods.BSL_EntrySequence1xx_4xx();} + +#pragma inline=forced +void IHIL_SetReset(unsigned char value){_edt_Common_Methods.SetReset(value);} + +#pragma inline=forced +void IHIL_SetTest(unsigned char value){_edt_Common_Methods.SetTest(value);} + +#pragma inline=forced +void IHIL_SetTMS(unsigned char value){_edt_Common_Methods.SetTMS(value);} + +#pragma inline=forced +void IHIL_SetTCK(unsigned char value){_edt_Common_Methods.SetTCK(value);} + +#pragma inline=forced +void IHIL_SetTDI(unsigned char value){_edt_Common_Methods.SetTDI(value);} + +#pragma inline=forced +void IHIL_InitDelayTimer(void){_edt_Common_Methods.initDelayTimer();} + +#pragma inline=forced +void IHIL_SetJtagSpeed(unsigned short jtagSpeed, unsigned short sbwSpeed){_edt_Common_Methods.SetJtagSpeed(jtagSpeed,sbwSpeed);} + +#pragma inline=forced +void IHIL_ConfigureSetPc(unsigned short PCclockBeforeCapture){_edt_Common_Methods.ConfigureSetPc(PCclockBeforeCapture);} +// Hil distinct methods +#pragma inline=forced +short IHIL_TapReset(void){return _edt_Distinct_Methods.TapReset();} + +#pragma inline=forced +short IHIL_CheckJtagFuse(void){return _edt_Distinct_Methods.CheckJtagFuse();} + +#pragma inline=forced +void IHIL_Tclk(unsigned char tclk){_edt_Distinct_Methods.Tclk(tclk);} + +#pragma inline=forced +char IHIL_Instr4(unsigned char ir){return _edt_Distinct_Methods.Instr04(ir);} + +#pragma inline=forced +void IHIL_StepPsa(unsigned long length){_edt_Distinct_Methods.StepPsa(length);} + +#pragma inline=forced +short IHIL_BlowFuse(unsigned char targetHasTestVpp){return _edt_Distinct_Methods.BlowFuse(targetHasTestVpp);} + +#pragma inline=forced +unsigned char IHIL_GetPrevInstruction(){ return _edt_Distinct_Methods.GetPrevInstruction();} + +#pragma inline=forced +void IHIL_TCLK(void){IHIL_Tclk(0); IHIL_Tclk(1);} + +#pragma inline=forced +unsigned long long SetReg_XBits(unsigned long long *Data, unsigned short count){return _edt_Distinct_Methods.SetReg_XBits(Data,count);} + +#pragma inline=forced +unsigned long long SetReg_35Bits(unsigned long long *Data){return _edt_Distinct_Methods.SetReg_XBits35(Data);} + +#pragma inline=forced +unsigned char SetReg_8Bits(unsigned char data){return _edt_Distinct_Methods.SetReg_XBits08(data);} + +#pragma inline=forced +unsigned short SetReg_16Bits(unsigned short data){return _edt_Distinct_Methods.SetReg_XBits16(data);} + +#pragma inline=forced +unsigned long SetReg_20Bits(unsigned long data) {return _edt_Distinct_Methods.SetReg_XBits20(data);} + +#pragma inline=forced +unsigned long SetReg_32Bits(unsigned long data){return _edt_Distinct_Methods.SetReg_XBits32(data);} + +#pragma inline=forced +unsigned long long SetReg_64Bits(unsigned long long data){return _edt_Distinct_Methods.SetReg_XBits64(data);} + +//ARM interface functions +#pragma inline=forced +short IHIL_Write_Read_Dp(unsigned char address, unsigned long *data, unsigned short rnw) + {return _edt_Distinct_Methods.write_read_Dp(address,data, rnw);} +#pragma inline=forced +short IHIL_Write_Read_Ap(unsigned long address, unsigned long *data, unsigned short rnw) + {return _edt_Distinct_Methods.write_read_Ap(address, data, rnw);} +#pragma inline=forced +short IHIL_Write_Read_Mem_Ap(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw) +{ return _edt_Distinct_Methods.write_read_mem_Ap(ap_sel, address, data, rnw);} +#pragma inline=forced +unsigned char IHIL_SwdTransferData(unsigned char regiser, unsigned long* data, unsigned char rnw) +{ return _edt_Distinct_Methods.SwdTransferData(regiser, data, rnw);} + +#pragma inline=forced +unsigned long long SetReg8_64Bits(unsigned long long data, unsigned short loopCount, unsigned short PG) + {return _edt_Distinct_Methods.SetReg_XBits8_64(data, loopCount, PG);} // JTAG instruction register access -#define bypass { lOut = EDT_Instr(0xFF); } -#define cntrl_sig_high_byte { EDT_Instr(IR_CNTRL_SIG_HIGH_BYTE); } -#define cntrl_sig_low_byte { EDT_Instr(IR_CNTRL_SIG_LOW_BYTE); } -#define cntrl_sig_capture { lOut = EDT_Instr(IR_CNTRL_SIG_CAPTURE); } -#define cntrl_sig_16bit { EDT_Instr(IR_CNTRL_SIG_16BIT); } -#define cntrl_sig_release { EDT_Instr(IR_CNTRL_SIG_RELEASE); } -#define addr_16bit { EDT_Instr(IR_ADDR_16BIT); } -#define addr_capture { EDT_Instr(IR_ADDR_CAPTURE); } -#define data_16bit { EDT_Instr(IR_DATA_16BIT); } -#define data_capture { EDT_Instr(IR_DATA_CAPTURE); } -#define data_to_addr { EDT_Instr(IR_DATA_TO_ADDR); } -#define data_quick { EDT_Instr(IR_DATA_QUICK); } -#define config_fuses { EDT_Instr(IR_CONFIG_FUSES); } -#define eem_data_exchange { EDT_Instr(IR_EMEX_DATA_EXCHANGE); } -#define eem_data_exchange32 { EDT_Instr(IR_EMEX_DATA_EXCHANGE32); } -#define eem_read_control { EDT_Instr(IR_EMEX_READ_CONTROL); } -#define eem_write_control { EDT_Instr(IR_EMEX_WRITE_CONTROL); } -#define eem_data_exchange32 { EDT_Instr(IR_EMEX_DATA_EXCHANGE32); } -#define eem_read_trigger { EDT_Instr(IR_EMEX_READ_TRIGGER); } -#define data_psa { EDT_Instr(IR_DATA_PSA); } -#define shift_out_psa { EDT_Instr(IR_SHIFT_OUT_PSA); } -#define flash_16bit_update { EDT_Instr(IR_FLASH_16BIT_UPDATE); } -#define tclk_0_inst { EDT_Instr(0x3A); }//3A -#define tclk_1_inst { EDT_Instr(0x3B); }//3B -#define tclk_toggle_inst { EDT_Instr(0x39); }//39 -#define jmb_exchange { EDT_Instr(IR_JMB_EXCHANGE); } -#define device_ip_pointer { EDT_Instr(IR_DEVICE_ID);} -#define core_ip_pointer { EDT_Instr(IR_COREIP_ID);} -#define jstate_read { EDT_Instr(IR_JSTATE_ID);} -#define test_reg { EDT_Instr(IR_TEST_REG);} -#define test_reg_3V { EDT_Instr(IR_TEST_3V_REG);} - - -// JTAG data register access -#define SetReg_8Bits(x) { lOut = (short)EDT_SetReg_XBits08(x); } -#define SetReg_8Bits_(x) { EDT_SetReg_XBits08(x); } -#define SetReg_16Bits(x) { lOut = (short)EDT_SetReg_XBits16(x); } -#define SetReg_16Bits_(x) { EDT_SetReg_XBits16(x); } -#define SetReg_20Bits(x) { lOut_long = EDT_SetReg_XBits20(x); } -#define SetReg_20Bits_(x) { EDT_SetReg_XBits20(x); } -#define SetReg_32Bits(x) { lOut_long = EDT_SetReg_XBits32(x); } -#define SetReg_32Bits_(x) { EDT_SetReg_XBits32(x); } -#define SetReg_64Bits(x) { lOut_long_long = EDT_SetReg_XBits64(x); } -#define SetReg_64Bits_(x) { EDT_SetReg_XBits64(x); } - - -// JTAG macros (used for code inlining) -#define isInstrLoad { cntrl_sig_capture \ - lIsInstrLoad = 0; \ - SetReg_16Bits(0); \ - if((lOut & (CNTRL_SIG_INSTRLOAD | CNTRL_SIG_READ)) != \ - (CNTRL_SIG_INSTRLOAD | CNTRL_SIG_READ)) \ - { \ - lIsInstrLoad = -1; \ - } } - -#define instrLoad { unsigned short i; \ - decl_isInstrLoad \ - lInstrLoad = 0; \ - cntrl_sig_low_byte \ - SetReg_8Bits_(CNTRL_SIG_READ) \ - TCLKset1 \ - for(i = 0; i < 10; i++) \ - { \ - isInstrLoad \ - if(lIsInstrLoad == 0) \ - { \ - break; \ - } \ - TCLK \ - } \ - if(i == 10) \ - { \ - --lInstrLoad; \ - } } - -#define halt_cpu { data_16bit \ - SetReg_16Bits_(0x3FFF) \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x2409) \ - TCLKset1 } - -#define release_cpu { TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x2401) \ - addr_capture \ - TCLKset1 } -#define ReadMemWord(a,d) { halt_cpu \ - TCLKset0 \ - addr_16bit \ - SetReg_16Bits(a) \ - data_to_addr \ - TCLKset1 \ - TCLKset0 \ - SetReg_16Bits(0) \ - d = lOut; \ - release_cpu } - -#define ReadMemWordX(a,d) { halt_cpu \ - TCLKset0 \ - addr_16bit \ - SetReg_20Bits(a) \ - data_to_addr \ - TCLKset1 \ - TCLKset0 \ - SetReg_16Bits(0) \ - d = lOut; \ - release_cpu } - -#define ReadMemWordXv2(a,d){decl_out \ - TCLKset0 \ - addr_16bit \ - SetReg_20Bits(a) \ - TCLKset1 \ - TCLKset0 \ - data_capture \ - SetReg_16Bits(0); \ - d = lOut; \ - TCLKset1 \ - TCLKset0 \ - TCLKset1 } - -#define WriteMemWord(a,v) { halt_cpu \ - TCLKset0 \ - cntrl_sig_low_byte \ - SetReg_8Bits_(0x08) \ - addr_16bit \ - SetReg_16Bits_(a) \ - data_to_addr \ - SetReg_16Bits_(v) \ - TCLKset1 \ - release_cpu } - -#define WriteMemWordX(a,v) {halt_cpu \ - TCLKset0 \ - cntrl_sig_low_byte \ - SetReg_8Bits_(0x08) \ - addr_16bit \ - SetReg_20Bits_(a) \ - data_to_addr \ - SetReg_16Bits_(v) \ - TCLKset1 \ - release_cpu } - -#define WriteMemWordXv2(a,v){TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x0500) \ - addr_16bit \ - SetReg_20Bits_(a) \ - TCLKset1 \ - data_to_addr \ - SetReg_16Bits_(v) \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x0501) \ - TCLKset1 \ - TCLKset0 \ - TCLKset1 } - -#define WriteMemByte(a,v){halt_cpu \ - TCLKset0 \ - addr_16bit \ - SetReg_16Bits_(a) \ - data_to_addr \ - SetReg_8Bits_(v) \ - TCLKset1 \ - TCLKset0 \ - release_cpu } - - -#define ReadCpuReg(n,d) { short op; \ - cntrl_sig_16bit \ - SetReg_16Bits(0x3401) \ - data_16bit \ - op = ((n << 8) & 0x0F00) | 0x4082; \ - SetReg_16Bits(op) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - SetReg_16Bits(0x00fe) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits(0) \ - d = lOut; \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits(0x2401) \ - TCLKset1 } - - -#define ReadCpuReg_uShort(n,d) { short op; \ - cntrl_sig_16bit \ - SetReg_16Bits(0x3401) \ - data_16bit \ - op = ((n << 8) & 0x0F00) | 0x4082; \ - SetReg_16Bits(op) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - SetReg_16Bits(0x00fe) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits(0) \ - d = (unsigned short)lOut; \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits(0x2401) \ - TCLKset1 } - -#define ReadCpuRegX(n,d) { short op; \ - unsigned short Rx_l; \ - unsigned short Rx_h; \ - cntrl_sig_high_byte \ - SetReg_16Bits(0x34) \ - op = ((n << 8) & 0x0F00) | 0x60; \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits(op) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits(0x00fc) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - SetReg_16Bits(0) \ - Rx_l = lOut; \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits(0) \ - Rx_h = lOut; \ - TCLKset0 \ - cntrl_sig_high_byte \ - SetReg_8Bits(0x24) \ - TCLKset1 \ - d = ((unsigned long)Rx_h<<16) + Rx_l; } - - -#define ReadCpuRegXv2(n,d){ unsigned short Rx_l; \ - unsigned short Rx_h; \ - TCLKset0 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits(n) \ - cntrl_sig_16bit \ - SetReg_16Bits(0x1401) \ - data_16bit \ - TCLK \ - if (altRomAddressForCpuRead)\ - { \ - SetReg_16Bits(0x0ff6) \ - } \ - else \ - { \ - SetReg_16Bits(0x018c) \ - } \ - TCLK \ - SetReg_16Bits(0x3ffd) \ - TCLKset0 \ - if (altRomAddressForCpuRead)\ - { \ - cntrl_sig_16bit \ - SetReg_16Bits(0x0501) \ - } \ - data_capture \ - TCLKset1 \ - SetReg_16Bits(0) \ - Rx_l = lOut; \ - TCLK \ - SetReg_16Bits(0) \ - Rx_h = lOut; \ - TCLK \ - TCLK \ - TCLK \ - if (!altRomAddressForCpuRead)\ - { \ - cntrl_sig_16bit \ - SetReg_16Bits(0x0501) \ - } \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - d = ((unsigned long)Rx_h<<16) + Rx_l; } - - -#define WriteCpuReg(n,s) { short op; \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x3401) \ - data_16bit \ - op = (0x4030 | n); \ - SetReg_16Bits_(op) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - SetReg_16Bits_(s) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - SetReg_16Bits_(0x3ffd) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x2401) \ - TCLKset1 } - -#define WriteCpuRegX(n,s) { short op = 0x0080 | n | ((s>>8) & 0x0F00); \ - cntrl_sig_high_byte \ - SetReg_8Bits_(0x34) \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(op) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(s&0xFFFF)\ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(0x3ffd) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - TCLKset0 \ - cntrl_sig_high_byte \ - SetReg_8Bits_(0x24) \ - TCLKset1 } - -/* !BUGFIX BTT1722 removed -#define WriteCpuRegXv2(n,s){TCLKset0 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(n) \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x1401) \ - data_16bit \ - TCLK \ - SetReg_16Bits_(s) \ - TCLK \ - SetReg_16Bits_(0x3ffd) \ - TCLK \ - TCLKset0 \ - addr_capture \ - SetReg_20Bits(0x00000) \ - TCLKset1 \ - TCLK \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x0501) \ - TCLKset0 \ - data_capture \ - TCLKset1 } -// !BUGFIX BTT1722 removed */ -// BUGFIX BTT1722 added -#define WriteCpuRegXv2(n,s){TCLKset0 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(n) \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x1401) \ - data_16bit \ - TCLK \ - SetReg_16Bits_(s) \ - TCLK \ - SetReg_16Bits_(0x3ffd) \ - TCLK \ - TCLKset0 \ - addr_capture \ - SetReg_20Bits(0x00000) \ - TCLKset1 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x0501) \ - TCLK \ - TCLKset0 \ - data_capture \ - TCLKset1 } -// !BUGFIX BTT1722 - - -#define isInstrFetch { cntrl_sig_capture \ - SetReg_16Bits(0) \ - if(lOut & 0x0080) \ - { \ - lPass++; \ - } \ - else \ - { \ - lFail++; \ - } \ - } - -// cycle(MOV_IMM_PC); // MOV #, PC 4030 -// cycle((WORD)pc); -// if (cycleEnd() != STATUS_OK) -/* cntrlSigHighByte(CNTRL_SIG_TCE1 | CNTRL_SIG_CPU); // Enable CPU control. - - HIL_JTAG_IR_(IR_DATA_16BIT); - HIL_TCLK(1); // added for 2xx support - HIL_JTAG_DR16(data); - HIL_TCLK(0); - HIL_JTAG_IR_(IR_DATA_CAPTURE); - HIL_TCLK(1); */ -/* -#define SetPc(x) { cntrl_sig_16bit \ - SetReg_16Bits_(0x3401) \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(0x4030) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits_(x) \ - TCLKset0 \ - data_capture \ - TCLKset1 \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x2401) \ - TCLKset1 \ - } +#pragma inline=forced +short cntrl_sig_low_byte() { return _edt_Distinct_Methods.Instr(IR_CNTRL_SIG_LOW_BYTE); } -*/ -#define SetPc(x) { cntrl_sig_16bit \ - SetReg_16Bits_(0x3401) \ - data_16bit \ - SetReg_16Bits_(0x4030) \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits_(x) \ - if (setPCclockBeforeCapture) {TCLK} \ - TCLKset0 \ - addr_capture \ - if (!setPCclockBeforeCapture) {TCLKset1} \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x2401) \ - TCLKset1 \ - } -/* -#define SetPc(x) { cntrl_sig_16bit \ - SetReg_16Bits_(0x3401) \ - data_16bit \ - SetReg_16Bits_(0x4030) \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits_(x) \ - TCLKset0 \ - addr_capture \ - TCLKset1 \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits_(0x2401) \ - TCLKset1 \ - } -*/ -#define SetPcJtagBug(x) { \ - data_16bit \ - SetReg_16Bits_(0x4030) \ - TCLKset1 \ - TCLKset0 \ - SetReg_16Bits_(x) \ - TCLKset1 \ - TCLKset0 \ - TCLKset1 \ - TCLKset0 \ - } - -#define SetPcX(x) { unsigned short pc_high = (unsigned short)(0x80 | (((x)>>8) & 0x0F00));\ - unsigned short pc_low = (unsigned short)((x) & 0xFFFF); \ - cntrl_sig_high_byte \ - SetReg_8Bits_(0x34) \ - data_16bit \ - SetReg_16Bits_(pc_high)\ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits_(pc_low) \ - TCLKset0 \ - addr_capture \ - TCLKset1 \ - TCLKset0 \ - cntrl_sig_high_byte \ - SetReg_8Bits_(0x24) \ - TCLKset1 \ - } - -#define SetPcXv2(Mova,X) { cntrl_sig_capture \ - SetReg_16Bits_(0x0000) \ - TCLKset0; \ - data_16bit \ - TCLKset1 \ - SetReg_16Bits(Mova) \ - TCLKset0 \ - cntrl_sig_16bit \ - SetReg_16Bits(0x1400) \ - data_16bit \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits(X) \ - TCLKset0 \ - TCLKset1 \ - SetReg_16Bits(0x4303) \ - TCLKset0 \ - addr_capture \ - SetReg_20Bits_(0x00000)} - -#define SyncJtag() { cntrl_sig_16bit \ - SetReg_16Bits(0x2401) \ - cntrl_sig_capture \ - i = 50; \ - do \ - { \ - SetReg_16Bits(0x0000) \ - i--; \ - } \ - /* \bugfix Günther - if lOut = 0xFFFF then timeout will never occur \ - causing the firmware to hang indefinately (as well as the DLL). \ - Added extra braces so that the timeout is honored */\ - while(((lOut == 0xFFFF) || !(lOut & 0x0200)) && i); \ - } - -#define SyncJtagX() { cntrl_sig_16bit \ - SetReg_16Bits(0x2401) \ - cntrl_sig_capture \ - SetReg_16Bits(0x0000) \ - TCLKset1 \ - if (!(lOut & 0x0200)) \ - { \ - cntrl_sig_high_byte \ - SetReg_8Bits(0x34) \ - eem_data_exchange32 \ - SetReg_32Bits_(0x89) \ - SetReg_32Bits(0) \ - eem_data_exchange32 \ - SetReg_32Bits_(0x88) \ - SetReg_32Bits(lOut|0x40) \ - eem_data_exchange32 \ - SetReg_32Bits_(0x88) \ - SetReg_32Bits(lOut) \ - } \ - cntrl_sig_capture \ - i = 50; \ - do \ - { \ - SetReg_16Bits(0x0000) \ - i--; \ - } \ - while(((lOut == 0xFFFF) || !(lOut & 0x0200)) && i);\ - } - -#define SyncJtagXv2() { cntrl_sig_16bit \ - SetReg_16Bits(0x1501) \ - cntrl_sig_capture \ - i = 50; \ - do \ - { \ - SetReg_16Bits(0x0000) \ - i--; \ - } \ - while(((lOut == 0xFFFF) || !(lOut & 0x0200)) && i); \ - } - -#define Shift_Bits(NumOfBits,TdiVal){\ - unsigned short tempVar; \ - if(TdiVal) \ - TDIset1; \ - else \ - TDIset0; \ - for(tempVar = NumOfBits;tempVar > 0; tempVar--)\ - {\ - TCKset0;\ - TCKset1;\ - }\ - } - -#define EnableLpmx5() { if(devicePowerSettings.powerTestReg3VMask) \ - { \ - test_reg_3V \ - SetReg_16Bits(0x0000); \ - \ - test_reg_3V \ - SetReg_16Bits_(lOut & \ - ~devicePowerSettings.powerTestReg3VMask|\ - devicePowerSettings.enableLpmx5TestReg3V)\ - \ - EDT_Delay_1ms(20); \ - } \ - \ - if(devicePowerSettings.powerTestRegMask) \ - { \ - test_reg \ - SetReg_32Bits(0x00000000); \ - \ - test_reg \ - SetReg_32Bits_(lOut_long & \ - ~devicePowerSettings.powerTestRegMask| \ - devicePowerSettings.enableLpmx5TestReg) \ - \ - EDT_Delay_1ms(20); \ - } \ - } - -#define DisableLpmx5() { if(devicePowerSettings.powerTestReg3VMask) \ - { \ - test_reg_3V \ - SetReg_16Bits(0x0000); \ - \ - test_reg_3V \ - SetReg_16Bits_(lOut & \ - ~devicePowerSettings.powerTestReg3VMask|\ - devicePowerSettings.disableLpmx5TestReg3V)\ - \ - EDT_Delay_1ms(20); \ - } \ - \ - if(devicePowerSettings.powerTestRegMask) \ - { \ - test_reg \ - SetReg_32Bits(0x00000000); \ - \ - test_reg \ - SetReg_32Bits_(lOut_long & \ - ~devicePowerSettings.powerTestRegMask| \ - devicePowerSettings.disableLpmx5TestReg)\ - \ - EDT_Delay_1ms(20); \ - } \ - } +#pragma inline=forced +short cntrl_sig_capture() { return _edt_Distinct_Methods.Instr(IR_CNTRL_SIG_CAPTURE); } + +#pragma inline=forced +short cntrl_sig_high_byte() { return _edt_Distinct_Methods.Instr(IR_CNTRL_SIG_HIGH_BYTE); } + +#pragma inline=forced +short cntrl_sig_16bit() { return _edt_Distinct_Methods.Instr(IR_CNTRL_SIG_16BIT); } + +#pragma inline=forced +short cntrl_sig_release() { return _edt_Distinct_Methods.Instr(IR_CNTRL_SIG_RELEASE); } + +#pragma inline=forced +short addr_16bit() { return _edt_Distinct_Methods.Instr(IR_ADDR_16BIT); } + +#pragma inline=forced +short addr_capture() { return _edt_Distinct_Methods.Instr(IR_ADDR_CAPTURE); } + +#pragma inline=forced +short data_16bit() { return _edt_Distinct_Methods.Instr(IR_DATA_16BIT); } + +#pragma inline=forced +short data_capture() {return _edt_Distinct_Methods.Instr(IR_DATA_CAPTURE); } + +#pragma inline=forced +short data_to_addr() { return _edt_Distinct_Methods.Instr(IR_DATA_TO_ADDR); } + +#pragma inline=forced +short data_quick() { return _edt_Distinct_Methods.Instr(IR_DATA_QUICK); } + +#pragma inline=forced +short config_fuses() { return _edt_Distinct_Methods.Instr(IR_CONFIG_FUSES); } +#pragma inline=forced +short eem_data_exchange() { return _edt_Distinct_Methods.Instr(IR_EMEX_DATA_EXCHANGE); } + +#pragma inline=forced +short eem_data_exchange32() { return _edt_Distinct_Methods.Instr(IR_EMEX_DATA_EXCHANGE32); } + +#pragma inline=forced +short eem_read_control() { return _edt_Distinct_Methods.Instr(IR_EMEX_READ_CONTROL); } + +#pragma inline=forced +short eem_write_control() { return _edt_Distinct_Methods.Instr(IR_EMEX_WRITE_CONTROL); } + +#pragma inline=forced +short eem_read_trigger() { return _edt_Distinct_Methods.Instr(IR_EMEX_READ_TRIGGER); } + +#pragma inline=forced +short data_psa() { return _edt_Distinct_Methods.Instr(IR_DATA_PSA); } + +#pragma inline=forced +short shift_out_psa() { return _edt_Distinct_Methods.Instr(IR_SHIFT_OUT_PSA); } + +#pragma inline=forced +short flash_16bit_update() { return _edt_Distinct_Methods.Instr(IR_FLASH_16BIT_UPDATE); } + +#pragma inline=forced +short jmb_exchange() { return _edt_Distinct_Methods.Instr(IR_JMB_EXCHANGE); } + +#pragma inline=forced +short device_ip_pointer() { return _edt_Distinct_Methods.Instr(IR_DEVICE_ID);} + +#pragma inline=forced +short core_ip_pointer() { return _edt_Distinct_Methods.Instr(IR_COREIP_ID);} + +#pragma inline=forced +short jstate_read() { return _edt_Distinct_Methods.Instr(IR_JSTATE_ID);} + +#pragma inline=forced +short test_reg() { return _edt_Distinct_Methods.Instr(IR_TEST_REG);} + +#pragma inline=forced +short test_reg_3V() { return _edt_Distinct_Methods.Instr(IR_TEST_3V_REG);} + +#pragma inline=forced +short prepare_blow() { return _edt_Distinct_Methods.Instr(IR_PREPARE_BLOW);} + +#pragma inline=forced +short ex_blow() { return _edt_Distinct_Methods.Instr(IR_EX_BLOW);} #define OUT1RDY 0x0008 #define OUT0RDY 0x0004 @@ -846,134 +280,680 @@ extern unsigned short setPCclockBeforeCapture; #define OUTREQ 0x0004 #define INREQ 0x0001 -#define i_ReadJmbOut(X) { unsigned short sJMBINCTL; \ - unsigned short sJMBOUT0, sJMBOUT1; \ - sJMBINCTL = 0; \ - jmb_exchange \ - SetReg_16Bits(sJMBINCTL) \ - if(lOut & OUT1RDY) \ - { \ - sJMBINCTL |= JMB32B + OUTREQ; \ - SetReg_16Bits(sJMBINCTL) \ - SetReg_16Bits(0) \ - sJMBOUT0 = lOut; \ - SetReg_16Bits(0) \ - sJMBOUT1 = lOut; \ - X = ((unsigned long)sJMBOUT1<<16) + sJMBOUT0; \ - } \ - } - -#define i_WriteJmbIn(X) { unsigned short sJMBINCTL; \ - unsigned short sJMBIN0; \ - unsigned long Timeout = 0; \ - jtagMailboxIn = 0; \ - sJMBIN0 = (unsigned short)(X & 0x0000FFFF); \ - sJMBINCTL = INREQ; \ - jmb_exchange \ - do \ - { \ - SetReg_16Bits(0x0000) \ - Timeout++; \ - if(Timeout >= 3000) \ - { \ - jtagMailboxIn = 1; \ - break; \ - } \ - } \ - while(!(lOut & IN0RDY) && Timeout < 3000); \ - if(Timeout < 3000) \ - { \ - SetReg_16Bits(sJMBINCTL) \ - SetReg_16Bits(sJMBIN0) \ - } \ - } - -#define i_WriteJmbIn32(X,Y) { unsigned short sJMBINCTL; \ - unsigned short sJMBIN0,sJMBIN1; \ - unsigned long Timeout = 0; \ - jtagMailboxIn = 0; \ - sJMBIN0 = (unsigned short)(X & 0x0000FFFF); \ - sJMBIN1 = (unsigned short)(Y & 0x0000FFFF); \ - sJMBINCTL = JMB32B | INREQ; \ - jmb_exchange \ - do \ - { \ - SetReg_16Bits(0x0) \ - Timeout++; \ - if(Timeout >= 3000) \ - { \ - jtagMailboxIn = 1; \ - break; \ - } \ - } \ - while(!(lOut & IN1RDY) && Timeout < 3000); \ - if(Timeout < 3000) \ - { \ - sJMBINCTL = 0x11; \ - SetReg_16Bits(sJMBINCTL) \ - SetReg_16Bits(sJMBIN0) \ - SetReg_16Bits(sJMBIN1) \ - } \ - } - - -#define i_InitStreamJmbIn32() { unsigned short sJMBINCTL; \ - unsigned long Timeout = 0; \ - jtagMailboxIn = 0; \ - jmb_exchange \ - do \ - { \ - SetReg_16Bits(0x0) \ - Timeout++; \ - if(Timeout >= 3000) \ - { \ - jtagMailboxIn = 1; \ - break; \ - } \ - } \ - while(!(lOut & IN1RDY) && Timeout < 3000); \ - if(Timeout < 3000) \ - { \ - sJMBINCTL = 0x11; \ - SetReg_16Bits(sJMBINCTL) \ - } \ - } - -#define i_StreamDataJmbIn32(X,Y) { unsigned short sJMBINCTL; \ - unsigned short sJMBIN0,sJMBIN1; \ - unsigned long Timeout = 0; \ - jtagMailboxIn = 0; \ - sJMBIN0 = (X ); \ - sJMBIN1 = (Y ); \ - Timeout =0; \ - sJMBINCTL = 0x11; \ - do \ - { \ - SetReg_16Bits(sJMBINCTL) \ - Timeout++; \ - } \ - while(!(lOut & IN1RDY)&& Timeout <1500); \ - Timeout =0; \ - do \ - { \ - SetReg_16Bits(sJMBIN0) \ - Timeout++; \ - } \ - while(lOut != 0xFFFF && Timeout <1500); \ - if(Timeout >= 1500){ \ - jtagMailboxIn = 1; \ - break; } \ - Timeout =0; \ - do \ - { \ - SetReg_16Bits(sJMBIN1) \ - Timeout++; \ - } \ - while(lOut != 0xFFFF && Timeout <1500); \ - if(Timeout >= 1500){ \ - jtagMailboxIn = 1; \ - break; } \ - } +// JTAG logic functions +#pragma inline=forced +short isInstrLoad() +{ + cntrl_sig_capture(); + if((SetReg_16Bits(0) & (CNTRL_SIG_INSTRLOAD | CNTRL_SIG_READ)) != (CNTRL_SIG_INSTRLOAD | CNTRL_SIG_READ)) + { + return -1; + } + return 0; +} + +#pragma inline=forced +short instrLoad() +{ + unsigned short i = 0; + + cntrl_sig_low_byte(); + SetReg_8Bits(CNTRL_SIG_READ); + IHIL_Tclk(1); + + for(i = 0; i < 10; i++) + { + if(isInstrLoad() == 0) + { + return 0; + } + IHIL_TCLK(); + } + return -1; +} + +#pragma inline=forced +void halt_cpu() +{ + data_16bit(); + SetReg_16Bits(0x3FFF); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2409); + IHIL_Tclk(1); +} + +#pragma inline=forced +void release_cpu() +{ + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + addr_capture(); + IHIL_Tclk(1); +} + +#pragma inline=forced +unsigned short ReadMemWord(unsigned short address) +{ + unsigned short data = 0; + halt_cpu(); + IHIL_Tclk(0); + addr_16bit(); + SetReg_16Bits(address); + data_to_addr(); + IHIL_Tclk(1); + IHIL_Tclk(0); + data = SetReg_16Bits(0); + release_cpu(); + return data; +} + +#pragma inline=forced +unsigned short ReadMemWordX(unsigned long address) +{ + unsigned short data = 0; + halt_cpu(); + IHIL_Tclk(0); + addr_16bit(); + SetReg_20Bits(address & 0xFFFFF); + data_to_addr(); + IHIL_Tclk(1); + IHIL_Tclk(0); + data = SetReg_16Bits(0); + release_cpu(); + return data; +} + +#pragma inline=forced +unsigned short ReadMemWordXv2(unsigned long address) +{ + unsigned short data = 0; + IHIL_Tclk(0); + addr_16bit(); + SetReg_20Bits(address & 0xFFFFF); + IHIL_Tclk(1); + IHIL_Tclk(0); + data_capture(); + data = SetReg_16Bits(0); + IHIL_Tclk(1); + IHIL_Tclk(0); + IHIL_Tclk(1); + return data; +} + +#pragma inline=forced +void WriteMemWord(unsigned short address, unsigned short data) +{ + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_low_byte(); + SetReg_8Bits(0x08); + addr_16bit(); + SetReg_16Bits(address); + data_to_addr(); + SetReg_16Bits(data); + IHIL_Tclk(1); + release_cpu(); +} + +#pragma inline=forced +void WriteMemWordX(unsigned long address, unsigned short data) +{ + halt_cpu(); + IHIL_Tclk(0); + cntrl_sig_low_byte(); + SetReg_8Bits(0x08); + addr_16bit(); + SetReg_20Bits(address & 0xFFFFF); + data_to_addr(); + SetReg_16Bits(data); + IHIL_Tclk(1); + release_cpu(); +} + +#pragma inline=forced +void WriteMemWordXv2(unsigned long address, unsigned short data) +{ + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x0500); + addr_16bit(); + SetReg_20Bits(address); + IHIL_Tclk(1); + data_to_addr(); + SetReg_16Bits(data); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_Tclk(1); + IHIL_Tclk(0); + IHIL_Tclk(1); +} + +#pragma inline=forced +void WriteMemByte(unsigned long address, unsigned short data) +{ + halt_cpu(); + IHIL_Tclk(0); + addr_16bit(); + SetReg_16Bits(address); + data_to_addr(); + SetReg_8Bits(data); + IHIL_Tclk(1); + IHIL_Tclk(0); + release_cpu(); +} + +#pragma inline=forced +unsigned short ReadCpuReg_uShort(unsigned short reg) +{ + short op = 0; + unsigned short data = 0; + + cntrl_sig_16bit(); + SetReg_16Bits(0x3401); + data_16bit(); + op = ((reg << 8) & 0x0F00) | 0x4082; + SetReg_16Bits(op); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + SetReg_16Bits(0x00fe); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + IHIL_Tclk(0); + IHIL_Tclk(1); + SetReg_16Bits(0); + data = SetReg_16Bits(0); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + IHIL_Tclk(1); + return data; +} + +#pragma inline=forced +unsigned short ReadCpuReg(unsigned short reg) +{ + short op = 0; + unsigned short data = 0; + + cntrl_sig_16bit(); + SetReg_16Bits(0x3401); + data_16bit(); + op = ((reg << 8) & 0x0F00) | 0x4082; + SetReg_16Bits(op); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + SetReg_16Bits(0x00fe); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + IHIL_Tclk(0); + IHIL_Tclk(1); + data = SetReg_16Bits(0); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + IHIL_Tclk(1); + return data; +} + +#pragma inline=forced +unsigned long ReadCpuRegX(unsigned short reg) +{ + short op = 0; + unsigned short Rx_l = 0; + unsigned short Rx_h = 0; + + cntrl_sig_high_byte(); + SetReg_16Bits(0x34); + op = ((reg << 8) & 0x0F00) | 0x60; + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(op); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(0x00fc); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + Rx_l = SetReg_16Bits(0); + IHIL_Tclk(0); + IHIL_Tclk(1); + Rx_h = SetReg_16Bits(0); + IHIL_Tclk(0); + cntrl_sig_high_byte(); + SetReg_8Bits(0x24); + IHIL_Tclk(1); + return ((unsigned long)Rx_h<<16) + Rx_l; +} + +#pragma inline=forced +unsigned long ReadCpuRegXv2(unsigned short reg) +{ + unsigned short Rx_l = 0; + unsigned short Rx_h = 0; + unsigned short jtagId = cntrl_sig_capture(); + const unsigned short jmbAddr = (jtagId == 0x98) ? 0x14c : 0x18c; + + IHIL_Tclk(0); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(reg); + cntrl_sig_16bit(); + SetReg_16Bits(0x1401); + data_16bit(); + IHIL_TCLK(); + if (altRomAddressForCpuRead) + { + SetReg_16Bits(0x0ff6); + } + else + { + SetReg_16Bits(jmbAddr); + } + IHIL_TCLK(); + SetReg_16Bits(0x3ffd); + IHIL_Tclk(0); + if (altRomAddressForCpuRead) + { + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + } + data_capture(); + IHIL_Tclk(1); + Rx_l = SetReg_16Bits(0); + IHIL_TCLK(); + Rx_h = SetReg_16Bits(0); + IHIL_TCLK(); + IHIL_TCLK(); + IHIL_TCLK(); + if (!altRomAddressForCpuRead) + { + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + } + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + return((unsigned long)Rx_h<<16) + Rx_l; +} + +#pragma inline=forced +void WriteCpuReg(unsigned short reg, unsigned short data) +{ + unsigned short op = 0; + cntrl_sig_16bit(); + SetReg_16Bits(0x3401); + data_16bit(); + op = (0x4030 | reg); + SetReg_16Bits(op); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + SetReg_16Bits(data); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + SetReg_16Bits(0x3ffd); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + IHIL_Tclk(1); +} + +#pragma inline=forced +void WriteCpuRegX(unsigned short mova, unsigned long data) +{ + unsigned short op = 0x0080 | mova | ((data >> 8) & 0x0F00); + cntrl_sig_high_byte(); + SetReg_8Bits(0x34); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(op); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(data & 0xFFFF); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(0x3ffd); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); + IHIL_Tclk(0); + cntrl_sig_high_byte(); + SetReg_8Bits(0x24); + IHIL_Tclk(1); +} + +// BUGFIX BTT1722 added +#pragma inline=forced +void WriteCpuRegXv2(unsigned short mova, unsigned short data) +{ + IHIL_Tclk(0); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(mova); + cntrl_sig_16bit(); + SetReg_16Bits(0x1401); + data_16bit(); + IHIL_TCLK(); + SetReg_16Bits(data); + IHIL_TCLK(); + SetReg_16Bits(0x3ffd); + IHIL_TCLK(); + IHIL_Tclk(0); + addr_capture(); + SetReg_20Bits(0x00000); + IHIL_Tclk(1); + cntrl_sig_16bit(); + SetReg_16Bits(0x0501); + IHIL_TCLK(); + IHIL_Tclk(0); + data_capture(); + IHIL_Tclk(1); +} + +#pragma inline=forced +void SetPc(unsigned short pc) +{ + cntrl_sig_16bit(); + SetReg_16Bits(0x3401); + data_16bit(); + SetReg_16Bits(0x4030); + IHIL_TCLK(); + SetReg_16Bits(pc); + IHIL_TCLK(); + addr_capture(); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + IHIL_Tclk(1); +} + +#pragma inline=forced +void SetPcJtagBug(unsigned short pc) +{ + data_16bit(); + SetReg_16Bits(0x4030); + IHIL_Tclk(1); + IHIL_Tclk(0); + SetReg_16Bits(pc); + IHIL_Tclk(1); + IHIL_Tclk(0); + IHIL_Tclk(1); + IHIL_Tclk(0); +} + +#pragma inline=forced +void SetPcX(unsigned long pc) +{ + unsigned short pc_high = (unsigned short)(0x80 | (((pc)>>8) & 0x0F00)); + unsigned short pc_low = (unsigned short)((pc) & 0xFFFF); + cntrl_sig_high_byte(); + SetReg_8Bits(0x34); + data_16bit(); + SetReg_16Bits(pc_high); + IHIL_TCLK(); + SetReg_16Bits(pc_low); + IHIL_TCLK(); + addr_capture(); + IHIL_Tclk(0); + cntrl_sig_high_byte(); + SetReg_8Bits(0x24); + IHIL_Tclk(1); +} + +#pragma inline=forced +void SetPcXv2(unsigned short Mova, unsigned short pc) +{ + cntrl_sig_capture(); + SetReg_16Bits(0x0000); + IHIL_Tclk(0); + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(Mova); + IHIL_Tclk(0); + cntrl_sig_16bit(); + SetReg_16Bits(0x1400); + data_16bit(); + IHIL_Tclk(0); + IHIL_Tclk(1); + SetReg_16Bits(pc); + IHIL_Tclk(0); + IHIL_Tclk(1); + SetReg_16Bits(0x4303); + IHIL_Tclk(0); + addr_capture(); + SetReg_20Bits(0x00000); +} + +#pragma inline=forced +unsigned short SyncJtag() +{ + unsigned short lOut = 0, i = 50; + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + cntrl_sig_capture(); + do + { + lOut = SetReg_16Bits(0x0000); + i--; + } + while(((lOut == 0xFFFF) || !(lOut & 0x0200)) && i); + if(!i) + { + return 0; + } + return lOut; +} + +#pragma inline=forced +void SyncJtagX() +{ + unsigned short lOut = 0, i = 50; + cntrl_sig_16bit(); + SetReg_16Bits(0x2401); + cntrl_sig_capture(); + SetReg_16Bits(0x0000); + IHIL_Tclk(1); + if (!(lOut & 0x0200)) + { + cntrl_sig_high_byte(); + SetReg_8Bits(0x34); + eem_data_exchange32(); + SetReg_32Bits(0x89); + SetReg_32Bits(0); + eem_data_exchange32(); + SetReg_32Bits(0x88); + SetReg_32Bits(lOut|0x40); + eem_data_exchange32(); + SetReg_32Bits(0x88); + SetReg_32Bits(lOut); + } + cntrl_sig_capture(); + do + { + lOut = SetReg_16Bits(0x0000); + i--; + } + while(((lOut == 0xFFFF) || !(lOut & 0x0200)) && i); +} + +#pragma inline=forced +void SyncJtagXv2() +{ + unsigned short i = 50, lOut = 0 ; + cntrl_sig_16bit(); + SetReg_16Bits(0x1501); + cntrl_sig_capture(); + do + { + lOut = SetReg_16Bits(0x0000); + i--; + } + while(((lOut == 0xFFFF) || !(lOut & 0x0200)) && i); +} + +#pragma inline=forced +unsigned short wait_for_synch() +{ + unsigned short i = 0; + cntrl_sig_capture(); + + while(!(SetReg_16Bits(0) & 0x0200) && i++ < 50); + if(i >= 50) + { + return 0; + } + return 1; +} + +#pragma inline=forced +void RestoreTestRegs() +{ + if(devicePowerSettings.powerTestReg3VMask) + { + test_reg_3V(); + SetReg_16Bits(devicePowerSettings.powerTestReg3VDefault); + IHIL_Delay_1ms(20); + } + if(devicePowerSettings.powerTestRegMask) + { + test_reg(); + SetReg_32Bits(devicePowerSettings.powerTestRegDefault); + IHIL_Delay_1ms(20); + } +} + +#pragma inline=forced +void EnableLpmx5() +{ + if(devicePowerSettings.powerTestReg3VMask) + { + unsigned short reg_3V = 0; + test_reg_3V(); + reg_3V= SetReg_16Bits(devicePowerSettings.powerTestReg3VDefault); + + SetReg_16Bits(reg_3V & ~devicePowerSettings.powerTestReg3VMask| + devicePowerSettings.enableLpmx5TestReg3V); + + IHIL_Delay_1ms(20); + } + + if(devicePowerSettings.powerTestRegMask) + { + unsigned long reg_test = 0; + test_reg(); + reg_test = SetReg_32Bits(devicePowerSettings.powerTestRegDefault); + + SetReg_32Bits(reg_test & ~devicePowerSettings.powerTestRegMask| + devicePowerSettings.enableLpmx5TestReg); + + IHIL_Delay_1ms(20); + } +} + +#pragma inline=forced +void DisableLpmx5() +{ + if(devicePowerSettings.powerTestReg3VMask) + { + unsigned short reg_3V = 0; + test_reg_3V(); + reg_3V = SetReg_16Bits(devicePowerSettings.powerTestReg3VDefault); + + SetReg_16Bits(reg_3V & ~devicePowerSettings.powerTestReg3VMask| + devicePowerSettings.disableLpmx5TestReg3V); + IHIL_Delay_1ms(20); + } + + if(devicePowerSettings.powerTestRegMask) + { + unsigned long reg_test = 0; + test_reg(); + SetReg_32Bits(devicePowerSettings.powerTestRegDefault); + + SetReg_32Bits(reg_test & ~devicePowerSettings.powerTestRegMask| + devicePowerSettings.disableLpmx5TestReg); + + IHIL_Delay_1ms(20); + } +} + +unsigned long i_ReadJmbOut(); +unsigned short i_ReadJmbOut16(); + +short i_WriteJmbIn(unsigned short data); +short i_WriteJmbIn32(unsigned short dataA, unsigned short dataB); + +short checkWakeup(); +short powerUpArm(); + + +#pragma inline=forced +// ----------------------------------------------------------------------------- +void JTAG_PsaSetup(unsigned long StartAddr) +{ + data_16bit(); + IHIL_Tclk(1); + SetReg_16Bits(MOV_IMM_PC); + IHIL_Tclk(0); + IHIL_Tclk(1); + SetReg_16Bits(StartAddr - 2); + IHIL_Tclk(0); + IHIL_Tclk(1); + IHIL_Tclk(0); + IHIL_Tclk(1); + IHIL_Tclk(0); + addr_capture(); + SetReg_16Bits(0x0000); +} + +#pragma inline=forced +// ----------------------------------------------------------------------------- +void JTAG_EnhancedPsaSetup(unsigned long StartAddr) +{ + halt_cpu(); + IHIL_Tclk(0); + data_16bit(); + SetReg_16Bits(StartAddr - 2); +} + +#pragma inline=forced +// ----------------------------------------------------------------------------- +void JTAG_PsaEnd(void) +{ + // Intentionally does nothing +} + +#pragma inline=forced +// ----------------------------------------------------------------------------- +void JTAG_EnhancedPsaEnd(void) +{ + release_cpu(); + isInstrLoad(); +} + #endif -// this last rising edge in the SetPc macro is required for debugging, -// otherwise the EEM will trigger immediately on the instruction fetch signal + diff --git a/Bios/src/hil/ez_fet/arch.h b/Bios/src/hil/ez_fet/arch.h new file mode 100644 index 0000000..737c1f7 --- /dev/null +++ b/Bios/src/hil/ez_fet/arch.h @@ -0,0 +1,164 @@ +/* + * arch.h + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHIL +//! \file arch.h +//! \brief +//! +#include "msp430.h" +#define uController_uif + +#ifndef _UIFV1_ARCH_H_ +#define _UIFV1_ARCH_H_ + +enum {JTAG = 0, SPYBIWIRE = 1, SPYBIWIREJTAG = 2, JTAGUNDEF = 4, SPYBIWIRE_SUBMCU = 5, SPYBIWIRE_MSP_FET=6, JTAG_432 = 7, SWD_432 = 8}; + + +typedef enum { + NO_SUPPLY = 0x04, + ET_OFF = 0x05, + ET_ON = 0x06, + LDO_OFF = 0x07, + ALL_OFF = 0x8, + LDO_ON = 0x09 +} vccSupply_t; + +#define RSTHIGH 0 +#define RSTLOW 1 + +#define Invalid_Manufactor_IdCode 0x000000FEul +#define Mask_Manufactor_IdCode 0x000000FEul + +#define ExtLimit 1700 // a level higher than this means external voltage available + +#define R27 250.0f // 250kOhm +#define R28 250.0f // 250kOhm +#define R29 500.0f // 500kOhm +#define R30 500.0f // 500kOhm +#define R31 250.0f // 250kOhm +#define R32 150.0f // 150kOhm +#define A_VREFPLUS 2.5f // conversion reference voltage Vref+=2.5V, + +#define DCDC_STATUS (P3IN & (BIT0+BIT1)) // Status bits from the DCDC Sub MCU + +// Calculate ExtVcc based on Vref+=2.5V, R27=250kOhm, R28=250kOhm +// Calculate Vcc based on Vref+=2.5V, R29=500kOhm, R30=500kOhm + +#define A_VBUS 0 /* ADC12 Input Channel Select Bit 0 */ +#define A_VCCOUT 1 /* ADC12 Input Channel Select Bit 1 */ +#define A_VCCTARGET 2 /* ADC12 Input Channel Select Bit 2 */ + +static const float ADC_CONV_RANGE = 4096; +static const unsigned short ADC_AVERAGE = 1000; + +struct jtag +{ + unsigned char TCK; + unsigned char TMS; + unsigned char TDI; + unsigned char TDO; + unsigned char* In; + unsigned char* Out; + unsigned char RST; + unsigned char TST; + unsigned char* DIRECTION; +}; + +static const struct jtag _Jtag_SubMcu = +{ + 0, // TCK, P4.4 (out) (high) + 0, // TMS, P4.5 (out) (high) + 0, // TDI, P4.6 (out) (high) + 0, // TDO, P4.7 (in) + (unsigned char*)&P6IN, // JTAG input Register + (unsigned char*)&P6OUT, // JTAG output Register + (unsigned char)BIT6, // BIT6.6 RST + (unsigned char)BIT7, // BIT6.7 TST + (unsigned char*)&P6DIR // JTAG direction Register +}; + +//CONST_AT( struct jtag _Jtag, HAL_ADDR_CONST_JTAG) = { +static const struct jtag _Jtag_Target = +{ + (unsigned char)BIT4, // TCK, P4.4 (out) (high) + (unsigned char)BIT5, // TMS, P4.5 (out) (high) + (unsigned char)BIT6, // TDI, P4.6 (out) (high) + (unsigned char)BIT7, // TDO, P4.7 (in) + (unsigned char*)&P4IN, + (unsigned char*)&P4OUT, + (unsigned char)BIT2, //RST + (unsigned char)BIT3, //TST + (unsigned char*)&P4DIR +}; + +#define VALID_DATA 0x1A +#define SYNC_ONGOING 0x2A +#define INVALID_DATA 0x3A +#define JTAG_LOCKED 0x4A +#define SYNC_BROKEN 0x5A + +#define BP_HIT_MASK_J 0x0400000000000000ull +#define LPMX5_MASK_J 0x4000000000000000ull +#define LPM4_1MASK_J 0x8000000000000000ull +#define LPM4_2MASK_J 0x8300000000000000ull +#define EIGHT_JSTATE_BITS 0x100000000000000ull + +#define JSTATE_FLOW_CONTROL_BITS 0xC7 + +#define JSTATE_BP_HIT 0x4 +#define JSTATE_SYNC_ONGOING 0x83 +#define JSTATE_LOCKED_STATE 0x40 +#define JSTATE_INVALID_STATE 0x81 +#define JSTATE_LPM_ONE_TWO 0x82 +#define JSTATE_LPM_THREE_FOUR 0x80 +#define JSTATE_VALID_CAPTURE 0x03 +#define JSTATE_LPM_X_FIVE 0xC0 + + +#define JSTATE_SYNC_BROKEN_MASK 0xC3 +#define JSTATE_SYNC_BROKEN_PGACT 0x02 +#define JSTATE_SYNC_BROKEN_MCLK 0x01 +#define JSTATE_SYNC_BROKEN_MCLK_PGACT 0x00 + + +#define FET_TRUE 0x1 +#define FET_FALSE 0x0 + +#define L092_MODE 0xA55AA55A +#define C092_MODE 0x5AA55AA5 + +#endif + + diff --git a/Bios/src/hil/ez_fet/cstartup_hil.s43 b/Bios/src/hil/ez_fet/cstartup_hil.s43 new file mode 100644 index 0000000..7f94108 --- /dev/null +++ b/Bios/src/hil/ez_fet/cstartup_hil.s43 @@ -0,0 +1,454 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +#ifdef DISABLE_WATCHDOG +#include "msp430.h" +#endif + + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + // The CPU40 warning is issued when a Jxx instruction is place + // at the end of a segment part. However, this case is safe, + // as we have control of what will be placed right after the + // instruction. + SUPPRESS_CPU40_WARNING + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + RSEG DATA16_N +saved_stack DS 2 + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + + // -------------------- + // Initialize SP to point to the top of the stack. + // + + MOV SP, saved_stack + + pushx R4 + pushx R5 + pushx R6 + pushx R7 + pushx R8 + pushx R9 + pushx R10 + pushx R11 + pushx R12 + pushx R13 + pushx R14 + pushx R15 + + //MOV #SFE(CSTACK), SP + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + MOV #SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XCALL #__data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + MOVA #SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XCALL #__data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy + +#endif // IGNORE_DATA16_DATA + +#endif // MSP430X + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN _hil_startUp + EXTERN exit + +?cstart_call_main: + + popx R15 + popx R14 + popx R13 + popx R12 + popx R11 + popx R10 + popx R9 + popx R8 + popx R7 + popx R6 + popx R5 + popx R4 + + //XCALL #_hil_startUp + movx.a #_hil_startUp, PC + MOV saved_stack,SP + //XRET // indicates that the normal + //XCALL #exit + + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC16 __program_start + + ENDMOD + + +// --------------------------------------------------------- +// ?CPU30_OFFSET +// +// The compiler compensates for the CPU30 hardware bug by adding or +// subtracting the symbol ?CPU30_OFFSET from certain immediates. Here, +// it is defined to the default value zero (0), for when the device is +// not affected by CPU30. If the device is affected, the value must be +// set to two (2) using a linker command line override: +// +// -D?CPU30_OFFSET=2. +// +// The override is normally placed in the device-specific .xcl file. + + MODULE ?cpu30_offset + + PUBLIC ?CPU30_OFFSET + +?CPU30_OFFSET EQU 0 + + ENDMOD + + END diff --git a/Bios/src/hil/ez_fet/hil.c b/Bios/src/hil/ez_fet/hil.c new file mode 100644 index 0000000..59678a4 --- /dev/null +++ b/Bios/src/hil/ez_fet/hil.c @@ -0,0 +1,1189 @@ +/* + * hil.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHIL +//! \file hil.c +//! \brief +//! + +//! \page hil_page1 (HIL) +//! \brief The HIL ... +//! \author Berenbrinker Florian (01/01/2012) +//! +//! files\n +//! \li hil.c +//! \li hil_2w.c +//! \li hil_4w.c +//! \li hil_delays.s43 +//! \li hil_delays.h +//! \li arch.h +#include +#include "hw_compiler_specific.h" +#include "arch.h" +#include "edt.h" +#include "hilDelays.h" +#include "error_def.h" +#include "JTAG_defs.h" +#include "../../fw/fet/FetVersion.h" + +#define HIL_SIGNATURE 0xF00DF00Dul + +//! \brief version of bios code +const unsigned short hil_version_ @ "HILVERSION" = EZ_FET_HIL_VERSION; +#pragma required=hil_version_ +const unsigned long hil_signature_ @ "HILSIGNATURE" = HIL_SIGNATURE; +#pragma required=hil_signature_ + +const unsigned short hil_versionCmp_ @ "HILVERSIONCMP" = EZ_FET_HIL_VERSION_CMP; +#pragma required=hil_versionCmp_ + + +unsigned short gTclkHighWhilePsa; +unsigned short bVccOn; // Target Vcc is switched off by default + // dependant on calls to _hil_SetVcc() + +unsigned short setPCclockBeforeCapture; +unsigned short jtagReleased; + + +unsigned short toolId; + +// function prototypes for map initialization +// common HIL configuration methods +short _hil_Init( void ); +short _hil_SetVcc(unsigned short Vcc); +short _hil_GetVcc(double* Vcc, double* ExtVcc); +short _hil_SetProtocol(unsigned short protocol_id); +void _hil_SetPsaSetup(unsigned short enhanced); +void _hil_SetPsaTCLK(unsigned short tclkValue); + +short _hil_Open( unsigned char state ); +short _hil_Close( void ); +short IccMonitor_Process(unsigned short flags); // flags: to be compatible with HIL calls +void _hil_EntrySequences(unsigned char states); +void _hil_BSL_EntrySequence1xx_4xx(); + +void _hil_SetReset(unsigned char value); +void _hil_SetTest(unsigned char value); +void _hil_SetTMS(unsigned char value); +void _hil_SetTCK(unsigned char value); +void _hil_SetTDI(unsigned char value); + +void _hil_SetJtagSpeed(unsigned short jtagSpeed, unsigned short sbwSpeed); +void _hil_ConfigureSetPc (unsigned short PCclockBeforeCapture); + +void _hil_SwitchVccFET(unsigned short switchVccFET); + +void _hil_SetToolID(unsigned short id); +// protocol specific methods +/*extern short _hil_4w_TapReset(void); +extern short _hil_4w_CheckJtagFuse(void); +extern unsigned short _hil_4w_EnumChain(void); +extern unsigned char _hil_4w_Instr(unsigned char Instruction); +extern unsigned char _hil_4w_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_4w_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_4w_SetReg_XBits20(unsigned long Data); +extern unsigned long _hil_4w_SetReg_XBits32(unsigned long Data); +extern unsigned long long _hil_4w_SetReg_XBits64(unsigned long long Data); +extern void _hil_4w_Tclk(unsigned char state); +extern void _hil_4w_StepPsa(unsigned long length); +extern void _hil_4w_StepPsaTclkHigh(unsigned long length); +extern short _hil_4w_BlowFuse(unsigned char targetHasTestVpp);*/ +//extern void _hil_4w_ConfigureSpeed(unsigned short speed); + +//SBW2 DMA +extern short _hil_2w_TapReset_Dma(void); +extern short _hil_2w_CheckJtagFuse_Dma(void); +extern unsigned short _hil_2w_EnumChain_Dma(void); +extern unsigned char _hil_2w_Instr_Dma(unsigned char Instruction); +extern unsigned char _hil_2w_SetReg_XBits08_Dma(unsigned char Data); +extern unsigned short _hil_2w_SetReg_XBits16_Dma(unsigned short Data); +extern unsigned long _hil_2w_SetReg_XBits20_Dma(unsigned long Data); +extern unsigned long _hil_2w_SetReg_XBits32_Dma(unsigned long Data); +extern unsigned long long _hil_2w_SetReg_XBits64_Dma(unsigned long long Data); +extern unsigned long long _hil_2w_SetReg_XBits8_64_Dma(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion); +extern void _hil_2w_Tclk_Dma(unsigned char state); +extern void _hil_2w_StepPsa_Dma(unsigned long length); +extern void _hil_2w_StepPsaTclkHigh_Dma(unsigned long length); +extern short _hil_2w_BlowFuse_Dma(unsigned char targetHasTestVpp); +extern void _hil_2w_ConfigureSpeed_Dma(unsigned short speed); +void _hil_2w_StepPsa_Dma_Xv2(unsigned long length); +extern unsigned char _hil_2w_GetPrevInstruction_Dma(); +extern unsigned char DMA_TMSL_TDIL[]; + +short _hil_dummy_TapReset(void) {return 0;} +short _hil_dummy_CheckJtagFuse(void){return 0;} +unsigned short _hil_dummy_EnumChain(void){return 0;} +unsigned char _hil_dummy_Instr(unsigned char Instruction){return 0;} +unsigned char _hil_dummy_SetReg_XBits08(unsigned char Data){return 0;} +unsigned short _hil_dummy_SetReg_XBits16(unsigned short Data){return 0;} +unsigned long _hil_dummy_SetReg_XBits20(unsigned long Data){return 0;} +unsigned long _hil_dummy_SetReg_XBits32(unsigned long Data){return 0;} +unsigned long long _hil_dummy_SetReg_XBits64(unsigned long long Data){return 0;} +unsigned long long _hil_dummy_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion){return 0;} +void _hil_dummy_Tclk(unsigned char state){return;} +void _hil_dummy_StepPsa(unsigned long length){return;} +void _hil_dummy_StepPsaTclkHigh(unsigned long length){return;} +short _hil_dummy_BlowFuse(unsigned char targetHasTestVpp){return 0;} +void _hil_dummy_StepPsa_Xv2(unsigned long length){return;} +unsigned char _hil_dummy_GetPrevInstruction(){return 0;} +short _dummy_regulateVcc(void) { return 0; } + +// PSA distinct methods +void _hil_EnhancedPsaSetup(unsigned long address); +void _hil_PsaSetup(unsigned long address); +void _hil_EnhancedPsaEnd(void); +void _hil_PsaEnd(void); +void _hil_Release(void); +void _hil_initTimerB0(void); +void _hil_BSL_EntrySequence(unsigned short dummy); +static void _hil_Connect(unsigned char state); + +extern void initJtagSbw2Dma(struct jtag tmp); +//extern void initJtagSbw4(struct jtag tmp); + + +edt_common_methods_t _edt_Common_Methods; +edt_distinct_methods_t _edt_Distinct_Methods; + +static struct jtag _Jtag = +{ + 0, // TCK, P4.4 (out) (high) + 0, // TMS, P4.5 (out) (high) + 0, // TDI, P4.6 (out) (high) + 0, // TDO, P4.7 (in) + 0, + 0, + 0, //RST + 0, //TST + 0 +}; + +unsigned short gprotocol_id; +static unsigned short hil_sbw2Speed_; + +#pragma inline=forced +void RSTset1() +{ + { (*_Jtag.Out) |= _Jtag.RST; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void RSTset0() +{ + { (*_Jtag.Out) &= ~_Jtag.RST; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TSTset1() +{ + { (*_Jtag.Out) |= _Jtag.TST;} + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TSTset0() +{ + {(*_Jtag.Out) &= ~_Jtag.TST; } + _hil_Delay_1ms(5); +} +//#pragma inline=forced +void TCLKset1() +{ + _edt_Distinct_Methods.Tclk(1); +} + +//#pragma inline=forced +void TCLKset0() +{ + _edt_Distinct_Methods.Tclk(0); +} +#pragma inline=forced +void TCLK() +{ + TCLKset0(); + TCLKset1(); +} + +#define CAL_ADC_GAIN_FACTOR *((unsigned short *)0x1A16) +#define CAL_ADC_OFFSET *((short *)0x1A18) + +/*---------------------------------------------------------------------------- + This function performs a single AD conversion on the selected pin. + Uses internal reference 2500mV (VR+ = VREF+). + Arguments: word pinmask (bit position of selected analog input Ax) + Result: word (12 bit ADC conversion result) +*/ +static float ConvertAD(short channel) +{ + volatile unsigned long notCalibratedAdc = 0; + + ADC12CTL0 &= ~ADC12ENC; // Disable conversion, write controls + ADC12MCTL0 = ADC12SREF_1 + channel; // select Vref and analog channel Ax + ADC12CTL0 |= ADC12ENC; // Enable conversions + ADC12CTL0 |= ADC12SC; // Start conversions + while ((ADC12IFG & BIT0) == 0); // wait until conversion is done + + notCalibratedAdc = ADC12MEM0; + notCalibratedAdc = ((notCalibratedAdc * CAL_ADC_GAIN_FACTOR) / 32768) + (long)CAL_ADC_OFFSET; + + return(((float)ADC12MEM0* A_VREFPLUS) / ADC_CONV_RANGE); // return conversion result from MEM0 value in mv +} + +static int SetVCoreUp (unsigned short level) +{ + // Open PMM registers for write access + PMMCTL0_H = 0xA5; + // Set SVS/SVM high side new level + SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; + // Set SVM low side to new level + SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level; + // Wait till SVM is settled + while ((PMMIFG & SVSMLDLYIFG) == 0); + // Clear already set flags + PMMIFG &= ~(SVMLVLRIFG + SVMLIFG); + // Set VCore to new level + PMMCTL0_L = PMMCOREV0 * level; + // Wait till new level reached + if ((PMMIFG & SVMLIFG)) + while ((PMMIFG & SVMLVLRIFG) == 0); + // Set SVS/SVM low side to new level + SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; + // Lock PMM registers for write access + PMMCTL0_H = 0x00; + + return 0; +} + +void _hil_Init_Stand_Alone( void ) +{ + // Stop watchdog timer to prevent time out reset + + SetVCoreUp(2); + __delay_cycles(30000); + + //****** WE ARE NOT USING XT1 top source the clock ********** + + UCSCTL5 = 0; // DIVPA, DIVA, DIVS, DIVM -> all direct (DIV=1) + P5SEL = BIT2+BIT3; // XT2 SELECT BITS + UCSCTL6 &=~XT2OFF; // XT2 ON + UCSCTL3 = SELREF_2; // DCO SELECTION + + //Loop until XT1,XT2 & DCO stabilizes + UCSCTL4 |= SELA__REFOCLK + SELA__XT2CLK; // SELECT ACLK_XT1 AND SMCLK_XT2 TO AVOID OSCILLATOR FAULT FLAG XT1OIFG + do + { + UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG /*+ XT1HFOFFG*/ + DCOFFG); //Clear XT2,XT1,DCO fault flags + SFRIFG1 &= ~OFIFG; //Clear fault flags + } + while( SFRIFG1 & OFIFG ); + + + __bis_SR_register(SCG0); // disable the FLL for config + UCSCTL1 = DCORSEL_6; // DCO-freq range up to min 39MHz (must be higher then 18MHz*2 = 36 MHz) + UCSCTL2 = FLLD0 + 9*FLLN0; //DCO-DIV/2 + PLL MULTI*(9+1), freq = 10*2 = 20 MHz + UCSCTL3 = SELREF_5+FLLREFDIV_2; //Reference - XT2-CLK, XT2/2 = 2MHz + __bic_SR_register(SCG0); // Enable the FLL control loop after config + + //Loop until XT1,XT2 & DCO stabilizes + do + { + UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG /*+ XT1HFOFFG*/ + DCOFFG); //Clear XT2,XT1,DCO fault flags + SFRIFG1 &= ~OFIFG; //Clear fault flags + } + while( SFRIFG1 & OFIFG ); + __delay_cycles(60000); + + UCSCTL4 = SELA__XT2CLK + SELS__DCOCLK + SELM__DCOCLK ;//SELM__DCOCLKDIV; //SELM__DCOCLK;// + SELM__DCOCLKDIV; + + // Enable Vref=2.5V for ADC + REFCTL0 |= REFMSTR; + REFCTL0 |= REFVSEL1; + REFCTL0 |= REFON; + + // Configure ADC12 + // select channel and do conversion + ADC12CTL0 = ADC12ON + ADC12SHT0_10 + ADC12REF2_5V + ADC12REFON + ADC12MSC; // Turn on ADC12, set sampling time + ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12SSEL_3 + ADC12DIV_7; // Use sampling timer + + ADC12MCTL0 = ADC12SREF_1 + 0; // select Vref and analog channel A0 + __delay_cycles((15*90)); + ADC12CTL0 |= ADC12ENC; // Enable conversion + + // set default debug protocol to JTAG + gprotocol_id = SPYBIWIRE; + // set default to TCLK low when doing PSA + gTclkHighWhilePsa = 0; + // initialize function pointers to distinct functions + _hil_SetProtocol(SPYBIWIRE); + + toolId = 0; +} + +static void _hil_initEdtCommenMethods() +{ + _edt_Common_Methods.Init = _hil_Init; + + _edt_Common_Methods.SetVcc = _hil_SetVcc; + _edt_Common_Methods.GetVcc = _hil_GetVcc; + + _edt_Common_Methods.SetProtocol = _hil_SetProtocol; + _edt_Common_Methods.SetPsaTCLK = _hil_SetPsaTCLK; + + _edt_Common_Methods.Open = _hil_Open; + _edt_Common_Methods.Close = _hil_Close; + + _edt_Common_Methods.Delay_1us = _hil_Delay_1us; + _edt_Common_Methods.Delay_1ms = _hil_Delay_1ms; + + _edt_Common_Methods.Loop = 0; + + _edt_Common_Methods.EntrySequences = _hil_EntrySequences; + + _edt_Common_Methods.SetReset = _hil_SetReset; + _edt_Common_Methods.SetTest = _hil_SetTest; + _edt_Common_Methods.SetTMS = _hil_SetTMS; + _edt_Common_Methods.SetTCK = _hil_SetTCK; + _edt_Common_Methods.SetTDI = _hil_SetTDI; + + _edt_Common_Methods.SetJtagSpeed = _hil_SetJtagSpeed; + + _edt_Common_Methods.ConfigureSetPc = _hil_ConfigureSetPc; + _edt_Common_Methods.initDelayTimer = _hil_initTimerB0; + + _edt_Common_Methods.BSL_EntrySequence = _hil_BSL_EntrySequence; + _edt_Common_Methods.BSL_EntrySequence1xx_4xx = _hil_BSL_EntrySequence1xx_4xx; + _edt_Common_Methods.regulateVcc = _dummy_regulateVcc; + + _edt_Common_Methods.SwitchVccFET = _hil_SwitchVccFET; + _edt_Common_Methods.SetToolID = _hil_SetToolID; + +} + +void _hil_SetToolID(unsigned short id) +{ + toolId = id; +} + + +void _hil_getEdtDistinct(edt_distinct_methods_t* edt_distinct); +void _hil_getEdtCommen(edt_common_methods_t* edt_commen); + +#pragma required=_hil_getEdtDistinct +#pragma required=_hil_getEdtCommen + +void _hil_startUp() +{ + _hil_initEdtCommenMethods(); + _edt_Common_Methods.Init(); + + // DMA4 workaround + DMACTL4 |= DMARMWDIS; + + return; +} +#pragma location="INFO_C_DISTINCT" +void _hil_getEdtDistinct(edt_distinct_methods_t* edt_distinct) +{ + *edt_distinct = _edt_Distinct_Methods; + if(edt_distinct!= 0) + { + return; + } +} + +#pragma location="INFO_C_COMMEN" +void _hil_getEdtCommen(edt_common_methods_t* edt_commen) +{ + *edt_commen = _edt_Common_Methods; + if(edt_commen != 0) + { + return; + } +} + +void _hil_initTimerB0(void) +{ + // Setup timer_A for hardware delay + TB0CTL = 0; // STOP Timer + TB0CTL = ID__8 +TBSSEL__SMCLK; // Timer_B source:SMCLK ,SMCLK/0 = 20 + TB0CCR0 = 0xc6c; // Load CCR0 with delay... (1ms delay) + TB0CCTL0 &= ~CCIE; +} + +void _hil_BSL_EntrySequence1xx_4xx() +{ + _hil_BSL_EntrySequence(0); +} + +// ----------------------------------------------------------------------------- +void _hil_BSL_EntrySequence(unsigned short dummy) +{ + // set Default state of RST and TST + (*_Jtag.Out) |= _Jtag.TST; + _hil_Delay_1ms(1); + RSTset1(); + + // INIT phase + TSTset0(); + _hil_Delay_1ms(100); + + RSTset0(); // set RST 0 + _hil_Delay_1ms(100); + + TSTset1(); // set test to 1 + _hil_Delay_1ms(100); + + /*this is the first pulse keep it low for less than 15us */ + (*_Jtag.Out) &= ~_Jtag.TST; + _hil_Delay_1us(10); + TSTset1(); // set test 1; + + _hil_Delay_1ms(100); + RSTset1(); // set RST 1; + _hil_Delay_1ms(100); + TSTset0(); // set test 0; + _hil_Delay_1ms(100); +} + +// ----------------------------------------------------------------------------- +void hil_initTimerA0(void) +{ + // Setup time_A0 for timestamping + TA0CTL = MC__STOP; // STOP Timer + TA0CCR0 = 0xFFFF; // TimerA2 Period + TA0CTL = ID__8 + TASSEL__SMCLK; // Timer_A0 source:SMCLK/8 = 25 / 8 = 3.125 MHz = 1/320ns + TA0EX0 = 1; // Timer_A0 set additional divider to /2 + TA0CTL |= TACLR + MC__CONTINOUS + TAIE; // START the timer in free-running mode +} + +// ----------------------------------------------------------------------------- +void hil_initTimerA2(void) +{ + // Setup timer_A2 for current pulse measurement + P2DIR &= ~(1<<2); // P2.2 input + P2SEL |= (1<<2); // Select pin + TA2CTL = MC__STOP; // STOP Timer + TA2CCR0 = 0xFFFF; // TimerA2 Period + TA2CTL = TASSEL__TACLK + MC_2 + TAIE; // Timer_A2 source +} + +// ----------------------------------------------------------------------------- + +static vccSupply_t lastSupply = NO_SUPPLY; + + +#pragma optimize = low +short _hil_Init( void ) +{ + hil_initTimerA0(); // TimeStamp + hil_initTimerA2(); // Current pulse counter + _hil_initTimerB0(); // Delay loop timer + + // Enable Vref=2.5V for ADC + REFCTL0 |= REFMSTR; + REFCTL0 |= REFVSEL1; + REFCTL0 |= REFON; + + // Configure ADC12 + // select channel and do conversion + ADC12CTL0 = ADC12ON + ADC12SHT02; // Turn on ADC12, set sampling time + ADC12CTL1 = ADC12SHP; // Use sampling timer + ADC12MCTL0 = ADC12SREF_1 + 0; // select Vref and analog channel A0 + __delay_cycles((15*90)); + ADC12CTL0 |= ADC12ENC; // Enable conversion + + DMACTL2 = 0; + DMACTL1 = 0; + + //make sure that ET is on + P2DIR |= BIT0; + P2OUT |= BIT0; + + lastSupply = ET_ON; + + // set default debug protocol to JTAG + gprotocol_id = SPYBIWIRE; + // set default to TCLK low when doing PSA + gTclkHighWhilePsa = 0; + // initialize function pointers to distinct functions + _hil_SetProtocol(SPYBIWIRE); + + jtagReleased = 1; + + return 0; +} + +#pragma optimize = low +void _hil_SwitchVccFET(unsigned short switchVccFET) +{ + + if(toolId == eZ_FET_WITH_DCDC_V2x) + { + _DINT_FET(); + vccSupply_t type = (vccSupply_t)switchVccFET; + if(type == ET_ON) + { + P2DIR |= (BIT0|BIT1); + if(lastSupply == LDO_ON) + { + // Switch ET on the power switch + P2OUT |= BIT0; + // Switch LDO off on the power switch + P2OUT &= ~BIT1; + } + else + { + // Switch LDO off on the power switch + P2OUT &= ~BIT1; + // Switch ET on the power switch + P2OUT |= BIT0; + } + //LDO LED OFF + P1DIR &= ~BIT4; + P1OUT &= ~BIT4; + lastSupply = type; + } + else if(type == ALL_OFF) + { + // Turn off the Power switch + P2DIR &= ~(BIT0|BIT1); + P2OUT &= ~(BIT0|BIT1); + + //LED LDO off + P1OUT &= ~BIT4; + _hil_Release(); + lastSupply = type; + } + else if(type == LDO_ON) + { + // Switch LDO on the power switch + P2DIR |= (BIT0|BIT1); + if(lastSupply == ET_ON) + { + // Switch LDO ON on the power switch + P2OUT |= BIT1; + // Switch ET off on the power switch + P2OUT &= ~BIT0; + } + else + { + // Switch LDO ON on the power switch + P2OUT |= BIT1; + // Switch ET off on the power switch + P2OUT &= ~BIT0; + } + //LDO LED ON + P1DIR |= BIT4; + P1OUT |= BIT4; + lastSupply = type; + } + else + { + // Turn off the Power switch + P2DIR &= ~(BIT0|BIT1); + P2OUT &= ~(BIT0|BIT1); + + //LED LDO off + P1OUT &= ~BIT4; + _hil_Release(); + lastSupply = NO_SUPPLY; + } + _EINT_FET(); + } + else + { + if(switchVccFET == LDO_ON || switchVccFET == ET_ON) + { + _hil_SetVcc(3300); + } + else + { + _hil_SetVcc(0); + } + } +} + + +// ----------------------------------------------------------------------------- +short _hil_SetVcc(unsigned short Vcc) +{ + if(Vcc) + { // Turn on the power switch + P2DIR &= ~BIT1; + P2DIR |= BIT0; + P2OUT |= BIT0; + } + else + { // Turn off the Power switch + P2DIR &= ~(BIT0|BIT1); + P2OUT &= ~(BIT0|BIT1); + + _hil_Release(); + } + return 0; +} +// ----------------------------------------------------------------------------- + +// Calculate ExtVcc based on Vref+=2.5V, R27=250kOhm, R28=250kOhm +// Calculate Vcc based on Vref+=2.5V, R29=500kOhm, R30=500kOhm +// Calculate VBus based on Vref+=2.5V, R31=250kOhm, R32=150kOhm + +#define R31 250.0f // 250kOhm +#define R32 150.0f // 150kOhm +short _hil_GetVBus(float* VccVBus) +{ + unsigned short i = 0; + float vbus_mv = 0, vbus_mv0 = 0; + for (i=0; i TEST pin to 0, no change on RST pin + // for 4-wire JTAG clear Test pin + TSTset0(); //5 + + // phase 3 + RSTset0(); //6 + _hil_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for 4-wire JTAG + TSTset1();//7 + _hil_Delay_1us(60); + + // phase 5 + _hil_Delay_1ms(5); +} + +/*-------------RstHigh_JTAG-------------- + ________ __________ +Test ______| |_________| + _______ ______ +Rst____| |_________________| +----------------------------------------*/ + +INLINE(forced) +static void _hil_EntrySequences_RstHigh_JTAG() +{ + TSTset0(); //1 + _hil_Delay_1ms(4); // reset TEST logic + + RSTset1(); //2 + + TSTset1(); //3 + _hil_Delay_1ms(20); // activate TEST logic + + // phase 1 + RSTset0(); //4 + _hil_Delay_1us(60); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for 4-wire JTAG clear Test pin + TSTset0(); //5 + + // phase 3 + _hil_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for 4-wire JTAG + TSTset1();//7 + _hil_Delay_1us(60); + + // phase 5 + RSTset1(); + _hil_Delay_1ms(5); +} + +/*-------------RstHigh_SBW--------------- + ________ __________ +Test ______| |_________| + _________________________________ +Rst____| +----------------------------------------*/ +INLINE(forced) +static void _hil_EntrySequences_RstHigh_SBW() +{ + TSTset0(); //1 + _hil_Delay_1ms(4); // reset TEST logic + + RSTset1(); //2 + + TSTset1(); //3 + _hil_Delay_1ms(20); // activate TEST logic + + // phase 1 + RSTset1(); //4 + _hil_Delay_1us(60); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for Spy-Bi-Wire + _DINT_FET(); + (*_Jtag.Out) &= ~_Jtag.TST; //5 + + // phase 3 + _hil_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for Spy-Bi-Wire + (*_Jtag.Out) |= _Jtag.TST; //7 + _EINT_FET(); + _hil_Delay_1us(60); + + // phase 5 + _hil_Delay_1ms(5); +} + +/*-------------RstLow_SBW---------------- + ________ __________ +Test ______| |_________| + __________________________ +Rst__________| +----------------------------------------*/ +INLINE(forced) +static void _hil_EntrySequences_RstLow_SBW() +{ + TSTset0(); //1 + _hil_Delay_1ms(4); // reset TEST logic + + RSTset0(); //2 + + TSTset1(); //3 + _hil_Delay_1ms(20); // activate TEST logic + + // phase 1 + RSTset1(); //4 + _hil_Delay_1us(60); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for Spy-Bi-Wire + _DINT_FET(); + (*_Jtag.Out) &= ~_Jtag.TST; //5 + + // phase 3 + _hil_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for Spy-Bi-Wire + (*_Jtag.Out) |= _Jtag.TST; //7 + _EINT_FET(); + _hil_Delay_1us(60); + + // phase 5 + _hil_Delay_1ms(5); +} + +void _hil_EntrySequences(unsigned char states) +{ + switch(gprotocol_id) + { + case SPYBIWIRE: + if (states == RSTLOW) + { + _hil_EntrySequences_RstLow_SBW(); + } + if (states == RSTHIGH) + { + _hil_EntrySequences_RstHigh_SBW(); + } + break; + + case SPYBIWIREJTAG: + if (states == RSTLOW) + { + _hil_EntrySequences_RstLow_JTAG(); + } + if (states == RSTHIGH) + { + _hil_EntrySequences_RstHigh_JTAG(); + } + break; + + default: + if (states == RSTLOW) + { + RSTset0(); + TSTset1(); + } + if (states == RSTHIGH) + { + TSTset1(); + } + break; + } +} + +// ----------------------------------------------------------------------------- +static void _hil_Connect(unsigned char state) +{ + if(jtagReleased) + { + _hil_SetProtocol(gprotocol_id); + } + + if(state == RSTHIGH) + { + if(gprotocol_id == SPYBIWIRE) + { + qDriveSbw(); + _hil_Delay_1ms(1); + _hil_EntrySequences_RstHigh_SBW(); + } + else + { + qDriveSbw(); + _hil_Delay_1ms(1); + if(gprotocol_id == SPYBIWIREJTAG) + { + _hil_EntrySequences_RstHigh_JTAG(); + } + else + { + TSTset1(); + } + } + } + else // state == RSTLOW + { + if(gprotocol_id == SPYBIWIRE) + { + qDriveSbw(); + _hil_Delay_1ms(1); + _hil_EntrySequences_RstLow_SBW(); + } + else + { + qDriveSbw(); + _hil_Delay_1ms(1); + if(gprotocol_id == SPYBIWIREJTAG) + { + _hil_EntrySequences_RstLow_JTAG(); + } + else + { + TSTset1(); + } + } + } + jtagReleased = 0; +} + +// ----------------------------------------------------------------------------- +short _hil_Open( unsigned char state) +{ + _hil_Connect(state); + return 0; +} +// ----------------------------------------------------------------------------- +short _hil_Close( void ) +{ + _hil_Release(); + return 0; +} + +// ----------------------------------------------------------------------------- + +void _hil_SetJtagSpeed(unsigned short jtagSpeed, unsigned short sbwSpeed) +{ + if(sbwSpeed) + { + hil_sbw2Speed_ = sbwSpeed; + _hil_2w_ConfigureSpeed_Dma(sbwSpeed); + } +} + +// ----------------------------------------------------------------------------- + +void _hil_ConfigureSetPc (unsigned short PCclockBeforeCapture) +{ + setPCclockBeforeCapture = PCclockBeforeCapture; +} + + +// ----------------------------------------------------------------------------- +void SetVFuse(void) +{ + return; +} + +// ----------------------------------------------------------------------------- +void SetVpp(long voltage) +{ + return; +} + +// ----------------------------------------------------------------------------- +void testVpp(unsigned char mode) +{ + return; +} + + +// ----------------------------------------------------------------------------- +void _hil_SetReset(unsigned char value) +{ + if(value) + { + RSTset1(); + } + else + { + RSTset0(); + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTest(unsigned char value) +{ + if(value) + { + TSTset1(); + } + else + { + TSTset0(); + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTMS(unsigned char value) +{ + //this function is not use +} + +void _hil_SetTCK(unsigned char value) +{ + //this function is not use +} + +void _hil_SetTDI(unsigned char value) +{ + //this function is not use +} +/* EOF */ diff --git a/Bios/src/hil/ez_fet/hilDelays.c b/Bios/src/hil/ez_fet/hilDelays.c new file mode 100644 index 0000000..64b2faa --- /dev/null +++ b/Bios/src/hil/ez_fet/hilDelays.c @@ -0,0 +1,56 @@ +/* + * hilDelays.c + * + * Copyright (C) 2013 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. + */ + +#include "MSP430F5528.h" + +void _hil_Delay_1ms(unsigned short millisec) // inner loop generates 1 ms +{ + unsigned short i; + for(i = millisec; i > 0; i--) + { + TB0CCTL0 &= ~CCIFG; // Clear the interrupt flag + TB0CTL |= TBCLR+ MC__UP; // Timer_A source:SMCLK ,SMCLK/8 = 2.5 MHz + while ((TB0CCTL0 & CCIFG)==0); // Wait until the Timer elapses + TB0CTL &= ~MC__UP; + } +} + +void _hil_Delay_1us(unsigned short microsec_1) // inner loop generates 10 us +{ + while((--microsec_1) > 0) + { + __delay_cycles(15); + } +} diff --git a/Bios/src/hil/ez_fet/hilDelays.h b/Bios/src/hil/ez_fet/hilDelays.h new file mode 100644 index 0000000..1d755bd --- /dev/null +++ b/Bios/src/hil/ez_fet/hilDelays.h @@ -0,0 +1,42 @@ +/* + * hilDelays.h + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHIL +//! \file hilDelays.h +//! \brief +//! + +extern void _hil_Delay_1us(unsigned short usecs); +extern void _hil_Delay_1ms(unsigned short msecs); diff --git a/Bios/src/hil/fet_generic/hil_2w.c b/Bios/src/hil/fet_generic/hil_2w.c new file mode 100644 index 0000000..650fca9 --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_2w.c @@ -0,0 +1,441 @@ +/* + * hil_w2.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHIL +//! \file hil_2w.c +//! \brief +//! + +#include "hw_compiler_specific.h" +//#include "HilGlobalVars.h" +#include "arch.h" +#include "hilDelays.h" +#include "JTAG_defs.h" + +//#define sbwdato _Jtag.RST +//#define sbwclk _Jtag.TST +//#define sbwdati _Jtag.RST + + +//VAR_AT( +unsigned short TCLK_saved;//, HIL_ADDR_VAR_TCLK_SAVED); + +void _hil_2w_Tclk(unsigned char state); + +//! \ingroup MODULHIL +//! \file hil_2w.c +//! \brief +//! + +unsigned char tdo_bit = 0; + +// defined in hil.c +extern void SetVpp(long voltage); +extern void TCLKset1(); +extern void TCLKset0(); + +static struct jtag _Jtag = {0}; + +#define SBW_DELAY { _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP();} + +#pragma inline=forced +void TMSH() +{ + /*_DINT();*/ (*_Jtag.Out) |= _Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TMS = 1 +} + +#pragma inline=forced +void TMSL() +{ + /*_DINT();*/ (*_Jtag.Out) &= ~_Jtag.RST;(*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TMS = 0 +} + +#pragma inline=forced +void TMSLDH() +{ + /*_DINT();*/ (*_Jtag.Out) &= ~_Jtag.RST;(*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.RST; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TMS = 0, then TCLK immediately = 1 +} + +#pragma inline=forced +void TDIH() +{ + /*_DINT();*/ (*_Jtag.Out) |= _Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TDI = 1 +} + +#pragma inline=forced +void TDIL() +{ + /*_DINT();*/ (*_Jtag.Out) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ +} + +#pragma inline=forced +void TDOsbw() +{ + /*_DINT();*/ (*_Jtag.DIRECTION) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; SBW_DELAY;SBW_DELAY;(*_Jtag.DIRECTION) |= _Jtag.RST;/*_EINT();*/ // TDO cycle without reading TDO +} +#pragma inline=forced +void TDO_RD() +{ + /*_DINT();*/ (*_Jtag.DIRECTION) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; tdo_bit = (*_Jtag.In); SBW_DELAY;SBW_DELAY;(*_Jtag.Out) |= _Jtag.TST; ; (*_Jtag.DIRECTION) |= _Jtag.RST; /*_EINT();*/ // TDO cycle with TDO read +} +// 2-wire Spy-Bi-Wire: low level signal access + +#pragma inline=forced +void TMSL_TDIL() { _DINT_FET() ;TMSL(); TDIL(); TDOsbw(); _EINT_FET(); } + +#pragma inline=forced +void TMSH_TDIL() { _DINT_FET(); TMSH(); TDIL(); TDOsbw(); _EINT_FET();} + +#pragma inline=forced +static void TMSL_TDIH() { _DINT_FET(); TMSL(); TDIH(); TDOsbw(); _EINT_FET();} + +#pragma inline=forced +void TMSH_TDIH() { _DINT_FET(); TMSH(); TDIH(); TDOsbw(); _EINT_FET();} + +#pragma inline=forced +void TMSL_TDIH_TDOrd() { _DINT_FET(); TMSL(); TDIH(); TDO_RD(); _EINT_FET();} + +#pragma inline=forced +void TMSL_TDIL_TDOrd() { _DINT_FET(); TMSL(); TDIL(); TDO_RD(); _EINT_FET();} + +#pragma inline=forced +void TMSH_TDIH_TDOrd() { _DINT_FET(); TMSH(); TDIH(); TDO_RD(); _EINT_FET();} + +#pragma inline=forced +void TMSH_TDIL_TDOrd() { _DINT_FET(); TMSH(); TDIL(); TDO_RD(); _EINT_FET();} + +void initJtagSbw2(struct jtag tmp) +{ + _Jtag = tmp; +} +#pragma inline=forced +//#pragma optimize = low +unsigned long long sbw_Shift(unsigned long long Data, short Bits) +{ + unsigned long long TDOvalue = 0x0000000000000000; + unsigned long long MSB = 0x0000000000000000; + + switch(Bits) + { + case F_BYTE: MSB = 0x00000080; + break; + case F_WORD: MSB = 0x00008000; + break; + case F_ADDR: MSB = 0x00080000; + break; + case F_LONG: MSB = 0x80000000; + break; + case F_LONG_LONG: MSB = 0x8000000000000000; + break; + default: // this is an unsupported format, function will just return 0 + return TDOvalue; + } + do + { + if ((MSB & 1) == 1) // Last bit requires TMS=1 + { + if(Data & MSB) + { + TMSH_TDIH_TDOrd(); + } + else + { + TMSH_TDIL_TDOrd(); + } + } + else + { + if(Data & MSB) + { + TMSL_TDIH_TDOrd(); + } + else + { + TMSL_TDIL_TDOrd(); + } + } + TDOvalue <<= 1; // TDO could be any port pin + TDOvalue |= (tdo_bit & _Jtag.RST) > 0; + } + while(MSB >>= 1); + + if (TCLK_saved & _Jtag.RST) + { + TMSH_TDIH(); + TMSL_TDIH(); + } + else + { + TMSH_TDIL(); + TMSL_TDIL(); + } + // de-scramble upper 4 bits if it was a 20bit shift + if(Bits == F_ADDR) + { + TDOvalue = ((TDOvalue >> 4) | (TDOvalue << 16)) & 0x000FFFFF; + } + return(TDOvalue); +} + +// ----------------------------------------------------------------------------- +short _hil_2w_TapReset(void) +{ + unsigned short i; + + // Reset JTAG FSM + for (i = 6; i > 0; i--) // 6 is nominal + { + TMSH_TDIH(); + } + // JTAG FSM is now in Test-Logic-Reset + TMSL_TDIH(); // now in Run/Test Idle + return 0; +} + +unsigned short _hil_2w_EnumChain(void) +{ + return 1; // always return 1, as with Spy-Bi-Wire only one device can be handled +} + +short _hil_2w_CheckJtagFuse(void) +{ + TMSL_TDIH(); + TMSH_TDIH(); + _hil_Delay_1ms(1); + + TMSL_TDIH(); + TMSH_TDIH(); + _hil_Delay_1ms(1); + + TMSL_TDIH(); + TMSH_TDIH(); + _hil_Delay_1ms(1); + // In every TDI slot a TCK for the JTAG machine is generated. + // Thus we need to get TAP in Run/Test Idle state back again. + TMSH_TDIH(); + TMSL_TDIH(); + return 0; +} + +// ----------------------------------------------------------------------------- +unsigned char _hil_2w_Instr(unsigned char Instruction) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSH_TDIH(); + } + else + { + TMSH_TDIL(); + } + // JTAG FSM state = Select DR-Scan + TMSH_TDIH(); + // JTAG FSM state = Select IR-Scan + TMSL_TDIH(); + // JTAG FSM state = Capture-IR + TMSL_TDIH(); + // JTAG FSM state = Shift-IR, Shiftin TDI (8 bit) + + return(sbw_Shift(Instruction,F_BYTE)); // JTAG FSM state = Run-Test/Idle +} +// ----------------------------------------------------------------------------- +unsigned char _hil_2w_SetReg_XBits08(unsigned char Data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSH_TDIH(); + } + else + { + TMSH_TDIL(); + } + // JTAG FSM state = Select DR-Scan + TMSL_TDIH(); + // JTAG FSM state = Capture-DR + TMSL_TDIH(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_Shift(Data, F_BYTE)); + // JTAG FSM state = Run-Test/Idle +} + +unsigned short _hil_2w_SetReg_XBits16(unsigned short Data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSH_TDIH(); + } + else + { + TMSH_TDIL(); + } + // JTAG FSM state = Select DR-Scan + TMSL_TDIH(); + // JTAG FSM state = Capture-DR + TMSL_TDIH(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_Shift(Data, F_WORD)); + // JTAG FSM state = Run-Test/Idle +} + + +unsigned long _hil_2w_SetReg_XBits20(unsigned long Data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSH_TDIH(); + } + else + { + TMSH_TDIL(); + } + // JTAG FSM state = Select DR-Scan + TMSL_TDIH(); + // JTAG FSM state = Capture-DR + TMSL_TDIH(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_Shift(Data, F_ADDR)); + // JTAG FSM state = Run-Test/Idle +} + +unsigned long _hil_2w_SetReg_XBits32(unsigned long Data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSH_TDIH(); + } + else + { + TMSH_TDIL(); + } + // JTAG FSM state = Select DR-Scan + TMSL_TDIH(); + // JTAG FSM state = Capture-DR + TMSL_TDIH(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_Shift(Data, F_LONG)); + // JTAG FSM state = Run-Test/Idle +} + +unsigned long long _hil_2w_SetReg_XBits64(unsigned long long Data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSH_TDIH(); + } + else + { + TMSH_TDIL(); + } + // JTAG FSM state = Select DR-Scan + TMSL_TDIH(); + // JTAG FSM state = Capture-DR + TMSL_TDIH(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_Shift(Data, F_LONG_LONG)); + // JTAG FSM state = Run-Test/Idle +} + +// ----------------------------------------------------------------------------- +void _hil_2w_Tclk(unsigned char state) +{ + _DINT(); + if (TCLK_saved & _Jtag.RST) //PrepTCLK + { + TMSLDH(); + } + else + { + TMSL(); + } + if(state) + { + (*_Jtag.Out) |= _Jtag.RST; + TDIH(); TDOsbw(); //ExitTCLK + TCLK_saved = _Jtag.RST; + } + else + { + (*_Jtag.Out) &= ~_Jtag.RST;// original + TDIL(); TDOsbw(); //ExitTCLK + TCLK_saved = ~_Jtag.RST; + } + _EINT(); +} + +// ----------------------------------------------------------------------------- +void _hil_2w_StepPsa(unsigned long length) +{ + while(length > 0) + { + TCLKset1(); // inverted DF + TCLKset0(); // original + TMSH_TDIH(); + TMSL_TDIH(); + TMSL_TDIH(); + TMSH_TDIH(); + TMSH_TDIH(); + TMSL_TDIH(); + length--; + } +} + +// ----------------------------------------------------------------------------- +void _hil_2w_StepPsaTclkHigh(unsigned long length) +{ + while(length--) + { + TCLKset1(); + TMSH_TDIH(); + TMSL_TDIH(); + TMSL_TDIH(); + TMSH_TDIH(); + TMSH_TDIH(); + TMSL_TDIH(); + TCLKset0(); + } +} + +short _hil_2w_BlowFuse(unsigned char targetHasTestVpp) +{ + + return 1; +} +/* EOF */ diff --git a/Bios/src/hil/fet_generic/hil_2wDma.c b/Bios/src/hil/fet_generic/hil_2wDma.c new file mode 100644 index 0000000..deee515 --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_2wDma.c @@ -0,0 +1,1749 @@ +/* + * hil_2wDma.c + * + * + * + * Copyright (C) 2012 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. + */ + +//! \ingroup MODULHIL +//! \file hil_2wDma.c +//! \brief +//! + +#include "hw_compiler_specific.h" +#include "arch.h" +#include "hilDelays.h" +#include "JTAG_defs.h" + +#ifdef MSP_FET + #include "hilFpgaAccess.h" +#endif + +static struct jtag _Jtag = {0}; +unsigned char tdo_bitDma = 0; + +#ifdef MSP_FET + unsigned short protocol_id = 0; +#endif + +#define SBW_DELAY { _NOP();_NOP();_NOP();/*_NOP();_NOP();_NOP();*/} + +extern void testVpp(unsigned char mode); +extern void setVpp(long voltage); +extern void TCLKset1(); +extern void TCLKset0(); +unsigned long _hil_2w_SetReg_XBits32_Dma(unsigned long data); + +//#pragma inline=forced +#pragma optimize = low +void TMSH_DMA() +{ + /*_DINT();*/ (*_Jtag.Out) |= _Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TMS = 1 +} + +#pragma optimize = low +void TMSL_DMA() +{ + /*_DINT();*/ (*_Jtag.Out) &= ~_Jtag.RST;(*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TMS = 0 +} + +#pragma optimize = low +void TMSLDH_DMA() +{ + /*_DINT();*/ (*_Jtag.Out) &= ~_Jtag.RST;(*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.RST; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TMS = 0, then TCLK immediately = 1 +} + +#pragma optimize = low +void TDIH_DMA() +{ + /*_DINT();*/ (*_Jtag.Out) |= _Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ // TDI = 1 +} + +#pragma optimize = low +void TDIL_DMA() +{ + /*_DINT();*/ (*_Jtag.Out) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; /*_EINT();*/ +} + +#pragma inline=forced +void TDOsbwDma() +{ + _DINT_FET(); (*_Jtag.DIRECTION) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; SBW_DELAY;SBW_DELAY;(*_Jtag.DIRECTION) |= _Jtag.RST;_EINT_FET();// TDO cycle without reading TDO +} +#pragma inline=forced +void TDOsbwFuse() +{ + (*_Jtag.DIRECTION) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; (*_Jtag.Out) |= _Jtag.TST; SBW_DELAY;SBW_DELAY;SBW_DELAY;(*_Jtag.DIRECTION) |= _Jtag.RST;// TDO cycle without reading TDO +} +#pragma inline=forced +void TDO_RD_FUSE() +{ + (*_Jtag.DIRECTION) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; tdo_bitDma = (*_Jtag.In); SBW_DELAY;SBW_DELAY;SBW_DELAY;(*_Jtag.Out) |= _Jtag.TST; ; (*_Jtag.DIRECTION) |= _Jtag.RST; // TDO cycle with TDO read +} +#pragma inline=forced +void TDO_RD_DMA() +{ + _DINT_FET(); (*_Jtag.DIRECTION) &= ~_Jtag.RST; (*_Jtag.Out) &= ~_Jtag.TST; SBW_DELAY; tdo_bitDma = (*_Jtag.In); SBW_DELAY;SBW_DELAY;(*_Jtag.Out) |= _Jtag.TST; ; (*_Jtag.DIRECTION) |= _Jtag.RST; _EINT_FET(); // TDO cycle with TDO read +} + +unsigned char DMA_TMSH_TDIH[84] = {0}; + +unsigned char DMA_TMSH_TDIL[84] = {0}; + +unsigned char DMA_TMSL_TDIH[84] = {0}; + +unsigned char DMA_TMSL_TDIL[84] = {0}; + +unsigned char TCLK_savedDma; +unsigned char current_Instr; +unsigned char prevInstruction; +void _hil_2w_ConfigureSpeed_Dma(unsigned short speed); + + +void initJtagSbw2Dma(struct jtag tmp) +{ + _Jtag = tmp; + TCLK_savedDma =0; + current_Instr = 0; + prevInstruction = 0; + +#ifdef MSP_FET + protocol_id = 0; +#endif +} + +#ifdef MSP_FET +void setProtocolSbw2Dma(unsigned short id) +{ + protocol_id = id; +} +#endif + +unsigned char _hil_2w_GetPrevInstruction_Dma() +{ + return prevInstruction; +} + +#pragma inline=forced +void DMA1sbw(void) +{ + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; // DMA1 FIRE!!! + TDOsbwDma(); +} + +#pragma inline=forced +void DMA2sbw(void) +{ + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; // DMA2 FIRE!!! + TDOsbwDma(); +} + +#pragma inline=forced +void restoreTCLK(void) +{ + if (TCLK_savedDma & _Jtag.RST) + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + DMA1sbw(); + DMA1SA = (unsigned char*) DMA_TMSL_TDIH; + DMA1sbw(); + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + DMA1sbw(); + // TMSL_TDIL is preloaded; + DMA2sbw(); + } +} + +#pragma inline=forced +unsigned long long sbw_ShiftDma(unsigned long long Data, unsigned short Bits) +{ + unsigned long long TDOvalue = 0x0000000000000000; + unsigned long long MSB = 0x0000000000000000; + + switch(Bits) + { + case F_BYTE: MSB = 0x00000080; + break; + case F_WORD: MSB = 0x00008000; + break; + case F_ADDR: MSB = 0x00080000; + break; + case F_LONG: MSB = 0x80000000; + break; + case F_LONG_LONG: MSB = 0x8000000000000000; + break; + default: // this is an unsupported format, function will just return 0 + return TDOvalue; + } + do + { + if (MSB & 1) // Last bit requires TMS=1 + { + if(Data & MSB) + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; // DMA1 FIRE!!! + } + else + { + if(Data & MSB) + { + // TMSL_TDIH is preloaded; + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; // DMA1 FIRE!!! + } + else + { + // TMSL_TDIL is preloaded; + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; // DMA2 FIRE!!! + } + } + TDO_RD_DMA(); + TDOvalue <<= 1; // TDO could be any port pin + TDOvalue |= (tdo_bitDma & _Jtag.RST) > 0; + } + while(MSB >>= 1); + restoreTCLK(); + return(TDOvalue); +} + +// ----------------------------------------------------------------------------- +short _hil_2w_TapReset_Dma(void) +{ + unsigned short i; + + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_enable_bypass(); + } +#endif + + // Reset JTAG FSM + for (i = 0; i < 6; i++) // 6 is nominal + { + // TMSH_TDIH is preloaded + DMA1sbw(); + } + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + DMA1sbw(); + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_disable_bypass(); + } +#endif + return 0; +} + +// ----------------------------------------------------------------------------- +short _hil_2w_CheckJtagFuse_Dma(void) +{ + unsigned short * dma2_tmp = DMA2SA; + + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + DMA2SA = (unsigned char*)DMA_TMSL_TDIH; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_enable_bypass(); + } +#endif + + // TMSL_TDIH is preloaded // now in Run/Test Idle + DMA2sbw(); + // Fuse check + // TMSH_TDIH is preloaded + DMA1sbw(); + // TMSL_TDIH is preloaded + DMA2sbw(); + // TMSH_TDIH is preloaded + DMA1sbw(); + // TMSL_TDIH is preloaded + DMA2sbw(); + // TMSH_TDIH is preloaded + DMA1sbw(); + // In every TDI slot a TCK for the JTAG machine is generated. + // Thus we need to get TAP in Run/Test Idle state back again. + // TMSH_TDIH is preloaded + DMA1sbw(); + // TMSL_TDIH is preloaded + DMA2sbw(); + + DMA2SA = dma2_tmp; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_disable_bypass(); + } +#endif + + return 0; +} + +// ----------------------------------------------------------------------------- +unsigned char _hil_2w_Instr_Dma(unsigned char Instruction) +{ + prevInstruction = Instruction; + + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + DMA1sbw(); + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + DMA1sbw(); + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + + // JTAG FSM state = Select DR-Scan + // TMSH_TDIH loaded in previous if/else + DMA1sbw(); + // JTAG FSM state = Select IR-Scan + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + DMA1sbw(); + // JTAG FSM state = Capture-IR + DMA1sbw(); + // JTAG FSM state = Shift-IR, Shiftin TDI (8 bit) + return sbw_ShiftDma(Instruction,F_BYTE); // JTAG FSM state = Run-Test/Idle +} + + +#pragma inline=forced +void hil_2w_SetReg_XBits8_64_Entry_DMA() +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1sbw(); + + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + // JTAG FSM state = Select DR-Scan + DMA1sbw(); + // JTAG FSM state = Capture-DR + DMA1sbw(); +} + +#pragma inline=forced +void hil_2w_SetReg_XBits8_64_Exit_DMA() +{ + // TMS & TDI slot + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + DMA1sbw(); + restoreTCLK(); +} + +//! \brief This function executes an SBW2 64BIT Data SHIFT (DR-SHIFT) in the case, +//! that the first 8 bits show a valid data capture from the JSTATE register. In case +//! of no valid capture the shift is ended after the first 8 bits. +//! \param[in] Data to be shifted into target device +//! \param[out] Data State - shows state of shifted out data +//! \return Value shifted out of target device JTAG module +#pragma inline=forced +unsigned long long hil_2w_SetReg_XBits8_64_Run_Dma(unsigned long long Data, unsigned char * DataState, unsigned short JStateVersion) +{ + unsigned long long TDOvalue = 0x00000000; + unsigned long long MSB = 0x8000000000000000; + unsigned char currentDeviceState = 0; + + hil_2w_SetReg_XBits8_64_Entry_DMA(); + + do + { + if (MSB & 1) // Last bit requires TMS=1 + { + if(Data & MSB) + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; // DMA1 FIRE!!! + } + else + { + if(Data & MSB) + { + // TMSL_TDIH is preloaded; + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; // DMA1 FIRE!!! + } + else + { + // TMSL_TDIL is preloaded; + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; // DMA2 FIRE!!! + } + } + TDO_RD_DMA(); + TDOvalue <<= 1; // TDO could be any port pin + TDOvalue |= (tdo_bitDma & _Jtag.RST) > 0; + + // first 8 bits have been shifted out now go and evaluate it + if(MSB & EIGHT_JSTATE_BITS) + { + // Mask out all not needed bits for device state detection + currentDeviceState = TDOvalue & JSTATE_FLOW_CONTROL_BITS; + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56, ] & 0x4 (BP_HIT) == TRUE + if(currentDeviceState & JSTATE_BP_HIT) + { + // exit DR shift state + hil_2w_SetReg_XBits8_64_Exit_DMA(); + // reload Jstate IR + _hil_2w_Instr_Dma(IR_JSTATE_ID); + + *DataState = VALID_DATA; + // retrun BP_HIT BIT + return(TDOvalue << 56); + } + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56] (AM Sync. ongoing) == 0x83 + else if(currentDeviceState == JSTATE_SYNC_ONGOING) + { + // exit DR shift state + hil_2w_SetReg_XBits8_64_Exit_DMA(); + + *DataState = SYNC_ONGOING; + return 0; + } + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] & 0x40 (Locked State) == 0x40 + else if((currentDeviceState & JSTATE_LOCKED_STATE) == JSTATE_LOCKED_STATE && + (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE) + { + // exit DR shift state + hil_2w_SetReg_XBits8_64_Exit_DMA(); + *DataState = JTAG_LOCKED; + return(TDOvalue << 56); + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] ( Invalid LPM) == 0x81) + else if(currentDeviceState == JSTATE_INVALID_STATE) + { + // exit DR shift state + hil_2w_SetReg_XBits8_64_Exit_DMA(); + // reload Jstate IR + _hil_2w_Instr_Dma(IR_JSTATE_ID); + + *DataState = INVALID_DATA; + return 0; + } + /*PG2.0 && PG2.1 frozen Sync detection*/ + else if (((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK_PGACT) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_PGACT)) + { + hil_2w_SetReg_XBits8_64_Exit_DMA(); + + if(JStateVersion >= 0x21) + { + *DataState = SYNC_BROKEN; + return(0); + } + else // PG2.0 + { + *DataState = VALID_DATA; + return(TDOvalue << 56); + } + } + // device is not in LPMx or AC read out mode just restart the shift but do not reload the JState IR + else if(currentDeviceState != JSTATE_VALID_CAPTURE + && (currentDeviceState != JSTATE_LPM_ONE_TWO) + && (currentDeviceState != JSTATE_LPM_THREE_FOUR) + && ((currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE)) + { + // exit DR shift state + hil_2w_SetReg_XBits8_64_Exit_DMA(); + *DataState = INVALID_DATA; + return 0; + } + /* + else + { + do not break, continue shift of valid data + } + */ + } + + } + while(MSB >>= 1); + restoreTCLK(); + + if( currentDeviceState == JSTATE_LPM_ONE_TWO + || currentDeviceState == JSTATE_LPM_THREE_FOUR + || currentDeviceState == 0x00 + || currentDeviceState == 0x02) + { + // reload Jstate IR + _hil_2w_Instr_Dma(IR_JSTATE_ID); + } + + *DataState = VALID_DATA; + return(TDOvalue); +} + +//! \brief This function executes an SBW2 64BIT Data SHIFT (DR-SHIFT) in the case, +//! that the first 8 bits show a valid data capture from the JSTATE register. In case +//! of no valid capture the shift is ended after the first 8 bits. Timeout could be +//! used to set the function run count. +//! \param[in] Data to be shifted into target device +//! \return Value shifted out of target device JTAG module +unsigned long long _hil_2w_SetReg_XBits8_64_Dma(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion) +{ + unsigned long long TDOvalue = 0x00000000; + unsigned short timeout = loopCount, syncBorkenCount = loopCount/2; + unsigned char DataState = 0; + do + { + TDOvalue = hil_2w_SetReg_XBits8_64_Run_Dma(Data, &DataState, JStateVersion); + if(!timeout) + { + return TDOvalue; + } + timeout--; + + if(DataState == SYNC_BROKEN && syncBorkenCount > 0) + { + syncBorkenCount--; + if(JStateVersion >= 0x21) + { // Only working for PG2.1, do not harm if executed on PG2.0 – but will not create any effect only consume time + unsigned long current3VtestReg = 0; + + // read current 3VtestReg value + _hil_2w_Instr_Dma(IR_TEST_REG); + current3VtestReg = _hil_2w_SetReg_XBits32_Dma(0); + // set bit 25 high to rest sync + current3VtestReg |= 0x2000000; + _hil_2w_SetReg_XBits32_Dma(current3VtestReg); + // set bit 25 low reset sync done + current3VtestReg &= ~0x2000000; + _hil_2w_SetReg_XBits32_Dma(current3VtestReg); + _hil_2w_Instr_Dma(IR_JSTATE_ID); + + } + else + { + return(TDOvalue); + } + } + } + while(DataState == INVALID_DATA || DataState == SYNC_ONGOING); + return(TDOvalue); +} + +unsigned char _hil_2w_SetReg_XBits08_Dma(unsigned char data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1sbw(); + + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + // JTAG FSM state = Select DR-Scan + DMA1sbw(); + // JTAG FSM state = Capture-DR + DMA1sbw(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_ShiftDma(data,F_BYTE)); + // JTAG FSM state = Run-Test/Idle +} + + + +unsigned short _hil_2w_SetReg_XBits16_Dma(unsigned short data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1sbw(); + + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + // JTAG FSM state = Select DR-Scan + DMA1sbw(); + // JTAG FSM state = Capture-DR + DMA1sbw(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + return (sbw_ShiftDma(data,F_WORD)); + // JTAG FSM state = Run-Test/Idle +} + + + +unsigned long _hil_2w_SetReg_XBits20_Dma(unsigned long data) +{ + unsigned long tmp; + + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1sbw(); + + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + // JTAG FSM state = Select DR-Scan + DMA1sbw(); + // JTAG FSM state = Capture-DR + DMA1sbw(); + // JTAG FSM state = Shift-DR, Shiftin TDI (16 bit) + // de-scramble upper 4 bits if it was a 20bit shift + tmp = sbw_ShiftDma(data, F_ADDR); + tmp = ((tmp >> 4) | (tmp << 16)) & 0x000FFFFF; + return (tmp); + // JTAG FSM state = Run-Test/Idle +} + + + +unsigned long _hil_2w_SetReg_XBits32_Dma(unsigned long data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1sbw(); + + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + // JTAG FSM state = Select DR-Scan + DMA1sbw(); + // JTAG FSM state = Capture-DR + DMA1sbw(); + // JTAG FSM state = Shift-DR, Shiftin TDI (32 bit) + return (sbw_ShiftDma(data, F_LONG)); + // JTAG FSM state = Run-Test/Idle +} + + +unsigned long long _hil_2w_SetReg_XBits64_Dma(unsigned long long data) +{ + // JTAG FSM state = Run-Test/Idle + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + } + else + { + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + } + DMA1sbw(); + + DMA1SA = (unsigned char*)DMA_TMSL_TDIH; + // JTAG FSM state = Select DR-Scan + DMA1sbw(); + // JTAG FSM state = Capture-DR + DMA1sbw(); + // JTAG FSM state = Shift-DR, Shiftin TDI 64 bit) + return (sbw_ShiftDma(data, F_LONG_LONG)); + // JTAG FSM state = Run-Test/Idle +} + + +//#pragma optimize = low +// ----------------------------------------------------------------------------- +void _hil_2w_Tclk_Dma(unsigned char state) +{ + _DINT_FET(); + if (TCLK_savedDma & _Jtag.RST) //PrepTCLK + { + TMSLDH_DMA(); + } + else + { + TMSL_DMA(); + } + + if(state) + { + (*_Jtag.Out) |= _Jtag.RST; + TDIH_DMA(); TDOsbwDma(); // ExitTCLK + TCLK_savedDma = _Jtag.RST; + } + else + { + (*_Jtag.Out) &= ~_Jtag.RST;// original + TDIL_DMA(); TDOsbwDma(); // ExitTCLK + TCLK_savedDma = ~_Jtag.RST; + } + _EINT_FET(); +} + +// ----------------------------------------------------------------------------- +void _hil_2w_StepPsa_Dma_Xv2(unsigned long length) +{ + unsigned short * dma2_tmp = DMA2SA; + + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + DMA2SA = (unsigned char*)DMA_TMSL_TDIL; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_enable_bypass(); + } +#endif + + while(length--) + { + _hil_2w_Tclk_Dma(0); + // TMSH_TDIL preloaded + DMA1sbw(); + // TMSL_TDIL preloaded + DMA2sbw(); + // TMSL_TDIL preloaded + DMA2sbw(); + // TMSH_TDIL preloaded + DMA1sbw(); + // TMSH_TDIL preloaded + DMA1sbw(); + // TMSL_TDIL preloaded + DMA2sbw(); + _hil_2w_Tclk_Dma(1); + } + + // Restore the prvious DMA2SA value + DMA2SA = dma2_tmp; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_disable_bypass(); + } +#endif +} + +// ----------------------------------------------------------------------------- +void _hil_2w_StepPsa_Dma(unsigned long length) +{ + unsigned short * dma2_tmp = DMA2SA; + + DMA1SA = (unsigned char*)DMA_TMSH_TDIL; + DMA2SA = (unsigned char*)DMA_TMSL_TDIL; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_enable_bypass(); + } +#endif + while(length--) + { + _hil_2w_Tclk_Dma(1); + _hil_2w_Tclk_Dma(0); + // TMSH_TDIH preloaded + DMA1sbw(); + // TMSL_TDIH preloaded + DMA2sbw(); + // TMSL_TDIH preloaded + DMA2sbw(); + // TMSH_TDIH preloaded + DMA1sbw(); + // TMSH_TDIH preloaded + DMA1sbw(); + // TMSL_TDIH preloaded + DMA2sbw(); + } + // Restore the prvious DMA2SA value + DMA2SA = dma2_tmp; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_disable_bypass(); + } +#endif +} + +// ----------------------------------------------------------------------------- +void _hil_2w_StepPsaTclkHigh_Dma(unsigned long length) +{ + unsigned short * dma2_tmp = DMA2SA; + + DMA1SA = (unsigned char*)DMA_TMSH_TDIH; + DMA2SA = (unsigned char*)DMA_TMSL_TDIH; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_enable_bypass(); + } +#endif + + while(length--) + { + _hil_2w_Tclk_Dma(1); + // TMSH_TDIH preloaded + DMA1sbw(); + // TMSL_TDIH preloaded + DMA2sbw(); + // TMSL_TDIH preloaded + DMA2sbw(); + // TMSH_TDIH preloaded + DMA1sbw(); + // TMSH_TDIH preloaded + DMA1sbw(); + // TMSL_TDIH preloaded + DMA2sbw(); + _hil_2w_Tclk_Dma(0); + } + + // Restore the prvious DMA2SA value + DMA2SA = dma2_tmp; + +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + hil_fpga_disable_bypass(); + } +#endif +} + +void _hil_2w_ConfigureSpeed_Dma(unsigned short speed) +{ + switch(speed) + { //---------------------------------------------------------------------- + case SBW600KHz: // fastes SBW2 speed + { + DMA1SZ = 8; // load DMA1 with size + DMA2SZ = 8; // load DMA1 with size + DMA_TMSH_TDIH[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[2] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIH[4] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[5] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[6] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[7] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[2] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[4] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[5] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[6] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[7] = /*TDI Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[2] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[3] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[4] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[5] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[6] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[7] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSL_TDIL[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[2] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[3] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIL[4] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[5] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[6] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[7] = /*TDI Slot*/ _Jtag.TST; + break; + }//--------------------------------------------------------------------- + case SBW400KHz: // fastes SBW2 speed + { + DMA1SZ = 24; // load DMA1 with size + DMA2SZ = 24; // load DMA1 with size + + DMA_TMSH_TDIH[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[2] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[4] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[5] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[6] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[7] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[8] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[9] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[10] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[11] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIH[12] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[13] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[14] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[15] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[16] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[17] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[18] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[19] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[20] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[21] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[22] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[23] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[2] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[4] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[5] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[6] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[7] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[8] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[9] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[10] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[11] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[12] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[13] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[14] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[15] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[16] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[17] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[18] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[19] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[20] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[21] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[22] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[23] = /*TDI Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[2] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[3] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[4] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[5] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[6] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[7] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[8] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[9] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[10] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[11] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[12] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[13] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[14] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[15] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[16] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[17] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[18] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[19] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[20] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[21] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[22] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[23] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSL_TDIL[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[2] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[3] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[4] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[5] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[6] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[7] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[8] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[9] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[10] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[11] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIL[12] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[13] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[14] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[15] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[16] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[17] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[18] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[19] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[20] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[21] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[22] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[23] = /*TDI Slot*/ _Jtag.TST; + break; + }//--------------------------------------------------------------------- + case SBW200KHz: // fastes SBW2 speed + {//--------------------------------------------------------------------- + DMA1SZ = 48; // load DMA1 with size + DMA2SZ = 48; // load DMA1 with size + + DMA_TMSH_TDIH[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[2] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[4] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[5] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[6] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[7] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[8] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[9] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[10] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[11] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[12] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[13] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[14] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[15] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[16] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[17] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[18] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[19] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[20] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[21] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[22] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[23] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIH[24] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[25] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[26] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[27] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[28] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[29] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[30] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[31] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[32] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[33] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[34] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[35] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[36] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[37] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[38] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[39] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[40] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[41] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[42] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[43] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[44] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[45] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[46] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[47] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[2] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[4] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[5] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[6] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[7] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[8] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[9] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[10] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[11] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[12] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[13] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[14] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[15] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[16] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[17] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[18] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[19] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[20] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[21] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[22] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[23] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[24] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[25] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[26] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[27] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[28] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[29] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[30] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[31] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[32] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[33] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[34] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[35] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[36] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[37] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[38] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[39] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[40] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[41] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[42] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[43] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[44] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[45] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[46] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[47] = /*TDI Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[2] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[3] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[4] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[5] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[6] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[7] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[8] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[9] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[10] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[11] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[12] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[13] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[14] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[15] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[16] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[17] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[18] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[19] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[20] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[21] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[22] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[23] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[24] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[25] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[26] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[27] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[28] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[29] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[30] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[31] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[32] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[33] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[34] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[35] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[36] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[37] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[38] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[39] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[40] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[41] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[42] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[43] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[44] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[45] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[46] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[47] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSL_TDIL[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[2] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[3] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[4] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[5] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[6] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[7] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[8] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[9] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[10] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[11] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[12] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[13] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[14] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[15] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[16] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[17] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[18]= /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[19] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[20] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[21] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[22] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[23] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIL[24] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[25] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[26] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[27] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[28] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[29] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[30] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[31] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[32] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[33] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[34] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[35] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[36] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[37] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[38] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[39] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[40] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[41] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[42] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[43] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[44] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[45] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[46] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[47] = /*TDI Slot*/ _Jtag.TST; + break; + }//--------------------------------------------------------------------- + case SBW100KHz: // fastes SBW2 speed + {//--------------------------------------------------------------------- + DMA1SZ = 84; // load DMA1 with size + DMA2SZ = 84; // load DMA1 with size + + DMA_TMSH_TDIH[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[2] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[4] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[5] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[6] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[7] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[8] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[9] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[10] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[11] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[12] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[13] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[14] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[15] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[16] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[17] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[18] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[19] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[20] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[21] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[22] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[23] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[24] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[25] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[26] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[27] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[28] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[29] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[30] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[31] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[32] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[33] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[34] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[35] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[36] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[37] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[38] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[39] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[40] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[41] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIH[42] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[43] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[44] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[45] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[46] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[47] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[48] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[49] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[50] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[51] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[52] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[53] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[54] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[55] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[56] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[57] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[58] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[59] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[60] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[61] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[62] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[63] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[64] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[65] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[66] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[67] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[68] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[69] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[70] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[71] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[72] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[73] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[74] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[75] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[76] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[77] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[78] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[79] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[80] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[81] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[82] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[83] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[2] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[4] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[5] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[6] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[7] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[8] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[9] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[10] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[11] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[12] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[13] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[14] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[15] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[16] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[17] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[18] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[19] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[20] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[21] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[22] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[23] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[24] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[25] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[26] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[27] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[28] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[29] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[30] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[31] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[32] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[33] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[34] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[35] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[36] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[37] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[38] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[39] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[40] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[41] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[42] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[43] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[44] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[45] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[46] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[47] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[48] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[49] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[50] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[51] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[52] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[53] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[54] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[55] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[56] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[57] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[58] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[59] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[60] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[61] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[62] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[63] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[64] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[65] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[66] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[67] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[68] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[69] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[70] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[71] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[72] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[73] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[74] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[75] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[76] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[77] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[78] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[79] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[80] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[81] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[82] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[83] = /*TDI Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[2] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[3] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[4] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[5] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[6] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[7] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[8] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[9] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[10] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[11] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[12] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[13] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[14] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[15] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[16] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[17] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[18] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[19] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[20] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[21] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[22] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[23] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[24] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[25] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[26] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[27] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[28] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[29] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[30] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[31] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[32] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[33] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[34] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[35] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[36] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[37] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[38] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[39] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[40] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[41] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[42] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[43] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[44] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[45] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[46] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[47] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[48] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[49] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[50] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[51] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[52] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[53] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[54] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[55] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[56] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[57] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[58] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[59] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[60] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[61] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[62] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[63] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[64] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[65] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[66] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[67] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[68] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[69] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[70] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[71] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[72] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[73] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[74] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[75] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[76] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[77] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[78] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[79] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[80] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[81] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[82] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[83] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSL_TDIL[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[2] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[3] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[4] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[5] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[6] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[7] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[8] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[9] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[10] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[11] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[12] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[13] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[14] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[15] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[16] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[17] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[18] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[19] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[20] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[21] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[22] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[23] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[24] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[25] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[26] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[27] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[28]= /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[29] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[30] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[31] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[32] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[33] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[34] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[35] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[36]= /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[37] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[38] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[39] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[40] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[41] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIL[42] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[43] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[44] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[45] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[46] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[47] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[48] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[49] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[50] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[51] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[52] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[53] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[54] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[55] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[56] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[57] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[58] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[59] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[60] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[61] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[62] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[63] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[64] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[65] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[66] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[67] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[68] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[69] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[70] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[71] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[72] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[73] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[74] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[75] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[76] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[77] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[78] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[79] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[80] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[81] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[82] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[83] = /*TDI Slot*/ _Jtag.TST; + break; + }//--------------------------------------------------------------------- + default:// fastes SBW2 speed + { + DMA1SZ = 8; // load DMA1 with size + DMA2SZ = 8; // load DMA1 with size + DMA_TMSH_TDIH[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[2] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIH[4] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[5] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIH[6] = /*TDI Slot*/ _Jtag.RST; + DMA_TMSH_TDIH[7] = /*TDI Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[0] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[1] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSH_TDIL[2] = /*TMS Slot*/ _Jtag.RST; + DMA_TMSH_TDIL[3] = /*TMS Slot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSH_TDIL[4] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[5] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSH_TDIL[6] = /*TDI Slot*/ 0; + DMA_TMSH_TDIL[7] = /*TDI Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIH[2] = /*TMS Slot*/ 0; + DMA_TMSL_TDIH[3] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIH[4] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[5] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + DMA_TMSL_TDIH[6] = /*TDI SLot*/ _Jtag.RST; + DMA_TMSL_TDIH[7] = /*TDI SLot*/ _Jtag.RST|_Jtag.TST; + + DMA_TMSL_TDIL[0] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[1] = /*TMS Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[2] = /*TMS Slot*/ 0; + DMA_TMSL_TDIL[3] = /*TMS Slot*/ _Jtag.TST; + + DMA_TMSL_TDIL[4] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[5] = /*TDI Slot*/ _Jtag.TST; + DMA_TMSL_TDIL[6] = /*TDI Slot*/ 0; + DMA_TMSL_TDIL[7] = /*TDI Slot*/ _Jtag.TST; + break; + }//--------------------------------------------------------------------- + } +} + +#ifdef MSP_FET +extern unsigned char _hil_generic_Instr(unsigned char Instruction); +extern unsigned char _hil_generic_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_generic_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_generic_SetReg_XBits20(unsigned long Data); +extern unsigned long _hil_generic_SetReg_XBits32(unsigned long Data); + +extern unsigned char lastTestState; +extern unsigned char lastResetState; +extern short _hil_SetVcc(unsigned short Vcc); + +#endif + +#pragma optimize = medium +// ----------------------------------------------------------------------------- +short _hil_2w_BlowFuse_Dma(unsigned char targetHasTestVpp) +{ +#ifdef MSP_FET + if (protocol_id != SPYBIWIRE_SUBMCU) + { + unsigned char MSB = 0x80;; + unsigned char Data = IR_EX_BLOW, i = 0; + + //_hil_SetVcc(2500); + _hil_generic_Instr(IR_PREPARE_BLOW); + + _DINT_FET(); + lastResetState = 1; + lastTestState = 1; + hil_fpga_enable_bypass(); + + // JTAG FSM state = Run-Test/Idle + TMSH_DMA(); TDIH_DMA(); TDOsbwFuse(); + + // JTAG FSM state = Select DR-Scan + TMSH_DMA(); TDIH_DMA(); TDOsbwFuse(); + + // JTAG FSM state = Select IR-Scan + TMSL_DMA(); TDIH_DMA(); TDOsbwFuse(); + + // JTAG FSM state = Capture-IR + TMSL_DMA(); TDIH_DMA(); TDOsbwFuse(); + + for (i = 8; i > 1; i--) + { + if((Data & MSB) == 0) + { + TMSL_DMA(); TDIL_DMA(); TDO_RD_FUSE(); + } + else + { + TMSL_DMA(); TDIH_DMA(); TDO_RD_FUSE(); + } + Data <<= 1; + } + // last bit requires TMS=1; TDO one bit before TDI + if((Data & MSB) == 0) + { + TMSH_DMA(); TDIL_DMA(); TDO_RD_FUSE(); + } + else + { + TMSH_DMA(); TDIH_DMA(); TDO_RD_FUSE(); + } + // SBWTDIO must be low on exit! + TMSH_DMA(); TDIL_DMA(); TDOsbwFuse(); + + TMSL_DMA(); TDIL_DMA(); TDOsbwFuse(); + // instruction shift done! + + // After the IR_EX_BLOW instruction is shifted in via SBW, one more TMS_SLOT must be performed + // create TMSL slot + + (*_Jtag.Out) &= ~_Jtag.RST; + SBW_DELAY; SBW_DELAY; + SBW_DELAY; SBW_DELAY; + + (*_Jtag.Out) &= ~_Jtag.TST; + SBW_DELAY; SBW_DELAY; + SBW_DELAY; SBW_DELAY; + + (*_Jtag.Out) |= _Jtag.TST; + _hil_Delay_1ms(1); + + // Apply fuse blow voltage + setVpp(1); + + // Taking SBWTDIO high as soon as Vpp has been settled blows the fuse + (*_Jtag.Out) |= _Jtag.RST; + + _hil_Delay_1ms(1); + + setVpp(0); // switch VPP off + + hil_fpga_disable_bypass(); + + // now perform a BOR via JTAG - we loose control of the device then... + _hil_generic_Instr(IR_TEST_REG); + _hil_generic_SetReg_XBits32(0x00000200); + + _EINT_FET(); + } +#endif + // not suppored by eZ-FET + return 0; +} +/* EOF */ diff --git a/Bios/src/hil/fet_generic/hil_4w.c b/Bios/src/hil/fet_generic/hil_4w.c new file mode 100644 index 0000000..b62846b --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_4w.c @@ -0,0 +1,330 @@ +/* + * hil_4w.c + * + * + * + * Copyright (C) 2012 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. + */ +//! \ingroup MODULHIL +//! \file hil_4w.c +//! \brief +//! + +#include "hw_compiler_specific.h" +#include "arch.h" +#include "hilDelays.h" +#include "JTAG_defs.h" +#include "hilFpgaAccess.h" + + + +//! \ingroup MODULHIL +//! \file hil_4w.c +//! \brief +//! + +#define uController_uif + +extern void TCLKset1(); +extern void TCLKset0(); + +extern void testVpp(unsigned char mode); +extern void setVpp(long voltage); + +static struct jtag _Jtag = {0}; +//#define JTAG_DELAY { _NOP();} +void _hil_4w_Tclk(unsigned char state); + +// 4-wire JTAG: low level signal access +#pragma inline=forced +void TMSset1() +{ (*_Jtag.Out) |= _Jtag.TMS;} + +#pragma inline=forced +void TMSset0() +{ (*_Jtag.Out) &= ~_Jtag.TMS;} + +#pragma inline=forced +void TDIset1() +{ (*_Jtag.Out) |= _Jtag.TDI;} + +#pragma inline=forced +void TDIset0() +{ (*_Jtag.Out) &= ~_Jtag.TDI;} + +#pragma inline=forced +void TCKset1() +{ (*_Jtag.Out) |= _Jtag.TCK;} + +#pragma inline=forced +static void TCKset0() +{ (*_Jtag.Out) &= ~_Jtag.TCK;} + +#pragma inline=forced +void TDIset1TMSset1() +{ (*_Jtag.Out) |= _Jtag.TDI | _Jtag.TMS; } + +#pragma inline=forced +void TDIset0TMSset1() +{ (*_Jtag.Out) &= ~_Jtag.TDI; *_Jtag.Out |= _Jtag.TMS;} + +#pragma inline=forced +unsigned char StoreTTDI() +{ + return *_Jtag.Out; +} +#pragma inline=forced +void RestoreTTDI(unsigned long long x) +{ + if(x &_Jtag.TDI) + { + *_Jtag.Out |= _Jtag.TDI; + //JTAG_DELAY; + } + else + { + *_Jtag.Out &= ~_Jtag.TDI; + } +} +#pragma inline=forced +unsigned char ScanTDO() +{ + if((*_Jtag.In & _Jtag.TDO)!= 0) + { + return 1; + } + else + { + return 0; + } +} + +void initJtagSbw4(struct jtag tmp) +{ + _Jtag = tmp; +} + + +// ----------------------------------------------------------------------------- +short _hil_4w_CheckJtagFuse(void) +{ + // perform a JTAG fuse check + hil_fpga_enable_bypass(); + TMSset1();_NOP();_NOP();_NOP(); + TMSset0();_NOP();_NOP();_NOP(); + _hil_Delay_1us(15); + TMSset1();_NOP();_NOP();_NOP(); + TMSset0();_NOP();_NOP();_NOP(); + _hil_Delay_1us(15); + TMSset1();_NOP();_NOP();_NOP(); + hil_fpga_disable_bypass(); + return 0; +} + +// ----------------------------------------------------------------------------- +short _hil_4w_TapReset(void) +{ + // Reset TAP Controller State Machine + // Set default state for JTAG signals (TDI = TMS = TCK = 1) + hil_fpga_enable_bypass(); + TDIset1(); _NOP(); _NOP();_NOP(); + TMSset1(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + // Clock TCK six (6) times + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + // TAP Controller State Machine is now in "Test-Logic Reset" state + // Clock TCK one more time with TMS = 0 + TMSset0(); _NOP(); _NOP();_NOP(); + TCKset0(); _NOP(); _NOP();_NOP(); + TCKset1(); _NOP(); _NOP();_NOP(); + hil_fpga_disable_bypass(); + return 0; +} + +// ----------------------------------------------------------------------------- +void _hil_4w_StepPsa(unsigned long length) +{ + hil_fpga_enable_bypass(); + + while(length-- > 0) + { + TDIset1(); _NOP(); + TDIset0(); _NOP(); + + TCKset0(); _NOP(); + TMSset1(); _NOP(); + TCKset1(); _NOP(); // select DR scan + TCKset0(); _NOP(); + TMSset0(); _NOP(); + + TCKset1(); _NOP(); // capture DR + TCKset0(); _NOP(); + TCKset1(); _NOP(); // shift DR + TCKset0(); _NOP(); + + TMSset1(); _NOP(); + TCKset1(); _NOP();// exit DR + TCKset0(); _NOP(); + + // Set JTAG FSM back into Run-Test/Idle + TCKset1(); _NOP(); + TMSset0(); _NOP(); + TCKset0(); _NOP(); + TCKset1(); _NOP(); + _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); + } + hil_fpga_disable_bypass(); +} +// ----------------------------------------------------------------------------- +void _hil_4w_StepPsaTclkHigh(unsigned long length) +{ + hil_fpga_enable_bypass(); + + while(length--) + { + //TCLKset1(); _NOP(); + TDIset1(); _NOP(); + TCKset0(); _NOP(); + TMSset1(); _NOP(); + TCKset1(); _NOP();// select DR scan + TCKset0(); _NOP(); + TMSset0(); _NOP(); + + TCKset1(); _NOP();// capture DR + TCKset0(); _NOP(); + TCKset1(); _NOP();// shift DR + TCKset0(); _NOP(); + + TMSset1(); _NOP(); + TCKset1(); _NOP(); // exit DR + TCKset0(); _NOP(); + + // Set JTAG FSM back into Run-Test/Idle + TCKset1(); _NOP(); + TMSset0(); _NOP(); + TCKset0(); _NOP(); + TCKset1(); _NOP(); + _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); + //TCLKset0(); _NOP(); + TDIset0(); _NOP(); + } + hil_fpga_disable_bypass(); +} + +// ----------------------------------------------------------------------------- +extern unsigned char _hil_generic_Instr(unsigned char Instruction); +extern unsigned char _hil_generic_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_generic_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_generic_SetReg_XBits20(unsigned long Data); +extern unsigned long _hil_generic_SetReg_XBits32(unsigned long Data); + +extern unsigned char lastTestState; +extern unsigned char lastResetState; + + +short _hil_4w_BlowFuse(unsigned char targetHasTestVpp) +{ +#ifdef MSP_FET + + _DINT_FET(); + if(!targetHasTestVpp) + { + _hil_generic_Instr(IR_CNTRL_SIG_16BIT); + _hil_generic_SetReg_XBits16(0x7401); // TDOs get TDI functionality (internal) + testVpp(0); // Switchs also TDO functionality to TDI. + } + _hil_generic_Instr(IR_PREPARE_BLOW); // initialize fuse blowing + _hil_Delay_1ms(1); + + lastResetState = 1; + lastTestState = 1; + + hil_fpga_enable_bypass(); + setVpp(1); // Apply fuse blow voltage + hil_fpga_disable_bypass(); + + _hil_generic_Instr(IR_EX_BLOW); // execute fuse blowing + _hil_Delay_1ms(1); + setVpp(0); // switch VPP off + + testVpp(1); // Restore the normal function of TDO and TDI + + // now perform a BOR via JTAG - we loose control of the device then... + _hil_generic_Instr(IR_TEST_REG); + _hil_generic_SetReg_XBits32(0x00000200); + _EINT_FET(); +#endif + + return 0; +} + +void hil_4w_432_Seq(unsigned short length, unsigned char *sequence) +{ + unsigned char dataptr = 0; + unsigned short n = 0; + while (length--) + { + if (n == 0) + { + dataptr = *sequence++; + n = 8; + } + if (dataptr & 1) + { + (*_Jtag.Out) |= _Jtag.TMS; + TCKset0(); + _NOP(); + TCKset1(); + } + else + { + (*_Jtag.Out) &= ~_Jtag.TMS; + TCKset0(); + _NOP(); + TCKset1(); + } + dataptr >>= 1; + n--; + } +} + diff --git a/Bios/src/hil/fet_generic/hil_4w_ezFET.c b/Bios/src/hil/fet_generic/hil_4w_ezFET.c new file mode 100644 index 0000000..962ca80 --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_4w_ezFET.c @@ -0,0 +1,470 @@ +/* + * hil_4w_ezFET.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHIL +//! \file hil_4w_ezFET.c +//! \brief +//! + +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "arch.h" +#include "edt.h" +#include + +#include "stream.h" + +extern struct jtag _Jtag; + +#define Invalid_Manufactor_IdCode 0x000000FEul +#define Mask_Manufactor_IdCode 0x000000FEul + +#define StoreTCLK() (*_Jtag.Out) +#define RestoreTCLK(x) (x & _Jtag.TDI ? (*_Jtag.Out |= _Jtag.TDI) : (*_Jtag.Out &= ~_Jtag.TDI)) +#define ScanTDO() ((*_Jtag.In & _Jtag.TDO) ? 1 : 0) + +///< Debug and trace functionality +extern char traceBuffer[256]; + +// ----------------------------------------------------------------------------- +short _hil_4w_ezFET_CheckJtagFuse(void) +{ + // perform a JTAG fuse check + TMSset1; + TMSset0; + EDT_Delay_1us(5); + TMSset1; + TMSset0; + EDT_Delay_1us(5); + TMSset1; + return 0; +} + +// ----------------------------------------------------------------------------- +short _hil_4w_ezFET_TapReset(void) +{ + // Reset TAP Controller State Machine + // Set default state for JTAG signals (TDI = TMS = TCK = 1) + TDIset1; + TMSset1; + TCKset1; + // Clock TCK six (6) times + TCKset0; + TCKset1; + TCKset0; + TCKset1; + TCKset0; + TCKset1; + TCKset0; + TCKset1; + TCKset0; + TCKset1; + TCKset0; + TCKset1; + // TAP Controller State Machine is now in "Test-Logic Reset" state + // Clock TCK one more time with TMS = 0 + TMSset0; + TCKset0; + TCKset1; + return 0; +} + +unsigned short _hil_4w_ezFET_EnumChain(void) +{ +/* unsigned long TDOval = 0x00000000; // Initialize shifted-in word + unsigned long MSB = 0x80000000; + unsigned long LSB = 0x00000001; + unsigned long DataIn = Invalid_Manufactor_IdCode | LSB; + unsigned char i = 0; + unsigned char detIdCode = 0; + unsigned short numOfDevices = 0; + + _hil_4w_ezFET_TapReset(); + + // JTAG FSM state = Run-Test/Idle + TMSset1; + EDT_Delay_1us(10); + TCKset0; + EDT_Delay_1us(10); + TCKset1; + EDT_Delay_1us(10); + // JTAG FSM state = Select DR-Scan + TMSset0; + EDT_Delay_1us(10); + TCKset0; + EDT_Delay_1us(10); + TCKset1; + EDT_Delay_1us(10); + // JTAG FSM state = Capture-DR + TCKset0; + EDT_Delay_1us(10); + TCKset1; + EDT_Delay_1us(10); + // JTAG FSM state = Shift-IR + + while(1) + { + if((DataIn & LSB) == 0) + { + TDIset0; + } + else + { + TDIset1; + } + DataIn >>= 1; + TCKset0; + EDT_Delay_1us(10); + TCKset1; + TDOval >>= 1; // TDO could be any port pin + if (ScanTDO()) + { + TDOval |= MSB; + if(0 == detIdCode) // Test if LSB of IdCode + { + i = 0; + detIdCode = 1; + } + } + else if(0 == detIdCode) + { + numOfDevices++; + } + + i += detIdCode; + if(32 == i) + { + detIdCode = 0; + i = 0; + if(Invalid_Manufactor_IdCode == (TDOval & Mask_Manufactor_IdCode)) + { + // End of chain detected + break; + } + // Device with valid IdCode detected + numOfDevices++; + } + if(0xFF == numOfDevices) + { + // Only 254 devices are supported + // Probably hardware connection is broken + numOfDevices = 0; + break; + } + } + + TMSset1; + EDT_Delay_1us(10); + TCKset0; + EDT_Delay_1us(10); + TCKset1; + // JTAG FSM = Exit-DR + TCKset0; + EDT_Delay_1us(10); + TCKset1; + EDT_Delay_1us(10); + // JTAG FSM = Update-DR + TMSset0; + EDT_Delay_1us(10); + TCKset0; + EDT_Delay_1us(10); + TCKset1; + EDT_Delay_1us(10); + // JTAG FSM = Run-Test/Idle + TMSset1; // to save power during debugging + EDT_Delay_1us(10); + return numOfDevices;*/ + + return 1; +} + +// ----------------------------------------------------------------------------- +unsigned char _hil_4w_ezFET_Instr(unsigned char Instruction) +{ + unsigned char rotInstr = 0; + for(unsigned char i = 0; i < 7; ++i) + { + rotInstr |= Instruction & (1 << (7 - i)) ? (1 << i) : 0; + } + + STREAM_sendDebug(traceBuffer,sprintf(traceBuffer, "EDT_Instr(0x%x)\n", rotInstr)); + + unsigned char TDOvalue = 0; + unsigned char TClk = StoreTCLK(); + + TMSset1 + TCKset0 + TCKset1 // Select-DR + + TCKset0 + TCKset1 // Select-IR + + TMSset0 + TCKset0 + TCKset1 // Capture-IR + + TCKset0 + TCKset1 // Shift-IR + + /// \note Bit-banging application + for(unsigned char count = 0; count < 7; ++count) + { + if(Instruction & (1 << count)) + { + TDIset1 + } + else + { + TDIset0 + } + TCKset0 + TCKset1 + TDOvalue <<= 1; + TDOvalue |= ScanTDO(); + } + + if(Instruction & 0x80) + { + TDIset1 + } + else + { + TDIset0 + } + TMSset1 + TCKset0 + TCKset1 // Exit1-IR + + TDOvalue <<= 1; + TDOvalue |= ScanTDO(); + + RestoreTCLK(TClk); // Restore TDI state since it is used for TCLK + + TCKset0 + TCKset1 // Update-IR + + TMSset0 + TCKset0 + TCKset1 // Run-Test/Idle + + return TDOvalue; +} + +// ----------------------------------------------------------------------------- +unsigned long long _hil_4w_ezFET_SetReg_XBits(unsigned long long Data, short Bits) +{ + unsigned short tclk = StoreTCLK(); // Store TCLK state; + unsigned long long TDOvalue = 0; + unsigned long long MSB = 0x00000001; + + STREAM_sendDebug(traceBuffer,sprintf(traceBuffer, "EDT_SetReg_XBits%d(0x%x)\n", Bits, Data)); + + MSB <<= (Bits-1); + + // JTAG FSM state = Run-Test/Idle + TMSset1 + TCKset0 + TCKset1 + + // JTAG FSM state = Select DR-Scan + TMSset0 + TCKset0 + TCKset1 + + // JTAG FSM state = Capture-DR + TCKset0 + TCKset1 + + // JTAG FSM state = Shift-DR + { + short i; + for (i = Bits; i > 0; i--) + { + if(Data & MSB) + { + TDIset1 + } + else + { + TDIset0 + } + Data <<= 1; + if (i == 1) // Last bit requires TMS=1 + { + TMSset1 + } + TCKset0 + TCKset1 + TDOvalue <<= 1; // TDO could be any port pin + if (ScanTDO()) + { + TDOvalue++; + } + } + } + + // common exit + RestoreTCLK(tclk); // restore TCLK state + + // JTAG FSM = Exit-DR + TCKset0 + TCKset1 + // JTAG FSM = Update-DR + TMSset0 + TCKset0 + TCKset1 + // JTAG FSM = Run-Test/Idle + + // de-scramble upper 4 bits if it was a 20bit shift + if(Bits == 20) + { + TDOvalue = ((TDOvalue << 16) + (TDOvalue >> 4)) & 0x000FFFFF; + } + + return TDOvalue; +} + + +unsigned char _hil_4w_ezFET_SetReg_XBits08(unsigned char Data) +{ + return _hil_4w_ezFET_SetReg_XBits(Data,8); +} + +unsigned short _hil_4w_ezFET_SetReg_XBits16(unsigned short Data) +{ + return _hil_4w_ezFET_SetReg_XBits(Data,16); +} + +unsigned long _hil_4w_ezFET_SetReg_XBits20(unsigned long Data) +{ + return _hil_4w_ezFET_SetReg_XBits(Data,20); +} + +// ----------------------------------------------------------------------------- +unsigned long _hil_4w_ezFET_SetReg_XBits32(unsigned long Data) +{ + return _hil_4w_ezFET_SetReg_XBits(Data,32); +} + +unsigned long long _hil_4w_ezFET_SetReg_XBits64(unsigned long long Data) +{ + return _hil_4w_ezFET_SetReg_XBits(Data,64); +} + +// ----------------------------------------------------------------------------- +void _hil_4w_ezFET_Tclk(unsigned char state) +{ + if(state) + { + TDIset1 + } + else + { + TDIset0 + } +} + +// ----------------------------------------------------------------------------- +void _hil_4w_ezFET_StepPsa(unsigned long length) +{ + while(length > 0) + { + TCLKset0 + TCKset0 + TMSset1 + TCKset1 // select DR scan + TCKset0 + TMSset0 + + TCKset1 // capture DR + TCKset0 + TCKset1 // shift DR + TCKset0 + + TMSset1 + TCKset1 // exit DR + TCKset0 + + // Set JTAG FSM back into Run-Test/Idle + TCKset1 + TMSset0 + TCKset0 + TCKset1 + + // Clock through the PSA + TCLKset1 + + length--; + } +} + +void _hil_4w_ezFET_StepPsaTclkHigh(unsigned long length) +{ + while(length--) + { + TCLKset1 _NOP(); + + TCKset0 _NOP(); + TMSset1 _NOP(); + TCKset1 _NOP();// select DR scan + TCKset0 _NOP(); + TMSset0 _NOP(); + + TCKset1 _NOP();// capture DR + TCKset0 _NOP(); + TCKset1 _NOP();// shift DR + TCKset0 _NOP(); + + TMSset1 _NOP(); + TCKset1 _NOP(); // exit DR + TCKset0 _NOP(); + + // Set JTAG FSM back into Run-Test/Idle + TCKset1 _NOP(); + TMSset0 _NOP(); + TCKset0 _NOP(); + TCKset1 _NOP(); + + _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); + TCLKset0 _NOP(); + } +} + +// ----------------------------------------------------------------------------- +short _hil_4w_ezFET_BlowFuse(unsigned char targetHasTestVpp) +{ + return 0; +} +/* EOF */ diff --git a/Bios/src/hil/fet_generic/hil_Swd432.c b/Bios/src/hil/fet_generic/hil_Swd432.c new file mode 100644 index 0000000..38b3bb8 --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_Swd432.c @@ -0,0 +1,265 @@ +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "arch.h" +#include "edt.h" +#include "archFpga.h" +#include + +static struct jtag _Jtag = {0}; + +#define SWD_DELAY { _NOP();} + +// DAP Transfer Response +#define DAP_TRANSFER_OK (1<<0) +#define DAP_TRANSFER_WAIT (1<<1) +#define DAP_TRANSFER_FAULT (1<<2) +#define DAP_TRANSFER_ERROR (1<<3) +#define DAP_TRANSFER_MISMATCH (1<<4) + + +void SWDTCKset1() +{ (*_Jtag.Out) |= _Jtag.TCK;} + +#pragma inline=forced +void SWDTCKset0() +{ (*_Jtag.Out) &= ~_Jtag.TCK;} + +#pragma inline=forced +void SWDIOset1TckCycle() +{ + (*_Jtag.Out) |= _Jtag.TMS; + SWDTCKset0(); + SWD_DELAY; + SWDTCKset1(); +} + +#pragma inline=forced +void SWDIOset0TckCycle() +{ + (*_Jtag.Out) &= ~_Jtag.TMS; + SWDTCKset0(); + SWD_DELAY; + SWDTCKset1(); +} + +#pragma inline=forced +void SWDTckCycle() +{ + SWDTCKset0(); + SWD_DELAY; + SWDTCKset1(); + SWD_DELAY; +} +//#pragma inline=forced +void SWDIOwriteBit(unsigned char bit) +{ + if(bit & 0x1) + { + (*_Jtag.Out) |= _Jtag.TMS; + } + else + { + (*_Jtag.Out) &= ~_Jtag.TMS; + } + SWDTCKset0(); + SWD_DELAY;; + SWDTCKset1(); +} + +// turn around direction before +#pragma inline=forced +unsigned char ScanTDO() +{ + unsigned char val = 0; + SWDTCKset0(); + SWD_DELAY; + SWD_DELAY; + + if(*_Jtag.In & _Jtag.TMS) + { + val = 1; + } + else + { + val = 0; + } + SWDTCKset1(); + __enable_interrupt(); + return val; +} + +void hil_Swd_InitJtag(struct jtag tmp) +{ + _Jtag = tmp; +} + +unsigned char Swd_TransferData(unsigned char regiser, unsigned long* data, unsigned char rnw) +{ + volatile unsigned char ack = DAP_TRANSFER_ERROR; + unsigned long bit = 0; + unsigned long val = 0; + unsigned long parity = 0; + unsigned char count = 0; + + ///host sends request + SWDIOwriteBit(1); //Start Bit + bit = regiser >> 0; + SWDIOwriteBit(bit); //APnDP Bit + parity += bit; + bit = regiser >> 1; + SWDIOwriteBit(bit); //RnW Bit + parity += bit; + bit = regiser >> 2; + SWDIOwriteBit(bit); //A2 Bit + parity += bit; + bit = regiser >> 3; + SWDIOwriteBit(bit); //A3 Bit + parity += bit; + SWDIOwriteBit((unsigned char)parity); //Parity Bit + SWDIOwriteBit(0); //Stop Bit + SWDIOwriteBit(1); //Park Bit + + // set MSP-FET to input dir + (*_Jtag.DIRECTION) &= ~(_Jtag.TMS); + FPGA_BYPASS_DIR_CTRL_PORT_OUT &= ~_Jtag.TMS; + SWDTckCycle(); + + // read response and check for ack + bit = ScanTDO(); + ack = bit << 0; + bit = ScanTDO(); + ack |= bit << 1; + bit = ScanTDO(); + ack |= bit << 2; + + if (ack == DAP_TRANSFER_OK) + { + if(rnw) + { + ///Read 32 bit data + val = 0; + parity = 0; + for (count = 32; count; count--) + { + bit = ScanTDO(); + parity += bit; + val >>= 1; + val |= bit << 31; + } + //Read Parity + bit = ScanTDO(); + if ((parity ^ bit) & 1) + { + ack = DAP_TRANSFER_ERROR; + } + if (data) + { + *data = val; + ack = DAP_TRANSFER_OK; + } + // sest MSP-FET TMS pin to output + (*_Jtag.DIRECTION) |= (_Jtag.TMS); + FPGA_BYPASS_DIR_CTRL_PORT_OUT |= _Jtag.TMS; + SWDTckCycle(); + + return ack; + } + else // write + { + // sest MSP-FET TMS pin to output + (*_Jtag.DIRECTION) |= (_Jtag.TMS); + FPGA_BYPASS_DIR_CTRL_PORT_OUT |= _Jtag.TMS; + SWDTckCycle(); + + val = *data; + parity = 0; + for (count = 32; count; count--) + { + SWDIOwriteBit((unsigned char)val); + parity += val; + val >>= 1; + } + //write parity to DAP + SWDIOwriteBit(parity); + //ToDo do we need idle cycles here? + (*_Jtag.Out) &= ~_Jtag.TMS; + SWDTckCycle(); + SWDTckCycle(); + SWDTckCycle(); + SWDTckCycle(); + SWDTckCycle(); + SWDTckCycle(); + SWDTckCycle(); + // set SWDIO pin to 1 + (*_Jtag.Out) |= _Jtag.TMS; + return ack; + } + } + if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) + { + //WAIT or FAULT response + if (rnw) + { + for (count = 33; count; count--) + { + SWDTckCycle(); /* Dummy Read RDATA[0:31] + Parity */ + } + } + + // sest MSP-FET TMS pin to output + (*_Jtag.DIRECTION) |= (_Jtag.TMS); + FPGA_BYPASS_DIR_CTRL_PORT_OUT |= _Jtag.TMS; + SWDTckCycle(); + if (!rnw) + { + // set SWDIO pin to 0 + (*_Jtag.Out) &= ~_Jtag.TMS; + for (count = 33; count; count--) + { + SWDTckCycle(); /* Dummy Write WDATA[0:31] + Parity */ + } + } + // set SWDIO pin to 1 + (*_Jtag.Out) |= _Jtag.TMS; + return (ack); + } + + // sest MSP-FET TMS pin to output + (*_Jtag.DIRECTION) |= (_Jtag.TMS); + FPGA_BYPASS_DIR_CTRL_PORT_OUT |= _Jtag.TMS; + SWDTckCycle(); + + //Protocol error + for (count = 34; count; count--) + { + SWDTckCycle(); /* Back off data phase */ + } + // set SWDIO pin to 1 + (*_Jtag.Out) |= _Jtag.TMS; + return ack; +} + +void hil_Swd_Seq(unsigned short length, unsigned char *sequence) +{ + unsigned char dataptr = 0; + unsigned short n = 0; + while (length--) + { + if (n == 0) + { + dataptr = *sequence++; + n = 8; + } + if (dataptr & 1) + { + SWDIOset1TckCycle(); + } + else + { + SWDIOset0TckCycle(); + } + dataptr >>= 1; + n--; + } + (*_Jtag.Out) |= _Jtag.TMS; +} \ No newline at end of file diff --git a/Bios/src/hil/fet_generic/hil_generic.c b/Bios/src/hil/fet_generic/hil_generic.c new file mode 100644 index 0000000..2b4183c --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_generic.c @@ -0,0 +1,336 @@ +/* + * hil_generic.c + * + * Copyright (C) 2013 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. + */ + +#include "hilFpgaAccess.h" +#include "archFpga.h" +#include "arch.h" +#include "JTAG_defs.h" +#include "hilDelays.h" + +static unsigned short prevInstruction = 0; + +#pragma optimize=low +void _hil_generic_ConfigureSpeed(unsigned short speed) +{ + unsigned short tckFreq, tclkFreq; + + switch(speed) + { + case SBW100KHz: + { + tckFreq = 298; + tclkFreq = 75; + break; + } + case SBW200KHz: + { + tckFreq = 350; + tclkFreq = 75; + break; + } + case SBW400KHz: + { + tckFreq = 137; + tclkFreq = 30; + break; + } + case SBW600KHz: + { + tckFreq = 88; + tclkFreq = 21; + break; + } + case SBW1200KHz: + { + tckFreq = 48; + tclkFreq = 12; + break; + } + case JTAG250KHz: + { + tckFreq = 238; + tclkFreq = 238; + break; + } + case JTAG500KHz: + { + tckFreq = 118; + tclkFreq = 28; + break; + } + case JTAG750KHz: + { + tckFreq = 88; + tclkFreq = 21; + break; + } + case JTAG1MHz: + { + tckFreq = 58; + tclkFreq = 14; + break; + } + case JTAG2MHz: + { + tckFreq = 28; + tclkFreq = 7; + break; + } + case JTAG4MHz: + { + tckFreq = 13; + tclkFreq = 4; + break; + } + case JTAG8MHz: + { // 7,5 MHz + tckFreq = 5; + tclkFreq = 2; + break; + } + case JTAG15MHz: + { + tckFreq = 3; + tclkFreq = 3; + break; + } + default: + { + // 500 kHz, but this should never happen + tckFreq = 118; + tclkFreq = 118; + break; + } + } + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_TEST_CLK_FREQUENCY, tckFreq); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_TCLK_CLK_FREQUENCY, tclkFreq); +} + +void initGeneric() +{ + prevInstruction = 0; +} + +unsigned char _hil_generic_GetPrevInstruction() +{ + return prevInstruction; +} + +unsigned char _hil_generic_Instr(unsigned char instruction) +{ + unsigned short retVal; + + hil_fpga_write_cmd_data0(FPGA_CMD_IR8_RD, instruction); + hil_fpga_read_data1(1, &retVal); + prevInstruction = instruction; + + return ((unsigned char)retVal); +} + +unsigned char _hil_generic_SetReg_XBits08(unsigned char data) +{ + unsigned short retVal; + + hil_fpga_write_cmd_data0(FPGA_CMD_DR8_RD, data); + hil_fpga_read_data1(1, &retVal); + + return ((unsigned char)retVal); +} +unsigned short _hil_generic_SetReg_XBits16(unsigned short data) +{ + unsigned short retVal; + + hil_fpga_write_cmd_data0_data1(FPGA_CMD_DRX_RD, 16, data); + hil_fpga_read_data1(1, &retVal); + + return retVal; +} + +unsigned long _hil_generic_SetReg_XBits20(unsigned long data) +{ + unsigned long retVal; + + hil_fpga_write_cmd_data0_data1_count(FPGA_CMD_DRX_RD, 20, (unsigned short*)&data, 2); + hil_fpga_read_data1(2, (unsigned short*)&retVal); + + return (retVal >> 4) | ((retVal & 0xF) << 16); +} + +// ----------------------------------------------------------------------------- +unsigned long _hil_generic_SetReg_XBits32(unsigned long data) +{ + unsigned long retVal; + + hil_fpga_write_cmd_data0_data1_count(FPGA_CMD_DRX_RD, 32, (unsigned short*)&data, 2); + hil_fpga_read_data1(2, (unsigned short*)&retVal); + return retVal; +} + +// ----------------------------------------------------------------------------- +unsigned long long _hil_generic_SetReg_XBits64(unsigned long long data) +{ + unsigned long long retVal; + + hil_fpga_write_cmd_data0_data1_count(FPGA_CMD_DRX_RD, 64, (unsigned short*)&data, 4); + hil_fpga_read_data1(4, (unsigned short*)&retVal); + + return retVal; +} + +//! \brief This function executes an SBW2 64BIT Data SHIFT (DR-SHIFT) in the case, +//! that the first 8 bits show a valid data capture from the JSTATE register. In case +//! of no valid capture the shift is ended after the first 8 bits. Timeout could be +//! used to set the function run count. +//! \param[in] Data to be shifted into target device +//! \return Value shifted out of target device JTAG module +unsigned long long _hil_generic_XBits8_64(unsigned long long Data, unsigned short loopCount,unsigned short PG) +{ + unsigned long long TDOvalue = 0x0; + unsigned short timeout = loopCount; + unsigned char DataState = 0; + unsigned short currentDeviceState = 0; + unsigned short syncBrokenCount = loopCount/2; + + do + { + TDOvalue = (_hil_generic_SetReg_XBits64(Data)); + // Mask out all not needed bits for device state detection + currentDeviceState = ((TDOvalue >> 56) & JSTATE_FLOW_CONTROL_BITS); + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56, ] & 0x4 (BP_HIT) == TRUE + if(currentDeviceState & JSTATE_BP_HIT) + { + // reload Jstate IR + _hil_generic_Instr(IR_JSTATE_ID); + DataState = VALID_DATA; + return(TDOvalue); + } + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56] (AM Sync. ongoing) == 0x83 + else if(currentDeviceState == JSTATE_SYNC_ONGOING) + { + DataState = SYNC_ONGOING; + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] & 0x40 (Locked State) == 0x40 + else if((currentDeviceState & JSTATE_LOCKED_STATE) == JSTATE_LOCKED_STATE && + (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE) + { + DataState = JTAG_LOCKED; + return(TDOvalue); + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] ( Invalid LPM) == 0x81) + else if(currentDeviceState == JSTATE_INVALID_STATE) + { + // reload Jstate IR + _hil_generic_Instr(IR_JSTATE_ID); + DataState = INVALID_DATA; + } + /*PG2.0 && PG2.1 frozen Sync detection*/ + else if (((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK_PGACT) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_PGACT)) + { + if(syncBrokenCount > 0 && PG >= 0x21) + + { // Only working for PG2.1, do not harm if executed on PG2.0 ? but will not create any effect only consume time + unsigned long current3VtestReg = 0; + + // read current 3VtestReg value + _hil_generic_Instr(IR_TEST_REG); + current3VtestReg = _hil_generic_SetReg_XBits32(0); + // set bit 25 high to rest sync + current3VtestReg |= 0x2000000; + _hil_generic_SetReg_XBits32(current3VtestReg); + // set bit 25 low reset sync done + current3VtestReg &= ~0x2000000; + _hil_generic_SetReg_XBits32(current3VtestReg); + + _hil_generic_Instr(IR_JSTATE_ID); + syncBrokenCount --; + timeout = timeout + 5; + } + else + { + DataState = VALID_DATA; + return(TDOvalue); + } + } + // device is not in LPMx or AC read out mode just restart the shift but do not reload the JState IR + else if(currentDeviceState != JSTATE_VALID_CAPTURE + && currentDeviceState != JSTATE_LPM_ONE_TWO + && currentDeviceState != JSTATE_LPM_THREE_FOUR + && (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE) + { + DataState = INVALID_DATA; + } + else + { + DataState = VALID_DATA; + } + + if(!timeout) + { + return TDOvalue; + } + timeout--; + } + while(DataState == INVALID_DATA || DataState == SYNC_ONGOING); + + if( currentDeviceState == JSTATE_LPM_ONE_TWO + || currentDeviceState == JSTATE_LPM_THREE_FOUR + || currentDeviceState == 0x00 + || currentDeviceState == 0x02) + { + // reload Jstate IR + _hil_generic_Instr(IR_JSTATE_ID); + } + return(TDOvalue); +} + + +// ----------------------------------------------------------------------------- +void _hil_generic_Tclk(unsigned char state) +{ + if(state) + { + hil_fpga_write_cmd_data0(FPGA_CMD_CFG, REG_TCLKset1); + } + else + { + hil_fpga_write_cmd_data0(FPGA_CMD_CFG, REG_TCLKset0); + } +} diff --git a/Bios/src/hil/fet_generic/hil_generic432.c b/Bios/src/hil/fet_generic/hil_generic432.c new file mode 100644 index 0000000..eb023f2 --- /dev/null +++ b/Bios/src/hil/fet_generic/hil_generic432.c @@ -0,0 +1,148 @@ +/* + * hil_generic432.c + * + * Copyright (C) 2013 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. + */ + +#include "hilFpgaAccess.h" +#include "archFpga.h" +#include "arch.h" +#include "JTAG_defs.h" +#include "hilDelays.h" + +//lookup table to reverse 8 bit values +static const unsigned char table_8bits[] = +{ + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, + }; +#pragma inline=forced +unsigned char reverse_byte(unsigned char x) +{ + return table_8bits[x]; +} +//lookup table to reverse 4 bit values +const unsigned char table_4bits[] = {0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE, 0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF}; + +#pragma inline=forced +unsigned char reverse_4bits(unsigned char x) +{ + return table_4bits[x & 0xF]; +} + +//lookup table to reverse 3 bit values +const unsigned char table_3bits[] = {0x0, 0x4, 0x2, 0x6, 0x1, 0x5, 0x3, 0x7}; + +#pragma inline=forced +unsigned char reverse_3bits(unsigned char x) +{ + return table_3bits[x & 0x7]; +} + +unsigned char _hil_generic432_Instr_4(unsigned char instruction) +{ + unsigned short retVal = 0; + + hil_fpga_write_cmd_data0_432(FPGA_CMD_IR4_RD, instruction); + hil_fpga_read_data_432(1, &retVal); + return retVal; +} + +unsigned char _hil_generic432_SetReg_XBits08(unsigned char data) +{ + return 0; +} + +unsigned short _hil_generic432_SetReg_XBits16(unsigned short data) +{ + return 0; +} + +// ----------------------------------------------------------------------------- +unsigned long _hil_generic432_SetReg_XBits32(unsigned long data) +{ + unsigned long retVal = 0; + hil_fpga_write_cmd_data0_data1_count_432(FPGA_CMD_DRX_RD, 32, (unsigned short*)&data, 2); + hil_fpga_read_data_432(2, (unsigned short*)&retVal); + return retVal; +} + +// ----------------------------------------------------------------------------- +unsigned long long _hil_generic432_SetReg_XBits64(unsigned long long data) +{ + return 0; +} + +unsigned long long _hil_generic432_SetReg_XBits(unsigned long long *data, unsigned short count) +{ + return 0; +} + +unsigned long long _hil_generic432_SetReg_XBits35(unsigned long long *data) +{ + unsigned short count = 35; + unsigned short words = (count + 15) / 16; + unsigned long long retVal = 0; + hil_fpga_write_cmd_data0_data1_count_432(FPGA_CMD_DRX_RD, count, (unsigned short*)data, words); + hil_fpga_read_data_432(words, (unsigned short*)&retVal); + return retVal; +} diff --git a/Bios/src/hil/hil_Structs.h b/Bios/src/hil/hil_Structs.h new file mode 100644 index 0000000..739c812 --- /dev/null +++ b/Bios/src/hil/hil_Structs.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2012 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. + */ + +#include "msp430.h" + +#ifndef _HIL_STRUCTS_H__ +#define _HIL_STRUCTS_H__ + +/** + @brief Structure of pointers to all exported EDT functions. +*/ +struct edt_common_methods +{ + short (*Init)(void); + short (*SetVcc)(unsigned short); + void (*SwitchVccFET)(unsigned short); + short (*GetVcc)(double*, double*); + short (*SetProtocol)(unsigned short); + void (*SetPsaTCLK)(unsigned short); + short (*Open)(unsigned char state); + short (*Close)(void); + void (*Delay_1us)(unsigned short); + void (*Delay_1ms)(unsigned short); + short (*Loop)(unsigned short); + void (*EntrySequences)(unsigned char); + void (*SetReset)(unsigned char); // Set the Reset pin to the specified value + void (*SetTest)(unsigned char); // Set the Test pin to the specified value + void (*SetJtagSpeed)(unsigned short, unsigned short); + void (*ConfigureSetPc)(unsigned short); + void (*initDelayTimer)(void); + void (*BSL_EntrySequence)(unsigned short switchBypassOff); + void (*SetTMS)(unsigned char); // Set the TMS pin to the specified value + void (*SetTCK)(unsigned char); // Set the TCK pin to the specified value + void (*SetTDI)(unsigned char); // Set the TDI pin to the specified value + short (*regulateVcc)(void); + void (*setFpgaTimeOut)(unsigned short state); + unsigned short (*getFpgaVersion)(void); + void (*ReadADC12)(void); + void (*ConfigFpgaIoMode)(unsigned short mode); + void (*BSL_EntrySequence1xx_4xx)(void); + void (*SetToolID)(unsigned short id); +}; +typedef struct edt_common_methods edt_common_methods_t; + +struct edt_distinct_methods +{ + short (*TapReset)(void); + short (*CheckJtagFuse)(void); + unsigned char (*Instr)(unsigned char); + unsigned char (*Instr04)(unsigned char); + unsigned char (*SetReg_XBits08)(unsigned char); + unsigned short (*SetReg_XBits16)(unsigned short); + unsigned long (*SetReg_XBits20)(unsigned long); + unsigned long (*SetReg_XBits32)(unsigned long); + unsigned long long (*SetReg_XBits35)(unsigned long long *Data); + unsigned long long (*SetReg_XBits64)(unsigned long long); + unsigned long long (*SetReg_XBits8_64)(unsigned long long, unsigned short, unsigned short); + unsigned long long (*SetReg_XBits)(unsigned long long *Data, unsigned short count); + void (*Tclk)(unsigned char); + void (*StepPsa)(unsigned long); + short (*BlowFuse)(unsigned char); // Blow the JTAG acces fuse + unsigned char (*GetPrevInstruction)(void); + short (*write_read_Dp)(unsigned char address, unsigned long *data, unsigned short rnw); + short (*write_read_Ap)(unsigned long address, unsigned long *data, unsigned short rnw); + short (*write_read_mem_Ap)(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw); + unsigned long (*GetJtagIdCode)(); + unsigned char (*SwdTransferData)(unsigned char regiser, unsigned long* data, unsigned char rnw); +}; +typedef struct edt_distinct_methods edt_distinct_methods_t; + +#endif diff --git a/Bios/src/hil/msp_fet/arch.h b/Bios/src/hil/msp_fet/arch.h new file mode 100644 index 0000000..6b765a9 --- /dev/null +++ b/Bios/src/hil/msp_fet/arch.h @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +//! \ingroup MODULHIL +//! \file arch.h +//! \brief +//! +#include "msp430.h" +#define uController_uif + +#ifndef _UIFV1_ARCH_H_ +#define _UIFV1_ARCH_H_ + +enum {JTAG = 0, SPYBIWIRE = 1, SPYBIWIREJTAG = 2, JTAGUNDEF = 4, SPYBIWIRE_SUBMCU = 5, SPYBIWIRE_MSP_FET=6, JTAG_432 = 7, SWD_432 = 8}; + +#define RSTHIGH 0 +#define RSTLOW 1 + +#define Invalid_Manufactor_IdCode 0x000000FEul +#define Mask_Manufactor_IdCode 0x000000FEul + +#define A_VREFPLUS 2.5f // conversion reference voltage Vref+=2.5V, + +#define DCDC_STATUS (P3IN & (BIT0+BIT1)) // Status bits from the DCDC Sub MCU + +// Fuse blow related constants +#define VF_PWM_TIMEOUT 4000 +#define VF_PWM_PERIOD 50 +#define VF_PWM_ON_TIME 40 +#define VF_PWM_OFF_TIME (VF_PWM_PERIOD - VF_PWM_ON_TIME) + +static const unsigned short ADC_CONV_RANGE = 4096; +static const unsigned short ADC_AVERAGE = 1000; + +struct jtag +{ + unsigned char TCK; + unsigned char TMS; + unsigned char TDI; + unsigned char TDO; + unsigned char* In; + unsigned char* Out; + unsigned char RST; + unsigned char TST; + unsigned char* DIRECTION; +}; + +struct vfuse_ctrl +{ + unsigned char VF2TEST; + unsigned char VF2TDI; + unsigned char TDI_OFF; + unsigned char* CTRL; + unsigned char PWM_SETVF; + unsigned char* PWM_CTRL; +}; + +static const struct jtag _Jtag_SubMcu = +{ + 0, // TCK, unused in SBW mode + 0, // TMS, unused in SBW mode + 0, // TDI, unused in SBW mode + 0, // TDO, unused in SBW mode + (unsigned char*)&P7IN, // JTAG input Register + (unsigned char*)&P7OUT, // JTAG output Register + (unsigned char)BIT5, // RST, P7.5, (inout) + (unsigned char)BIT4, // TST, P7.4, (out) + (unsigned char*)&P7DIR // JTAG direction Register +}; + +static const struct jtag _SBW_Back = +{ + 0, // TCK, unused in SBW mode + 0, // TMS, unused in SBW mode + 0, // TDI, unused in SBW mode + 0, // TDO, unused in SBW mode + (unsigned char*)&P3IN, // JTAG input Register + (unsigned char*)&P3OUT, // JTAG output Register + (unsigned char)BIT3, // RST, P3.3 TDO(in/out) + (unsigned char)BIT0, // TST, P3.0 TCK(out) + (unsigned char*)&P3DIR // JTAG direction Register +}; + +static const struct jtag _Jtag_Target = +{ + (unsigned char)BIT0, // TCK, P3.0 (out) (high) + (unsigned char)BIT1, // TMS, P3.1 (out) (high) + (unsigned char)BIT2, // TDI, P3.2 (out) (high) + (unsigned char)BIT3, // TDO, P3.3 (in) + (unsigned char*)&P3IN, // JTAG input Register + (unsigned char*)&P3OUT, // JTAG output Register + (unsigned char)BIT4, // RST, P3.4 (out) + (unsigned char)BIT5, // TST, P3.5 (out) + (unsigned char*)&P3DIR // JTAG direction Register +}; + +static const struct jtag _Jtag_FPGA = +{ + (unsigned char)BIT0, // TCK, P9.0 (out) (high) + (unsigned char)BIT2, // TMS, P9.2 (out) (high) + (unsigned char)BIT1, // TDI, P9.1 (out) (high) + (unsigned char)BIT3, // TDO, P9.3 (in) + (unsigned char*)&P9IN, // JTAG input Register + (unsigned char*)&P9OUT, // JTAG output Register + (unsigned char)BIT4, // RST + (unsigned char)BIT4, // TST + (unsigned char*)&P9DIR // JTAG direction Register +}; + +static const struct vfuse_ctrl _Msp_Fet = +{ + (unsigned char)BIT2, // VF2TEST, P5.2 (out) + (unsigned char)BIT4, // VF2TDI, P5.4 (out) + (unsigned char)BIT5, // TDIOFF, P5.5 (out) + (unsigned char*)&P5OUT, // VF control register + (unsigned char)BIT7, // VF PWM, P9.7 (out) + (unsigned char*)&P9OUT // VF PWM control register +}; + +struct savedDacValues +{ + unsigned short DAC0; + unsigned short DAC1; + unsigned short Vcc; + unsigned short valid; +}; +typedef struct savedDacValues savedDacValues_t; + +#define VALID_DATA 0x1A +#define SYNC_ONGOING 0x2A +#define INVALID_DATA 0x3A +#define JTAG_LOCKED 0x4A + +#define BP_HIT_MASK_J 0x0400000000000000ull +#define LPMX5_MASK_J 0x4000000000000000ull +#define LPM4_1MASK_J 0x8000000000000000ull +#define LPM4_2MASK_J 0x8300000000000000ull +#define EIGHT_JSTATE_BITS 0x100000000000000ull +#define SYNC_BROKEN 0x5A + +#define JSTATE_FLOW_CONTROL_BITS 0xC7 +#define JSTATE_BP_HIT 0x4 +#define JSTATE_SYNC_ONGOING 0x83 +#define JSTATE_LOCKED_STATE 0x40 +#define JSTATE_INVALID_STATE 0x81 +#define JSTATE_LPM_ONE_TWO 0x82 +#define JSTATE_LPM_THREE_FOUR 0x80 +#define JSTATE_VALID_CAPTURE 0x03 +#define JSTATE_LPM_X_FIVE 0xC0 + +#define JSTATE_SYNC_BROKEN_MASK 0xC3 +#define JSTATE_SYNC_BROKEN_PGACT 0x02 +#define JSTATE_SYNC_BROKEN_MCLK 0x01 +#define JSTATE_SYNC_BROKEN_MCLK_PGACT 0x00 + +#define FET_TRUE 0x1 +#define FET_FALSE 0x0 + +#define L092_MODE 0xA55AA55A +#define C092_MODE 0x5AA55AA5 + +#endif diff --git a/Bios/src/hil/msp_fet/archFpga.h b/Bios/src/hil/msp_fet/archFpga.h new file mode 100644 index 0000000..125155e --- /dev/null +++ b/Bios/src/hil/msp_fet/archFpga.h @@ -0,0 +1,298 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +#include "msp430.h" +#define uController_uif + +#ifndef _FPGA_ARCH_H_ +#define _FPGA_ARCH_H_ +// ------------------------------------------------------------------------------ +// FPGA + +// RESET +#define FPGA_RESET_BIT ( BIT1 ) +#define FPGA_RESET_PORT_DIR ( P5DIR ) +#define FPGA_RESET_PORT_OUT ( P5OUT ) +#define FPGA_RESET_ASSERT { FPGA_RESET_PORT_OUT &= ~FPGA_RESET_BIT; } +#define FPGA_RESET_DEASSERT { FPGA_RESET_PORT_OUT |= FPGA_RESET_BIT; } + +#define TRIGGER_LA { P6OUT |= BIT7; __delay_cycles(10); P6OUT &= ~BIT7; } +#define TRIGGER_ONCE { P6OUT ^= BIT7; } + +// DCDC output to target VCC +#define DCDC_VCC_BIT ( BIT7 ) +#define DCDC_VCC_PORT_OUT ( P8OUT ) +#define DCDC_VCC_ENABLE { DCDC_VCC_PORT_OUT |= DCDC_VCC_BIT; } +#define DCDC_VCC_DISABLE { DCDC_VCC_PORT_OUT &= ~DCDC_VCC_BIT; } + +// DT voltage to target VCC +#define DT_VCC_BIT ( BIT6 ) +#define DT_VCC_PORT_OUT ( P9OUT ) +#define DT_VCC_ENABLE { DT_VCC_PORT_OUT |= DT_VCC_BIT; } +#define DT_VCC_DISABLE { DT_VCC_PORT_OUT &= ~DT_VCC_BIT; } + +// DT voltage to level shifters +#define DT_SIGNALS_BIT ( BIT0 ) +#define DT_SIGNALS_PORT_OUT ( P8OUT ) +#define DT_SIGNALS_ENABLE { DT_SIGNALS_PORT_OUT |= DT_SIGNALS_BIT; } +#define DT_SIGNALS_DISABLE { DT_SIGNALS_PORT_OUT &= ~DT_SIGNALS_BIT; } + +// SYS_CLK +#define FPGA_SYS_CLK_BIT ( BIT7 ) +#define FPGA_SYS_CLK_PORT_DIR ( P2DIR ) +#define FPGA_SYS_CLK_PORT_SEL ( P2SEL ) +#define FPGA_SYS_CLK_START { FPGA_SYS_CLK_PORT_SEL |= FPGA_SYS_CLK_BIT; } +#define FPGA_SYS_CLK_STOP { FPGA_SYS_CLK_PORT_SEL &= ~FPGA_SYS_CLK_BIT; } + +// WR_TRIG +#define FPGA_WR_TRIG_BIT ( BIT6 ) +#define FPGA_WR_TRIG_PORT_DIR ( P2DIR ) +#define FPGA_WR_TRIG_PORT_OUT ( P2OUT ) + +// RD_TRIG +#define FPGA_RD_TRIG_BIT ( BIT6 ) +#define FPGA_RD_TRIG_PORT_DIR ( P5DIR ) +#define FPGA_RD_TRIG_PORT_IN ( P5IN ) +#define FPGA_RD_TRIG_IS_ASSERTED ( FPGA_RD_TRIG_PORT_IN & FPGA_RD_TRIG_BIT ) + +// CMD +#define FPGA_CMD_BITS ( BIT2 + BIT3 + BIT4 + BIT5 ) +#define FPGA_CMD_PORT_DIR ( P2DIR ) +#define FPGA_CMD_PORT_OUT ( P2OUT ) + +// DATA0 +#define FPGA_DATA0_BITS ( 0xFF ) +#define FPGA_DATA0_PORT_DIR ( P1DIR ) +#define FPGA_DATA0_PORT_IN ( P1IN ) +#define FPGA_DATA0_PORT_OUT ( P1OUT ) + +// CMD, DATA0, WR_TRIG +#define FPGA_CMD_DATA0_PORT_OUT ( PAOUT ) + +// DATA1 +#define FPGA_DATA1_BITS ( 0xFFFF ) +#define FPGA_DATA1_PORT_DIR ( PBDIR ) +#define FPGA_DATA1_PORT_IN ( PBIN ) +#define FPGA_DATA1_PORT_OUT ( PBOUT ) + +// IO_DIR +#define FPGA_IO_DIR_BIT ( BIT1 ) +#define FPGA_IO_DIR_PORT_DIR ( P8SEL ) +#define FPGA_IO_DIR_PORT_OUT ( P8OUT ) + +// UART_TXD / UART_TXD (MSP-FET RXD input, JTAG.12) +#define FPGA_UART_TXD_BIT ( BIT3 ) +#define FPGA_UART_TXD_PORT_SEL ( P8SEL ) + +// UART_RXD / UART_RXD (MSP-FET TXD output, JTAG.14) +#define FPGA_UART_RXD_BIT ( BIT2 ) +#define FPGA_UART_RXD_PORT_SEL ( P8SEL ) +#define FPGA_UART_RXD_PORT_OUT ( P8OUT ) +#define FPGA_UART_RXD_HIGH { FPGA_UART_RXD_PORT_OUT |= FPGA_UART_RXD_BIT; } +#define FPGA_UART_RXD_LOW { FPGA_UART_RXD_PORT_OUT &= ~FPGA_UART_RXD_BIT; } + +// UART_CTS / UART_CTS (MSP-FET "clear to send" output, JTAG.10) +#define FPGA_UART_CTS_BIT ( BIT5 ) +#define FPGA_UART_CTS_PORT_DIR ( P9DIR ) +#define FPGA_UART_CTS_PORT_OUT ( P9OUT ) +#define FPGA_UART_CTS_HIGH { FPGA_UART_CTS_PORT_OUT |= FPGA_UART_CTS_BIT; } +#define FPGA_UART_CTS_LOW { FPGA_UART_CTS_PORT_OUT &= ~FPGA_UART_CTS_BIT; } + +// UART_RTR / UART_RTR (MSP-FET "ready to receive" input, JTAG.13) +#define FPGA_UART_RTR_BIT ( BIT1 ) +#define FPGA_UART_RTR_PORT_DIR ( P2DIR ) +#define FPGA_UART_RTR_PORT_IN ( P2IN ) +#define FPGA_UART_RTR_IS_HIGH ( FPGA_UART_RTR_PORT_IN & FPGA_UART_RTR_BIT ) + +// JTAG signals in bypass mode +#define FPGA_BYPASS_DIR_CTRL_TEST_BIT ( BIT5 ) +#define FPGA_BYPASS_DIR_CTRL_RST_BIT ( BIT4 ) +#define FPGA_BYPASS_DIR_CTRL_TDO_BIT ( BIT3 ) +#define FPGA_BYPASS_DIR_CTRL_TDI_BIT ( BIT2 ) +#define FPGA_BYPASS_DIR_CTRL_TMS_BIT ( BIT1 ) +#define FPGA_BYPASS_DIR_CTRL_TCK_BIT ( BIT0 ) +#define FPGA_BYPASS_DIR_CTRL_PORT_DIR ( P4DIR ) +#define FPGA_BYPASS_DIR_CTRL_PORT_OUT ( P4OUT ) +#define FPGA_BYPASS_DIR_CTRL_PORT_IN ( P4IN ) + +#define FPGA_BYPASS_TEST_BIT ( BIT5 ) +#define FPGA_BYPASS_RST_BIT ( BIT4 ) +#define FPGA_BYPASS_TDO_BIT ( BIT3 ) +#define FPGA_BYPASS_TDI_BIT ( BIT2 ) +#define FPGA_BYPASS_TMS_BIT ( BIT1 ) +#define FPGA_BYPASS_TCK_BIT ( BIT0 ) +#define FPGA_BYPASS_JTAG_PORT_DIR ( P3DIR ) +#define FPGA_BYPASS_JTAG_PORT_OUT ( P3OUT ) +#define FPGA_BYPASS_JTAG_PORT_IN ( P3IN ) + +#define FPGA_BYPASS_TEST_HIGH { FPGA_BYPASS_JTAG_SBW_PORT_OUT |= FPGA_BYPASS_TEST_BIT; } +#define FPGA_BYPASS_TEST_LOW { FPGA_BYPASS_JTAG_SBW_PORT_OUT &= ~FPGA_BYPASS_TEST_BIT; } +#define FPGA_BYPASS_RST_HIGH { FPGA_BYPASS_JTAG_SBW_PORT_OUT |= FPGA_BYPASS_RST_BIT; } +#define FPGA_BYPASS_RST_LOW { FPGA_BYPASS_JTAG_SBW_PORT_OUT &= ~FPGA_BYPASS_RST_BIT; } +#define FPGA_BYPASS_TDI_HIGH { FPGA_BYPASS_JTAG_SBW_PORT_OUT |= FPGA_BYPASS_TDI_BIT; } +#define FPGA_BYPASS_TDI_LOW { FPGA_BYPASS_JTAG_SBW_PORT_OUT &= ~FPGA_BYPASS_TDI_BIT; } +#define FPGA_BYPASS_TMS_HIGH { FPGA_BYPASS_JTAG_SBW_PORT_OUT |= FPGA_BYPASS_TMS_BIT; } +#define FPGA_BYPASS_TMS_LOW { FPGA_BYPASS_JTAG_SBW_PORT_OUT &= ~FPGA_BYPASS_TMS_BIT; } +#define FPGA_BYPASS_TCK_HIGH { FPGA_BYPASS_JTAG_SBW_PORT_OUT |= FPGA_BYPASS_TCK_BIT; } +#define FPGA_BYPASS_TCK_LOW { FPGA_BYPASS_JTAG_SBW_PORT_OUT &= ~FPGA_BYPASS_TCK_BIT; } +#define FPGA_BYPASS_TDO_IS_ASSERTED ( FPGA_BYPASS_JTAG_SBW_PORT_IN & FPGA_BYPASS_TDO_BIT ) + +// UART direction signals in bypass mode +#define FPGA_BYPASS_DIR_CTRL_UART_RTR_BIT ( BIT7 ) +#define FPGA_BYPASS_DIR_CTRL_UART_CTS_BIT ( BIT6 ) +#define FPGA_BYPASS_DIR_CTRL_UART_RXD_BIT ( BIT5 ) +#define FPGA_BYPASS_DIR_CTRL_UART_TXD_BIT ( BIT4 ) +//#define FPGA_BYPASS_DIR_CTRL_PORT_OUT ( P1OUT ) + +// UART data signals in bypass mode +#define FPGA_BYPASS_UART_RTR_BIT ( BIT1 ) +#define FPGA_BYPASS_UART_RTR_PORT_DIR ( P2DIR) +#define FPGA_BYPASS_UART_RTR_PORT_OUT ( P2OUT ) +#define FPGA_BYPASS_UART_CTS_BIT ( BIT5 ) +#define FPGA_BYPASS_UART_CTS_PORT_DIR ( P9DIR ) +#define FPGA_BYPASS_UART_CTS_PORT_OUT ( P9OUT ) +#define FPGA_BYPASS_UART_RXD_BIT ( BIT2 ) +#define FPGA_BYPASS_UART_RXD_PORT_DIR ( P8DIR ) +#define FPGA_BYPASS_UART_RXD_PORT_OUT ( P8OUT ) +#define FPGA_BYPASS_UART_TXD_BIT ( BIT3 ) +#define FPGA_BYPASS_UART_TXD_PORT_DIR ( P8DIR ) +#define FPGA_BYPASS_UART_TXD_PORT_OUT ( P8OUT ) + +// FPGA commands +#define FPGA_CMD_CFG 0x00 +#define FPGA_CMD_IR8_RD 0x01 +#define FPGA_CMD_IR8 0x02 +#define FPGA_CMD_IR4_RD 0x03 +#define FPGA_CMD_IR4 0x04 +#define FPGA_CMD_DR8_RD 0x05 +#define FPGA_CMD_DR8 0x06 +#define FPGA_CMD_DRX_RD 0x07 +#define FPGA_CMD_DRX 0x08 +#define FPGA_CMD_DRX0_RD 0x09 +#define FPGA_CMD_BYPASS 0x0A +#define FPGA_CMD_RESET 0x0B +#define FPGA_CMD_ABORT 0x0C +#define FPGA_CMD_VERSION 0x0D +#define FPGA_CMD_CJTAG 0x0E + +// FPGA cJTAG commands +#define FPGA_CJTAG_ZBS 0x00 +#define FPGA_CJTAG_TCKIDLE 0x01 + +// Config Parameters +//FPGA registers +#define REG_RESPONSE_HANDSHAKE_OFF 0x00 +#define REG_PROTOCOL 0x01 +#define REG_IRSCAN_PREAMBLE 0x02 +#define REG_IRSCAN_POSTAMBLE 0x03 +#define REG_DRSCAN_PREAMBLE 0x04 +#define REG_DRSCAN_POSTAMBLE 0x05 +#define REG_TEST_CLK_FREQUENCY 0x06 +#define REG_TARGET_IO_CONFIGURATION 0x07 +#define REG_TCLKset0 0x08 +#define REG_TCLKset1 0x09 +#define REG_TCLK_CLK_FREQUENCY 0x0a +#define REG_START_FIFO 0x0b +#define REG_STOP_FIFO 0x0c +#define REG_JTAG_4_WIRE_FPGA_432 0x0D + +#define JTAG_4_WIRE_FPGA 0 +#define SBW_2_MSP_FET_FPGA 2 +#define SBW_2_BACK_FPGA 1 +#define TDI_TO_TDO_FPGA 3 +#define TRI_STATE_FPGA_JTAG 4 +#define TRI_STATE_FPGA_SBW 5 + + +// PORTA bits +typedef union +{ + // Bit control + struct + { + unsigned char DATA0 : 8; + unsigned char UCA0TXD : 1; + unsigned char UCA0RXD : 1; + unsigned char CMD : 4; + unsigned char WR_TRIG : 1; + unsigned char RESERVED1 : 1; + } bit; + + // Bypass control + struct + { + unsigned char IO_GPIO0 : 1; + unsigned char IO_GPIO1 : 1; + unsigned char RESERVED0 : 2; + unsigned char DIR_CTRL_GPIO0 : 1; + unsigned char DIR_CTRL_GPIO1 : 1; + unsigned char DIR_CTRL_GPIO2 : 1; + unsigned char DIR_CTRL_GPIO3 : 1; + unsigned char IO_GPIO2 : 1; + unsigned char IO_GPIO3 : 1; + unsigned char RESERVED1 : 6; + } byp; + + // 16-bit access + unsigned int all; + +} s_FPGA_PA; + +// PORTB bits +typedef union +{ + // Bypass control + struct + { + unsigned char IO_TCK : 1; + unsigned char IO_TMS : 1; + unsigned char IO_TDI : 1; + unsigned char IO_TDO : 1; + unsigned char IO_RST : 1; + unsigned char IO_TEST : 1; + unsigned char RESERVED0 : 2; + unsigned char DIR_CTRL_TCK : 1; + unsigned char DIR_CTRL_TMS : 1; + unsigned char DIR_CTRL_TDI : 1; + unsigned char DIR_CTRL_TDO : 1; + unsigned char DIR_CTRL_RST : 1; + unsigned char DIR_CTRL_TEST : 1; + unsigned char RESERVED1 : 2; + } byp; + + // 16-bit access + unsigned int all; + +} s_FPGA_PB; + +#endif diff --git a/Bios/src/hil/msp_fet/cstartup_hil.s43 b/Bios/src/hil/msp_fet/cstartup_hil.s43 new file mode 100644 index 0000000..3044ed8 --- /dev/null +++ b/Bios/src/hil/msp_fet/cstartup_hil.s43 @@ -0,0 +1,454 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +#ifdef DISABLE_WATCHDOG +#include "msp430.h" +#endif + + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + // The CPU40 warning is issued when a Jxx instruction is place + // at the end of a segment part. However, this case is safe, + // as we have control of what will be placed right after the + // instruction. + SUPPRESS_CPU40_WARNING + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + RSEG DATA16_N +saved_stack DS 2 + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + + // -------------------- + // Initialize SP to point to the top of the stack. + // + + MOV SP, saved_stack + + pushx R4 + pushx R5 + pushx R6 + pushx R7 + pushx R8 + pushx R9 + pushx R10 + pushx R11 + pushx R12 + pushx R13 + pushx R14 + pushx R15 + + //MOV #SFE(CSTACK), SP + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + MOV #SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XCALL #__data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + MOVA #SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XCALL #__data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy + +#endif // IGNORE_DATA16_DATA + +#endif // MSP430X + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN _hil_startUp + EXTERN exit + +?cstart_call_main: + + popx R15 + popx R14 + popx R13 + popx R12 + popx R11 + popx R10 + popx R9 + popx R8 + popx R7 + popx R6 + popx R5 + popx R4 + + //XCALL #_hil_startUp + movx.a #_hil_startUp, PC + MOV saved_stack,SP + //XRET // indicates that the normal + //XCALL #exit + + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC16 __program_start + + ENDMOD + + +// --------------------------------------------------------- +// ?CPU30_OFFSET +// +// The compiler compensates for the CPU30 hardware bug by adding or +// subtracting the symbol ?CPU30_OFFSET from certain immediates. Here, +// it is defined to the default value zero (0), for when the device is +// not affected by CPU30. If the device is affected, the value must be +// set to two (2) using a linker command line override: +// +// -D?CPU30_OFFSET=2. +// +// The override is normally placed in the device-specific .xcl file. + + MODULE ?cpu30_offset + + PUBLIC ?CPU30_OFFSET + +?CPU30_OFFSET EQU 0 + + ENDMOD + + END diff --git a/Bios/src/hil/msp_fet/hil.c b/Bios/src/hil/msp_fet/hil.c new file mode 100644 index 0000000..f4aa158 --- /dev/null +++ b/Bios/src/hil/msp_fet/hil.c @@ -0,0 +1,2211 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +//! \ingroup MODULHIL +//! \file hil.c +//! \brief +//! + +//! \page hil_page1 (HIL) +//! \brief The HIL ... +//! \author Berenbrinker Florian (01/01/2012) +//! +//! files\n +//! \li hil.c +//! \li hil_2w.c +//! \li hil_4w.c +//! \li hil_delays.s43 +//! \li hil_delays.h +//! \li arch.h + +#include +#include "hw_compiler_specific.h" +#include "arch.h" +#include "hilDelays.h" + +#include "hilFpgaAccess.h" +#include "archFpga.h" + +#include "hilAdcControl.h" +#include "hilDacControl.h" + +#include "JTAG_defs.h" +#include "hil_Structs.h" +#include "../../fw/fet/FetVersion.h" + + +//#define HIL_VERSION 0x000C +#define HIL_SIGNATURE 0xF00DF00Dul +#define EXTERNAL_VCC_ON 1 +#define EXTERNAL_VCC_OFF 0 + +#define REGULATION_ON 1 +#define REGULATION_OFF 0 + +//! \brief version of bios code +const unsigned short hil_version_ @ "HILVERSION" = MSP_FET_HIL_VERSION; +#pragma required=hil_version_ + +const unsigned short hil_versionCmp_ @ "HILVERSIONCMP" = MSP_FET_HIL_VERSION_CMP; +#pragma required=hil_versionCmp_ + +const unsigned long hil_signature_ @ "HILSIGNATURE" = HIL_SIGNATURE; +#pragma required=hil_signature_ + + + + +unsigned short gTclkHighWhilePsa; +unsigned short setValueVcc; +unsigned short externalVccOn; +unsigned short regulationOn; + +unsigned short jtagReleased; +unsigned short setPCclockBeforeCapture; + +// function prototypes for map initialization +// common HIL configuration methods +short _hil_Init( void ); +short _hil_SetVcc(unsigned short Vcc); +short _hil_GetVcc(double* Vcc, double* ExtVcc); +short _hil_SetProtocol(unsigned short protocol_id); +void _hil_SetPsaSetup(unsigned short enhanced); +void _hil_SetPsaTCLK(unsigned short tclkValue); + +short _hil_Open( unsigned char state ); +short _hil_Close( void ); +short IccMonitor_Process(unsigned short flags); // flags: to be compatible with HIL calls +void _hil_EntrySequences(unsigned char states); + +void _hil_SetReset(unsigned char value); +void _hil_SetTest(unsigned char value); +void _hil_SetTMS(unsigned char value); +void _hil_SetTDI(unsigned char value); +void _hil_SetTCK(unsigned char value); + +void _hil_SetJtagSpeed(unsigned short jtagSpeed, unsigned short sbwSpeed); +void _hil_ConfigureSetPc (unsigned short PCclockBeforeCapture); + +void _hil_setDacValues(unsigned short dac0, unsigned short dac1); +short _hil_regulateVcc(void); +void _hil_switchVccFET(unsigned short switchVccFET); +short _hil_SetVcc(unsigned short Vcc); + +unsigned long hil_Jtag_read_idcode(); +unsigned long hil_swd_read_idcode(); + +// SBW4 +extern short _hil_4w_TapReset(void); +extern short _hil_4w_CheckJtagFuse(void); +extern void _hil_4w_StepPsa(unsigned long length); +extern void _hil_4w_StepPsaTclkHigh(unsigned long length); +extern short _hil_4w_BlowFuse(unsigned char targetHasTestVpp); +extern unsigned char _hil_4w_Instr(unsigned char Instruction); + +// SBW2 DMA +extern short _hil_2w_TapReset_Dma(void); +extern short _hil_2w_CheckJtagFuse_Dma(void); +extern unsigned char _hil_2w_Instr_Dma(unsigned char Instruction); +extern unsigned char _hil_2w_SetReg_XBits08_Dma(unsigned char Data); +extern unsigned short _hil_2w_SetReg_XBits16_Dma(unsigned short Data); +extern unsigned long _hil_2w_SetReg_XBits20_Dma(unsigned long Data); +extern unsigned long _hil_2w_SetReg_XBits32_Dma(unsigned long Data); +extern unsigned long long _hil_2w_SetReg_XBits64_Dma(unsigned long long Data); +extern unsigned long long _hil_2w_SetReg_XBits8_64_Dma(unsigned long long Data, unsigned short loopCount, unsigned short PG); +extern void _hil_2w_Tclk_Dma(unsigned char state); +extern void _hil_2w_StepPsa_Dma(unsigned long length); +extern void _hil_2w_StepPsa_Dma_Xv2(unsigned long length); +extern void _hil_2w_StepPsaTclkHigh_Dma(unsigned long length); +extern short _hil_2w_BlowFuse_Dma(unsigned char targetHasTestVpp); +extern void _hil_2w_ConfigureSpeed_Dma(unsigned short speed); +extern unsigned char _hil_2w_GetPrevInstruction_Dma(); +extern unsigned char DMA_TMSL_TDIL[]; +extern void setProtocolSbw2Dma(unsigned short id); + +short _hil_dummy_TapReset(void) {return 0;} +short _hil_dummy_CheckJtagFuse(void){return 0;} +unsigned char _hil_dummy_Instr(unsigned char Instruction){return 0;} +unsigned char _hil_dummy_SetReg_XBits08(unsigned char Data){return 0;} +unsigned char _hil_dummy_Instr_4(unsigned char Data){return 0;} + +unsigned short _hil_dummy_SetReg_XBits16(unsigned short Data){return 0;} +unsigned long _hil_dummy_SetReg_XBits20(unsigned long Data){return 0;} +unsigned long _hil_dummy_SetReg_XBits32(unsigned long Data){return 0;} +unsigned long long _hil_dummy_SetReg_XBits64(unsigned long long Data){return 0;} +unsigned long long _hil_dummy_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion){return 0;} +unsigned long long _hil_dummy_SetReg_XBits(unsigned long long *data, unsigned short count){return 0;} +unsigned long long _hil_dummy_SetReg_XBits35(unsigned long long *data){return 0;} + +void _hil_dummy_Tclk(unsigned char state){return;} +void _hil_dummy_StepPsa(unsigned long length){return;} +short _hil_dummy_BlowFuse(unsigned char targetHasTestVpp){return 0;} +unsigned char _hil_dummy_GetPrevInstruction(){return 0;} + +short _hil_dummy_Write_Read_Ap(unsigned long address ,unsigned long *data, unsigned short rnw){return -1;}; +short _hil_dummy_Write_Read_Dp(unsigned char address ,unsigned long *data, unsigned short rnw){return -1;}; +short _hil_dummy_Write_Read_Mem_Ap(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw){return -1;}; +unsigned long _hil_read_idcodeDummy(){return -1;} +unsigned char _hil_dummy_TransferData(unsigned char regiser, unsigned long* data, unsigned char rnw){return -1;}; +void _hil_dummy_SetToolID(unsigned short id) {return;} + +// FPGA generic 430 +extern void initGeneric(); +extern unsigned char _hil_generic_Instr(unsigned char Instruction); + +extern unsigned char _hil_generic_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_generic_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_generic_SetReg_XBits20(unsigned long Data); +extern unsigned long _hil_generic_SetReg_XBits32(unsigned long Data); +extern unsigned long long _hil_generic_SetReg_XBits64(unsigned long long Data); +extern unsigned long long _hil_generic_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short PG); +extern void _hil_generic_Tclk(unsigned char state); +extern void _hil_generic_ConfigureSpeed(unsigned short speed); +extern unsigned char _hil_generic_GetPrevInstruction(); + +// FPGA generic 432 +extern unsigned char _hil_generic432_Instr_4(unsigned char Data); +//extern unsigned long long _hil_generic432_SetReg_XBits(unsigned long long *data, unsigned short count); +extern unsigned char _hil_generic432_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_generic432_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_generic432_SetReg_XBits32(unsigned long Data); +extern unsigned long long _hil_generic432_SetReg_XBits64(unsigned long long Data); +extern unsigned long long _hil_generic432_SetReg_XBits35(unsigned long long *data); + +extern void hil_4w_432_Seq(unsigned short length, unsigned char *sequence); + +// FPGA generic +extern unsigned short hil_fpga_get_version(void); +extern void _hil_FpgaAccess_setTimeOut(unsigned short state); + +// protocol specific methods +// must be implemeted in SWD mode +extern void hil_Swd_InitJtag(struct jtag tmp); +extern void hil_Swd_Seq(unsigned short length, unsigned char *sequence); +extern unsigned char Swd_TransferData(unsigned char regiser, unsigned long* data, unsigned char rnw); + +extern void SWDTCKset1(); +extern void SWDTCKset0(); + +void SWD_Entry(); +void JTAG_Entry(); + +short _hil_Write_Read_Ap_Jtag(unsigned long address ,unsigned long *data, unsigned short rnw); +short _hil_Write_Read_Dp_Jtag(unsigned char address ,unsigned long *data, unsigned short rnw); +short _hil_Write_Read_Mem_Ap_Jtag(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw); + +short _hil_Write_Read_Dp_Swd(unsigned char address ,unsigned long *data, unsigned short rnw); +short _hil_Write_Read_Ap_Swd(unsigned long address, unsigned long *data, unsigned short rnw); +short _hil_Write_Read_Mem_Ap_Swd(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw); + +void _hil_Release(void); +void hil_initTimerA2(void); +void _hil_BSL_EntrySequence(unsigned short); +void _hil_BSL_EntrySequence1xx_4xx(); +void _hil_ReadADC12(void); +void _hil_ConfigFpgaIoMode(unsigned short mode); + +static void _hil_Connect(unsigned char state); + +extern void initJtagSbw2Dma(struct jtag tmp); +extern void initJtagSbw4(struct jtag tmp); + +edt_common_methods_t _Common_Methods; +edt_distinct_methods_t _Distinct_Methods; + +static struct jtag _Jtag = +{ + 0, // TCK, P4.4 (out) (high) + 0, // TMS, P4.5 (out) (high) + 0, // TDI, P4.6 (out) (high) + 0, // TDO, P4.7 (in) + 0, + 0, + 0, //RST + 0, //TST + 0 +}; + +// fuse blow control +static struct vfuse_ctrl _VFuse = +{ + 0, // VF2TEST + 0, // VF2TDI + 0, // TDIOFF + 0, // VF control register + 0, // PWM_SETVF + 0, // VF PWM control register +}; + +unsigned short gprotocol_id; +static unsigned short hil_sbw2Speed_; +static unsigned short hil_jtagSpeed_; +static short dtVccSenseState = 0; + +static volatile unsigned char useTDI = 0; + +#pragma inline=forced +void RSTset1() +{ + { (*_Jtag.Out) |= _Jtag.RST; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void RSTset0() +{ + { (*_Jtag.Out) &= ~_Jtag.RST; } + _hil_Delay_1ms(5); +} + +#pragma inline=forced +void TMSset1() +{ + { (*_Jtag.Out) |= _Jtag.TMS; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TMSset0() +{ + { (*_Jtag.Out) &= ~_Jtag.TMS; } + _hil_Delay_1ms(5); +} + +#pragma inline=forced +void TCKset1() +{ + { (*_Jtag.Out) |= _Jtag.TCK; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TCKset0() +{ + { (*_Jtag.Out) &= ~_Jtag.TCK; } + _hil_Delay_1ms(5); +} + +#pragma inline=forced +void TCKset1NoDelay() +{ + { (*_Jtag.Out) |= _Jtag.TCK; } +} + +#pragma inline=forced +void TCKset0NoDelay() +{ + { (*_Jtag.Out) &= ~_Jtag.TCK; } +} + +#pragma inline=forced +void TDIset1() +{ + { (*_Jtag.Out) |= _Jtag.TDI; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TDIset0() +{ + { (*_Jtag.Out) &= ~_Jtag.TDI; } + _hil_Delay_1ms(5); +} + +#pragma inline=forced +void TSTset1() +{ + { (*_Jtag.Out) |= _Jtag.TST;} + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TSTset0() +{ + {(*_Jtag.Out) &= ~_Jtag.TST; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TSTset1NoDelay() +{ + { (*_Jtag.Out) |= _Jtag.TST;} +} +#pragma inline=forced +void TSTset0NoDelay() +{ + {(*_Jtag.Out) &= ~_Jtag.TST; } +} + +//#pragma inline=forced +void TCLKset1() +{ + _Distinct_Methods.Tclk(1); +} + +//#pragma inline=forced +void TCLKset0() +{ + _Distinct_Methods.Tclk(0); +} +#pragma inline=forced +void TCLK() +{ + TCLKset0(); + TCLKset1(); +} + +static void _hil_initEdtCommenMethods() +{ + _Common_Methods.Init = _hil_Init; + + _Common_Methods.SetVcc = _hil_SetVcc; + _Common_Methods.SwitchVccFET = _hil_switchVccFET; + _Common_Methods.GetVcc = _hil_GetVcc; + + _Common_Methods.SetProtocol = _hil_SetProtocol; + _Common_Methods.SetPsaTCLK = _hil_SetPsaTCLK; + + _Common_Methods.Open = _hil_Open; + _Common_Methods.Close = _hil_Close; + + _Common_Methods.Delay_1us = _hil_Delay_1us; + _Common_Methods.Delay_1ms = _hil_Delay_1ms; + + _Common_Methods.Loop = 0; + + _Common_Methods.EntrySequences = _hil_EntrySequences; + + _Common_Methods.SetReset = _hil_SetReset; + _Common_Methods.SetTest = _hil_SetTest; + _Common_Methods.SetTMS = _hil_SetTMS; + _Common_Methods.SetTCK = _hil_SetTCK; + _Common_Methods.SetTDI = _hil_SetTDI; + + _Common_Methods.SetJtagSpeed = _hil_SetJtagSpeed; + + _Common_Methods.ConfigureSetPc = _hil_ConfigureSetPc; + _Common_Methods.initDelayTimer = hil_initTimerA2; + + _Common_Methods.BSL_EntrySequence = _hil_BSL_EntrySequence; + _Common_Methods.BSL_EntrySequence1xx_4xx = _hil_BSL_EntrySequence1xx_4xx; + _Common_Methods.SetToolID = _hil_dummy_SetToolID; + + + _Common_Methods.regulateVcc = _hil_regulateVcc; + _Common_Methods.setFpgaTimeOut = _hil_FpgaAccess_setTimeOut; + _Common_Methods.getFpgaVersion = hil_fpga_get_version; + _Common_Methods.ReadADC12 = _hil_ReadADC12; + _Common_Methods.ConfigFpgaIoMode = _hil_ConfigFpgaIoMode; +} + +void _hil_getEdtDistinct(edt_distinct_methods_t* edt_distinct); +void _hil_getEdtCommen(edt_common_methods_t* edt_commen); +void _hil_switchVccFET(unsigned short switchVccFET); + +#pragma required=_hil_getEdtDistinct +#pragma required=_hil_getEdtCommen + +void _hil_startUp() +{ + _hil_initEdtCommenMethods(); + _Common_Methods.Init(); + + // DMA4 workaround + DMACTL4 |= DMARMWDIS; + + return; +} +#pragma location="INFO_C_DISTINCT" +void _hil_getEdtDistinct(edt_distinct_methods_t* edt_distinct) +{ + if(edt_distinct == 0) + { + return; + } + + *edt_distinct = _Distinct_Methods; +} + +#pragma location="INFO_C_COMMEN" +void _hil_getEdtCommen(edt_common_methods_t* edt_commen) +{ + if(edt_commen == 0) + { + return; + } + + *edt_commen = _Common_Methods; +} + +void hil_initFuseBlow(struct vfuse_ctrl tmp) +{ + _VFuse = tmp; +} + +void hil_initTimerB0(void) +{ + // Setup timer_B0 for current pulse measurement + TB0CTL = MC__STOP; + TB0CTL = TBSSEL__TBCLK + MC__CONTINUOUS + TBIE; +} + +// ----------------------------------------------------------------------------- +void hil_initTimerA0(void) +{ + // Setup time_A0 for timestamping + TA0CTL = MC__STOP; // STOP Timer + TA0CTL = ID__8 + TASSEL__SMCLK; // Timer_A0 source:SMCLK/8 = 20 / 8 = 2.500 MHz = 1/400ns + TA0EX0 = 1; // Timer_A0 set additional divider to /2 + TA0CTL |= TACLR + MC__CONTINOUS + TAIE; // START the timer in free-running mode +} + +// ----------------------------------------------------------------------------- +void hil_initTimerA2(void) +{ + // Setup timer_A2 for hardware delay + TA2CTL = 0; // STOP Timer + TA2CTL = ID__8 +TASSEL__SMCLK; // Timer_B source:SMCLK ,SMCLK/0 = 20 + TA2CCR0 = 0x8A0; // Load CCR0 with delay... (1ms delay) + TA2CCTL0 &= ~CCIE; +} + +#pragma inline=forced +void qDriveJTAG(void) +{ + (*_Jtag.Out) |= (_Jtag.TCK + _Jtag.TMS + _Jtag.TDI + _Jtag.RST ); + (*_Jtag.Out) &= (~_Jtag.TST); + (*_Jtag.DIRECTION) |= (_Jtag.TCK + _Jtag.TMS + _Jtag.TDI); + (*_Jtag.DIRECTION) |= (_Jtag.TST + _Jtag.RST); + (*_Jtag.DIRECTION) &= (~_Jtag.TDO); +} + +#pragma inline=forced +void qDriveSbw(void) +{ + (*_Jtag.Out) |= _Jtag.RST; + (*_Jtag.Out) &= ~_Jtag.TST; + (*_Jtag.DIRECTION) |= ( _Jtag.TST + _Jtag.RST); +} + +#pragma inline=forced +void qDriveSwd(void) +{ + (*_Jtag.Out) |= _Jtag.TCK; + (*_Jtag.Out) &= ~_Jtag.TMS; + (*_Jtag.DIRECTION) |= ( _Jtag.TCK + _Jtag.TMS); +} + +void _hil_ConfigFpgaIoMode(unsigned short mode) +{ + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_TARGET_IO_CONFIGURATION, mode); +} + + +void _hil_BSL_EntrySequence1xx_4xx() +{ + hil_fpga_enable_bypass(); + + if(gprotocol_id == SPYBIWIRE) + { + qDriveSbw(); + } + else + { + qDriveJTAG(); + } + + RSTset0(); // set RST 0 + // INIT phase + TSTset0(); + _hil_Delay_1ms(100); + + TSTset1(); // set test to 1 + _hil_Delay_1ms(100); + + //this is the first pulse keep it low for less than 15us for 5xx + TSTset0NoDelay(); + + TCKset0NoDelay(); + _hil_Delay_1us(5); + + TCKset1NoDelay(); + _hil_Delay_1us(5); + + TSTset1(); // set test 1; + + _hil_Delay_1ms(50); + TCKset0(); + + RSTset1(); // set RST 1; + _hil_Delay_1ms(50); + + TCKset1(); + + TSTset0(); // set test 0; + _hil_Delay_1ms(50); + + hil_fpga_disable_bypass(); +} + + +void _hil_BSL_EntrySequence(unsigned short switchBypassOff) +{ + hil_fpga_enable_bypass(); + + if(gprotocol_id == SPYBIWIRE) + { + qDriveSbw(); + } + else + { + qDriveJTAG(); + } + + RSTset0(); // set RST 0 + // INIT phase + TSTset0(); + _hil_Delay_1ms(100); + + TSTset1(); // set test to 1 + _hil_Delay_1ms(100); + + //this is the first pulse keep it low for less than 15us for 5xx + TSTset0NoDelay(); + if(!switchBypassOff) + { + TCKset0NoDelay(); + _hil_Delay_1us(5); + } + else + { + _hil_Delay_1us(10); + } + + if(!switchBypassOff) + { + TCKset1NoDelay(); + _hil_Delay_1us(5); + } + TSTset1(); // set test 1; + + _hil_Delay_1ms(50); + if(!switchBypassOff) + { + TCKset0(); + } + RSTset1(); // set RST 1; + _hil_Delay_1ms(50); + if(!switchBypassOff) + { + TCKset1(); + } + TSTset0(); // set test 0; + _hil_Delay_1ms(50); + + if(switchBypassOff) + { + hil_fpga_disable_bypass(); + } +} + + +// ----------------------------------------------------------------------------- + +short _hil_Init( void ) +{ + hil_initTimerA0(); // TimeStamp + hil_initTimerA2(); // Current pulse counter + hil_initTimerB0(); // Delay loop timer + + hil_DacControlInitDAC0(); + hil_DacControlInitDAC1(); + hil_AdcControlInitADC(); + + DMACTL2 = 0; + DMACTL1 = 0; + + // default config + externalVccOn = EXTERNAL_VCC_OFF; + regulationOn = REGULATION_OFF; + dtVccSenseState = 0; + + // set default to TCLK low when doing PSA + gTclkHighWhilePsa = 0; + // initialize function pointers to distinct functions + + // initialize FPGA + hil_fpga_init(); + // set default debug protocol to JTAG + gprotocol_id = SPYBIWIREJTAG; + // set default to TCLK low when doing PSA + gTclkHighWhilePsa = 0; + // initialize function pointers to distinct functions + _hil_SetProtocol(SPYBIWIREJTAG); + jtagReleased = 1; + + // initialize fuse blow control + hil_initFuseBlow(_Msp_Fet); + + // Default SBW2 speed --> 60MHz/(98+2) = 600 kHz + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_TEST_CLK_FREQUENCY, 35); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_TCLK_CLK_FREQUENCY, 35); + // set Io config to IO_CONFIG_HIGH_Z_UART + _hil_ConfigFpgaIoMode(0x0); + return 0; +} + + +short _hil_regulateVcc(void) +{ + volatile unsigned short externalVcc = 0, dtVcc = 0; + volatile short actualDeviation = 0; + + externalVcc = hil_AdcControlGetExternalVcc(); + dtVcc = hil_AdcControlGetVccDt(); + + if(dtVccSenseState) + { + P8OUT |= BIT0; + _hil_Delay_1ms(500); + dtVccSenseState = 0; + } + + if(hil_AdcControlGetDtVccSense() > 280 ) + { + P8OUT &= ~BIT0; + dtVccSenseState = 1; + _hil_Delay_1ms(1000); + return 1; + } + + if((externalVcc < 1600 || externalVcc > 3800 )&& externalVccOn) + { + externalVccOn = EXTERNAL_VCC_OFF; + return 0; + } + + if(externalVcc > 1600 && externalVcc < 3800) + { + // interal target VCC set 0 + hil_DacControlSetDAC1(0); + setValueVcc = externalVcc; + externalVccOn = EXTERNAL_VCC_ON; + regulationOn = REGULATION_ON; + } + + // if VCC or no External VCC measured , do not regulate + if(!regulationOn || !externalVccOn) + { + return 0; + } + // JAG VCC - I - part - must be regulated with external and internal VCC to keep the same level + if(dtVcc < (setValueVcc - 10)) + { + actualDeviation = setValueVcc - dtVcc; + if(DAC12_0DAT > 0) + { + if(actualDeviation > 500) + { + hil_DacControlSetDAC0(DAC12_0DAT - 100); + } + else if(actualDeviation > 100) + { + hil_DacControlSetDAC0(DAC12_0DAT - 10); + } + else if(actualDeviation > 20) + { + hil_DacControlSetDAC0(DAC12_0DAT - 5); + } + else + { + hil_DacControlSetDAC0(DAC12_0DAT - 1); + } + } + } + else if(dtVcc > (setValueVcc + 10)) + { + actualDeviation = dtVcc - setValueVcc; + + if(DAC12_0DAT <= 0xD00) + { + if(actualDeviation > 500) + { + hil_DacControlSetDAC0(DAC12_0DAT + 100); + } + else if(actualDeviation > 100) + { + hil_DacControlSetDAC0(DAC12_0DAT + 10); + } + else if(actualDeviation > 20) + { + hil_DacControlSetDAC0(DAC12_0DAT + 5); + } + else + { + hil_DacControlSetDAC0(DAC12_0DAT + 1 ); + } + } + } + + return 0; +} + +void _hil_setDacValues(unsigned short dac0, unsigned short dac1) +{ + hil_DacControlSetDAC1(dac1); + hil_DacControlSetDAC0(dac0); +} + +void _hil_ReadADC12(void) +{ + hil_AdcControlRead(); +} + +void _hil_switchVccFET(unsigned short switchVccFET) +{ + if(switchVccFET) + { + hil_fpga_enable_bypass(); + //This workaround is necessary to set TCK & TEST to a defined low level before + //applying Vcc to the target device + //otherwise the target will not power up correctly and the UIF can't + //establish a SBW communication + TSTset0(); + (*_Jtag.Out) &= ~(_Jtag.TCK ); + (*_Jtag.DIRECTION) |= (_Jtag.TCK); + + // During USB power up, TDI and TMS output pins need to be put to Hi-Z state. + // configuer level shifter as input - Hi-Z + (*_Jtag.Out) &= ~(_Jtag.TDI + _Jtag.TMS); + (*_Jtag.DIRECTION) &= ~(_Jtag.TDI + _Jtag.TMS); + FPGA_BYPASS_DIR_CTRL_PORT_OUT &= ~(_Jtag.TDI + _Jtag.TMS); + + P8DIR |= (BIT0 + BIT7); + P8OUT |= (BIT0 + BIT7); + + _hil_Delay_1ms(10); + hil_fpga_disable_bypass(); + } + else + { + P8OUT &= ~(BIT0 + BIT7); + } +} + +savedDacValues_t _savedDacValues; + +#pragma optimize = low +short _hil_SetVccSupplyDt(unsigned short Vcc) +{ + int correctVccDt = 0; + int maxCount = 400; + short actualDeviation = 0; + + if(Vcc < 2200) + { + maxCount = 800; + } + + ADC12IE = 0; + hil_DacControlSetDAC0((unsigned short)(((float)((float)setValueVcc/(float)1000)*(-1707) + 6145))); + + if(DAC12_0DAT > 0xD00) + { + DAC12_0DAT = 0xD00; + } + + while( correctVccDt < 3 && maxCount-- > 0) + { + unsigned short dtVcc = 0; + actualDeviation = 0; + { + int i = 0; + while(i++ < 43) + { + ADC12CTL0 |= ADC12SC; // Sampling and conversion start + hil_AdcControlRead(); + ADC12CTL0 &= ~ADC12SC; + _hil_Delay_1us(20); + } + } + dtVcc = hil_AdcControlGetVccDt(); + // JAG VCC - I - part - must be regulated with external and internal VCC to keep the same level + if(dtVcc < (setValueVcc - 10)) + { + actualDeviation = setValueVcc - dtVcc; + if(actualDeviation > 500 && ((DAC12_0DAT - 100) > 0)) + { + hil_DacControlSetDAC0(DAC12_0DAT - 100); + } + else if(actualDeviation > 100 && ((DAC12_0DAT - 30) > 0)) + { + hil_DacControlSetDAC0(DAC12_0DAT - 30); + } + else if(actualDeviation > 20 && ((DAC12_0DAT - 5) > 0)) + { + hil_DacControlSetDAC0(DAC12_0DAT - 5); + } + else if((DAC12_0DAT - 1) > 0) + { + hil_DacControlSetDAC0(DAC12_0DAT - 1); + } + } + else if(dtVcc > (setValueVcc + 10)) + { + actualDeviation = dtVcc - setValueVcc; + + if(actualDeviation > 500 && ((DAC12_0DAT + 100) <= 0xD00)) + { + hil_DacControlSetDAC0(DAC12_0DAT + 100); + } + else if(actualDeviation > 100 && ((DAC12_0DAT + 30) <= 0xD00)) + { + hil_DacControlSetDAC0(DAC12_0DAT + 30); + } + else if(actualDeviation > 20&& ((DAC12_0DAT + 5) <= 0xD00)) + { + hil_DacControlSetDAC0(DAC12_0DAT + 5); + } + else if((DAC12_0DAT + 1) <= 0xD00) + { + hil_DacControlSetDAC0(DAC12_0DAT + 1 ); + } + } + else + { + correctVccDt++; + } + } + + ADC12IE = 0x08;// Enable ADC12IFG.2 + return (correctVccDt > 2) ? 1 : 0; +} + +#pragma optimize = low +short _hil_SetVccSupply(unsigned short Vcc) +{ + int correctVcc = 0; + int maxCount = 400; + short actualDeviation = 0; + setValueVcc = Vcc; + + if(Vcc < 2400) + { + maxCount = 800; + } + + ADC12IE = 0; + hil_DacControlSetDAC1((unsigned short)(((float)((float)setValueVcc/(float)1000)*820))); + + // check if p regulate values are out of range - if yes correct them + if(DAC12_1DAT > 0xC10) + { + DAC12_1DAT = 0xC10; + } + else if( DAC12_1DAT <= 0x550) + { + DAC12_1DAT = 0x552; + } + // integrnal target VCC - I part of regulation - small delta VCC + while(correctVcc < 3 && maxCount-- > 0) + { + unsigned short vccSupply = 0; + actualDeviation = 0; + { + int i = 0; + while(i++ < 43) + { + ADC12CTL0 |= ADC12SC; // Sampling and conversion start + hil_AdcControlRead(); + ADC12CTL0 &= ~ADC12SC; + _hil_Delay_1us(20); + } + } + vccSupply = hil_AdcControlGetSupplyVcc(); + // VCC supply ------------------------------------------------------ + //negative deviation + if(vccSupply < (setValueVcc - 10)) + { + correctVcc = 0; + actualDeviation = setValueVcc - vccSupply; + + if(actualDeviation > 500 && ((DAC12_1DAT + 100) <= 0xC10)) + { + hil_DacControlSetDAC1(DAC12_1DAT + 100); + } + else if(actualDeviation > 100 && ((DAC12_1DAT + 30) <= 0xC10)) + { + hil_DacControlSetDAC1(DAC12_1DAT + 30); + } + else if(actualDeviation > 20 && ((DAC12_1DAT + 5) <= 0xC10)) + { + hil_DacControlSetDAC1(DAC12_1DAT + 5); + } + else if((DAC12_1DAT + 1) <= 0xC10) + { + hil_DacControlSetDAC1(DAC12_1DAT + 1); + } + } + //positve deviation + else if(vccSupply > (setValueVcc + 10)) + { + actualDeviation = vccSupply - setValueVcc; + correctVcc = 0; + + if(actualDeviation > 500 && ((DAC12_1DAT - 100) > (0x550))) + { + hil_DacControlSetDAC1(DAC12_1DAT -100); + } + else if(actualDeviation > 100 && ((DAC12_1DAT - 30) > (0x550))) + { + hil_DacControlSetDAC1(DAC12_1DAT - 30); + } + else if(actualDeviation > 20 && ((DAC12_1DAT - 5) > (0x550))) + { + hil_DacControlSetDAC1(DAC12_1DAT - 5); + } + else if(((DAC12_1DAT - 1) > (0x550))) + { + hil_DacControlSetDAC1(DAC12_1DAT - 1); + } + } + else + { + correctVcc++; + } + //----------------------------------------------------------------- + } + ADC12IE = 0x08;// Enable ADC12IFG.2 + + return (correctVcc > 2) ? 1 : 0; +} + +#pragma optimize = low +// ----------------------------------------------------------------------------- +short _hil_SetVcc(unsigned short Vcc) +{ + ADC12IE = 0; + if(Vcc < 1600 || Vcc > 3800) + { + //Turn off the Power switch + //Vcc Supply + _hil_Delay_1ms(1); + _hil_Release(); + setValueVcc = 0; + externalVccOn = EXTERNAL_VCC_OFF; + regulationOn = REGULATION_OFF; + ADC12IE = 0x08; + return 0; + } + if(_savedDacValues.Vcc == Vcc && _savedDacValues.valid == 1) + { + hil_DacControlSetDAC1(_savedDacValues.DAC1); + hil_DacControlSetDAC0(_savedDacValues.DAC0); + ADC12IE = 0x08;// Enable ADC12IFG.2 + return 0; + } + if((!_hil_SetVccSupply(Vcc)) || (!_hil_SetVccSupplyDt(Vcc))) + { + _hil_SetVccSupply(Vcc); + _hil_SetVccSupplyDt(Vcc); + } + + _savedDacValues.DAC0 = DAC12_0DAT; + _savedDacValues.DAC1 = DAC12_1DAT; + _savedDacValues.Vcc = Vcc; + _savedDacValues.valid = 1; + + externalVccOn = EXTERNAL_VCC_OFF; + return 0; +} +// ----------------------------------------------------------------------------- + +short _hil_GetVcc(double* Vcc, double* ExtVcc) +{ + float vccSupply = 0, externalVcc = 0; + + externalVcc = hil_AdcControlGetExternalVcc(); + vccSupply = hil_AdcControlGetSupplyVcc(); + + if(externalVcc >= 1650 && externalVcc < 3800) + { + setValueVcc = (unsigned short)externalVcc; + externalVccOn = EXTERNAL_VCC_ON; + regulationOn = REGULATION_ON; + + if(gprotocol_id != SWD_432) + { + hil_fpga_enable_bypass(); + } + + P8DIR |= (BIT0); + P8OUT |= (BIT0); + + _hil_Delay_1ms(10); + if(gprotocol_id != SWD_432) + { + hil_fpga_disable_bypass(); + } + } + else + { + externalVccOn = EXTERNAL_VCC_OFF; + } + *Vcc = vccSupply; + *ExtVcc = externalVcc; + return 0; +} + +#pragma optimize = low +// ----------------------------------------------------------------------------- +short _hil_SetProtocol(unsigned short protocol_id) +{ + short ret_value = 0; + + if( protocol_id == SPYBIWIRE ) + { + gprotocol_id = SPYBIWIRE; + _Jtag = _SBW_Back; + initJtagSbw2Dma(_Jtag); + initJtagBypass(_Jtag); + initGeneric(); + _hil_2w_ConfigureSpeed_Dma(SBW100KHz); + } + else if( protocol_id == SPYBIWIREJTAG || protocol_id == JTAG || protocol_id == JTAG_432) + { + gprotocol_id = protocol_id; + _Jtag = _Jtag_Target; + initJtagSbw4(_Jtag); + initJtagBypass(_Jtag); + initGeneric(); + } + else if(protocol_id == SWD_432) + { + gprotocol_id = protocol_id; + _Jtag = _Jtag_Target; + hil_Swd_InitJtag(_Jtag); + initJtagBypass(_Jtag); + initGeneric(); + } + else if( protocol_id == SPYBIWIRE_SUBMCU ) + { + _Jtag = _Jtag_SubMcu; + initJtagSbw2Dma(_Jtag); + gprotocol_id = SPYBIWIRE_SUBMCU; + setProtocolSbw2Dma(SPYBIWIRE_SUBMCU); + _hil_2w_ConfigureSpeed_Dma(SBW600KHz); + } + else if( protocol_id == SPYBIWIRE_MSP_FET) + { + gprotocol_id = protocol_id; + _Jtag = _Jtag_Target; + initJtagSbw2Dma(_Jtag); + initJtagBypass(_Jtag); + initGeneric(); + _hil_2w_ConfigureSpeed_Dma(SBW100KHz); + } + else + { + ret_value = -1; + } + + if( protocol_id == SPYBIWIRE || protocol_id == SPYBIWIRE_SUBMCU || protocol_id == SPYBIWIRE_MSP_FET) + { + // load DMA1 with size just default + DMA1CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); + DMA1DA = (_Jtag.Out); //JTAGOUT; // set destination address + DMA2CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); + DMA2DA = (_Jtag.Out); //JTAGOUT; // set destination address + + // Functionality executed in FPGA bypass mode by Sub-MCU + _Distinct_Methods.TapReset = _hil_2w_TapReset_Dma; + _Distinct_Methods.CheckJtagFuse = _hil_2w_CheckJtagFuse_Dma; + + // SBW communication with Sub-MCU is executed in Bit-Banging mode + if ( protocol_id == SPYBIWIRE_SUBMCU ) + { + _Distinct_Methods.Instr = _hil_2w_Instr_Dma; + _Distinct_Methods.SetReg_XBits08 = _hil_2w_SetReg_XBits08_Dma; + _Distinct_Methods.SetReg_XBits16 = _hil_2w_SetReg_XBits16_Dma; + _Distinct_Methods.SetReg_XBits20 = _hil_2w_SetReg_XBits20_Dma; + _Distinct_Methods.SetReg_XBits32 = _hil_2w_SetReg_XBits32_Dma; + _Distinct_Methods.SetReg_XBits64 = _hil_2w_SetReg_XBits64_Dma; + _Distinct_Methods.SetReg_XBits8_64 = _hil_2w_SetReg_XBits8_64_Dma; + _Distinct_Methods.Tclk = _hil_2w_Tclk_Dma; + _Distinct_Methods.GetPrevInstruction = _hil_2w_GetPrevInstruction_Dma; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _Distinct_Methods.SetReg_XBits35 = _hil_dummy_SetReg_XBits35; + _Distinct_Methods.SwdTransferData = _hil_dummy_TransferData; + } + // SBW communication with Target-MCU is executed in FPGA mode + else if( protocol_id == SPYBIWIRE || protocol_id == SPYBIWIRE_MSP_FET) + { + _Distinct_Methods.Instr = _hil_generic_Instr; + _Distinct_Methods.SetReg_XBits08 = _hil_generic_SetReg_XBits08; + _Distinct_Methods.SetReg_XBits16 = _hil_generic_SetReg_XBits16; + _Distinct_Methods.SetReg_XBits20 = _hil_generic_SetReg_XBits20; + _Distinct_Methods.SetReg_XBits32 = _hil_generic_SetReg_XBits32; + _Distinct_Methods.SetReg_XBits64 = _hil_generic_SetReg_XBits64; + _Distinct_Methods.SetReg_XBits8_64 = _hil_generic_XBits8_64; + _Distinct_Methods.GetPrevInstruction = _hil_generic_GetPrevInstruction; + _Distinct_Methods.Tclk = _hil_generic_Tclk; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _Distinct_Methods.SetReg_XBits35 = _hil_dummy_SetReg_XBits35; + _Distinct_Methods.SwdTransferData = _hil_dummy_TransferData; + } + if(gTclkHighWhilePsa == 1) + { + _Distinct_Methods.StepPsa = _hil_2w_StepPsaTclkHigh_Dma; + } + else if(gTclkHighWhilePsa == 2) + { + _Distinct_Methods.StepPsa = _hil_2w_StepPsa_Dma_Xv2; + } + else + { + _Distinct_Methods.StepPsa = _hil_2w_StepPsa_Dma; + } + _Distinct_Methods.BlowFuse = _hil_2w_BlowFuse_Dma; + + DMA2SA = (unsigned char*)DMA_TMSL_TDIL; + } + else if ( protocol_id == SPYBIWIREJTAG || protocol_id == JTAG) + { + _Distinct_Methods.TapReset = _hil_4w_TapReset; + _Distinct_Methods.CheckJtagFuse = _hil_4w_CheckJtagFuse; + _Distinct_Methods.Instr = _hil_generic_Instr; + _Distinct_Methods.SetReg_XBits08 = _hil_generic_SetReg_XBits08; + _Distinct_Methods.SetReg_XBits16 = _hil_generic_SetReg_XBits16; + _Distinct_Methods.SetReg_XBits20 = _hil_generic_SetReg_XBits20; + _Distinct_Methods.SetReg_XBits32 = _hil_generic_SetReg_XBits32; + _Distinct_Methods.SetReg_XBits64 = _hil_generic_SetReg_XBits64; + _Distinct_Methods.SetReg_XBits8_64 = _hil_generic_XBits8_64; + _Distinct_Methods.GetPrevInstruction = _hil_generic_GetPrevInstruction; + _Distinct_Methods.Tclk = _hil_generic_Tclk; + + // load dummies for 432 + _Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.SetReg_XBits35 = _hil_dummy_SetReg_XBits35; + _Distinct_Methods.SwdTransferData = _hil_dummy_TransferData; + + if(gTclkHighWhilePsa == 0 || gTclkHighWhilePsa == 2) + { + _Distinct_Methods.StepPsa = _hil_4w_StepPsa; + } + else + { + _Distinct_Methods.StepPsa = _hil_4w_StepPsaTclkHigh; + } + _Distinct_Methods.BlowFuse = _hil_4w_BlowFuse; + } + else if (protocol_id == JTAG_432) + { + // load dummies for 430 + _Distinct_Methods.CheckJtagFuse = _hil_dummy_CheckJtagFuse; + _Distinct_Methods.Instr = _hil_dummy_Instr; + _Distinct_Methods.SetReg_XBits20 = _hil_dummy_SetReg_XBits20; + _Distinct_Methods.GetPrevInstruction = _hil_dummy_GetPrevInstruction; + _Distinct_Methods.Tclk = _hil_dummy_Tclk; + _Distinct_Methods.SetReg_XBits8_64 = _hil_dummy_SetReg_XBits8_64; + _Distinct_Methods.StepPsa = _hil_dummy_StepPsa; + _Distinct_Methods.BlowFuse = _hil_dummy_BlowFuse; + + _Distinct_Methods.TapReset = _hil_4w_TapReset; + _Distinct_Methods.SetReg_XBits08 = _hil_generic432_SetReg_XBits08; + _Distinct_Methods.SetReg_XBits16 = _hil_generic432_SetReg_XBits16; + _Distinct_Methods.SetReg_XBits32 = _hil_generic432_SetReg_XBits32; + _Distinct_Methods.SetReg_XBits64 = _hil_generic432_SetReg_XBits64; + _Distinct_Methods.Instr04 = _hil_generic432_Instr_4; + _Distinct_Methods.write_read_Dp = _hil_Write_Read_Dp_Jtag; + _Distinct_Methods.write_read_Ap = _hil_Write_Read_Ap_Jtag; + _Distinct_Methods.write_read_mem_Ap = _hil_Write_Read_Mem_Ap_Jtag; + _Distinct_Methods.GetJtagIdCode = hil_Jtag_read_idcode; + _Distinct_Methods.SetReg_XBits35 = _hil_generic432_SetReg_XBits35; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.SetReg_XBits20 = _hil_dummy_SetReg_XBits20; + _Distinct_Methods.SwdTransferData = _hil_dummy_TransferData; + } + else if (protocol_id == SWD_432) + { + // load dummies for 430 + _Distinct_Methods.CheckJtagFuse = _hil_dummy_CheckJtagFuse; + _Distinct_Methods.Instr = _hil_dummy_Instr; + _Distinct_Methods.SetReg_XBits20 = _hil_dummy_SetReg_XBits20; + _Distinct_Methods.GetPrevInstruction = _hil_dummy_GetPrevInstruction; + _Distinct_Methods.Tclk = _hil_dummy_Tclk; + _Distinct_Methods.SetReg_XBits8_64 = _hil_dummy_SetReg_XBits8_64; + _Distinct_Methods.StepPsa = _hil_dummy_StepPsa; + _Distinct_Methods.BlowFuse = _hil_dummy_BlowFuse; + _Distinct_Methods.TapReset = _hil_dummy_TapReset; + _Distinct_Methods.SetReg_XBits08 = _hil_dummy_SetReg_XBits08; + _Distinct_Methods.SetReg_XBits16 = _hil_dummy_SetReg_XBits16; + _Distinct_Methods.SetReg_XBits20 = _hil_dummy_SetReg_XBits20; + _Distinct_Methods.SetReg_XBits32 = _hil_dummy_SetReg_XBits32; + _Distinct_Methods.SetReg_XBits64 = _hil_dummy_SetReg_XBits64; + _Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _Distinct_Methods.write_read_Dp = _hil_Write_Read_Dp_Swd; + _Distinct_Methods.write_read_Ap = _hil_Write_Read_Ap_Swd; + _Distinct_Methods.write_read_mem_Ap = _hil_Write_Read_Mem_Ap_Swd; + _Distinct_Methods.GetJtagIdCode = hil_swd_read_idcode; + _Distinct_Methods.SetReg_XBits35 = _hil_dummy_SetReg_XBits35; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.SwdTransferData = Swd_TransferData; + } + jtagReleased = 0; + return(ret_value); +} + +void _hil_SetPsaTCLK(unsigned short tclkValue) +{ + gTclkHighWhilePsa = tclkValue; + if(gprotocol_id == SPYBIWIRE || gprotocol_id == SPYBIWIRE_SUBMCU || gprotocol_id == SPYBIWIRE_MSP_FET) + { + if(gTclkHighWhilePsa == 1) + { + _Distinct_Methods.StepPsa = _hil_2w_StepPsaTclkHigh_Dma; + } + else if(gTclkHighWhilePsa == 2) + { + _Distinct_Methods.StepPsa = _hil_2w_StepPsa_Dma_Xv2; + } + else + { + _Distinct_Methods.StepPsa = _hil_2w_StepPsa_Dma; + } + } + if(gprotocol_id == SPYBIWIREJTAG || gprotocol_id == JTAG) + { + if(gTclkHighWhilePsa == 1) + { + _Distinct_Methods.StepPsa = _hil_4w_StepPsaTclkHigh; + } + else + { + _Distinct_Methods.StepPsa = _hil_4w_StepPsa; + } + } +} +extern unsigned char lastTestState; + +void _hil_Release(void) +{ + if(gprotocol_id == SPYBIWIRE) + { + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, TRI_STATE_FPGA_SBW); + } + else if(gprotocol_id == SWD_432) + { + hil_fpga_disable_bypass(); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, TRI_STATE_FPGA_JTAG); + } + else + { + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, TRI_STATE_FPGA_JTAG); + } + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + + lastTestState = 0; + + _Distinct_Methods.TapReset = _hil_dummy_TapReset; + _Distinct_Methods.CheckJtagFuse = _hil_dummy_CheckJtagFuse; + _Distinct_Methods.Instr = _hil_dummy_Instr; + _Distinct_Methods.SetReg_XBits08 = _hil_dummy_SetReg_XBits08; + _Distinct_Methods.SetReg_XBits16 = _hil_dummy_SetReg_XBits16; + _Distinct_Methods.SetReg_XBits20 = _hil_dummy_SetReg_XBits20; + _Distinct_Methods.SetReg_XBits32 = _hil_dummy_SetReg_XBits32; + _Distinct_Methods.SetReg_XBits64 = _hil_dummy_SetReg_XBits64; + _Distinct_Methods.SetReg_XBits8_64 = _hil_dummy_SetReg_XBits8_64; + _Distinct_Methods.Tclk = _hil_dummy_Tclk; + _Distinct_Methods.GetPrevInstruction = _hil_dummy_GetPrevInstruction; + _Distinct_Methods.StepPsa = _hil_dummy_StepPsa; + _Distinct_Methods.BlowFuse = _hil_dummy_BlowFuse; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _Distinct_Methods.GetJtagIdCode = _hil_read_idcodeDummy; + _Distinct_Methods.SetReg_XBits35 = _hil_dummy_SetReg_XBits35; + _Distinct_Methods.SetReg_XBits = _hil_dummy_SetReg_XBits; + _Distinct_Methods.SwdTransferData = _hil_dummy_TransferData; + + jtagReleased = 1; +} + +/*-------------RstLow_JTAG---------------- + ________ __________ +Test ______| |_________| + _______________ +Rst_____________________| +----------------------------------------*/ + +INLINE(forced) +static void _hil_EntrySequences_RstLow_JTAG() +{ + _DINT_FET(); + TSTset0(); //1 + _hil_Delay_1ms(4); //reset TEST logic + + RSTset0(); //2 + + //TSTset1(); //3 + (*_Jtag.Out) |= _Jtag.TST; + _hil_Delay_1ms(50); //activate TEST logic + + //RSTset0(); //4 + (*_Jtag.Out) &= ~_Jtag.RST; + _hil_Delay_1us(40); + + // for 4-wire JTAG clear Test pin Test(0) + //TSTset0(); //5 + (*_Jtag.Out) &= ~_Jtag.TST; + _hil_Delay_1us(2); + + // for 4-wire JTAG -dry Reset(1) + //(*_Jtag.Out) |= _Jtag.RST; + (*_Jtag.Out) &= ~_Jtag.RST; // This actually starts the BSL + _hil_Delay_1us(2); + + // 4-wire JTAG - Test (1) + //TSTset1(); //7 + (*_Jtag.Out) |= _Jtag.TST; + _hil_Delay_1ms(5); + _EINT_FET(); +} + +/*-------------RstHigh_JTAG-------------- + ________ __________ +Test ______| |_________| + _______ ______ +Rst____| |_________________| +----------------------------------------*/ + +INLINE(forced) +static void _hil_EntrySequences_RstHigh_JTAG() +{ + TSTset0(); //1 + _hil_Delay_1ms(1); //reset TEST logic + + RSTset1(); //2 + + TSTset1(); //3 + _hil_Delay_1ms(100); //activate TEST logic + + RSTset0(); //4 + _hil_Delay_1us(40); + + // for 4-wire JTAG clear Test pin Test(0) + (*_Jtag.Out) &= ~_Jtag.TST; //5 + _hil_Delay_1us(1); + + // for 4-wire JTAG - Test (1) + (*_Jtag.Out) |= _Jtag.TST; //7 + _hil_Delay_1us(40); + + // phase 5 Reset(1) + RSTset1(); + _hil_Delay_1ms(5); +} + +/*-------------RstHigh_SBW--------------- + ________ __________ +Test ______| |_________| + _________________________________ +Rst____| +----------------------------------------*/ +INLINE(forced) +static void _hil_EntrySequences_RstHigh_SBW() +{ + TSTset0(); //1 + _hil_Delay_1ms(1); // reset TEST logic + + RSTset1(); //2 + + TSTset1(); //3 + _hil_Delay_1ms(100); // activate TEST logic + + // phase 1 + RSTset1(); //4 + _hil_Delay_1us(40); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for Spy-Bi-Wire + _DINT_FET(); + (*_Jtag.Out) &= ~_Jtag.TST; //5 + _hil_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for Spy-Bi-Wire + (*_Jtag.Out) |= _Jtag.TST; //7 + _EINT_FET(); + _hil_Delay_1us(40); + + _hil_Delay_1ms(5); +} + +/*-------------RstLow_SBW---------------- + ________ __________ +Test ______| |_________| + __________________________ +Rst__________| +----------------------------------------*/ +INLINE(forced) +static void _hil_EntrySequences_RstLow_SBW() +{ + TSTset0(); //1 + _hil_Delay_1ms(1); // reset TEST logic + + RSTset0(); //2 + + TSTset1(); //3 + _hil_Delay_1ms(100); // activate TEST logic + + // phase 1 + RSTset1(); //4 + _hil_Delay_1us(40); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for Spy-Bi-Wire + _DINT_FET(); + (*_Jtag.Out) &= ~_Jtag.TST; //5 + _hil_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for Spy-Bi-Wire + (*_Jtag.Out) |= _Jtag.TST; //7 + _EINT_FET(); + _hil_Delay_1us(40); + _hil_Delay_1ms(5); +} + +void _hil_EntrySequences(unsigned char states) +{ + unsigned short protocol = JTAG_4_WIRE_FPGA; + + //This should probably never be called with SPYBIWIRE_SUBMCU anyway + if(gprotocol_id == SPYBIWIRE_SUBMCU) + { + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, TRI_STATE_FPGA_JTAG); + gprotocol_id = SPYBIWIRE; + } + hil_fpga_enable_bypass(); + + switch(gprotocol_id) + { + case SPYBIWIRE: + case SPYBIWIRE_MSP_FET: + { + if (states == RSTLOW) + { + _hil_EntrySequences_RstLow_SBW(); + } + if (states == RSTHIGH) + { + _hil_EntrySequences_RstHigh_SBW(); + } + protocol = (gprotocol_id == SPYBIWIRE) ? SBW_2_BACK_FPGA : SBW_2_MSP_FET_FPGA; + break; + } + case SPYBIWIREJTAG: + { + if (states == RSTLOW) + { + _hil_EntrySequences_RstLow_JTAG(); + } + if (states == RSTHIGH) + { + _hil_EntrySequences_RstHigh_JTAG(); + } + break; + } + case JTAG_432: + { + JTAG_Entry(); + RSTset1(); + break; + } + case SWD_432: + { + SWD_Entry(); + SWDTCKset1(); + break; + } + default: + if (states == RSTLOW) + { + RSTset0(); + TSTset1(); + } + if (states == RSTHIGH) + { + TSTset1(); + } + break; + } + if(gprotocol_id != SWD_432) + { + hil_fpga_disable_bypass(); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, protocol); + + if(gprotocol_id == JTAG_432) + { + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 1); + } + else + { + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + } + } +} + +#pragma optimize = medium +static void _hil_Connect(unsigned char state) +{ + if(jtagReleased) + { + _hil_SetProtocol(gprotocol_id); + } + + hil_fpga_enable_bypass(); + + if(state == RSTHIGH && gprotocol_id != JTAG_432 && gprotocol_id != SWD_432) + { + if(gprotocol_id == SPYBIWIRE || gprotocol_id == SPYBIWIRE_MSP_FET) + { + _hil_Delay_1ms(10); + qDriveSbw(); + _hil_Delay_1ms(30); + _hil_EntrySequences_RstHigh_SBW(); + } + else + { + _hil_Delay_1ms(10); + qDriveJTAG(); + _hil_Delay_1ms(30); + if(gprotocol_id == SPYBIWIREJTAG) + { + _hil_EntrySequences_RstHigh_JTAG(); + } + else + { + TSTset1(); + } + } + } + else if(state == RSTLOW && gprotocol_id != JTAG_432 && gprotocol_id != SWD_432) + { + if(gprotocol_id == SPYBIWIRE || gprotocol_id == SPYBIWIRE_MSP_FET) + { + qDriveSbw(); + _hil_Delay_1ms(1); + _hil_EntrySequences_RstLow_SBW(); + } + else + { + qDriveJTAG(); + _hil_Delay_1ms(1); + if(gprotocol_id == SPYBIWIREJTAG) + { + _hil_EntrySequences_RstLow_JTAG(); + } + else + { + RSTset0(); + TSTset1(); + } + } + } + else if(gprotocol_id == JTAG_432) + { + _hil_Delay_1ms(10); + qDriveJTAG(); + _hil_Delay_1ms(30); + JTAG_Entry(); + RSTset1(); + } + else if(gprotocol_id == SWD_432) + { + _hil_Delay_1ms(10); + qDriveSwd(); + _hil_Delay_1ms(30); + SWD_Entry(); + RSTset1(); + hil_swd_read_idcode(); + } + + if(gprotocol_id != SWD_432) + { + hil_fpga_disable_bypass(); + } + + jtagReleased = 0; +} + +// ----------------------------------------------------------------------------- +short _hil_Open( unsigned char state) +{ + if(gprotocol_id == SPYBIWIRE_MSP_FET) + { + _hil_Connect(state); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, SBW_2_MSP_FET_FPGA); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + _hil_generic_ConfigureSpeed(hil_sbw2Speed_); + } + else if(gprotocol_id == SPYBIWIRE) + { + _hil_Connect(state); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, SBW_2_BACK_FPGA); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + _hil_generic_ConfigureSpeed(hil_sbw2Speed_); + } + else if(gprotocol_id == SPYBIWIREJTAG || gprotocol_id == JTAG) + { + _hil_Connect(state); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, JTAG_4_WIRE_FPGA); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + _hil_generic_ConfigureSpeed(hil_jtagSpeed_); + } + else if(gprotocol_id == JTAG_432) + { + _hil_Connect(state); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, JTAG_4_WIRE_FPGA); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 1); + _hil_generic_ConfigureSpeed(hil_jtagSpeed_); + } + else if(gprotocol_id == SPYBIWIRE_SUBMCU) + { + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, TRI_STATE_FPGA_JTAG); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + gprotocol_id = SPYBIWIRE; + _hil_Connect(state); + } + else if(gprotocol_id == SWD_432) + { + gprotocol_id = SWD_432; + _hil_Connect(state); + } + return 0; +} +// ----------------------------------------------------------------------------- +short _hil_Close( void ) +{ + externalVccOn = EXTERNAL_VCC_OFF; + _hil_Release(); + return 0; +} + +// ----------------------------------------------------------------------------- + +void _hil_SetJtagSpeed(unsigned short jtagSpeed, unsigned short sbwSpeed) +{ + if( sbwSpeed ) + { + hil_sbw2Speed_ = sbwSpeed; + } + if ( jtagSpeed ) + { + hil_jtagSpeed_ = jtagSpeed; + } +} + +// ----------------------------------------------------------------------------- + +void _hil_ConfigureSetPc (unsigned short PCclockBeforeCapture) +{ + setPCclockBeforeCapture = PCclockBeforeCapture; +} + +// ----------------------------------------------------------------------------- +void SetVFuse(void) +{ + unsigned long timeOut = VF_PWM_TIMEOUT; + unsigned short runningAverageBuffer[4] = {0,0,0,0}; + unsigned short avg = 0; + unsigned char i = 0; + + do + { + *(_VFuse.PWM_CTRL) |= _VFuse.PWM_SETVF; + __delay_cycles(VF_PWM_ON_TIME); + *(_VFuse.PWM_CTRL) &= ~(_VFuse.PWM_SETVF); + __delay_cycles(VF_PWM_OFF_TIME); + runningAverageBuffer[i] = hil_AdcControlGetVFuse(); + i = (i + 1) % 4; + avg = (runningAverageBuffer[0] + runningAverageBuffer[1] + runningAverageBuffer[2] + runningAverageBuffer[3]) >> 2; + } + while((6800 > avg) && timeOut--); +} + +// ----------------------------------------------------------------------------- +void setVpp(long voltage) +{ + static unsigned char prevP4value = 0; + // Reconfigure ADC to measure Fuse Voltage without interrupts + hil_AdcControlInitADCvFuse(); + + if(voltage) + { + SetVFuse(); + + while(hil_AdcControlGetVFuse() >= 6300); + + if(useTDI) + { + // Vpp via TDI + *(_VFuse.CTRL) &= ~(_VFuse.TDI_OFF); + *(_VFuse.CTRL) &= ~(_VFuse.VF2TEST); + *(_VFuse.CTRL) |= _VFuse.VF2TDI; + } + else + { + _DINT_FET(); + prevP4value = P4OUT & BIT5; + // Vpp via TST + *(_VFuse.CTRL) &= ~(_VFuse.VF2TDI); + *(_VFuse.CTRL) |= _VFuse.TDI_OFF; + P4OUT &= ~BIT5; + *(_VFuse.CTRL) |= _VFuse.VF2TEST; + _EINT_FET(); + } + _hil_Delay_1ms(3); + } + else + { + // Turn of Vpp + _DINT_FET(); + *(_VFuse.CTRL) &= ~(_VFuse.VF2TDI); + *(_VFuse.CTRL) &= ~(_VFuse.VF2TEST); + if(!useTDI) + { + _hil_Delay_1us(3); + P4OUT |= prevP4value; + } + *(_VFuse.CTRL) |= _VFuse.TDI_OFF; + _EINT_FET(); + } + + // Reconfigure ADC to measure VCC – supply/dt/externalVcc in sequence mode + hil_AdcControlInitADC(); + ADC12IE = 0x08; // Enable ADC12IFG.3 +} + +// ----------------------------------------------------------------------------- +void testVpp(unsigned char mode) +{ + if(mode) + { + // Fuse blow via TST + // Switch back to JTAG protocol + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, JTAG_4_WIRE_FPGA); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + + } + else + { + // Fuse blow via TDI + // Switch to JTAG fuse blow protocol, TDI is mapped to TDO + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_PROTOCOL, TDI_TO_TDO_FPGA); + hil_fpga_write_cmd_data0_data1(FPGA_CMD_CFG, REG_JTAG_4_WIRE_FPGA_432, 0); + } + + useTDI = !mode; +} + + +// ----------------------------------------------------------------------------- +void _hil_SetReset(unsigned char value) +{ + + hil_fpga_enable_bypass(); + if(value) + { + RSTset1(); + } + else + { + RSTset0(); + } + hil_fpga_disable_bypass(); +} + +// ----------------------------------------------------------------------------- +void _hil_SetTest(unsigned char value) +{ + hil_fpga_enable_bypass(); + + if(value) + { + TSTset1(); + } + else + { + TSTset0(); + } + hil_fpga_disable_bypass(); +} + +// ----------------------------------------------------------------------------- +void _hil_SetTMS(unsigned char value) +{ + hil_fpga_enable_bypass(); + + if(value) + { + TMSset1(); + } + else + { + TMSset0(); + } + hil_fpga_disable_bypass(); +} + +// ----------------------------------------------------------------------------- +void _hil_SetTDI(unsigned char value) +{ + hil_fpga_enable_bypass(); + + if(value) + { + TDIset1(); + } + else + { + TDIset0(); + } + hil_fpga_disable_bypass(); +} + +// ----------------------------------------------------------------------------- +void _hil_SetTCK(unsigned char value) +{ + hil_fpga_enable_bypass(); + + if(value) + { + TCKset1(); + } + else + { + TCKset0(); + } + hil_fpga_disable_bypass(); +} +// --------------------------------------------ARM defines end------------------ + +void SWD_Entry() +{ + unsigned char sequence[8]; + unsigned char i = 0; + unsigned short entry = 0xE79E; + for (i = 0; i < 8; i++) + { + sequence[i] = 0xff; + } + hil_Swd_Seq(56, sequence); + + sequence[0] = entry & 0xff; + sequence[1] = (entry >> 8) & 0xff; + hil_Swd_Seq(16, sequence); + + for (i = 0; i < 8; i++) + { + sequence[i] = 0xff; + } + hil_Swd_Seq(56, sequence); +} + + void JTAG_Entry() +{ + unsigned char sequence[8]; + unsigned char i = 0; + unsigned short entry = 0xE73C; + for (i = 0; i < 8; i++) + { + sequence[i] = 0xff; + } + hil_4w_432_Seq(51, sequence); + + sequence[0] = entry & 0xff; + sequence[1] = (entry >> 8) & 0xff; + hil_4w_432_Seq(16, sequence); + + for (i = 0; i < 1; i++) + { + sequence[i] = 0xff; + } + hil_4w_432_Seq(8, sequence); +} + +unsigned long hil_swd_read_idcode() +{ + unsigned char sequence[1] = {0}; + unsigned long id = 0; + hil_Swd_Seq(8, sequence); + + if (_Distinct_Methods.write_read_Dp(0, &id, READ) != SWD_ACK) + { + return 0xFFFF; + } + return id; +} + + +unsigned long hil_Jtag_read_idcode() +{ + unsigned long JtagId = 0; + + JtagId = _Distinct_Methods.Instr04(IR4_IDCODE); + + if (JtagId == 0x1) + { + JtagId = _Distinct_Methods.SetReg_XBits32(0); + } + return JtagId; +} + + +short _hil_Write_Read_Dp_Swd(unsigned char address ,unsigned long *data, unsigned short rnw) +{ + unsigned char retVal = 0; + unsigned char i = 0; + + unsigned char regiser = SWD_DP | rnw<<1 | (address & 0x0c); + + for (i = 0; i < MAX_RETRY; i++) + { + retVal = Swd_TransferData(regiser, data, rnw); + // if not wait for answer + if (retVal != 0x2) + { + return SWD_ACK; + } + } + if(i == MAX_RETRY || retVal != 0x1) + { + return -1; + } + return SWD_ACK; +} + +//#pragma optimize = none +short _hil_Write_Read_Ap_Swd(unsigned long address, unsigned long *data, unsigned short rnw) +{ + unsigned long long retVal; + unsigned char i = 0; + unsigned long dummydata = 0; + + unsigned long apsel_bank_sel = address & DP_SELECT_APSEL_MASK; + apsel_bank_sel |= address & DP_SELECT_APBANKSEL_MASK; + + if (_hil_Write_Read_Dp_Swd(DP_SELECT, &apsel_bank_sel, WRITE) != SWD_ACK) + { + return -1; + } + unsigned char regiser = SWD_AP | rnw<<1 | (address & 0x0c); + do + { + retVal = Swd_TransferData(regiser, data, rnw); + } + while(i++ < MAX_RETRY && retVal != 0x1); + + if(i == MAX_RETRY) + { + return -1; + } + + if(rnw == WRITE) + { + unsigned char regiser = SWD_DP | READ<<1 | (DP_RDBUFF & 0x0c); + do + { + retVal = Swd_TransferData(regiser, &dummydata, READ); + } + while(i++ < MAX_RETRY && retVal != 0x1); + + if(i == MAX_RETRY) + { + return -1; + } + } + else + { + do + { + Swd_TransferData(regiser, data, rnw); + } + while(i++ == MAX_RETRY && retVal != 0x1); + + if(i == MAX_RETRY) + { + return -1; + } + } + return SWD_ACK; +} + +short _hil_Write_Read_Mem_Ap_Swd(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw) +{ + // First Read current CSW value + unsigned long tmp = 0; + unsigned long apsel = ((uint32_t)ap_sel); + if (_hil_Write_Read_Ap_Swd(AP_CSW | apsel, &tmp, READ) != SWD_ACK) + { + return -1; + } + + // Configure the transfer + tmp = (tmp & ~(AP_CSW_SIZE_MASK | AP_CSW_ADDRINC_MASK)) | AP_CSW_ADDRINC_OFF | AP_CSW_SIZE_32BIT; + if (_hil_Write_Read_Ap_Swd(AP_CSW | apsel, &tmp, WRITE) != SWD_ACK) + { + return -1; + } + + // Write the address + tmp = address; + if (_hil_Write_Read_Ap_Swd(AP_TAR | apsel, &tmp, WRITE) != SWD_ACK) + { + return -1; + } + // Write/Read data + return _hil_Write_Read_Ap_Swd(AP_DRW | apsel, data, rnw); +} + +// ----------------------------------------------------------------------------- +short _hil_Write_Read_Dp_Jtag(unsigned char address ,unsigned long *data, unsigned short rnw) +{ + unsigned long long retVal; + unsigned char i = 0; + unsigned long long dataAlig = 0ull; + dataAlig = ((unsigned long long)*data) << 3; + + dataAlig |= (((address & 0xC) >> 1) + (rnw & 0x1)); + + if(_Distinct_Methods.Instr04(DPACC) != 0x1) + { + return -1; + } + + for (i = 0; i < MAX_RETRY; i++) + { + retVal = _Distinct_Methods.SetReg_XBits35(&dataAlig); + // if ack == ACK + if ((retVal & 0x3) == ACK) + { + *data = retVal >> 3; + return ACK; + } + } + return -1; +} + +// ----------------------------------------------------------------------------- +short _hil_Write_Read_Ap_Jtag(unsigned long address, unsigned long *data, unsigned short rnw) +{ + unsigned long long retVal; + unsigned char i = 0; + unsigned long long dataAlig = 0ull; + + dataAlig = ((unsigned long long)*data) << 3; + + unsigned long apsel_bank_sel = address & DP_SELECT_APSEL_MASK; + apsel_bank_sel |= address & DP_SELECT_APBANKSEL_MASK; + + if (_hil_Write_Read_Dp_Jtag(DP_SELECT, &apsel_bank_sel, WRITE) != ACK) + { + return -1; + } + + dataAlig |= (((address & 0xC) >> 1) + (rnw & 0x1)); + + if(_Distinct_Methods.Instr04(APACC) != 0x1) + { + return -1; + } + + do + { + retVal = _Distinct_Methods.SetReg_XBits35(&dataAlig); + } while((retVal & 0x3 != ACK) && (++i < MAX_RETRY)); + + if(i == MAX_RETRY) + { + return -1; + } + else + { + if(rnw == READ) + { + return _hil_Write_Read_Dp_Jtag(DP_RDBUFF, data, READ); + } + else + { + return ACK; + } + } +} + +// ----------------------------------------------------------------------------- +// Currently only supports single 32-bit transfers +short _hil_Write_Read_Mem_Ap_Jtag(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw) +{ + // First Read current CSW value + unsigned long tmp = 0; + unsigned long apsel = (((uint32_t)ap_sel) << 24); + if (_hil_Write_Read_Ap_Jtag(AP_CSW | apsel, &tmp, READ) != ACK) + { + return -1; + } + + // Configure the transfer + tmp = (tmp & ~(AP_CSW_SIZE_MASK | AP_CSW_ADDRINC_MASK)) | AP_CSW_ADDRINC_OFF | AP_CSW_SIZE_32BIT; + if (_hil_Write_Read_Ap_Jtag(AP_CSW | apsel, &tmp, WRITE) != ACK) + { + return -1; + } + + // Write the address + tmp = address; + if (_hil_Write_Read_Ap_Jtag(AP_TAR | apsel, &tmp, WRITE) != ACK) + { + return -1; + } + // Write/Read data + return _hil_Write_Read_Ap_Jtag(AP_DRW | apsel, data, rnw); +} diff --git a/Bios/src/hil/msp_fet/hilAdcControl.c b/Bios/src/hil/msp_fet/hilAdcControl.c new file mode 100644 index 0000000..40667d2 --- /dev/null +++ b/Bios/src/hil/msp_fet/hilAdcControl.c @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +//****************************************************************************** +// Filename: hilAdcControl.c +// +// Description: +// +//****************************************************************************** +#include "msp430.h" +#include "hilAdcControl.h" +#include "arch.h" + +static unsigned short runningAverageBufferSpVcc[8] = {0,0,0,0,0,0,0,0}; +static unsigned short runningBufferVCCDtSense = 0; +static unsigned short runningAverageBufferDtVcc[8] = {0,0,0,0,0,0,0,0}; +static unsigned short runningAverageBufferExtVcc[8] = {0,0,0,0,0,0,0,0}; +static unsigned short isVCC = 0, dtVCC = 0, iexVCC = 0; + +/* In normal operation mode, the read function is triggered by the ADC12 + interrupt when a sample sequence has been completed. + During Hil module init (FET startup) and Set VCC the ADC12 interrupts are + disabled and the readout is triggered manually by the calling function +*/ + +#define CAL_ADC_GAIN_FACTOR *((unsigned short *)0x1A16) +#define CAL_ADC_OFFSET *((short *)0x1A18) + +void hil_AdcControlRead() +{ + volatile long notCalibratedAdc = 0; + while ((ADC12IFG & BIT3) == 0); + + notCalibratedAdc = ADC12MEM0; + notCalibratedAdc = ((notCalibratedAdc * CAL_ADC_GAIN_FACTOR) / 32768) + (long)CAL_ADC_OFFSET; + runningAverageBufferSpVcc[isVCC] = (unsigned short)(((((notCalibratedAdc * 2500) / 4096) * (220 + 220)) / 220)); + isVCC++; + if(isVCC == 8) isVCC = 0; + + notCalibratedAdc = ADC12MEM1; + notCalibratedAdc = ((notCalibratedAdc * CAL_ADC_GAIN_FACTOR) / 32768) + (long)CAL_ADC_OFFSET; + if(notCalibratedAdc > 0) + { + runningAverageBufferExtVcc[iexVCC] = (unsigned short)(((((notCalibratedAdc * 2500) / 4096) * (150 + 150)) / 150)); + } + else + { + runningAverageBufferExtVcc[iexVCC] = 0; + } + iexVCC++; + if(iexVCC == 8) iexVCC = 0; + + notCalibratedAdc = ADC12MEM2; + notCalibratedAdc = ((notCalibratedAdc * CAL_ADC_GAIN_FACTOR) / 32768) + (long)CAL_ADC_OFFSET; + runningAverageBufferDtVcc[dtVCC] = (unsigned short)(((((notCalibratedAdc * 2500) / 4096) * (150 + 150)) / 150)); + dtVCC++; + if(dtVCC == 8) dtVCC = 0; + + runningBufferVCCDtSense = (unsigned short)(((float)ADC12MEM3 * 1000 * A_VREFPLUS) / ADC_CONV_RANGE); +} + +/* Init ADC, enable sequence conversion on A1, A3, A4 and A6 – Sequence is + triggered once during main loop execution, only when HIL module is loaded and + valid +*/ +void hil_AdcControlInitADC() +{ + isVCC = 0; + dtVCC = 0; + iexVCC = 0; + runningBufferVCCDtSense = 0; + + // Enable Vref=2.5V for ADC --> Already done in Dac init + + // A0=P6.0, A1=P6.1 + P6OUT &= ~(BIT1+BIT3+BIT4+BIT6); + P6SEL |= (BIT1+BIT3+BIT4+BIT6); + + // Configure ADC12 + // select channel and do conversion + ADC12CTL0 &= ~ADC12ENC; // Disable conversion + ADC12CTL0 = ADC12ON + ADC12SHT0_9 + ADC12REF2_5V + ADC12REFON + ADC12MSC; // Turn on ADC12, set sampling time + ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12SSEL_3 + ADC12DIV_7; // Use sampling timer + + ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_1; //A_VCCSUPPLY; + ADC12MCTL1 = ADC12SREF_1 + ADC12INCH_3; //A_VCCSUPPLY_SENSE; + ADC12MCTL2 = ADC12SREF_1 + ADC12INCH_4; //A_VCCDT; + ADC12MCTL3 = ADC12SREF_1 + ADC12INCH_6 + ADC12EOS;; //A_VCCDT_SENSE; + + __delay_cycles((15*90)); + ADC12CTL0 |= ADC12ENC; // Enable conversion +} + +/*---------------------------------------------------------------------------- + This function performs a single AD conversion on the selected pin. + Uses internal reference 2500mV (VR+ = VREF+). + Only used during Fuse Blow to measure VCC Fuse + Arguments: word pinmask (bit position of selected analog input Ax) + Result: word (12 bit ADC conversion result) +*/ +float ConvertAD(short channel) +{ + ADC12CTL0 &= ~ADC12ENC; // Disable conversion, write controls + ADC12MCTL0 = ADC12SREF_1 + channel; // select Vref and analog channel Ax + ADC12CTL0 |= ADC12ENC; // Enable conversions + ADC12CTL0 |= ADC12SC; // Start conversions + while ((ADC12IFG & BIT0) == 0); // wait until conversion is done + return(((float)ADC12MEM0* A_VREFPLUS) / ADC_CONV_RANGE); // return conversion result from MEM0 value in mv +} + +/* Only used during Fuse Blow to measure VCC Fuse */ +void hil_AdcControlInitADCvFuse() +{ + ADC12IE = 0; + ADC12MCTL0 = 0; + ADC12MCTL1 = 0; + ADC12MCTL2 = 0; + ADC12MCTL3 = 0; + + // A0=P6.0, A1=P6.1 + P6OUT &= ~(BIT0+BIT1+BIT4+BIT6); + P6SEL |= BIT0+BIT1+BIT4+BIT6; + + // Configure ADC12 + // select channel and do conversion + ADC12CTL0 &= ~ADC12ENC; // Disable conversion + ADC12CTL0 = ADC12ON + ADC12SHT0_2 + ADC12REF2_5V + ADC12REFON; // Turn on ADC12, set sampling time + ADC12CTL1 = ADC12SHP + ADC12SSEL_1; // Use sampling timer + __delay_cycles((15*90)); + ADC12CTL0 |= ADC12ENC; // Enable conversion +} + +// Get 1 sample from A6 +unsigned short hil_AdcControlGetDtVccSense(void) +{ + return runningBufferVCCDtSense; +} + +// Get 1 sample from A3 +unsigned short hil_AdcControlGetExternalVcc(void) +{ + return ((runningAverageBufferExtVcc[0] + runningAverageBufferExtVcc [1] + + runningAverageBufferExtVcc[2] + runningAverageBufferExtVcc[3] + + runningAverageBufferExtVcc[4] + runningAverageBufferExtVcc[5] + + runningAverageBufferExtVcc[6] + runningAverageBufferExtVcc[7]) >> 3); +} +// Get 1 sample from A1 +unsigned short hil_AdcControlGetSupplyVcc(void) +{ + return (((runningAverageBufferSpVcc[0] + runningAverageBufferSpVcc [1] + + runningAverageBufferSpVcc[2] + runningAverageBufferSpVcc[3] + + runningAverageBufferSpVcc[4] + runningAverageBufferSpVcc[5] + + runningAverageBufferSpVcc[6] + runningAverageBufferSpVcc[7] ) >> 3) - 20); +} +// Get 1 sample from A2 +unsigned short hil_AdcControlGetVFuse(void) +{ + float VFuseTmp = (((ConvertAD(A_VF) * (270 + 150)) / 150) * 1000); + return (unsigned short)VFuseTmp; +} +// Get 1 sample from A4 +unsigned short hil_AdcControlGetVccDt(void) +{ + return (((runningAverageBufferDtVcc[0] + runningAverageBufferDtVcc [1] + + runningAverageBufferDtVcc[2] + runningAverageBufferDtVcc[3] + + runningAverageBufferDtVcc[4] + runningAverageBufferDtVcc[5] + + runningAverageBufferDtVcc[6] + runningAverageBufferDtVcc[7]) >> 3)-20); +} diff --git a/Bios/src/hil/msp_fet/hilAdcControl.h b/Bios/src/hil/msp_fet/hilAdcControl.h new file mode 100644 index 0000000..e2eb272 --- /dev/null +++ b/Bios/src/hil/msp_fet/hilAdcControl.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +#include "msp430.h" + +#ifndef _HIL_ADC_CONTROL_H_ +#define _HIL_ADC_CONTROL_H_ + +#define A_VBUS 0 /* ADC12 Input Channel Select Bit 0 */ +#define A_VCCSUPPLY 1 /* ADC12 Input Channel Select Bit 1 target vcc*/ +#define A_VF 2 /* ADC12 Input Channel Select Bit 2 Fuse blow voltage */ +#define A_VCCSUPPLY_SENSE 3 /* ADC12 Input Channel Select Bit 3 external target vcc*/ +#define A_VCCDT 4 /* ADC12 Input Channel Select Bit 4 JTAG line vcc*/ +#define A_VCCDT_SENSE 6 /* ADC12 Input Channel Select Bit 6 short detection on Jtag lines*/ + +void hil_AdcControlInitADC(void); +unsigned short hil_AdcControlGetExternalVcc(void); +unsigned short hil_AdcControlGetSupplyVcc(void); +unsigned short hil_AdcControlGetVccDt(void); +unsigned short hil_AdcControlGetVFuse(void); +unsigned short hil_AdcControlGetDtVccSense(void); +void hil_AdcControlRead(void); +void hil_AdcControlInitADCvFuse(void); +#endif /*_HIL_DAC_CONTROL_H_*/ diff --git a/Bios/src/hil/msp_fet/hilDacControl.c b/Bios/src/hil/msp_fet/hilDacControl.c new file mode 100644 index 0000000..c97f7b7 --- /dev/null +++ b/Bios/src/hil/msp_fet/hilDacControl.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +//****************************************************************************** +// Filename: hilDacControl.c +// +// Description: +// +//****************************************************************************** +#include "msp430.h" +#include "hilDacControl.h" +#include "arch.h" +//------------------------------------------------------------------------------ +void hil_DacControlInitDAC0(void) +{ + // Set reference voltage to 2.5 V + REFCTL0 |= REFMSTR; + REFCTL0 |= REFVSEL1; + REFCTL0 |= REFON; + + // Vref is used as reference, calibration on, DAC on + DAC12_0CTL0 = DAC12SREF_0 + DAC12AMP_5 + DAC12CALON; + DAC12_0CTL0 |= DAC12IR; + // set 12-bit resolution + DAC12_0CTL0 |= DAC12OPS; // DAC12 out on P7.6 + DAC12_0CTL0 |= DAC12ENC; // Enable DAC12 +} + +void hil_DacControlSetDAC0(unsigned short dacVal) +{ + DAC12_0DAT = dacVal; +} + +void hil_DacControlInitDAC1(void) +{ + // Set reference voltage to 2.5 V + REFCTL0 |= REFMSTR; + REFCTL0 |= REFVSEL1; + REFCTL0 |= REFON; + + // Vref is used as reference, calibration on, DAC on + DAC12_1CTL0 = DAC12SREF_0 + DAC12AMP_5 + DAC12CALON; + DAC12_1CTL0 |= DAC12IR; + + // set 12-bit resolution + DAC12_1CTL0 |= DAC12OPS; // DAC12 out on P7.7 + DAC12_1CTL0 |= DAC12ENC; // Enable DAC12 + DAC12_1DAT = 0; // 0V +} + +void hil_DacControlSetDAC1(unsigned short dacVal) +{ + DAC12_1DAT = dacVal; +} diff --git a/Bios/src/hil/msp_fet/hilDacControl.h b/Bios/src/hil/msp_fet/hilDacControl.h new file mode 100644 index 0000000..dfde26f --- /dev/null +++ b/Bios/src/hil/msp_fet/hilDacControl.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +#include "msp430.h" +#define uController_uif + +#ifndef _HIL_DAC_CONTROL_H_ +#define _HIL_DAC_CONTROL_H_ + +extern void hil_DacControlInitDAC0(void); +extern void hil_DacControlInitDAC1(void); + +extern void hil_DacControlSetDAC0(unsigned short dacVal); +extern void hil_DacControlSetDAC1(unsigned short dacVal); + +#endif /*_HIL_DAC_CONTROL_H_*/ diff --git a/Bios/src/hil/msp_fet/hilDelays.c b/Bios/src/hil/msp_fet/hilDelays.c new file mode 100644 index 0000000..6df5827 --- /dev/null +++ b/Bios/src/hil/msp_fet/hilDelays.c @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + + #include "MSP430F6638.h" + +void _hil_Delay_1ms(unsigned short millisec) // inner loop generates 1 ms +{ + unsigned short i; + for(i = millisec; i > 0; i--) + { + TA2CCTL0 &= ~CCIFG; // Clear the interrupt flag + TA2CTL |= TACLR+ MC__UP; // Timer_A source:SMCLK ,SMCLK/8 = 2.5 MHz + while ((TA2CCTL0 & CCIFG)==0); // Wait until the Timer elapses + TA2CTL &= ~MC__UP; + } +} + +void _hil_Delay_1us(unsigned short microsec_1) // inner loop generates 10 us +{ + while((--microsec_1) > 0) + { + __delay_cycles(14); + } +} diff --git a/Bios/src/hil/msp_fet/hilDelays.h b/Bios/src/hil/msp_fet/hilDelays.h new file mode 100644 index 0000000..43d153d --- /dev/null +++ b/Bios/src/hil/msp_fet/hilDelays.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ +//! \ingroup MODULHIL +//! \file hilDelays.h +//! \brief +//! + +extern void _hil_Delay_1us(unsigned short usecs); +extern void _hil_Delay_1ms(unsigned short msecs); diff --git a/Bios/src/hil/msp_fet/hilFpgaAccess.c b/Bios/src/hil/msp_fet/hilFpgaAccess.c new file mode 100644 index 0000000..c1496a7 --- /dev/null +++ b/Bios/src/hil/msp_fet/hilFpgaAccess.c @@ -0,0 +1,496 @@ +/* + * Copyright (C) 2007 - 2014 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. + */ + +#include "archFpga.h" +#include "arch.h" +#include "hilDelays.h" +#include "hilFpgaAccess.h" +#include "hw_compiler_specific.h" + +// structs representing ports for FPGA communication +s_FPGA_PA FPGA_PORTA; +s_FPGA_PB FPGA_PORTB; + +unsigned char lastTestState = 0; +unsigned char lastResetState= 0; + +static struct jtag _Jtag = {0}; + +extern unsigned short gprotocol_id; +unsigned short static volatile TimeOut = FET_FALSE; + +void hil_fpga_init(void) +{ + // Port1 + // P1.0 -> DATA0[0] + // P1.1 -> DATA0[1] + // P1.2 -> DATA0[2] + // P1.3 -> DATA0[3] + // P1.4 -> DATA0[4] + // P1.5 -> DATA0[5] + // P1.6 -> DATA0[6] + // P1.7 -> DATA0[7] + P1DIR |= (BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); // set pins to output direction + P1SEL &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); + + // Port2 + // P2.0 <- DCDC_PULSE + // P2.1 <- UART_RTS + // P2.2 -> CMD[0] + // P2.3 -> CMD[1] + // P2.4 -> CMD[2] + // P2.5 -> CMD[3] + // P2.6 -> WR_TRIG + // P2.7 -> SYS_CLK + P2DIR |= (BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); // set pins to output direction + P2SEL &= ~(BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); + + // Port3 + // P3.0 <-> DATA1[0] + // P3.1 <-> DATA1[1] + // P3.2 <-> DATA1[2] + // P3.3 <-> DATA1[3] + // P3.4 <-> DATA1[4] + // P3.5 <-> DATA1[5] + // P3.6 <-> DATA1[6] + // P3.7 <-> DATA1[7] + P3DIR |= (BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); // set pins initially to output direction + P3SEL &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); + + // Port4 + // P4.0 <-> DATA1[8] + // P4.1 <-> DATA1[9] + // P4.2 <-> DATA1[10] + // P4.3 <-> DATA1[11] + // P4.4 <-> DATA1[12] + // P4.5 <-> DATA1[13] + // P4.6 <-> DATA1[14] + // P4.7 <-> DATA1[15] + P4DIR |= (BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); // set pins initially to output direction + P4SEL &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); + + // Port5 + // P5.0 -> VREF+ (output of reference voltage to ADC) + // P5.1 -> FPGA_RESET + // P5.2 -> VF2TEST_CTRL + // P5.3 -> LED1 + // P5.4 -> VF2TDI_CTRL + // P5.5 -> TDIOFF_CTRL (0 = turns off TDI, after that ok to select VF for fuse blowing) + // P5.6 <- MCU_DMAE0 / RD_TRIG (DMA trigger input) + // P5.7 -> DCDC_IO1 + P5DIR |= (BIT1+BIT2+BIT4+BIT5); // set pins initially to output direction + P5DIR &= ~(BIT6); + P5OUT |= (BIT5); + P5OUT &= ~(BIT2+BIT4); + + // Port8 + // P8.0 -> VCC_DT2TRGT_CTRL (control signal to switches to provide debug signals to target via JTAG.x) + // P8.1 -> IO_DIR + // P8.2 -> UART_TXD + // P8.3 <- UART_RXD + // P8.4 <- DCDC_IO0 + // P8.5 -> HOST_SDA + // P8.6 -> HOST_SCL + // P8.7 -> VCC_SUPPLY2TRGT_CTRL (DCDC VCC to target VCC) + P8OUT |= (BIT1); // set pins to '1' + P8DIR |= (BIT1); // set pins initially to output direction + + // Port9 + // P9.0 -> FPGA_TCK + // P9.1 -> FPGA_TDI + // P9.2 -> FPGA_TMS + // P9.3 <- FPGA_TDO + // P9.4 -> FPGA_TRST + // P9.5 -> UART_CTS + // P9.6 -> VCC_DT2SUPPLY_CTRL (DT voltage to target VCC) + // P9.7 -> PWM_SETVF (to fuse blow circuit) + P9OUT |= BIT0+BIT1+BIT2+BIT4; + P9OUT &= ~(BIT3); + P9DIR |= BIT0+BIT1+BIT2+BIT4+BIT7; // TDO is in, all others out + P9DIR &= ~(BIT3); + P9REN |= BIT3; // TDO with pulldown + + + // SYS_CLK: Output 20MHz MCLK on P2.7 + _DINT_FET(); // Disable Interrupts before altering Port Mapping registers + PMAPPWD = 0x02D52; // Enable Write-access to modify port mapping registers + PMAPCTL = PMAPRECFG; // Allow reconfiguration during runtime + P2MAP7 = PM_MCLK; + PMAPPWD = 0; // Disable Write-Access to modify port mapping registers + _EINT_FET(); // Re-enable all interrupts + + // Reset FPGA + FPGA_RESET_DEASSERT; + __delay_cycles(100); + FPGA_RESET_ASSERT; + + // Reset the internal structure + FPGA_PORTA.all = 0; + FPGA_PORTA.bit.CMD = 0xF; + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; + + // Enable SYS_CLK + __delay_cycles(100); + FPGA_SYS_CLK_START; + + __delay_cycles(10000); + FPGA_RESET_DEASSERT; + + lastTestState = 0; + lastResetState= 1; + + TimeOut = FET_FALSE; +} + +static void startWdtTimeOutCounter(unsigned long timeout) +{ + TimeOut = FET_FALSE; + // Start WDT timer use SMCLK 20 MHz, timer mode, and clear timer, timout is 6.4 s + WDTCTL = WDTPW + WDTSSEL__SMCLK + WDTCNTCL + WDTTMSEL + timeout; + SFRIE1 |= WDTIE; + SFRIFG1 &= ~WDTIFG; +} + +static void stopWdtTimeOutCounter() +{ + // Stop watchdog timer + WDTCTL = WDTPW + WDTHOLD; + SFRIE1 &= ~WDTIE; + SFRIFG1 &= ~WDTIFG; +} + +void _hil_FpgaAccess_setTimeOut(unsigned short state) +{ + TimeOut = state; + + // Reset FPGA + FPGA_RESET_DEASSERT; + __delay_cycles(100); + FPGA_RESET_ASSERT; + + // Enable SYS_CLK + __delay_cycles(100); + FPGA_SYS_CLK_START; + + __delay_cycles(10000); + FPGA_RESET_DEASSERT; + + lastTestState = 0; + lastResetState= 1; +} + +void initJtagBypass(struct jtag tmp) +{ + _Jtag = tmp; +} + +//enable bypass +void hil_fpga_enable_bypass() +{ + FPGA_BYPASS_DIR_CTRL_PORT_DIR = FPGA_BYPASS_DIR_CTRL_TEST_BIT + FPGA_BYPASS_DIR_CTRL_RST_BIT + FPGA_BYPASS_DIR_CTRL_TDO_BIT + FPGA_BYPASS_DIR_CTRL_TDI_BIT + FPGA_BYPASS_DIR_CTRL_TMS_BIT + FPGA_BYPASS_DIR_CTRL_TCK_BIT; + + /*------------------------ test pin state handling ----------------------*/ + if (lastTestState) + { + (*_Jtag.Out) |= _Jtag.TST; + } + else + { + (*_Jtag.Out) &= ~_Jtag.TST; + } + + /*------------------------ RST pin state handling ----------------------*/ + if(lastResetState) + { + (*_Jtag.Out) |= _Jtag.RST; + } + else + { + (*_Jtag.Out) &= ~_Jtag.RST; + } + + if( gprotocol_id == SPYBIWIRE || gprotocol_id == SPYBIWIRE_MSP_FET) + { + (*_Jtag.DIRECTION) = _Jtag.TST + _Jtag.RST; + FPGA_BYPASS_DIR_CTRL_PORT_OUT = _Jtag.TST + _Jtag.RST; + } + if( gprotocol_id == SPYBIWIREJTAG || gprotocol_id == JTAG || gprotocol_id == JTAG_432 || gprotocol_id == SWD_432) + { + (*_Jtag.Out) |= (_Jtag.TCK + _Jtag.TDI); + (*_Jtag.DIRECTION) = _Jtag.TST + _Jtag.RST + _Jtag.TDI + _Jtag.TMS + _Jtag.TCK; + FPGA_BYPASS_DIR_CTRL_PORT_OUT = _Jtag.TST + _Jtag.RST + _Jtag.TDI + _Jtag.TMS + _Jtag.TCK; + } + + // Enable bypass mode + hil_fpga_write_cmd_data0(FPGA_CMD_BYPASS, 1); + + FPGA_IO_DIR_PORT_OUT &= ~FPGA_IO_DIR_BIT; + + _hil_Delay_1ms(10); +} + + +// Leave bypass +void hil_fpga_disable_bypass(void) +{ + if((*_Jtag.Out) & _Jtag.TST) + { + lastTestState = 1; + } + else + { + lastTestState = 0; + } + if((*_Jtag.Out) & _Jtag.RST) + { + lastResetState = 1; + } + else + { + lastResetState = 0; + } + + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + // Disable bypass mode + hil_fpga_write_cmd_data0(FPGA_CMD_BYPASS, 0); + _hil_Delay_1us(10); +} + +void hil_fpga_write_cmd_data0(unsigned char cmd, unsigned char data0) +{ + // Assemble PORTA data + FPGA_PORTA.bit.CMD = cmd; + FPGA_PORTA.bit.DATA0 = data0; + FPGA_PORTA.bit.WR_TRIG ^= 1; + + startWdtTimeOutCounter(WDTIS__128M); + // Wait until RD_TRIG = 1 and FPGA is ready to accept data + while ((!FPGA_RD_TRIG_IS_ASSERTED)) + { + if(TimeOut){break;} + } + stopWdtTimeOutCounter(); + + // Write to FPGA + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; +} + + +void hil_fpga_write_cmd_data0_432(unsigned char cmd, unsigned char data0) +{ + // Assemble PORTA data + FPGA_PORTA.bit.CMD = cmd; + FPGA_PORTA.bit.DATA0 = data0; + FPGA_PORTA.bit.WR_TRIG ^= 1; + + // Wait until RD_TRIG = 1 and FPGA is ready to accept data + while ((!FPGA_RD_TRIG_IS_ASSERTED)); + + // Write to FPGA + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; +} + +// Write CMD, DATA0 and DATA1 to FPGA +void hil_fpga_write_cmd_data0_data1(unsigned char cmd, unsigned char data0, unsigned short data1) +{ + // Set DATA1 bus to output direction + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + FPGA_DATA1_PORT_DIR = 0xFFFF; + + // Assemble PORTA data + FPGA_PORTA.bit.CMD = cmd; + FPGA_PORTA.bit.DATA0 = data0; + FPGA_PORTA.bit.WR_TRIG ^= 1; + + startWdtTimeOutCounter(WDTIS__128M); + // Wait until RD_TRIG = 1 and FPGA is ready to accept data + while (!(FPGA_RD_TRIG_PORT_IN & FPGA_RD_TRIG_BIT)) + { + if(TimeOut){break;} + } + stopWdtTimeOutCounter(); + + // Write to FPGA + FPGA_DATA1_PORT_OUT = data1; + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; +} + +// Write CMD, DATA0 and DATA1 to FPGA +void hil_fpga_write_cmd_data0_data1_count_432(unsigned char cmd, unsigned char data0, unsigned short data1Buf[], unsigned char count) +{ + // Set DATA1 bus to output direction + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + FPGA_DATA1_PORT_DIR = 0xFFFF; + + // Assemble PORTA data + FPGA_PORTA.bit.CMD = cmd; + FPGA_PORTA.bit.DATA0 = data0; + + unsigned char i =0; + while(i < count) + { + // Write to FPGA + FPGA_DATA1_PORT_OUT = data1Buf[i++]; + FPGA_PORTA.bit.WR_TRIG ^= 1; + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; + } +} + +// Read data from FPGA +void hil_fpga_read_data_432(unsigned char count, unsigned short *buf) +{ + // Set DATA1 bus to input direction + FPGA_DATA1_PORT_DIR = 0x0000; + FPGA_IO_DIR_PORT_OUT &= ~FPGA_IO_DIR_BIT; + + while (count) + { + // Wait for word on DATA1 + while (!(FPGA_RD_TRIG_PORT_IN & FPGA_RD_TRIG_BIT)); + + // Store word + *(buf+(--count)) = FPGA_DATA1_PORT_IN; + // Request next word on DATA1 + if (count) + { + FPGA_IO_DIR_PORT_OUT ^= FPGA_IO_DIR_BIT; + FPGA_IO_DIR_PORT_OUT ^= FPGA_IO_DIR_BIT; + } + } + // Set DATA1 to output + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + FPGA_DATA1_PORT_DIR = 0xFFFF; +} + + +// Write CMD, DATA0 and DATA1 to FPGA +void hil_fpga_write_cmd_data0_data1_count(unsigned char cmd, unsigned char data0, unsigned short data1Buf[], unsigned char count) +{ + //unsigned short i = 0; + // Set DATA1 bus to output direction + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + FPGA_DATA1_PORT_DIR = 0xFFFF; + + // Assemble PORTA data + FPGA_PORTA.bit.CMD = cmd; + FPGA_PORTA.bit.DATA0 = data0; + + // Wait until RD_TRIG = 1 and FPGA is ready to accept data + startWdtTimeOutCounter(WDTIS__128M); + while (!(FPGA_RD_TRIG_PORT_IN & FPGA_RD_TRIG_BIT)) + { + if(TimeOut){break;} + } + stopWdtTimeOutCounter(); + + do + { + // Write to FPGA + FPGA_DATA1_PORT_OUT = data1Buf[count - 1]; + FPGA_PORTA.bit.WR_TRIG ^= 1; + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; + count--; + } while(count); +} + + +// Read data from FPGA +void hil_fpga_read_data1(unsigned char count, unsigned short *buf) +{ + // Set DATA1 bus to input direction + FPGA_DATA1_PORT_DIR = 0x0000; + FPGA_IO_DIR_PORT_OUT &= ~FPGA_IO_DIR_BIT; + + while (count) + { + startWdtTimeOutCounter(WDTIS__128M); + + // Wait for word on DATA1 + while (!(FPGA_RD_TRIG_PORT_IN & FPGA_RD_TRIG_BIT)) + { + if(TimeOut){break;} + } + stopWdtTimeOutCounter(); + + // Store word + *(buf+(count-1)) = FPGA_DATA1_PORT_IN; + count--; + // Request next word on DATA1 + if (count) + { + FPGA_IO_DIR_PORT_OUT ^= FPGA_IO_DIR_BIT; + FPGA_IO_DIR_PORT_OUT ^= FPGA_IO_DIR_BIT; + } + } + // Set DATA1 to output + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + FPGA_DATA1_PORT_DIR = 0xFFFF; +} + +// Hi-Z JTAG signals to target, except TEST and RST (actively drive 0) +void hil_fpga_power_up_target(void) +{ + // Enable VCC_SUPPLY and VCC_DT + P8DIR |= (BIT0 + BIT7); + P8OUT |= (BIT0 + BIT7); + _hil_Delay_1ms(1); +} + +unsigned short hil_fpga_get_version(void) +{ + unsigned short version = 0; + + // This is a bit complicated, due to the configuration register returning a value + hil_fpga_write_cmd_data0(FPGA_CMD_VERSION, 0); + + // Set DATA1 bus to input direction + FPGA_DATA1_PORT_DIR = 0x0000; + FPGA_IO_DIR_PORT_OUT &= ~FPGA_IO_DIR_BIT; + + // Wait for data valid + while (!FPGA_RD_TRIG_IS_ASSERTED); + + // Store word + version = FPGA_DATA1_PORT_IN; + + // Remove VERSION command + FPGA_PORTA.bit.CMD = 0; + FPGA_PORTA.bit.DATA0 = 0; + FPGA_CMD_DATA0_PORT_OUT = FPGA_PORTA.all; + + // Set DATA1 to output + FPGA_IO_DIR_PORT_OUT |= FPGA_IO_DIR_BIT; + FPGA_DATA1_PORT_DIR = 0xFFFF; + + return version; +} diff --git a/Bios/src/hil/msp_fet/hilFpgaAccess.h b/Bios/src/hil/msp_fet/hilFpgaAccess.h new file mode 100644 index 0000000..c09c9e3 --- /dev/null +++ b/Bios/src/hil/msp_fet/hilFpgaAccess.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2007 - 2014 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 _HIL_FPGA_ACCESS_H_ +#define _HIL_FPGA_ACCESS_H_ + +#include "arch.h" + +void hil_fpga_init(void); +void initJtagBypass(struct jtag); +void hil_fpga_enable_bypass(); +void hil_fpga_disable_bypass(void); + +void hil_fpga_write_cmd_data0(unsigned char cmd, unsigned char data0); +void hil_fpga_write_cmd_data0_data1(unsigned char cmd, unsigned char data0, unsigned short data1); +void hil_fpga_write_cmd_data0_data1_count(unsigned char cmd, unsigned char data0, unsigned short data1Buf[], unsigned char count); +void hil_fpga_read_data1(unsigned char count, unsigned short *buf); +void hil_fpga_power_up_target(void); + +//432 only +void hil_fpga_write_cmd_data0_data1_count_432(unsigned char cmd, unsigned char data0, unsigned short data1Buf[], unsigned char count); +void hil_fpga_read_data_432(unsigned char count, unsigned short *buf); +void hil_fpga_write_cmd_data0_432(unsigned char cmd, unsigned char data0); + +#endif /*_HIL_FPGA_ACCESS_H_*/ diff --git a/Bios/src/hil/uifv1/arch.h b/Bios/src/hil/uifv1/arch.h index 5be55eb..ac9546d 100644 --- a/Bios/src/hil/uifv1/arch.h +++ b/Bios/src/hil/uifv1/arch.h @@ -7,172 +7,274 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "msp430.h" + #ifndef _UIFV1_ARCH_H_ #define _UIFV1_ARCH_H_ -struct jtag { - unsigned char TCK; - unsigned char TMS; - unsigned char TDI; - unsigned char TDO; - unsigned char* In; - unsigned char* Out; -}; - -extern const struct jtag _Jtag; - -#define RSTHIGH 0 -#define RSTLOW 1 - -#define DEFAULT_RSTDELAY 5 - -// 4-wire JTAG: low level signal access -#define TMSset1 { *_Jtag.Out |= _Jtag.TMS; } -#define TMSset0 { *_Jtag.Out &= ~_Jtag.TMS; } -#define TDIset1 { *_Jtag.Out |= _Jtag.TDI; } -#define TDIset0 { *_Jtag.Out &= ~_Jtag.TDI; } -#define TCKset1 { *_Jtag.Out |= _Jtag.TCK; } -#define TCKset0 { *_Jtag.Out &= ~_Jtag.TCK; } -#define TCLKset1 { EDT_Tclk(1); } -#define TCLKset0 { EDT_Tclk(0); } -#define TCLK { TCLKset0 TCLKset1 } -#define TDIset1TMSset1 { *_Jtag.Out |= _Jtag.TDI | _Jtag.TMS; } -#define TDIset0TMSset1 { *_Jtag.Out &= ~_Jtag.TDI; *_Jtag.Out |= _Jtag.TMS;} - - -// 2-wire Spy-Bi-Wire: low level signal access -#define JTAGOUT (*_Jtag.Out) -#define JTAGIN (*_Jtag.In) -#define sbwdato (_Jtag.TDI) -#define sbwclk (_Jtag.TCK) -#define sbwdati (_Jtag.TDO) - -#define TEST BIT0 // P4.0 (out) (high) -#define TSTCTRLOUT *tstctrl_port_ -#define TGTCTRLOUT P2OUT -#define ENTDI2TDO entdi2tdo_ -#define SELT BIT5 // P2.5 out (high) (aktiv low) -#define TGTRST BIT6 // P2.6 out (high) (aktiv low) - - -#define RSTset1 { if (gprotocol_id == SPYBIWIRE) \ - { \ - { JTAGOUT |= sbwdato; } \ - } \ - else \ - { \ - { TGTCTRLOUT &= ~SELT; TGTCTRLOUT |= TGTRST; } \ - } \ - EDT_Delay_1ms(DEFAULT_RSTDELAY); \ - } -#define RSTset0 { if (gprotocol_id == SPYBIWIRE) \ - { \ - { JTAGOUT &= ~sbwdato; } \ - } \ - else \ - { \ - { TGTCTRLOUT &= ~SELT; TGTCTRLOUT &= ~TGTRST; } \ - } \ - EDT_Delay_1ms(DEFAULT_RSTDELAY); \ - } -#define TSTset1 { if (gprotocol_id == SPYBIWIRE) \ - { \ - { JTAGOUT |= sbwclk;} \ - } \ - else \ - { \ - { ((TSTCTRLOUT) &= (~TEST)); } \ - } \ - EDT_Delay_1ms(DEFAULT_RSTDELAY); \ - } -#define TSTset0 { if (gprotocol_id == SPYBIWIRE) \ - { \ - {JTAGOUT &= ~sbwclk; } \ - } \ - else \ - { \ - { ((TSTCTRLOUT) |= (TEST)); } \ - } \ - EDT_Delay_1ms(DEFAULT_RSTDELAY); \ - } - -#define TMSL JTAGOUT &= ~sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; -#define TMSLDH JTAGOUT &= ~sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwdato; JTAGOUT |= sbwclk; -#define TDIH JTAGOUT |= sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; -#define TDIL JTAGOUT &= ~sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; -#define TDOsbw TSTCTRLOUT ^= ENTDI2TDO; __disable_interrupt(); JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; __enable_interrupt(); TSTCTRLOUT ^= ENTDI2TDO; -#define TDO_RD TSTCTRLOUT ^= ENTDI2TDO; __disable_interrupt(); JTAGOUT &= ~sbwclk; TDOvalue <<= 1; TDOvalue |= (JTAGIN & sbwdati) != 0; JTAGOUT |= sbwclk; __enable_interrupt(); TSTCTRLOUT ^= ENTDI2TDO; - -// Constants for VPP connection and process state at Blow-Fuse -#define VPP_ON_TDI 0 -#define VPP_ON_TEST 1 - -#define SETTDOIN ((P4OUT) &= (~BIT2)) -#define SETTDOOUT ((P4OUT) |= (BIT2)) -#define SETTDION ((P4OUT) |= (BIT4)) -#define SETTDIOFF ((P4OUT) &= (~BIT4)) - -#define VPPon(x) (x == VPP_ON_TEST ? (P4OUT |= BIT6) : (P4OUT |= BIT5)) -#define VPPoff() ((P4OUT) &= ~(BIT6 | BIT5)) - - -#define CRYSTAL 8000000 // externally connected HF crystal -#define SETVFFREQ 100000 // pulse frequency to setup VF, this one's the fastest ~6ms settletime -#define FLASHFREQ 450000 -#define TA_SETVF_DIV CRYSTAL/SETVFFREQ/2 -#define TA_STROBE_DIV CRYSTAL/FLASHFREQ -#define TA_STROBE_DIV2 CRYSTAL/FLASHFREQ/2 - -#define FREQUENCY (CRYSTAL/1000) // CPU frequency (master/slave) in KHz -#define SEC_TIMEOUT 7 -#define DEF_TIMEOUT (CRYSTAL*SEC_TIMEOUT)/13 - -#define VFCHN 2 - -#define STROBEOUT BIT4 // P2.4 (out) (secondary function) -#define STROBEIN BIT7 // P4.7 (in) (secondary function) - -#define VCCTON BIT3 // P4.3 (out) (low) - -#define VCCTon() ((TSTCTRLOUT) |= (VCCTON)) -#define VCCToff() ((TSTCTRLOUT) &= (~VCCTON)) - -#define JSBWsbwdato TGTRST -//#define sbwdati TDO -#define JSBsbwclk TEST -//#define reset TMS -//#define rti TCK // Run/test-idle + #define RSTHIGH 0 + #define RSTLOW 1 + + #define DEFAULT_RSTDELAY 5 + + enum {JTAG = 0, SPYBIWIRE = 1, SPYBIWIREJTAG = 2, JTAGUNDEF = 4, SPYBIWIRE_SUBMCU = 5, SPYBIWIRE_MSP_FET=6, JTAG_432 = 7, SWD_432 = 8}; + + #define CRYSTAL 8000000 // externally connected HF crystal + #define SETVFFREQ 100000 // pulse frequency to setup VF, this one's the fastest ~6ms settletime + #define FLASHFREQ 450000 + #define TA_SETVF_DIV CRYSTAL/SETVFFREQ/2 + #define TA_STROBE_DIV CRYSTAL/FLASHFREQ + #define TA_STROBE_DIV2 CRYSTAL/FLASHFREQ/2 + + #define FREQUENCY (CRYSTAL/1000) // CPU frequency (master/slave) in KHz + #define SEC_TIMEOUT 7 + #define DEF_TIMEOUT (CRYSTAL*SEC_TIMEOUT)/13 + + #define VFCHN 2 + + #define FET_TRUE 0x1 + #define FET_FALSE 0x0 + + #define ExtLimit 1700 // a level higher than this means external voltage available + #define ConvRange 4095.0f // 12bit conversion range both for ADC and DAC + #define VCCTmin ConvRange // 0xFFF, write this value to the DAC register to setup minimum VCCT + #define Res1 60.4f // FB2VCCT + #define Res2 30.1f // FB2GND + #define Res3 39.2f // FB2SETVCCT + #define Res4 30.1f // VCCT2ADC1 + #define Res5 22.1f // ADC12GND + #define Vref 1224.0f // the reference voltage of the voltage regulator + #define VCref 2500.0f // conversion reference voltage + #define minVCCT ((Res1*((Vref/Res2)-((VCref-Vref)/Res3)))+Vref) + #define maxVCCT (((Res1*((Res2+Res3)/(Res2*Res3)))+1)*Vref) + #define VCCICHN 0 + #define VCCTCHN 1 + #define VCCRCHN 3 + + #ifdef ARCH_MSP432 + + struct jtag + { + unsigned char TCK; + unsigned char TMS; + unsigned char TDI; + unsigned char TDO; + unsigned char* In; + unsigned char* Out; + unsigned char* DIRECTION; + unsigned char RST; + unsigned char _SELT; + unsigned char* RST_PORT; + unsigned char* RST_PORT_DIRECTION; + unsigned char _TST; + unsigned char _ENI2O; + unsigned char VF2TEST; + unsigned char VF2TDI; + unsigned char VCCTON; + unsigned char _TDIOFF; + unsigned char* TSTCTRL_PORT; + unsigned char* TSTCTRL_PORT_DIRECTION; + }; + + static const struct jtag _Jtag_Target = + { + (unsigned char) BIT3, // TCK, P5.3 (out) (high) + (unsigned char) BIT0, // TMS, P5.0 (out) (high) + (unsigned char) BIT1, // TDI, P5.1 (out) (high) + (unsigned char) BIT2, // TDO, P5.2 (in) + (unsigned char*)&P5IN, + (unsigned char*)&P5OUT, + (unsigned char*)&P5DIR, + (unsigned char) BIT6, // RST + (unsigned char) BIT5, // _selt + (unsigned char*)&P2OUT, + (unsigned char*)&P2DIR, + (unsigned char) BIT0, // _TST + (unsigned char) BIT2, // _ENI2O + (unsigned char) BIT6, // VF2TEST + (unsigned char) BIT5, // VF2TDI, + (unsigned char) BIT3, // VCCTON + (unsigned char) BIT4, // _TDIOFF + (unsigned char*)&P4OUT, + (unsigned char*)&P4DIR, + }; + + #endif + + #ifdef ARCH_MSP430 + + struct jtag { + unsigned char TCK; + unsigned char TMS; + unsigned char TDI; + unsigned char TDO; + unsigned char* In; + unsigned char* Out; + }; + + extern const struct jtag _Jtag; + // 4-wire JTAG: low level signal access + #define TMSset1 { *_Jtag.Out |= _Jtag.TMS; } + #define TMSset0 { *_Jtag.Out &= ~_Jtag.TMS; } + #define TDIset1 { *_Jtag.Out |= _Jtag.TDI; } + #define TDIset0 { *_Jtag.Out &= ~_Jtag.TDI; } + #define TCKset1 { *_Jtag.Out |= _Jtag.TCK; } + #define TCKset0 { *_Jtag.Out &= ~_Jtag.TCK; } + #define TCLKset1 { IHIL_Tclk(1); } + #define TCLKset0 { IHIL_Tclk(0); } + #define TCLK { TCLKset0 TCLKset1 } + #define TDIset1TMSset1 { *_Jtag.Out |= _Jtag.TDI | _Jtag.TMS; } + #define TDIset0TMSset1 { *_Jtag.Out &= ~_Jtag.TDI; *_Jtag.Out |= _Jtag.TMS;} + + + // 2-wire Spy-Bi-Wire: low level signal access + #define JTAGOUT (*_Jtag.Out) + #define JTAGIN (*_Jtag.In) + #define sbwdato (_Jtag.TDI) + #define sbwclk (_Jtag.TCK) + #define sbwdati (_Jtag.TDO) + + #define TEST BIT0 // P4.0 (out) (high) + #define TSTCTRLOUT *tstctrl_port_ + #define TGTCTRLOUT P2OUT + #define ENTDI2TDO entdi2tdo_ + #define SELT BIT5 // P2.5 out (high) (aktiv low) + #define TGTRST BIT6 // P2.6 out (high) (aktiv low) + + #define RSTset1 { if (gprotocol_id == SPYBIWIRE) \ + { \ + { JTAGOUT |= sbwdato; } \ + } \ + else \ + { \ + { TGTCTRLOUT &= ~SELT; TGTCTRLOUT |= TGTRST; } \ + } \ + IHIL_Delay_1ms(DEFAULT_RSTDELAY); \ + } + #define RSTset0 { if (gprotocol_id == SPYBIWIRE) \ + { \ + { JTAGOUT &= ~sbwdato; } \ + } \ + else \ + { \ + { TGTCTRLOUT &= ~SELT; TGTCTRLOUT &= ~TGTRST; } \ + } \ + IHIL_Delay_1ms(DEFAULT_RSTDELAY); \ + } + #define TSTset1 { if (gprotocol_id == SPYBIWIRE) \ + { \ + { JTAGOUT |= sbwclk;} \ + } \ + else \ + { \ + { ((TSTCTRLOUT) &= (~TEST)); } \ + } \ + IHIL_Delay_1ms(DEFAULT_RSTDELAY); \ + } + #define TSTset0 { if (gprotocol_id == SPYBIWIRE) \ + { \ + {JTAGOUT &= ~sbwclk; } \ + } \ + else \ + { \ + { ((TSTCTRLOUT) |= (TEST)); } \ + } \ + IHIL_Delay_1ms(DEFAULT_RSTDELAY); \ + } + + #define TMSL JTAGOUT &= ~sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; + #define TMSLDH JTAGOUT &= ~sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwdato; JTAGOUT |= sbwclk; + #define TDIH JTAGOUT |= sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; + #define TDIL JTAGOUT &= ~sbwdato; JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; + #define TDOsbw TSTCTRLOUT ^= ENTDI2TDO; __disable_interrupt(); JTAGOUT &= ~sbwclk; JTAGOUT |= sbwclk; __enable_interrupt(); TSTCTRLOUT ^= ENTDI2TDO; + #define TDO_RD TSTCTRLOUT ^= ENTDI2TDO; __disable_interrupt(); JTAGOUT &= ~sbwclk; TDOvalue <<= 1; TDOvalue |= (JTAGIN & sbwdati) != 0; JTAGOUT |= sbwclk; __enable_interrupt(); TSTCTRLOUT ^= ENTDI2TDO; + + // Constants for VPP connection and process state at Blow-Fuse + #define VPP_ON_TDI 0 + #define VPP_ON_TEST 1 + + #define SETTDOIN ((P4OUT) &= (~BIT2)) + #define SETTDOOUT ((P4OUT) |= (BIT2)) + #define SETTDION ((P4OUT) |= (BIT4)) + #define SETTDIOFF ((P4OUT) &= (~BIT4)) + + #define VPPon(x) (x == VPP_ON_TEST ? (P4OUT |= BIT6) : (P4OUT |= BIT5)) + #define VPPoff() ((P4OUT) &= ~(BIT6 | BIT5)) + #define VFCHN 2 + + #define STROBEOUT BIT4 // P2.4 (out) (secondary function) + #define STROBEIN BIT7 // P4.7 (in) (secondary function) + + #define VCCTON BIT3 // P4.3 (out) (low) + + #define VCCTon() ((TSTCTRLOUT) |= (VCCTON)) + #define VCCToff() ((TSTCTRLOUT) &= (~VCCTON)) + + #define JSBWsbwdato TGTRST + #define JSBsbwclk TEST + + #define VALID_DATA 0x1A + #define SYNC_ONGOING 0x2A + #define INVALID_DATA 0x3A + #define JTAG_LOCKED 0x4A + + #define BP_HIT_MASK_J 0x0400000000000000ull + #define LPMX5_MASK_J 0x4000000000000000ull + #define LPM4_1MASK_J 0x8000000000000000ull + #define LPM4_2MASK_J 0x8300000000000000ull + #define EIGHT_JSTATE_BITS 0x100000000000000ull + + #define JSTATE_FLOW_CONTROL_BITS 0xC7 + + #define JSTATE_BP_HIT 0x4 + #define JSTATE_SYNC_ONGOING 0x83 + #define JSTATE_LOCKED_STATE 0x40 + #define JSTATE_INVALID_STATE 0x81 + #define JSTATE_LPM_ONE_TWO 0x82 + #define JSTATE_LPM_THREE_FOUR 0x80 + #define JSTATE_VALID_CAPTURE 0x03 + #define JSTATE_LPM_X_FIVE 0xC0 + + #define JSTATE_SYNC_BROKEN_MASK 0xC3 + #define JSTATE_SYNC_BROKEN_PGACT 0x02 + #define JSTATE_SYNC_BROKEN_MCLK 0x01 + #define JSTATE_SYNC_BROKEN_MCLK_PGACT 0x00 + + #define L092_MODE 0xA55AA55A + #define C092_MODE 0x5AA55AA5 + + #endif #endif diff --git a/Bios/src/hil/uifv1/hil.c b/Bios/src/hil/uifv1/hil.c deleted file mode 100644 index 53ef938..0000000 --- a/Bios/src/hil/uifv1/hil.c +++ /dev/null @@ -1,1046 +0,0 @@ -/** -* \ingroup MODULHIL -* -* \file hil.c -* -* \brief Hardware Independent Layer Interface -* -*/ -/* - * Copyright (C) 2012 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. - */ - -//! \page hil_page1 (HIL) -//! \brief The HIL ... -//! \author Detlef Fink (03/10/2011) -//! -//! files\n -//! \li hil.c -//! \li hil_2w.c -//! \li hil_4w.c -//! \li hil_delays.s43 -//! \li hil_delays.h -//! \li arch.h - -#include "hw_compiler_specific.h" -#include "arch.h" -#include "edt.h" -#include "hilDelays.h" -#include "HalGlobalVars.h" -#include "stream.h" - -// vars -enum {JTAG = 0, SPYBIWIRE, SPYBIWIREJTAG}; -VAR_AT(unsigned long hil_device_flags_, HAL_ADDR_VAR_DEVICE_FLAGS); -REQUIRED(hil_device_flags_) -unsigned short gprotocol_id; -unsigned short gTclkHighWhilePsa; -unsigned short bVccOn; // Target Vcc is switched off by default - // dependant on calls to _hil_SetVcc() -unsigned char *tstctrl_port_; -unsigned char entdi2tdo_; - -unsigned short setPCclockBeforeCapture = 0; - -// function prototypes for map initialization -// common HIL configuration methods -short _hil_Init( void ); -short _hil_SetVcc(unsigned short Vcc); -short _hil_GetVcc(unsigned short* Vcc, unsigned short* ExtVcc); -short _hil_SetProtocol(unsigned short protocol_id); -void _hil_SetPsaSetup(unsigned short enhanced); -void _hil_SetPsaTCLK(unsigned short tclkValue); -short _hil_Open( unsigned char state ); -short _hil_Close( void ); -short IccMonitor_Process(unsigned short flags); // flags: to be compatible with HIL calls -void _hil_EntrySequences(unsigned char states); - -void _hil_SetJtagBits(unsigned char output); -unsigned char _hil_GetJtagBits(void); - -void _hil_SetTgtCtrlBits(unsigned char); -unsigned char _hil_GetTgtCtrlBits(void); - -void _hil_SetTestBits(unsigned char); -void _hil_SetJtagSpeed(unsigned short speed); - -unsigned char _hil_GetTestBits(void); - -void _hil_SetReset(unsigned char); -void _hil_SetTest(unsigned char); - -CONST_AT(edt_common_methods_t _edt_Common_Methods, HAL_ADDR_CONST_ETD_COMMON_METHODS) = -{ - _hil_Init, - _hil_SetVcc, - _hil_GetVcc, - _hil_SetProtocol, - _hil_SetPsaSetup, - _hil_SetPsaTCLK, - _hil_Open, - _hil_Close, - _hil_Delay_1us, - _hil_Delay_1ms, - IccMonitor_Process, - _hil_EntrySequences, - _hil_SetJtagBits, - _hil_GetJtagBits, - _hil_SetTgtCtrlBits, - _hil_GetTgtCtrlBits, - _hil_SetTestBits, - _hil_GetTestBits, - _hil_SetReset, - _hil_SetTest, - _hil_SetJtagSpeed, -}; - -// protocol specific methods -// (must be implemeted in 4-wire JTAG and 2-wire Spy-Bi-Wire mode) -extern short _hil_4w_TapReset(void); -extern short _hil_4w_CheckJtagFuse(void); -extern unsigned short _hil_4w_EnumChain(void); -extern unsigned char _hil_4w_Instr(unsigned char Instruction); -//extern unsigned long _hil_4w_SetReg_XBits(unsigned long Data, short Bits); -extern unsigned char _hil_4w_SetReg_XBits08(unsigned char Data); -extern unsigned short _hil_4w_SetReg_XBits16(unsigned short Data); -extern unsigned long _hil_4w_SetReg_XBits20(unsigned long Data); -extern unsigned long _hil_4w_SetReg_XBits32(unsigned long Data); -extern unsigned long long _hil_4w_SetReg_XBits64(unsigned long long Data); - -extern void _hil_4w_Tclk(unsigned char state); -extern void _hil_4w_StepPsa(unsigned long length); -extern void _hil_4w_StepPsaTclkHigh(unsigned long length); -extern short _hil_4w_BlowFuse(unsigned char targetHasTestVpp); - -extern short _hil_2w_TapReset(void); -extern short _hil_2w_CheckJtagFuse(void); -extern unsigned short _hil_2w_EnumChain(void); -extern unsigned char _hil_2w_Instr(unsigned char Instruction); -//extern unsigned long _hil_2w_SetReg_XBits(unsigned long Data, short Bits); -extern unsigned char _hil_2w_SetReg_XBits08(unsigned char Data); -extern unsigned short _hil_2w_SetReg_XBits16(unsigned short Data); -extern unsigned long _hil_2w_SetReg_XBits20(unsigned long Data); -extern unsigned long _hil_2w_SetReg_XBits32(unsigned long Data); -extern unsigned long long _hil_2w_SetReg_XBits64(unsigned long long Data); -extern void _hil_2w_Tclk(unsigned char state); -extern void _hil_2w_StepPsa(unsigned long length); -extern void _hil_2w_StepPsaTclkHigh(unsigned long length); -extern short _hil_2w_BlowFuse(unsigned char targetHasTestVpp); - -// PSA distinct methods -void _hil_EnhancedPsaSetup(unsigned long address); -void _hil_PsaSetup(unsigned long address); -void _hil_EnhancedPsaEnd(void); -void _hil_PsaEnd(void); - -// init by HIL init function -VAR_AT(edt_distinct_methods_t _edt_Distinct_Methods, HAL_ADDR_VAR_EDT_DISTINCT_METHODS); - -#define ExtLimit 1700 // a level higher than this means external voltage available -#define ConvRange 4095.0f // 12bit conversion range both for ADC and DAC -#define VCCTmin ConvRange // 0xFFF, write this value to the DAC register to setup minimum VCCT -#define Res1 60.4f // FB2VCCT -#define Res2 30.1f // FB2GND -#define Res3 39.2f // FB2SETVCCT -#define Res4 30.1f // VCCT2ADC1 -#define Res5 22.1f // ADC12GND -#define Vref 1224.0f // the reference voltage of the voltage regulator -#define VCref 2500.0f // conversion reference voltage -#define minVCCT ((Res1*((Vref/Res2)-((VCref-Vref)/Res3)))+Vref) -#define maxVCCT (((Res1*((Res2+Res3)/(Res2*Res3)))+1)*Vref) -#define VCCICHN 0 -#define VCCTCHN 1 -#define VCCRCHN 3 - -const unsigned short ADC_MV[4] = { 5905, 5905, 6934, 5905 }; // input voltages included the scale by resitors -const unsigned short ADC_CONV_RANGE = 4096; // 1 Bit error, because div is with 4096 faster -const unsigned short ADC_AVERAGES = 4; -const unsigned short DAC_CONV_RANGE = 4095; // - -extern const unsigned char DMA_TMSL_TDIL[]; - -static volatile unsigned char VFSettleFlag = 0; -static volatile unsigned char useTDI = 0; - -unsigned short ConvertAD(unsigned short channel) -{ - unsigned long tmp; - unsigned short ret_mv = 0; - - if(channel < 4 ) - { - tmp = *((unsigned short*)&ADC12MEM0+channel) + - *((unsigned short*)&ADC12MEM4+channel) + - *((unsigned short*)&ADC12MEM8+channel) + - *((unsigned short*)&ADC12MEM12+channel); - tmp *= ADC_MV[channel]; - tmp /= ADC_CONV_RANGE * ADC_AVERAGES; - ret_mv = tmp; - } - return(ret_mv); -} - -/*---------------------------------------------------------------------------- - This function performs a single AD conversion on the selected pin. - Uses internal reference 2.5V (VR+ = VREF+, VR- = AVSS). - Only used for SetTargetVcc() and Selftest(). - Arguments: word pinmask (bit position of selected analog input Ax) - Result: word (12 bit ADC conversion result) -*/ -short ConvertAD_(short channel) -{ -// select channel and do conversion - ADC12CTL0 &= ~ENC; // Disable conversion, write controls - ADC12MCTL0 = 0x10 + channel; // select Vref and analog channel Ax - ADC12CTL0 |= ENC; // Enable conversions - ADC12CTL0 |= ADC12SC; // Start conversions - while ((ADC12IFG & BIT0) == 0); // wait until conversion is done - return(ADC12MEM0); // return conversion result from MEM0 -} - -unsigned short last_vcc; // Initialization in HalGlobalVars.c - - -#pragma optimize = none -void SetDac(unsigned short vcc) -{ - signed short nomDac; - signed short corr; - - if(last_vcc != vcc) - { - nomDac = (unsigned short)(ConvRange - (vcc - minVCCT)); // calculate approximated value - nomDac += (85 - (vcc/20)); // error reduction of approximated value - if(nomDac > ConvRange) - { - nomDac = ConvRange; - } - if(nomDac < 0) - { - nomDac = 0; - } - DAC12_0DAT = nomDac; // set voltage - DAC12_0CTL |= DAC12ENC; // enable DAC12 - last_vcc = vcc; - } - else - { - corr = ConvertAD(VCCTCHN); - if(corr > (vcc+10)) - { - if(DAC12_0DAT < 4095) - { - DAC12_0DAT++; - } - } - else if(corr < (vcc-10)) - { - if(DAC12_0DAT) - { - DAC12_0DAT--; - } - } - } -} - -// ----------------------------------------------------------------------------- -short _hil_Init( void ) -{ - // Setup ADC12 - ADC12CTL0 &= ~ENC; // Disable conversions, write controls - ADC12CTL0 = ADC12ON | REFON | REF2_5V | MSC | SHT0_2 | SHT1_2; // Turn on ADC12, VREF = 2.5v, set samp. time - ADC12CTL1 = SHP | CONSEQ_3; // Use sampling timer, CstartAddr = MEM0 - // four time averaging on each channel - ADC12MCTL0 = 0x10 | 0; // select Vref and cannel - ADC12MCTL1 = 0x10 | 1; // select Vref and cannel - ADC12MCTL2 = 0x10 | 2; // select Vref and cannel - ADC12MCTL3 = 0x10 | 3; // select Vref and cannel - ADC12MCTL4 = 0x10 | 0; // select Vref and cannel - ADC12MCTL5 = 0x10 | 1; // select Vref and cannel - ADC12MCTL6 = 0x10 | 2; // select Vref and cannel - ADC12MCTL7 = 0x10 | 3; // select Vref and cannel - ADC12MCTL8 = 0x10 | 0; // select Vref and cannel - ADC12MCTL9 = 0x10 | 1; // select Vref and cannel - ADC12MCTL10 = 0x10 | 2; // select Vref and cannel - ADC12MCTL11 = 0x10 | 3; // select Vref and cannel - ADC12MCTL12 = 0x10 | 0; // select Vref and cannel - ADC12MCTL13 = 0x10 | 1; // select Vref and cannel - ADC12MCTL14 = 0x10 | 2; // select Vref and cannel - ADC12MCTL15 = 0x10 | 3; // select Vref and cannel - - ADC12CTL0 |= ENC; // Enable conversions - // ADCs run free - ADC12CTL0 |= ADC12SC; // Start conversions - - DAC12_0DAT = VCCTmin; // set voltage to MIN ~0 - DAC12_0CTL = DAC12CALON + DAC12IR + DAC12AMP_5; // Internal ref gain 1 - - // Init SPI for JTAG - UCTL1 |= SWRST; - UCTL1 = CHAR | SYNC | MM | SWRST; - UTCTL1 = CKPL | SSEL0 | STC | TXEPT; - UBR01 = 2; //SPI_DIV_JTAG; // Load SPI frequency divider - UBR11 = 0x00; - UMCTL1 = 0x00; // Clear Modulation Register - UCTL1 &= ~SWRST; - ME2 |= USPIE1; // Enable SPI module - - // DMA init - DMACTL0 = 0; // URXIFG0 trigger for DMS channel0, channel1 and channel2 are software triggered - DMACTL1 = 0; // DAM immediatly, no round-robin, no NMI interrupt - - DMA1CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); - DMA1DA = (unsigned int)_Jtag.Out; //JTAGOUT; // set destination address - DMA2CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); - DMA2DA = (unsigned int)_Jtag.Out; //JTAGOUT; // set destination address - DMA2SZ = 4; // JTAG test/idle sequence is always 4 transisions - - // set default debug protocol to JTAG - gprotocol_id = JTAG; - // set default to TCLK low when doing PSA - gTclkHighWhilePsa = 0; - // initialize function pointers to distinct functions - _hil_SetProtocol(gprotocol_id); - return 0; -} - -void _hil_SetJtagSpeed(unsigned short speed) -{ - UBR01 = speed; //SPI_DIV_JTAG; // Load SPI frequency divider -} -// ----------------------------------------------------------------------------- -#pragma optimize = none -short _hil_SetVcc(unsigned short Vcc) -{ - static unsigned char bPowerUp = 1; - - if(Vcc) - { - //This workaround is necessary to set TCK to a defined low level before - //applying Vcc to the target device - //otherwise the target will not power up correctly and the UIF can't - //establish a SBW communication - - if(bPowerUp) - { - P5OUT &= ~BIT3; - TGTCTRLOUT &= ~SELT; - bVccOn = Vcc; - SetDac(Vcc+50); - VCCTon(); - _hil_Delay_1ms(1); - TGTCTRLOUT |= SELT; - bPowerUp = 0; - } - else - { - bVccOn = Vcc; - SetDac(Vcc+50); - VCCTon(); - } - } - else - { - VCCToff(); - EDT_Close(); // DF 20110131 - bVccOn = 0; - bPowerUp = 1; - } - return 0; -} -// ----------------------------------------------------------------------------- -short _hil_GetVcc(unsigned short* Vcc, unsigned short* ExtVcc) -{ - if(hil_device_flags_ & DEVICE_FLAG_EASY) - { - *Vcc = bVccOn; - *ExtVcc = bVccOn; - return(0); - } - else - { - if(P4OUT & BIT3) - { - *Vcc = ConvertAD(VCCTCHN); - } - else - { - *Vcc = 0; - } - *ExtVcc = ConvertAD(VCCICHN); - } - return 0; -} -// ----------------------------------------------------------------------------- -short _hil_SetProtocol(unsigned short protocol_id) -{ - short ret_value = 0; - - if((hil_device_flags_ & DEVICE_FLAG_SBW4) && (protocol_id == JTAG)) - { - gprotocol_id = JTAG; - } - else if((hil_device_flags_ & DEVICE_FLAG_SBW2) && (protocol_id == SPYBIWIRE)) - { - gprotocol_id = SPYBIWIRE; - } - else if((hil_device_flags_ & DEVICE_FLAG_SBW4) && (protocol_id == SPYBIWIREJTAG)) - { - gprotocol_id = SPYBIWIREJTAG; - } - else - { - ret_value = -1; - } - - if(hil_device_flags_ & DEVICE_FLAG_EASY) - { - tstctrl_port_ = (unsigned char*)&P5DIR; - entdi2tdo_ = BIT1; - } - else - { - tstctrl_port_ = (unsigned char*)&P4OUT; - entdi2tdo_ = BIT2; - } - if(gprotocol_id == SPYBIWIRE) - { - _edt_Distinct_Methods.TapReset = _hil_2w_TapReset; - _edt_Distinct_Methods.CheckJtagFuse = _hil_2w_CheckJtagFuse; - _edt_Distinct_Methods.EnumChain = _hil_2w_EnumChain; - _edt_Distinct_Methods.Instr = _hil_2w_Instr; - _edt_Distinct_Methods.SetReg_XBits08 = _hil_2w_SetReg_XBits08; - _edt_Distinct_Methods.SetReg_XBits16 = _hil_2w_SetReg_XBits16; - _edt_Distinct_Methods.SetReg_XBits20 = _hil_2w_SetReg_XBits20; - _edt_Distinct_Methods.SetReg_XBits32 = _hil_2w_SetReg_XBits32; - _edt_Distinct_Methods.SetReg_XBits64 = _hil_2w_SetReg_XBits64; - _edt_Distinct_Methods.Tclk = _hil_2w_Tclk; - if(!gTclkHighWhilePsa) - { - _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsa; - } - else - { - _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsaTclkHigh; - } - _edt_Distinct_Methods.BlowFuse = _hil_2w_BlowFuse; - DMA1SZ = 6; // load DMA1 with size - DMA2SZ = 6; // load DMA1 with size - DMA2SA = (unsigned int)DMA_TMSL_TDIL; - } - else - { - _edt_Distinct_Methods.TapReset = _hil_4w_TapReset; - _edt_Distinct_Methods.CheckJtagFuse = _hil_4w_CheckJtagFuse; - _edt_Distinct_Methods.EnumChain = _hil_4w_EnumChain; - _edt_Distinct_Methods.Instr = _hil_4w_Instr; - _edt_Distinct_Methods.SetReg_XBits08 = _hil_4w_SetReg_XBits08; - _edt_Distinct_Methods.SetReg_XBits16 = _hil_4w_SetReg_XBits16; - _edt_Distinct_Methods.SetReg_XBits20 = _hil_4w_SetReg_XBits20; - _edt_Distinct_Methods.SetReg_XBits32 = _hil_4w_SetReg_XBits32; - _edt_Distinct_Methods.SetReg_XBits64 = _hil_4w_SetReg_XBits64; - _edt_Distinct_Methods.Tclk = _hil_4w_Tclk; - if(!gTclkHighWhilePsa) - { - _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsa; - } - else - { - _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsaTclkHigh; - } - _edt_Distinct_Methods.BlowFuse = _hil_4w_BlowFuse; - DMA2SZ = 4; // load DMA1 with size - } - return(ret_value); -} - -void _hil_SetPsaSetup(unsigned short enhancedPsa) -{ - if(enhancedPsa) - { - _edt_Distinct_Methods.SetupPsa = _hil_EnhancedPsaSetup; - _edt_Distinct_Methods.EndPsa = _hil_EnhancedPsaEnd; - } - else - { - _edt_Distinct_Methods.SetupPsa = _hil_PsaSetup; - _edt_Distinct_Methods.EndPsa = _hil_PsaEnd; - } -} - -void _hil_SetPsaTCLK(unsigned short tclkValue) -{ - if(tclkValue) - { - gTclkHighWhilePsa = 1; - } - else - { - gTclkHighWhilePsa = 0; - } - - if(gprotocol_id == SPYBIWIRE) - { - if(gTclkHighWhilePsa) - { - _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsaTclkHigh; - } - else - { - _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsa; - } - } - else - { - if(gTclkHighWhilePsa) - { - _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsaTclkHigh; - } - else - { - _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsa; - } - } -} - -static void _hil_Release(void) -{ - if(gprotocol_id == SPYBIWIRE) - { - // drive target RST/SBWTDIO pin high - JTAGOUT |= sbwdato; // TDI drives target RST high - if(hil_device_flags_ & DEVICE_FLAG_EASY) - { - TSTCTRLOUT |= ENTDI2TDO; // EASY - } - else - { - //TSTCTRLOUT &= ~ENTDI2TDO; // enable TDI2TDO - TSTCTRLOUT |= ENTDI2TDO; // disable TDI2TDO - } - EDT_Delay_1ms(1); - // drive target TEST/SBWTCK pin low - JTAGOUT &= ~sbwclk; // TCK drives target TEST low - release Spy-Bi-Wire logic - //TGTCTRLOUT &= ~SELT; // enable JTAG & RST pin drivers - TGTCTRLOUT |= SELT; // disable JTAG & RST pin drivers - } - else - { - // hands off from target RST pin -> will be pulled up - -// if(hil_device_flags_ & DEVICE_FLAG_EASY) -// { -// TSTCTRLOUT &= ~ENTDI2TDO; // EASY -// } -// else - TSTCTRLOUT |= ENTDI2TDO; // disable TDI2TDO - TGTCTRLOUT |= SELT; // disable JTAG & RST pin drivers - EDT_Delay_1ms(1); - // hands off from target TEST pin -> will be pulled down - TSTCTRLOUT |= TEST; // reset target TEST pin low - } - EDT_Delay_1ms(5); -} - -#define RSTLOW_SBW 0 -#define RSTLOW_JTAG 1 -#define RSTHIGH_SBW 2 -#define RSTHIGH_JTAG 3 - -#define qDriveSignals() { *_Jtag.Out |= (_Jtag.TCK + _Jtag.TMS + _Jtag.TDI); \ - if(hil_device_flags_ & DEVICE_FLAG_EASY) TSTCTRLOUT &= ~ENTDI2TDO; else TSTCTRLOUT |= ENTDI2TDO; \ - TGTCTRLOUT |= TGTRST; \ - TGTCTRLOUT &= ~SELT; \ - } - -#define qDriveSbw() { TSTCTRLOUT |= TEST; \ - JTAGOUT |= sbwdato; \ - if(hil_device_flags_ & DEVICE_FLAG_EASY) TSTCTRLOUT |= ENTDI2TDO; else TSTCTRLOUT &= ~ENTDI2TDO; \ - EDT_Delay_1ms(1); \ - JTAGOUT &= ~sbwclk; \ - TGTCTRLOUT &= ~SELT; \ - } - -void _hil_EntrySequences(unsigned char states) -{ - TSTset0; //1 - EDT_Delay_1ms(1); // reset TEST logic - - if(states == RSTLOW_SBW || states == RSTLOW_JTAG) - { - RSTset0; //2 - } - else - { - RSTset1; //2 - } - - TSTset1; //3*/ - EDT_Delay_1ms(100); // activate TEST logic - - // phase 1 - if(states == RSTLOW_JTAG || states == RSTHIGH_JTAG) - { - RSTset0; //4 - } - else - { - RSTset1; //4 - } - EDT_Delay_1us(40); - - // phase 2 -> TEST pin to 0, no change on RST pin - if(states == RSTLOW_SBW || states == RSTHIGH_SBW) - { // for Spy-Bi-Wire - __disable_interrupt(); - JTAGOUT &= ~sbwclk; //5 - } - else - { // for 4-wire JTAG clear Test pin - ((TSTCTRLOUT) |= (TEST)); //5 - } - - // phase 3 - if(states == RSTLOW_JTAG) - { - TGTCTRLOUT &= ~SELT; - TGTCTRLOUT |= TGTRST; //6 - } - EDT_Delay_1us(1); - - // phase 4 -> TEST pin to 1, no change on RST pin - if(states == RSTLOW_SBW || states == RSTHIGH_SBW) - { // for Spy-Bi-Wire - JTAGOUT |= sbwclk; //7 - __enable_interrupt(); - } - else - { // for 4-wire JTAG - ((TSTCTRLOUT) &= (~TEST));//7 - } - EDT_Delay_1us(40); - - // phase 5 - if(states == RSTHIGH_JTAG) - { - TGTCTRLOUT &= ~SELT; TGTCTRLOUT |= TGTRST; - } - EDT_Delay_1ms(5); -} - -// ----------------------------------------------------------------------------- -void _hil_PsaSetup(unsigned long StartAddr) -{ - data_16bit - EDT_Tclk(1); - SetReg_16Bits_(MOV_IMM_PC) - EDT_Tclk(0); - EDT_Tclk(1); - SetReg_16Bits_(StartAddr - 2) - EDT_Tclk(0); - EDT_Tclk(1); - EDT_Tclk(0); - EDT_Tclk(1); - EDT_Tclk(0); - addr_capture - SetReg_16Bits_(0x0000); -} - -// ----------------------------------------------------------------------------- -void _hil_EnhancedPsaSetup(unsigned long StartAddr ) -{ - SetPc(StartAddr - 4) - halt_cpu - EDT_Tclk(0); - data_16bit - SetReg_16Bits_(StartAddr - 2) -} - -// ----------------------------------------------------------------------------- -void _hil_PsaEnd(void) -{ - // Intentionally does nothing -} - -// ----------------------------------------------------------------------------- -void _hil_EnhancedPsaEnd(void) -{ - decl_out - decl_isInstrLoad - - release_cpu - isInstrLoad -} - -// ----------------------------------------------------------------------------- -static void _hil_Connect(unsigned char state) -{ - if(state == RSTHIGH) - { - if(gprotocol_id == SPYBIWIRE) - { - qDriveSbw(); - EDT_Delay_1ms(1); - _hil_EntrySequences(RSTHIGH_SBW); - } - else - { - qDriveSignals(); - EDT_Delay_1ms(1); - if(gprotocol_id == SPYBIWIREJTAG) - { - _hil_EntrySequences(RSTHIGH_JTAG); - } - else - { - TSTset1; - } - } - } - else // state == RSTLOW - { - if(gprotocol_id == SPYBIWIRE) - { - qDriveSbw(); - EDT_Delay_1ms(1); - _hil_EntrySequences(RSTLOW_SBW); - } - else - { - qDriveSignals(); - EDT_Delay_1ms(1); - if(gprotocol_id == SPYBIWIREJTAG) - { - _hil_EntrySequences(RSTLOW_JTAG); - } - else - { - TSTset1; - } - } - } -} - -// ----------------------------------------------------------------------------- -short _hil_Open( unsigned char state) -{ - //_hil_Release(); - _hil_Connect(state); - return 0; -} -// ----------------------------------------------------------------------------- -short _hil_Close( void ) -{ - _hil_Release(); - //P4OUT |= BIT0; // reset target TEST pin low - //P2OUT |= BIT5; // disable JTAG pin drivers - //P4OUT |= BIT2; // disable TDI2TDO - //EDT_Delay_1ms(10); - return 0; -} - -// ***************************************************************************** -// Icc Monitor -char bIccMonitorOn; // Initialization in HalGlobalVars.c -char bHighCurrent; // Initialization in HalGlobalVars.c -signed short last_ext_vcc; // Initialization in HalGlobalVars.c -unsigned char over_current_count; // Initialization in HalGlobalVars.c - -short IccMonitor_Process(unsigned short flags) -{ - signed short ext_vcc; - signed short int_vcc; - signed short rint_vcc; - - ext_vcc = ConvertAD(VCCICHN); // convert channel - int_vcc = ConvertAD(VCCTCHN); // convert channel - rint_vcc = ConvertAD(VCCRCHN); - - if(ext_vcc >= ExtLimit) // external voltage in the range 1.7V >= - { - if((ext_vcc < (last_ext_vcc-10)) || ext_vcc > (last_ext_vcc+10)) - { - last_ext_vcc = ext_vcc; - } - SetDac(last_ext_vcc); // let's hace a look at the external supply pin - } - else - { - if(bVccOn != 0) - { - _hil_SetVcc(bVccOn); - } - } - - if(bVccOn && bIccMonitorOn) - { - if((rint_vcc - int_vcc) > 150) // eqivalent to > 100mA - { - over_current_count++; - if(over_current_count > 10) - { - bHighCurrent = 1; - EDT_Close(); - P4OUT &= ~BIT3; // turn off target VCC - bVccOn = 0; - STREAM_biosLedOff(1); - } - } - else - { - over_current_count = 0; - } - } - else - { - over_current_count = 0; - } - return 0; -} - -// ----------------------------------------------------------------------------- -#pragma vector=TIMERA0_VECTOR -__interrupt void TA_CCR0_ISR (void) -{ - static unsigned char cnt = 0; - - short x; - cnt++; - if(cnt == 10) - { - cnt = 0; // reset pulse counter - TACTL = 0; // stop Timer A - x = ConvertAD_(VFCHN); - if(x < 0xFFF) // 12-bit A/D thus value must exceed maximum measureable value (+-6.6V) - { - TACTL = (TASSEL_1 + TACLR + MC_1); // start Timer A again and produce pulses - } else { - VFSettleFlag = 0; // send message to main program - } - } -} - -// ----------------------------------------------------------------------------- -void SetVFuse(void) -{ - long TimeOut = DEF_TIMEOUT; - VFSettleFlag = 1; - P2DIR |= BIT7; - P2SEL |= BIT7; - CCR0 = TA_SETVF_DIV; - TACCTL0 = OUTMOD_4 + CCIE; // outmode toggle - TACTL = (TASSEL_1 + TACLR + MC_1);// clear TAR and start Timer A in up-mode - while(VFSettleFlag && TimeOut) - { - TimeOut--; - } - TACCTL0 = 0; // disable CCR0 interrupt - P2SEL &= ~BIT7; - P2DIR &= ~BIT7; -} - -// ----------------------------------------------------------------------------- -void SetVpp(long voltage) -{ - if(voltage) - { - SetVFuse(); - if(useTDI) - { - VPPon(VPP_ON_TDI); - } - else - { - VPPon(VPP_ON_TEST); - } - EDT_Delay_1ms(10); - } - else - { - VPPoff(); - } -} - -// ----------------------------------------------------------------------------- -void testVpp(unsigned char mode) -{ - if(mode) - { - SETTDOOUT; - SETTDION; - } - else - { - SETTDIOFF; - SETTDOIN; - } - - useTDI = !mode; -} - -// ----------------------------------------------------------------------------- -void _hil_SetJtagBits(unsigned char output) -{ - JTAGOUT = output; -} - -// ----------------------------------------------------------------------------- -unsigned char _hil_GetJtagBits(void) -{ - return JTAGOUT; -} - -// ----------------------------------------------------------------------------- -void _hil_SetTgtCtrlBits(unsigned char output) -{ - TGTCTRLOUT = output; -} - -// ----------------------------------------------------------------------------- -unsigned char _hil_GetTgtCtrlBits(void) -{ - return TGTCTRLOUT; -} - -// ----------------------------------------------------------------------------- -void _hil_SetTestBits(unsigned char output) -{ - TSTCTRLOUT = output; -} - -// ----------------------------------------------------------------------------- -unsigned char _hil_GetTestBits(void) -{ - return TSTCTRLOUT; -} - -// ----------------------------------------------------------------------------- -void _hil_SetReset(unsigned char value) -{ - if(value) - { - RSTset1 - } - else - { - RSTset0 - } -} - -// ----------------------------------------------------------------------------- -void _hil_SetTest(unsigned char value) -{ - if(value) - { - TSTset1 - } - else - { - TSTset0 - } -} - -// ----------------------------------------------------------------------------- -#ifdef uController - #pragma optimize = none -#endif -void JSBW_EntrySequences(unsigned char states) -{ - - qDriveSignals(); - EDT_Delay_1ms(10); - - TSTset0; - EDT_Delay_1ms(1); // reset TEST logic - - if(states == 0 || states == 1) - { - TGTCTRLOUT &= ~TGTRST;//RST 0 - } - else - { - RSTset1; - } - EDT_Delay_1us(10); - - TSTset1; - EDT_Delay_1ms(25); // activate TEST logic - - // phase 1 - if(states == 1 || states == 3) - { - RSTset0; - } - else - { - RSTset1; - } - EDT_Delay_1us(40); - - - // phase 2 -> TEST pin to 0, no change on RST pin - if(states == 0 || states == 2) - { // for Spy-Bi-Wire - TSTCTRLOUT |= JSBsbwclk; - } - else - { // for 4-wire JTAG - ((TSTCTRLOUT) |= (TEST)); //5 clear the bastard test - } - - // phase 3 - if(states == 1) - { - TGTCTRLOUT &= ~SELT; // set the reset 1 - TGTCTRLOUT |= TGTRST; //6 - } - EDT_Delay_1us(1); - - // phase 4 -> TEST pin to 1, no change on RST pin - if(states == 0 || states == 2) - { // for Spy-Bi-Wire - TSTCTRLOUT &= ~JSBsbwclk; - } - else - { // for 4-wire JTAG set Test pin - ((TSTCTRLOUT) &= (~TEST)); //5 - } - EDT_Delay_1us(40); - - // phase 5 - if(states == 3) - { - TGTCTRLOUT &= ~SELT; - TGTCTRLOUT |= TGTRST; - } - EDT_Delay_1ms(5); -} -/* EOF */ diff --git a/Bios/src/hil/uifv1/hil430.c b/Bios/src/hil/uifv1/hil430.c new file mode 100644 index 0000000..99b7ae9 --- /dev/null +++ b/Bios/src/hil/uifv1/hil430.c @@ -0,0 +1,995 @@ +/* + * \ingroup MODULHIL + * + * \file hil430.c + * + * \brief Hardware Independent Layer Interface + * + * + * Copyright (C) 2012 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. + */ + +#include "hw_compiler_specific.h" +#include "arch.h" +#include "edt.h" +#include "hilDelays.h" +#include "HalGlobalVars.h" +#include "stream.h" + +unsigned short gprotocol_id; +unsigned short gTclkHighWhilePsa; +unsigned char *tstctrl_port_; +unsigned char entdi2tdo_; +unsigned short jtagReleased; + +// function prototypes for map initialization +// common HIL configuration methods +short _hil_Init( void ); +short _hil_SetProtocol(unsigned short protocol_id); +void _hil_SetPsaSetup(unsigned short enhanced); +void _hil_SetPsaTCLK(unsigned short tclkValue); +short _hil_Open( unsigned char state ); +short _hil_Close( void ); +void _hil_EntrySequences(unsigned char states); +void _hil_ConfigureSetPc(unsigned short x) {} + +void _hil_SetReset(unsigned char); +void _hil_SetTest(unsigned char); +void _hil_SetTMS(unsigned char); +void _hil_SetTCK(unsigned char); +void _hil_SetTDI(unsigned char); +void _hil_initTimerB0(void); +void _hil_BSL_EntrySequence(unsigned short dummy); +void _hil_BSL_EntrySequence1xx_4xx(); +void _hil_SwitchVccFET(unsigned short SwitchVccFET){}; +short _hil_regulateVcc(void) { return 0; } +void _hil_setFpgaTimeOut(unsigned short state) {} +unsigned short _hil_getFpgaVersion(void) { return 0; } +void _hil_ReadADC12(void) {} +void _hil_ConfigFpgaIoMode(unsigned short mode) {} + +extern void _hilGeneric_Init( void ); +extern short _hilGeneric_GetVcc(double* Vcc, double* ExtVcc); +extern void _hilGeneric_SetJtagSpeed(unsigned short speed, unsigned short sbwSpeed); +extern short IccMonitor_Process(unsigned short flags); +extern short _hilGeneric_SetVcc(unsigned short Vcc); + +edt_common_methods_t _edt_Common_Methods = +{ + _hil_Init, + _hilGeneric_SetVcc, + _hil_SwitchVccFET, + _hilGeneric_GetVcc, + _hil_SetProtocol, + _hil_SetPsaTCLK, + _hil_Open, + _hil_Close, + _hil_Delay_1us, + _hil_Delay_1ms, + IccMonitor_Process, + _hil_EntrySequences, + _hil_SetReset, + _hil_SetTest, + _hilGeneric_SetJtagSpeed, + _hil_ConfigureSetPc, + _hil_initTimerB0, + _hil_BSL_EntrySequence, + _hil_SetTMS, + _hil_SetTCK, + _hil_SetTDI, + _hil_regulateVcc, + _hil_setFpgaTimeOut, + _hil_getFpgaVersion, + _hil_ReadADC12, + _hil_ConfigFpgaIoMode, + _hil_BSL_EntrySequence1xx_4xx +}; +// init by HIL init function +edt_distinct_methods_t _edt_Distinct_Methods; + +// protocol specific methods +// (must be implemeted in 4-wire JTAG and 2-wire Spy-Bi-Wire mode) +extern short _hil_4w_TapReset(void); +extern short _hil_4w_CheckJtagFuse(void); +extern unsigned char _hil_4w_Instr(unsigned char Instruction); +//extern unsigned long _hil_4w_SetReg_XBits(unsigned long Data, short Bits); +extern unsigned char _hil_4w_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_4w_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_4w_SetReg_XBits20(unsigned long Data); +extern unsigned long _hil_4w_SetReg_XBits32(unsigned long Data); +extern unsigned long long _hil_4w_SetReg_XBits64(unsigned long long Data); +extern unsigned long long _hil_4w_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion); + +extern void _hil_4w_Tclk(unsigned char state); +extern void _hil_4w_StepPsa(unsigned long length); +extern void _hil_4w_StepPsaTclkHigh(unsigned long length); +extern short _hil_4w_BlowFuse(unsigned char targetHasTestVpp); + +extern short _hil_2w_TapReset(void); +extern short _hil_2w_CheckJtagFuse(void); +extern unsigned char _hil_2w_Instr(unsigned char Instruction); +//extern unsigned long _hil_2w_SetReg_XBits(unsigned long Data, short Bits); +extern unsigned char _hil_2w_SetReg_XBits08(unsigned char Data); +extern unsigned short _hil_2w_SetReg_XBits16(unsigned short Data); +extern unsigned long _hil_2w_SetReg_XBits20(unsigned long Data); +extern unsigned long _hil_2w_SetReg_XBits32(unsigned long Data); +extern unsigned long long _hil_2w_SetReg_XBits64(unsigned long long Data); +extern unsigned long long _hil_2w_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion); +extern void _hil_2w_Tclk(unsigned char state); +extern void _hil_2w_StepPsa(unsigned long length); +extern void _hil_2w_StepPsaTclkHigh(unsigned long length); +extern short _hil_2w_BlowFuse(unsigned char targetHasTestVpp); +void _hil_2w_StepPsa_Xv2(unsigned long length); + +extern unsigned char _hil_2w_GetPrevInstruction(); +extern unsigned char _hil_4w_GetPrevInstruction(); + +short _hil_dummy_TapReset(void) {return 0;} +short _hil_dummy_CheckJtagFuse(void){return 0;} +unsigned char _hil_dummy_Instr(unsigned char Instruction){return 0;} +unsigned char _hil_dummy_SetReg_XBits08(unsigned char Data){return 0;} +unsigned short _hil_dummy_SetReg_XBits16(unsigned short Data){return 0;} +unsigned long _hil_dummy_SetReg_XBits20(unsigned long Data){return 0;} +unsigned long _hil_dummy_SetReg_XBits32(unsigned long Data){return 0;} +unsigned long long _hil_dummy_SetReg_XBits64(unsigned long long Data){return 0;} +unsigned long long _hil_dummy_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion){return 0;} + +void _hil_dummy_Tclk(unsigned char state){return;} +void _hil_dummy_StepPsa(unsigned long length){return;} +short _hil_dummy_BlowFuse(unsigned char targetHasTestVpp){return 0;} +unsigned char _hil_dummy_GetPrevInstruction(){return 0;} + +//dummy 432 defines +unsigned char _hil_dummy_Instr_4(unsigned char Data){return 0;} +unsigned long long hil_dummy_SetReg_35Bits (unsigned long long *Data) {return 0;} +unsigned long long hil_dummy_SetReg_XBits (unsigned long long *Data, unsigned short count) {return 0;} +short _hil_dummy_Write_Read_Ap(unsigned long address ,unsigned long *data, unsigned short rnw){return -1;}; +short _hil_dummy_Write_Read_Dp(unsigned char address ,unsigned long *data, unsigned short rnw){return -1;}; +short _hil_dummy_Write_Read_Mem_Ap(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw){return -1;}; +unsigned long _hil_dummy_read_idcoe(){return -1;} + + +// PSA distinct methods +void _hil_EnhancedPsaSetup(unsigned long address); +void _hil_PsaSetup(unsigned long address); +void _hil_EnhancedPsaEnd(void); +void _hil_PsaEnd(void); + +extern const unsigned char DMA_TMSL_TDIL[]; + +extern volatile unsigned char VFSettleFlag; +static volatile unsigned char useTDI = 0; + +// ----------------------------------------------------------------------------- +short _hil_Init( void ) +{ + _hilGeneric_Init(); + // DMA init + DMACTL0 = 0; // URXIFG0 trigger for DMS channel0, channel1 and channel2 are software triggered + DMACTL1 = 0; // DAM immediatly, no round-robin, no NMI interrupt + + DMA1CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); + DMA1DA = (unsigned int)_Jtag.Out; //JTAGOUT; // set destination address + DMA2CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); + DMA2DA = (unsigned int)_Jtag.Out; //JTAGOUT; // set destination address + DMA2SZ = 4; // JTAG test/idle sequence is always 4 transisions + + // set default debug protocol to JTAG + gprotocol_id = JTAG; + // set default to TCLK low when doing PSA + gTclkHighWhilePsa = 0; + // initialize function pointers to distinct functions + _hil_SetProtocol(gprotocol_id); + jtagReleased = 1; + + _edt_Common_Methods.BSL_EntrySequence1xx_4xx = _hil_BSL_EntrySequence1xx_4xx; + + return 0; +} + +// ----------------------------------------------------------------------------- +short _hil_SetProtocol(unsigned short protocol_id) +{ + short ret_value = 0; + + if((protocol_id == JTAG)) + { + gprotocol_id = JTAG; + } + else if((protocol_id == SPYBIWIRE)) + { + gprotocol_id = SPYBIWIRE; + } + else if((protocol_id == SPYBIWIREJTAG)) + { + gprotocol_id = SPYBIWIREJTAG; + } + else + { + ret_value = -1; + } + + tstctrl_port_ = (unsigned char*)&P4OUT; + entdi2tdo_ = BIT2; + + // set MSP4323 to dummy values + _edt_Distinct_Methods.SetReg_XBits35 = hil_dummy_SetReg_35Bits; + _edt_Distinct_Methods.SetReg_XBits = hil_dummy_SetReg_XBits; + _edt_Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _edt_Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _edt_Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _edt_Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _edt_Distinct_Methods.GetJtagIdCode = _hil_dummy_read_idcoe; + + if(gprotocol_id == SPYBIWIRE) + { + _edt_Distinct_Methods.TapReset = _hil_2w_TapReset; + _edt_Distinct_Methods.CheckJtagFuse = _hil_2w_CheckJtagFuse; + _edt_Distinct_Methods.Instr = _hil_2w_Instr; + _edt_Distinct_Methods.SetReg_XBits08 = _hil_2w_SetReg_XBits08; + _edt_Distinct_Methods.SetReg_XBits16 = _hil_2w_SetReg_XBits16; + _edt_Distinct_Methods.SetReg_XBits20 = _hil_2w_SetReg_XBits20; + _edt_Distinct_Methods.SetReg_XBits32 = _hil_2w_SetReg_XBits32; + _edt_Distinct_Methods.SetReg_XBits64 = _hil_2w_SetReg_XBits64; + _edt_Distinct_Methods.SetReg_XBits8_64 = _hil_2w_SetReg_XBits8_64; + _edt_Distinct_Methods.Tclk = _hil_2w_Tclk; + _edt_Distinct_Methods.GetPrevInstruction = _hil_2w_GetPrevInstruction; + + if(gTclkHighWhilePsa == 1) + { + _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsaTclkHigh; + } + else if(gTclkHighWhilePsa == 2) + { + _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsa_Xv2; + } + else + { + _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsa; + } + + _edt_Distinct_Methods.BlowFuse = _hil_2w_BlowFuse; + DMA1SZ = 6; // load DMA1 with size + DMA2SZ = 6; // load DMA1 with size + DMA2SA = (unsigned int)DMA_TMSL_TDIL; + } + else + { + _edt_Distinct_Methods.TapReset = _hil_4w_TapReset; + _edt_Distinct_Methods.CheckJtagFuse = _hil_4w_CheckJtagFuse; + _edt_Distinct_Methods.Instr = _hil_4w_Instr; + _edt_Distinct_Methods.SetReg_XBits08 = _hil_4w_SetReg_XBits08; + _edt_Distinct_Methods.SetReg_XBits16 = _hil_4w_SetReg_XBits16; + _edt_Distinct_Methods.SetReg_XBits20 = _hil_4w_SetReg_XBits20; + _edt_Distinct_Methods.SetReg_XBits32 = _hil_4w_SetReg_XBits32; + _edt_Distinct_Methods.SetReg_XBits64 = _hil_4w_SetReg_XBits64; + _edt_Distinct_Methods.SetReg_XBits8_64 = _hil_4w_SetReg_XBits8_64; + _edt_Distinct_Methods.Tclk = _hil_4w_Tclk; + _edt_Distinct_Methods.GetPrevInstruction = _hil_4w_GetPrevInstruction; + if(gTclkHighWhilePsa == 0 || gTclkHighWhilePsa == 2) + { + _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsa; + } + else + { + _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsaTclkHigh; + } + _edt_Distinct_Methods.BlowFuse = _hil_4w_BlowFuse; + DMA2SZ = 4; // load DMA1 with size + } + return(ret_value); +} + +void _hil_SetPsaTCLK(unsigned short tclkValue) +{ + gTclkHighWhilePsa = tclkValue; + if(gprotocol_id == SPYBIWIRE) + { + if(gTclkHighWhilePsa == 1) + { + _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsaTclkHigh; + } + else if(gTclkHighWhilePsa == 2) + { + _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsa_Xv2; + } + else + { + _edt_Distinct_Methods.StepPsa = _hil_2w_StepPsa; + } + } + else + { + if(gTclkHighWhilePsa == 1) + { + _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsaTclkHigh; + } + else + { + _edt_Distinct_Methods.StepPsa = _hil_4w_StepPsa; + } + } +} + +static void _hil_Release(void) +{ + if(!jtagReleased) + { + if(gprotocol_id == SPYBIWIRE) + { + // drive target RST/SBWTDIO pin high + JTAGOUT |= sbwdato; // TDI drives target RST high + TSTCTRLOUT |= ENTDI2TDO; // disable TDI2TDO + IHIL_Delay_1ms(1); + // drive target TEST/SBWTCK pin low + JTAGOUT &= ~sbwclk; // TCK drives target TEST low - release Spy-Bi-Wire logic + } + else + { + // hands off from target RST pin -> will be pulled up + TSTCTRLOUT |= ENTDI2TDO; // disable TDI2TDO + TGTCTRLOUT |= SELT; // disable JTAG & RST pin drivers + IHIL_Delay_1ms(1); + // hands off from target TEST pin -> will be pulled down + TSTCTRLOUT |= TEST; // reset target TEST pin low + } + _edt_Distinct_Methods.TapReset = _hil_dummy_TapReset; + _edt_Distinct_Methods.CheckJtagFuse = _hil_dummy_CheckJtagFuse; + _edt_Distinct_Methods.Instr = _hil_dummy_Instr; + _edt_Distinct_Methods.SetReg_XBits08 = _hil_dummy_SetReg_XBits08; + _edt_Distinct_Methods.SetReg_XBits16 = _hil_dummy_SetReg_XBits16; + _edt_Distinct_Methods.SetReg_XBits20 = _hil_dummy_SetReg_XBits20; + _edt_Distinct_Methods.SetReg_XBits32 = _hil_dummy_SetReg_XBits32; + _edt_Distinct_Methods.SetReg_XBits64 = _hil_dummy_SetReg_XBits64; + _edt_Distinct_Methods.SetReg_XBits8_64 = _hil_dummy_SetReg_XBits8_64; + _edt_Distinct_Methods.Tclk = _hil_dummy_Tclk; + _edt_Distinct_Methods.GetPrevInstruction = _hil_dummy_GetPrevInstruction; + _edt_Distinct_Methods.StepPsa = _hil_dummy_StepPsa; + _edt_Distinct_Methods.BlowFuse = _hil_dummy_BlowFuse; + _edt_Distinct_Methods.SetReg_XBits35 = hil_dummy_SetReg_35Bits; + _edt_Distinct_Methods.SetReg_XBits = hil_dummy_SetReg_XBits; + _edt_Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _edt_Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _edt_Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _edt_Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _edt_Distinct_Methods.GetJtagIdCode = _hil_dummy_read_idcoe; + + jtagReleased = 1; + } + IHIL_Delay_1ms(5); +} + +#define RSTLOW_SBW 0 +#define RSTLOW_JTAG 1 +#define RSTHIGH_SBW 2 +#define RSTHIGH_JTAG 3 + +#define qDriveSignals() { *_Jtag.Out |= (_Jtag.TCK + _Jtag.TMS + _Jtag.TDI); \ + TSTCTRLOUT |= ENTDI2TDO; \ + TGTCTRLOUT |= TGTRST; \ + TGTCTRLOUT &= ~SELT; \ + } + +#define qDriveSbw() { TSTCTRLOUT |= TEST; \ + JTAGOUT |= sbwdato; \ + TSTCTRLOUT &= ~ENTDI2TDO; \ + IHIL_Delay_1ms(1); \ + JTAGOUT &= ~sbwclk; \ + TGTCTRLOUT &= ~SELT; \ + } + +/*-------------RstLow_JTAG---------------- + ________ __________ +Test ______| |_________| + _______________ +Rst_____________________| +----------------------------------------*/ + +INLINE(forced) +static void _hil_EntrySequences_RstLow_JTAG() +{ + __disable_interrupt(); + TSTset0; //1 + IHIL_Delay_1ms(4); //reset TEST logic + + RSTset0; //2 + + TSTset1; //3 + IHIL_Delay_1ms(50); //activate TEST logic + + RSTset0; //4 + IHIL_Delay_1us(40); + + // for 4-wire JTAG clear Test pin Test(0) + ((TSTCTRLOUT) |= (TEST)); //5 + IHIL_Delay_1us(2); + + // for 4-wire JTAG -dry Reset(1) + TGTCTRLOUT &= ~SELT; + TGTCTRLOUT |= TGTRST; + IHIL_Delay_1us(2); + + // 4-wire JTAG - Test (1) + ((TSTCTRLOUT) &= (~TEST)); //7 + IHIL_Delay_1ms(5); + __enable_interrupt(); +} + +/*-------------RstHigh_JTAG-------------- + ________ __________ +Test ______| |_________| + _______ ______ +Rst____| |_________________| +----------------------------------------*/ + +INLINE(forced) +static void _hil_EntrySequences_RstHigh_JTAG() +{ + TSTset0; //1 + IHIL_Delay_1ms(1); //reset TEST logic + + RSTset1; //2 + + TSTset1; //3 + IHIL_Delay_1ms(100); //activate TEST logic + + RSTset0; //4 + IHIL_Delay_1us(40); + + // for 4-wire JTAG clear Test pin Test(0) + ((TSTCTRLOUT) |= (TEST)); //5 + IHIL_Delay_1us(1); + + // for 4-wire JTAG - Test (1) + ((TSTCTRLOUT) &= (~TEST)); //7 + IHIL_Delay_1us(40); + + // phase 5 Reset(1) + TGTCTRLOUT &= ~SELT; TGTCTRLOUT |= TGTRST; + IHIL_Delay_1ms(5); +} + +/*-------------RstHigh_SBW--------------- + ________ __________ +Test ______| |_________| + _________________________________ +Rst____| +----------------------------------------*/ +INLINE(forced) +static void _hil_EntrySequences_RstHigh_SBW() +{ + TSTset0; //1 + IHIL_Delay_1ms(1); // reset TEST logic + + RSTset1; //2 + + TSTset1; //3 + IHIL_Delay_1ms(100); // activate TEST logic + + // phase 1 + RSTset1; //4 + IHIL_Delay_1us(40); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for Spy-Bi-Wire + __disable_interrupt(); + JTAGOUT &= ~sbwclk; //5 + IHIL_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for Spy-Bi-Wire + JTAGOUT |= sbwclk; //7 + __enable_interrupt(); + IHIL_Delay_1us(40); + + IHIL_Delay_1ms(5); +} + +/*-------------RstLow_SBW---------------- + ________ __________ +Test ______| |_________| + __________________________ +Rst__________| +----------------------------------------*/ +INLINE(forced) +static void _hil_EntrySequences_RstLow_SBW() +{ + TSTset0; //1 + IHIL_Delay_1ms(1); // reset TEST logic + + RSTset0; //2 + + TSTset1; //3 + IHIL_Delay_1ms(100); // activate TEST logic + + // phase 1 + RSTset1; //4 + IHIL_Delay_1us(40); + + // phase 2 -> TEST pin to 0, no change on RST pin + // for Spy-Bi-Wire + __disable_interrupt(); + JTAGOUT &= ~sbwclk; //5 + IHIL_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + // for Spy-Bi-Wire + JTAGOUT |= sbwclk; //7 + __enable_interrupt(); + IHIL_Delay_1us(40); + IHIL_Delay_1ms(5); +} + +void _hil_EntrySequences(unsigned char states) +{ + switch(gprotocol_id) + { + case SPYBIWIRE: + if (states == RSTLOW) + { + _hil_EntrySequences_RstLow_SBW(); + } + if (states == RSTHIGH) + { + _hil_EntrySequences_RstHigh_SBW(); + } + break; + + case SPYBIWIREJTAG: + if (states == RSTLOW) + { + _hil_EntrySequences_RstLow_JTAG(); + } + if (states == RSTHIGH) + { + _hil_EntrySequences_RstHigh_JTAG(); + } + break; + + default: + TSTset1 + break; + } +} + +// ----------------------------------------------------------------------------- +static void _hil_Connect(unsigned char state) +{ + if(jtagReleased) + { + _hil_SetProtocol(gprotocol_id); + } + + if(state == RSTHIGH) + { + if(gprotocol_id == SPYBIWIRE) + { + qDriveSbw(); + IHIL_Delay_1ms(1); + _hil_EntrySequences_RstHigh_SBW(); + } + else + { + qDriveSignals(); + IHIL_Delay_1ms(1); + if(gprotocol_id == SPYBIWIREJTAG) + { + _hil_EntrySequences_RstHigh_JTAG(); + } + else + { + TSTset1; + } + } + } + else // state == RSTLOW + { + if(gprotocol_id == SPYBIWIRE) + { + qDriveSbw(); + IHIL_Delay_1ms(1); + _hil_EntrySequences_RstLow_SBW(); + } + else + { + qDriveSignals(); + IHIL_Delay_1ms(1); + if(gprotocol_id == SPYBIWIREJTAG) + { + _hil_EntrySequences_RstLow_JTAG(); + + } + else + { + TSTset1; + } + } + } + jtagReleased = 0; +} + +// ----------------------------------------------------------------------------- +short _hil_Open( unsigned char state) +{ + _hil_Connect(state); + return 0; +} +// ----------------------------------------------------------------------------- +short _hil_Close( void ) +{ + _hil_Release(); + return 0; +} + +// ----------------------------------------------------------------------------- +void SetVFuse(void) +{ + long TimeOut = DEF_TIMEOUT; + VFSettleFlag = 1; + P2DIR |= BIT7; + P2SEL |= BIT7; + CCR0 = TA_SETVF_DIV; + TACCTL0 = OUTMOD_4 + CCIE; // outmode toggle + TACTL = (TASSEL_1 + TACLR + MC_1);// clear TAR and start Timer A in up-mode + while(VFSettleFlag && TimeOut) + { + TimeOut--; + } + TACCTL0 = 0; // disable CCR0 interrupt + P2SEL &= ~BIT7; + P2DIR &= ~BIT7; +} + +// ----------------------------------------------------------------------------- +void SetVpp(long voltage) +{ + if(voltage) + { + SetVFuse(); + if(useTDI) + { + VPPon(VPP_ON_TDI); + } + else + { + VPPon(VPP_ON_TEST); + } + IHIL_Delay_1ms(10); + } + else + { + VPPoff(); + } +} + +// ----------------------------------------------------------------------------- +void testVpp(unsigned char mode) +{ + if(mode) + { + SETTDOOUT; + SETTDION; + } + else + { + SETTDIOFF; + SETTDOIN; + } + + useTDI = !mode; +} + +// ----------------------------------------------------------------------------- +void _hil_SetReset(unsigned char value) +{ + if(value) + { + RSTset1 + } + else + { + RSTset0 + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTMS(unsigned char value) +{ + if(value) + { + TMSset1 + } + else + { + TMSset0 + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTDI(unsigned char value) +{ + if(value) + { + TDIset1 + } + else + { + TDIset0 + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTCK(unsigned char value) +{ + if(value) + { + TCKset1 + } + else + { + TCKset0 + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTest(unsigned char value) +{ + if(value) + { + TSTset1 + } + else + { + TSTset0 + } +} +#ifdef uController + #pragma optimize = low +#endif + +// ----------------------------------------------------------------------------- +void _hil_initTimerB0(void) +{ + //Empty for UIF +} + + + +void _hil_BSL_EntrySequence1xx_4xx() +{ + if(gprotocol_id == SPYBIWIRE) + { + // set Default state of RST and TST + JTAGOUT |= sbwclk; // set test to 1 + IHIL_Delay_1ms(1); + RSTset1; // set RST 1; + + // INIT phase + JTAGOUT &= ~sbwclk; // set test 0; + IHIL_Delay_1ms(100); + + JTAGOUT &= ~sbwdato; // set RST low + IHIL_Delay_1ms(100); + + JTAGOUT |= sbwclk; // set test to 1 + IHIL_Delay_1ms(100); + + /*this is the first pulse keep it low for less than 15us */ + JTAGOUT &= ~sbwclk; // set test 0; + IHIL_Delay_1us(10); + JTAGOUT |= sbwclk; // set test 1; + + IHIL_Delay_1ms(100); + RSTset1; + IHIL_Delay_1ms(100); + JTAGOUT &= ~sbwclk; // set test 0; + IHIL_Delay_1ms(100); + } + else + { + // set Default state of RST and TST + ((TSTCTRLOUT) &= (~TEST)); // set test to 1 + IHIL_Delay_1ms(1); + RSTset1; // set RST 1; + + // INIT phase + ((TSTCTRLOUT) |= (TEST)); // set test 0; + IHIL_Delay_1ms(10); + + { TGTCTRLOUT &= ~SELT; TGTCTRLOUT &= ~TGTRST; }// set RST 0 + IHIL_Delay_1ms(10); + + ((TSTCTRLOUT) &= (~TEST)); // set test to 1 + IHIL_Delay_1ms(10); + + /*this is the first pulse keep it low for less than 15us */ + + ((TSTCTRLOUT) |= (TEST)); // set test 0; + _hil_SetTCK(0); + IHIL_Delay_1us(10); + ((TSTCTRLOUT) &= ~(TEST)); // set test 1; + _hil_SetTCK(1); + + IHIL_Delay_1ms(10); + _hil_SetTCK(0); + RSTset1; // set RST 1; + IHIL_Delay_1ms(10); + ((TSTCTRLOUT) |= (TEST)); // set test 0 ; + _hil_SetTCK(1); + IHIL_Delay_1ms(10); + } + } + + +/*------------------------------------------------------------------------*/ +/* __________ <15us __________ */ +/* Test/SBWTCK ________| |____________| |___ */ +/* __________ */ +/* RST/SBWTDIO ____________________________________| */ +/* */ +/* BSL Enabled here!! */ +/*------------------------------------------------------------------------*/ +void _hil_BSL_EntrySequence(unsigned short dummy) +{ + if(gprotocol_id == SPYBIWIRE) + { + // set Default state of RST and TST + JTAGOUT |= sbwclk; // set test to 1 + IHIL_Delay_1ms(1); + RSTset1; // set RST 1; + + // INIT phase + JTAGOUT &= ~sbwclk; // set test 0; + IHIL_Delay_1ms(100); + + JTAGOUT &= ~sbwdato; // set RST low + IHIL_Delay_1ms(100); + + JTAGOUT |= sbwclk; // set test to 1 + IHIL_Delay_1ms(100); + + /*this is the first pulse keep it low for less than 15us */ + JTAGOUT &= ~sbwclk; // set test 0; + IHIL_Delay_1us(10); + JTAGOUT |= sbwclk; // set test 1; + + IHIL_Delay_1ms(100); + RSTset1; + IHIL_Delay_1ms(100); + JTAGOUT &= ~sbwclk; // set test 0; + IHIL_Delay_1ms(100); + } + else + { + // set Default state of RST and TST + ((TSTCTRLOUT) &= (~TEST)); // set test to 1 + IHIL_Delay_1ms(1); + RSTset1; // set RST 1; + + // INIT phase + ((TSTCTRLOUT) |= (TEST)); // set test 0; + IHIL_Delay_1ms(10); + + { TGTCTRLOUT &= ~SELT; TGTCTRLOUT &= ~TGTRST; }// set RST 0 + IHIL_Delay_1ms(10); + + ((TSTCTRLOUT) &= (~TEST)); // set test to 1 + IHIL_Delay_1ms(10); + + /*this is the first pulse keep it low for less than 15us */ + ((TSTCTRLOUT) |= (TEST)); // set test 0; + IHIL_Delay_1us(10); + ((TSTCTRLOUT) &= ~(TEST)); // set test 1; + + IHIL_Delay_1ms(10); + RSTset1; // set RST 1; + IHIL_Delay_1ms(10); + ((TSTCTRLOUT) |= (TEST)); // set test 0 ; + IHIL_Delay_1ms(10); + } + } + +// ----------------------------------------------------------------------------- +#ifdef uController + #pragma optimize = none +#endif +void JSBW_EntrySequences(unsigned char states) +{ + + qDriveSignals(); + IHIL_Delay_1ms(10); + + TSTset0; + IHIL_Delay_1ms(1); // reset TEST logic + + if(states == 0 || states == 1) + { + TGTCTRLOUT &= ~TGTRST;//RST 0 + } + else + { + RSTset1; + } + IHIL_Delay_1us(10); + + TSTset1; + IHIL_Delay_1ms(25); // activate TEST logic + + // phase 1 + if(states == 1 || states == 3) + { + RSTset0; + } + else + { + RSTset1; + } + IHIL_Delay_1us(40); + + + // phase 2 -> TEST pin to 0, no change on RST pin + if(states == 0 || states == 2) + { // for Spy-Bi-Wire + TSTCTRLOUT |= JSBsbwclk; + } + else + { // for 4-wire JTAG + ((TSTCTRLOUT) |= (TEST)); //5 clear the bastard test + } + + // phase 3 + if(states == 1) + { + TGTCTRLOUT &= ~SELT; // set the reset 1 + TGTCTRLOUT |= TGTRST; //6 + } + IHIL_Delay_1us(1); + + // phase 4 -> TEST pin to 1, no change on RST pin + if(states == 0 || states == 2) + { // for Spy-Bi-Wire + TSTCTRLOUT &= ~JSBsbwclk; + } + else + { // for 4-wire JTAG set Test pin + ((TSTCTRLOUT) &= (~TEST)); //5 + } + IHIL_Delay_1us(40); + + // phase 5 + if(states == 3) + { + TGTCTRLOUT &= ~SELT; + TGTCTRLOUT |= TGTRST; + } + IHIL_Delay_1ms(5); +} +/* EOF */ diff --git a/Bios/src/hil/uifv1/hil432.c b/Bios/src/hil/uifv1/hil432.c new file mode 100644 index 0000000..c5d6b89 --- /dev/null +++ b/Bios/src/hil/uifv1/hil432.c @@ -0,0 +1,576 @@ +/* + * \ingroup MODULHIL + * + * \file hil432.c + * + * \brief Hardware Independent Layer Interface + * + * + * Copyright (C) 2015 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. + */ + +#include "arch.h" +#include "hw_compiler_specific.h" +#include "edt.h" +#include "hilDelays.h" +#include "HalGlobalVars.h" +#include "stream.h" + +unsigned short gprotocol_id; +unsigned short jtagReleased; + + +// function prototypes for map initialization +// common HIL configuration methods +short _hil_Init( void ); +short _hil_SetProtocol(unsigned short protocol_id); +void _hil_SetPsaSetup(unsigned short enhanced){return;} +void _hil_SetPsaTCLK(unsigned short tclkValue){return;} +void _hil_EntrySequences(unsigned char states){return;} +void _hil_ConfigureSetPc(unsigned short x){return;} +short _hil_Close( void ); +short _hil_Open( unsigned char state); + +void _hil_SetReset(unsigned char); +void _hil_SetTest(unsigned char); +void _hil_SetTMS(unsigned char); +void _hil_SetTCK(unsigned char); +void _hil_SetTDI(unsigned char); +void _hil_initTimerB0(void){return;} +void _hil_BSL_EntrySequence(unsigned short dummy){return;} +void _hil_SwitchVccFET(unsigned short SwitchVccFET){return;} + +short hil_Write_Read_Ap_Jtag(unsigned long address ,unsigned long *data, unsigned short rnw); +short hil_Write_Read_Dp_Jtag(unsigned char address ,unsigned long *data, unsigned short rnw); +short hil_Write_Read_Mem_Ap_Jtag(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw); +unsigned long hil_Jtag_read_idcode(); + +unsigned char _hil_dummy_Instr_4(unsigned char Data){return 0;} +short _hil_dummy_Write_Read_Ap(unsigned long address ,unsigned long *data, unsigned short rnw){return -1;}; +short _hil_dummy_Write_Read_Dp(unsigned char address ,unsigned long *data, unsigned short rnw){return -1;}; +short _hil_dummy_Write_Read_Mem_Ap(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw){return -1;}; +unsigned long _hil_dummy_read_idcoe(){return -1;} + +extern void _hilGeneric_Init( void ); +extern short _hilGeneric_GetVcc(double* Vcc, double* ExtVcc); +extern void _hilGeneric_SetJtagSpeed(unsigned short speed, unsigned short sbwSpeed); +extern short IccMonitor_Process(unsigned short flags); +extern short _hilGeneric_SetVcc(unsigned short Vcc); + +edt_common_methods_t _edt_Common_Methods = +{ + _hil_Init, + _hilGeneric_SetVcc, + _hil_SwitchVccFET, + _hilGeneric_GetVcc, + _hil_SetProtocol, + _hil_SetPsaTCLK, + _hil_Open, + _hil_Close, + _hil_Delay_1us, + _hil_Delay_1ms, + IccMonitor_Process, + _hil_EntrySequences, + _hil_SetReset, + _hil_SetTest, + _hilGeneric_SetJtagSpeed, + _hil_ConfigureSetPc, + _hil_initTimerB0, + _hil_BSL_EntrySequence, + _hil_SetTMS, + _hil_SetTCK, + _hil_SetTDI, +}; +// init by HIL init function +edt_distinct_methods_t _edt_Distinct_Methods; + +static struct jtag _Jtag; + +// protocol specific methods +// (must be implemeted in 4-wire JTAG ) +extern short hil_4w_432_TapReset(void); +extern unsigned char hil_4w_432_SetReg_XBits08(unsigned char Data); +extern unsigned short hil_4w_432_SetReg_XBits16(unsigned short Data); +extern unsigned long hil_4w_432_SetReg_XBits32(unsigned long Data); +extern unsigned long long hil_4w_432_SetReg_35Bits( unsigned long long *Data); +extern unsigned char hil_4w_432_Instr_4(unsigned char Instruction); +extern unsigned long long hil_4w_432_SetReg_XBits64(unsigned long long Data); +extern void hil_4w_432_InitJtag(struct jtag tmp); +extern void hil_4w_432_Seq(unsigned short length, unsigned char *sequence); + +extern void TMSset1(); +extern void TMSset0(); +extern void TDIset1(); +extern void TDIset0(); +extern void TCKset1(); +extern void TCKset0(); + +// dummy function pointers +short hil_dummy_TapReset(void) {return 0;} +short hil_dummy_CheckJtagFuse(void){return 0;} +unsigned char hil_dummy_Instr(unsigned char Instruction){return 0;} +unsigned char hil_dummy_SetReg_XBits08(unsigned char Data){return 0;} +unsigned short hil_dummy_SetReg_XBits16(unsigned short Data){return 0;} +unsigned long hil_dummy_SetReg_XBits20(unsigned long Data){return 0;} +unsigned long hil_dummy_SetReg_XBits32(unsigned long Data){return 0;} +unsigned long long hil_dummy_SetReg_XBits64(unsigned long long Data){return 0;} +unsigned long long hil_dummy_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion){return 0;} +void hil_dummy_Tclk(unsigned char state){return;} +void hil_dummy_StepPsa(unsigned long length){return;} +short hil_dummy_BlowFuse(unsigned char targetHasTestVpp){return 0;} +unsigned char hil_dummy_GetPrevInstruction(){return 0;} +unsigned long long hil_dummy_SetReg_35Bits (unsigned long long *Data) {return 0;} +unsigned long long hil_dummy_SetReg_XBits (unsigned long long *Data, unsigned short count) {return 0;} + +#pragma inline=forced +void RSTset1() +{ + { (*_Jtag.RST_PORT) |= _Jtag.RST; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void RSTset0() +{ + { (*_Jtag.RST_PORT) &= ~_Jtag.RST; } + _hil_Delay_1ms(5); +} + +#pragma inline=forced +void TSTset0() +{ + { (*_Jtag.TSTCTRL_PORT) |= _Jtag._TST;} + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TSTset1() +{ + {(*_Jtag.TSTCTRL_PORT) &= ~_Jtag._TST; } + _hil_Delay_1ms(5); +} +#pragma inline=forced +void TSTset0NoDelay() +{ + { (*_Jtag.TSTCTRL_PORT) |= _Jtag._TST;} +} +#pragma inline=forced +void TSTset1NoDelay() +{ + {(*_Jtag.TSTCTRL_PORT) &= ~_Jtag._TST; } +} + +// ----------------------------------------------------------------------------- +short _hil_Init( void ) +{ + _hilGeneric_Init(); + // DMA init + DMACTL0 = 0; // URXIFG0 trigger for DMS channel0, channel1 and channel2 are software triggered + DMACTL1 = 0; // DAM immediatly, no round-robin, no NMI interrupt + + DMA1CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); + DMA1DA = (unsigned int)_Jtag.Out; //JTAGOUT; // set destination address + DMA2CTL = ( DMADT0 | DMASRCINCR1 | DMASRCINCR0 | DMASRCBYTE | DMADSTBYTE); + DMA2DA = (unsigned int)_Jtag.Out; //JTAGOUT; // set destination address + DMA2SZ = 4; // JTAG test/idle sequence is always 4 transisions + // set default debug protocol to JTAG + gprotocol_id = JTAG_432; + // initialize function pointers to distinct functions + _hil_SetProtocol(gprotocol_id); + jtagReleased = 1; + + return 0; +} + +// ----------------------------------------------------------------------------- +short _hil_SetProtocol(unsigned short protocol_id) +{ + short ret_value = 0; + + if(protocol_id == JTAG_432 || protocol_id == SWD_432) + { + gprotocol_id = protocol_id; + _Jtag = _Jtag_Target; + hil_4w_432_InitJtag(_Jtag); + DMA1DA = (unsigned int)_Jtag.Out; + DMA2DA = (unsigned int)_Jtag.Out; + } + else + { + ret_value = -1; + } + if (protocol_id == JTAG_432 || protocol_id == SWD_432) + { + // load dummies for 430 + _edt_Distinct_Methods.CheckJtagFuse = hil_dummy_CheckJtagFuse; + _edt_Distinct_Methods.Instr = hil_dummy_Instr; + _edt_Distinct_Methods.SetReg_XBits20 = hil_dummy_SetReg_XBits20; + _edt_Distinct_Methods.GetPrevInstruction = hil_dummy_GetPrevInstruction; + _edt_Distinct_Methods.Tclk = hil_dummy_Tclk; + _edt_Distinct_Methods.SetReg_XBits8_64 = hil_dummy_SetReg_XBits8_64; + _edt_Distinct_Methods.StepPsa = hil_dummy_StepPsa; + _edt_Distinct_Methods.BlowFuse = hil_dummy_BlowFuse; + + _edt_Distinct_Methods.TapReset = hil_4w_432_TapReset; + _edt_Distinct_Methods.SetReg_XBits08 = hil_4w_432_SetReg_XBits08; + _edt_Distinct_Methods.SetReg_XBits16 = hil_4w_432_SetReg_XBits16; + _edt_Distinct_Methods.SetReg_XBits32 = hil_4w_432_SetReg_XBits32; + _edt_Distinct_Methods.SetReg_XBits64 = hil_4w_432_SetReg_XBits64; + _edt_Distinct_Methods.SetReg_XBits35 = hil_4w_432_SetReg_35Bits; + _edt_Distinct_Methods.SetReg_XBits = hil_dummy_SetReg_XBits; + _edt_Distinct_Methods.Instr04 = hil_4w_432_Instr_4; + _edt_Distinct_Methods.write_read_Dp = hil_Write_Read_Dp_Jtag; + _edt_Distinct_Methods.write_read_Ap = hil_Write_Read_Ap_Jtag; + _edt_Distinct_Methods.write_read_mem_Ap = hil_Write_Read_Mem_Ap_Jtag; + _edt_Distinct_Methods.GetJtagIdCode = hil_Jtag_read_idcode; + } + else + { + _edt_Distinct_Methods.TapReset = hil_dummy_TapReset; + _edt_Distinct_Methods.CheckJtagFuse = hil_dummy_CheckJtagFuse; + _edt_Distinct_Methods.Instr = hil_dummy_Instr; + _edt_Distinct_Methods.SetReg_XBits08 = hil_dummy_SetReg_XBits08; + _edt_Distinct_Methods.SetReg_XBits16 = hil_dummy_SetReg_XBits16; + _edt_Distinct_Methods.SetReg_XBits20 = hil_dummy_SetReg_XBits20; + _edt_Distinct_Methods.SetReg_XBits32 = hil_dummy_SetReg_XBits32; + _edt_Distinct_Methods.SetReg_XBits64 = hil_dummy_SetReg_XBits64; + _edt_Distinct_Methods.SetReg_XBits8_64 = hil_dummy_SetReg_XBits8_64; + _edt_Distinct_Methods.SetReg_XBits35 = hil_dummy_SetReg_35Bits; + _edt_Distinct_Methods.SetReg_XBits = hil_dummy_SetReg_XBits; + _edt_Distinct_Methods.Tclk = hil_dummy_Tclk; + _edt_Distinct_Methods.GetPrevInstruction = hil_dummy_GetPrevInstruction; + _edt_Distinct_Methods.StepPsa = hil_dummy_StepPsa; + _edt_Distinct_Methods.BlowFuse = hil_dummy_BlowFuse; + _edt_Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _edt_Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _edt_Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _edt_Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _edt_Distinct_Methods.GetJtagIdCode = _hil_dummy_read_idcoe; + } + return(ret_value); +} + +static void _hil_Release(void) +{ + if(!jtagReleased) + { + if(gprotocol_id == JTAG_432 || gprotocol_id == SWD_432) + { + // hands off from target RST pin -> will be pulled up + (*_Jtag.DIRECTION) |= (_Jtag.TDO); + (*_Jtag.TSTCTRL_PORT) |= (_Jtag._ENI2O); // disable TDI2TDO reset target TEST pin low + (*_Jtag.RST_PORT) |= (_Jtag._SELT); + IHIL_Delay_1ms(1); + (*_Jtag.TSTCTRL_PORT) |= (_Jtag._TST);// reset target TEST pin low + } + _edt_Distinct_Methods.TapReset = hil_dummy_TapReset; + _edt_Distinct_Methods.CheckJtagFuse = hil_dummy_CheckJtagFuse; + _edt_Distinct_Methods.Instr = hil_dummy_Instr; + _edt_Distinct_Methods.SetReg_XBits08 = hil_dummy_SetReg_XBits08; + _edt_Distinct_Methods.SetReg_XBits16 = hil_dummy_SetReg_XBits16; + _edt_Distinct_Methods.SetReg_XBits20 = hil_dummy_SetReg_XBits20; + _edt_Distinct_Methods.SetReg_XBits32 = hil_dummy_SetReg_XBits32; + _edt_Distinct_Methods.SetReg_XBits64 = hil_dummy_SetReg_XBits64; + _edt_Distinct_Methods.SetReg_XBits8_64 = hil_dummy_SetReg_XBits8_64; + _edt_Distinct_Methods.SetReg_XBits35 = hil_dummy_SetReg_35Bits; + _edt_Distinct_Methods.SetReg_XBits = hil_dummy_SetReg_XBits; + _edt_Distinct_Methods.Tclk = hil_dummy_Tclk; + _edt_Distinct_Methods.GetPrevInstruction = hil_dummy_GetPrevInstruction; + _edt_Distinct_Methods.StepPsa = hil_dummy_StepPsa; + _edt_Distinct_Methods.BlowFuse = hil_dummy_BlowFuse; + _edt_Distinct_Methods.Instr04 = _hil_dummy_Instr_4; + _edt_Distinct_Methods.write_read_Dp = _hil_dummy_Write_Read_Dp; + _edt_Distinct_Methods.write_read_Ap = _hil_dummy_Write_Read_Ap; + _edt_Distinct_Methods.write_read_mem_Ap = _hil_dummy_Write_Read_Mem_Ap; + _edt_Distinct_Methods.GetJtagIdCode = _hil_dummy_read_idcoe; + + jtagReleased = 1; + } + IHIL_Delay_1ms(5); +} + +#pragma inline=forced +void qDriveJTAG(void) +{ + (*_Jtag.Out) |= (_Jtag.TCK + _Jtag.TMS + _Jtag.TDI); + (*_Jtag.DIRECTION) |= (_Jtag.TCK + _Jtag.TMS + _Jtag.TDI); + (*_Jtag.DIRECTION) &= ~(_Jtag.TDO); + + (*_Jtag.TSTCTRL_PORT) |= (_Jtag._ENI2O + _Jtag._TST);//set test 1 and TDI TO TDO -> signals are low active + (*_Jtag.RST_PORT) |= (_Jtag.RST); + (*_Jtag.RST_PORT) &= ~(_Jtag._SELT); //set _SELT 1 > signal is low active -> active level shifters +} + +// ----------------------------------------------------------------------------- + + void JTAG_Entry() +{ + unsigned char sequence[8]; + unsigned char i = 0; + unsigned short entry = 0xE73C; + for (i = 0; i < 8; i++) + { + sequence[i] = 0xff; + } + hil_4w_432_Seq(51, sequence); + + sequence[0] = entry & 0xff; + sequence[1] = (entry >> 8) & 0xff; + hil_4w_432_Seq(16, sequence); + + for (i = 0; i < 1; i++) + { + sequence[i] = 0xff; + } + hil_4w_432_Seq(8, sequence); +} + +unsigned long hil_Jtag_read_idcode() +{ + unsigned long JtagId = 0; + + JtagId = _edt_Distinct_Methods.Instr04(IR4_IDCODE); + + if (JtagId == 0x1) + { + JtagId = _edt_Distinct_Methods.SetReg_XBits32(0); + } + return JtagId; +} + +static void _hil_Connect(unsigned char state) +{ + _hil_Release(); + if(jtagReleased) + { + _hil_SetProtocol(gprotocol_id); + } + if(gprotocol_id == JTAG_432 || gprotocol_id == SWD_432) + { + qDriveJTAG(); + JTAG_Entry(); + RSTset1(); + TSTset1(); + } + jtagReleased = 0; +} + +short _hil_Open( unsigned char state) +{ + _hil_Connect(state); + return 0; +} +// ----------------------------------------------------------------------------- +short _hil_Close( void ) +{ + _hil_Release(); + return 0; +} + +// ----------------------------------------------------------------------------- +void _hil_SetReset(unsigned char value) +{ + if(value) + { + RSTset1(); + } + else + { + RSTset0(); + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTest(unsigned char value) +{ + if(value) + { + TSTset1(); + } + else + { + TSTset0(); + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTMS(unsigned char value) +{ + if(value) + { + TMSset1(); + } + else + { + TMSset0(); + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTDI(unsigned char value) +{ + if(value) + { + TDIset1(); + } + else + { + TDIset0(); + } +} + +// ----------------------------------------------------------------------------- +void _hil_SetTCK(unsigned char value) +{ + if(value) + { + TCKset1(); + } + else + { + TCKset0(); + } +} + +// --------------------------------------------ARM defines---------------------- +// JTAG Instruction Register definitions +#define ABORT (0x8) // Used to force an AP abort +#define DPACC (0xA) // DP IR dpacc +#define APACC (0xB) // AP IR apacc +#define IDCODE (0xE) // JTAG-DP TAP identification +#define BYPASS (0xF) // Bypasses the device, by providing a direct path between DBGTDI and DBGTDO. + +// DP_SELECT Register bits +#define DP_SELECT_APBANKSEL_MASK (0x000000F0) // APBANKSEL Mask +#define DP_SELECT_APSEL_MASK (0xFF000000) // APBANKSEL Mask + +// --------------------------------------------ARM defines end------------------ + +short hil_Write_Read_Dp_Jtag(unsigned char address ,unsigned long *data, unsigned short rnw) +{ + unsigned long long retVal; + unsigned char i = 0; + unsigned long long dataAlig = 0ull; + dataAlig = ((unsigned long long)*data) << 3; + + dataAlig |= (((address & 0xC) >> 1) + (rnw & 0x1)); + + if(_edt_Distinct_Methods.Instr04(DPACC) != 0x1) + { + return -1; + } + + for (i = 0; i < MAX_RETRY; i++) + { + retVal = _edt_Distinct_Methods.SetReg_XBits35(&dataAlig); + // if ack == ACK + if ((retVal & 0x3) == ACK) + { + *data = retVal >> 3; + return ACK; + } + } + return -1; +} + +// ----------------------------------------------------------------------------- +short hil_Write_Read_Ap_Jtag(unsigned long address, unsigned long *data, unsigned short rnw) +{ + unsigned long long retVal; + unsigned char i = 0; + unsigned long long dataAlig = 0ull; + + dataAlig = ((unsigned long long)*data) << 3; + + unsigned long apsel_bank_sel = address & DP_SELECT_APSEL_MASK; + apsel_bank_sel |= address & DP_SELECT_APBANKSEL_MASK; + + if (_edt_Distinct_Methods.write_read_Dp(DP_SELECT, &apsel_bank_sel, WRITE) != ACK) + { + return -1; + } + + dataAlig |= (((address & 0xC) >> 1) + (rnw & 0x1)); + + if(_edt_Distinct_Methods.Instr04(APACC) != 0x1) + { + return -1; + } + + do + { + retVal = _edt_Distinct_Methods.SetReg_XBits35((unsigned long long*) &dataAlig); + } while((retVal & 0x3 != ACK) && (++i < MAX_RETRY)); + + if(i == MAX_RETRY) + { + return -1; + } + else + { + if(rnw == READ) + { + return _edt_Distinct_Methods.write_read_Dp(DP_RDBUFF, data, READ); + } + else + { + return ACK; + } + } +} + +// ----------------------------------------------------------------------------- +// Currently only supports single 32-bit transfers +short hil_Write_Read_Mem_Ap_Jtag(unsigned short ap_sel, unsigned long address, unsigned long *data, unsigned short rnw) +{ + // First Read current CSW value + unsigned long tmp = 0; + unsigned long apsel = (((unsigned long )ap_sel) << 24); + if (_edt_Distinct_Methods.write_read_Ap(AP_CSW | apsel, &tmp, READ) != ACK) + { + return -1; + } + + // Configure the transfer + tmp |= AP_CSW_ADDRINC_OFF | AP_CSW_SIZE_32BIT; + if (_edt_Distinct_Methods.write_read_Ap(AP_CSW | apsel, &tmp, WRITE) != ACK) + { + return -1; + } + + // Write the address + tmp = address; + if (_edt_Distinct_Methods.write_read_Ap(AP_TAR | apsel, &tmp, WRITE) != ACK) + { + return -1; + } + // Write/Read data + return _edt_Distinct_Methods.write_read_Ap(AP_DRW | apsel, data, rnw); +} + diff --git a/Bios/src/hil/uifv1/hilDelays.c b/Bios/src/hil/uifv1/hilDelays.c new file mode 100644 index 0000000..4d9c63e --- /dev/null +++ b/Bios/src/hil/uifv1/hilDelays.c @@ -0,0 +1,74 @@ +/* + * hilDelays.c + * + * + * + * Copyright (C) 2012 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. + */ + +#include "MSP430F1612.h" +#include "hilDelays.h" + +static void _hil_DelayStartTimer() +{ + TACTL = 0; // STOP Timer + TACTL &= ~TAIFG; // Clear the interrupt flag + TACTL = TASSEL_2; // Timer is runnig at 1 Mhz + TACCR0 = 0x2E9; // Load CCR0 with delay... (1ms delay) + TAR = 0; + TACTL |= TACLR + MC_1; // Start Timer +} + +static void _hil_DelayStopTimer() +{ + TACTL = 0; // STOP Timer + TACTL &= ~CCIFG; // Clear the interrupt flag +} + +void _hil_Delay_1ms(unsigned short millisec) // inner loop generates 1 ms +{ + unsigned short i; + for(i = millisec; i > 0; i--) + { + _hil_DelayStartTimer(); + while ((TACTL & TAIFG) == 0); // Wait until the Timer elapses + _hil_DelayStopTimer(); + } +} + +void _hil_Delay_1us(unsigned short microsec_1) // inner loop generates 10 us +{ + while((--microsec_1) > 0) + { + __delay_cycles(4); + } +} diff --git a/Bios/src/hil/uifv1/hilDelays.h b/Bios/src/hil/uifv1/hilDelays.h index e13571c..0b10e47 100644 --- a/Bios/src/hil/uifv1/hilDelays.h +++ b/Bios/src/hil/uifv1/hilDelays.h @@ -40,5 +40,5 @@ //! \brief //! -extern void _hil_Delay_1us(unsigned short usecs); -extern void _hil_Delay_1ms(unsigned short msecs); +void _hil_Delay_1us(unsigned short); +void _hil_Delay_1ms(unsigned short); diff --git a/Bios/src/hil/uifv1/hilDelays.s43 b/Bios/src/hil/uifv1/hilDelays.s43 deleted file mode 100644 index b6b887a..0000000 --- a/Bios/src/hil/uifv1/hilDelays.s43 +++ /dev/null @@ -1,135 +0,0 @@ -/* - * hilDelays.s43 - * - * Implementation of delay functions - * - * Copyright (C) 2012 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. - */ - -//! \ingroup MODULHIL -//! \file hilDelays.s43 -//! \brief - - -#include "../../hal/HalGlobalVars.h" - -RTMODEL "__SystemLibrary", "CLib" - RTMODEL "__core", "430" - RTMODEL "__double_size", "32" - RTMODEL "__pic", "no" - RTMODEL "__reg_r4", "free" - RTMODEL "__reg_r5", "free" - RTMODEL "__rt_version", "3" - - RSEG CSTACK:DATA:SORT:NOROOT(0) - - PUBLIC _hil_Delay_1ms - FUNCTION _hil_Delay_1ms,0603H - ARGFRAME CSTACK, 0, STACK - LOCFRAME CSTACK, 2, STACK - PUBLIC _hil_Delay_1us - FUNCTION _hil_Delay_1us,0603H - ARGFRAME CSTACK, 0, STACK - LOCFRAME CSTACK, 2, STACK - - CFI Names cfiNamesX0 - CFI StackFrame CFA SP DATA - CFI Resource PC:16, SP:16, SR:16, R4:16, R5:16, R6:16, R7:16, R8:16 - CFI Resource R9:16, R10:16, R11:16, R12:16, R13:16, R14:16, R15:16 - CFI EndNames cfiNamesX0 - - CFI Common cfiCommonX0 Using cfiNamesX0 - CFI CodeAlign 2 - CFI DataAlign 2 - CFI ReturnAddress PC CODE - CFI CFA SP+2 - CFI PC Frame(CFA, -2) - CFI SR Undefined - CFI R4 SameValue - CFI R5 SameValue - CFI R6 SameValue - CFI R7 SameValue - CFI R8 SameValue - CFI R9 SameValue - CFI R10 SameValue - CFI R11 SameValue - CFI R12 Undefined - CFI R13 Undefined - CFI R14 Undefined - CFI R15 Undefined - CFI EndCommon cfiCommonX0 - - - RSEG CODE:CODE:REORDER:NOROOT(1) -_hil_Delay_1us: - CFI Block cfiBlockX11 Using cfiCommonX0 - CFI Function _hil_Delay_1us - MOV.W R12, R15 -??_hil_Delay_1us_1: - CMP.W #0x0, R15 - JEQ ??_hil_Delay_1us_2 - MOV.W &HAL_ADDR_VAR_DELAY_LOOP_US, R14 ;0x1 -??_hil_Delay_1us_0: - CMP.W #0x0, R14 - JEQ ??_hil_Delay_1us_3 - ADD.W #0xffff, R14 - JMP ??_hil_Delay_1us_0 -??_hil_Delay_1us_3: - ADD.W #0xffff, R15 - JMP ??_hil_Delay_1us_1 -??_hil_Delay_1us_2: - RET - CFI EndBlock cfiBlockX11 - - RSEG CODE:CODE:REORDER:NOROOT(1) -_hil_Delay_1ms: - CFI Block cfiBlockX12 Using cfiCommonX0 - CFI Function _hil_Delay_1ms - MOV.W R12, R15 -??_hil_Delay_1ms_1: - CMP.W #0x0, R15 - JEQ ??_hil_Delay_1ms_2 - MOV.W &HAL_ADDR_VAR_DELAY_LOOP_MS, R14 ;0x535 -??_hil_Delay_1ms_0: - CMP.W #0x0, R14 - JEQ ??_hil_Delay_1ms_3 - ADD.W #0xffff, R14 - JMP ??_hil_Delay_1ms_0 -??_hil_Delay_1ms_3: - ADD.W #0xffff, R15 - JMP ??_hil_Delay_1ms_1 -??_hil_Delay_1ms_2: - RET - - CFI EndBlock cfiBlockX12 - -END diff --git a/Bios/src/hil/uifv1/hilGeneric.c b/Bios/src/hil/uifv1/hilGeneric.c new file mode 100644 index 0000000..53da939 --- /dev/null +++ b/Bios/src/hil/uifv1/hilGeneric.c @@ -0,0 +1,336 @@ +/* + * \ingroup MODULHIL + * + * \file hilGeneric.c + * + * \brief Hardware Independent Layer Interface + * + * + * Copyright (C) 2015 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. + */ + +#include "arch.h" +#include "hw_compiler_specific.h" +#include "edt.h" +#include "hilDelays.h" +#include "HalGlobalVars.h" +#include "stream.h" + +volatile unsigned char VFSettleFlag = 0; +unsigned short bVccOn; +extern unsigned char *tstctrl_port_; + +const unsigned short ADC_MV[4] = { 5905, 5905, 6934, 5905 }; // input voltages included the scale by resitors +const unsigned short ADC_CONV_RANGE = 4096; // 1 Bit error, because div is with 4096 faster +const unsigned short ADC_AVERAGES = 4; +const unsigned short DAC_CONV_RANGE = 4095; + +unsigned short _hilGeneric_ConvertAD(unsigned short channel) +{ + unsigned long tmp; + unsigned short ret_mv = 0; + + if(channel < 4 ) + { + tmp = *((unsigned short*)&ADC12MEM0+channel) + + *((unsigned short*)&ADC12MEM4+channel) + + *((unsigned short*)&ADC12MEM8+channel) + + *((unsigned short*)&ADC12MEM12+channel); + tmp *= ADC_MV[channel]; + tmp /= ADC_CONV_RANGE * ADC_AVERAGES; + ret_mv = tmp; + } + return(ret_mv); +} + +/*---------------------------------------------------------------------------- + This function performs a single AD conversion on the selected pin. + Uses internal reference 2.5V (VR+ = VREF+, VR- = AVSS). + Only used for SetTargetVcc() and Selftest(). + Arguments: word pinmask (bit position of selected analog input Ax) + Result: word (12 bit ADC conversion result) +*/ +short _hilGeneric_ConvertAD_(short channel) +{ +// select channel and do conversion + ADC12CTL0 &= ~ENC; // Disable conversion, write controls + ADC12MCTL0 = 0x10 + channel; // select Vref and analog channel Ax + ADC12CTL0 |= ENC; // Enable conversions + ADC12CTL0 |= ADC12SC; // Start conversions + while ((ADC12IFG & BIT0) == 0); // wait until conversion is done + return(ADC12MEM0); // return conversion result from MEM0 +} + +unsigned short last_vcc; + +#pragma optimize = none +void _hilGeneric_SetDac(unsigned short vcc) +{ + signed short nomDac; + signed short corr; + + if(last_vcc != vcc) + { + nomDac = (unsigned short)(ConvRange - (vcc - minVCCT)); // calculate approximated value + nomDac += (85 - (vcc/20)); // error reduction of approximated value + if(nomDac > ConvRange) + { + nomDac = ConvRange; + } + if(nomDac < 0) + { + nomDac = 0; + } + DAC12_0DAT = nomDac; // set voltage + DAC12_0CTL |= DAC12ENC; // enable DAC12 + last_vcc = vcc; + } + else + { + corr = _hilGeneric_ConvertAD(VCCTCHN); + if(corr > (vcc+10)) + { + if(DAC12_0DAT < 4095) + { + DAC12_0DAT++; + } + } + else if(corr < (vcc-10)) + { + if(DAC12_0DAT) + { + DAC12_0DAT--; + } + } + } +} + +// ----------------------------------------------------------------------------- +void _hilGeneric_Init( void ) +{ + // Setup ADC12 + // Setup ADC12 + ADC12CTL0 &= ~ENC; // Disable conversions, write controls + ADC12CTL0 = ADC12ON | REFON | REF2_5V | MSC | SHT0_2 | SHT1_2; // Turn on ADC12, VREF = 2.5v, set samp. time + ADC12CTL1 = SHP | CONSEQ_3; // Use sampling timer, CstartAddr = MEM0 + // four time averaging on each channel + ADC12MCTL0 = 0x10 | 0; // select Vref and cannel + ADC12MCTL1 = 0x10 | 1; // select Vref and cannel + ADC12MCTL2 = 0x10 | 2; // select Vref and cannel + ADC12MCTL3 = 0x10 | 3; // select Vref and cannel + ADC12MCTL4 = 0x10 | 0; // select Vref and cannel + ADC12MCTL5 = 0x10 | 1; // select Vref and cannel + ADC12MCTL6 = 0x10 | 2; // select Vref and cannel + ADC12MCTL7 = 0x10 | 3; // select Vref and cannel + ADC12MCTL8 = 0x10 | 0; // select Vref and cannel + ADC12MCTL9 = 0x10 | 1; // select Vref and cannel + ADC12MCTL10 = 0x10 | 2; // select Vref and cannel + ADC12MCTL11 = 0x10 | 3; // select Vref and cannel + ADC12MCTL12 = 0x10 | 0; // select Vref and cannel + ADC12MCTL13 = 0x10 | 1; // select Vref and cannel + ADC12MCTL14 = 0x10 | 2; // select Vref and cannel + ADC12MCTL15 = 0x10 | 3; // select Vref and cannel + + ADC12CTL0 |= ENC; // Enable conversions + // ADCs run free + ADC12CTL0 |= ADC12SC; // Start conversions + + DAC12_0DAT = VCCTmin; // set voltage to MIN ~0 + DAC12_0CTL = DAC12CALON + DAC12IR + DAC12AMP_5; // Internal ref gain 1 + + // Init SPI for JTAG + UCTL1 |= SWRST; + UCTL1 = CHAR | SYNC | MM | SWRST; + UTCTL1 = CKPL | SSEL0 | STC | TXEPT; + UBR01 = 2; // Load SPI frequency divider 2 + UBR11 = 0x00; + UMCTL1 = 0x00; // Clear Modulation Register + UCTL1 &= ~SWRST; + ME2 |= USPIE1; // Enable SPI module +} + +void _hilGeneric_SetJtagSpeed(unsigned short speed, unsigned short sbwSpeed) +{ + if(speed) + { + UBR01 = 2; // Load SPI frequency divider + } +} + +// ----------------------------------------------------------------------------- +short _hilGeneric_GetVcc(double* Vcc, double* ExtVcc) +{ + if(P4OUT & BIT3) + { + *Vcc = _hilGeneric_ConvertAD(VCCTCHN); + } + else + { + *Vcc = 0; + } + *ExtVcc = _hilGeneric_ConvertAD(VCCICHN); + return 0; +} + +#ifdef ARCH_MSP432 +void VCCTon() +{ + P4OUT |= BIT3; +} +void VCCToff() +{ + P4OUT &= ~BIT3; +} +#endif + +// ----------------------------------------------------------------------------- +#pragma optimize = medium +short _hilGeneric_SetVcc(unsigned short Vcc) +{ + static unsigned char bPowerUp = 1; + + if(Vcc) + { + //This workaround is necessary to set TCK to a defined low level before + //applying Vcc to the target device + //otherwise the target will not power up correctly and the UIF can't + //establish a SBW communication + if(bPowerUp) + { + P5OUT &= ~BIT3; + P2OUT &= ~BIT5; //(*_Jtag.RST_PORT) &= ~(_Jtag._SELT); + bVccOn = Vcc; + _hilGeneric_SetDac(Vcc+50); + VCCTon(); + _hil_Delay_1ms(1); + bPowerUp = 0; + } + else + { + bVccOn = Vcc; + _hilGeneric_SetDac(Vcc+50); + VCCTon(); + } + } + else + { + VCCToff(); + IHIL_Close(); + bVccOn = 0; + bPowerUp = 1; + } + return 0; +} + + +// ***************************************************************************** +// Icc Monitor +char bIccMonitorOn; // Initialization in HalGlobalVars.c +char bHighCurrent; // Initialization in HalGlobalVars.c +signed short last_ext_vcc; // Initialization in HalGlobalVars.c +unsigned short over_current_count; // Initialization in HalGlobalVars.c + +short IccMonitor_Process(unsigned short flags) +{ + signed short ext_vcc; + signed short int_vcc; + signed short rint_vcc; + + ext_vcc = _hilGeneric_ConvertAD(VCCICHN); // convert channel + int_vcc = _hilGeneric_ConvertAD(VCCTCHN); // convert channel + rint_vcc = _hilGeneric_ConvertAD(VCCRCHN); + + if(ext_vcc >= ExtLimit) // external voltage in the range 1.7V >= + { + if((ext_vcc < (last_ext_vcc-10)) || ext_vcc > (last_ext_vcc+10)) + { + last_ext_vcc = ext_vcc; + } + _hilGeneric_SetDac(last_ext_vcc); // let's hace a look at the external supply pin + } + else + { + if(bVccOn != 0) + { + _hilGeneric_SetVcc(bVccOn); + } + } + + if(bVccOn && bIccMonitorOn) + { + if((rint_vcc - int_vcc) > 150) // eqivalent to > 100mA + { + over_current_count++; + if(over_current_count > 400) + { + bHighCurrent = 1; + IHIL_Close(); + P4OUT &= ~BIT3; // turn off target VCC + bVccOn = 0; + STREAM_biosLedOff(1); + } + } + else + { + over_current_count = 0; + } + } + else + { + over_current_count = 0; + } + return 0; +} + +// ----------------------------------------------------------------------------- +#pragma vector=TIMERA0_VECTOR +__interrupt void TA_CCR0_ISR (void) +{ + static unsigned char cnt = 0; + + short x; + cnt++; + if(cnt == 10) + { + cnt = 0; // reset pulse counter + TACTL = 0; // stop Timer A + x = _hilGeneric_ConvertAD_(VFCHN); + if(x < 0xFFF) // 12-bit A/D thus value must exceed maximum measureable value (+-6.6V) + { + TACTL = (TASSEL_1 + TACLR + MC_1); // start Timer A again and produce pulses + } + else + { + VFSettleFlag = 0; // send message to main program + } + } +} + diff --git a/Bios/src/hil/uifv1/hil_2w.c b/Bios/src/hil/uifv1/hil_2w.c index 8c933a6..7b1f806 100644 --- a/Bios/src/hil/uifv1/hil_2w.c +++ b/Bios/src/hil/uifv1/hil_2w.c @@ -7,35 +7,35 @@ * */ /* - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -53,25 +53,26 @@ #define CLEAR_INSTR 0 #define EXEC_FUSE_BLOW 1 -const unsigned char DMA_TMSH_TDIH[] = {/*TMS Slot*/ PIN_TDI|PIN_TCK, PIN_TDI, PIN_TDI|PIN_TCK, +const unsigned char DMA_TMSH_TDIH[] = {/*TMS Slot*/ PIN_TDI|PIN_TCK, PIN_TDI, PIN_TDI|PIN_TCK, /*TDI Slot*/ PIN_TDI|PIN_TCK, PIN_TDI, PIN_TDI|PIN_TCK}; -const unsigned char DMA_TMSH_TDIL[] = {/*TMS Slot*/ PIN_TDI|PIN_TCK, PIN_TDI, PIN_TDI|PIN_TCK, +const unsigned char DMA_TMSH_TDIL[] = {/*TMS Slot*/ PIN_TDI|PIN_TCK, PIN_TDI, PIN_TDI|PIN_TCK, /*TDI Slot*/ PIN_TCK, 0, PIN_TCK}; -const unsigned char DMA_TMSL_TDIH[] = {/*TMS Slot*/ PIN_TCK, 0, PIN_TCK, +const unsigned char DMA_TMSL_TDIH[] = {/*TMS Slot*/ PIN_TCK, 0, PIN_TCK, /*TDI SLot*/ PIN_TDI|PIN_TCK, PIN_TDI, PIN_TDI|PIN_TCK}; -const unsigned char DMA_TMSL_TDIL[] = {/*TMS Slot*/ PIN_TCK, 0, PIN_TCK, +const unsigned char DMA_TMSL_TDIL[] = {/*TMS Slot*/ PIN_TCK, 0, PIN_TCK, /*TDI Slot*/ PIN_TCK, 0, PIN_TCK}; -VAR_AT(unsigned char TCLK_saved, HAL_ADDR_VAR_TCLK_SAVED); -VAR_AT(unsigned char current_Instr, HAL_ADDR_CURRENT_INSTR); +unsigned char TCLK_saved; +unsigned char current_Instr; // defined in hil.c extern unsigned char *tstctrl_port_; extern unsigned char entdi2tdo_; extern void SetVpp(long voltage); +unsigned char prevInstruction; INLINE(forced) void DMA1sbw(void) @@ -89,19 +90,24 @@ void DMA2sbw(void) TDOsbw } +unsigned char _hil_2w_GetPrevInstruction() +{ + return prevInstruction; +} + INLINE(forced) void restoreTCLK(void) { if (TCLK_saved & sbwdato) { - DMA1SA = (unsigned short)DMA_TMSH_TDIH; + DMA1SA = (unsigned short)DMA_TMSH_TDIH; DMA1sbw(); - DMA1SA = (unsigned short)DMA_TMSL_TDIH; + DMA1SA = (unsigned short)DMA_TMSL_TDIH; DMA1sbw(); } else { - DMA1SA = (unsigned short)DMA_TMSH_TDIL; + DMA1SA = (unsigned short)DMA_TMSH_TDIL; DMA1sbw(); // TMSL_TDIL is preloaded; DMA2sbw(); @@ -109,25 +115,25 @@ void restoreTCLK(void) } INLINE(forced) -unsigned long sbw_Shift(unsigned long Data, unsigned long long Bits) +unsigned long long sbw_Shift(unsigned long long Data, unsigned long long Bits) { - unsigned long TDOvalue = 0; - unsigned long long MSB; //= bit_msb_pos_array_[Bits]; + unsigned long long TDOvalue = 0; + unsigned long long MSB = 0x0000000000000000; if(Bits == 0) { - // 16 bit - MSB = 0x0000000000080000ull; + // 20 bit + MSB = 0x000080000ull; } else if(Bits == 1) { // 32 bit - MSB = 0x0000000080000000ull; + MSB = 0x80000000ull; } else { // 64 bit - MSB = 0x8000000000000000ull; + MSB = 0x8000000000000000ull; } do { @@ -135,11 +141,11 @@ unsigned long sbw_Shift(unsigned long Data, unsigned long long Bits) { if(Data & MSB) { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1CTL |= DMAEN; DMA1CTL |= DMAREQ; // DMA1 FIRE!!! @@ -171,7 +177,7 @@ unsigned long sbw_Shift(unsigned long Data, unsigned long long Bits) INLINE(forced) unsigned short sbw_Shift16(unsigned short Data) { - unsigned short TDOvalue ; + unsigned short TDOvalue = 0; unsigned short MSB = 0x8000; do @@ -180,11 +186,11 @@ unsigned short sbw_Shift16(unsigned short Data) { if(Data & MSB) { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1CTL |= DMAEN; DMA1CTL |= DMAREQ; // DMA1 FIRE!!! @@ -216,7 +222,7 @@ unsigned short sbw_Shift16(unsigned short Data) INLINE(forced) unsigned char sbw_Shift8(unsigned char Data) { - unsigned char TDOvalue; + unsigned char TDOvalue = 0; unsigned char MSB = 0x80; do @@ -225,11 +231,11 @@ unsigned char sbw_Shift8(unsigned char Data) { if(Data & MSB) { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1CTL |= DMAEN; DMA1CTL |= DMAREQ; // DMA1 FIRE!!! @@ -252,7 +258,7 @@ unsigned char sbw_Shift8(unsigned char Data) TDO_RD } while(MSB >>= 1); - + // after the execute fuse blow instruction is shifted into the target, the SBWTDIO // pin must be low until Vpp is settled and a high transition of SBWTDIO burns the fuse if (current_Instr == EXEC_FUSE_BLOW) @@ -270,15 +276,15 @@ unsigned char sbw_Shift8(unsigned char Data) short _hil_2w_TapReset(void) { unsigned short i; - - DMA1SA = (unsigned short)DMA_TMSH_TDIH; + + DMA1SA = (unsigned short)DMA_TMSH_TDIH; // Reset JTAG FSM for (i = 0; i < 6; i++) // 6 is nominal { // TMSH_TDIH is preloaded DMA1sbw(); } - DMA1SA = (unsigned short)DMA_TMSL_TDIH; + DMA1SA = (unsigned short)DMA_TMSL_TDIH; DMA1sbw(); return 0; } @@ -287,10 +293,10 @@ short _hil_2w_TapReset(void) short _hil_2w_CheckJtagFuse(void) { unsigned short dma2_tmp = DMA2SA; - - DMA1SA = (unsigned short)DMA_TMSH_TDIH; - DMA2SA = (unsigned short)DMA_TMSL_TDIH; - + + DMA1SA = (unsigned short)DMA_TMSH_TDIH; + DMA2SA = (unsigned short)DMA_TMSL_TDIH; + // TMSL_TDIH is preloaded // now in Run/Test Idle DMA2sbw(); // Fuse check @@ -310,41 +316,33 @@ short _hil_2w_CheckJtagFuse(void) DMA1sbw(); // TMSL_TDIH is preloaded DMA2sbw(); - + DMA2SA = dma2_tmp; return 0; } - - -unsigned short _hil_2w_EnumChain(void) -{ - return 1; // always return 1, as with Spy-Bi-Wire only one device can be handled -} - - - // ----------------------------------------------------------------------------- unsigned char _hil_2w_Instr(unsigned char Instruction) { + prevInstruction = Instruction; // JTAG FSM state = Run-Test/Idle if (TCLK_saved & sbwdato) //PrepTCLK { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; DMA1sbw(); } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; DMA1sbw(); - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } - + // JTAG FSM state = Select DR-Scan // TMSH_TDIH loaded in previous if/else DMA1sbw(); // JTAG FSM state = Select IR-Scan - DMA1SA = (unsigned int)DMA_TMSL_TDIH; + DMA1SA = (unsigned int)DMA_TMSL_TDIH; DMA1sbw(); // JTAG FSM state = Capture-IR DMA1sbw(); @@ -359,15 +357,15 @@ unsigned char _hil_2w_SetReg_XBits08(unsigned char data) // JTAG FSM state = Run-Test/Idle if (TCLK_saved & sbwdato) //PrepTCLK { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1sbw(); - - DMA1SA = (unsigned int)DMA_TMSL_TDIH; + + DMA1SA = (unsigned int)DMA_TMSL_TDIH; // JTAG FSM state = Select DR-Scan DMA1sbw(); // JTAG FSM state = Capture-DR @@ -384,15 +382,15 @@ unsigned short _hil_2w_SetReg_XBits16(unsigned short data) // JTAG FSM state = Run-Test/Idle if (TCLK_saved & sbwdato) //PrepTCLK { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1sbw(); - - DMA1SA = (unsigned int)DMA_TMSL_TDIH; + + DMA1SA = (unsigned int)DMA_TMSL_TDIH; // JTAG FSM state = Select DR-Scan DMA1sbw(); // JTAG FSM state = Capture-DR @@ -411,15 +409,15 @@ unsigned long _hil_2w_SetReg_XBits20(unsigned long data) // JTAG FSM state = Run-Test/Idle if (TCLK_saved & sbwdato) //PrepTCLK { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1sbw(); - - DMA1SA = (unsigned int)DMA_TMSL_TDIH; + + DMA1SA = (unsigned int)DMA_TMSL_TDIH; // JTAG FSM state = Select DR-Scan DMA1sbw(); // JTAG FSM state = Capture-DR @@ -439,15 +437,15 @@ unsigned long _hil_2w_SetReg_XBits32(unsigned long data) // JTAG FSM state = Run-Test/Idle if (TCLK_saved & sbwdato) //PrepTCLK { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1sbw(); - - DMA1SA = (unsigned int)DMA_TMSL_TDIH; + + DMA1SA = (unsigned int)DMA_TMSL_TDIH; // JTAG FSM state = Select DR-Scan DMA1sbw(); // JTAG FSM state = Capture-DR @@ -463,15 +461,15 @@ unsigned long long _hil_2w_SetReg_XBits64(unsigned long long data) // JTAG FSM state = Run-Test/Idle if (TCLK_saved & sbwdato) //PrepTCLK { - DMA1SA = (unsigned int)DMA_TMSH_TDIH; + DMA1SA = (unsigned int)DMA_TMSH_TDIH; } else { - DMA1SA = (unsigned int)DMA_TMSH_TDIL; + DMA1SA = (unsigned int)DMA_TMSH_TDIL; } DMA1sbw(); - - DMA1SA = (unsigned int)DMA_TMSL_TDIH; + + DMA1SA = (unsigned int)DMA_TMSL_TDIH; // JTAG FSM state = Select DR-Scan DMA1sbw(); // JTAG FSM state = Capture-DR @@ -481,7 +479,118 @@ unsigned long long _hil_2w_SetReg_XBits64(unsigned long long data) // JTAG FSM state = Run-Test/Idle } +//! \brief This function executes an SBW2 64BIT Data SHIFT (DR-SHIFT) in the case, +//! that the first 8 bits show a valid data capture from the JSTATE register. In case +//! of no valid capture the shift is ended after the first 8 bits. Timeout could be +//! used to set the function run count. +//! \param[in] Data to be shifted into target device +//! \return Value shifted out of target device JTAG module +unsigned long long _hil_2w_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion) +{ + unsigned long long TDOvalue = 0x0; + unsigned short timeout = loopCount; + unsigned char DataState = 0; + unsigned short currentDeviceState = 0; + unsigned short syncBrokenCount = loopCount%2; + + do + { + TDOvalue = (_hil_2w_SetReg_XBits64(Data)); + // Mask out all not needed bits for device state detection + currentDeviceState = ((TDOvalue >> 56) & JSTATE_FLOW_CONTROL_BITS); + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56, ] & 0x4 (BP_HIT) == TRUE + if(currentDeviceState & JSTATE_BP_HIT) + { + // reload Jstate IR + _hil_2w_Instr(IR_JSTATE_ID); + DataState = VALID_DATA; + return(TDOvalue); + } + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56] (AM Sync. ongoing) == 0x83 + else if(currentDeviceState == JSTATE_SYNC_ONGOING) + { + DataState = SYNC_ONGOING; + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] & 0x40 (Locked State) == 0x40 + else if((currentDeviceState & JSTATE_LOCKED_STATE) == JSTATE_LOCKED_STATE && + (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE) + { + DataState = JTAG_LOCKED; + return(TDOvalue); + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] ( Invalid LPM) == 0x81) + else if(currentDeviceState == JSTATE_INVALID_STATE) + { + // reload Jstate IR + _hil_2w_Instr(IR_JSTATE_ID); + DataState = INVALID_DATA; + } + /*PG2.0 && PG2.1 frozen Sync detection*/ + else if (((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK_PGACT) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_PGACT)) + { + if(syncBrokenCount > 0 && JStateVersion >= 0x21) + + { // Only working for PG2.1, do not harm if executed on PG2.0 – but will not create any effect only consume time + unsigned long current3VtestReg = 0; + + // read current 3VtestReg value + _hil_2w_Instr(IR_TEST_REG); + current3VtestReg = _hil_2w_SetReg_XBits32(0); + // set bit 25 high to rest sync + current3VtestReg |= 0x2000000; + _hil_2w_SetReg_XBits32(current3VtestReg); + // set bit 25 low reset sync done + current3VtestReg &= ~0x2000000; + _hil_2w_SetReg_XBits32(current3VtestReg); + + _hil_2w_Instr(IR_JSTATE_ID); + syncBrokenCount --; + } + else + { + DataState = VALID_DATA; + return(TDOvalue); + } + } + // device is not in LPMx or AC read out mode just restart the shift but do not reload the JState IR + else if(currentDeviceState != JSTATE_VALID_CAPTURE + && currentDeviceState != JSTATE_LPM_ONE_TWO + && currentDeviceState != JSTATE_LPM_THREE_FOUR + && (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE + && currentDeviceState != 0x00 + && currentDeviceState != 0x02) + { + DataState = INVALID_DATA; + } + else + { + DataState = VALID_DATA; + } + + if(!timeout) + { + return TDOvalue; + } + timeout--; + } + while(DataState == INVALID_DATA || DataState == SYNC_ONGOING); + if( currentDeviceState == JSTATE_LPM_ONE_TWO + || currentDeviceState == JSTATE_LPM_THREE_FOUR + || currentDeviceState == 0x00 + || currentDeviceState == 0x02) + { + // reload Jstate IR + _hil_2w_Instr(IR_JSTATE_ID); + } + return(TDOvalue); +} // ----------------------------------------------------------------------------- void _hil_2w_Tclk(unsigned char state) @@ -493,9 +602,9 @@ void _hil_2w_Tclk(unsigned char state) } else { - TMSL + TMSL } - + if(state) { JTAGOUT |= sbwdato; @@ -511,16 +620,42 @@ void _hil_2w_Tclk(unsigned char state) // __enable_interrupt() are called in TDOsbw } +void _hil_2w_StepPsa_Xv2(unsigned long length) +{ + unsigned short dma2_tmp = DMA2SA; + + DMA1SA = (unsigned short)DMA_TMSH_TDIL; + DMA2SA = (unsigned short)DMA_TMSL_TDIL; + while(length--) + { + TCLKset0 + // TMSH_TDIL preloaded + DMA1sbw(); + // TMSL_TDIL preloaded + DMA2sbw(); + // TMSL_TDIL preloaded + DMA2sbw(); + // TMSH_TDIL preloaded + DMA1sbw(); + // TMSH_TDIL preloaded + DMA1sbw(); + // TMSL_TDIL preloaded + DMA2sbw(); + TCLKset1 + } + // Restore the prvious DMA2SA value + DMA2SA = dma2_tmp; +} // ----------------------------------------------------------------------------- void _hil_2w_StepPsa(unsigned long length) { unsigned short dma2_tmp = DMA2SA; - - DMA1SA = (unsigned short)DMA_TMSH_TDIL; + + DMA1SA = (unsigned short)DMA_TMSH_TDIL; DMA2SA = (unsigned short)DMA_TMSL_TDIL; - + while(length--) { TCLKset1 @@ -546,13 +681,14 @@ void _hil_2w_StepPsa(unsigned long length) void _hil_2w_StepPsaTclkHigh(unsigned long length) { unsigned short dma2_tmp = DMA2SA; - - DMA1SA = (unsigned short)DMA_TMSH_TDIH; + + DMA1SA = (unsigned short)DMA_TMSH_TDIH; DMA2SA = (unsigned short)DMA_TMSL_TDIH; - + while(length--) { TCLKset1 + TCLKset0 // TMSH_TDIH preloaded DMA1sbw(); // TMSL_TDIH preloaded @@ -565,40 +701,41 @@ void _hil_2w_StepPsaTclkHigh(unsigned long length) DMA1sbw(); // TMSL_TDIH preloaded DMA2sbw(); - TCLKset0 + } // Restore the prvious DMA2SA value DMA2SA = dma2_tmp; + TCLKset1 } // ----------------------------------------------------------------------------- short _hil_2w_BlowFuse(unsigned char targetHasTestVpp) { /// \ref SLAU320A July 2010 - Revised November 2010 - - EDT_Instr(IR_PREPARE_BLOW); // initialize fuse blowing - EDT_Delay_1ms(1); - + + prepare_blow(); // initialize fuse blowing + IHIL_Delay_1ms(1); + // set current instruction to ensure that the SBWTDIO pin does not go high after // the instruction is shifted into the target current_Instr = EXEC_FUSE_BLOW; - EDT_Instr(IR_EX_BLOW); // send fuse blow instruction - - // After the IR_EX_BLOW instruction is shifted in via SBW, one more TMS_SLOT must be performed + ex_blow(); // send fuse blow instruction + + // After the IR_EX_BLOW instruction is shifted in via SBW, one more TMS_SLOT must be performed TMSL - - // apply fuse blow voltage + + // apply fuse blow voltage SetVpp(1); // Taking SBWTDIO high as soon as VPP has been settled blows the fuse JTAGOUT |= sbwdato; - EDT_Delay_1ms(3); + IHIL_Delay_1ms(3); SetVpp(0); // now perform a BOR via JTAG - we loose control of the device then... - EDT_Instr(IR_TEST_REG); - EDT_SetReg_XBits32(0x00000200); - + test_reg(); + SetReg_32Bits(0x00000200); + return 0; } diff --git a/Bios/src/hil/uifv1/hil_4w.c b/Bios/src/hil/uifv1/hil_4w.c index 0a3bdeb..2408cbd 100644 --- a/Bios/src/hil/uifv1/hil_4w.c +++ b/Bios/src/hil/uifv1/hil_4w.c @@ -8,35 +8,35 @@ */ /* * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @@ -50,8 +50,6 @@ #define PIN_TDO BIT2 #define PIN_TCK BIT3 - -//CONST_AT( struct jtag _Jtag, HAL_ADDR_CONST_JTAG) = { const struct jtag _Jtag = { (unsigned char)0x08, // TCK, P5.3 (out) (high) (unsigned char)0x01, // TMS, P5.0 (out) (high) @@ -61,6 +59,8 @@ const struct jtag _Jtag = { (unsigned char*)&P5OUT }; +unsigned char prev4wInstruction; + const unsigned char JTAG_ENTRY_IR0[] = { (PIN_TMS),(PIN_TMS|PIN_TCK),(PIN_TMS),(PIN_TMS|PIN_TCK),0,(PIN_TCK),0,(PIN_TCK) }; @@ -80,16 +80,22 @@ const unsigned char JTAG_IDLE1[] = { (PIN_TDI|PIN_TMS),(PIN_TDI|PIN_TMS|PIN_TCK),(PIN_TDI),(PIN_TDI|PIN_TCK) }; +unsigned char _hil_4w_GetPrevInstruction() +{ + return prev4wInstruction; +} + + // ----------------------------------------------------------------------------- short _hil_4w_CheckJtagFuse(void) { // perform a JTAG fuse check TMSset1; TMSset0; - EDT_Delay_1us(5); + IHIL_Delay_1us(5); TMSset1; TMSset0; - EDT_Delay_1us(5); + IHIL_Delay_1us(5); TMSset1; return 0; } @@ -143,30 +149,30 @@ unsigned short _hil_4w_EnumChain(void) unsigned char i = 0; unsigned char detIdCode = 0; unsigned short numOfDevices = 0; - + _hil_4w_TapReset(); - + // JTAG FSM state = Run-Test/Idle TMSset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); // JTAG FSM state = Select DR-Scan TMSset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); // JTAG FSM state = Capture-DR TCKset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); // JTAG FSM state = Shift-IR - + while(1) { if((DataIn & LSB) == 0) @@ -179,7 +185,7 @@ unsigned short _hil_4w_EnumChain(void) } DataIn >>= 1; TCKset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset1; TDOval >>= 1; // TDO could be any port pin if (ScanTDO()) @@ -195,7 +201,7 @@ unsigned short _hil_4w_EnumChain(void) { numOfDevices++; } - + i += detIdCode; if(32 == i) { @@ -204,7 +210,7 @@ unsigned short _hil_4w_EnumChain(void) if(Invalid_Manufactor_IdCode == (TDOval & Mask_Manufactor_IdCode)) { // End of chain detected - break; + break; } // Device with valid IdCode detected numOfDevices++; @@ -216,28 +222,28 @@ unsigned short _hil_4w_EnumChain(void) numOfDevices = 0; break; } - } - + } + TMSset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset0; - EDT_Delay_1us(10); - TCKset1; + IHIL_Delay_1us(10); + TCKset1; // JTAG FSM = Exit-DR TCKset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); // JTAG FSM = Update-DR TMSset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset0; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); TCKset1; - EDT_Delay_1us(10); + IHIL_Delay_1us(10); // JTAG FSM = Run-Test/Idle TMSset1; // to save power during debugging - EDT_Delay_1us(10); + IHIL_Delay_1us(10); return numOfDevices; } @@ -246,8 +252,8 @@ unsigned short _hil_4w_EnumChain(void) // ----------------------------------------------------------------------------- unsigned char _hil_4w_Instr(unsigned char Instruction) { - unsigned char TDOvalue; - + unsigned char TDOvalue = 0; + prev4wInstruction = Instruction; // DMA application DMA1SZ = 8; // load DMA1 with size if(StoreTTDI() & _Jtag.TDI) @@ -264,7 +270,7 @@ unsigned char _hil_4w_Instr(unsigned char Instruction) DMA2CTL |= DMAEN; // enable DMA2 DMA1CTL |= DMAREQ; // DMA1 FIRE!!! // JTAG FSM state = Shift-IR - P5SEL |= 0x0E; // enablespi + P5SEL |= 0x0E; // enablespi UCTL1 &= ~CHAR; U1TXBUF = Instruction; //Dataloadspi 8 while(!(UTCTL1 & TXEPT)); @@ -283,15 +289,15 @@ unsigned char _hil_4w_Instr(unsigned char Instruction) TDOvalue |= ScanTDO(); // common exit DMA2CTL |= DMAREQ; // DMA2 FIRE!!! - + // JTAG FSM = Run-Test/Idle return TDOvalue; } unsigned char _hil_4w_SetReg_XBits08(unsigned char Data) { - unsigned char TDOvalue; - + unsigned char TDOvalue = 0; + DMA1SZ = 6; if(StoreTTDI() & _Jtag.TDI) { @@ -307,7 +313,7 @@ unsigned char _hil_4w_SetReg_XBits08(unsigned char Data) DMA2CTL |= DMAEN; DMA1CTL |= DMAREQ; // JTAG FSM state = Shift-DR - P5SEL |= 0x0E; // enablespi + P5SEL |= 0x0E; // enablespi UCTL1 &= ~CHAR; U1TXBUF = Data; //Dataloadspi 8 while(!(UTCTL1 & TXEPT)); @@ -333,7 +339,7 @@ unsigned short _hil_4w_SetReg_XBits16(unsigned short Data) unsigned short TDOvalue = 0; unsigned char *outptr = (unsigned char*)&Data; unsigned char *inptr = (unsigned char*)&TDOvalue; - + DMA1SZ = 6; if(StoreTTDI() & _Jtag.TDI) { @@ -349,7 +355,7 @@ unsigned short _hil_4w_SetReg_XBits16(unsigned short Data) DMA2CTL |= DMAEN; DMA1CTL |= DMAREQ; // JTAG FSM state = Shift-DR - P5SEL |= 0x0E; // enablespi + P5SEL |= 0x0E; // enablespi UCTL1 |= CHAR; U1TXBUF = *(outptr + 1); while(!(UTCTL1 & TXEPT)); @@ -379,7 +385,7 @@ unsigned long _hil_4w_SetReg_XBits20(unsigned long Data) unsigned long TDOvalue = 0; unsigned char *outptr = (unsigned char*)&Data; unsigned char *inptr = (unsigned char*)&TDOvalue; - + DMA1SZ = 6; if(StoreTTDI() & _Jtag.TDI) { @@ -399,13 +405,13 @@ unsigned long _hil_4w_SetReg_XBits20(unsigned long Data) { TDIset1 } - else + else { TDIset0 } TCKset0 TCKset1 *(inptr+2) |= ScanTDO(); - + if(*(outptr+2) & 0x04) { TDIset1 @@ -417,7 +423,7 @@ unsigned long _hil_4w_SetReg_XBits20(unsigned long Data) TCKset0 TCKset1 *(inptr+2) <<= 1; *(inptr+2) |= ScanTDO(); - + if(*(outptr+2) & 0x02) { TDIset1 @@ -429,7 +435,7 @@ unsigned long _hil_4w_SetReg_XBits20(unsigned long Data) TCKset0 TCKset1 *(inptr+2) <<= 1; *(inptr+2) |= ScanTDO(); - + if(*(outptr+2) & 0x01) { TDIset1 @@ -441,16 +447,19 @@ unsigned long _hil_4w_SetReg_XBits20(unsigned long Data) TCKset0 TCKset1 *(inptr+2) <<= 1; *(inptr+2) |= ScanTDO(); - - P5SEL |= 0x0E; // enablespi + + P5SEL |= 0x0E; // enablespi UCTL1 |= CHAR; + U1TXBUF = *(outptr + 1); while(!(UTCTL1 & TXEPT)); *(inptr + 1) = U1RXBUF; + UCTL1 &= ~CHAR; U1TXBUF = *outptr; //Dataloadspi 8 while(!(UTCTL1 & TXEPT)); *inptr = U1RXBUF << 1; + P5SEL &= ~0x0E; // disable spi if(Data & 0x1) { @@ -476,7 +485,7 @@ unsigned long _hil_4w_SetReg_XBits32(unsigned long Data) unsigned long TDOvalue = 0; unsigned char *outptr = (unsigned char*)&Data; unsigned char *inptr = (unsigned char*)&TDOvalue; - + DMA1SZ = 6; if(StoreTTDI() & _Jtag.TDI) { @@ -491,9 +500,9 @@ unsigned long _hil_4w_SetReg_XBits32(unsigned long Data) DMA1CTL |= DMAEN; DMA2CTL |= DMAEN; DMA1CTL |= DMAREQ; - + // JTAG FSM state = Shift-DR - P5SEL |= 0x0E; // enablespi + P5SEL |= 0x0E; // enablespi UCTL1 |= CHAR; U1TXBUF = *(outptr + 3); while(!(UTCTL1 & TXEPT)); @@ -505,7 +514,7 @@ unsigned long _hil_4w_SetReg_XBits32(unsigned long Data) while(!(UTCTL1 & TXEPT)); *(inptr + 1) = U1RXBUF; UCTL1 &= ~CHAR; - U1TXBUF = *outptr; + U1TXBUF = *outptr; while(!(UTCTL1 & TXEPT)); *inptr = U1RXBUF << 1; P5SEL &= ~0x0E; // disable spi @@ -526,7 +535,7 @@ unsigned long long _hil_4w_SetReg_XBits64(unsigned long long Data) unsigned long long TDOvalue = 0; unsigned char *outptr = (unsigned char*)&Data; unsigned char *inptr = (unsigned char*)&TDOvalue; - + DMA1SZ = 6; if(StoreTTDI() & _Jtag.TDI) { @@ -541,44 +550,44 @@ unsigned long long _hil_4w_SetReg_XBits64(unsigned long long Data) DMA1CTL |= DMAEN; DMA2CTL |= DMAEN; DMA1CTL |= DMAREQ; - + // JTAG FSM state = Shift-DR - P5SEL |= 0x0E; // enablespi + P5SEL |= 0x0E; // enablespi UCTL1 |= CHAR; - + U1TXBUF = *(outptr + 7); while(!(UTCTL1 & TXEPT)); *(inptr + 7) = U1RXBUF; - + U1TXBUF = *(outptr + 6); while(!(UTCTL1 & TXEPT)); *(inptr + 6) = U1RXBUF; - + U1TXBUF = *(outptr + 5); while(!(UTCTL1 & TXEPT)); *(inptr + 5) = U1RXBUF; - + U1TXBUF = *(outptr + 4); while(!(UTCTL1 & TXEPT)); *(inptr + 4) = U1RXBUF; - + U1TXBUF = *(outptr + 3); while(!(UTCTL1 & TXEPT)); *(inptr + 3) = U1RXBUF; - + U1TXBUF = *(outptr + 2); while(!(UTCTL1 & TXEPT)); *(inptr + 2) = U1RXBUF; - + U1TXBUF = *(outptr + 1); while(!(UTCTL1 & TXEPT)); *(inptr + 1) = U1RXBUF; - + UCTL1 &= ~CHAR; - U1TXBUF = *outptr; + U1TXBUF = *outptr; while(!(UTCTL1 & TXEPT)); *inptr = U1RXBUF << 1; - + P5SEL &= ~0x0E; // disable spi if(Data & 0x1) TDIset1TMSset1 @@ -591,6 +600,120 @@ unsigned long long _hil_4w_SetReg_XBits64(unsigned long long Data) DMA2CTL |= DMAREQ; return TDOvalue; } + +//! \brief This function executes an SBW2 64BIT Data SHIFT (DR-SHIFT) in the case, +//! that the first 8 bits show a valid data capture from the JSTATE register. In case +//! of no valid capture the shift is ended after the first 8 bits. Timeout could be +//! used to set the function run count. +//! \param[in] Data to be shifted into target device +//! \return Value shifted out of target device JTAG module +unsigned long long _hil_4w_SetReg_XBits8_64(unsigned long long Data, unsigned short loopCount, unsigned short JStateVersion) +{ + unsigned long long TDOvalue = 0x0; + unsigned short timeout = loopCount; + unsigned char DataState = 0; + unsigned short currentDeviceState = 0; + unsigned short syncBrokenCount = loopCount%2; + + do + { + TDOvalue = (_hil_4w_SetReg_XBits64(Data)); + // Mask out all not needed bits for device state detection + currentDeviceState = ((TDOvalue >> 56) & JSTATE_FLOW_CONTROL_BITS); + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56, ] & 0x4 (BP_HIT) == TRUE + if(currentDeviceState & JSTATE_BP_HIT) + { + // reload Jstate IR + _hil_4w_Instr(IR_JSTATE_ID); + DataState = VALID_DATA; + return(TDOvalue); + } + + // check, if BIT[63, 62, 61, 60, 59 58, 57, 56] (AM Sync. ongoing) == 0x83 + else if(currentDeviceState == JSTATE_SYNC_ONGOING) + { + DataState = SYNC_ONGOING; + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] & 0x40 (Locked State) == 0x40 + else if((currentDeviceState & JSTATE_LOCKED_STATE) == JSTATE_LOCKED_STATE && + (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE) + { + DataState = JTAG_LOCKED; + return(TDOvalue); + } + + //check, if BIT[63, 62, 61, 60, 59 58, 57, 56] ( Invalid LPM) == 0x81) + else if(currentDeviceState == JSTATE_INVALID_STATE) + { + // reload Jstate IR + _hil_4w_Instr(IR_JSTATE_ID); + DataState = INVALID_DATA; + } + /*PG2.0 && PG2.1 frozen Sync detection*/ + else if (((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_MCLK_PGACT) + ||((currentDeviceState & JSTATE_SYNC_BROKEN_MASK) == JSTATE_SYNC_BROKEN_PGACT)) + { + if(syncBrokenCount > 0 && JStateVersion >= 0x21) + + { // Only working for PG2.1, do not harm if executed on PG2.0 – but will not create any effect only consume time + unsigned long current3VtestReg = 0; + + // read current 3VtestReg value + _hil_4w_Instr(IR_TEST_REG); + current3VtestReg = _hil_4w_SetReg_XBits32(0); + // set bit 25 high to rest sync + current3VtestReg |= 0x2000000; + _hil_4w_SetReg_XBits32(current3VtestReg); + // set bit 25 low reset sync done + current3VtestReg &= ~0x2000000; + _hil_4w_SetReg_XBits32(current3VtestReg); + + _hil_4w_Instr(IR_JSTATE_ID); + syncBrokenCount --; + } + else + { + DataState = VALID_DATA; + return(TDOvalue); + } + } + // device is not in LPMx or AC read out mode just restart the shift but do not reload the JState IR + else if(currentDeviceState != JSTATE_VALID_CAPTURE + && currentDeviceState != JSTATE_LPM_ONE_TWO + && currentDeviceState != JSTATE_LPM_THREE_FOUR + && (currentDeviceState & JSTATE_LPM_X_FIVE) != JSTATE_LPM_X_FIVE + && currentDeviceState != 0x00 + && currentDeviceState != 0x02) + { + DataState = INVALID_DATA; + } + else + { + DataState = VALID_DATA; + } + + if(!timeout) + { + return TDOvalue; + } + timeout--; + } + while(DataState == INVALID_DATA || DataState == SYNC_ONGOING); + + if( currentDeviceState == JSTATE_LPM_ONE_TWO + || currentDeviceState == JSTATE_LPM_THREE_FOUR + || currentDeviceState == 0x00 + || currentDeviceState == 0x02) + { + // reload Jstate IR + _hil_4w_Instr(IR_JSTATE_ID); + } + return(TDOvalue); +} + // ----------------------------------------------------------------------------- void _hil_4w_Tclk(unsigned char state) { @@ -617,16 +740,16 @@ void _hil_4w_StepPsa(unsigned long length) TCKset1 _NOP(); // select DR scan TCKset0 _NOP(); TMSset0 _NOP(); - + TCKset1 _NOP(); // capture DR TCKset0 _NOP(); TCKset1 _NOP(); // shift DR TCKset0 _NOP(); - + TMSset1 _NOP(); TCKset1 _NOP();// exit DR TCKset0 _NOP(); - + // Set JTAG FSM back into Run-Test/Idle TCKset1 _NOP(); TMSset0 _NOP(); @@ -647,16 +770,16 @@ void _hil_4w_StepPsaTclkHigh(unsigned long length) TCKset1 _NOP();// select DR scan TCKset0 _NOP(); TMSset0 _NOP(); - + TCKset1 _NOP();// capture DR TCKset0 _NOP(); TCKset1 _NOP();// shift DR TCKset0 _NOP(); - + TMSset1 _NOP(); TCKset1 _NOP(); // exit DR TCKset0 _NOP(); - + // Set JTAG FSM back into Run-Test/Idle TCKset1 _NOP(); TMSset0 _NOP(); @@ -671,26 +794,26 @@ void _hil_4w_StepPsaTclkHigh(unsigned long length) // ----------------------------------------------------------------------------- short _hil_4w_BlowFuse(unsigned char targetHasTestVpp) { - if(!targetHasTestVpp) + if(!targetHasTestVpp) { - cntrl_sig_16bit; - SetReg_16Bits_(0x7401); // TDOs get TDI functionality (internal) + cntrl_sig_16bit(); + SetReg_16Bits(0x7401); // TDOs get TDI functionality (internal) testVpp(0); // Switchs also TDO functionality to TDI. } - EDT_Instr(IR_PREPARE_BLOW); // initialize fuse blowing - EDT_Delay_1ms(1); - + prepare_blow(); // initialize fuse blowing + IHIL_Delay_1ms(1); + SetVpp(1); - EDT_Instr(IR_EX_BLOW); // execute fuse blowing - EDT_Delay_1ms(1); + ex_blow(); // execute fuse blowing + IHIL_Delay_1ms(1); SetVpp(0); // switch VPP off - + testVpp(1); // Restore the normal function of TDO and TDI (within the interface). // now perform a BOR via JTAG - we loose control of the device then... - EDT_Instr(IR_TEST_REG); - EDT_SetReg_XBits32(0x00000200); - + test_reg(); + SetReg_32Bits(0x00000200); + return 0; } /* EOF */ diff --git a/Bios/src/hil/uifv1/hil_4w_432.c b/Bios/src/hil/uifv1/hil_4w_432.c new file mode 100644 index 0000000..52abaaf --- /dev/null +++ b/Bios/src/hil/uifv1/hil_4w_432.c @@ -0,0 +1,499 @@ +/* + * hil_4w_432.c + * + * Copyright (C) 2013 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. + */ + +//! \ingroup MODULHIL +//! \file hil_4w_432.c +//! \brief +//! + +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "arch.h" +#include "edt.h" +#include + +static struct jtag _Jtag = {0}; + +// 4-wire JTAG: low level signal access + +void TMSset1() +{ (*_Jtag.Out) |= _Jtag.TMS;} + +void TMSset0() +{ (*_Jtag.Out) &= ~_Jtag.TMS;} + +void TDIset1() +{ (*_Jtag.Out) |= _Jtag.TDI;} + +void TDIset0() +{ (*_Jtag.Out) &= ~_Jtag.TDI;} + +void TCKset1() +{ (*_Jtag.Out) |= _Jtag.TCK;} + +void TCKset0() +{ (*_Jtag.Out) &= ~_Jtag.TCK;} + +void TDIset1TMSset1() +{ (*_Jtag.Out) |= _Jtag.TDI | _Jtag.TMS; } + +void TDIset0TMSset1() +{ (*_Jtag.Out) &= ~_Jtag.TDI; *_Jtag.Out |= _Jtag.TMS;} + +// Array to store JTAG tap IR entry sequence for DMA +unsigned short JTAG_ENTRY_IR[4] = {0}; + +//Array to store JTAG tap DR entry sequence for DMA +unsigned short JTAG_ENTRY_DR[3] = {0}; + +//Array to store JTAG tap IR/DR shift exit sequence for DMA +unsigned short JTAG_IDLE[2] = {0}; + +//Array to strobe TDI set 1 for DMA exectuion - TCK included +unsigned short TDI_1[2] = {0}; + +//Array to strobe TDI set 0 for DMA exectuion - TCK included +unsigned short TDI_0[1] = {0}; + +//lookup table to reverse 8 bit values +static const unsigned char table_8bits[] = +{ + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, + }; +#pragma inline=forced +unsigned char reverse_byte(unsigned char x) +{ + return table_8bits[x]; +} + +#pragma inline=forced +unsigned char ScanTDO() +{ + if((*_Jtag.In & _Jtag.TDO) != 0) + { + return 1; + } + else + { + return 0; + } +} + +void hil_4w_432_InitJtag(struct jtag tmp) +{ + _Jtag = tmp; + + // Load DR JTAG tap IR entry sequence for DMA into Array + // The comment out code shows which signal is set low + JTAG_ENTRY_IR[0] = (_Jtag.TMS ); //~_Jtag.TCK + JTAG_ENTRY_IR[0] |= (_Jtag.TMS | _Jtag.TCK)<<8; + JTAG_ENTRY_IR[1] = (_Jtag.TMS ); //~_Jtag.TCK + JTAG_ENTRY_IR[1] |= (_Jtag.TMS | _Jtag.TCK)<<8; + JTAG_ENTRY_IR[2] = 0; //~_Jtag.TMS | ~_Jtag.TCK + JTAG_ENTRY_IR[2] |= (_Jtag.TCK)<<8;//~_Jtag.TMS + JTAG_ENTRY_IR[3] = 0; //~_Jtag.TMS | ~_Jtag.TCK + JTAG_ENTRY_IR[3] |= (_Jtag.TCK)<<8;//~_Jtag.TMS + + // Load DR JTAG tap DR entry sequence for DMA into Array + // The comment out code shows which signal is set low + JTAG_ENTRY_DR[0] = (_Jtag.TMS ); //~_Jtag.TCK + JTAG_ENTRY_DR[0] |= (_Jtag.TMS | _Jtag.TCK)<<8; + JTAG_ENTRY_DR[1] = 0;//~_Jtag.TMS | ~_Jtag.TCK + JTAG_ENTRY_DR[1] |= (_Jtag.TCK)<<8;//~_Jtag.TMS + JTAG_ENTRY_DR[2] = 0;//~_Jtag.TMS | ~_Jtag.TCK + JTAG_ENTRY_DR[2] |= (_Jtag.TCK)<<8;//~_Jtag.TMS + + + // Load JTAG tap IR/DR shift exit sequence for DMA into Array + // The comment out code shows which signal is set low + JTAG_IDLE[0] = (_Jtag.TMS ); //~_Jtag.TCK + JTAG_IDLE[0] |= (_Jtag.TMS | _Jtag.TCK)<<8; + JTAG_IDLE[1] = 0;//~_Jtag.TMS | ~_Jtag.TCK + JTAG_IDLE[1] |= (_Jtag.TCK)<<8;//~_Jtag.TMS + + // Load TDI set 1 for DMA - TDI must be high before TCK goes HIGH + TDI_1[0] = 0; + TDI_1[0] |= _Jtag.TDI<<8; + TDI_1[1] = ( _Jtag.TDI | _Jtag.TCK); + TDI_1[1] |= ( _Jtag.TDI | _Jtag.TCK) << 8; + + // Load TDI set 0 for DMA + TDI_0[0] = 0; + TDI_0[0] |= (_Jtag.TCK) << 8; +} + +//The hil_4w_432_Seq() function can apply a various sequence on TCK and TMS. +//It is used to apply the ARM JTAG entry sequence +void hil_4w_432_Seq(unsigned short length, unsigned char *sequence) +{ + unsigned char dataptr = 0; + unsigned short n = 0; + while (length--) + { + if (n == 0) + { + dataptr = *sequence++; + n = 8; + } + if (dataptr & 1) + { + (*_Jtag.Out) |= _Jtag.TMS; + TCKset0(); + _NOP(); + TCKset1(); + } + else + { + (*_Jtag.Out) &= ~_Jtag.TMS; + TCKset0(); + _NOP(); + TCKset1(); + } + dataptr >>= 1; + n--; + } +} + +// ----------------------------------------------------------------------------- +short hil_4w_432_TapReset(void) +{ + // Reset TAP Controller State Machine + // Set default state for JTAG signals (TDI = TMS = TCK = 1) + TDIset1(); + TMSset1(); + TCKset1(); + // Clock TCK six (6) times + TCKset0(); + TCKset1(); + TCKset0(); + TCKset1(); + TCKset0(); + TCKset1(); + TCKset0(); + TCKset1(); + TCKset0(); + TCKset1(); + TCKset0(); + TCKset1(); + // TAP Controller State Machine is now in "Test-Logic Reset" state + // Clock TCK one more time with TMS = 0 + TMSset0(); + TCKset0(); + TCKset1(); + return 0; +} + +/* +The hil_4w_432_Instr_4 function executes a 4 bit ARM IR shift +It uses the DMA to enter the tap “Shift IR” state. Also the shift itself is done my using 2 DMA channels. +In the end the DMA is use to enter the tap “Run test idle” state +*/ +unsigned char hil_4w_432_Instr_4(unsigned char Instruction) +{ + unsigned char TDOvalue = 0x00; + volatile unsigned char count = 0; + + DMA1SZ = 8; + DMA1SA = (unsigned short)JTAG_ENTRY_IR; + + // Fire DMA enter Shift-IR + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; + + //configre DMA to shit in the IR + DMA1SZ = 3; + DMA2SZ = 2; + DMA1SA = (unsigned short)TDI_1; + DMA2SA = (unsigned short)TDI_0; + + for(count = 0; count < 3; ++count) + { + if(Instruction & (1 << count)) + { + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; + } + else + { + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; + } + TDOvalue |= (((unsigned char)ScanTDO()) << count); + } + + if(Instruction & 0x8) + { + TDIset1(); + } + else + { + TDIset0(); + } + TMSset1(); + TCKset0(); + TCKset1(); // Exit1-IR + + TDOvalue |= (((unsigned char)ScanTDO()) << count); + + // common exit to Run-Test/Idle + DMA2SZ = 4; + DMA2SA = (unsigned short)JTAG_IDLE; + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; + return TDOvalue; +} + +/* + +The hil_4w_432_SetReg_35Bits function executes a 35 bit ARM DR shift +It uses the DMA to enter the tap “Shift DR” state. The fist 32Bit data is shifted in by using the SPI module. +Therefore the Bit order has to be reversed. The last 3 bits are shifted in by bit banging. +In the end the DMA is use to enter the tap “Run test idle” state +*/ +unsigned long long hil_4w_432_SetReg_35Bits( unsigned long long *Data) +{ + unsigned long long TDOvalue = 0; + unsigned long long data_ = 0, retVal = 0; + unsigned char *outptr =(unsigned char*)&data_; + unsigned char *retValPtr = (unsigned char*)&retVal; + unsigned char *inptr = (unsigned char*)&TDOvalue; + unsigned char *DataPtr = (unsigned char*)Data; + + // reverse first 32 Bits + *(outptr+3) = reverse_byte(*(DataPtr+3)); + *(outptr+2) = reverse_byte(*(DataPtr+2)); + *(outptr+1) = reverse_byte(*(DataPtr+1)); + *(outptr+0) = reverse_byte(*(DataPtr+0)); + + //configre DMA to shit in the DR + DMA1SZ = 6; + DMA1SA = (unsigned short)JTAG_ENTRY_DR; + + // Fire DMA enter Shift-DR + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; + + P5SEL |= 0x0E; // enablespi + UCTL1 |= CHAR; + + U1TXBUF = *(outptr + 0); + while(!(UTCTL1 & TXEPT)); + *(inptr + 0) = U1RXBUF; + + U1TXBUF = *(outptr + 1); + while(!(UTCTL1 & TXEPT)); + *(inptr + 1) = U1RXBUF; + + U1TXBUF = *(outptr + 2); + while(!(UTCTL1 & TXEPT)); + *(inptr + 2) = U1RXBUF; + + U1TXBUF = *(outptr + 3); + while(!(UTCTL1 & TXEPT)); + *(inptr + 3) = U1RXBUF; + + P5SEL &= ~0x0E; // disable spi + + TCKset0(); + if(*(DataPtr+4) & 0x01) + { + TDIset1(); + } + else + { + TDIset0(); + } + TCKset1(); + *(retValPtr+4) |= ScanTDO(); + + TCKset0(); + if(*(DataPtr+4) & 0x02) + { + TDIset1(); + } + else + { + TDIset0(); + } + TCKset1(); + *(retValPtr+4) |= ScanTDO() << 1; + + TCKset0(); + TMSset1(); + if(*(DataPtr+4) & 0x04) + { + TDIset1(); + } + else + { + TDIset0(); + } + TCKset1(); + *(retValPtr+4) |= ScanTDO()<< 2; + + // common exit to Run-Test/Idle + DMA2SZ = 4; + DMA2SA = (unsigned short)JTAG_IDLE; + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; + + // reverse 32 Bits if shifted out value + *(retValPtr+0) = reverse_byte(*(inptr+0)); + *(retValPtr+1) = reverse_byte(*(inptr+1)); + *(retValPtr+2) = reverse_byte(*(inptr+2)); + *(retValPtr+3) = reverse_byte(*(inptr+3)); + return retVal; +} + + +unsigned char hil_4w_432_SetReg_XBits08(unsigned char Data) +{ + return 0; +} + +unsigned short hil_4w_432_SetReg_XBits16(unsigned short Data) +{ + return 0; +} + +/* +The hil_4w_432_SetReg_32Bits function executes a 32 bit ARM DR shift +It uses the DMA to enter the tap “Shift DR” state. The 32Bit data is shifted in by using the SPI module. +Therefore the Bit order has to be reversed. In the end the DMA is use to enter the tap “Run test idle” state +*/ +unsigned long hil_4w_432_SetReg_XBits32(unsigned long Data) +{ + unsigned long TDOvalue = 0; + unsigned long data_ = 0, retVal = 0; + unsigned char *outptr =(unsigned char*)&data_; + unsigned char *DataPtr = (unsigned char*)&Data; + unsigned char *retValPtr = (unsigned char*)&retVal; + + // reverse 32 Bit data + *(outptr+0) = reverse_byte(*(DataPtr+3)); + *(outptr+1) = reverse_byte(*(DataPtr+2)); + *(outptr+2) = reverse_byte(*(DataPtr+1)); + *(outptr+3) = reverse_byte(*(DataPtr+0)); + + unsigned char *inptr = (unsigned char*)&TDOvalue; + + //configre DMA to shit in the DR + DMA1SZ = 6; + DMA1SA = (unsigned short)JTAG_ENTRY_DR; + + DMA1CTL |= DMAEN; + DMA1CTL |= DMAREQ; + + P5SEL |= 0x0E; // enablespi + UCTL1 |= CHAR; + U1TXBUF = *(outptr + 3); + while(!(UTCTL1 & TXEPT)); + *(inptr + 3) = U1RXBUF; + U1TXBUF = *(outptr + 2); + while(!(UTCTL1 & TXEPT)); + *(inptr + 2) = U1RXBUF; + U1TXBUF = *(outptr + 1); + while(!(UTCTL1 & TXEPT)); + *(inptr + 1) = U1RXBUF; + UCTL1 &= ~CHAR; + U1TXBUF = *outptr; + while(!(UTCTL1 & TXEPT)); + *inptr = U1RXBUF << 1; + P5SEL &= ~0x0E; // disable spi + + TMSset1(); + TCKset0(); + if(Data & 0x1) + { + TDIset1(); + } + else + { + TDIset0(); + } + TCKset1(); + *inptr |= ScanTDO(); + + // common exit to Run-Test/Idle + DMA2SZ = 4; + DMA2SA = (unsigned short)JTAG_IDLE; + DMA2CTL |= DMAEN; + DMA2CTL |= DMAREQ; + // JTAG FSM = Run-Test/Idle + + *(retValPtr+3) = reverse_byte(*(inptr+0)); + *(retValPtr+2) = reverse_byte(*(inptr+1)); + *(retValPtr+1) = reverse_byte(*(inptr+2)); + *(retValPtr+0) = reverse_byte(*(inptr+3)); + return retVal; +} + +unsigned long long hil_4w_432_SetReg_XBits64(unsigned long long Data) +{ + return 0; +} + +/* EOF */ diff --git a/Bios/src/hil/uifv1/hil_Swd.c b/Bios/src/hil/uifv1/hil_Swd.c new file mode 100644 index 0000000..a6d18e1 --- /dev/null +++ b/Bios/src/hil/uifv1/hil_Swd.c @@ -0,0 +1,193 @@ +#include "hw_compiler_specific.h" +#include "HalGlobalVars.h" +#include "arch.h" +#include "edt.h" +#include + +static struct jtag _Jtag = {0}; + +#define SWD_DELAY { _NOP();} + +// DAP Transfer Response +#define DAP_TRANSFER_OK (1<<0) +#define DAP_TRANSFER_WAIT (1<<1) +#define DAP_TRANSFER_FAULT (1<<2) +#define DAP_TRANSFER_ERROR (1<<3) +#define DAP_TRANSFER_MISMATCH (1<<4) + + +//#pragma inline=forced +void SWDTCKset1() +{ (*_Jtag.Out) |= _Jtag.TCK;} + +//#pragma inline=forced +void SWDTCKset0() +{ (*_Jtag.Out) &= ~_Jtag.TCK;} + +//#pragma inline=forced +void SWDIOset1TckCycle() +{ + (*_Jtag.Out) |= _Jtag.TDI; + SWDTCKset0(); + SWD_DELAY; + SWDTCKset1(); +} + +//#pragma inline=forced +void SWDIOset0TckCycle() +{ + (*_Jtag.Out) &= ~_Jtag.TDI; + SWDTCKset0(); + SWD_DELAY; + SWDTCKset1(); +} + +//#pragma inline=forced +void SWDTckCycle() +{ + SWDTCKset0(); + SWD_DELAY; + SWDTCKset1(); + SWD_DELAY; +} +//#pragma inline=forced +void SWDIOwriteBit(unsigned char bit) +{ + if(bit & 0x1) + { + (*_Jtag.Out) |= _Jtag.TDI; + } + else + { + (*_Jtag.Out) &= ~_Jtag.TDI; + } + SWDTCKset0(); + SWD_DELAY;; + SWDTCKset1(); +} + +// turn around direction before +//#pragma inline=forced +unsigned char ScanTDO() +{ + unsigned char val = 0; + SWDTCKset0(); + SWD_DELAY; + SWD_DELAY; + + if(*_Jtag.In & _Jtag.TDO) + { + val = 1; + } + else + { + val = 0; + } + SWDTCKset1(); + __enable_interrupt(); + return val; +} + +void hil_Swd_InitJtag(struct jtag tmp) +{ + _Jtag = tmp; +} + +unsigned char Swd_TransferData(unsigned char regiser, unsigned long* data) +{ + volatile unsigned char ack = DAP_TRANSFER_ERROR; + static unsigned long bit = 0; + static unsigned long val = 0; + static unsigned long parity = 0; + + bit = 0; + val = 0; + parity = 0; + + ///host sends request + SWDIOwriteBit(1); //Start Bit + bit = regiser >> 0; + SWDIOwriteBit(bit); //APnDP Bit + parity += bit; + bit = regiser >> 1; + SWDIOwriteBit(bit); //RnW Bit + parity += bit; + bit = regiser >> 2; + SWDIOwriteBit(bit); //A2 Bit + parity += bit; + bit = regiser >> 3; + SWDIOwriteBit(bit); //A3 Bit + parity += bit; + SWDIOwriteBit((unsigned char)parity); //Parity Bit + SWDIOwriteBit(0); //Stop Bit + SWDIOwriteBit(1); //Park Bit + + // set UIF to input dir + (*_Jtag.TSTCTRL_PORT) ^= (_Jtag._ENI2O); + SWDTckCycle(); + + // read response and check for ack + bit = ScanTDO(); + ack = bit << 0; + bit = ScanTDO(); + ack |= bit << 1; + bit = ScanTDO(); + ack |= bit << 2; + + if (ack == DAP_TRANSFER_OK) + { + unsigned char count = 0; + ///Read now all 32 bit data RDATA[0:31] + val = 0; + parity = 0; + for (count = 32; count; count--) + { + bit = ScanTDO(); + parity += bit; + val >>= 1; + val |= bit << 31; + } + //Read Parity + bit = ScanTDO(); + if ((parity ^ bit) & 1) + { + ack = DAP_TRANSFER_ERROR; + } + if (data) + { + *data = val; + ack = DAP_TRANSFER_OK; + } + } + + // set UIF to output dir + SWDTckCycle(); + (*_Jtag.TSTCTRL_PORT) ^= (_Jtag._ENI2O); + + return ack; +} + +void hil_Swd_Seq(unsigned short length, unsigned char *sequence) +{ + unsigned char dataptr = 0; + unsigned short n = 0; + while (length--) + { + if (n == 0) + { + dataptr = *sequence++; + n = 8; + } + if (dataptr & 1) + { + SWDIOset1TckCycle(); + } + else + { + SWDIOset0TckCycle(); + } + dataptr >>= 1; + n--; + } + (*_Jtag.Out) |= _Jtag.TDI; +} \ No newline at end of file diff --git a/Bios/src/hil/uifv1/hil_jsbw.c b/Bios/src/hil/uifv1/hil_jsbw.c index a2fdc8f..709a197 100644 --- a/Bios/src/hil/uifv1/hil_jsbw.c +++ b/Bios/src/hil/uifv1/hil_jsbw.c @@ -1,43 +1,43 @@ /* * hil_jsbw.c - * + * * * - * Copyright (C) 2012 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 + * Copyright (C) 2012 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ //! \ingroup MODULHIL //! \file hil_jsbw.c -//! \brief +//! \brief //! #include "hw_compiler_specific.h" @@ -54,12 +54,12 @@ #define TDICTRL2 ENTDI2TDO // TO BE ADDAPTED!!!!!!!!s -/*#define JSBW_TMSH TSTCTRLOUT |= TEST; EDT_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; EDT_Delay_1us(1); TGTCTRLOUT |= TGTRST; EDT_Delay_1us(1); // TMS = 1 -#define JSBW_TMSL TSTCTRLOUT &= ~TEST; EDT_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; EDT_Delay_1us(1); TGTCTRLOUT |= TGTRST; EDT_Delay_1us(1);// TMS = 0 -#define JSBW_TDIH TSTCTRLOUT |= TEST; EDT_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; EDT_Delay_1us(1); TGTCTRLOUT |= TGTRST; EDT_Delay_1us(1); // TDI = 1 -#define JSBW_TDIL TSTCTRLOUT &= ~TEST; EDT_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; EDT_Delay_1us(1); TGTCTRLOUT |= TGTRST; EDT_Delay_1us(1); // TDI = 0 -#define JSBW_TDOsbw TSTCTRLOUT |= TDICTRL2; TGTCTRLOUT &= ~TGTRST; EDT_Delay_1us(1); TGTCTRLOUT |= TGTRST; EDT_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle without reading TDO -#define JSBW_TDO_RD TSTCTRLOUT |= TDICTRL2; TGTCTRLOUT &= ~TGTRST; EDT_Delay_1us(1); tdo_bit = JTAGIN; TGTCTRLOUT |= TGTRST; EDT_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle with TDO read +/*#define JSBW_TMSH TSTCTRLOUT |= TEST; IHIL_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; IHIL_Delay_1us(1); TGTCTRLOUT |= TGTRST; IHIL_Delay_1us(1); // TMS = 1 +#define JSBW_TMSL TSTCTRLOUT &= ~TEST; IHIL_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; IHIL_Delay_1us(1); TGTCTRLOUT |= TGTRST; IHIL_Delay_1us(1);// TMS = 0 +#define JSBW_TDIH TSTCTRLOUT |= TEST; IHIL_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; IHIL_Delay_1us(1); TGTCTRLOUT |= TGTRST; IHIL_Delay_1us(1); // TDI = 1 +#define JSBW_TDIL TSTCTRLOUT &= ~TEST; IHIL_Delay_1us(400);TGTCTRLOUT &= ~TGTRST; IHIL_Delay_1us(1); TGTCTRLOUT |= TGTRST; IHIL_Delay_1us(1); // TDI = 0 +#define JSBW_TDOsbw TSTCTRLOUT |= TDICTRL2; TGTCTRLOUT &= ~TGTRST; IHIL_Delay_1us(1); TGTCTRLOUT |= TGTRST; IHIL_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle without reading TDO +#define JSBW_TDO_RD TSTCTRLOUT |= TDICTRL2; TGTCTRLOUT &= ~TGTRST; IHIL_Delay_1us(1); tdo_bit = JTAGIN; TGTCTRLOUT |= TGTRST; IHIL_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle with TDO read #define JSBW_TMSL_TDIL() { JSBW_TMSL JSBW_TDIL JSBW_TDOsbw } #define JSBW_TMSH_TDIL() { JSBW_TMSH JSBW_TDIL JSBW_TDOsbw } @@ -77,13 +77,13 @@ #define TDICTRL2 ENTDI2TDO // TO BE ADDAPTED!!!!!!!!s -#define JSBW_TMSH TGTCTRLOUT |= JSBWsbwdato; EDT_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; EDT_Delay_1us(1); // TMS = 1 -#define JSBW_TMSL TGTCTRLOUT &= ~JSBWsbwdato; EDT_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; EDT_Delay_1us(1);// TMS = 0 +#define JSBW_TMSH TGTCTRLOUT |= JSBWsbwdato; IHIL_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; IHIL_Delay_1us(1); // TMS = 1 +#define JSBW_TMSL TGTCTRLOUT &= ~JSBWsbwdato; IHIL_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; IHIL_Delay_1us(1);// TMS = 0 //#define TMSLDH TGTCTRLOUT &= ~JSBWsbwdato; TGTCTRLOUT |= JSBsbwclk; TGTCTRLOUT &= ~JSBsbwclk; TGTCTRLOUT &= ~JSBsbwclk; // TMS = 0, then TCLK immediately = 1 -#define JSBW_TDIH TGTCTRLOUT |= JSBWsbwdato; EDT_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; EDT_Delay_1us(1); // TDI = 1 -#define JSBW_TDIL TGTCTRLOUT &= ~JSBWsbwdato; EDT_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; EDT_Delay_1us(1); // TDI = 0 -#define JSBW_TDOsbw TSTCTRLOUT |= TDICTRL2; TSTCTRLOUT |= JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle without reading TDO -#define JSBW_TDO_RD TSTCTRLOUT |= TDICTRL2; TSTCTRLOUT |= JSBsbwclk; EDT_Delay_1us(1); tdo_bit = JTAGIN; TSTCTRLOUT &= ~JSBsbwclk; EDT_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle with TDO read +#define JSBW_TDIH TGTCTRLOUT |= JSBWsbwdato; IHIL_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; IHIL_Delay_1us(1); // TDI = 1 +#define JSBW_TDIL TGTCTRLOUT &= ~JSBWsbwdato; IHIL_Delay_1us(400);TSTCTRLOUT |= JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; IHIL_Delay_1us(1); // TDI = 0 +#define JSBW_TDOsbw TSTCTRLOUT |= TDICTRL2; TSTCTRLOUT |= JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle without reading TDO +#define JSBW_TDO_RD TSTCTRLOUT |= TDICTRL2; TSTCTRLOUT |= JSBsbwclk; IHIL_Delay_1us(1); tdo_bit = 0; TSTCTRLOUT &= ~JSBsbwclk; IHIL_Delay_1us(1); TSTCTRLOUT &= ~TDICTRL2; // TDO cycle with TDO read #define JSBW_TMSL_TDIL() { JSBW_TMSL JSBW_TDIL JSBW_TDOsbw } @@ -98,7 +98,7 @@ /*****************************************/ -VAR_AT(unsigned char TCLK_saved, HAL_ADDR_VAR_TCLK_SAVED); +extern unsigned char TCLK_saved; extern unsigned char *tstctrl_port_; extern unsigned char entdi2tdo_; @@ -172,7 +172,7 @@ unsigned long jsbw_Shift(unsigned int Format, unsigned long Data) { TDOword = ((TDOword << 16) + (TDOword >> 4)) & 0x000FFFFF; } - + return(TDOword); } @@ -261,28 +261,28 @@ void JSBW_TapReset(void) // In every TDI slot a TCK for the JTAG machine is generated. // Thus we need to get TAP in Run/Test Idle state back again. JSBW_TMSH_TDIH(); - JSBW_TMSL_TDIH(); - EDT_Delay_1ms(10); + JSBW_TMSL_TDIH(); + IHIL_Delay_1ms(10); } // ----------------------------------------------------------------------------- void JSBW_MagicPattern(void) { jsbw_IR_Shift(IR_JMB_EXCHANGE); - EDT_Delay_1ms(10); + IHIL_Delay_1ms(15); jsbw_DR_Shift(16, 0x0001); - EDT_Delay_1ms(10); - jsbw_DR_Shift(16, 0xA55A); - EDT_Delay_1ms(15); + IHIL_Delay_1ms(15); + jsbw_DR_Shift(16, 0xA55A); + IHIL_Delay_1ms(20); } // ----------------------------------------------------------------------------- void JSBW_JtagUnlock(void) { jsbw_IR_Shift(IR_TEST_3V_REG); - EDT_Delay_1ms(10); + IHIL_Delay_1ms(10); jsbw_DR_Shift(16, 0x4020); - EDT_Delay_1ms(10); + IHIL_Delay_1ms(10); } void jRelease(void) @@ -290,7 +290,7 @@ void jRelease(void) // drive target RST/SBWTDIO pin high TGTCTRLOUT |= JSBWsbwdato; // TDI drives target RST high TSTCTRLOUT &= ~ENTDI2TDO; // enable TDI2TDO - EDT_Delay_1ms(1); + IHIL_Delay_1ms(1); // drive target TEST/SBWTCK pin low TSTCTRLOUT |= JSBsbwclk; // TCK drives target TEST low - release Spy-Bi-Wire logic TGTCTRLOUT &= ~SELT; // enable JTAG & RST pin drivers diff --git a/Bios/src/uart/BSL/FetBsl.c b/Bios/src/uart/BSL/FetBsl.c new file mode 100644 index 0000000..0bb7c0a --- /dev/null +++ b/Bios/src/uart/BSL/FetBsl.c @@ -0,0 +1,202 @@ +/* +* FetUart.c +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- FetBSL.c -----*/ +#include "hw_compiler_specific.h" + +#include "msp430.h" +#include "..\FetCom.h" +#include "FetBsl.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations + +static FET_USB_INFOS_t UsbPointers_; + +static unsigned long UartPreviousBaudrate = 0; + +// init function for UART port pins +// reset all portpins +void FetBsl_PortsHds() // with handshake +{ + uart_CtsOut(); // CTS output + uart_ClearCtsBit(); // clear CTS + uart_RtsIn(); // RTS input + uart_TxdSel(); + uart_RxdSel(); +} + +// initilaize FetBSL_functions +void FetBsl_Init() +{ + // Ports configuration + FetBsl_PortsHds(); + UCA_IE_REGISTER |= UCRXIE; // enable USCIAx interrupt +} + +void FetBsl_SetUsb(FET_USB_INFOS_t* usb_Pointers) +{ + UsbPointers_ = *usb_Pointers; +} + +void FetBsl_Close() +{ + TX_RX_PORT_SEL &= ~( TX_PORT_BIT | RX_PORT_BIT ); // deassign IO-Ports from UCAxTXD, UCAxRxD + TX_RX_PORT_DIR &= ~( TX_PORT_BIT | RX_PORT_BIT ); + // set RTS as input + RTS_PORT_OUT &= ~RTS_PORT_BIT; + RTS_PORT_DIR &= ~RTS_PORT_BIT; + // set CTS as input + CTS_PORT_OUT &= ~CTS_PORT_BIT; + CTS_PORT_DIR &= ~CTS_PORT_BIT; + CTS_PORT_REN &= ~CTS_PORT_BIT; + com_RtsIfgClear(); +} + +// configuration function for UART settings +// UART will be configure automatically about COM channel configuration +short FetBsl_Config(unsigned long UartBaudrate) +{ + uart_ClearCtsBit(); + if(UartBaudrate != UartPreviousBaudrate) // baudrate is changed ? + { + UCA_CTRL_REGISTER |= UCSWRST; // Put state maschine reset + UCA_CTRL_REGISTER |= UCSSEL__SMCLK; // clock source: SMCLK + + if(UartBaudrate == 9600) + { + UCA1BR0 = 0x8F; + UCA1BR1 = 0x0; + UCA1MCTL = 0xE0 + UCOS16; + } + else if(UartBaudrate == 19200) + { + UCA1BR0 = 0x47; + UCA1BR1 = 0x0; + UCA1MCTL = 0xF0 + UCOS16; + } + else if(UartBaudrate == 28800) + { + UCA1BR0 = 0x2B; + UCA1BR1 = 0x0; + UCA1MCTL = 0x50 + UCOS16; + } + else if(UartBaudrate == 38400) + { + UCA1BR0 = 0x23; + UCA1BR1 = 0x0; + UCA1MCTL = 0x80 + UCOS16; + } + else if(UartBaudrate == 56000) + { + UCA1BR0 = 0x18; + UCA1BR1 = 0x0; + UCA1MCTL = 0x40 + UCOS16; + } + else if(UartBaudrate == 57600) + { + UCA1BR0 = 0x17; + UCA1BR1 = 0x0; + UCA1MCTL = 0xA0 + UCOS16; + } + else if(UartBaudrate == 115200) + { + UCA1BR0 = 0xB; + UCA1BR1 = 0x0; + UCA1MCTL = 0xD0 + UCOS16; + } + else if(UartBaudrate == 256000) + { + UCA1BR0 = 0x5; + UCA1BR1 = 0x0; + UCA1MCTL = 0xE0 + UCOS16; + } + + UCA1CTL0 = UCPEN + UCPAR; // parety even + UCA_CTRL_REGISTER &=~ UCSWRST; // Initialize USCI state machine + UCA_IE_REGISTER |= UCRXIE; // enable USCIAx interrupt + + UartPreviousBaudrate = UartBaudrate; + + } + return (0); +} + +short FetBsl_NotBusy() +{ + if((UCA_STATUS_REGISTER & UCBUSY) == UCBUSY) // when busy: + { + return (0); // return 0 + } + return (1); // else return 1 +} + +short FetBsl_TxEmpty() +{ + // UCTXIFG is set when UCAxTXBUF empty + if(UCTXIFG == (UCTXIFG & UCA_INTERRUPT_FLAG_REGISTER)) + { + return (1); // empty + } + return (0); // not empty +} + +// functions copies byte by byte from USB buffer to UART buffer +short FetBsl_Transmit(unsigned char uartDataToTxBuffer) +{ + UCA_TX_BUF = uartDataToTxBuffer; + return (0); +} + +short FetBsl_Send() +{ + // Start USB to UART bridge communication ---------------------------------- + BYTE BytesInUsbBuffer = UsbPointers_.FetUSB_bytesInUSBBuffer(CDC0_DATA_INTERFACE); + if(BytesInUsbBuffer) + { + unsigned char i = 0; + BYTE uartDataToSend[260] = {0}; + UsbPointers_.FetUSB_receiveData(uartDataToSend, BytesInUsbBuffer , CDC0_DATA_INTERFACE); + while(BytesInUsbBuffer) + { + if(FetBsl_NotBusy() && FetBsl_TxEmpty()) + { + FetBsl_Transmit(uartDataToSend[i++]); + BytesInUsbBuffer--; + } + } + } + return 0; +} diff --git a/Bios/src/uart/BSL/FetBsl.h b/Bios/src/uart/BSL/FetBsl.h new file mode 100644 index 0000000..6251b75 --- /dev/null +++ b/Bios/src/uart/BSL/FetBsl.h @@ -0,0 +1,52 @@ +/* +* FetBsl.h +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- FetBsl.h -----*/ +#ifndef FetBsl_H +#define FetBsl_H + +void FetBslI2c_SetUsb(FET_USB_INFOS_t* usb_Pointers); +void FetBslI2c_Init(); +short FetBslI2c_Send(); +void FetBsl_Init(); +short FetBsl_Send(); +short FetBsl_Config(unsigned long UartBaudrate); +void FetBsl_SetUsb(FET_USB_INFOS_t* usb_Pointers); +void FetBslI2c_SetHil(edt_common_methods_t* hil_Pointers); +void FetBsl_Close(); + +#endif diff --git a/Bios/src/uart/BSL/FetBslI2c.c b/Bios/src/uart/BSL/FetBslI2c.c new file mode 100644 index 0000000..feaa3ae --- /dev/null +++ b/Bios/src/uart/BSL/FetBslI2c.c @@ -0,0 +1,116 @@ +/* +* FetUart.c +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- FetBslI2c.c -----*/ +#include "hw_compiler_specific.h" + +#include "msp430.h" +#include "..\FetCom.h" +#include "I2C\I2C.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations +#include "FetBsl.h" + +static FET_USB_INFOS_t UsbPointers_; +static edt_common_methods_t hilPointers_; + +// initilaize FetBSL_functions +void FetBslI2c_Init() +{ + com_RtsInterruptDisable(); + P8SEL &= ~BIT3; // de-assign P3.3 from UCA0TXD to GPIO + P8SEL &= ~BIT2; // de-assign P3.4 from UCA0RXD to GPIO + I2C_init(); +} + +void FetBslI2c_SetUsb(FET_USB_INFOS_t* usb_Pointers) +{ + UsbPointers_ = *usb_Pointers; +} + +void FetBslI2c_SetHil(edt_common_methods_t* hil_Pointers) +{ + hilPointers_ = *hil_Pointers; +} + +short FetBslI2c_Send() +{ + _DINT_FET() + static short isFirstMessage = 1, isLastMessage = 0; + static unsigned short dataLength = 0; + // Start USB to I2C bridge communication ---------------------------------- + BYTE BytesInUsbBuffer = UsbPointers_.FetUSB_bytesInUSBBuffer(CDC0_DATA_INTERFACE); + if(BytesInUsbBuffer) + { + BYTE i2cDataToSend[BSL_MAX_DATA_LENGTH] = {0}; + BYTE returnData[BSL_MAX_DATA_LENGTH] = {0}; + unsigned short readLength = 0; + + UsbPointers_.FetUSB_receiveData(i2cDataToSend, BytesInUsbBuffer , 1); + if(isFirstMessage) + { + dataLength = (i2cDataToSend[2] << 8 | i2cDataToSend[1]); + isFirstMessage = 0; + dataLength = dataLength + OFFSET_BSL_HEADER + OFFSET_BSL_CRC - BytesInUsbBuffer; + I2C_writeData(I2C_SLAVE_ADDRESS ,i2cDataToSend, BytesInUsbBuffer, I2C_NO_STOP, I2C_START); // start write + } + else + { + dataLength = dataLength - BytesInUsbBuffer; + I2C_writeData(I2C_SLAVE_ADDRESS,i2cDataToSend, BytesInUsbBuffer, I2C_NO_STOP, I2C_NO_START);// continue write + } + + if(dataLength == 0) + { + isLastMessage = 1; + } + + if(isLastMessage) + { + unsigned int i = 0; + hilPointers_.Delay_1ms(2); + I2C_readData(I2C_SLAVE_ADDRESS, returnData, &readLength, I2C_REPEATED_START); + for(i = 0; i < readLength; i++) + { + COM_BASE_Receive(returnData[i]); + } + isFirstMessage = 1; + isLastMessage = 0; + } + } + _EINT_FET() + return 0; +} diff --git a/Bios/src/uart/BSL/I2C/I2C.c b/Bios/src/uart/BSL/I2C/I2C.c new file mode 100644 index 0000000..cd06779 --- /dev/null +++ b/Bios/src/uart/BSL/I2C/I2C.c @@ -0,0 +1,373 @@ +/* +* I2C.c +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2014 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. +*/ +// Include section + +// driver +#include "I2C.h" + +//private +static void I2C_writeByte(unsigned char data); +static unsigned char I2C_readByte(unsigned char ack); +static unsigned char I2C_sda(unsigned char condition); +static void I2C_delay(void); +// ************************************************************************************************* +// Extern section + +// ************************************************************************************************* +// @fn bmp_ps_init +// @brief Init I2C communication +// @param none +// @return none +// ************************************************************************************************* +void I2C_init(void) +{ + // SCL and SDA are high by default + I2C_OUT_SCL |= I2C_SCL_PIN; + I2C_OUT_SDA |= I2C_SDA_PIN; + + // SCL and SDA are outputs by default + I2C_DIR_SCL |= I2C_SCL_PIN; + I2C_DIR_SDA |= I2C_SDA_PIN; + + I2C_DIR_SCL_LS &= ~I2C_DIR_SCL_LS_PIN; // signal inverted in + I2C_DIR_SDA_LS |= I2C_DIR_SDA_LS_PIN; + + I2C_delay(); +} + + +// ************************************************************************************************* +// @fn I2C_sda +// @brief Control SDA line +// @param unsigned char condition I2C_SEND_START, I2C_SEND_RESTART, I2C_SEND_STOP +// I2C_CHECK_ACK +// @return unsigned char 1=ACK, 0=NACK +// ************************************************************************************************* +unsigned char I2C_sda(unsigned char condition) +{ + unsigned char sda = 0; + + if (condition == I2C_SEND_START) + { + I2C_SDA_OUT; // SDA is output + I2C_SCL_HI; + I2C_delay(); + I2C_SDA_LO; + I2C_delay(); + I2C_SCL_LO; // SDA 1-0 transition while SCL=1 (will be 0) + I2C_delay(); + } + else if (condition == I2C_SEND_RESTART) + { + I2C_SDA_OUT; // SDA is output + I2C_SCL_LO; + I2C_SDA_HI; + I2C_delay(); + I2C_SCL_HI; + I2C_delay(); + I2C_SDA_LO; + I2C_delay(); + I2C_SCL_LO; // SDA 1-0 while SCL = 1 (was 0) + I2C_delay(); + } + else if (condition == I2C_SEND_STOP) + { + I2C_SDA_OUT; // SDA is output + I2C_SDA_LO; + I2C_delay(); + I2C_SCL_LO; + I2C_delay(); + I2C_SCL_HI; + I2C_delay(); + I2C_SDA_HI; // SDA 0-1 transition while SCL=1 + I2C_delay(); + } + else if (condition == I2C_CHECK_ACK) + { + I2C_SDA_IN; // SDA is input + I2C_SCL_LO; + I2C_delay(); + I2C_SCL_HI; + I2C_delay(); + sda = I2C_IN_SDA & I2C_SDA_PIN; // ACK = SDA during ack clock pulse + //I2C_SCL_LO; + + I2C_SCL_IN; // switch SCL to input + I2C_delay(); + + // wait if Slave holds SCL low after ack + while(!(I2C_IN_SCL & I2C_SCL_PIN)) + { + I2C_delay(); + } + + I2C_SCL_LO ; + I2C_delay(); + I2C_SCL_OUT; + } + + // Return value will only be evaluated when checking device ACK + return (sda == 0); +} + +// ************************************************************************************************* +// @fn I2C_writeByte +// @brief Clock out bits through SDA. +// @param unsigned char data Byte to send +// @return none +// ************************************************************************************************* +void I2C_writeByte(unsigned char data) +{ + unsigned char i, mask; + + // Set mask byte to 10000000b + mask = BIT0 << 7; + + I2C_SDA_OUT; // SDA is output + + for (i = 8; i > 0; i--) + { + I2C_SCL_LO; // SCL=0 + if ((data & mask) == mask) + { + I2C_SDA_HI; // SDA=1 + } + else + { + I2C_SDA_LO; // SDA=0 + } + mask = mask >> 1; + I2C_delay(); + I2C_SCL_HI; // SCL=1 + I2C_delay(); + } + + I2C_SCL_LO; // SCL=0 + I2C_SDA_IN; // SDA is input +} + +// ************************************************************************************************* +// @fn I2C_readByte +// @brief Read bits from SDA +// @param unsigned char ack 1=Send ACK after read, 0=Send NACK after read +// @return unsigned char Bits read +// ************************************************************************************************* +unsigned char I2C_readByte(unsigned char ack) +{ + unsigned char i = 0; + unsigned char data = 0; + unsigned char lastSDA = 0; + + I2C_SDA_IN; + // SDA is input + I2C_delay(); + + for (i = 0; i < 8; i++) + { + I2C_delay(); + I2C_SCL_LO; // SCL=0 + I2C_delay(); + I2C_SCL_HI; // SCL=0 + + // Shift captured bits to left + data = data << 1; + + // Capture new bit + if ((I2C_IN_SDA & I2C_SDA_PIN) == I2C_SDA_PIN) + { + data |= BIT0; + lastSDA = 1; + } + else + { + lastSDA = 0; + } + } + if(lastSDA) + { + I2C_SDA_HI; + } + + I2C_SDA_OUT; // SDA is output + + // 1 aditional clock phase to generate master ACK + I2C_SCL_LO; // SCL=0 + + if (ack == 1) + { + I2C_SDA_LO; // Send ack -> continue read + } + else + { + I2C_SDA_HI; // Send nack -> stop read + } + + I2C_delay(); + I2C_SCL_HI; // SCL=0 + I2C_delay(); + I2C_SCL_LO; + + return (data); +} + +// ************************************************************************************************* +// @fn I2C_writeData +// @brief Write a byte via I2C +// @param unsigned char address device address +// unsigned char *data Data to write +// unsigned char dLength data length +// @return unsigned char +// ************************************************************************************************* +unsigned short I2C_writeData(unsigned char address, unsigned char *data, unsigned short dLength, unsigned char sendStopBit, unsigned char sendI2cAddress) +{ + volatile unsigned char success = 0; + unsigned int i = 0; + + if(sendI2cAddress) + { + I2C_sda(I2C_SEND_START); // Generate start condition + + I2C_writeByte((address << 1) | I2C_WRITE); // Send 7bit device address + r/w bit '0' -> write + success = I2C_sda(I2C_CHECK_ACK); // Check ACK from device + if (!success) + { + return (0); + } + } + for(i = 0; i < dLength; i++) + { + I2C_writeByte(data[i]); // Send 8bit data to BSL + success = I2C_sda(I2C_CHECK_ACK); // Check ACK from device + if (!success) + { + I2C_sda(I2C_SEND_STOP); + return (0); + } + } + if(sendStopBit) + { + I2C_sda(I2C_SEND_STOP); // Generate stop condition + } + return 1; +} + +// ************************************************************************************************* +// @fn I2C_readData +// @brief Read a bytes fromn I2C +// @param unsigned char address device address +// unsigned char *data Data to write +// unsigned char dLength data length +// @return void +// ************************************************************************************************* +unsigned short I2C_readData(unsigned char address, unsigned char *data, unsigned short *dLength, unsigned char repeatedStart) +{ + unsigned char success = 0; + unsigned int i = 0, dataLength = 4; + + if(repeatedStart) + { + I2C_sda(I2C_SEND_RESTART); + } + else + { + I2C_sda(I2C_SEND_START); // Generate restart condition + } + + I2C_writeByte((address << 1) | I2C_READ); // Send 7bit device address + r/w bit '1' -> read + I2C_delay(); + I2C_delay(); + //2 delay cycles are needed here – I2C slave needs time to process send data + success = I2C_sda(I2C_CHECK_ACK); // Check ACK from device + if (!success) + { + return (0); + } + + // read BSL ACk + data[i++] = I2C_readByte(1); + //0x80 + data[i] = I2C_readByte(1); + + if(data[i] != 0x80) + { + //if no answer was received + *dLength = 1; + + // Read lst 8bit data from register + data[i] = I2C_readByte(0); + I2C_sda(I2C_SEND_STOP); // Generate stop condition + return (1); + } + i++; + // Length low byte + data[i++] = I2C_readByte(1); + // Length high byte + data[i] = I2C_readByte(1); + dataLength = (data[i] << 8 | data[i-1]) + OFFSET_BSL_ACK + OFFSET_BSL_HEADER + OFFSET_BSL_CRC;// 2 + 4; // +2 because of crc + *dLength = (data[i] << 8 | data[i-1]) + OFFSET_BSL_ACK + OFFSET_BSL_HEADER + OFFSET_BSL_CRC; // +2 because of crc + i++; + + // read until data lenght -1 + for(; i < dataLength-1; i++) + { + data[i] = I2C_readByte(1); // Read 8bit data from register + } + + // send nack if last byte is read + data[i] = I2C_readByte(0); // Read lst 8bit data from register + + I2C_sda(I2C_SEND_STOP); // Generate stop condition + return (1); +} + +// ************************************************************************************************* +// @fn I2C_delay +// @brief Delay between I2C signal edges. +// @param none +// @return none +// ************************************************************************************************* +void I2C_delay(void) +{ + asm (" nop"); + asm (" nop"); + asm (" nop"); + asm (" nop"); + asm (" nop"); + asm (" nop"); + asm (" nop"); + asm (" nop"); +} diff --git a/Bios/src/uart/BSL/I2C/I2C.h b/Bios/src/uart/BSL/I2C/I2C.h new file mode 100644 index 0000000..4f8221d --- /dev/null +++ b/Bios/src/uart/BSL/I2C/I2C.h @@ -0,0 +1,116 @@ +// ************************************************************************************************* +// +// Copyright (C) 2009 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 I2C_H_ +#define I2C_H_ + +// ************************************************************************************************* +// Include section + +#include "msp430.h" + +// ************************************************************************************************* +// Prototypes section +void I2C_init(void); + +//pulic +unsigned short I2C_writeData(unsigned char address, unsigned char *data, unsigned short dLength, unsigned char sendStopBit, unsigned char sendI2cAddress); +unsigned short I2C_readData(unsigned char address, unsigned char *data, unsigned short *dLength, unsigned char repeatedStart); + +// ************************************************************************************************* +// Defines section + +// Port and pin resource for I2C interface +// SCL=P9.5, SDA=P8.3 + + +// SCL config +#define I2C_IN_SCL (P9IN) +#define I2C_OUT_SCL (P9OUT) +#define I2C_REN_SCL (P9REN) +#define I2C_DIR_SCL (P9DIR) +#define I2C_DIR_SCL_LS (P1OUT) +#define I2C_DIR_SCL_LS_PIN (BIT6) + +// SDA config +#define I2C_IN_SDA (P8IN) +#define I2C_OUT_SDA (P8OUT) +#define I2C_DIR_SDA (P8DIR) +#define I2C_REN_SDA (P8REN) +#define I2C_DIR_SDA_LS (P1OUT) +#define I2C_DIR_SDA_LS_PIN (BIT4) + +// SCL / SDA bits +#define I2C_SCL_PIN (BIT5) +#define I2C_SDA_PIN (BIT3) + +// I2C defines +#define I2C_WRITE (0u) +#define I2C_READ (1u) + +#define I2C_SEND_START (0u) +#define I2C_SEND_RESTART (1u) +#define I2C_SEND_STOP (2u) +#define I2C_CHECK_ACK (3u) +#define I2C_CHECK_SCL_STRETCH (4u) + +#define I2C_8BIT_ACCESS (0u) +#define I2C_16BIT_ACCESS (1u) + +#define I2C_SCL_HI { I2C_OUT_SCL |= I2C_SCL_PIN; } +#define I2C_SCL_LO { I2C_OUT_SCL &= ~I2C_SCL_PIN; } + +#define I2C_SDA_HI { I2C_OUT_SDA |= I2C_SDA_PIN; } +#define I2C_SDA_LO { I2C_OUT_SDA &= ~I2C_SDA_PIN; } + +#define I2C_SDA_IN { I2C_OUT_SDA &= ~I2C_SDA_PIN; I2C_DIR_SDA &= ~I2C_SDA_PIN; I2C_DIR_SDA_LS &= ~I2C_DIR_SDA_LS_PIN;} +#define I2C_SDA_OUT { I2C_DIR_SDA |= I2C_SDA_PIN; I2C_DIR_SDA_LS |= I2C_DIR_SDA_LS_PIN;} + +#define I2C_SCL_IN { I2C_DIR_SCL_LS |= I2C_DIR_SCL_LS_PIN; I2C_DIR_SCL &= ~I2C_SCL_PIN;} +#define I2C_SCL_OUT { I2C_DIR_SCL |= I2C_SCL_PIN; I2C_DIR_SCL_LS &= ~I2C_DIR_SCL_LS_PIN;} + +#define I2C_START 1 +#define I2C_STOP 1 +#define I2C_NO_STOP 0 +#define I2C_NO_START 0 +#define I2C_REPEATED_START 1 + + +#define I2C_SLAVE_ADDRESS 0x48 +#define OFFSET_BSL_HEADER 3 +#define OFFSET_BSL_CRC 2 +#define OFFSET_BSL_ACK 1 + +#endif diff --git a/Bios/src/uart/ComBase/COM_Base.c b/Bios/src/uart/ComBase/COM_Base.c new file mode 100644 index 0000000..89d95f2 --- /dev/null +++ b/Bios/src/uart/ComBase/COM_Base.c @@ -0,0 +1,416 @@ +/* +* Com_Base.c +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- FetBslI2c.c -----*/ +#include "hw_compiler_specific.h" +#include "msp430.h" +#include "../FetCom.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations +#include "../BSL/FetBsl.h" +#include "../Uart/Uart.h" +#include "../../fw/fet/FetVersion.h" + + +#define USB_TIMEOUT 10 +#define EJECT 1500 + +static unsigned short RxFifoPosition; +static unsigned char *RxActiveBuffer; +static unsigned char RxBufferFront[COM_FIFOSIZE]={0}; +static unsigned char RxBufferBack[COM_FIFOSIZE]={0}; +static unsigned char FrontBufferUsed = 1; +static unsigned long PreviousBaudrate = 0; + +static unsigned short *Semaphore_Add = (unsigned short*)COM_SEMAPHOREADRESS; + +static const unsigned long com_Signature_ @ "UARTSIGNATURE" = COM_SIGNATURE; +#pragma required = com_Signature_ + +static const unsigned int com_LayerVersion_ @ "UARTLAYERVERSION" = COM_LAYER_VERSION; +static const unsigned int com_LayerVersionCmp_ @ "UARTLAYERVERSIONCMP" = COM_LAYER_VERSION_CMP; + + +#pragma required = com_LayerVersion_ +#pragma required = com_LayerVersionCmp_ + +static COM_INFOS_t comInfos_; +static edt_common_methods_t hilPointers_; +static DCDC_INFOS_t dcdcPointers_; + +static FET_USB_INFOS_t UsbPointers_; + +static unsigned short iBytesReceived = 0; +static unsigned short EjectCounter = 0; + +// Dummy functions loaded by default +#ifdef MSP_FET + static short COM_BASE_ConfigModeDummy(unsigned long UartBaudrate){return 0;} + static void COM_BASE_SetRtsDummy(){return;} +#endif +static short COM_BASE_SetCtsDummy(){return 0;} + + +// initilaize UART functions +void COM_BASE_Init(COM_INFOS_t* comInfos_Pointer) +{ + // map function pointers in FET UART layer + // get Infos about UART-module + comInfos_.comGetLayerVersion = COM_BASE_GetLayerVersion; + comInfos_.comConfig = COM_BASE_Config; + comInfos_.comReceive = COM_BASE_Receive; + comInfos_.comSetHil = COM_BASE_SetHil; + comInfos_.comSetDcdc = COM_BASE_SetDcdc; + comInfos_.comSetUSB = COM_BASE_SetUsb; + comInfos_.comLoop = COM_BASE_Loop; + comInfos_.comClose = COM_BASE_Close; + + // set CTS to dummy - only needed for UART mode with handshake + comInfos_.comSetCts = COM_BASE_SetCtsDummy; + comInfos_.comClearCts = COM_BASE_SetCtsDummy; + comInfos_.comSetRts = UART_SetRts; + + // UART without handshake is configured by default + comInfos_.comTransmit = Uart_Send; + comInfos_.comConfigMode = Uart_Config; + + comInfos_.comGetLayerVersionCmp = COM_BASE_GetLayerVersionCmp; + + Uart_Init(UART_NO_HANDSHAKE, PARITY_NONE); + + // init Rx FIFO pointer + RxFifoPosition = 0; + RxActiveBuffer = RxBufferFront; + FrontBufferUsed = 1; + + // now copy getLayerVersion and return it to uper core layer + *comInfos_Pointer = comInfos_; +} + +void COM_BASE_SetHil(edt_common_methods_t* hil_Pointers) +{ + hilPointers_ = *hil_Pointers; + +#ifdef MSP_FET + FetBslI2c_SetHil(hil_Pointers); +#endif +} + +void COM_BASE_SetDcdc(DCDC_INFOS_t* dcdc_Pointers) +{ + dcdcPointers_ = *dcdc_Pointers; +} + +void COM_BASE_SetUsb(FET_USB_INFOS_t* usb_Pointers) +{ + UsbPointers_ = *usb_Pointers; + Uart_SetUsb(usb_Pointers); + +#ifdef MSP_FET + FetBslI2c_SetUsb(usb_Pointers); + FetBsl_SetUsb(usb_Pointers); +#endif +} + +void COM_BASE_Close() +{ + RxFifoPosition = 0; + RxActiveBuffer = RxBufferFront; + FrontBufferUsed = 1; + Uart_Close(); + +#ifdef MSP_FET + FetBsl_Close(); +#endif +} + +// return UART layer version +short COM_BASE_GetLayerVersion() +{ + return (COM_LAYER_VERSION); +} + +short COM_BASE_GetLayerVersionCmp() +{ + return (COM_LAYER_VERSION_CMP); +} +unsigned short fetTypeInt = 0; + +#pragma optimize = low +void COM_BASE_EvaluateBaudRateCommand(unsigned long Baudrate, unsigned short fetType) +{ + *Semaphore_Add = 0; + fetTypeInt = fetType; + switch(Baudrate) + { + case COM_CLOSE: + case BSL_DISABLE: + { +#ifdef MSP_FET + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_HIGH_Z_UART); +#endif + COM_BASE_Close(); + break; + } + case COM_POWER_DOWN: + { + hilPointers_.SetVcc(0); +#ifdef MSP_FET + hilPointers_.SwitchVccFET(0); +#endif + break; + } + case COM_POWER_UP: + { + dcdcPointers_.dcdcSetVcc(3300); + hilPointers_.SetVcc(3300); +#ifdef MSP_FET + hilPointers_.SwitchVccFET(1); +#endif + break; + } + case UART_NO_HANDSHAKE: + case UART_NO_HANDSHAKE_PARITY_EVEN: + { + // UART +#ifdef MSP_FET + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_UART); +#endif + comInfos_.comTransmit = Uart_Send; + comInfos_.comConfigMode = Uart_Config; + //configure FET to work without handshake - reset to defaults + comInfos_.comSetCts = COM_BASE_SetCtsDummy; + comInfos_.comClearCts = COM_BASE_SetCtsDummy; + if(Baudrate == UART_NO_HANDSHAKE_PARITY_EVEN) + { + Uart_Init(UART_NO_HANDSHAKE, PARITY_EVEN); + } + else + { + Uart_Init(UART_NO_HANDSHAKE, PARITY_NONE); + } + break; + } + case UART_HANDSHAKE: + { +#ifdef MSP_FET + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_UART); +#endif + comInfos_.comTransmit = Uart_Send; + comInfos_.comConfigMode = Uart_Config; + + if(fetTypeInt == eZ_FET_WITH_DCDC_NO_FLOWCTL || fetTypeInt == eZ_FET_WITH_DCDC_V2x) + { + //configure FET to work without handshake - reset to defaults + comInfos_.comSetCts = COM_BASE_SetCtsDummy; + comInfos_.comClearCts = COM_BASE_SetCtsDummy; + Uart_Init(UART_NO_HANDSHAKE, PARITY_NONE); + } + else + { + //configure FET UART to work with handshake + comInfos_.comSetCts = Uart_SetCts; + comInfos_.comClearCts = Uart_ClearCts; + Uart_Init(UART_HANDSHAKE, PARITY_NONE); + *Semaphore_Add = comInfos_.comSetCts(); + } + break; + } + +#ifdef MSP_FET + case BSL_UART_INVOKE_SEQUENCE: + case BSL_UART_SEQUENCE: + { + //configure FET to work without handshake - reset to defaults + comInfos_.comSetCts = COM_BASE_SetCtsDummy; + comInfos_.comClearCts = COM_BASE_SetCtsDummy; + comInfos_.comSetRts = COM_BASE_SetRtsDummy; + + FetBsl_Init(); + // Ports configuration + dcdcPointers_.dcdcSetVcc(3300); + hilPointers_.SetVcc(3300); + hilPointers_.SwitchVccFET(1); + hilPointers_.SetProtocol(2); + // UART + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_UART); + if(BSL_UART_SEQUENCE != Baudrate) + { + hilPointers_.BSL_EntrySequence(0); + } + // prtocol specific functions + comInfos_.comTransmit = FetBsl_Send; + comInfos_.comConfigMode = FetBsl_Config; + break; + } + case BSL_I2C_INVOKE_SEQUENCE1: + case BSL_I2C_INVOKE_SEQUENCE2: + case BSL_I2C_INVOKE_SEQUENCE3: + case BSL_I2C_INVOKE_SEQUENCE4: + case BSL_I2C_SEQUENCE1: + case BSL_I2C_SEQUENCE2: + { + //configure FET to work without handshake - reset to defaults + comInfos_.comSetCts = COM_BASE_SetCtsDummy; + comInfos_.comClearCts = COM_BASE_SetCtsDummy; + comInfos_.comSetRts = COM_BASE_SetRtsDummy; + + // Ports configuration + dcdcPointers_.dcdcSetVcc(3300); + hilPointers_.SetVcc(3300); + hilPointers_.SwitchVccFET(1); + hilPointers_.SetProtocol(2); + //I2C config + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_HIGH_Z_UART); + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_I2C); + if(BSL_I2C_SEQUENCE1 != Baudrate && BSL_I2C_SEQUENCE2 != Baudrate) + { + hilPointers_.BSL_EntrySequence(0); + } + FetBslI2c_Init(); + // prtocol specific functions + comInfos_.comTransmit = FetBslI2c_Send; + comInfos_.comConfigMode = COM_BASE_ConfigModeDummy; + break; + } +#endif + default: + { + if(Baudrate != BSL_I2C_INVOKE_SEQUENCE2 && Baudrate != BSL_I2C_INVOKE_SEQUENCE1 && + Baudrate != BSL_UART_INVOKE_SEQUENCE && Baudrate != UART_HANDSHAKE && + Baudrate != UART_NO_HANDSHAKE && Baudrate != COM_POWER_UP && + Baudrate != COM_CLOSE && Baudrate != COM_POWER_DOWN && + Baudrate != BSL_I2C_INVOKE_SEQUENCE3 && + Baudrate != BSL_I2C_INVOKE_SEQUENCE4 && Baudrate != BSL_I2C_SEQUENCE1 && + Baudrate != BSL_I2C_SEQUENCE2 && Baudrate != BSL_UART_SEQUENCE ) + { + // Uart without handshake is set as default + #ifdef MSP_FET + hilPointers_.ConfigFpgaIoMode(IO_CONFIG_UART); + #endif + } + } + } +} + +// configuration function for UART settings +// UART will be configure automatically about COM channel configuration +short COM_BASE_Config(unsigned long Baudrate, unsigned long MCLK_Frequency, + unsigned short fetType) +{ + if(Baudrate != PreviousBaudrate) // baudrate changed ? + { + COM_BASE_EvaluateBaudRateCommand(Baudrate, fetType); + comInfos_.comConfigMode(Baudrate); + PreviousBaudrate = Baudrate; + } + return (0); +} + +void COM_BASE_SwitchBuffer() +{ + RxFifoPosition = 0; + if(FrontBufferUsed == 1) + { + RxActiveBuffer = RxBufferBack; + FrontBufferUsed = 0; + } + else + { + RxActiveBuffer = RxBufferFront; + FrontBufferUsed = 1; + } +} + +unsigned char *COM_BASE_GetBuffer() +{ + unsigned char *activePtr = 0; + if(FrontBufferUsed == 0) + { + activePtr = RxBufferFront; + } + else + { + activePtr = RxBufferBack; + } + return activePtr; +} + +short COM_BASE_Receive(unsigned char character) +{ + *Semaphore_Add = comInfos_.comClearCts(); + if(RxFifoPosition != COM_FIFOSIZE) + { + RxActiveBuffer[RxFifoPosition++] = character; + iBytesReceived++; + } + else + { + COM_BASE_SwitchBuffer(); + RxActiveBuffer[RxFifoPosition++] = character; + iBytesReceived = 1; + EjectCounter = 0; + UsbPointers_.FetUsb_CdcSendDataInBackground(COM_BASE_GetBuffer(), COM_FIFOSIZE, CDC0_DATA_INTERFACE, USB_TIMEOUT); + } + *Semaphore_Add = comInfos_.comSetCts(); + return 0; +} + +void COM_BASE_Loop() +{ + comInfos_.comTransmit(); + // Start USB to Host communication (Uart)----------------------------------- + if(iBytesReceived > 0) + { + EjectCounter++; + if(EjectCounter >= EJECT) + { + *Semaphore_Add = comInfos_.comClearCts(); + UCA_IE_REGISTER &= ~UCRXIE; // disable USCIAx interrupt + unsigned short tmpbyte = iBytesReceived; + iBytesReceived = 0; + COM_BASE_SwitchBuffer(); + BYTE sendResult = UsbPointers_.FetUsb_CdcSendDataInBackground(COM_BASE_GetBuffer(), tmpbyte, CDC0_DATA_INTERFACE, 10); + if( sendResult == 0) + { + EjectCounter = 0; + } + UCA_IE_REGISTER |= UCRXIE; // enable USCIAx interrupt + *Semaphore_Add = comInfos_.comSetCts(); + } + } + // End USB to Host communication (Uart)------------------------------------- +} diff --git a/Bios/src/uart/FetCom.h b/Bios/src/uart/FetCom.h new file mode 100644 index 0000000..df9048d --- /dev/null +++ b/Bios/src/uart/FetCom.h @@ -0,0 +1,244 @@ +/* +* FetCom.h +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- FetUart.h -----*/ +#ifndef FETCOM_H +#define FETCOM_H + +#include "hil_Structs.h" +#include "FetDcdc.h" +#include "FetUsb.h" + +#ifdef eZ_FET + + // UART port direction + #define uart_CtsOut() {P2DIR |= BIT7;} // CTS output + #define uart_RtsIn() {P2DIR &=~ BIT6;} // RTS input + + // UART port + #define uart_SetCtsBit() {P2OUT |= BIT7;} // Output + #define uart_ClearCtsBit() {P2OUT &=~ BIT7;} // Output clear + #define uart_RtsRen() {P2REN |= BIT6;} // RTS resistor + #define uart_CtsRen() {P2REN |= BIT7;} // CTS resistor + + #define com_RtsIfgSet() {P2IFG |= BIT6;} // RTS Interrupt flag set (required for sending first byte) + #define com_RtsIfgClear() {P2IFG &=~ BIT6;} // RTS Interrupt flag clear + #define com_RtsIe() {P2IE |= BIT6;} // RTS Interrupt enable + #define com_RtsInterruptDisable() {P2IE &= ~BIT6;} // RTS Interrupt disable + #define com_RtsIes() {P2IES &=~ BIT6;} // RTS Interrupt edge select (is set when a low-high transition) + + // UART status bits + #define uart_RtsStatus() ((P2IN & BIT6)==BIT6) + + // UART port select + #define uart_TxdSel() {P3SEL |= BIT3;} // assign P3.3 to UCA0TXD + #define uart_RxdSel() {P3SEL |= BIT4;} // assign P3.4 to UCA0RXD + + + // UART Register and bit abstractions + #define TX_RX_PORT_SEL ( P3SEL ) + #define TX_RX_PORT_DIR ( P3DIR ) + #define TX_PORT_BIT ( BIT3 ) + #define RX_PORT_BIT ( BIT4 ) + #define UCA_CTRL_REGISTER ( UCA0CTL1 ) + #define UCA_CTRL0_REGISTER ( UCA0CTL0 ) + #define UCA_BAUD_CTRL_REGISTER ( UCA0BRW ) + #define UCA_MOD_CTRL_REGISTER ( UCA0MCTL ) + #define UCA_IE_REGISTER ( UCA0IE ) + #define UCA_STATUS_REGISTER ( UCA0STAT ) + #define UCA_INTERRUPT_FLAG_REGISTER ( UCA0IFG ) + #define UCA_TX_BUF ( UCA0TXBUF ) + #define UCA_RX_BUF ( UCA0RXBUF ) + + #define UCA_BR0 ( UCA0BR0 ) + #define UCA_BR1 ( UCA0BR1 ) + + #define RTS_PORT_OUT ( P2OUT ) + #define RTS_PORT_DIR ( P2DIR ) + #define RTS_PORT_BIT ( BIT7 ) + + #define RTS_PULLDOWN_OUT ( P2OUT ) + #define RTS_PULLDOWN_REN ( P2REN ) + #define RTS_PULLDOWN_BIT ( BIT6 ) + #define rtsSetPullDownDir() (P2DIR &= ~BIT6) +// CHECKME: Bit is cleared in both cases + #define rtsClearPullDownDir() (P2DIR &= ~BIT6) + #define RTS_PULLUP_REN ( P2REN ) + #define RTS_PULLUP_OUT ( P2OUT ) + #define RTS_PULLUP_BIT ( BIT6 ) + #define rtsSetPullUpDir() (P2DIR &= ~BIT6) + + #define CTS_PORT_OUT ( P2OUT ) + #define CTS_PORT_DIR ( P2DIR ) + #define CTS_PORT_REN ( P2REN ) + #define CTS_PORT_BIT ( BIT6 ) +#endif + +#ifdef MSP_FET + + // UART port direction + #define uart_CtsOut() {P9DIR |= BIT5;} // CTS output + #define uart_RtsIn() {P2DIR &=~ BIT1;} // "RTS" input (no RTS on MSPFET) + + + // UART port + #define uart_SetCtsBit() {P9OUT |= BIT5;} // Output + #define uart_ClearCtsBit() {P9OUT &=~ BIT5;} // Output clear + #define uart_RtsRen() {P2REN |= BIT1;} // RTS resistor + #define uart_CtsRen() {P9REN |= BIT5;} // CTS resistor + + #define com_RtsIfgSet() {P2IFG = 0x00; P2IFG |= BIT1;} // RTS Interrupt flag set (required for sending first byte) + #define com_RtsIfgClear() {P2IFG = 0x00; /*P2IFG &=~ BIT1;*/} // RTS Interrupt flag clear + #define com_RtsIe() {P2IE = 0x00; P2IE |= BIT1;} // RTS Interrupt enable + #define com_RtsInterruptDisable() {P2IE &= ~BIT1;} // RTS Interrupt disable + #define com_RtsIes() {P2IES = 0x00; P2IES &=~ BIT1;} // RTS Interrupt edge select (is set when a low-high transition) + + // UART status bits + #define uart_RtsStatus() ((P2IN & BIT1)==BIT1) + + // UART port select + #define uart_TxdSel() {P8SEL |= BIT3;} // assign P3.3 to UCA0TXD + #define uart_RxdSel() {P8SEL |= BIT2;} // assign P3.4 to UCA0RXD + + // UART Register and bit abstractions + #define TX_RX_PORT_SEL ( P8SEL ) + #define TX_RX_PORT_DIR ( P8DIR ) + #define TX_PORT_BIT ( BIT2 ) + #define RX_PORT_BIT ( BIT3 ) + #define UCA_CTRL_REGISTER ( UCA1CTL1 ) + #define UCA_CTRL0_REGISTER ( UCA1CTL0 ) + #define UCA_BAUD_CTRL_REGISTER ( UCA1BRW ) + #define UCA_MOD_CTRL_REGISTER ( UCA1MCTL ) + #define UCA_IE_REGISTER ( UCA1IE ) + #define UCA_STATUS_REGISTER ( UCA1STAT ) + #define UCA_INTERRUPT_FLAG_REGISTER ( UCA1IFG ) + #define UCA_TX_BUF ( UCA1TXBUF ) + #define UCA_RX_BUF ( UCA1RXBUF ) + + #define UCA_BR0 ( UCA1BR0 ) + #define UCA_BR1 ( UCA1BR1 ) + + #define RTS_PORT_OUT ( P2OUT ) + #define RTS_PORT_DIR ( P2DIR ) + #define RTS_PORT_BIT ( BIT1 ) + + #define RTS_PULLDOWN_OUT ( P2OUT ) + #define RTS_PULLDOWN_REN ( P2REN ) + #define RTS_PULLDOWN_BIT ( BIT1 ) + #define rtsSetPullDownDir() (P2DIR |= BIT1) +// CHECKME: Bit is set in both cases + #define rtsClearPullDownDir() (P2DIR |= BIT1) + #define RTS_PULLUP_REN ( P2REN ) + #define RTS_PULLUP_OUT ( P2OUT ) + #define RTS_PULLUP_BIT ( BIT1 ) + #define rtsSetPullUpDir() (P2DIR |= BIT1) + + #define CTS_PORT_OUT ( P9OUT ) + #define CTS_PORT_DIR ( P9DIR ) + #define CTS_PORT_REN ( P9REN ) + #define CTS_PORT_BIT ( BIT5 ) +#endif + +#define IO_CONFIG_HIGH_Z_UART 0x0 +#define IO_CONFIG_UART 0x1 +#define IO_CONFIG_I2C 0x2 + +#define COM_SIGNATURE 0xACDCACDCul + +#ifdef MSP_FET + #define COM_FIFOSIZE 256ul +#endif + +#ifdef eZ_FET + #define COM_FIFOSIZE 64ul +#endif + +//UART commands +#define COM_CLOSE 9620ul +#define UART_NO_HANDSHAKE 9621ul +#define UART_NO_HANDSHAKE_PARITY_EVEN 9625ul +#define UART_HANDSHAKE 9622ul +#define COM_POWER_UP 9623ul +#define COM_POWER_DOWN 9624ul + +#define PARITY_EVEN 1 +#define PARITY_NONE 0 + +// BSL Commands +#define BSL_UART_INVOKE_SEQUENCE 9601ul +#define BSL_UART_SEQUENCE 9602ul +#define BSL_DISABLE 8001ul +#define BSL_MAX_DATA_LENGTH (260*2) +#define BSL_I2C_INVOKE_SEQUENCE1 100000ul +#define BSL_I2C_INVOKE_SEQUENCE2 400000ul +#define BSL_I2C_INVOKE_SEQUENCE3 100001ul +#define BSL_I2C_INVOKE_SEQUENCE4 400001ul +#define BSL_I2C_SEQUENCE1 100002ul +#define BSL_I2C_SEQUENCE2 400002ul + +struct COM_INFOS +{ + short (*comGetLayerVersion)(void); + short (*comConfig)(unsigned long Baudrate, unsigned long MCLK_Frequency, unsigned short); + short (*comTransmit)(void); + short (*comReceive)(unsigned char character); + void (*comClose)(void); + void (*comSetHil)(edt_common_methods_t*); + void (*comSetDcdc)(DCDC_INFOS_t*); + void (*comSetUSB)(FET_USB_INFOS_t*); + void (*comLoop)(void); + short (*comConfigMode)(unsigned long Baudrate); + short (*comSetCts)(void); + short (*comClearCts)(void); + void (*comSetRts)(void); + short (*comGetLayerVersionCmp)(void); +}; +typedef struct COM_INFOS COM_INFOS_t; + +short COM_BASE_GetLayerVersion(); +short COM_BASE_GetLayerVersionCmp(); +short COM_BASE_Config(unsigned long Baudrate, unsigned long MCLK_Frequency, + unsigned short fetType); +short COM_BASE_Receive(unsigned char character); +void COM_BASE_Init(COM_INFOS_t* uartInfos_Pointer); +void COM_BASE_SetHil(edt_common_methods_t* hil_Pointers); +void COM_BASE_SetDcdc(DCDC_INFOS_t* dcdc_Pointers); +void COM_BASE_SetUsb(FET_USB_INFOS_t* usb_Pointers); +void COM_BASE_Close(); +void COM_BASE_Loop(); + +#endif diff --git a/Bios/src/uart/Uart/FetUart.c b/Bios/src/uart/Uart/FetUart.c new file mode 100644 index 0000000..b126a28 --- /dev/null +++ b/Bios/src/uart/Uart/FetUart.c @@ -0,0 +1,362 @@ +/* +* FetUart.c +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- FetUart.c -----*/ +#include "hw_compiler_specific.h" + +#include "msp430.h" +#include "../FetCom.h" +#include "USB_API/USB_Common/types.h" // Basic Type declarations + +static unsigned char RtsReady = 0; +static unsigned short HandshakeOn = 0; + +static FET_USB_INFOS_t UsbPointers_; +static unsigned long UartPreviousBaudrate = 0; + +static unsigned short *Semaphore_Add = (unsigned short*)COM_SEMAPHOREADRESS; + +static unsigned short parityEven = 0; + +short Uart_SetCts() +{ + uart_SetCtsBit(); + *Semaphore_Add = 1; + return (1); +} + +short Uart_ClearCts() +{ + uart_ClearCtsBit(); // clear CTS + *Semaphore_Add = 0; + return (0); +} + +// init function for UART port pins +// reset all portpins +void Uart_PortsHds() // with handshake +{ + uart_CtsOut(); // CTS output + Uart_ClearCts(); // clear CTS + uart_RtsIn(); // RTS input3 + + //uart_RtsRen(); // enable pull up resistor on RTS + uart_TxdSel(); + uart_RxdSel(); +} + +void Uart_EnableRtsPullUp() +{ + RTS_PULLUP_REN |= RTS_PULLUP_BIT; + RTS_PULLUP_OUT |= RTS_PULLUP_BIT; + rtsSetPullUpDir(); +} + +void UART_DisableHandshake() +{ + HandshakeOn = 0; + RtsReady = 1; + com_RtsInterruptDisable(); + Uart_EnableRtsPullUp(); +} + +void UART_EnableHandshake() +{ + HandshakeOn = 1; + RtsReady = 0; + com_RtsIes(); // RTS Interrupt edge select + com_RtsIe(); // RTS Interrupt enable + com_RtsIfgClear(); // RTS Interrupt flag clear + com_RtsIfgSet(); // RTS Interrupt flag set (required for sending first byte) +} + +// initilaize UART functions +void Uart_Init(unsigned short mode, unsigned short parity) +{ + if(mode == UART_NO_HANDSHAKE) + { + UART_DisableHandshake(); + } + if(mode == UART_HANDSHAKE) + { + UART_EnableHandshake(); + } + // Ports configuration + Uart_PortsHds(); + UCA_IE_REGISTER |= UCRXIE; // enable USCIAx interrupt + + parityEven = parity; +} + +void Uart_SetUsb(FET_USB_INFOS_t* usb_Pointers) +{ + UsbPointers_ = *usb_Pointers; +} + +void Uart_Close() +{ + TX_RX_PORT_SEL &= ~( TX_PORT_BIT | RX_PORT_BIT ); // deassign IO-Ports from UCAxTXD, UCAxRxD + TX_RX_PORT_DIR &= ~( TX_PORT_BIT | RX_PORT_BIT ); + // set RTS as input + RTS_PORT_OUT &= ~RTS_PORT_BIT; + RTS_PORT_DIR &= ~RTS_PORT_BIT; + // set CTS as input + CTS_PORT_OUT &= ~CTS_PORT_BIT; + CTS_PORT_DIR &= ~CTS_PORT_BIT; + CTS_PORT_REN &= ~CTS_PORT_BIT; + + com_RtsIfgClear(); +} + +void UART_SetRts() +{ + RtsReady = 1; +} + +// configuration function for UART settings +// UART will be configure automatically about COM channel configuration +short Uart_Config(unsigned long UartBaudrate) +{ + Uart_ClearCts(); + if(UartBaudrate != UartPreviousBaudrate) // baudrate is changed ? + { + UCA_CTRL_REGISTER |= UCSWRST; // Put state maschine reset + UCA_CTRL_REGISTER |= UCSSEL__SMCLK; // clock source: SMCLK + + if(UartBaudrate == 4800) + { + #ifdef eZ_FET + UCA_BR0 = 0x45; + UCA_BR1 = 0x1; + UCA_MOD_CTRL_REGISTER = 0x80 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x1e; + UCA_BR1 = 0x1; + UCA_MOD_CTRL_REGISTER = 0xC0 + UCOS16; + #endif + } + if(UartBaudrate == 9600) + { + #ifdef eZ_FET + UCA_BR0 = 0xA2; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xC0 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x8F; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xE0 + UCOS16; + #endif + } + else if(UartBaudrate == 14400) + { + #ifdef eZ_FET + UCA_BR0 = 0x6C; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x80 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x5F; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x90 + UCOS16; + #endif + } + else if(UartBaudrate == 19200) + { + #ifdef eZ_FET + UCA_BR0 = 0x51; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x60 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x47; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xF0 + UCOS16; + #endif + } + else if(UartBaudrate == 28800) + { + #ifdef eZ_FET + UCA_BR0 = 0x36; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x40 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x2F; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x50 + UCOS16; + #endif + } + else if(UartBaudrate == 38400) + { + #ifdef eZ_FET + UCA_BR0 = 0x28; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xB0 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x23; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x80 + UCOS16; + #endif + } + else if(UartBaudrate == 56000) + { + #ifdef eZ_FET + UCA_BR0 =0x1B; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xE0 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x18; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x40 + UCOS16; + #endif + } + else if(UartBaudrate == 57600) + { + #ifdef eZ_FET + UCA_BR0 = 0x1B; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x20 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x17; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xA0 + UCOS16; + #endif + } + else if(UartBaudrate == 115200) + { + #ifdef eZ_FET + UCA_BR0 = 0xD; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x90 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0xB; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xD0 + UCOS16; + #endif + } + else if(UartBaudrate == 256000) + { + #ifdef eZ_FET + UCA_BR0 = 0x6; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0x4 + UCOS16; + #endif + #ifdef MSP_FET + UCA_BR0 = 0x5; + UCA_BR1 = 0x0; + UCA_MOD_CTRL_REGISTER = 0xE0 + UCOS16; + #endif + } + + if(parityEven == PARITY_EVEN) + { + UCA_CTRL0_REGISTER |= UCPEN | UCPAR; + } + else + { + UCA_CTRL0_REGISTER &= ~(UCPEN | UCPAR); + UCA_CTRL_REGISTER = 0; + UCA_CTRL_REGISTER |= UCSSEL__SMCLK; // clock source: SMCLK + } + + UCA_CTRL_REGISTER &=~ UCSWRST; // Initialize USCI state machine + UCA_IE_REGISTER |= UCRXIE; // enable USCIAx interrupt + + UartPreviousBaudrate = UartBaudrate; + } + Uart_SetCts(); + return (0); +} + +short Uart_GetRts() +{ + if(uart_RtsStatus()) // get RTS status from Target + { + return (1); + } + else + { + return (0); + } +} + +short Uart_NotBusy() +{ + if((UCA_STATUS_REGISTER & UCBUSY) == UCBUSY) // when busy: + { + return (0); // return 0 + } + return (1); // else return 1 +} + +short Uart_TxEmpty() +{ + // UCTXIFG is set when UCAxTXBUF empty + if(UCTXIFG == (UCTXIFG & UCA_INTERRUPT_FLAG_REGISTER)) + { + return (1); // empty + } + return (0); // not empty +} + +short Uart_Send() +{ + BYTE BytesInUsbBuffer = UsbPointers_.FetUSB_bytesInUSBBuffer(CDC0_DATA_INTERFACE); + if(BytesInUsbBuffer) + { + if(Uart_NotBusy() && Uart_TxEmpty() && RtsReady) + { + if(HandshakeOn == 1) + { + // just check for toggle of RTS line if Handshake is used. + RtsReady = 0; + } + // Start USB to UART bridge communication ---------------------------------- + BYTE uartDataToSend = 0; + UsbPointers_.FetUSB_receiveData(&uartDataToSend, 1 , CDC0_DATA_INTERFACE); + UCA_TX_BUF = uartDataToSend; + + } + } + return 0; +} diff --git a/Bios/src/uart/Uart/Uart.h b/Bios/src/uart/Uart/Uart.h new file mode 100644 index 0000000..5ddd5b1 --- /dev/null +++ b/Bios/src/uart/Uart/Uart.h @@ -0,0 +1,51 @@ +/* +* Uart.h +* +* Base class for all memory classes. +* +* Copyright (C) 2007 - 2011 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. +*/ + +/*----- Uart.h -----*/ +#ifndef Uart_H +#define Uart_H + +void Uart_SetUsb(FET_USB_INFOS_t* usb_Pointers); +short Uart_Send(); +void Uart_Close(); +void Uart_Init(unsigned short mode, unsigned short parity); +short Uart_Config(unsigned long UartBaudrate); +void UART_SetRts(); +short Uart_SetCts(); +short Uart_ClearCts(); + +#endif diff --git a/Bios/src/uart/cstartup_uart.s43 b/Bios/src/uart/cstartup_uart.s43 new file mode 100644 index 0000000..ae18c18 --- /dev/null +++ b/Bios/src/uart/cstartup_uart.s43 @@ -0,0 +1,453 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ + +// +// There are two libraries provided with compilers from IAR Systems, +// CLib and DLib. This file is designed to work with both libraries. +// Some parts of it is DLib-specific. However, those parts will not +// be included when building an application using CLib. +// + +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization +// IGNORE_DATA16_DATA -- To remove segment initialization of DATA16 data +// IGNORE_DATA20_DATA -- To remove segment initialization of DATA20 data +// IGNORE_RAMFUNC_INIT -- To remove segment initialization of ramfunc code +// DISABLE_WATCHDOG -- To disable the watchdog +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// +// Note: To disable the watchdog, a device-specific header file will +// be included. +// + +#include "macros.m43" +#include "cfi.m43" + +#ifdef DISABLE_WATCHDOG +#include "msp430.h" +#endif + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + // The CPU40 warning is issued when a Jxx instruction is place + // at the end of a segment part. However, this case is safe, + // as we have control of what will be placed right after the + // instruction. + SUPPRESS_CPU40_WARNING + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:CONST:NOROOT + RSEG CODE_I:DATA:NOROOT + RSEG CODE_ID:CONST:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:CONST:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + RSEG DATA16_N +saved_stack DS 2 + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: This is excluded by default. Please define + // DISABLE_WATCHDOG to include it. + // + +#ifdef DISABLE_WATCHDOG + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + + // -------------------- + // Initialize SP to point to the top of the stack. + // + + MOV SP, saved_stack + + pushx R4 + pushx R5 + pushx R6 + pushx R7 + pushx R8 + pushx R9 + pushx R10 + pushx R11 + pushx R12 + pushx R13 + pushx R14 + pushx R15 + + //MOV #SFE(CSTACK), SP + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + + + // -------------------- + // Initialize code for __ramfunc functions. + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy_ramfunc + +?cstart_init_copy_ramfunc: + +#ifndef IGNORE_RAMFUNC_INIT + +#ifndef REGISTER_MODEL_REG20 + + MOV #SFB CODE_I, CW0 + MOV #SFB CODE_ID, CW1 + + MOV #sizeof CODE_I, CW2 + + XCALL #__data16_memcpy + +#else // MSP430X with 20 bit pointers. + + EXTERN __data20_memcpy + + MOVA #SFB CODE_I, CW0 + MOVA #SFB CODE_ID, CW1 + MOV.W #LWRD(sizeof CODE_I), L1L + MOV.W #HWRD(sizeof CODE_I), L1H + + XCALL #__data20_memcpy + + +#endif // REGISTER_MODEL_REG20 + +#endif // IGNORE_RAMFUNC_INIT + + + // -------------------- + // Initialize data16 + // + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + EXTERN __data16_memzero + +?cstart_init_zero: + MOV #SFB DATA16_Z, CW0 + MOV #sizeof DATA16_Z, CW1 + + XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy + +#endif // IGNORE_DATA16_DATA + + + // -------------------- + // Data20 + // + +#if __CORE__==__430X_CORE__ + + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy + +#endif // IGNORE_DATA16_DATA + +#endif // MSP430X + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN COM_BASE_Init + EXTERN exit + +?cstart_call_main: + + popx R15 + popx R14 + popx R13 + popx R12 + popx R11 + popx R10 + popx R9 + popx R8 + popx R7 + popx R6 + popx R5 + popx R4 + + //XCALL #_hil_startUp + movx.a #COM_BASE_Init, PC + MOV saved_stack,SP + //XRET // indicates that the normal + //XCALL #exit + + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC32 __program_start + + ENDMOD + + +// --------------------------------------------------------- +// ?CPU30_OFFSET +// +// The compiler compensates for the CPU30 hardware bug by adding or +// subtracting the symbol ?CPU30_OFFSET from certain immediates. Here, +// it is defined to the default value zero (0), for when the device is +// not affected by CPU30. If the device is affected, the value must be +// set to two (2) using a linker command line override: +// +// -D?CPU30_OFFSET=2. +// +// The override is normally placed in the device-specific .xcl file. + + MODULE ?cpu30_offset + + PUBLIC ?CPU30_OFFSET + +?CPU30_OFFSET EQU 0 + + ENDMOD + + END diff --git a/Bios/src/up/core_Image_V3.h b/Bios/src/up/core_Image_V3.h deleted file mode 100644 index 6e49331..0000000 --- a/Bios/src/up/core_Image_V3.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * core_image_V3.h - * - * Copyright (C) 2007 - 2011 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. - */ - -/* http://srecord.sourceforge.net/ */ -const unsigned short coreImage[] = -{ -0xF57C, 0xE7A0, 0xFB2E, 0xEFBE, 0xFB3C, 0xFAF2, 0xF96C, 0xF466, 0xF948, -0xF9D2, 0xF836, 0xF5D6, 0xF30C, 0xFA30, 0xFAE0, 0xF9F2, 0xF9B2, 0xF990, -0xF85E, 0xF748, 0x1000, 0x18FF, 0x2500, 0xDFFF, 0xFDFA, 0xFDFF, 0x1000, -0x18FF, 0x2500, 0xDFFF, 0x1000, 0x10FF, 0x0200, 0x09FF, 0x1100, 0x18FF, -0x0100, 0x0080, 0x0040, 0x0001, 0x1C7C, 0x2142, 0x8205, 0x0000, 0x0000, -0x0101, 0x0101, 0x1C74, 0xDFFE, 0xFDDA, 0xFFFF, 0xFFFF, 0x0000, 0x0100, -0xFFFF, 0xFFFF, 0x0000, 0x0100, 0xFFFF, 0xFFFF, 0x0000, 0x0100, 0xFFFF, -0xFFFF, 0x0000, 0x0100, 0x1B90, 0x1C7C, 0x4031, 0x24E0, 0x403C, 0x1A2A, -0x403D, 0x0252, 0x12B0, 0xFABC, 0x403C, 0x1A00, 0x403D, 0xE05E, 0x403E, -0x002A, 0x12B0, 0xFB5E, 0x12B0, 0xF7E2, 0x12B0, 0xFB52, 0x120A, 0x120B, -0x120D, 0x120C, 0x120F, 0x120E, 0xD0F2, 0x0040, 0x0021, 0xD3D2, 0x1B5C, -0xB0F2, 0x00A0, 0x0072, 0x2002, 0x434E, 0x3C01, 0x435E, 0x934E, 0x2405, -0x403C, 0x8006, 0x12B0, 0xF8AE, 0x3D46, 0x425E, 0x0076, 0x4EC2, 0x1C73, -0x407F, 0x0010, 0x421D, 0x1B82, 0x4D6D, 0xF07D, 0x00FC, 0x9F4D, 0x2016, -0x907E, 0x0011, 0x2008, 0xB3E2, 0x1C74, 0x2802, 0x12B0, 0xFB12, 0x43C2, -0x1C74, 0x3D2E, 0x907E, 0x0013, 0x2003, 0x42F2, 0x1C74, 0x3D28, 0x9F4E, -0x200A, 0x4FC2, 0x1C78, 0x3D23, 0x9FC2, 0x1C78, 0x2004, 0xDFC2, 0x1C73, -0x43C2, 0x1C78, 0x403A, 0x1A2A, 0x4A6F, 0xB3DF, 0x1A30, 0x2805, 0x403C, -0x8009, 0x12B0, 0xF8AE, 0x3D11, 0x4A6F, 0x5F0F, 0x938F, 0x1A3A, 0x2015, -0x40B2, 0x000A, 0x1B5A, 0x4382, 0x1A44, 0x425E, 0x1C73, 0xB35E, 0x2806, -0x532E, 0x4A6F, 0x5F0F, 0x4E8F, 0x1A3E, 0x3C06, 0x503E, 0x0003, 0x4A6F, -0x5F0F, 0x4E8F, 0x1A3E, 0x4A6F, 0x5F0F, 0x90BF, 0x0104, 0x1A3A, 0x2C37, -0x425E, 0x1C73, 0x4E4D, 0x4A6F, 0x5F0F, 0xB39F, 0x1A3A, 0x2807, 0x108D, -0xDD82, 0x1B88, 0xE292, 0x1B88, 0x1A44, 0x3C02, 0x4D82, 0x1B88, 0x4A6F, -0x5F0F, 0x4F1D, 0x1A32, 0x4A6F, 0x5F0F, 0x4F1C, 0x1A3A, 0x4C0B, 0x531B, -0x4B8F, 0x1A3A, 0x5C0D, 0x4ECD, 0x0000, 0x4A6E, 0x5E0E, 0x4A6F, 0x5F0F, -0x9F9E, 0x1A3A, 0x1A3E, 0x2CC9, 0x4382, 0x1B5A, 0x93B2, 0x1A44, 0x20A0, -0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x0091, 0x0001, 0x203A, 0x434E, -0x3C06, 0x403C, 0x800A, 0x12B0, 0xF8AE, 0x3CB5, 0x435E, 0x934E, 0x20AC, -0xB3E2, 0x1A4C, 0x2BFA, 0x421F, 0x1B52, 0x4F5E, 0x0002, 0xF07E, 0x003F, -0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9F5E, 0x0002, 0x23ED, 0x421F, 0x1B52, -0x93CF, 0x0003, 0x2007, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x92EF, 0x0000, -0x2810, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, 0x0004, -0x0003, 0x23D7, 0xF0F2, 0x00F8, 0x1A4C, 0x4382, 0x1B5E, 0x3C80, 0xF0F2, -0x00F8, 0x1A4C, 0x3C7C, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x0092, -0x0001, 0x4A6F, 0x2039, 0x5F0F, 0x4F1F, 0x1A32, 0x93CF, 0x0002, 0x2010, -0x435C, 0x12B0, 0xF9F2, 0x434C, 0x12B0, 0xF9B2, 0x43C2, 0x1C70, 0x434C, -0x12B0, 0xF1E8, 0x12B0, 0xF27C, 0x12B0, 0xF886, 0x3C5D, 0x434E, 0x3C01, -0x435E, 0x934E, 0x2058, 0x425E, 0x1A4C, 0xF07E, 0x0003, 0x907E, 0x0003, -0x23F6, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, 0x0002, -0x0002, 0x23EC, 0x421B, 0x1B52, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x9FDB, -0x0004, 0x0003, 0x23E2, 0xC3E2, 0x1A4C, 0x3C3A, 0x5F0F, 0x4F1F, 0x1A32, -0x93CF, 0x0002, 0x200B, 0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x90FF, 0x008B, -0x0001, 0x2003, 0x12B0, 0xF27C, 0x3C2F, 0x4A6F, 0xD3DF, 0x1A30, 0x53D2, -0x1A2A, 0x93E2, 0x1A2A, 0x2821, 0x43C2, 0x1A2A, 0x3C1E, 0x40B2, 0x8003, -0x1A42, 0x4A6F, 0x5F0F, 0x4F1B, 0x1A32, 0x4A6F, 0x5F0F, 0x5F1B, 0x1A3E, -0xEB92, 0xFFFF, 0x1A44, 0xE3B2, 0x1A44, 0x43A2, 0x1B84, 0x43D2, 0x1C75, -0x4A6F, 0x5F0F, 0x4F1F, 0x1A32, 0x4FD2, 0x0002, 0x1C76, 0x40B2, 0x1A42, -0x1B86, 0x4A6F, 0x5F0F, 0x438F, 0x1A3A, 0x4382, 0x1A44, 0xC0F2, 0x0040, -0x0021, 0xC3D2, 0x1B5C, 0x413E, 0x413F, 0x413C, 0x413D, 0x413B, 0x413A, -0x1300, 0x43C2, 0x0022, 0x43C2, 0x002A, 0x43C2, 0x001A, 0x43C2, 0x001E, -0x43C2, 0x0032, 0x43C2, 0x0036, 0x43C2, 0x0026, 0x43C2, 0x002E, 0x43C2, -0x001B, 0x43C2, 0x001F, 0x43C2, 0x0033, 0x43C2, 0x0037, 0x43C2, 0x0021, -0x43C2, 0x0029, 0x43C2, 0x0019, 0x43C2, 0x001D, 0x43C2, 0x0031, 0x43C2, -0x0035, 0xC0F2, 0x0080, 0x0057, 0x430F, 0x3C05, 0x4303, 0x533E, 0x930E, -0x23FC, 0x531F, 0x903F, 0x00FF, 0x2C07, 0xB3E2, 0x0002, 0x2804, 0xC3E2, -0x0002, 0x437E, 0x3FF3, 0xB3E2, 0x0002, 0x2C66, 0xD0F2, 0x0040, 0x001E, -0xC3E2, 0x0002, 0xD0F2, 0x0088, 0x0058, 0xD0F2, 0x0020, 0x0032, 0xD0F2, -0x0020, 0x0033, 0x40B2, 0x1B00, 0x1B76, 0x40B2, 0x00B7, 0x1B78, 0x43C2, -0x1C72, 0xC0F2, 0x0020, 0x0021, 0xD0F2, 0x0040, 0x0021, 0xD0F2, 0x0060, -0x0022, 0x43C2, 0x002A, 0xD0F2, 0x0030, 0x001B, 0xD0F2, 0x0010, 0x001A, -0xD0F2, 0x003F, 0x001D, 0xD0F2, 0x003F, 0x001E, 0xD0F2, 0x000B, 0x0032, -0x40B2, 0x1C71, 0x1B68, 0x43D2, 0x1B6A, 0x40B2, 0x1C71, 0x1B72, 0x43E2, -0x1B74, 0x430F, 0x3C02, 0x4303, 0x531F, 0x933F, 0x23FC, 0xC0F2, 0x0040, -0x001E, 0x40B2, 0x1C73, 0x1B82, 0x40B2, 0x1C74, 0x1A00, 0x40B2, 0xFF45, -0x1B7E, 0x40B2, 0x0200, 0x1B80, 0x40B2, 0x000C, 0x1B7A, 0x4382, 0x1B7C, -0x4382, 0x0182, 0x421C, 0x1B76, 0x421D, 0x1B78, 0x403E, 0x0320, 0x430F, -0x12B0, 0xF710, 0x533C, 0x4C82, 0x0192, 0x40B2, 0x02D6, 0x0180, 0x3C75, -0xC0F2, 0x0040, 0x0019, 0xD0F2, 0x0080, 0x0057, 0xD0F2, 0x0040, 0x0057, -0xC032, 0x0020, 0x430F, 0xC3E2, 0x0002, 0x437E, 0x3C02, 0x4303, 0x533E, -0x930E, 0x23FC, 0xB3E2, 0x0002, 0x2802, 0x430F, 0x3C01, 0x531F, 0x903F, -0x000A, 0x2BEF, 0xD3E2, 0x0000, 0xD0F2, 0x00C0, 0x0058, 0x40B2, 0x1200, -0x1B76, 0x40B2, 0x007A, 0x1B78, 0x40F2, 0x0057, 0x1C72, 0x40F2, 0x00FC, -0x0021, 0x40F2, 0x0003, 0x0022, 0xC0F2, 0x0020, 0x0021, 0xD0F2, 0x0040, -0x0021, 0xD0F2, 0x0060, 0x0022, 0xD0F2, 0x0060, 0x0029, 0xD0F2, 0x0060, -0x002A, 0xD0F2, 0x0030, 0x001B, 0xD0F2, 0x0010, 0x001A, 0xD0F2, 0x0015, -0x001D, 0xD0F2, 0x007D, 0x001E, 0xD0F2, 0x000B, 0x0032, 0x40B2, 0x0021, -0x1B68, 0x43D2, 0x1B6A, 0x40B2, 0x0021, 0x1B72, 0x43E2, 0x1B74, 0x40B2, -0x1C73, 0x1B82, 0x40B2, 0x1C74, 0x1A00, 0x40B2, 0xFF55, 0x1B7E, 0x40B2, -0x0140, 0x1B80, 0x40B2, 0x0007, 0x1B7A, 0x4382, 0x1B7C, 0x4382, 0x0182, -0x40B2, 0x270F, 0x0192, 0x40B2, 0x01D6, 0x0180, 0xD0F2, 0x0040, 0x0019, -0xD232, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C0A, 0x433B, -0x4306, 0x9CD2, 0x0001, 0x1A2B, 0x2003, 0x93C2, 0x1A2C, 0x380A, 0x4CD2, -0x0001, 0x1A2B, 0x4C5F, 0x0004, 0x4F82, 0x1A2E, 0xD392, 0x1B9C, 0x3C02, -0xC392, 0x1B9C, 0x93CC, 0x0002, 0x3803, 0xD3A2, 0x1B9C, 0x3C02, 0xC3A2, -0x1B9C, 0x4C08, 0x5328, 0x48E2, 0x1A2C, 0x93C2, 0x1C70, 0x2005, 0x434C, -0x12B0, 0xF9F2, 0x43D2, 0x1C70, 0x90FA, 0x0081, 0x0001, 0x2044, 0xB392, -0x1B9C, 0x2806, 0x4A19, 0x0004, 0x432C, 0x1292, 0xE01A, 0x3C02, 0x4219, -0x1A2E, 0x9309, 0x2004, 0x4A0C, 0x12B0, 0xE900, 0x4C06, 0x9306, 0x202F, -0x407D, 0x0093, 0x486C, 0x1292, 0xE000, 0x90B2, 0x0064, 0x1C66, 0x2802, -0x4382, 0x1C66, 0x421F, 0x1C66, 0x4F0E, 0x531E, 0x4E82, 0x1C66, 0x5F0F, -0x498F, 0x1B9E, 0x4982, 0x1C68, 0x421F, 0x1A26, 0x9F19, 0x0006, 0x2C6B, -0x421F, 0x1B9A, 0x5909, 0x5909, 0x590F, 0x4F1F, 0x0002, 0x930F, 0x2462, -0x421C, 0x1B9C, 0x128F, 0x4C0B, 0x930C, 0x205C, 0x1292, 0xE002, 0x403B, -0x8000, 0x3C57, 0x460B, 0x3C55, 0x4A5E, 0x0001, 0x807E, 0x0051, 0x2436, -0x835E, 0x2439, 0x835E, 0x2440, 0x835E, 0x2443, 0x835E, 0x2446, 0x807E, -0x002D, 0x2409, 0x826E, 0x2413, 0x826E, 0x240B, 0x836E, 0x2415, 0x835E, -0x241B, 0x3C3C, 0x435D, 0x4A0C, 0x12B0, 0xED38, 0x4C0B, 0x3C36, 0x434D, -0x4A0C, 0x12B0, 0xED38, 0x4C0B, 0x3C30, 0x4A5C, 0x0006, 0x12B0, 0xF1E8, -0x4C0B, 0x3C2A, 0x4A5C, 0x0006, 0xD07C, 0x0040, 0x12B0, 0xF8FC, 0x4C0B, -0x3C22, 0x4A5C, 0x0006, 0xD07C, 0x0040, 0x12B0, 0xF8D6, 0x4C0B, 0x3C1A, -0x4A0C, 0x12B0, 0xF6C8, 0x4C0B, 0x3C15, 0x4A0C, 0x12B0, 0xEA2A, 0x4C0B, -0x931C, 0x200F, 0x12B0, 0xF7B2, 0x3C0C, 0x4A0C, 0x12B0, 0xF07C, 0x4C0B, -0x3C07, 0x4A0C, 0x12B0, 0xF4C6, 0x4C0B, 0x3C02, 0x12B0, 0xF62C, 0x903B, -0x8000, 0x2423, 0x930B, 0x380B, 0x407D, 0x0091, 0x486C, 0x1292, 0xE000, -0x4B0C, 0x1292, 0xE008, 0x1292, 0xE002, 0x3C16, 0x407D, 0x0092, 0x486C, -0x1292, 0xE000, 0x4B0C, 0x1292, 0xE008, 0x903B, 0x8002, 0x2009, 0x425C, -0x1A2C, 0x535C, 0xF07C, 0x003F, 0x2001, 0x435C, 0x1292, 0xE008, 0x1292, -0xE002, 0x430C, 0x4030, 0xFAD4, 0x120A, 0x120B, 0x403E, 0x1A46, 0x4E6F, -0xB3DF, 0x1A4C, 0x2CA4, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x90FF, 0x0093, -0x0001, 0x4E6F, 0x2407, 0x5F0F, 0x4F1F, 0x1B52, 0xC0FF, 0x0080, 0x0002, -0x3C18, 0x5F0F, 0x4F1F, 0x1B52, 0x93CF, 0x0002, 0x3803, 0x93C2, 0x1C7A, -0x240F, 0x93F2, 0x1C7A, 0x2403, 0x53D2, 0x1C7A, 0x3C02, 0x43D2, 0x1C7A, -0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x42DF, 0x1C7A, 0x0003, 0x4E6F, 0x5F0F, -0x4F1D, 0x1A4E, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4DCF, 0x0000, 0x4E6F, -0x5F0F, 0x4F1F, 0x1B52, 0xB3DF, 0x0000, 0x2C0E, 0x4E6F, 0x5F0F, 0x4F1D, -0x1B52, 0x4E6F, 0x5F0F, 0x4F1C, 0x1A4E, 0x531C, 0x4C8F, 0x1A4E, 0x5C0D, -0x43CD, 0x0000, 0x430D, 0x430C, 0x3C11, 0x4C0A, 0x5A0A, 0x4E6F, 0x5F0F, -0x4F0B, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, 0x5B0F, -0x5F0A, 0xEA1D, 0x1A50, 0x531C, 0x4E6F, 0x5F0F, 0x4F1F, 0x1A4E, 0x531F, -0xC312, 0x100F, 0x9F0C, 0x2BE6, 0xE33D, 0x4E6F, 0x5F0F, 0x4F1B, 0x1A4E, -0x100B, 0x5B0B, 0x4E6F, 0x5F0F, 0x4F0A, 0x5F0F, 0x5F0F, 0x5F0F, 0x5F0F, -0x5F0F, 0x5F0F, 0x5F0F, 0x5A0F, 0x5F0B, 0x4D8B, 0x1A52, 0x4E6F, 0xD3DF, -0x1A4C, 0x4E6F, 0xC2FF, 0x1A4C, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x93CF, -0x0002, 0x3802, 0x43C2, 0x1C7A, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x90FF, -0x0093, 0x0001, 0x2003, 0x4E6F, 0xD3EF, 0x1A4C, 0x4E6F, 0x5F0F, 0x4F1C, -0x1A4E, 0x503C, 0x0003, 0x12B0, 0xFA12, 0x53D2, 0x1A46, 0x93C2, 0x1A46, -0x2402, 0x43C2, 0x1A46, 0x12B0, 0xFB12, 0x430C, 0x413B, 0x413A, 0x4130, -0x120A, 0x430A, 0x93CC, 0x0006, 0x2034, 0x407D, 0x0093, 0x4C5C, 0x0002, -0x1292, 0xE000, 0x930C, 0x3829, 0x421A, 0xE008, 0x421F, 0x1A26, 0x4F1C, -0x0002, 0x128A, 0x421F, 0x1A26, 0x4F1C, 0x0004, 0x128A, 0x421C, 0x1B7E, -0x128A, 0x421C, 0x1B80, 0x128A, 0x432D, 0x403C, 0xFDD8, 0x1292, 0xE006, -0x432D, 0x403C, 0xFDD8, 0x1292, 0xE006, 0x432C, 0x128A, 0x403C, 0x0102, -0x128A, 0x421C, 0x1B7A, 0x421D, 0x1B7C, 0x1292, 0xE00A, 0x431A, 0x3C56, -0x403A, 0xFFFD, 0x3C53, 0x93DC, 0x0006, 0x201B, 0x421F, 0x1A26, 0x938F, -0x0006, 0x2413, 0x407D, 0x0093, 0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, -0x3808, 0x421F, 0x1A26, 0x4F1C, 0x0006, 0x1292, 0xE008, 0x431A, 0x3C3B, -0x403A, 0xFFFC, 0x3C38, 0x403A, 0xFFFE, 0x3C35, 0x93EC, 0x0006, 0x2020, -0x407D, 0x0093, 0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, 0x3815, 0x3C0D, -0x4A0C, 0x1292, 0xE008, 0x421E, 0x1B9A, 0x4A0F, 0x5F0F, 0x5F0F, 0x5F0E, -0x4E2C, 0x1292, 0xE008, 0x531A, 0x421F, 0x1A26, 0x9F1A, 0x0006, 0x2BEE, -0x431A, 0x3C15, 0x403A, 0xFFFB, 0x3C12, 0x90FC, 0x0003, 0x0006, 0x200E, -0x407D, 0x0091, 0x4C5C, 0x0002, 0x1292, 0xE000, 0x930C, 0x3804, 0x1292, -0xE002, 0x403A, 0xFFFA, 0x12B0, 0xFA98, 0x931A, 0x2004, 0x403A, 0x8000, -0x1292, 0xE002, 0x4A0C, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, 0x1209, -0x1206, 0x4C18, 0x0004, 0x4809, 0x5C19, 0x0008, 0x8329, 0x4336, 0x93D2, -0x1C7B, 0x2076, 0x403B, 0xF522, 0x480C, 0x128B, 0x834C, 0x2407, 0x835C, -0x2408, 0x835C, 0x2409, 0x835C, 0x240A, 0x3C0A, 0xF038, 0xFE00, 0x3C07, -0xF038, 0xFF00, 0x3C04, 0xF038, 0xFF80, 0x3C01, 0xC318, 0x490C, 0x128B, -0x834C, 0x2407, 0x835C, 0x2408, 0x835C, 0x2409, 0x835C, 0x240A, 0x3C0A, -0xF039, 0xFE00, 0x3C07, 0xF039, 0xFF00, 0x3C04, 0xF039, 0xFF80, 0x3C01, -0xC319, 0x490C, 0x128B, 0x4C4C, 0x5C0C, 0x4C1F, 0xE048, 0x5F0F, 0x5F09, -0x4036, 0xFFFE, 0xB318, 0x2C3E, 0x9908, 0x2C3C, 0xB392, 0x012C, 0x2FFD, -0x40B2, 0xA593, 0x012A, 0x40B2, 0xA500, 0x012C, 0x4316, 0x3C0A, 0x907A, -0x0003, 0x2002, 0x43B8, 0x0000, 0x5A0A, 0x4A1F, 0xE048, 0x5F0F, 0x5F08, -0x9908, 0x2C1F, 0x480C, 0x128B, 0x4C4A, 0x480C, 0x12B0, 0xF922, 0x934C, -0x240F, 0x934A, 0x2404, 0x935A, 0x2402, 0x936A, 0x23E6, 0x40B2, 0xA502, -0x0128, 0x43B8, 0x0000, 0xB392, 0x012C, 0x2FFD, 0x3FE2, 0x40B2, 0xA500, -0x0128, 0x40B2, 0xA510, 0x012C, 0x4036, 0xFFFE, 0x40B2, 0xA500, 0x0128, -0x40B2, 0xA510, 0x012C, 0x460C, 0x4030, 0xFAD4, 0x120A, 0x120B, 0x1208, -0x1209, 0x8031, 0x0010, 0x434A, 0xC0F2, 0x0040, 0x0021, 0xC3D2, 0x1B5C, -0x3C20, 0x535A, 0x936A, 0x2801, 0x434A, 0x9A4E, 0x241A, 0x4A4B, 0xB3DB, -0x1A30, 0x2BF6, 0x403D, 0x0014, 0x434C, 0x12B0, 0xF85E, 0x4A4D, 0x403C, -0x1A2A, 0x1292, 0xE00C, 0x4AC2, 0x1C79, 0x5B0B, 0x4B1C, 0x1A32, 0x12B0, -0xE5B6, 0x425A, 0x1C79, 0x4A4F, 0xC3DF, 0x1A30, 0x93C2, 0x1C75, 0x240F, -0x421E, 0x1B86, 0x421D, 0x1B84, 0x425C, 0x1C76, 0x12B0, 0xF67A, 0x43C2, -0x1C75, 0xC0F2, 0x0040, 0x0021, 0xC3D2, 0x1B5C, 0x434B, 0x3C3F, 0x4B48, -0x5808, 0x5808, 0x5808, 0x481F, 0x1A06, 0x421E, 0x1A26, 0x9E1F, 0x0006, -0x2C33, 0x421E, 0x1B9A, 0x5F0F, 0x5F0F, 0x5F0E, 0x4E19, 0x0002, 0x9309, -0x242A, 0x93C8, 0x1A0D, 0x2427, 0x485D, 0x1A0C, 0x485C, 0x1A0B, 0x1292, -0xE000, 0x930C, 0x381F, 0x481C, 0x1A08, 0x410F, 0x120F, 0x430F, 0x431E, -0x4C6D, 0x503D, 0xFFFD, 0x503C, 0x0006, 0x1292, 0xE00E, 0x403C, 0x0003, -0x1289, 0x5321, 0x931C, 0x2009, 0x1292, 0xE002, 0xB3D8, 0x1A0A, 0x2804, -0x485C, 0x1A0B, 0x12B0, 0xF1E8, 0x410C, 0x1292, 0xE010, 0x535B, 0x926B, -0x2BBF, 0x4A4E, 0x3F8F, 0x120A, 0x120B, 0x120D, 0x120C, 0x120F, 0x120E, -0x421F, 0x1A00, 0x93CF, 0x0000, 0x2404, 0x40F2, 0x000A, 0x1C74, 0x3C65, -0x403D, 0x1A47, 0x4D6C, 0x3C0A, 0x53D2, 0x1A47, 0x93C2, 0x1A47, 0x2402, -0x43C2, 0x1A47, 0x9CC2, 0x1A47, 0x2457, 0x4D6F, 0xB3DF, 0x1A4C, 0x2BF2, -0x4D6E, 0x5E0E, 0x4D6F, 0x5F0F, 0x9F9E, 0x1A4E, 0x1A48, 0x4D6F, 0x2C0F, -0x5F0F, 0x4F1E, 0x1B52, 0x4D6F, 0x5F0F, 0x4F1D, 0x1A48, 0x4D0A, 0x531A, -0x4A8F, 0x1A48, 0x5D0E, 0x4EE2, 0x0077, 0x3C3B, 0xC3DF, 0x1A4C, 0x4D6F, -0x5F0F, 0x438F, 0x1A48, 0x4D6C, 0x4D6F, 0xB3EF, 0x1A4C, 0x2C02, 0x4382, -0x1B5E, 0x53D2, 0x1A47, 0x93C2, 0x1A47, 0x2402, 0x43C2, 0x1A47, 0x4D6F, -0xB3DF, 0x1A4C, 0x281C, 0x4D6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F6E, 0x4D6F, -0x5F0F, 0x9F1E, 0x1A48, 0x2812, 0x4D6F, 0x5F0F, 0x4F1E, 0x1B52, 0x4D6F, -0x5F0F, 0x4F1A, 0x1A48, 0x4A0B, 0x531B, 0x4B8F, 0x1A48, 0x5A0E, 0x4EE2, -0x0077, 0x40B2, 0x0032, 0x1B5E, 0x4D6F, 0xB3DF, 0x1A4C, 0x2C03, 0x9CC2, -0x1A47, 0x23D2, 0x413E, 0x413F, 0x413C, 0x413D, 0x413B, 0x413A, 0x1300, -0x120A, 0x120B, 0x1208, 0x1209, 0x4C08, 0x4D4A, 0x4309, 0x3C01, 0x5319, -0x9229, 0x2C0C, 0x490F, 0x5F0F, 0x5F0F, 0x5F0F, 0x9C9F, 0x0004, 0x1A06, -0x23F5, 0x9CDF, 0x0002, 0x1A0B, 0x23F1, 0x4309, 0x3C01, 0x5319, 0x9229, -0x2C07, 0x490F, 0x5F0F, 0x5F0F, 0x5F0F, 0x93BF, 0x1A06, 0x23F6, 0x9229, -0x2C47, 0x5909, 0x5909, 0x5909, 0x90FC, 0x0006, 0x0000, 0x282B, 0x4C6B, -0x535B, 0x4B0C, 0x12B0, 0xF386, 0x4C89, 0x1A08, 0x930C, 0x241F, 0x430F, -0x3C08, 0x480E, 0x5F0E, 0x491D, 0x1A08, 0x5F0D, 0x4EED, 0x0000, 0x531F, -0x9B0F, 0x2BF6, 0xF35A, 0x4AC9, 0x1A0A, 0x485E, 0x0002, 0xD07E, 0x0040, -0x4EC9, 0x1A0B, 0x40F9, 0x0093, 0x1A0C, 0x4899, 0x0004, 0x1A06, 0x43D9, -0x1A0D, 0x431C, 0x3C1A, 0x403C, 0xFFFC, 0x3C17, 0x4389, 0x1A08, 0xF35A, -0x4AC9, 0x1A0A, 0x4C5E, 0x0002, 0xD07E, 0x0040, 0x4EC9, 0x1A0B, 0x40F9, -0x0093, 0x1A0C, 0x4C99, 0x0004, 0x1A06, 0x43D9, 0x1A0D, 0x431C, 0x3C02, -0x403C, 0xFFFD, 0x4030, 0xFAD6, 0x120D, 0x120C, 0x120F, 0x120E, 0x90B2, -0x000E, 0x011E, 0x205F, 0xD232, 0x93A2, 0x1B5A, 0x2806, 0xB3D2, 0x1B5C, -0x2C03, 0x53B2, 0x1B5A, 0x3C09, 0x9392, 0x1B5A, 0x2006, 0x4382, 0x1B5A, -0x403C, 0x8004, 0x12B0, 0xF8AE, 0x93A2, 0x1B5E, 0x2805, 0x93C2, 0x1C74, -0x2002, 0x53B2, 0x1B5E, 0x425E, 0x1B62, 0x421F, 0x1B64, 0xC312, 0x100F, -0x921F, 0x1B66, 0x7F4F, 0xF35F, 0xF35E, 0xEF4E, 0x421F, 0x1B68, 0x2404, -0xD2DF, 0x1B6A, 0x0000, 0x3C03, 0xC2DF, 0x1B6A, 0x0000, 0x9382, 0x1B66, -0x2403, 0x53B2, 0x1B66, 0x3C06, 0xB3E2, 0x1B62, 0x2803, 0x4292, 0x1B64, -0x1B66, 0x425E, 0x1B6C, 0x421F, 0x1B6E, 0xC312, 0x100F, 0x921F, 0x1B70, -0x7F4F, 0xF35F, 0xF35E, 0xEF4E, 0x421F, 0x1B72, 0x2404, 0xD2DF, 0x1B74, -0x0000, 0x3C03, 0xC2DF, 0x1B74, 0x0000, 0x9382, 0x1B70, 0x2403, 0x53B2, -0x1B70, 0x3C06, 0xB3E2, 0x1B6C, 0x2803, 0x4292, 0x1B6E, 0x1B70, 0x413E, -0x413F, 0x413C, 0x413D, 0x1300, 0x120A, 0x8031, 0x0006, 0x410C, 0x403E, -0xE054, 0x403D, 0x0006, 0x12B0, 0xFB02, 0x12B0, 0xF7B2, 0x90B2, 0x2520, -0x251E, 0x2852, 0x90B2, 0xFDDA, 0x251E, 0x2C4E, 0x421F, 0x1A02, 0x90BF, -0x5137, 0x0000, 0x201F, 0x434A, 0x3C0F, 0x4A4F, 0x5F0F, 0x421E, 0x1A04, -0x5F0E, 0x93BE, 0x0000, 0x2006, 0x93BF, 0x2500, 0x2403, 0x4F9F, 0x2500, -0x24E0, 0x535A, 0x907A, 0x0010, 0x2BEE, 0x421D, 0x251E, 0x421E, 0x1B7A, -0x421F, 0x1B7C, 0x403C, 0xE000, 0x128D, 0x4C82, 0x1A26, 0x421F, 0x1A26, -0x930F, 0x2423, 0x4F92, 0x0008, 0x1B9A, 0x9382, 0x1B9A, 0x241D, 0x434A, -0x3C16, 0x421F, 0x1B9A, 0x4A4E, 0x5E0E, 0x5E0E, 0x5E0F, 0x93BF, 0x0000, -0x240C, 0x90BF, 0xFF00, 0x0000, 0x2808, 0x4AC1, 0x0004, 0x43C1, 0x0005, -0x434D, 0x410C, 0x12B0, 0xED38, 0x535A, 0x421F, 0x1A26, 0x9F1A, 0x0006, -0x2BE5, 0x430C, 0x3C01, 0x433C, 0x5031, 0x0006, 0x413A, 0x4130, 0x120A, -0x120B, 0x1208, 0x1209, 0x1206, 0x1207, 0x4C0B, 0x4D08, 0x430C, 0x9382, -0x1B54, 0x203B, 0x4309, 0x9809, 0x2C4E, 0x4036, 0x1A46, 0x466F, 0x5F0F, -0x90BF, 0x00FF, 0x1A4E, 0x281E, 0x466F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F5A, -0x0001, 0x466F, 0x5F0F, 0x4F1F, 0x1B52, 0x4F57, 0x0002, 0x466F, 0x5F0F, -0x4F1F, 0x1B52, 0xD0FF, 0x0080, 0x0002, 0x403D, 0x0014, 0x434C, 0x12B0, -0xF85E, 0x12B0, 0xE7A0, 0x4A4D, 0x474C, 0x12B0, 0xF57C, 0x466F, 0x5F0F, -0x539F, 0x1A4E, 0x4B07, 0x5907, 0x466F, 0x5F0F, 0x4F1E, 0x1B52, 0x466F, -0x5F0F, 0x5F1E, 0x1A4E, 0x47EE, 0x0000, 0x5319, 0x3FC6, 0x93B2, 0x1B54, -0x2413, 0x4309, 0x3C0B, 0x4B0F, 0x590F, 0x4217, 0x1B54, 0x5217, 0x1B58, -0x4FE7, 0x0000, 0x5319, 0x5392, 0x1B58, 0x9D09, 0x2C04, 0x9292, 0x1B56, -0x1B58, 0x2BEF, 0x4030, 0xFAD2, 0x120A, 0x120B, 0x1208, 0x1209, 0x433F, -0x93D2, 0x1C7B, 0x2054, 0xB392, 0x1B9C, 0x2828, 0x4C92, 0x0004, 0x1C6C, -0x421D, 0x1C6C, 0x4D0A, 0x5C1A, 0x0008, 0x4A82, 0x1C6E, 0x4D82, 0x1C6A, -0x4C0B, 0x503B, 0x000C, 0x4C6E, 0x503E, 0xFFF5, 0xC312, 0x100E, 0x5E0E, -0x4B08, 0x5E08, 0xB31D, 0x2C0C, 0x9A0D, 0x2C0A, 0x40B2, 0xA593, 0x012A, -0x40B2, 0xA500, 0x012C, 0x40B2, 0xA540, 0x0128, 0x3C0D, 0x403F, 0xFFFD, -0x3C0A, 0x4C0B, 0x522B, 0x4C6E, 0x503E, 0xFFFD, 0xC312, 0x100E, 0x5E0E, -0x4B08, 0x5E08, 0x933F, 0x201D, 0x421C, 0x1C6A, 0x12B0, 0xF522, 0x3C07, -0x4BB9, 0x0000, 0x4A5F, 0xE05A, 0x5F0F, 0x5F82, 0x1C6A, 0x4219, 0x1C6A, -0x9219, 0x1C6E, 0x2C0B, 0x980B, 0x2C09, 0x490C, 0x12B0, 0xF522, 0x4C4A, -0x490C, 0x12B0, 0xF80C, 0x934C, 0x23E9, 0x431F, 0x4F0C, 0x4030, 0xFAD6, -0x120A, 0x120B, 0x1208, 0x1209, 0x4C0A, 0x4D0B, 0x4348, 0x3C11, 0x4849, -0x5909, 0x403C, 0x0102, 0x12B0, 0xF386, 0x4C89, 0x1A36, 0x9389, 0x1A36, -0x2002, 0x12B0, 0xFB20, 0x4999, 0x1A36, 0x1A32, 0x5358, 0x9368, 0x2BED, -0x4348, 0x3C04, 0x40B2, 0x1A50, 0x1B52, 0x4358, 0x9348, 0x27FA, 0x43C2, -0x0070, 0x43D2, 0x0070, 0xD0F2, 0x00C0, 0x0004, 0xD0F2, 0x0010, 0x0070, -0x93C2, 0x0057, 0x3803, 0x407E, 0x0020, 0x3C02, 0x407E, 0x0010, 0x4EC2, -0x0071, 0x421C, 0x1B76, 0x421D, 0x1B78, 0x4A0E, 0x4B0F, 0x12B0, 0xF710, -0x4CC2, 0x0074, 0x108C, 0x4CC2, 0x0075, 0x42D2, 0x1C72, 0x0073, 0xC3D2, -0x0070, 0x43C2, 0x1C74, 0xD0F2, 0x00C0, 0x0000, 0x93C2, 0x0076, 0xC0F2, -0x0040, 0x0021, 0xC3D2, 0x1B5C, 0x4030, 0xFAD6, 0x120A, 0x120B, 0x1208, -0x934C, 0x2024, 0x430A, 0x430B, 0x922B, 0x2C3E, 0x4B08, 0x5808, 0x5808, -0x5808, 0x481F, 0x1A06, 0x933F, 0x2416, 0x421E, 0x1B9A, 0x5F0F, 0x5F0F, -0x5F0E, 0x90BE, 0xFF00, 0x0000, 0x2C0D, 0x481C, 0x1A08, 0x930C, 0x2402, -0x12B0, 0xF3F8, 0x4388, 0x1A08, 0x43B8, 0x1A06, 0x43D8, 0x1A0D, 0x531A, -0x531B, 0x3FDE, 0x430B, 0x3C01, 0x531B, 0x922B, 0x2C07, 0x4B0F, 0x5F0F, -0x5F0F, 0x5F0F, 0x9CCF, 0x1A0B, 0x23F6, 0x922B, 0x2C0F, 0x5B0B, 0x5B0B, -0x5B0B, 0x4B1C, 0x1A08, 0x930C, 0x2402, 0x12B0, 0xF3F8, 0x438B, 0x1A08, -0x43BB, 0x1A06, 0x43DB, 0x1A0D, 0x431A, 0x4A0C, 0x4030, 0xFAD8, 0x434F, -0xB0F2, 0x0040, 0x0000, 0x2804, 0xC0F2, 0x0040, 0x0000, 0x435F, 0x43C2, -0x1A2A, 0x434E, 0x3C13, 0x4E4D, 0x43CD, 0x1A30, 0x43C2, 0x1A2B, 0x43C2, -0x1A2C, 0x5D0D, 0x4D1C, 0x1A32, 0x43CC, 0x0000, 0x438D, 0x1A42, 0x438D, -0x1A3A, 0x438D, 0x1A3E, 0x535E, 0x936E, 0x2BEB, 0x4382, 0x1B5A, 0x403D, -0x012C, 0x42D2, 0x0076, 0x1C77, 0x42D2, 0x0076, 0x1C77, 0x42D2, 0x0076, -0x1C77, 0xC0F2, 0x0040, 0x0002, 0xF0F2, 0x000E, 0x0072, 0x434E, 0x3C02, -0x4303, 0x535E, 0x937E, 0x23FC, 0x533D, 0x930D, 0x2404, 0xB0F2, 0x0040, -0x0002, 0x2FE4, 0x934F, 0x2403, 0xD0F2, 0x0040, 0x0000, 0x4130, 0x120A, -0x120B, 0x4C0A, 0x430C, 0x421E, 0x1B8E, 0xB35E, 0x2421, 0x438A, 0x0000, -0x438A, 0x0002, 0x403B, 0xF836, 0x4A0C, 0x128B, 0x930C, 0x2402, 0x433C, -0x3C26, 0x4A0C, 0x531C, 0x128B, 0x930C, 0x2403, 0x403C, 0xFFFE, 0x3C1E, -0x4A0C, 0x532C, 0x128B, 0x930C, 0x2403, 0x403C, 0xFFFD, 0x3C16, 0x503A, -0x0003, 0x4A0C, 0x128B, 0x3C11, 0x9E82, 0x1B8C, 0x2C03, 0x403C, 0xFFFB, -0x3C0B, 0x4EBA, 0x0000, 0x4EBA, 0x0002, 0x52A2, 0x1B8E, 0x9292, 0x1B8E, -0x1B8C, 0x2C01, 0x431C, 0x413B, 0x413A, 0x4130, 0x120A, 0x531C, 0xC31C, -0x421E, 0x1A28, 0x421D, 0xE052, 0x8E0D, 0x4C0F, 0x522F, 0x9F0D, 0x280F, -0x43DE, 0x0000, 0x421F, 0x1A28, 0x5C0F, 0x522F, 0x4F82, 0x1A28, 0x4F8E, -0x0002, 0x421F, 0x1A28, 0x8C0F, 0x4F0C, 0x3C1C, 0x421F, 0xE050, 0x3C02, -0x4F1F, 0x0002, 0x9E0F, 0x2C14, 0x93CF, 0x0000, 0x23F9, 0x4F1D, 0x0002, -0x8F0D, 0x822D, 0x9C0D, 0x2BF3, 0x4F0A, 0x522A, 0x43DF, 0x0000, 0x4A0D, -0x5C0D, 0x4F0C, 0x12B0, 0xFA4C, 0x4A0C, 0x3C01, 0x430C, 0x413A, 0x4130, -0x120A, 0x421E, 0xE050, 0x4E0D, 0x930C, 0x2004, 0x3C2E, 0x4E0D, 0x4E1E, -0x0002, 0x921E, 0x1A28, 0x2C28, 0x4E0F, 0x522F, 0x9F0C, 0x23F6, 0x93CE, -0x0000, 0x2421, 0x4E1F, 0x0002, 0x921F, 0x1A28, 0x2C02, 0x4F0C, 0x3C01, -0x4E0C, 0x4C6A, 0x93CD, 0x0000, 0x2008, 0x934A, 0x2002, 0x4C1F, 0x0002, -0x4F8D, 0x0002, 0x4D0E, 0x3C07, 0x934A, 0x2003, 0x4C9E, 0x0002, 0x0002, -0x43CE, 0x0000, 0x929E, 0x1A28, 0x0002, 0x2002, 0x4E82, 0x1A28, 0x413A, -0x4130, 0x120A, 0x120B, 0x1208, 0x1209, 0x1206, 0x4C0A, 0x4D0B, 0x4E08, -0x4F09, 0x4116, 0x000C, 0x403E, 0x0006, 0x403D, 0x1B8A, 0x460C, 0x12B0, -0xFA80, 0x4296, 0x1B54, 0x000C, 0x4296, 0x1B56, 0x000E, 0x4A82, 0x1B8A, -0x4A0F, 0x5B0F, 0x4F82, 0x1B8C, 0x4A82, 0x1B8E, 0x9318, 0x240B, 0x9308, -0x2003, 0x43B2, 0x1B54, 0x3C02, 0x4882, 0x1B54, 0x4982, 0x1B56, 0x4382, -0x1B58, 0x430C, 0x4030, 0xFAD4, 0x120A, 0x120B, 0x1208, 0x4C0A, 0x4308, -0x430B, 0x90FA, 0x000B, 0x0000, 0x201A, 0x407D, 0x0093, 0x4A5C, 0x0002, -0x1292, 0xE000, 0x930C, 0x380F, 0x4A1B, 0x0004, 0x4B08, 0x5A18, 0x0008, -0x3C04, 0x4B2C, 0x1292, 0xE008, 0x532B, 0x980B, 0x2BFA, 0x403B, 0x8000, -0x3C05, 0x403B, 0x8007, 0x3C02, 0x403B, 0x800B, 0x903B, 0x8000, 0x2002, -0x1292, 0xE002, 0x4B0C, 0x4030, 0xFAD8, 0x434F, 0x434E, 0x3C01, 0x536E, -0x936E, 0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE03C, 0x2BF8, 0x9C8D, 0xE03E, -0x2BF5, 0x936E, 0x2C02, 0x436F, 0x3C11, 0x434E, 0x3C01, 0x536E, 0x926E, -0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE040, 0x2BF8, 0x9C8D, 0xE042, 0x2BF5, -0x926E, 0x2C02, 0x407F, 0x0003, 0x934F, 0x2006, 0x503C, 0xDB00, 0x903C, -0x00FF, 0x2C01, 0x435F, 0x4F4C, 0x4130, 0x403E, 0x1A46, 0x4E6F, 0xB0FF, -0x000B, 0x1A4C, 0x2403, 0x93A2, 0x1B5E, 0x2FF6, 0x4E6F, 0xB0FF, 0x000B, -0x1A4C, 0x2405, 0x12B0, 0xFB5A, 0x403C, 0x8007, 0x4130, 0x4E6F, 0x5F0F, -0x4F1F, 0x1B52, 0x4DCF, 0x0001, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x4CCF, -0x0002, 0x4E6F, 0x5F0F, 0x4F1F, 0x1B52, 0x43CF, 0x0003, 0x4E6F, 0x5F0F, -0x40BF, 0x0003, 0x1A4E, 0x430C, 0x4130, 0x120A, 0x8321, 0x4C0A, 0x430C, -0x421E, 0x1B8E, 0xB35E, 0x2411, 0x410C, 0x12B0, 0xF836, 0x416D, 0x930C, -0x2007, 0x410C, 0x12B0, 0xF836, 0x416F, 0x108F, 0x5F0D, 0x3C01, 0x433C, -0x4D8A, 0x0000, 0x3C0F, 0x9E82, 0x1B8C, 0x2C03, 0x403C, 0xFFFE, 0x3C09, -0x4EAA, 0x0000, 0x53A2, 0x1B8E, 0x9292, 0x1B8E, 0x1B8C, 0x2C01, 0x431C, -0x5321, 0x413A, 0x4130, 0x120A, 0x430F, 0x403F, 0xFDFC, 0x40B2, 0xA593, -0x012A, 0x40B2, 0xA500, 0x012C, 0x40B2, 0xA502, 0x0128, 0x43BF, 0x0000, -0xB392, 0x012C, 0x2FFD, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA510, 0x012C, -0x430A, 0x3C06, 0x403D, 0x001E, 0x434C, 0x12B0, 0xF990, 0x531A, 0x903A, -0x0064, 0x2BF7, 0x4382, 0x0120, 0x413A, 0x4130, 0x120A, 0x120B, 0x1208, -0x4D0A, 0x4E0B, 0x407D, 0x0092, 0x1292, 0xE000, 0x930C, 0x3819, 0x930B, -0x2004, 0x4A0C, 0x1292, 0xE008, 0x3C0F, 0x4308, 0x3C08, 0x480E, 0x5E0E, -0x4B0F, 0x5E0F, 0x4F2C, 0x1292, 0xE008, 0x5318, 0x9A08, 0x2C03, 0x9038, -0x007E, 0x2BF3, 0x1292, 0xE002, 0x430C, 0x3C01, 0x433C, 0x4030, 0xFAD8, -0x433F, 0x93CC, 0x0004, 0x2012, 0x43C2, 0x1C7B, 0x40B2, 0xA510, 0x012C, -0x12B0, 0xEEF0, 0x430C, 0x12B0, 0xF748, 0x434C, 0x12B0, 0xF9B2, 0x435C, -0x12B0, 0xF9F2, 0x430F, 0x3C0C, 0x93DC, 0x0004, 0x2009, 0x43D2, 0x1C7B, -0x403C, 0x001E, 0x12B0, 0xF748, 0x12B0, 0xF77E, 0x431F, 0x4F0C, 0x4130, -0x1209, 0x120A, 0x120B, 0x430A, 0x430B, 0x4039, 0x0020, 0x5C0C, 0x6D0D, -0x6A0A, 0x6B0B, 0x8E0A, 0x7F0B, 0x2804, 0xD31C, 0x5339, 0x23F6, 0x3C04, -0x5E0A, 0x6F0B, 0x5339, 0x23F1, 0x4A0E, 0x4B0F, 0x413B, 0x413A, 0x4139, -0x4130, 0xC232, 0x4303, 0x4C0F, 0x5F0F, 0x4F82, 0x1B64, 0x4C82, 0x1B66, -0x4F82, 0x1B6E, 0x4C82, 0x1B70, 0x930C, 0x2406, 0x40F2, 0x0003, 0x1B62, -0x43E2, 0x1B6C, 0x3C04, 0x43C2, 0x1B62, 0x43C2, 0x1B6C, 0xD232, 0x430C, -0x4130, 0x120A, 0x120B, 0x430A, 0x3C11, 0x4A0B, 0x5B0B, 0x5B0B, 0x5B0B, -0x4B1C, 0x1A08, 0x930C, 0x2402, 0x12B0, 0xF3F8, 0x438B, 0x1A08, 0x43BB, -0x1A06, 0x43DB, 0x1A0D, 0x531A, 0x922A, 0x3BED, 0x413B, 0x413A, 0x4130, -0x40B2, 0x1B90, 0x1A26, 0x4382, 0x1B9A, 0x434E, 0x3C0C, 0x4E4F, 0x5F0F, -0x421D, 0x1A04, 0x5F0D, 0x93BD, 0x0000, 0x2003, 0x40BF, 0xFB62, 0x24E0, -0x535E, 0x907E, 0x0010, 0x2BF1, 0x430C, 0x4130, 0x434C, 0x12B0, 0xFB4A, -0x12B0, 0xE386, 0x403C, 0x0800, 0x403D, 0x0007, 0x12B0, 0xF13A, 0x12B0, -0xEEF0, 0x434C, 0x12B0, 0xF9B2, 0x435C, 0x12B0, 0xF9F2, 0x4030, 0xEB3A, -0x434F, 0x434E, 0x3C01, 0x536E, 0x907E, 0x0006, 0x2C08, 0x4E4D, 0x5D0D, -0x9D1C, 0xE028, 0x2BF7, 0x9C8D, 0xE02A, 0x2BF4, 0x907E, 0x0006, 0x2C01, -0x435F, 0x4F4C, 0x4130, 0x430F, 0x9292, 0x1B8E, 0x1B8C, 0x2C02, 0x433F, -0x3C0B, 0x421E, 0x1B8E, 0x4EEC, 0x0000, 0x5392, 0x1B8E, 0x9292, 0x1B8E, -0x1B8C, 0x2C01, 0x431F, 0x4F0C, 0x4130, 0x936C, 0x2C10, 0x4C4C, 0x5C0C, -0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x938C, 0x1B66, 0x2007, 0x5D0D, 0x4D8C, -0x1B64, 0x4D8C, 0x1B66, 0xC3EC, 0x1B62, 0x430C, 0x4130, 0x403E, 0x0114, -0x430D, 0x403C, 0x1A46, 0x12B0, 0xFA68, 0x4382, 0x1B5E, 0x43C2, 0x1C73, -0x434E, 0x3C04, 0x40B2, 0x1A50, 0x1B52, 0x435E, 0x934E, 0x27FA, 0x4130, -0x120A, 0x4C0A, 0xC0F2, 0x0040, 0x0000, 0x12B0, 0xF27C, 0x4A82, 0x1B84, -0x43D2, 0x1C75, 0x4382, 0x1B86, 0x43C2, 0x1C76, 0xD0F2, 0x0040, 0x0000, -0x413A, 0x4130, 0x907C, 0x0040, 0x240E, 0x430F, 0x3C01, 0x531F, 0x922F, -0x3409, 0x4F0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x9CCE, 0x1A0B, 0x23F6, 0x43DE, -0x1A0D, 0x431C, 0x4130, 0x907C, 0x0040, 0x240E, 0x430F, 0x3C01, 0x531F, -0x922F, 0x3409, 0x4F0E, 0x5E0E, 0x5E0E, 0x5E0E, 0x9CCE, 0x1A0B, 0x23F6, -0x43CE, 0x1A0D, 0x431C, 0x4130, 0x434F, 0x434E, 0x3C01, 0x536E, 0x926E, -0x2C08, 0x4E4D, 0x5D0D, 0x9D1C, 0xE034, 0x2BF8, 0x9C8D, 0xE036, 0x2BF5, -0x926E, 0x2C01, 0x435F, 0x4F4C, 0x4130, 0x120A, 0x4C0A, 0x403E, 0x0006, -0x4C0D, 0x403C, 0x1B8A, 0x12B0, 0xFA80, 0x4A92, 0x000C, 0x1B54, 0x4A92, -0x000E, 0x1B56, 0x430C, 0x413A, 0x4130, 0x4D4D, 0x5D0D, 0x5D0C, 0x4C1E, -0x0008, 0x4E82, 0x1B8A, 0x4E6F, 0x5F0E, 0x4E82, 0x1B8C, 0x421F, 0x1B8A, -0x522F, 0x4F82, 0x1B8E, 0x430C, 0x4130, 0x936C, 0x2C0D, 0x4C4C, 0x5C0C, -0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x5D0D, 0x4D8C, 0x1B64, 0x4D8C, 0x1B66, -0x43EC, 0x1B62, 0x430C, 0x4130, 0x936C, 0x2C0C, 0x4C4C, 0x5C0C, 0x4C0F, -0x5C0C, 0x5C0C, 0x5F0C, 0x43CC, 0x1B62, 0x438C, 0x1B64, 0x438C, 0x1B66, -0x430C, 0x4130, 0x425F, 0x1A46, 0x5F0F, 0x4F1F, 0x1B52, 0x4F5E, 0x0001, -0x425F, 0x1A46, 0x5F0F, 0x4F1F, 0x1B52, 0x4CCF, 0x0001, 0x4E4C, 0x4130, -0x936C, 0x2C0C, 0x4C4C, 0x5C0C, 0x4C0F, 0x5C0C, 0x5C0C, 0x5F0C, 0x43DC, -0x1B62, 0x438C, 0x1B64, 0x438C, 0x1B66, 0x430C, 0x4130, 0x425F, 0x1A47, -0x5F0F, 0x438F, 0x1A48, 0x425F, 0x1A46, 0x5F0F, 0x4C8F, 0x1A4E, 0x425F, -0x1A46, 0xD3DF, 0x1A4C, 0x4130, 0x8321, 0x4C0D, 0x433C, 0x3C01, 0x533D, -0x930D, 0x2405, 0x410C, 0x12B0, 0xF836, 0x933C, 0x23F8, 0x5321, 0x4130, -0x4C1F, 0x0002, 0x4F0E, 0x8D0E, 0x903E, 0x0005, 0x2806, 0x4D8C, 0x0002, -0x43CD, 0x0000, 0x4F8D, 0x0002, 0x4130, 0x120A, 0x4C0A, 0x3C03, 0x4DCA, -0x0000, 0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, 0x413A, 0x4130, 0x120A, -0x4C0A, 0x3C03, 0x4DFA, 0x0000, 0x531A, 0x4E0F, 0x533E, 0x930F, 0x23F9, -0x413A, 0x4130, 0x430F, 0x3C02, 0x4303, 0x531F, 0x933F, 0x23FC, 0x4382, -0x0120, 0x4130, 0x3C02, 0xC3E2, 0x0002, 0xB3E2, 0x0002, 0x2FFB, 0xD3E2, -0x0000, 0x1300, 0x4C0F, 0x5D0F, 0x3C03, 0x43CC, 0x0000, 0x531C, 0x9F0C, -0x23FB, 0x4130, 0x4135, 0x4134, 0x4137, 0x4136, 0x4139, 0x4138, 0x413B, -0x413A, 0x4130, 0x3C04, 0x4DFC, 0x0000, 0x531C, 0x533E, 0x930E, 0x23FA, -0x430C, 0x4130, 0x120D, 0x120C, 0x422D, 0x410C, 0x12B0, 0xEFBE, 0x5221, -0x4130, 0x120C, 0x4EFC, 0x0000, 0x531C, 0x831D, 0x23FB, 0x413C, 0x4130, -0x40B2, 0x0032, 0x1B5E, 0xD0F2, 0x0080, 0x0002, 0x4130, 0x434C, 0x12B0, -0xF9F2, 0x435C, 0x12B0, 0xF9B2, 0x3FFF, 0x124C, 0x431D, 0x410C, 0x12B0, -0xEFBE, 0x5321, 0x4130, 0x120C, 0x432D, 0x410C, 0x12B0, 0xEFBE, 0x5321, -0x4130, 0x40B2, 0x5A80, 0x0120, 0x4130, 0x4030, 0xFB56, 0x4030, 0xFB64, -0x4030, 0xF886, 0x4030, 0xFA80, 0x1300, 0x3FFF, 0x000B, 0xEC42, 0xE0B0, -0xEE18, 0xFAAA, 0xE088, 0x000F, 0x2112, 0xFEDF, -}; - -const unsigned long coreImage_address[] = -{ -0x0000E000, 0x0000FDD8, 0x0000FDEA, 0x0000FDF2, 0x0000FDF6, -}; -const unsigned long coreImage_length_of_sections[] = -{ -0x00000DB3, 0x00000001, 0x00000002, 0x00000001, 0x00000005, -}; -const unsigned long coreImage_sections = 0x00000005; -const unsigned long coreImage_termination = 0x00000000; -const unsigned long coreImage_start = 0x0000E000; -const unsigned long coreImage_finish = 0x0000FE00; -const unsigned long coreImage_length = 0x00001E00; - -#define COREIMAGE_TERMINATION 0x00000000 -#define COREIMAGE_START 0x0000E000 -#define COREIMAGE_FINISH 0x0000FE00 -#define COREIMAGE_LENGTH 0x00001E00 -#define COREIMAGE_SECTIONS 0x00000005 diff --git a/Bios/tools/ModifyCore.pl b/Bios/tools/ModifyCore.pl deleted file mode 100644 index b5a20c8..0000000 --- a/Bios/tools/ModifyCore.pl +++ /dev/null @@ -1,129 +0,0 @@ -################################################################################ -#!/win32/perl/bin/perl # -#------------------------------------------------------------------------------# -# # -# Author: Patrick de Cesar Francisco # -# # -# # -# Copyright (C) 2012 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. # -# # -#------------------------------------------------------------------------------# -# Description: Create new directories. # -# Change the data inside files # -# Save the new file into the new directory # -#------------------------------------------------------------------------------# -################################################################################ - -# -- Use Modules --------------------------------------------------------------------------------------------------------- -use warnings; - -#public vars: - -$infile = "src/up/core_Image_V3.h"; -#$infile = "C:/MSP430/a0406322_V3DLL/msp430_tools/Projects/MSP430_DLLv3/Bios/src/up/core_Image_V3.h"; - -$output = "include/Core.h"; -#$output = "C:/MSP430/a0406322_V3DLL/msp430_tools/Projects/MSP430_DLLv3/Bios/include/Core.h"; - - -# -- Variables -------------------------------------------------------------------------------------------------------- -my $temp_text = ""; -my $string = ""; -my $add_this = " 0x2112,0xFEDF,\n"; - -my $lookfor_1 = "unsigned short"; -my $lookfor_variable_1 ="unsigned short" ; -my $change_variable_to_1 = "uint16_t"; - -my $lookfor_2 = "unsigned long"; -my $lookfor_variable_2 ="unsigned long" ; -my $change_variable_to_2 = "uint32_t"; - -# -- Routine prototypes ----------------------------------------------------------------------------------------------- -sub replace_string; -sub main(); - -# -- Routines --------------------------------------------------------------------------------------------------------- - -sub replace_string_1 -{ - $string = "@_"; - $string =~ s/$lookfor_variable_1/$change_variable_to_1/; - return($string); -} - -sub replace_string_2 -{ - $string = "@_"; - $string =~ s/$lookfor_variable_2/$change_variable_to_2/; - return($string); -} - -sub main() -{ - open FILE, $infile or die $!; - open OUTPUT_FILE, ">$output"; - - # Read data from file - my @lines = ; - - my $i; - my $temp_text = ''; - - for($i = 1; $i< @lines; $i=$i+1) - { - $temp_text = $lines[$i]; - - # perform variable change - if($temp_text =~ m/ ($lookfor_1) /) - { - $temp_text = replace_string_1($temp_text); - $lines[$i] = $temp_text; - } - if($temp_text =~ m/ ($lookfor_2) /) - { - $temp_text = replace_string_2($temp_text); - $lines[$i] = $temp_text; - } - - } - print OUTPUT_FILE @lines; - - # Save files - close (OUTPUT_FILE); - close (FILE); -} - -eval {main()}; -warn $@ if $@; - -# -- END ----------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Bios/tools/ModifyHal.pl b/Bios/tools/ModifyHal.pl deleted file mode 100644 index a290c62..0000000 --- a/Bios/tools/ModifyHal.pl +++ /dev/null @@ -1,128 +0,0 @@ -################################################################################ -#!/win32/perl/bin/perl # -#------------------------------------------------------------------------------# -# # -# Author: Patrick de Cesar Francisco # -# # -# # -# Copyright (C) 2012 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. # -# # -#------------------------------------------------------------------------------# -# Description: Create new directories. # -# Change the data inside files # -# Save the new file into the new directory # -#------------------------------------------------------------------------------# -################################################################################ - -# -- Use Modules --------------------------------------------------------------------------------------------------------- -use warnings; - -#public vars: - -$infile = "src/hal/UifHal.h"; -#$infile = "C:/MSP430/a0406322_V3DLL/msp430_tools/Projects/MSP430_DLLv3/Bios/src/up/core_Image_V3.h"; - -$output = "include/UifHal.h"; -#$output = "C:/MSP430/a0406322_V3DLL/msp430_tools/Projects/MSP430_DLLv3/Bios/include/Core.h"; - - -# -- Variables -------------------------------------------------------------------------------------------------------- -my $temp_text = ""; -my $string = ""; - -my $lookfor_1 = "unsigned short"; -my $lookfor_variable_1 ="unsigned short" ; -my $change_variable_to_1 = "uint16_t"; - -my $lookfor_2 = "unsigned long"; -my $lookfor_variable_2 ="unsigned long" ; -my $change_variable_to_2 = "uint32_t"; - -# -- Routine prototypes ----------------------------------------------------------------------------------------------- -sub replace_string; -sub main(); - -# -- Routines --------------------------------------------------------------------------------------------------------- - -sub replace_string_1 -{ - $string = "@_"; - $string =~ s/$lookfor_variable_1/$change_variable_to_1/; - return($string); -} - -sub replace_string_2 -{ - $string = "@_"; - $string =~ s/$lookfor_variable_2/$change_variable_to_2/; - return($string); -} - -sub main() -{ - open FILE, $infile or die $!; - open OUTPUT_FILE, ">$output"; - - # Read data from file - my @lines = ; - - my $i; - my $temp_text = ''; - - for($i = 1; $i< @lines; $i=$i+1) - { - $temp_text = $lines[$i]; - - # perform variable change - if($temp_text =~ m/ ($lookfor_1) /) - { - $temp_text = replace_string_1($temp_text); - $lines[$i] = $temp_text; - } - if($temp_text =~ m/ ($lookfor_2) /) - { - $temp_text = replace_string_2($temp_text); - $lines[$i] = $temp_text; - } - - } - print OUTPUT_FILE @lines; - - # Save files - close (OUTPUT_FILE); - close (FILE); -} - -eval {main()}; -warn $@ if $@; - -# -- END ----------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Bios/tools/convertEzFetTxt.bat b/Bios/tools/convertEzFetTxt.bat new file mode 100644 index 0000000..c43b57d --- /dev/null +++ b/Bios/tools/convertEzFetTxt.bat @@ -0,0 +1,73 @@ +REM convertEtFetTxt.bat +REM +REM Copyright (C) 2007 - 2013 Texas Instruments Incorporated - http://www.ti.com/ +REM +REM +REM Redistribution and use in source and binary forms, with or without +REM modification, are permitted provided that the following conditions +REM are met: +REM +REM Redistributions of source code must retain the above copyright +REM notice, this list of conditions and the following disclaimer. +REM +REM Redistributions in binary form must reproduce the above copyright +REM notice, this list of conditions and the following disclaimer in the +REM documentation and/or other materials provided with the +REM distribution. +REM +REM Neither the name of Texas Instruments Incorporated nor the names of +REM its contributors may be used to endorse or promote products derived +REM from this software without specific prior written permission. +REM +REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +REM A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +REM OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +REM SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +REM LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +REM DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +REM THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +REM (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +REM OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set "TMP=%1%\tools\tmp" +set "SED=%1%\tools\sed.exe" +set "SRECCAT=%1%\tools\srec_cat.exe" +set "SRC=%1\objects\image\%2.txt" +set "DST=%1\include\%2.h" +set "TMP_TXT=%TMP%\%2_tmp.txt" +set "TMP_HEADER=%TMP%\%2_tmp.h" + +if not exist %TMP% mkdir %TMP% +if not %ERRORLEVEL% == 0 ( + @echo "Failed creating tmp directory" + exit 1 +) + +%SRECCAT% %SRC% -guess -fill 0xFF -within %SRC% -guess -range-padding 2 -o %TMP_TXT% -ti_txt +if not %ERRORLEVEL% == 0 ( + @echo "Failed creating tmp file" + exit 1 +) + +%SRECCAT% %TMP_TXT% -guess -o %TMP_HEADER% -ca %2%Image -ow -c_comp +if not %ERRORLEVEL% == 0 ( + @echo "Failed creating header file" + exit 1 +) + +%SED% -i "s/unsigned short/uint16_t/g;s/unsigned long/uint32_t/g" %TMP_HEADER% +if not %ERRORLEVEL% == 0 ( + @echo "Failed patching type names" + exit 1 +) + +copy %TMP_HEADER% %DST% +if not %ERRORLEVEL% == 0 ( + @echo "Failed copying file" + exit 1 +) + +del %TMP_TXT% +del %TMP_HEADER% diff --git a/Bios/tools/uifbioscorePostBuild.bat b/Bios/tools/uifbioscorePostBuild.bat deleted file mode 100644 index 3a96e47..0000000 --- a/Bios/tools/uifbioscorePostBuild.bat +++ /dev/null @@ -1,18 +0,0 @@ -REM uifbioscorePostBuild.bat -REM FB 09/02/2011 - -set "PARAM_1=%1%" -set "SRECCAT=%1%\tools\srec_cat.exe" -set "UIFBIOSCORE_TXT=%1%\objects\image\UifBiosCore.txt" -set "UIFBIOSCORE_TMP_TXT=%1%\objects\image\UifBiosCore.tmp.txt" -set "COREIMAGE_H=%1%\src\up\core_Image_V3.h" -set "MODIFYCORE_PL=%1%\tools\ModifyCore.pl" - -REM converts UifBiosCore.txt to SRec C-Array in core_Image_V3.h, adds padding byte if necessary -%SRECCAT% %UIFBIOSCORE_TXT% -guess -fill 0xFF -within %UIFBIOSCORE_TXT% -guess -range-padding 2 -o %UIFBIOSCORE_TMP_TXT% -ti_txt -%SRECCAT% %UIFBIOSCORE_TMP_TXT% -guess -o %COREIMAGE_H% -ca coreImage -ow -c_comp - -REM replaces "unsigned short" and "unsigned long" with "uint16_t" and "uint32_t" in core_Image_V3.h -REM and copy it into \include\Core.txt, which is used for dll internal core update -cd "%1" -perl %MODIFYCORE_PL% diff --git a/Bios/tools/uifhalPostBuild.bat b/Bios/tools/uifhalPostBuild.bat deleted file mode 100644 index 949bc40..0000000 --- a/Bios/tools/uifhalPostBuild.bat +++ /dev/null @@ -1,19 +0,0 @@ -REM uifhalPostBuild.bat -REM DF 09/06/2011 - -set "PARAM_1=%1%" -set "SRECCAT=%1%\tools\srec_cat.exe" -set "UIFHAL_TXT=%1%\objects\image\UifHal.txt" -set "UIFHAL_TMP_TXT=%1%\objects\image\UifHal.tmp.txt" -set "UIFHAL_H=%1%\src\hal\UifHal.h" -set "MODIFYHAL_PL=%1%\tools\ModifyHal.pl" - -REM converts UifHal.txt to SRec C-Array in UifHal.h, adds padding byte if necessary -%SRECCAT% %UIFHAL_TXT% -guess -fill 0xFF -within %UIFHAL_TXT% -guess -range-padding 2 -o %UIFHAL_TMP_TXT% -ti_txt -%SRECCAT% %UIFHAL_TMP_TXT% -guess -o %UIFHAL_H% -ca halImage -ow -c_comp - -REM replaces "unsigned short" and "unsigned long" with "uint16_t" and "uint32_t" in UifHal.h -REM and copy it into \include\UifHal.txt, which is used for dll internal HAL update -cd %PARAM_1% -perl %MODIFYHAL_PL% - diff --git a/DLL430_v3.sln b/DLL430_v3.sln new file mode 100644 index 0000000..8dfedbd --- /dev/null +++ b/DLL430_v3.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.902 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DLL430_v3", "DLL430_v3\DLL430_v3.vcxproj", "{09C86548-E56B-439C-B8C8-6ADAA90ED37A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Debug|Win32.ActiveCfg = Debug|Win32 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Debug|Win32.Build.0 = Debug|Win32 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Debug|x64.ActiveCfg = Debug|x64 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Debug|x64.Build.0 = Debug|x64 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Release|Win32.ActiveCfg = Release|Win32 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Release|Win32.Build.0 = Release|Win32 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Release|x64.ActiveCfg = Release|x64 + {09C86548-E56B-439C-B8C8-6ADAA90ED37A}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {27BE52F9-E709-4206-B4D5-FF639536C52D} + EndGlobalSection +EndGlobal diff --git a/DLL430_v3/ArmReadonlyMemroyAccess.h b/DLL430_v3/ArmReadonlyMemroyAccess.h new file mode 100644 index 0000000..ee284e5 --- /dev/null +++ b/DLL430_v3/ArmReadonlyMemroyAccess.h @@ -0,0 +1,70 @@ +/* +* ArmReadonlyMemroyAccess.h +* +* Memory class for accessing ROM TLV data. +* +* Copyright (C) 2007 - 2011 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. +*/ + +#pragma once + +#include "ArmRandomMemoryAccess.h" + +namespace TI +{ + namespace DLL430 + { + class DeviceHandle; + class ArmReadonlyMemroyAccess : public ArmRandomMemoryAccess + { + public: + ArmReadonlyMemroyAccess( + MemoryArea::Name name, + DeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + MemoryManager* mm, + uint8_t psa) + : ArmRandomMemoryAccess(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) {} + + virtual bool isReadOnly() const OVERRIDE{ return true; } + + bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE{ return false; } + bool doWrite(uint32_t address, uint32_t value) OVERRIDE{ return false; } + }; + + } +} diff --git a/DLL430_v3/DLL430_v3_OS.def b/DLL430_v3/DLL430.def similarity index 66% rename from DLL430_v3/DLL430_v3_OS.def rename to DLL430_v3/DLL430.def index 7d8175d..9a3e5f1 100644 --- a/DLL430_v3/DLL430_v3_OS.def +++ b/DLL430_v3/DLL430.def @@ -7,6 +7,10 @@ EXPORTS ;; ;; from MSP430.h ;; +MSP430_LoadDeviceDb +MSP430_DumpDeviceDb +MSP430_ClearDeviceDb +MSP430_SetTargetArchitecture MSP430_Initialize MSP430_Close MSP430_GetJtagID @@ -30,21 +34,37 @@ MSP430_Error_Number MSP430_Error_String MSP430_GetNumberOfUsbIfs MSP430_GetNameOfUsbIf +MSP430_GetInterface_Type +MSP430_RegisterMessageCallback +MSP430_Autodetect +MSP430_GetFETName +MSP430_GetLaunchpadName +MSP430_HIL_TCLK_V3 ;; ;; from MSP430_HIL.h ;; MSP430_HIL_ResetJtagTap +MSP430_HIL_FuseCheck MSP430_HIL_Open +MSP430_HIL_Configure MSP430_HIL_Connect +MSP430_HIL_Connect_Entry_State MSP430_HIL_Close +MSP430_HIL_Bsl MSP430_HIL_JTAG_IR +MSP430_HIL_JTAG_IR4 MSP430_HIL_JTAG_DR MSP430_HIL_JTAG_DRX +MSP430_HIL_JTAG_IR_DRX MSP430_HIL_TCK MSP430_HIL_TMS MSP430_HIL_TDI MSP430_HIL_RST MSP430_HIL_TST +MSP430_HIL_DPACC +MSP430_HIL_APACC +MSP430_HIL_MEMAP +MSP430_HIL_TCLK_V3 ;; ;; from MSP430_Debug.h ;; @@ -66,15 +86,23 @@ MSP430_EEM_GetCombineBreakpoint MSP430_EEM_SetTrace MSP430_EEM_GetTrace MSP430_EEM_ReadTraceBuffer +MSP430_EEM_ReadTraceData MSP430_EEM_RefreshTraceBuffer MSP430_EEM_SetVariableWatch MSP430_EEM_SetVariable MSP430_EEM_GetVariableWatch MSP430_EEM_SetClockControl +MSP430_EEM_SetClockControl2 MSP430_EEM_GetClockControl +MSP430_EEM_GetClockControl2 MSP430_EEM_SetSequencer MSP430_EEM_GetSequencer MSP430_EEM_ReadSequencerState +MSP430_EEM_SetCycleCounterMode +MSP430_EEM_ConfigureCycleCounter +MSP430_EEM_ReadCycleCounterValue +MSP430_EEM_WriteCycleCounterValue +MSP430_EEM_ResetCycleCounter ;; ;; from MSP430_FET.h ;; @@ -88,3 +116,9 @@ MSP430_FET_GetFwVersion MSP430_FET_GetHwVersion MSP430_FET_FwUpdate MSP430_SET_SYSTEM_NOTIFY_CALLBACK +;; +;; from EnerygTrace.h +;; +MSP430_EnableEnergyTrace +MSP430_DisableEnergyTrace +MSP430_ResetEnergyTrace diff --git a/DLL430_v3/DLL430.rc b/DLL430_v3/DLL430.rc index 1b78fac..1ad668c 100644 --- a/DLL430_v3/DLL430.rc +++ b/DLL430_v3/DLL430.rc @@ -27,7 +27,7 @@ VALUE "OriginalFilename", "MSP430.dll" VALUE "ProductName", "MSP430 Dynamic Link Library" VALUE "ProductVersion", VERSION_STRING(VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH,VERSION_BUILD) - VALUE "BuildNumber", "0000" + VALUE "BuildNumber", "0000" END END BLOCK "VarFileInfo" diff --git a/DLL430_v3/DLL430_v3.vcxproj b/DLL430_v3/DLL430_v3.vcxproj new file mode 100644 index 0000000..275242d --- /dev/null +++ b/DLL430_v3/DLL430_v3.vcxproj @@ -0,0 +1,552 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {09C86548-E56B-439C-B8C8-6ADAA90ED37A} + DLL430_v3 + ManagedCProj + 10.0.17763.0 + + + + DynamicLibrary + MultiByte + false + v141 + + + DynamicLibrary + MultiByte + false + v141 + + + DynamicLibrary + false + MultiByte + false + v141 + + + DynamicLibrary + false + MultiByte + false + v141 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + MSP430 + MSP430 + MSP430 + MSP430 + false + false + false + false + + + $(IncludePath) + $(LibraryPath) + + + $(IncludePath) + $(LibraryPath) + + + $(IncludePath) + $(LibraryPath) + + + $(IncludePath) + $(LibraryPath) + + + + Disabled + $(ProjectDir)\src\TI\DLL430;$(ProjectDir)\src\TI\DLL430\EnergyTrace_TSPA;include;$(SolutionDir)\Bios\include;$(SolutionDir)\ThirdParty\BSL430_DLL;$(SolutionDir)\Thirdparty\include;C:\MSP430\boost\boost_1_67_0;s:\boost_1_67_0\boost_1_67_0 + _WINSOCK_DEPRECATED_NO_WARNINGS;DLL430_EXPORT;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + false + false + false + Sync + MultiThreadedDebug + true + Level3 + ProgramDatabase + Cdecl + Use + /Zm120 %(AdditionalOptions) + pch.h + true + false + EnableFastChecks + + + hidapid.lib;setupapi.lib;hid.lib;BSL430_DLLd.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(SolutionDir)$(Configuration);$(SolutionDir)ThirdParty\lib;%(AdditionalLibraryDirectories);C:\MSP430\boost\boost_1_67_0\stage\lib;s:\boost_1_67_0\boost_1_67_0\stage\lib + $(ProjectDir)/DLL430.def + true + true + true + true + false + $(OutDir)$(TargetName).lib + MachineX86 + + + + + Disabled + $(ProjectDir)\src\TI\DLL430;$(ProjectDir)\src\TI\DLL430\EnergyTrace_TSPA;include;$(SolutionDir)\Bios\include;$(SolutionDir)\ThirdParty\BSL430_DLL;$(SolutionDir)\Thirdparty\include;C:\MSP430\boost\boost_1_67_0;s:\boost_1_67_0\boost_1_67_0 + _WINSOCK_DEPRECATED_NO_WARNINGS;DLL430_EXPORT;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_WIN64_WINNT=0x0501;%(PreprocessorDefinitions) + false + false + false + Sync + MultiThreadedDebug + true + Level3 + ProgramDatabase + Cdecl + Use + /Zm120 %(AdditionalOptions) + pch.h + true + false + EnableFastChecks + + + hidapid.lib;setupapi.lib;hid.lib;BSL430_DLLd.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(SolutionDir)$(Configuration);$(SolutionDir)ThirdParty\lib64;%(AdditionalLibraryDirectories);C:\MSP430\boost\boost_1_67_0\stage\lib;s:\boost_1_67_0\boost_1_67_0\stage\lib + $(ProjectDir)/DLL430.def + true + true + true + true + false + $(OutDir)$(TargetName).lib + + + + + Full + Size + true + $(ProjectDir)\src\TI\DLL430;$(ProjectDir)\src\TI\DLL430\EnergyTrace_TSPA;include;$(SolutionDir)\Bios\include;$(SolutionDir)\ThirdParty\BSL430_DLL;$(SolutionDir)\Thirdparty\include;C:\MSP430\boost\boost_1_67_0;s:\boost_1_67_0\boost_1_67_0 + _WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;DLL430_EXPORT;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + Sync + MultiThreaded + true + Level3 + ProgramDatabase + true + /Zm120 %(AdditionalOptions) + Use + pch.h + false + false + true + false + + + hidapi.lib;hid.lib;setupapi.lib;BSL430_DLL.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(SolutionDir)$(Configuration);$(SolutionDir)ThirdParty\lib;%(AdditionalLibraryDirectories);C:\MSP430\boost\boost_1_67_0\stage\lib;s:\boost_1_67_0\boost_1_67_0\stage\lib + $(ProjectDir)/DLL430.def + false + true + true + true + $(OutDir)$(TargetName).lib + MachineX86 + Default + + + + + Full + Size + true + $(ProjectDir)\src\TI\DLL430;$(ProjectDir)\src\TI\DLL430\EnergyTrace_TSPA;include;$(SolutionDir)\Bios\include;$(SolutionDir)\ThirdParty\BSL430_DLL;$(SolutionDir)\Thirdparty\include;C:\MSP430\boost\boost_1_67_0;s:\boost_1_67_0\boost_1_67_0 + _WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;DLL430_EXPORT;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_WIN64_WINNT=0x0501;%(PreprocessorDefinitions) + Sync + MultiThreaded + true + Level3 + ProgramDatabase + true + /Zm120 %(AdditionalOptions) + Use + pch.h + false + false + true + false + + + hidapi.lib;hid.lib;setupapi.lib;BSL430_DLL.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(SolutionDir)$(Configuration);$(SolutionDir)ThirdParty\lib64;%(AdditionalLibraryDirectories);C:\MSP430\boost\boost_1_67_0\stage\lib;s:\boost_1_67_0\boost_1_67_0\stage\lib + $(ProjectDir)/DLL430.def + true + true + true + true + $(OutDir)$(TargetName).lib + Default + + + + + + + + + NotUsing + NotUsing + NotUsing + NotUsing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DLL430_v3/DLL430_v3.vcxproj.filters b/DLL430_v3/DLL430_v3.vcxproj.filters new file mode 100644 index 0000000..e4e9d85 --- /dev/null +++ b/DLL430_v3/DLL430_v3.vcxproj.filters @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DLL430_v3/DLL430_v3_OS.vcproj b/DLL430_v3/DLL430_v3_OS.vcproj deleted file mode 100644 index 4f1c2cc..0000000 --- a/DLL430_v3/DLL430_v3_OS.vcproj +++ /dev/null @@ -1,938 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DLL430_v3/include/DLL430/DeviceHandleManager.h b/DLL430_v3/include/DLL430/DeviceHandleManager.h deleted file mode 100644 index 6133263..0000000 --- a/DLL430_v3/include/DLL430/DeviceHandleManager.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * DeviceHandleManager.h - * - * Controls access to one or more DeviceHandles. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_DeviceHandleManager_H -#define DLL430_DeviceHandleManager_H - -#include -#include - -#include - -namespace TI -{ - namespace DLL430 - { - typedef DeviceChainInfo value_type; - typedef std::vector DeviceChainInfoList; - - class DLL430_SYMBOL DeviceHandleManager - { - public: - - virtual ~DeviceHandleManager () {}; - - /** \brief get a list of available devices - * - * The scans the system for connected and supported devices. The result - * is cached and reused on the next call if update is not true. - * - * \param update force rescanning - * \return pointer to the list - */ - virtual DeviceChainInfoList* getDeviceChainInfo (bool update = false) = 0; - - /** \brief create a new device handle instance - * - * This creates a new device handle. - * - * \param port the DeviceChainInfoList iterator of the selected port - * \param vcc optional parameter that sets the voltage (in mV) - * \return pointer to the API handle - */ - virtual DeviceHandle* createDeviceHandle (DeviceChainInfoList::iterator& device, uint32_t device_code) = 0; - - /** \brief destroy a given device handle - * - * \param handle the device handle to destroy - */ - virtual void destroyDeviceHandle (DeviceHandle*) = 0; - protected: - - private: - }; - - }; -}; - -#endif /* DLL430_DeviceHandleManager_H */ diff --git a/DLL430_v3/include/DLL430/FileFunc.h b/DLL430_v3/include/DLL430/FileFunc.h deleted file mode 100644 index d6db170..0000000 --- a/DLL430_v3/include/DLL430/FileFunc.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * FileFunc.h - * - * Base class for accesing code image files. - * - * Copyright (C) 2008 - 2011 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. - */ - -#include -#include - -#include - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_FileFunc_H -#define DLL430_FileFunc_H - -using namespace std; - -namespace TI -{ - namespace DLL430 - { - enum fileType - { - UNKNOWN = 0, // file type is unknown - TI_TXT = 1, // file type is ti-txt-file - INTEL_HEX = 2, // file type is intel-hex - FILE_ERROR = 3, // error detecting type: file corrupted or wrong file selected - }; - - class DLL430_SYMBOL FileFunc - { - public: - /** \brief readOpen - * - * open given file, test format and read it - * - * \param fname file name - * \param mode expected file mode ti-txt/intel - * \return -1 if reading was successful, else 0 - */ - virtual int readOpen(const char * fname, fileType mode)=0; - - /** \brief close - * - * close file - * - */ - virtual void close(void)=0; - - /** \brief test file type - * - * read first bytes to detect the file type - * - * \return file type ti-txt or intel-hex - */ - virtual fileType getFileType(void)=0; - - /** \brief read ti file - * - * read the file as ti-txt-file and copy data to internal buffer - * - * \return true if reading was successful, else false - */ - virtual int readTiFile(void)=0; - - /** \brief read intel hex file - * - * read the file as intel-hex-file and copy data to internal buffer - * - * \return true if reading was successful, else false - */ - virtual int readIntelFile(void)=0; - - /** \brief Read firmware from file - * - * \return true if reading was successful, else false - */ - virtual bool readFirmware(const char * fname)=0; - - /** \brief copy firmware buffer to segment array - * - * \return true if successful, else false - */ - virtual bool readFirmware(const unsigned char * data, size_t size)=0; - - virtual bool readFirmware(const uint16_t* data, const uint32_t* address, - const uint32_t* length, uint32_t sections) = 0; - - /** \brief print data segements to stdout - * - * \param fname file name - * \param buffer of values to write - * \param number of elements in buffer - * \param mode expected file mode ti-txt/intel - * \return true if write was successful, else false - */ - virtual bool printSeg(const char * fname, uint32_t * buffer, uint32_t start, size_t n, fileType type)=0; - - /** \brief return the number of segments in the current file - * - * returns the value of the counter of memory locations - * which are copied into the segemnt structure - * - * \return true if reading was successful, else false - */ - virtual size_t getNumberOfSegments() const = 0; - - /** \brief print data segements to stdout - * - */ - virtual void printSegs()=0; - - /** \brief verify segments - * - * activate verification on device - * - * \return 0 if reading was successful, else -1 - */ - virtual bool verify(uint32_t address, uint32_t* buffer, size_t count)=0; - }; - } -} - -#endif // DLL430_FileFunc_H diff --git a/DLL430_v3/include/DLL430/Log.h b/DLL430_v3/include/DLL430/Log.h deleted file mode 100644 index 9fa5e73..0000000 --- a/DLL430_v3/include/DLL430/Log.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Log.h - * - * Log handler interface. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_LOGGER_H -#define DLL430_LOGGER_H - -#include -namespace TI -{ - namespace DLL430 - { - /** \brief log target interface - * - * If you want to get log messages, create a class that - * implements this interface. - */ - class DLL430_SYMBOL LogTarget - { - public: - enum Severity { - FATAL = 0, /**< marks a fatal error, that cannot be recovered from */ - ERR = 1, /**< marks a non-fatal error */ - WARN = 2, /**< marks a warning */ - INFO = 3 /**< marks an informational message */ - }; - virtual ~LogTarget () {}; - - /** \brief called once for each message - * - * \param sev the log severity - * \param id the log id (no strict relationship to message!) - * \param message textural description - */ - virtual void log (Severity sev, unsigned int id, const char* message) = 0; - }; - - /** \brief register LogTarget instances to receive log messages */ - class DLL430_SYMBOL LogRegistry - { - public: - /** \brief register a class instance to call log() on - * - * \param target pointer to instance of a class that implements LogTarget - */ - virtual void registerLogTarget (LogTarget* target) = 0; - - /** \brief deregister a class instance - * - * \param target pointer to instance of a class that implements LogTarget - */ - virtual void deregisterLogTarget (LogTarget* target) = 0; - - protected: - virtual ~LogRegistry () {}; - }; - - }; -}; - -#endif /* DLL430_LOGGER_H */ diff --git a/DLL430_v3/include/DLL430/MemoryManager.h b/DLL430_v3/include/DLL430/MemoryManager.h deleted file mode 100644 index 6fcb5a9..0000000 --- a/DLL430_v3/include/DLL430/MemoryManager.h +++ /dev/null @@ -1,457 +0,0 @@ -/* - * MemoryManager.h - * - * Handles access to different memory modules by means of address. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_MEMORYMANAGER_H -#define DLL430_MEMORYMANAGER_H - -#include -#include - - -#include -namespace TI -{ - namespace DLL430 - { - enum MemoryError { MEMORY_NO_ERROR, MEMORY_READ_ERROR, MEMORY_WRITE_ERROR, MEMORY_LOCKED_ERROR, MEMORY_UNLOCK_ERROR }; - - /** \brief control a memory cache directly */ - class DLL430_SYMBOL MemoryCacheCtrl - { - public: - /** \brief virtual dtor. - * Else dtors of derived classes are never called - * - */ - virtual ~MemoryCacheCtrl () {}; - - /** \brief enable or disable a memory cache - * - * \param yes enable cache is true, else disable it - */ - virtual void enable (bool yes) = 0; - - /** \brief check if a cache is enabled - * - * \return true if the cache is enabled, else false - */ - virtual bool isEnabled () const = 0; - - /** \brief check if a address is currently in the cache - * - * \return true if the address has a currently valid cache value, else false - */ - virtual bool checkCache (uint32_t address) const = 0; - - /** \brief mark an address as dirty - * - * A dirty address will be written on the next flush() call. If the address - * has not a valid cache value, fill() will be called to achieve that. - * - * \param address the first address to mark - * \param count number of address to mark, starting with address - * \return true if all requested addresses were marked successfully, else false - */ - virtual bool markDirty (uint32_t address, size_t count) = 0; - - /** \brief fill a part of a cache - * - * Filling a cache requires reading from the target device. Addresses that - * already have a valid cache value are omitted. - * - * \param address the first address to fill - * \param count number of address to fill, starting with address - * \return true if all requested addresses were filled successfully, else false - */ - virtual bool fill (uint32_t address, size_t count) = 0; - - /** \brief flush a part of a cache - * - * Flushing a cache requires writing to the target device. Address that - * are not marked dirty are omitted. - * - * \param address the first address to flush - * \param count number of address to flush, starting with address - * \return true if all requested addresses were flushed successfully, else false - */ - virtual bool flush (uint32_t address, size_t count) = 0; - - /** \brief clear a part of a cache - * - * Clearing a part of the cache resets that part to the initial state of - * being invalid and not dirty. No target device interaction is necessary. - * - * \param address the first address to clear - * \param count number of address to clear, starting with address - * \return true if all requested addresses were cleared successfully, else false - */ - virtual void clear (uint32_t address, size_t count) = 0; - }; - - /** \brief memory area management */ - class DLL430_SYMBOL MemoryArea //: public MemoryRange, public MemoryAccess - { - public: - /** \brief read from memory - * - * This registers a read call. The content of buffer is undefined - * until you call the sync() method. - * - * \param address the first address - * \param buffer the buffer to write the read data to - * \param count the number of elements to read - * \return true if the read was registered successfully, else false - */ - - virtual bool read (uint32_t address, uint32_t* buffer, size_t count) = 0; - - /** \brief write to memory - * - * This registers a write call. The content of buffer must stay valid - * until you call the sync() method. - * - * \param address the first address - * \param buffer the buffer to read the data to write from - * \param count the number of elements to write - * \return true if the write was registered successfully, else false - */ - virtual bool write (uint32_t address, uint32_t* buffer, size_t count) = 0; - - /** \brief write to memory - * - * This registers a write call. The transfer is delayed - * until you call the sync() method. - * - * \param address the first address - * \param value the value to write to address - * \return true if the write was registered successfully, else false - */ - virtual bool write (uint32_t address, uint32_t value) = 0; - - /** \brief This function must be called after using read() or write() - * - * This function MUST be called to complete a read or write call. - * Reads and writes can be combined in any order unless they are inter-dependent. - * - * \return true if the sync was successfull, else false - */ - virtual bool sync () = 0; - - /** \brief erase a flash area completely - * - * This function erases a complete flash area. It will do nothing - * if the area is not a flash. - * - * \param mode for selection of erase mode all/segments - * \return true if flash was erased successfully, else false - */ - virtual bool erase () = 0; - - /** \brief erase a flash segment - * - * This function erases a flash segment. It will do nothing - * if the area is not a flash. The given start and end address - * mark all segments that any of the addresses in this range - * is in as to be erased. The addresses to no have to be aligned - * to segment size. - * - * \param start the first address - * \param end the last address - * \return true if flash segments were erased successfully, else false - */ - virtual bool erase (uint32_t start, uint32_t end) = 0; - - /** \brief verify memory content - * - * This function verifies the contents of memory by using the - * Pseudo Signature Algorithm (PSA). This is a lot faster then reading - * all memory since the PSA is executed on the target device itself. - * Note that this will flush all affected cache contents. - * - * \param address the first address - * \param buffer the data to verify against (one byte per buffer element) - * \param count the number of buffer elements - * \return true if the PSA values matched, else false - */ - virtual bool verify(uint32_t address, uint32_t* buffer, size_t count) = 0; - - /** \brief check of the area is cacheable - * - * \return true if the area is readOnly, else false - */ - virtual bool isReadOnly () = 0; - - /** \brief get the memory start address - * - * \return the memory start address value - */ - virtual uint32_t getStart () const = 0; - - /** \brief get the memory end address - * - * \return the memory end address value - */ - virtual uint32_t getEnd () const = 0; - - /** \brief get the memory size - * - * \return the memory size value - */ - virtual uint32_t getSize () const = 0; - - /** \brief get the memory segment size - * - * This value only makes sense if the memory is a flash. - * - * \return the memory segment size value - */ - virtual uint32_t getSegmentSize () const = 0; - - /** \brief get number of memory banks - * - * This value only makes sense if the memory is a flash. - * - * \return the memory segment size value - */ - virtual uint32_t getBanks () const = 0; - - /** \brief check if a memory is mapped to global address space - * - * \return true if the memory is mapped, else false - */ - virtual bool isMapped () const = 0; - - /** \brief get the name of the area - * - * \return the memory area name - */ - virtual const char* getName () const = 0; - - /** \brief check of the area is cacheable - * - * \return true if the area is cacheable, else false - */ - virtual bool isCacheable () const = 0; - - /** \brief get the memory cache control - * - * \return pointer to the memory cache control (can be 0) - */ - virtual MemoryCacheCtrl* getCacheCtrl () = 0; - }; - - /** \brief manages global address space or all memory areas */ - class DLL430_SYMBOL MemoryManager //: public MemoryAccess - { - public: - /** \brief get a memory area by name and sub-index - * - * Currently standard names are: - * "main" for the main flash, - * "information" for the information flash, - * "system" for the system RAM, - * "boot" for the boot ROM, - * "EEM" for the enhanced emulation module registers, - * "CPU" for the CPU registers, - * "peripheral8bit" for the peripheral registers (8 bit wide) and - * "peripheral16bit" for the peripheral registers (16 bit wide) and - * "SFR" for the special function registers - * - * \param name the name of the area - * \param subIndex addresses multiple areas of the same name (usually 0) - * \return pointer to a memory area if the combination of name and subIndex exists, else 0 - */ - virtual MemoryArea* getMemoryArea (const char* name, size_t subIndex = 0) = 0; - - /** \brief get a memory area by index - * - * \param index the index of the area - * \return pointer to a memory area if index is valid, else 0 - */ - virtual MemoryArea* getMemoryArea (size_t index) = 0; - - /** \brief get the number of memory areas - * - * \return the number of memory areas - */ - - virtual size_t count () const = 0; - - /** \brief force real data exchange after write and sync - * - * \return true on success, else false - */ - virtual bool flushAll() = 0; - - /** \brief read from memory - * - * This registers a read call. The content of buffer is undefined - * until you call the sync() method. - * - * \param address the first address - * \param buffer the buffer to write the read data to - * \param count the number of elements to read - * \return true if the read was registered successfully, else false - */ - //virtual bool read (uint32_t address, uint32_t* buffer, size_t count) = 0; - - virtual bool read (uint32_t address, uint32_t* buffer, size_t count) = 0; - - /** \brief write to memory - * - * This registers a write call. The content of buffer must stay valid - * until you call the sync() method. - * - * \param address the first address - * \param buffer the buffer to read the data to write from - * \param count the number of elements to write - * \return true if the write was registered successfully, else false - */ - virtual bool write (uint32_t address, uint32_t* buffer, size_t count) = 0; - - /** \brief write to memory - * - * This registers a write call. The transfer is delayed - * until you call the sync() method. - * - * \param address the first address - * \param value the value to write to address - * \return true if the write was registered successfully, else false - */ - virtual bool write (uint32_t address, uint32_t value) = 0; - - /** \brief This function must be called after using read() or write() - * - * This function MUST be called to complete a read or write call. - * Reads and writes can be combined in any order unless they are inter-dependent. - * - * \return true if the sync was successfull, else false - */ - virtual bool sync () = 0; - - /** \brief erase a flash area completely - * - * This function erases a complete flash area. It will do nothing - * if the area is not a flash. - * - * \return true if flash was erased successfully, else false - */ - virtual bool erase () = 0; - - /** \brief erase a flash segment - * - * This function erases a flash segment. It will do nothing - * if the area is not a flash. The given start and end address - * mark all segments that any of the addresses in this range - * is in as to be erased. The addresses to no have to be aligned - * to segment size. - * - * \param start the first address - * \param end the last address - * \return true if flash segments were erased successfully, else false - */ - virtual bool erase (uint32_t start, uint32_t end) = 0; - - /** \brief verify memory content - * - * This function verifies the contents of memory by using the - * Pseudo Signature Algorithm (PSA). This is a lot faster then reading - * all memory since the PSA is executed on the target device itself. - * Note that this will flush all affected cache contents. - * - * \param address the first address - * \param buffer the data to verify against (one byte per buffer element) - * \param count the number of buffer elements - * \return true if the PSA values matched, else false - */ - virtual bool verify(uint32_t address, uint32_t* buffer, size_t count) = 0; - - /** \brief check of the area is cacheable - * - * \return true if the area is readOnly, else false - */ - virtual bool isReadOnly () = 0; - - /** \brief Locks/unlocks desired memory module. - * Memory Module is identified by name. - * Action == true locks module, - * Action == false unlocks module. - * \return true if module isProtected and the state switched actually from - * locked to unlocked or vice versa, false otherwise. - */ - virtual bool lock(const char* name, bool action) = 0; - - /** \brief get last error code - * - * Read and reset the last error code that occured during a memory operation. - * - * \return Error code - */ - virtual MemoryError getLastError() = 0; - - /** \brief Enable/disable preservation of Ram - * - * Ram will be saved and restored for operations that can modify Ram content - * if set to true. - * - */ - virtual void setRamPreserveMode(bool enabled) = 0; - - /** \brief Current Ram preservation mode - * - * Get current setting for Ram preservation - * - * \return Current state (enabled or not) - */ - virtual bool getRamPreserveMode() const = 0; - - /** \brief Check voltage for flash programming - * - * Check internal and external voltage against minimum voltage - * - * \return Voltage sufficient - */ - virtual bool checkMinFlashVoltage() const = 0; - }; - - }; -}; - -#endif /* DLL430_MEMORYMANAGER_H */ diff --git a/DLL430_v3/include/DLL430_SYMBOL.h b/DLL430_v3/include/DLL430_SYMBOL.h index d97c3f6..a870504 100644 --- a/DLL430_v3/include/DLL430_SYMBOL.h +++ b/DLL430_v3/include/DLL430_SYMBOL.h @@ -1,41 +1,41 @@ /* - * DLL430_SYMBOL.h + * DLL430_SYMBOL.h * * Defines symbols for outer world. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** +/** * * Also see http://gcc.gnu.org/wiki/Visibility. */ @@ -46,7 +46,7 @@ #ifndef DLL430_SYMBOL_H #define DLL430_SYMBOL_H -#if defined(_WIN32) || defined(_WIN64) +#if defined(_WIN32) && !defined(_WIN64) # if defined(DLL430_EXPORT) # define DLL430_SYMBOL __declspec(dllexport) # else /* DLL430_EXPORT */ @@ -54,7 +54,7 @@ # endif /* DLL430_EXPORT */ #else -# if defined(__GNU_C__) && __GNU_C__ >= 4 +# if defined(__GNUC__) && __GNUC__ >= 4 /* You must add the -fvisibility=hidden command line option when * compiling the library. * Using this makes loading the lib a lot faster on some systems diff --git a/DLL430_v3/include/MSP430.h b/DLL430_v3/include/MSP430.h index c481285..70cac05 100644 --- a/DLL430_v3/include/MSP430.h +++ b/DLL430_v3/include/MSP430.h @@ -3,36 +3,36 @@ * * API for accessing MSP430 devices via JTAG. * - * Copyright (C) 2004 - 2011 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 + * Copyright (c) 2004 - 2016 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * POSSIBILITY OF SUCH DAMAGE. */ /** @@ -65,38 +65,37 @@ */ -/** +/** \file MSP430.h - + \brief This file contains the Application Programming Interface (API) to access an MSP430 microcontroller via JTAG using the MSP430.DLL. This file contains the DLL function headers and definitions. - + The MSP430.DLL provides the following functionalities: - Initialize a selected JTAG interface (FET) - Setting target's supply voltage - Identifing a device - Programming/Erasing the identified device - Program/Erase check of device memory - + \par Project: - MSP430 JTAG Interface (MSP430.dll) - + MSPDebugStack (MSP430.dll) + \par Developed using: - MS Visual C++ 2003/2010 - - \version 3.02.05.004 - + MS Visual C++ 2013 + + \version 3.09.01.002 + \par Supported API calls: - MSP430_GetNumberOfUsbIfs() - MSP430_GetNameOfUsbIf() - - MSP430_SET_SYSTEM_NOTIFY_CALLBACK() + - MSP430_SET_SYSTEM_NOTIFY_CALLBACK() - MSP430_Initialize() - MSP430_Close() - MSP430_GetJtagID() - - MSP430_GetFoundDevice() - - MSP430_OpenDevice() - - MSP430_Identify() + - MSP430_GetFoundDevice() + - MSP430_OpenDevice() - MSP430_Device() - MSP430_Configure() - MSP430_VCC() @@ -115,8 +114,32 @@ - MSP430_Error_String() \par Version History: - - Version 3.2.00.007 - 02.11.2010 - - Version 3.2.01.009 - 10.18.2011 + - Version 3.2.01.009 - 10/18/2011 + - Version 3.2.05.004 - 09/14/2012 + - Version 3.3.00.005 - 01/29/2013 + - Version 3.3.00.006 - 01/31/2013 + - Version 3.3.01.003 - 06/24/2013 + - Version 3.3.01.004 - 09/17/2013 + - Version 3.3.01.204 - 11/07/2013 + - Version 3.3.01.205 - 12/02/2013 + - Version 3.4.00.018 - 01/20/2014 + - Version 3.4.00.019 - 01/24/2014 + - Version 3.4.00.020 - 01/27/2014 + - Version 3.4.00.230 - 02/20/2014 + - Version 3.4.01.000 - 04/01/2014 + - Version 3.4.02.007 - 08/26/2014 + - Version 3.4.03.004 - 11/20/2014 + - Version 3.5.00.001 - 04/29/2015 + - Version 3.5.01.001 - 08/10/2015 + - Version 3.7.00.011 - 02/16/2016 + - Version 3.9.01.002 - 11/24/2016 + - Version 3.9.02.015 - 02/24/2017 + - Version 3.10.00.003 - 04/07/2017 + - Version 3.10.01.000 - 06/01/2017 + - Version 3.11.00.001 - 11/30/2017 + - Version 3.12.00.004 - 02/28/2018 + - Version 3.13.00.001 - 05/15/2018 + - Version 3.15.01.001 - 04/27/2020 */ @@ -124,14 +147,12 @@ #ifndef MSP430_H #define MSP430_H -#include + #include +#include #if defined(_WIN32) || defined(_WIN64) #include -#include -#else -#include "wtypes.h" #endif #if defined(__cplusplus) @@ -142,7 +163,7 @@ extern "C" { #define MSP430_TYPES /// this is the definition for the DLL functions return value -typedef LONG STATUS_T; +typedef int32_t STATUS_T; /** \brief Status codes of the DLL functions. @@ -159,82 +180,124 @@ typedef enum STATUS_CODE { typedef union DEVICE_T { /// this buffer holds the complete device information /// and is overlayed by the following information structure - CHAR buffer[112]; - struct { // actually 108 Bytes + uint8_t buffer[184]; + struct + { /// The value 0xaa55. - WORD endian; + uint16_t endian; /// Identification number. - WORD id; + uint16_t id; /// Identification string. - BYTE string[32]; + uint8_t string[32]; /// MAIN MEMORY starting address. - WORD mainStart; + uint16_t mainStart; /// INFORMATION MEMORY starting address. - WORD infoStart; + uint16_t infoStart; /// RAM ending address. - WORD ramEnd; + uint16_t ramEnd; /// Number of breakpoints. - WORD nBreakpoints; + uint16_t nBreakpoints; /// Emulation level. - WORD emulation; + uint16_t emulation; /// Clock control level. - WORD clockControl; + uint16_t clockControl; /// LCD starting address. - WORD lcdStart; + uint16_t lcdStart; /// LCD ending address. - WORD lcdEnd; + uint16_t lcdEnd; /// Vcc minimum during operation [mVolts]. - WORD vccMinOp; + uint16_t vccMinOp; /// Vcc maximum during operation [mVolts]. - WORD vccMaxOp; + uint16_t vccMaxOp; /// Device has TEST/VPP. - WORD hasTestVpp; + uint16_t hasTestVpp; /// RAM starting address. - WORD ramStart; + uint16_t ramStart; /// RAM2 starting address. - WORD ram2Start; + uint16_t ram2Start; /// RAM2 ending address. - WORD ram2End; + uint16_t ram2End; /// INFO ending address. - WORD infoEnd; + uint16_t infoEnd; /// MAIN ending address. - ULONG mainEnd; + uint32_t mainEnd; /// BSL starting address. - WORD bslStart; + uint16_t bslStart; /// BSL ending address. - WORD bslEnd; + uint16_t bslEnd; /// Number of CPU Register Trigger. - WORD nRegTrigger; + uint16_t nRegTrigger; /// Number of EEM Trigger Combinations. - WORD nCombinations; + uint16_t nCombinations; /// The MSP430 architecture (non-X, X or Xv2). - BYTE cpuArch; + uint8_t cpuArch; /// The JTAG ID - value returned on an instruction shift. - BYTE jtagId; + uint8_t jtagId; /// The CoreIP ID. - WORD coreIpId; + uint16_t coreIpId; /// The Device-ID Pointer. - ULONG deviceIdPtr; + uint32_t deviceIdPtr; /// The EEM Version Number. - WORD eemVersion; + uint16_t eemVersion; /// Breakpoint Modes - WORD nBreakpointsOptions; - WORD nBreakpointsReadWrite; - WORD nBreakpointsDma; - /// Trigger Mask for Breakpoint - WORD TrigerMask; + uint16_t nBreakpointsOptions; + uint16_t nBreakpointsReadWrite; + uint16_t nBreakpointsDma; + /// Trigger Mask for Breakpoint + uint16_t TrigerMask; /// Register Trigger modes - WORD nRegTriggerOperations; + uint16_t nRegTriggerOperations; /// MSP430 has Stage Storage - WORD nStateStorage; + uint16_t nStateStorage; /// Number of cycle counters of MSP430 - WORD nCycleCounter; + uint16_t nCycleCounter; /// Cycle couter modes - WORD nCycleCounterOperations; + uint16_t nCycleCounterOperations; /// Msp430 has Sequencer - WORD nSequencer; + uint16_t nSequencer; /// Msp430 has FRAM Memory - WORD HasFramMemroy; + uint16_t HasFramMemroy; + /// Flash segment size for Main + uint16_t mainSegmentSize; + ///--------------------------------------MSP432----------------------------------------------- + /// 16 bit padding to align with the expected 32bit padding before mainSegmentSize was defined + uint16_t paddingForLegacyDll; + /// Indicates the complete size in bytes of the structure + uint32_t structSize; + /// Indicates the start of the 32-bit RAM space + uint32_t info32BitStart; + /// Indicates the end of the 32-bit RAM space + uint32_t info32BitEnd; + /// Indicates the start of the 32-bit RAM space + uint32_t ram32BitStart; + /// Indicates the end of the 32-bit RAM space + uint32_t ram32BitEnd; + /// Indicates the start of the 32-bit RAM Bit-Band alias region space + uint32_t ram32BitBandStart; + /// Indicates the end of the 32-bit RAM Bit-Band alias region space + uint32_t ram32BitBandEnd; + /// Indicates the start of the 32-bit MAIN space + uint32_t main32BitStart; + /// Indicates the end of the 32-bit MAIN space + uint32_t main32BitEnd; + /// Indicates the start of the 32-bit DEBUG memory space + uint32_t debug32BitStart; + /// Indicates the end of the 32-bit DEBUG memory space + uint32_t debug32BitEnd; + /// Indicates the start of the 32-bit BSL memory space + uint32_t bsl32BitStart; + /// Indicates the end of the 32-bit BSL memory space + uint32_t bsl32BitEnd; + /// number of DataWatchpoints (if hardware resources are separated) or -1 if hardware resources are shared -> refer to nBreakpoints + int32_t nDataWatchpoints; + /// number of DataWatchpoints that can be used to match against an address and a value or -1 + int32_t nDataWatchpointsValueMatch; + /// Indicates the start of the second 32-bit Info memory space + uint32_t infoSecond32BitStart; + /// Indicates the end of the second 32-bit Info memory space + uint32_t infoSecond32BitEnd; + /// Flash segment size for 32-bit Info memory space (MSP432 SimpleLink only) + uint32_t info32BitSegmentSize; }; } DEVICE_T_t; #pragma pack() @@ -248,35 +311,45 @@ typedef enum CPU_ARCH_TYPE CPU_ARCH_ORIGINAL, CPU_ARCH_X, CPU_ARCH_XV2, + CPU_ARCH_ARM } CPU_ARCH_TYPE_t; +typedef enum TARGET_ARCHITECTURE +{ + MSP430, + MSP432_M4 +} TARGET_ARCHITECTURE_t; + typedef enum READ_WRITE { - WRITE = 0, - READ = 1, + WRITE = 0, + READ = 1, + OVERWRITE = 2 } READ_WRITE_t; typedef enum ENABLE_DISABLE { - DISABLE = 0, - ENABLE = 1, + DISABLE = 0, + ENABLE = 1, } ENABLE_DISABLE_t; /// Device reset methods. typedef enum RESET_METHOD { - PUC_RESET = (1 << 0), /**< Power up clear (i.e., a "soft") reset */ - RST_RESET = (1 << 1), /**< RST/NMI (i.e., "hard") reset */ - VCC_RESET = (1 << 2), /**< Cycle Vcc (i.e., a "power on") reset */ - FORCE_RESET = (1 << 3), - - /// combines all possible reset methods enumerated in enum RESET_METHOD - ALL_RESETS = (PUC_RESET | RST_RESET | VCC_RESET), - /// forces a Power up clear reset - FORCE_PUC_RESET = (FORCE_RESET | PUC_RESET), - /// forces a RST/NMI clear reset - /// Non-Xv2 devices will be running and executing code after the reset - FORCE_RST_RESET = (FORCE_RESET | RST_RESET), - /// forces a Vcc clear reset - /// Non-Xv2 devices will be running and executing code after the reset - FORCE_VCC_RESET = (FORCE_RESET | VCC_RESET), + PUC_RESET = (1 << 0), /**< Power up clear (i.e., a "soft") reset */ + RST_RESET = (1 << 1), /**< RST/NMI (i.e., "hard") reset */ + VCC_RESET = (1 << 2), /**< Cycle Vcc (i.e., a "power on") reset */ + FORCE_RESET = (1 << 3), + + /// combines all possible reset methods enumerated in enum RESET_METHOD + /// !!DEPRECATED, do not use any longer + ALL_RESETS = (PUC_RESET | RST_RESET | VCC_RESET), + /// forces a Power up clear reset + FORCE_PUC_RESET = (FORCE_RESET | PUC_RESET), + /// forces a RST/NMI clear reset + /// Non-Xv2 devices will be running and executing code after the reset + FORCE_RST_RESET = (FORCE_RESET | RST_RESET), + /// forces a Vcc clear reset + /// Non-Xv2 devices will be running and executing code after the reset + /// !!DEPRECATED, do not use any longer + FORCE_VCC_RESET = (FORCE_RESET | VCC_RESET), } RESET_METHOD_t; @@ -286,126 +359,170 @@ typedef enum ERASE_TYPE { ERASE_MAIN = 1, /**< Erase all MAIN memory */ ERASE_ALL = 2, /**< Erase all MAIN and INFORMATION memory not including IP protected area */ ERASE_TOTAL = 3,/**< Erase all MAIN and INFORMATION memory including IP protected area */ + ERASE_USER_CODE = 4,/**< Erase all MAIN and INFORMATION memory via Jtag mailbox */ } ERASE_TYPE_t; /// Configurations to set with MSP430_Configure. typedef enum CONFIG_MODE { - VERIFICATION_MODE = 0, /**< Verify data downloaded to FLASH memories */ - EMULATION_MODE = 1, /**< 4xx emulation mode */ - LOCKED_FLASH_ACCESS = 5, /**< Allows Locked Info Mem Segment A access (if set to '1') */ - EDT_TRACE_MODE = 7, /**< Trace mode in EDT file format */ - INTERFACE_MODE = 8, /**< Configure interface protocol: JTAG or Spy-bi-Wire (see enum INTERFACE_TYPE) */ - - /// Configure a value that will be placed on the devices' MemoryDataBus - /// right before the device gets released from JTAG. - /// Used for Software Breakpoints. - SET_MDB_BEFORE_RUN = 9, - - /// Configure whether RAM content should be preserved/restored - /// in MSP430_Erase() and MSP430_Memory() or not. - /// RAM_PRESERVE_MODE is set to ENABLE by default. - /// Usage Example for initial flash programming: - /// (1) MSP430_Configure(RAM_PRESERVE_MODE, DISABLE); - /// (2) MSP430_Erase(ERASE_ALL,..,..); - /// (3) MSP430_Memory(..., ..., ..., WRITE ); - /// (4) MSP430_Memory(..., ..., ..., READ ); - /// ..... Flash Programming/Download finished - /// (n) MSP430_Configure(RAM_PRESERVE_MODE, ENABLE); + VERIFICATION_MODE = 0, /**< Verify data downloaded to FLASH memories */ + EMULATION_MODE = 1, /**< 4xx emulation mode */ + LOCKED_FLASH_ACCESS = 5, /**< Allows Locked Info Mem Segment A access (if set to '1') */ + EDT_TRACE_MODE = 7, /**< Trace mode in EDT file format */ + INTERFACE_MODE = 8, /**< Configure interface protocol: JTAG or Spy-bi-Wire (see enum INTERFACE_TYPE) */ + + /// Configure a value that will be placed on the devices' MemoryDataBus + /// right before the device gets released from JTAG. + /// Used for Software Breakpoints. + SET_MDB_BEFORE_RUN = 9, + + /// Configure whether RAM content should be preserved/restored + /// in MSP430_Erase() and MSP430_Memory() or not. + /// RAM_PRESERVE_MODE is set to ENABLE by default. + /// Usage Example for initial flash programming: + /// (1) MSP430_Configure(RAM_PRESERVE_MODE, DISABLE); + /// (2) MSP430_Erase(ERASE_ALL,..,..); + /// (3) MSP430_Memory(..., ..., ..., WRITE ); + /// (4) MSP430_Memory(..., ..., ..., READ ); + /// ..... Flash Programming/Download finished + /// (n) MSP430_Configure(RAM_PRESERVE_MODE, ENABLE); RAM_PRESERVE_MODE = 10, - /// Configure the DLL to allow read/write/erase access to the 5xx - /// Bootstrap Loader (BSL) memory segments. + /// Configure the DLL to allow read/write/erase access to the 5xx + /// Bootstrap Loader (BSL) memory segments. UNLOCK_BSL_MODE =11, // just used internal for the device code of L092 and C092 DEVICE_CODE = 12, // set true to write the external SPI image of the L092 WRITE_EXTERNAL_MEMORY = 13, // set DEBUG_LPM_X true to start debugging of LPMx.5 - // this will start polling for LPMX.5 events if a system notify callback was - // previously set using MSP430_SET_SYSTEM_NOTIFY_CALLBACK() + // this will start polling for LPMX.5 events if a system notify callback was + // previously set using MSP430_SET_SYSTEM_NOTIFY_CALLBACK() DEBUG_LPM_X = 14, // Configure JTAG speed - JTAG_SPEED = 15, - // total device erase including IP protection - TOTAL_ERASE_DEVICE = 16 - + SET_INTERFACE_SPEED = 15, + // total device erase including IP protection + TOTAL_ERASE_DEVICE = 16, + // Enable the CURRENTDRIVE FINE EnergyTrace Mode, for measuring small currents + ET_CURRENTDRIVE_FINE = 17, + // Enable software breakpoints + SOFTWARE_BREAKPOINTS = 18, + // Enable/disable interrupts during single step or run (0: all interrupts are exectued + // 1: interrupts for single step are disabled + // 2: interrupts when device is running are disabled) + // The values can be ORed. MSP432 only + DISABLE_INTERRUPTS = 19, + // Configure value for JTAG lock key for 5xx devices + CONFIG_JTAG_LOCK_5XX = 20 } CONFIG_MODE_t; +/// Configurations values for CONFIG_MODE DISABLE_INTERRUPTS +typedef enum DISABLE_INTERRUPTS_TYPE { + DISABLE_INTERRUPTS_NONE = 0, + DISABLE_INTERRUPTS_SINGLE_STEP = 1, + DISABLE_INTERRUPTS_RUN = 2 +} DISABLE_INTERRUPTS_TYPE_t; + /// Configurations values for CONFIG_MODE INTERFACE_MODE typedef enum INTERFACE_TYPE { JTAG_IF = 0, /**< 4 Wire JTAG protocol used */ SPYBIWIRE_IF = 1, /**< 2 Wire (Spy-bi-wire) JTAG protocol used */ SPYBIWIREJTAG_IF = 2, /**< 2 Wire Devices accessed by 4wire JTAG protocol */ - AUTOMATIC_IF = 3 /**< Protocol will be detected automatically */ + AUTOMATIC_IF = 3, /**< Protocol will be detected automatically */ + UNDEF_IF = 4, + SPYBIWIRE_DCDC = 5, + SPYBIWIRE_MSP_FET_IF = 6, + JTAG_MSP432 = 7, + SWD_MSP432 = 8 } INTERFACE_TYPE_t; +/// Configurations values for CONFIG_MODE INTERFACE_SPEED +typedef enum INTERFACE_SPEED { + FAST = 0, /**< INTERFACE_SPEED JTAG/SBW fast */ + MEDIUM = 1, /**< INTERFACE_SPEED JTAG/SBW medium */ + SLOW = 2 /**< INTERFACE_SPEED JTAG/SBW slow */ +} INTERFACE_SPEED_t; /// File types. typedef enum FILE_TYPE { - FILETYPE_AUTO, /**< Auto detect */ - FILETYPE_TI_TXT, /**< TI text */ - FILETYPE_INTEL_HEX, /**< Intel hex */ + FILETYPE_AUTO, /**< Auto detect */ + FILETYPE_TI_TXT, /**< TI text */ + FILETYPE_INTEL_HEX, /**< Intel hex */ } FILE_TYPE_t; +typedef enum MESSAGE_LEVEL { + MSPDS_MESSAGE_LEVEL_WARNING = 0, + MSPDS_MESSAGE_LEVEL_INFORMATION = 1 +} MESSAGE_LEVEL_T; + +typedef struct DETECTIONLIST +{ + int errorCode; /** If no error occured this is 0, else the error code */ + char nameDevice[32]; /** Name of the dected device, otherwise empty */ + char nameFET[32]; /** Name of the dected FET, otherwise empty */ + char nameLaunchpad[32]; /** Name of the launchpad if detected, otherwise empty */ +} DETECTIONLIST_T; + +typedef void(*MessageCallbackFn)(MESSAGE_LEVEL_T, const char *); + #define ERROR_DEFINITIONS \ - ERROR_DEF(NO_ERR, "No error") \ - ERROR_DEF(INITIALIZE_ERR, "Could not initialize device interface") \ - ERROR_DEF(CLOSE_ERR, "Could not close device interface") \ - ERROR_DEF(PARAMETER_ERR, "Invalid parameter(s)") \ - ERROR_DEF(NO_DEVICE_ERR, "Could not find device (or device not supported)") \ - ERROR_DEF(DEVICE_UNKNOWN_ERR, "Unknown device") \ - ERROR_DEF(READ_MEMORY_ERR, "Could not read device memory") \ - ERROR_DEF(WRITE_MEMORY_ERR, "Could not write device memory") \ - ERROR_DEF(READ_FUSES_ERR, "Could not read device configuration fuses") \ - ERROR_DEF(CONFIGURATION_ERR, "Incorrectly configured device; device derivative not supported") \ - ERROR_DEF(VCC_ERR, "Could not set device Vcc") \ - ERROR_DEF(RESET_ERR, "Could not reset device") \ - ERROR_DEF(PRESERVE_RESTORE_ERR, "Could not preserve/restore device memory") \ - ERROR_DEF(FREQUENCY_ERR, "Could not set device operating frequency") \ - ERROR_DEF(ERASE_ERR, "Could not erase device memory") \ - ERROR_DEF(BREAKPOINT_ERR, "Could not set device breakpoint") \ - ERROR_DEF(STEP_ERR, "Could not single step device") \ - ERROR_DEF(RUN_ERR, "Could not run device (to breakpoint)") \ - ERROR_DEF(STATE_ERR, "Could not determine device state") \ - ERROR_DEF(EEM_OPEN_ERR, "Could not open Enhanced Emulation Module") \ - ERROR_DEF(EEM_READ_ERR, "Could not read Enhanced Emulation Module register") \ - ERROR_DEF(EEM_WRITE_ERR, "Could not write Enhanced Emulation Module register") \ - ERROR_DEF(EEM_CLOSE_ERR, "Could not close Enhanced Emulation Module") \ - ERROR_DEF(FILE_OPEN_ERR, "File open error") \ - ERROR_DEF(FILE_DETECT_ERR, "File type could not be identified") \ - ERROR_DEF(FILE_END_ERR, "File end error") \ - ERROR_DEF(FILE_IO_ERR, "File input/output error") \ - ERROR_DEF(FILE_DATA_ERR, "File data error") \ - ERROR_DEF(VERIFY_ERR, "Verification error") \ - ERROR_DEF(BLOW_FUSE_ERR, "Could not blow device security fuse") \ - ERROR_DEF(FUSE_BLOWN_ERR, "Security Fuse has been blown") \ - ERROR_DEF(INTEL_HEX_CODE_ERR, "Error within Intel Hex file") \ - ERROR_DEF(WRITE_REGISTER_ERR, "Could not write device Register") \ - ERROR_DEF(READ_REGISTER_ERR, "Could not read device Register") \ - ERROR_DEF(INTERFACE_SUPPORT_ERR, "Not supported by selected Interface or Interface is not initialized") \ - ERROR_DEF(COMM_ERR, "Interface Communication error") \ - ERROR_DEF(NO_EX_POWER, "No external power supply detected") \ - ERROR_DEF(LOW_EX_POWER, "External power too low") \ - ERROR_DEF(EX_POWER_OK, "External power detected") \ - ERROR_DEF(HIGH_EX_POWER, "External power too high") \ - ERROR_DEF(SELFTEST_ERR, "Hardware Self Test Error") \ - ERROR_DEF(FLASH_TIMEOUT_ERR, "Fast Flash Routine experienced a timeout") \ - ERROR_DEF(THREAD_ERR, "Could not create thread for polling") \ - ERROR_DEF(EEM_INIT_ERR, "Could not initialize Enhanced Emulation Module") \ - ERROR_DEF(RESOURCE_ERR, "Insufficent resources") \ - ERROR_DEF(CLK_CTRL_ERR, "No clock control emulation on connected device") \ - ERROR_DEF(STATE_STOR_ERR, "No state storage buffer implemented on connected device") \ - ERROR_DEF(READ_TRACE_ERR, "Could not read trace buffer") \ - ERROR_DEF(VAR_WATCH_EN_ERR, "Enable the variable watch function") \ - ERROR_DEF(SEQUENCER_ERR, "No trigger sequencer implemented on connected device") \ - ERROR_DEF(SEQ_ENABLE_ERR, "Could not read sequencer state - Sequencer is disabled") \ - ERROR_DEF(CLR_SEQ_TRIGGER, "Could not remove trigger - Used in sequencer") \ - ERROR_DEF(SET_SEQ_TRIGGER, "Could not set combination - Trigger is used in sequencer") \ - ERROR_DEF(SPMA_ACTIVE_ERR, "System Protection Module A is enabled - Device locked") \ - ERROR_DEF(SPMA_INVALID_KEY_ERR, "Invalid SPMA key was passed to the target device - Device locked") \ - ERROR_DEF(SPMA_MAX_TRIALS, "Device does not accept any further SPMA keys - Device locked") \ - ERROR_DEF(USB_FET_BSL_ACTIVE_ERR, "MSP-FET430UIF Firmware erased - Bootloader active") \ - ERROR_DEF(USB_FET_NOT_FOUND_ERR, "Could not find MSP-FET430UIF on specified COM port") \ - ERROR_DEF(USB_FET_BUSY_ERR, "MSP-FET430UIF is already in use") \ + ERROR_DEF(NO_ERR, "No error") \ + ERROR_DEF(INITIALIZE_ERR, "Could not initialize device interface") \ + ERROR_DEF(CLOSE_ERR, "Could not close device interface") \ + ERROR_DEF(PARAMETER_ERR, "Invalid parameter(s)") \ + ERROR_DEF(NO_DEVICE_ERR, "Could not find device (or device not supported)") \ + ERROR_DEF(DEVICE_UNKNOWN_ERR, "Unknown device") \ + ERROR_DEF(READ_MEMORY_ERR, "Could not read device memory") \ + ERROR_DEF(WRITE_MEMORY_ERR, "Could not write device memory") \ + ERROR_DEF(READ_FUSES_ERR, "Could not read device configuration fuses") \ + ERROR_DEF(CONFIGURATION_ERR, "Incorrectly configured device; device derivative not supported") \ + ERROR_DEF(VCC_ERR, "Could not set device Vcc") \ + ERROR_DEF(RESET_ERR, "Could not reset device") \ + ERROR_DEF(PRESERVE_RESTORE_ERR, "Could not preserve/restore device memory") \ + ERROR_DEF(FREQUENCY_ERR, "Could not set device operating frequency") \ + ERROR_DEF(ERASE_ERR, "Could not erase device memory") \ + ERROR_DEF(BREAKPOINT_ERR, "Could not set device breakpoint") \ + ERROR_DEF(STEP_ERR, "Could not single step device") \ + ERROR_DEF(RUN_ERR, "Could not run device (to breakpoint)") \ + ERROR_DEF(STATE_ERR, "Could not determine device state") \ + ERROR_DEF(EEM_OPEN_ERR, "Could not open Enhanced Emulation Module") \ + ERROR_DEF(EEM_READ_ERR, "Could not read Enhanced Emulation Module register") \ + ERROR_DEF(EEM_WRITE_ERR, "Could not write Enhanced Emulation Module register") \ + ERROR_DEF(EEM_CLOSE_ERR, "Could not close Enhanced Emulation Module") \ + ERROR_DEF(FILE_OPEN_ERR, "File open error") \ + ERROR_DEF(FILE_DETECT_ERR, "File type could not be identified") \ + ERROR_DEF(FILE_END_ERR, "File end error") \ + ERROR_DEF(FILE_IO_ERR, "File input/output error") \ + ERROR_DEF(FILE_DATA_ERR, "File data error") \ + ERROR_DEF(VERIFY_ERR, "Verification error") \ + ERROR_DEF(BLOW_FUSE_ERR, "Could not secure the device") \ + ERROR_DEF(FUSE_BLOWN_ERR, "The Debug Interface to the device has been secured") \ + ERROR_DEF(INTEL_HEX_CODE_ERR, "Error within Intel Hex file") \ + ERROR_DEF(WRITE_REGISTER_ERR, "Could not write device Register") \ + ERROR_DEF(READ_REGISTER_ERR, "Could not read device Register") \ + ERROR_DEF(INTERFACE_SUPPORT_ERR, "Not supported by selected Interface or Interface is not initialized") \ + ERROR_DEF(COMM_ERR, "Interface Communication error") \ + ERROR_DEF(NO_EX_POWER, "No external power supply detected") \ + ERROR_DEF(LOW_EX_POWER, "External power too low") \ + ERROR_DEF(EX_POWER_OK, "External power detected") \ + ERROR_DEF(HIGH_EX_POWER, "External power too high") \ + ERROR_DEF(SELFTEST_ERR, "Hardware Self Test Error") \ + ERROR_DEF(FLASH_TIMEOUT_ERR, "Fast Flash Routine experienced a timeout") \ + ERROR_DEF(THREAD_ERR, "Could not create thread for polling") \ + ERROR_DEF(EEM_INIT_ERR, "Could not initialize Enhanced Emulation Module") \ + ERROR_DEF(RESOURCE_ERR, "Insufficient resources") \ + ERROR_DEF(CLK_CTRL_ERR, "No clock control emulation on connected device") \ + ERROR_DEF(STATE_STOR_ERR, "No state storage buffer implemented on connected device") \ + ERROR_DEF(READ_TRACE_ERR, "Could not read trace buffer") \ + ERROR_DEF(VAR_WATCH_EN_ERR, "Enable the variable watch function") \ + ERROR_DEF(SEQUENCER_ERR, "No trigger sequencer implemented on connected device") \ + ERROR_DEF(SEQ_ENABLE_ERR, "Could not read sequencer state - Sequencer is disabled") \ + ERROR_DEF(CLR_SEQ_TRIGGER, "Could not remove trigger - Used in sequencer") \ + ERROR_DEF(SET_SEQ_TRIGGER, "Could not set combination - Trigger is used in sequencer") \ + ERROR_DEF(SPMA_ACTIVE_ERR, "System Protection Module A is enabled - Device locked") \ + ERROR_DEF(SPMA_INVALID_KEY_ERR, "Invalid SPMA key was passed to the target device - Device locked") \ + ERROR_DEF(SPMA_MAX_TRIALS, "Device does not accept any further SPMA keys - Device locked") \ + ERROR_DEF(USB_FET_BSL_ACTIVE_ERR, "MSP-FET430UIF Firmware erased - Bootloader active") \ + ERROR_DEF(USB_FET_NOT_FOUND_ERR, "Could not find MSP-FET430UIF on specified COM port") \ + ERROR_DEF(USB_FET_BUSY_ERR, "MSP-FET430UIF is already in use") \ ERROR_DEF(THREAD_ACTIVE_ERR, "EEM polling thread is already active") \ ERROR_DEF(THREAD_TERMINATE_ERR, "Could not terminate EEM polling thread") \ ERROR_DEF(UNLOCK_BSL_ERR, "Could not unlock BSL memory segments") \ @@ -416,7 +533,37 @@ typedef enum FILE_TYPE { ERROR_DEF(CDC_UIF_ERR, "CDC-USB-FET-Driver was not installed. Please install the driver") \ ERROR_DEF(UIF_MANUAL_POWERCYCLE_NEEDED, "Manual reboot of USB-FET needed ! PLEASE unplug and reconnect your USB-FET!!") \ ERROR_DEF(INTERNAL_ERR, "Internal error") \ - ERROR_DEF(INVALID_ERR, "Invalid error number") + ERROR_DEF(FETRECOVERY_NEEDED, "One of the connected MSP-FETs / eZ-FETs debuggers needs recovery") \ + ERROR_DEF(WRITE_EXTERNAL_MEM_ERR, "One of the connected MSP-FETs / eZ-FETs debuggers needs recovery") \ + ERROR_DEF(FEATURE_NOT_SUPPORTED, "Feature not supported") \ + ERROR_DEF(RECOVERY_MULTIPLE_UIF, "Only one MSP-FET / eZ-FET must be connected during recovery") \ + ERROR_DEF(RECOVERY_FAILED, "MSP-FET / eZ-FET recovery failed") \ + ERROR_DEF(UPDATE_CORE_ERR, "MSP-FET / eZ-FET core(communication layer) update failed") \ + ERROR_DEF(UPDATE_MODULE_ERR, "MSP-FET / eZ-FET legacy module update failed") \ + ERROR_DEF(ET_NOT_SUPPORTED, "EnergyTrace is not supported by the selected debugger") \ + ERROR_DEF(HARDWARE_STATE_UNKNOWN, "Hardware State is unknown") \ + ERROR_DEF(DEVICE_CRC_WRONG, "Device configuration data inconsistent. Please discontinue using/replace target device.") \ + ERROR_DEF(EEM_NOT_ACCESSIBLE, "EEM module not accessible while running in Ultra Low Power Debug Mode - Deactivate Ultra Low Power Debug mode to enable this feature") \ + ERROR_DEF(REMOVE_SOFTWARE_BREAKPOINT_ERR, "Failed to remove software breakpoints, please reprogram target device") \ + ERROR_DEF(TRIGGER_CONFLICT_ERR, "Trigger configuration conflicts with existing triggers") \ + ERROR_DEF(TARGET_RUNNING_ERR, "Operation not possible while device is running") \ + ERROR_DEF(INCOMPATIBLE_WITH_SW_BREAKPOINT_API, "This function can not be used when software breakpoints are enabled") \ + ERROR_DEF(SPEED_CONFIG_ERR, "JTAG/SBW speed configuration failed") \ + ERROR_DEF(SWBP_CRITICAL_INSTRUCTION, "Software breakpoint can't be set (followed by critical value)") \ + ERROR_DEF(ET_NOT_SUPPORTED_DEVICE, "EnergyTrace is not supported by selected MSP430 device") \ + ERROR_DEF(ET_NOT_SUPPORTED_ULP_DEBUG, "EnergyTrace requires Ultra-Low Power debug / LPMx.5 enabled. Please go to the project Properties -> Debug -> MSP430 Properties and check the box under Low Power Mode Settings to enable Ultra Low Power debug. ") \ + ERROR_DEF(LEGACY_DEVICE_ERR, "Legacy version of silicon used, which is no longer supported. Please contact TI to obtain a newer version.") \ + ERROR_DEF(SECURE_NOT_SUPPORTED_ERR, "Secure device via the IDE is not supported. See Device User Guide for further information.") \ + ERROR_DEF(CYCLE_COUNTER_CONFLICT, "Cycle counter is in basic mode. Set to advanced mode to use this function.") \ + ERROR_DEF(NO_LPT_SUPPORT, "Parallel port FET (MSP-FETP430IF) is no longer supported.") \ + ERROR_DEF(WRONG_TARGET_ARCHITECTURE, "Wrong target architecture was selected - Valid architectures are MSP430 or MSP432_M4.") \ + ERROR_DEF(MSP432_TOTAL_ERASE, "Mass erase executed. Please power-cycle your device and restart the debug session.") \ + ERROR_DEF(POSSIBLE_OVERCURRENT, "Your connected hardware might drain too much power from the debugger.This results in an overcurrent.") \ + ERROR_DEF(FET_UPDATE_FAILED, "MSP Tool firmware update failed. Please ensure the USB or Backchannel UART connection is not in use.") \ + ERROR_DEF(INTERFACE_SUPPORT_ERR_MSP432, "MSP432 devices are not supported using the MSPFET430-UIF") \ + ERROR_DEF(DAP_LOCK_WRONG_PROTOCOL, "DAP is locked or wrong debug protocol selected.") \ + ERROR_DEF(DEVICE_DB_ERR, "Device database not loaded.") \ + ERROR_DEF(INVALID_ERR, "Invalid error number") /// Error codes #define ERROR_DEF(errorEnum, errorString) errorEnum, @@ -426,16 +573,20 @@ typedef enum ERROR_CODE { ERROR_DEFINITIONS } ERROR_CODE_t; // System events typedef enum SYSTEM_EVENT_MSP { - /// System event FET connection is lost + /// System event FET connection is lost FET_CONNECTION_LOST, - /// System event device connection is lost + /// System event device connection is lost DEVICE_CONNECTION_LOST, - /// System event FET restart needed + /// System event FET restart needed FET_RESTART_NEEDED, - /// System event device entered LPMx.5 + /// System event device entered LPMx.5 DEVICE_IN_LPM5_MODE, - /// System event devices wakes up from LPMx.5 - DEVICE_WAKEUP_LPM5_MODE, + /// System event devices wakes up from LPMx.5 + DEVICE_WAKEUP_LPM5_MODE, + /// System event - overcurrent detection on JTAG lines or VCC line + FET_OVERCURRENT, + /// System event - Timout occourt during FPGA DR/IR shift + FET_FPGA_TIMOUT, } SYSTEM_EVENT_MSP_t; typedef void (* SYSTEM_NOTIFY_CALLBACK) (SYSTEM_EVENT_MSP_t MySystemEvent); @@ -444,26 +595,80 @@ typedef void (* SYSTEM_NOTIFY_CALLBACK) (SYSTEM_EVENT_MSP_t MySystemEvent); // Functions. ----------------------------------------------------------------- /** -\fn STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback); +\fn STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback); + +\brief Initialize the SYSTEM NOTIFYCALLBACK. +\note If DEBUG_LPM_X has been previously configured, this will start polling for LPMX.5 events. +\note This function should be called after MSP430_OpenDevice() function. + +\param parSystemNotifyCallback: To initialize the system notify callback an instance of the + enum SYSTEM_EVENT_MSP must be provided to the set function. + +\return STATUS_OK: The callback was initialized successfully. +\n STATUS_ERROR: The callback was not initialized successfully. + +\par Error codes: + INITIALIZE_ERR +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback); + +// Functions. ----------------------------------------------------------------- +/** +\fn STATUS_T STATUS_T WINAPI MSP430_SetTargetArchitecture(uint16_t architecture); + +\brief Configure you target architecture MSP432 or MSP430. + This function has to be called before MSP430_Initialize(). + IT tells the MSPDebugStack and the MSP debug probe which target architecture shall be debugged. + +\note + +\param architecture - MSP432, MSP430 + +\return STATUS_OK: +\n STATUS_ERROR: + +\par Error codes: + WRONG_TARGET_ARCHITECTURE +*/ + +DLL430_SYMBOL STATUS_T WINAPI MSP430_SetTargetArchitecture(TARGET_ARCHITECTURE_t architecture); + +/* +\fn STATUS_T MSP430_LoadDeviceDb(const char* file); + +\brief Load the device database from XML archive. + +\param file: The filename of a zip archive containing the device info files. -\brief Initialize the SYSTEM NOTIFYCALLBACK. -\note If DEBUG_LPM_X has been previously configured, this will start polling for LPMX.5 events. -\note This function should be called after MSP430_OpenDevice() function. +\return STATUS_OK: The device info was loaded. +\n STATUS_ERROR: The device info was not loaded. +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_LoadDeviceDb(const char* file); + +/* +\fn STATUS_T MSP430_DumpDeviceDb(const char* file); -\param parSystemNotifyCallback: To initialize the system notify callback an instance of the - enum SYSTEM_EVENT_MSP must be provided to the set function. +\brief Dumps the device database to a XML file. -\return STATUS_OK: The callback was initialized successfully. -\n STATUS_ERROR: The callback was not initialized successfully. +\param file: The filename of a zip archive containing the device info files. -\par Error codes: - INITIALIZE_ERR +\return STATUS_OK: The device info was dumped. +\n STATUS_ERROR: The device info was not dumped. */ -STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback); +DLL430_SYMBOL STATUS_T WINAPI MSP430_DumpDeviceDb(const char* file); +/** +\fn STATUS_T MSP430_ClearDeviceDb(); + +\brief Remove all loaded devices from the device database. + +\return STATUS_OK: The device info was removed. +\n STATUS_ERROR: The device info was not removed. +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_ClearDeviceDb(); /** -\fn STATUS_T MSP430_Initialize(CHAR* port, LONG* version); +\fn STATUS_T MSP430_Initialize(const char* port, int32_t* version); \brief Initialize the interface. @@ -471,18 +676,15 @@ STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSyst \note 2. MSP430_VCC() must be called second (after MSP430_Initialize() is called). \note 3. When initializing the MSP-FET430UIF (TI USB FET) parameter 'version' could contain the value -1 or -3. This means that the Dll and the MSP-FET430UIF do not - have the same version (-3 means a major internal update is required). - MSP430_FET_FwUpdate() should be called. - MSP430_FET_FwUpdate() is part of the Maintenance API of the Dll. - When -3 was returned and calling MSP430_FET_FwUpdate(), the file CDC.log must exist - in the directory of the executed binary and the content must be the string "True" - without a newline. This file signals that a CDC driver is installed and prevents - the update from making the MSP-FET430UIF unusable. - + have the same version (-3 means a major internal update is required). + MSP430_FET_FwUpdate() should be called. + MSP430_FET_FwUpdate() is part of the Maintenance API of the Dll. + When -3 was returned and calling MSP430_FET_FwUpdate(), the file CDC.log must exist + in the directory of the executed binary and the content must be the string "True" + without a newline. This file signals that a CDC driver is installed and prevents + the update from making the MSP-FET430UIF unusable. + \param port: Interface port reference (application specific). - - To initialize a MSP-FET430PIF LPT Jtag adapter the parameter port should point to - a string which respresents the corresponding LPT port - (e.g. '1','2',... or 'LPT1','LPT2',...). - To initialize TI's MSP-FET430UIF USB Jtag adapter the parameter port should point to the string 'TIUSB' or just 'USB'. - TI's MSP-FET430UIF USB Jtag adapter create Virtual Com Ports (VCPs) @@ -491,9 +693,9 @@ STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSyst This can be used to support multiple MSP-FET430UIF interfaces on one PC. The later generation of USB development tools (eZ430-RF2500) no longer uses the VCP approach. These tools enumerate as Human Interface Devices (HID) - on the USB. Since DLL version 2.03.00.000 it is also possible to directly + on the USB. Since DLL version 2.03.00.000 it is also possible to directly pass the name of a dedicated HID via this parameter. - When using a v3 MSP-FET430UIF it is enumerated as Communication Device Class (CDC). + When using a v3 MSP-FET430UIF it is enumerated as Communication Device Class (CDC). Refer to MSP430_GetNumberOfUsbIfs() and MSP430_GetNameOfUsbIf() for more information on VCP, HID and CDC. \param version: The version number of the MSP430 DLL is returned (if version is not NULL). @@ -510,15 +712,15 @@ STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSyst \n USB_FET_BUSY_ERR \n COMM_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Initialize(CHAR* port, LONG* version); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Initialize(const char* port, int32_t* version); /** -\fn STATUS_T MSP430_Close(LONG vccOff); +\fn STATUS_T MSP430_Close(int32_t vccOff); \brief Close the interface. \note 1. If called, this function must be called last. - + \param vccOff: Turn off the device Vcc (0 volts) if TRUE. \return STATUS_OK: The interface was closed. @@ -526,34 +728,27 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Initialize(CHAR* port, LONG* version); \par Error codes: CLOSE_ERR -\n VCC_ERR +\n VCC_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Close(LONG vccOff); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Close(int32_t vccOff); /** -\fn STATUS_T MSP430_GetJtagID(LONG* JtagId); - -\brief Return JTAG Id. - -\note 1. MSP430_Initialize() must be called prior to this function. - -\param JtagId: JTAG Id of the connected device will be returned. +\fn STATUS_T MSP430_GetJtagID(int32_t* JtagId); -\return STATUS_OK: JTAG Id could be read. -\n STATUS_ERROR: JTAG Id could NOT be read. +\brief Deprecated. -\par Error codes: +\note This function is deprecated and will be removed. Do not use. */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_GetJtagID(LONG* JtagId); +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetJtagID(int32_t* JtagId); /** -\fn STATUS_T WINAPI MSP430_GetFoundDevice(CHAR* FoundDevice, LONG count); +\fn STATUS_T WINAPI MSP430_GetFoundDevice(uint8_t* FoundDevice, LONG count); \brief Return an instance of the Found device. \note It is possible to successfully (i.e. return status: STATUS_OK) and an "UNKNOWN DEVICE". - + \param FoundDevice: A pointer to a buffer where the device identity and information are stored. See DEVICE_T for details. \param count: The number of bytes to return in the buffer (i.e., the buffer size). Must be at least sizeof(DEVICE_T). @@ -564,26 +759,26 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_GetJtagID(LONG* JtagId); \par Error codes: To be defined */ -STATUS_T WINAPI MSP430_GetFoundDevice(CHAR* FoundDevice, LONG count); +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetFoundDevice(uint8_t* FoundDevice, int32_t count); /** -\fn STATUS_T WINAPI MSP430_OpenDevice(CHAR* Device,CHAR* Password, LONG PwLength,LONG DeviceCode, LONG setId); +\fn STATUS_T WINAPI MSP430_OpenDevice(const char* Device, const char* Password, int32_t PwLength,int32_t DeviceCode, int32_t setId); \brief Identify the device, and compare the found device to the expected device. -\note 1. MSP430_Initialize() and MSP430_VCC() must have been called prior to calling this function. +\note 1. MSP430_Initialize() and MSP430_VCC() must have been called prior to calling this function. \note 2. It is possible to successfully (i.e. return status: STATUS_OK) identify another device as set"FOUND_OTHER_DEVICE". \note 3. Use the setId parameter and MSP430_State(state, TRUE, FALSE) to stop a running device (without resetting it). \note 4. Following MSP430_OpenDevice(): - the device is reset, is not executing, and is under JTAG control. - the JTAG interface is enabled and the JTAG signals are negated. - -\param Device: Device, which should be initialized -\param Password: JTAG password to access JTAG -\param PwLength: Password length in WORDS -\param DeviceCode: Activation code for devices. Example: L092 or C092 -\param setId: If setId is not DEVICE_UNKNOWN, the device is set to setId. Otherwise the device is determined. + +\param Device: Device, which should be initialized +\param Password: JTAG password to access JTAG +\param PwLength: Password length in WORDS +\param DeviceCode: Activation code for devices. Example: L092 or C092 +\param setId: If setId is not DEVICE_UNKNOWN, the device is set to setId. Otherwise the device is determined. \return STATUS_OK: Target device was connected and found in the database. \n STATUS_ERROR: The device was not obtained. @@ -591,25 +786,25 @@ STATUS_T WINAPI MSP430_GetFoundDevice(CHAR* FoundDevice, LONG count); \par Error codes: PARAMETER_ERR \n NO_DEVICE_ERR -\n DEVICE_UNKNOWN_ERR +\n DEVICE_UNKNOWN_ERR \n READ_MEMORY_ERR \n READ_FUSES_ERR -\n FUSE_BLOWN_ERR +\n FUSE_BLOWN_ERR \n CONFIGURATION_ERR -\n FOUND_OTHER_DEVICE -\n WRONG_PASSWORD +\n FOUND_OTHER_DEVICE +\n WRONG_PASSWORD */ -STATUS_T WINAPI MSP430_OpenDevice(CHAR* Device,CHAR* Password, LONG PwLength,LONG DeviceCode, LONG setId); +DLL430_SYMBOL STATUS_T WINAPI MSP430_OpenDevice(const char* Device, const char* Password, int32_t PwLength,int32_t DeviceCode, int32_t setId); /** -\fn STATUS_T MSP430_Device(LONG localDeviceId, CHAR* buffer, LONG count); +\fn STATUS_T MSP430_Device(int32_t localDeviceId, uint8_t* buffer, int32_t count); \brief Obtain the device information. \note 1. This function can be used to determine the devices supported by the driver; a device identification of NUMofDevices is returned to indicate that there are no additional devices. - + \param localDeviceId: An index (from zero) used to specify the device. \param buffer: A pointer to a buffer where the device identity and information is stored. See DEVICE_T for details. \param count: The number of bytes to return in the buffer (i.e., the buffer size). Must be at least sizeof(DEVICE_T) @@ -620,34 +815,31 @@ STATUS_T WINAPI MSP430_OpenDevice(CHAR* Device,CHAR* Password, LONG PwLength,LON \par Error codes: PARAMETER_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Device(LONG localDeviceId, CHAR* buffer, LONG count); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Device(int32_t localDeviceId, uint8_t* buffer, int32_t count); /** -\fn STATUS_T MSP430_Configure(LONG mode, LONG value); +\fn STATUS_T MSP430_Configure(int32_t mode, int32_t value); \brief Configure the mode(s) of the device and/or the software. Possible configuration modes are covered by the enum CONFIG_MODE. - See notes for details of different modes to be configured. + See notes for details of different modes to be configured. \note 1. VERIFICATION_MODE value = TRUE : Verify data downloaded to FLASH memories. - value = FALSE: No verification. + value = FALSE: No verification. 2. EMULATION_MODE - Configure F4xx emulation mode according the set value. + Configure F4xx emulation mode according the set value. 3. CLK_CNTRL_MODE - Configure the EEM Clock control register value. - Do NOT use after calling MSP430_Eem_Init(). + Configure the EEM Clock control register value. + Do NOT use after calling MSP430_Eem_Init(). 4. MCLK_CNTRL_MODE Configure the EEM Module Clock control register value. - Do NOT use after calling MSP430_Eem_Init(). + Do NOT use after calling MSP430_Eem_Init(). 5. LOCKED_FLASH_ACCESS value = TRUE : Allows Locked Info Mem Segment A erase/write access. - value = FALSE: Flash Segment stays locked during erase/write operations. + value = FALSE: Flash Segment stays locked during erase/write operations. 6. EDT_TRACE_MODE - Can be used to trace JTAG commands in EDT file format. - Only applicable with LPT tool. - value = TRUE : Trace ON - value = FALSE: Trace OFF + Deprecated 7. INTERFACE_MODE Configure JTAG interface protocol: JTAG or Spy-bi-Wire (see enum INTERFACE_TYPE) 8. SET_MDB_BEFORE_RUN @@ -667,22 +859,22 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Device(LONG localDeviceId, CHAR* buffer, LO \par Error codes: PARAMETER_ERR - \n UNLOCK_BSL_ERR - \n INTERFACE_SUPPORT_ERR + \n UNLOCK_BSL_ERR + \n INTERFACE_SUPPORT_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Configure(LONG mode, LONG value); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Configure(int32_t mode, int32_t value); /** -\fn STATUS_T MSP430_VCC(LONG voltage); +\fn STATUS_T MSP430_VCC(int32_t voltage); \brief Set the device Vcc pin to voltage/1000 volts.\n - The USB JTAG adaptor also checks if external power is supplied to the traget device. - If an external voltage is detected MSP430_VCC() returns STATUS_ERROR and one of the - corresponding error codes. + The USB JTAG adaptor also checks if external power is supplied to the traget device. + If an external voltage is detected MSP430_VCC() returns STATUS_ERROR and one of the + corresponding error codes. \note 1. A "voltage" of zero (0) turns off voltage to the device. \note 2. This function must be called second (after MSP430_Initialize() is called). - + \param voltage: The device Vcc pin is set to voltage/1000 volts. \return STATUS_OK: The Vcc was set to voltage. @@ -691,15 +883,15 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Configure(LONG mode, LONG value); \par Error codes: PARAMETER_ERR \n VCC_ERR -\n LOW_EX_POWER -\n EX_POWER_OK +\n LOW_EX_POWER +\n EX_POWER_OK \n HIGH_EX_POWER */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_VCC(LONG voltage); +DLL430_SYMBOL STATUS_T WINAPI MSP430_VCC(int32_t voltage); /** -\fn STATUS_T MSP430_GetCurVCCT(LONG* voltage); +\fn STATUS_T MSP430_GetCurVCCT(int32_t* voltage); \brief Report back the current voltage supplied to the target device. @@ -715,10 +907,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_VCC(LONG voltage); \par Error codes: COMM_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_GetCurVCCT(LONG* voltage); +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetCurVCCT(int32_t* voltage); /** -\fn STATUS_T MSP430_GetExtVoltage(LONG* voltage, LONG* state); +\fn STATUS_T MSP430_GetExtVoltage(int32_t* voltage, int32_t* state); \brief Detect if external voltage is supplied to the target device. Report back the value of an external voltage as well as an corresponding state. @@ -730,7 +922,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_GetCurVCCT(LONG* voltage); \param voltage: The current external voltage. \param state: External voltage can have one of the following states: - - NO_EX_POWER, no external power was detected + - NO_EX_POWER, no external power was detected - LOW_EX_POWER, external power is too low - EX_POWER_OK, external power detected - HIGH_EX_POWER, external power too high @@ -741,11 +933,11 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_GetCurVCCT(LONG* voltage); \par Error codes: COMM_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_GetExtVoltage(LONG* voltage, LONG* state); +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetExtVoltage(int32_t* voltage, int32_t* state); /** -\fn STATUS_T MSP430_Reset(LONG method, LONG execute, LONG releaseJTAG); +\fn STATUS_T MSP430_Reset(int32_t method, int32_t execute, int32_t releaseJTAG); \brief Reset the device using the specified method(s). Optionally start device execution, and release the JTAG control signals. @@ -774,10 +966,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_GetExtVoltage(LONG* voltage, LONG* state); \n RUN_ERR \n NO_DEVICE_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Reset(LONG method, LONG execute, LONG releaseJTAG); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Reset(int32_t method, int32_t execute, int32_t releaseJTAG); /** -\fn STATUS_T MSP430_Erase(LONG type, LONG address, LONG length); +\fn STATUS_T MSP430_Erase(int32_t type, int32_t address, int32_t length); \brief Erase the device FLASH/FRAM memory. @@ -789,14 +981,14 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Reset(LONG method, LONG execute, LONG relea \note 5. Some device families have a locked INFO memory segment (INFO A). MSP430_Configure(LOCKED_FLASH_ACCESS,...) can be used to unlock/lock this segment. Having parameter 'type' set to ERASE_ALL will erase the complete INFO memory in case - the INFO A segment was unlocked prior. - Otherwise only INFO segments B, C and D will be erased. + the INFO A segment was unlocked prior. + Otherwise only INFO segments B, C and D will be erased. \note 6. Some device families have a lockable BSL memory segment. MSP430_Configure(UNLOCK_BSL_MODE,...) can be used to unlock/lock this segment. Having parameter 'type' set to ERASE_ALL will erase the complete BSL memory in case - the BSL memory was unlocked prior. + the BSL memory was unlocked prior. \note 7. Devices using FRAM memory can be erased even though it is technically not necessary. - Doing so will fill the erased memory with 0xFFFF to be consistent with FLASH devices. + Doing so will fill the erased memory with 0xFFFF to be consistent with FLASH devices. \param type: The type parameter specifies what should be erased. - ERASE_SEGMENT: Erase the segment containing 'address'. @@ -806,7 +998,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Reset(LONG method, LONG execute, LONG relea \param address: Starting address of erase check operation. Must be word aligned. \param length: Length of erase check operation (even number of bytes). -\return STATUS_OK: The device FLASH/FRAM memory was erased. +\return STATUS_OK: The device FLASH/FRAM memory was erased. \n STATUS_ERROR: The device FLASH/FRAM memory was not erased. \par Error codes: @@ -815,10 +1007,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Reset(LONG method, LONG execute, LONG relea \n FREQUENCY_ERR \n ERASE_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Erase(LONG type, LONG address, LONG length); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Erase(int32_t type, int32_t address, int32_t length); /** -\fn STATUS_T MSP430_Memory(LONG address, CHAR* buffer, LONG count, LONG rw); +\fn STATUS_T MSP430_Memory(int32_t address, uint8_t* buffer, int32_t count, int32_t rw); \brief Read and write the device memory. "Device memory" includes the Special Function Registers (i.e., peripheral registers), RAM, Information (FLASH/FRAM) memory, Bootstrap Loader memory (BLS) and Main (FLASH/FRAM) memory. @@ -839,14 +1031,14 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Erase(LONG type, LONG address, LONG length) \par Error codes: PARAMETER_ERR -\n NO_DEVICE_ERR +\n NO_DEVICE_ERR \n READ_MEMORY_ERR \n WRITE_MEMORY_ERR -\n BSL_MEMORY_LOCKED_ERR +\n BSL_MEMORY_LOCKED_ERR \n PRESERVE_RESTORE_ERR \n FREQUENCY_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Memory(LONG address, CHAR* buffer, LONG count, LONG rw); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Memory(int32_t address, uint8_t* buffer, int32_t count, int32_t rw); #define MSP430_Read_Memory(ADDRESS, BUFFER, COUNT) MSP430_Memory(ADDRESS, BUFFER, COUNT, READ) #define MSP430_Write_Memory(ADDRESS, BUFFER, COUNT) MSP430_Memory(ADDRESS, BUFFER, COUNT, WRITE) @@ -855,8 +1047,6 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Memory(LONG address, CHAR* buffer, LONG cou \fn STATUS_T MSP430_Secure(void); \brief The device is secured (i.e., the JTAG security fuse is blown). -\n The MSP-FET430PIF LPT JTAG adaptor >>> DOES NOT <<< implement the functionality required to - blow the device security fuse. \n MSP-FET430UIF USB JTAG adaptor >>> DOES <<< support this feature. \note 1. MSP430_OpenDevice() must have been called prior to calling this function. @@ -874,11 +1064,11 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Memory(LONG address, CHAR* buffer, LONG cou DLL430_SYMBOL STATUS_T WINAPI MSP430_Secure(void); /** -\fn STATUS_T MSP430_ReadOutFile(LONG wStart, LONG wLength, CHAR* lpszFileName, LONG iFileType); +\fn STATUS_T MSP430_ReadOutFile(int32_t wStart, int32_t wLength, const char* lpszFileName, int32_t iFileType); \brief Read the specified range of device memory, and write it to the specified file. -\note +\note \param wStart: The starting address of the device memory to read. \param wLength: The length of the device memory to read (even number of bytes). \param lpszFileName: Pointer to the filename into which the read device memory is written. @@ -891,24 +1081,24 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Secure(void); \par Error codes: PARAMETER_ERR -\n NO_DEVICE_ERR +\n NO_DEVICE_ERR \n READ_MEMORY_ERR \n FILE_IO_ERR -\n INTERNAL_ERR +\n INTERNAL_ERR */ #if ! defined(uController) -DLL430_SYMBOL STATUS_T WINAPI MSP430_ReadOutFile(LONG wStart, LONG wLength, CHAR* lpszFileName, LONG iFileType); +DLL430_SYMBOL STATUS_T WINAPI MSP430_ReadOutFile(int32_t wStart, int32_t wLength, const char* lpszFileName, int32_t iFileType); #endif /** -\fn STATUS_T MSP430_ProgramFile(CHAR* File, LONG eraseType, LONG verifyMem); +\fn STATUS_T MSP430_ProgramFile(const char* File, int32_t eraseType, int32_t verifyMem); \brief The contents of the specified file are input, and then written to the device. The device is optionally erased prior to being written. The device is optionally verified after being written. -\note 1. MSP430_Identify() must have been called prior to calling this function. -\note 2. The file type must be one of TI text or Intel hex. +\note 1. MSP430_OpenDevice() must have been called prior to calling this function. +\note 2. The file type must be one of TI text or Intel hex. \note 3. verifyMem operation does not read the device memory and compare it to the file. Instead, this operation computes a checksum for the device memory, and then computes a checksum for the file, and finally compares the two checksums. @@ -926,9 +1116,9 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_ReadOutFile(LONG wStart, LONG wLength, CHAR \par Error codes: DEVICE_UNKNOWN_ERR -\n NO_DEVICE_ERR +\n NO_DEVICE_ERR \n PARAMETER_ERR -\n FILE_OPEN_ERR +\n FILE_OPEN_ERR \n FILE_END_ERR \n FILE_DETECT_ERR \n FILE_IO_ERR @@ -942,15 +1132,15 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_ReadOutFile(LONG wStart, LONG wLength, CHAR \n ERR_INTEL_HEX_CODE */ #if ! defined(uController) -DLL430_SYMBOL STATUS_T WINAPI MSP430_ProgramFile(CHAR* File, LONG eraseType, LONG verifyMem); +DLL430_SYMBOL STATUS_T WINAPI MSP430_ProgramFile(const char* File, int32_t eraseType, int32_t verifyMem); #endif /** -\fn STATUS_T MSP430_VerifyFile(CHAR* File); +\fn STATUS_T MSP430_VerifyFile(const char* File); \brief Compare the MSP430 memory and the contents of the specified file. -\note 1. The file type must be one of TI text or Intel hex. +\note 1. The file type must be one of TI text or Intel hex. \note 2. This function does not read the device memory and compare it to the file. Instead, this operation computes a checksum for the device memory, and then computes a checksum for the file, and finally compares the two checksums. @@ -963,8 +1153,8 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_ProgramFile(CHAR* File, LONG eraseType, LON \par Error codes: PARAMETER_ERR -\n NO_DEVICE_ERR -\n FILE_OPEN_ERR +\n NO_DEVICE_ERR +\n FILE_OPEN_ERR \n FILE_END_ERR \n FILE_DETECT_ERR \n FILE_IO_ERR @@ -973,11 +1163,11 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_ProgramFile(CHAR* File, LONG eraseType, LON \n ERR_INTEL_HEX_CODE */ #if ! defined(uController) -DLL430_SYMBOL STATUS_T WINAPI MSP430_VerifyFile(CHAR* File); +DLL430_SYMBOL STATUS_T WINAPI MSP430_VerifyFile(const char* File); #endif /** -\fn STATUS_T MSP430_VerifyMem(LONG StartAddr, LONG Length, CHAR *DataArray); +\fn STATUS_T MSP430_VerifyMem(int32_t StartAddr, int32_t Length, uint8_t *DataArray); \brief Compare the MSP430 memory and the specified data. @@ -995,13 +1185,13 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_VerifyFile(CHAR* File); \par Error codes: PARAMETER_ERR -\n NO_DEVICE_ERR +\n NO_DEVICE_ERR \n VERIFY_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_VerifyMem(LONG StartAddr, LONG Length, CHAR* DataArray); +DLL430_SYMBOL STATUS_T WINAPI MSP430_VerifyMem(int32_t StartAddr, int32_t Length, const uint8_t* DataArray); /** -\fn STATUS_T MSP430_EraseCheck(LONG StartAddr, LONG Length); +\fn STATUS_T MSP430_EraseCheck(int32_t StartAddr, int32_t Length); \brief Verify that the specified memory range is erased. @@ -1018,10 +1208,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_VerifyMem(LONG StartAddr, LONG Length, CHAR \par Error codes: PARAMETER_ERR -\n NO_DEVICE_ERR +\n NO_DEVICE_ERR \n VERIFY_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EraseCheck(LONG StartAddr, LONG Length); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EraseCheck(int32_t StartAddr, int32_t Length); /** \fn STATUS_T MSP430_Error_Number(void); @@ -1033,10 +1223,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EraseCheck(LONG StartAddr, LONG Length); \return The number of the last error. */ -DLL430_SYMBOL LONG WINAPI MSP430_Error_Number(void); +DLL430_SYMBOL int32_t WINAPI MSP430_Error_Number(void); /** -\fn const CHAR* MSP430_Error_String(LONG errorNumber); +\fn const char* MSP430_Error_String(int32_t errorNumber); \brief Determine the string associated with errorNumber. @@ -1046,11 +1236,11 @@ DLL430_SYMBOL LONG WINAPI MSP430_Error_Number(void); */ #if ! defined(uController) -DLL430_SYMBOL const CHAR* WINAPI MSP430_Error_String(LONG errorNumber); +DLL430_SYMBOL const char* WINAPI MSP430_Error_String(int32_t errorNumber); #endif /** -\fn STATUS_T MSP430_GetNumberOfUsbIfs(LONG* Number); +\fn STATUS_T MSP430_GetNumberOfUsbIfs(int32_t* Number); \brief Returns the number of MSP-FET430UIF USB FETs connected to the PC system. @@ -1064,15 +1254,15 @@ DLL430_SYMBOL const CHAR* WINAPI MSP430_Error_String(LONG errorNumber); \n PARAMETER_ERR */ #if ! defined(uController) -DLL430_SYMBOL STATUS_T WINAPI MSP430_GetNumberOfUsbIfs(LONG* Number); +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetNumberOfUsbIfs(int32_t* Number); #endif /** -\fn STATUS_T MSP430_GetNameOfUsbIf(LONG Idx, CHAR** Name, LONG* Status); +\fn STATUS_T MSP430_GetNameOfUsbIf(int32_t Idx, char** Name, int32_t* Status); -\brief Get the name of a Virtual Com Port (VCP), Human Interface Device (HID) - or Communication Device Class (CDC) device index assigned to a - certain MSP-FET430UIF USB FET. +\brief Get the name of a Virtual Com Port (VCP), Human Interface Device (HID) + or Communication Device Class (CDC) device index assigned to a + certain MSP-FET430UIF USB FET. Also the status of the MSP-FET430UIF is returned (ENABLE/DISABLE). \note 1. MSP430_GetNumberOfUsbIfs() must be called prior to this function. @@ -1091,12 +1281,72 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_GetNumberOfUsbIfs(LONG* Number); \par Error codes: INITIALIZE_ERR \n PARAMETER_ERR -\n USB_FET_NOT_FOUND_ERR +\n USB_FET_NOT_FOUND_ERR */ #if ! defined(uController) -DLL430_SYMBOL STATUS_T WINAPI MSP430_GetNameOfUsbIf(LONG Idx, CHAR** Name, LONG* Status); +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetNameOfUsbIf(int32_t Idx, char** Name, int32_t* Status); #endif +/** +\fn STATUS_T MSP430_GetInterface_Type(INTERFACE_TYPE*); + +\brief Determine the type of interface for the connection to the device + +\return STATUS_OK: Connection type was returned. +\n STATUS_ERROR: Could not get the connection type. + +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetInterface_Type(enum INTERFACE_TYPE* type); + +/** +\fn STATUS_T MSP430_RegisterMessageCallback(MessageCallbackFn callback); + +\brief Defines the callback function to call for messages + The callback will be automatically cleared by calling MSP430_Close() + +\return STATUS_OK: Callback could be set. +\n STATUS_ERROR: Callback could not be set. + +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_RegisterMessageCallback(MessageCallbackFn callback); + +/** +\fn STATUS_T MSP430_Autodetect(struct detectionlist *list, uint32_t *numElements, uint32_t sizeOfStruct); + +\brief Returns a list of detected FETs and devices + Function expects an array of DETECTIONLIST, the number of elements in this array (numElements) and the size of DETECTIONLIST + The number of detected FET/device combinations will be returned via numEelements + +\return STATUS_OK: Could detect FETs/devices +\n STATUS_ERROR: Error during detection + +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_Autodetect(struct DETECTIONLIST *list, uint32_t *numElements, uint32_t sizeOfStruct); + + +/** +\fn STATUS_T MSP430_GetFETName(char *str, uint32_t size) + +\brief Returns the name of the FET + +\return STATUS_OK: Could detect FET +\n STATUS_ERROR: Error during FET detection + +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetFETName(char *str, uint32_t size); + +/** +\fn STATUS_T MSP430_GetLaunchpadName(const char *device, const char *fetname, char *launchpadname, uint32_t size) + +\brief Returns the name of the launchpad in case the fetname and devicename are a valid launchpad combination + The launchpad's name is written into launchpadname. The variable launchpadname is not changed in case there was no launchpad detected + +\return STATUS_OK: No error during execution +\n STATUS_ERROR: Error during execution + +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_GetLaunchpadName(const char *device, const char *fetname, char *launchpadname, uint32_t size); + #if defined(__cplusplus) } #endif diff --git a/DLL430_v3/include/MSP430_Debug.h b/DLL430_v3/include/MSP430_Debug.h index 1220294..8e34b57 100644 --- a/DLL430_v3/include/MSP430_Debug.h +++ b/DLL430_v3/include/MSP430_Debug.h @@ -3,63 +3,63 @@ * * API for accessing debugging functionality of MSP430 library. * - * Copyright (C) 2004 - 2011 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 + * Copyright (c) 2004 - 2016 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** +/** \file MSP430_Debug.h - + \brief This file contains the DLL function headers and definitions to support the debugging functions of the MSP430.DLL - + The MSP430.DLL provides the following debug functionalities: - Read/Write CPU registers - Set/Clear code breakpoints - Single step/Run to breakpoint/Free run the CPU - Get CPU state - Access the Enhanced Emultation Module registers - - \attention The debugging functions of the DLL are made available only + + \attention The debugging functions of the DLL are made available only to third party tool developers. Using the Enhanced Emulation Module API strictly permits the usage of the functions provided via this header file. The functions are only made available due to downward compatibility reasons. - + \par Project: MSP430 JTAG Interface (MSP430.dll) - + \par Developed using: MS Visual C++ 2003/2010 - + \par Supported API calls: - MSP430_Registers() - MSP430_Register() @@ -123,8 +123,13 @@ typedef enum DEVICE_REGISTERS { R13 = 13, R14 = 14, R15 = 15, + xPSR = 16, + SPECIAL_REGISTERS = 17, + MSP_SP = 18, + PSP_SP = 19 } DEVICE_REGISTERS_t; +// ToDo Remove check with IAR #define PC R0 #define SP R1 #define SR R2 @@ -134,8 +139,8 @@ typedef enum DEVICE_REGISTERS { /// Device registers masks. #define MASKREG(REG) (1 << REG) /// Device registers mask including all registers. -#define ALL_REGS 0xffff - +#define ALL_REGS 0xffffffff + /// Run modes. typedef enum RUN_MODES { FREE_RUN = 1, /**< Run the device. Set breakpoints (if any) are disabled */ @@ -170,88 +175,93 @@ typedef enum EMEX_MODE { /// Device Emex module has 6 breakpoints, range comparison and trigger sequencer, EMEX_MEDIUM_5XX =6, /// Device Emex module has 8 or 10 breakpoints, range comparison, state storage, and trigger sequencer, - EMEX_LARGE_5XX = 7 + EMEX_LARGE_5XX = 7, + EMEX_CORTEX_M4 = 8, + EMEX_CORTEX_M0 = 9 + + } EMEX_MODE_t; /// One of the following enumerations is returned in device.clockControl typedef enum DEVICE_CLOCK_CONTROL { GCC_NONE = 0, /**< Device has no clock control. The system clock continue to function when the device is stopped by JTAG */ GCC_STANDARD = 1, /**< Device has General Clock Control register */ - GCC_EXTENDED = 2 /**< Device has Extended General Clock Control register and Module Clock Control register 0. */ + GCC_EXTENDED = 2, /**< Device has Extended General Clock Control register and Module Clock Control register 0. */ + GCC_STANDARD_I = 3 /**< Device has General Clock Control register (Note 1793)*/ } DEVICE_CLOCK_CONTROL_t; #if ! defined(uController) -/// An array of NULL terminated string pointers that point +/// An array of NULL terminated string pointers that point /// to the string descriptions for each bit of the device /// EEM General Clock Control register GENCLKCNTRL. typedef struct EEM_GCLKCTRL { /// MCLKCTRL0F to MCLKCTRL00 reflect the bit description strings for MCLKCTRL0 - CHAR* GENCLKCTRLF; - CHAR* GENCLKCTRLE; - CHAR* GENCLKCTRLD; - CHAR* GENCLKCTRLC; - CHAR* GENCLKCTRLB; - CHAR* GENCLKCTRLA; - CHAR* GENCLKCTRL9; - CHAR* GENCLKCTRL8; - CHAR* GENCLKCTRL7; - CHAR* GENCLKCTRL6; - CHAR* GENCLKCTRL5; - CHAR* GENCLKCTRL4; - CHAR* GENCLKCTRL3; - CHAR* GENCLKCTRL2; - CHAR* GENCLKCTRL1; - CHAR* GENCLKCTRL0; + const char* GENCLKCTRLF; + const char* GENCLKCTRLE; + const char* GENCLKCTRLD; + const char* GENCLKCTRLC; + const char* GENCLKCTRLB; + const char* GENCLKCTRLA; + const char* GENCLKCTRL9; + const char* GENCLKCTRL8; + const char* GENCLKCTRL7; + const char* GENCLKCTRL6; + const char* GENCLKCTRL5; + const char* GENCLKCTRL4; + const char* GENCLKCTRL3; + const char* GENCLKCTRL2; + const char* GENCLKCTRL1; + const char* GENCLKCTRL0; } EemGclkCtrl_t; -/// An array of NULL terminated string pointer that point +/// An array of NULL terminated string pointer that point /// to the string descriptions for each bit of the device /// EEM Module Clock Control registers MCLKCTRL0 and MCLKCTRL1. typedef struct EEM_MCLKCTRL { /// MCLKCTRL0F to MCLKCTRL00 reflect the bit description strings for MCLKCTRL0 - CHAR* MCLKCTRL0F; - CHAR* MCLKCTRL0E; - CHAR* MCLKCTRL0D; - CHAR* MCLKCTRL0C; - CHAR* MCLKCTRL0B; - CHAR* MCLKCTRL0A; - CHAR* MCLKCTRL09; - CHAR* MCLKCTRL08; - CHAR* MCLKCTRL07; - CHAR* MCLKCTRL06; - CHAR* MCLKCTRL05; - CHAR* MCLKCTRL04; - CHAR* MCLKCTRL03; - CHAR* MCLKCTRL02; - CHAR* MCLKCTRL01; - CHAR* MCLKCTRL00; + const char* MCLKCTRL0F; + const char* MCLKCTRL0E; + const char* MCLKCTRL0D; + const char* MCLKCTRL0C; + const char* MCLKCTRL0B; + const char* MCLKCTRL0A; + const char* MCLKCTRL09; + const char* MCLKCTRL08; + const char* MCLKCTRL07; + const char* MCLKCTRL06; + const char* MCLKCTRL05; + const char* MCLKCTRL04; + const char* MCLKCTRL03; + const char* MCLKCTRL02; + const char* MCLKCTRL01; + const char* MCLKCTRL00; /// MCLKCTRL1F to MCLKCTRL10 reflect the bit description strings for MCLKCTRL1 - CHAR* MCLKCTRL1F; - CHAR* MCLKCTRL1E; - CHAR* MCLKCTRL1D; - CHAR* MCLKCTRL1C; - CHAR* MCLKCTRL1B; - CHAR* MCLKCTRL1A; - CHAR* MCLKCTRL19; - CHAR* MCLKCTRL18; - CHAR* MCLKCTRL17; - CHAR* MCLKCTRL16; - CHAR* MCLKCTRL15; - CHAR* MCLKCTRL14; - CHAR* MCLKCTRL13; - CHAR* MCLKCTRL12; - CHAR* MCLKCTRL11; - CHAR* MCLKCTRL10; + const char* MCLKCTRL1F; + const char* MCLKCTRL1E; + const char* MCLKCTRL1D; + const char* MCLKCTRL1C; + const char* MCLKCTRL1B; + const char* MCLKCTRL1A; + const char* MCLKCTRL19; + const char* MCLKCTRL18; + const char* MCLKCTRL17; + const char* MCLKCTRL16; + const char* MCLKCTRL15; + const char* MCLKCTRL14; + const char* MCLKCTRL13; + const char* MCLKCTRL12; + const char* MCLKCTRL11; + const char* MCLKCTRL10; } EemMclkCtrl_t; #endif // end of def uController /** \brief EEM (Extended) General Clock Control. - + \full The EEM (Extended) General Clock Control allows one to configure the behavior of the system clocks (i.e., ACLK, MCLK, SMCLK, TACLK) when the device is stopped by JTAG (i.e., when the device is not - running or being single stepped). The default behavior of the clocks is to stop when the device + running or being single stepped). The default behavior of the clocks is to stop when the device is stopped by JTAG. */ @@ -290,7 +300,7 @@ typedef struct EEM_MCLKCTRL { \note Note 2. MSP430_Configure(EMULATION_MODE, ); will reset the device with PUC in order to change the emulation mode. */ - + /// Bits of the EEM General Control register. /// Do not use with MSP430_Configure(EMULATION_MODE, ); #define EEM_EN (1 << 0) @@ -305,21 +315,21 @@ typedef struct EEM_MCLKCTRL { /// The actual name of this bit is STOPPED. /// Do not use with MSP430_Configure(EMULATION_MODE, ); -#define EEM_STOPPED (1 << 7) +#define EEM_STOPPED (1 << 7) /// (Emulate) F44x 100 pins. This is the normal device mode. -#define EMU_MODE_F44X_100 0x0000 +#define EMU_MODE_F44X_100 0x0000 /// Emulate F43x 100 pins. -#define EMU_MODE_F43X_100 0x4000 +#define EMU_MODE_F43X_100 0x4000 /// Emulate F4xx 64 pins. -#define EMU_MODE_F4XX_64 0x5000 +#define EMU_MODE_F4XX_64 0x5000 /// Emulate F4xx 80 pins. -#define EMU_MODE_F4XX_80 0x6000 +#define EMU_MODE_F4XX_80 0x6000 #endif /* MSP430_DEBUG_TYPES */ /** -\fn STATUS_T MSP430_Registers(LONG registers[], LONG mask, LONG rw); +\fn STATUS_T MSP430_Registers(int32_t registers[], int32_t mask, int32_t rw); \brief Read and write the device registers. @@ -329,7 +339,7 @@ typedef struct EEM_MCLKCTRL { and after MSP430_State() indicates BREAKPOINT_HIT, SINGLE_STEP_COMPLETE, or STOPPED (after stopping a running device [stop = TRUE]). The register copies are written to the device prior to MSP430_Run() with FREE_RUN, SINGLE_STEP, and RUN_TO_BREAKPOINT. - + \param registers: The destination of registers read from the device (rw = READ),\n and the source of registers written to the device (rw = WRITE). \param mask: A bit-mask which identifies which registers are read/written\n @@ -342,16 +352,16 @@ typedef struct EEM_MCLKCTRL { \par Error codes: PARAMETER_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Registers(LONG* registers, LONG mask, LONG rw); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Registers(int32_t* registers, int32_t mask, int32_t rw); #define MSP430_Read_Registers(REGISTERS, MASK) MSP430_Registers(REGISTERS, MASK, READ) #define MSP430_Write_Registers(REGISTERS, MASK) MSP430_Registers(REGISTERS, MASK, WRITE) /** -\fn STATUS_T MSP430_ExtRegisters(LONG registers[], LONG mask, LONG rw); +\fn STATUS_T MSP430_ExtRegisters(int32_t registers[], int32_t mask, int32_t rw); \brief Read and write the extended device registers. - + \param address: The address of the extended register area \param buffer: The destination of registers read from the device (rw = READ),\n and the source of registers written to the device (rw = WRITE). @@ -363,13 +373,13 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Registers(LONG* registers, LONG mask, LONG \par Error codes: PARAMETER_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_ExtRegisters(LONG address, CHAR * buffer, LONG count,LONG rw); +DLL430_SYMBOL STATUS_T WINAPI MSP430_ExtRegisters(int32_t address, uint8_t* buffer, int32_t count, int32_t rw); #define MSP430_Read_ExtRegister(ADDRESS, BUFFER) MSP430_ExtRegisters(ADDRESS, BUFFER,1 ,READ) #define MSP430_Write_ExtRegister(ADDRESS, BUFFER) MSP430_ExtRegisters(ADDRESS, BUFFER, 1, WRITE) /** -\fn STATUS_T MSP430_Register(LONG* reg, LONG regNb, LONG rw); +\fn STATUS_T MSP430_Register(int32_t* reg, int32_t regNb, int32_t rw); \brief Read and write only one register of the device. @@ -379,7 +389,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_ExtRegisters(LONG address, CHAR * buffer, L and after MSP430_State() indicates BREAKPOINT_HIT, SINGLE_STEP_COMPLETE, or STOPPED (after stopping a running device [stop = TRUE]). The register copies are written to the device prior to MSP430_Run() with FREE_RUN, SINGLE_STEP, and RUN_TO_BREAKPOINT. - + \param reg: The destination of the register read from the device (rw = READ),\n and the source of the register written to the device (rw = WRITE). \param regNb: Number of the register to be read/written (0 - 15). @@ -391,14 +401,14 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_ExtRegisters(LONG address, CHAR * buffer, L \par Error codes: PARAMETER_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Register(LONG* reg, LONG regNb, LONG rw); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Register(int32_t* reg, int32_t regNb, int32_t rw); #define MSP430_Read_Register(REG, REGNB) MSP430_Register(REG, REGNB, READ) #define MSP430_Write_Register(REG, REGNB) MSP430_Register(REG, REGNB, WRITE) /** -\fn STATUS_T MSP430_Run(LONG mode, LONG releaseJTAG); +\fn STATUS_T MSP430_Run(int32_t mode, int32_t releaseJTAG); \brief Run the device using the specified mode. JTAG control signals are optionally released. @@ -408,7 +418,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Register(LONG* reg, LONG regNb, LONG rw); device registers. \note 4. DO NOT call this function twice without stopping device's CPU in between by calling MSP430_State() with parameter 'stop' set to TRUE. - + \param mode: The specified run mode: - FREE_RUN: Run the device. Set breakpoints (if any) are disabled. - SINGLE_STEP: A single device instruction is executed. Interrupt processing is supported. @@ -427,10 +437,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Register(LONG* reg, LONG regNb, LONG rw); \n BREAKPOINT_ERR \n PARAMETER_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_Run(LONG mode, LONG releaseJTAG); +DLL430_SYMBOL STATUS_T WINAPI MSP430_Run(int32_t mode, int32_t releaseJTAG); /** -\fn STATUS_T MSP430_State(LONG* state, LONG stop, LONG* pCPUCycles); +\fn STATUS_T MSP430_State(int32_t* state, int32_t stop, int32_t* pCPUCycles); \brief Determine the state of the device. The device is optionally stopped. During single step operations, a count of CPU cycles executed is maintained. @@ -449,7 +459,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Run(LONG mode, LONG releaseJTAG); device is run (MSP430_Run()) with FREE_RUN and RUN_TO_BREAKPOINT. \note 5. Use MSP430_State() to update the device registers before using MSP430_Registers() to read the device registers. - + \param state: The device state: - STOPPED: The device is stopped. - RUNNING: The device is running or is being single stepped. @@ -466,11 +476,11 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_Run(LONG mode, LONG releaseJTAG); \n STATE_ERR \n STEP_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_State(LONG* state, LONG stop, LONG* pCPUCycles); +DLL430_SYMBOL STATUS_T WINAPI MSP430_State(int32_t* state, int32_t stop, int32_t* pCPUCycles); /** -\fn STATUS_T WINAPI MSP430_CcGetClockNames(LONG localDeviceId, EemGclkCtrl_t** CcClockNames) +\fn STATUS_T WINAPI MSP430_CcGetClockNames(int32_t localDeviceId, EemGclkCtrl_t** CcClockNames) \brief Returns the string descriptions of the devices' EEM General Clock Control register GENCLKCNTRL. @@ -485,7 +495,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_State(LONG* state, LONG stop, LONG* pCPUCyc Application example: #include "MSP430_Debug.h" - + EemGclkCtrl_t* globalCcClockNames; MSP430_CcGetClockNames(deviceId, &globalCcClockNames); @@ -495,12 +505,12 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_State(LONG* state, LONG stop, LONG* pCPUCyc \return STATUS_OK: The function was executed successfully. */ #ifndef uController -STATUS_T WINAPI MSP430_CcGetClockNames(LONG localDeviceId, EemGclkCtrl_t** CcClockNames); +DLL430_SYMBOL STATUS_T WINAPI MSP430_CcGetClockNames(int32_t localDeviceId, EemGclkCtrl_t** CcClockNames); #endif /** -\fn STATUS_T MSP430_CcGetModuleNames(LONG localDeviceId, EemMclkCtrl_t** CcModuleNames) +\fn STATUS_T MSP430_CcGetModuleNames(int32_t localDeviceId, EemMclkCtrl_t** CcModuleNames) \brief Returns the string descriptions of the devices' EEM Module Clock Control registers MCLKCTRL0 and MCLKCTRL1. @@ -515,7 +525,7 @@ STATUS_T WINAPI MSP430_CcGetClockNames(LONG localDeviceId, EemGclkCtrl_t** CcClo Application example: #include "MSP430_Debug.h" - + EemMclkCtrl_t* globalCcModuleNames; MSP430_CcGetModuleNames(deviceId, &globalCcModuleNames); @@ -525,7 +535,7 @@ STATUS_T WINAPI MSP430_CcGetClockNames(LONG localDeviceId, EemGclkCtrl_t** CcClo \return STATUS_OK: The function was executed successfully. */ #if ! defined(uController) -DLL430_SYMBOL STATUS_T WINAPI MSP430_CcGetModuleNames(LONG localDeviceId, EemMclkCtrl_t** CcModuleNames); +DLL430_SYMBOL STATUS_T WINAPI MSP430_CcGetModuleNames(int32_t localDeviceId, EemMclkCtrl_t** CcModuleNames); #endif diff --git a/DLL430_v3/include/MSP430_EEM.h b/DLL430_v3/include/MSP430_EEM.h index d0a74d4..2baf1a3 100644 --- a/DLL430_v3/include/MSP430_EEM.h +++ b/DLL430_v3/include/MSP430_EEM.h @@ -3,77 +3,59 @@ * * API for accessing EEM functionality of MSP430 library. * - * Copyright (C) 2004 - 2011 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 + * + * 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** \file MSP430_EEM.h - + \brief This file contains the Application Programming Interface (API) to access the Enhanced Emulation Module (EEM) of a MSP430 device using the MSP430.DLL. - + The DLL provides the following functionalities - EEM Hardware Resource Management - Caller notifying mechanism using Windows Message Queues (Replaced by alternate callback mechanism since version 2.1.2.0) - Autonom detection of state changes (e.g. breakpoint hit, single step complete) - - \attention Since the DLL manages all the available HW resources itself it is - not permitted to mix the old EEM API (EEM_Open(), EEM_Read(), - EEM_Write()) with the functions provided via this header - file. The old EEM API functions are only available for compatibility - reasons. It is up to the caller to make use of the new or the old API. - As soon as the new EEM API is initialized by MSP430_EEM_Init() functions - of the old API are executed but will post a warning message as unexpected - exceptions might occure. - Integration support from Texas Instruments will only be given for the - new API provided via this header file. - Following functions MUST NOT be called any longer when EEM API is used: + + \attention Following functions MUST NOT be called any longer when EEM API is used: - MSP430_Configure() with parameter 'mode' set to CLK_CNTRL_MODE - MSP430_Configure() with parameter 'mode' set to MCLK_CNTRL_MODE - MSP430_State() with parameter 'stop' set to FALSE - - MSP430_Breakpoint() - - MSP430_EEM_Open() - - MSP430_EEM_Read_Register() - - MSP430_EEM_Read_Register_Test() - - MSP430_EEM_Write_Register() - - MSP430_EEM_Close() - + \par Project: MSP430 Enhanced Emulation Module (EEM) API - + \par Developed using: MS Visual C++ 2003/2010 - + \par Supported API calls: - MSP430_EEM_Init() - MSP430_EEM_SetBreakpoint() @@ -89,6 +71,8 @@ - MSP430_EEM_GetVariableWatch() - MSP430_EEM_SetClockControl() - MSP430_EEM_GetClockControl() + - MSP430_EEM_SetClockControl2() + - MSP430_EEM_GetClockControl2() - MSP430_EEM_SetSequencer() - MSP430_EEM_GetSequencer() - MSP430_EEM_ReadSequencerState() @@ -143,21 +127,21 @@ extern "C" { */ typedef struct MESSAGE_ID { /// Message identification for "Single step complete" event - ULONG uiMsgIdSingleStep; + uint32_t uiMsgIdSingleStep; /// Message identification for "Breakpoint hit" event - ULONG uiMsgIdBreakpoint; + uint32_t uiMsgIdBreakpoint; /// Message identification for "Storage on trace buffer" event - ULONG uiMsgIdStorage; + uint32_t uiMsgIdStorage; /// Message identification for "Change in new state of the sequencer" event - ULONG uiMsgIdState; + uint32_t uiMsgIdState; /// Message identification for "Warning" event - ULONG uiMsgIdWarning; + uint32_t uiMsgIdWarning; /// Message identification for "Device CPU stopped" event - ULONG uiMsgIdCPUStopped; + uint32_t uiMsgIdCPUStopped; } /** \brief The type MessageID_t enables the caller of the function - MSP430_EEM_Init(LONG lhWnd, MessageID_t* pMsgIdBuffer) to set + MSP430_EEM_Init(int32_t lhWnd, MessageID_t* pMsgIdBuffer) to set dedicated message IDs for the different events. Using Windows user events normaly start at WM_USER (please refer to MSDN help) */ @@ -194,7 +178,9 @@ typedef enum BpMode { /// Set range breakpoint BP_RANGE = 2, /// Set complex breakpoint - BP_COMPLEX = 3 + BP_COMPLEX = 3, + /// Set software breakpoint + BP_SOFTWARE = 4 } BpMode_t; @@ -211,11 +197,11 @@ typedef enum BpType { /** \brief BpAccess_t gives the supported access modes for a breakpoint. Used inside the BREAKPOINT structure. - + The following table shows the relation of the access mode to the signals Fetch, R/W and DMA. - \code + \code Fetch | R/W | DMA BP_FETCH: Instuction fetch 1 | (R) | (0) BP_FETCH_HOLD: Instruction fetch hold 1 | (R) | (0) @@ -269,7 +255,9 @@ typedef enum BpAccess { /// Read & DMA access BP_READ_DMA = 14, /// Write & DMA access - BP_WRITE_DMA = 15 + BP_WRITE_DMA = 15, + /// Reasd & Write + BP_READ_WRITE = 16 } BpAccess_t; @@ -283,6 +271,8 @@ typedef enum BpAction { BP_STO = 2, /// Break and trigger state storage on trigger BP_BRK_STO = 3, + /// Cycle counter + BP_CC = 4 } BpAction_t; @@ -325,6 +315,16 @@ typedef enum BpCondition { BP_COND = 1, } BpCondition_t; +/** +\brief BpConditionValSize_t defines the data size of the value to be matched. + Used inside the BREAKPOINT structure +*/ +typedef enum BpConditionValSize { + BP_VALUE_SIZE_8_BIT = 0, + BP_VALUE_SIZE_16_BIT = 1, + BP_VALUE_SIZE_32_BIT = 2 +} BpConditionValSize_t; + /** \brief The breakpoint structure contains the settings which are required to set, modify or clear a breakpoint. @@ -333,11 +333,11 @@ typedef struct BREAKPOINT { /// Breakpoint modes BpMode_t bpMode; /// Breakpoint address/value (ignored for clear breakpoint) - LONG lAddrVal; + int32_t lAddrVal; /// Breakpoint type (used for range and complex breakpoints) BpType_t bpType; /// Breakpoint register (used for complex breakpoints with register-write trigger) - LONG lReg; + int32_t lReg; /// Breakpoint access (used only for range and complex breakpoints) BpAccess_t bpAccess; /// Breakpoint action (break/storage) (used for range and complex breakpoints) @@ -345,29 +345,31 @@ typedef struct BREAKPOINT { /// Breakpoint operator (used for complex breakpoints) BpOperat_t bpOperat; /// Breakpoint mask (used for complex breakpoints) - LONG lMask; + int32_t lMask; /// Range breakpoint end address (used for range breakpoints) - LONG lRangeEndAdVa; + int32_t lRangeEndAdVa; /// Range breakpoint action (inside/outside) (used for range breakpoints) BpRangeAction_t bpRangeAction; /// Complex breakpoint: Condition available BpCondition_t bpCondition; /// Complex breakpoint: MDB value (used for complex breakpoints) - ULONG lCondMdbVal; + uint32_t lCondMdbVal; /// Complex breakpoint: Access (used for complex breakpoints) BpAccess_t bpCondAccess; /// Complex breakpoint: Mask Value(used for complex breakpoints) - LONG lCondMask; + int32_t lCondMask; /// Complex breakpoint: Operator (used for complex breakpoints) BpOperat_t bpCondOperat; /// Combine breakpoint: Reference of a combination handle - WORD wExtCombine; + uint16_t wExtCombine; + /// Complex breakpoint: Size of the value to be matched + BpConditionValSize_t bpCondValSize; } /** \brief The type BpParameter_t is used as a source parameter to the function - MSP430_EEM_SetBreakpoint(WORD* pwBpHandle, BpParameter_t* pBpBuffer) + MSP430_EEM_SetBreakpoint(uint16_t* pwBpHandle, BpParameter_t* pBpBuffer) and as a destination parameter to the function - MSP430_EEM_GetBreakpoint(WORD wBpHandle, BpParameter_t* pBpDestBuffer) + MSP430_EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer) */ BpParameter_t; @@ -432,7 +434,7 @@ typedef struct TRACE_CTRL { /** \brief The type TrParameter_t is used by the functions: - MSP430_EEM_SetTrace(TrParameter_t* pTrBuffer) as a source buffer - - MSP430_EEM_SetTrace(TrParameter_t* pTrDestBuffer) as a destination buffer + - MSP430_EEM_SetTrace(TrParameter_t* pTrDestBuffer) as a destination buffer for the trace settings. */ TrParameter_t; @@ -445,16 +447,16 @@ TrParameter_t; */ typedef struct TRACE_BUFFER { /// Trace buffer MAB - LONG lTrBufMAB; + int32_t lTrBufMAB; /// Trace buffer MDB - LONG lTrBufMDB; + int32_t lTrBufMDB; /// Trace buffer control signals - WORD wTrBufCNTRL; + uint16_t wTrBufCNTRL; } /** \brief The type TraceBuffer_t is used by the function: - - MSP430_EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer) as a destination buffer + - MSP430_EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer) as a destination buffer for the read out data. */ TraceBuffer_t; @@ -496,13 +498,13 @@ typedef struct VARIABLE_WATCH { /// Set/clear variable VwControl_t vwControl; /// Address of the watched variable (ignored for VW_CLEAR) - ULONG lAddr; + uint32_t lAddr; /// Data type of the variable (ignored for VW_CLEAR) VwDataType_t vwDataType; } /** \brief The type VwParameter_t is used by the function: - - MSP430_EEM_SetVariable(WORD* pVwHandle, VwParameter_t* pVwBuffer) as a source buffer + - MSP430_EEM_SetVariable(uint16_t* pVwHandle, VwParameter_t* pVwBuffer) as a source buffer for the variable watch settings. */ VwParameter_t; @@ -514,15 +516,15 @@ VwParameter_t; */ typedef struct VAR_WATCH_RESOURCES { /// Handle of the variable trigger - WORD vwHandle; + uint16_t vwHandle; /// Address of the watched variable - ULONG lAddr; + uint32_t lAddr; /// Data type of the variable VwDataType_t vwDataType; } /** \brief The type VwResources_t is used as a array of 8 by the function: - - MSP430_EEM_GetVariableWatch(BOOL* pbVwEnable, VwResouces_t* paVwDestBuffer) + - MSP430_EEM_GetVariableWatch(VwEnable_t* pbVwEnable, VwResouces_t* paVwDestBuffer) as a destination buffer for the variable watch settings. */ VwResources_t; @@ -573,7 +575,7 @@ typedef enum CcModule { /** \brief Clock control: Switch general clock off (logic AND operation) -\note This function does influence the module clock control.\n +\note This function does influence the module clock control.\n If the general clock is not stop it could not be stopped at the module */ typedef enum CcGeneralCLK { @@ -597,19 +599,33 @@ typedef struct CLOCK_CONTROL { /// Extended emulation clock control (enable/disable clock control) CcControl_t ccControl; /// Switch clock for modules off (1 bit per clock module, 1: stop clock module while CPU halted) - WORD ccModule; + uint16_t ccModule; /// Switch general clock off (1 bit per clock, 1: stop clock while CPU halted) - WORD ccGeneralCLK; + uint16_t ccGeneralCLK; } /** \brief The type CcParameter_t is used by the functions: - MSP430_EEM_SetClockControl(CcParameter_t* pCcBuffer) as a source buffer - - MSP430_EEM_GetClockControl(CcParameter_t* pCcDestBuffer) as a destination buffer + - MSP430_EEM_GetClockControl(CcParameter_t* pCcDestBuffer) as a destination buffer for the clock control settings. */ CcParameter_t; - +typedef struct CLOCK_CONTROL2 { + /// Extended emulation clock control (enable/disable clock control) + CcControl_t ccControl; + /// Switch clock for modules off (1 bit per clock module, 1: stop clock module while CPU halted) + uint32_t ccModule; + /// Switch general clock off (1 bit per clock, 1: stop clock while CPU halted) + uint16_t ccGeneralCLK; +} +/** +\brief The type CcParameter2_t is used by the functions: +- MSP430_EEM_SetClockControl2(CcParameter2_t* pCcBuffer) as a source buffer +- MSP430_EEM_GetClockControl2(CcParameter2_t* pCcDestBuffer) as a destination buffer +for the clock control settings. +*/ +CcParameter2_t; /// Sequencer: Control @@ -641,18 +657,18 @@ typedef struct SEQUENCER { /// Trigger sequencer Control (enable/disable) SeqControl_t seqControl; /// Select breakpoint as a reset trigger to set start state 0 (0 = off) - WORD wHandleRstTrig; + uint16_t wHandleRstTrig; /// Select action on entering final state BpAction_t bpAction; // State X: /// Select next state x that followed of state X SeqState_t seqNextStateX[MAX_SEQ_STATE]; /// Select breakpoint as a trigger for switching from state x into next state: x path - WORD wHandleStateX[MAX_SEQ_STATE]; + uint16_t wHandleStateX[MAX_SEQ_STATE]; /// Select next state y that followed of state X SeqState_t seqNextStateY[MAX_SEQ_STATE]; /// Select breakpoint as a trigger for switching from state x into next state: y path - WORD wHandleStateY[MAX_SEQ_STATE]; + uint16_t wHandleStateY[MAX_SEQ_STATE]; } /** \brief The type SeqParameter_t is used by the functions: @@ -662,6 +678,89 @@ typedef struct SEQUENCER { SeqParameter_t; +/// Cycle counter operation mode +typedef enum { + /// Basic mode (default): counter 0 is reserved for legacy behavior + CYC_MODE_BASIC = 0x0, + /// Advanced mode: counter 0 is available for manual configuration + CYC_MODE_ADVANCED = 0x1 +} CycleCounterMode_t; + +/// Cycle counter count mode +typedef enum { + /// Counter is stopped + CYC_COUNT_STOPPED = 0x0, + /// Count on cycle counter trigger reaction (only counter 1) + CYC_COUNT_ON_REACTION = 0x1, + /// Count on all IFCLKs (used and unused by CPU or DMA) + CYC_COUNT_ON_IFCLK = 0x2, + /// Count on instruction fetch + CYC_COUNT_ON_FETCH = 0x4, + /// Count on all bus cycles (CPU or DMA) + CYC_COUNT_ON_ALL_BUS = 0x5, + /// Count on CPU bus cycles + CYC_COUNT_ON_CPU_BUS = 0x6, + /// Count on DMA bus cycles + CYC_COUNT_ON_DMA_BUS = 0x7 +} CycleCounterCountMode_t; + +/// Cycle counter start mode +typedef enum { + /// Start counter when released from debug halt + CYC_START_ON_RELEASE = 0x0, + /// Start counter on counter trigger reaction (only counter 1) + CYC_START_ON_REACTION = 0x1, + /// Start when other counter starts (only targets with 2 counters) + CYC_START_ON_COUNTER = 0x2, + /// Start counter immediately + CYC_START_IMMEDIATELY = 0x3 +} CycleCounterStartMode_t; + +/// Cycle counter stop mode +typedef enum +{ + /// Stop counter on debug halt + CYC_STOP_ON_DBG_HALT = 0x0, + /// Stop counter on counter trigger reaction (only counter 1) + CYC_STOP_ON_REACTION = 0x1, + /// Stop counter when other counter stops (only targets with 2 counters) + CYC_STOP_ON_COUNTER = 0x2, + /// Never stop counter + CYC_STOP_NO_EVENT = 0x3 +} CycleCounterStopMode_t; + +/// Cycler counter clear mode +typedef enum +{ + /// Never automatically reset counter + CYC_CLEAR_NO_EVENT = 0x0, + /// Reset counter on counter trigger reaction (only counter 1) + CYC_CLEAR_ON_REACTION = 0x1, + /// Reset counter when other counter automatically resets (only targets with 2 counters) + CYC_CLEAR_ON_COUNTER = 0x2 +} CycleCounterClearMode_t; + +/** +\brief Cycle counter parameter structure: +The data structure contains the configuration settings for a cycle counter. +*/ +typedef struct +{ + /// Condition to increase counter + CycleCounterCountMode_t countMode; + /// Condition to start counter + CycleCounterStartMode_t startMode; + /// Condition to stop counter + CycleCounterStopMode_t stopMode; + /// Condition to clear/reset counter + CycleCounterClearMode_t clearMode; +} +/** +\brief The type CycleCounterConfig_t is used by the functions: +- MSP430_EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig) +*/ +CycleCounterConfig_t; + //============================================================================== //============================================================================== @@ -673,31 +772,25 @@ SeqParameter_t; A handle to the callback function is passed to the DLL by calling MSP430_EEM_Init(). */ -typedef void (* MSP430_EVENTNOTIFY_FUNC) (UINT MsgId, UINT wParam, LONG lParam, LONG clientHandle); +typedef void (* MSP430_EVENTNOTIFY_FUNC) (uint32_t MsgId, uint32_t wParam, int32_t lParam, int32_t clientHandle); //============================================================================== #endif /* MSP430_EEM_TYPES */ /** -\fn STATUS_T WINAPI MSP430_EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, LONG clientHandle, MessageID_t* pMsgIdBuffer); +\fn STATUS_T WINAPI MSP430_EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, int32_t clientHandle, MessageID_t* pMsgIdBuffer); \brief Initialisation to enable and use the functionality of the Enhanced Emulation Module (EEM). This function resets and intitializes the EEM. -\note 1. MSP430_OpenDevice() has to be called prior to this function -\note 2. This function initializes the EEM API. By calling this function - you are no longer allowed to call the following functions of the old EEM API: - - MSP430_Breakpoint() - - MSP430_EEM_Open() - - MSP430_EEM_Read_Register() - - MSP430_EEM_Read_Register_Test() - - MSP430_EEM_Write_Register()\n +\note 1. MSP430_OpenDevice() has to be called prior to this function +\note 2. This function initializes the EEM API. The following functions can still be used with restrictions (see function documentation for details): - MSP430_State() - MSP430_Configure()\n All of these functions will post an according warning message. - + \param callback: Pointer to the callback function of the calling application. (see type definition MSP430_EVENTNOTIFY_FUNC) \param clientHandle: A handle to the calling application. @@ -706,15 +799,15 @@ typedef void (* MSP430_EVENTNOTIFY_FUNC) (UINT MsgId, UINT wParam, LONG lParam, \code Sample Client Code: - a) Client’s callback function + a) Client’s callback function - static LONG my_handle; + static int32_t my_handle; void MY_MSP430_EVENTNOTIFY_FUNC( - UINT MsgId, - UINT wParam, - LONG lParam, - LONG clientHandle) + uint32_t MsgId, + uint32_t wParam, + int32_t lParam, + int32_t clientHandle) { if(clientHandle == my_handle) { @@ -725,8 +818,8 @@ typedef void (* MSP430_EVENTNOTIFY_FUNC) (UINT MsgId, UINT wParam, LONG lParam, } } - b) Client’s main - + b) Client’s main + int main(int argc, char** argv) { // do msp430 init @@ -753,10 +846,10 @@ typedef void (* MSP430_EVENTNOTIFY_FUNC) (UINT MsgId, UINT wParam, LONG lParam, \n EEM_INIT_ERR \n THREAD_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, LONG clientHandle, MessageID_t* pMsgIdBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, int32_t clientHandle, const MessageID_t* pMsgIdBuffer); /** -\fn STATUS_T WINAPI MSP430_EEM_SetBreakpoint(WORD* pwBpHandle, BpParameter_t* pBpBuffer); +\fn STATUS_T WINAPI MSP430_EEM_SetBreakpoint(uint16_t* pwBpHandle, BpParameter_t* pBpBuffer); \brief This function is used to set, modify or clear breakpoints. A breakpoint handle is returned via the pointer pBpHandle. @@ -769,7 +862,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, \param pwBpHandle: Pointer to the assigned breakpoint handle (return parameter). The assigned handle is an arbitrary selected name of the breakpoint. - To set a combination the value pointed to (breakpoint handle) must be zero. + To set a breakpoint the value pointed to (breakpoint handle) must be zero. In case of clearing or modifying a breakpoint the handle of the breakpoint has to be provided here. If a cleared or modified breakpoint is combined with another breakpoint the combination will be updated or removed. @@ -785,13 +878,13 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, \n BREAKPOINT_ERR \n CLR_SEQ_TRIGGER */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetBreakpoint(WORD* pwBpHandle, BpParameter_t* pBpBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetBreakpoint(uint16_t* pwBpHandle, const BpParameter_t* pBpBuffer); /** -\fn STATUS_T WINAPI MSP430_EEM_GetBreakpoint(WORD wBpHandle, BpParameter_t* pBpDestBuffer); +\fn STATUS_T WINAPI MSP430_EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer); \brief This function reads back the settings of a breakpoint. No change or other action on the breakpoint is performed. @@ -804,17 +897,17 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetBreakpoint(WORD* pwBpHandle, BpParam \return STATUS_OK: breakpoint settings provided \return STATUS_ERROR: breakpoint settings not provided. - + \par Error codes: PARAMETER_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetBreakpoint(WORD wBpHandle, BpParameter_t* pBpDestBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer); /** -\fn STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint(CbControl_t CbControl, WORD wCount, WORD* pwCbHandle, WORD* pawBpHandle); +\fn STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint(CbControl_t CbControl, uint16_t wCount, uint16_t* pwCbHandle, uint16_t* pawBpHandle); \brief This function sets or clears combinations of breakpoints. The parameter wCount includes the number of breakpoints to combine or clear. @@ -846,13 +939,13 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetBreakpoint(WORD wBpHandle, BpParamet \n CLR_SEQ_TRIGGER \n SET_SEQ_TRIGGER */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint(CbControl_t CbControl, WORD wCount, WORD* pwCbHandle, WORD* pawBpHandle); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint(CbControl_t CbControl, uint16_t wCount, uint16_t* pwCbHandle, const uint16_t* pawBpHandle); /** -\fn STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint(WORD wCbHandle, WORD* pwCount, WORD* pawBpHandle); +\fn STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint(uint16_t wCbHandle, uint16_t* pwCount, uint16_t* pawBpHandle); \brief This function reads back the number and list of combined breakpoints @@ -874,7 +967,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint(CbControl_t CbCont \n INTERNAL_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint(WORD wCbHandle, WORD* pwCount, WORD* pawBpHandle); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint(uint16_t wCbHandle, uint16_t* pwCount, uint16_t* pawBpHandle); @@ -899,7 +992,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint(WORD wCbHandle, WO \n RESOURCE_ERR \n INTERNAL_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetTrace(TrParameter_t* pTrBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetTrace(const TrParameter_t* pTrBuffer); @@ -909,7 +1002,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetTrace(TrParameter_t* pTrBuffer); \brief This function reads back the settings of a Trace Configuration Register. No change or other action on the trace is performed. - + \note Observe the size of the destination buffer as a type of the structure TRACE \note MSP430_EEM_Init() must have been called prior to this function @@ -951,7 +1044,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBu /** -\fn STATUS_T WINAPI MSP430_EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, ULONG* pulCount); +\fn STATUS_T WINAPI MSP430_EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, uint32_t* pulCount); \brief This function reads the content of the Trace Buffer of the EEM. No change or other action on the trace is performed. @@ -972,21 +1065,20 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBu \n STATE_STOR_ERR \n READ_TRACE_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, ULONG* pulCount); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, uint32_t* pulCount); /** \fn STATUS_T WINAPI MSP430_EEM_RefreshTraceBuffer(void); -\brief This function refreshes the content of the Trace Buffer of the EEM. - No change or other action on the trace is performed. +\brief This function will reset the trace and clear the content of the Trace Buffer of the EEM. \note MSP430_EEM_Init() must have been called prior to this function \note The trace function must have been enabled prior to this function -\return STATUS_OK: The trace buffer was refreshed. -\return STATUS_ERROR: The trace buffer was not refreshed. +\return STATUS_OK: The trace was reset. +\return STATUS_ERROR: The trace was not reset. */ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_RefreshTraceBuffer(void); @@ -998,7 +1090,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_RefreshTraceBuffer(void); \brief This function configures the EEM State Storage Module to work as a Real Time Monitor for a variable. - + \note MSP430_EEM_Init() must have been called prior to this function \param VwEnable: Enable the variable watch function if TRUE and the @@ -1021,10 +1113,10 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetVariableWatch(VwEnable_t VwEnable); /** -\fn STATUS_T WINAPI MSP430_EEM_SetVariable(WORD* pVwHandle, VwParameter_t* pVwBuffer); +\fn STATUS_T WINAPI MSP430_EEM_SetVariable(uint16_t* pVwHandle, VwParameter_t* pVwBuffer); \brief This function sets one variable to watch. - + \note MSP430_EEM_Init() must have been called prior to this function \note The variable watch function must be enabled. @@ -1041,7 +1133,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetVariableWatch(VwEnable_t VwEnable); \n VAR_WATCH_EN_ERR \n INTERNAL_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetVariable(WORD* pVwHandle, VwParameter_t* pVwBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetVariable(uint16_t* pVwHandle, const VwParameter_t* pVwBuffer); @@ -1097,7 +1189,36 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetVariableWatch(VwEnable_t* pVwEnable, \n INTERNAL_ERR \n RESET_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetClockControl(CcParameter_t* pCcBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetClockControl(const CcParameter_t* pCcBuffer); + + + +/** +\fn STATUS_T WINAPI MSP430_EEM_SetClockControl2(CcParameter2_t* pCcBuffer); + +\brief This function configures the Clock Control settings of the EEM at emulation stop. +It is possible to control the general clock signals (MCLK, SMCLK, ACLK) and +the clock signals on extern pins. +For devices with the extended clock control it is possible to control the clock +for each module. + +\note MSP430_EEM_Init() must have been called prior to this function +\note For devices with standard clock control the parameter pCcBuffer->ccModule must be zero +\note The device will be reset after applying the new settings + +\param pCcBuffer: Pointer to the source buffer (Type of structure CLOCK_CONTROL). + +\return STATUS_OK: The clock signals have been configured. +\return STATUS_ERROR: The clock signals have not been configured. + +\par Error codes: +DEVICE_UNKNOWN_ERR +\n NO_DEVICE_ERR +\n PARAMETER_ERR +\n INTERNAL_ERR +\n RESET_ERR +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetClockControl2(const CcParameter2_t* pCcBuffer); @@ -1123,10 +1244,31 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetClockControl(CcParameter_t* pCcDestB +/** +\fn STATUS_T WINAPI MSP430_EEM_GetClockControl2(CcParameter2_t* pCcDestBuffer); + +\brief This function reads back the settings of the clock control. +No change or other action on the settings is performed. + +\note Observe the size of the destination buffer as a type of the structure CLOCK_CONTROL +\note MSP430_EEM_Init() must have been called prior to this function + +\param pCcDestBuffer: Pointer to the destination buffer (Type of structure CLOCK_CONTROL). + +\return STATUS_OK: The clock control settings have been returned. +\return STATUS_ERROR: The clock control settings have not been returned. + +\par Error codes: +PARAMETER_ERR +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetClockControl2(CcParameter2_t* pCcDestBuffer); + + + /** \fn STATUS_T WINAPI MSP430_EEM_SetSequencer(SeqParameter_t* pSeqBuffer); - + \brief This function will be used to configure the trigger sequencer feature. When disabling the sequencer all further parameters will be ignored. For each state two of four different sequencer triggers can be set as condition @@ -1134,8 +1276,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetClockControl(CcParameter_t* pCcDestB The action trigger must be provided. \note MSP430_EEM_Init() must have been called prior to this function -\note MSP430_EEM_Open() will be called if required. -\note Use only 4 different breakpoints as trigger for switching in the next state. +\note Use only 4 different breakpoints as trigger for switching in the next state. More resources not to be available. \param pSeqBuffer: Pointer to the source buffer (Type of structure SEQUENCER). @@ -1151,7 +1292,7 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetClockControl(CcParameter_t* pCcDestB \n SEQUENCER_ERR \n INTERNAL_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetSequencer(SeqParameter_t* pSeqBuffer); +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetSequencer(const SeqParameter_t* pSeqBuffer); @@ -1184,7 +1325,6 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetSequencer(SeqParameter_t* pSeqDestBu \brief Read out the state of the sequencer and store the result in the passed destination buffer. \note MSP430_EEM_Init() must have been called prior to this function -\note MSP430_EEM_Open() will be called if required. \param pSeqState: Pointer to the destination buffer (see enumeration of SeqState). @@ -1199,6 +1339,121 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_GetSequencer(SeqParameter_t* pSeqDestBu DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadSequencerState(SeqState_t* pSeqState); + + +/** +\fn STATUS_T WINAPI MSP430_EEM_SetCycleCounterMode(CycleCounterMode_t mode); + +\brief Configures the global cycle counter operation mode + +\note MSP430_EEM_Init() must have been called prior to this function + +\param mode: CYC_MODE_BASIC or CYC_MODE_ADVANCED (see CycleCounterMode_t). + +\return STATUS_OK: The cycle counter mode was changed. +\return STATUS_ERROR: The cycle counter mode was not changed. + +\par Error codes: +NO_DEVICE_ERR +FEATURE_NOT_SUPPORTED +PARAMETER_ERR +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_SetCycleCounterMode(CycleCounterMode_t mode); + + + + +/** +\fn STATUS_T WINAPI MSP430_EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig); + +\brief Set configuration for a cycle counter + +\note MSP430_EEM_Init() must have been called prior to this function + +\param wCounter: counter to configure (0 for first counter, 1 for second counter if available). +\param pCycConfig: configuration settings for the counter + +\return STATUS_OK: The cycle counter was configured. +\return STATUS_ERROR: The cycle counter was not configured. + +\par Error codes: +NO_DEVICE_ERR +CYCLE_COUNTER_CONFLICT +PARAMETER_ERR +EEM_NOT_ACCESSIBLE +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig); + + + + +/** +\fn STATUS_T WINAPI MSP430_EEM_ReadCycleCounterValue(uint32_t wCounter, uint64_t* value); + +\brief Read current counter value + +\note MSP430_EEM_Init() must have been called prior to this function + +\param wCounter: counter to read (0 for first counter, 1 for second counter if available). +\param value: pointer to an unsigned 64bit variable that the value will be written to. + +\return STATUS_OK: The cycle counter value is stored in value. +\return STATUS_ERROR: The cycle counter value is not stored in value. + +\par Error codes: +NO_DEVICE_ERR +CYCLE_COUNTER_CONFLICT +PARAMETER_ERR +EEM_NOT_ACCESSIBLE +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadCycleCounterValue(uint32_t wCounter, uint64_t* value); + + + + +/** +\fn STATUS_T WINAPI MSP430_EEM_WriteCycleCounterValue(uint32_t wCounter, uint64_t value); + +\brief Set counter value + +\note MSP430_EEM_Init() must have been called prior to this function + +\param wCounter: counter to set (0 for first counter, 1 for second counter if available). +\param value: value that the counter will be set to. + +\return STATUS_OK: The cycle counter value was set. +\return STATUS_ERROR: The cycle counter value was not set. + +\par Error codes: +NO_DEVICE_ERR +CYCLE_COUNTER_CONFLICT +EEM_NOT_ACCESSIBLE +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_WriteCycleCounterValue(uint32_t wCounter, uint64_t value); + + + + +/** +\fn STATUS_T WINAPI MSP430_EEM_ResetCycleCounter(uint32_t wCounter); + +\brief Reset counter value to 0 + +\note MSP430_EEM_Init() must have been called prior to this function + +\param wCounter: counter to reset (0 for first counter, 1 for second counter if available). + +\return STATUS_OK: The cycle counter was reset. +\return STATUS_ERROR: The cycle counter was not reset. + +\par Error codes: +NO_DEVICE_ERR +CYCLE_COUNTER_CONFLICT +EEM_NOT_ACCESSIBLE +*/ +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ResetCycleCounter(uint32_t wCounter); + + #if defined(__cplusplus) } #endif diff --git a/DLL430_v3/include/MSP430_EnergyTrace.h b/DLL430_v3/include/MSP430_EnergyTrace.h new file mode 100644 index 0000000..08c4f4c --- /dev/null +++ b/DLL430_v3/include/MSP430_EnergyTrace.h @@ -0,0 +1,290 @@ +/* + * MSP430_EnergyTrace.h + * + * API for accessing Energy Trace functionality of MSP430 library. + * + * Copyright (c) 2004 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "MSP430.h" + +/* +Record format +------------- + +The default record format for operation mode 1 for the MSP430FR5859 is 22bytes for each record consisting of: +[8byte header][8byte device State][4byte current I in nA][2byte voltage V in mV][4byte energy E in uWsec= 100 nJ] + +Where the header consists of: +[1byte eventID][7byte timestamp in usec] + +The eventID defines the number of arguments following the header. + eventID = 1 : I     value,  32 bits current + eventID = 2 : V     value,  16 bits voltage + eventID = 3 : I & V values, 32 bits current, 16 bits voltage + eventID = 4 : S     value,  64 bits state (default type for ET_PROFILING_DSTATE) + eventID = 5 : S & I values, 64 bits state, 32 bits current + eventID = 6 : S & V values, 64 bits state, 16 bits voltage + eventID = 7 : S & I & V & E values, 64 bits state, 32 bits current, 16 bits voltage, 32 bits energy (default type for ET_PROFILING_ANALOG_DSTATE) + eventID = 8 : I & V & E values, 32 bits current, 16 bits voltage, 32 bits energy (default type for ET_PROFILING_ANALOG) + eventID = 9 : S & I & V values, 64 bits state, 32 bits current, 16 bits voltage + + +Recommended initialisation settings & sequence +---------------------------------------------- + +1. For MSP430 microcontrollers with JSTATE register (e.g. MSP430FR5969) + +EnergyTraceSetup = { ET_PROFILING_ANALOG_DSTATE, // Gives callbacks of with eventID 7 + ET_PROFILING_10K, // N/A + ET_ALL, // Gives all JSTATE information + ET_EVENT_WINDOW_100, // N/A + ET_CALLBACKS_ONLY_DURING_RUN } // Callbacks are sent only when target MCU is executing code + +Recommended sequence + MSP430_Initialize() + MSP430_VCC(XYZ) + MSP430_Configure(INTERFACE_MODE, XYZ) + MSP430_OpenDevice("","",0,0x00000000,0x00000000) + MSP430_EnableEnergyTrace(EnergyTraceSetup, EnergyTraceCallbacks, Handle) + MSP430_Run(RUN_TO_BREAKPOINT, 0) or MSP430_Run(FREE_RUN, 0) + .. + + .. + MSP430_State(State,1,CPUCycles) + MSP430_DisableEnergyTrace(Handle) + MSP430_Close(0) + +2. For MSP430 microcontrollers without JSTATE register + +EnergyTraceSetup = { ET_PROFILING_ANALOG, // Gives callbacks of with eventID 8 + ET_PROFILING_10K, // N/A + ET_ALL, // N/A + ET_EVENT_WINDOW_100, // N/A + ET_CALLBACKS_ONLY_DURING_RUN } // Callbacks are sent only when target MCU is executing code + +Recommended sequence + MSP430_Initialize() + MSP430_VCC(XYZ) + MSP430_EnableEnergyTrace(EnergyTraceSetup, EnergyTraceCallbacks, Handle) + MSP430_Run(RUN_TO_BREAKPOINT, 0) or MSP430_Run(FREE_RUN, 0) or MSP430_Run(FREE_RUN, 1) + .. + + .. + MSP430_State(State,1,CPUCycles) + MSP430_DisableEnergyTrace(Handle) + MSP430_Close(0) + +3. For analog sampling without target code download and execution + +EnergyTraceSetup = { ET_PROFILING_ANALOG, // Gives callbacks of with eventID 8 + ET_PROFILING_10K, // N/A + ET_ALL, // N/A + ET_EVENT_WINDOW_100, // N/A + ET_CALLBACKS_CONTINUOUS } // Callbacks are continuously + +Recommended sequence + MSP430_Initialize() + MSP430_VCC(XYZ) + MSP430_EnableEnergyTrace(EnergyTraceSetup, EnergyTraceCallbacks, Handle) + .. + + .. + MSP430_DisableEnergyTrace(Handle) + MSP430_Close(0) + +Optional +-------- +To enable higher resolution current sampling, set "MSP430_Configure(ENERGYTRACE_CURRENTDRIVE, 1)" before calling "MSP430_VCC(XYZ)". + +*/ + +#ifndef _MSP430_ENERGYTRACE_H_ +#define _MSP430_ENERGYTRACE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// Push style interface + +// EnergyTrace mode selector +typedef enum ETMode +{ + ET_PROFILING_ANALOG, // Time-driven device state profiling (analog measurement only) + ET_PROFILING_DSTATE, // Time-driven device state profiling (digital state only) + ET_PROFILING_ANALOG_DSTATE, // Time-driven device state profiling (analog measurement and digital state) + ET_EVENT_ANALOG, // Event-triggered device state capturing (analog measurement only) + ET_EVENT_DSTATE, // Event-triggered device state capturing (digital state only) + ET_EVENT_ANALOG_DSTATE, // Event-triggered device state capturing (analog measurement and digital state) +} ETMode_t; + +// Sample frequency (callbacks will be triggered according to this frequency) +typedef enum ETProfiling_samplingFreq +{ + ET_PROFILING_OFF, // no sampling of device state + ET_PROFILING_100, // 100Hz + ET_PROFILING_1K, // 1kHz + ET_PROFILING_5K, // 5kHz + ET_PROFILING_10K, // 10kHz + ET_PROFILING_50K, // 50kHz + ET_PROFILING_100K, // 100kHz +} ETProfiling_samplingFreq_t; + +// EnergyTrace recording format selector +typedef enum ETProfilingDState_recFormat +{ + // defines how much Device State information is reported. + // For Wolverine the Device State is the content of the + // JTAG Device State Register (64bits in total) + // Comment below are true for Wolverine, but might differ for newer devices in the future. + // The record format needs to be synchronized with the information in the device specific XML files. + ET_POWER_MODE_ONLY, // bits 63 - 52 + ET_POWER_MODE_CODE_PROFILING, // bits 63 - 33 + ET_ALL // all 64 bits (bit 32 and not available mod bits must be masked out for further processing) +} ETProfilingDState_recFormat_t; + +// EnergyTrace event-triggered profiling window size +typedef enum ETEvent_window +{ + // the number of samples (plus/minus) around the event trigger which will be pushed + // to the debugger (actually the size of the ringbuffer for analog measurement) + ET_EVENT_WINDOW_25, // 25 samples of current and voltage + ET_EVENT_WINDOW_50, // 50 -"- + ET_EVENT_WINDOW_100, // 100 -"- + ET_EVENT_WINDOW_500, // 500 -"- + ET_EVENT_WINDOW_1000, // 1000 -"- +} ETEvent_window_t; + + +// EnergyTrace callback mode +typedef enum ETCallback_mode +{ + // Callbacks can be sent either continuous (e.g. for analog sampling) + // or only when the target MCU is executing code (e.g. run to breakpoint or free run) + ET_CALLBACKS_CONTINUOUS, // Callbacks are sent after MSP430_EnableEnergyTrace is called + ET_CALLBACKS_ONLY_DURING_RUN, // Callbacks are sent after MSP430_EnableEnergyTrace is called + // and the target MCU is executing code +} ETCallback_mode_t; + + +// EnergyTrace setup information +typedef struct EnergyTraceSetup_tag +{ + // Time-driven device state profiling + ETMode_t ETMode; // defines the operation mode + ETProfiling_samplingFreq_t ETFreq; // device state sampling frequency + ETProfilingDState_recFormat_t ETFormat; // format of the device state information + + // Event-triggered device state capturing + ETEvent_window_t ETSampleWindow; + + // Generic + ETCallback_mode_t ETCallback; // callback style + +} EnergyTraceSetup; + +typedef enum EnergyTraceEventID_tag +{ + ET_EVENT_CURR = 1, + ET_EVENT_VOLT = 2, + ET_EVENT_CURR_VOLT = 3, + ET_EVENT_STATE = 4, + ET_EVENT_STATE_CURR = 5, + ET_EVENT_STATE_VOLT = 6, + ET_EVENT_STATE_VOLT_CURR = 7, + ET_EVENT_CURR_VOLT_ENERGY = 8, + ET_EVENT_ALL = 9, +} EnergyTraceEventID; + +typedef void( *PushDataFn )( void* pContext, const uint8_t* pBuffer, uint32_t nBufferSize ); + +// Currently implemented error messages (in order of priority, since several errors could be present in parallel) +// "Unsupported debugger" Debugger does not support analog or dstate profiling +// "Unsupported device" Device or device variant does not support dstate profiling +// "USB voltage out of specification" USB voltage not sufficient for target power supply +// "Debugger overcurrent detected" Debugger overcurrent condition detected +// "Generic debugger error" Generic debugger malfunction detected +typedef void( *ErrorOccurredFn )( void* pContext, const char* pszErrorText ); + +typedef struct EnergyTraceCallbacks_tag +{ + // Context data defined by the client to be passed to the callback functions + void* pContext; + + // Called to push new data to the client + PushDataFn pPushDataFn; + + // Called when an error has occurred + ErrorOccurredFn pErrorOccurredFn; + +} EnergyTraceCallbacks; + +typedef void* EnergyTraceHandle; + +// Enables EnergyTrace with the given setup configuration and callback functions. +// Returns a handle that can be used to disable profiling +// If this returns an error, then MSP430_Error_Number()/MSP430_Error_String() can fetch +// the error message +DLL430_SYMBOL STATUS_T WINAPI MSP430_EnableEnergyTrace( + const EnergyTraceSetup* setup, // in + const EnergyTraceCallbacks* callbacks, // in + EnergyTraceHandle* handle ); // out + +// Reset EnergyTrace session associated with the passed in handle +DLL430_SYMBOL STATUS_T WINAPI MSP430_DisableEnergyTrace( const EnergyTraceHandle handle ); + +// Reset EnergyTrace Buffers and Processors +// Function should be called before collecting new EnergyTrace data +DLL430_SYMBOL STATUS_T WINAPI MSP430_ResetEnergyTrace( const EnergyTraceHandle handle ); + +#ifdef __cplusplus +} +#endif + +#endif // _MSP430_ENERGYTRACE_H_ diff --git a/DLL430_v3/include/MSP430_FET.h b/DLL430_v3/include/MSP430_FET.h index f79547c..02cb989 100644 --- a/DLL430_v3/include/MSP430_FET.h +++ b/DLL430_v3/include/MSP430_FET.h @@ -3,50 +3,50 @@ * * API for maintaing MSP-FET430UIF (TI USB FET) hardware and firmware. * - * Copyright (C) 2004 - 2011 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 + * Copyright (c) 2004 - 2016 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** +/** \file MSP430_FET.h - + \brief This file contains the DLL function headers and definitions to maintain the MSP-FET430UIF (TI USB FET) hardware and firmware. - + \par Project: MSP-FET430UIF (TI USB FET) Maintenance API - + \par Developed using: MS Visual C++ 2003/2010 - + \par Supported API calls: - MSP430_FET_SelfTest() - MSP430_FET_SetSignals() @@ -80,10 +80,10 @@ extern "C" { See enumeration UPDATE_STATUS_MESSAGES for details on possible notify messages. */ -typedef void (* DLL430_FET_NOTIFY_FUNC) (UINT MsgId, - ULONG wParam, - ULONG lParam, - LONG clientHandle); +typedef void (* DLL430_FET_NOTIFY_FUNC) (uint32_t MsgId, + uint32_t wParam, + uint32_t lParam, + int32_t clientHandle); /// Status messages during USB FET firmware update typedef enum UPDATE_STATUS_MESSAGES { @@ -100,9 +100,8 @@ typedef enum UPDATE_STATUS_MESSAGES { #endif /* MSP430_FET_TYPES */ - /** -\fn STATUS_T MSP430_FET_GetFwVersion(LONG* version); +\fn STATUS_T MSP430_FET_GetFwVersion(int32_t* version); \brief Returns the version number of the MSP430-FET430UIF USB FET firmware. @@ -118,10 +117,10 @@ typedef enum UPDATE_STATUS_MESSAGES { \n INTERFACE_SUPPORT_ERR \n INTERNAL_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_GetFwVersion(LONG* version); +DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_GetFwVersion(int32_t* version); /** -\fn STATUS_T WINAPI MSP430_FET_GetHwVersion(BYTE** version, LONG* count); +\fn STATUS_T WINAPI MSP430_FET_GetHwVersion(uint8_t** version, int32_t* count); \brief Returns the version number of the MSP430-FET430UIF USB FET hardware. @@ -153,20 +152,20 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_GetFwVersion(LONG* version); \n INTERNAL_ERR \n INTERFACE_SUPPORT_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_GetHwVersion(BYTE** version, LONG* count); +DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_GetHwVersion(uint8_t** version, int32_t* count); /** -\fn STATUS_T MSP430_FET_FwUpdate(CHAR* lpszFileName, +\fn STATUS_T MSP430_FET_FwUpdate(const char* lpszFileName, DLL430_FET_NOTIFY_FUNC callback, - LONG clientHandle); + int32_t clientHandle); \brief Synchronizes the firmware version of the MSP-FET430UIF (TI USB FET) with the version of the Dll. \note 1. MSP430_Initialize() must have been called prior to calling this function. -\note 2. When calling MSP430_FET_FwUpdate() in response the MSP430_Initialize() +\note 2. When calling MSP430_FET_FwUpdate() in response the MSP430_Initialize() returning a version of -3, the file CDC.log must exist - in the directory of the executed binary and the content must be the string "True" + in the directory of the executed binary and the content must be the string "True" without a newline. This file signals that a CDC driver is installed and prevents the update from making the MSP-FET430UIF unusable. \note 3. The actual firmware update of the MSP-FET430UIF might require a long time @@ -195,9 +194,9 @@ DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_GetHwVersion(BYTE** version, LONG* coun \par Error codes: COMM_ERR */ -DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_FwUpdate(CHAR* lpszFileName, +DLL430_SYMBOL STATUS_T WINAPI MSP430_FET_FwUpdate(const char* lpszFileName, DLL430_FET_NOTIFY_FUNC callback, - LONG clientHandle); + int32_t clientHandle); #if defined(__cplusplus) } diff --git a/DLL430_v3/include/MSP430_HIL.h b/DLL430_v3/include/MSP430_HIL.h index 964cc58..6005ded 100644 --- a/DLL430_v3/include/MSP430_HIL.h +++ b/DLL430_v3/include/MSP430_HIL.h @@ -3,52 +3,53 @@ * * API for low level HIL access. * - * Copyright (C) 2004 - 2011 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 + * Copyright (c) 2004 - 2016 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** \file MSP430_HIL.h - + \brief This file contains the DLL function headers and definitions for low level HIL access. - + \par Project: MSP-FET430UIF (TI USB FET) HIL API - + \par Developed using: MS Visual C++ 2003/2010 - + \par Supported API calls: - MSP430_HIL_Open() + - MSP430_HIL_Configure(); - MSP430_HIL_Connect() - MSP430_HIL_Bsl() - MSP430_HIL_Close() @@ -73,22 +74,37 @@ extern "C" { #endif +/// Configurations values for CONFIG_MODE INTERFACE_MODE +typedef enum HIL_ENTRY_STATE { + HIL_ENTRY_RSTHIGH = 0, /**< RST high during entry sequence*/ + HIL_ENTRY_RSTLOW = 1, /**< RST low during entry sequence*/ +} IHIL_ENTRY_STATE_t; + // Functions. ----------------------------------------------------------------- -STATUS_T WINAPI MSP430_HIL_Open(void); -STATUS_T WINAPI MSP430_HIL_Connect(void); -//STATUS_T WINAPI MSP430_HIL_Bsl(void); -STATUS_T WINAPI MSP430_HIL_Close(LONG vccOff); - -LONG WINAPI MSP430_HIL_JTAG_IR(LONG instruction); -LONG WINAPI MSP430_HIL_JTAG_DR(LONG data, LONG bits); -LONGLONG WINAPI MSP430_HIL_JTAG_DRX(LONGLONG data, LONG bits); -STATUS_T WINAPI MSP430_HIL_TST(LONG state); -STATUS_T WINAPI MSP430_HIL_TCK(LONG state); -STATUS_T WINAPI MSP430_HIL_TMS(LONG state); -STATUS_T WINAPI MSP430_HIL_TDI(LONG state); -STATUS_T WINAPI MSP430_HIL_RST(LONG state); -void WINAPI MSP430_HIL_ResetJtagTap(void); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_Open(void); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_Configure(int32_t mode, int32_t value); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_Connect(); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_Connect_Entry_State(int32_t value); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_Bsl(void); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_Close(int32_t vccOff); + +DLL430_SYMBOL int32_t WINAPI MSP430_HIL_JTAG_IR(int32_t instruction); +DLL430_SYMBOL int32_t WINAPI MSP430_HIL_JTAG_IR4(int32_t instruction); +DLL430_SYMBOL int32_t WINAPI MSP430_HIL_JTAG_DR(int32_t data, int32_t bits); +DLL430_SYMBOL int64_t WINAPI MSP430_HIL_JTAG_DRX(int64_t data, int32_t bits); +DLL430_SYMBOL int64_t WINAPI MSP430_HIL_JTAG_IR_DRX(int32_t instruction, int64_t data, int32_t bits); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_TST(int32_t state); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_TCK(int32_t state); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_TMS(int32_t state); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_TDI(int32_t state); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_RST(int32_t state); +DLL430_SYMBOL void WINAPI MSP430_HIL_ResetJtagTap(void); +DLL430_SYMBOL void WINAPI MSP430_HIL_FuseCheck(void); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_DPACC(uint8_t address, uint32_t *data, uint16_t RdnWr); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_APACC(uint8_t portNum, uint8_t address, uint32_t *data, uint16_t RdnWr); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_MEMAP(uint8_t portNum, uint32_t address, uint32_t *data, uint16_t RdnWr); +DLL430_SYMBOL STATUS_T WINAPI MSP430_HIL_TCLK_V3(uint8_t value); #if defined(__cplusplus) } diff --git a/DLL430_v3/src/DLL430_OldApi.h b/DLL430_v3/src/DLL430_OldApi.h index 25782bb..b40930e 100644 --- a/DLL430_v3/src/DLL430_OldApi.h +++ b/DLL430_v3/src/DLL430_OldApi.h @@ -1,133 +1,160 @@ /* * DLL430_OldApi.h * - * Old API interface for IAR. + * Old API interface for IAR & CSS. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_OLDAPI_H -#define DLL430_OLDAPI_H -#include "MSP430.h" // changed public path to local path -#include "MSP430_Debug.h" // avoid mix of v2 and v3 API header +#include "MSP430.h" #include "MSP430_EEM.h" #include "MSP430_FET.h" +#include "MSP430_HIL.h" +#include "MSP430_EnergyTrace.h" + +#include "SyncedCallWrapper.h" -#include -#include class DLL430_OldApi { public: - virtual ~DLL430_OldApi () {}; - - virtual bool GetNumberOfUsbIfs(long* Number) = 0; - virtual bool GetNameOfUsbIf(long Idx, char** Name, long* Status) = 0; - virtual bool Initialize(char* port, long* version) = 0; + virtual ~DLL430_OldApi() {}; + + virtual SyncedCallWrapper SyncedCall() = 0; + + virtual bool GetNumberOfUsbIfs(int32_t* Number) = 0; + virtual bool GetNameOfUsbIf(int32_t Idx, char** Name, int32_t* Status) = 0; + virtual bool loadDeviceDb(const char* file) = 0; + virtual bool DumpDeviceDb(const char* file) = 0; + virtual bool clearDeviceDb() = 0; + virtual bool Initialize(const char* port, int32_t* version) = 0; + virtual bool SetTargetArchitecture(TARGET_ARCHITECTURE_t architecture) = 0; virtual bool SetSystemNotfyCallback(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback) = 0; - virtual bool OpenDevice(char* Device, char* Password, long PwLength, long DeviceCode, long setId) = 0; - virtual bool GetFoundDevice(char* FoundDevice, long count) = 0; - virtual bool Close(long vccOff) = 0; - virtual bool Configure(enum CONFIG_MODE mode, long value) = 0; - virtual long Error_Number(void) = 0; - virtual const char* Error_String(long errorNumber) = 0; - virtual bool GetJtagID(long* JtagId) = 0; - virtual bool Identify(char* buffer, long count, long setId) = 0; - virtual bool Device(long localDeviceId, char* buffer, long count) = 0; - virtual bool VCC(long voltage) = 0; - virtual bool GetCurVCCT(long* voltage) = 0; - virtual bool GetExtVoltage(long* voltage, long* state) = 0; - virtual bool Erase(long type, long address, long length) = 0; - virtual bool Memory(long address, uint8_t* buf, long count, long rw) = 0; - virtual bool Secure(void) = 0; - virtual bool ReadOutFile(long wStart, long wLength, char* lpszFileName, long iFileType) = 0; - virtual bool ProgramFile(char* File, long eraseType, long verifyMem) = 0; - virtual bool VerifyFile(char* File) = 0; - virtual bool VerifyMem(long StartAddr, long Length, uint8_t* DataArray) = 0; - virtual bool EraseCheck(long StartAddr, long Length) = 0; - virtual bool Reset(long method, long execute, long releaseJTAG) = 0; - virtual bool Registers(long* registers, long mask, long rw) = 0; + virtual bool OpenDevice(const char* Device, const char* Password, int32_t PwLength, int32_t DeviceCode, int32_t setId) = 0; + virtual bool GetFoundDevice(uint8_t* FoundDevice, int32_t count) = 0; + virtual bool Close(int32_t vccOff) = 0; + virtual bool Configure(enum CONFIG_MODE mode, int32_t value) = 0; + virtual int32_t Error_Number() = 0; + virtual const char* Error_String(int32_t errorNumber) = 0; + virtual bool GetJtagID(int32_t* JtagId) = 0; + virtual bool Device(int32_t localDeviceId, uint8_t* buffer, int32_t count) = 0; + virtual bool VCC(int32_t voltage) = 0; + virtual bool GetCurVCCT(int32_t* voltage) = 0; + virtual bool GetExtVoltage(int32_t* voltage, int32_t* state) = 0; + virtual bool Erase(int32_t type, int32_t address, int32_t length) = 0; + virtual bool Memory(int32_t address, uint8_t* buf, int32_t count, int32_t rw) = 0; + virtual bool Secure() = 0; + virtual bool ReadOutFile(int32_t wStart, int32_t wLength, const char* lpszFileName, int32_t iFileType) = 0; + virtual bool ProgramFile(const char* File, int32_t eraseType, int32_t verifyMem) = 0; + virtual bool VerifyFile(const char* File) = 0; + virtual bool VerifyMem(int32_t StartAddr, int32_t Length, const uint8_t* DataArray) = 0; + virtual bool EraseCheck(int32_t StartAddr, int32_t Length) = 0; + virtual bool Reset(int32_t method, int32_t execute, int32_t releaseJTAG) = 0; + virtual bool Registers(int32_t* registers, int32_t mask, int32_t rw) = 0; + virtual bool InterfaceType(INTERFACE_TYPE* type) const = 0; + virtual bool RegisterMessageCallback(MessageCallbackFn callback) = 0; - virtual bool ExtRegisters(long address, uint8_t * buffer,long count, long rw) = 0; - - virtual bool Register(long* reg, long regNb, long rw) = 0; - virtual bool Run(long mode, long releaseJTAG) = 0; - virtual bool State(long* state, long stop, long* pCPUCycles) = 0; + virtual bool ExtRegisters(int32_t address, uint8_t * buffer, int32_t count, int32_t rw) = 0; - virtual bool CcGetClockNames(long localDeviceId, EemGclkCtrl_t** CcClockNames) = 0; - virtual bool CcGetModuleNames(long localDeviceId, EemMclkCtrl_t** CcModuleNames) = 0; - virtual bool EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, long clientHandle, MessageID_t* pMsgIdBuffer) = 0; - virtual bool EEM_SetBreakpoint(uint16_t* pwBpHandle, BpParameter_t* pBpBuffer) = 0; + virtual bool Register(int32_t* reg, int32_t regNb, int32_t rw) = 0; + virtual bool Run(int32_t mode, int32_t releaseJTAG) = 0; + virtual bool State(int32_t* state, int32_t stop, int32_t* pCPUCycles) = 0; + + virtual bool CcGetClockNames(int32_t localDeviceId, EemGclkCtrl_t** CcClockNames) = 0; + virtual bool CcGetModuleNames(int32_t localDeviceId, EemMclkCtrl_t** CcModuleNames) = 0; + virtual bool EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, int32_t clientHandle, const MessageID_t* pMsgIdBuffer) = 0; + virtual bool EEM_SetBreakpoint(uint16_t* pwBpHandle, const BpParameter_t* pBpBuffer) = 0; virtual bool EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer) = 0; - virtual bool EEM_SetCombineBreakpoint(CbControl_t CbControl, uint16_t wCount, uint16_t* pwCbHandle, uint16_t* pawBpHandle) = 0; + virtual bool EEM_SetCombineBreakpoint(CbControl_t CbControl, uint16_t wCount, uint16_t* pwCbHandle, const uint16_t* pawBpHandle) = 0; virtual bool EEM_GetCombineBreakpoint(uint16_t wCbHandle, uint16_t* pwCount, uint16_t* pawBpHandle) = 0; - virtual bool EEM_SetTrace(TrParameter_t* pTrBuffer) = 0; + virtual bool EEM_SetTrace(const TrParameter_t* pTrBuffer) = 0; virtual bool EEM_GetTrace(TrParameter_t* pTrDestBuffer) = 0; virtual bool EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer) = 0; - virtual bool EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, unsigned long *pulCount) = 0; - virtual bool EEM_RefreshTraceBuffer(void) = 0; + virtual bool EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, uint32_t *pulCount) = 0; + virtual bool EEM_RefreshTraceBuffer() = 0; virtual bool EEM_SetVariableWatch(VwEnable_t VwEnable) = 0; - virtual bool EEM_SetVariable(uint16_t* pVwHandle, VwParameter_t* pVwBuffer) = 0; + virtual bool EEM_SetVariable(uint16_t* pVwHandle, const VwParameter_t* pVwBuffer) = 0; virtual bool EEM_GetVariableWatch(VwEnable_t* pVwEnable, VwResources_t* paVwDestBuffer) = 0; - virtual bool EEM_SetClockControl(CcParameter_t* pCcBuffer) = 0; - virtual bool EEM_GetClockControl(CcParameter_t* pCcDestBuffer) = 0; - virtual bool EEM_SetSequencer(SeqParameter_t* pSeqBuffer) = 0; + virtual bool EEM_SetClockControl(const CcParameter2_t* pCcBuffer) = 0; + virtual bool EEM_GetClockControl(CcParameter2_t* pCcDestBuffer) = 0; + virtual bool EEM_SetSequencer(const SeqParameter_t* pSeqBuffer) = 0; virtual bool EEM_GetSequencer(SeqParameter_t* pSeqDestBuffer) = 0; virtual bool EEM_ReadSequencerState(SeqState_t* pSeqState) = 0; - virtual bool FET_SelfTest(long count, uint8_t* buffer) = 0; - virtual bool FET_SetSignals(long SigMask, long SigState) = 0; - virtual bool FET_Reset(void) = 0; - virtual bool FET_I2C(long address, uint8_t* buffer, long count, long rw) = 0; - virtual bool FET_EnterBootloader(void) = 0; - virtual bool FET_ExitBootloader(void) = 0; - virtual bool FET_GetFwVersion(long* version) = 0; - virtual bool FET_GetHwVersion(uint8_t** version, long* count) = 0; - virtual bool FET_FwUpdate(char* lpszFileName, DLL430_FET_NOTIFY_FUNC callback, long clientHandle) = 0; + virtual bool EEM_SetCycleCounterMode(CycleCounterMode_t mode) = 0; + virtual bool EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig) = 0; + virtual bool EEM_ReadCycleCounterValue(uint32_t wCounter, uint64_t* value) = 0; + virtual bool EEM_WriteCycleCounterValue(uint32_t wCounter, uint64_t value) = 0; + virtual bool EEM_ResetCycleCounter(uint32_t wCounter) = 0; + + virtual bool FET_SelfTest(int32_t count, uint8_t* buffer) = 0; + virtual bool FET_SetSignals(int32_t SigMask, int32_t SigState) = 0; + virtual bool FET_Reset() = 0; + virtual bool FET_I2C(int32_t address, uint8_t* buffer, int32_t count, int32_t rw) = 0; + virtual bool FET_EnterBootloader() = 0; + virtual bool FET_ExitBootloader() = 0; + virtual bool FET_GetFwVersion(int32_t* version) = 0; + virtual bool FET_GetHwVersion(uint8_t** version, int32_t* count) = 0; + virtual bool FET_FwUpdate(const char* lpszFileName, DLL430_FET_NOTIFY_FUNC callback, int32_t clientHandle) = 0; virtual void HIL_ResetJtagTap() = 0; virtual bool HIL_Open() = 0; + virtual bool HIL_Configure(enum CONFIG_MODE mode, int32_t value) = 0; virtual bool HIL_Connect() = 0; - virtual bool HIL_Close(long vccOff) = 0; - virtual bool HIL_TCK(long state) = 0; - virtual bool HIL_TMS(long state) = 0; - virtual bool HIL_TDI(long state) = 0; - virtual bool HIL_RST(long state) = 0; - virtual bool HIL_TST(long state) = 0; - virtual uint64_t HIL_JTAG_IR(long instruction) = 0; - virtual uint64_t HIL_JTAG_DR(int64_t data, long bits) = 0; -}; + virtual bool HIL_Connect_Entry_State(int32_t value) = 0; + virtual bool HIL_Bsl() = 0; + virtual bool HIL_Close(int32_t vccOff) = 0; + virtual bool HIL_TCK(int32_t state) = 0; + virtual bool HIL_TMS(int32_t state) = 0; + virtual bool HIL_TDI(int32_t state) = 0; + virtual bool HIL_RST(int32_t state) = 0; + virtual bool HIL_TST(int32_t state) = 0; + virtual uint64_t HIL_JTAG_IR(int32_t instruction) = 0; + virtual uint64_t HIL_JTAG_IR4(int32_t instruction) = 0; + virtual uint64_t HIL_JTAG_DR(int64_t data, int32_t bits) = 0; + virtual uint64_t HIL_JTAG_IR_DR(uint32_t instruction, uint64_t data, uint32_t bits) = 0; + virtual bool HIL_DPACC(uint8_t address, uint32_t *data, uint16_t RdnWr) = 0; + virtual bool HIL_APACC(uint8_t portNum, uint8_t address, uint32_t *data, uint16_t RdnWr) = 0; + virtual bool HIL_MEMAP(uint8_t portNum, uint32_t address, uint32_t *data, uint16_t RdnWr) = 0; + virtual bool HIL_TCLK(uint8_t value) = 0; + virtual void HIL_FuseCheck() = 0; -#endif /* DLL430_OLDAPI_H */ + /** + \brief Power debugging features + */ + virtual bool EnableEnergyTrace(const EnergyTraceSetup* setup, const EnergyTraceCallbacks* callbacks, EnergyTraceHandle* handle) = 0; + virtual bool DisableEnergyTrace(const EnergyTraceHandle handle) = 0; + virtual bool ResetEnergyTrace(const EnergyTraceHandle handle) = 0; + + virtual void setErrorCode(ERROR_CODE error) = 0; +}; diff --git a/DLL430_v3/src/DLL430_OldApiV3.cpp b/DLL430_v3/src/DLL430_OldApiV3.cpp index c0ebbe0..3b08131 100644 --- a/DLL430_v3/src/DLL430_OldApiV3.cpp +++ b/DLL430_v3/src/DLL430_OldApiV3.cpp @@ -3,58 +3,78 @@ * * Old API interface for IAR - V3 implementation. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef _MSC_VER -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS //disabling warnings to use secure c-function versions (e.g. strcpy_s) as not compatible none MS development -#endif -#endif - -#include +#include #include "DLL430_OldApiV3.h" -#include "DeviceDbManagerExt.h" #include "DeviceInfo.h" +#include "DeviceDb/Database.h" #include "EemMemoryAccess.h" +#include "CpuRegisters.h" +#include "IUpdateManager.h" +#include "HidUpdateManager.h" +#include "IDeviceHandle.h" +#include "../version.h" +#include "FetHandleManagerImpl.h" #include "EM/EmulationManager/IEmulationManager.h" #include "EM/Trace/ITrace.h" #include "EM/VariableWatch/IVariableWatch.h" #include "EM/Sequencer/ISequencer.h" +#include "EM/CycleCounter/ICycleCounter.h" +#include "EM/SoftwareBreakpoints/ISoftwareBreakpoints.h" #include "EM/Exceptions/Exceptions.h" +#include "../../Bios/include/error_def.h" +#include "TI/DLL430/warnings/Warnings.h" + +#include + + +#include "JtagId.h" +#include "JtagShifts.h" +#include "MemoryContent.h" +#include "FileReader.h" +#include "FileWriter.h" + +#ifdef UNIX +#include +using namespace boost::filesystem; +#endif using namespace TI::DLL430; +using namespace std; +using namespace std::placeholders; #define OLD_API_USB_TYPE "CDC" @@ -63,30 +83,38 @@ const char* const errorStrings[] = { ERROR_DEFINITIONS }; #undef ERROR_DEF - -DLL430_OldApiV3::DLL430_OldApiV3 () - : manager(FetHandleManager::instance()) +DLL430_OldApiV3::DLL430_OldApiV3() + : varWatch_state(VW_DISABLE) + , manager(new FetHandleManagerImpl) , handle(0) , errNum(0) , singleDevice(0) - , v2initCalled(false) + , selectedJtagMode(AUTOMATIC_IF) , devInfoFilled(false) + , devInfo() , devCode(0) , notifyCallback(0) - , varWatch_state(VW_DISABLE) + , clientHandle(0) + , mPollingManager(0) + , mEnergyTraceManager(0) + , devArchitecture(MSP430) + , lastCycleCount(0) { varWatch_state = VW_DISABLE; + memset(&mPdSetup, 0, sizeof(mPdSetup)); + memset(&mPdCallbacks, 0, sizeof(mPdCallbacks)); + trace_storage.trAction=TR_FETCH; trace_storage.trControl=TR_DISABLE; trace_storage.trMode=TR_HISTORY; - selectedJtagMode=ConfigManager::JTAG_MODE_UNDEF; - - this->debug.state = RUNNING; + this->debug.state = STOPPED; this->debug.jtagReleased = true; this->debug.cb.func = 0; - Logger::instance()->registerLogTarget(this); + + const uint16_t DEFAULT_CLKCNTRL = 0x0026; + const uint16_t DEVICE_DEFAULT_MCLKCNTRL0 = 0x2407; clock_control.ccControl = CC_DISABLE; clock_control.ccGeneralCLK = DEFAULT_CLKCNTRL; @@ -97,64 +125,79 @@ DLL430_OldApiV3::DLL430_OldApiV3 () memset(&sequencer_control, 0, sizeof(sequencer_control)); } -DLL430_OldApiV3::~DLL430_OldApiV3 () +DLL430_OldApiV3::~DLL430_OldApiV3 () { - Close(0); - - if (singleDevice && handle) - { - DeviceHandleManager* dhm = handle->getDeviceHandleManager(); - dhm->destroyDeviceHandle(singleDevice); - singleDevice = NULL; - } - - Logger::instance()->deregisterLogTarget(this); - - if (this->handle) - this->manager->destroyFetHandle(this->handle); - - if (this->manager) - delete this->manager; + //This is called from the detach handler, be VERY careful with what you do here + //Do NOT try to use mutexes or join threads. Do as much as possible in Close(), not here. } -void DLL430_OldApiV3::event(DebugEventTarget::EventType e, uint32_t lParam, uint16_t wParam) +void DLL430_OldApiV3::event(DebugEventTarget::EventType e, uint32_t lParam, uint16_t wParam) { - switch (e) + boost::lock_guard lock(apiMutex); + boost::lock_guard callbackLock(callbackMutex); + switch (e) + { + case DebugEventTarget::EnergyTraceData: { + if (mPdCallbacks.pPushDataFn) + { + const void* buffer = mEnergyTraceManager->getEnergyTraceBuffer(); + const size_t size = mEnergyTraceManager->getEnergyTraceBufferSize(); + + // Push the data to the IDE + if (buffer) + { + mPdCallbacks.pPushDataFn(mPdCallbacks.pContext, (const uint8_t*)buffer, static_cast(size)); + } + } + break; + + } case DebugEventTarget::Lpm5Sleep: + { execNotifyCallback(DEVICE_IN_LPM5_MODE); debug.state = LPMX5_MODE; break; + } case DebugEventTarget::Lpm5Wakeup: - if ( DebugManager* db_man = singleDevice->getDebugManager() ) + { + try + { + resetEM(); + } + catch (const EM_Exception&) {} + + if (IDebugManager* db_man = singleDevice->getDebugManager()) { db_man->syncDeviceAfterLPMx5(); - long dummy = 0; - State(&dummy,1,&dummy); + int32_t dummyState = 0; + int32_t dummyCycles = 0; + State(&dummyState, 1, &dummyCycles); } execNotifyCallback(DEVICE_WAKEUP_LPM5_MODE); debug.state = LPMX5_WAKEUP; break; - + } case DebugEventTarget::BreakpointHit: - if(debug.state == LPMX5_MODE) + { + if (debug.state == LPMX5_MODE) { break; - } - if ( DebugManager* db_man = singleDevice->getDebugManager() ) + } + if (IDebugManager* db_man = singleDevice->getDebugManager()) { //With trace/variable watch enabled, give storage events on same trigger time to be reported if (trace_storage.trControl == TR_ENABLE) { - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(100)); + this_thread::sleep_for(chrono::milliseconds(100)); } db_man->pausePolling(); } this->debug.state = BREAKPOINT_HIT; - if (this->debug.cb.func) + if (this->debug.cb.func) { (*this->debug.cb.func)( @@ -162,45 +205,50 @@ void DLL430_OldApiV3::event(DebugEventTarget::EventType e, uint32_t lParam, uin 0, 0, this->debug.cb.clientHandle - ); + ); } break; - + } case DebugEventTarget::Storage: - if (this->debug.cb.func) + { + if (this->debug.cb.func) { (*this->debug.cb.func)( this->debug.cb.ids.uiMsgIdStorage, lParam, // # new entries - 1, + wParam, this->debug.cb.clientHandle - ); + ); } break; + } case DebugEventTarget::VariableWatch: + { watchedVariablesMutex.lock(); for (map::const_iterator it = watchedVariables.begin(); it != watchedVariables.end(); ++it) { - if (it->second->isValid() && this->debug.cb.func) + if (it->second->isValid() && this->debug.cb.func) { (*this->debug.cb.func)( this->debug.cb.ids.uiMsgIdStorage, it->first, it->second->value(), this->debug.cb.clientHandle - ); + ); } } watchedVariablesMutex.unlock(); break; + } } } void DLL430_OldApiV3::log(TI::DLL430::LogTarget::Severity sev, unsigned int id, const char* message) { - switch (sev) { + switch (sev) + { case LogTarget::ERR: case LogTarget::FATAL: this->errNum = id; @@ -211,7 +259,7 @@ void DLL430_OldApiV3::log(TI::DLL430::LogTarget::Severity sev, unsigned int id, } } -bool DLL430_OldApiV3::GetNumberOfUsbIfs(long* Number) +bool DLL430_OldApiV3::GetNumberOfUsbIfs(int32_t* Number) { assert(this->manager); @@ -221,44 +269,112 @@ bool DLL430_OldApiV3::GetNumberOfUsbIfs(long* Number) // API does not support different USB types here // using default this->manager->createPortList(OLD_API_USB_TYPE, true, false); - if(NULL != Number) + if (nullptr != Number) { - *Number = static_cast(this->manager->getPortNumber()); + *Number = static_cast(this->manager->getPortNumber()); return true; - } - else - { - log(LogTarget::ERR, PARAMETER_ERR, ""); - return false; } + + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; } -bool DLL430_OldApiV3::GetNameOfUsbIf(long Idx, char** Name, long* Status) -{ - PortInfo * portinfo = this->manager->getPortElement(Idx); - if(NULL != portinfo) +bool DLL430_OldApiV3::GetNameOfUsbIf(int32_t Idx, char** Name, int32_t* Status) +{ + if (PortInfo *portinfo = this->manager->getPortElement(Idx)) { // Copy string to persistent buffer that won't become invalid after init - port_names.resize( max((long)port_names.size(), Idx+1) ); - strncpy(port_names[Idx].name, portinfo->getName(), sizeof(port_names[Idx].name)-1); + port_names.resize( max((int32_t)port_names.size(), Idx+1) ); + strncpy(port_names[Idx].name, portinfo->name.c_str(), sizeof(port_names[Idx].name)-1); *Name = port_names[Idx].name; - *Status = portinfo->getStatus(); + *Status = portinfo->status; return true; - } - else + } + + log(LogTarget::ERR, USB_FET_NOT_FOUND_ERR, ""); + return false; +} + +bool DLL430_OldApiV3::SetTargetArchitecture(TARGET_ARCHITECTURE_t architecture) +{ + if (architecture != MSP430 && architecture != MSP432_M4) { - log(LogTarget::ERR, USB_FET_NOT_FOUND_ERR, ""); + log(LogTarget::ERR, WRONG_TARGET_ARCHITECTURE, ""); + return false; + } + devArchitecture = architecture; + + return true; +} + +bool DLL430_OldApiV3::loadDeviceDb(const char* file) +{ + try + { + #ifndef NDEBUG + if (file) + { + // load external database only for in debug build + TI::DLL430::DeviceDb::Database().loadDevices(file, true); + } + else + { + #endif + // laod internal database + TI::DLL430::DeviceDb::Database().loadDevices("", false); + #ifndef NDEBUG + } + #endif + } + catch (const std::runtime_error& e) + { +#ifndef NDEBUG + ofstream("xml_error.log") << e.what() << endl; +#endif + log(LogTarget::ERR, DEVICE_DB_ERR, e.what()); + return false; + } + return true; +} + +bool DLL430_OldApiV3::DumpDeviceDb(const char* file) +{ + try + { + if (file) + { + // load external database only for in debug build + TI::DLL430::DeviceDb::Database().dump(file); + } + else + { + // laod internal database + TI::DLL430::DeviceDb::Database().dump("database.xml"); + } + } + catch (const std::runtime_error& e) + { +#ifndef NDEBUG + ofstream("xml_error.log") << e.what() << endl; +#endif + log(LogTarget::ERR, DEVICE_DB_ERR, e.what()); return false; } + return true; +} + +bool DLL430_OldApiV3::clearDeviceDb() +{ + TI::DLL430::DeviceDb::Database().clearDevices(); + return true; } -bool DLL430_OldApiV3::Initialize(char* port, long* version) +bool DLL430_OldApiV3::Initialize(const char* port, int32_t* version) { - lastUsedPort = port; // if ports are still open, exec a cleanup here this->Close(0); - + PortInfo *portInfo = this->manager->getPortElement(std::string(port)); if (!portInfo) @@ -270,30 +386,32 @@ bool DLL430_OldApiV3::Initialize(char* port, long* version) #ifdef UNIX if (!portInfo) { - manager->createPortList(port, true, false); - portInfo = this->manager->getPortElement(std::string(port)); + try + { + portInfo = this->manager->getPortElement(boost::filesystem::canonical(port).filename().string()); + } + catch (...) {} } #endif - if (NULL == portInfo) + if (nullptr == portInfo) { log(LogTarget::ERR, USB_FET_NOT_FOUND_ERR, ""); return false; } - else if (portInfo->getStatus() == PortInfo::inUseByAnotherInstance) + else if (portInfo->status == PortInfo::inUseByAnotherInstance) { log(LogTarget::ERR, USB_FET_BUSY_ERR, ""); return false; } - else if ( !portInfo->open() ) + + if (portInfo->type == PortInfo::BSL) { - log(LogTarget::ERR, INITIALIZE_ERR, ""); - return false; + *version = -2; + return true; } - // if this point is reached, a port was found -> start communication now - - this->handle = this->manager->createFetHandle(portInfo); + this->handle = this->manager->createFetHandle(*portInfo, devArchitecture); if (!this->handle) { log(LogTarget::ERR, COMM_ERR, ""); @@ -301,24 +419,37 @@ bool DLL430_OldApiV3::Initialize(char* port, long* version) return false; } - if(notifyCallback!=NULL) - handle->addSystemNotifyCallback( boost::bind(&DLL430_OldApiV3::iNotifyCallback, this, _1, _2, _3, _4) ); + // Everything was OK so create an instance of the EnergyTraceManager + mPollingManager = new PollingManager(dynamic_cast(handle)); + mEnergyTraceManager = new EnergyTraceManager(dynamic_cast(handle), mPollingManager); + this->handle->getConfigManager()->setEnergyTraceManager(mEnergyTraceManager); + + if (notifyCallback!=nullptr) + { + handle->addSystemNotifyCallback(bind(&DLL430_OldApiV3::iNotifyCallback, this, std::placeholders::_1)); + } if (version) // pointer not 0 { - long verFw = 0; - this->FET_GetFwVersion(&verFw); - if( verFw == handle->getDllVersion().get()) + FetHandle* fetHandle = dynamic_cast(handle); + if (fetHandle->getControl()->getDcdcSubMcuVersion() == 0xAA) { - *version=verFw; + log(LogTarget::ERR, POSSIBLE_OVERCURRENT, ""); + *version = -1; + return false; } - else + if (this->handle->getConfigManager()->isUpdateRequired(devArchitecture)) { - *version=(-1); + *version = -1; } - if (!this->handle->getConfigManager()->checkCoreVersion()) + else { - *version=(-1); + *version = VERSION_MAJOR * 10000000 + + VERSION_MINOR * 100000 + + VERSION_PATCH * 1000 + + VERSION_BUILD; + + handle->resetState(); } } @@ -328,106 +459,211 @@ bool DLL430_OldApiV3::Initialize(char* port, long* version) bool DLL430_OldApiV3::SetSystemNotfyCallback(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback) { + + boost::lock_guard lock(callbackMutex); notifyCallback=parSystemNotifyCallback; - - if(handle && singleDevice) + + if (handle) { - handle->addSystemNotifyCallback( boost::bind(&DLL430_OldApiV3::iNotifyCallback, this, _1, _2, _3, _4) ); - - if ( DebugManager* db_man = singleDevice->getDebugManager() ) - { - if (db_man->getLpmDebugging()) - { - db_man->activateJStatePolling(this); - } - } + handle->addSystemNotifyCallback(bind(&DLL430_OldApiV3::iNotifyCallback, this, std::placeholders::_1)); } return true; } -bool DLL430_OldApiV3::OpenDevice(char* Device, char* Password, long PwLength, long DeviceCode, long setId) +bool DLL430_OldApiV3::OpenDevice(const char* Device, const char* Password, int32_t PwLength, int32_t DeviceCode, int32_t setId) { string tmpName(Device); - if (tmpName == "MSP430C091" || tmpName == "MSP430C092" || - DeviceCode == 0xA55AA55A || DeviceCode == 0x5AA55AA5) + if (tmpName.find("MSP430C09") == 0) + { + DeviceCode = 0xDEADBABE; + } + + if (tmpName.find("MSP430I") == 0 && DeviceCode == 0) + { + DeviceCode = 0x20404020; + } + + if (tmpName.find("MSP430L09") == 0 || tmpName.find("MSP430C09") == 0) { this->Configure(INTERFACE_MODE, JTAG_IF); - if(DeviceCode != 0xA55AA55A && DeviceCode != 0x5AA55AA5) - { - DeviceCode = 0xDEADBABE;//c092 ROM device - devCode = 0xDEADBABE; // just for reset function - } - if(DeviceCode == 0xA55AA55A )//L092 - { - devCode = 0xA55AA55A; - } - if(DeviceCode == 0x5AA55AA5 )//C092EMU - { - devCode = 0x5AA55AA5; - } + devCode = DeviceCode; + } + FetHandle* fetHandle = dynamic_cast(handle); + + if (fetHandle && fetHandle->getControl()->getFetToolId() == MSP_FET430 && this->devArchitecture == TARGET_ARCHITECTURE_t::MSP432_M4) + { + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR_MSP432, ""); + return false; } - if(this->Identify((char*)&devInfo,sizeof(DEVICE_T), setId, Password, PwLength, DeviceCode) == true) + if (this->Identify(devInfo.buffer, sizeof(DEVICE_T), setId, Password, PwLength, DeviceCode)) { - devInfoFilled=true; + devInfoFilled = true; debug.jtagReleased = false; + + IMemoryManager *mm = singleDevice->getMemoryManager(); + if (mm) + { + MemoryArea *main = mm->getMemoryArea(MemoryArea::Main); + if (main && main->isProtectionEnabled()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_WARNING, WarningCode::WARNING_IP_PROTECTION); + } + } + return true; } return false; } -bool DLL430_OldApiV3::GetFoundDevice(char* FoundDevice, long count) +bool DLL430_OldApiV3::GetFoundDevice(uint8_t* FoundDevice, int32_t count) { - count = min((long)sizeof(DEVICE_T), count); + count = min((int32_t)sizeof(DEVICE_T), count); memcpy(FoundDevice, &devInfo, count); return true; } -bool DLL430_OldApiV3::Close(long vccOff) +bool DLL430_OldApiV3::Close(int32_t vccOff) { if (!this->handle) + { return true; + } - bool success = true; + SetSystemNotfyCallback(NULL); + RegisterMessageCallback(nullptr); + this->debug.cb.func = 0; + + selectedJtagMode = AUTOMATIC_IF; + if (singleDevice) + { + if (IDebugManager* db_man = singleDevice->getDebugManager()) + { + db_man->pausePolling(); + } + } + + //Stop polling and wait for potentially active callbacks to return + if (mPollingManager) + { + mPollingManager->shutdown(); + } + + bool success = disableSoftwareBreakpointsOnClose(); + + if (singleDevice != nullptr) + { + const bool wasRunning = deviceIsRunning(); + + int32_t state = 0, cpuCycles = 0; + State(&state, true, &cpuCycles); + + singleDevice->disableHaltOnWakeup(); + + if (wasRunning) + { + // just start device execution, JTAG test register will be set to default values by Stop JTAG. + Run(FREE_RUN, false); + } + else + { + if (IDebugManager* db_man = singleDevice->getDebugManager()) + { + db_man->setPCtoSafeLocation(); + } + } + } - if ( ConfigManager* cm = this->handle->getConfigManager() ) + if ( IConfigManager* cm = this->handle->getConfigManager() ) { + cm->stop(); + if (vccOff) { - ConfigManager* cm = this->handle->getConfigManager(); if (!cm->setDeviceVcc(0)) { log(LogTarget::ERR, VCC_ERR, ""); success = false; } } - cm->stop(); } this->handle->shutdown(); - if(singleDevice!=NULL) + traceTriggers.clear(); + breakpoints.clear(); + triggerCombinations.clear(); + watchedVariables.clear(); + varWatch_state = VW_DISABLE; + + if (singleDevice!=nullptr) { - DeviceHandleManager* dhm = handle->getDeviceHandleManager(); + IDeviceHandleManager* dhm = handle->getDeviceHandleManager(); dhm->destroyDeviceHandle(singleDevice); - singleDevice=NULL; + singleDevice=nullptr; + } + + delete mEnergyTraceManager; + mEnergyTraceManager = nullptr; + + delete mPollingManager; + mPollingManager = nullptr; + + if (manager != nullptr) + { + this->manager->destroyFetHandle(this->handle); + this->handle = 0; + + selectedJtagMode = AUTOMATIC_IF; + manager->clearPortList(); + + config_settings.clear(); } - this->manager->destroyFetHandle(this->handle); - this->handle = 0; + return success; +} + + +bool DLL430_OldApiV3::disableSoftwareBreakpointsOnClose() +{ + bool success = true; + + if (singleDevice && devArchitecture == MSP430) + { + try + { + SoftwareBreakpointManagerPtr swbpMan = singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager(); + if (swbpMan->numberOfActiveSoftwareTriggers() > 0) + { + const STATE_MODES previousState = debug.state; + const bool jtagReleased = debug.jtagReleased; - selectedJtagMode=ConfigManager::JTAG_MODE_UNDEF; - manager->clearPortList(); + int32_t state = 0, cpuCycles = 0; + State(&state, true, &cpuCycles); - config_settings.clear(); + if (!Configure(SOFTWARE_BREAKPOINTS, DISABLE)) + { + success = false; + } + if (previousState == RUNNING) + { + Run(FREE_RUN, jtagReleased); + } + } + } + catch (const EM_Exception&) + { + log(LogTarget::ERR, REMOVE_SOFTWARE_BREAKPOINT_ERR, ""); + } + } return success; } -bool DLL430_OldApiV3::Configure(enum CONFIG_MODE mode, long value) +bool DLL430_OldApiV3::Configure(enum CONFIG_MODE mode, int32_t value) { - if(handle == NULL) + if (handle == nullptr) { log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); return false; @@ -439,140 +675,248 @@ bool DLL430_OldApiV3::Configure(enum CONFIG_MODE mode, long value) config_settings[mode] = value; } - switch (mode) + switch (mode) { - case INTERFACE_MODE: - { - ConfigManager* cm = this->handle->getConfigManager(); - if (!cm) - { - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; - } - enum INTERFACE_TYPE type = (enum INTERFACE_TYPE)value; - switch (type) + case INTERFACE_MODE: { - case JTAG_IF: - selectedJtagMode=ConfigManager::JTAG_MODE_4WIRE; - cm->setJtagMode(ConfigManager::JTAG_MODE_4WIRE); - break; - case SPYBIWIRE_IF: - selectedJtagMode=ConfigManager::JTAG_MODE_SPYBIWIRE; - cm->setJtagMode(ConfigManager::JTAG_MODE_SPYBIWIRE); - break; - case SPYBIWIREJTAG_IF: - selectedJtagMode=ConfigManager::JTAG_MODE_4AFTER2; - cm->setJtagMode(ConfigManager::JTAG_MODE_4AFTER2); - break; - case AUTOMATIC_IF: - selectedJtagMode=ConfigManager::JTAG_MODE_AUTOMATIC; - break; - } + IConfigManager* cm = this->handle->getConfigManager(); + if (!cm) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + enum INTERFACE_TYPE type = (enum INTERFACE_TYPE)value; + switch (type) + { + case JTAG_IF: + selectedJtagMode = JTAG_IF; + cm->setJtagMode(JTAG_IF); + break; + case SPYBIWIRE_IF: + selectedJtagMode = SPYBIWIRE_IF; + cm->setJtagMode(SPYBIWIRE_IF); + break; + case SPYBIWIREJTAG_IF: + selectedJtagMode = SPYBIWIREJTAG_IF; + cm->setJtagMode(SPYBIWIREJTAG_IF); + break; + case SPYBIWIRE_MSP_FET_IF: + selectedJtagMode = SPYBIWIRE_MSP_FET_IF; + cm->setJtagMode(SPYBIWIRE_MSP_FET_IF); + break; + case JTAG_MSP432: + selectedJtagMode = JTAG_MSP432; + cm->setJtagMode(JTAG_MSP432); + break; + case SWD_MSP432: + selectedJtagMode = SWD_MSP432; + cm->setJtagMode(SWD_MSP432); + break; + case AUTOMATIC_IF: + selectedJtagMode = AUTOMATIC_IF; + break; + default: + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } } break; case EMULATION_MODE: + /* try + { + DeviceDb::Database().dump(); + } + catch (const runtime_error& e) + { + e.what(); + }*/ break; case SET_MDB_BEFORE_RUN: - { - if(singleDevice == NULL) + if (singleDevice == nullptr) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - DebugManager* db_man = singleDevice->getDebugManager(); - db_man->setOpcode((uint16_t)value); + try + { + if (singleDevice->getEmulationManager()->getSoftwareBreakpoints()->isEnabled()) + { + log(LogTarget::ERR, INCOMPATIBLE_WITH_SW_BREAKPOINT_API, ""); + return false; + } + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + return false; + } + + if (IDebugManager* db_man = singleDevice->getDebugManager()) + { + db_man->setOpcode((uint16_t)value); } break; case WRITE_EXTERNAL_MEMORY: if (value != 0) { - if(!writeToExternalMemory()) + try { - log(LogTarget::ERR, WRITE_MEMORY_ERR, ""); - return false; - } - } - break; + map breakpointsBackup = bp_storage; + clearSoftwareTriggers(); - case TOTAL_ERASE_DEVICE: - { - ConfigManager* cm = this->handle->getConfigManager(); - if (!cm) + if (!writeToExternalMemory()) + { + log(LogTarget::ERR, WRITE_MEMORY_ERR, ""); + return false; + } + + resetEM(); + restoreSoftwareTriggers(breakpointsBackup); + } + catch (const EM_Exception& e) { - log(LogTarget::ERR, INTERNAL_ERR, ""); + log(LogTarget::ERR, e.errorCode(), e.what()); return false; } - // execute total erase in SBW2 Mode - Configure(INTERFACE_MODE, ConfigManager::JTAG_MODE_SPYBIWIRE); - cm->totalErase(); - - // execute total erase in SBW4 Mode - Configure(INTERFACE_MODE, ConfigManager::JTAG_MODE_4AFTER2); - cm->totalErase(); } break; - case UNLOCK_BSL_MODE: - lockMemory("boot", value != ENABLE); + case TOTAL_ERASE_DEVICE: + return Erase(ERASE_TOTAL, 0, 0); + + case UNLOCK_BSL_MODE: + lockMemory(MemoryArea::Bsl, value != ENABLE); break; - case LOCKED_FLASH_ACCESS: - lockMemory("information", value != ENABLE); - break; + case LOCKED_FLASH_ACCESS: + lockMemory(MemoryArea::Info, value != ENABLE); + break; case RAM_PRESERVE_MODE: - if ( singleDevice ) + if ( singleDevice ) { - if ( MemoryManager* mm = singleDevice->getMemoryManager() ){ + if ( IMemoryManager* mm = singleDevice->getMemoryManager() ){ mm->setRamPreserveMode( value == ENABLE ); } } break; - - case DEBUG_LPM_X: - if ( singleDevice ) + case DEBUG_LPM_X: + if (singleDevice) { - if ( DebugManager* dbgManager = singleDevice->getDebugManager() ) + IConfigManager* cm = this->handle->getConfigManager(); + if (!cm) { - dbgManager->setLpmDebugging( value == ENABLE ); - if ( dbgManager->getLpmDebugging() && notifyCallback != 0) - { - dbgManager->activateJStatePolling(this); - } + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + if (IDebugManager* dbgManager = singleDevice->getDebugManager()) + { + dbgManager->setLpmDebugging(value == ENABLE); + cm->setUlpDebug(value == ENABLE); } } break; - case JTAG_SPEED: + case SET_INTERFACE_SPEED: + if (IConfigManager* cm = this->handle->getConfigManager()) { - ConfigManager* cm = this->handle->getConfigManager(); - if (!cm) + if (!cm->configureJtagSpeed(value)) { - log(LogTarget::ERR, INTERNAL_ERR, ""); + log(LogTarget::ERR, SPEED_CONFIG_ERR, ""); return false; } - cm->setJtagSpeed((ConfigManager::JTAG_4WIRE_SPEED)value); - break; } - default: + else + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + break; + + case ET_CURRENTDRIVE_FINE: + if (IConfigManager* cm = this->handle->getConfigManager()) + { + cm->setCurrentDrive(value); + } + else + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + break; + + case SOFTWARE_BREAKPOINTS: + if (!singleDevice) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + try + { + SoftwareBreakpointsPtr swbp = singleDevice->getEmulationManager()->getSoftwareBreakpoints(); + if (value == ENABLE) + { + swbp->enable(); + } + else + { + swbp->disable(); + clearSoftwareTriggers(); + } + + singleDevice->getEmulationManager()->writeConfiguration(); + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + return false; + } + break; + + case DISABLE_INTERRUPTS: + if (IConfigManager* cm = this->handle->getConfigManager()) + { + cm->setDisableInterruptsMode(value); + } + else + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + break; + + case CONFIG_JTAG_LOCK_5XX: + if (IConfigManager* cm = this->handle->getConfigManager()) + { + cm->setJTAGLock5xx(value); + } + else + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } break; + + default: + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; } return true; } -bool DLL430_OldApiV3::lockMemory(const string& memoryName, bool lock) +bool DLL430_OldApiV3::lockMemory(MemoryArea::Name memoryName, bool lock) { - if (singleDevice != NULL) + if (singleDevice != nullptr) { - MemoryManager* mm = singleDevice->getMemoryManager(); - if (mm != NULL) + IMemoryManager* mm = singleDevice->getMemoryManager(); + if (mm != nullptr) { - const bool success = mm->lock(memoryName.c_str(), lock); + const bool success = mm->lock(memoryName, lock); if (!success) { log(LogTarget::ERR, UNLOCK_BSL_ERR, ""); @@ -584,15 +928,15 @@ bool DLL430_OldApiV3::lockMemory(const string& memoryName, bool lock) return false; } -long DLL430_OldApiV3::Error_Number(void) +int32_t DLL430_OldApiV3::Error_Number(void) { - long ret = this->errNum; + int32_t ret = this->errNum; this->errNum = 0; return ret; } -const char* DLL430_OldApiV3::Error_String(long errorNumber) +const char* DLL430_OldApiV3::Error_String(int32_t errorNumber) { if ((errorNumber < 0) || (errorNumber >= INVALID_ERR)) { @@ -602,178 +946,274 @@ const char* DLL430_OldApiV3::Error_String(long errorNumber) return (errorStrings[errorNumber]); } -bool DLL430_OldApiV3::GetJtagID(long* JtagId) +bool DLL430_OldApiV3::GetJtagID(int32_t* JtagId) { - ConfigManager* cm = this->handle->getConfigManager(); - if (!cm) - { - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; - } - cm->start(); - uint16_t id = cm->start(); - if (id == 0) - { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; - } - if (JtagId) - *JtagId = id; - - return true; + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); + return false; } -bool DLL430_OldApiV3::Identify(char* buffer, long count, long setId, char* Password, long PwLength, long code) +bool DLL430_OldApiV3::Identify(uint8_t* buffer, int32_t count, int32_t setId, const char* Password, int32_t PwLength, int32_t code) { errNum=0; - if (setId < 0 || !this->handle || setId > (long)manager->getDeviceDbManager()->getMaxId()) + if (DeviceDb::Database().getMaxId() < 0) + { + log(LogTarget::ERR, DEVICE_DB_ERR, ""); + return false; + } + if (setId < 0 || setId > DeviceDb::Database().getMaxId()) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - ConfigManager* cm = this->handle->getConfigManager(); - if (!cm) + IConfigManager* cm = this->handle ? this->handle->getConfigManager() : nullptr; + if (!cm || !handle) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } + //--disable overcurrent detection for device init------ + cm->configureOverCurrent(false); + + std::shared_ptr restoreOverCurrent(nullptr, + bind(&IConfigManager::configureOverCurrent, cm, true)); + //---------------------find Interface------------------- - ConfigManager::jtagMode ifMode = ConfigManager::JTAG_MODE_UNDEF; - if((selectedJtagMode==ConfigManager::JTAG_MODE_UNDEF)||(selectedJtagMode==ConfigManager::JTAG_MODE_AUTOMATIC)) + INTERFACE_TYPE selectedMode = JTAG_IF; + if (devArchitecture == MSP432_M4) + { + if (selectedJtagMode == AUTOMATIC_IF) + { + INTERFACE_TYPE ifMode = cm->getInterfaceMode(devArchitecture); + cm->setJtagMode(ifMode); + selectedMode = ifMode; + } + else if (selectedJtagMode == SPYBIWIRE_IF || + selectedJtagMode == SWD_MSP432) + { + cm->setJtagMode(SWD_MSP432); + selectedMode = SWD_MSP432; + } + else + { + cm->setJtagMode(JTAG_MSP432); + selectedMode = JTAG_MSP432; + } + code = 0x432; + } + else if (selectedJtagMode == AUTOMATIC_IF) { - ifMode = cm->getInterfaceMode(); - if(ifMode == ConfigManager::JTAG_MODE_UNDEF) + INTERFACE_TYPE ifMode = cm->getInterfaceMode(devArchitecture); + if (ifMode == UNDEF_IF) { - // Assume 4-wire with JTAG-bits locked. This will cause the MagicPattern to be sent later - ifMode = ConfigManager::JTAG_MODE_4AFTER2; + //Assume 4-wire with JTAG-bits locked. This will cause the MagicPattern to be sent later + ifMode = SPYBIWIREJTAG_IF; } - Configure(INTERFACE_MODE, ifMode); + cm->setJtagMode(ifMode); } + //------------------end find Interface------------------- - // start JTAG + // start JTAG cm->setDeviceCode(code); //Leading "0x" is cut off here const int strLen = (Password && PwLength > 0) ? PwLength * 4 : 0; const string pwd = (strLen > 0) ? string(Password + 2, strLen) : ""; cm->setPassword(pwd); - uint16_t num = cm->start(); - if((short)num == -2) + int16_t num = cm->start(); + if (num < 0) { - log(LogTarget::ERR, WRONG_PASSWORD, ""); - return(false); + if (num == -2) + { + log(LogTarget::ERR, WRONG_PASSWORD, ""); + } + else + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + } + return false; } - DeviceHandleManager* dhm = handle->getDeviceHandleManager(); - DeviceChainInfoList* dcil = dhm->getDeviceChainInfo(); - - // test, whether target is attached - if(dcil->size()<1) + IDeviceHandleManager* dhm = handle->getDeviceHandleManager(); + + if (singleDevice != nullptr) { - // return error, if no target is attached - cm->stop(); - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return(false); - } - // the first device is the only one - DeviceChainInfoList::iterator itsdcil = dcil->begin(); - - if(singleDevice!=NULL) - { dhm->destroyDeviceHandle(singleDevice); - itsdcil->setInUse(false); } // save the device handle to work with - singleDevice = dhm->createDeviceHandle(itsdcil,(uint32_t)code); + singleDevice = dhm->createDeviceHandle((uint32_t)code, selectedMode); // sanity check - if(singleDevice==NULL) + if (singleDevice == nullptr) { cm->stop(); log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return(false); + return false; } //attach to running target - if(setId != 0x0) + if (setId != 0x0) { - if(0 == singleDevice->getJtagId())// if no jtag id was found the device is locked or lpmx.5 + if (0 == singleDevice->getJtagId())// if no jtag id was found the device is locked or lpmx.5 { setId = DEVICE_UNKNOWN; } } - if (setId == DEVICE_UNKNOWN) + if (setId == DEVICE_UNKNOWN) { - setId = singleDevice->identifyDevice(code); - if(setId == -5555) - { - log(LogTarget::ERR, FUSE_BLOWN_ERR, ""); - return false; - } + setId = singleDevice->identifyDevice(code, false); if (setId < 0) { + + bool isFuseBlown = false; + long errorCode = 0; + + if (devArchitecture == TARGET_ARCHITECTURE::MSP430) + { + isFuseBlown = singleDevice->isJtagFuseBlown(); + } + else // 432 DAP is locked + { + if (setId == -2) + { + isFuseBlown = true; + errorCode = -1; + } + else + { + cm->reset(false, true, 0, 0); + cm->setJtagMode(SWD_MSP432); + selectedMode = SWD_MSP432; + cm->start(); + } + } + + if (devArchitecture == TARGET_ARCHITECTURE::MSP430) + { + // this handles the rst of an MSP430i family device + errorCode = -1; + if (code == 0x20404020) + { + errorCode = cm->MSP430I_MagicPattern((uint16_t)selectedJtagMode); + } + if ((errorCode == -1) && (selectedJtagMode != JTAG_IF) && (singleDevice->getJtagId() != 0x89)) + { + errorCode = singleDevice->magicPatternSend((uint16_t)selectedJtagMode); + } + if (singleDevice->getJtagId() == 0x89) + { + const bool success = handle && handle->sendHilCommand(HIL_CMD_BSL_1XX_4XX); + if (!success) + { + errorCode = -1; + } + else + { + errorCode = 0; + cm->start(); + } + + } + } + // call magic pattern to get device under control - switch(singleDevice->magicPatternSend()) + switch (errorCode) { - case 0: // JTAG Mode - ifMode = ConfigManager::JTAG_MODE_4WIRE; - break; - case 1: // SBW2 Mode - ifMode = ConfigManager::JTAG_MODE_SPYBIWIRE; - break; - case 2: // SBW4 Mode - ifMode = ConfigManager::JTAG_MODE_4AFTER2; + case 0: // no error break; + case HALERR_MAGIC_PATTERN_BOOT_DATA_CRC_WRONG: + log(LogTarget::ERR, DEVICE_CRC_WRONG, ""); + return false; + case 5: + log(LogTarget::ERR, MSP432_TOTAL_ERASE, ""); + return false; default: - ifMode = ConfigManager::JTAG_MODE_UNDEF; - break; + if (isFuseBlown) + { + if (devArchitecture == TARGET_ARCHITECTURE::MSP430) + { + log(LogTarget::ERR, FUSE_BLOWN_ERR, ""); + } + else + { + log(LogTarget::ERR, DAP_LOCK_WRONG_PROTOCOL, ""); + } + } + else + { + log(LogTarget::ERR, DEVICE_UNKNOWN_ERR, ""); + } + return false; } - Configure(INTERFACE_MODE, ifMode); // If the device is locked by a password, unlock it - if(!pwd.empty()) + if (!pwd.empty()) { cm->start(); } // Re-initialize the device handle - itsdcil->setInUse(false); dhm->destroyDeviceHandle(singleDevice); - singleDevice = dhm->createDeviceHandle(itsdcil,(uint32_t)code); + singleDevice = dhm->createDeviceHandle((uint32_t)code, selectedMode); // try to identify the device again - setId = singleDevice->identifyDevice(code); - if (setId <= 0) - { - log(LogTarget::ERR, DEVICE_UNKNOWN_ERR, ""); - return false; - } + setId = singleDevice->identifyDevice(code, true); + } + if (singleDevice->isJtagFuseBlown()) + { + log(LogTarget::ERR, FUSE_BLOWN_ERR, ""); + return false; + } + if (setId < 0) + { + log(LogTarget::ERR, DEVICE_UNKNOWN_ERR, ""); + return false; } this->debug.state = STOPPED; - } + } else // this is Attach to running target { - singleDevice->setDeviceId(setId); + if (singleDevice->setDeviceId(setId) == -1) + { + log(LogTarget::ERR, DEVICE_UNKNOWN_ERR, ""); + return false; + } + this->debug.state=RUNNING; + } + + if (singleDevice->getDescription() == "Legacy") + { + log(LogTarget::ERR, LEGACY_DEVICE_ERR, ""); + return false; } - - clock_control.ccModule=singleDevice->getDebugManager()->getClockModuleSetting(); - clock_control.ccGeneralCLK=singleDevice->getDebugManager()->getClockControlSetting(); - // Apply all configuration parameters - std::map::const_iterator it = config_settings.begin(); - for( ; it != config_settings.end(); ++it) + if (IDebugManager* db_man = singleDevice->getDebugManager()) { - this->Configure(it->first,it->second); + db_man->setPollingManager(this->mPollingManager); + + clock_control.ccModule = db_man->getClockModuleSetting(); + clock_control.ccGeneralCLK = db_man->getClockControlSetting(); + lastCycleCount = static_cast(db_man->getCycleCounterValue()); } - return this->Device(setId, buffer, count); -} + std::map::const_iterator it = config_settings.begin(); -bool DLL430_OldApiV3::Identify(char* buffer, long count, long setId) -{ - return this->Identify(buffer, count, setId, NULL, 0, 0); + // Apply all configuration parameters + for ( ; it != config_settings.end(); ++it) + { + this->Configure(it->first, it->second); + } + + const DeviceInfo* info = DeviceDb::Database().getDeviceInfo(setId); + + if (info && !info->warning.empty() && WarningFactory::instance()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_WARNING, info->warning.c_str()); + } + + return this->Device(setId, buffer, count); } -bool DLL430_OldApiV3::Device(long localDeviceId, char* buffer, long count) + +bool DLL430_OldApiV3::Device(int32_t localDeviceId, uint8_t* buffer, int32_t count) { if (buffer == 0) { @@ -782,149 +1222,200 @@ bool DLL430_OldApiV3::Device(long localDeviceId, char* buffer, long count) } //use smaller value as limit for memcpy - count = min((long)sizeof(DEVICE_T), count); + count = min((int32_t)sizeof(DEVICE_T), count); DEVICE_T data; ::memset(&data, 0, sizeof(data)); data.endian = 0xaa55; data.id = (uint16_t)(localDeviceId & 0xFFFF); - if ( static_cast(localDeviceId) > TemplateDeviceDbManagerExt().getMaxId() ) + if (localDeviceId > DeviceDb::Database().getMaxId()) { log(LogTarget::ERR, PARAMETER_ERR, ""); ::memcpy(buffer, data.buffer, count); return false; } - const DeviceInfoPtr info = TemplateDeviceDbManagerExt().queryDb(localDeviceId); + const DeviceInfo* info = DeviceDb::Database().getDeviceInfo(localDeviceId); - ::strncpy((char*)data.string, info->getDescription(), sizeof(data.string) - 1); - - const DeviceInfo::memoryInfo_list_type& memoryInfo = info->getMemoryInfo(); - - int bits = 16; - WORD usbRamStart = 0; - WORD usbRamEnd = 0; + if (!info) + { + return false; + } + + ::strncpy((char*)data.string, info->description.c_str(), sizeof(data.string) - 1); + + uint16_t usbRamStart = 0; + uint16_t usbRamEnd = 0; int ramAreaCounter = 0; - - DeviceInfo::memoryInfo_list_type::const_iterator it = memoryInfo.begin(); - const DeviceInfo::memoryInfo_list_type::const_iterator listEnd = memoryInfo.end(); - for (; it != listEnd; ++it) + int infoAreaCounter = 0; + data.structSize = count; + + for (const auto& it : info->memoryLayout) { - const unsigned start = it->offset; - const unsigned end = it->offset + it->size - 1; + const MemoryInfo& mem = it.second; + const unsigned start = mem.start; + const unsigned end = start + mem.size - 1; - if (it->name == "CPU") + if (mem.name == MemoryArea::Main) { - bits = it->bits; + data.main32BitStart = start; + data.main32BitEnd = end; + data.mainStart = static_cast(start); + data.mainEnd = end; + data.mainSegmentSize = mem.segmentSize; } - else if (it->name == "main") + else if (mem.name == MemoryArea::Info && infoAreaCounter == 0) { - data.mainStart = static_cast(start); - data.mainEnd = end; + data.info32BitStart = start; + data.info32BitEnd = end; + data.infoStart = static_cast(start); + data.infoEnd = static_cast(end); + + if (data.info32BitEnd) + { + //MSP32 case + data.info32BitSegmentSize = mem.segmentSize; + } + else + { + //MSP430 case + data.info32BitSegmentSize = 0; + } + + ++infoAreaCounter; } - else if (it->name == "information") - { - data.infoStart = static_cast(start); - data.infoEnd = static_cast(end); + else if (mem.name == MemoryArea::Bsl) + { + data.bsl32BitStart = start; + data.bsl32BitEnd = end; + data.bslStart = static_cast(start); + data.bslEnd = static_cast(end); } - else if (it->name == "boot") + else if (mem.name == MemoryArea::Lcd) { - data.bslStart = static_cast(start); - data.bslEnd = static_cast(end); + data.lcdStart = static_cast(start); + data.lcdEnd = static_cast(end); } - else if (it->name == "lcd") + else if (mem.name == MemoryArea::Ram && ramAreaCounter == 0) { - data.lcdStart = static_cast(start); - data.lcdEnd = static_cast(end); + + data.ram32BitStart = start; + data.ram32BitEnd = end; + data.ramStart = static_cast(start); + data.ramEnd = static_cast(end); + ++ramAreaCounter; } - else if (it->name == "system" && ramAreaCounter == 0) - { - data.ramStart = static_cast(start); - data.ramEnd = static_cast(end); + else if (mem.name == MemoryArea::Ram && ramAreaCounter == 1) + { + data.ram32BitBandStart = start; + data.ram32BitBandEnd = end; + data.ram2Start = static_cast(start); + data.ram2End = static_cast(end); ++ramAreaCounter; } - else if (it->name == "system" && ramAreaCounter == 1) + else if (mem.name == MemoryArea::Info && infoAreaCounter == 1) { - data.ram2Start = static_cast(start); - data.ram2End = static_cast(end); - ++ramAreaCounter; + data.infoSecond32BitStart = start; + data.infoSecond32BitEnd = end; + ++infoAreaCounter; } - else if (it->name == "usbram") + + else if (mem.name == MemoryArea::UsbRam) { - usbRamStart = static_cast(start); - usbRamEnd = static_cast(end); + usbRamStart = static_cast(start); + usbRamEnd = static_cast(end); } } - if ( usbRamStart > 0 && usbRamStart < data.ramStart ) + if (usbRamStart > 0 && usbRamStart < data.ramStart) + { data.ramStart = usbRamStart; + } - if ( usbRamEnd > 0 && usbRamEnd > data.ramEnd ) + if (usbRamEnd > 0 && usbRamEnd > data.ramEnd) + { data.ramEnd = usbRamEnd; + } + data.clockControl = info->clockInfo.clockControl; + if (data.clockControl == GCC_STANDARD_I) + { + data.clockControl = GCC_STANDARD; + } - data.clockControl = info->getClockControl(); - data.nStateStorage = info->getStateStorage(); - data.nCycleCounter = info->getCycleCounter(); - data.nCycleCounterOperations = info->getCycleCounterOperations(); - data.emulation = info->getEmulationLevel(); - data.nRegTriggerOperations = info->getTriggerMask(); - data.nSequencer = info->getMaxSequencerStates(); - data.nBreakpoints = info->getPossibleTrigger(0); - data.nRegTrigger = info->getPossibleTrigger(1); - data.nCombinations = info->getPossibleTrigger(2); - data.nBreakpointsOptions = info->getTriggerOptionsModes(); - data.nBreakpointsDma = info->getTriggerDmaModes(); - data.nBreakpointsReadWrite = info->getTriggerReadWriteModes(); - data.nRegTriggerOperations = info->getRegTriggerOperations(); - data.TrigerMask = info->getTriggerMask(); - data.vccMinOp = info->minVcc(); - data.vccMaxOp = info->maxVcc(); - data.hasTestVpp = info->hasTestVpp(); - data.HasFramMemroy = info->hasFram(); + data.emulation = info->eem; + if (data.emulation < 9) + { + typedef uint16_t arr[9]; + data.nBreakpoints = arr{0, 2, 3, 8, 2, 3, 5, 8, 6 }[data.emulation]; + data.nRegTrigger = arr{0, 0, 0, 2, 0, 1, 1, 2 , 0 }[data.emulation]; + data.nCombinations = arr{0, 2, 3, 8, 2, 4, 6, 1, 0 }[data.emulation]; + data.nBreakpointsOptions = arr{0, 0, 0, 1, 1, 1, 1, 1, 0 }[data.emulation]; + data.nBreakpointsReadWrite = arr{0, 0, 0, 1, 1, 1, 1, 1, 2 }[data.emulation]; + data.nBreakpointsDma = arr{0, 0, 0, 1, 1, 1, 1, 1,0 }[data.emulation]; + data.TrigerMask = arr{ 0, 0, 0, 1, 0, 0, 0, 1, 0 }[data.emulation]; + data.nRegTriggerOperations = arr{ 0, 0, 0, 1, 0, 1, 1, 1, 1 }[data.emulation]; + data.nStateStorage = arr{ 0, 0, 0, 8, 0, 0, 0, 8, 0}[data.emulation]; + data.nCycleCounter = arr{ 0, 0, 0, 0, 1, 1, 1, 2, 1 }[data.emulation]; + data.nCycleCounterOperations = arr{ 0, 0, 0, 0, 0, 0, 0, 1, 1 }[data.emulation]; + data.nSequencer = arr{ 0, 0, 0, 1, 0, 0, 1, 3, 0 }[data.emulation]; + } + data.vccMinOp = info->voltageInfo.vccMin; + data.vccMaxOp = info->voltageInfo.vccMax; + data.hasTestVpp = info->voltageInfo.testVpp; + data.HasFramMemroy = info->features.hasFram; if (singleDevice) { data.jtagId=singleDevice->getJtagId(); data.deviceIdPtr=singleDevice->getDeviceIdPtr(); data.eemVersion=singleDevice->getEemVersion(); - - switch(data.jtagId) + + if (data.jtagId == 0x95) + { + data.cpuArch = CPU_ARCH_ORIGINAL; + } + else if (jtagIdIsXv2(data.jtagId)) { - case 0x91: data.cpuArch = CPU_ARCH_XV2; - break; + } + else if (data.jtagId == 0x77) + { + data.cpuArch = CPU_ARCH_ARM; + } + else + { + data.cpuArch = (info->bits == 20) ? CPU_ARCH_X : CPU_ARCH_ORIGINAL; + } - case 0x95: // L092 special handling - data.cpuArch = CPU_ARCH_ORIGINAL; - break; + // fill device_t structure with EmulationManager specific information + try + { + this->singleDevice->getEmulationManager()->fillEMInfo(&data); + } + catch(const EM_Exception&) + { - default: - if ( bits == 20 ) - data.cpuArch = CPU_ARCH_X; - else - data.cpuArch = CPU_ARCH_ORIGINAL; - break; } } - ::memcpy(buffer, data.buffer, count); + ::memcpy(buffer, data.buffer, count); return true; } -bool DLL430_OldApiV3::VCC(long voltage) +bool DLL430_OldApiV3::VCC(int32_t voltage) { if (voltage > 0xFFFF) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - + if (!this->handle) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - ConfigManager* cm = this->handle->getConfigManager(); + IConfigManager* cm = this->handle->getConfigManager(); if (!cm) { log(LogTarget::ERR, INTERNAL_ERR, ""); @@ -943,11 +1434,11 @@ bool DLL430_OldApiV3::VCC(long voltage) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; - } + } return true; } -bool DLL430_OldApiV3::GetCurVCCT(long* voltage) +bool DLL430_OldApiV3::GetCurVCCT(int32_t* voltage) { if (!this->handle) { @@ -955,18 +1446,18 @@ bool DLL430_OldApiV3::GetCurVCCT(long* voltage) return false; } - ConfigManager* cm = this->handle->getConfigManager(); + IConfigManager* cm = this->handle->getConfigManager(); if (!cm) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } if (voltage) - *voltage = static_cast(cm->getDeviceVcc()); - return true; + *voltage = static_cast(cm->getDeviceVcc()); + return true; } -bool DLL430_OldApiV3::GetExtVoltage(long* voltage, long* state) +bool DLL430_OldApiV3::GetExtVoltage(int32_t* voltage, int32_t* state) { if (!this->handle) { @@ -974,116 +1465,251 @@ bool DLL430_OldApiV3::GetExtVoltage(long* voltage, long* state) return false; } - ConfigManager* cm = this->handle->getConfigManager(); + IConfigManager* cm = this->handle->getConfigManager(); if (!cm) { log(LogTarget::ERR, VCC_ERR, ""); return false; } - + const uint16_t extVoltage = cm->getExternalVcc(); - + if (voltage) - *voltage = static_cast(cm->getExternalVcc()); - - if (state) + *voltage = static_cast(cm->getExternalVcc()); + + if (state) { - if (extVoltage < 1000) + if (extVoltage < 1000) { //1V *state = NO_EX_POWER; - } - else if (extVoltage < 1700) + } + else if (extVoltage < 1700) { //1.7V *state = LOW_EX_POWER; - } - else if (extVoltage < 5600) + } + else if (extVoltage < 5600) { //5.6V *state = EX_POWER_OK; - } - else + } + else { *state = HIGH_EX_POWER; } } - return true; + return true; } -bool DLL430_OldApiV3::Erase(long type, long address, long length) +bool DLL430_OldApiV3::Erase(int32_t type, int32_t address, int32_t length) { - if(singleDevice==NULL) + IConfigManager* cm = this->handle ? this->handle->getConfigManager() : nullptr; + if (!cm) { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); + log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } + // If an FRAM Device is password protected the Mailbox erase is not functional. + // Make sure that password and reset vector are erase before BootCode execution. + if (type == ERASE_ALL || type == ERASE_MAIN || type == ERASE_TOTAL) + { + // Do not execute erase when in probeState for FRAM devices + if (singleDevice && singleDevice->hasFram() && cm->atProbeStateEnabled()) + return true; - MemoryManager* mm = singleDevice->getMemoryManager(); - switch (type) { - case ERASE_SEGMENT: - if (!mm->erase(address, address+length-1)) + if (singleDevice && singleDevice->hasFram()) { - log(LogTarget::ERR, ERASE_ERR, ""); - return false; + IMemoryManager* mm = singleDevice->getMemoryManager(); + if (!mm->erase(0xFF80, 0xFF80 + 0x80 - 1, true)) + { + log(LogTarget::ERR, ERASE_ERR, ""); + return false; + } + cm->setPassword(""); } - break; + } + if ((type == ERASE_TOTAL || type == ERASE_USER_CODE) && devArchitecture != MSP432_M4) + { + const uint16_t eraseKey = (type == ERASE_TOTAL) ? MASS_ERASE_MODE : MAIN_ERASE_MODE; - case ERASE_ALL: - if (!mm->erase()) + // execute total erase in SBW2 Mode + Configure(INTERFACE_MODE, SPYBIWIRE_IF); + if (!cm->jtagErase(eraseKey)) { - log(LogTarget::ERR, ERASE_ERR, ""); - return false; + // execute total erase in SBW4 Mode + Configure(INTERFACE_MODE, SPYBIWIREJTAG_IF); + if (!cm->jtagErase(eraseKey)) + { + log(LogTarget::ERR, ERASE_ERR, ""); + return false; + } } - break; + if (singleDevice) + { + try + { + singleDevice->getEmulationManager()->rewriteConfiguration(); + if (!singleDevice->reset()) + { + log(LogTarget::ERR, RESET_ERR, ""); + return false; + } + } + catch (const EM_Exception&) {/*Nothing to do*/} + } + return true; + } - case ERASE_MAIN: + // MSP432 total erase + if (type == ERASE_TOTAL && devArchitecture == MSP432_M4) + { + if (singleDevice) { - MemoryArea* area = mm->getMemoryArea("main"); - if (!area || !area->erase()) + if (!singleDevice->magicPatternSend(0)) { log(LogTarget::ERR, ERASE_ERR, ""); return false; } + this_thread::sleep_for(chrono::seconds(1)); + return true; + + } + else + { + this->OpenDevice("Device Unknown", "", 0, 0, 0); + if (singleDevice && !singleDevice->magicPatternSend(0)) + { + log(LogTarget::ERR, ERASE_ERR, ""); + return false; + } + if (singleDevice) + { + this_thread::sleep_for(chrono::seconds(1)); + return true; + } } - break; } - return true; + + + if (singleDevice==nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + bool success = false; + + try + { + IMemoryManager* mm = singleDevice->getMemoryManager(); + switch (type) + { + case ERASE_SEGMENT: + if (!mm->erase(address, address+length-1)) + { + log(LogTarget::ERR, ERASE_ERR, ""); + return false; + } + break; + + case ERASE_ALL: + if (!mm->erase()) + { + log(LogTarget::ERR, ERASE_ERR, ""); + return false; + } + break; + + case ERASE_MAIN: + { + MemoryArea* area = mm->getMemoryArea(MemoryArea::Main); + if (!area || !area->erase()) + { + log(LogTarget::ERR, ERASE_ERR, ""); + return false; + } + } + break; + } + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; } -bool DLL430_OldApiV3::Memory(long address, uint8_t* buf, long count, long rw) +bool DLL430_OldApiV3::Memory(int32_t address, uint8_t* buf, int32_t count, int32_t rw) { bool status = true; - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - MemoryManager* mm = singleDevice->getMemoryManager(); + IMemoryManager* mm = singleDevice->getMemoryManager(); - if (rw == WRITE) - { - vector tmp(buf, buf + count); - status = mm->write(address, &tmp[0], count) && mm->sync(); - } - else + if (rw == WRITE) { - v_tmp.resize(count); + try + { + SoftwareBreakpointManagerPtr swbpMan = singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager(); + swbpMan->patchMemoryWrite(address, buf, count); + } + catch (const EM_Exception&) + { + // ignore + } + status = mm->write(address, buf, count) && mm->sync(); + } + else if (rw == READ) + { //Prefill buffer with pattern for vacant memory bool oddAddress = ((address % 2) != 0); for (int byte = 0; byte < count; ++byte) { - v_tmp[byte] = oddAddress ? 0x3f : 0xff; + buf[byte] = oddAddress ? 0x3f : 0xff; oddAddress = !oddAddress; } - status = mm->read(address, &v_tmp[0], count) && mm->sync(); + status = mm->read(address, buf, count) && mm->sync(); - for (long i = 0; i < count; ++i) - buf[i] = static_cast(v_tmp[i] & 0xFF); + try + { + SoftwareBreakpointManagerPtr swbpMan = singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager(); + swbpMan->patchMemoryRead(address, buf, count); + } + catch (const EM_Exception&) + { + //ignore + } + + } + else if (rw == OVERWRITE) + { + try + { + SoftwareBreakpointManagerPtr swbpMan = singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager(); + swbpMan->patchMemoryWrite(address, buf, count); + } + catch (const EM_Exception&) + { + // ignore + } + + status = mm->overwrite(address, buf, count) && mm->sync(); + } + else + { + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; } - if(status==false) + if (status==false) { switch (mm->getLastError()) { @@ -1092,216 +1718,155 @@ bool DLL430_OldApiV3::Memory(long address, uint8_t* buf, long count, long rw) case MEMORY_LOCKED_ERROR: log(LogTarget::ERR, BSL_MEMORY_LOCKED_ERR, ""); break; case MEMORY_UNLOCK_ERROR: log(LogTarget::ERR, UNLOCK_BSL_ERR, ""); break; default: - if(rw == WRITE) + if (rw == WRITE) log(LogTarget::ERR, WRITE_MEMORY_ERR, ""); else log(LogTarget::ERR, READ_MEMORY_ERR, ""); - } + } } return status; } -bool DLL430_OldApiV3::Secure(void) +bool DLL430_OldApiV3::Secure() { - const bool success = singleDevice && singleDevice->secure(); - if (!success) + bool success = false; + try + { + success = singleDevice && singleDevice->secure(); + if (!success) + { + log(LogTarget::ERR, BLOW_FUSE_ERR, ""); + } + } + catch (const ERROR_CODE& error) { - log(LogTarget::ERR, BLOW_FUSE_ERR, ""); + log(LogTarget::ERR, error, ""); } return success; } -bool DLL430_OldApiV3::ReadOutFile(long wStart, long wLength, char* lpszFileName, long iFileType) +bool DLL430_OldApiV3::ReadOutFile(int32_t address, int32_t length, const char* filename, int32_t fileType) { // parameter check - if((wStart<0)||(wLength<1)||(lpszFileName==NULL)) + if ((address < 0) || (length < 1) || (filename == nullptr)) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } // first: read mem - MemoryManager * m_man = singleDevice->getMemoryManager(); + IMemoryManager * m_man = singleDevice->getMemoryManager(); if (!m_man) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - std::vector buffer(wLength); + std::vector buffer(length); - if( !m_man->read(wStart,&buffer[0],wLength) || !m_man->sync()) + if (!Memory(address, &buffer[0], length, READ)) { log(LogTarget::ERR, READ_MEMORY_ERR, ""); return false; } - const fileType type = (iFileType == 2) ? INTEL_HEX : TI_TXT; - - FileFunc* file = singleDevice->getFileRef(); //Creates filemanager if necessary - - const bool success = file->printSeg(lpszFileName, &buffer[0], wStart, wLength, type); - if (!success) - log(LogTarget::ERR, FILE_IO_ERR, ""); - - return success; -} + const FileType type = (fileType == 2) ? INTEL_HEX : TI_TXT; -bool DLL430_OldApiV3::ProgramFile(char* File, long eraseType, long verifyMem) -{ - if(singleDevice==NULL) + try { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; + const MemoryContent data((uint32_t)address, &buffer[0], buffer.size()); + FileWriter::create(filename, type)->write(data); } - - FileFunc * ff=singleDevice->getFileRef(); - - int file_ret=ff->readOpen(File,UNKNOWN); - switch(file_ret) + catch (const DLL430_Exception& e) { - case 0: - break; - - case -1: - log(LogTarget::ERR, FILE_OPEN_ERR, ""); - return false; - - case -2: - log(LogTarget::ERR, FILE_DETECT_ERR, ""); - return false; - - case -3: - log(LogTarget::ERR, FILE_DATA_ERR, ""); - return false; - - case -4: - log(LogTarget::ERR, FILE_END_ERR, ""); - return false; - - default: - log(LogTarget::ERR, INVALID_ERR, ""); + log(LogTarget::ERR, e.errorCode(), e.what()); return false; } - if(ff->getFileType()==FILE_ERROR) - { - log(LogTarget::ERR, FILE_DETECT_ERR, ""); - return false; - } + return true; +} - MemoryManager* mm = singleDevice->getMemoryManager(); - if(mm==NULL) +bool DLL430_OldApiV3::ProgramFile(const char* filename, int32_t eraseType, int32_t verifyMem) +{ + try { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; - } + if (singleDevice == nullptr) + throw DLL430_Exception(NO_DEVICE_ERR); - if((eraseType==ERASE_ALL)||(eraseType==ERASE_MAIN)) - { - if (!this->Erase(eraseType,0,0)) + IMemoryManager* mm = singleDevice->getMemoryManager(); + if (mm == nullptr) + throw DLL430_Exception(NO_DEVICE_ERR); + + MemoryContent ff; + FileReader::create(filename)->read(&ff); + + if ((eraseType == ERASE_ALL) || (eraseType == ERASE_MAIN)) { - log(LogTarget::ERR, ERASE_ERR, ""); - return false; + if (!this->Erase(eraseType, 0, 0)) + throw DLL430_Exception(ERASE_ERR); } - } - if (!singleDevice->writeSegments()) - { - ff->close(); - log(LogTarget::ERR, FILE_IO_ERR, ""); - return false; - } - // checksum verify - if (verifyMem) - { - if(!singleDevice->verifySegments()) + for (DataSegment& segment : ff.segments) { - ff->close(); - log(LogTarget::ERR, VERIFY_ERR, ""); - return false; + if (!Memory(segment.startAddress, &segment.data[0], static_cast(segment.data.size()), WRITE)) + throw DLL430_Exception(WRITE_MEMORY_ERR); + + if (verifyMem) + { + if (!VerifyMem(segment.startAddress, static_cast(segment.data.size()), &segment.data[0])) + throw DLL430_Exception(VERIFY_ERR); + } } } - ff->close(); - - if (!mm->flushAll()) + catch (const DLL430_Exception& e) { - log(LogTarget::ERR, WRITE_MEMORY_ERR, ""); + log(LogTarget::ERR, e.errorCode(), e.what()); return false; } - return(true); + return true; } -bool DLL430_OldApiV3::VerifyFile(char* File) +bool DLL430_OldApiV3::VerifyFile(const char* filename) { - if(singleDevice==NULL) - { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; - } - - FileFunc * ff=singleDevice->getFileRef(); - - // read to buffer - int file_ret=ff->readOpen(File,UNKNOWN); - switch(file_ret) + try { - case 0: - break; - - case -1: - log(LogTarget::ERR, FILE_OPEN_ERR, ""); - return false; - - case -2: - log(LogTarget::ERR, FILE_DETECT_ERR, ""); - return false; + if (singleDevice == nullptr) + throw DLL430_Exception(NO_DEVICE_ERR); - default: - log(LogTarget::ERR, INVALID_ERR, ""); - return false; - } + MemoryContent ff; + FileReader::create(filename)->read(&ff); - // file ok, data loaded? - if(ff->getFileType()==FILE_ERROR) - { - log(LogTarget::ERR, FILE_DETECT_ERR, ""); - return false; + for (DataSegment& segment : ff.segments) + { + if (!VerifyMem(segment.startAddress, static_cast(segment.data.size()), &segment.data[0])) + throw DLL430_Exception(VERIFY_ERR); + } } - // compare memory segments with file data - if(singleDevice->verifySegments()==false) + catch (const DLL430_Exception& e) { - ff->close(); - log(LogTarget::ERR, VERIFY_ERR, ""); + log(LogTarget::ERR, e.errorCode(), e.what()); return false; } - ff->close(); - return(true); + return true; } -bool DLL430_OldApiV3::VerifyMem(long StartAddr, long Length, uint8_t* DataArray) +bool DLL430_OldApiV3::VerifyMem(int32_t StartAddr, int32_t Length, const uint8_t* DataArray) { bool status = true; - uint32_t addr = static_cast(StartAddr); - size_t len = static_cast(Length); - vector data(len); - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - for (size_t i = 0; i < len; ++i) { - data[i] = static_cast(DataArray[i]); - } - if (!singleDevice->getMemoryManager()->verify(addr, &data[0], len)) + if (!singleDevice->getMemoryManager()->verify(StartAddr, DataArray, Length)) { log(LogTarget::ERR, VERIFY_ERR, ""); status = false; @@ -1309,18 +1874,23 @@ bool DLL430_OldApiV3::VerifyMem(long StartAddr, long Length, uint8_t* DataArray) return status; } -bool DLL430_OldApiV3::EraseCheck(long StartAddr, long Length) +bool DLL430_OldApiV3::EraseCheck(int32_t StartAddr, int32_t Length) { uint32_t addr = static_cast(StartAddr); size_t len = static_cast(Length); - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - - if (!singleDevice->getMemoryManager()->verify(addr, 0, len)) + IMemoryManager* mm = singleDevice->getMemoryManager(); + if (!mm) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + if (!mm->verify(addr, 0, len)) { log(LogTarget::ERR, VERIFY_ERR, ""); return false; @@ -1328,191 +1898,169 @@ bool DLL430_OldApiV3::EraseCheck(long StartAddr, long Length) return true; } -bool DLL430_OldApiV3::Reset(long method, long execute, long releaseJTAG) -{ +bool DLL430_OldApiV3::Reset(int32_t method, int32_t execute, int32_t releaseJTAG) +{ if (!method) { log(LogTarget::ERR, PARAMETER_ERR, ""); - return(false); + return false; } - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return(false); + return false; } - - DebugManager* db_man = singleDevice->getDebugManager(); - if(!db_man) + + IDebugManager* db_man = singleDevice->getDebugManager(); + if (!db_man) { log(LogTarget::ERR, RESET_ERR, ""); - return(false); + return false; } - + + // Make sure the device is stopped (ie. under our control) before doing a reset + this->State(0, 1, 0); + db_man->pausePolling(); - + if (this->debug.jtagReleased) { this->debug.jtagReleased = !db_man->reconnectJTAG(); } - db_man->pausePolling(); bool resetSuccessful = false; - bool restartJtag = false; + try + { + bool restartJtag = false; - ConfigManager* cm = handle ? handle->getConfigManager() : 0; + IConfigManager* cm = handle ? handle->getConfigManager() : 0; - /*-----------------------------------------------------------------------------*/ - if (!(method & FORCE_RESET) || (method & PUC_RESET)) - { - resetSuccessful = singleDevice->reset(); - } - /*-----------------------------------------------------------------------------*/ - if (!resetSuccessful && (method & RST_RESET)) - { - resetSuccessful = cm && cm->reset(false, 10, this->singleDevice->getJtagId()); - restartJtag = true; - } + /*-----------------------------------------------------------------------------*/ + if (!(method & FORCE_RESET) || (method & PUC_RESET)) + { + resetSuccessful = singleDevice->reset(); + } - /*-----------------------------------------------------------------------------*/ - if (!resetSuccessful && (method & VCC_RESET)) - { - resetSuccessful = cm && cm->reset(true, 0,this->singleDevice->getJtagId()); - restartJtag = true; - } + if (!resetSuccessful && ((method & RST_RESET) || (method & VCC_RESET))) + { + if (devArchitecture == MSP432_M4) + { + resetSuccessful = singleDevice->reset(true); + } + else + { + resetSuccessful = cm && cm->reset(false, true, this->singleDevice->getJtagId(), this->singleDevice->checkHalId(ID_ResetXv2)); + restartJtag = true; + } + } - /*-----------------get control over the device after RST--------------------*/ - if (restartJtag) - { - if (!cm || cm->start()!= 0x1) - { + /*-----------------get control over the device after RST--------------------*/ + if (restartJtag) + { + if (!cm || cm->start()!= 0x1) + { + log(LogTarget::ERR, RESET_ERR, ""); + return false; + } + + resetEM(); + + if (!singleDevice->reset()) + { + log(LogTarget::ERR, RESET_ERR, ""); + return false; + } + } + + // if no reset was executed, raise error + if (!resetSuccessful) + { log(LogTarget::ERR, RESET_ERR, ""); return false; } - if(!singleDevice->reset()) - { + int32_t state; + int32_t pCPUCycles; + + if (devArchitecture != MSP432_M4) + { + db_man->resumePolling(); + this_thread::sleep_for(chrono::milliseconds(500)); + db_man->pausePolling(); + } + if (!State(&state, true, &pCPUCycles)) + { log(LogTarget::ERR, RESET_ERR, ""); return false; } - } - // if no reset was executed, raise error - if(!resetSuccessful) - { - log(LogTarget::ERR, RESET_ERR, ""); - return false; - } + db_man->resetCycleCounterValue(); + lastCycleCount = 0; - long state; - long pCPUCycles; + if (devCode == 0x5AA55AA5 || devCode == 0xDEADBABE || singleDevice->getJtagId() == 0x99 || devCode == 0xA55AA55A) + { + int32_t program_start = 0; + const int32_t address = (devCode == 0xA55AA55A) ? 0x1C7E : 0xFFFE; - db_man->resumePolling(); - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(500)); - db_man->pausePolling(); + this->Memory(address, (uint8_t*)&program_start, 2, READ); // read address of program start + this->Register(&program_start, PC, WRITE); + } - if(!State(&state, true, &pCPUCycles)) - { - log(LogTarget::ERR, RESET_ERR, ""); - return false; - } + if (execute) + { + this->debug.state = RUNNING; - db_man->resetCycleCounterValue(); + if (!db_man->run(FreeRun, 0, releaseJTAG != 0)) + { + log(LogTarget::ERR, RUN_ERR, ""); + return false; + } - if (devCode == 0x5AA55AA5 || devCode == 0xDEADBABE) // set Programm counter to the correct location for C092 EMU an C092 - { - long program_start; - unsigned char word[2]; - - this->Memory(0xFFFE,word,2,READ); // read address of program start - - program_start = 0x00000000 + (word[1] << 8)+ word[0]; - this->Register(&program_start, PC, WRITE); + if ( releaseJTAG != 0 ) + { + //If we get here, run was successfully releasing JTAG + debug.jtagReleased = true; + } + } + else if (cm && releaseJTAG != 0 ) + { + this->debug.state = RUNNING; + debug.jtagReleased = true; + cm->stop(); + } } - if (devCode == 0xA55AA55A ) // set programm counter to the correct location for L092 + catch (const EM_Exception& e) { - long program_start; - unsigned char word[2]; - - this->Memory(0x1C7E,word,2,READ ); // read address of program start - - program_start = 0x00000000 + (word[1] << 8)+ word[0]; - this->Register(&program_start, PC, WRITE); + log(LogTarget::ERR, e.errorCode(), e.what()); + resetSuccessful = false; } - if (execute) - { - if (!db_man->run(FreeRun)) - { - log(LogTarget::ERR, RUN_ERR, ""); - return false; - } - } - return resetSuccessful; } -bool DLL430_OldApiV3::ExtRegisters(long address, uint8_t * buffer,long count, long rw) +bool DLL430_OldApiV3::ExtRegisters(int32_t address, uint8_t* buffer, int32_t count, int32_t rw) { - if(singleDevice==NULL) - { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; - } - - MemoryArea* extended = singleDevice->getMemoryManager()->getMemoryArea("extended"); - - if(extended==NULL) - { - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; - } - - if (rw == WRITE) - { - if (!extended->write(address,(uint32_t*) buffer ,count) || !extended->sync()) - { - log(LogTarget::ERR, WRITE_REGISTER_ERR, ""); - return false; - } - } - else - { - std::vector v_buffer(count); - if (!extended->read(address, &v_buffer[0], count) || !extended->sync()) - { - log(LogTarget::ERR, READ_REGISTER_ERR, ""); - return false; - } - if(v_buffer.size()!=count) - { - log(LogTarget::ERR, READ_REGISTER_ERR, ""); - return false; - } - for(int i=0;igetMemoryManager(); - if(mm==NULL) + IMemoryManager * mm=singleDevice->getMemoryManager(); + if (mm==nullptr) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - MemoryArea* cpu = mm->getMemoryArea("CPU"); + CpuRegisters* cpu = mm->getCpuRegisters(); if (!cpu) { log(LogTarget::ERR, INTERNAL_ERR, ""); @@ -1523,29 +2071,29 @@ bool DLL430_OldApiV3::Registers(long* registers, long mask, long rw) { if ((mask & (1 << i)) != 0) { - DLL430_OldApiV3::Register(®isters[i] , i, rw); + DLL430_OldApiV3::Register(®isters[i], i, rw); } } return true; } -bool DLL430_OldApiV3::Register(long* reg, long regNb, long rw) +bool DLL430_OldApiV3::Register(int32_t* reg, int32_t regNb, int32_t rw) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return(false); + return false; } - MemoryArea* cpu = singleDevice->getMemoryManager()->getMemoryArea("CPU"); + CpuRegisters* cpu = singleDevice->getMemoryManager()->getCpuRegisters(); if (!cpu) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - if (rw == WRITE) + if (rw == WRITE) { uint32_t tmp = (uint32_t)(*reg); if (!cpu->write(regNb, tmp)) @@ -1553,61 +2101,89 @@ bool DLL430_OldApiV3::Register(long* reg, long regNb, long rw) log(LogTarget::ERR, WRITE_REGISTER_ERR, ""); return false; } - } - else + } + else { uint32_t value; - if (!cpu->read(regNb, &value, 1)) + if (!cpu->read(regNb, &value)) { log(LogTarget::ERR, READ_REGISTER_ERR, ""); return false; } - *reg = (long)value; + *reg = (int32_t)value; } return true; } -bool DLL430_OldApiV3::Run(long mode, long releaseJTAG) +bool DLL430_OldApiV3::Run(int32_t mode, int32_t releaseJTAG) { - if(this->debug.state == RUNNING) + if (this->debug.state == RUNNING) { log(LogTarget::ERR, THREAD_ACTIVE_ERR, ""); return false; } - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - - DebugManager* db_man = singleDevice->getDebugManager(); + IDebugManager* db_man = singleDevice->getDebugManager(); if (!db_man) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - MemoryManager * m_man=singleDevice->getMemoryManager(); - if (!m_man) + + try { - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; + const uint32_t activeSwbps = singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->numberOfActiveSoftwareTriggers(); + if (activeSwbps && (mode == FREE_RUN || releaseJTAG)) + { + log (LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } } + catch (const EM_Exception&) {} uint16_t controlType = FreeRun; - uint8_t modes=0x00; - if(mode==RUN_TO_BREAKPOINT) + if (mode==RUN_TO_BREAKPOINT) + { controlType|=Stopped; + } + + if ( singleDevice->hasLPMx5() && db_man->getLpmDebugging() && notifyCallback != 0 && !releaseJTAG) + { + db_man->activateJStatePolling(this); + } + + if (mEnergyTraceManager && this->debug.state != LPMX5_WAKEUP) + { + mEnergyTraceManager->ResetEnergyTrace(); + } + + if (handle) + { + IConfigManager* cm = this->handle->getConfigManager(); + if (cm) + { + if (!cm->updateDisableInterruptsMode()) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + } + } - switch (mode) + switch (mode) { case FREE_RUN: case RUN_TO_BREAKPOINT: this->debug.state = RUNNING; - + lastCycleCount = 0; if ( !db_man->run(controlType, this, releaseJTAG != 0) ) { log(LogTarget::ERR, RUN_ERR, ""); @@ -1619,74 +2195,76 @@ bool DLL430_OldApiV3::Run(long mode, long releaseJTAG) //If we get here, run was successfully releasing JTAG debug.jtagReleased = true; } - + break; case SINGLE_STEP: { - uint32_t cycles; - bool inLpmX5 = db_man->queryLpm5State(); - - // Query LPMx.5 state: if the processor is in LPMx.5 don't even attempt to singleStep - if(!inLpmX5) - { + // Query LPMx.5 state: if the processor is in LPMx.5 don't even attempt to singleStep + if (db_man->queryIsInLpm5State()) + { + return true; + } + + uint32_t cycles = 0; if (!db_man->singleStep(&cycles)) { log(LogTarget::ERR, STEP_ERR, ""); return false; } - } - else - { - return true; - } - - // Query LPMx.5 state again: if the processor stepped into LPMx.5, do not send the callback - inLpmX5 = db_man->queryLpm5State(); - if(inLpmX5) - { - db_man->resumePolling(); - } - else - { - this->debug.state = SINGLE_STEP_COMPLETE; - if (this->debug.cb.func) + + // Query LPMx.5 state again: if the processor stepped into LPMx.5, do not send the callback + if (db_man->queryIsInLpm5State()) { - (*this->debug.cb.func)( - this->debug.cb.ids.uiMsgIdSingleStep, - 0, - cycles, - this->debug.cb.clientHandle - ); + db_man->resumePolling(); } + else + { + this->debug.state = SINGLE_STEP_COMPLETE; + if (this->debug.cb.func) + { + (*this->debug.cb.func)( + this->debug.cb.ids.uiMsgIdSingleStep, + 0, + cycles - lastCycleCount, + this->debug.cb.clientHandle + ); + } + } + break; } - } - break; } return true; } -bool DLL430_OldApiV3::State(long* state, long stop, long* pCPUCycles) +bool DLL430_OldApiV3::State(int32_t* state, int32_t stop, int32_t* pCPUCycles) { - if (stop == FALSE) + if (!stop) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } + if (handle == nullptr) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + bool jtagWasReleased = false; if (this->debug.jtagReleased) { - if ( ConfigManager* cm = handle->getConfigManager() ) + if (IConfigManager* cm = handle->getConfigManager()) + { this->debug.jtagReleased = (cm->start() == 0); - + } jtagWasReleased = true; } - if (state) + if (state) { - if(this->debug.state >= LPMX5_MODE) + if (this->debug.state >= LPMX5_MODE) { *state = STOPPED; } @@ -1696,33 +2274,25 @@ bool DLL430_OldApiV3::State(long* state, long stop, long* pCPUCycles) } } - if(singleDevice==NULL) + if (singleDevice == nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return(false); + return false; } - DebugManager* db_man = singleDevice->getDebugManager(); + IDebugManager* db_man = singleDevice->getDebugManager(); if (!db_man) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - if (stop == TRUE) + if (stop) { - const uint8_t actResponse = db_man->getRunEemResponseId(); - if(actResponse > 0) - { - if (!handle->kill(actResponse)) - { - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; - } - } + mPollingManager->pausePolling(); - if ((this->debug.state==RUNNING) || (this->debug.state==LPMX5_MODE) || (this->debug.state==LPMX5_WAKEUP)) + if ((this->debug.state == RUNNING) || (this->debug.state == LPMX5_MODE) || (this->debug.state == LPMX5_WAKEUP)) { // If device is in LPMx.5, we must also perform the stop to re-gain control of the device if (!db_man->stop(jtagWasReleased)) { @@ -1730,16 +2300,19 @@ bool DLL430_OldApiV3::State(long* state, long stop, long* pCPUCycles) return false; } } - this->debug.state=STOPPED; + this->debug.state = STOPPED; } if (pCPUCycles) - *pCPUCycles = (long)db_man->getCycleCounterValue(); + { + *pCPUCycles = (int32_t)db_man->getCycleCounterValue() - lastCycleCount; + } + lastCycleCount = (int32_t)db_man->getCycleCounterValue(); // find condition to avoid stop while stopped - if (state) + if (state) { - if(this->debug.state >= LPMX5_MODE) + if (this->debug.state >= LPMX5_MODE) { *state = RUNNING; } @@ -1752,20 +2325,20 @@ bool DLL430_OldApiV3::State(long* state, long stop, long* pCPUCycles) } -bool DLL430_OldApiV3::CcGetClockNames(long localDeviceId, EemGclkCtrl_t** CcClockNames) +bool DLL430_OldApiV3::CcGetClockNames(int32_t localDeviceId, EemGclkCtrl_t** CcClockNames) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - DebugManager * dm=singleDevice->getDebugManager(); + IDebugManager * dm=singleDevice->getDebugManager(); uint32_t size; char ** list = dm->getClockStrings(&size); - if( (list == NULL) || (size != 16) ) + if ((list == nullptr) || (size != 32)) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; @@ -1776,44 +2349,46 @@ bool DLL430_OldApiV3::CcGetClockNames(long localDeviceId, EemGclkCtrl_t** CcCloc return true; } -bool DLL430_OldApiV3::CcGetModuleNames(long localDeviceId, EemMclkCtrl_t** CcModuleNames) +bool DLL430_OldApiV3::CcGetModuleNames(int32_t localDeviceId, EemMclkCtrl_t** CcModuleNames) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - DebugManager * dm=singleDevice->getDebugManager(); + IDebugManager * dm=singleDevice->getDebugManager(); uint32_t size; char ** list = dm->getModuleStrings(&size); - if( (list == NULL) || (size != 32) ) + if ( (list == nullptr) || (size != 32) ) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; } - + *CcModuleNames=(EemMclkCtrl_t*)list; - + return true; } bool DLL430_OldApiV3::EEM_Init( MSP430_EVENTNOTIFY_FUNC callback, - long clientHandle, - MessageID_t* pMsgIdBuffer + int32_t clientHandle, + const MessageID_t* pMsgIdBuffer ) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - DebugManager * dm=singleDevice->getDebugManager(); + bool success = false; + + IDebugManager * dm=singleDevice->getDebugManager(); this->debug.cb.func = callback; this->debug.cb.clientHandle = clientHandle; @@ -1827,21 +2402,129 @@ bool DLL430_OldApiV3::EEM_Init( try { singleDevice->getEmulationManager()->writeConfiguration(); + lastCycleCount = 0; + + dm->initEemRegister(); + + success = true; } - catch(const EM_Exception&) + catch (const EM_Exception& e) { - //error writing to eem register + log(LogTarget::ERR, e.errorCode(), e.what()); } - dm->initEemRegister(); + return success; +} - v2initCalled = true; - return true; +bool DLL430_OldApiV3::softwareTriggerInRangeExists(uint32_t start, uint32_t end, BpRangeAction_t inOut) const +{ + for (const auto& params : bp_storage) + { + const uint32_t address = (uint32_t)params.second.lAddrVal; + const bool isInside = (address >= start && address <= end); + const bool isOutside = (address <= start || address >= end); + + if (params.second.bpMode == BP_SOFTWARE && ((inOut == BP_INSIDE && isInside) || (inOut == BP_OUTSIDE && isOutside))) + return true; + } + return false; +} + +bool DLL430_OldApiV3::rangeTriggerIncludingAddressExists(uint32_t address) const +{ + for (const auto& params : bp_storage) + { + const BpParameter_t& bp = params.second; + const uint32_t start = (uint32_t)bp.lAddrVal; + const uint32_t end = (uint32_t)bp.lRangeEndAdVa; + const bool isInside = (address >= start && address <= end); + const bool isOutside = (address <= start || address >= end); + + if (bp.bpMode == BP_RANGE && ((bp.bpRangeAction == BP_INSIDE && isInside) || (bp.bpRangeAction == BP_OUTSIDE && isOutside))) + return true; + } + return false; +} + +bool DLL430_OldApiV3::hardwareTriggerAtAddressExists(uint32_t address) const +{ + for (const auto& params : bp_storage) + { + const BpParameter_t& bp = params.second; + if (bp.bpAction == BP_BRK && bp.bpMode != BP_SOFTWARE) + { + if ((bp.bpType == BP_MAB || bp.bpMode == BP_CODE) && bp.lAddrVal == address) + return true; + + if (bp.bpMode == BP_RANGE && bp.lRangeEndAdVa == address) + return true; + } + } + return false; +} + +bool DLL430_OldApiV3::softwareTriggerAtAddressExists(uint32_t address) const +{ + for (const auto& params : bp_storage) + { + const BpParameter_t& bp = params.second; + if (bp.bpMode == BP_SOFTWARE && bp.lAddrVal == address) + return true; + } + return false; +} + +bool DLL430_OldApiV3::triggerConflictsWithExistingTrigger(const BpParameter_t* bpBuffer) const +{ + const bool breakWithSwbpAtOrPreceding = bpBuffer->bpAction == BP_BRK && + (softwareTriggerAtAddressExists(bpBuffer->lAddrVal) || + softwareTriggerAtAddressExists(bpBuffer->lAddrVal-2)); + + if (bpBuffer->bpMode == BP_SOFTWARE) + { + return softwareTriggerAtAddressExists(bpBuffer->lAddrVal) || + hardwareTriggerAtAddressExists(bpBuffer->lAddrVal) || + hardwareTriggerAtAddressExists(bpBuffer->lAddrVal+2) || + rangeTriggerIncludingAddressExists(bpBuffer->lAddrVal); + } + + if (bpBuffer->bpMode == BP_CODE || bpBuffer->bpType == BP_MAB) + { + if (breakWithSwbpAtOrPreceding) + return true; + } + + if (bpBuffer->bpMode == BP_RANGE && bpBuffer->bpType == BP_MAB) + { + return bpBuffer->bpAction == BP_BRK && + softwareTriggerInRangeExists(bpBuffer->lAddrVal, bpBuffer->lRangeEndAdVa, bpBuffer->bpRangeAction); + } + + return false; } +bool DLL430_OldApiV3::criticalRrcmInstructionAt(uint32_t address) +{ + uint8_t buffer[2] = {0}; + Memory(address, buffer, 2, READ); + + const uint16_t value = ((uint16_t)buffer[1] << 8) | buffer[0]; + + //pattern is 0x0?40 or 0x0?50 + return (value & 0xf0ef) == 0x40; +} + +static bool checkFetchCondition(AccessType bpAccess) +{ + if (static_cast(BP_FETCH) == bpAccess || static_cast(BP_FETCH_HOLD) == bpAccess) + { + return true; + } + return false; +} -TriggerConditionPtr DLL430_OldApiV3::triggerConditionFromBpParameter(EmulationManagerPtr emuManager, BpParameter_t* bpBuffer) +TriggerConditionPtr DLL430_OldApiV3::triggerConditionFromBpParameter(EmulationManagerPtr emuManager, const BpParameter_t* bpBuffer) { TriggerConditionManagerPtr tcManager = emuManager->getTriggerConditionManager(); @@ -1856,7 +2539,7 @@ TriggerConditionPtr DLL430_OldApiV3::triggerConditionFromBpParameter(EmulationMa case BP_RANGE: if (bpBuffer->lAddrVal > bpBuffer->lRangeEndAdVa || bpBuffer->bpType == BP_REGISTER) throw EM_TriggerParameterException(); - + if (bpBuffer->bpType == BP_MDB) { triggerCondition = tcManager->createDataRangeCondition(bpBuffer->lAddrVal, bpBuffer->lRangeEndAdVa, @@ -1873,46 +2556,100 @@ TriggerConditionPtr DLL430_OldApiV3::triggerConditionFromBpParameter(EmulationMa } break; - case BP_COMPLEX: + case BP_COMPLEX: if (bpBuffer->bpType == BP_REGISTER) { - triggerCondition = tcManager->createRegisterCondition((uint8_t)bpBuffer->lReg, bpBuffer->lAddrVal, + triggerCondition = tcManager->createRegisterCondition((uint8_t)bpBuffer->lReg, bpBuffer->lAddrVal, bpBuffer->lMask, (ComparisonOperation)bpBuffer->bpOperat); } else { if (bpBuffer->bpType == BP_MDB) { - triggerCondition = tcManager->createDataValueCondition(bpBuffer->lAddrVal, bpBuffer->lMask, - (AccessType)bpBuffer->bpAccess, - (ComparisonOperation)bpBuffer->bpOperat); + if (bpBuffer->bpCondition == BP_NO_COND) + { + triggerCondition = tcManager->createDataValueCondition(bpBuffer->lAddrVal, bpBuffer->lMask, + (AccessType)bpBuffer->bpAccess, + (ComparisonOperation)bpBuffer->bpOperat); + } + else + { + triggerCondition = tcManager->createDataAddressValueCondition(bpBuffer->lCondMdbVal, + bpBuffer->lAddrVal, bpBuffer->lCondMask, bpBuffer->lMask, + (AccessType)bpBuffer->bpCondAccess, (AccessType)bpBuffer->bpAccess, + (ComparisonOperation)bpBuffer->bpCondOperat, (ComparisonOperation)bpBuffer->bpOperat, (DataSize)bpBuffer->bpCondValSize); + } } else { - triggerCondition = tcManager->createDataAddressCondition(bpBuffer->lAddrVal, bpBuffer->lMask, - (AccessType)bpBuffer->bpAccess, - (ComparisonOperation)bpBuffer->bpOperat); - } - - if (bpBuffer->bpCondition == BP_COND) - { - DataValueConditionPtr dataCond = tcManager->createDataValueCondition(bpBuffer->lCondMdbVal, bpBuffer->lCondMask, - (AccessType)bpBuffer->bpCondAccess, - (ComparisonOperation)bpBuffer->bpCondOperat); - triggerCondition->combine(dataCond); + if (checkFetchCondition((AccessType)bpBuffer->bpAccess)) + { + triggerCondition = tcManager->createInstructionAddressCondition(bpBuffer->lAddrVal, bpBuffer->lMask, + (AccessType)bpBuffer->bpAccess, + (ComparisonOperation)bpBuffer->bpOperat); + } + else + { + triggerCondition = tcManager->createDataAddressCondition(bpBuffer->lAddrVal, bpBuffer->lMask, + (AccessType)bpBuffer->bpAccess, + (ComparisonOperation)bpBuffer->bpOperat); + } + if (bpBuffer->bpCondition == BP_COND) + { + DataValueConditionPtr dataCond = tcManager->createDataValueCondition(bpBuffer->lCondMdbVal, bpBuffer->lCondMask, + (AccessType)bpBuffer->bpCondAccess, + (ComparisonOperation)bpBuffer->bpCondOperat); + triggerCondition->combine(dataCond); + } } + } break; - default: + case BP_SOFTWARE: + if (jtagIdIsXv2(singleDevice->getJtagId()) && criticalRrcmInstructionAt(bpBuffer->lAddrVal+2)) + throw EM_SwbpCriticalInstruction(); + + triggerCondition = tcManager->createSoftwareTriggerCondition(bpBuffer->lAddrVal); break; + + default: + throw EM_TriggerParameterException(); } return triggerCondition; } -void DLL430_OldApiV3::addBreakpointsAndStorage(EmulationManagerPtr emuManager, TriggerConditionPtr triggerCondition, +void DLL430_OldApiV3::clearSoftwareTriggers() +{ + map::iterator it = bp_storage.begin(); + while (it != bp_storage.end()) + { + map::iterator tmp = it++; + if (tmp->second.bpMode == BP_SOFTWARE) + { + triggers.erase(tmp->first); + bp_storage.erase(tmp); + } + } +} + + +void DLL430_OldApiV3::restoreSoftwareTriggers(map& bpStorage) +{ + for (auto& bp : bpStorage) + { + if (bp.second.bpMode == BP_SOFTWARE) + { + uint16_t handle = bp.first; + EEM_SetBreakpoint(&handle, &bp.second); + } + } +} + + +void DLL430_OldApiV3::addBreakpointsAndStorage(EmulationManagerPtr emuManager, TriggerConditionPtr triggerCondition, BpAction_t reactions, uint16_t handle) { if (triggerCondition) @@ -1929,20 +2666,23 @@ void DLL430_OldApiV3::addBreakpointsAndStorage(EmulationManagerPtr emuManager, T { traceTriggers[handle].set(triggerCondition); } + + if (reactions & BP_CC) + { + counterTriggers[handle].set(triggerCondition); + } } } -void DLL430_OldApiV3::updateStorageConfiguration(EmulationManagerPtr emuManager) +void DLL430_OldApiV3::updateStorageReactions(EmulationManagerPtr emuManager) { if (emuManager->hasTrace()) { - typedef pair > MapEntry; - TracePtr trace = emuManager->getTrace(); - trace->clearTriggerConditions(); - BOOST_FOREACH(const MapEntry& entry, traceTriggers) + + for (const auto& entry : traceTriggers) { if (entry.second.inUse()) { @@ -1953,83 +2693,168 @@ void DLL430_OldApiV3::updateStorageConfiguration(EmulationManagerPtr emuManager) } -bool DLL430_OldApiV3::EEM_SetBreakpoint(uint16_t* bpHandle, BpParameter_t* bpBuffer) +void DLL430_OldApiV3::updateCounterReactions(EmulationManagerPtr emuManager) { - if (singleDevice==NULL) + if (emuManager->hasCycleCounter()) { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; - } + CycleCounterPtr counter = emuManager->getCycleCounter(); + counter->clearTriggerConditions(); - if ( bpHandle == NULL || bpBuffer == NULL || (bpBuffer->bpMode == BP_CLEAR && *bpHandle == 0)) - { - log(LogTarget::ERR, PARAMETER_ERR, ""); - return false; + for (const auto& entry : counterTriggers) + { + if (entry.second.inUse()) + { + counter->addTriggerCondition(entry.second.value()); + } + } } +} - bool success = false; - try +void DLL430_OldApiV3::resetEM() +{ + if (singleDevice) { - EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); + SoftwareBreakpointManagerPtr oldSwbpMan = singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager(); + singleDevice->getEmulationManager()->reset(); + + if (IDebugManager* db_man = singleDevice->getDebugManager()) + db_man->initEemRegister(); + + singleDevice->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->importInstructionTable(*oldSwbpMan.get()); - if (*bpHandle != 0) + //Reenable software breakpoints if previously active + if (config_settings[SOFTWARE_BREAKPOINTS] == ENABLE) + { + try + { + singleDevice->getEmulationManager()->getSoftwareBreakpoints()->enable(); + singleDevice->getEmulationManager()->writeConfiguration(); + } + catch (const EM_Exception&) {} //ignore + } + } + + //We keep the software triggers + map::iterator it = bp_storage.begin(); + while (it != bp_storage.end()) + { + map::iterator tmp = it++; + if (tmp->second.bpMode != BP_SOFTWARE) + { + triggers.erase(tmp->first); + bp_storage.erase(tmp->first); + } + } + + traceTriggers.clear(); + counterTriggers.clear(); + breakpoints.clear(); + triggerCombinations.clear(); + watchedVariables.clear(); + varWatch_state = VW_DISABLE; +} + + +bool DLL430_OldApiV3::EEM_SetBreakpoint(uint16_t* bpHandle, const BpParameter_t* bpBuffer) +{ + if (singleDevice==nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + if ( bpHandle == nullptr || bpBuffer == nullptr || + (bpBuffer->bpMode == BP_CLEAR && *bpHandle == 0) || + (bpBuffer->bpMode == BP_SOFTWARE && bpBuffer->bpAction != BP_BRK)) + { + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } + + const bool modifyingSwbp = (*bpHandle != 0) && (bp_storage[*bpHandle].bpMode == BP_SOFTWARE); + const bool settingSwbp = (bpBuffer->bpMode == BP_SOFTWARE); + + if (deviceIsRunning() && (modifyingSwbp || settingSwbp)) + { + log(LogTarget::ERR, TARGET_RUNNING_ERR, ""); + return false; + } + + + bool success = false; + + uint16_t handle = *bpHandle; + + try + { + prepareEemAccess(); + EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); + + if (handle == 0) + { + handle = 1; + while (triggers[handle].inUse()) + ++handle; + } + else { //Special case handling if trigger is part of a combination - map >::iterator it; - for (it = triggerCombinations.begin(); it != triggerCombinations.end(); ++it) + for (auto& combination : triggerCombinations) { - vector combinedHandles = it->second; - if (find(it->second.begin(), it->second.end(), *bpHandle) != it->second.end()) + vector combinedHandles = combination.second; + if (find(combination.second.begin(), combination.second.end(), handle) != combination.second.end()) { - uint16_t combinationHandle = it->first; - + uint16_t combinationHandle = combination.first; + //If part of a combination is removed, simply break up the combination if (bpBuffer->bpMode == BP_CLEAR) { - EEM_SetCombineBreakpoint(CB_CLEAR, combinedHandles.size(), &combinationHandle, &combinedHandles[0]); + EEM_SetCombineBreakpoint(CB_CLEAR, static_cast(combinedHandles.size()), &combinationHandle, &combinedHandles[0]); } //If the breakpoint is changed, trigger a reconstruction of the combination with new parameters else { - it->second.clear(); - bp_storage[*bpHandle] = *bpBuffer; - return EEM_SetCombineBreakpoint(CB_SET, combinedHandles.size(), &combinationHandle, &combinedHandles[0]); + combination.second.clear(); + bp_storage[handle] = *bpBuffer; + return EEM_SetCombineBreakpoint(CB_SET, static_cast(combinedHandles.size()), &combinationHandle, &combinedHandles[0]); } } } - - triggers[*bpHandle].clear(); - breakpoints[*bpHandle].clear(); - traceTriggers[*bpHandle].clear(); - } - else - { - *bpHandle = 1; - while (triggers[*bpHandle].inUse()) - ++(*bpHandle); + triggers[handle].clear(); + breakpoints[handle].clear(); + traceTriggers[handle].clear(); + counterTriggers[handle].clear(); + bp_storage.erase(handle); } - - if (bpBuffer->bpMode == BP_CLEAR) + if (bpBuffer->bpMode != BP_CLEAR) { - bp_storage.erase(*bpHandle); - } + if (triggerConflictsWithExistingTrigger(bpBuffer)) + throw EM_TriggerConflictException(); - else - { - TriggerConditionPtr triggerCondition = triggerConditionFromBpParameter(emuManager, bpBuffer); + TriggerConditionPtr triggerCondition = triggerConditionFromBpParameter(emuManager, bpBuffer); - addBreakpointsAndStorage(emuManager, triggerCondition, bpBuffer->bpAction, *bpHandle); - - bp_storage[*bpHandle] = *bpBuffer; + if (bpBuffer->bpMode != BP_SOFTWARE) + { + addBreakpointsAndStorage(emuManager, triggerCondition, bpBuffer->bpAction, handle); + } + else + { + triggers[handle].set(triggerCondition); + } + + bp_storage[handle] = *bpBuffer; + *bpHandle = handle; } //Reconfigure all trace triggers - updateStorageConfiguration(emuManager); + updateStorageReactions(emuManager); + updateCounterReactions(emuManager); emuManager->writeConfiguration(); + lastCycleCount = 0; success = true; } @@ -2044,15 +2869,15 @@ bool DLL430_OldApiV3::EEM_SetBreakpoint(uint16_t* bpHandle, BpParameter_t* bpBuf bool DLL430_OldApiV3::EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer) { - if(pBpDestBuffer==NULL) + if (pBpDestBuffer==nullptr) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - map::iterator it = bp_storage.find(wBpHandle); + map::iterator it = bp_storage.find(wBpHandle); - if( it == bp_storage.end() ) + if ( it == bp_storage.end() ) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; @@ -2064,29 +2889,39 @@ bool DLL430_OldApiV3::EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDe } - -bool DLL430_OldApiV3::EEM_SetCombineBreakpoint(CbControl_t control, uint16_t count, uint16_t* cbHandle, uint16_t* bpHandle) +bool DLL430_OldApiV3::EEM_SetCombineBreakpoint(CbControl_t control, uint16_t count, uint16_t* cbHandle, const uint16_t* bpHandle) { - if (singleDevice == NULL) + if (singleDevice == nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - if (bpHandle == NULL || cbHandle == NULL || (control == CB_SET && count < 2)) - { + if (bpHandle == nullptr || cbHandle == nullptr || (control == CB_SET && count < 2)) + { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; - } + } bool success = false; try { + prepareEemAccess(); EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); - + if (control == CB_SET) { + //Check that no combined trigger is a software breakpoint + for (int i = 0; i < count; ++i) + { + if (bp_storage[ bpHandle[i] ].bpMode == BP_SOFTWARE) + { + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } + } + //Combination handle is handle of first combined trigger *cbHandle = bpHandle[0]; if (!triggerCombinations[*cbHandle].empty()) @@ -2098,6 +2933,7 @@ bool DLL430_OldApiV3::EEM_SetCombineBreakpoint(CbControl_t control, uint16_t cou triggers[ bpHandle[i] ].reserveSlot(); breakpoints[ bpHandle[i] ].reserveSlot(); traceTriggers[ bpHandle[i] ].reserveSlot(); + counterTriggers[bpHandle[i]].reserveSlot(); } TriggerConditionPtr triggerCondition = triggerConditionFromBpParameter(emuManager, &bp_storage[bpHandle[0]]); @@ -2118,20 +2954,23 @@ bool DLL430_OldApiV3::EEM_SetCombineBreakpoint(CbControl_t control, uint16_t cou vector combinedHandles = triggerCombinations[*cbHandle]; triggerCombinations[*cbHandle].clear(); - BOOST_FOREACH(uint16_t handle, combinedHandles) + for (uint16_t handle : combinedHandles) { - EEM_SetBreakpoint(&handle, &bp_storage[handle]); + BpParameter_t* param = &bp_storage[handle]; + EEM_SetBreakpoint(&handle, param); } } - //Reconfigure all storage triggers - updateStorageConfiguration(emuManager); + //Reconfigure all storage/counter triggers + updateStorageReactions(emuManager); + updateCounterReactions(emuManager); emuManager->writeConfiguration(); + lastCycleCount = 0; success = true; } - catch(const EM_Exception& e) + catch (const EM_Exception& e) { log(LogTarget::ERR, e.errorCode(), e.what()); } @@ -2141,13 +2980,13 @@ bool DLL430_OldApiV3::EEM_SetCombineBreakpoint(CbControl_t control, uint16_t cou bool DLL430_OldApiV3::EEM_GetCombineBreakpoint(uint16_t cbHandle, uint16_t* count, uint16_t* bpHandle) { - if (singleDevice == NULL) + if (singleDevice == nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; } - if ((count == NULL) || (bpHandle == NULL)) + if ((count == nullptr) || (bpHandle == nullptr)) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; @@ -2155,7 +2994,7 @@ bool DLL430_OldApiV3::EEM_GetCombineBreakpoint(uint16_t cbHandle, uint16_t* coun *count = 0; - BOOST_FOREACH(long id, triggerCombinations[cbHandle]) + for (int32_t id : triggerCombinations[cbHandle]) { bpHandle[(*count)++] = (uint16_t)id; } @@ -2163,9 +3002,9 @@ bool DLL430_OldApiV3::EEM_GetCombineBreakpoint(uint16_t cbHandle, uint16_t* coun return true; } -bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) +bool DLL430_OldApiV3::EEM_SetTrace(const TrParameter_t* trBuffer) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2175,6 +3014,7 @@ bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) try { + prepareEemAccess(); EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); TracePtr trace = emuManager->getTrace(); @@ -2182,9 +3022,9 @@ bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) trace_storage.trControl = trBuffer->trControl; trace_storage.trMode = trBuffer->trMode; - switch(trBuffer->trAction) + switch (trBuffer->trAction) { - case TR_FETCH: + case TR_FETCH: trace->setStoreOnInstructionFetch(); break; @@ -2196,7 +3036,7 @@ bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) } - switch(trBuffer->trMode) + switch (trBuffer->trMode) { case TR_HISTORY: trace->setStartOnTrigger(false); @@ -2204,7 +3044,7 @@ bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) trace->setStoreContinuously(); break; - case TR_FUTURE: + case TR_FUTURE: trace->setStartOnTrigger(true); trace->setStopOnTrigger(false); trace->setStoreUntilFull(); @@ -2227,14 +3067,14 @@ bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) } - switch(trBuffer->trControl) + switch (trBuffer->trControl) { - case TR_ENABLE: + case TR_ENABLE: trace->enable(); singleDevice->getDebugManager()->startStoragePolling(); break; - case TR_DISABLE: + case TR_DISABLE: trace->disable(); singleDevice->getDebugManager()->stopStoragePolling(); break; @@ -2249,7 +3089,7 @@ bool DLL430_OldApiV3::EEM_SetTrace(TrParameter_t* trBuffer) success = true; } - catch(const EM_Exception& e) + catch (const EM_Exception& e) { log(LogTarget::ERR, e.errorCode(), e.what()); } @@ -2267,48 +3107,19 @@ bool DLL430_OldApiV3::EEM_GetTrace(TrParameter_t* trDestBuffer) bool DLL430_OldApiV3::EEM_ReadTraceBuffer(TraceBuffer_t* destTraceBuffer) { - if (destTraceBuffer == NULL) - { - log(LogTarget::ERR, PARAMETER_ERR, ""); - return false; - } - - if(singleDevice==NULL) - { - log(LogTarget::ERR, NO_DEVICE_ERR, ""); - return false; - } - - try - { - const TraceBuffer& traceBuffer = singleDevice->getEmulationManager()->getTrace()->getTraceData(); - - const size_t count = min((size_t)8, traceBuffer.size()); - for (size_t i = 0; i < count; ++i) - { - destTraceBuffer[i].lTrBufMAB = traceBuffer[i].mab; - destTraceBuffer[i].lTrBufMDB = traceBuffer[i].mdb; - destTraceBuffer[i].wTrBufCNTRL = traceBuffer[i].ctl; - } - } - catch (const EM_Exception& e) - { - log(LogTarget::ERR, e.errorCode(), e.what()); - return false; - } - - return true; + uint32_t count = 8; + return EEM_ReadTraceData(destTraceBuffer, &count); } -bool DLL430_OldApiV3::EEM_ReadTraceData(TraceBuffer_t* destTraceBuffer, unsigned long *count) +bool DLL430_OldApiV3::EEM_ReadTraceData(TraceBuffer_t* destTraceBuffer, uint32_t *count) { - if (destTraceBuffer == NULL) + if (destTraceBuffer == nullptr || count == nullptr) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2320,12 +3131,14 @@ bool DLL430_OldApiV3::EEM_ReadTraceData(TraceBuffer_t* destTraceBuffer, unsigned { const TraceBuffer& traceBuffer = singleDevice->getEmulationManager()->getTrace()->getTraceData(); - *count = min(*count, (unsigned long)traceBuffer.size()); - for (size_t i = 0; i < *count; ++i) + TraceBuffer::const_reverse_iterator it = traceBuffer.rbegin(); + *count = min(*count, (uint32_t)traceBuffer.size()); + + for (size_t i = 0; (i < *count) && (it != traceBuffer.rend()); ++i, ++it) { - destTraceBuffer[i].lTrBufMAB = traceBuffer[i].mab; - destTraceBuffer[i].lTrBufMDB = traceBuffer[i].mdb; - destTraceBuffer[i].wTrBufCNTRL = traceBuffer[i].ctl; + destTraceBuffer[i].lTrBufMAB = it->mab; + destTraceBuffer[i].lTrBufMDB = it->mdb; + destTraceBuffer[i].wTrBufCNTRL = it->ctl; } success = true; } @@ -2340,7 +3153,7 @@ bool DLL430_OldApiV3::EEM_ReadTraceData(TraceBuffer_t* destTraceBuffer, unsigned bool DLL430_OldApiV3::EEM_RefreshTraceBuffer(void) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2350,14 +3163,15 @@ bool DLL430_OldApiV3::EEM_RefreshTraceBuffer(void) try { + prepareEemAccess(); EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); emuManager->getTrace()->reset(); - + emuManager->writeConfiguration(); success = true; } - catch(const EM_Exception& e) + catch (const EM_Exception& e) { log(LogTarget::ERR, e.errorCode(), e.what()); } @@ -2367,7 +3181,7 @@ bool DLL430_OldApiV3::EEM_RefreshTraceBuffer(void) bool DLL430_OldApiV3::EEM_SetVariableWatch(VwEnable_t vwEnable) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2377,6 +3191,8 @@ bool DLL430_OldApiV3::EEM_SetVariableWatch(VwEnable_t vwEnable) try { + prepareEemAccess(); + EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); VariableWatchPtr varWatch = emuManager->getVariableWatch(); @@ -2389,6 +3205,8 @@ bool DLL430_OldApiV3::EEM_SetVariableWatch(VwEnable_t vwEnable) { varWatch->disable(); singleDevice->getDebugManager()->stopStoragePolling(); + watchedVariables.clear(); + vw_storage.clear(); } varWatch_state = vwEnable; @@ -2407,29 +3225,32 @@ bool DLL430_OldApiV3::EEM_SetVariableWatch(VwEnable_t vwEnable) bool DLL430_OldApiV3::EEM_GetVariableWatch(VwEnable_t* vwEnable, VwResources_t* vwDestBuffer) { + memset(vwDestBuffer, 0, 8*sizeof(*vwDestBuffer)); + *vwEnable = varWatch_state; - for(int i = 0; i < 8; ++i) + std::map::const_iterator it = vw_storage.begin(); + for (int i = 0; i < 8 && it != vw_storage.end(); ++i, ++it) { - vwDestBuffer[i].vwHandle = vw_storage[i].vwHandle; - vwDestBuffer[i].lAddr = vw_storage[i].lAddr; - vwDestBuffer[i].vwDataType = vw_storage[i].vwDataType; + vwDestBuffer[i].vwHandle = it->second.vwHandle; + vwDestBuffer[i].lAddr = it->second.lAddr; + vwDestBuffer[i].vwDataType = it->second.vwDataType; } - + return true; } -bool DLL430_OldApiV3::EEM_SetVariable(uint16_t* vwHandle, VwParameter_t* vwBuffer) +bool DLL430_OldApiV3::EEM_SetVariable(uint16_t* vwHandle, const VwParameter_t* vwBuffer) { // Check provided parameter - if (vwHandle == NULL || vwBuffer == NULL) + if (vwHandle == nullptr || vwBuffer == nullptr) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2439,21 +3260,24 @@ bool DLL430_OldApiV3::EEM_SetVariable(uint16_t* vwHandle, VwParameter_t* vwBuffe try { + prepareEemAccess(); + EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); VariableWatchPtr varWatch = emuManager->getVariableWatch(); if (vwBuffer->vwControl == VW_CLEAR) { - boost::mutex::scoped_lock lock(watchedVariablesMutex); + boost::lock_guard lock(watchedVariablesMutex); watchedVariables.erase(*vwHandle); vw_storage.erase(*vwHandle); } if (vwBuffer->vwControl == VW_SET) { - boost::mutex::scoped_lock lock(watchedVariablesMutex); + boost::lock_guard lock(watchedVariablesMutex); - *vwHandle = 0; + //Start at 0x10, so VW events are easily distinguished from Trace events + *vwHandle = 0x10; while (watchedVariables[*vwHandle]) ++(*vwHandle); @@ -2483,14 +3307,14 @@ bool DLL430_OldApiV3::EEM_SetVariable(uint16_t* vwHandle, VwParameter_t* vwBuffe return success; } -bool DLL430_OldApiV3::EEM_SetClockControl(CcParameter_t* pCcBuffer) +bool DLL430_OldApiV3::EEM_SetClockControl(const CcParameter2_t* pCcBuffer) { - if(pCcBuffer==NULL) + if (pCcBuffer==nullptr) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2502,62 +3326,75 @@ bool DLL430_OldApiV3::EEM_SetClockControl(CcParameter_t* pCcBuffer) return false; } - uint16_t cmp_general = DEFAULT_CLKCNTRL; - uint16_t cmp_module = singleDevice->getDebugManager()->getClockModuleDefaultSetting(); + bool success = false; - if(pCcBuffer->ccControl == CC_ENABLE) + try { - cmp_general = pCcBuffer->ccGeneralCLK; - cmp_module = pCcBuffer->ccModule; - } + prepareEemAccess(); - const uint8_t clockControlType = singleDevice->getDebugManager()->getClockControl(); - bool needReset = false; + uint16_t cmp_general = singleDevice->getDebugManager()->getGeneralClockDefaultSetting(); + uint32_t cmp_module = singleDevice->getDebugManager()->getClockModuleDefaultSetting(); - //Only applies to Cpu/CpuX devices - if ( (clock_control.ccGeneralCLK != cmp_general) && (singleDevice->getJtagId() == 0x89)) - { - singleDevice->getDebugManager()->eemWriteRegister(GENCLKCTRL, cmp_general); - needReset = true; - } + if (pCcBuffer->ccControl == CC_ENABLE) + { + cmp_general = pCcBuffer->ccGeneralCLK; + cmp_module = pCcBuffer->ccModule; + } - if ( (clock_control.ccModule != cmp_module) && (clockControlType == GccExtended)) - { - singleDevice->getDebugManager()->eemWriteRegister(MODCLKCTRL0, cmp_module); - needReset = true; - } + const uint8_t clockControlType = singleDevice->getDebugManager()->getClockControl(); + bool needReset = false; + + //Only applies to Cpu/CpuX devices + if ( (clock_control.ccGeneralCLK != cmp_general) && !jtagIdIsXv2(singleDevice->getJtagId())) + { + singleDevice->getEmulationManager()->writeRegister(GENCLKCTRL, cmp_general); + clock_control.ccGeneralCLK = cmp_general; + needReset = true; + } + + if ( (clock_control.ccModule != cmp_module) && (clockControlType == GccExtended)) + { + singleDevice->getEmulationManager()->writeRegister(MODCLKCTRL0, cmp_module); + clock_control.ccModule = cmp_module; + needReset = true; + } - // PUC reset - if (needReset && !singleDevice->reset()) + clock_control.ccControl = pCcBuffer->ccControl; + + // PUC reset + if (needReset && !singleDevice->reset()) + { + log(LogTarget::ERR, RESET_ERR, ""); + return false; + } + + success = true; + } + catch (const EM_Exception& e) { - log(LogTarget::ERR, RESET_ERR, ""); - return false; + log(LogTarget::ERR, e.errorCode(), e.what()); } - - clock_control.ccControl = pCcBuffer->ccControl; - clock_control.ccGeneralCLK = cmp_general; - clock_control.ccModule = cmp_module; - return true; + return success; } -bool DLL430_OldApiV3::EEM_GetClockControl(CcParameter_t* pCcDestBuffer) +bool DLL430_OldApiV3::EEM_GetClockControl(CcParameter2_t* pCcDestBuffer) { - if(pCcDestBuffer==NULL) + if (pCcDestBuffer==nullptr) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; } - memcpy(pCcDestBuffer,&clock_control,sizeof(CcParameter_t)); + memcpy(pCcDestBuffer, &clock_control, sizeof(CcParameter2_t)); return true; } -bool DLL430_OldApiV3::EEM_SetSequencer(SeqParameter_t* seqBuffer) +bool DLL430_OldApiV3::EEM_SetSequencer(const SeqParameter_t* seqBuffer) { - if(singleDevice==NULL) + if (singleDevice==nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2567,6 +3404,8 @@ bool DLL430_OldApiV3::EEM_SetSequencer(SeqParameter_t* seqBuffer) try { + prepareEemAccess(); + EmulationManagerPtr emuManager = singleDevice->getEmulationManager(); SequencerPtr sequencer = emuManager->getSequencer(); @@ -2604,7 +3443,7 @@ bool DLL430_OldApiV3::EEM_SetSequencer(SeqParameter_t* seqBuffer) { sequencer->setResetTrigger(triggers[seqBuffer->wHandleRstTrig].value()); } - + //Set sequencer actions on reaching final state if (seqBuffer->bpAction & BP_BRK) { @@ -2630,7 +3469,7 @@ bool DLL430_OldApiV3::EEM_SetSequencer(SeqParameter_t* seqBuffer) bool DLL430_OldApiV3::EEM_GetSequencer(SeqParameter_t* seqDestBuffer) { - if (seqDestBuffer == NULL) + if (seqDestBuffer == nullptr) { log(LogTarget::ERR, PARAMETER_ERR, ""); return false; @@ -2642,7 +3481,7 @@ bool DLL430_OldApiV3::EEM_GetSequencer(SeqParameter_t* seqDestBuffer) bool DLL430_OldApiV3::EEM_ReadSequencerState(SeqState_t* pSeqState) { - if (singleDevice == NULL) + if (singleDevice == nullptr) { log(LogTarget::ERR, NO_DEVICE_ERR, ""); return false; @@ -2654,187 +3493,578 @@ bool DLL430_OldApiV3::EEM_ReadSequencerState(SeqState_t* pSeqState) return false; } - bool success = false; + bool success = false; + + try + { + prepareEemAccess(); + *pSeqState = (SeqState)singleDevice->getEmulationManager()->getSequencer()->readCurrentState(); + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; +} + +bool DLL430_OldApiV3::EEM_SetCycleCounterMode(CycleCounterMode_t mode) +{ + if (singleDevice == nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + bool success = false; + + try { + if (mode == CYC_MODE_ADVANCED && !singleDevice->getEmulationManager()->hasCycleCounter()) + { + throw EM_Exception(FEATURE_NOT_SUPPORTED, "Target has no hardware cycle counter"); + } + + if (IDebugManager* dbgMan = singleDevice->getDebugManager()) + { + dbgMan->enableLegacyCycleCounter(mode == CYC_MODE_BASIC); + + singleDevice->getEmulationManager()->writeConfiguration(); + } + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; +} + +void DLL430_OldApiV3::checkCycleCounterConflict(uint32_t wCounter) const +{ + const IDebugManager* dbgMan = singleDevice->getDebugManager(); + if (dbgMan && dbgMan->legacyCycleCounterEnabled() && wCounter == 0) + { + throw EM_Exception(CYCLE_COUNTER_CONFLICT, ""); + } +} + +bool DLL430_OldApiV3::EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig) +{ + if (singleDevice == nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + bool success = false; + + try + { + checkCycleCounterConflict(wCounter); + prepareEemAccess(); + + CycleCounterPtr cc = singleDevice->getEmulationManager()->getCycleCounter(); + cc->setCountMode(wCounter, (CounterCountMode)pCycConfig.countMode); + cc->setStartMode(wCounter, (CounterStartMode)pCycConfig.startMode); + cc->setStopMode(wCounter, (CounterStopMode)pCycConfig.stopMode); + cc->setClearMode(wCounter, (CounterClearMode)pCycConfig.clearMode); + + singleDevice->getEmulationManager()->writeConfiguration(); + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; +} + +bool DLL430_OldApiV3::EEM_ReadCycleCounterValue(uint32_t wCounter, uint64_t* value) +{ + if (singleDevice == nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + if (value == nullptr) + { + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } + + bool success = false; + + try + { + checkCycleCounterConflict(wCounter); + + CycleCounterPtr cc = singleDevice->getEmulationManager()->getCycleCounter(); + prepareEemAccess(); + cc->readCounter(wCounter); + *value = cc->getCounterValue(wCounter); + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; +} + +bool DLL430_OldApiV3::EEM_WriteCycleCounterValue(uint32_t wCounter, uint64_t value) +{ + if (singleDevice == nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + bool success = false; + + try + { + checkCycleCounterConflict(wCounter); + prepareEemAccess(); + singleDevice->getEmulationManager()->getCycleCounter()->setCounterValue(wCounter, value); + singleDevice->getEmulationManager()->writeConfiguration(); + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; +} + +bool DLL430_OldApiV3::EEM_ResetCycleCounter(uint32_t wCounter) +{ + if (singleDevice == nullptr) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + + bool success = false; + + try + { + checkCycleCounterConflict(wCounter); + prepareEemAccess(); + + singleDevice->getEmulationManager()->getCycleCounter()->resetCounter(wCounter); + singleDevice->getEmulationManager()->writeConfiguration(); + + success = true; + } + catch (const EM_Exception& e) + { + log(LogTarget::ERR, e.errorCode(), e.what()); + } + + return success; +} + +bool DLL430_OldApiV3::FET_SelfTest(int32_t count, uint8_t* buffer) +{ + return true; +} + +bool DLL430_OldApiV3::FET_SetSignals(int32_t SigMask, int32_t SigState) +{ + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); + return false; +} + +bool DLL430_OldApiV3::FET_Reset(void) +{ + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); + return false; +} + +bool DLL430_OldApiV3::FET_I2C(int32_t address, uint8_t* buffer, int32_t count, int32_t rw) +{ + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); + return false; +} + +bool DLL430_OldApiV3::FET_EnterBootloader(void) +{ + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); + return false; +} + +bool DLL430_OldApiV3::FET_ExitBootloader(void) +{ + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); + return false; +} + +bool DLL430_OldApiV3::FET_GetFwVersion(int32_t* version) +{ + if (handle==nullptr) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + + if (version) + { + *version = this->handle->getConfigManager()->getHalVersion().get(); + } + return true; +} + + +bool DLL430_OldApiV3::FET_GetHwVersion(uint8_t** version, int32_t* count) +{ + if (handle==nullptr) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + + if ((version==nullptr)||(count==nullptr)) + { + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } + + const std::vector* hwId = this->handle->getHwVersion(); + + static uint8_t v[4] = {0, 0, 0, 0}; + + const bool valid = (hwId->size() >= 4); + if (!valid) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + } + else + { + v[0]=hwId->at(0); + v[1]=hwId->at(1); + v[2]=hwId->at(2); + v[3]=hwId->at(3); + } + *version = v; + *count = 4; + + return valid; +} + +bool DLL430_OldApiV3::FET_FwUpdate( + const char* lpszFileName, + DLL430_FET_NOTIFY_FUNC callback, + int32_t clientHandle) +{ + this->errNum = 0; + this->clientHandle=clientHandle; + + try + { + UpdateNotifyCallback cbFunction; + if (callback != nullptr) + { + cbFunction = bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, clientHandle); + } + + const uint32_t countHidDevices =( HidUpdateManager::countHidDevices(MSPBSL_EZ_FET_USB_PID) + HidUpdateManager::countHidDevices(MSPBSL_MSP_FET_USB_PID)); + // HID FET recovery handling ------------------------------------------------------------------------------- + if (countHidDevices == 1) + { // just one HID FET was detected + bool returnValue = HidUpdateManager().hid_firmWareUpdate(lpszFileName, cbFunction); + if (!returnValue) + { + log(LogTarget::ERR, RECOVERY_FAILED, ""); + return false; + } + return true; + } + + if (countHidDevices > 1) + { + // do not start if more than one FET need recovery + log(LogTarget::ERR, RECOVERY_MULTIPLE_UIF, ""); + return false; + } + // HID FET recovery handling END --------------------------------------------------------------------- + + if (handle==nullptr) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + IConfigManager* config = handle->getConfigManager(); + + int32_t version = -1; + const string portName = this->handle->getCurrentPortName(); + vector port(portName.begin(), portName.end()); + port.push_back(0); + std::string serialNumberFET = this->manager->getPortElement(handle->getCurrentPortName())->serial; + + bool coreUpdate = false; + bool updateSuccess = config->firmWareUpdate(lpszFileName, cbFunction, &coreUpdate); + + //Perform up to two retries if not core update + for (int retries = 2; retries > 0 && !updateSuccess && !coreUpdate; --retries) + { + //Initialize will invalidate config manager + Initialize(&port[0], &version); + config = handle ? handle->getConfigManager() : nullptr; + updateSuccess = config && config->firmWareUpdate(lpszFileName, cbFunction, &coreUpdate); + } + + if (!updateSuccess) + { + // if core update was not successful + if (coreUpdate) + { + log(LogTarget::ERR, UPDATE_CORE_ERR, ""); + return false; + }// if normal update was not successfully + else + { + log(LogTarget::ERR, UPDATE_MODULE_ERR, ""); + return false; + } + } + // if core update was successful, run module updates after it.(just eZ-FET & MSP-FET). + if (coreUpdate) + { + if (!this->Initialize(&port[0], &version)) + { + std::string UpdateLog; + UpdateLog.append("\n\n\n ------------------------!this->Initialize(&port[0], &version) #1--------------------------- \n"); + UpdateLog.append("\n"); + UpdateLog.append(this->Error_String(this->Error_Number())); + UpdateLog.append("\n"); + { +#if defined(_WIN32) || defined(_WIN64) + char binaryPath[256] = { 0 }; + uint32_t pathLength = 0; + + pathLength = GetModuleFileName(0, binaryPath, sizeof(binaryPath)); + while (pathLength > 0 && binaryPath[pathLength - 1] != '\\') + { + --pathLength; + } + string logfile = string(binaryPath, pathLength) + "Update.log"; +#else + string logfile = "Update.log"; +#endif + UpdateLog.append("\n---------------------Firmware upate end--------------------------\n"); + + std::ofstream(logfile.c_str(), std::ios::app | std::ios::out) << UpdateLog; + } + } + + if (!handle) + { + PortInfo *portinfo = nullptr; + int timeout = 100; + while (timeout-- && !portinfo) + { + this_thread::sleep_for(chrono::milliseconds(100)); + portinfo = this->manager->getPortElementBySN(serialNumberFET); + } + + if (!portinfo) + { + std::string portname = portinfo->name; + this->Initialize(portname.c_str(), &version); + } + if (!handle) + { + std::string UpdateLog; + UpdateLog.append("\n\n\n ------------------------!this->Initialize(&port[0], &version) #2--------------------------- \n"); + UpdateLog.append("\n"); + UpdateLog.append(this->Error_String(this->Error_Number())); + UpdateLog.append("\n"); + { +#if defined(_WIN32) || defined(_WIN64) + char binaryPath[256] = { 0 }; + uint32_t pathLength = 0; + + pathLength = GetModuleFileName(0, binaryPath, sizeof(binaryPath)); + while (pathLength > 0 && binaryPath[pathLength - 1] != '\\') + { + --pathLength; + } + string logfile = string(binaryPath, pathLength) + "Update.log"; +#else + string logfile = "Update.log"; +#endif + UpdateLog.append("\n---------------------Firmware upate end--------------------------\n"); + + std::ofstream(logfile.c_str(), std::ios::app | std::ios::out) << UpdateLog; + } + } + } - try - { - *pSeqState = (SeqState)singleDevice->getEmulationManager()->getSequencer()->readCurrentState(); + if (handle) + { + config = handle->getConfigManager(); - success = true; + if (!config->firmWareUpdate(lpszFileName, cbFunction, &coreUpdate)) + { + // if module update was not successful + log(LogTarget::ERR, UPDATE_MODULE_ERR, ""); + return false; + } + } + else + { + // if module update was not successful + log(LogTarget::ERR, FET_UPDATE_FAILED, ""); + return false; + } + } } - catch (const EM_Exception& e) + catch (const std::runtime_error& e) { - log(LogTarget::ERR, e.errorCode(), e.what()); + if (string("DUMMY_FW_MANAGER_UPDATE") == e.what()) + { + log(LogTarget::ERR, HARDWARE_STATE_UNKNOWN, ""); + return false; + } } - - return success; -} - -bool DLL430_OldApiV3::FET_SelfTest(long count, uint8_t* buffer) -{ return true; } -bool DLL430_OldApiV3::FET_SetSignals(long SigMask, long SigState) -{ - log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); - return false; -} - -bool DLL430_OldApiV3::FET_Reset(void) -{ - log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); - return false; -} - -bool DLL430_OldApiV3::FET_I2C(long address, uint8_t* buffer, long count, long rw) -{ - log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); - return false; -} - -bool DLL430_OldApiV3::FET_EnterBootloader(void) -{ - log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); - return false; -} - -bool DLL430_OldApiV3::FET_ExitBootloader(void) -{ - log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); - return false; -} - -bool DLL430_OldApiV3::FET_GetFwVersion(long* version) +void DLL430_OldApiV3::HIL_ResetJtagTap() { - if(handle==NULL) + if (handle) { - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; + handle->sendHilCommand(HIL_CMD_RESET_JTAG_TAP); } - - if (version) - *version = this->handle->getConfigManager()->getBiosVersion().get(); - - return true; } - -bool DLL430_OldApiV3::FET_GetHwVersion(uint8_t** version, long* count) +bool DLL430_OldApiV3::HIL_Configure(enum CONFIG_MODE mode, int32_t value) { - if(handle==NULL) + if (handle == nullptr) { - log(LogTarget::ERR, INTERNAL_ERR, ""); + log(LogTarget::ERR, INTERFACE_SUPPORT_ERR, ""); return false; } - std::vector * hwId=this->handle->getHwVersion(); + bool retValue = false; - static uint8_t v[4] = {0,0,0,0}; - - if((version==NULL)||(count==NULL)) + switch (mode) { - log(LogTarget::ERR, PARAMETER_ERR, ""); - return false; + case INTERFACE_MODE: + { + enum INTERFACE_TYPE type = (enum INTERFACE_TYPE)value; + switch (type) + { + case JTAG_IF: + retValue = handle->sendHilCommand(HIL_CMD_CONFIGURE, JTAG_IF); + break; + case SPYBIWIRE_IF: + retValue = handle->sendHilCommand(HIL_CMD_CONFIGURE, SPYBIWIRE_IF); + break; + case SPYBIWIREJTAG_IF: + retValue = handle->sendHilCommand(HIL_CMD_CONFIGURE, SPYBIWIREJTAG_IF); + break; + case JTAG_MSP432: + retValue = handle->sendHilCommand(HIL_CMD_CONFIGURE, JTAG_MSP432); + break; + case SWD_MSP432: + retValue = handle->sendHilCommand(HIL_CMD_CONFIGURE, SWD_MSP432); + break; + default: break; + } + } + break; + default: + break; } + return retValue; +} - if( hwId->size() < 4 ) +bool DLL430_OldApiV3::HIL_Open() +{ + if (singleDevice) { - *version = (uint8_t*)v; - *count = 4; - log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; + if (IDebugManager* db_man = singleDevice->getDebugManager()) + { + // Stop polling, since we don't want it to interfere with low-level access + db_man->pausePolling(); + } } - v[0]=hwId->at(0); - v[1]=hwId->at(1); - v[2]=hwId->at(2); - v[3]=hwId->at(3); - *version = (uint8_t*)v; - *count = 4; - return true; + const bool success = handle && handle->sendHilCommand(HIL_CMD_OPEN); + if (!success) + log(LogTarget::ERR, INTERNAL_ERR, ""); + + return success; } -bool DLL430_OldApiV3::FET_FwUpdate( - char* lpszFileName, - DLL430_FET_NOTIFY_FUNC callback, - long clientHandle) +bool DLL430_OldApiV3::HIL_Bsl() { - this->errNum = 0; - - if (handle==NULL) + const bool success = handle && handle->sendHilCommand(HIL_CMD_BSL); + if (!success) { log(LogTarget::ERR, INTERNAL_ERR, ""); - return false; } - ConfigManager *config = handle->getConfigManager(); - bool success = config->firmWareUpdate(lpszFileName, boost::bind(callback, _1, _2, _3, clientHandle)); - - //Only perform retries when not using user specified file - int retries = 2; - while (!success && retries--) - { - long version = 0; - vector nonConstPortName(lastUsedPort.c_str(), lastUsedPort.c_str() + lastUsedPort.length() + 1); - if (Initialize(&nonConstPortName[0], &version)) - { - //Initialize will invalidate the old config manager - config = handle->getConfigManager(); - success = config->firmWareUpdate(lpszFileName, boost::bind(callback, _1, _2, _3, clientHandle)); - } - } + return success; +} +bool DLL430_OldApiV3::HIL_Connect_Entry_State(int32_t value) +{ + const bool success = handle && handle->sendHilCommand(HIL_CMD_CONNECT, (uint32_t)value); if (!success) - { - log(LogTarget::ERR, USB_FET_BSL_ACTIVE_ERR, ""); - } + log(LogTarget::ERR, INTERNAL_ERR, ""); + return success; } -void DLL430_OldApiV3::HIL_ResetJtagTap() +void DLL430_OldApiV3::HIL_FuseCheck() { if (handle) - handle->sendHilCommand(HIL_CMD_RESET_JTAG_TAP); + { + handle->sendHilCommand(HIL_CMD_FUSE_CHECK, 0); + } } -bool DLL430_OldApiV3::HIL_Open() +bool DLL430_OldApiV3::HIL_TCLK(uint8_t value) { - if (singleDevice) + if (handle) { - if (DebugManager* db_man = singleDevice->getDebugManager()) - { - // Stop polling, since we don't want it to interfere with low-level access - db_man->pausePolling(); - } + return handle->sendHilCommand(HIL_CMD_TCLK, value); } - - const bool success = handle && handle->sendHilCommand(HIL_CMD_OPEN); - if (!success) - log(LogTarget::ERR, INTERNAL_ERR, ""); - - return success; + return false; } bool DLL430_OldApiV3::HIL_Connect() { - const bool success = handle && handle->sendHilCommand(HIL_CMD_CONNECT); + const bool success = handle && handle->sendHilCommand(HIL_CMD_CONNECT, 0); if (!success) log(LogTarget::ERR, INTERNAL_ERR, ""); return success; } -bool DLL430_OldApiV3::HIL_Close(long vccOff) +bool DLL430_OldApiV3::HIL_Close(int32_t vccOff) { const bool success = handle && handle->sendHilCommand(HIL_CMD_CLOSE, vccOff); if (!success) log(LogTarget::ERR, INTERNAL_ERR, ""); - + return success; } -bool DLL430_OldApiV3::HIL_TCK(long state) +bool DLL430_OldApiV3::HIL_TCK(int32_t state) { const bool success = handle && handle->setJtagPin(JTAG_PIN_TCK, state != 0); if (!success) @@ -2843,7 +4073,7 @@ bool DLL430_OldApiV3::HIL_TCK(long state) return success; } -bool DLL430_OldApiV3::HIL_TMS(long state) +bool DLL430_OldApiV3::HIL_TMS(int32_t state) { const bool success = handle && handle->setJtagPin(JTAG_PIN_TMS, state != 0); if (!success) @@ -2852,7 +4082,7 @@ bool DLL430_OldApiV3::HIL_TMS(long state) return success; } -bool DLL430_OldApiV3::HIL_TDI(long state) +bool DLL430_OldApiV3::HIL_TDI(int32_t state) { const bool success = handle && handle->setJtagPin(JTAG_PIN_TDI, state != 0); if (!success) @@ -2861,7 +4091,7 @@ bool DLL430_OldApiV3::HIL_TDI(long state) return success; } -bool DLL430_OldApiV3::HIL_RST(long state) +bool DLL430_OldApiV3::HIL_RST(int32_t state) { const bool success = handle && handle->setJtagPin(JTAG_PIN_RST, state != 0); if (!success) @@ -2870,7 +4100,7 @@ bool DLL430_OldApiV3::HIL_RST(long state) return success; } -bool DLL430_OldApiV3::HIL_TST(long state) +bool DLL430_OldApiV3::HIL_TST(int32_t state) { const bool success = handle && handle->setJtagPin(JTAG_PIN_TST, state != 0); if (!success) @@ -2879,7 +4109,7 @@ bool DLL430_OldApiV3::HIL_TST(long state) return success; } -uint64_t DLL430_OldApiV3::HIL_JTAG_IR(long instruction) +uint64_t DLL430_OldApiV3::HIL_JTAG_IR(int32_t instruction) { uint64_t retVal = (uint64_t)-1; if (handle) @@ -2888,7 +4118,16 @@ uint64_t DLL430_OldApiV3::HIL_JTAG_IR(long instruction) return retVal; } -uint64_t DLL430_OldApiV3::HIL_JTAG_DR(int64_t data, long bitSize) +uint64_t DLL430_OldApiV3::HIL_JTAG_IR4(int32_t instruction) +{ + uint64_t retVal = (uint64_t)-1; + if (handle) + retVal = handle->sendJtagShift(HIL_CMD_JTAG_IR4, instruction); + + return retVal; +} + +uint64_t DLL430_OldApiV3::HIL_JTAG_DR(int64_t data, int32_t bitSize) { uint64_t retVal = (uint64_t)-1; if (handle) @@ -2897,28 +4136,108 @@ uint64_t DLL430_OldApiV3::HIL_JTAG_DR(int64_t data, long bitSize) return retVal; } -void DLL430_OldApiV3::execNotifyCallback(SYSTEM_EVENT_MSP event) +uint64_t DLL430_OldApiV3::HIL_JTAG_IR_DR(uint32_t instruction, uint64_t data, uint32_t bits) { - // just executes the function, given by the IDE - if(notifyCallback!=0) + uint64_t resultDR = (uint64_t)-1; + if (FetHandle* fetHandle = dynamic_cast(handle)) { - this->notifyCallback(event); // event could be DEVICE_CONNECTION_LOST etc + JtagShifts shifts; + + if (fetHandle->send(shifts(HIL_CMD_JTAG_IR, instruction, 8)(HIL_CMD_JTAG_DR, data, bits))) + { + //IR shift result at position 0 as 64bit value if needed + resultDR = shifts.getData().getOutputAt64(8); + } } + return resultDR; } -void DLL430_OldApiV3::iNotifyCallback(uint32_t msgId, uint32_t wParam, uint32_t lParam, uint32_t clientHandle) +bool DLL430_OldApiV3::HIL_DPACC(uint8_t address, uint32_t *data, uint16_t RdnWr) { - switch(wParam) + HalExecElement *el = new HalExecElement(ID_HilCommand); + + el->appendInputData32((uint32_t)HIL_CMD_DPACC); + el->appendInputData32((uint32_t)address); + el->appendInputData32(*data); + el->appendInputData32((uint32_t)RdnWr); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + FetHandle* fetHandle = dynamic_cast(handle); + + bool result = false; + if (fetHandle) { - case 0: - this->execNotifyCallback(FET_CONNECTION_LOST); - break; + result = fetHandle->send(cmd); + *data = cmd.elements[0]->getOutputAt32(0); + } - default: - break; + return result; +} + +bool DLL430_OldApiV3::HIL_APACC(uint8_t portNum, uint8_t address, uint32_t *data, uint16_t RdnWr) +{ + HalExecElement *el = new HalExecElement(ID_HilCommand); + + el->appendInputData32((uint32_t)HIL_CMD_APACC); + el->appendInputData32((uint32_t)address + (((uint32_t)portNum) << 24)); + el->appendInputData32(*data); + el->appendInputData32((uint32_t)RdnWr); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + FetHandle* fetHandle = dynamic_cast(handle); + + bool result = false; + if (fetHandle) + { + result = fetHandle->send(cmd); + *data = cmd.elements[0]->getOutputAt32(0); + } + + return result; +} + +bool DLL430_OldApiV3::HIL_MEMAP(uint8_t portNum, uint32_t address, uint32_t *data, uint16_t RdnWr) +{ + HalExecElement *el = new HalExecElement(ID_HilCommand); + + el->appendInputData32((uint32_t)HIL_CMD_MEMAP); + el->appendInputData32(address); + el->appendInputData32(*data); + el->appendInputData32((uint32_t)RdnWr | ((uint32_t)portNum << 24)); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + FetHandle* fetHandle = dynamic_cast(handle); + + bool result = false; + if (fetHandle) + { + result = fetHandle->send(cmd); + *data = cmd.elements[0]->getOutputAt32(0); + } + + return result; +} + +void DLL430_OldApiV3::execNotifyCallback(SYSTEM_EVENT_MSP event) +{ + // just executes the function, given by the IDE + if (notifyCallback) + { + this->notifyCallback(event); } } +void DLL430_OldApiV3::iNotifyCallback(uint32_t systemEventID) +{ + this->execNotifyCallback((enum SYSTEM_EVENT_MSP)systemEventID); +} + bool DLL430_OldApiV3::writeToExternalMemory() { // PC = @0xF8A2 Set to start of Generate Image routine @@ -2928,12 +4247,12 @@ bool DLL430_OldApiV3::writeToExternalMemory() // R14 = 0x0002 write image starting at addr 2 // R15 = RAM_LENGTH (RAM_END-RAM_START) // SP = 0x23FE make space for return addr on stack - // @23FE = @1C7E make function return to program start - MemoryManager* mm = singleDevice ? singleDevice->getMemoryManager() : 0; - - MemoryArea* registers = mm ? mm->getMemoryArea("CPU") : 0; - - if (!registers) + // @23FE = @1C7E make function return to program start + IMemoryManager* mm = singleDevice ? singleDevice->getMemoryManager() : 0; + + CpuRegisters* cpu = mm ? mm->getCpuRegisters() : 0; + + if (!cpu) { log(LogTarget::ERR, INTERNAL_ERR, ""); return false; @@ -2947,9 +4266,9 @@ bool DLL430_OldApiV3::writeToExternalMemory() const uint32_t stackPtr = ramEnd - 2; const uint32_t stackReserve = 50; - registers->read(0, saveRegister, 16); + cpu->read(0, saveRegister, 16); - uint32_t tmp[2] = {0}; + uint8_t tmp[2] = {0}; if ( !mm->read(0xF8A2, tmp, 2) || !mm->sync() ) { @@ -2965,38 +4284,158 @@ bool DLL430_OldApiV3::writeToExternalMemory() return false; } - const uint32_t programStart = tmp[0] | (tmp[1] << 8); + const uint32_t programStart = tmp[0] | (tmp[1] << 8); - uint32_t loaderAddress[2] = {0xFE, 0xBC}; + uint8_t loaderAddress[2] = {0xFE, 0xBC}; if ( !mm->write(stackPtr, loaderAddress, 2) || !mm->sync() ) { log(LogTarget::ERR, WRITE_MEMORY_ERR, ""); return false; } - registers->write(0, functionAddress ); //Set PC to start of Generate Image routine - registers->write(1, stackPtr); - registers->write(11, programStart ); - registers->write(12, ramStart); - registers->write(13, 0); - registers->write(14, 2); - registers->write(15, ramEnd - ramStart - stackReserve); + cpu->write(0, functionAddress ); //Set PC to start of Generate Image routine + cpu->write(1, stackPtr); + cpu->write(11, programStart ); + cpu->write(12, ramStart); + cpu->write(13, 0); + cpu->write(14, 2); + cpu->write(15, ramEnd - ramStart - stackReserve); this->handle->getConfigManager()->start(); Run(FREE_RUN, true); // start execution of loader code - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(15)); - - long state; - long pCPUCycles; + this_thread::sleep_for(chrono::seconds(15)); + + int32_t state; + int32_t pCPUCycles; State(&state, true, &pCPUCycles); uint32_t value; - registers->read(0, &value, 1); + cpu->read(0, &value); - registers->write(0, saveRegister, 16); - registers->getCacheCtrl()->flush(0, 0); // write save register values into the msp + cpu->write(0, saveRegister, 16); + cpu->flushCache(); // write save register values into the msp return (value != WRITE_ERROR); } + +bool DLL430_OldApiV3::EnableEnergyTrace(const EnergyTraceSetup* setup, const EnergyTraceCallbacks* callbacks, EnergyTraceHandle* handle) +{ + if (!this->handle) + { + log(LogTarget::ERR, INTERNAL_ERR, ""); + return false; + } + if (!this->handle->getConfigManager()->isEnergyTraceSupported()) + { + log(LogTarget::ERR, ET_NOT_SUPPORTED, ""); + return false; + } + if (!handle) + { + log(LogTarget::ERR, PARAMETER_ERR, ""); + return false; + } + + bool EA_Result = false; + + if (mEnergyTraceManager) + { + mPdSetup = *setup; + + mPdCallbacks = *callbacks; + *handle = (EnergyTraceHandle*)this; + + // if ET7 + if (setup->ETMode == ET_PROFILING_ANALOG_DSTATE) + { + if (!singleDevice) + { + log(LogTarget::ERR, NO_DEVICE_ERR, ""); + return false; + } + if (!this->handle->getConfigManager()->ulpDebugEnabled() && singleDevice->getTargetArchitecture() == MSP430) + { + log(LogTarget::ERR, ET_NOT_SUPPORTED_ULP_DEBUG, ""); + return false; + } + // if ET7 && not Jstate capbile device return error. + // For ARM devices PC register is used instead of Jstate + if (!singleDevice->deviceSupportsEnergyTrace()) + { + log(LogTarget::ERR, ET_NOT_SUPPORTED_DEVICE, ""); + return false; + } + // if ET7 && Jstate capbile device start ET + else + { + EA_Result = mEnergyTraceManager->startEnergyTrace(this, setup->ETMode, setup->ETCallback, singleDevice); + } + } + // if ET8 - start on every device + else if (mPdSetup.ETMode == ET_PROFILING_ANALOG) + { + EA_Result = mEnergyTraceManager->startEnergyTrace(this, setup->ETMode, setup->ETCallback, singleDevice); + } + // default return error + else + { + log(LogTarget::ERR, ET_NOT_SUPPORTED_DEVICE, ""); + return false; + } + } + if (!EA_Result) + { + log(LogTarget::ERR, ET_NOT_SUPPORTED_DEVICE, ""); + return false; + } + return true; +} + +bool DLL430_OldApiV3::ResetEnergyTrace(const EnergyTraceHandle handle) +{ + return mEnergyTraceManager->ResetEnergyTrace(); +} + +bool DLL430_OldApiV3::DisableEnergyTrace(const EnergyTraceHandle handle) +{ + bool retVal = false; + + if (mEnergyTraceManager) + { + mEnergyTraceManager->stopPolling(); + retVal = true; + } + boost::lock_guard callbackLock(callbackMutex); + mPdCallbacks.pContext = 0; + mPdCallbacks.pErrorOccurredFn = 0; + mPdCallbacks.pPushDataFn = 0; + return retVal; +} + +void DLL430_OldApiV3::prepareEemAccess() const +{ + if (singleDevice && handle && handle->getConfigManager() && + (deviceIsRunning() && !singleDevice->eemAccessibleInLpm() && this->handle->getConfigManager()->ulpDebugEnabled())) + throw EM_EemNotAccessibleException(); +} + +bool DLL430_OldApiV3::deviceIsRunning() const +{ + return (debug.state == RUNNING || debug.state == LPMX5_MODE); +} + +bool DLL430_OldApiV3::InterfaceType(enum INTERFACE_TYPE* type) const +{ + IConfigManager *cm = this->handle->getConfigManager(); + if (!cm || !singleDevice) + return false; + *type = cm->getInterfaceMode(singleDevice->getTargetArchitecture()); + return true; +} + +bool DLL430_OldApiV3::RegisterMessageCallback(MessageCallbackFn callback) +{ + return WarningFactory::instance()->RegisterMessageCallback(callback); +} diff --git a/DLL430_v3/src/DLL430_OldApiV3.h b/DLL430_v3/src/DLL430_OldApiV3.h index 20c46ca..fabbec6 100644 --- a/DLL430_v3/src/DLL430_OldApiV3.h +++ b/DLL430_v3/src/DLL430_OldApiV3.h @@ -1,247 +1,297 @@ -/* - * DLL430_OldApi.h - * - * Old API interface for IAR - V3 implementation. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_OLDAPIV3_H -#define DLL430_OLDAPIV3_H - -#include "DLL430_OldApi.h" - -#include - -#include - -#include - -#include "EM/BreakpointManager/IBreakpointManager.h" -#include "EM/TriggerCondition/ITriggerCondition.h" -#include "EM/VariableWatch/IWatchedVariable.h" - - -#include -#include -#include - -#include - -//#define DEVICE_DEFAULT_MCLKCNTRL0 0x60d7 -#define DEVICE_DEFAULT_MCLKCNTRL0 0x2407 -#define DEFAULT_CLKCNTRL 0x0026 - - -class DLL430_OldApiV3 : public DLL430_OldApi - , public TI::DLL430::DebugEventTarget - , public TI::DLL430::LogTarget -{ -public: - DLL430_OldApiV3 (); - ~DLL430_OldApiV3 (); - - /* this implements the DebugEventTarget interface */ - void event(TI::DLL430::DebugEventTarget::EventType e, uint32_t lParam=0, uint16_t wParam=0); - - /* this implements the LogTarget interface */ - void log(TI::DLL430::LogTarget::Severity, unsigned int, const char*); - - bool GetNumberOfUsbIfs(long* Number); - bool GetNameOfUsbIf(long Idx, char** Name, long* Status); - bool Initialize(char* port, long* version); - bool SetSystemNotfyCallback(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback); - bool OpenDevice(char* Device, char* Password, long PwLength, long DeviceCode, long setId); - bool GetFoundDevice(char* FoundDevice, long count); - bool Close(long vccOff); - bool Configure(enum CONFIG_MODE mode, long value); - long Error_Number(void); - const char* Error_String(long errorNumber); - bool GetJtagID(long* JtagId); - bool Identify(char* buffer, long count, long setId); - - // second version of identify, not part of API (OpenDevice) - bool Identify(char* buffer, long count, long setId, char* Password, long PwLength, long code); - - bool Device(long localDeviceId, char* buffer, long count); - bool VCC(long voltage); - bool GetCurVCCT(long* voltage); - bool GetExtVoltage(long* voltage, long* state); - bool Erase(long type, long address, long length); - bool Memory(long address, uint8_t* buf, long count, long rw); - bool Secure(void); - bool ReadOutFile(long wStart, long wLength, char* lpszFileName, long iFileType); - bool ProgramFile(char* File, long eraseType, long verifyMem); - bool VerifyFile(char* File); - bool VerifyMem(long StartAddr, long Length, uint8_t* DataArray); - bool EraseCheck(long StartAddr, long Length); - bool Reset(long method, long execute, long releaseJTAG); - - bool ExtRegisters(long address, uint8_t * buffer,long count, long rw); - - bool Registers(long* registers, long mask, long rw); - bool Register(long* reg, long regNb, long rw); - bool Run(long mode, long releaseJTAG); - bool State(long* state, long stop, long* pCPUCycles); - bool CcGetClockNames(long localDeviceId, EemGclkCtrl_t** CcClockNames); - bool CcGetModuleNames(long localDeviceId, EemMclkCtrl_t** CcModuleNames); - bool EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, long clientHandle, MessageID_t* pMsgIdBuffer); - bool EEM_SetBreakpoint(uint16_t* pwBpHandle, BpParameter_t* pBpBuffer); - bool EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer); - bool EEM_SetCombineBreakpoint(CbControl_t CbControl, uint16_t wCount, uint16_t* pwCbHandle, uint16_t* pawBpHandle); - bool EEM_GetCombineBreakpoint(uint16_t wCbHandle, uint16_t* pwCount, uint16_t* pawBpHandle); - bool EEM_SetTrace(TrParameter_t* pTrBuffer); - bool EEM_GetTrace(TrParameter_t* pTrDestBuffer); - bool EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer); - bool EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, unsigned long *pulCount); - bool EEM_RefreshTraceBuffer(void); - bool EEM_SetVariableWatch(VwEnable_t VwEnable); - bool EEM_SetVariable(uint16_t* pVwHandle, VwParameter_t* pVwBuffer); - bool EEM_GetVariableWatch(VwEnable_t* pVwEnable, VwResources_t* paVwDestBuffer); - bool EEM_SetClockControl(CcParameter_t* pCcBuffer); - bool EEM_GetClockControl(CcParameter_t* pCcDestBuffer); - bool EEM_SetSequencer(SeqParameter_t* pSeqBuffer); - bool EEM_GetSequencer(SeqParameter_t* pSeqDestBuffer); - bool EEM_ReadSequencerState(SeqState_t* pSeqState); - bool FET_SelfTest(long count, uint8_t* buffer); - bool FET_SetSignals(long SigMask, long SigState); - bool FET_Reset(void); - bool FET_I2C(long address, uint8_t* buffer, long count, long rw); - bool FET_EnterBootloader(void); - bool FET_ExitBootloader(void); - bool FET_GetFwVersion(long* version); - bool FET_GetHwVersion(uint8_t** version, long* count); - bool FET_FwUpdate(char* lpszFileName, DLL430_FET_NOTIFY_FUNC callback, long clientHandle); - - void HIL_ResetJtagTap(); - bool HIL_Open(); - bool HIL_Connect(); - bool HIL_Close(long vccOff); - bool HIL_TCK(long state); - bool HIL_TMS(long state); - bool HIL_TDI(long state); - bool HIL_RST(long state); - bool HIL_TST(long state); - uint64_t HIL_JTAG_IR(long instruction); - uint64_t HIL_JTAG_DR(int64_t data, long bitSize); - - void execThread(); - void execNotifyCallback(SYSTEM_EVENT_MSP); - void iNotifyCallback(uint32_t msgId, uint32_t wParam, uint32_t lParam, uint32_t clientHandle); - -private: - template - class TableEntry - { - public: - TableEntry() : inUse_(false) {} - - void set(T ptr) { entry_ = ptr; inUse_ = true; } - void clear() { entry_.reset(); inUse_ = false; } - void reserveSlot() { entry_.reset(); inUse_ = true; } - bool inUse() const { return inUse_; } - const T& value() const { return entry_; } - - private: - T entry_; - bool inUse_; - }; - - std::map > triggers; - std::map > traceTriggers; - std::map > breakpoints; - std::map > triggerCombinations; - std::map watchedVariables; - boost::mutex watchedVariablesMutex; - VwEnable_t varWatch_state; - - TI::DLL430::TriggerConditionPtr triggerConditionFromBpParameter(TI::DLL430::EmulationManagerPtr emuManager, BpParameter_t* bpBuffer); - void addBreakpointsAndStorage(TI::DLL430::EmulationManagerPtr emuManager, TI::DLL430::TriggerConditionPtr triggerCondition, BpAction_t reactions, uint16_t handle); - void updateStorageConfiguration(TI::DLL430::EmulationManagerPtr emuManager); - - bool writeToExternalMemory(); - bool lockMemory(const std::string& memoryName, bool lock); - - // Contains all the config data - std::map config_settings; - - // Container to keep persistent list of port names to be referenced from IDE - // Pointers to strings in table get invalidated when initializing - struct port_name { - char name[64]; - port_name() { memset(name, 0, sizeof(name)); } - }; - typedef std::deque port_names_list_type; - port_names_list_type port_names; - - CcParameter_t clock_control; - EemMclkCtrl_t moduleNameBuffer; - - std::map bp_storage; - std::map vw_storage; - TrParameter_t trace_storage; // trace API parameter buffer - SeqParameter_t sequencer_control; - - TI::DLL430::FetHandleManager* manager; - TI::DLL430::FetHandle* handle; - - unsigned int errNum; - bool v2initCalled; - - std::vector v_tmp; - - // only 1 FET with one device - TI::DLL430::DeviceHandle * singleDevice; - long selectedJtagMode; - - bool devInfoFilled; - DEVICE_T devInfo; - uint32_t devCode; - - struct { - enum STATE_MODES state; - bool jtagReleased; - struct { - MSP430_EVENTNOTIFY_FUNC func; - long clientHandle; - MessageID_t ids; - } cb; - } debug; - - SYSTEM_NOTIFY_CALLBACK notifyCallback; - string lastUsedPort; -}; - -#endif /* DLL430_OLDAPIV3_H */ +/* + * DLL430_OldApi.h + * + * Old API interface for IAR - V3 implementation. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "DLL430_OldApi.h" + +#include "FetHandleManager.h" +#include "Log.h" + +#include "EM/BreakpointManager/IBreakpointManager.h" +#include "EM/TriggerCondition/ITriggerCondition.h" +#include "EM/VariableWatch/IWatchedVariable.h" + +#include "EnergyTraceManager.h" +#include "PollingManager.h" +#include "IMemoryManager.h" + + +class DLL430_OldApiV3 : public DLL430_OldApi, public TI::DLL430::DebugEventTarget +{ +public: + DLL430_OldApiV3 (); + ~DLL430_OldApiV3 (); + + DLL430_OldApiV3(const DLL430_OldApiV3&) = delete; + DLL430_OldApiV3& operator=(const DLL430_OldApiV3&) = delete; + + /* this implements the DebugEventTarget interface */ + void event(TI::DLL430::DebugEventTarget::EventType e, uint32_t lParam=0, uint16_t wParam=0); + + void log(TI::DLL430::LogTarget::Severity, uint32_t, const char*); + + bool GetNumberOfUsbIfs(int32_t* Number); + bool GetNameOfUsbIf(int32_t Idx, char** Name, int32_t* Status); + bool SetTargetArchitecture(TARGET_ARCHITECTURE_t architecture); + bool loadDeviceDb(const char* file); + bool DumpDeviceDb(const char* file); + bool clearDeviceDb(); + bool Initialize(const char* port, int32_t* version); + bool SetSystemNotfyCallback(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback); + bool OpenDevice(const char* Device, const char* Password, int32_t PwLength, int32_t DeviceCode, int32_t setId); + bool GetFoundDevice(uint8_t* FoundDevice, int32_t count); + bool Close(int32_t vccOff); + bool Configure(enum CONFIG_MODE mode, int32_t value); + int32_t Error_Number(); + const char* Error_String(int32_t errorNumber); + bool GetJtagID(int32_t* JtagId); + bool Identify(uint8_t* buffer, int32_t count, int32_t setId, const char* Password, int32_t PwLength, int32_t code); + bool Device(int32_t localDeviceId, uint8_t* buffer, int32_t count); + bool VCC(int32_t voltage); + bool GetCurVCCT(int32_t* voltage); + bool GetExtVoltage(int32_t* voltage, int32_t* state); + bool Erase(int32_t type, int32_t address, int32_t length); + bool Memory(int32_t address, uint8_t* buf, int32_t count, int32_t rw); + bool Secure(); + bool ReadOutFile(int32_t wStart, int32_t wLength, const char* lpszFileName, int32_t iFileType); + bool ProgramFile(const char* File, int32_t eraseType, int32_t verifyMem); + bool VerifyFile(const char* File); + bool VerifyMem(int32_t StartAddr, int32_t Length, const uint8_t* DataArray); + bool EraseCheck(int32_t StartAddr, int32_t Length); + bool Reset(int32_t method, int32_t execute, int32_t releaseJTAG); + bool InterfaceType(enum INTERFACE_TYPE* type) const; + bool RegisterMessageCallback(MessageCallbackFn callback); + + bool ExtRegisters(int32_t address, uint8_t * buffer, int32_t count, int32_t rw); + + bool Registers(int32_t* registers, int32_t mask, int32_t rw); + bool Register(int32_t* reg, int32_t regNb, int32_t rw); + bool Run(int32_t mode, int32_t releaseJTAG); + bool State(int32_t* state, int32_t stop, int32_t* pCPUCycles); + bool CcGetClockNames(int32_t localDeviceId, EemGclkCtrl_t** CcClockNames); + bool CcGetModuleNames(int32_t localDeviceId, EemMclkCtrl_t** CcModuleNames); + bool EEM_Init(MSP430_EVENTNOTIFY_FUNC callback, int32_t clientHandle, const MessageID_t* pMsgIdBuffer); + bool EEM_SetBreakpoint(uint16_t* pwBpHandle, const BpParameter_t* pBpBuffer); + bool EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer); + bool EEM_SetCombineBreakpoint(CbControl_t CbControl, uint16_t wCount, uint16_t* pwCbHandle, const uint16_t* pawBpHandle); + bool EEM_GetCombineBreakpoint(uint16_t wCbHandle, uint16_t* pwCount, uint16_t* pawBpHandle); + + bool EEM_SetTrace(const TrParameter_t* pTrBuffer); + bool EEM_GetTrace(TrParameter_t* pTrDestBuffer); + bool EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer); + bool EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, uint32_t *pulCount); + bool EEM_RefreshTraceBuffer(); + + bool EEM_SetVariableWatch(VwEnable_t VwEnable); + bool EEM_SetVariable(uint16_t* pVwHandle, const VwParameter_t* pVwBuffer); + bool EEM_GetVariableWatch(VwEnable_t* pVwEnable, VwResources_t* paVwDestBuffer); + + bool EEM_SetClockControl(const CcParameter2_t* pCcBuffer); + bool EEM_GetClockControl(CcParameter2_t* pCcDestBuffer); + + bool EEM_SetSequencer(const SeqParameter_t* pSeqBuffer); + bool EEM_GetSequencer(SeqParameter_t* pSeqDestBuffer); + bool EEM_ReadSequencerState(SeqState_t* pSeqState); + + bool EEM_SetCycleCounterMode(CycleCounterMode_t mode); + bool EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig); + bool EEM_ReadCycleCounterValue(uint32_t wCounter, uint64_t* value); + bool EEM_WriteCycleCounterValue(uint32_t wCounter, uint64_t value); + bool EEM_ResetCycleCounter(uint32_t wCounter); + + bool FET_SelfTest(int32_t count, uint8_t* buffer); + bool FET_SetSignals(int32_t SigMask, int32_t SigState); + bool FET_Reset(); + bool FET_I2C(int32_t address, uint8_t* buffer, int32_t count, int32_t rw); + bool FET_EnterBootloader(); + bool FET_ExitBootloader(); + bool FET_GetFwVersion(int32_t* version); + bool FET_GetHwVersion(uint8_t** version, int32_t* count); + bool FET_FwUpdate(const char* lpszFileName, DLL430_FET_NOTIFY_FUNC callback, int32_t clientHandle); + + void HIL_ResetJtagTap(); + void HIL_FuseCheck(); + bool HIL_Open(); + bool HIL_Configure(enum CONFIG_MODE mode, int32_t value); + bool HIL_Connect(); + bool HIL_Connect_Entry_State(int32_t value = 0); + bool HIL_Bsl(); + bool HIL_Close(int32_t vccOff); + bool HIL_TCK(int32_t state); + bool HIL_TMS(int32_t state); + bool HIL_TDI(int32_t state); + bool HIL_RST(int32_t state); + bool HIL_TST(int32_t state); + uint64_t HIL_JTAG_IR(int32_t instruction); + uint64_t HIL_JTAG_IR4(int32_t instruction); + uint64_t HIL_JTAG_DR(int64_t data, int32_t bitSize); + uint64_t HIL_JTAG_IR_DR(uint32_t instruction, uint64_t data, uint32_t bits); + bool HIL_DPACC(uint8_t address, uint32_t *data, uint16_t RdnWr); + bool HIL_APACC(uint8_t portNum, uint8_t address, uint32_t *data, uint16_t RdnWr); + bool HIL_MEMAP(uint8_t portNum, uint32_t address, uint32_t *data, uint16_t RdnWr); + bool HIL_TCLK(uint8_t value); + + void execThread(); + void execNotifyCallback(SYSTEM_EVENT_MSP); + void iNotifyCallback(uint32_t systemEventID); + + /** + \brief EnergyTrace features + */ + bool EnableEnergyTrace(const EnergyTraceSetup* setup, const EnergyTraceCallbacks* callbacks, EnergyTraceHandle* handle); + bool DisableEnergyTrace(const EnergyTraceHandle handle); + bool ResetEnergyTrace(const EnergyTraceHandle handle); + + void setErrorCode(ERROR_CODE error) { this->errNum = error; } + + SyncedCallWrapper SyncedCall() { return SyncedCallWrapper(this, &apiMutex); } + +private: + template + class TableEntry + { + public: + TableEntry() : inUse_(false) {} + + void set(T ptr) { entry_ = ptr; inUse_ = true; } + void clear() { entry_.reset(); inUse_ = false; } + void reserveSlot() { entry_.reset(); inUse_ = true; } + bool inUse() const { return inUse_; } + const T& value() const { return entry_; } + + private: + T entry_; + bool inUse_; + }; + + bool hardwareTriggerAtAddressExists(uint32_t address) const; + bool softwareTriggerAtAddressExists(uint32_t address) const; + bool rangeTriggerIncludingAddressExists(uint32_t address) const; + bool softwareTriggerInRangeExists(uint32_t start, uint32_t end, BpRangeAction_t inOut) const; + bool triggerConflictsWithExistingTrigger(const BpParameter_t* bpBuffer) const; + bool criticalRrcmInstructionAt(uint32_t address); + TI::DLL430::TriggerConditionPtr triggerConditionFromBpParameter(TI::DLL430::EmulationManagerPtr emuManager, const BpParameter_t* bpBuffer); + void addBreakpointsAndStorage(TI::DLL430::EmulationManagerPtr emuManager, TI::DLL430::TriggerConditionPtr triggerCondition, BpAction_t reactions, uint16_t handle); + void updateStorageReactions(TI::DLL430::EmulationManagerPtr emuManager); + void updateCounterReactions(TI::DLL430::EmulationManagerPtr emuManager); + void clearSoftwareTriggers(); + void restoreSoftwareTriggers(std::map& bpStorage); + bool disableSoftwareBreakpointsOnClose(); + + void resetEM(); + + bool writeToExternalMemory(); + bool lockMemory(TI::DLL430::MemoryArea::Name memoryName, bool lock); + + void prepareEemAccess() const; + void checkCycleCounterConflict(uint32_t wCounter) const; + + bool deviceIsRunning() const; + + typedef std::map > TriggerTable; + TriggerTable triggers; + TriggerTable traceTriggers; + TriggerTable counterTriggers; + + std::map > breakpoints; + std::map > triggerCombinations; + std::map watchedVariables; + boost::mutex watchedVariablesMutex; + VwEnable_t varWatch_state; + + // Contains all the config data + std::map config_settings; + + // Container to keep persistent list of port names to be referenced from IDE + // Pointers to strings in table get invalidated when initializing + struct port_name { + char name[64]; + port_name() { memset(name, 0, sizeof(name)); } + }; + typedef std::deque port_names_list_type; + port_names_list_type port_names; + + CcParameter2_t clock_control; + EemMclkCtrl_t moduleNameBuffer; + + std::map bp_storage; + std::map vw_storage; + TrParameter_t trace_storage; // trace API parameter buffer + SeqParameter_t sequencer_control; + + std::unique_ptr manager; + TI::DLL430::IFetHandle* handle; + + uint32_t errNum; + + // only 1 FET with one device + TI::DLL430::IDeviceHandle * singleDevice; + int32_t selectedJtagMode; + + bool devInfoFilled; + DEVICE_T devInfo; + uint32_t devCode; + TARGET_ARCHITECTURE_t devArchitecture; + + struct { + enum STATE_MODES state; + bool jtagReleased; + struct { + MSP430_EVENTNOTIFY_FUNC func; + int32_t clientHandle; + MessageID_t ids; + } cb; + } debug; + + SYSTEM_NOTIFY_CALLBACK notifyCallback; + uint32_t clientHandle; + + TI::DLL430::PollingManager *mPollingManager; + + /** + EnergyTrace variables + */ + TI::DLL430::EnergyTraceManager *mEnergyTraceManager; + EnergyTraceSetup mPdSetup; /**< EnergyTrace parameters */ + EnergyTraceCallbacks mPdCallbacks; /**< EnergyTrace callback functions */ + + boost::recursive_mutex apiMutex; + boost::mutex callbackMutex; + + uint32_t lastCycleCount; +}; diff --git a/DLL430_v3/src/DLL430_capi.cpp b/DLL430_v3/src/DLL430_capi.cpp new file mode 100644 index 0000000..ec02fb6 --- /dev/null +++ b/DLL430_v3/src/DLL430_capi.cpp @@ -0,0 +1,910 @@ +/* + * DLL430_capi.cpp + * + * C API implementation. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "DLL430_OldApiV3.h" +#include + +DLL430_OldApi* DLL430_CurrentInstance = 0; +#if defined(_WIN32) || defined (_WIN64) +#define ENTRY_FUNCTION bool +#define EXIT_FUNCTION void +#elif defined (UNIX) +#define ENTRY_FUNCTION bool __attribute__ ((constructor)) +#define EXIT_FUNCTION void __attribute__ ((destructor)) +#endif + +ENTRY_FUNCTION oldapi_INIT() +{ + DLL430_CurrentInstance = 0; + return true; +} + +EXIT_FUNCTION oldapi_EXIT() +{ + if (DLL430_CurrentInstance != 0) + delete DLL430_CurrentInstance; +} + +static STATUS_T toStatus (bool b) +{ + return b ? STATUS_OK : STATUS_ERROR; +} + +static void createInstance () +{ + if (DLL430_CurrentInstance == 0) + { + DLL430_CurrentInstance = new DLL430_OldApiV3; + DLL430_CurrentInstance->loadDeviceDb(NULL); + } +} + +STATUS_T WINAPI MSP430_GetNumberOfUsbIfs(int32_t* Number) +{ + createInstance(); + int32_t count; + + if (!DLL430_CurrentInstance->GetNumberOfUsbIfs(&count)) + return toStatus(false); + + if (Number) + { + *Number = count; + } + return toStatus(true); +} + +STATUS_T WINAPI MSP430_GetNameOfUsbIf(int32_t Idx, char** Name, int32_t* Status) +{ + createInstance(); + + return toStatus(DLL430_CurrentInstance->GetNameOfUsbIf(Idx, Name, Status)); +} + +STATUS_T WINAPI MSP430_LoadDeviceDb(const char* file) +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->loadDeviceDb(file)); +} + +STATUS_T WINAPI MSP430_DumpDeviceDb(const char* file) +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->DumpDeviceDb(file)); +} + +STATUS_T WINAPI MSP430_ClearDeviceDb() +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->clearDeviceDb()); +} + +STATUS_T WINAPI MSP430_SetTargetArchitecture(TARGET_ARCHITECTURE_t architecture) +{ + createInstance(); + return toStatus(DLL430_CurrentInstance->SetTargetArchitecture(architecture)); +} + +STATUS_T WINAPI MSP430_Initialize(const char* port, int32_t* version) +{ + createInstance(); + + if ((version==nullptr)||(port==nullptr)) + return toStatus(false); + + // test port for 'LPT' + if ((*port == '1' || *port == '2' || *port == '3') || (!strncmp(port, "LPT", 3))) + { + DLL430_CurrentInstance->setErrorCode(NO_LPT_SUPPORT); + return toStatus(false); + } + + return toStatus(DLL430_CurrentInstance->Initialize(port, version)); + bool ret = false; + +} + +STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback) +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SetSystemNotfyCallback(parSystemNotifyCallback)); +} + +STATUS_T WINAPI MSP430_OpenDevice(const char* Device, const char* Password, int32_t PwLength, int32_t DeviceCode, int32_t setId) +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->OpenDevice(Device, Password, PwLength, DeviceCode, setId)); +} + +STATUS_T WINAPI MSP430_GetFoundDevice(uint8_t* FoundDevice, int32_t count) +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->GetFoundDevice(FoundDevice, count)); +} + +STATUS_T WINAPI MSP430_Close(int32_t vccOff) +{ + if (!DLL430_CurrentInstance) + return STATUS_OK; + //Call must not be syncronized (potential dead lock) + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Close(vccOff)); +} + +STATUS_T WINAPI MSP430_Configure(int32_t mode, int32_t value) +{ + enum CONFIG_MODE m = (enum CONFIG_MODE)mode; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->Configure(m, value)); +} + +int32_t WINAPI MSP430_Error_Number(void) +{ + if (!DLL430_CurrentInstance) + return 0; + return DLL430_CurrentInstance->Error_Number(); +} + +const char* WINAPI MSP430_Error_String(int32_t errorNumber) +{ + if (!DLL430_CurrentInstance) + { + return "MSP DebugStack not initialized"; + } + return DLL430_CurrentInstance->Error_String(errorNumber); +} + +STATUS_T WINAPI MSP430_GetJtagID(int32_t* JtagId) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->GetJtagID(JtagId)); +} + +STATUS_T WINAPI MSP430_Device(int32_t localDeviceId, uint8_t* buffer, int32_t count) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Device(localDeviceId, buffer, count)); +} + +STATUS_T WINAPI MSP430_VCC(int32_t voltage) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->VCC(voltage)); +} + +STATUS_T WINAPI MSP430_GetCurVCCT(int32_t* voltage) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->GetCurVCCT(voltage)); +} + +STATUS_T WINAPI MSP430_GetExtVoltage(int32_t* voltage, int32_t* state) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->GetExtVoltage(voltage, state)); +} + +STATUS_T WINAPI MSP430_Erase(int32_t type, int32_t address, int32_t length) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->Erase(type, address, length)); +} + +STATUS_T WINAPI MSP430_Memory(int32_t address, uint8_t* buffer, int32_t count, int32_t rw) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->Memory(address, buffer, count, rw)); +} + +STATUS_T WINAPI MSP430_Secure(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->Secure()); +} + +STATUS_T WINAPI MSP430_ReadOutFile(int32_t wStart, int32_t wLength, const char* lpszFileName, int32_t iFileType) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->ReadOutFile(wStart, wLength, lpszFileName, iFileType)); +} + +STATUS_T WINAPI MSP430_ProgramFile(const char* File, int32_t eraseType, int32_t verifyMem) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->ProgramFile(File, eraseType, verifyMem)); +} + +STATUS_T WINAPI MSP430_VerifyFile(const char* File) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->VerifyFile(File)); +} + +STATUS_T WINAPI MSP430_VerifyMem(int32_t StartAddr, int32_t Length, const uint8_t* DataArray) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->VerifyMem(StartAddr, Length, DataArray)); +} + +STATUS_T WINAPI MSP430_EraseCheck(int32_t StartAddr, int32_t Length) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EraseCheck(StartAddr, Length)); +} + +STATUS_T WINAPI MSP430_Reset(int32_t method, int32_t execute, int32_t releaseJTAG) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->Reset(method, execute, releaseJTAG)); +} + +STATUS_T WINAPI MSP430_ExtRegisters(int32_t address, uint8_t* buffer, int32_t count, int32_t rw) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->ExtRegisters(address, (uint8_t*)buffer, count, rw)); +} + +STATUS_T WINAPI MSP430_Registers(int32_t* registers, int32_t mask, int32_t rw) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Registers(registers, mask, rw)); +} + +STATUS_T WINAPI MSP430_Register(int32_t* reg, int32_t regNb, int32_t rw) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Register(reg, regNb, rw)); +} + +STATUS_T WINAPI MSP430_Run(int32_t mode, int32_t releaseJTAG) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->Run(mode, releaseJTAG)); +} + +STATUS_T WINAPI MSP430_State(int32_t* state, int32_t stop, int32_t* pCPUCycles) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->State(state, stop, pCPUCycles)); +} + +STATUS_T WINAPI MSP430_CcGetClockNames(int32_t localDeviceId, EemGclkCtrl_t** CcClockNames) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->CcGetClockNames(localDeviceId, CcClockNames)); +} + +STATUS_T WINAPI MSP430_CcGetModuleNames(int32_t localDeviceId, EemMclkCtrl_t** CcModuleNames) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->CcGetModuleNames(localDeviceId, CcModuleNames)); +} + +STATUS_T WINAPI MSP430_EEM_Init( + MSP430_EVENTNOTIFY_FUNC callback, + int32_t clientHandle, + const MessageID_t* pMsgIdBuffer +) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_Init(callback, clientHandle, pMsgIdBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_SetBreakpoint(uint16_t* pwBpHandle, const BpParameter_t* pBpBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetBreakpoint(pwBpHandle, pBpBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetBreakpoint(wBpHandle, pBpDestBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint( + CbControl_t CbControl, + uint16_t wCount, + uint16_t* pwCbHandle, + const uint16_t* pawBpHandle +) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetCombineBreakpoint(CbControl, wCount, pwCbHandle, pawBpHandle)); +} + +STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint( + uint16_t wCbHandle, + uint16_t* pwCount, + uint16_t* pawBpHandle +) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetCombineBreakpoint(wCbHandle, pwCount, pawBpHandle)); +} + +STATUS_T WINAPI MSP430_EEM_SetTrace(const TrParameter_t* pTrBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetTrace(pTrBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_GetTrace(TrParameter_t* pTrDestBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetTrace(pTrDestBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_ReadTraceBuffer(pTraceBuffer)); +} + +DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, uint32_t* pulCount) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_ReadTraceData(pTraceBuffer, pulCount)); +} + +STATUS_T WINAPI MSP430_EEM_RefreshTraceBuffer(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_RefreshTraceBuffer()); +} + +STATUS_T WINAPI MSP430_EEM_SetVariableWatch(VwEnable_t VwEnable) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetVariableWatch(VwEnable)); +} + +STATUS_T WINAPI MSP430_EEM_SetVariable(uint16_t* pVwHandle, const VwParameter_t* pVwBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetVariable(pVwHandle, pVwBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_GetVariableWatch(VwEnable_t* pVwEnable, VwResources_t* paVwDestBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetVariableWatch(pVwEnable, paVwDestBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_SetClockControl(const CcParameter_t* pCcBuffer) +{ + CcParameter2_t tmp; + tmp.ccControl = pCcBuffer->ccControl; + tmp.ccGeneralCLK = pCcBuffer->ccGeneralCLK; + tmp.ccModule = pCcBuffer->ccModule; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetClockControl(&tmp)); +} + +STATUS_T WINAPI MSP430_EEM_GetClockControl(CcParameter_t* pCcDestBuffer) +{ + CcParameter2_t tmp; + STATUS_T ret = toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetClockControl(&tmp)); + if (ret == STATUS_OK) + { + pCcDestBuffer->ccControl = tmp.ccControl; + pCcDestBuffer->ccGeneralCLK = tmp.ccGeneralCLK; + pCcDestBuffer->ccModule = tmp.ccModule; + } + return ret; +} + +STATUS_T WINAPI MSP430_EEM_SetClockControl2(const CcParameter2_t* pCcBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetClockControl(pCcBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_GetClockControl2(CcParameter2_t* pCcDestBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetClockControl(pCcDestBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_SetSequencer(const SeqParameter_t* pSeqBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_SetSequencer(pSeqBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_GetSequencer(SeqParameter_t* pSeqDestBuffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetSequencer(pSeqDestBuffer)); +} + +STATUS_T WINAPI MSP430_EEM_ReadSequencerState(SeqState_t* pSeqState) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->EEM_ReadSequencerState(pSeqState)); +} + +STATUS_T WINAPI MSP430_EEM_SetCycleCounterMode(CycleCounterMode_t mode) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetCycleCounterMode(mode)); +} + +STATUS_T WINAPI MSP430_EEM_ConfigureCycleCounter(uint32_t wCounter, CycleCounterConfig_t pCycConfig) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_ConfigureCycleCounter(wCounter, pCycConfig)); +} + +STATUS_T WINAPI MSP430_EEM_ReadCycleCounterValue(uint32_t wCounter, uint64_t* value) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_ReadCycleCounterValue(wCounter, value)); +} + +STATUS_T WINAPI MSP430_EEM_WriteCycleCounterValue(uint32_t wCounter, uint64_t value) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_WriteCycleCounterValue(wCounter, value)); +} + +STATUS_T WINAPI MSP430_EEM_ResetCycleCounter(uint32_t wCounter) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_ResetCycleCounter(wCounter)); +} + +STATUS_T WINAPI MSP430_FET_SelfTest(int32_t count, uint8_t* buffer) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_SelfTest(count, buffer)); +} + +STATUS_T WINAPI MSP430_FET_SetSignals(int32_t SigMask, int32_t SigState) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_SetSignals(SigMask, SigState)); +} + +STATUS_T WINAPI MSP430_FET_Reset(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_Reset()); +} + +STATUS_T WINAPI MSP430_FET_I2C(int32_t address, uint8_t* buffer, int32_t count, int32_t rw) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_I2C(address, buffer, count, rw)); +} + +STATUS_T WINAPI MSP430_FET_EnterBootloader(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_EnterBootloader()); +} + +STATUS_T WINAPI MSP430_FET_ExitBootloader(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_ExitBootloader()); +} + +STATUS_T WINAPI MSP430_FET_GetFwVersion(int32_t* version) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_GetFwVersion(version)); +} + +STATUS_T WINAPI MSP430_FET_GetHwVersion(uint8_t** version, int32_t* count) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_GetHwVersion(version, count)); +} + +STATUS_T WINAPI MSP430_FET_FwUpdate( + const char* lpszFileName, + DLL430_FET_NOTIFY_FUNC callback, + int32_t clientHandle +) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SyncedCall()->FET_FwUpdate(lpszFileName, callback, clientHandle)); +} + +void WINAPI MSP430_HIL_ResetJtagTap(void) +{ + if (DLL430_CurrentInstance) + DLL430_CurrentInstance->HIL_ResetJtagTap(); +} + +void WINAPI MSP430_HIL_FuseCheck(void) +{ + if (DLL430_CurrentInstance) + DLL430_CurrentInstance->HIL_FuseCheck(); +} + + +STATUS_T WINAPI MSP430_HIL_Open(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Open()); +} + +STATUS_T WINAPI MSP430_HIL_Configure(int32_t mode, int32_t value) +{ + enum CONFIG_MODE m = (enum CONFIG_MODE)mode; + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Configure(m, value)); +} + +STATUS_T WINAPI MSP430_HIL_Connect() +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Connect()); +} + +STATUS_T WINAPI MSP430_HIL_Connect_Entry_State(int32_t value) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Connect_Entry_State(value)); +} + +STATUS_T WINAPI MSP430_HIL_Close(int32_t vccOff) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Close(vccOff)); +} + +STATUS_T WINAPI MSP430_HIL_Bsl(void) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Bsl()); +} + +int32_t WINAPI MSP430_HIL_JTAG_IR(int32_t instruction) +{ + uint64_t retValue = (uint64_t)-1; + if (DLL430_CurrentInstance) + retValue = DLL430_CurrentInstance->HIL_JTAG_IR(instruction); + + return (int32_t)retValue; +} + +int32_t WINAPI MSP430_HIL_JTAG_IR4(int32_t instruction) +{ + uint64_t retValue = (uint64_t)-1; + if (DLL430_CurrentInstance) + retValue = DLL430_CurrentInstance->HIL_JTAG_IR4(instruction); + + return (int32_t)retValue; +} + +int32_t WINAPI MSP430_HIL_JTAG_DR(int32_t data, int32_t bits) +{ + uint64_t retValue = (uint64_t)-1; + if (DLL430_CurrentInstance) + retValue = DLL430_CurrentInstance->HIL_JTAG_DR(data, bits); + + return (uint32_t)retValue; +} + +int64_t WINAPI MSP430_HIL_JTAG_DRX(int64_t data, int32_t bits) +{ + uint64_t retValue = (uint64_t)-1; + if (DLL430_CurrentInstance) + retValue = DLL430_CurrentInstance->HIL_JTAG_DR(data, bits); + + return (int64_t)retValue; +} + +int64_t WINAPI MSP430_HIL_JTAG_IR_DRX(int32_t instruction, int64_t data, int32_t bits) +{ + uint64_t retValue = (uint64_t)-1; + if (DLL430_CurrentInstance) + retValue = DLL430_CurrentInstance->HIL_JTAG_IR_DR(instruction, data, bits); + + return (int64_t)retValue; +} + +STATUS_T WINAPI MSP430_HIL_TCK(int32_t state) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TCK(state)); +} + +STATUS_T WINAPI MSP430_HIL_TMS(int32_t state) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TMS(state)); +} + +STATUS_T WINAPI MSP430_HIL_TDI(int32_t state) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TDI(state)); +} + +STATUS_T WINAPI MSP430_HIL_RST(int32_t state) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_RST(state)); +} + +STATUS_T WINAPI MSP430_HIL_TST(int32_t state) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TST(state)); +} + +STATUS_T WINAPI MSP430_HIL_DPACC(uint8_t address, uint32_t *data, uint16_t RdnWr) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_DPACC(address, data, RdnWr)); +} + +STATUS_T WINAPI MSP430_HIL_APACC(uint8_t portNum, uint8_t address, uint32_t *data, uint16_t RdnWr) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_APACC(portNum, address, data, RdnWr)); +} + +STATUS_T WINAPI MSP430_HIL_MEMAP(uint8_t portNum, uint32_t address, uint32_t *data, uint16_t RdnWr) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_MEMAP(portNum, address, data, RdnWr)); +} + +STATUS_T WINAPI MSP430_HIL_TCLK_V3(uint8_t value) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TCLK(value)); +} +STATUS_T WINAPI MSP430_EnableEnergyTrace(const EnergyTraceSetup* setup, const EnergyTraceCallbacks* callbacks, EnergyTraceHandle* handle) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EnableEnergyTrace(setup, callbacks, handle)); +} + +STATUS_T WINAPI MSP430_DisableEnergyTrace(const EnergyTraceHandle handle) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->DisableEnergyTrace(handle)); +} + +STATUS_T WINAPI MSP430_ResetEnergyTrace( const EnergyTraceHandle handle ) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->ResetEnergyTrace(handle)); +} + +STATUS_T WINAPI MSP430_GetInterface_Type(enum INTERFACE_TYPE* type) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->InterfaceType(type)); +} + +STATUS_T WINAPI MSP430_RegisterMessageCallback(MessageCallbackFn callback) +{ + return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->RegisterMessageCallback(callback)); +} + +static std::string getFETName(uint8_t *hwVersion) +{ + const uint8_t INFO_U1_HW[] = { 0x55, 0xFF, 40, 1 }; + const uint8_t INFO_EZ_FET_HW[] = { 0x45, 0xFF, 0, 4 }; + const uint8_t INFO_EZ_FET_HW_NO_FLOW_CTS[] = { 0x45, 0xFF, 0, 5 }; + const uint8_t INFO_EZ_FET_LITE_HW[] = { 0x45, 0xFF, 0, 3 }; + const uint8_t INFO_MSP_FET_HW[] = { 0x55, 0xFF, 0, 3 }; + const uint8_t INFO_EZ430[] = { 0x45, 0x46, 0x00, 0x02 }; + const uint8_t INFO_EZ430_1_5[] = { 0x45, 0xFF, 0x00, 0x02 }; + const uint8_t INFO_MSP_FET_HW2x[] = { 0x55, 0xFF, 0, 3 }; + const uint8_t INFO_EZ_FET_HW_V2[] = { 0x45, 0xFF, 0, 6 }; + + std::string nameFET; + + if (std::equal(hwVersion, hwVersion + 4, INFO_U1_HW)) + { + nameFET = "MSP-FET430UIF"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_EZ_FET_HW)) + { + nameFET = "eZ-FET"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_EZ_FET_HW_V2)) + { + nameFET = "eZ-FET V2"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_EZ_FET_HW_NO_FLOW_CTS)) + { + nameFET = "eZ-FET"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_EZ_FET_LITE_HW)) + { + nameFET = "eZ-FET Lite"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_MSP_FET_HW)) + { + nameFET = "MSP-FET"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_MSP_FET_HW2x)) + { + nameFET = "MSP-FET V2"; + } + else if (std::equal(hwVersion, hwVersion + 4, INFO_EZ430) || std::equal(hwVersion, hwVersion + 4, INFO_EZ430_1_5)) + { + nameFET = "eZ430"; + } + else + { + nameFET = "Unknown"; + } + + return nameFET; +} + +static std::string getLaunchpadName(const std::string& msp, const std::string& fet) +{ + static std::string launchpad; + static std::map, std::string> lutLaunchpads = + { + {std::make_pair("eZ-FET", "MSP430FR4133"), "MSP-EXP430FR4133"}, + {std::make_pair("eZ-FET", "MSP430FR5969"), "MSP-EXP430FR5969"}, + {std::make_pair("eZ-FET", "MSP430FR6989"), "MSP-EXP430FR6989"}, + {std::make_pair("eZ-FET Lite", "MSP430F5529"), "MSP-EXP430F5529LP"}, + {std::make_pair("eZ430", "MSP430G2xx3"), "MSP-EXP430G2"}, + {std::make_pair("eZ-FET V2", "MSP430G2xx3"), "MSP-EXP430G2ET"}, + {std::make_pair("eZ-FET", "MSP430FR2355"), "MSP-EXP430FR2355"}, + {std::make_pair("eZ-FET", "MSP430FR2433"), "MSP-EXP430FR2433"}, + {std::make_pair("eZ-FET", "MSP430FR2311"), "MSP-EXP430FR2311"}, + {std::make_pair("eZ-FET", "MSP430FR5994"), "MSP-EXP430FR5994"}, + {std::make_pair("eZ-FET V2", "MSP430FR2476"), "LP-MSP430FR2476"}, + {std::make_pair("eZ-FET Lite", "MSP430FR6047"), "EVM430-FR6047"} + }; + + if (lutLaunchpads.find(std::make_pair(fet, msp)) != lutLaunchpads.end()) + { + launchpad = lutLaunchpads[std::make_pair(fet, msp)]; + } + + return launchpad; +} + +STATUS_T WINAPI MSP430_Autodetect(struct DETECTIONLIST *list, uint32_t *numElements, uint32_t sizeOfStruct) +{ int32_t numFETs = 0; + uint32_t nElements = *numElements; + + memset(list, 0x00, nElements * sizeOfStruct); + + if (MSP430_GetNumberOfUsbIfs(&numFETs) == STATUS_ERROR) + { + return toStatus(false); + } + + uint32_t i = 0; + for (uint32_t idx = 0; idx < static_cast(numFETs) && i < nElements; ++idx) + { + char *name = nullptr; + int32_t status = 0; + int32_t version = 0; + uint8_t *hwVersion = 0; + int32_t cnt = 0; + + if (MSP430_GetNameOfUsbIf(idx, &name, &status) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + + if (status == ENABLE) + { + /* FET already in use */ + continue; + } + + if (MSP430_Initialize(name, &version) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + + if (MSP430_FET_GetHwVersion(&hwVersion, &cnt) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + + if (version <= 0) + { + // update FET FW + if (MSP430_FET_FwUpdate(NULL, NULL, 0) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + } + + // check for external power source + int32_t volt, state; + if (MSP430_GetExtVoltage(&volt, &state) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + + if (state != EX_POWER_OK) + { + if (state == NO_EX_POWER) + { + if (MSP430_VCC(3300) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + } + else + { + // Error: no power + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + } + + MSP430_SetTargetArchitecture(MSP430); + + if (MSP430_OpenDevice("UNKNOWN", "", 0, 0, DEVICE_UNKNOWN) == STATUS_ERROR) + { + /* try MSP432 */ + if (MSP430_SetTargetArchitecture(MSP432_M4) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + if (MSP430_OpenDevice("UNKNOWN", "", 0, 0, DEVICE_UNKNOWN) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + } + + DEVICE_T device; + if (MSP430_GetFoundDevice((uint8_t*)&device, sizeof(device)) == STATUS_ERROR) + { + list[i].errorCode = MSP430_Error_Number(); + ++i; + continue; + } + + uint32_t size; + + size = (sizeof(device.string) > sizeof(list[i].nameDevice)) ? sizeof(list[i].nameDevice) : sizeof(device.string); + std::copy(device.string, device.string + size, list[i].nameDevice); + + std::string FETName = getFETName(hwVersion); + size = (FETName.size() > sizeof(list[i].nameFET)) ? sizeof(list[i].nameFET) : FETName.size(); + std::copy(FETName.c_str(), FETName.c_str() + size, list[i].nameFET); + + std::string launchpad = getLaunchpadName(std::string(list[i].nameDevice), FETName); + if (!launchpad.empty()) + { + size = (launchpad.size() > sizeof(list[i].nameLaunchpad)) ? sizeof(list[i].nameLaunchpad) : launchpad.size(); + std::copy(launchpad.c_str(), launchpad.c_str() + size, list[i].nameLaunchpad); + + } + + MSP430_Close(1); + ++i; + } + + *numElements = i; + + return toStatus(true); +} + +STATUS_T WINAPI MSP430_GetFETName(char *str, uint32_t size) +{ + uint8_t *hwVersion = 0; + int32_t cnt = 0; + + if (MSP430_FET_GetHwVersion(&hwVersion, &cnt) == STATUS_ERROR) + { + return toStatus(false); + } + + std::string fet = getFETName(hwVersion); + + uint32_t len = (size > fet.length()) ? fet.length() : size; + + std::copy(fet.c_str(), fet.c_str() + len, str); + return toStatus(true); +} + +STATUS_T WINAPI MSP430_GetLaunchpadName(const char *device, const char *fetname, char *launchpadname, uint32_t size) +{ + + std::string launchpad = getLaunchpadName(std::string(device), std::string(fetname)); + + if (launchpad.empty()) + { + return toStatus(true); + } + + uint32_t len = (size > launchpad.length()) ? launchpad.length() : size; + std::copy(launchpad.c_str(), launchpad.c_str() + len, launchpadname); + return toStatus(true); +} \ No newline at end of file diff --git a/DLL430_v3/src/DLL430v3_OS_dllmain.cpp b/DLL430_v3/src/DLL430_dllmain.cpp similarity index 73% rename from DLL430_v3/src/DLL430v3_OS_dllmain.cpp rename to DLL430_v3/src/DLL430_dllmain.cpp index b7118d4..8a2c464 100644 --- a/DLL430_v3/src/DLL430v3_OS_dllmain.cpp +++ b/DLL430_v3/src/DLL430_dllmain.cpp @@ -3,49 +3,47 @@ * * C-port to load dll. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #if defined(_WIN32) || defined(_WIN64) #include extern bool oldapi_INIT(); extern void oldapi_EXIT(); -BOOL WINAPI DllMain( - HINSTANCE hinstDLL, - DWORD fdwReason, - LPVOID lpvReserved -) +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: @@ -56,14 +54,17 @@ BOOL WINAPI DllMain( /* no break */ case DLL_THREAD_ATTACH: - break; + break; case DLL_PROCESS_DETACH: - oldapi_EXIT(); + if (!lpvReserved) + { + oldapi_EXIT(); + } /* no break */ case DLL_THREAD_DETACH: - break; + break; } return TRUE; } diff --git a/DLL430_v3/src/DLL430v3_OS_capi.cpp b/DLL430_v3/src/DLL430v3_OS_capi.cpp deleted file mode 100644 index bf7ea13..0000000 --- a/DLL430_v3/src/DLL430v3_OS_capi.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/* - * DLL430v3_OS_capi.cpp - * - * C API implementation for open source edition. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "DLL430_OldApiV3.h" -#include - -DLL430_OldApi* DLL430_CurrentInstance = 0; -#if defined(_WIN32) || defined (_WIN64) -#define ENTRY_FUNCTION bool -#define EXIT_FUNCTION void -#elif defined (UNIX) -#define ENTRY_FUNCTION bool __attribute__ ((constructor)) -#define EXIT_FUNCTION void __attribute__ ((destructor)) -#endif - -ENTRY_FUNCTION oldapi_INIT() -{ - DLL430_CurrentInstance = 0; - return true; -} - -EXIT_FUNCTION oldapi_EXIT() -{ - if (DLL430_CurrentInstance != 0) - delete DLL430_CurrentInstance; -} - -static STATUS_T toStatus (bool b) -{ - return (b? STATUS_OK: STATUS_ERROR); -} - -static void createInstance () -{ - if (DLL430_CurrentInstance == 0) - DLL430_CurrentInstance = new DLL430_OldApiV3; -} - -STATUS_T WINAPI MSP430_GetNumberOfUsbIfs(long* Number) -{ - createInstance(); - long count; - - if (!DLL430_CurrentInstance->GetNumberOfUsbIfs(&count)) - return toStatus(false); - - if(Number) - { - *Number = count; - } - return toStatus(true); -} - -STATUS_T WINAPI MSP430_GetNameOfUsbIf(long Idx, char** Name, long* Status) -{ - createInstance(); - - return toStatus(DLL430_CurrentInstance->GetNameOfUsbIf(Idx, Name, Status)); -} - -STATUS_T WINAPI MSP430_Initialize(char* port, long* version) -{ - createInstance(); - - if((version==NULL)||(port==NULL)) - return toStatus(false); - - return toStatus(DLL430_CurrentInstance->Initialize(port, version)); -} - -STATUS_T WINAPI MSP430_SET_SYSTEM_NOTIFY_CALLBACK(SYSTEM_NOTIFY_CALLBACK parSystemNotifyCallback) -{ - if(!DLL430_CurrentInstance) - return STATUS_OK; - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->SetSystemNotfyCallback(parSystemNotifyCallback)); -} - -STATUS_T WINAPI MSP430_OpenDevice(CHAR* Device, CHAR* Password, LONG PwLength, LONG DeviceCode, LONG setId) -{ - if(!DLL430_CurrentInstance) - return STATUS_OK; - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->OpenDevice(Device,Password,PwLength,DeviceCode,setId)); -} - -STATUS_T WINAPI MSP430_GetFoundDevice(CHAR* FoundDevice, LONG count) -{ - if(!DLL430_CurrentInstance) - return STATUS_OK; - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->GetFoundDevice(FoundDevice,count)); -} - -STATUS_T WINAPI MSP430_Close(long vccOff) -{ - if(!DLL430_CurrentInstance) - return STATUS_OK; - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Close(vccOff)); -} - -STATUS_T WINAPI MSP430_Configure(long mode, long value) -{ - enum CONFIG_MODE m = (enum CONFIG_MODE)mode; - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Configure(m, value)); -} - -long WINAPI MSP430_Error_Number(void) -{ - if (!DLL430_CurrentInstance) - return 0; - return DLL430_CurrentInstance->Error_Number(); -} - -const char* WINAPI MSP430_Error_String(long errorNumber) -{ - if (!DLL430_CurrentInstance) - return 0; - return DLL430_CurrentInstance->Error_String(errorNumber); -} - -STATUS_T WINAPI MSP430_GetJtagID(long* JtagId) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->GetJtagID(JtagId)); -} - -STATUS_T WINAPI MSP430_Device(long localDeviceId, char* buffer, long count) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Device(localDeviceId, buffer, count)); -} - -STATUS_T WINAPI MSP430_VCC(long voltage) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->VCC(voltage)); -} - -STATUS_T WINAPI MSP430_GetCurVCCT(long* voltage) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->GetCurVCCT(voltage)); -} - -STATUS_T WINAPI MSP430_GetExtVoltage(long* voltage, long* state) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->GetExtVoltage(voltage, state)); -} - -STATUS_T WINAPI MSP430_Erase(long type, long address, long length) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Erase(type, address, length)); -} - -STATUS_T WINAPI MSP430_Memory(long address, char* buffer, long count, long rw) -{ - uint8_t* buf = reinterpret_cast(buffer); - - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Memory(address, buf, count, rw)); -} - -STATUS_T WINAPI MSP430_Secure(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Secure()); -} - -STATUS_T WINAPI MSP430_ReadOutFile(long wStart, long wLength, char* lpszFileName, long iFileType) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->ReadOutFile(wStart, wLength, lpszFileName, iFileType)); -} - -STATUS_T WINAPI MSP430_ProgramFile(char* File, long eraseType, long verifyMem) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->ProgramFile(File, eraseType, verifyMem)); -} - -STATUS_T WINAPI MSP430_VerifyFile(char* File) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->VerifyFile(File)); -} - -STATUS_T WINAPI MSP430_VerifyMem(long StartAddr, long Length, char* DataArray) -{ - uint8_t* data = reinterpret_cast(DataArray); - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->VerifyMem(StartAddr, Length, data)); -} - -STATUS_T WINAPI MSP430_EraseCheck(long StartAddr, long Length) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EraseCheck(StartAddr, Length)); -} - -STATUS_T WINAPI MSP430_Reset(long method, long execute, long releaseJTAG) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Reset(method, execute, releaseJTAG)); -} - -STATUS_T WINAPI MSP430_ExtRegisters(long address, char * buffer, long count, long rw) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->ExtRegisters(address,(uint8_t*)buffer,count,rw)); -} - -STATUS_T WINAPI MSP430_Registers(long* registers, long mask, long rw) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Registers(registers, mask, rw)); -} - -STATUS_T WINAPI MSP430_Register(long* reg, long regNb, long rw) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Register(reg, regNb, rw)); -} - -STATUS_T WINAPI MSP430_Run(long mode, long releaseJTAG) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->Run(mode, releaseJTAG)); -} - -STATUS_T WINAPI MSP430_State(long* state, long stop, long* pCPUCycles) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->State(state, stop, pCPUCycles)); -} - -STATUS_T WINAPI MSP430_CcGetClockNames(long localDeviceId, EemGclkCtrl_t** CcClockNames) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->CcGetClockNames(localDeviceId, CcClockNames)); -} - -STATUS_T WINAPI MSP430_CcGetModuleNames(long localDeviceId, EemMclkCtrl_t** CcModuleNames) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->CcGetModuleNames(localDeviceId, CcModuleNames)); -} - -STATUS_T WINAPI MSP430_EEM_Init( - MSP430_EVENTNOTIFY_FUNC callback, - long clientHandle, - MessageID_t* pMsgIdBuffer -) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_Init(callback, clientHandle, pMsgIdBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_SetBreakpoint(uint16_t* pwBpHandle, BpParameter_t* pBpBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetBreakpoint(pwBpHandle, pBpBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_GetBreakpoint(uint16_t wBpHandle, BpParameter_t* pBpDestBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetBreakpoint(wBpHandle, pBpDestBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_SetCombineBreakpoint( - CbControl_t CbControl, - uint16_t wCount, - uint16_t* pwCbHandle, - uint16_t* pawBpHandle -) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetCombineBreakpoint(CbControl, wCount, pwCbHandle, pawBpHandle)); -} - -STATUS_T WINAPI MSP430_EEM_GetCombineBreakpoint( - uint16_t wCbHandle, - uint16_t* pwCount, - uint16_t* pawBpHandle -) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetCombineBreakpoint(wCbHandle, pwCount, pawBpHandle)); -} - -STATUS_T WINAPI MSP430_EEM_SetTrace(TrParameter_t* pTrBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetTrace(pTrBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_GetTrace(TrParameter_t* pTrDestBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetTrace(pTrDestBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_ReadTraceBuffer(TraceBuffer_t* pTraceBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_ReadTraceBuffer(pTraceBuffer)); -} - -DLL430_SYMBOL STATUS_T WINAPI MSP430_EEM_ReadTraceData(TraceBuffer_t* pTraceBuffer, ULONG* pulCount) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_ReadTraceData(pTraceBuffer, pulCount)); -} - -STATUS_T WINAPI MSP430_EEM_RefreshTraceBuffer(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_RefreshTraceBuffer()); -} - -STATUS_T WINAPI MSP430_EEM_SetVariableWatch(VwEnable_t VwEnable) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetVariableWatch(VwEnable)); -} - -STATUS_T WINAPI MSP430_EEM_SetVariable(uint16_t* pVwHandle, VwParameter_t* pVwBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetVariable(pVwHandle, pVwBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_GetVariableWatch(VwEnable_t* pVwEnable, VwResources_t* paVwDestBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetVariableWatch(pVwEnable, paVwDestBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_SetClockControl(CcParameter_t* pCcBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetClockControl(pCcBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_GetClockControl(CcParameter_t* pCcDestBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetClockControl(pCcDestBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_SetSequencer(SeqParameter_t* pSeqBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_SetSequencer(pSeqBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_GetSequencer(SeqParameter_t* pSeqDestBuffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_GetSequencer(pSeqDestBuffer)); -} - -STATUS_T WINAPI MSP430_EEM_ReadSequencerState(SeqState_t* pSeqState) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->EEM_ReadSequencerState(pSeqState)); -} - -STATUS_T WINAPI MSP430_FET_SelfTest(long count, uint8_t* buffer) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_SelfTest(count, buffer)); -} - -STATUS_T WINAPI MSP430_FET_SetSignals(long SigMask, long SigState) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_SetSignals(SigMask, SigState)); -} - -STATUS_T WINAPI MSP430_FET_Reset(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_Reset()); -} - -STATUS_T WINAPI MSP430_FET_I2C(long address, char* buffer, long count, long rw) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_I2C(address, reinterpret_cast(buffer), count, rw)); -} - -STATUS_T WINAPI MSP430_FET_EnterBootloader(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_EnterBootloader()); -} - -STATUS_T WINAPI MSP430_FET_ExitBootloader(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_ExitBootloader()); -} - -STATUS_T WINAPI MSP430_FET_GetFwVersion(long* version) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_GetFwVersion(version)); -} - -STATUS_T WINAPI MSP430_FET_GetHwVersion(uint8_t** version, long* count) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_GetHwVersion(version, count)); -} - -STATUS_T WINAPI MSP430_FET_FwUpdate( - char* lpszFileName, - DLL430_FET_NOTIFY_FUNC callback, - long clientHandle -) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->FET_FwUpdate(lpszFileName, callback, clientHandle)); -} - -void WINAPI MSP430_HIL_ResetJtagTap(void) -{ - if (DLL430_CurrentInstance) - DLL430_CurrentInstance->HIL_ResetJtagTap(); -} - -STATUS_T WINAPI MSP430_HIL_Open(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Open()); -} - -STATUS_T WINAPI MSP430_HIL_Connect(void) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Connect()); -} - -STATUS_T WINAPI MSP430_HIL_Close(LONG vccOff) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_Close(vccOff)); -} - -LONG WINAPI MSP430_HIL_JTAG_IR(LONG instruction) -{ - uint64_t retValue = (uint64_t)-1; - if (DLL430_CurrentInstance) - retValue = DLL430_CurrentInstance->HIL_JTAG_IR(instruction); - - return (LONG)retValue; -} - -LONG WINAPI MSP430_HIL_JTAG_DR(LONG data, LONG bits) -{ - uint64_t retValue = (uint64_t)-1; - if (DLL430_CurrentInstance) - retValue = DLL430_CurrentInstance->HIL_JTAG_DR(data, bits); - - return (LONG)retValue; -} - -LONGLONG WINAPI MSP430_HIL_JTAG_DRX(LONGLONG data, LONG bits) -{ - uint64_t retValue = (uint64_t)-1; - if (DLL430_CurrentInstance) - retValue = DLL430_CurrentInstance->HIL_JTAG_DR(data, bits); - - return (LONGLONG)retValue; -} - -STATUS_T WINAPI MSP430_HIL_TCK(LONG state) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TCK(state)); -} - -STATUS_T WINAPI MSP430_HIL_TMS(LONG state) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TMS(state)); -} - -STATUS_T WINAPI MSP430_HIL_TDI(LONG state) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TDI(state)); -} - -STATUS_T WINAPI MSP430_HIL_RST(LONG state) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_RST(state)); -} - -STATUS_T WINAPI MSP430_HIL_TST(LONG state) -{ - return toStatus(DLL430_CurrentInstance && DLL430_CurrentInstance->HIL_TST(state)); -} diff --git a/DLL430_v3/src/TI/DLL430/ArmCpuMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/ArmCpuMemoryAccess.cpp new file mode 100644 index 0000000..7f8c3ed --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmCpuMemoryAccess.cpp @@ -0,0 +1,201 @@ +/* + * ArmCpuMemoryAccess.cpp + * + * Implementaion for access of CPU registers. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "ArmCpuMemoryAccess.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "IDeviceHandle.h" + +using namespace TI::DLL430; + +ArmCpuMemoryAccess::ArmCpuMemoryAccess (MemoryArea::Name name, IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + uint8_t bits) + : size(size) + , localCache(size, 0) + , devHandle(devHandle) +{ +} + +size_t ArmCpuMemoryAccess::getSize() const +{ + return size; +} + + +void ArmCpuMemoryAccess::pushCache() +{ + this->backupCache = this->localCache; +} +void ArmCpuMemoryAccess::popCache() +{ + this->localCache = this->backupCache; + flushCache(); + fillCache(0, 18); +} + +bool ArmCpuMemoryAccess::switchContext(uint32_t pc, uint32_t sp) +{ + if (!write(REGISTER_SP, sp)) + { + return false; + } + if (!write(REGISTER_PC, pc)) + { + return false; + } + if (!write(REGISTER_XPSR, 0x01000000)) + { + return false; + } + if (!write(REGISTER_LR, 0xffffffff)) + { + return false; + } + return true; +} + +bool ArmCpuMemoryAccess::disableInterrupts() +{ + uint32_t specialRegister = 0x00; + if (!read(REGISTER_SPECIAL, &specialRegister, 1)) + { + return false; + } + if (!write(REGISTER_SPECIAL, specialRegister | (1<<0) | (1<<16))) + { + return false; + } + return true; +} + +bool ArmCpuMemoryAccess::read(uint32_t Register, uint32_t* buffer, size_t count) +{ + if (Register + count > localCache.size()) + { + return false; + } + if (buffer) + { + for (size_t i = 0; i < count; ++i) + { + buffer[i] = this->localCache[Register++]; + } + } + return true; +} + +bool ArmCpuMemoryAccess::write(uint32_t Register, const uint32_t* buffer, size_t count) +{ + if (Register + count > localCache.size()) + { + return false; + } + while (count--) + { + this->localCache[Register++] = *(buffer++); + } + return true; +} + +bool ArmCpuMemoryAccess::write(uint32_t Register, uint32_t value) +{ + if (Register > localCache.size()) + return false; + + this->localCache[Register] = value; + return true; +} + +bool ArmCpuMemoryAccess::fillCache(uint32_t Register, size_t count) +{ + if ((Register + count) > localCache.size()) + { + return false; + } + + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ReadAllCpuRegs)); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + if (!this->devHandle->send(cmd)) + { + return false; + } + + for (uint8_t i = 0; i < this->localCache.size(); ++i) + { + localCache[i] = cmd.elements[0]->getOutputAt32(i * 4); + } + return true; +} + +bool ArmCpuMemoryAccess::flushCache() +{ + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteAllCpuRegs)); + + for (size_t i = 0; i < this->localCache.size(); i++) + { + el->appendInputData32(localCache[i]); + } + + cmd.elements.emplace_back(el); + + if (!this->devHandle->send(cmd)) + { + return false; + } + return true; +} + +void ArmCpuMemoryAccess::clearCache(uint32_t Register, size_t count) +{ + if (Register + count > localCache.size()) + { + return; + } + + std::fill(localCache.begin(), localCache.begin() + count, 0); +} diff --git a/DLL430_v3/src/TI/DLL430/ArmCpuMemoryAccess.h b/DLL430_v3/src/TI/DLL430/ArmCpuMemoryAccess.h new file mode 100644 index 0000000..40b59c0 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmCpuMemoryAccess.h @@ -0,0 +1,88 @@ +/* + * ArmCpuMemoryAccess.h + * + * Implementaion for access of CPU registers. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "CpuRegisters.h" +#include "DeviceInfo.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class ArmCpuMemoryAccess : public CpuRegisters + { + public: + ArmCpuMemoryAccess (MemoryArea::Name name, IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + uint8_t bits); + + bool read (uint32_t Register, uint32_t* buffer, size_t count) OVERRIDE; + bool write (uint32_t Register, const uint32_t* buffer, size_t count) OVERRIDE; + bool write (uint32_t Register, uint32_t value) OVERRIDE; + size_t getSize() const OVERRIDE; + + bool flushCache() OVERRIDE; + bool fillCache(uint32_t Register, size_t count) OVERRIDE; + void clearCache(uint32_t Register, size_t count) OVERRIDE; + + void pushCache() OVERRIDE; + void popCache() OVERRIDE; + bool switchContext(uint32_t pc, uint32_t sp) OVERRIDE; + bool disableInterrupts() OVERRIDE; + + private: + virtual bool postSync(const HalExecCommand&) { return true; } + + size_t size; + std::vector localCache; + std::vector backupCache; + IDeviceHandle* devHandle; + static const uint32_t REGISTER_SP = 0x0d; + static const uint32_t REGISTER_LR = 0x0e; + static const uint32_t REGISTER_PC = 0x0f; + static const uint32_t REGISTER_XPSR = 0x10; + static const uint32_t REGISTER_SPECIAL = 0x11; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/ArmFlashMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/ArmFlashMemoryAccess.cpp new file mode 100644 index 0000000..bfc2e43 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmFlashMemoryAccess.cpp @@ -0,0 +1,409 @@ +/* + * ArmFlashMemoryAccess.cpp + * + * Memory class for accessing flash memory. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "ArmFlashMemoryAccess.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "FetHandle.h" +#include "ClockCalibration.h" +#include "MSP432_FlashLib.h" +#include "CpuRegisters.h" +#include "warnings/Warnings.h" + + +using namespace TI::DLL430; +using std::vector; +using std::bind; +using std::shared_ptr; + +ArmFlashMemoryAccess::ArmFlashMemoryAccess ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection *writeProt +) + : ArmRandomMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa), + mSegmentSize(seg), + mWriteProt(writeProt) +{ +} + +ArmFlashMemoryAccess::~ArmFlashMemoryAccess() +{ +} + + +bool ArmFlashMemoryAccess::flashExit() +{ + CpuRegisters* cpu = mm->getCpuRegisters(); + IDebugManager *dbm = devHandle->getDebugManager(); + if (!cpu || !dbm) + { + return false; + } + mm->write(MSP432_FlashLib::FLASH_FUNCTION_ADDRESS, MSP432_FlashLib::FLASH_EXIT); + mm->sync(); + + uint32_t status = 0; + do + { + uint8_t tmp[4] = { 0 }; + mm->read(MSP432_FlashLib::RETURN_CODE_ADDRESS, tmp, sizeof(status)) && mm->sync(); + status = tmp[0] | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); + } while (status == MSP432_FlashLib::FLASH_BUSY); + + // halt CPU + if (!dbm->stop()) + { + return false; + } + + restoreRam(); + cpu->popCache(); + + if (dbm->getLpmDebugging()) + { + devHandle->getFetHandle()->getConfigManager()->setUlpDebug(true); + } + + return (status == MSP432_FlashLib::FLASH_SUCCESS); +} + +bool ArmFlashMemoryAccess::wakeup() +{ + uint32_t pcmCtlData = 0; + uint8_t tmpPcm[4] = { 0 }; + uint8_t timeout = 6; + + mm->read(MSP432_FlashLib::PCM_CTL, tmpPcm, sizeof(pcmCtlData)); + mm->sync(); + pcmCtlData = tmpPcm[0] | (tmpPcm[1] << 8) | (tmpPcm[2] << 16) | (tmpPcm[3] << 24); + + pcmCtlData = MSP432_FlashLib::PCM_CTL0_KEY | ((pcmCtlData & 0xFFFF) & ~(MSP432_FlashLib::PCM_CTL1_LOCKLPM5 + MSP432_FlashLib::PCM_CTL1_LOCKBKUP)); + + mm->write(MSP432_FlashLib::PCM_CTL, pcmCtlData); + mm->sync(); + + uint32_t sramEn = 0; + uint8_t sramEnTmp[4] = { 0 }; + + do + { + mm->read(MSP432_FlashLib::SYS_SRAM_BANKEN, sramEnTmp, sizeof(sramEn)); + mm->sync(); + sramEn = sramEnTmp[0] | (sramEnTmp[1] << 8) | (sramEnTmp[2] << 16) | (sramEnTmp[3] << 24); + } while (!(sramEn & MSP432_FlashLib::SRAM_RDY) && --timeout); + + if (!timeout) + { + return false; + } + + if (!(sramEn & MSP432_FlashLib::SRAM_EN)) + { + mm->write(MSP432_FlashLib::SYS_SRAM_BANKEN, MSP432_FlashLib::SRAM_EN); + mm->sync(); + } + return true; +} + +bool ArmFlashMemoryAccess::isProtectionEnabled() +{ + return mWriteProt->isEnabled(); +} + +bool ArmFlashMemoryAccess::flashInit() +{ + CpuRegisters* cpu = mm->getCpuRegisters(); + IDebugManager *dbm = devHandle->getDebugManager(); + if (!cpu || !dbm) + { + return false; + } + + cpu->pushCache(); + cpu->disableInterrupts(); + + devHandle->getFetHandle()->getConfigManager()->setUlpDebug(false); + + cpu->switchContext(MSP432_FlashLib::RAM_LOADER_MAIN, MSP432_FlashLib::RAM_LOADER_STACK); + /* making PREMASK effective requires a single step */ + if (!dbm->singleStep()) + { + return false; + } + + mm->write(MSP432_FlashLib::FLASH_FUNCTION_ADDRESS, MSP432_FlashLib::FLASH_INIT); + cpu->switchContext(MSP432_FlashLib::RAM_LOADER_MAIN, MSP432_FlashLib::RAM_LOADER_STACK); + mm->sync(); + + if (!dbm->run(0)) + { + return false; + } + + uint32_t status = 0; + do + { + uint8_t tmp[4] = { 0 }; + mm->read(MSP432_FlashLib::RETURN_CODE_ADDRESS, tmp, sizeof(status)) && mm->sync(); + status = tmp[0] | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); + } while (status == MSP432_FlashLib::FLASH_BUSY); + + // clear RETURN_CODE_ADDRESS value + mm->write(MSP432_FlashLib::RETURN_CODE_ADDRESS, 0x0000); + mm->sync(); + + return (status == MSP432_FlashLib::FLASH_SUCCESS); +} + + +bool ArmFlashMemoryAccess::flashErase(uint32_t start, uint32_t end, bool unlockBsl, uint32_t mode) +{ + CpuRegisters* cpu = mm->getCpuRegisters(); + IDebugManager *dbm = devHandle->getDebugManager(); + if (!cpu || !dbm) + { + return false; + } + if (!mm->checkMinFlashVoltage()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_WARNING, WarningCode::WARNING_FLASH_VCC); + return false; + } + // halt CPU + if (!dbm->stop()) + { + return false; + } + if (!wakeup()) + { + return false; + } + + if (!uploadFunclet()) + { + return false; + } + if (!flashInit()) + { + return false; + } + if (unlockBsl) + { + mm->write(MSP432_FlashLib::UNLOCK_BSL_ADDRESS, MSP432_FlashLib::UNLOCK_BSL_KEY); + } + + uint32_t status = 0; + + if (mode == MSP432_FlashLib::FLASH_MASS_ERASE) + { + mm->write(MSP432_FlashLib::ERASE_PARAM_ADDRESS, MSP432_FlashLib::FLASH_MASS_ERASE); + mm->write(MSP432_FlashLib::FLASH_FUNCTION_ADDRESS, MSP432_FlashLib::FLASH_MASS_ERASE); + mm->sync(); + + status = 0; + do + { + uint8_t tmp[4] = { 0 }; + mm->read(MSP432_FlashLib::RETURN_CODE_ADDRESS, tmp, sizeof(status)) && mm->sync(); + status = tmp[0] | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); + } while (status == MSP432_FlashLib::FLASH_BUSY); + + } + if (mode == MSP432_FlashLib::FLASH_SECTOR_ERASE) + { + for (uint32_t sectorStartAddr = (start & 0xFFFFF000); sectorStartAddr <= end; ) + { + mm->write(MSP432_FlashLib::DST_ADDRESS, sectorStartAddr); + mm->write(MSP432_FlashLib::FLASH_FUNCTION_ADDRESS, MSP432_FlashLib::FLASH_SECTOR_ERASE); + mm->sync(); + + status = 0; + do + { + uint8_t tmp[4] = { 0 }; + mm->read(MSP432_FlashLib::RETURN_CODE_ADDRESS, tmp, sizeof(status)) && mm->sync(); + status = tmp[0] | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); + } while (status == MSP432_FlashLib::FLASH_BUSY); + + sectorStartAddr += getSegmentSize(); + } + } + + if (!flashExit()) + { + return false; + } + return (status == MSP432_FlashLib::FLASH_SUCCESS); +} + +bool ArmFlashMemoryAccess::flashWrite(uint32_t address, const uint8_t* buffer, size_t count, bool unlockBsl) +{ + CpuRegisters* cpu = mm->getCpuRegisters(); + IDebugManager *dbm = devHandle->getDebugManager(); + + address += this->getStart(); + + if (!cpu || !dbm) + { + return false; + } + if (!mm->checkMinFlashVoltage()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_WARNING, WarningCode::WARNING_FLASH_VCC); + return false; + } + + if (!dbm->stop()) + { + return false; + } + + if (!wakeup()) + { + return false; + } + + if (!uploadFunclet()) + { + return false; + } + + if (!flashInit()) + { + return false; + } + + volatile uint32_t bytesToWrite = static_cast(count); + volatile uint32_t bytesIndex = 0; + volatile uint32_t status = MSP432_FlashLib::FLASH_SUCCESS; + volatile uint32_t bCtlRegister1 = 0, bCtlRegister2 = 0; + + if (unlockBsl) + { + mm->write(MSP432_FlashLib::UNLOCK_BSL_ADDRESS, MSP432_FlashLib::UNLOCK_BSL_KEY); + } + uint8_t tmp[4] = { 0 }; + uint8_t tmp1[4] = { 0 }; + + mm->write(MSP432_FlashLib::DST_ADDRESS, address); + mm->write(MSP432_FlashLib::SRC_LENGTH_ADDRESS, bytesToWrite); + mm->write(MSP432_FlashLib::FLASH_FUNCTION_ADDRESS, MSP432_FlashLib::FLASH_CONTIOUS_PROGRAM); + + while ((status == MSP432_FlashLib::FLASH_SUCCESS) && (bytesIndex < static_cast(count))) + { + mm->read(MSP432_FlashLib::BUFFER1_STATUS_REGISTER, tmp, sizeof(bCtlRegister1)); + mm->read(MSP432_FlashLib::BUFFER2_STATUS_REGISTER, tmp1, sizeof(bCtlRegister2)) && mm->sync(); + + bCtlRegister1 = tmp[0] | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); + bCtlRegister2 = tmp1[0] | (tmp1[1] << 8) | (tmp1[2] << 16) | (tmp1[3] << 24); + + if (!(bCtlRegister1 & MSP432_FlashLib::BUFFER_ACTIVE) && (bytesIndex < static_cast(count))) + { + //Use Buffer 1 + // Do not copy more than SRC_LENGTH_MAX bytes to RAM loader buffer + if (static_cast(count) - bytesIndex > MSP432_FlashLib::SRC_LENGTH_MAX) + { + bytesToWrite = MSP432_FlashLib::SRC_LENGTH_MAX; + } + else + { + bytesToWrite = static_cast(count) - bytesIndex; + } + + mm->write(MSP432_FlashLib::RAM_LOADER_BUFFER1, buffer + bytesIndex, bytesToWrite); + mm->write(MSP432_FlashLib::BUFFER1_STATUS_REGISTER, MSP432_FlashLib::BUFFER_DATA_READY); + mm->sync(); + + bytesIndex += bytesToWrite; + } + + if (!(bCtlRegister2 & MSP432_FlashLib::BUFFER_ACTIVE) && (bytesIndex < static_cast(count))) + { + //Use Buffer 2 + + // Do not copy more than SRC_LENGTH_MAX bytes to RAM loader buffer + if (static_cast(count) - bytesIndex > MSP432_FlashLib::SRC_LENGTH_MAX) + { + bytesToWrite = MSP432_FlashLib::SRC_LENGTH_MAX; + } + else + { + bytesToWrite = static_cast(count) - bytesIndex; + } + + mm->write(MSP432_FlashLib::RAM_LOADER_BUFFER2, buffer + bytesIndex, bytesToWrite); + mm->write(MSP432_FlashLib::BUFFER2_STATUS_REGISTER, MSP432_FlashLib::BUFFER_DATA_READY); + mm->sync(); + + bytesIndex += bytesToWrite; + } + } + if (!flashExit()) + { + return false; + } + if (status == MSP432_FlashLib::FLASH_SUCCESS) + { + return true; + } + return false; +} + +bool ArmFlashMemoryAccess::erase() +{ + return flashErase(0, 0, false, MSP432_FlashLib::FLASH_MASS_ERASE); +} + +bool ArmFlashMemoryAccess::erase(uint32_t start, uint32_t end, bool forceUnlock) +{ + return flashErase(start, end, false, MSP432_FlashLib::FLASH_SECTOR_ERASE); +} + +bool ArmFlashMemoryAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + return flashWrite(address, buffer, count, false); +} diff --git a/DLL430_v3/src/TI/DLL430/ArmFlashMemoryAccess.h b/DLL430_v3/src/TI/DLL430/ArmFlashMemoryAccess.h new file mode 100644 index 0000000..2daf595 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmFlashMemoryAccess.h @@ -0,0 +1,84 @@ +/* + * ArmFlashMemoryAccess.h + * + * Memory class for accessing RAM on ARM Cortex devices. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "ArmRandomMemoryAccess.h" +#include "WriteProtection.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class ArmCpuMemoryAccess; + class ArmFlashMemoryAccess : public ArmRandomMemoryAccess + { + public: + ArmFlashMemoryAccess ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection* writeProt); + virtual ~ArmFlashMemoryAccess (); + + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; + virtual bool erase() OVERRIDE; + virtual bool wakeup() OVERRIDE; + virtual bool isProtectionEnabled() OVERRIDE; + + protected: + bool flashInit(); + bool flashExit(); + bool flashWrite(uint32_t address, const uint8_t* buffer, size_t count, bool unlockBsl); + bool flashErase(uint32_t start, uint32_t end, bool unlockBsl, uint32_t mode); + + private: + uint32_t mSegmentSize; + std::unique_ptr mWriteProt; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/ArmRandomMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/ArmRandomMemoryAccess.cpp new file mode 100644 index 0000000..ef258fb --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmRandomMemoryAccess.cpp @@ -0,0 +1,233 @@ +/* + * ArmRandomMemoryAccess.cpp + * + * Memory class for accessing RAM. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "ArmRandomMemoryAccess.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "MSP432_FlashLib.h" + +namespace MSP432_DataWidth +{ + static const uint8_t DATA_WITH_8 = 0x0; + static const uint8_t DATA_WITH_16 = 0x1; + static const uint8_t DATA_WITH_32 = 0x2; + + static const uint8_t AP_READ = 0x1; + static const uint8_t AP_WRITE = 0x0; +} + +using namespace TI::DLL430; + +ArmRandomMemoryAccess::ArmRandomMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa) + : MemoryAreaBase(name, devHandle, start, size, seg, banks, mapped, isProtected, psa), mm(mm) +{ +} + +ArmRandomMemoryAccess::~ArmRandomMemoryAccess() +{ +} + +bool ArmRandomMemoryAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + HalExecElement *el; + if (this->devHandle->getInterfaceMode() == SWD_MSP432) + { + el = new HalExecElement(ID_MemApTransactionArmSwd); + } + else + { + el = new HalExecElement(ID_MemApTransactionArm); + } + + + el->appendInputData16(0); // APSEL + el->appendInputData16(MSP432_DataWidth::AP_WRITE); + + if ((address & 0x1) || ((address + count) & 01)) + { + el->appendInputData16(MSP432_DataWidth::DATA_WITH_8); + } + else if ((address & 0x2) || ((address + count) & 02)) + { + el->appendInputData16(MSP432_DataWidth::DATA_WITH_16); + } + else + { + if (name == MemoryArea::Peripheral16bit) + {// Force 16-bit transactions to avoid bus errors when accessing 16-bit peripherals + el->appendInputData16(MSP432_DataWidth::DATA_WITH_16); + } + else + { + el->appendInputData16(MSP432_DataWidth::DATA_WITH_32); + } + } + + el->appendInputData32(address + this->getStart());// address + el->appendInputData32(static_cast(count)); // size in bytes + + for (size_t i = 0; i < count; ++i) + { + el->appendInputData8(static_cast(buffer[i])); + } + + this->elements.emplace_back(el); + + return true; +} + +bool ArmRandomMemoryAccess::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + HalExecElement *el; + if (this->devHandle->getInterfaceMode() == SWD_MSP432) + { + el = new HalExecElement(ID_MemApTransactionArmSwd); + } + else + { + el = new HalExecElement(ID_MemApTransactionArm); + } + + el->appendInputData16(0); // APSEL + el->appendInputData16(MSP432_DataWidth::AP_READ); + + if ((address & 0x1) || ((address + count) & 01)) + { + el->appendInputData16(MSP432_DataWidth::DATA_WITH_8); + } + else if ((address & 0x2) || ((address + count) & 02)) + { + el->appendInputData16(MSP432_DataWidth::DATA_WITH_16); + } + else + { + if (name == MemoryArea::Peripheral16bit) + {// Force 16-bit transactions to avoid bus errors when accessing 16-bit peripherals + el->appendInputData16(MSP432_DataWidth::DATA_WITH_16); + } + else + { + el->appendInputData16(MSP432_DataWidth::DATA_WITH_32); + } + } + + el->appendInputData32(address + this->getStart());// address + el->appendInputData32(static_cast(count)); // size in bytes + + ReadElement r(buffer, count, 0, 0, 0); + this->readMap[this->elements.size()] = r; + this->elements.emplace_back(el); + + return true; +} + +bool ArmRandomMemoryAccess::doWrite(uint32_t address, uint32_t value) +{ + return doWrite(address, (uint8_t*)&value, sizeof(value)); +} + +bool ArmRandomMemoryAccess::verify(uint32_t address, const uint8_t* buffer, size_t count) +{ + std::vector tmpBuffer(count); + + if (!doRead(address, tmpBuffer.data(), count) ||!sync()) + { + return false; + } + return memcmp(buffer ? buffer : std::vector(count, 0xFF).data(), tmpBuffer.data(), count) == 0; +} + +bool ArmRandomMemoryAccess::postSync(const HalExecCommand& cmd) +{ + return MemoryAreaBase::postSync(cmd); +} + +bool ArmRandomMemoryAccess::uploadFunclet() +{ + bool success = false; + + const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::Type::ERASE); + + if (!mm) + { + return false; + } + + MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram, 0); + + if (funclet.maxPayloadSize() <= ram->getSize()) + { + if (mm->getRamPreserveMode()) + { + const size_t backupSize = std::min((size_t)ram->getSize(), funclet.maxPayloadSize()); + ramBackup.resize(backupSize); + if (!ram->read(0, &ramBackup[0], ramBackup.size()) || !ram->sync()) + return false; + } + else + { + ramBackup.clear(); + } + } + const uint8_t* code = (uint8_t*)funclet.codeNoOffset(); + const size_t count = funclet.codeSizeNoCheck(); + success = ram->write(0, code, count) && ram->sync(); + return success; +} + +void ArmRandomMemoryAccess::restoreRam() +{ + if (!ramBackup.empty()) + { + if (MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram, 1)) + { + ram->write(0, &ramBackup[0], ramBackup.size()) && ram->sync(); + } + ramBackup.clear(); + } +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/ArmRandomMemoryAccess.h b/DLL430_v3/src/TI/DLL430/ArmRandomMemoryAccess.h new file mode 100644 index 0000000..d90300c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmRandomMemoryAccess.h @@ -0,0 +1,84 @@ +/* + * ARMRandomMemoryAccess.h + * + * Memory class for accessing RAM on ARM Cortex devices. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "MemoryAreaBase.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class ArmRandomMemoryAccess : public MemoryAreaBase + { + public: + ArmRandomMemoryAccess ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa); + virtual ~ArmRandomMemoryAccess (); + + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doWrite(uint32_t address, uint32_t value) OVERRIDE; + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + + virtual bool isReadOnly() const OVERRIDE { return false; } + + virtual bool erase() OVERRIDE{ return true; } + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE{ return true; } + virtual bool verify(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool wakeup() OVERRIDE{ return false; }; + + protected: + bool postSync(const HalExecCommand&) OVERRIDE; + bool uploadFunclet(); + void restoreRam(); + + IMemoryManager* mm; + std::vector ramBackup; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/ArmReadonlyMemroyAccess.h b/DLL430_v3/src/TI/DLL430/ArmReadonlyMemroyAccess.h new file mode 100644 index 0000000..2d7aaa7 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmReadonlyMemroyAccess.h @@ -0,0 +1,70 @@ +/* +* ArmRandomMemoryAccess.h +* +* Memory class for accessing ROM TLV data. +* +* Copyright (C) 2007 - 2011 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. +*/ + +#pragma once + +#include "ArmRandomMemoryAccess.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class ArmReadonlyMemroyAccess : public ArmRandomMemoryAccess + { + public: + ArmReadonlyMemroyAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa) + : ArmRandomMemoryAccess(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) {} + + virtual bool isReadOnly() const OVERRIDE{ return true; } + + bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE{ return false; } + bool doWrite(uint32_t address, uint32_t value) OVERRIDE{ return false; } + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/ArmSpecialFlashMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/ArmSpecialFlashMemoryAccess.cpp new file mode 100644 index 0000000..6782585 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmSpecialFlashMemoryAccess.cpp @@ -0,0 +1,281 @@ +/* + * ArmSpecialMemoryAccess.cpp + * + * Memory class for accessing flash memory. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "ArmFlashMemoryAccess.h" +#include "ArmSpecialFlashMemoryAccess.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "FetHandle.h" +#include "ClockCalibration.h" +#include "MSP432_FlashLib.h" +#include "CpuRegisters.h" + +using namespace TI::DLL430; +using std::vector; +using std::bind; +using std::shared_ptr; + +ArmInfoFlashMemoryAccess::ArmInfoFlashMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa + ) + : ArmFlashMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast(new NoWriteProtection(mm))) + , start(start) + , end(start + size - 1) +{} + +ArmInfoFlashMemoryAccess::~ArmInfoFlashMemoryAccess() {}; + + +bool ArmInfoFlashMemoryAccess::erase() +{ + return ArmFlashMemoryAccess::erase(start, end); +} + +ArmBslFlashMemoryAccess::ArmBslFlashMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa + ) + : ArmFlashMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast(new NoWriteProtection(mm))) + , start(start) + , end(start + size - 1) +{} + +ArmBslFlashMemoryAccess::~ArmBslFlashMemoryAccess() +{} + + +bool ArmBslFlashMemoryAccess::erase() +{ + if (!isLocked()) + { + return ArmFlashMemoryAccess::flashErase(ArmBslFlashMemoryAccess::start, ArmBslFlashMemoryAccess::end, + true, MSP432_FlashLib::FLASH_SECTOR_ERASE); + } + return true; +} + +bool ArmBslFlashMemoryAccess::erase(uint32_t start, uint32_t end, bool forceUnlock) +{ + if (!isLocked()) + { + return ArmFlashMemoryAccess::flashErase(start, end, true, MSP432_FlashLib::FLASH_SECTOR_ERASE); + } + return true; +} + +bool ArmBslFlashMemoryAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + if (!isLocked()) + { + return ArmFlashMemoryAccess::flashWrite(address, buffer, count, true); + } + return true; +} + +ArmFlashMemoryAccess2M::ArmFlashMemoryAccess2M( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection *writeProt + ) + : ArmFlashMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, writeProt) +{} + +ArmFlashMemoryAccess2M::~ArmFlashMemoryAccess2M() +{} + + +bool ArmFlashMemoryAccess2M::wakeup() +{ + uint8_t timeout = 6; + + uint32_t pcmCtlData = 0; + uint8_t tmpPcm[4] = { 0 }; + + IDebugManager *dbm = devHandle->getDebugManager(); + if (!dbm) + { + return false; + } + + mm->read(MSP432_FlashLib::PCM_CTL, tmpPcm, sizeof(pcmCtlData)); + mm->sync(); + pcmCtlData = tmpPcm[0] | (tmpPcm[1] << 8) | (tmpPcm[2] << 16) | (tmpPcm[3] << 24); + + pcmCtlData = MSP432_FlashLib::PCM_CTL0_KEY | ((pcmCtlData & 0xFFFF) & ~(MSP432_FlashLib::PCM_CTL1_LOCKLPM5 + MSP432_FlashLib::PCM_CTL1_LOCKBKUP)); + + mm->write(MSP432_FlashLib::PCM_CTL, pcmCtlData); + mm->sync(); + + uint32_t sramEn = 0; + uint8_t sramEnTmp[4] = { 0 }; + do + { + mm->read(MSP432_FlashLib::SYS_SRAM_STAT, sramEnTmp, sizeof(sramEn)); + mm->sync(); + sramEn = sramEnTmp[0] | (sramEnTmp[1] << 8) | (sramEnTmp[2] << 16) | (sramEnTmp[3] << 24); + } while (!(sramEn & MSP432_FlashLib::BNKEN_RDY) && --timeout); + + if (!timeout) + { + return false; + } + + uint32_t sramBanks = 0; + uint8_t sramBanksTmp[4] = { 0 }; + + mm->read(MSP432_FlashLib::SYS_SRAM_NUMBANKS, sramBanksTmp, sizeof(sramBanks)); + mm->sync(); + sramBanks = sramBanksTmp[0] | (sramBanksTmp[1] << 8) | (sramBanksTmp[2] << 16) | (sramBanksTmp[3] << 24); + + if (sramBanks == 4) + { + mm->write(MSP432_FlashLib::SYS_SRAM_BNKEN_CTL0, MSP432_FlashLib::BNK3_EN); + mm->sync(); + } + else if (sramBanks == 2) + { + mm->write(MSP432_FlashLib::SYS_SRAM_BNKEN_CTL0, MSP432_FlashLib::BNK1_EN); + mm->sync(); + } + else + { + return false; + } + return true; +} + +ArmBslFlashMemoryAccess2M::ArmBslFlashMemoryAccess2M( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa + ) + : ArmFlashMemoryAccess2M(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast(new NoWriteProtection(mm))), + start(start), + end(start + size - 1) +{} + +ArmBslFlashMemoryAccess2M::~ArmBslFlashMemoryAccess2M() +{} + +bool ArmBslFlashMemoryAccess2M::erase() +{ + if (!isLocked()) + { + return ArmFlashMemoryAccess2M::flashErase(ArmBslFlashMemoryAccess2M::start, ArmBslFlashMemoryAccess2M::end, + true, MSP432_FlashLib::FLASH_SECTOR_ERASE); + } + return true; +} + +bool ArmBslFlashMemoryAccess2M::erase(uint32_t start, uint32_t end, bool forceUnlock) +{ + if (!isLocked()) + { + return ArmFlashMemoryAccess2M::flashErase(start, end, true, MSP432_FlashLib::FLASH_SECTOR_ERASE); + } + return true; +} + +bool ArmBslFlashMemoryAccess2M::doWrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + if (!isLocked()) + { + return ArmFlashMemoryAccess2M::flashWrite(address, buffer, count, true); + } + return true; +} + +ArmInfoFlashMemoryAccess2M::ArmInfoFlashMemoryAccess2M( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa + ) + : ArmFlashMemoryAccess2M(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast(new NoWriteProtection(mm))) + , start(start) + , end(start + size - 1) +{} + +ArmInfoFlashMemoryAccess2M::~ArmInfoFlashMemoryAccess2M() {}; + + +bool ArmInfoFlashMemoryAccess2M::erase() +{ + return ArmFlashMemoryAccess2M::erase(start, end); +} + + + diff --git a/DLL430_v3/src/TI/DLL430/ArmSpecialFlashMemoryAccess.h b/DLL430_v3/src/TI/DLL430/ArmSpecialFlashMemoryAccess.h new file mode 100644 index 0000000..7736166 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ArmSpecialFlashMemoryAccess.h @@ -0,0 +1,169 @@ +/* + * ArmSpecialFlashMemoryAccess.h + * + * Memory class for accessing RAM on ARM Cortex devices. + * + * Copyright (C) 2007 - 2015 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. + */ + +#pragma once + +#include "ArmFlashMemoryAccess.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class ArmBslFlashMemoryAccess : public ArmFlashMemoryAccess + { + public: + ArmBslFlashMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa); + virtual ~ArmBslFlashMemoryAccess(); + + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; + virtual bool erase() OVERRIDE; + + private: + uint32_t start; + uint32_t end; + }; + + class ArmInfoFlashMemoryAccess : public ArmFlashMemoryAccess + { + public: + ArmInfoFlashMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa + ); + virtual ~ArmInfoFlashMemoryAccess(); + + virtual bool erase() OVERRIDE; + + private: + uint32_t start; + uint32_t end; + }; + + // MSP32 P4111 special hanlding + class ArmFlashMemoryAccess2M : public ArmFlashMemoryAccess + { + public: + ArmFlashMemoryAccess2M( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection *writeProt + ); + virtual ~ArmFlashMemoryAccess2M(); + + virtual bool wakeup() OVERRIDE; + + private: + }; + + + class ArmBslFlashMemoryAccess2M : public ArmFlashMemoryAccess2M + { + public: + ArmBslFlashMemoryAccess2M( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa); + virtual ~ArmBslFlashMemoryAccess2M(); + + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; + virtual bool erase() OVERRIDE; + + private: + uint32_t start; + uint32_t end; + }; + + class ArmInfoFlashMemoryAccess2M : public ArmFlashMemoryAccess2M + { + public: + ArmInfoFlashMemoryAccess2M( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa + ); + virtual ~ArmInfoFlashMemoryAccess2M(); + virtual bool erase() OVERRIDE; + + private: + uint32_t start; + uint32_t end; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/ClockCalibration.cpp b/DLL430_v3/src/TI/DLL430/ClockCalibration.cpp index f952c2e..403d63f 100644 --- a/DLL430_v3/src/TI/DLL430/ClockCalibration.cpp +++ b/DLL430_v3/src/TI/DLL430/ClockCalibration.cpp @@ -3,69 +3,78 @@ * * Handles setting of correct clock frequency for flash accesses. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "ClockCalibration.h" -#include -#include +#include "IMemoryManager.h" +#include "IConfigManager.h" #include "HalExecCommand.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" #include "DeviceInfo.h" using namespace TI::DLL430; -ClockCalibration* ClockCalibration::create(DeviceHandleV3* devHandle, MemoryManager* mm, - const ConfigManager* configMan, const DeviceInfo& info) +ClockCalibration* ClockCalibration::create(IDeviceHandle* devHandle, IMemoryManager* mm, + const IConfigManager* configMan, ClockSystemType clockSystem) { if (configMan && configMan->freqCalibrationEnabled()) { - if (info.clockSystem() == BC_1xx) + switch (clockSystem) + { + case ClockSystemType::BC_1xx: return new ClockCalibrationDCO(devHandle, mm, 0x7); - if (info.clockSystem() == BC_2xx) + case ClockSystemType::BC_2xx: return new ClockCalibrationDCO(devHandle, mm, 0xf); - if (info.clockSystem() == FLLPLUS) + case ClockSystemType::FLLPLUS: return new ClockCalibrationFLL(devHandle, mm); + default: + return new ClockCalibrationNone(); + } + } + else + { + return new ClockCalibrationNone(); } - return new ClockCalibrationNone(); } -ClockCalibrationDCO::ClockCalibrationDCO(DeviceHandleV3* devHandle, MemoryManager* mm, uint32_t maxBCS) +ClockCalibrationDCO::ClockCalibrationDCO(IDeviceHandle* devHandle, IMemoryManager* mm, uint32_t maxBCS) : devHandle_(devHandle) , mm_(mm) , maxBCS_(maxBCS) @@ -84,8 +93,8 @@ bool ClockCalibrationDCO::determineSettings() { if (!isCalibrated_) { - MemoryArea* ram = mm_->getMemoryArea("system"); - if(ram==NULL) + MemoryArea* ram = mm_->getMemoryArea(MemoryArea::Ram); + if (ram==nullptr) { return false; } @@ -93,9 +102,9 @@ bool ClockCalibrationDCO::determineSettings() HalExecElement* el = new HalExecElement( devHandle_->checkHalId(ID_GetDcoFrequency) ); el->appendInputData16(ram->getStart()); el->appendInputData16(maxBCS_); - + HalExecCommand cmd; - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); cmd.setTimeout(5000); //If calibration failed, we keep the existing default values @@ -114,7 +123,7 @@ bool ClockCalibrationDCO::backupSettings() { madeBackup_ = false; - if ( MemoryArea* peripheral = mm_->getMemoryArea("peripheral8bit") ) + if ( MemoryArea* peripheral = mm_->getMemoryArea(MemoryArea::Peripheral8bit) ) { madeBackup_ = peripheral->read(0x56, &backupDCO_, 1) && peripheral->read(0x57, &backupBCS1_, 1) && @@ -126,10 +135,10 @@ bool ClockCalibrationDCO::backupSettings() bool ClockCalibrationDCO::makeSettings() const { - if ( MemoryArea* peripheral = mm_->getMemoryArea("peripheral8bit") ) + if ( MemoryArea* peripheral = mm_->getMemoryArea(MemoryArea::Peripheral16bit) ) { - //Set default values for BCSCTL1 (XT2OFF, RSEL 7), the funclet will set the actual value - return peripheral->write(0x57, 0x87) && + //BCL12: set RSEL to 7 + return peripheral->write(0x57, (0x7 | (backupBCS1_ & 0xC0))) && peripheral->write(0x58, calibBCS2_) && peripheral->sync(); } @@ -143,9 +152,11 @@ bool ClockCalibrationDCO::restoreSettings() madeBackup_ = false; - if ( MemoryArea* peripheral = mm_->getMemoryArea("peripheral8bit") ) + if ( MemoryArea* peripheral = mm_->getMemoryArea(MemoryArea::Peripheral8bit) ) { - return peripheral->write(0x56, backupDCO_) && + //BCL12: set RSEL to 7 first + return peripheral->write(0x57, (0x7 | (backupBCS1_ & 0xC0))) && + peripheral->write(0x56, backupDCO_) && peripheral->write(0x57, backupBCS1_) && peripheral->write(0x58, backupBCS2_) && peripheral->sync(); @@ -160,12 +171,11 @@ uint16_t ClockCalibrationDCO::getCal0() const uint16_t ClockCalibrationDCO::getCal1() const { - return calibBCS1_; + return (calibBCS1_ & 0x3F) | (backupBCS1_ & 0xC0); } - -ClockCalibrationFLL::ClockCalibrationFLL(DeviceHandleV3* devHandle, MemoryManager* mm) +ClockCalibrationFLL::ClockCalibrationFLL(IDeviceHandle* devHandle, IMemoryManager* mm) : devHandle_(devHandle) , mm_(mm) , backupSCFQCTL_(0) @@ -187,8 +197,8 @@ bool ClockCalibrationFLL::determineSettings() { if (!isCalibrated_) { - MemoryArea* ram = mm_->getMemoryArea("system"); - if(ram==NULL) + MemoryArea* ram = mm_->getMemoryArea(MemoryArea::Ram); + if (ram==nullptr) { return false; } @@ -196,9 +206,9 @@ bool ClockCalibrationFLL::determineSettings() HalExecElement* el = new HalExecElement( devHandle_->checkHalId(ID_GetDcoFrequency) ); el->appendInputData16(ram->getStart()); el->appendInputData16(0); - + HalExecCommand cmd; - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); cmd.setTimeout(5000); //If calibration failed, we keep the existing default values @@ -219,7 +229,7 @@ bool ClockCalibrationFLL::backupSettings() { madeBackup_ = false; - if ( MemoryArea* peripheral = mm_->getMemoryArea("peripheral8bit") ) + if ( MemoryArea* peripheral = mm_->getMemoryArea(MemoryArea::Peripheral8bit) ) { madeBackup_ = peripheral->read(0x50, &backupSCFI0_, 1) && peripheral->read(0x51, &backupSCFI1_, 1) && @@ -233,13 +243,13 @@ bool ClockCalibrationFLL::backupSettings() bool ClockCalibrationFLL::makeSettings() const { - if ( MemoryArea* peripheral = mm_->getMemoryArea("peripheral8bit") ) + if ( MemoryArea* peripheral = mm_->getMemoryArea(MemoryArea::Peripheral8bit) ) { return peripheral->write(0x50, calibSCFI0_) && peripheral->write(0x51, calibSCFI1_) && peripheral->write(0x52, calibSCFQCTL_) && - peripheral->write(0x53, calibFLLCTL0_) && - peripheral->write(0x54, calibFLLCTL1_) && + peripheral->write(0x53, (calibFLLCTL0_ & 0x80) | (backupFLLCTL0_ & 0x7F)) && + peripheral->write(0x54, (calibFLLCTL1_ & 0x5F) | (backupFLLCTL1_ & 0xA0)) && peripheral->sync(); } return false; @@ -252,7 +262,7 @@ bool ClockCalibrationFLL::restoreSettings() madeBackup_ = false; - if ( MemoryArea* peripheral = mm_->getMemoryArea("peripheral8bit") ) + if ( MemoryArea* peripheral = mm_->getMemoryArea(MemoryArea::Peripheral8bit) ) { return peripheral->write(0x50, backupSCFI0_) && peripheral->write(0x51, backupSCFI1_) && diff --git a/DLL430_v3/src/TI/DLL430/ClockCalibration.h b/DLL430_v3/src/TI/DLL430/ClockCalibration.h index a4eba21..751a57b 100644 --- a/DLL430_v3/src/TI/DLL430/ClockCalibration.h +++ b/DLL430_v3/src/TI/DLL430/ClockCalibration.h @@ -3,60 +3,55 @@ * * Handles setting of correct clock frequency for flash accesses. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_CLOCKCALIBRATION_H -#define DLL430_CLOCKCALIBRATION_H - -#include +#include "DeviceInfo.h" namespace TI { namespace DLL430 { - class MemoryManager; - class ConfigManager; - class DeviceHandleV3; - class DeviceInfo; + class IMemoryManager; + class IConfigManager; + class IDeviceHandle; class ClockCalibration { public: - static ClockCalibration* create(DeviceHandleV3* devHandle, MemoryManager* mm, - const ConfigManager* configMan, const DeviceInfo& info); + static ClockCalibration* create(IDeviceHandle* devHandle, IMemoryManager* mm, + const IConfigManager* configMan, ClockSystemType clockSystem); + virtual ~ClockCalibration() {} virtual bool determineSettings() = 0; virtual bool backupSettings() = 0; @@ -70,7 +65,7 @@ namespace TI class ClockCalibrationDCO : public ClockCalibration { public: - ClockCalibrationDCO(DeviceHandleV3* devHandle, MemoryManager* mm, uint32_t maxBCS); + ClockCalibrationDCO(IDeviceHandle* devHandle, IMemoryManager* mm, uint32_t maxBCS); virtual bool determineSettings(); virtual bool backupSettings(); @@ -81,12 +76,12 @@ namespace TI virtual uint16_t getCal1() const; private: - DeviceHandleV3* devHandle_; - MemoryManager* mm_; + IDeviceHandle* devHandle_; + IMemoryManager* mm_; uint32_t maxBCS_; - uint32_t backupDCO_; - uint32_t backupBCS1_; - uint32_t backupBCS2_; + uint8_t backupDCO_; + uint8_t backupBCS1_; + uint8_t backupBCS2_; uint16_t calibDCO_; uint16_t calibBCS1_; uint16_t calibBCS2_; @@ -97,7 +92,7 @@ namespace TI class ClockCalibrationFLL : public ClockCalibration { public: - ClockCalibrationFLL(DeviceHandleV3* devHandle, MemoryManager* mm); + ClockCalibrationFLL(IDeviceHandle* devHandle, IMemoryManager* mm); virtual bool determineSettings(); virtual bool backupSettings(); @@ -108,15 +103,15 @@ namespace TI virtual uint16_t getCal1() const; private: - DeviceHandleV3* devHandle_; - MemoryManager* mm_; - - uint32_t backupSCFQCTL_; - uint32_t backupSCFI0_; - uint32_t backupSCFI1_; - uint32_t backupFLLCTL0_; - uint32_t backupFLLCTL1_; - + IDeviceHandle* devHandle_; + IMemoryManager* mm_; + + uint8_t backupSCFQCTL_; + uint8_t backupSCFI0_; + uint8_t backupSCFI1_; + uint8_t backupFLLCTL0_; + uint8_t backupFLLCTL1_; + uint16_t calibSCFI0_; uint16_t calibSCFI1_; uint16_t calibSCFQCTL_; @@ -137,8 +132,6 @@ namespace TI virtual uint16_t getCal0() const { return 0; } virtual uint16_t getCal1() const { return 0; } }; - - }; -}; -#endif /* DLL430_CLOCKCALIBRATION_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/ConfigManager.cpp b/DLL430_v3/src/TI/DLL430/ConfigManager.cpp new file mode 100644 index 0000000..15d34a0 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ConfigManager.cpp @@ -0,0 +1,1052 @@ +/* + * ConfigManager.cpp + * + * Functionality for configuring target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "VersionInfo.h" +#include "FetHandle.h" +#include "ConfigManager.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "Record.h" +#include "PinSequence.h" +#include "IDeviceHandle.h" +#include "UpdateManagerFet.h" +#include "UpdateManagerMSP_FET430.h" +#include "UpdateManagerDummy.h" +#include "FetHandleManager.h" +#include "ConfigureParameters.h" +#include "EnergyTrace_TSPA/EnergyTraceManager.h" +#include "JtagId.h" + +using namespace TI::DLL430; +using namespace std; + +ConfigManager::ConfigManager(FetHandle* parent, FetHandleManager* fhManager, TARGET_ARCHITECTURE_t arch) + : parent(parent) + , updateManagerFet(nullptr) + , vcc(0) + , mode(JTAG_IF) + , mEnergyTraceManager(nullptr) + , deviceCode(0) + , mhighres(0) + , freqCalibration(true) + , ulpDebug(false) + , atProbeState(false) + , arch(arch) + , disableInterruptsMode(DISABLE_INTERRUPTS_NONE) + , disableInterruptsModeBackup(DISABLE_INTERRUPTS_NONE) +{ + updateCmd.setTimeout(20000); + + FetControl* control = this->parent->getControl(); + if (control->getFetToolId()== eZ_FET_WITH_DCDC || control->getFetToolId() == eZ_FET_NO_DCDC + || control->getFetToolId() == MSP_FET_WITH_DCDC || control->getFetToolId() == eZ_FET_WITH_DCDC_NO_FLOWCT + || control->getFetToolId() == MSP_FET_WITH_DCDC_V2x || control->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + this->updateManagerFet = new UpdateManagerFet(parent, this, fhManager); + } + else if (control->getFetToolId()== MSP_FET430) + { + this->updateManagerFet = new UpdateManagerMSP_FET430(parent, this,arch); + } + else + { + this->updateManagerFet = new UpdateManagerDummy(); + } +} + +ConfigManager::~ConfigManager() +{ + FetControl* control=this->parent->getControl(); + + // send reset command to FET + if ((control != nullptr)&&(control->hasCommunication())) + { + this->stop(); + } + delete updateManagerFet; +} + +bool ConfigManager::isUpdateRequired(TARGET_ARCHITECTURE_t arch) const +{ + return updateManagerFet->isUpdateRequired(arch); +} + +bool ConfigManager::isEnergyTraceSupported() +{ + FetControl* fet = this->parent->getControl(); + const uint16_t toolId = fet ? fet->getFetToolId() : 0; + return toolId == eZ_FET_WITH_DCDC || toolId == MSP_FET_WITH_DCDC || toolId == eZ_FET_WITH_DCDC_NO_FLOWCT || toolId == MSP_FET_WITH_DCDC_V2x || toolId == eZ_FET_WITH_DCDC_V2x; +} + +void ConfigManager::init () +{ + string tag; + string value; + + // If any kind of update is required do not configure any JTAG or SBW Speed-> perhaps you will use a null pointer + if (updateManagerFet->isUpdateRequired(TARGET_ARCHITECTURE::MSP430)) + { + return; + } + // read configuration for JTAG speed EDT trace.... + JTAG_4WIRE_SPEED jtagSpeed = JTAG_4WIRE_SPEED_4_MHZ; + JTAG_2WIRE_SPEED sbwSpeed = JTAG_2WIRE_SPEED_400_KHZ; + + string iniFile = "MSP430DLL.INI"; + + if (const char* iniPathEnv = getenv("MSP430_DLL_INI_PATH")) + { + iniFile = string(iniPathEnv) + "/" + iniFile; + } + + ifstream DllV3Ini(iniFile.c_str()); + + while (DllV3Ini && !DllV3Ini.eof()) + { + DllV3Ini >> tag >> value; + if (tag == "SBW_SPEED") + { + if (value == "JTAG_2WIRE_SPEED_600_KHZ") + { + sbwSpeed = JTAG_2WIRE_SPEED_600_KHZ; + } + if (value == "JTAG_2WIRE_SPEED_400_KHZ") + { + sbwSpeed = JTAG_2WIRE_SPEED_400_KHZ; + } + if (value == "JTAG_2WIRE_SPEED_200_KHZ") + { + sbwSpeed = JTAG_2WIRE_SPEED_200_KHZ; + } + if (value == "JTAG_2WIRE_SPEED_100_KHZ") + { + sbwSpeed = JTAG_2WIRE_SPEED_100_KHZ; + } + } + if (tag == "JTAG_SPEED") + { + if (value == "JTAG_4WIRE_SPEED_15_MHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_15_MHZ; + } + if (value == "JTAG_4WIRE_SPEED_8_MHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_8_MHZ; + } + if (value == "JTAG_4WIRE_SPEED_4_MHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_4_MHZ; + } + if (value == "JTAG_4WIRE_SPEED_2_MHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_2_MHZ; + } + if (value == "JTAG_4WIRE_SPEED_1_MHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_1_MHZ; + } + if (value == "JTAG_4WIRE_SPEED_750_KHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_750_KHZ; + } + if (value == "JTAG_4WIRE_SPEED_500_KHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_500_KHZ; + } + if (value == "JTAG_4WIRE_SPEED_250_KHZ") + { + jtagSpeed = JTAG_4WIRE_SPEED_250_KHZ; + } + } + if (tag == "ULP_DEBUG") + { + ulpDebug = (value == "ON"); + } + + if (tag == "DCO_CALIBRATION") + { + freqCalibration = (value != "OFF"); + } + + if (tag == "AT_PROBE_STATE") + { + atProbeState = (value == "ON"); + } + } + this->setJtagSpeed(jtagSpeed, sbwSpeed); +} + +VersionInfo ConfigManager::getHalVersion() const +{ + return this->updateManagerFet->getHalVersion(); +} + + +void ConfigManager::setJtagMode(INTERFACE_TYPE mode) +{ + this->mode = mode; +} + +int16_t ConfigManager::start() +{ + return this->start(password, deviceCode); +} + +bool ConfigManager::jtagErase(uint16_t eraseKey) +{ + if (this->start() != 0x1) + { + return false; + } + HalExecCommand cmd; + cmd.setTimeout(10000); + HalExecElement* el = new HalExecElement(ID_SendJtagMailboxXv2); + el->appendInputData16(LONG_MAILBOX_MODE); + el->appendInputData16(STOP_DEVICE); + el->appendInputData16(eraseKey); + cmd.elements.emplace_back(el); + + if (!this->parent->send(cmd)) + { + return false; + } + + // assert hard RST/NMI and feed in magic pattern to stop device execution + // thr RST/NMI will remove the register protection + if (!this->reset(false, true, 0x99, ID_ResetXv2)) + { + return false; + } + // restart jtag connection and if needed feed in JTAG passowrd + if (this->start() != 0x1) + { + return false; + } +#if defined(_WIN32) || defined(_WIN64) || defined(__APPLE__) + this_thread::sleep_for(chrono::milliseconds(100)); +#else + this_thread::sleep_for(chrono::milliseconds(500)); +#endif + return true; +} + +uint16_t AsciiToHex(const char* password) +{ + return strtoul(std::string(password, 4).c_str(), 0, 16) & 0xFFFF; +} + +INTERFACE_TYPE ConfigManager::getInterfaceMode(TARGET_ARCHITECTURE_t arch) const +{ + HalExecCommand cmd; + HalExecElement* el;// = new HalExecElement(ID_GetInterfaceMode); + if (arch == TARGET_ARCHITECTURE_t::MSP432_M4) + { + el = new HalExecElement(ID_GetInterfaceModeArm); + } + else + { + el = new HalExecElement(ID_GetInterfaceMode); + } + + cmd.elements.emplace_back(el); + + if (this->parent->send(cmd)) + { + const uint16_t jtagID = el->getOutputAt16(0); + const uint16_t ifMode = el->getOutputAt16(2); + + if (jtagID != 0xFFFF) + { + switch (ifMode) + { + case 0: // JTAG Mode + return JTAG_IF; + case 1: // SBW2 Mode + return SPYBIWIRE_IF; + case 2: // SBW4 Mode + return SPYBIWIREJTAG_IF; + case 7: // JTAG_432 Mode + return JTAG_MSP432; + case 8: // SWD_432 Mode + return SWD_MSP432; + } + } + } + return UNDEF_IF; //JTAG_MODE_UNDEF; //ToDo +} + +int16_t ConfigManager::start(const string& pwd, uint32_t deviceCode) +{ + //#words in hex, ie. #characters / 4 + const uint16_t pwLength = (uint16_t)pwd.length() / 4; + + // if we have an L092 Rom device + if (deviceCode == 0xDEADBABE) + { + if (pwLength > 4) + { + return -2; + } + + HalExecElement* elUnlock = new HalExecElement(ID_UnlockC092); + elUnlock->appendInputData16(pwLength); + + const char* pwdinternal = pwd.c_str(); + for (uint16_t i = 0; i < pwLength; i++) + { + uint16_t hexWord = AsciiToHex(pwdinternal); + elUnlock->appendInputData16(hexWord); + pwdinternal += 4; + } + + HalExecCommand cmd; + cmd.elements.emplace_back(elUnlock); + + if (!this->parent->send(cmd)) + { + return -2; + } + return 1; + } + // if we have an L092 device + if (deviceCode == 0xA55AA55A|| deviceCode == 0x5AA55AA5) + { + HalExecElement* elActivation = new HalExecElement(ID_StartJtagActivationCode); + + elActivation->appendInputData8(0); + elActivation->appendInputData8(0); + elActivation->appendInputData32(deviceCode); + + HalExecCommand cmd; + cmd.elements.emplace_back(elActivation); + cmd.setTimeout(10000); + + if (!this->parent->send(cmd)) + { + return -2; + } + return 1; + } + // if we have a device locked with a custom password + if ( !pwd.empty() ) + { + if (pwLength > 60) + { + return 0; + } + + HalExecElement* elUnlock = new HalExecElement(ID_UnlockDeviceXv2); + switch (this->mode) + { + case JTAG_IF: + elUnlock->appendInputData16(0); + break; + case SPYBIWIRE_IF: + elUnlock->appendInputData16(1); + break; + case SPYBIWIREJTAG_IF: + elUnlock->appendInputData16(2); + break; + default: + delete elUnlock; + return 0; + } + + elUnlock->appendInputData16(pwLength); + + const char* pwdinternal = pwd.c_str(); + for (uint16_t i = 0; i < pwLength; i++) + { + const uint16_t hexWord = AsciiToHex(pwdinternal); + elUnlock->appendInputData16(hexWord); + pwdinternal += 4; + } + + HalExecCommand cmd; + cmd.elements.emplace_back(elUnlock); + + if (!this->parent->send(cmd)) + { + return -2; + } + #ifndef NDEBUG + printf("Unlock device\n"); + #endif + + return 1; + } + // if we have a "normal" msp430 device without special handling + if ((deviceCode != 0xA55AA55A && deviceCode != 0x5AA55AA5) || deviceCode == 0x80058005) + { + HalExecCommand startJtag; + HalExecElement* elStart = new HalExecElement(ID_StartJtag); + switch (this->mode) { + case JTAG_IF: + elStart->appendInputData8(0); + break; + case SPYBIWIRE_IF: + elStart->appendInputData8(1); + break; + case SPYBIWIREJTAG_IF: + elStart->appendInputData8(2); + break; + case SPYBIWIRE_DCDC: + elStart->appendInputData8(5); + break; + case SPYBIWIRE_MSP_FET_IF: + elStart->appendInputData8(6); + break; + case JTAG_MSP432: + elStart->appendInputData8(7); + break; + case SWD_MSP432: + elStart->appendInputData8(8); + break; + default: + delete elStart; + return 0; + } + + startJtag.elements.emplace_back(elStart); + if (!this->parent->send(startJtag)) + { + return -1; + } + const uint8_t numOfDevices = elStart->getOutputAt8(0); + return numOfDevices; + } + return 0; +} + +bool ConfigManager::configureJtagSpeed(uint32_t speed) +{ + enum INTERFACE_SPEED iSpeed = (enum INTERFACE_SPEED)speed; + bool retValue = false; + switch (iSpeed) + { + case FAST: + if (arch == TARGET_ARCHITECTURE_t::MSP430) + { + retValue = this->setJtagSpeed(JTAG_4WIRE_SPEED_8_MHZ, JTAG_2WIRE_SPEED_600_KHZ); + } + else + { + retValue = this->setJtagSpeed(JTAG_4WIRE_SPEED_15_MHZ, JTAG_2WIRE_SPEED_600_KHZ); + } + break; + case MEDIUM: + retValue = this->setJtagSpeed(JTAG_4WIRE_SPEED_4_MHZ, JTAG_2WIRE_SPEED_400_KHZ); + break; + case SLOW: + retValue = this->setJtagSpeed(JTAG_4WIRE_SPEED_1_MHZ, JTAG_2WIRE_SPEED_200_KHZ); + break; + default: + retValue = this->setJtagSpeed(JTAG_4WIRE_SPEED_4_MHZ, JTAG_2WIRE_SPEED_600_KHZ); + break; + } + return retValue; +} + +bool ConfigManager::setJtagSpeed(JTAG_4WIRE_SPEED speedJtag, JTAG_2WIRE_SPEED speedSbw) +{ + FetControl * control=this->parent->getControl(); + if (control->getFetToolId() != MSP_FET430) + { + HalExecElement* el = new HalExecElement(ID_Configure); + el->appendInputData32(CONFIG_PARAM_JTAG_SPEED); + el->appendInputData32(speedJtag); + el->appendInputData32(speedSbw); + + HalExecCommand configCmd; + configCmd.elements.emplace_back(el); + return this->parent->send(configCmd); + } + return true; +} + +bool ConfigManager::stop () +{ + HalExecCommand stopJtag; + stopJtag.elements.emplace_back(new HalExecElement(ID_StopJtag)); + return this->parent->send(stopJtag); +} + +long ConfigManager::MSP430I_MagicPattern(uint16_t ifMode) +{ + uint16_t mode[2] = {0}; + + if (ifMode == AUTOMATIC_IF) + { + mode[0] = SPYBIWIRE_IF; + mode[1] = SPYBIWIREJTAG_IF; + } + else + { + mode[0] = ifMode; + mode[1] = ifMode; + } + + for (uint16_t i = 0; i < 2; i++) + { + setJtagMode((INTERFACE_TYPE)mode[i]); + this->start(); + + HalExecElement* el = new HalExecElement(ID_Reset430I); + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + bool success = this->parent->send(cmd); + + if (success) + { + const uint8_t chainLen = el->getOutputAt8(0); + const uint8_t iJtagID = el->getOutputAt8(1); + + if ((chainLen > 0) && (iJtagID == 0x89)) + { + // Return the protocol + return 0; + } + } + } + return -1; +} + + +bool ConfigManager::reset(bool vcc, bool nmi, uint16_t JtagId, uint32_t rstHalId) +{ + if (jtagIdIsXv2(JtagId) || deviceCode == 0x20404020) + { + if (vcc) + { + uint16_t voltage = this->getDeviceVcc(); + if (!this->setDeviceVcc(0)) + { + return false; + } + // keep voltage 0 for minmum 5 seconds + this_thread::sleep_for(chrono::seconds(5)); + + if (!this->setDeviceVcc(voltage)) + { + return false; + } + this->start(); + } + + if (vcc || nmi) + { + hal_id resetMacro; + if (deviceCode == 0x20404020) + { + resetMacro = ID_Reset430I; + } + else if (deviceCode == 0xA55AA55A || deviceCode == 0x5AA55AA5) + { + resetMacro = ID_ResetL092; + } + else + { + resetMacro = (hal_id)rstHalId; + } + + HalExecElement* el = new HalExecElement(resetMacro); + if (deviceCode == 0xA55AA55A || deviceCode == 0x5AA55AA5) + { + el->appendInputData32(deviceCode); + } + + HalExecCommand cmd; + cmd.setTimeout(10000); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + } + } + else + { + /* for all other CPU architectures we just toggle the RST pint to create a BOR */ + if (nmi) + { + list pinStates; + pinStates.push_back( PinState(JTAG_PIN_SELTST, false)(JTAG_PIN_RST, false).setDelay(10) ); + pinStates.push_back( PinState(JTAG_PIN_SELTST, false)(JTAG_PIN_RST, true) ); + if (!sendPinSequence(pinStates, parent)) + { + return false; + } + } + if (vcc) + { + uint16_t voltage = this->getDeviceVcc(); + if (!this->setDeviceVcc(0)) + { + return false; + } + // keep voltate 0 for minmum 5 seconds + this_thread::sleep_for(chrono::seconds(5)); + if (!this->setDeviceVcc(voltage)) + { + return false; + } + } + } + return true; +} + +void ConfigManager::setCurrentDrive(uint32_t value) +{ + if (value) + { + const uint16_t ENERGYTRACE_FINE_MODE = 0x8000; + mhighres = ENERGYTRACE_FINE_MODE; + } + else + { + mhighres = 0; + } +} + +void ConfigManager::setEnergyTraceManager(EnergyTraceManager * etm) +{ + mEnergyTraceManager = etm; +} + + +bool ConfigManager::setVccEzFet(uint16_t vcc) +{ + #ifndef NDEBUG + printf("VCC in[mV]: %i\n", vcc); + #endif + + if (vcc) + { + uint16_t actualVcc = 0; + //calculate VCC to configure sub mcu. + for (uint16_t i = 0 ; i < 4; i++) + { + actualVcc += this->getDeviceVcc(); + } + actualVcc = actualVcc / 4; + + actualVcc = ((actualVcc + 50) / 100) * 100; + + if (actualVcc > 3600) + { + actualVcc = 3600; + } + + if (actualVcc < 1800) + { + actualVcc = 1800; + } + + // send VCC set comand to SubMco + HalExecElement* el = new HalExecElement(ID_Zero, dcdcSetVcc); + el->appendInputData16(actualVcc); // mhighres Added for high resolution mode --> default 0; + + HalExecCommand dcdcCmd; + dcdcCmd.elements.emplace_back(el); + if (!this->parent->send(dcdcCmd)) + { + return false; + } + + // now run calibration to support Energy Trace + if (mEnergyTraceManager) + { + // Cut the power switch to the target first before doing calibration + HalExecElement* el = new HalExecElement(ID_Zero, coreSwitchFet); + el->appendInputData16(ALL_OFF); + HalExecCommand dcdcCmd; + dcdcCmd.elements.emplace_back(el); + dcdcCmd.setTimeout(15000); + if (!this->parent->getControl()->send(dcdcCmd)) + { + return false; + } + + this->mEnergyTraceManager->doCalibration(actualVcc); + } + // then send power on command to hil module to switch MOSFET + el = new HalExecElement(ID_Zero, coreSwitchFet); + el->appendInputData16(LDO_ON); + HalExecCommand hilCmd; + hilCmd.elements.emplace_back(el); + hilCmd.setTimeout(15000); + if (!this->parent->send(hilCmd)) + { + return false; + } + this->vcc = actualVcc; + + #if defined(_WIN32) || defined(_WIN64) || defined(__APPLE__) + if (vcc) + { + this_thread::sleep_for(chrono::milliseconds(500)); + } + #else + this_thread::sleep_for(chrono::milliseconds(1000)); + #endif + + } + else // just shutdown voltage + { + // then send power on command to hil module to switch MOSFET + HalExecElement* el = new HalExecElement(ID_Zero, coreSetVcc); + el->appendInputData16(0); + + HalExecCommand hilCmd; + hilCmd.elements.emplace_back(el); + if (!this->parent->send(hilCmd)) + { + return false; + } + + // Send power down comand to Sub mcu Firmware + el = new HalExecElement(ID_Zero, dcdcPowerDown); + + HalExecCommand dcdcCmd; + dcdcCmd.elements.emplace_back(el); + if (!this->parent->send(dcdcCmd)) + { + return false; + } + } + return true; +} + +bool ConfigManager::setVccMspFET(uint16_t vcc) +{ + HalExecCommand cmd; + HalExecElement* el; + + el = new HalExecElement(ID_Zero, coreSwitchFet); + el->appendInputData16(0); + cmd.elements.emplace_back(el); + cmd.setTimeout(15000); + if (!this->parent->send(cmd)) + { + return false; + } + + if (vcc) + { + // send VCC set command to SubMcu - configure PWM pulses + el = new HalExecElement(ID_Zero, dcdcSetVcc); + el->appendInputData16(vcc); + cmd.setTimeout(10000); + cmd.elements.clear(); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + + el = new HalExecElement(ID_Zero, coreSetVcc); + el->appendInputData16(vcc); + cmd.elements.clear(); + cmd.setTimeout(10000); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + + #if defined(_WIN32) || defined(_WIN64) || defined(__APPLE__) + this_thread::sleep_for(chrono::milliseconds(100)); + #else + this_thread::sleep_for(chrono::milliseconds(700)); + #endif + + // now run calibration to support Energy Trace + if (mEnergyTraceManager) + { + this->mEnergyTraceManager->doCalibration(vcc); + } + // then send power on command to hil module to switch MOSFET + el = new HalExecElement(ID_Zero, coreSwitchFet); + el->appendInputData16(1); + cmd.elements.clear(); + cmd.setTimeout(10000); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + } + else // just shotdown voltate + { + el = new HalExecElement(ID_Zero, coreSetVcc); + el->appendInputData16(vcc); + cmd.elements.clear(); + cmd.setTimeout(10000); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + #if defined(_WIN32) || defined(_WIN64) || defined(__APPLE__) + this_thread::sleep_for(chrono::milliseconds(100)); + #else + this_thread::sleep_for(chrono::milliseconds(700)); + #endif + + // Send power down command to Sub mcu Firmware + el = new HalExecElement(ID_Zero, dcdcPowerDown); + cmd.elements.clear(); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + } + return true; +} + +bool ConfigManager::setVccMspFetUif(uint16_t vcc) +{ + HalExecCommand cmd; + #ifndef NDEBUG + printf("VCC in[mV]: %i\n", vcc); + #endif + HalExecElement* el = new HalExecElement(ID_SetVcc); + el->appendInputData16(vcc); + cmd.elements.emplace_back(el); + cmd.setTimeout(5000); + if (!this->parent->send(cmd)) + { + return false; + } + this->vcc = vcc; + + #if defined(_WIN32) || defined(_WIN64) || defined(__APPLE__) + if (vcc) + { + this_thread::sleep_for(chrono::milliseconds(1000)); + } + #else + this_thread::sleep_for(chrono::milliseconds(2500)); + #endif + return true; +} + +bool ConfigManager::setDeviceVcc (uint16_t vcc) +{ + FetControl * control=this->parent->getControl(); + if (control->getFetToolId() == eZ_FET_WITH_DCDC + || control->getFetToolId() == eZ_FET_WITH_DCDC_NO_FLOWCT + || control->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + return setVccEzFet(vcc); + } + else if (control->getFetToolId() == eZ_FET_NO_DCDC) + { + // fixed LDO voltage, No power switch + return true; + } + else if (control->getFetToolId() == MSP_FET_WITH_DCDC || control->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + return setVccMspFET(vcc); + } + else if (control->getFetToolId() == MSP_FET430) + { + return setVccMspFetUif(vcc); + } + return false; +} + +uint16_t ConfigManager::getDeviceVcc () const +{ + HalExecCommand cmd; + FetControl * control = this->parent->getControl(); + HalExecElement* el; + if (control->getFetToolId() != MSP_FET430) + { + el = new HalExecElement(ID_Zero, coreGetVcc); + } + else + { + el = new HalExecElement(ID_GetVcc); + } + + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return 0; + } + return el->getOutputAt16(0); +} + +uint16_t ConfigManager::getExternalVcc () const +{ + HalExecCommand cmd; + FetControl * control = this->parent->getControl(); + HalExecElement* el; + if (control->getFetToolId() != MSP_FET430) + { + el = new HalExecElement(ID_Zero, coreGetVcc); + } + else + { + el = new HalExecElement(ID_GetVcc); + } + + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + return 0; + + return el->getOutputAt16(2); +} + +bool ConfigManager::configureOverCurrent(bool state) +{ + FetControl * control=this->parent->getControl(); + if (control->getFetToolId() != MSP_FET430) + { + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(ID_Zero, CmdOverCurrent); + el->appendInputData8(state); + cmd.elements.emplace_back(el); + if (!this->parent->send(cmd)) + { + return false; + } + } + return true; +} + +void ConfigManager::setDisableInterruptsMode(uint32_t mode) +{ + disableInterruptsMode = mode; +} + +uint32_t ConfigManager::getDisableInterruptsMode() const +{ + return disableInterruptsMode; +} + +bool ConfigManager::updateDisableInterruptsMode() +{ + if (disableInterruptsMode == disableInterruptsModeBackup) + { + return true; + } + + HalExecElement* el = new HalExecElement(ID_Configure); + el->appendInputData32(CONFIG_PARAM_INTERRUPT_OPTIONS); + el->appendInputData32(disableInterruptsMode); + + HalExecCommand configCmd; + configCmd.elements.emplace_back(el); + + if (this->parent->send(configCmd)) + { + disableInterruptsModeBackup = disableInterruptsMode; + return true; + } + + return false; +} + +bool ConfigManager::setJTAGLock5xx(uint32_t value) +{ + HalExecElement* el = new HalExecElement(ID_Configure); + el->appendInputData32(CONFIG_PARAM_JTAG_LOCK_5XX); + el->appendInputData32(value); + + HalExecCommand configCmd; + configCmd.elements.emplace_back(el); + + if (this->parent->send(configCmd)) + { + return true; + } + + return false; +} + +bool ConfigManager::firmWareUpdate(const char* fname, UpdateNotifyCallback callback, bool* coreUpdate) +{ + return this->updateManagerFet->firmWareUpdate(fname, callback, coreUpdate); +} + +void ConfigManager::setPassword(const string& pwd) +{ + this->password = pwd; +} + +bool ConfigManager::setDeviceCode(uint32_t deviceCode) +{ + this->deviceCode = deviceCode; + return true; +} + +bool ConfigManager::freqCalibrationEnabled() const +{ + return freqCalibration; +} + +bool ConfigManager::ulpDebugEnabled() const +{ + return ulpDebug; +} + +bool ConfigManager::atProbeStateEnabled() const +{ + return atProbeState; +} + +void ConfigManager::setUlpDebug(bool ulp) +{ + ulpDebug = ulp; + + if (arch == MSP432_M4) + { + HalExecElement* el = new HalExecElement(ID_Configure); + el->appendInputData32(CONFIG_PARAM_ULP_MSP432); + el->appendInputData32(ulp); + + HalExecCommand configCmd; + configCmd.elements.emplace_back(el); + parent->send(configCmd); + } +} diff --git a/DLL430_v3/src/TI/DLL430/ConfigManager.h b/DLL430_v3/src/TI/DLL430/ConfigManager.h new file mode 100644 index 0000000..9abc4e4 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/ConfigManager.h @@ -0,0 +1,129 @@ +/* + * ConfigManager.h + * + * Functionality for configuring target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + + +#include "IConfigManager.h" +#include "HalExecCommand.h" + +namespace TI +{ + namespace DLL430 + { + class FetHandle; + class IUpdateManager; + class FetHandleManager; + class EnergyTraceManager; + + class ConfigManager : public IConfigManager + { + public: + ConfigManager(FetHandle*, FetHandleManager*, TARGET_ARCHITECTURE_t arch); + ~ConfigManager(); + + ConfigManager(const ConfigManager&) = delete; + ConfigManager& operator=(const ConfigManager&) = delete; + + void init(); + + VersionInfo getHalVersion() const; + + bool isUpdateRequired(TARGET_ARCHITECTURE_t arch) const; + + bool setDeviceVcc(uint16_t vcc); + + uint16_t getDeviceVcc() const; + + void setJtagMode(enum INTERFACE_TYPE mode); + INTERFACE_TYPE getInterfaceMode(TARGET_ARCHITECTURE_t arch) const; + uint16_t getExternalVcc() const; + int16_t start(); + int16_t start(const std::string& pwd, uint32_t deviceCode); + bool stop(); + + bool reset(bool vcc, bool nmi, uint16_t JtagId, uint32_t rstHalId); + + bool firmWareUpdate(const char * fname, UpdateNotifyCallback callback, bool* coreUpdate); + + void setPassword(const std::string& pwd); + bool setDeviceCode(uint32_t deviceCode); + bool setJtagSpeed(JTAG_4WIRE_SPEED speedJtag, JTAG_2WIRE_SPEED speedSbw); + bool jtagErase(uint16_t eraseKey); + void setEnergyTraceManager(EnergyTraceManager*); + bool isEnergyTraceSupported(); + void setCurrentDrive(uint32_t value); + bool configureJtagSpeed(uint32_t speed); + + bool freqCalibrationEnabled() const; + bool ulpDebugEnabled() const; + bool atProbeStateEnabled() const; + void setUlpDebug(bool ulp); + long MSP430I_MagicPattern(uint16_t ifMode); + + bool configureOverCurrent(bool state); + + void setDisableInterruptsMode(uint32_t mode); + uint32_t getDisableInterruptsMode() const; + bool updateDisableInterruptsMode(); + bool setJTAGLock5xx(uint32_t value); + + private: + bool setVccEzFet(uint16_t vcc); + bool setVccMspFetUif(uint16_t vcc); + bool setVccMspFET(uint16_t vcc); + + FetHandle* parent; + IUpdateManager* updateManagerFet; + uint16_t vcc; + enum INTERFACE_TYPE mode; + EnergyTraceManager* mEnergyTraceManager; + + HalExecCommand updateCmd; + + std::string password; + uint32_t deviceCode; + uint32_t mhighres; + bool freqCalibration; + bool ulpDebug; + bool atProbeState; + TARGET_ARCHITECTURE_t arch; + uint32_t disableInterruptsMode; + uint32_t disableInterruptsModeBackup; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/ConfigManagerV3.cpp b/DLL430_v3/src/TI/DLL430/ConfigManagerV3.cpp deleted file mode 100644 index c45bebd..0000000 --- a/DLL430_v3/src/TI/DLL430/ConfigManagerV3.cpp +++ /dev/null @@ -1,995 +0,0 @@ -/* - * ConfigManagerV3.cpp - * - * Functionality for configuring target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include - -#include "FetHandleV3.h" -#include "ConfigManagerV3.h" -#include "DeviceDbManagerExt.h" -#include "DeviceInfo.h" -#include "HalExecCommand.h" -#include "FetControl.h" -#include "WatchdogControl.h" -#include "Record.h" - -#include - -#include -#include -#include - -#include "../../Bios/include/UifHal.h" -#include "../../Bios/include/Core.h" -#include "../../Bios/include/ConfigureParameters.h" - -using namespace TI::DLL430; -using namespace std; - -ConfigManagerV3::ConfigManagerV3 (FetHandleV3* parent) - : parent(parent) - , vcc(0) - , mode(ConfigManager::JTAG_MODE_4WIRE) - , deviceCode(0) - , freqCalibration(true) -{ - updateCmd.setTimeout(20000); -} - -ConfigManagerV3::~ConfigManagerV3 () -{ - FetControl * control=this->parent->getControl(); - - // send reset command to FET - if((control != NULL)&&(control->hasCommunication())) - { - this->stop(); - - std::vector data; - data.push_back(0x03); - data.push_back(0x92); - data.push_back(0x00); - data.push_back(0x00); - } -} - -bool ConfigManagerV3::init () -{ - string tag; - string value; - - // read configuration for JTAG speed EDT trace.... - JTAG_4WIRE_SPEED jtagSpeed = JTAG_4WIRE_SPEED_8_MHZ; - ifstream DllV3Ini("MSP430DLL.INI"); - while (DllV3Ini && !DllV3Ini.eof()) - { - DllV3Ini >> tag >> value; - - if (tag == "JTAG_SPEED") - { - if (value == "JTAG_4WIRE_SPEED_8_MHZ") - { - jtagSpeed = JTAG_4WIRE_SPEED_8_MHZ; - } - if (value == "JTAG_4WIRE_SPEED_4_MHZ") - { - jtagSpeed = JTAG_4WIRE_SPEED_4_MHZ; - } - if (value == "JTAG_4WIRE_SPEED_2_MHZ") - { - jtagSpeed = JTAG_4WIRE_SPEED_2_MHZ; - } - if (value == "JTAG_4WIRE_SPEED_1_MHZ") - { - jtagSpeed = JTAG_4WIRE_SPEED_1_MHZ; - } - if (value == "JTAG_4WIRE_SPEED_500_KHZ") - { - jtagSpeed = JTAG_4WIRE_SPEED_500_KHZ; - } - if (value == "JTAG_4WIRE_SPEED_250_KHZ") - { - jtagSpeed = JTAG_4WIRE_SPEED_250_KHZ; - } - } - - if (tag == "DCO_CALIBRATION") - { - freqCalibration = (value != "OFF"); - } - } - this->setJtagSpeed(jtagSpeed); - return true; -} - -VersionInfo ConfigManagerV3::getBiosVersion() const -{ - std::vector * sw_info=this->parent->getSwVersion(); - - if (sw_info==NULL) - return VersionInfo(0, 0, 0, 0); - - if (sw_info->size()<4) - return VersionInfo(0, 0, 0, 0); - - unsigned char major=sw_info->at(1); - return VersionInfo((((major&0xC0)>>6)+1),(major&0x3f),sw_info->at(0), - (sw_info->at(3)<<8)+sw_info->at(2)); -} - -bool ConfigManagerV3::checkCoreVersion() -{ - FetControl * control=this->parent->getControl(); - - //get current core version from FET - const uint16_t actualFetCoreVersion = control->getFetCoreVersion(); - uint16_t expectedFetCoreVersion = 0; - - Record fetCoreImage(coreImage, coreImage_address, coreImage_length_of_sections, coreImage_sections); - //get core version from image (core version is stored in address 0xFDD8) - if(fetCoreImage.getWordAtAdr(0xFDD8, &expectedFetCoreVersion)) - { - //if core versions do not match, update core - if(expectedFetCoreVersion != actualFetCoreVersion) - { - return false; - } - } - return true; -} - -void ConfigManagerV3::setJtagMode (enum ConfigManager::jtagMode mode) -{ - this->mode = mode; -} - -uint16_t ConfigManagerV3::start() -{ - return this->start(password, deviceCode); -} - -bool ConfigManagerV3::totalErase() -{ - if(this->start() != 0x1) - { - return false; - } - HalExecCommand cmd; - //HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - //el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - //cmd.elements.push_back(el); - HalExecElement* el = new HalExecElement(ID_SendJtagMailboxXv2); - el->appendInputData16(0x11); - el->appendInputData16(0xA55A); - el->appendInputData16(0x1B1B); - el->appendInputData16(0x1); - cmd.elements.push_back(el); - - if (!this->parent->send(cmd)) - { - return false; - } - - /* assert hard RST/NMI and feed in magic pattern to stop device execution */ - /* thr RST/NMI will remove the register protection */ - if(!this->reset(false, 10, 0x99)) - { - return false; - } - /* restart jtag connection and if needed feed in JTAG passowrd */ - if(this->start() != 0x1) - { - return false; - } - return true; -} - -uint16_t AsciToHex(const char* password) -{ - uint16_t usTemp =0; - - for( int i = 3 ; i >= 0; i--) - { - char TempLetterToDig = password[i]; - TempLetterToDig = toupper(TempLetterToDig); - if(TempLetterToDig >= 'A' && TempLetterToDig <= 'F') - { - usTemp |= (int)(TempLetterToDig - 7 - '0') << (12-(i*4)); - } - else - { - usTemp |= (int)(TempLetterToDig - '0') << (12-(i*4)); - } - } - return usTemp; -} - -ConfigManager::jtagMode ConfigManagerV3::getInterfaceMode () const -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_GetInterfaceMode); - - el->setOutputSize(4); - cmd.elements.push_back(el); - - if (!this->parent->send(cmd)) - { - return JTAG_MODE_UNDEF; - } - uint16_t jtagID = el->getOutputAt16(0); - uint16_t ifMode = el->getOutputAt16(2); - if (jtagID == 0xFFFF) - { - return JTAG_MODE_UNDEF; - - } - switch (ifMode) - { - case 0: // JTAG Mode - return JTAG_MODE_4WIRE; - case 1: // SBW2 Mode - return JTAG_MODE_SPYBIWIRE; - case 2: // SBW4 Mode - return JTAG_MODE_4AFTER2; - default: - return JTAG_MODE_UNDEF; - } - return JTAG_MODE_UNDEF; -} - -uint16_t ConfigManagerV3::start(const string& pwd, uint32_t deviceCode) -{ - uint8_t numOfDevices = 0; - //#words in hex, ie. #characters / 4 - const uint16_t pwLength = (uint16_t)pwd.length() / 4; - - // if we have an L092 Rom device - if (deviceCode == 0xDEADBABE) - { - if (pwLength > 4) - { - return 0; - } - - HalExecElement* el = new HalExecElement(ID_UnlockC092); - el->appendInputData16(pwLength); - - const char* pwdinternal = pwd.c_str(); - for (uint16_t i = 0; i < pwLength; i++) - { - uint16_t hexWord = AsciToHex(pwdinternal); - el->appendInputData16(hexWord); - pwdinternal += 4; - } - - el->setOutputSize(1); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - if (!this->parent->send(cmd)) - { - return 0; - } - numOfDevices = 1; - return numOfDevices; - } - // if we have an L092 device - if(deviceCode == 0xA55AA55A|| deviceCode == 0x5AA55AA5) - { - HalExecElement* el = new HalExecElement(ID_StartJtagActivationCode); - - el->appendInputData8(0); - el->appendInputData8(0); - el->appendInputData32(deviceCode); - - el->setOutputSize(1); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - if (!this->parent->send(cmd)) - { - return 0; - } - numOfDevices = 1; - return numOfDevices; - } - // if we have a device locked with a custom password - if ( !pwd.empty() ) - { - if (pwLength > 60) - { - return 0; - } - - HalExecElement* el = new HalExecElement(ID_UnlockDeviceXv2); - switch (this->mode) - { - case ConfigManager::JTAG_MODE_4WIRE: - el->appendInputData16(0); - break; - case ConfigManager::JTAG_MODE_SPYBIWIRE: - el->appendInputData16(1); - break; - case ConfigManager::JTAG_MODE_4AFTER2: - el->appendInputData16(2); - break; - default: - delete el; - return 0; - } - - el->appendInputData16(pwLength); - - const char* pwdinternal = pwd.c_str(); - for (uint16_t i = 0; i < pwLength; i++) - { - const uint16_t hexWord = AsciToHex(pwdinternal); - el->appendInputData16(hexWord); - pwdinternal += 4; - } - - el->setOutputSize(2); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - if (!this->parent->send(cmd)) - { - return 0; - } - #ifndef NDEBUG - printf("Unlock device\n"); - #endif - - numOfDevices = 1; - return numOfDevices; - } - // if we have a "normal" msp430 device without special handling - if((deviceCode != 0xA55AA55A && deviceCode != 0x5AA55AA5) || deviceCode == 0x80058005) - { - HalExecCommand startJtag; - HalExecElement* e2 = new HalExecElement(ID_StartJtag); - switch (this->mode) { - case ConfigManager::JTAG_MODE_4WIRE: - e2->appendInputData8(0); - break; - case ConfigManager::JTAG_MODE_SPYBIWIRE: - e2->appendInputData8(1); - break; - case ConfigManager::JTAG_MODE_4AFTER2: - e2->appendInputData8(2); - break; - default: - delete e2; - return 0; - } - e2->setOutputSize(1); - startJtag.elements.push_back(e2); - if (!this->parent->send(startJtag)) - { - return 0; - } - numOfDevices = startJtag.elements.at(0).getOutputAt8(0); - #ifndef NDEBUG - printf("num of devices %i\n",numOfDevices); - #endif - return numOfDevices; - } - return 0; -} - -bool ConfigManagerV3::setJtagSpeed(JTAG_4WIRE_SPEED speed) -{ - HalExecElement* el = new HalExecElement(ID_Configure); - el->appendInputData32(CONFIG_PARAM_JTAG_SPEED); - el->appendInputData32(speed); - el->setOutputSize(0); - - HalExecCommand configCmd; - configCmd.elements.push_back(el); - return !this->parent->send(configCmd); -} - -bool ConfigManagerV3::stop () -{ - HalExecCommand stopJtag; - stopJtag.elements.push_back(new HalExecElement(ID_StopJtag)); - return this->parent->send(stopJtag); -} - -bool ConfigManagerV3::reset (bool vcc, uint16_t pin, uint16_t JtagId) -{ - //Bit definition: - // Bit 0 - TMS - // Bit 1 - TDI - // Bit 2 - TDO (writing this bit has no effect since its an input) - // Bit 3 - TCK - // Bit 4 - ------ - // Bit 5 - SELT# - // Bit 6 - TGTRST - // Bit 7 - ------ - // Bit 8 - ------ - // Bit 9 - ------ - // Bit 10- ------ - // Bit 11- ------ - // Bit 12- ------ - // Bit 13- ------ - // Bit 14- ------ - // Bit 15- ------ - /* For the CPUxV2 (5xx and higher) we use the JTAG mailbox, that no user code is executed after a RST/NMI or VCC RST */ - if (JtagId != 0x89) - { - if (pin != 0) - { - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_ResetXv2); - cmd.elements.push_back(el); - if (!this->parent->send(cmd)) - { - return false; - } - } - if (vcc) - { - uint16_t voltage = this->getDeviceVcc(); - if (!this->setDeviceVcc(0)) - { - return false; - } - // keep voltate 0 for minmum 5 seconds - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(5)); - - if (!this->setDeviceVcc(voltage)) - { - return false; - } - this->start(); - - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_ResetXv2); - cmd.elements.push_back(el); - if (!this->parent->send(cmd)) - { - return false; - } - } - return true; - } - else - { - /* for all other CPU architectures we just toggle the RST pint to create a BOR */ - if (pin != 0) - { - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_BitSequence); - el->appendInputData8(2); - el->appendInputData16(0); //Both pins zero - el->appendInputData16(3 << 5); //SELT# and RST pin - el->appendInputData16(pin); - el->appendInputData16(1 << 6); //RST pin - el->appendInputData16(3 << 5); //SELT# and RST pin - el->appendInputData16(0); - cmd.elements.push_back(el); - if (!this->parent->send(cmd)) - { - return false; - } - } - if (vcc) - { - uint16_t voltage = this->getDeviceVcc(); - if (!this->setDeviceVcc(0)) - { - return false; - } - // keep voltate 0 for minmum 5 seconds - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(5)); - if (!this->setDeviceVcc(voltage)) - { - return false; - } - } - return true; - } -} - -bool ConfigManagerV3::setDeviceVcc (uint16_t vcc) -{ - HalExecCommand cmd; -#ifndef NDEBUG - printf("VCC in[mV]: %i\n",vcc); -#endif - HalExecElement* el = new HalExecElement(ID_SetVcc); - el->appendInputData16(vcc); - el->setInputMinSize(2); - cmd.elements.push_back(el); - if (!this->parent->send(cmd)) - { - return false; - } - this->vcc = vcc; -#ifndef NDEBUG - printf("VCC out[mV]: %i\n",this->getDeviceVcc ()); -#endif - if(vcc) - { - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(1000)); - } -#ifndef NDEBUG - printf("VCC out[mV]: %i\n",this->getDeviceVcc ()); -#endif - return true; -} - -uint16_t ConfigManagerV3::getDeviceVcc () const -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_GetVcc); - el->setOutputSize(4); - cmd.elements.push_back(el); - if (!this->parent->send(cmd)) - return 0; - - return el->getOutputAt16(0); -} - -uint16_t ConfigManagerV3::getExternalVcc () const -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_GetVcc); - el->setOutputSize(4); - cmd.elements.push_back(el); - if (!this->parent->send(cmd)) - return 0; - - return el->getOutputAt16(2); -} - - -bool ConfigManagerV3::firmWareUpdate(const char *fname, FetNotifyCallback callback) -{ - FetControl * control=this->parent->getControl(); - - if (control == NULL) - return false; - - std::string serial = control->getSerial(); - - const uint32_t biosVersion = getBiosVersion().get(); - - // core/HAL communication has changed with version 3.2.0.8 - // and after HAL update the core/HAL communication would not work - // do not update as long as there is no direct core update - if ((biosVersion > 30200000) && (biosVersion < 30200008) && (fname == NULL)) - { - printf("This version need a core update\n"); - printf("Please check release documentation\n"); - return false; - } - - bool doCoreUpdate=false; - - //get current core version from FET - const uint16_t actualFetCoreVersion = control->getFetCoreVersion(); - uint16_t expectedFetCoreVersion = 0; - - Record fetCoreImage(coreImage, coreImage_address, coreImage_length_of_sections, coreImage_sections); - //get core version from image (core version is stored in address 0xFDD8) - if (fetCoreImage.getWordAtAdr(0xFDD8, &expectedFetCoreVersion)) - { - //if core versions do not match, update core - if (expectedFetCoreVersion != actualFetCoreVersion) - { - doCoreUpdate=true; - } - } - - // core will be updated through internal image - if (doCoreUpdate) - { - if (callback) - { - callback(BL_INIT,0,0); - } - if (!this->upInit(1)) - { - return false; - } - if (callback) - { - callback(BL_ERASE_FIRMWARE,0,0); - } - if (!this->upCoreErase()) - { - return false; - } - if (callback) - { - callback(BL_PROGRAM_FIRMWARE,0,0); - } - if (!this->upCoreWrite()) - { - return false; - } - if (!this->upCoreRead()) - { - return false; - } - if (callback) - { - callback(BL_EXIT,0,0); - } - - // create 0x55 command erase signature - // command forces safecore to search for new core on reset - std::vector data_55; - data_55.push_back(0x03); - data_55.push_back(0x55); - uint8_t id=control->createResponseId(); - data_55.push_back(id); - data_55.push_back(0x00); - - control->sendData(data_55); - control->clearResponse(); - - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(8)); - } - - FileFuncImpl firmware; - - if (fname) - { - //Do not allow using a file if there is no valid HAL on the UIF - if ((biosVersion < 20000000) || !firmware.readFirmware(fname)) - { - return false; - } - } - else - { - firmware.readFirmware(halImage, halImage_address, halImage_length_of_sections, halImage_sections); - } - - if ((firmware.getNumberOfSegments())==0) - return false; - - // start HAL update routine - if (callback) - { - callback(BL_INIT,0,0); - } - if (!this->upInit(1)) - { - return false; - } - if (callback) - { - callback(BL_ERASE_FIRMWARE,0,0); - } - if (!this->upErase(firmware)) - { - return false; - } - if (callback) - { - callback(BL_PROGRAM_FIRMWARE,0,0); - } - if (!this->upWrite(firmware, callback)) - { - return false; - } - if (callback) - { - callback(BL_EXIT,0,0); - } - if (!this->upInit(0)) - { - return false; - } - - parent->getControl()->resetCommunication(); - parent->getControl()->setObjectDbEntry(0); - - // activate the new HAL (in case of downgrade: change to VCP) - HalExecCommand initCmd; - HalExecElement* el = new HalExecElement(ID_Init); - initCmd.elements.push_back(el); - - const bool initFailed = !this->parent->send(initCmd); - - // give the firmware time to execute initialisation - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(1)); - - //Only an error if no user specified file is used (ie. init will fail for a downgrade) - if (initFailed && !fname) - { - return false; - } - - if (!initFailed) - { - //Perform a reset to make sure everything is correctly initialized - HalExecElement* el = new HalExecElement(ID_Zero); - el->appendInputData8(STREAM_CORE_ZERO_PUC_RESET); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - parent->send(cmd); - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(2)); - - if(callback) - callback(BL_UPDATE_DONE,0,0); - } - - return true; -} - -bool ConfigManagerV3::upInit(unsigned char level) -{ - HalExecElement* el = new HalExecElement(ID_Zero, UpInit); - el->setAddrFlag(false); - el->appendInputData8(level); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - return this->parent->send(cmd); -} - -bool ConfigManagerV3::upErase(const FileFuncImpl& firmware) -{ - for (size_t i = 0; i < firmware.getNumberOfSegments(); ++i) - { - const DownloadSegment *seg = firmware.getFirmwareSeg(i); - if (seg == NULL) - return false; - - HalExecElement* el = new HalExecElement(ID_Zero, UpErase); - el->setAddrFlag(false); - el->appendInputData32(seg->startAddress&0xfffffffe); - el->appendInputData32(seg->size); - - updateCmd.elements.clear(); - updateCmd.elements.push_back(el); - if (!this->parent->send(updateCmd)) - { - return false; - } - } - return true; -} - -bool ConfigManagerV3::upWrite(const FileFuncImpl& firmware, FetNotifyCallback callback) -{ - uint32_t percent = 100/(uint32_t)firmware.getNumberOfSegments(); - - for (size_t i = 0; i < firmware.getNumberOfSegments(); ++i) - { - if (callback) - callback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)i*percent, 0); - - const DownloadSegment *seg = firmware.getFirmwareSeg(i); - - if (seg == NULL) - return false; - - // create Core telegram -> update write - HalExecElement* el = new HalExecElement(ID_Zero, UpWrite); - // no HAL id needed for update - el->setAddrFlag(false); - - const uint32_t padding = seg->size % 2; - const uint32_t data2send = seg->size + padding; - - // add address data - el->appendInputData32(seg->startAddress&0xfffffffe); - el->appendInputData32(data2send); - - // add update data - for (uint32_t n=0; n < seg->size; n++) - el->appendInputData8(seg->data[n] & 0xff); - - for (uint32_t p=0 ; p < padding; p++) - el->appendInputData8(0xff); - - updateCmd.elements.clear(); - updateCmd.elements.push_back(el); - if (!this->parent->send(updateCmd)) - { - return false; - } - } - if(callback) - callback(BL_DATA_BLOCK_PROGRAMMED,100,0); - - return true; -} - - -bool ConfigManagerV3::upRead(const FileFuncImpl& firmware) -{ - for (size_t i = 0; i < firmware.getNumberOfSegments(); ++i) - { - const DownloadSegment *seg = firmware.getFirmwareSeg(i); - if ( seg == NULL ) - return false; - - const uint32_t padding = seg->size % 2; - const uint32_t data2receive = seg->size + padding; - - updateCmd.elements.clear(); - - HalExecElement* el = new HalExecElement(ID_Zero, UpRead); - // no HAL id needed for update - el->setAddrFlag(false); - el->appendInputData32(seg->startAddress&0xfffffffe); - el->appendInputData32(data2receive); - - updateCmd.elements.push_back(el); - if (!this->parent->send(updateCmd)) - return false; - - for (size_t j = 0; j < seg->size; ++j) - { - if ( el->getOutputAt8(j) != seg->data[j] ) - return false; - } - } - return true; -} - -bool ConfigManagerV3::upCoreErase() -{ - //create erase command - updateCmd.elements.clear(); - HalExecElement* el = new HalExecElement(ID_Zero, UpErase); - el->setAddrFlag(false); - //append start address and length in bytes - el->appendInputData32(0x2500); - el->appendInputData32(0xbb00); - - updateCmd.elements.push_back(el); - return this->parent->send(updateCmd); -} - -bool ConfigManagerV3::upCoreWrite() -{ - Record fetCoreImage(coreImage, coreImage_address, coreImage_length_of_sections, coreImage_sections); - - updateCmd.elements.clear(); - HalExecElement* el = new HalExecElement(ID_Zero, UpWrite); - el->setAddrFlag(false); - //append flash start-address where following data will be flashed to - el->appendInputData32(0x2500); - //append number of data bytes, including number of sections ,section start addresses and core signature - el->appendInputData32((fetCoreImage.getNumOfAllDataWords() + fetCoreImage.getNumOfManageWords(true))*2); - //append core signature - el->appendInputData32(Record::coreSignature); - //append number of sections - el->appendInputData16( (uint16_t) fetCoreImage.getSectCount()); - - while(fetCoreImage.hasNextSect()) - { - //append start address and length information of each section - el->appendInputData16( (uint16_t) fetCoreImage.getSectStartAdr()); - el->appendInputData16( (uint16_t) fetCoreImage.getSectLength()); - - while(fetCoreImage.sectHasNextWord()) - { - el->appendInputData16(fetCoreImage.getNextWord()); - } - fetCoreImage.nextSection(); - } - updateCmd.elements.push_back(el); - return this->parent->send(updateCmd); -} - -//reads back flashed core data and compares it to data in core image -//returns: true, if data on FET and core image are equal -bool ConfigManagerV3::upCoreRead() -{ - Record fetCoreImage(coreImage, coreImage_address, coreImage_length_of_sections, coreImage_sections); - - updateCmd.elements.clear(); - HalExecElement* el = new HalExecElement(ID_Zero, UpRead); - el->setAddrFlag(false); - //append start address for read access - el->appendInputData32(0x2500); - //append number of data bytes, including number of sections ,section start addresses and core signature - el->appendInputData32((fetCoreImage.getNumOfAllDataWords() + fetCoreImage.getNumOfManageWords(true))*2); - updateCmd.elements.push_back(el); - - if (!this->parent->send(updateCmd)) - { - return false; - } - //compare core signature - if (el->getOutputAt32(0) != Record::coreSignature) - { - return false; - } - //compare number of sections - if(el->getOutputAt16(4) != fetCoreImage.getSectCount()) - { - return false; - } - uint32_t overhead = 6; - - //compare data of current section, including start adress and length - while(fetCoreImage.hasNextSect()) - { - if(el->getOutputAt16(fetCoreImage.getCurrentPosByte()-2 + overhead) != fetCoreImage.getSectStartAdr()) - { - return false; - } - overhead += 2; - if(el->getOutputAt16(fetCoreImage.getCurrentPosByte()-2 + overhead) != fetCoreImage.getSectLength()) - { - return false; - } - overhead += 2; - - while(fetCoreImage.sectHasNextWord()) - { - if(el->getOutputAt16(fetCoreImage.getCurrentPosByte()-2 + overhead) != fetCoreImage.getNextWord()) - { - return false; - } - } - fetCoreImage.nextSection(); - } - - return true; -} - -void ConfigManagerV3::setPassword(const string& pwd) -{ - this->password = pwd; -} - -bool ConfigManagerV3::setDeviceCode(uint32_t deviceCode) -{ - this->deviceCode = deviceCode; - return true; -} - -bool ConfigManagerV3::freqCalibrationEnabled() const -{ - return freqCalibration; -} diff --git a/DLL430_v3/src/TI/DLL430/ConfigManagerV3.h b/DLL430_v3/src/TI/DLL430/ConfigManagerV3.h deleted file mode 100644 index 0274e9f..0000000 --- a/DLL430_v3/src/TI/DLL430/ConfigManagerV3.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * ConfigManagerV3.h - * - * Functionality for configuring target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_CONFIGMANAGERV3_H -#define DLL430_CONFIGMANAGERV3_H - -#include -#include - -#include "HalExecCommand.h" -#include "FileFuncImpl.h" - -namespace TI -{ - namespace DLL430 - { - class FetHandleV3; - class FileFuncImpl; - - class ConfigManagerV3 : public ConfigManager - { - public: - ConfigManagerV3 (FetHandleV3*); - ~ConfigManagerV3 (); - - bool init (); - - VersionInfo getBiosVersion () const; - - bool setDeviceVcc (uint16_t vcc); - - uint16_t getDeviceVcc() const; - - void setJtagMode (ConfigManager::jtagMode mode); - ConfigManager::jtagMode getInterfaceMode() const; - uint16_t getExternalVcc() const; - uint16_t start (); - uint16_t start (const std::string& pwd, uint32_t deviceCode); - bool stop (); - bool checkCoreVersion(); - - bool reset (bool vcc = false, uint16_t pin = 0, uint16_t JtagId = 0); - - bool firmWareUpdate(const char *fname, FetNotifyCallback callback); - - void setPassword(const string& pwd); - bool setDeviceCode(uint32_t deviceCode); - bool setJtagSpeed (JTAG_4WIRE_SPEED speed); - - bool freqCalibrationEnabled() const; - - bool totalErase(); - - private: - FetHandleV3* parent; - uint16_t vcc; - enum ConfigManager::jtagMode mode; - - HalExecCommand updateCmd; - - bool upInit(unsigned char level); - bool upErase(const FileFuncImpl& firmware); - bool upWrite(const FileFuncImpl& firmware, FetNotifyCallback callback); - bool upRead(const FileFuncImpl& firmware); - bool upCoreErase(); - bool upCoreWrite(); - bool upCoreRead(); - std::string password; - uint32_t deviceCode; - bool freqCalibration; - }; - - }; -}; - -#endif /* DLL430_CONFIGMANAGERV3_H */ diff --git a/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.cpp index 181ca5e..c9be89a 100644 --- a/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.cpp +++ b/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.cpp @@ -3,63 +3,64 @@ * * Implementaion for access of CPU registers. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "CpuMemoryAccess.h" #include "HalExecCommand.h" #include "FetControl.h" #include "WatchdogControl.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; -CpuMemoryAccess::CpuMemoryAccess (const std::string& name, DeviceHandleV3* devHandle, - uint32_t start, - uint32_t size, - uint32_t seg, - uint32_t banks, +CpuMemoryAccess::CpuMemoryAccess (MemoryArea::Name name, IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, bool mapped, uint8_t bits) - : MemoryAreaBase(name,devHandle,start,size,seg,banks,mapped,false/*isprotected*/,0xff) + : size(size) , bytes((bits + 7) / 8) //number of bytes that bits fit in - , fillStatus(0) - , changeStatus(0) , localCache(16, 0) + , devHandle(devHandle) { } -CpuMemoryAccess::~CpuMemoryAccess () +size_t CpuMemoryAccess::getSize() const { + return size; } bool CpuMemoryAccess::read(uint32_t Register, uint32_t* buffer, size_t count) @@ -78,26 +79,32 @@ bool CpuMemoryAccess::read(uint32_t Register, uint32_t* buffer, size_t count) return true; } -bool CpuMemoryAccess::write (uint32_t Register, uint32_t* buffer, size_t count) +bool CpuMemoryAccess::write(uint32_t Register, const uint32_t* buffer, size_t count) { if (Register + count > localCache.size()) { return false; } - while (count--) + uint32_t value = 0; + while (count--) { - this->localCache[Register++] = *(buffer++); - } + value = *(buffer++); + if (Register == 1) + { + value &= 0xfffffffe; + } + this->localCache[Register++] = value; + } return true; } -bool CpuMemoryAccess::write (uint32_t Register, uint32_t value) +bool CpuMemoryAccess::write(uint32_t Register, uint32_t value) { if (Register > localCache.size()) return false; // remove bit 0 of SP silently if set - if(Register==1) + if (Register==1) { value&=0xfffffffe; } @@ -105,17 +112,7 @@ bool CpuMemoryAccess::write (uint32_t Register, uint32_t value) return true; } -bool CpuMemoryAccess::checkCache (uint32_t Register) const -{ - return true; -} - -bool CpuMemoryAccess::markDirty (uint32_t Register, size_t count) -{ - return true; -} - -bool CpuMemoryAccess::fill(uint32_t Register, size_t count) +bool CpuMemoryAccess::fillCache(uint32_t Register, size_t count) { if ((Register + count) > localCache.size()) { @@ -123,10 +120,9 @@ bool CpuMemoryAccess::fill(uint32_t Register, size_t count) } HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ReadAllCpuRegs)); - el->setOutputSize((this->localCache.size()-3) * this->bytes); - + HalExecCommand cmd; - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); if (!this->devHandle->send(cmd)) { @@ -148,22 +144,22 @@ bool CpuMemoryAccess::fill(uint32_t Register, size_t count) return true; } -bool CpuMemoryAccess::flush(uint32_t Register, size_t count) +bool CpuMemoryAccess::flushCache() { HalExecCommand cmd; HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteAllCpuRegs)); - for(size_t i=0;ilocalCache.size();i++) + for (size_t i=0;ilocalCache.size();i++) { - if((1<bytes;j++) + for (int j=0;jbytes;j++) { el->appendInputData8((this->localCache[i] >> (j * 8)) & 0xFF); } } } - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); if (!this->devHandle->send(cmd)) { return false; @@ -171,17 +167,10 @@ bool CpuMemoryAccess::flush(uint32_t Register, size_t count) return true; } -void CpuMemoryAccess::clear (uint32_t Register, size_t count) +void CpuMemoryAccess::clearCache(uint32_t Register, size_t count) { - uint16_t toClear = 0; for (uint8_t k = Register; k < Register+count; ++k) { localCache[k] = 0x0; } } - -bool CpuMemoryAccess::isReadOnly() -{ - return false; -} - diff --git a/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.h b/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.h index 8eb0f9b..c23c38e 100644 --- a/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.h +++ b/DLL430_v3/src/TI/DLL430/CpuMemoryAccess.h @@ -3,89 +3,85 @@ * * Implementaion for access of CPU registers. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_CPUMEMORYACCESS_H -#define DLL430_CPUMEMORYACCESS_H -#include "MemoryCache.h" -#include "MemoryAreaBase.h" -#include +#include "CpuRegisters.h" +#include "DeviceInfo.h" namespace TI { namespace DLL430 { - class DeviceHandleV3; - class CpuMemoryAccess : public MemoryCache, public MemoryAreaBase + class IDeviceHandle; + + class CpuMemoryAccess : public CpuRegisters { public: - CpuMemoryAccess (const std::string& name, DeviceHandleV3* devHandle, - uint32_t start, - uint32_t size, - uint32_t seg, - uint32_t banks, + CpuMemoryAccess(MemoryArea::Name name, IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, bool mapped, uint8_t bits); - ~CpuMemoryAccess (); - bool read (uint32_t Register, uint32_t* buffer, size_t count); - bool write (uint32_t Register, uint32_t* buffer, size_t count); - bool write (uint32_t Register, uint32_t value); + bool read(uint32_t Register, uint32_t* value, size_t count) OVERRIDE; + bool write(uint32_t Register, const uint32_t* buffer, size_t count) OVERRIDE; + bool write(uint32_t Register, uint32_t value) OVERRIDE; + size_t getSize() const OVERRIDE; + + bool flushCache() OVERRIDE; + bool fillCache(uint32_t Register, size_t count) OVERRIDE; + void clearCache(uint32_t Register, size_t count) OVERRIDE; + + void pushCache() OVERRIDE {}; + void popCache() OVERRIDE {}; + bool switchContext(uint32_t pc, uint32_t sp) OVERRIDE { return true; } + bool disableInterrupts() OVERRIDE{ return true; } - void enable (bool) { /* cannot be disabled */ }; - bool isEnabled () const { return true; }; - bool checkCache (uint32_t Register) const; - bool markDirty (uint32_t Register, size_t count); - bool fill (uint32_t Register, size_t count); - bool flush (uint32_t Register, size_t count); - void clear (uint32_t Register, size_t count); - bool isReadOnly(); - MemoryCacheCtrl *getCacheCtrl() {return this;}; private: + virtual bool postSync(const HalExecCommand&) { return true; } + + size_t size; uint8_t bytes; typedef uint32_t cpuType; - uint16_t fillStatus; - uint16_t changeStatus; std::vector localCache; + IDeviceHandle* devHandle; }; - }; -}; - -#endif /* DLL430_CPUMEMORYACCESS_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/CpuRegisters.h b/DLL430_v3/src/TI/DLL430/CpuRegisters.h new file mode 100644 index 0000000..29c2627 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/CpuRegisters.h @@ -0,0 +1,65 @@ +/* + * CpuRegisters.h + * + * Interface for Cpu register access + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + + +namespace TI +{ + namespace DLL430 + { + class CpuRegisters + { + public: + virtual ~CpuRegisters() {} + + virtual bool read(uint32_t reg, uint32_t* buffer, size_t count = 1) = 0; + virtual bool write(uint32_t reg, const uint32_t* buffer, size_t count) = 0; + virtual bool write(uint32_t reg, uint32_t value) = 0; + virtual size_t getSize() const = 0; + + virtual bool flushCache() = 0; + virtual bool fillCache(uint32_t Register, size_t count) = 0; + virtual void clearCache(uint32_t Register, size_t count) = 0; + + virtual void pushCache() = 0; + virtual void popCache() = 0; + virtual bool switchContext(uint32_t pc, uint32_t sp) = 0; + virtual bool disableInterrupts() = 0; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/DAP_LOCK.h b/DLL430_v3/src/TI/DLL430/DAP_LOCK.h new file mode 100644 index 0000000..1eebac3 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DAP_LOCK.h @@ -0,0 +1,61 @@ +/* http://srecord.sourceforge.net/ */ + +#pragma once + + +const uint16_t DAP_LOCK[] = +{ +0xACF6, 0x0115, 0x0000, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, +0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE11D, 0x0011, +}; + +const uint32_t DAP_LOCK_address[] = +{ +0x00200000, +}; +const uint32_t DAP_LOCK_length_of_sections[] = +{ +0x00000128, +}; +const uint32_t DAP_LOCK_sections = 0x00000001; +const uint32_t DAP_LOCK_termination = 0x00000000; +const uint32_t DAP_LOCK_start = 0x00200000; +const uint32_t DAP_LOCK_finish = 0x00200250; +const uint32_t DAP_LOCK_length = 0x00000250; + +#define DAP_LOCK_TERMINATION 0x00000000 +#define DAP_LOCK_START 0x00200000 +#define DAP_LOCK_FINISH 0x00200250 +#define DAP_LOCK_LENGTH 0x00000250 +#define DAP_LOCK_SECTIONS 0x00000001 diff --git a/DLL430_v3/src/TI/DLL430/DebugManagerMSP430.cpp b/DLL430_v3/src/TI/DLL430/DebugManagerMSP430.cpp new file mode 100644 index 0000000..daeb8a9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DebugManagerMSP430.cpp @@ -0,0 +1,891 @@ +/* + * DebugManagerMSP430.cpp + * + * Functionality for debugging target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include "EemMemoryAccess.h" +#include "CpuRegisters.h" +#include "DebugManagerMSP430.h" +#include "IDeviceHandle.h" +#include "FetHandle.h" +#include "HalExecCommand.h" +#include "HalResponse.h" +#include "HalResponseHandler.h" +#include "FetControl.h" +#include "DeviceInfo.h" +#include "EM/EmulationManager/IEmulationManager.h" +#include "EM/Trace/ITrace.h" +#include "EM/SoftwareBreakpoints/ISoftwareBreakpoints.h" +#include "EM/Exceptions/Exceptions.h" +#include "MessageData.h" +#include "PinSequence.h" + +using namespace TI::DLL430; + +/// State modes. +enum INTERNAL_STATE_MODES { + D_STOPPED = 0, /**< The device is stopped */ + D_RUNNING = 1, /**< The device is running or is being single stepped */ + D_SINGLE_STEP_COMPLETE = 2, /**< The device is stopped after the single step operation is complete */ + D_BREAKPOINT_HIT = 3, /**< The device is stopped as a result of hitting an enabled breakpoint */ + D_LPMX5_MODE = 4, /**< The device is in LPMx.5 low power mode */ + D_LPMX5_WAKEUP = 5, /**< The device woke up from LPMx.5 low power mode */ +}; + +#define J_STATE_LPMX_MASK_HIGH 0x40000000ull + +DebugManagerMSP430::DebugManagerMSP430(IDeviceHandle* parent, const DeviceInfo& devInfo) + : parent(parent) + , clockControl(devInfo.clockInfo.clockControl) + , genclkcntrl(DefaultClkCntrl) + , mclkcntrl0(devInfo.clockInfo.mclkCntrl0) + , defaultGenClkCntrl(DefaultClkCntrl) + , defaultMclkcntrl0(devInfo.clockInfo.mclkCntrl0) + , emulationLevel(devInfo.eem) + , moduleStrings(0) + , nModuleStrings(0) + , clockStrings(0) + , nClockStrings(0) + , lpmDebuggingEnabled(false) + , lpm5WakeupDetected(false) + , mdbPatchValue(0) + , cbx(0) + , cycleCounter_(devInfo.eem, devInfo.bits) + , storagePollingActive(false) + , mPollingManager(nullptr) + , irRequest(0) +{ + //Need to set TCE_SMCLK/TCE_SMCLK_MCLK for devices with standard clock control + //to prevent a running SMCLK to be sourced from TCLK under debug (default) + if (clockControl == GCC_STANDARD || clockControl == GCC_STANDARD_I) + { + defaultGenClkCntrl |= 0x1; + genclkcntrl = defaultGenClkCntrl; + } + + createModuleStrings(devInfo.clockInfo.eemTimers); + createClockStrings(devInfo.clockInfo.eemClocks); +} + +DebugManagerMSP430::~DebugManagerMSP430 () +{ + if (parent->getFetHandle() && mPollingManager) + { + mPollingManager->stopBreakpointPolling(*this->parent); + mPollingManager->setBreakpointCallback(PollingManager::Callback()); + + mPollingManager->stopStateStoragePolling(*this->parent); + mPollingManager->setStateStorageCallback(PollingManager::Callback()); + + mPollingManager->stopLpmPolling(*this->parent); + mPollingManager->setLpmCallback(PollingManager::Callback()); + } + + if (nullptr != moduleStrings) + { + for (uint32_t i = 0; i < nModuleStrings; ++i) + { + delete[] moduleStrings[i]; + moduleStrings[i] = nullptr; + } + delete[] moduleStrings; + moduleStrings = nullptr; + } + + if (nullptr != clockStrings) + { + for (uint32_t i = 0; i < nClockStrings; ++i) + { + delete[] clockStrings[i]; + clockStrings[i] = nullptr; + } + delete[] clockStrings; + clockStrings = nullptr; + } +} + +void DebugManagerMSP430::createModuleStrings(const ClockMapping& clockMapping) +{ + nModuleStrings = static_cast(clockMapping.size()); + moduleStrings = new char*[nModuleStrings]; + for (uint32_t i = 0; i < nModuleStrings; ++i) + { + size_t size = clockMapping[i].name.size() + 1; + moduleStrings[i] = new char[size]; + memset(moduleStrings[i], 0, size); + strncpy(moduleStrings[i], clockMapping[i].name.c_str(), size - 1); + } +} + +void DebugManagerMSP430::createClockStrings(const ClockNames& clockNames) +{ + nClockStrings = static_cast(clockNames.size()); + clockStrings = new char*[nClockStrings]; + for (uint32_t i = 0; i < nClockStrings; ++i) + { + size_t size = clockNames[i].size() + 1; + clockStrings[i] = new char[size]; + memset(clockStrings[i], 0, size); + strncpy(clockStrings[i], clockNames[i].c_str(), size - 1); + } +} + +void DebugManagerMSP430::setPollingManager(PollingManager* pollingManager) +{ + this->mPollingManager = pollingManager; + pollingManager->setBreakpointCallback(std::bind(&DebugManagerMSP430::runEvent, this, std::placeholders::_1)); + pollingManager->setLpmCallback(std::bind(&DebugManagerMSP430::runEvent, this, std::placeholders::_1)); + pollingManager->setStateStorageCallback(std::bind(&DebugManagerMSP430::runEvent, this, std::placeholders::_1)); +} + + +bool DebugManagerMSP430::activatePolling(uint16_t mask) +{ + if (!mPollingManager) + { + return false; + } + return mPollingManager->startBreakpointPolling(*this->parent); +} + + +bool DebugManagerMSP430::activateJStatePolling(DebugEventTarget * cb) +{ + if (!mPollingManager) + { + return false; + } + mPollingManager->resumePolling(); + return mPollingManager->startLpmPolling(*this->parent); +} + + +void DebugManagerMSP430::enableLegacyCycleCounter(bool enable) +{ + const bool wasEnabled = cycleCounter_.isEnabled(); + cycleCounter_.enable(enable); + + if (enable && !wasEnabled) + { + cycleCounter_.configure(); + } +} + + +bool DebugManagerMSP430::startStoragePolling() +{ + if (!mPollingManager) + { + return false; + } + storagePollingActive = mPollingManager->startStateStoragePolling(*parent); + return storagePollingActive; +} + + +bool DebugManagerMSP430::stopStoragePolling() +{ + if (!mPollingManager) + { + return false; + } + storagePollingActive = !mPollingManager->stopStateStoragePolling(*parent); + return !storagePollingActive; +} + + +bool DebugManagerMSP430::reconnectJTAG() +{ + bool success = false; + + if ( IFetHandle* fetHandle = parent->getFetHandle() ) + { + if ( IConfigManager* cm = fetHandle->getConfigManager() ) + success = (cm->start() > 0); + + if (mPollingManager) + { + mPollingManager->resumePolling(); + } + } + return success; +} + +bool DebugManagerMSP430::run(uint16_t controlMask, DebugEventTarget * cb, bool releaseJtag) +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + { + return false; + } + + lpm5WakeupDetected = false; + + if (cb!=0) + { + cbx=cb; + } + + uint32_t pc, sr; + cpu->read(0, &pc); + cpu->read(2, &sr); + + if (!restoreTinyRam()) + { + return false; + } + + if (!cpu->flushCache()) + { + return false; + } + + cycleCounter_.reset(); + IConfigManager *cm = parent->getFetHandle()->getConfigManager(); + + const uint16_t mdb = parent->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->getInstructionAt(pc); + if (mdb != 0) + { + mdbPatchValue = mdb; + } + + HalExecElement* el = new HalExecElement(this->parent->checkHalId(ID_RestoreContext_ReleaseJtag)); + this->parent->getWatchdogControl()->addRestoreParamsTo(el); + el->appendInputData32(pc); + el->appendInputData16(sr); + el->appendInputData16(controlMask!=0? 0x0007: 0x0006); // eem control bits + el->appendInputData16(mdbPatchValue); // mdb + el->appendInputData16(releaseJtag ? 1 : 0); + el->appendInputData16(cm->ulpDebugEnabled() ? 1 : 0); + + mdbPatchValue = 0; + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + if (!this->parent->send(cmd)) + { + return false; + } + + // handle lpmx5 polling + if (releaseJtag) + { + pausePolling(); + } + else + { + this->resumePolling(); + } + + if (controlMask != 0 && !releaseJtag && !activatePolling(controlMask)) + { + return false; + } + + return true; +} + + +void DebugManagerMSP430::runEvent(MessageDataPtr messageData) +{ + if (EmulationManagerPtr emManager = this->parent->getEmulationManager()) + { + emManager->onEvent(messageData); + } + + messageData->reset(); + + uint16_t eventMask = 0; + (*messageData) >> eventMask; + + if (eventMask & JSTATE_CAPTURE_FLAG) + { + uint32_t maskLow = 0; + uint32_t maskHigh = 0; + (*messageData) >> maskLow >> maskHigh; + + if (maskHigh & J_STATE_LPMX_MASK_HIGH) + { + if (cbx) + { + cbx->event(DebugEventTarget::Lpm5Sleep); + } + } + else + { + if (cbx) + { + cbx->event(DebugEventTarget::Lpm5Wakeup); + } + } + } + + if (eventMask & BP_HIT_FLAG) + { + saveContext(); + + IMemoryManager* mm = this->parent->getMemoryManager(); + if (CpuRegisters* cpu = mm ? mm->getCpuRegisters() : 0) + { + uint32_t pc = 0; + cpu->read(0, &pc); + + try + { + //If there is a SWBP 2 byte before the PC, we must adjust the PC accordingly and patch the MDB + const uint16_t mdb = parent->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->getInstructionAt(pc-2); + if (mdb != 0) + { + cpu->write(0, pc-2); + } + } + catch (const EM_Exception&) { /*ignore*/ } + } + + if (cbx) + { + cbx->event(DebugEventTarget::BreakpointHit); + } + } + + if (eventMask & STATE_STORAGE_FLAG) + { + uint16_t numEntries = 0; + (*messageData) >> numEntries; + + if (cbx) + { + try + { + const size_t bufferSize = parent->getEmulationManager()->getTrace()->getTraceData().size(); + const uint16_t bufferFull = (bufferSize == 8) ? 1 : 0; + cbx->event(DebugEventTarget::Storage, numEntries, bufferFull); + } + catch (const EM_Exception&) { /*ignore*/ } + } + } + + if (eventMask & VARIABLE_WATCH_FLAG) + { + if (cbx) + { + cbx->event(DebugEventTarget::VariableWatch); + } + } +} + + +bool DebugManagerMSP430::wakeupDevice() +{ + if (parent->getDeviceCode() == 0x20404020) + { + IConfigManager *cm = parent->getFetHandle()->getConfigManager(); + return cm && (cm->MSP430I_MagicPattern((uint16_t)AUTOMATIC_IF) != -1); + } + + std::list stateChanges; + stateChanges.push_back( PinState(JTAG_PIN_TST, true, 5) ); + stateChanges.push_back( PinState(JTAG_PIN_RST, true, 5) ); + + stateChanges.push_back( PinState(JTAG_PIN_TST, false, 20) ); + + stateChanges.push_back( PinState(JTAG_PIN_RST, false, 10) ); + stateChanges.push_back( PinState(JTAG_PIN_RST, true, 5) ); + + stateChanges.push_back( PinState(JTAG_PIN_TST, true, 5) ); + + bool isSleeping = true; + + if (FetHandle* fetHandle = parent->getFetHandle()) + { + int i = 0; + while (isSleeping && i++ < 5) + { + // Power down JTAG LDO to enable RST NMI wakeup + if (parent->getJtagId() == 0x99) + { + fetHandle->sendJtagShift(HIL_CMD_JTAG_IR, 0x2F); + fetHandle->sendJtagShift(HIL_CMD_JTAG_DR, 0xC020, 16); + } + sendPinSequence(stateChanges, fetHandle); + + IConfigManager *cm = fetHandle->getConfigManager(); + + cm->start(); + + isSleeping = queryIsInLpm5State(); + } + } + + return !isSleeping; +} + +/* sync Jtag */ +bool DebugManagerMSP430::stop(bool jtagWasReleased) +{ + bool success = false; + int attemptsLeft = 3; + bool isSleeping = false; + bool wasInLpmx5 = false; + + // Pause the polling loop while we try to wake up the device and sync again + this->pausePolling(); + + do + { + if (queryIsInLpm5State()) + { + isSleeping = !wakeupDevice(); + wasInLpmx5 = true; + if (!jtagWasReleased) + { + this->resumePolling(); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + this->pausePolling(); + } + } + // save context when wakeup was detected + if (lpm5WakeupDetected) + { + wasInLpmx5 = true; + success = saveContext(); + } + } + while ( isSleeping && --attemptsLeft ); + + // just save context when no wakeup was detected before + if (!lpm5WakeupDetected) + { + success = saveContext(); + } + + success = success && !isSleeping; + + //If the device was in LPMx5, read reset vector and set PC + if ( success && wasInLpmx5) + { + IMemoryManager* mm = parent->getMemoryManager(); + if ( CpuRegisters* cpu = mm->getCpuRegisters() ) + { + uint8_t buffer[2]; + if (mm->read(0xFFFE, buffer, 2) && mm->sync() && mm->read(0xFFFE, buffer, 2) && mm->sync()) + { + cpu->write(0, buffer[0] | (buffer[1] << 8)); + cpu->write(2, 0); // BTT2001 status register bugfix + } + } + } + + // If the JTAG was released, we could not know that the device went into LPMx.5, + // thus manually generate the event in this case + if (jtagWasReleased && wasInLpmx5) + { + MessageDataPtr data(new MessageData); + (*data) << (uint16_t)JSTATE_CAPTURE_FLAG; + if (mPollingManager) + { + mPollingManager->queueEvent(data); + } + } + + return success; +} + +bool DebugManagerMSP430::syncDeviceAfterLPMx5() +{ + lpm5WakeupDetected = true; + return true; +} + +bool DebugManagerMSP430::singleStep (uint32_t* cycles) +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + return false; + + lpm5WakeupDetected = false; + + uint32_t pc, sr; + cpu->read(0, &pc); + cpu->read(2, &sr); + + /* flush and clear all caches */ + if (!cpu->flushCache()) + { + return false; + } + if (!restoreTinyRam()) + { + return false; + } + + HalExecCommand cmd; + + HalExecElement* instructionRead = 0; + if (cycles && emulationLevel < EMEX_EXTRA_SMALL_5XX) + { + //we run that inline instead of through the IMemoryManager + instructionRead = new HalExecElement(this->parent->checkHalId(ID_ReadMemWords)); + instructionRead->appendInputData32(pc); + instructionRead->appendInputData32(2); + cmd.elements.emplace_back(instructionRead); + } + + IConfigManager *cm = parent->getFetHandle()->getConfigManager(); + const uint16_t mdb = parent->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->getInstructionAt(pc); + if (mdb != 0) + { + mdbPatchValue = mdb; + } + std::shared_ptr wdt = this->parent->getWatchdogControl(); + HalExecElement* el = new HalExecElement(this->parent->checkHalId(ID_SingleStep)); + //Parameters for RestoreContext_ReleaseJtag + wdt->addRestoreParamsTo(el); + el->appendInputData32(pc); + el->appendInputData16(static_cast(sr)); + el->appendInputData16(7); + el->appendInputData16(mdbPatchValue); + //releaseJtag + el->appendInputData16(0); + el->appendInputData16(cm->ulpDebugEnabled() ? 1 : 0); + //Parameters for SingleStep + el->appendInputData16(irRequest); + //Parameters for SyncJtag_Conditional_SaveContext + wdt->addHoldParamsTo(el); + + mdbPatchValue = 0; + + cmd.elements.emplace_back(el); + + mPollingManager->resumeStateStoragePolling(*parent); + if (!this->parent->send(cmd)) + { + return false; + } + mPollingManager->pauseStateStoragePolling(*parent); + + // Exit if device stepped into LPMx.5 mode + if (queryIsInLpm5State()) + { + return true; + } + + // get watchdog from single step macro + uint16_t wdtCtrl = el->getOutputAt16(0); + if (!WatchdogControl::checkRead(wdtCtrl)) + { + return false; + } + // store watchdog values + wdt->set(wdtCtrl); + + pc = el->getOutputAt32(2); + sr = el->getOutputAt16(6); + + irRequest = el->getOutputAt16(8); + + // write PC and SR to IMemoryManager to signal that _NO_ additional + // SyncJTAG is necessary + cpu->write(0, pc); + cpu->write(2, sr); + cpu->fillCache(0, 16); + + setLeaAccessibility(); + backUpTinyRam(); + if (checkUssIsBusy()) + { + return false; + } + + if (cycles) + { + if (emulationLevel < EMEX_EXTRA_SMALL_5XX) + { + const uint16_t steppedIntoInterrupt = el->getOutputAt16(8); + uint32_t instruction = instructionRead->getOutputAt32(0); + cycleCounter_.countInstruction(instruction, steppedIntoInterrupt != 0); + } + *cycles = static_cast(cycleCounter_.read()); + } + + return true; +} + + +bool DebugManagerMSP430::initEemRegister() +{ + bool success = false; + + EmulationManagerPtr emManager = parent->getEmulationManager(); + + emManager->writeRegister(GENCTRL, 0x0); + emManager->writeRegister(GENCLKCTRL, defaultGenClkCntrl); + emManager->writeRegister(MODCLKCTRL0, defaultMclkcntrl0); + + cycleCounter_.configure(); + + return success; +} + + +uint8_t DebugManagerMSP430::getClockControl() const +{ + return clockControl; +} + +uint16_t DebugManagerMSP430::getClockControlSetting() const +{ + return genclkcntrl; +} + +uint16_t DebugManagerMSP430::getGeneralClockDefaultSetting() const +{ + return defaultGenClkCntrl; +} + +uint32_t DebugManagerMSP430::getClockModuleDefaultSetting() const +{ + return defaultMclkcntrl0; +} + +uint32_t DebugManagerMSP430::getClockModuleSetting() const +{ + return mclkcntrl0; +} + +char ** DebugManagerMSP430::getModuleStrings(uint32_t * n) const +{ + *n=nModuleStrings; + return moduleStrings; +} + +char ** DebugManagerMSP430::getClockStrings(uint32_t * n) const +{ + *n=nClockStrings; + return clockStrings; +} + +void DebugManagerMSP430::setOpcode(uint16_t value) +{ + mdbPatchValue = value; +} + +bool DebugManagerMSP430::saveContext() +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + return false; + + HalExecElement* el0 = new HalExecElement(this->parent->checkHalId(ID_SyncJtag_Conditional_SaveContext)); + this->parent->getWatchdogControl()->addHoldParamsTo(el0); + + HalExecCommand cmd; + cmd.elements.emplace_back(el0); + + if (!this->parent->send(cmd)) + { + return false; + } + + uint16_t wdtCtrl = el0->getOutputAt16(0); + + if (!WatchdogControl::checkRead(wdtCtrl)) + return false; + // sync watchdog after stopping CPU + this->parent->getWatchdogControl()->set(wdtCtrl); + + // get register values + uint32_t pc = el0->getOutputAt32(2); + uint32_t sr = el0->getOutputAt16(6); + irRequest = el0->getOutputAt16(8); + + cpu->write(0, pc); + cpu->write(2, sr); + cpu->fillCache(0, 16); + + cycleCounter_.read(); + + backUpTinyRam(); + setLeaAccessibility(); + if (checkUssIsBusy()) + { + return false; + } + return true; +} + +void DebugManagerMSP430::setLpmDebugging(bool enable) +{ + lpmDebuggingEnabled = enable; +} + +bool DebugManagerMSP430::getLpmDebugging() +{ + return lpmDebuggingEnabled; +} + +bool DebugManagerMSP430::queryIsInLpm5State() +{ + if (!getLpmDebugging() && (parent->getDeviceCode() != 0x20404020)) + { + return false; + } + + const uint64_t bit = 1; + + HalExecElement* el = new HalExecElement(parent->checkHalId(ID_PollJStateReg)); + el->appendInputData16(1); //Query once, force send + el->appendInputData16(0); //Breakpoint polling + el->appendInputData16(1); //LPM polling + el->appendInputData16(0); //Energy Trace + el->appendInputData16(0); //Gated Mode + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + uint64_t jstate = 0; + + if (this->parent->send(cmd)) + { + jstate = el->getOutputAt32(2); + jstate |= (uint64_t)el->getOutputAt32(6) << 32; + } + return (( jstate & (bit << 62) ) != 0); +} + +void DebugManagerMSP430::pausePolling() +{ + if (mPollingManager) + { + mPollingManager->pausePolling(); + } +} + +void DebugManagerMSP430::resumePolling() +{ + if (mPollingManager) + { + mPollingManager->resumePolling(); + } +} + +bool DebugManagerMSP430::backUpTinyRam() +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + if (MemoryArea* tinyRam = mm ? mm->getMemoryArea(MemoryArea::TinyRam) : nullptr) + { + return tinyRam->fillCache(); + } + // in case the device has no tinyRam + return true; +} + +bool DebugManagerMSP430::restoreTinyRam() +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + if (MemoryArea* tinyRam = mm ? mm->getMemoryArea(MemoryArea::TinyRam) : nullptr) + { + return tinyRam->flushCache(); + } + // in case the device has no tinyRam + return true; +} + +void DebugManagerMSP430::setLeaAccessibility() +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + if (MemoryArea* lea_registers = mm ? mm->getMemoryArea(MemoryArea::LeaPeripheral) : nullptr) + { + HalExecElement* el = new HalExecElement(ID_LeaSyncConditional); + el->appendInputData32(lea_registers->getStart()); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + if (this->parent->send(cmd)) + { + const bool leaBusy = el->getOutputAt16(0) != 0; + + lea_registers->setAccessible(!leaBusy); + if (MemoryArea* lea_ram = mm->getMemoryArea(MemoryArea::LeaRam)) + { + lea_ram->setAccessible(!leaBusy); + } + } + } +} +bool DebugManagerMSP430::checkUssIsBusy() +{ + IMemoryManager* mm = this->parent->getMemoryManager(); + if (MemoryArea* uss_registers = mm ? mm->getMemoryArea(MemoryArea::UssPeripheral) : nullptr) + { + HalExecElement* el = new HalExecElement(ID_UssSyncConditional); + el->appendInputData32(uss_registers->getStart()); + HalExecCommand cmd; + cmd.elements.emplace_back(el); + if (this->parent->send(cmd)) + { + const bool ussBusy = el->getOutputAt16(1) != 0; + return (ussBusy); + } + } + return false; +} +bool DebugManagerMSP430::setPCtoSafeLocation() +{ + uint32_t pc = 0x4; + uint32_t sr = 0; + IMemoryManager * mm = parent->getMemoryManager(); + if (!mm) + { + return false; + } + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + { + return false; + } + cpu->write(0, pc); + cpu->write(2, sr); + cpu->flushCache(); + return true; +} diff --git a/DLL430_v3/src/TI/DLL430/DebugManagerV3.h b/DLL430_v3/src/TI/DLL430/DebugManagerMSP430.h similarity index 56% rename from DLL430_v3/src/TI/DLL430/DebugManagerV3.h rename to DLL430_v3/src/TI/DLL430/DebugManagerMSP430.h index 12f2a1e..e538134 100644 --- a/DLL430_v3/src/TI/DLL430/DebugManagerV3.h +++ b/DLL430_v3/src/TI/DLL430/DebugManagerMSP430.h @@ -1,76 +1,71 @@ /* - * DebugManagerV3.h + * DebugManagerMSP430.h * * Functionality for debugging target device. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DEBUGMANAGERV3_H -#define DLL430_DEBUGMANAGERV3_H - -#include -#include -#include -#include + #include "HalExecCommand.h" #include "DeviceInfo.h" +#include "IDebugManager.h" #include "EEM/CycleCounter.h" #include "MessageData.h" -#include "EventNotifier.h" +#include "PollingManager.h" namespace TI { namespace DLL430 { - class DeviceHandleV3; + class IDeviceHandle; namespace EEM { class Trigger; class TriggerGroupImpl; class SequencerImpl; }; - - class DebugManagerV3 : public DebugManager + class DebugManagerMSP430 : public IDebugManager { public: - DebugManagerV3 (DeviceHandleV3*, const DeviceInfo*); - ~DebugManagerV3 (); + DebugManagerMSP430 (IDeviceHandle*, const DeviceInfo&); + ~DebugManagerMSP430 (); + + DebugManagerMSP430(const DebugManagerMSP430&) = delete; + DebugManagerMSP430& operator=(const DebugManagerMSP430&) = delete; bool reconnectJTAG(); @@ -81,7 +76,7 @@ namespace TI /* sync Jtag */ bool stop (bool jtagWasReleased = false); - + /* do a single step */ bool singleStep (uint32_t* cycles = 0); @@ -89,13 +84,11 @@ namespace TI uint16_t getClockControlSetting() const; - void setClockControlSetting(uint16_t clkCntrl); + uint16_t getGeneralClockDefaultSetting() const; - uint16_t getClockModuleDefaultSetting() const; + uint32_t getClockModuleDefaultSetting() const; - uint16_t getClockModuleSetting() const; - - void setClockModuleSetting(uint16_t modules); + uint32_t getClockModuleSetting() const; char ** getModuleStrings(uint32_t * n) const; @@ -103,61 +96,65 @@ namespace TI bool initEemRegister(); - bool eemWriteRegister(uint32_t, uint32_t); - - bool eemReadRegister(uint32_t, uint32_t* buffer); - void setOpcode(uint16_t value); bool activatePolling(uint16_t mask); bool saveContext(); - uint8_t getRunEemResponseId(); - void runEvent(MessageDataPtr messageData); - void localCallback (MessageDataPtr messageData, uint32_t clientHandle); - void setLpmDebugging(bool enable); bool getLpmDebugging(); - bool activateJStatePolling(DebugEventTarget * cb); - - bool queryLpm5State(); + bool activateJStatePolling(DebugEventTarget* cb); - bool isDeviceInLpm5(); + bool queryIsInLpm5State(); bool wakeupDevice(); void pausePolling(); - + void resumePolling(); bool syncDeviceAfterLPMx5(); - uint64_t getCycleCounterValue() { return cycleCounter_.getValue(); } - + void enableLegacyCycleCounter(bool enable); + + bool legacyCycleCounterEnabled() const { return cycleCounter_.isEnabled(); } + + uint64_t getCycleCounterValue() { return cycleCounter_.read(); } + void resetCycleCounterValue() { cycleCounter_.reset(); } bool startStoragePolling(); - + bool stopStoragePolling(); - protected: + void setCalibrationValues(double *calibrationValues); + + void setPollingManager(PollingManager* pollingManager); + + bool setPCtoSafeLocation(); private: - DeviceHandleV3* parent; + void createModuleStrings(const ClockMapping& clockMapping); + void createClockStrings(const ClockNames& clockNames); + + void setLeaAccessibility(); + bool backUpTinyRam(); + bool restoreTinyRam(); + bool checkUssIsBusy(); - HalExecCommand waitForEem; - HalExecCommand waitForJState; - HalExecCommand waitForStorage; + IDeviceHandle* parent; uint8_t clockControl; uint16_t genclkcntrl; - uint16_t mclkcntrl0; - uint16_t defaultMclkcntrl0; + uint32_t mclkcntrl0; + + uint16_t defaultGenClkCntrl; + uint32_t defaultMclkcntrl0; uint8_t emulationLevel; @@ -167,31 +164,21 @@ namespace TI char** clockStrings; uint32_t nClockStrings; - size_t lastWrite; + uint16_t lpm5WakeupDetected; - uint16_t internalDebugState; + uint16_t irRequest; - //helper funtion to fill data behind moduleStrings pointer in a heap based way - void createModuleStrings(const DeviceInfo::ClockMapping& clockMapping); - void createClockStrings(const DeviceInfo::ClockNames& clockNames); + uint16_t mdbPatchValue; DebugEventTarget* cbx; - uint8_t typex; - - uint16_t opcode; bool lpmDebuggingEnabled; - bool deviceInLpm5; - CycleCounter cycleCounter_; - bool resetCycleCounterBeforeNextStep; bool storagePollingActive; - EventNotifier eventNotifier; + PollingManager* mPollingManager; }; - }; -}; - -#endif /* DLL430_DEBUGMANAGERV3_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/DebugManagerV3.cpp b/DLL430_v3/src/TI/DLL430/DebugManagerV3.cpp deleted file mode 100644 index ca2724c..0000000 --- a/DLL430_v3/src/TI/DLL430/DebugManagerV3.cpp +++ /dev/null @@ -1,857 +0,0 @@ -/* - * DebugManagerV3.cpp - * - * Functionality for debugging target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#ifdef _MSC_VER -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS //disabling warnings to use secure c-function versions (e.g. strcpy_s) as this is not compatible with none MS development -#endif -#endif - -#include "EemMemoryAccess.h" - -#include "MemoryCacheGeneric.h" - -#include "DebugManagerV3.h" -#include "DeviceHandleV3.h" -#include "FetHandleV3.h" -#include "HalExecCommand.h" -#include "HalResponse.h" -#include "HalResponseHandler.h" -#include "FetControl.h" -#include "TemplateDeviceDb/MSP430Defaults.h" -#include "DeviceInfo.h" -#include "EM/EmulationManager/IEmulationManager.h" -#include "EM/Trace/ITrace.h" -#include "MessageData.h" - -#include - -using namespace TI::DLL430; -using namespace TI::DLL430::TemplateDeviceDb; - -/// State modes. -enum INTERNAL_STATE_MODES { - D_STOPPED = 0, /**< The device is stopped */ - D_RUNNING = 1, /**< The device is running or is being single stepped */ - D_SINGLE_STEP_COMPLETE = 2, /**< The device is stopped after the single step operation is complete */ - D_BREAKPOINT_HIT = 3, /**< The device is stopped as a result of hitting an enabled breakpoint */ - D_LPMX5_MODE = 4, /**< The device is in LPMx.5 low power mode */ - D_LPMX5_WAKEUP = 5, /**< The device woke up from LPMx.5 low power mode */ - D_LPMX5_WAKEUP_DETECTED = 6, -}; - -DebugManagerV3::DebugManagerV3 (DeviceHandleV3* parent, const DeviceInfo* devInfo) - : parent(parent) - , clockControl(devInfo->getClockControl()) - , genclkcntrl(DefaultClkCntrl) - , mclkcntrl0(devInfo->getClockModDefault()) - , defaultMclkcntrl0(devInfo->getClockModDefault()) - , emulationLevel(devInfo->getEmulationLevel()) - , moduleStrings(0) - , nModuleStrings(0) - , clockStrings(0) - , nClockStrings(0) - , opcode(0) - , lpmDebuggingEnabled(false) - , deviceInLpm5(false) - , internalDebugState(D_STOPPED) - , cbx(0) - , cycleCounter_(parent, devInfo) - , resetCycleCounterBeforeNextStep(true) - , storagePollingActive(false) -{ - this->waitForEem.setCallBack( boost::bind(&DebugManagerV3::localCallback, this, _1, _2), 0 ); - this->waitForEem.setAsyncMode(false); - - this->waitForJState.setCallBack( boost::bind(&DebugManagerV3::localCallback, this, _1, _2), 0 ); - this->waitForJState.setAsyncMode(true); - - this->waitForStorage.setCallBack( boost::bind(&DebugManagerV3::localCallback, this, _1, _2), 0 ); - this->waitForStorage.setAsyncMode(true); - - createModuleStrings(devInfo->getClockMapping()); - createClockStrings(devInfo->getClockNames()); - - eventNotifier.setEventHandler( boost::bind(&DebugManagerV3::runEvent, this, _1) ); - eventNotifier.startProcessingEvents(); -} - -DebugManagerV3::~DebugManagerV3 () -{ - if ( FetHandle* fetHandle = parent->getFetHandle() ) - { - parent->getFetHandle()->kill( waitForJState.getResponseId() ); - parent->getFetHandle()->kill( waitForEem.getResponseId() ); - parent->getFetHandle()->kill( waitForStorage.getResponseId() ); - } - - if(NULL != moduleStrings) - { - for(uint32_t i = 0; i < nModuleStrings; ++i) - { - delete[] moduleStrings[i]; - moduleStrings[i] = NULL; - } - delete[] moduleStrings; - moduleStrings = NULL; - } - - if(NULL != clockStrings) - { - for(uint32_t i = 0; i < nClockStrings; ++i) - { - delete[] clockStrings[i]; - clockStrings[i] = NULL; - } - delete[] clockStrings; - clockStrings = NULL; - } -} - -void DebugManagerV3::createModuleStrings(const DeviceInfo::ClockMapping& clockMapping) -{ - nModuleStrings = static_cast(clockMapping.size()); - moduleStrings = new char*[nModuleStrings]; - for(uint32_t i = 0; i < nModuleStrings; ++i) - { - size_t size = clockMapping[i].first.size() + 1; - moduleStrings[i] = new char[size]; - memset(moduleStrings[i], 0, size); - strncpy(moduleStrings[i], clockMapping[i].first.c_str(), size - 1); - - } -} - -void DebugManagerV3::createClockStrings(const DeviceInfo::ClockNames& clockNames) -{ - nClockStrings = static_cast(clockNames.size()); - clockStrings = new char*[nClockStrings]; - for(uint32_t i = 0; i < nClockStrings; ++i) - { - size_t size = clockNames[i].size() + 1; - clockStrings[i] = new char[size]; - memset(clockStrings[i], 0, size); - strncpy(clockStrings[i], clockNames[i].c_str(), size - 1); - } -} - -bool DebugManagerV3::activatePolling(uint16_t mask) -{ - if(parent->checkHalId(ID_WaitForEem) == ID_WaitForEem) - { - HalExecElement* el = new HalExecElement(parent->checkHalId(ID_WaitForEem)); - el->appendInputData16(mask); - el->setOutputSize(2); - this->waitForEem.elements.clear(); - this->waitForEem.elements.push_back(el); - return this->parent->send(this->waitForEem); - } - else - { // case ID_PollJStateReg - if ( waitForJState.getResponseId() != 0 ) - { - return true; - } - uint64_t mask2 = 0x8000000100000000LL; // Only interested in bit 63 - - HalExecElement* el = new HalExecElement(parent->checkHalId(ID_PollJStateReg)); - el->appendInputData32((uint32_t)(mask2 & 0xFFFFFFFF)); - el->appendInputData32((uint32_t)(mask2 >> 32)); - el->appendInputData16((uint16_t)false); - el->setOutputSize(2); - - this->waitForJState.elements.clear(); - this->waitForJState.elements.push_back(el); - - if (!this->parent->send(this->waitForJState)) - { - return false; - } - //this->resumePolling(); - return true; - } -} - - -bool DebugManagerV3::startStoragePolling() -{ - if (!storagePollingActive) - { - HalExecElement* el = new HalExecElement(parent->checkHalId(ID_WaitForStorage)); - this->waitForStorage.elements.clear(); - this->waitForStorage.elements.push_back(el); - - storagePollingActive = this->parent->send(this->waitForStorage); - } - return storagePollingActive; -} - - -bool DebugManagerV3::stopStoragePolling() -{ - storagePollingActive = false; - return parent->getFetHandle()->kill( waitForStorage.getResponseId() ); -} - - -bool DebugManagerV3::reconnectJTAG() -{ - bool success = false; - - if ( FetHandle* fetHandle = parent->getFetHandle() ) - { - if ( ConfigManager* cm = parent->getFetHandle()->getConfigManager() ) - success = (cm->start() > 0); - - fetHandle->resumeLoopCmd( waitForJState.getResponseId() ); - fetHandle->resumeLoopCmd( waitForEem.getResponseId() ); - fetHandle->resumeLoopCmd( waitForStorage.getResponseId() ); - } - return success; -} - -bool DebugManagerV3::run (uint16_t controlMask, DebugEventTarget * cb, bool releaseJtag) -{ - MemoryManager* mm = this->parent->getMemoryManager(); - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; - - if(cb!=0) - { - cbx=cb; - } - - uint32_t pc, sr; - cpu->read(0, &pc, 1); - cpu->read(2, &sr, 1); - - if(mm->flushAll()==false) - { - return false; - } - - queryLpm5State(); - - cycleCounter_.reset(); - - HalExecElement* el = new HalExecElement(this->parent->checkHalId(ID_RestoreContext_ReleaseJtag)); - this->parent->getWatchdogControl()->addParamsTo(el); - el->appendInputData32(pc); - el->appendInputData16(sr); - el->appendInputData16(controlMask!=0? 0x0007: 0x0000); // eem control bits - el->appendInputData16(opcode); // mdb - el->appendInputData16(releaseJtag ? 1 : 0); - opcode=0; - - HalExecCommand cmd; - cmd.elements.push_back(el); - - if (!this->parent->send(cmd)) - { - return false; - } - - // handle lpmx5 polling - if (releaseJtag) - { - pausePolling(); - } - else - { - this->resumePolling(); - } - - if (controlMask!=0 && !releaseJtag) - { - if (!activatePolling(controlMask)) - { - return false; - } - } - - resetCycleCounterBeforeNextStep = true; - - return true; -} - - - -void DebugManagerV3::localCallback (MessageDataPtr messageData, uint32_t clientHandle) -{ - eventNotifier.queueEvent(messageData); -} - - -void DebugManagerV3::runEvent(MessageDataPtr messageData) -{ - if (EmulationManagerPtr emManager = this->parent->getEmulationManager()) - { - emManager->onEvent(messageData); - } - - - messageData->reset(); - - uint16_t eventMask = 0; - (*messageData) >> eventMask; - - if (eventMask & JSTATE_CAPTURE_FLAG) - { - uint32_t maskLow = 0; - uint32_t maskHigh = 0; - (*messageData) >> maskLow >> maskHigh; - - if ( maskHigh & (1 << 31) ) - { - deviceInLpm5 = true; - if(cbx) - { - cbx->event(DebugEventTarget::Lpm5Sleep); - } - } - else - { - deviceInLpm5 = false; - if(cbx) - { - cbx->event(DebugEventTarget::Lpm5Wakeup); - } - } - } - - if (eventMask & BP_HIT_FLAG) - { - saveContext(); - if (cbx) - cbx->event(DebugEventTarget::BreakpointHit); - } - - if (eventMask & STATE_STORAGE_FLAG) - { - uint16_t numEntries = 0; - (*messageData) >> numEntries; - - if (cbx) - cbx->event(DebugEventTarget::Storage, numEntries, 0); - } - - if (eventMask & VARIABLE_WATCH_FLAG) - { - if (cbx) - cbx->event(DebugEventTarget::VariableWatch); - } -} - -struct PinState -{ - PinState(JTAG_PIN pin, uint16_t state, uint16_t delay = 0) - : mask(1<& pinStates, DeviceHandleV3* handle) -{ - HalExecElement* el = new HalExecElement(ID_BitSequence); - el->appendInputData8( (uint8_t)pinStates.size() ); - - list::const_iterator it = pinStates.begin(); - for (; it != pinStates.end(); ++it) - { - el->appendInputData16( it->states ); - el->appendInputData16( it->mask ); - el->appendInputData16( it->delay ); - } - - HalExecCommand cmd; - cmd.elements.push_back(el); - return handle->send(cmd); -} - -bool DebugManagerV3::wakeupDevice() -{ - int i =0; - - list stateChanges; - - bool isSleeping = true; - - while(isSleeping && i++ < 5) - { - stateChanges.push_back( PinState(JTAG_PIN_TST, true, 5) ); - stateChanges.push_back( PinState(JTAG_PIN_TST, false, 20) ); - - stateChanges.push_back( PinState(JTAG_PIN_RST, false, 10) ); - stateChanges.push_back( PinState(JTAG_PIN_RST, true, 5) ); - - stateChanges.push_back( PinState(JTAG_PIN_TST, true, 5) ); - - sendPinSequence(stateChanges, parent); - stateChanges.clear(); - - ConfigManager *cm = parent->getFetHandle()->getConfigManager(); - cm->start(); - - isSleeping = queryLpm5State(); - if (!isSleeping) - { - break; - } - } - - return !isSleeping; -} - -/* sync Jtag */ -bool DebugManagerV3::stop(bool jtagWasReleased) -{ - bool success = false; - int attemptsLeft = 3; - bool isSleeping = false; - bool wasInLpmx5 = false; - - // Pause the polling loop while we try to wake up the device and sync again - this->pausePolling(); - - do - { - success = false; - - if (queryLpm5State()) - { - isSleeping = !wakeupDevice(); - wasInLpmx5 = true; - this->resumePolling(); - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(500)); - this->pausePolling(); - } - - // just save contex when no wakup was detected before - if(internalDebugState == D_LPMX5_WAKEUP_DETECTED) - { - wasInLpmx5 = true; - } - - success = saveContext(); - } - while ( isSleeping && --attemptsLeft ); - - success = success && !isSleeping; - - //If the device was in LPMx5, read reset vector and set PC - if ( success && wasInLpmx5) - { - MemoryManager* mm = parent->getMemoryManager(); - if ( MemoryArea* cpu = mm->getMemoryArea("CPU") ) - { - uint32_t buffer[2]; - if ( mm->read(0xFFFE, buffer, 2) && mm->sync() ) - { - cpu->write(0, buffer[0] | (buffer[1] << 8)); - cpu->write(2, 0); // BTT2001 status register bugfix - } - } - } - - // If the JTAG was released, we could not know that the device went into LPMx.5, - // thus manually generate the event in this case - if(jtagWasReleased && wasInLpmx5) - { - MessageDataPtr data(new MessageData); - (*data) << (uint16_t)JSTATE_CAPTURE_FLAG; - this->localCallback(data, 0); - } - - return success; -} - -bool DebugManagerV3::syncDeviceAfterLPMx5() -{ - internalDebugState = D_LPMX5_WAKEUP_DETECTED; - return true; -} - -bool DebugManagerV3::singleStep (uint32_t* cycles) -{ - MemoryManager* mm = this->parent->getMemoryManager(); - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; - - uint32_t pc, sr; - cpu->read(0, &pc, 1); - cpu->read(2, &sr, 1); - - /* flush and clear all caches */ - if (!mm->flushAll()) - { - return false; - } - - if (resetCycleCounterBeforeNextStep) - { - cycleCounter_.reset(); - } - - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->parent->getDevChainInfo()->getBusId())); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - HalExecElement* instructionRead = 0; - if (cycles && emulationLevel < EMEX_EXTRA_SMALL_5XX) - { - //we run that inline instead of through the MemoryManager - instructionRead = new HalExecElement(this->parent->checkHalId(ID_ReadMemWords)); - instructionRead->appendInputData32(pc); - instructionRead->appendInputData32(2); - instructionRead->setOutputSize(4); - cmd.elements.push_back(instructionRead); - } - - boost::shared_ptr wdt = this->parent->getWatchdogControl(); - el = new HalExecElement(this->parent->checkHalId(ID_SingleStep)); - // append stored watchdog value with hold bit - wdt->addParamsTo(el); - el->appendInputData32(pc); - el->appendInputData16(static_cast(sr)); - el->appendInputData16(7); // mask for RestoreContext_ReleaseJtag (inside SingleStep macro) - el->appendInputData16(opcode); - el->appendInputData16(0);//releaseJtag - opcode=0; - el->setOutputSize(8); - cmd.elements.push_back(el); - - parent->getFetHandle()->resumeLoopCmd( waitForStorage.getResponseId() ); - if (!this->parent->send(cmd)) - { - return false; - } - parent->getFetHandle()->pauseLoopCmd( waitForStorage.getResponseId() ); - - // Exit if device stepped into LPMx.5 mode - if(queryLpm5State()) - { - return true; - } - - // get watchdog from single step macro - uint16_t wdtCtrl = el->getOutputAt16(0); - if (!WatchdogControl::checkRead(wdtCtrl)) - { - return false; - } - // store watchdog values - wdt->set(wdtCtrl); - - pc = el->getOutputAt32(2); - sr = el->getOutputAt16(6); - - /* write PC and SR to MemoryManager to signal that _NO_ additional - * SyncJTAG is necessary - */ - cpu->write(0, pc); - cpu->write(2, sr); - cpu->getCacheCtrl()->fill(0, 16); - - if (cycles) - { - if (emulationLevel < EMEX_EXTRA_SMALL_5XX) - { - const uint16_t steppedIntoInterrupt = el->getOutputAt16(8); - uint32_t instruction = instructionRead->getOutputAt32(0); - cycleCounter_.countInstruction(instruction, steppedIntoInterrupt != 0); - } - *cycles = static_cast(cycleCounter_.read()); - } - - resetCycleCounterBeforeNextStep = false; - - return true; -} - - -bool DebugManagerV3::initEemRegister() -{ - bool success = false; - - MemoryManager *mm = this->parent->getMemoryManager(); - EemMemoryAccess *ema = mm ? dynamic_cast(mm->getMemoryArea("EEM")) : 0; - - if (ema) - { - ema->writeEemRegister(GENCTRL,0x0); - ema->writeEemRegister(MODCLKCTRL0, defaultMclkcntrl0); - ema->writeEemRegister(GENCLKCTRL, DefaultClkCntrl); - success = ema->sync(); - } - - cycleCounter_.configure(); - - if (EmulationManagerPtr emuManager = parent->getEmulationManager()) - emuManager->writeConfiguration(); - - return success; -} - -bool DebugManagerV3::eemWriteRegister(uint32_t addr, uint32_t value) -{ - MemoryManager *mm = this->parent->getMemoryManager(); - EemMemoryAccess *ema = mm ? dynamic_cast(mm->getMemoryArea("EEM")) : 0; - - return ema && ema->writeEemRegister((EemRegister)addr, value) && ema->sync(); -} - - -bool DebugManagerV3::eemReadRegister(uint32_t addr, uint32_t* buffer) -{ - MemoryManager *mm = this->parent->getMemoryManager(); - EemMemoryAccess *ema = mm ? dynamic_cast(mm->getMemoryArea("EEM")) : 0; - - return ema && ema->readEemRegister((EemRegister)(addr&0xfffffffe), buffer) && ema->sync(); -} - - -uint8_t DebugManagerV3::getClockControl() const -{ - return clockControl; -} - -uint16_t DebugManagerV3::getClockControlSetting() const -{ - return genclkcntrl; -} - -void DebugManagerV3::setClockControlSetting(uint16_t clkcntrl) -{ - genclkcntrl = clkcntrl; -} - -uint16_t DebugManagerV3::getClockModuleDefaultSetting() const -{ - return defaultMclkcntrl0; -} - -uint16_t DebugManagerV3::getClockModuleSetting() const -{ - return mclkcntrl0; -} - -void DebugManagerV3::setClockModuleSetting(uint16_t modules) -{ - mclkcntrl0 = modules; -} - -char ** DebugManagerV3::getModuleStrings(uint32_t * n) const -{ - *n=nModuleStrings; - return moduleStrings; -} - -char ** DebugManagerV3::getClockStrings(uint32_t * n) const -{ - *n=nClockStrings; - return clockStrings; -} - -void DebugManagerV3::setOpcode(uint16_t value) -{ - opcode=(uint16_t)value; -} - - -bool DebugManagerV3::saveContext() -{ - MemoryManager* mm = this->parent->getMemoryManager(); - - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; - - HalExecElement* el0 = new HalExecElement(this->parent->checkHalId(ID_SyncJtag_Conditional_SaveContext)); - this->parent->getWatchdogControl()->addParamsTo(el0, true); - el0->setOutputSize(8); - - HalExecCommand cmd; - cmd.elements.push_back(el0); - - if (!this->parent->send(cmd)) - { - return false; - } - - uint16_t wdtCtrl = el0->getOutputAt16(0); - - if (!WatchdogControl::checkRead(wdtCtrl)) - return false; - // sync watchdog after stopping CPU - this->parent->getWatchdogControl()->set(wdtCtrl); - - // get register values - uint32_t pc = el0->getOutputAt32(2); - uint32_t sr = el0->getOutputAt16(6); - - cpu->write(0, pc); - cpu->write(2, sr); - cpu->getCacheCtrl()->fill(0, 16); - - cycleCounter_.read(); - - return true; -} - -uint8_t DebugManagerV3::getRunEemResponseId() -{ - return waitForEem.getResponseId(); -} - -void DebugManagerV3::setLpmDebugging(bool enable) -{ - lpmDebuggingEnabled = enable; -} - -bool DebugManagerV3::getLpmDebugging() -{ - return lpmDebuggingEnabled; -} - -bool DebugManagerV3::activateJStatePolling(DebugEventTarget * cb) -{ - //If loop is already running, just return - if ( waitForJState.getResponseId() != 0 ) - { - return true; - } - - uint64_t mask = 0x8000000100000000LL; // Only interested in bit 63 - - if(cb!=0) - { - cbx = cb; - } - - HalExecElement* el = new HalExecElement(parent->checkHalId(ID_PollJStateReg)); - el->appendInputData32((uint32_t)(mask & 0xFFFFFFFF)); - el->appendInputData32((uint32_t)(mask >> 32)); - el->appendInputData16((uint16_t)false); - el->setOutputSize(2); - - this->waitForJState.elements.clear(); - this->waitForJState.elements.push_back(el); - - if (!this->parent->send(this->waitForJState)) - { - return false; - } - - this->pausePolling(); - - return true; -} - -bool DebugManagerV3::queryLpm5State() -{ - if (!getLpmDebugging()) - return false; - - const uint64_t bit = 1; - uint64_t mask = (bit << 63) | (bit << 62); - - HalExecElement* el = new HalExecElement(parent->checkHalId(ID_PollJStateReg)); - el->appendInputData32((uint32_t)(mask & 0xFFFFFFFF)); - el->appendInputData32((uint32_t)(mask >> 32)); - el->appendInputData16((uint16_t)1); - el->setOutputSize(10); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - uint64_t jstate = 0; - - if(this->parent->send(cmd)) - { - jstate = el->getOutputAt32(2); - jstate |= (uint64_t)el->getOutputAt32(6) << 32; - } - return (( jstate & (bit << 63) ) != 0); -} - -bool DebugManagerV3::isDeviceInLpm5() -{ - return deviceInLpm5; -} - -void DebugManagerV3::pausePolling() -{ - if(parent->getFetHandle()) - { - parent->getFetHandle()->pauseLoopCmd( waitForJState.getResponseId() ); - parent->getFetHandle()->pauseLoopCmd( waitForEem.getResponseId() ); - parent->getFetHandle()->pauseLoopCmd( waitForStorage.getResponseId() ); - } -} - -void DebugManagerV3::resumePolling() -{ - if(parent->getFetHandle()) - { - parent->getFetHandle()->resumeLoopCmd( waitForJState.getResponseId() ); - parent->getFetHandle()->resumeLoopCmd( waitForEem.getResponseId() ); - parent->getFetHandle()->resumeLoopCmd( waitForStorage.getResponseId() ); - } -} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/Database.cpp b/DLL430_v3/src/TI/DLL430/DeviceDb/Database.cpp new file mode 100644 index 0000000..4f056e6 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/Database.cpp @@ -0,0 +1,101 @@ +/* + * Registration.cpp + * + * Copyright (C) 2011 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. + */ + +#include + +#include "Database.h" +#include "ziparchive.h" +#include "loadxml.h" +#include "exportxml.h" + +using namespace TI::DLL430; +using namespace DeviceDb; + + +DeviceMap& Database::instance() +{ + static DeviceMap instance; + return instance; +} + + +int32_t Database::getMaxId() const +{ + return (int32_t)instance().size() - 1; +} + + +void Database::dump(const char *filename) const +{ + exportXml(instance(), filename); +} + +int32_t Database::findDevice(const IdCode& idCode) +{ + const DeviceMap& map = instance(); + + const auto& it = find_if(map.cbegin(), map.cend(), [&idCode](const DeviceMap::value_type& m) + { + return m.first == idCode; + }); + + if(it != map.cend() ) + { + return static_cast(std::distance(map.begin(), it)); + } + return -1; +} + +const DeviceInfo* Database::getDeviceInfo(size_t id) const +{ + if (id < instance().size()) + { + auto it = instance().cbegin(); + std::advance(it, id); + return &it->second; + } + return nullptr; +} + +void Database::loadDevices(const std::string& file, bool usefile) +{ + Archive archive(file, usefile); + XmlLoader(archive).load(); +} + +void Database::clearDevices() +{ + instance().clear(); +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/Database.h b/DLL430_v3/src/TI/DLL430/DeviceDb/Database.h new file mode 100644 index 0000000..2a2e9c8 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/Database.h @@ -0,0 +1,62 @@ +/* + * Registration.h + * + * Basic device creating engine - interface mechanism to create devices and to convert them to be used by MSP430v3.dll. + * + * Copyright (C) 2011 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. + */ + +#pragma once + +#include "DeviceInfo.h" + + +namespace TI { + namespace DLL430 { + namespace DeviceDb { + + class Database + { + public: + void loadDevices(const std::string& file, bool usefile); + void clearDevices(); + + int32_t findDevice(const IdCode& match); + const DeviceInfo* getDeviceInfo(size_t id) const; + int32_t getMaxId() const; + void dump(const char *filename) const; + + static DeviceMap& instance(); + }; + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/adapt_enum.h b/DLL430_v3/src/TI/DLL430/DeviceDb/adapt_enum.h new file mode 100644 index 0000000..83bdb85 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/adapt_enum.h @@ -0,0 +1,68 @@ +/* +* adapt_enum.h +* +* Data of device currently under control. +* +* Copyright (C) 2007 - 2011 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. +*/ + +#pragma once + +#include +#include + + +#define ADAPT_ENUM_VALUE_TO_STRING(R, ENUM, ENUM_VALUE)\ + case ENUM::ENUM_VALUE: return BOOST_PP_STRINGIZE(ENUM_VALUE); break; + +#define ADAPT_ENUM_VALUE_FROM_STRING(R, ENUM, ENUM_VALUE)\ + else if (!strcmp(str, BOOST_PP_STRINGIZE(ENUM_VALUE))) v = ENUM::ENUM_VALUE; + +#define ADAPT_ENUM(ENUM, ENUM_VALUES)\ + inline const char* toString(const ENUM& value) {\ + switch (value) {\ + BOOST_PP_SEQ_FOR_EACH(ADAPT_ENUM_VALUE_TO_STRING, ENUM, ENUM_VALUES)\ + default: throw std::runtime_error(std::string("invalid value for " BOOST_PP_STRINGIZE(ENUM) ": ") + std::to_string((unsigned)value));\ + }\ + }\ + inline void fromString(const char* str, ENUM& v) {\ + if (!str) throw std::runtime_error("String can't be null");\ + BOOST_PP_SEQ_FOR_EACH(ADAPT_ENUM_VALUE_FROM_STRING, ENUM, ENUM_VALUES)\ + else throw std::runtime_error(std::string("invalid " BOOST_PP_STRINGIZE(ENUM) " value: ") + str);\ + } + + +#define VALUE(R, _, ENUM_VALUE) ENUM_VALUE, + +#define DEFINE_ENUM(ENUM, ENUM_VALUES)\ + enum class ENUM {BOOST_PP_SEQ_FOR_EACH(VALUE, _, ENUM_VALUES)};\ + ADAPT_ENUM(ENUM, ENUM_VALUES) diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/devicedb.h b/DLL430_v3/src/TI/DLL430/DeviceDb/devicedb.h new file mode 100644 index 0000000..d8c9185 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/devicedb.h @@ -0,0 +1,7768 @@ +/* + * C:\MSP430\mspdebugstack\DLL430_v3\src\TI\DLL430\DeviceDb\devicedb.h + * + * Copyright (C) 2020 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. + */ + +#pragma once + +#include + +namespace TI { namespace DLL430 { namespace DeviceDb { + + uint8_t g_database[] = { + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x67, 0x65, 0x43, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x7d, 0x68, 0xf2, 0x4a, 0xe6, 0x17, 0xe1, 0x9e, + 0x2a, 0x03, 0x00, 0x00, 0x56, 0x26, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x43, 0x43, 0x34, 0x33, + 0x30, 0x2e, 0x78, 0x6d, 0x6c, 0xed, 0x9a, 0xdd, + 0x8e, 0xa2, 0x30, 0x18, 0x86, 0x8f, 0x9d, 0x64, + 0xee, 0xc1, 0x70, 0xbe, 0x83, 0x14, 0x41, 0x27, + 0x41, 0x13, 0x45, 0xdc, 0x4c, 0xa2, 0xbb, 0x9b, + 0xd1, 0xcd, 0x7a, 0xd6, 0x20, 0xd4, 0x2c, 0x91, + 0x9f, 0x09, 0xa0, 0x71, 0xf6, 0xea, 0xb7, 0xd0, + 0x82, 0xa8, 0x83, 0xa1, 0x64, 0x97, 0x01, 0xe3, + 0x9c, 0x0c, 0x6d, 0x3f, 0xbf, 0xd6, 0x3e, 0x7d, + 0xdf, 0xd6, 0xaa, 0x62, 0xa2, 0xbd, 0x65, 0xa0, + 0x2f, 0x96, 0xbb, 0xf1, 0x7c, 0x47, 0x0f, 0x2d, + 0xcf, 0x6d, 0xef, 0x91, 0x1f, 0xe0, 0xff, 0x03, + 0x4e, 0x78, 0xea, 0x70, 0xc3, 0xc7, 0x87, 0x96, + 0x62, 0x39, 0x6f, 0x9e, 0x1f, 0xb6, 0x37, 0x96, + 0x8d, 0x06, 0x9c, 0x89, 0x36, 0xfa, 0xce, 0x0e, + 0x83, 0xa7, 0x83, 0x63, 0x73, 0x3c, 0x6e, 0x8f, + 0x22, 0x0c, 0xdb, 0x33, 0xb6, 0x2f, 0x38, 0x49, + 0xdb, 0x32, 0x07, 0xdc, 0x54, 0x12, 0x44, 0x31, + 0x7e, 0x29, 0x6d, 0x51, 0x3d, 0x37, 0xf4, 0x3d, + 0x7b, 0xf8, 0x55, 0x55, 0xa1, 0xb6, 0x5a, 0x6a, + 0xdf, 0x26, 0xda, 0x44, 0xe1, 0xb3, 0x4d, 0x24, + 0x18, 0x21, 0x67, 0x69, 0x39, 0xb8, 0xff, 0xf3, + 0x34, 0xc7, 0xa6, 0xb6, 0xe5, 0x9a, 0xe8, 0x30, + 0xe0, 0x00, 0xd7, 0xf6, 0xd1, 0x66, 0xc0, 0x8d, + 0xb4, 0x85, 0x00, 0xfa, 0x1c, 0x9f, 0x13, 0x26, + 0xd2, 0x30, 0xf5, 0xfb, 0xfc, 0x07, 0x1c, 0xe7, + 0x86, 0x75, 0x93, 0x6c, 0x13, 0x55, 0x00, 0xa3, + 0xdc, 0x30, 0x89, 0x86, 0xbd, 0x2e, 0xd5, 0xdc, + 0x18, 0x99, 0xc6, 0xfc, 0x5c, 0xa8, 0x2f, 0x62, + 0x6e, 0x54, 0x2f, 0x13, 0x05, 0x72, 0xa3, 0xfa, + 0x99, 0x28, 0x21, 0x37, 0xea, 0x39, 0x13, 0xd5, + 0xc9, 0x8d, 0x12, 0x92, 0xa9, 0x58, 0x8e, 0x44, + 0x28, 0x5c, 0x99, 0x0b, 0xa1, 0x9b, 0x06, 0x4a, + 0xf0, 0x4a, 0xbe, 0x64, 0x32, 0x7e, 0x4d, 0x96, + 0x30, 0x99, 0x32, 0x85, 0x4f, 0x11, 0xe2, 0x32, + 0x2e, 0xa6, 0x0b, 0xe3, 0xe3, 0x85, 0x22, 0x0b, + 0x80, 0xcc, 0xc4, 0xe9, 0xa2, 0x49, 0x93, 0x64, + 0x9b, 0xf2, 0xc6, 0xd1, 0xa1, 0x09, 0x66, 0xea, + 0x64, 0x5c, 0x74, 0x18, 0x0e, 0x72, 0x3c, 0xff, + 0x3d, 0x1e, 0xc3, 0xab, 0xee, 0x00, 0xa8, 0xaa, + 0x5d, 0xb1, 0x03, 0xc1, 0x36, 0x4e, 0x15, 0xd7, + 0xc1, 0xd5, 0x1e, 0xd0, 0xd1, 0x04, 0xa1, 0xee, + 0x87, 0xc3, 0xce, 0x41, 0x30, 0xfa, 0x1d, 0x85, + 0x8f, 0x4b, 0xb4, 0xc1, 0xfa, 0x83, 0x70, 0x7d, + 0x2f, 0xaa, 0x8e, 0x9e, 0x49, 0x5f, 0x24, 0xf7, + 0xd5, 0x8e, 0xba, 0xa4, 0xa3, 0xf3, 0xce, 0x4f, + 0xb2, 0x6e, 0x92, 0xac, 0xa4, 0x76, 0xad, 0xbb, + 0xdb, 0x60, 0x08, 0x14, 0x3e, 0x7e, 0xb8, 0xec, + 0x89, 0x2a, 0x99, 0xa4, 0x9d, 0x10, 0x8d, 0xa6, + 0xef, 0x21, 0x6a, 0x0d, 0x0c, 0xdf, 0x7a, 0x8b, + 0x04, 0x3e, 0x8c, 0xfb, 0x8b, 0xa6, 0x5e, 0x52, + 0xf8, 0x4c, 0x3d, 0x09, 0xb4, 0x4c, 0xd5, 0x33, + 0x11, 0x9d, 0x6b, 0x6a, 0x05, 0x78, 0x34, 0x40, + 0x92, 0x05, 0x85, 0xa7, 0x65, 0xda, 0x1a, 0xec, + 0xd6, 0x49, 0x05, 0x1e, 0xea, 0xb1, 0x44, 0x11, + 0x90, 0x4c, 0x29, 0xd0, 0xa1, 0x36, 0xd7, 0x56, + 0x70, 0x31, 0x1f, 0xcd, 0x66, 0x50, 0x5a, 0xad, + 0x62, 0x44, 0xa4, 0x31, 0x0b, 0xa7, 0xc5, 0x68, + 0x19, 0x99, 0xb5, 0x12, 0x95, 0x8b, 0x3b, 0x45, + 0x51, 0xab, 0x28, 0x64, 0x02, 0x05, 0x5d, 0xa0, + 0xa0, 0x0d, 0x14, 0xf4, 0x81, 0x82, 0x46, 0x50, + 0x4c, 0x31, 0x0c, 0x86, 0x51, 0xd4, 0x31, 0x0a, + 0x5a, 0xc6, 0xb9, 0x58, 0xcf, 0xd4, 0xda, 0x4a, + 0x34, 0x34, 0xd3, 0xdf, 0xbd, 0x5d, 0x98, 0xb3, + 0xbe, 0x53, 0xa1, 0xb9, 0xba, 0x83, 0xf7, 0xa8, + 0xb9, 0x6e, 0xb9, 0x71, 0x57, 0xe4, 0x11, 0x4e, + 0x6d, 0x3d, 0xf8, 0x0d, 0x05, 0x79, 0x0b, 0x01, + 0x1c, 0x47, 0xfa, 0xc1, 0x7d, 0x5f, 0xbc, 0x2c, + 0x56, 0xe3, 0xa9, 0x01, 0x60, 0x51, 0xa6, 0x8e, + 0x92, 0x1d, 0x05, 0x5d, 0xd4, 0x87, 0x70, 0x8a, + 0xf4, 0x70, 0xe7, 0xa3, 0x80, 0x27, 0x82, 0x24, + 0x1a, 0x2c, 0x2f, 0x48, 0x99, 0x41, 0x90, 0xf2, + 0x5d, 0x90, 0x77, 0x41, 0x36, 0x5b, 0x90, 0x22, + 0xa8, 0xbb, 0x20, 0x7b, 0x0c, 0x82, 0xec, 0x55, + 0x20, 0xc8, 0x68, 0xf0, 0xc9, 0xb1, 0x89, 0xff, + 0x74, 0x18, 0x5d, 0x7a, 0x64, 0xf9, 0xf0, 0x78, + 0x72, 0x44, 0x54, 0x15, 0xaf, 0xe8, 0x94, 0x58, + 0x9c, 0x97, 0x28, 0x4a, 0x95, 0xf1, 0x8a, 0x46, + 0xf6, 0xaf, 0x79, 0xf5, 0x99, 0x71, 0x95, 0xd5, + 0x4e, 0x29, 0x12, 0x0c, 0x67, 0x4b, 0x51, 0x6a, + 0x36, 0x89, 0xda, 0x9f, 0x2b, 0xd8, 0x60, 0x34, + 0xdb, 0xc6, 0x2a, 0x84, 0xc1, 0x8e, 0x02, 0xaf, + 0x3e, 0x86, 0x1d, 0x45, 0xec, 0x35, 0x5b, 0x17, + 0xf5, 0xda, 0x51, 0xd8, 0x69, 0xc9, 0x8c, 0xb4, + 0x9a, 0x2d, 0x9c, 0x7a, 0xd1, 0x2a, 0xc7, 0xab, + 0xcb, 0xc0, 0xab, 0x8f, 0x6d, 0xf1, 0x96, 0x78, + 0xb5, 0x33, 0x7f, 0x57, 0xc0, 0x1d, 0xaf, 0xa0, + 0x72, 0x29, 0x83, 0x33, 0xcc, 0xf8, 0x43, 0x5a, + 0xf4, 0x59, 0xe3, 0x98, 0xbe, 0x04, 0xcf, 0x52, + 0x34, 0x19, 0xb6, 0x2d, 0x4c, 0x53, 0x6e, 0x32, + 0x4d, 0xb6, 0x6d, 0x2b, 0xbd, 0x33, 0x64, 0x86, + 0x58, 0x15, 0x3a, 0x86, 0x83, 0x38, 0x46, 0xd7, + 0x6b, 0x32, 0x3a, 0xa6, 0x83, 0x78, 0xcd, 0xc9, + 0x49, 0xac, 0x16, 0xda, 0xaf, 0x8a, 0xdc, 0xe7, + 0x1f, 0x50, 0xca, 0x3b, 0x67, 0x55, 0xe8, 0xd8, + 0xfc, 0xf2, 0xb9, 0xc9, 0xe8, 0x6e, 0xca, 0x2f, + 0x25, 0x56, 0xbf, 0xd4, 0x9b, 0x8c, 0xee, 0xb6, + 0xfc, 0x92, 0xe5, 0x4b, 0x34, 0x4c, 0x6e, 0xfd, + 0xdf, 0xc9, 0xdd, 0xef, 0xec, 0xab, 0xb9, 0xb3, + 0xbf, 0xb5, 0xcb, 0xf8, 0x1b, 0x73, 0x54, 0xc0, + 0xe6, 0xa8, 0xc6, 0x5d, 0x97, 0x77, 0x5d, 0xd6, + 0x52, 0x97, 0xf5, 0xdd, 0x2e, 0x1f, 0x1f, 0x70, + 0xe1, 0xe2, 0xf7, 0x63, 0xb8, 0xe1, 0x2f, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xd8, 0xa3, 0x73, + 0xc1, 0x73, 0x0d, 0x00, 0x00, 0x3d, 0x6a, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x78, 0x6d, + 0x6c, 0xed, 0x5d, 0x5b, 0x73, 0xe3, 0x34, 0x14, + 0x7e, 0x86, 0x19, 0xfe, 0x43, 0xd8, 0x27, 0x78, + 0x58, 0x1a, 0x2b, 0x37, 0x77, 0x26, 0x84, 0x71, + 0x6e, 0xb0, 0xd0, 0x6c, 0x4b, 0x92, 0x85, 0xbe, + 0x79, 0xbc, 0x8e, 0xda, 0x66, 0xea, 0xc4, 0xc1, + 0x76, 0xb2, 0x29, 0xbf, 0x9e, 0x23, 0xc9, 0xb6, + 0x6c, 0xcb, 0x8e, 0x65, 0xc5, 0x69, 0x61, 0x86, + 0xce, 0x00, 0x96, 0x74, 0xfc, 0x7d, 0xe7, 0x22, + 0x1d, 0x5d, 0xa2, 0x84, 0xfe, 0x0a, 0x1f, 0xd6, + 0x36, 0x7e, 0xbf, 0xde, 0x3e, 0xb8, 0xde, 0xc6, + 0x0a, 0xd6, 0xee, 0xb6, 0x71, 0xc0, 0x9e, 0x0f, + 0xff, 0xfd, 0xf1, 0x9d, 0xf6, 0x43, 0xf3, 0xdd, + 0xe0, 0x9b, 0xaf, 0xbf, 0xea, 0x63, 0xbc, 0x59, + 0xae, 0x37, 0xd8, 0x6b, 0xac, 0x57, 0x3f, 0xbe, + 0xfb, 0x73, 0xbc, 0x34, 0x8d, 0x77, 0x83, 0xfe, + 0xd6, 0xda, 0xe0, 0xc1, 0x9f, 0x56, 0x60, 0x3f, + 0xad, 0xdc, 0xc7, 0x06, 0x6d, 0xef, 0x5f, 0xd1, + 0xca, 0xfe, 0xc1, 0x72, 0xf6, 0x78, 0xd0, 0x3c, + 0x36, 0x8d, 0xfe, 0x15, 0x7b, 0x06, 0x9e, 0x07, + 0x6b, 0xef, 0x04, 0x8b, 0xc0, 0xdd, 0x0d, 0x02, + 0x6f, 0x8f, 0xfb, 0x57, 0xc9, 0x9a, 0xfe, 0x55, + 0x44, 0x21, 0xf2, 0x19, 0xe3, 0x91, 0x86, 0x62, + 0x42, 0x56, 0xca, 0x12, 0x8d, 0xf5, 0x90, 0xa8, + 0x1c, 0x69, 0x98, 0x42, 0x1a, 0xaa, 0x23, 0x35, + 0x93, 0x40, 0x4d, 0x01, 0xa7, 0x2b, 0x8d, 0x13, + 0x6b, 0xc4, 0x4a, 0x6a, 0x48, 0xc3, 0xe5, 0x7c, + 0x39, 0x8a, 0x80, 0x68, 0x21, 0x8b, 0xa3, 0xd7, + 0x11, 0x8c, 0xc5, 0x18, 0xb5, 0x63, 0x7d, 0x49, + 0x41, 0x54, 0xb7, 0x23, 0xa3, 0xee, 0xd8, 0x00, + 0xe7, 0x47, 0x38, 0xb4, 0x90, 0xc5, 0x19, 0x35, + 0x65, 0x70, 0x6e, 0x46, 0xe3, 0x49, 0x04, 0x43, + 0x9e, 0xb3, 0x28, 0x43, 0x59, 0x94, 0xd8, 0x77, + 0xe4, 0x59, 0x19, 0x25, 0x76, 0x0d, 0x79, 0x56, + 0x43, 0x19, 0xdd, 0xce, 0xee, 0xcc, 0xd8, 0xa6, + 0x91, 0xbb, 0xd9, 0x59, 0x9e, 0x15, 0xb8, 0x5e, + 0x43, 0xb0, 0xcd, 0x90, 0xea, 0xaa, 0x14, 0x6f, + 0x9c, 0x83, 0x37, 0x3e, 0x03, 0x6f, 0x98, 0x83, + 0x37, 0x54, 0xc3, 0x4b, 0x74, 0xdb, 0xda, 0x3a, + 0x6d, 0x03, 0xfe, 0xd2, 0x2c, 0xf8, 0xd3, 0x62, + 0xf4, 0x61, 0xd8, 0x8a, 0x98, 0xc2, 0x62, 0x96, + 0xad, 0xd5, 0x92, 0xd1, 0x98, 0xbd, 0x1c, 0xf7, + 0xde, 0xb0, 0x28, 0x60, 0x21, 0x79, 0x2c, 0x2d, + 0x8d, 0xa5, 0x09, 0x58, 0x9a, 0x3c, 0x56, 0x9c, + 0x96, 0xc2, 0xa2, 0x80, 0x25, 0xd5, 0x0b, 0xe9, + 0xcb, 0x46, 0xda, 0x5f, 0x86, 0xe0, 0x2f, 0x34, + 0x95, 0xc7, 0x8a, 0xfd, 0x15, 0x16, 0x05, 0xac, + 0x89, 0x3c, 0x56, 0xec, 0xaf, 0xb0, 0x28, 0x60, + 0x8d, 0xe5, 0xb1, 0x62, 0x7f, 0x85, 0x45, 0x01, + 0x6b, 0x24, 0x83, 0x45, 0xde, 0x8d, 0xbd, 0x45, + 0x0b, 0x02, 0xce, 0x50, 0x16, 0x07, 0x25, 0x71, + 0x44, 0x3f, 0x19, 0xb2, 0x38, 0x5a, 0x12, 0x47, + 0xf4, 0xd1, 0xb5, 0x2c, 0x4e, 0x33, 0x89, 0x23, + 0xfa, 0x27, 0x1a, 0xe5, 0x65, 0x43, 0x70, 0x69, + 0x20, 0x53, 0x33, 0xe3, 0xc1, 0x4e, 0x1b, 0x34, + 0x53, 0xec, 0x08, 0xfa, 0xb0, 0x9e, 0x21, 0x4f, + 0xf8, 0x50, 0x86, 0x0f, 0xe5, 0xf1, 0x8d, 0xea, + 0xe3, 0x6b, 0x65, 0xf8, 0x5a, 0x79, 0x7c, 0x63, + 0x15, 0xbe, 0xaf, 0x44, 0xb2, 0x66, 0x8a, 0xaa, + 0x59, 0x9b, 0x2b, 0x73, 0xa8, 0xb4, 0xf2, 0xa8, + 0x29, 0x79, 0x31, 0x87, 0x0a, 0x95, 0x07, 0x4c, + 0xc9, 0x81, 0x79, 0x01, 0x6b, 0x67, 0xd8, 0xda, + 0xb5, 0xb1, 0xe5, 0x19, 0x66, 0x0e, 0xcb, 0x4d, + 0xab, 0x2b, 0x60, 0xad, 0xf2, 0x6e, 0xa8, 0xd7, + 0x45, 0x65, 0x0e, 0xcb, 0xc9, 0xea, 0xe9, 0x1d, + 0x2d, 0xb1, 0xcf, 0xb7, 0x04, 0xaa, 0x49, 0x4d, + 0x54, 0x42, 0x9f, 0x17, 0xa9, 0xa6, 0x75, 0x51, + 0x99, 0xc3, 0x72, 0xb2, 0xba, 0xec, 0xca, 0x0c, + 0xb0, 0xcb, 0xd9, 0xd5, 0x11, 0xa3, 0xd5, 0xc9, + 0x52, 0x5d, 0x6b, 0x35, 0x51, 0x65, 0x3a, 0xfc, + 0xc5, 0xa8, 0x86, 0x62, 0x1f, 0x14, 0xd7, 0x91, + 0xd7, 0xbd, 0x9a, 0xa8, 0x32, 0x7d, 0x30, 0x8f, + 0xaa, 0x96, 0x61, 0x3c, 0x14, 0xba, 0x45, 0x1e, + 0xd5, 0x75, 0x2d, 0x54, 0x3d, 0xd1, 0x81, 0x3d, + 0x81, 0xaa, 0x96, 0xa4, 0x3b, 0x16, 0x63, 0x35, + 0x16, 0xac, 0xea, 0xb5, 0x6b, 0xa2, 0xca, 0xc4, + 0x2a, 0x8f, 0xaa, 0x53, 0x03, 0xd5, 0xa7, 0x45, + 0x9c, 0x2b, 0xe0, 0x31, 0x4b, 0xd1, 0x96, 0x5a, + 0xdd, 0x1b, 0x93, 0x85, 0x86, 0xf4, 0x08, 0x86, + 0x95, 0xb2, 0x48, 0xdd, 0xa6, 0x8a, 0xb2, 0x0d, + 0xf8, 0x13, 0xb8, 0x50, 0xa7, 0x1b, 0x71, 0xb1, + 0x52, 0x3d, 0x5c, 0x19, 0xa3, 0xee, 0x6e, 0xe7, + 0xcb, 0x88, 0x86, 0x3c, 0x67, 0x49, 0x3a, 0x52, + 0xae, 0x19, 0x8d, 0x16, 0x11, 0x08, 0x3c, 0x66, + 0x31, 0x34, 0xa9, 0x4d, 0x8a, 0x71, 0x77, 0x7b, + 0x7b, 0x13, 0xa1, 0xd0, 0x82, 0x70, 0x14, 0x90, + 0x7f, 0x48, 0x22, 0x20, 0xcd, 0x46, 0x37, 0xbf, + 0xed, 0xd6, 0xdb, 0x08, 0x8b, 0x14, 0x1b, 0xdf, + 0xdd, 0xad, 0xb7, 0xdf, 0x53, 0xc0, 0xb3, 0xdc, + 0xb5, 0xc8, 0x60, 0x2f, 0xea, 0x04, 0x37, 0xd2, + 0xd8, 0x46, 0x1a, 0xba, 0xfc, 0x4c, 0x0c, 0xa5, + 0x0e, 0xe9, 0x24, 0x5e, 0x5a, 0x8c, 0xb5, 0xb8, + 0x8f, 0x91, 0x67, 0x89, 0x57, 0xe0, 0x88, 0xc6, + 0x9c, 0xce, 0x27, 0xbf, 0x27, 0x8e, 0x6c, 0x1a, + 0x53, 0x0f, 0xff, 0xb5, 0xc7, 0x5b, 0xfb, 0x45, + 0xe2, 0xfd, 0xe9, 0x8d, 0xb1, 0xf8, 0xc5, 0x1c, + 0x2d, 0xe7, 0x71, 0xa8, 0xa7, 0x8e, 0xe5, 0x3f, + 0x35, 0x46, 0xee, 0x36, 0xf0, 0x5c, 0x47, 0x02, + 0xe1, 0xd3, 0xc2, 0x98, 0x2f, 0xe3, 0x0c, 0xc5, + 0x4a, 0xb2, 0xaf, 0xc5, 0xd9, 0x86, 0x95, 0x24, + 0x5e, 0x5b, 0xa6, 0xd7, 0x18, 0xc3, 0xf3, 0xa3, + 0x0c, 0xd3, 0x46, 0x1a, 0xb2, 0x55, 0x03, 0xa6, + 0x91, 0x82, 0x34, 0xea, 0x40, 0x6c, 0xa5, 0x21, + 0x6b, 0xd0, 0x72, 0x68, 0x2c, 0x3e, 0x8c, 0xcc, + 0xe5, 0x87, 0xd9, 0x64, 0x1e, 0x9f, 0xb9, 0x5a, + 0xfe, 0xda, 0xa6, 0x12, 0x0a, 0xf0, 0x49, 0x02, + 0x9f, 0xf5, 0xae, 0x4e, 0xeb, 0x78, 0xa4, 0xa7, + 0xef, 0x49, 0xea, 0xed, 0x0a, 0x1f, 0x7f, 0x7c, + 0xd7, 0x7a, 0xd7, 0xf0, 0xf0, 0x43, 0x7c, 0x14, + 0x77, 0x95, 0x2f, 0xd5, 0xa6, 0x52, 0xd1, 0xf9, + 0x79, 0x91, 0x54, 0x87, 0x4a, 0xd1, 0x63, 0xb8, + 0x22, 0x91, 0x2e, 0x15, 0x09, 0xcf, 0x38, 0x8a, + 0x84, 0x7a, 0x09, 0x21, 0x54, 0x24, 0xa4, 0x27, + 0x84, 0xb4, 0x22, 0xa1, 0xeb, 0x84, 0x50, 0xb3, + 0x48, 0x48, 0xd3, 0xa8, 0x14, 0x5b, 0x4f, 0x14, + 0x4b, 0x21, 0x2a, 0x15, 0xae, 0x7b, 0x0b, 0xa5, + 0x98, 0x3f, 0xe3, 0xa5, 0x78, 0xa1, 0x5c, 0x3b, + 0x96, 0xeb, 0x9c, 0xe0, 0x64, 0x1e, 0x0d, 0x3f, + 0x27, 0x61, 0x52, 0x3c, 0xd6, 0x7e, 0x18, 0x6c, + 0xdb, 0x71, 0xed, 0xe7, 0x0f, 0xf0, 0xa1, 0x4b, + 0x26, 0xd8, 0x61, 0x4b, 0x98, 0x43, 0x06, 0x3f, + 0x8f, 0x46, 0xe6, 0xe4, 0x7e, 0x39, 0xf9, 0x38, + 0x9e, 0xc0, 0x8a, 0x28, 0xd9, 0x94, 0x26, 0xf7, + 0x09, 0x65, 0x88, 0x13, 0x51, 0xc6, 0x14, 0x21, + 0xe5, 0x7a, 0x35, 0xb3, 0xfc, 0x67, 0x76, 0xfa, + 0xce, 0xfa, 0xa1, 0x79, 0x7f, 0x40, 0x21, 0x6b, + 0xf8, 0x99, 0x0f, 0x4c, 0x4d, 0x0f, 0xf0, 0xd7, + 0xbf, 0x0a, 0xcb, 0xac, 0xd1, 0xdf, 0x7f, 0xce, + 0xb6, 0xf3, 0x2a, 0x46, 0xc6, 0xc0, 0x73, 0x8d, + 0xfb, 0xe8, 0x6e, 0x71, 0x91, 0x6d, 0x1f, 0x6f, + 0x3f, 0x4e, 0xb2, 0x76, 0x89, 0xba, 0x53, 0x3b, + 0x47, 0xa4, 0x8a, 0x8d, 0x8d, 0x45, 0x60, 0x6d, + 0x57, 0x96, 0xb7, 0xa2, 0xa8, 0xbc, 0x31, 0x11, + 0x4f, 0x36, 0x9b, 0xf5, 0xaf, 0xa2, 0xa6, 0x8c, + 0x20, 0x0f, 0xe8, 0xc0, 0x10, 0xe4, 0x78, 0x29, + 0x3f, 0x58, 0x4b, 0xf2, 0x4a, 0x91, 0x41, 0x8b, + 0xa5, 0xf1, 0x71, 0x6c, 0xcc, 0x0b, 0x82, 0xc5, + 0x61, 0xbf, 0xca, 0x53, 0x07, 0xa6, 0x82, 0xa5, + 0xa8, 0x4f, 0x05, 0x0b, 0x65, 0x4d, 0x4c, 0xda, + 0x98, 0xe9, 0x48, 0xd9, 0xce, 0x93, 0xeb, 0x82, + 0xc9, 0x31, 0xc0, 0x80, 0xbf, 0x52, 0xec, 0xb2, + 0x8c, 0xf8, 0x95, 0x6c, 0x13, 0x6d, 0x39, 0xb8, + 0x4e, 0x60, 0x3d, 0x62, 0x52, 0x93, 0x1c, 0x0d, + 0xd1, 0x48, 0xb0, 0xed, 0xd9, 0x7a, 0x3b, 0xd0, + 0xf4, 0x26, 0xcc, 0xc5, 0xac, 0xc0, 0x1b, 0xac, + 0xe3, 0xa0, 0xd5, 0x25, 0x0d, 0xac, 0x10, 0x37, + 0xd0, 0x99, 0x9f, 0x48, 0x22, 0x44, 0x5a, 0x79, + 0x0d, 0x7f, 0x77, 0x81, 0xed, 0xbd, 0x87, 0xa9, + 0x4c, 0x87, 0xc8, 0xc4, 0x55, 0x5c, 0x68, 0xb7, + 0xe3, 0x35, 0xc0, 0x02, 0x42, 0x71, 0x95, 0x28, + 0x44, 0xe8, 0x7b, 0x69, 0xa1, 0x58, 0xa3, 0x00, + 0xfb, 0xc1, 0x1f, 0xbb, 0x68, 0xd6, 0x09, 0x4b, + 0xcc, 0x19, 0xa1, 0xf1, 0xe5, 0xee, 0x30, 0x3f, + 0xba, 0x00, 0xcc, 0x72, 0x19, 0x77, 0x91, 0x68, + 0x70, 0x2f, 0xd7, 0xe0, 0x88, 0xf3, 0xc1, 0x72, + 0xfc, 0x33, 0x55, 0x30, 0x6f, 0xdc, 0x2f, 0x80, + 0x4b, 0xf1, 0x33, 0xea, 0xd4, 0xc9, 0xf5, 0xcb, + 0xfa, 0xf1, 0xc9, 0x64, 0xf1, 0xe6, 0x2c, 0x5c, + 0x0b, 0x6e, 0x3a, 0xb3, 0xba, 0x4a, 0xef, 0x48, + 0x84, 0xbe, 0x97, 0x0d, 0x7d, 0x55, 0x35, 0x21, + 0x65, 0x97, 0xc6, 0x84, 0xf5, 0xdd, 0xa8, 0xe6, + 0x04, 0xc9, 0x03, 0xb6, 0x02, 0x50, 0x23, 0x5c, + 0x71, 0x38, 0x4e, 0x72, 0x3c, 0x2f, 0x5e, 0xfc, + 0x00, 0x6f, 0x06, 0xd3, 0x9b, 0x9b, 0xbb, 0x9b, + 0x4f, 0xb0, 0x11, 0x4a, 0x54, 0x32, 0xa9, 0xbf, + 0xf6, 0x6b, 0xfb, 0x79, 0x86, 0x37, 0x73, 0x6c, + 0xad, 0xc2, 0x9e, 0x96, 0xac, 0x0a, 0xa7, 0x0e, + 0x58, 0xea, 0x00, 0xf0, 0xf8, 0xf3, 0x63, 0x28, + 0xc2, 0x2b, 0x98, 0x52, 0x91, 0x0a, 0xa2, 0x46, + 0xdc, 0x66, 0x74, 0x3c, 0xe6, 0x68, 0x36, 0x1c, + 0x91, 0x86, 0x1c, 0xc5, 0x1c, 0xfb, 0x01, 0x87, + 0x6c, 0xe4, 0x51, 0x5a, 0x5b, 0x39, 0x65, 0x48, + 0x00, 0x44, 0x65, 0x66, 0xb7, 0x63, 0xf3, 0x76, + 0x31, 0x7a, 0x0b, 0x6d, 0xcc, 0xa9, 0x67, 0x6d, + 0x5e, 0x45, 0xa5, 0xaf, 0xfa, 0x4f, 0x96, 0x4f, + 0xd8, 0xc2, 0xf6, 0xb0, 0x94, 0xab, 0x2d, 0x3e, + 0x06, 0xd3, 0xd3, 0xee, 0x33, 0xb5, 0x56, 0xaf, + 0x17, 0x22, 0xd1, 0x67, 0x86, 0x13, 0xbd, 0xc8, + 0xa1, 0x76, 0xee, 0x17, 0xec, 0x2d, 0x70, 0x10, + 0xac, 0xb7, 0x8f, 0x22, 0x18, 0xcf, 0x01, 0x73, + 0xfc, 0xd8, 0xfa, 0x83, 0x2c, 0x43, 0xe8, 0x39, + 0x08, 0x82, 0x21, 0x90, 0xaa, 0xcd, 0x08, 0x86, + 0x18, 0x64, 0x53, 0x1f, 0x09, 0xf2, 0xda, 0x8c, + 0xec, 0x64, 0x6b, 0x7d, 0x76, 0xf0, 0xcd, 0x6e, + 0xd3, 0xe1, 0xd0, 0x62, 0x5b, 0x96, 0x60, 0xed, + 0x0b, 0x6f, 0xe5, 0x35, 0x32, 0xb3, 0x93, 0x46, + 0x16, 0x1b, 0x1e, 0x87, 0x3b, 0xc5, 0x15, 0xda, + 0xac, 0x35, 0x9b, 0x9a, 0x1e, 0x73, 0x08, 0x26, + 0xc7, 0x06, 0xc7, 0x22, 0x79, 0xc6, 0x72, 0x73, + 0x42, 0x44, 0x2e, 0x5e, 0x60, 0x69, 0xda, 0x4e, + 0xa2, 0x81, 0xd8, 0x70, 0x76, 0x90, 0xfe, 0x7b, + 0x21, 0x82, 0xb3, 0x85, 0xe3, 0xf5, 0x59, 0x71, + 0x22, 0x82, 0xcd, 0x8a, 0xd1, 0xd2, 0x2b, 0x46, + 0x8b, 0x30, 0xc8, 0x07, 0xcc, 0x6e, 0x5a, 0x97, + 0x09, 0x98, 0xad, 0x18, 0x30, 0xab, 0x72, 0xc0, + 0x36, 0x78, 0xe3, 0x7a, 0x2f, 0x6c, 0x13, 0xef, + 0x3b, 0x66, 0x66, 0x25, 0xf1, 0xb2, 0x0b, 0x4f, + 0x71, 0x00, 0x16, 0x9e, 0x59, 0xed, 0xe7, 0x75, + 0xe0, 0x0f, 0xc8, 0x91, 0x12, 0x79, 0x88, 0xa6, + 0x35, 0xcb, 0x0b, 0xa8, 0xde, 0xa0, 0x00, 0x2d, + 0x84, 0xf5, 0xeb, 0xbf, 0xe9, 0x29, 0x2c, 0xa9, + 0x26, 0xcf, 0x61, 0x2d, 0x7e, 0xdc, 0xe0, 0x6d, + 0xb0, 0x60, 0x8d, 0x74, 0x85, 0xc8, 0xab, 0x22, + 0x12, 0x6b, 0x0b, 0xeb, 0x55, 0x38, 0x8b, 0xa6, + 0x0f, 0xac, 0x6e, 0x63, 0xed, 0x76, 0x38, 0x4a, + 0xc6, 0xac, 0xc0, 0x1a, 0x76, 0x9e, 0x1b, 0x60, + 0x3b, 0x20, 0xd6, 0x86, 0xad, 0xbc, 0x86, 0xe2, + 0x45, 0x76, 0x1a, 0xb6, 0x8d, 0x7d, 0x7f, 0xc0, + 0x0c, 0x1b, 0xba, 0x6e, 0x60, 0xbb, 0x2b, 0x3c, + 0x77, 0x37, 0xac, 0x3e, 0x34, 0x12, 0xb0, 0xb9, + 0x30, 0xa5, 0x8e, 0x6a, 0x4e, 0xfa, 0x8c, 0x6c, + 0x95, 0x41, 0xd7, 0x7f, 0x8b, 0xeb, 0xb4, 0x7f, + 0xbb, 0xeb, 0x46, 0xbb, 0x7d, 0x5e, 0x77, 0x83, + 0xae, 0xbb, 0x86, 0xa9, 0xd9, 0x63, 0x88, 0x49, + 0x1f, 0xe5, 0xfa, 0x47, 0x3b, 0xe1, 0x1e, 0xad, + 0x9a, 0x73, 0xc2, 0xf5, 0x32, 0x2b, 0x9d, 0xd6, + 0x7d, 0x82, 0x37, 0x35, 0xe8, 0xae, 0xbf, 0x89, + 0xee, 0x64, 0xbd, 0x7b, 0xee, 0x38, 0x87, 0x3c, + 0x59, 0x10, 0x8d, 0x13, 0x26, 0xb5, 0xdf, 0x68, + 0x9c, 0x7f, 0xe0, 0x77, 0x79, 0xa9, 0x8d, 0xca, + 0x3d, 0x96, 0x7a, 0x0e, 0xd1, 0x51, 0xee, 0xbf, + 0xaa, 0xe7, 0xf4, 0x62, 0xcf, 0x21, 0x39, 0xcf, + 0x5d, 0xdc, 0x2d, 0xd1, 0x34, 0x9f, 0x1a, 0x0e, + 0xd6, 0x46, 0xd6, 0x2b, 0xba, 0x82, 0x57, 0x2a, + 0x0e, 0x11, 0x29, 0xa7, 0x10, 0x13, 0x66, 0x89, + 0x6a, 0x38, 0xc5, 0xc6, 0x91, 0x4b, 0x36, 0xbb, + 0x7d, 0x08, 0x02, 0x4f, 0x4a, 0x1e, 0x22, 0x4b, + 0x20, 0xb6, 0x5b, 0x15, 0x9d, 0xc6, 0x8d, 0x46, + 0x91, 0xd1, 0xd2, 0x5a, 0x12, 0x5c, 0x45, 0x2d, + 0xbf, 0x7d, 0xff, 0xbe, 0x71, 0x63, 0xaf, 0x1a, + 0x96, 0x87, 0x2d, 0x9f, 0xfc, 0xbb, 0xe1, 0xc2, + 0x41, 0xa6, 0x03, 0x5e, 0x82, 0x45, 0x42, 0x43, + 0x87, 0x50, 0x35, 0x76, 0xd8, 0x5b, 0xef, 0x9e, + 0xb0, 0x67, 0x39, 0x54, 0xea, 0xdb, 0xc6, 0x1c, + 0x6f, 0x40, 0xe8, 0xa7, 0xc6, 0xfb, 0xf7, 0x83, + 0x8c, 0xa1, 0x80, 0x14, 0xa5, 0x16, 0xb5, 0x8e, + 0x70, 0x1d, 0x75, 0x83, 0x0b, 0x04, 0x3c, 0x61, + 0x79, 0xb1, 0xda, 0xb0, 0xf3, 0x1a, 0xd2, 0x10, + 0xa5, 0x6a, 0xd3, 0x01, 0x5a, 0xb1, 0xf0, 0xc8, + 0x63, 0x22, 0xad, 0x14, 0x53, 0xeb, 0x54, 0x05, + 0x6d, 0xa1, 0x52, 0x50, 0xd4, 0x94, 0x01, 0x9d, + 0x59, 0xeb, 0xad, 0x49, 0x53, 0x40, 0xe5, 0xa4, + 0x56, 0xef, 0x6a, 0x44, 0x46, 0x45, 0x13, 0x3d, + 0x53, 0xab, 0x05, 0xb5, 0x79, 0x1f, 0x7a, 0xd0, + 0x9b, 0x05, 0xd3, 0x6d, 0x45, 0x77, 0x98, 0xed, + 0x72, 0xae, 0xc2, 0x74, 0x5e, 0x99, 0x4c, 0x2f, + 0x25, 0xc3, 0x05, 0x64, 0x48, 0x85, 0x2c, 0x9e, + 0xc8, 0x38, 0x29, 0x57, 0x24, 0x6f, 0x86, 0x91, + 0xc6, 0xd6, 0xba, 0xa5, 0x96, 0xd8, 0x05, 0x96, + 0xb4, 0xab, 0x5b, 0x02, 0x6c, 0xa2, 0x29, 0xbc, + 0xf1, 0x4c, 0x5b, 0x50, 0x79, 0x17, 0xb0, 0x0a, + 0x6c, 0xe9, 0x56, 0xb7, 0xa5, 0x55, 0xde, 0xb9, + 0xf5, 0x02, 0x36, 0x5d, 0x89, 0x4d, 0xf4, 0x1c, + 0x6f, 0x3c, 0xd3, 0x73, 0xed, 0xf2, 0xfe, 0xdc, + 0x2e, 0xb0, 0xc5, 0xae, 0x6e, 0x4b, 0xe7, 0xba, + 0x94, 0x4d, 0xd3, 0xf2, 0xd9, 0xf0, 0x43, 0x65, + 0xb6, 0x6e, 0x79, 0xaf, 0x68, 0xb7, 0x0b, 0x13, + 0x43, 0x44, 0x77, 0x96, 0x7b, 0xaf, 0x21, 0x78, + 0x47, 0xa4, 0x95, 0xa8, 0x01, 0x12, 0x05, 0x6a, + 0x74, 0xab, 0x5b, 0x4d, 0x29, 0x5b, 0xa5, 0x94, + 0xad, 0x3a, 0x29, 0x61, 0x70, 0xb7, 0xc2, 0x2e, + 0xaa, 0xea, 0x70, 0x3d, 0xd7, 0xe1, 0xad, 0xaa, + 0x0e, 0xd7, 0xb4, 0x4e, 0x69, 0xd0, 0x0b, 0x4d, + 0xb7, 0xab, 0x9b, 0xae, 0xa1, 0x66, 0x29, 0x5f, + 0x61, 0x74, 0x57, 0x2a, 0x7c, 0x30, 0x27, 0xb4, + 0xcf, 0xf3, 0x35, 0xca, 0xef, 0xdc, 0xed, 0xca, + 0xbe, 0xbe, 0x46, 0xd2, 0xba, 0x74, 0x0a, 0x0e, + 0x4e, 0x5a, 0x35, 0xe9, 0x02, 0xd7, 0xf3, 0xce, + 0xd6, 0xa5, 0x5d, 0xa7, 0x2e, 0x48, 0x4e, 0x17, + 0xbb, 0x59, 0x49, 0x17, 0xb9, 0x04, 0x74, 0x17, + 0x6f, 0x05, 0xb4, 0x2e, 0x2c, 0x03, 0x65, 0xcf, + 0x40, 0x4e, 0xed, 0xfc, 0x5e, 0x7f, 0xe3, 0x97, + 0x32, 0xaf, 0x01, 0x7f, 0x27, 0x2c, 0xa4, 0x5b, + 0xb4, 0xa6, 0xba, 0x7d, 0xb9, 0x0b, 0x83, 0x8b, + 0x59, 0x96, 0xd9, 0x2c, 0xa6, 0x15, 0x66, 0x95, + 0x9d, 0xe3, 0x51, 0x66, 0x8b, 0x4f, 0xdc, 0x22, + 0xe7, 0x1c, 0x4d, 0xdd, 0x39, 0x47, 0x94, 0xeb, + 0x9f, 0xe9, 0xe4, 0x72, 0xb1, 0xbf, 0xb4, 0x87, + 0x96, 0xeb, 0xed, 0x0b, 0xec, 0x76, 0x89, 0x67, + 0xd4, 0x36, 0xc0, 0xdd, 0xdc, 0xd1, 0x60, 0xbc, + 0xae, 0x43, 0x98, 0x15, 0xdb, 0x95, 0x1b, 0x9e, + 0x32, 0xc8, 0x1f, 0x0d, 0x11, 0x7f, 0x14, 0xe6, + 0x0c, 0xbd, 0x6a, 0xca, 0xd0, 0x25, 0x47, 0xd4, + 0xab, 0x65, 0x8b, 0x94, 0x61, 0x10, 0xd4, 0xf3, + 0x0e, 0x3b, 0x50, 0xf3, 0x4d, 0x4e, 0x3b, 0x40, + 0x41, 0x14, 0x29, 0x1e, 0x6d, 0x71, 0x53, 0xd6, + 0x48, 0x2e, 0x9c, 0x65, 0xf7, 0xb8, 0x49, 0xbe, + 0x68, 0x97, 0x2b, 0x6a, 0xa1, 0xb4, 0xa3, 0x4d, + 0x28, 0x4d, 0x16, 0x30, 0xc3, 0x02, 0x5b, 0xf8, + 0x2e, 0xa9, 0x32, 0x2a, 0x4c, 0xb9, 0xa5, 0xa8, + 0x5a, 0x75, 0x65, 0x3b, 0x1a, 0x2a, 0x85, 0x45, + 0xd5, 0x61, 0xb5, 0xe7, 0x32, 0xd0, 0x76, 0x75, + 0x50, 0x54, 0x0a, 0x2a, 0x79, 0xb2, 0x92, 0x02, + 0xfd, 0xa1, 0x53, 0x0a, 0x6b, 0x55, 0x87, 0x2d, + 0x07, 0xd5, 0x2a, 0x78, 0x40, 0x39, 0x8b, 0x6b, + 0xf6, 0x9b, 0x0d, 0x6d, 0xa2, 0x34, 0x1f, 0x0b, + 0x71, 0x95, 0xea, 0x38, 0xa0, 0x68, 0xcf, 0x69, + 0x2c, 0xe5, 0x1e, 0x45, 0xc0, 0x50, 0x06, 0x4c, + 0xb9, 0x27, 0x11, 0xb0, 0x76, 0x16, 0x4c, 0x35, + 0x41, 0x51, 0x34, 0x3d, 0x83, 0xa6, 0x9e, 0x93, + 0xa8, 0xd7, 0x9a, 0xa7, 0xe1, 0x2a, 0x9a, 0xaa, + 0x75, 0xb3, 0x70, 0x4a, 0x27, 0x67, 0x11, 0x5c, + 0xab, 0x34, 0x0e, 0xb2, 0x70, 0xe8, 0x44, 0x24, + 0xf8, 0x54, 0xd7, 0x96, 0x99, 0x43, 0xaa, 0x6d, + 0x46, 0x62, 0xee, 0xae, 0x22, 0xb7, 0xae, 0x7e, + 0x30, 0x90, 0xe0, 0x66, 0x9f, 0xfb, 0x73, 0x15, + 0xb8, 0x52, 0xa9, 0x81, 0x5d, 0x0d, 0xb6, 0x5d, + 0x04, 0xdb, 0x3e, 0x0b, 0x56, 0x57, 0xf3, 0x14, + 0x3a, 0x63, 0xfb, 0xca, 0xb9, 0x8b, 0x4c, 0xd2, + 0xcf, 0x32, 0x49, 0x53, 0x8c, 0x7e, 0xbb, 0x0e, + 0x9b, 0xb4, 0xc2, 0xf0, 0x6b, 0xe7, 0xc5, 0xbf, + 0x85, 0xd4, 0xac, 0xd2, 0xab, 0x58, 0x95, 0xbf, + 0x85, 0x99, 0x2d, 0xee, 0xda, 0xad, 0xe6, 0xb4, + 0xd3, 0x35, 0xbb, 0xdd, 0xe3, 0xd1, 0x9c, 0xad, + 0x57, 0x70, 0xcb, 0x23, 0x56, 0x46, 0x9c, 0x14, + 0x5d, 0xd9, 0x49, 0xb1, 0x3b, 0x52, 0xb8, 0xe2, + 0x92, 0x9e, 0x2a, 0x4f, 0x4d, 0x8b, 0x8d, 0xf0, + 0x4f, 0xf1, 0x96, 0xc0, 0x27, 0xff, 0xf3, 0xdc, + 0x52, 0xbf, 0xcd, 0x42, 0x5e, 0xe7, 0x4b, 0x8e, + 0x3a, 0x57, 0x0e, 0x61, 0x60, 0xab, 0x3a, 0xa9, + 0xc2, 0x7a, 0xe2, 0x12, 0xfe, 0x20, 0x37, 0x84, + 0x46, 0x70, 0x43, 0x48, 0xbd, 0xbb, 0x68, 0xd6, + 0xeb, 0x1f, 0x0d, 0xa9, 0x5e, 0x31, 0xa9, 0xe3, + 0x3e, 0x14, 0x5c, 0x25, 0x63, 0x07, 0x79, 0xc4, + 0x65, 0x95, 0x3f, 0x89, 0x8d, 0x8f, 0xd3, 0x14, + 0xba, 0xcf, 0xdb, 0xdd, 0xc0, 0xf3, 0x9d, 0xf3, + 0xae, 0x9e, 0x10, 0x9f, 0xcd, 0xdd, 0x33, 0x72, + 0x92, 0x92, 0xbf, 0xde, 0xaa, 0x93, 0xf9, 0xce, + 0x39, 0xfd, 0x2b, 0x79, 0xef, 0xeb, 0xac, 0x2e, + 0xa6, 0x17, 0x2c, 0x12, 0x14, 0x6f, 0x30, 0x5d, + 0xb4, 0x87, 0xd5, 0x76, 0xc9, 0x89, 0x9c, 0xb3, + 0xab, 0x5c, 0x70, 0xaa, 0xb7, 0xe3, 0x48, 0xdc, + 0x05, 0xaa, 0xe7, 0xc6, 0x52, 0x6c, 0x6e, 0xbc, + 0xb0, 0xe7, 0x55, 0x17, 0xb9, 0x02, 0x41, 0xa8, + 0x74, 0x81, 0xea, 0x22, 0x17, 0x20, 0x08, 0x95, + 0xd6, 0x29, 0xe3, 0xb2, 0x51, 0xc1, 0xe7, 0x4a, + 0xb8, 0x2a, 0x57, 0xb7, 0xf5, 0x4c, 0x2f, 0xbf, + 0x67, 0x09, 0x25, 0x3f, 0x54, 0x7b, 0xb0, 0x5f, + 0xf3, 0x3e, 0x58, 0xae, 0x05, 0xd7, 0x9d, 0xb3, + 0x2c, 0xd0, 0x7a, 0x6f, 0x6f, 0x82, 0x86, 0x7a, + 0xe7, 0xd9, 0xf0, 0x66, 0x61, 0x10, 0x3e, 0x73, + 0xe3, 0x29, 0x5c, 0xea, 0x10, 0x5d, 0xfa, 0x73, + 0x29, 0xad, 0x79, 0xd1, 0x49, 0xaf, 0xae, 0x0f, + 0x5e, 0xb8, 0x7b, 0x6e, 0xac, 0x17, 0x77, 0x1f, + 0xe4, 0x7e, 0x03, 0x2a, 0xf6, 0x20, 0xf9, 0xe9, + 0x01, 0xbe, 0x1a, 0xa5, 0xc1, 0xcf, 0x2c, 0x4e, + 0xaf, 0xf2, 0xe4, 0x7d, 0x87, 0x89, 0xf2, 0x55, + 0x59, 0x81, 0x2c, 0xbd, 0xc7, 0x4e, 0x65, 0xd3, + 0x37, 0xda, 0x45, 0x49, 0x7a, 0x6b, 0x9c, 0x4a, + 0xd2, 0xa7, 0x13, 0x92, 0x6c, 0xae, 0x66, 0xa2, + 0xe2, 0xb4, 0x2d, 0xca, 0x0b, 0x7d, 0x84, 0xbe, + 0x7a, 0xb2, 0xe7, 0x44, 0x5f, 0x8a, 0x4f, 0x3a, + 0x32, 0xfa, 0x5e, 0xdd, 0x7e, 0x6b, 0x93, 0xf9, + 0x72, 0x66, 0xed, 0xd2, 0xae, 0x35, 0xc7, 0xb6, + 0x1b, 0x3a, 0x77, 0xf1, 0xb2, 0xb5, 0x7f, 0x85, + 0x2f, 0x4f, 0x9a, 0x86, 0xef, 0x63, 0x2f, 0xb8, + 0x73, 0x3d, 0x73, 0x61, 0x1d, 0x30, 0xf9, 0x62, + 0x33, 0x7c, 0x5f, 0x6d, 0x70, 0xba, 0xf9, 0xbe, + 0x7f, 0x75, 0x5a, 0x20, 0xc3, 0x01, 0xb5, 0xab, + 0x35, 0xd1, 0xc8, 0x72, 0x52, 0x52, 0x27, 0x04, + 0x38, 0x8f, 0x28, 0x22, 0x32, 0xcd, 0x31, 0x7c, + 0x0b, 0xd3, 0x8b, 0xea, 0xcc, 0x39, 0x76, 0x30, + 0x4c, 0xa2, 0xe4, 0xbd, 0x41, 0x71, 0x13, 0xa0, + 0x17, 0x37, 0x46, 0xb8, 0xd6, 0x0a, 0xf2, 0xc1, + 0x9f, 0xae, 0xb7, 0xf2, 0x07, 0xc9, 0x02, 0x7d, + 0x97, 0x17, 0x53, 0xd2, 0xbf, 0x93, 0x2f, 0x19, + 0x0e, 0x92, 0x05, 0x2a, 0xcd, 0x8b, 0x4c, 0xfa, + 0x4f, 0x6f, 0x1d, 0xe0, 0x18, 0x80, 0x95, 0x38, + 0x7a, 0x5c, 0xe6, 0xf0, 0xd0, 0xe5, 0xc6, 0x56, + 0x60, 0x4d, 0x8e, 0xf6, 0x93, 0xb5, 0x7d, 0xc4, + 0x83, 0x4c, 0x19, 0x5e, 0xca, 0xd4, 0x84, 0x51, + 0x80, 0x6b, 0xc0, 0x0e, 0x5e, 0x04, 0x78, 0x37, + 0xe0, 0x8f, 0x20, 0xcc, 0x0b, 0x5c, 0x7b, 0xc3, + 0x71, 0x60, 0x08, 0xc0, 0xa0, 0x66, 0xd6, 0xf2, + 0x22, 0xc8, 0x67, 0xda, 0xb9, 0x0d, 0x89, 0xca, + 0x74, 0x39, 0xb6, 0x23, 0xfb, 0xda, 0x9d, 0x6f, + 0x0d, 0xe0, 0x1f, 0x68, 0x86, 0x7f, 0x87, 0xc6, + 0x1d, 0xe1, 0xfb, 0xc3, 0x01, 0x9e, 0x42, 0xd7, + 0x75, 0x70, 0x30, 0x48, 0x17, 0x41, 0x30, 0x5d, + 0xc1, 0xde, 0xf9, 0x19, 0x07, 0xd0, 0xa1, 0xe3, + 0x5f, 0xb8, 0x19, 0x64, 0xca, 0xf0, 0x56, 0xa6, + 0x26, 0x54, 0xda, 0x5a, 0x07, 0x53, 0xd7, 0x5b, + 0x40, 0xe4, 0x2d, 0x70, 0x52, 0xba, 0x08, 0x2f, + 0xa5, 0x2b, 0xd8, 0x28, 0x4b, 0x0c, 0xa9, 0xdc, + 0x41, 0xd6, 0x48, 0x8e, 0xb2, 0xa9, 0xc3, 0x72, + 0x4f, 0x76, 0xe4, 0x15, 0x6a, 0x0d, 0x2f, 0x9c, + 0xd0, 0x5a, 0x4e, 0x83, 0xbc, 0x0c, 0x3a, 0x74, + 0xdc, 0x2f, 0xd3, 0xbd, 0x8f, 0x07, 0xd1, 0x03, + 0x34, 0xf5, 0xaf, 0xa2, 0x42, 0x1d, 0x89, 0xe0, + 0x80, 0x5e, 0x2b, 0x15, 0x1c, 0xd0, 0x65, 0x93, + 0xc1, 0x01, 0x49, 0xa7, 0x83, 0xe1, 0x4b, 0x80, + 0xd3, 0xe9, 0x20, 0x7c, 0x9b, 0xb7, 0x0a, 0xe9, + 0x43, 0x90, 0xaf, 0x96, 0x40, 0x62, 0x79, 0x31, + 0x85, 0xc4, 0x94, 0x51, 0x89, 0x33, 0xa4, 0xda, + 0xcb, 0xb3, 0xce, 0x01, 0x29, 0xe5, 0x9d, 0x03, + 0xaa, 0x94, 0x79, 0x0e, 0xa8, 0x6a, 0xee, 0x39, + 0x20, 0xb5, 0xec, 0x03, 0xef, 0x9d, 0xcc, 0x3f, + 0x20, 0x20, 0x9d, 0x81, 0x88, 0x68, 0xba, 0x4a, + 0x35, 0x99, 0x00, 0xbd, 0xeb, 0x38, 0xbf, 0xc2, + 0x4f, 0xbe, 0x04, 0x18, 0x54, 0x1a, 0xa4, 0x4a, + 0xd3, 0x79, 0xa7, 0x47, 0x16, 0x51, 0xa9, 0x4a, + 0x85, 0x04, 0x40, 0x17, 0xc6, 0x34, 0x09, 0x49, + 0xe5, 0x05, 0x22, 0x1d, 0x27, 0x06, 0xc9, 0x94, + 0x27, 0xf2, 0xd1, 0xd5, 0xb9, 0xe9, 0x3a, 0x2b, + 0x79, 0x9a, 0xff, 0xf3, 0xcf, 0xff, 0xf9, 0xe7, + 0xff, 0xfc, 0xf3, 0xaa, 0xf9, 0x47, 0x79, 0x64, + 0xd3, 0x74, 0x52, 0x3e, 0xea, 0x43, 0x46, 0x88, + 0x48, 0x3a, 0xb5, 0xf5, 0xaf, 0x78, 0xcb, 0x89, + 0xf8, 0x30, 0xf9, 0x4c, 0x94, 0x0a, 0xf5, 0x66, + 0xae, 0x88, 0xd5, 0x1e, 0xdd, 0x86, 0x4a, 0xc0, + 0x96, 0xc9, 0xe7, 0xae, 0x24, 0x05, 0x68, 0xeb, + 0x5f, 0x25, 0xab, 0x99, 0xe0, 0x17, 0x88, 0x4f, + 0x54, 0x43, 0x03, 0xc8, 0x04, 0x93, 0xd5, 0x21, + 0x39, 0x2b, 0x14, 0x72, 0xdf, 0x9f, 0x22, 0xbf, + 0x97, 0x66, 0xbf, 0x57, 0xa4, 0x87, 0x5f, 0xb5, + 0x29, 0x64, 0x87, 0x36, 0x39, 0x72, 0x10, 0x54, + 0xe1, 0xbe, 0x3f, 0x45, 0x7e, 0x2f, 0xcd, 0x7e, + 0xaf, 0x4a, 0x7f, 0x40, 0x85, 0xec, 0xd0, 0x26, + 0x49, 0x7e, 0x40, 0x8a, 0xdc, 0xd3, 0xb9, 0x31, + 0x2b, 0xe4, 0x0f, 0xdb, 0xa5, 0x75, 0x20, 0xc2, + 0x52, 0x7a, 0xb0, 0xff, 0xcb, 0x51, 0xee, 0xba, + 0x3f, 0xfa, 0x61, 0xbc, 0x70, 0xb8, 0x8a, 0x07, + 0x0f, 0x3b, 0xdf, 0x22, 0x07, 0x37, 0x7b, 0xc7, + 0x82, 0xb3, 0x26, 0x52, 0xe0, 0x47, 0x4d, 0xa8, + 0x99, 0x3c, 0x6a, 0xb2, 0x3c, 0xfb, 0x09, 0x34, + 0xb1, 0xc9, 0x6f, 0xd7, 0x0c, 0x20, 0x83, 0x51, + 0x27, 0x25, 0x2b, 0x89, 0x58, 0xea, 0x97, 0x9d, + 0x0a, 0x38, 0xf9, 0x6f, 0xfd, 0x14, 0x08, 0xb0, + 0x9f, 0xd7, 0x39, 0x2d, 0x93, 0x4a, 0x53, 0x05, + 0x32, 0x71, 0x80, 0x62, 0x91, 0xc4, 0x51, 0x09, + 0xf3, 0x19, 0x75, 0x20, 0x14, 0x84, 0xff, 0x4d, + 0x14, 0x34, 0xfc, 0x03, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, + 0xf2, 0x4a, 0x5a, 0x51, 0x84, 0xf7, 0x9b, 0x05, + 0x00, 0x00, 0x19, 0x66, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x46, 0x31, 0x78, 0x78, 0x2e, 0x78, + 0x6d, 0x6c, 0xed, 0x9d, 0x5b, 0x6f, 0x9b, 0x30, + 0x14, 0xc7, 0x9f, 0x37, 0x69, 0xdf, 0x21, 0xca, + 0xfb, 0x06, 0x86, 0xdc, 0x26, 0x51, 0xa4, 0x36, + 0x97, 0xb5, 0x5b, 0xd3, 0x4d, 0x4d, 0x76, 0x79, + 0x8b, 0x28, 0x98, 0x96, 0x85, 0x00, 0x03, 0x52, + 0xd1, 0x7d, 0xfa, 0xf9, 0x46, 0x20, 0xd7, 0xd2, + 0x92, 0x30, 0x42, 0x1c, 0x29, 0xaa, 0x7d, 0xce, + 0x1f, 0x1f, 0xc7, 0x86, 0xdf, 0x89, 0x0c, 0x4e, + 0x15, 0x03, 0x3e, 0x5a, 0x3a, 0x7c, 0x6f, 0x39, + 0xa6, 0xeb, 0xcf, 0xb4, 0xd0, 0x72, 0x9d, 0xda, + 0x23, 0xf4, 0x03, 0xf4, 0xf7, 0xac, 0x0e, 0x3e, + 0x88, 0x75, 0xf5, 0xdd, 0xdb, 0x37, 0x8a, 0x35, + 0xf3, 0x5c, 0x3f, 0xac, 0x99, 0x96, 0x0d, 0xcf, + 0xea, 0x06, 0x34, 0xb5, 0xb9, 0x1d, 0x06, 0x1f, + 0xa2, 0x99, 0x5d, 0x17, 0x90, 0x1f, 0x2b, 0x20, + 0x9c, 0x8d, 0xad, 0x19, 0x3a, 0xb0, 0x66, 0x19, + 0x67, 0xf5, 0x7e, 0x5c, 0x03, 0x51, 0xd4, 0xa3, + 0x72, 0xd2, 0x50, 0xa2, 0xab, 0x59, 0x8e, 0x01, + 0x23, 0x14, 0xa2, 0x5e, 0xf3, 0xa1, 0x79, 0x56, + 0x1f, 0x76, 0xaf, 0xbf, 0x78, 0x96, 0x83, 0xda, + 0xdb, 0x28, 0x93, 0x98, 0x6c, 0xf4, 0x8c, 0x4e, + 0x66, 0xba, 0xf3, 0xdd, 0xb2, 0x46, 0x2c, 0xeb, + 0x75, 0x81, 0xb4, 0x4d, 0xd4, 0x64, 0xa2, 0xc1, + 0xf5, 0xf9, 0xe8, 0x72, 0xd2, 0x1d, 0xdf, 0x5e, + 0x6f, 0x53, 0xb6, 0x98, 0xf2, 0xfb, 0xe8, 0xfc, + 0x76, 0x0c, 0xb6, 0xa9, 0xda, 0x69, 0x95, 0xb8, + 0x4d, 0x05, 0xe2, 0x8f, 0x30, 0xbe, 0xd8, 0x2a, + 0x69, 0xc4, 0x92, 0xf3, 0xad, 0x92, 0xb8, 0xf3, + 0x3f, 0x7b, 0xe3, 0x09, 0x53, 0x29, 0xc2, 0x62, + 0x92, 0xe8, 0xa4, 0xb1, 0xb9, 0xc7, 0x3e, 0x5c, + 0x0e, 0x74, 0xdf, 0xf2, 0xf0, 0x09, 0xa0, 0x0e, + 0x47, 0xdf, 0x1a, 0xb2, 0x38, 0x00, 0x20, 0x02, + 0x8a, 0x90, 0x72, 0x50, 0xa5, 0x65, 0x0c, 0xb5, + 0x60, 0x8a, 0xcb, 0xa8, 0xc2, 0xce, 0x15, 0x55, + 0x8c, 0x4c, 0xf4, 0x52, 0x04, 0x56, 0x67, 0x5e, + 0x1f, 0x05, 0x60, 0x6e, 0xec, 0x24, 0xd5, 0xc4, + 0x6b, 0x6a, 0x77, 0xcc, 0x81, 0x4a, 0xc8, 0x56, + 0x4b, 0xbd, 0x94, 0x00, 0xda, 0xe6, 0xa2, 0x55, + 0x5c, 0xa1, 0xc1, 0x05, 0x1a, 0x3d, 0xee, 0x49, + 0xd7, 0x35, 0xe0, 0x5a, 0x4f, 0x80, 0x64, 0x82, + 0x1d, 0x3d, 0x01, 0xe2, 0x96, 0x9e, 0x34, 0xc4, + 0x1d, 0x3d, 0x59, 0xee, 0x44, 0x12, 0x58, 0xf1, + 0x02, 0x4d, 0xbd, 0x85, 0xf7, 0x73, 0x5b, 0xf3, + 0x15, 0x01, 0x55, 0xa8, 0xf5, 0xce, 0x0a, 0x03, + 0x15, 0xb4, 0x14, 0x01, 0x17, 0xa8, 0x49, 0xf3, + 0xf5, 0x07, 0x2b, 0x84, 0x7a, 0x38, 0xf7, 0xa1, + 0xda, 0xf5, 0xe6, 0x8a, 0x90, 0xb6, 0x2c, 0xe6, + 0x51, 0xed, 0x0f, 0xfb, 0xbf, 0x26, 0xd7, 0x5f, + 0x7f, 0x92, 0xf9, 0xa2, 0x66, 0xdd, 0x76, 0xf5, + 0xe9, 0x15, 0xba, 0x44, 0xe9, 0xa4, 0xde, 0xb8, + 0x0e, 0x8c, 0x67, 0xfe, 0xd1, 0xb5, 0x43, 0xed, + 0x1e, 0x62, 0x67, 0x3c, 0x10, 0xba, 0x3e, 0xb4, + 0x1c, 0x15, 0x74, 0x44, 0xd4, 0x69, 0x56, 0x49, + 0x3c, 0x5a, 0xa4, 0xca, 0x2d, 0xec, 0xa1, 0x95, + 0xc4, 0x33, 0xb0, 0xb5, 0xe0, 0x01, 0x6b, 0xa5, + 0x36, 0x71, 0x27, 0x96, 0x44, 0x33, 0x82, 0x3a, + 0xea, 0x2a, 0x11, 0x35, 0xb1, 0x28, 0x31, 0x25, + 0x2a, 0xcf, 0x4b, 0x4c, 0x28, 0x10, 0x52, 0x25, + 0xa6, 0x75, 0x15, 0xee, 0x42, 0x7b, 0x59, 0x95, + 0xf4, 0x2a, 0x84, 0x41, 0xf8, 0xc3, 0xf3, 0xd4, + 0xd0, 0x9f, 0x43, 0x45, 0x60, 0x35, 0x36, 0x05, + 0xab, 0x9f, 0x5b, 0x31, 0xa1, 0x86, 0xc7, 0x91, + 0x0c, 0x76, 0x3c, 0x64, 0xa3, 0xa7, 0x20, 0x44, + 0x63, 0x78, 0xd1, 0x9d, 0x20, 0x10, 0x29, 0x42, + 0xca, 0xc6, 0x54, 0x7f, 0xe6, 0x96, 0x3e, 0x1d, + 0xc2, 0xd9, 0x2d, 0xd4, 0x0c, 0x16, 0x26, 0x6d, + 0x62, 0xb1, 0x96, 0x9a, 0x56, 0x66, 0x70, 0xe6, + 0xfa, 0x4f, 0xd7, 0xda, 0x93, 0x3b, 0x0f, 0xb1, + 0x65, 0x61, 0xaa, 0x39, 0xda, 0x0c, 0xf1, 0xf1, + 0x22, 0xb0, 0xc9, 0xc5, 0x47, 0x4a, 0x93, 0x18, + 0x7f, 0xc2, 0x26, 0x29, 0x3a, 0x0b, 0x88, 0x94, + 0x94, 0x76, 0x49, 0x09, 0x52, 0x89, 0x94, 0x94, + 0x76, 0x4b, 0xf1, 0x98, 0x10, 0x2d, 0x2d, 0x4e, + 0xa4, 0xc9, 0x85, 0xe6, 0x4c, 0x83, 0xcd, 0xe2, + 0xa1, 0x66, 0x39, 0x44, 0x4c, 0x8b, 0x13, 0x32, + 0xe9, 0x93, 0xc6, 0x74, 0xb3, 0xfa, 0x1b, 0x44, + 0x28, 0x78, 0x80, 0xbe, 0x66, 0x83, 0x16, 0x3a, + 0xb3, 0xc9, 0x81, 0x6b, 0xd6, 0xdd, 0xbd, 0x4b, + 0xc4, 0x9d, 0x4d, 0x2d, 0x74, 0xd2, 0x0d, 0xe0, + 0xe3, 0x49, 0x03, 0xf8, 0x92, 0x17, 0x23, 0x59, + 0x36, 0x4d, 0x80, 0xde, 0x14, 0x0a, 0xb3, 0x84, + 0x42, 0x02, 0x8d, 0xb0, 0x29, 0xdc, 0xad, 0x46, + 0xc7, 0x8d, 0x94, 0xe2, 0x86, 0x27, 0x52, 0xb3, + 0xb5, 0xc0, 0xab, 0xb0, 0x36, 0xa1, 0x8a, 0x39, + 0x77, 0x74, 0x1b, 0x86, 0x43, 0xcd, 0xa3, 0x87, + 0xf6, 0xba, 0x5f, 0x63, 0x86, 0x32, 0x66, 0x66, + 0xc4, 0xe7, 0xf9, 0xa1, 0xf8, 0x59, 0x14, 0x2b, + 0xe5, 0x24, 0x2a, 0xe7, 0x22, 0xe7, 0x22, 0xe7, + 0x62, 0x9d, 0x73, 0x31, 0x2f, 0x17, 0xa5, 0x28, + 0x0f, 0x15, 0x33, 0x61, 0x4d, 0x92, 0x53, 0x58, + 0xe3, 0x70, 0xaa, 0x12, 0x9c, 0x56, 0xb1, 0x03, + 0xa3, 0x70, 0xb0, 0xdc, 0xca, 0x6f, 0x14, 0x83, + 0x85, 0xc7, 0x45, 0x76, 0x14, 0xd6, 0x9d, 0x1c, + 0xaf, 0x3a, 0x25, 0xe5, 0x95, 0x28, 0x03, 0xf4, + 0x36, 0x4d, 0x51, 0x3e, 0x38, 0xaf, 0x30, 0x62, + 0x10, 0xb0, 0x58, 0x9b, 0xfd, 0x08, 0x9d, 0xae, + 0x21, 0x1c, 0x50, 0x90, 0xa9, 0xcb, 0xd5, 0xcf, + 0xe8, 0x6c, 0x51, 0x84, 0x65, 0x1b, 0x3b, 0xee, + 0x13, 0x0c, 0x7b, 0xba, 0x3b, 0xf0, 0xe1, 0x9f, + 0x39, 0x74, 0xf4, 0x27, 0x75, 0xa5, 0x4e, 0x8f, + 0x5c, 0x31, 0xb2, 0x6e, 0xa5, 0x3a, 0xb1, 0x4f, + 0x8a, 0x82, 0x48, 0x3a, 0x38, 0x46, 0x65, 0x09, + 0x70, 0x8c, 0x56, 0x13, 0xa3, 0xfc, 0x3b, 0xde, + 0xb1, 0x31, 0xf3, 0xc8, 0xbe, 0xe3, 0x49, 0x42, + 0x61, 0x8c, 0x92, 0x38, 0xa3, 0x38, 0xa3, 0x38, + 0xa3, 0x4a, 0xc0, 0xa8, 0x02, 0xbf, 0xd7, 0xe5, + 0x67, 0x54, 0xe3, 0x63, 0x1e, 0x38, 0xbd, 0x51, + 0x82, 0xf9, 0xdd, 0xaa, 0x20, 0x36, 0x25, 0x77, + 0x16, 0xe6, 0x01, 0x0c, 0x90, 0x1b, 0xf9, 0x48, + 0x31, 0x3b, 0xd7, 0x1a, 0x1f, 0x4d, 0xb0, 0x2b, + 0xe2, 0xf6, 0x60, 0x2c, 0x54, 0x61, 0x2c, 0x1c, + 0xf6, 0x7b, 0x57, 0xdf, 0x87, 0x2f, 0xc6, 0x21, + 0x75, 0xc6, 0x33, 0x7e, 0xe3, 0x22, 0xc0, 0xd4, + 0x05, 0xce, 0x8a, 0xbd, 0xb3, 0xa2, 0xf9, 0xb1, + 0x94, 0xb0, 0x30, 0x11, 0x2d, 0x0c, 0xf4, 0xd6, + 0x45, 0x59, 0xcc, 0x09, 0x8b, 0xe9, 0xe1, 0x51, + 0xd1, 0xa9, 0x26, 0x2a, 0x22, 0xc0, 0x61, 0xc1, + 0x61, 0x91, 0x5e, 0xe0, 0x2e, 0xe7, 0x37, 0x8b, + 0xe3, 0x82, 0x45, 0xbb, 0xa2, 0xb0, 0x90, 0x38, + 0x2c, 0x38, 0x2c, 0x52, 0xb0, 0x90, 0xa5, 0x8a, + 0xc3, 0x02, 0x1c, 0x1e, 0x16, 0x72, 0xb3, 0xa2, + 0xb0, 0x68, 0x70, 0x58, 0x70, 0x58, 0xa4, 0x60, + 0x01, 0x5a, 0x15, 0x87, 0x45, 0x13, 0x48, 0x87, + 0x5f, 0xb3, 0x90, 0xe5, 0x8a, 0xe2, 0xa2, 0xc9, + 0x71, 0xc1, 0x71, 0x51, 0xfa, 0x15, 0xce, 0xfd, + 0xd1, 0xa2, 0x90, 0x15, 0xce, 0x56, 0xa9, 0x57, + 0x38, 0x5b, 0xaf, 0xa6, 0x45, 0xd1, 0xac, 0xb8, + 0xbc, 0xfa, 0x74, 0xb9, 0x89, 0x14, 0xe9, 0x2b, + 0xbd, 0xeb, 0x3a, 0xa1, 0xef, 0xda, 0xea, 0xa7, + 0x6e, 0x77, 0xd2, 0xff, 0x35, 0xee, 0xdf, 0xf4, + 0xfa, 0x3d, 0x45, 0x48, 0xbb, 0xb0, 0x9a, 0xb6, + 0xda, 0xc5, 0xd6, 0x80, 0x6d, 0x69, 0x08, 0x35, + 0xc7, 0xd0, 0x7c, 0x83, 0x4e, 0x6f, 0xea, 0x59, + 0x7e, 0xe2, 0xdf, 0xb8, 0x97, 0x62, 0x71, 0xde, + 0x2c, 0x3a, 0x52, 0x0a, 0x4c, 0xa1, 0x89, 0x96, + 0x74, 0xe6, 0x44, 0xa5, 0x93, 0x45, 0x17, 0x5f, + 0x70, 0xdd, 0x03, 0xb9, 0x4a, 0xbd, 0xe0, 0xfa, + 0x7a, 0x72, 0x15, 0xbf, 0xe0, 0xca, 0xd9, 0xc5, + 0xd9, 0x95, 0x9d, 0x5d, 0x7c, 0xfd, 0x77, 0x0f, + 0xec, 0x2a, 0xf5, 0xfa, 0x6f, 0x0e, 0x76, 0x15, + 0xbe, 0xfe, 0xcb, 0xd9, 0xc5, 0xd9, 0x95, 0x9d, + 0x5d, 0x7c, 0x39, 0x3a, 0x3f, 0xbb, 0x9a, 0x55, + 0x65, 0x57, 0xe1, 0xcb, 0xd1, 0xff, 0x87, 0x5d, + 0xa4, 0x9e, 0x79, 0x9f, 0x7d, 0xf6, 0x9d, 0xf6, + 0x99, 0xf7, 0xda, 0x67, 0xdc, 0x6d, 0xff, 0x92, + 0xfd, 0xf6, 0x59, 0xf7, 0xd2, 0x67, 0xda, 0x4d, + 0x9f, 0x69, 0x3f, 0x7d, 0xc6, 0x1d, 0xf5, 0x6f, + 0xd2, 0x7b, 0xea, 0x79, 0x6a, 0xe0, 0xa9, 0xe1, + 0xe5, 0xa9, 0xc1, 0x34, 0x0d, 0xf4, 0xd6, 0xc5, + 0xbc, 0x0f, 0x75, 0x17, 0x91, 0x1a, 0x5a, 0x15, + 0x4d, 0x0d, 0x85, 0xdf, 0x7a, 0xe0, 0xa9, 0x81, + 0xa7, 0x06, 0x9e, 0x1a, 0x4a, 0x92, 0x1a, 0xa4, + 0x72, 0xee, 0xe9, 0x3e, 0xae, 0xd4, 0x50, 0xea, + 0x87, 0x58, 0x72, 0xa4, 0x86, 0x16, 0x4f, 0x0d, + 0x3c, 0x35, 0xf0, 0xd4, 0x70, 0xa2, 0xa9, 0xa1, + 0xb4, 0x8f, 0x2c, 0xed, 0x2b, 0x35, 0x14, 0xf2, + 0xc8, 0x52, 0x0b, 0xe4, 0xfc, 0x15, 0xb9, 0x97, + 0x64, 0x87, 0xf6, 0xcb, 0xb3, 0x83, 0xfe, 0xda, + 0xec, 0x70, 0x1a, 0xb9, 0x81, 0xaf, 0x86, 0x1f, + 0x27, 0xbc, 0x4e, 0xe7, 0x4e, 0xde, 0xba, 0x5a, + 0x5a, 0x44, 0x0d, 0x9f, 0x3c, 0xa8, 0x22, 0x8b, + 0x22, 0xe0, 0x12, 0xb3, 0xae, 0x5f, 0x89, 0xe4, + 0xa2, 0x0f, 0x35, 0x3f, 0xc4, 0x77, 0xe8, 0x01, + 0xde, 0xee, 0x4c, 0x6a, 0x0b, 0x97, 0xf5, 0x17, + 0xe2, 0xfb, 0x5f, 0x1d, 0xec, 0xc1, 0x95, 0x85, + 0x03, 0xde, 0xcf, 0xa0, 0x13, 0x8e, 0xa8, 0x1f, + 0x71, 0x24, 0x31, 0x24, 0xc1, 0xf0, 0xcc, 0xa9, + 0xc8, 0x47, 0x0a, 0xc9, 0x70, 0x78, 0x1e, 0x8c, + 0x4f, 0x62, 0x5a, 0x59, 0x1e, 0x88, 0x83, 0x53, + 0x59, 0xac, 0x26, 0x95, 0x23, 0x99, 0x73, 0x99, + 0x73, 0xb9, 0xbc, 0x5c, 0x2e, 0xed, 0x52, 0xf4, + 0xf1, 0x72, 0x19, 0x34, 0xaa, 0xc4, 0xe5, 0x5c, + 0x3f, 0x99, 0x52, 0x62, 0x2e, 0x9f, 0xc8, 0x5a, + 0x0a, 0xe7, 0xf2, 0x51, 0x72, 0xb9, 0xbe, 0x8a, + 0x1b, 0xa9, 0xb9, 0x0d, 0x37, 0xc6, 0x5d, 0x8c, + 0x9b, 0xe7, 0x11, 0xc9, 0xa1, 0xce, 0xa1, 0x5e, + 0xec, 0x3e, 0x8c, 0x42, 0x99, 0xde, 0xe6, 0x4c, + 0xe7, 0x4c, 0x2f, 0x2d, 0xd3, 0xf9, 0x4e, 0x8c, + 0x67, 0xd9, 0xf5, 0xee, 0x2d, 0xaa, 0xac, 0xfd, + 0x0b, 0x18, 0xe4, 0xf8, 0x07, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0xaf, 0x0c, 0x9a, 0x7f, 0xc5, + 0x06, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x46, 0x32, 0x78, 0x78, 0x2e, + 0x78, 0x6d, 0x6c, 0xed, 0x9d, 0x61, 0x73, 0x9a, + 0x30, 0x18, 0xc7, 0x5f, 0x6f, 0x77, 0xfb, 0x0e, + 0x3d, 0xdf, 0x6f, 0x92, 0x00, 0xda, 0xde, 0x39, + 0xef, 0xac, 0xda, 0xce, 0x5b, 0xdd, 0x76, 0xd5, + 0xdd, 0xfa, 0x8e, 0x63, 0x18, 0x5a, 0xae, 0x2a, + 0x1e, 0x60, 0xc7, 0xf6, 0xe9, 0x97, 0x10, 0x40, + 0x5b, 0xc5, 0x82, 0x92, 0xf1, 0x30, 0xe8, 0x8b, + 0x0d, 0xc8, 0x43, 0x22, 0x79, 0x7e, 0xff, 0x3c, + 0x09, 0x21, 0xd0, 0x99, 0x91, 0x27, 0xcb, 0x20, + 0xef, 0xad, 0xa5, 0x69, 0x3b, 0x0b, 0xdd, 0xb3, + 0xec, 0xe5, 0xd9, 0x13, 0x71, 0x5c, 0xfa, 0xff, + 0xc7, 0x06, 0xfa, 0x20, 0x35, 0xba, 0xef, 0xde, + 0xbe, 0xe9, 0x58, 0x8b, 0x95, 0xed, 0x78, 0x67, + 0xa6, 0x35, 0x27, 0x1f, 0x1b, 0x33, 0x62, 0xea, + 0xeb, 0xb9, 0xe7, 0x7e, 0xf0, 0x17, 0xf3, 0x46, + 0x93, 0xa6, 0x33, 0x8b, 0x05, 0x59, 0xd8, 0xce, + 0xef, 0x1b, 0xfd, 0xb7, 0xbd, 0xf6, 0xce, 0xac, + 0xd9, 0xc7, 0x06, 0xf6, 0x7d, 0xed, 0x52, 0x77, + 0x49, 0x90, 0x41, 0x94, 0x7e, 0xb6, 0xd4, 0x17, + 0x34, 0x87, 0x11, 0x2d, 0xac, 0x71, 0xe6, 0x10, + 0x93, 0x6f, 0x6a, 0x03, 0x9e, 0x23, 0xcd, 0x6c, + 0xd7, 0xb6, 0xbf, 0x5a, 0x07, 0xa6, 0xc1, 0xd6, + 0x41, 0xcb, 0x21, 0x59, 0x04, 0x96, 0xc1, 0xd6, + 0x41, 0xcb, 0x6f, 0xc4, 0xb1, 0x56, 0x0f, 0xc4, + 0xd1, 0xe7, 0xa8, 0xf5, 0xd3, 0xf2, 0x82, 0xb3, + 0x76, 0x8e, 0x3e, 0xcf, 0xa1, 0xd3, 0xdc, 0xbe, + 0xc2, 0xd7, 0x2e, 0x5a, 0xbb, 0x74, 0xe7, 0x5a, + 0x7c, 0x95, 0x87, 0x2b, 0x83, 0x9a, 0x06, 0x56, + 0xc1, 0x56, 0x8a, 0x42, 0x09, 0x59, 0x4c, 0xad, + 0x05, 0x75, 0xd1, 0x6e, 0x35, 0x6f, 0x12, 0xcf, + 0xac, 0xe5, 0x8c, 0xf8, 0xd4, 0x83, 0x61, 0xd6, + 0xe3, 0xfe, 0xcd, 0xe7, 0x95, 0xb5, 0xe4, 0xd9, + 0xee, 0x9a, 0xe1, 0xd0, 0x6c, 0xf2, 0x8a, 0x9d, + 0x1c, 0xda, 0xf5, 0x0e, 0x9b, 0xb5, 0x43, 0xb3, + 0xef, 0x93, 0xfe, 0x48, 0x4a, 0x32, 0x42, 0x51, + 0x66, 0xd3, 0xcb, 0x44, 0x13, 0x25, 0x32, 0xe9, + 0x25, 0x9a, 0xa8, 0xa1, 0xc9, 0x8f, 0xc1, 0x54, + 0xeb, 0x45, 0xd5, 0x16, 0xd7, 0x51, 0x62, 0x9d, + 0xf5, 0x66, 0x86, 0xf6, 0xdd, 0x35, 0x2c, 0x29, + 0x38, 0xfd, 0xd5, 0x7a, 0x54, 0xa2, 0x0b, 0x1f, + 0xf4, 0x11, 0x4e, 0x5f, 0x0a, 0x2b, 0x01, 0xa5, + 0x2b, 0xa1, 0xb5, 0x55, 0x67, 0x28, 0x7d, 0x09, + 0xf4, 0x3a, 0xf8, 0x89, 0x9b, 0xf2, 0xf2, 0xbd, + 0x04, 0x56, 0x51, 0x97, 0xd3, 0xe0, 0xdc, 0xf8, + 0x40, 0x42, 0x09, 0x91, 0x2b, 0xae, 0x6e, 0x7a, + 0x93, 0x4f, 0x5a, 0x7f, 0x7a, 0x7b, 0x93, 0xe8, + 0xb5, 0xa8, 0x52, 0x2e, 0x7b, 0x93, 0x51, 0x5f, + 0x9b, 0x8e, 0xc6, 0xc3, 0xdb, 0x84, 0x9f, 0x14, + 0x36, 0x50, 0xfb, 0x60, 0x5f, 0xb9, 0x7a, 0xf7, + 0x96, 0xdc, 0xaf, 0xe7, 0xba, 0xd3, 0x69, 0xd2, + 0x1d, 0x7e, 0x94, 0x4a, 0xd7, 0xed, 0xa2, 0x56, + 0xa7, 0xc9, 0x36, 0xf8, 0x21, 0xdd, 0x31, 0x1e, + 0x2c, 0x8f, 0x18, 0xde, 0xda, 0x21, 0x5d, 0xda, + 0x8c, 0x74, 0x9a, 0xdb, 0x47, 0xe2, 0x9f, 0xd8, + 0x1d, 0x8e, 0x87, 0x77, 0xda, 0xcd, 0xd7, 0x1f, + 0xc1, 0x8f, 0xe0, 0x87, 0x8d, 0xb9, 0x6d, 0x3c, + 0x32, 0x25, 0x87, 0x20, 0x32, 0xf2, 0xa3, 0xab, + 0x7a, 0xb2, 0xe7, 0x9e, 0x7e, 0x4f, 0x36, 0xa9, + 0x2f, 0xda, 0x1c, 0x93, 0xe8, 0x2c, 0x7f, 0xf7, + 0x59, 0xa2, 0x46, 0x2f, 0x22, 0x36, 0x58, 0x2f, + 0x8d, 0x39, 0xf1, 0xc6, 0xfa, 0x2a, 0x34, 0xe9, + 0x7f, 0x8d, 0x6a, 0x81, 0x5f, 0xf5, 0xf3, 0x2a, + 0xd8, 0xc5, 0x88, 0x25, 0xb9, 0x06, 0x6d, 0xb6, + 0x58, 0xbb, 0xdd, 0xbd, 0xc2, 0x92, 0x8f, 0xb4, + 0x6b, 0xec, 0x4b, 0x3e, 0xfb, 0x17, 0xf9, 0x34, + 0x9b, 0x4d, 0x32, 0xb7, 0xb7, 0x66, 0x63, 0xdd, + 0x7d, 0x64, 0xdb, 0x74, 0x27, 0x6c, 0xe8, 0xbb, + 0x92, 0x6f, 0xd2, 0xbf, 0x4e, 0x33, 0xdc, 0x0f, + 0x53, 0x0d, 0x7b, 0x69, 0x5a, 0xf7, 0x34, 0xb1, + 0x4d, 0x93, 0xf8, 0x0e, 0xcf, 0xa3, 0xc9, 0x33, + 0x89, 0x32, 0xec, 0xdb, 0x33, 0xb2, 0x93, 0x21, + 0x32, 0x71, 0x62, 0x7e, 0xe8, 0x45, 0x76, 0x9b, + 0x2c, 0x9e, 0x37, 0xa9, 0xfc, 0x82, 0x77, 0xdb, + 0x54, 0x66, 0xf9, 0xb2, 0x15, 0x1d, 0xeb, 0xb4, + 0x39, 0x62, 0x27, 0xf0, 0x4d, 0xed, 0x6a, 0xae, + 0xbb, 0x0f, 0x1a, 0x7e, 0xe4, 0xf5, 0x99, 0x1c, + 0x00, 0xce, 0xf7, 0xb5, 0xff, 0xe7, 0xdb, 0xcd, + 0x3f, 0x3b, 0x3f, 0xc8, 0x80, 0x5e, 0x32, 0xfd, + 0xf1, 0xb2, 0x6c, 0x9a, 0xc8, 0xe4, 0x7f, 0xb4, + 0x7d, 0x8e, 0xea, 0x21, 0x6e, 0xab, 0xf7, 0x15, + 0x77, 0xab, 0xf3, 0xc8, 0x14, 0x6c, 0x45, 0x19, + 0x6b, 0x08, 0x9f, 0x87, 0x2d, 0xdf, 0x8b, 0x86, + 0xfe, 0x34, 0x02, 0x30, 0xf3, 0x3d, 0x0e, 0x08, + 0x90, 0xa1, 0x12, 0x80, 0x6b, 0x02, 0x04, 0x11, + 0x30, 0x9e, 0x7c, 0x53, 0x64, 0x89, 0x71, 0x20, + 0x03, 0xf5, 0xbd, 0x5c, 0xfb, 0x5e, 0xb0, 0xef, + 0x91, 0x8f, 0x8a, 0xf4, 0xbd, 0x0c, 0xa2, 0xe9, + 0x3f, 0x17, 0xe1, 0x7c, 0x89, 0x3a, 0x5f, 0xca, + 0xc1, 0xf9, 0x58, 0x6d, 0x09, 0x73, 0xbe, 0x8c, + 0xc5, 0x38, 0x9f, 0x75, 0x57, 0x5c, 0xe2, 0x72, + 0x05, 0x07, 0x9b, 0x39, 0x31, 0x81, 0xf7, 0x17, + 0xf3, 0xbc, 0x10, 0x9e, 0xf1, 0xa6, 0xdf, 0x37, + 0x5c, 0x3e, 0xe8, 0x4b, 0x83, 0xcc, 0x82, 0x8e, + 0x5f, 0xe5, 0xf8, 0x51, 0x11, 0x16, 0xc6, 0x0f, + 0xfe, 0x4f, 0xf8, 0xf1, 0x51, 0xc1, 0x04, 0x29, + 0x55, 0x25, 0x08, 0xfd, 0x2f, 0x04, 0xe1, 0x82, + 0x09, 0x12, 0xd2, 0x81, 0xc9, 0x8b, 0x20, 0x81, + 0x31, 0x0c, 0xb7, 0x95, 0xd3, 0x08, 0x8a, 0x1c, + 0xd8, 0xce, 0xcc, 0x09, 0x6e, 0x6f, 0x71, 0x72, + 0x62, 0x40, 0x22, 0xbe, 0x77, 0x15, 0xde, 0x02, + 0x60, 0x07, 0xb8, 0xa1, 0xf1, 0xd0, 0xf5, 0x9c, + 0x35, 0xa1, 0x66, 0x6c, 0x3b, 0xcc, 0x6c, 0xcb, + 0x52, 0x04, 0x47, 0x32, 0x68, 0x90, 0xd0, 0xa3, + 0x28, 0x8c, 0x54, 0x88, 0x18, 0x1d, 0x11, 0x97, + 0xc0, 0x80, 0x84, 0x5a, 0x90, 0x41, 0x12, 0x18, + 0xd3, 0xb0, 0x0c, 0x12, 0xa5, 0xec, 0x01, 0x6a, + 0xff, 0xfd, 0x4c, 0x60, 0x98, 0x55, 0xb5, 0xef, + 0x8d, 0xdb, 0xec, 0xe6, 0x5d, 0x5b, 0x01, 0xc9, + 0x9a, 0x92, 0x99, 0x35, 0x30, 0x3c, 0x55, 0x36, + 0xfe, 0x31, 0x9c, 0x54, 0x98, 0x38, 0xa9, 0xe5, + 0xc5, 0xa9, 0xc2, 0x51, 0x90, 0x01, 0xa5, 0xc0, + 0x04, 0xaa, 0x55, 0x5e, 0xa0, 0xaa, 0x1a, 0xef, + 0xe4, 0xb6, 0x94, 0x0f, 0x49, 0xd9, 0xef, 0x07, + 0xc8, 0x39, 0x8e, 0xf3, 0x92, 0xe6, 0x81, 0xb5, + 0x2f, 0xf6, 0xd3, 0x6a, 0xa5, 0xdd, 0xd8, 0xbf, + 0xc6, 0xd6, 0x32, 0xf0, 0x74, 0xa3, 0x29, 0x02, + 0x1f, 0xd8, 0xe1, 0x0d, 0x8b, 0x0a, 0x6f, 0xb2, + 0x0a, 0x91, 0x9e, 0x23, 0x86, 0x77, 0x45, 0xf3, + 0x03, 0x3b, 0x9e, 0x89, 0xe3, 0x47, 0x06, 0xc9, + 0x4f, 0xf6, 0x31, 0x5d, 0xd1, 0xfc, 0x80, 0x0e, + 0x5f, 0xc2, 0x7a, 0xd7, 0xca, 0x45, 0x3e, 0xf4, + 0x98, 0x99, 0xe9, 0x51, 0x2e, 0xf2, 0x8b, 0x5d, + 0xf1, 0x63, 0x4f, 0xe3, 0xe1, 0x60, 0xf4, 0x7d, + 0xbc, 0xef, 0xc9, 0x27, 0xb6, 0x1b, 0xed, 0xf7, + 0xed, 0xa5, 0xe7, 0xd8, 0xf3, 0xee, 0x75, 0xbf, + 0xaf, 0x0d, 0xef, 0xa6, 0xc3, 0x2f, 0x83, 0xe1, + 0xa0, 0xd3, 0xdc, 0x4e, 0x62, 0xd6, 0x3c, 0xdf, + 0x3e, 0x3b, 0xea, 0x86, 0x0f, 0x16, 0x7a, 0xfa, + 0x72, 0xa6, 0x3b, 0xb3, 0xd0, 0x17, 0x5b, 0x0f, + 0x9a, 0x3d, 0x7b, 0xb0, 0x2c, 0x76, 0x55, 0x5c, + 0x38, 0x0c, 0xc2, 0xd5, 0x0b, 0xc8, 0x88, 0x0b, + 0x6b, 0x21, 0x95, 0x73, 0x80, 0x88, 0x1f, 0x11, + 0x60, 0x6b, 0xc8, 0xd3, 0x40, 0xae, 0x80, 0x6e, + 0xc7, 0x63, 0xc8, 0x77, 0xad, 0xf1, 0xc6, 0x1c, + 0xc7, 0xf6, 0x8a, 0x30, 0x51, 0xb4, 0x21, 0x8a, + 0x22, 0x7b, 0xaf, 0xa1, 0x16, 0x45, 0x1a, 0x51, + 0x94, 0x64, 0x6c, 0x55, 0xb4, 0x28, 0x64, 0x15, + 0xa2, 0x28, 0xe4, 0x92, 0x8b, 0x82, 0xaf, 0x50, + 0x80, 0x2a, 0x8d, 0x8a, 0x0e, 0x1b, 0x95, 0x8b, + 0x13, 0x9f, 0xae, 0x14, 0xc3, 0xfa, 0x11, 0xd3, + 0x33, 0x70, 0x58, 0x0f, 0xd6, 0xad, 0x40, 0xe5, + 0xbc, 0xb2, 0x9d, 0x7f, 0x90, 0x9c, 0x1f, 0x31, + 0x6f, 0x54, 0x73, 0x9e, 0x8a, 0xf3, 0xba, 0xff, + 0x9f, 0x4e, 0x17, 0x6d, 0x90, 0xba, 0x38, 0x62, + 0xfa, 0xab, 0xd6, 0x45, 0x2a, 0x5d, 0xd4, 0x43, + 0x80, 0x54, 0xba, 0x90, 0x4f, 0x5c, 0x70, 0x24, + 0x46, 0x16, 0xed, 0x32, 0xcb, 0x02, 0xfc, 0x10, + 0x00, 0x74, 0xc4, 0x10, 0x77, 0xe7, 0x1f, 0xe5, + 0x34, 0x71, 0x94, 0x2f, 0xea, 0xe7, 0x25, 0x47, + 0x1d, 0x28, 0xe4, 0x31, 0xa0, 0xae, 0xa7, 0x3b, + 0x1e, 0xbb, 0xd5, 0x86, 0x24, 0xea, 0xff, 0x60, + 0x2f, 0x4e, 0xb2, 0xfe, 0x10, 0x9a, 0x32, 0x33, + 0x59, 0x0a, 0xdb, 0x79, 0x9d, 0x59, 0x10, 0x12, + 0x01, 0x12, 0x3c, 0xae, 0xa9, 0xc5, 0x49, 0x6b, + 0x46, 0x52, 0x69, 0x47, 0xc5, 0x58, 0x79, 0x79, + 0x1a, 0x37, 0x7d, 0xfd, 0xd1, 0xd8, 0x5c, 0x89, + 0x12, 0xd3, 0x6c, 0xe6, 0xb5, 0x30, 0x55, 0xd8, + 0xba, 0x8e, 0xde, 0xd5, 0x10, 0xab, 0x85, 0x75, + 0x12, 0x54, 0x59, 0xca, 0x3e, 0x69, 0x7a, 0x1c, + 0x12, 0x19, 0x48, 0x10, 0x71, 0x0f, 0xcd, 0xa4, + 0x28, 0xcc, 0x68, 0xdd, 0x19, 0xd2, 0xa9, 0x28, + 0x08, 0x7b, 0xf4, 0x8b, 0xa2, 0x50, 0x60, 0x7f, + 0x91, 0xa2, 0x70, 0xcc, 0x3c, 0x8a, 0x70, 0x18, + 0x04, 0x34, 0x0b, 0x25, 0x61, 0x01, 0x83, 0x64, + 0x41, 0x2e, 0x90, 0x05, 0x01, 0x8b, 0x47, 0xf3, + 0x63, 0x41, 0x6c, 0x88, 0x38, 0xa9, 0x27, 0x20, + 0x8a, 0x05, 0xa5, 0x40, 0x16, 0xaa, 0x1c, 0x24, + 0x40, 0xc2, 0xd0, 0x2a, 0x10, 0x86, 0x0a, 0x07, + 0x09, 0x90, 0x2c, 0xb4, 0x0b, 0x64, 0xa1, 0xc2, + 0x41, 0xa2, 0xb0, 0x7b, 0xf0, 0x94, 0x85, 0x63, + 0xee, 0xc0, 0x08, 0x67, 0xa1, 0xca, 0x41, 0x02, + 0x24, 0x0c, 0x7a, 0x81, 0x30, 0x54, 0x38, 0x48, + 0x80, 0x64, 0xe1, 0x67, 0x81, 0x2c, 0x54, 0x38, + 0x48, 0x14, 0x76, 0x9b, 0xfe, 0x10, 0x0b, 0x46, + 0x81, 0x2c, 0x54, 0x39, 0x48, 0x80, 0x84, 0x81, + 0x14, 0x08, 0x43, 0x85, 0x83, 0x04, 0x48, 0x16, + 0xcc, 0x02, 0x59, 0xa8, 0x66, 0x90, 0xa0, 0xf3, + 0x4e, 0xa7, 0xbd, 0x26, 0x35, 0xa5, 0xcf, 0xb1, + 0x0a, 0x63, 0xde, 0x49, 0x44, 0xf3, 0x9f, 0xdf, + 0xc4, 0x93, 0x30, 0xc9, 0x53, 0x37, 0xab, 0x27, + 0x3d, 0x9f, 0x9e, 0xce, 0xcd, 0x2a, 0xbe, 0x48, + 0xe5, 0xe6, 0xa4, 0x29, 0xf5, 0xc9, 0xb4, 0xf7, + 0x65, 0xd0, 0xbb, 0x1d, 0x68, 0xa3, 0xc3, 0x93, + 0xea, 0x7c, 0x7f, 0x73, 0x20, 0x7e, 0xa9, 0x3a, + 0xfd, 0x58, 0x43, 0x00, 0x4f, 0xa7, 0x19, 0x25, + 0x25, 0x9a, 0xca, 0x8d, 0xee, 0x64, 0x9c, 0xce, + 0x54, 0x69, 0x74, 0xf7, 0x65, 0xba, 0xd9, 0x77, + 0x5f, 0x4e, 0xdb, 0x0b, 0x40, 0xb7, 0x9e, 0x84, + 0x17, 0x3e, 0x09, 0x7f, 0x85, 0x5b, 0x28, 0xa7, + 0x25, 0xad, 0xd9, 0x5f, 0xec, 0xd1, 0x32, 0xf3, + 0x5b, 0xd2, 0x1a, 0xbc, 0xf7, 0x1f, 0x4b, 0x87, + 0x3e, 0x00, 0x70, 0x77, 0xf0, 0x0b, 0x00, 0x9f, + 0x46, 0xd7, 0x9f, 0x0a, 0x7e, 0x16, 0x86, 0x7e, + 0x72, 0x01, 0xe8, 0xe3, 0x30, 0xf4, 0xc5, 0xd5, + 0x92, 0x88, 0x28, 0x02, 0x50, 0x4d, 0xfc, 0x03, + 0x0d, 0x4c, 0x09, 0xf1, 0x17, 0x1a, 0xa2, 0xb3, + 0xee, 0xb4, 0x81, 0x61, 0x27, 0x7d, 0xc6, 0xe1, + 0xee, 0xc4, 0xef, 0x38, 0x6c, 0xf4, 0x98, 0xd3, + 0xfa, 0xdb, 0x5c, 0xf5, 0x78, 0xc4, 0xfa, 0xdb, + 0x5a, 0x91, 0x62, 0x15, 0x89, 0xd4, 0xf2, 0x2b, + 0x32, 0x32, 0xdf, 0x89, 0xf4, 0x28, 0x31, 0xd2, + 0x63, 0x69, 0x7f, 0xa4, 0x07, 0x2b, 0xe7, 0x9c, + 0x56, 0x0e, 0xe7, 0x2b, 0xe7, 0xec, 0x2b, 0x87, + 0x6b, 0x39, 0x0b, 0x95, 0xf3, 0x05, 0x7e, 0xd4, + 0x7c, 0x19, 0xd5, 0x8a, 0x2e, 0x81, 0xa2, 0x5b, + 0x10, 0x15, 0x9d, 0x7d, 0xd9, 0x73, 0xad, 0x68, + 0xf1, 0x8a, 0xc6, 0xe5, 0x57, 0x74, 0x29, 0x7a, + 0xcd, 0x0a, 0xc8, 0x51, 0xec, 0x11, 0xeb, 0xb3, + 0x6b, 0x51, 0x0a, 0x15, 0x65, 0x3d, 0x8e, 0xfd, + 0x77, 0x8a, 0x04, 0x39, 0x8e, 0xcd, 0xbe, 0x92, + 0xbc, 0x56, 0xa4, 0x58, 0x45, 0xd6, 0xe3, 0xd8, + 0x32, 0xf4, 0x7a, 0x15, 0x98, 0xe3, 0xd8, 0xec, + 0x0b, 0xe0, 0x6b, 0x39, 0x0b, 0x95, 0x73, 0x3d, + 0x8e, 0x2d, 0x8f, 0xa2, 0x41, 0x8e, 0x63, 0xb3, + 0xaf, 0xdd, 0xaf, 0x15, 0x2d, 0x5e, 0xd1, 0xf5, + 0x38, 0xf6, 0x28, 0x51, 0x46, 0x3b, 0xef, 0x2d, + 0x5a, 0xe7, 0xce, 0x42, 0x0f, 0x75, 0xf6, 0x17, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x21, 0x5c, + 0x34, 0xe6, 0x8e, 0x0a, 0x00, 0x00, 0x85, 0x78, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x34, + 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xed, 0x5d, + 0x49, 0xaf, 0xd3, 0x30, 0x10, 0x3e, 0x83, 0xc4, + 0x7f, 0x78, 0xea, 0x09, 0x0e, 0x90, 0xb5, 0x9b, + 0x54, 0x2a, 0x95, 0xbe, 0xb2, 0xb6, 0x2c, 0xaf, + 0x65, 0xb9, 0x45, 0x21, 0x75, 0x20, 0x74, 0xa5, + 0x49, 0x21, 0xf0, 0xeb, 0x19, 0x3b, 0xce, 0x52, + 0xd2, 0x24, 0x76, 0x12, 0x97, 0x52, 0x40, 0x7a, + 0x22, 0xb6, 0x27, 0x5e, 0x3e, 0xcf, 0x8c, 0x67, + 0xc6, 0x4e, 0xdd, 0x9b, 0xa3, 0x6f, 0x8e, 0x85, + 0xee, 0x3b, 0x6b, 0x7b, 0xb3, 0x5b, 0x99, 0x9e, + 0xb3, 0x59, 0x5f, 0x7d, 0x43, 0x3b, 0x17, 0xfe, + 0x7f, 0xd8, 0x50, 0x1e, 0xc8, 0x8d, 0xfe, 0x9d, + 0xdb, 0xb7, 0x7a, 0xce, 0x6a, 0xbb, 0xd9, 0x79, + 0x57, 0xb6, 0xb3, 0x44, 0x0f, 0x1b, 0x73, 0x64, + 0x9b, 0xfb, 0xa5, 0xe7, 0x3e, 0xf0, 0x57, 0xcb, + 0x86, 0x04, 0xe5, 0x98, 0xc2, 0x5a, 0x6e, 0xac, + 0xc5, 0x33, 0xa8, 0xe4, 0xca, 0x99, 0x3f, 0x6c, + 0xe8, 0xbe, 0x3f, 0xf2, 0xbd, 0x21, 0xce, 0x7b, + 0x64, 0xba, 0x88, 0x54, 0x42, 0x69, 0x86, 0x9b, + 0xb5, 0xb7, 0xdb, 0x2c, 0xfb, 0x4f, 0x86, 0x43, + 0x63, 0xf4, 0x61, 0x36, 0x7a, 0x79, 0x3d, 0xba, + 0xee, 0x49, 0xc9, 0xa2, 0x80, 0x18, 0xa1, 0x15, + 0x79, 0xdf, 0xbd, 0xda, 0x21, 0xfb, 0x61, 0x63, + 0xea, 0x99, 0xeb, 0xb9, 0xb9, 0x9b, 0x43, 0x83, + 0x61, 0xf1, 0xcc, 0x59, 0x41, 0x47, 0xb3, 0xdb, + 0x8b, 0x89, 0xae, 0x9c, 0xf5, 0x1c, 0xf9, 0x30, + 0x9e, 0x46, 0x50, 0xd9, 0x64, 0x38, 0x7e, 0xb1, + 0x75, 0xd6, 0xb4, 0xae, 0x34, 0x9d, 0x4a, 0xe9, + 0xa6, 0x45, 0x84, 0x1a, 0x25, 0x1c, 0x14, 0xd0, + 0x35, 0x29, 0xdd, 0xe3, 0xf1, 0x60, 0xfa, 0xd4, + 0x18, 0xce, 0x6e, 0xc6, 0x99, 0xa4, 0x6d, 0x4a, + 0xfa, 0x76, 0x3a, 0x7c, 0x26, 0x67, 0x52, 0x29, + 0xe1, 0x50, 0x1e, 0xcd, 0x6e, 0x66, 0xc3, 0x6c, + 0xb2, 0xb0, 0x83, 0xb3, 0x47, 0x5a, 0x36, 0x91, + 0x1e, 0x12, 0x0d, 0x72, 0x88, 0xc2, 0x21, 0xbc, + 0xbf, 0x9e, 0x19, 0x83, 0x70, 0x16, 0xa4, 0x68, + 0x1a, 0x20, 0x0d, 0xc9, 0x88, 0x0b, 0xb2, 0xb8, + 0x62, 0x18, 0x66, 0xbc, 0x75, 0x2d, 0x27, 0x18, + 0x43, 0x16, 0xb7, 0x44, 0x55, 0x63, 0x22, 0xe6, + 0x29, 0x6e, 0x25, 0xe0, 0x53, 0xaa, 0x77, 0x13, + 0xc0, 0x15, 0xd0, 0xc9, 0x66, 0xa3, 0xdf, 0x5b, + 0x9b, 0x2b, 0xd4, 0x7f, 0xbc, 0x34, 0xdd, 0xcf, + 0x57, 0x94, 0xef, 0x97, 0x68, 0xd7, 0x93, 0x48, + 0x76, 0xdc, 0xe1, 0xcc, 0xe9, 0x0f, 0x6b, 0x80, + 0x66, 0x1c, 0x8b, 0x94, 0x49, 0xd0, 0xd7, 0xf0, + 0x7d, 0x2a, 0xa2, 0x53, 0x6f, 0xb3, 0xed, 0x7b, + 0xbb, 0x3d, 0xea, 0x49, 0xc9, 0x9c, 0xb8, 0xfa, + 0xaa, 0xf0, 0x8c, 0xad, 0x39, 0x23, 0x3c, 0xa1, + 0x94, 0xd2, 0x0c, 0xfc, 0x22, 0x17, 0x64, 0x7a, + 0x28, 0x69, 0xd7, 0x43, 0x45, 0xcd, 0xe6, 0x52, + 0x99, 0x92, 0x8d, 0x87, 0xd7, 0xc6, 0xe3, 0x9b, + 0xd1, 0x1b, 0x06, 0x01, 0x1a, 0x4c, 0x9f, 0x0d, + 0x8d, 0xd9, 0xb3, 0xc9, 0xe8, 0x86, 0x45, 0x8c, + 0x58, 0xa4, 0xa8, 0x3a, 0xdb, 0xbd, 0x75, 0xcd, + 0x9d, 0xc7, 0x88, 0x2c, 0x10, 0xa5, 0xa0, 0x2d, + 0xd4, 0x2d, 0x83, 0x9b, 0x99, 0x5c, 0xbd, 0x9b, + 0xd0, 0x54, 0x29, 0x39, 0x2e, 0xee, 0x69, 0x29, + 0x31, 0x5e, 0xa1, 0xd5, 0x66, 0xf7, 0x63, 0x6c, + 0xfe, 0xd8, 0xec, 0xbd, 0xb0, 0xaf, 0xa4, 0x81, + 0xb0, 0xe8, 0x0a, 0x4b, 0x07, 0x4c, 0xb9, 0xbb, + 0x24, 0xd5, 0x93, 0x27, 0xe3, 0x3a, 0x90, 0x0c, + 0x43, 0x31, 0x1e, 0x99, 0xeb, 0x05, 0xb4, 0x95, + 0x7e, 0x61, 0xb8, 0xdd, 0x93, 0x17, 0xc8, 0x53, + 0xf8, 0xc2, 0x51, 0x4a, 0x18, 0x1a, 0xa1, 0x24, + 0x4f, 0xb9, 0x94, 0xaf, 0xd1, 0xce, 0xd9, 0x7e, + 0x46, 0x3b, 0x73, 0xa9, 0xb4, 0x3e, 0x3a, 0xc1, + 0x64, 0xa7, 0x72, 0xe3, 0x1a, 0x82, 0x11, 0x27, + 0x47, 0x98, 0x33, 0x68, 0x03, 0x83, 0xa2, 0x1a, + 0x80, 0xaf, 0x1a, 0xcc, 0x4d, 0x26, 0x14, 0x98, + 0x90, 0x50, 0x04, 0x8f, 0x86, 0x4a, 0x40, 0x70, + 0x8f, 0xf6, 0x38, 0x94, 0x59, 0xf2, 0x14, 0xc1, + 0xa6, 0x2a, 0x8f, 0x0a, 0xc6, 0xd7, 0x39, 0x36, + 0xbc, 0x4e, 0x62, 0x74, 0x21, 0x13, 0xac, 0x4c, + 0x77, 0xd1, 0x97, 0x7d, 0x5b, 0xeb, 0xc8, 0x73, + 0xf8, 0xb3, 0x64, 0xdb, 0xee, 0x49, 0x38, 0x13, + 0x97, 0x47, 0xa3, 0x2f, 0x8d, 0x84, 0xa1, 0xa9, + 0x0b, 0x43, 0x59, 0x90, 0xae, 0xa4, 0x0a, 0x8f, + 0x81, 0x33, 0x31, 0x9d, 0x35, 0xa1, 0x0e, 0x1e, + 0x0d, 0xa2, 0xad, 0x71, 0x2d, 0x47, 0x07, 0x7c, + 0x63, 0x06, 0x53, 0x4f, 0x9e, 0x62, 0xae, 0x5a, + 0x54, 0x98, 0x3b, 0x43, 0x69, 0x2d, 0x8c, 0xa6, + 0xa2, 0x3e, 0xaa, 0xda, 0x67, 0xa5, 0xc5, 0xd3, + 0x67, 0xdc, 0x62, 0x95, 0x5e, 0x77, 0x16, 0x86, + 0xda, 0x6c, 0x55, 0xee, 0x74, 0x87, 0xa7, 0xcf, + 0xd0, 0x60, 0x4e, 0x9f, 0xa9, 0x95, 0x1b, 0xf6, + 0x16, 0xcb, 0x73, 0x50, 0xf3, 0xd6, 0x35, 0xfb, + 0x37, 0xe8, 0xd3, 0x7e, 0x69, 0xc2, 0xda, 0x0b, + 0x89, 0x20, 0x17, 0x78, 0xd3, 0xed, 0x2b, 0xad, + 0x9e, 0x84, 0x1f, 0x82, 0x2c, 0x73, 0x67, 0x7d, + 0x76, 0x3c, 0x64, 0x79, 0xfb, 0x1d, 0xea, 0xc3, + 0xfb, 0x3d, 0x29, 0x99, 0x13, 0x69, 0xba, 0xfe, + 0x68, 0x32, 0xfa, 0x60, 0x8c, 0x5f, 0xbd, 0x27, + 0xca, 0x8a, 0x64, 0xc7, 0xfa, 0x93, 0xae, 0x0f, + 0xd8, 0x58, 0x0c, 0x47, 0x66, 0x23, 0x13, 0xbf, + 0x4f, 0x75, 0xe3, 0xe3, 0xe5, 0x32, 0xb2, 0x6f, + 0x7d, 0xef, 0x31, 0x2d, 0xa3, 0xd2, 0xe1, 0xfe, + 0x58, 0x5b, 0x74, 0x31, 0xc7, 0x8f, 0x54, 0x26, + 0x12, 0x74, 0xb4, 0xc6, 0xfd, 0xda, 0xc2, 0x56, + 0xfc, 0xc4, 0xdc, 0xd2, 0x17, 0x9f, 0x20, 0xef, + 0xda, 0xda, 0x3c, 0xde, 0xa1, 0xaf, 0x7b, 0xb4, + 0xb6, 0x7e, 0xf4, 0x21, 0x0d, 0x0d, 0x45, 0xe9, + 0x9e, 0xf4, 0x1b, 0x01, 0xad, 0x39, 0x51, 0x51, + 0x5c, 0xf3, 0x12, 0x79, 0x90, 0x0e, 0x8d, 0xd9, + 0x71, 0x88, 0x78, 0x00, 0x6f, 0x16, 0xd6, 0x1f, + 0x12, 0x60, 0x8f, 0xd6, 0x9f, 0xcd, 0xb5, 0x85, + 0xe6, 0xbf, 0xa3, 0xad, 0xca, 0x79, 0x68, 0x7f, + 0xc8, 0x85, 0xfb, 0xe9, 0xb3, 0x27, 0x4f, 0x13, + 0x78, 0xdb, 0x09, 0x3c, 0x42, 0xf8, 0xa7, 0x3f, + 0x5c, 0x0f, 0xca, 0xa1, 0xcb, 0xaf, 0xc7, 0x6f, + 0xa7, 0x3d, 0x29, 0x91, 0x49, 0xc9, 0x96, 0x96, + 0x8d, 0x28, 0xbc, 0xf8, 0x91, 0xe6, 0x7e, 0xdd, + 0x3b, 0xd6, 0x62, 0x82, 0x56, 0x37, 0xc8, 0x9c, + 0xd3, 0xd2, 0x64, 0x56, 0x08, 0xd5, 0xd1, 0x19, + 0x88, 0x80, 0x0a, 0x79, 0xf4, 0x83, 0x11, 0x4d, + 0x70, 0x1a, 0xcd, 0x0f, 0xf9, 0x70, 0x62, 0xa2, + 0x03, 0xde, 0xc5, 0x05, 0xae, 0x05, 0xea, 0x14, + 0x37, 0xd5, 0x9f, 0x4c, 0x5f, 0xeb, 0x9a, 0xfc, + 0x58, 0x57, 0x7c, 0x78, 0x3b, 0xce, 0x0f, 0x08, + 0x9d, 0xf9, 0x84, 0x2a, 0x51, 0x48, 0x50, 0xe7, + 0x0e, 0xeb, 0x59, 0xf8, 0xd7, 0x93, 0x68, 0x9a, + 0x96, 0xee, 0xa0, 0x31, 0x5a, 0x8c, 0x0b, 0x49, + 0x32, 0x2e, 0xb5, 0xcd, 0x8f, 0xb4, 0x00, 0x9e, + 0xe8, 0xd8, 0x83, 0xca, 0xc3, 0x86, 0x86, 0x9b, + 0x39, 0x4a, 0x35, 0xa4, 0x68, 0xb6, 0x9e, 0xd3, + 0x90, 0x9a, 0xd1, 0x8e, 0x2e, 0x27, 0xdb, 0x89, + 0xea, 0xc6, 0x55, 0x6f, 0x96, 0x9e, 0xf9, 0x09, + 0x85, 0x32, 0x15, 0x23, 0xfc, 0x72, 0xf3, 0x6d, + 0xbb, 0x6d, 0x48, 0x55, 0xf8, 0xc0, 0x05, 0x0b, + 0x19, 0xa6, 0xe9, 0xfa, 0xe3, 0x27, 0x3a, 0xdf, + 0x71, 0xc6, 0x6f, 0xb3, 0x9d, 0x25, 0xa8, 0x5f, + 0x3c, 0x33, 0x7c, 0x17, 0x3f, 0xd2, 0x5c, 0x67, + 0xed, 0x7a, 0x3b, 0x9a, 0x4d, 0x9e, 0x8f, 0x0b, + 0xf0, 0xa1, 0x7a, 0xc5, 0xa3, 0xcb, 0xd6, 0xaf, + 0x98, 0x9e, 0x6d, 0x91, 0x56, 0x34, 0xaa, 0x1c, + 0xab, 0xaf, 0xd2, 0xd1, 0x32, 0xad, 0xc1, 0x12, + 0xad, 0xc0, 0x9f, 0x6d, 0x27, 0x97, 0xe9, 0xc3, + 0x75, 0xfa, 0x37, 0x65, 0x9c, 0xa5, 0xa1, 0x46, + 0x3e, 0xb2, 0xf6, 0x1e, 0x7a, 0x1c, 0x88, 0x44, + 0xff, 0x30, 0xf9, 0x1c, 0x30, 0xec, 0x49, 0x87, + 0x79, 0x6c, 0x9a, 0x0d, 0xbf, 0xc9, 0xa8, 0xdd, + 0x2a, 0xc8, 0xdc, 0x48, 0x57, 0xdb, 0xd5, 0x84, + 0xce, 0xda, 0xac, 0x6d, 0xe7, 0x13, 0x14, 0xb6, + 0xa1, 0x28, 0x48, 0x84, 0x82, 0xb0, 0x77, 0x91, + 0x8b, 0x25, 0x08, 0x0a, 0xc8, 0x33, 0xbb, 0xd0, + 0xa9, 0x6d, 0x5b, 0xcf, 0x6c, 0x48, 0x6f, 0x1e, + 0x6f, 0x88, 0xb6, 0xc2, 0x23, 0x72, 0x4f, 0x9d, + 0x4f, 0x9f, 0x8d, 0x6f, 0x96, 0x35, 0xc1, 0xe1, + 0x0f, 0x56, 0x0e, 0x0e, 0x2c, 0xb1, 0xca, 0xea, + 0x0e, 0xa0, 0x6f, 0x5e, 0x0a, 0xf4, 0xbe, 0x72, + 0x2a, 0xf0, 0x43, 0xa3, 0xb2, 0x0e, 0xf8, 0xb5, + 0x8b, 0x81, 0x5f, 0x3d, 0x15, 0xfc, 0x81, 0xf6, + 0xae, 0x8e, 0xfe, 0x05, 0xa9, 0x1d, 0x5f, 0x3f, + 0x15, 0xf8, 0x35, 0x29, 0x9e, 0x4b, 0xd2, 0x3b, + 0xcd, 0x53, 0x61, 0x5f, 0x9b, 0xde, 0xb9, 0x24, + 0xb5, 0xd3, 0x3a, 0x15, 0xfa, 0x59, 0x6a, 0x27, + 0xe5, 0xb3, 0x01, 0xbc, 0xbe, 0xdc, 0x60, 0x9d, + 0x09, 0x5f, 0x16, 0x3d, 0x15, 0xed, 0x9a, 0x67, + 0xa2, 0x5d, 0x49, 0x07, 0xd1, 0x97, 0x02, 0xf4, + 0xfb, 0x4a, 0x47, 0x86, 0xf1, 0xd3, 0x44, 0x5c, + 0x62, 0xfa, 0x7d, 0xad, 0x85, 0x4b, 0x82, 0x44, + 0x5c, 0x42, 0x02, 0x1b, 0x98, 0x56, 0x6d, 0x92, + 0xe2, 0x38, 0x27, 0xa6, 0x99, 0x22, 0x0b, 0x9c, + 0x01, 0x42, 0xd4, 0xc6, 0x44, 0x71, 0x56, 0x4c, + 0xb5, 0xdd, 0xc6, 0x59, 0xd0, 0x10, 0x50, 0xc5, + 0x59, 0x69, 0x2a, 0xdc, 0x85, 0xf6, 0x21, 0x55, + 0xdc, 0x2b, 0x0f, 0xb9, 0xde, 0xbb, 0xed, 0xb6, + 0x6f, 0x9b, 0x4b, 0x17, 0x5c, 0x13, 0x9a, 0xa4, + 0x20, 0x24, 0x06, 0xce, 0x13, 0x96, 0x28, 0xeb, + 0xed, 0x1c, 0x61, 0x3f, 0xc2, 0x7b, 0x7c, 0x51, + 0x4b, 0x26, 0x8f, 0x48, 0x0b, 0xf5, 0x10, 0x5b, + 0x2c, 0x0a, 0xd6, 0x0d, 0x31, 0x0e, 0x94, 0x9d, + 0xef, 0x40, 0xf1, 0x06, 0xbf, 0x7e, 0x73, 0xb8, + 0x72, 0x15, 0x2d, 0xc5, 0x3a, 0x5b, 0xba, 0x9f, + 0xa4, 0xc4, 0xbb, 0x7e, 0xb1, 0xcb, 0x16, 0xba, + 0xe4, 0x38, 0x92, 0xdd, 0x2d, 0x33, 0x69, 0x35, + 0xa3, 0xd2, 0x14, 0x8d, 0x8a, 0xaf, 0x88, 0xc4, + 0x45, 0x69, 0x89, 0xc0, 0xe5, 0x14, 0xb0, 0x34, + 0xff, 0x46, 0x58, 0x34, 0xe1, 0xb0, 0xb4, 0x44, + 0xc2, 0xd2, 0x29, 0x85, 0x4a, 0x91, 0xe5, 0xf0, + 0x1e, 0x7a, 0x21, 0x55, 0x8f, 0x57, 0x1e, 0x31, + 0x1f, 0x6a, 0xb2, 0x13, 0x9a, 0x11, 0xd8, 0x3c, + 0xa6, 0x19, 0x0d, 0x40, 0xa6, 0x16, 0x4b, 0x66, + 0x33, 0x2d, 0x70, 0x50, 0xfe, 0xce, 0xd0, 0x5e, + 0x35, 0x76, 0xe8, 0xfe, 0x49, 0x4e, 0xe8, 0x9e, + 0x8c, 0x13, 0x2a, 0x19, 0x48, 0xc7, 0x58, 0x86, + 0x43, 0x94, 0x9b, 0x5d, 0x41, 0x56, 0x8c, 0x56, + 0x8b, 0x15, 0x23, 0x44, 0xd1, 0xe8, 0x5a, 0x25, + 0x15, 0xc3, 0xc4, 0x3e, 0xda, 0xef, 0x8a, 0x24, + 0x66, 0x92, 0xf4, 0x4e, 0x55, 0xf6, 0xce, 0x60, + 0xfa, 0x04, 0x88, 0xc4, 0xc3, 0x64, 0xe5, 0xf6, + 0x3b, 0xca, 0xec, 0x70, 0x15, 0xf2, 0x64, 0x5d, + 0x71, 0x96, 0x27, 0x30, 0x7b, 0x46, 0xd5, 0x29, + 0xac, 0xa8, 0x1b, 0xb4, 0x2e, 0xfb, 0x92, 0x1c, + 0x4e, 0xfb, 0xdf, 0x3d, 0xbd, 0x8c, 0xeb, 0x96, + 0x28, 0xd7, 0x4c, 0xd1, 0xb8, 0x5c, 0x33, 0x11, + 0x4a, 0x2d, 0x3e, 0x82, 0x72, 0x72, 0xa5, 0x16, + 0xf8, 0xc0, 0x4a, 0x53, 0x65, 0x0d, 0xc1, 0x00, + 0x69, 0x35, 0xe9, 0x88, 0x7c, 0x0e, 0xee, 0x40, + 0x4b, 0x53, 0xd5, 0x95, 0xa8, 0x36, 0x56, 0xbf, + 0x2e, 0x75, 0x0a, 0xa0, 0x50, 0x58, 0xc8, 0x09, + 0x57, 0x61, 0x91, 0x18, 0xf5, 0xdc, 0x22, 0x31, + 0x20, 0xa5, 0xc5, 0x81, 0x98, 0x72, 0xda, 0xa0, + 0xbe, 0x43, 0x0e, 0x75, 0xea, 0x08, 0x2a, 0x2b, + 0x3c, 0x3a, 0x82, 0x33, 0x7c, 0xa3, 0xb4, 0xea, + 0xd7, 0x11, 0x60, 0xf8, 0xd8, 0x10, 0xbe, 0xb1, + 0xab, 0x1b, 0x3e, 0x10, 0x14, 0x2f, 0x19, 0xbe, + 0x01, 0xd9, 0xcf, 0xd3, 0x0c, 0x9a, 0xca, 0xee, + 0x79, 0x62, 0x59, 0x66, 0xd6, 0x0c, 0xb8, 0x86, + 0xf3, 0x9f, 0xf5, 0xce, 0x85, 0x4d, 0x3a, 0x59, + 0x1a, 0x46, 0xe0, 0x38, 0xb3, 0xae, 0x0d, 0x98, + 0xb6, 0xe2, 0xe2, 0x50, 0x1c, 0x9f, 0x2f, 0xb1, + 0x55, 0x02, 0xbc, 0xa6, 0xf2, 0x6f, 0x95, 0x28, + 0xe7, 0xb7, 0x43, 0x1e, 0x20, 0x9c, 0x7f, 0x36, + 0x84, 0x4f, 0x06, 0xcb, 0xe0, 0xc2, 0x15, 0x44, + 0x2d, 0x69, 0xa9, 0x33, 0x8c, 0x94, 0x53, 0xdb, + 0x94, 0x19, 0xa9, 0x5a, 0x65, 0xa4, 0x7c, 0x1b, + 0xef, 0x1f, 0xf2, 0xbc, 0x92, 0x96, 0x22, 0x28, + 0x5a, 0x11, 0x8f, 0x55, 0xe3, 0x96, 0xaa, 0x96, + 0xcd, 0xee, 0xa8, 0x30, 0xd8, 0x69, 0x29, 0x83, + 0x2c, 0x7d, 0xee, 0x9f, 0xcf, 0x81, 0x29, 0xbf, + 0x54, 0x88, 0x77, 0x22, 0x14, 0x55, 0x16, 0xb1, + 0x58, 0x7c, 0xb4, 0x15, 0xf8, 0xb3, 0x6d, 0x4d, + 0xae, 0xb6, 0x58, 0x44, 0x5e, 0x44, 0x9a, 0x5a, + 0x8d, 0xc9, 0xd5, 0x88, 0x5e, 0xe7, 0xf5, 0x3a, + 0xd8, 0x19, 0xbf, 0x73, 0x21, 0x8c, 0xef, 0x2b, + 0xff, 0x59, 0x3f, 0x60, 0x7d, 0xa5, 0x79, 0x49, + 0xac, 0x5f, 0x65, 0xbb, 0xa2, 0x80, 0xf5, 0x85, + 0x9f, 0xb7, 0x3a, 0x15, 0xeb, 0xab, 0xff, 0x59, + 0x9f, 0xb0, 0x7e, 0x17, 0x6c, 0x1f, 0x5f, 0x53, + 0xfe, 0x73, 0x3f, 0x0b, 0xf7, 0xb7, 0x2e, 0x85, + 0xfb, 0xb5, 0xff, 0xdc, 0x1f, 0x73, 0xbf, 0x7a, + 0x49, 0xdc, 0xcf, 0x6e, 0xf6, 0xa4, 0x8f, 0x1d, + 0x3d, 0xd1, 0xdb, 0x5d, 0xfc, 0xd5, 0x2a, 0xdf, + 0xf7, 0x92, 0xb4, 0x65, 0x8e, 0xef, 0x25, 0x35, + 0xb5, 0xee, 0xef, 0x25, 0xd3, 0x31, 0x89, 0x03, + 0x0c, 0xd8, 0x3f, 0xa1, 0x5b, 0xb0, 0x7d, 0x40, + 0x47, 0xa0, 0x62, 0x8c, 0x40, 0x00, 0xa9, 0x70, + 0x4f, 0x89, 0xff, 0x80, 0x60, 0x9b, 0x63, 0x4b, + 0x87, 0xc1, 0x53, 0xaa, 0x2b, 0xa2, 0x7d, 0x44, + 0x8f, 0x18, 0xe3, 0xcd, 0x77, 0x08, 0x5d, 0x10, + 0x81, 0x6d, 0x70, 0x44, 0xa6, 0xff, 0xd2, 0x88, + 0x71, 0x24, 0x85, 0xa5, 0x36, 0xb5, 0x0b, 0xa5, + 0x3e, 0x48, 0x24, 0x9a, 0xca, 0x65, 0xdc, 0x0e, + 0x7b, 0x38, 0xa3, 0x14, 0x43, 0xf1, 0x85, 0x55, + 0xcb, 0x40, 0xa3, 0x97, 0x33, 0x07, 0x8a, 0xa1, + 0x69, 0x8b, 0x86, 0x86, 0x2b, 0xd0, 0x53, 0x06, + 0x9a, 0xb2, 0x67, 0x03, 0xf3, 0xa1, 0x81, 0x42, + 0xd1, 0xc8, 0xe8, 0xa2, 0x91, 0x11, 0x23, 0x4f, + 0x27, 0x10, 0x27, 0xbe, 0xc3, 0x81, 0x25, 0x90, + 0x11, 0x23, 0x4e, 0x27, 0x90, 0x26, 0xbe, 0xf3, + 0x81, 0x25, 0x90, 0xe1, 0x97, 0xa6, 0xf0, 0xa8, + 0xf7, 0x80, 0xd1, 0x90, 0xc0, 0x91, 0xf4, 0x81, + 0x68, 0x4b, 0xa2, 0xc4, 0x56, 0x46, 0xdb, 0x2c, + 0x11, 0xc8, 0x3e, 0xd5, 0x3e, 0x06, 0x6b, 0x6c, + 0x1f, 0xcf, 0x43, 0xfe, 0x57, 0x96, 0x03, 0x0e, + 0x16, 0x2d, 0x83, 0x08, 0xdf, 0x5a, 0x58, 0x7e, + 0xbf, 0xa6, 0x70, 0xa4, 0x9a, 0xf0, 0x91, 0x72, + 0x2d, 0x6d, 0x65, 0xf7, 0x30, 0x0a, 0x06, 0x0a, + 0xc2, 0x24, 0x7c, 0x9c, 0x5c, 0x0b, 0x95, 0x18, + 0xce, 0x3d, 0x05, 0xe3, 0x72, 0xad, 0x3a, 0xa2, + 0x18, 0xf7, 0x14, 0x7c, 0xcb, 0xb5, 0x88, 0xf0, + 0xf0, 0xed, 0x91, 0x4f, 0x80, 0xda, 0x8a, 0xef, + 0x8b, 0x76, 0xc4, 0xeb, 0xff, 0xe1, 0xa2, 0xc0, + 0x11, 0x57, 0xc4, 0x3a, 0xe2, 0x41, 0x56, 0x02, + 0x27, 0x03, 0xbf, 0xda, 0x59, 0xa4, 0xeb, 0xa1, + 0xb0, 0xb9, 0x1e, 0x1c, 0x35, 0x24, 0xdb, 0xe7, + 0xd8, 0x53, 0x24, 0x29, 0x5a, 0xe0, 0xfc, 0x44, + 0x58, 0x1f, 0xc9, 0x38, 0x1f, 0x27, 0x92, 0x6d, + 0x1e, 0xf0, 0x60, 0x72, 0x56, 0x18, 0x23, 0x86, + 0x40, 0xdc, 0xad, 0x18, 0x2f, 0x0f, 0x19, 0xaf, + 0xc4, 0xa2, 0x0c, 0x71, 0x41, 0xee, 0x73, 0x69, + 0x39, 0xee, 0x3a, 0x47, 0xe0, 0x2f, 0xe9, 0xb0, + 0x67, 0x2d, 0xd4, 0x21, 0x96, 0x1c, 0x06, 0x16, + 0xec, 0x4f, 0x0a, 0x8b, 0x85, 0x05, 0x89, 0x64, + 0xc7, 0x72, 0xa7, 0xb5, 0xc3, 0x63, 0xae, 0xc2, + 0x44, 0xd4, 0x72, 0xa8, 0x88, 0x1f, 0x30, 0xa5, + 0x59, 0x0c, 0x58, 0x2c, 0x40, 0x25, 0x03, 0xe7, + 0x0c, 0x70, 0x71, 0x59, 0xf7, 0x49, 0xb8, 0xaa, + 0x98, 0x0d, 0xdc, 0x70, 0xd1, 0x9d, 0x90, 0xb3, + 0x40, 0xac, 0x55, 0x13, 0x62, 0x9a, 0x78, 0xc4, + 0xd4, 0x62, 0xc4, 0x4e, 0x23, 0x94, 0xdd, 0x56, + 0x3d, 0x98, 0x71, 0x19, 0x6d, 0xdc, 0x98, 0x9d, + 0x93, 0x16, 0xab, 0x09, 0x30, 0x2e, 0xf3, 0x8f, + 0x1f, 0xb0, 0xb3, 0xd1, 0x62, 0x35, 0xc1, 0xc5, + 0x65, 0x44, 0x72, 0xc3, 0x75, 0x56, 0x5a, 0xac, + 0x26, 0xc4, 0xda, 0xe2, 0x11, 0x3b, 0x1f, 0x2d, + 0xa6, 0xd5, 0x83, 0x59, 0x47, 0x28, 0x66, 0xe7, + 0xa4, 0xc5, 0x6a, 0x02, 0xac, 0x2b, 0x16, 0xb0, + 0xb3, 0xd1, 0x62, 0x35, 0xc1, 0x65, 0x0a, 0x85, + 0xeb, 0xac, 0xb4, 0x58, 0x4d, 0x88, 0x7d, 0x14, + 0x8f, 0xd8, 0xd9, 0x68, 0x31, 0xb5, 0x26, 0xfb, + 0xd5, 0x12, 0x89, 0x19, 0xa5, 0x8c, 0xc3, 0x03, + 0xaa, 0x7c, 0x18, 0x1e, 0x88, 0x03, 0x04, 0x28, + 0x0a, 0x10, 0x30, 0x9d, 0xe3, 0x38, 0x31, 0xd8, + 0x35, 0x2d, 0xb3, 0xf3, 0x7f, 0x18, 0xec, 0x6c, + 0x7c, 0x75, 0x41, 0x1f, 0xde, 0x56, 0x09, 0xee, + 0xe8, 0x39, 0x5b, 0x60, 0xbc, 0xdb, 0x2d, 0x62, + 0x7e, 0xfe, 0x39, 0xeb, 0x2b, 0x6f, 0x9c, 0xe4, + 0xbc, 0x06, 0x25, 0xe7, 0x1e, 0x94, 0xb8, 0x3c, + 0xfe, 0x4d, 0x7c, 0x8e, 0x4b, 0x4f, 0xd8, 0x6f, + 0x3d, 0x61, 0xbe, 0xf6, 0x84, 0xf1, 0xd6, 0x06, + 0x9e, 0xeb, 0x51, 0xd2, 0xb4, 0xad, 0xe4, 0x1d, + 0x06, 0x54, 0xe5, 0x33, 0xdf, 0x75, 0xc0, 0x73, + 0x65, 0x04, 0xdf, 0x9d, 0x11, 0x4c, 0x97, 0x46, + 0xb0, 0xdc, 0x1a, 0xc1, 0x7a, 0xf7, 0xca, 0xef, + 0xd7, 0x21, 0x24, 0xef, 0x43, 0x60, 0x09, 0x54, + 0xfe, 0xd1, 0xcf, 0xca, 0xf9, 0x7e, 0xd2, 0xbc, + 0x70, 0x7b, 0x81, 0x5d, 0x13, 0x0b, 0xfa, 0x5a, + 0xfc, 0xa3, 0x3c, 0x87, 0x3f, 0x4b, 0xae, 0xed, + 0xc0, 0x23, 0xdb, 0xef, 0x26, 0xff, 0x99, 0x5f, + 0x76, 0x17, 0xf5, 0x53, 0x1b, 0x75, 0x2f, 0x0a, + 0x0c, 0x91, 0xd3, 0xff, 0xfa, 0xff, 0xaf, 0xd3, + 0xff, 0xff, 0xf5, 0xfa, 0xbf, 0xa3, 0xd7, 0xa3, + 0x63, 0x00, 0xe7, 0xa5, 0x00, 0xc3, 0xed, 0xd0, + 0xae, 0x9e, 0x7b, 0x12, 0x50, 0xaf, 0xa6, 0x0c, + 0x8b, 0x6d, 0xe7, 0xc2, 0x83, 0xcf, 0x89, 0x8e, + 0x32, 0x69, 0xcc, 0xa8, 0x49, 0xb5, 0x8c, 0x21, + 0x1d, 0x1e, 0x81, 0xae, 0x51, 0x93, 0xc2, 0x45, + 0x2a, 0xe7, 0xa3, 0x48, 0x43, 0x91, 0x9e, 0x5e, + 0x2b, 0xad, 0x7a, 0x74, 0x59, 0xf2, 0x96, 0x2b, + 0x26, 0x53, 0x76, 0xf8, 0xec, 0x0f, 0x69, 0x3c, + 0x7a, 0xdb, 0x1c, 0xc9, 0x7e, 0x24, 0xe1, 0x05, + 0xe2, 0xea, 0xee, 0x6b, 0x67, 0x7d, 0xaf, 0xd4, + 0x85, 0x73, 0x47, 0xf5, 0xe5, 0x41, 0x13, 0x03, + 0x69, 0x2a, 0xa0, 0x8d, 0xe8, 0xda, 0xbd, 0xf7, + 0xa6, 0x67, 0x7d, 0x9e, 0x6f, 0x3e, 0x5d, 0x91, + 0x72, 0x69, 0x50, 0xb1, 0xa9, 0x8a, 0x1a, 0x3b, + 0x79, 0x64, 0xa0, 0x9a, 0xf6, 0x16, 0x72, 0x58, + 0xbf, 0x82, 0x4e, 0x8f, 0xd4, 0x0f, 0xe7, 0xef, + 0xf9, 0x8a, 0xff, 0x69, 0x10, 0x11, 0x6e, 0x40, + 0x7d, 0xbf, 0x0d, 0xa2, 0x3e, 0x68, 0xfe, 0x0d, + 0x8e, 0x00, 0xa6, 0x61, 0x59, 0x08, 0x33, 0x63, + 0xc8, 0x07, 0x35, 0xb0, 0xee, 0x44, 0xe7, 0x2e, + 0xc9, 0x1d, 0xbd, 0xc1, 0xd8, 0xab, 0x8e, 0x5e, + 0xa6, 0x57, 0xbc, 0x67, 0x0a, 0xba, 0x3a, 0x87, + 0x6f, 0x4a, 0xce, 0x97, 0x73, 0x70, 0x09, 0x67, + 0x98, 0x2f, 0xea, 0x54, 0x27, 0x1f, 0x98, 0x52, + 0xd3, 0xd5, 0x66, 0x9a, 0x2e, 0x48, 0xa4, 0xae, + 0x1b, 0x86, 0x82, 0x5f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, + 0xf2, 0x4a, 0x80, 0xc8, 0x27, 0x44, 0x01, 0x02, + 0x00, 0x00, 0xad, 0x09, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x46, 0x35, 0x31, 0x78, 0x78, 0x2e, + 0x78, 0x6d, 0x6c, 0xb5, 0x96, 0x5d, 0x6f, 0x9b, + 0x30, 0x14, 0x86, 0xaf, 0x37, 0x69, 0xff, 0x01, + 0xf9, 0x7e, 0x05, 0x43, 0xf3, 0x31, 0x09, 0x90, + 0x18, 0xd0, 0xa9, 0x52, 0xd8, 0xaa, 0x86, 0x69, + 0xdc, 0x59, 0x0c, 0x1c, 0xcd, 0x0a, 0x1f, 0x15, + 0x90, 0x88, 0xfe, 0xfb, 0x19, 0x63, 0x02, 0x1a, + 0x35, 0x0b, 0xa2, 0xb9, 0x0a, 0xe6, 0x3c, 0x1c, + 0xde, 0xf7, 0xf8, 0xc5, 0x8a, 0x1e, 0xe3, 0x33, + 0x89, 0xf0, 0x67, 0x92, 0x1d, 0xf2, 0x22, 0x0d, + 0x2b, 0x92, 0x67, 0xd2, 0x19, 0x17, 0x25, 0xfd, + 0x35, 0x00, 0xbc, 0x53, 0x80, 0xf9, 0xe9, 0xe3, + 0x07, 0x9d, 0xa4, 0x2f, 0x79, 0x51, 0x49, 0x07, + 0x92, 0x60, 0x03, 0xc4, 0xf8, 0x10, 0x9e, 0x92, + 0xaa, 0xbc, 0xab, 0xd3, 0x04, 0xc8, 0xb4, 0xde, + 0x10, 0x51, 0x92, 0x47, 0xc7, 0x47, 0xda, 0x44, + 0x22, 0xb1, 0x01, 0x1e, 0x56, 0xb0, 0xae, 0xd9, + 0xa3, 0xbc, 0x62, 0xe7, 0x59, 0x55, 0xe4, 0x89, + 0xf9, 0xcd, 0xb6, 0x91, 0x1b, 0xf8, 0xee, 0x77, + 0xc7, 0x75, 0x74, 0x79, 0x58, 0x6a, 0x61, 0x8c, + 0x53, 0x9f, 0xa4, 0xf4, 0xfd, 0xff, 0xb6, 0xe9, + 0x4b, 0x12, 0xc9, 0x62, 0x5c, 0x1b, 0x40, 0x03, + 0x52, 0x81, 0x0f, 0x06, 0xb0, 0x7f, 0x78, 0x4f, + 0xe8, 0x2b, 0x90, 0x05, 0xd8, 0x8a, 0x63, 0xcf, + 0xbe, 0x2d, 0x64, 0xb6, 0x9c, 0xf9, 0xb9, 0xb7, + 0x1f, 0xa1, 0x90, 0xfa, 0x32, 0xa0, 0x14, 0x21, + 0x05, 0x21, 0xc7, 0x7c, 0x47, 0x43, 0x50, 0x8c, + 0xa9, 0x03, 0x6c, 0xa2, 0x9b, 0xd6, 0x61, 0xd6, + 0x24, 0xd6, 0xb9, 0xfc, 0xe5, 0xf8, 0xc8, 0xe2, + 0x98, 0x2e, 0x5f, 0xa6, 0x49, 0xd7, 0x74, 0x79, + 0xd9, 0x23, 0xf1, 0x9e, 0x21, 0x2b, 0x8e, 0x96, + 0xed, 0x1b, 0x95, 0xf1, 0x9f, 0x8d, 0xbb, 0xe7, + 0x5a, 0x2d, 0xc7, 0x86, 0xca, 0xb5, 0x5a, 0x53, + 0x9c, 0xe6, 0xc5, 0xeb, 0x2e, 0x7c, 0xcd, 0x4f, + 0xd5, 0x40, 0xae, 0xa6, 0x1e, 0x91, 0x7a, 0xe4, + 0x0d, 0x9d, 0x36, 0x98, 0x28, 0x38, 0xab, 0xec, + 0xdd, 0xdd, 0x53, 0x52, 0x16, 0xa6, 0x34, 0xb7, + 0x5e, 0x48, 0x32, 0x46, 0xb6, 0x97, 0xe8, 0x21, + 0x09, 0xcb, 0x3f, 0x4d, 0x07, 0xaa, 0x61, 0x4c, + 0x3f, 0x87, 0x29, 0x83, 0xd9, 0x55, 0xd3, 0x12, + 0x35, 0x60, 0x2b, 0x6e, 0x28, 0x66, 0x5a, 0x1f, + 0x5c, 0x2f, 0xd5, 0x07, 0xd7, 0xb7, 0xd4, 0xb7, + 0x3d, 0x22, 0xb8, 0x48, 0xde, 0xf6, 0x5a, 0x75, + 0x50, 0xac, 0x8e, 0xde, 0xe5, 0xc7, 0x50, 0xa7, + 0x6c, 0xa3, 0x0a, 0x34, 0x35, 0x60, 0x19, 0x15, + 0xe4, 0xa5, 0x39, 0xa8, 0x4c, 0x6f, 0xff, 0x74, + 0xaf, 0x29, 0x8c, 0xd7, 0xe5, 0x41, 0xa1, 0x25, + 0x49, 0x6c, 0xe7, 0x31, 0xe6, 0x21, 0xe4, 0x67, + 0x9a, 0xa9, 0xd4, 0x5b, 0x45, 0x53, 0x74, 0x99, + 0xaf, 0x79, 0xb5, 0x3c, 0xfd, 0xee, 0x6e, 0xd0, + 0x5a, 0xbf, 0xe2, 0xd9, 0x6c, 0x3b, 0x5d, 0x92, + 0x6e, 0xba, 0x9e, 0x1b, 0xa0, 0xbd, 0x67, 0xed, + 0x76, 0x68, 0x15, 0x04, 0x2c, 0xbb, 0xac, 0xd8, + 0x7f, 0x51, 0x4c, 0x7d, 0xff, 0x49, 0xf5, 0x33, + 0xea, 0xad, 0xb7, 0x48, 0x1f, 0xe3, 0x7e, 0xfb, + 0xda, 0x59, 0x98, 0xc3, 0xc1, 0x5c, 0xe0, 0xcd, + 0xe4, 0x1c, 0x56, 0xb3, 0xe6, 0xa0, 0x46, 0x0b, + 0xe6, 0x20, 0xb2, 0x02, 0xd7, 0xef, 0x63, 0x45, + 0x9b, 0x67, 0x65, 0x7b, 0x03, 0x2b, 0xec, 0xe3, + 0x18, 0x3b, 0x19, 0xa7, 0x15, 0x82, 0x2b, 0x4d, + 0x6d, 0xe0, 0x2c, 0x53, 0x78, 0x81, 0xa9, 0xb7, + 0xa2, 0xf8, 0x96, 0x97, 0xf1, 0xb6, 0xc0, 0xc9, + 0x84, 0xcd, 0x73, 0x10, 0x2e, 0x70, 0xf0, 0x0e, + 0x09, 0x9b, 0xb4, 0xa2, 0xcd, 0xb3, 0xb2, 0xbe, + 0x81, 0x15, 0x51, 0xc2, 0xe8, 0x62, 0xf4, 0xb7, + 0x8c, 0x16, 0xfe, 0x02, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, + 0xf2, 0x4a, 0xd6, 0xa1, 0x4b, 0x3c, 0x55, 0x03, + 0x00, 0x00, 0xd2, 0x32, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x46, 0x35, 0x32, 0x78, 0x78, 0x2e, + 0x78, 0x6d, 0x6c, 0xed, 0x5b, 0x5d, 0x6f, 0x9b, + 0x30, 0x14, 0x7d, 0x5e, 0xa5, 0xfe, 0x87, 0x88, + 0xf7, 0x15, 0x30, 0x90, 0x0f, 0x89, 0x20, 0xa5, + 0x24, 0x9d, 0x2a, 0x35, 0x5b, 0xd5, 0x64, 0x5a, + 0xde, 0x2c, 0x37, 0x98, 0x15, 0x25, 0x40, 0x04, + 0xa4, 0xa2, 0xfb, 0xf5, 0xb3, 0xf9, 0x0a, 0x5d, + 0x47, 0x55, 0x6f, 0xa1, 0x58, 0x6e, 0x9e, 0xe2, + 0xeb, 0x7b, 0x62, 0xb0, 0xcf, 0xf1, 0xf5, 0xf5, + 0x55, 0x62, 0x3a, 0xf8, 0xd1, 0x5b, 0xe3, 0xcf, + 0x5e, 0xe0, 0x86, 0x91, 0x8f, 0x12, 0x2f, 0x0c, + 0x7a, 0x8f, 0x38, 0x8a, 0xc9, 0xe7, 0x58, 0x52, + 0x2f, 0x14, 0xc9, 0x3a, 0x3f, 0xfb, 0x64, 0x7a, + 0xfe, 0x2e, 0x8c, 0x92, 0x9e, 0xeb, 0x6d, 0xf1, + 0x58, 0x72, 0xb0, 0x8b, 0xf6, 0xdb, 0x24, 0xbe, + 0x48, 0xfd, 0xad, 0x24, 0x13, 0x3f, 0x45, 0xac, + 0xb7, 0xe1, 0x7a, 0x73, 0x4d, 0x06, 0xe9, 0x79, + 0xce, 0x58, 0x32, 0x40, 0x9a, 0xc2, 0x20, 0x84, + 0x93, 0xa9, 0x9d, 0x0d, 0x50, 0xf8, 0xed, 0x30, + 0x48, 0xa2, 0x70, 0x6b, 0x7d, 0xb1, 0x6d, 0x38, + 0x5b, 0x2d, 0x67, 0x5f, 0xa7, 0xb3, 0xa9, 0x29, + 0xd7, 0x5d, 0x39, 0x18, 0x63, 0x7f, 0xe9, 0xf9, + 0xe4, 0x2d, 0x32, 0xf3, 0x60, 0xf7, 0xbc, 0xc0, + 0xc1, 0xe9, 0x58, 0xd2, 0xa4, 0x5e, 0x84, 0xdd, + 0xb1, 0x64, 0x7f, 0x9b, 0xdf, 0xc2, 0x4b, 0x49, + 0x6e, 0x80, 0x19, 0x05, 0xec, 0x6e, 0x69, 0x37, + 0x62, 0xfa, 0x05, 0xe6, 0xfb, 0xc2, 0xbe, 0xd6, + 0x1a, 0x51, 0x83, 0x1a, 0x0a, 0x34, 0xa2, 0x86, + 0x35, 0x94, 0xda, 0x88, 0x1a, 0xd5, 0x50, 0x4a, + 0x23, 0x4a, 0x55, 0x0b, 0xd8, 0xf2, 0x72, 0x00, + 0x5f, 0x81, 0x81, 0x12, 0x36, 0xd1, 0x20, 0x68, + 0x86, 0x69, 0x35, 0x98, 0xfa, 0xca, 0x92, 0xa9, + 0x7a, 0x05, 0x34, 0x5e, 0x7b, 0x6c, 0xb9, 0xb4, + 0x3f, 0xa6, 0x4b, 0x38, 0x29, 0x60, 0xa6, 0x5c, + 0xe7, 0x8d, 0x98, 0x95, 0x26, 0x88, 0x99, 0xa9, + 0xa4, 0x10, 0x5b, 0xfe, 0xd5, 0x69, 0x2e, 0x23, + 0xb8, 0x7a, 0x04, 0x99, 0x46, 0xa8, 0x37, 0x5e, + 0x47, 0xde, 0x8e, 0x6a, 0xd0, 0x9a, 0x2f, 0x6e, + 0x75, 0x4d, 0xb9, 0x32, 0x80, 0x0a, 0x4c, 0xb9, + 0xe6, 0xc8, 0x91, 0x9e, 0x63, 0x87, 0x0e, 0x2e, + 0x5e, 0xae, 0x90, 0xab, 0xa5, 0xa4, 0x43, 0x55, + 0x57, 0x4c, 0xb9, 0xb0, 0x0b, 0x6f, 0xbc, 0xbf, + 0x2f, 0x3b, 0x88, 0xef, 0x60, 0x15, 0xaf, 0x5c, + 0x1b, 0xc9, 0xdc, 0xc5, 0xc8, 0x9a, 0x05, 0x0f, + 0x28, 0x58, 0x63, 0xc7, 0x94, 0x89, 0x55, 0xa9, + 0xd1, 0x9a, 0xcd, 0x67, 0x2b, 0xb8, 0x98, 0x4f, + 0x6e, 0x6e, 0xa0, 0xb1, 0x5a, 0x65, 0x33, 0xcd, + 0x9d, 0xd5, 0x1c, 0xe9, 0xa4, 0x9e, 0x09, 0xbf, + 0x5c, 0x15, 0x1f, 0xfb, 0x61, 0xf4, 0x74, 0x83, + 0x9e, 0xc2, 0x7d, 0xf2, 0xf7, 0x99, 0x57, 0xa0, + 0x5e, 0x80, 0x7c, 0xb2, 0xc1, 0xe6, 0xc8, 0x0b, + 0xb2, 0xf5, 0xcd, 0x9b, 0xf0, 0x6a, 0x8b, 0xe2, + 0x07, 0xd8, 0xd7, 0x37, 0x74, 0xc8, 0x97, 0xf0, + 0x3b, 0xe4, 0x67, 0xe8, 0xac, 0x05, 0xe8, 0xa8, + 0x70, 0xb8, 0xa9, 0x38, 0xa9, 0x3f, 0x3e, 0xa7, + 0x25, 0x27, 0xc1, 0xfa, 0x57, 0x3e, 0x34, 0x26, + 0x3e, 0x54, 0x61, 0xf9, 0x18, 0xf5, 0x37, 0x50, + 0x83, 0x97, 0x28, 0xd8, 0xc4, 0x5c, 0xf0, 0xa2, + 0x33, 0xf1, 0x02, 0x84, 0xe5, 0x45, 0x05, 0xc3, + 0x0d, 0xd4, 0x39, 0x22, 0x66, 0xc0, 0x44, 0x8c, + 0x21, 0x2c, 0x31, 0xbc, 0x04, 0xb0, 0x21, 0x13, + 0x1f, 0x7d, 0x61, 0xf9, 0xe0, 0x2d, 0x80, 0x8d, + 0x98, 0x78, 0x19, 0x08, 0xcb, 0x0b, 0x6f, 0x01, + 0x0c, 0xb0, 0x65, 0x60, 0xa8, 0x5b, 0x62, 0xae, + 0x0c, 0x2d, 0x4d, 0x8f, 0x4d, 0x09, 0x27, 0xa1, + 0x0b, 0xb0, 0xe5, 0x5e, 0xf7, 0x02, 0x32, 0xc1, + 0x59, 0xd0, 0x02, 0x6c, 0x59, 0xd7, 0x5a, 0x40, + 0x46, 0xb8, 0x0b, 0x57, 0x6c, 0xf9, 0x96, 0x2b, + 0x20, 0x25, 0xbc, 0x84, 0x2b, 0xa6, 0x4c, 0xcb, + 0xe8, 0xf8, 0xea, 0xde, 0x0a, 0x13, 0xbc, 0x85, + 0x2b, 0xa6, 0x1c, 0xcb, 0xe8, 0xf8, 0xf2, 0xde, + 0x0a, 0x23, 0xbc, 0x85, 0x2b, 0x9d, 0x89, 0x12, + 0x57, 0x3b, 0x51, 0xd2, 0x3e, 0x25, 0x4c, 0x27, + 0x88, 0xab, 0x0b, 0x48, 0x09, 0x27, 0x27, 0x88, + 0xce, 0x94, 0x5e, 0xb9, 0x1d, 0xd7, 0x4e, 0x5a, + 0x61, 0x82, 0xbb, 0xcd, 0xc1, 0x74, 0x1b, 0x74, + 0x3b, 0x2e, 0x9f, 0xb4, 0x42, 0x09, 0x27, 0x9b, + 0x43, 0x63, 0x3b, 0x39, 0x4e, 0x05, 0x93, 0x77, + 0x23, 0x86, 0xed, 0xfc, 0x18, 0x0a, 0x4b, 0x0c, + 0x2f, 0x1b, 0x85, 0xed, 0x14, 0x19, 0x09, 0xcb, + 0x07, 0x77, 0x1b, 0x85, 0xed, 0x2c, 0xe9, 0xb8, + 0xb2, 0xd8, 0x22, 0x31, 0x9c, 0x6c, 0x14, 0x83, + 0xed, 0x44, 0x11, 0xa0, 0x74, 0x42, 0x1d, 0xd4, + 0x93, 0x3c, 0xed, 0xb0, 0x95, 0x71, 0x61, 0xca, + 0xb4, 0x5d, 0xf6, 0xdf, 0x7b, 0x49, 0x6c, 0xa9, + 0x24, 0x89, 0xa1, 0x8d, 0xb2, 0x33, 0x4e, 0x50, + 0x94, 0x90, 0x25, 0x40, 0xba, 0x42, 0xa6, 0x99, + 0x59, 0x95, 0xcb, 0xfb, 0x85, 0x89, 0x07, 0x28, + 0x0a, 0x75, 0x51, 0xab, 0xf2, 0xe0, 0x9f, 0x3e, + 0x0e, 0x92, 0x45, 0x01, 0xa0, 0xee, 0x43, 0xd7, + 0xe1, 0x79, 0x74, 0x6b, 0x5a, 0x24, 0x5e, 0x65, + 0x8d, 0xb2, 0xd7, 0x47, 0xbb, 0x1d, 0x76, 0xac, + 0x24, 0xda, 0x63, 0x53, 0xce, 0x0d, 0xea, 0x3a, + 0x48, 0xe0, 0x8d, 0xd2, 0xd1, 0x40, 0x8b, 0xda, + 0x61, 0x29, 0xf6, 0x00, 0xa5, 0xe3, 0x62, 0xcf, + 0xf1, 0xf6, 0xf2, 0x49, 0x41, 0x47, 0x53, 0x10, + 0x4b, 0xda, 0x04, 0x14, 0x01, 0x8a, 0x53, 0x1f, + 0x4b, 0x3b, 0x6a, 0xbf, 0x45, 0xed, 0xf4, 0x99, + 0xb4, 0x23, 0xcc, 0xaf, 0x5f, 0x4e, 0x0a, 0x3a, + 0x9a, 0x82, 0x0c, 0x26, 0x05, 0x09, 0x50, 0x87, + 0xfd, 0x58, 0xda, 0x69, 0xf5, 0xe4, 0x62, 0xb9, + 0x60, 0x02, 0xa5, 0xe3, 0x82, 0xf1, 0xf1, 0xa2, + 0xcf, 0x9f, 0xf7, 0x18, 0xe9, 0xbf, 0x54, 0xf2, + 0x9c, 0x7f, 0xfe, 0x48, 0x66, 0xf9, 0xf1, 0x05, + 0x50, 0x04, 0xac, 0x45, 0x77, 0x4e, 0x6f, 0xab, + 0xf1, 0x9f, 0xa5, 0x16, 0x01, 0x94, 0x8e, 0xeb, + 0xda, 0x02, 0xef, 0xe1, 0x37, 0x92, 0x7c, 0x7e, + 0x46, 0x8c, 0x17, 0xff, 0x5d, 0x21, 0x8e, 0xdf, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xfb, 0x1e, + 0x09, 0x61, 0xa8, 0x03, 0x00, 0x00, 0x08, 0x3b, + 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x35, + 0x33, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xed, + 0x5b, 0x5d, 0x6f, 0xa2, 0x40, 0x14, 0x7d, 0xde, + 0x4d, 0xfa, 0x1f, 0x0c, 0xef, 0x5b, 0x98, 0x01, + 0x11, 0x13, 0x24, 0xb1, 0x68, 0x9b, 0x26, 0xba, + 0xdb, 0xa8, 0x4d, 0x7d, 0x9b, 0xa0, 0x8c, 0xbb, + 0x44, 0x01, 0x03, 0xd8, 0xb5, 0xfb, 0xeb, 0x77, + 0x86, 0x0f, 0x65, 0x6b, 0x71, 0x3b, 0x56, 0x5b, + 0xb0, 0xd3, 0x97, 0x72, 0xe7, 0x1e, 0xe6, 0x83, + 0x33, 0xe7, 0x38, 0x5e, 0x55, 0xb7, 0xf1, 0xa3, + 0x33, 0xc5, 0xdf, 0x1c, 0x6f, 0xe6, 0x07, 0xae, + 0x15, 0x39, 0xbe, 0x57, 0x7b, 0xc4, 0x41, 0x48, + 0xfe, 0xb7, 0x04, 0x70, 0x29, 0x09, 0xc6, 0xc5, + 0xd7, 0x2f, 0xba, 0xe3, 0x2e, 0xfd, 0x20, 0xaa, + 0xcd, 0x9c, 0x05, 0x6e, 0x09, 0x36, 0x9e, 0x59, + 0xab, 0x45, 0x14, 0x5e, 0xae, 0xdd, 0x85, 0x20, + 0x92, 0x3c, 0x41, 0xa4, 0xdd, 0xd4, 0x02, 0x3c, + 0x6b, 0x09, 0x9d, 0x04, 0x80, 0xc6, 0x8f, 0x30, + 0xbe, 0x9d, 0x66, 0xc3, 0x69, 0xe0, 0x2c, 0x69, + 0xef, 0x46, 0x7f, 0x78, 0xa7, 0xc8, 0xd2, 0x75, + 0x5d, 0x96, 0x14, 0x5d, 0xcc, 0x25, 0x12, 0xa4, + 0x63, 0x9b, 0xbe, 0x8d, 0xe9, 0x35, 0x09, 0xd2, + 0x89, 0x18, 0xd2, 0x5a, 0x03, 0x00, 0xea, 0x62, + 0x1a, 0xa7, 0xd9, 0x70, 0x35, 0xd9, 0x00, 0x74, + 0x31, 0x8d, 0x36, 0x1d, 0x89, 0xb9, 0x9e, 0x74, + 0x8c, 0x5d, 0xa3, 0xdb, 0xef, 0x8e, 0xd1, 0xb0, + 0xdf, 0xee, 0xf5, 0x50, 0x7d, 0x3c, 0xd6, 0x45, + 0xd2, 0x96, 0x24, 0xa7, 0x0b, 0x7f, 0x3a, 0xbf, + 0x25, 0xeb, 0xa7, 0x61, 0x16, 0x9b, 0xbe, 0x17, + 0x05, 0xfe, 0xc2, 0xb8, 0x31, 0x4d, 0xd4, 0x1d, + 0x8f, 0xba, 0xdf, 0x3b, 0xdd, 0x8e, 0x2e, 0xe6, + 0x53, 0x14, 0x9d, 0x74, 0x3d, 0x72, 0x5c, 0x32, + 0x72, 0x12, 0x6f, 0x1b, 0x6a, 0x8e, 0x67, 0xe3, + 0x75, 0x4b, 0x50, 0x84, 0xe4, 0xa9, 0xb4, 0x3b, + 0x26, 0x90, 0x04, 0xb1, 0x08, 0x56, 0x4f, 0x61, + 0x83, 0x91, 0x59, 0x0c, 0xd2, 0x52, 0xd0, 0xfd, + 0xd0, 0xbc, 0x05, 0xc5, 0xb0, 0x66, 0x0e, 0xb6, + 0x67, 0x48, 0x00, 0x52, 0xdc, 0xe8, 0xaa, 0x81, + 0xf6, 0xe1, 0x60, 0x86, 0x6b, 0xcb, 0x08, 0xee, + 0xc1, 0xc9, 0x39, 0x1c, 0x40, 0x57, 0x7b, 0x90, + 0xca, 0x06, 0x59, 0xdf, 0x3b, 0x72, 0xf6, 0x54, + 0x1e, 0x3a, 0x23, 0xd4, 0xce, 0x70, 0xba, 0x98, + 0x7f, 0xe8, 0x34, 0xfe, 0x97, 0x42, 0xdd, 0xc5, + 0xae, 0x1f, 0x3c, 0xf5, 0xac, 0x27, 0x7f, 0x15, + 0xbd, 0xbc, 0x25, 0x37, 0xa0, 0x9a, 0x67, 0xb9, + 0x64, 0x4f, 0xf7, 0x2d, 0xc7, 0x8b, 0x87, 0x4a, + 0x2e, 0xd1, 0xf5, 0xc2, 0x0a, 0x7f, 0x21, 0x6d, + 0x4e, 0x87, 0xdc, 0x45, 0x0f, 0x2c, 0x37, 0x06, + 0xc7, 0x57, 0x90, 0x76, 0x8a, 0x94, 0x39, 0x5d, + 0xb1, 0xe5, 0x15, 0xdc, 0x71, 0x1f, 0x4e, 0xb2, + 0x9b, 0xb2, 0x00, 0xe5, 0xe7, 0x24, 0xa6, 0x0b, + 0xc9, 0xcf, 0x9c, 0x34, 0x91, 0x96, 0x44, 0x58, + 0x6f, 0x50, 0x99, 0xc6, 0xa4, 0x32, 0xb9, 0xa2, + 0x2a, 0xcb, 0xb6, 0x9e, 0xf9, 0xa3, 0x7f, 0x47, + 0x77, 0xde, 0x7b, 0xa8, 0x51, 0xcd, 0xc9, 0x4c, + 0x2e, 0x86, 0x35, 0x72, 0x30, 0xc8, 0xb5, 0x5d, + 0x12, 0x6d, 0x03, 0xf5, 0x1c, 0xc4, 0xdd, 0x64, + 0x12, 0xb7, 0xc2, 0xc5, 0xcd, 0xc5, 0xfd, 0x19, + 0xc4, 0x0d, 0x95, 0x32, 0x89, 0xfb, 0x20, 0x69, + 0x03, 0x89, 0x49, 0xda, 0x75, 0x2e, 0x6d, 0x2e, + 0xed, 0xcf, 0x20, 0x6d, 0x19, 0x56, 0x5e, 0xda, + 0x90, 0xed, 0x8d, 0xaf, 0x7a, 0x0c, 0x69, 0xf7, + 0xda, 0x83, 0x9b, 0x6e, 0x91, 0xb4, 0x93, 0xd9, + 0x93, 0x99, 0xad, 0xd7, 0x82, 0x78, 0x5c, 0xba, + 0xd4, 0xea, 0x3b, 0x31, 0xac, 0x33, 0xd1, 0xd5, + 0xe0, 0x74, 0x7d, 0x2c, 0x5d, 0x2a, 0x13, 0x5d, + 0x5a, 0x95, 0xe9, 0x6a, 0xaa, 0x73, 0x24, 0xc7, + 0x1c, 0x84, 0xaf, 0xa6, 0x4d, 0x2d, 0x29, 0x6d, + 0x0d, 0x26, 0xda, 0x9a, 0x9c, 0xb6, 0x72, 0xd0, + 0xc6, 0x56, 0x5e, 0xb2, 0xaa, 0x4c, 0x1b, 0x80, + 0xda, 0x1c, 0x29, 0x8c, 0xbc, 0x69, 0x25, 0xe5, + 0x8d, 0xad, 0x72, 0x30, 0xe1, 0xbc, 0x95, 0x83, + 0x37, 0x85, 0xed, 0x6d, 0xe1, 0xb4, 0xca, 0xbc, + 0x9d, 0xc1, 0x61, 0x44, 0x01, 0x4c, 0x74, 0xd9, + 0x55, 0xa6, 0xeb, 0x8c, 0x5e, 0xd5, 0x14, 0xc8, + 0x44, 0x1b, 0xae, 0x32, 0x6d, 0x25, 0x75, 0xc7, + 0x03, 0x99, 0x93, 0x65, 0x16, 0xe6, 0xe0, 0x51, + 0xca, 0x66, 0x31, 0x73, 0xe5, 0x2f, 0x9b, 0xc1, + 0x36, 0xaf, 0x9b, 0x7d, 0xda, 0xba, 0x59, 0x8c, + 0x8c, 0x37, 0x78, 0x64, 0x05, 0x11, 0xdd, 0xfc, + 0x92, 0x44, 0x36, 0x78, 0x1c, 0x6d, 0x52, 0xce, + 0x1f, 0x4c, 0x32, 0x50, 0x8a, 0x53, 0x34, 0xca, + 0x32, 0x13, 0x6a, 0x0e, 0x06, 0x31, 0xc5, 0xf8, + 0x82, 0xb6, 0x6e, 0xd5, 0x5b, 0x1a, 0xc7, 0x38, + 0xcc, 0x2f, 0x98, 0x8a, 0x3b, 0xf0, 0xf4, 0xc5, + 0x1d, 0xee, 0x17, 0xdc, 0x2f, 0xaa, 0xe5, 0x17, + 0x4a, 0x91, 0x5f, 0x28, 0x6f, 0xf1, 0x0b, 0x50, + 0xd2, 0xa3, 0xa1, 0xcc, 0x54, 0x5e, 0x84, 0xa7, + 0x2f, 0x2f, 0x9e, 0xc6, 0x30, 0xb2, 0x6d, 0xdf, + 0x69, 0x9b, 0x80, 0x3c, 0x4c, 0xee, 0x2b, 0xdc, + 0x57, 0xde, 0xdb, 0x57, 0x4e, 0x73, 0x0e, 0x29, + 0xad, 0xaf, 0x30, 0x15, 0x52, 0xe1, 0xe9, 0x0b, + 0xa9, 0xdc, 0x57, 0xb8, 0xaf, 0x9c, 0xa5, 0xaf, + 0x54, 0xf6, 0xbc, 0x72, 0xa0, 0xb3, 0xd4, 0x99, + 0x4a, 0xfd, 0xf2, 0x51, 0xbe, 0x67, 0xcf, 0x9d, + 0x85, 0x7b, 0x41, 0x15, 0xbc, 0x40, 0xfb, 0x10, + 0x2f, 0xa0, 0xc0, 0xcd, 0x24, 0xa3, 0xa7, 0x25, + 0x36, 0x48, 0x8b, 0x2e, 0x92, 0xab, 0xed, 0x2c, + 0x9c, 0x28, 0x34, 0xe8, 0x57, 0x7f, 0xe8, 0xc5, + 0xf3, 0xf5, 0xcc, 0xa4, 0xc2, 0x05, 0x81, 0xdd, + 0x05, 0x85, 0xf8, 0xa7, 0x8b, 0xbd, 0x68, 0x98, + 0x02, 0x48, 0x32, 0x6d, 0xd8, 0x59, 0x34, 0xc8, + 0x2d, 0x3a, 0x9e, 0xb4, 0xb5, 0x5c, 0x62, 0xdb, + 0x88, 0x82, 0x15, 0xa9, 0x70, 0x27, 0xc1, 0xff, + 0x9f, 0xc7, 0x6b, 0x8c, 0xae, 0x96, 0xfb, 0x7b, + 0x46, 0xa8, 0x63, 0x0f, 0xfc, 0xec, 0xee, 0xcc, + 0xc2, 0x54, 0xa4, 0xaa, 0xeb, 0x35, 0x4a, 0x72, + 0x2f, 0x3a, 0x65, 0xd2, 0x34, 0x5b, 0x79, 0xd3, + 0x05, 0x8e, 0xfa, 0xd6, 0x32, 0x33, 0x8d, 0xc0, + 0x0a, 0xf1, 0x75, 0xd2, 0x6a, 0x74, 0x69, 0x40, + 0x66, 0xa0, 0x8b, 0xf9, 0xe6, 0x14, 0xf9, 0x3b, + 0x70, 0xa2, 0x4d, 0xd3, 0x03, 0x09, 0x28, 0xf2, + 0xc1, 0x0f, 0xc8, 0x27, 0x32, 0xf9, 0x54, 0x3a, + 0xf4, 0x76, 0xa0, 0x63, 0x1c, 0xfd, 0xea, 0x4c, + 0x47, 0x3f, 0xf9, 0x28, 0x3f, 0xd1, 0xe0, 0x06, + 0xcd, 0x0d, 0xba, 0x0a, 0x06, 0xad, 0x16, 0x19, + 0xb4, 0x5c, 0x6a, 0x83, 0xde, 0xf3, 0x8a, 0xc3, + 0xfd, 0xf9, 0x03, 0xfd, 0xf9, 0xe2, 0x2b, 0x09, + 0x76, 0x7e, 0xf1, 0x4a, 0x12, 0x7f, 0x01, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x6f, 0x98, 0x01, + 0xd9, 0xa6, 0x02, 0x00, 0x00, 0xf4, 0x13, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x35, 0x34, + 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xed, 0x58, + 0xdb, 0x8e, 0xa2, 0x40, 0x10, 0x7d, 0x9e, 0x4d, + 0xf6, 0x1f, 0x0c, 0xef, 0x3b, 0x4d, 0x73, 0x13, + 0x13, 0x24, 0x51, 0xc4, 0xc9, 0x24, 0xba, 0xd9, + 0xa8, 0x9b, 0xf5, 0xad, 0xc3, 0x40, 0x9b, 0x25, + 0x72, 0x31, 0x80, 0x86, 0xd9, 0xaf, 0xdf, 0x6e, + 0x6e, 0xc3, 0x46, 0x61, 0x21, 0xcd, 0x64, 0xe6, + 0xc1, 0x27, 0xbb, 0xa8, 0xd3, 0xd5, 0x5d, 0xe7, + 0x54, 0x51, 0xaa, 0xe6, 0xe0, 0x8b, 0x6b, 0xe3, + 0x6f, 0x6e, 0x70, 0x08, 0x23, 0xdf, 0x4a, 0xdc, + 0x30, 0x18, 0x5d, 0x70, 0x14, 0x93, 0xcf, 0x29, + 0x07, 0x1f, 0x79, 0x4e, 0xff, 0xfa, 0xe5, 0x41, + 0x73, 0xfd, 0x53, 0x18, 0x25, 0xa3, 0x83, 0xeb, + 0xe1, 0x29, 0xe7, 0xe0, 0x83, 0x75, 0xf6, 0x92, + 0xf8, 0x31, 0xf5, 0x3d, 0x0e, 0x10, 0x3f, 0x45, + 0x1c, 0xce, 0x81, 0x4d, 0x37, 0xaf, 0xad, 0xd3, + 0x28, 0xc2, 0x87, 0x29, 0xb7, 0xc8, 0x51, 0x68, + 0x7f, 0x11, 0xb8, 0x91, 0xeb, 0x4c, 0xb9, 0xa5, + 0x2c, 0x89, 0x6a, 0x16, 0xee, 0x41, 0xdb, 0xe0, + 0x18, 0x27, 0xc4, 0xa3, 0x67, 0x0b, 0xea, 0x20, + 0x86, 0x06, 0xca, 0xc7, 0xd9, 0x99, 0xa0, 0x16, + 0x32, 0x3f, 0xa4, 0xb8, 0x6b, 0x15, 0x6d, 0xcc, + 0x5d, 0x1f, 0x45, 0xb7, 0x52, 0x60, 0x6c, 0x47, + 0xee, 0x89, 0xee, 0xd6, 0xd7, 0xdb, 0x1f, 0x92, + 0xc8, 0x67, 0xf8, 0x99, 0x06, 0x6a, 0x9e, 0x1c, + 0xea, 0x3a, 0x46, 0xe8, 0x60, 0xba, 0x26, 0x46, + 0x91, 0xb9, 0xce, 0xa7, 0x2a, 0xcf, 0x4b, 0x1a, + 0x28, 0xec, 0xc2, 0x1b, 0x9f, 0x5f, 0x2a, 0x80, + 0x06, 0x0a, 0xab, 0x0a, 0x04, 0x6a, 0x91, 0x34, + 0x8c, 0x7d, 0xdd, 0x5c, 0x9b, 0x7b, 0xb4, 0x9a, + 0x6d, 0x9e, 0x4c, 0x24, 0xef, 0xf7, 0x1a, 0x20, + 0xcf, 0x72, 0xa7, 0xed, 0x85, 0xf6, 0xf1, 0x99, + 0x10, 0x4e, 0xcd, 0xd2, 0x36, 0xc2, 0x20, 0x89, + 0x42, 0x4f, 0x7f, 0x32, 0x0c, 0x64, 0xee, 0x77, + 0xe6, 0xf7, 0x85, 0xb9, 0xd0, 0x40, 0xdd, 0x45, + 0xd1, 0x79, 0xe8, 0x9d, 0xeb, 0x93, 0x93, 0x4b, + 0x1e, 0xd2, 0x14, 0x6d, 0x7d, 0xcb, 0xf3, 0xb2, + 0xdc, 0xeb, 0x88, 0x91, 0x1b, 0x38, 0x38, 0x9d, + 0x72, 0x52, 0xc1, 0xd3, 0x6c, 0x61, 0x40, 0x61, + 0xc6, 0x81, 0x26, 0x9c, 0x5c, 0xe0, 0x36, 0x3b, + 0xa3, 0x19, 0xa4, 0x16, 0xa0, 0x9f, 0x5b, 0xe3, + 0x19, 0x36, 0xc3, 0x26, 0x35, 0x18, 0xdf, 0x0c, + 0x83, 0x42, 0x81, 0xdb, 0xcd, 0xc7, 0xa8, 0x0d, + 0x27, 0x96, 0xb8, 0x99, 0x88, 0x20, 0x9a, 0xb7, + 0x20, 0xa5, 0x0a, 0x29, 0xb7, 0x46, 0x2c, 0xb3, + 0xfd, 0xb5, 0xd8, 0xa1, 0x8a, 0x14, 0x0d, 0x54, + 0xf4, 0x16, 0xaa, 0xfe, 0x2b, 0x96, 0xe6, 0x63, + 0x3f, 0x8c, 0x5e, 0x57, 0xd6, 0x6b, 0x78, 0x4e, + 0x6e, 0x57, 0x5f, 0x05, 0x1a, 0x05, 0x96, 0x4f, + 0xda, 0x65, 0x6d, 0xb9, 0x41, 0x76, 0x54, 0xbe, + 0x44, 0x4b, 0xcf, 0x8a, 0x7f, 0x23, 0x41, 0x56, + 0x8e, 0x48, 0x42, 0x73, 0x2b, 0x38, 0xc6, 0xf4, + 0xf0, 0xeb, 0x7d, 0x1b, 0xcb, 0xcf, 0xb6, 0x65, + 0x2b, 0x1a, 0x1d, 0x41, 0xe5, 0x48, 0xa0, 0xf9, + 0xb5, 0xea, 0xf7, 0xc8, 0xdb, 0x25, 0x6f, 0x8e, + 0xdb, 0x9d, 0x92, 0x8b, 0x56, 0x74, 0x4d, 0x6b, + 0x8f, 0xa8, 0xfd, 0x7a, 0x44, 0x66, 0xe8, 0x91, + 0xa1, 0xda, 0x80, 0x64, 0xd6, 0xad, 0x0f, 0x94, + 0x5a, 0x4d, 0x8a, 0xcd, 0x95, 0x31, 0xae, 0xc1, + 0x84, 0x8e, 0x85, 0x71, 0x93, 0xfe, 0x8e, 0x9c, + 0x43, 0xb5, 0x3b, 0xe5, 0x50, 0x95, 0x59, 0x5e, + 0x4b, 0x03, 0x55, 0x6f, 0xc5, 0x70, 0x9c, 0x58, + 0x51, 0x42, 0xae, 0x25, 0xdb, 0x3c, 0x39, 0x3a, + 0xb3, 0x2a, 0x97, 0xfb, 0x07, 0x13, 0x8f, 0xc0, + 0xf3, 0xd4, 0x45, 0xad, 0xd2, 0xf3, 0x42, 0x6b, + 0x5e, 0x27, 0x69, 0x64, 0x0b, 0xfa, 0xf4, 0xad, + 0xa0, 0xd9, 0x1b, 0xe1, 0x6a, 0x14, 0x95, 0x1d, + 0x00, 0x3a, 0xe8, 0xa4, 0xb6, 0xea, 0x34, 0xe9, + 0xa1, 0xd3, 0xe4, 0xae, 0xd3, 0x3b, 0xea, 0xd4, + 0xfe, 0x0e, 0x93, 0xbb, 0xeb, 0x24, 0xca, 0x9f, + 0x41, 0x27, 0x04, 0x27, 0xc2, 0xa0, 0xd3, 0x80, + 0x89, 0x5c, 0xb5, 0x95, 0x5c, 0xa5, 0x07, 0xb9, + 0xca, 0x9d, 0xdc, 0x7e, 0x95, 0x3b, 0xee, 0x41, + 0xee, 0x98, 0x89, 0x5c, 0x86, 0x14, 0xda, 0xeb, + 0xa3, 0xc7, 0x30, 0x13, 0xd9, 0x86, 0x19, 0x4e, + 0x93, 0x25, 0xb6, 0x92, 0x73, 0x84, 0x63, 0xc0, + 0x9c, 0x54, 0xfb, 0x84, 0xee, 0xf9, 0xad, 0x88, + 0x67, 0xc8, 0x6a, 0xa0, 0xaa, 0xff, 0xcc, 0xaf, + 0x7e, 0x96, 0xfa, 0x82, 0x93, 0x7e, 0x52, 0xc0, + 0xbb, 0x14, 0x0c, 0x52, 0xfc, 0x67, 0xce, 0xf6, + 0x93, 0x42, 0xf8, 0x78, 0x29, 0x06, 0x9f, 0x05, + 0x2c, 0xa5, 0x2c, 0x2a, 0xfd, 0xf8, 0x13, 0xef, + 0xfc, 0xbd, 0xdf, 0x6f, 0xd5, 0x14, 0x36, 0x32, + 0xc8, 0x74, 0xcf, 0xed, 0xaa, 0xef, 0x45, 0x21, + 0xc6, 0x43, 0x5d, 0xb4, 0x30, 0xde, 0xfe, 0xdd, + 0xcb, 0x77, 0xfc, 0x05, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, + 0xf2, 0x4a, 0xbc, 0xd5, 0x41, 0x97, 0x7d, 0x03, + 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x46, 0x35, 0x35, 0x78, 0x78, 0x2e, + 0x78, 0x6d, 0x6c, 0xed, 0x9a, 0xef, 0x6f, 0xa2, + 0x30, 0x18, 0xc7, 0x5f, 0xdf, 0x25, 0xf7, 0x3f, + 0x18, 0xde, 0xdf, 0xa4, 0xe5, 0x87, 0x98, 0xa0, + 0x09, 0xa2, 0x5b, 0x96, 0xe8, 0xdd, 0xb2, 0xb9, + 0x9c, 0xef, 0x1a, 0x26, 0x98, 0x23, 0x08, 0x2c, + 0xe0, 0x16, 0xf6, 0xdf, 0x5f, 0x81, 0x82, 0x1c, + 0x0c, 0x47, 0xb5, 0xf8, 0x63, 0xd9, 0xab, 0x89, + 0xfd, 0xd2, 0x3e, 0xdf, 0xcf, 0x63, 0xdb, 0xa7, + 0xcd, 0x54, 0xd3, 0x7a, 0xb5, 0x97, 0xd6, 0x4f, + 0xdb, 0x5b, 0xf9, 0x81, 0x6b, 0x6c, 0x6c, 0xdf, + 0xeb, 0xbc, 0x5a, 0x41, 0x88, 0xff, 0x0e, 0x38, + 0x70, 0xc5, 0x73, 0xc3, 0x1f, 0xdf, 0xbf, 0xa9, + 0xb6, 0xfb, 0xec, 0x07, 0x9b, 0xce, 0xca, 0x5e, + 0x5b, 0x03, 0xce, 0xb4, 0x56, 0xc6, 0xcb, 0x7a, + 0x13, 0x5e, 0x45, 0xee, 0x9a, 0xeb, 0xe2, 0xf6, + 0x58, 0x61, 0x59, 0xee, 0xdc, 0x76, 0xf1, 0x8b, + 0x1d, 0xdb, 0x1c, 0x70, 0xd7, 0x92, 0x14, 0x45, + 0x68, 0x64, 0x84, 0x56, 0xf2, 0xfe, 0xb6, 0xb9, + 0x63, 0x7b, 0xa6, 0x15, 0x0d, 0x38, 0x89, 0xeb, + 0x04, 0xd6, 0x6a, 0xc0, 0xdd, 0xcf, 0x75, 0xdc, + 0xc5, 0xbb, 0x12, 0x85, 0x48, 0x1e, 0x1f, 0xf4, + 0x5b, 0x50, 0x27, 0xea, 0x17, 0x44, 0x7c, 0x9d, + 0x08, 0xf0, 0xb9, 0x6a, 0x54, 0xab, 0x01, 0x44, + 0x33, 0x1f, 0xf5, 0x50, 0x7d, 0x4f, 0x30, 0x53, + 0x69, 0x02, 0x82, 0xb5, 0x2a, 0xa1, 0xa0, 0x02, + 0xa8, 0x7e, 0x4c, 0x31, 0xd7, 0x49, 0x3b, 0xc6, + 0xcc, 0x58, 0xfd, 0x19, 0xcf, 0x91, 0x96, 0xaa, + 0xd4, 0x6e, 0xce, 0x9b, 0xf0, 0x5f, 0xae, 0xfd, + 0xa5, 0x73, 0x8b, 0x93, 0x58, 0xe0, 0xaf, 0xfb, + 0xee, 0xf3, 0x63, 0xb8, 0xb4, 0xa1, 0x90, 0x64, + 0x81, 0x88, 0x74, 0xdf, 0xdb, 0x04, 0xfe, 0x7a, + 0x78, 0xa3, 0xeb, 0x68, 0xb2, 0x98, 0x4f, 0x7e, + 0x8d, 0x27, 0x63, 0xb5, 0x5b, 0x6c, 0xfa, 0x3f, + 0x8e, 0xb0, 0xd4, 0xe3, 0x08, 0x25, 0x7d, 0xa6, + 0x1e, 0xab, 0xa9, 0xae, 0x1a, 0xc8, 0x94, 0xfa, + 0xef, 0xd9, 0x5d, 0x0e, 0xa3, 0x2a, 0x93, 0x0b, + 0xa9, 0x14, 0x6a, 0x55, 0xbd, 0x82, 0x8a, 0x24, + 0xa0, 0x44, 0x03, 0x3f, 0xe6, 0x30, 0x76, 0xc0, + 0xd1, 0xcc, 0x25, 0x0b, 0x36, 0x49, 0x30, 0x55, + 0x38, 0x75, 0x2c, 0xb2, 0x8c, 0x6b, 0x63, 0x1d, + 0x40, 0xed, 0xc0, 0xf8, 0x59, 0xe5, 0xf7, 0x00, + 0x0f, 0x3c, 0x03, 0x0b, 0xcc, 0x82, 0x67, 0xf0, + 0x23, 0x64, 0xe9, 0xed, 0x28, 0xbe, 0xf6, 0x0a, + 0xd8, 0xb5, 0x5c, 0x3f, 0x78, 0x9b, 0x1a, 0x6f, + 0xfe, 0xcb, 0x66, 0x1b, 0x33, 0xe9, 0x69, 0x9c, + 0x2e, 0xef, 0x68, 0xf1, 0x0a, 0x93, 0x41, 0x33, + 0x79, 0xc7, 0x33, 0x5c, 0x0b, 0x4f, 0xbc, 0xf0, + 0xe9, 0xde, 0x70, 0x13, 0x6d, 0xf6, 0x80, 0x0a, + 0xaf, 0x64, 0xeb, 0x53, 0x71, 0x08, 0xfc, 0x4d, + 0x32, 0x2e, 0xd9, 0x6b, 0xb2, 0x11, 0x61, 0xbf, + 0x66, 0xc4, 0x58, 0x18, 0x2e, 0x03, 0xfb, 0x39, + 0xde, 0x8d, 0x86, 0xb3, 0x87, 0x3b, 0x51, 0xe0, + 0x13, 0xbd, 0xda, 0x2d, 0x34, 0xa4, 0x4a, 0xdb, + 0xd4, 0x7d, 0xd3, 0x22, 0x70, 0xc8, 0xc6, 0x35, + 0xe4, 0x23, 0xd8, 0x97, 0x24, 0xb5, 0x4b, 0x9e, + 0x49, 0x6b, 0xf8, 0xf2, 0x94, 0x0b, 0xd4, 0xee, + 0xf6, 0x89, 0x30, 0x4b, 0x7b, 0xca, 0xd3, 0x30, + 0x9c, 0xcc, 0x26, 0x0b, 0x34, 0xd5, 0xee, 0x6f, + 0x26, 0x48, 0x5a, 0x2c, 0x12, 0xa6, 0x49, 0xe3, + 0x36, 0xdd, 0x71, 0xf4, 0x95, 0xe5, 0x24, 0x05, + 0x50, 0x62, 0xbc, 0x15, 0x26, 0x06, 0xcb, 0x4c, + 0x67, 0x86, 0xed, 0x25, 0x2c, 0xd2, 0x8f, 0xe8, + 0x7a, 0x6d, 0x84, 0x7f, 0x11, 0x80, 0x8a, 0x83, + 0x44, 0x9c, 0x7d, 0xcf, 0x09, 0xe3, 0x5e, 0xab, + 0xef, 0x65, 0x89, 0x48, 0x3e, 0xc1, 0x98, 0x1f, + 0x52, 0x9c, 0x54, 0x5a, 0x4d, 0x01, 0xfe, 0x26, + 0xe5, 0x3f, 0x2c, 0x26, 0x23, 0x7e, 0x9d, 0x64, + 0x63, 0x17, 0x7b, 0x20, 0x34, 0x67, 0x0f, 0x84, + 0x83, 0xd8, 0xe7, 0x78, 0xcb, 0xeb, 0x12, 0x6b, + 0xbe, 0x02, 0x74, 0x10, 0x3c, 0x13, 0xbc, 0x22, + 0x05, 0x5e, 0xf1, 0x32, 0xf0, 0xca, 0xa2, 0xd3, + 0x18, 0xab, 0xd8, 0x12, 0x56, 0x89, 0x02, 0xab, + 0xf4, 0x85, 0xb5, 0x29, 0xd6, 0x1e, 0x05, 0xd6, + 0xde, 0x65, 0x60, 0xed, 0xcb, 0x0e, 0x12, 0x28, + 0x17, 0x03, 0xb9, 0x25, 0xbc, 0x14, 0xfb, 0x1c, + 0x38, 0x6c, 0x9f, 0x3b, 0x1a, 0xde, 0x73, 0xda, + 0xcb, 0x20, 0x68, 0xce, 0x17, 0x02, 0xf6, 0x7c, + 0x5b, 0x28, 0x15, 0xce, 0x68, 0x2b, 0x83, 0x90, + 0x82, 0x2e, 0xfc, 0xa2, 0x4b, 0x49, 0x97, 0xa2, + 0x50, 0x80, 0x2d, 0x14, 0x0a, 0x2d, 0xd0, 0x3d, + 0x83, 0x0d, 0x0d, 0x52, 0xd4, 0x09, 0xb0, 0x85, + 0x3a, 0xe1, 0x93, 0x52, 0x95, 0x29, 0xa8, 0xca, + 0x17, 0x41, 0xf5, 0x8c, 0xaa, 0x04, 0x48, 0x51, + 0x84, 0xc1, 0x16, 0x8a, 0xb0, 0x4f, 0x4e, 0x57, + 0xa1, 0xa0, 0xab, 0x5c, 0x04, 0xdd, 0xe3, 0x94, + 0x60, 0xe4, 0x6e, 0x07, 0xf0, 0x74, 0x77, 0x3b, + 0x80, 0x6f, 0xce, 0x5b, 0xe1, 0x05, 0x70, 0x00, + 0xef, 0xfc, 0x6e, 0xe7, 0x61, 0xa6, 0x4d, 0xa7, + 0x0d, 0xef, 0x76, 0xda, 0xa8, 0x89, 0x05, 0xc8, + 0x7e, 0x89, 0xae, 0xb9, 0xdd, 0x03, 0x51, 0x94, + 0x0c, 0x57, 0x0a, 0x94, 0x36, 0xce, 0xc6, 0x61, + 0x96, 0xa2, 0xdc, 0x19, 0x17, 0x14, 0xf7, 0x8c, + 0x0b, 0x8a, 0xad, 0xc6, 0x05, 0xe4, 0x3d, 0xe3, + 0x02, 0x72, 0xab, 0x71, 0x29, 0x7b, 0x86, 0xa5, + 0xb0, 0x88, 0xea, 0x9d, 0x85, 0x14, 0xf0, 0xbb, + 0x26, 0x36, 0x4f, 0x71, 0xd8, 0xc2, 0x13, 0x1b, + 0x1e, 0x30, 0xb1, 0x77, 0xcd, 0xdd, 0xfa, 0x59, + 0xbb, 0x4d, 0x76, 0xf7, 0xe3, 0x4d, 0xe3, 0x03, + 0xaf, 0x14, 0x47, 0x1f, 0xec, 0x55, 0x38, 0x91, + 0x57, 0x28, 0xb2, 0xf0, 0x4a, 0x71, 0x21, 0x8c, + 0xbd, 0x8a, 0x27, 0xf2, 0x2a, 0x40, 0x16, 0x5e, + 0x29, 0x0e, 0x5d, 0xd8, 0x6b, 0x1b, 0xc5, 0xc0, + 0x47, 0x3e, 0x15, 0x16, 0x36, 0x29, 0x4e, 0x41, + 0xd8, 0xa6, 0x7c, 0x02, 0x9b, 0x6c, 0xa6, 0x29, + 0xc5, 0xb9, 0x04, 0xfb, 0xec, 0x9d, 0xc0, 0x27, + 0x9b, 0x29, 0x4a, 0x71, 0x42, 0xc0, 0x3e, 0x95, + 0x13, 0xf8, 0x64, 0x33, 0x3d, 0x29, 0x6a, 0x75, + 0xec, 0xb3, 0xdf, 0x82, 0xcf, 0x66, 0xe5, 0x21, + 0xbb, 0x5f, 0x30, 0xc5, 0x0d, 0x31, 0x76, 0x6c, + 0x9c, 0xd4, 0x31, 0x9b, 0xdf, 0x32, 0xdd, 0xf9, + 0xe0, 0xa9, 0x25, 0xc7, 0xdc, 0x3e, 0xcb, 0x30, + 0x7e, 0xa8, 0xfc, 0x8f, 0x15, 0x6e, 0xf8, 0x07, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x50, 0xfa, + 0x80, 0x2f, 0xe3, 0x02, 0x00, 0x00, 0xb7, 0x1f, + 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x36, + 0x34, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xed, + 0x99, 0x5d, 0x4f, 0xdb, 0x30, 0x14, 0x86, 0xaf, + 0x87, 0xc4, 0x7f, 0xa8, 0x72, 0x3f, 0x9c, 0xaf, + 0x86, 0x22, 0x99, 0x48, 0x25, 0x09, 0x08, 0x89, + 0x6e, 0xa8, 0x14, 0xd1, 0xbb, 0xc8, 0x34, 0xce, + 0xb0, 0xc8, 0x97, 0x92, 0x94, 0x95, 0xfd, 0xfa, + 0xd9, 0xb1, 0x13, 0x0c, 0x25, 0xdd, 0xca, 0xc6, + 0x87, 0x84, 0xb9, 0xc1, 0xef, 0x39, 0xaf, 0xed, + 0xe3, 0xd3, 0xfa, 0x69, 0xaa, 0xc2, 0x08, 0xdf, + 0x91, 0x05, 0xfe, 0x4a, 0xb2, 0x38, 0x2f, 0x53, + 0x54, 0x93, 0x3c, 0x1b, 0xdc, 0xe1, 0xb2, 0xa2, + 0xff, 0x0f, 0x35, 0x63, 0x4f, 0xd7, 0xdc, 0xdd, + 0x9d, 0x2f, 0x90, 0xa4, 0x45, 0x5e, 0xd6, 0x83, + 0x98, 0x24, 0xf8, 0x50, 0x8b, 0x70, 0x8c, 0x96, + 0x49, 0x5d, 0xed, 0xad, 0xd2, 0x44, 0x03, 0x34, + 0x4f, 0x1d, 0x62, 0x99, 0x41, 0x89, 0xe3, 0x43, + 0xcd, 0xe7, 0x86, 0x70, 0x7e, 0x67, 0x36, 0xd3, + 0x59, 0xb6, 0x5a, 0x94, 0xa4, 0x60, 0xab, 0xbb, + 0x93, 0x8b, 0x73, 0xdb, 0xd2, 0x8f, 0x1d, 0xdb, + 0xb2, 0x20, 0x90, 0x12, 0xdc, 0x49, 0x22, 0x2f, + 0x8f, 0x30, 0x1b, 0x53, 0x21, 0x0a, 0x71, 0xf5, + 0xd5, 0xc8, 0x30, 0x62, 0x08, 0x84, 0x16, 0xd9, + 0x6a, 0x79, 0xdd, 0x19, 0x20, 0x10, 0xaa, 0x5b, + 0x08, 0x48, 0x2b, 0xc1, 0xa2, 0x42, 0x6e, 0x90, + 0xdd, 0xa0, 0x6c, 0x81, 0x23, 0x08, 0xa8, 0xe2, + 0x61, 0x8c, 0x53, 0x37, 0x98, 0x04, 0xf3, 0xf0, + 0x6c, 0x3c, 0x3d, 0x09, 0xc2, 0xe1, 0x7c, 0x0e, + 0x01, 0x8d, 0xf1, 0xe4, 0x22, 0xc9, 0x17, 0xb7, + 0xa7, 0xb4, 0x2d, 0x4c, 0xb6, 0xda, 0xcb, 0xb3, + 0xba, 0xcc, 0x13, 0xf7, 0xc4, 0xf3, 0xc2, 0x60, + 0x3e, 0x0b, 0xbe, 0xf9, 0x81, 0x0f, 0x81, 0x9c, + 0x62, 0x6e, 0xbe, 0xf4, 0x8c, 0xa4, 0xb4, 0x20, + 0xae, 0x1f, 0x02, 0x03, 0x92, 0x45, 0x78, 0x45, + 0x7b, 0xab, 0xf1, 0x66, 0x9d, 0x79, 0xfe, 0x91, + 0x06, 0xfa, 0x5c, 0x96, 0x70, 0x79, 0xdf, 0x27, + 0xe7, 0xe1, 0x06, 0x9f, 0x2d, 0x7c, 0x63, 0xdf, + 0x33, 0xcc, 0x71, 0xbf, 0x6f, 0x28, 0x7c, 0xd3, + 0x99, 0xd7, 0x6f, 0x72, 0x84, 0xe9, 0xf2, 0xc2, + 0x3b, 0xb5, 0xfa, 0x6d, 0xfb, 0x92, 0xcd, 0xec, + 0xb7, 0x8d, 0x24, 0x9b, 0xd1, 0x6f, 0x3b, 0x90, + 0x6c, 0x7a, 0xbf, 0xcd, 0x68, 0xfb, 0x36, 0x3b, + 0xda, 0x0f, 0x37, 0xf9, 0xcc, 0xd6, 0x37, 0xb6, + 0x42, 0x73, 0x83, 0xcf, 0x92, 0x7c, 0xc6, 0xa6, + 0x16, 0x1b, 0x76, 0xe7, 0x1c, 0x6e, 0xdc, 0xb9, + 0xed, 0xf1, 0x95, 0x3f, 0x0b, 0xbb, 0x97, 0x02, + 0x02, 0xf9, 0x1d, 0xc1, 0xf4, 0xe3, 0xf7, 0x17, + 0x4c, 0x71, 0x9a, 0x97, 0xf7, 0x67, 0xe8, 0x3e, + 0x5f, 0xd6, 0xcf, 0x5f, 0xa3, 0xce, 0x34, 0xc8, + 0x50, 0x4a, 0xef, 0xe1, 0x04, 0x91, 0xac, 0xd9, + 0x8a, 0x0f, 0xc3, 0xe3, 0x04, 0x55, 0x37, 0x8d, + 0xb3, 0xb9, 0x1d, 0x35, 0x2a, 0x6b, 0x76, 0x73, + 0x74, 0x9d, 0xde, 0x8e, 0x46, 0x75, 0x29, 0xf2, + 0x0b, 0xd3, 0x8c, 0xa9, 0x37, 0x29, 0xa6, 0xda, + 0xcc, 0x35, 0xca, 0x6e, 0x2b, 0xd7, 0x84, 0xa0, + 0x19, 0xb4, 0x95, 0xf3, 0x5d, 0x9f, 0x2b, 0x61, + 0x8a, 0xd2, 0xa6, 0x82, 0x66, 0x64, 0xb2, 0x4a, + 0xc3, 0xd1, 0x2d, 0x6b, 0x23, 0x9d, 0xce, 0x4e, + 0xbe, 0x3e, 0xe3, 0xb2, 0xba, 0x6e, 0x27, 0xb5, + 0x22, 0x94, 0x0f, 0x0a, 0x44, 0x77, 0xe4, 0x76, + 0xf0, 0x50, 0xbc, 0xcc, 0x16, 0x09, 0xae, 0x27, + 0xa8, 0x68, 0xaf, 0x58, 0x89, 0x2a, 0x7c, 0xcc, + 0xa3, 0x6e, 0xc0, 0x04, 0x5d, 0x00, 0x02, 0x39, + 0x2c, 0x9c, 0x3f, 0x4b, 0x52, 0x77, 0xa1, 0x2b, + 0x2a, 0x98, 0xf3, 0x2a, 0x2f, 0x29, 0x0b, 0xe4, + 0x94, 0xd8, 0xfa, 0xd1, 0x46, 0x54, 0x73, 0xb4, + 0xb9, 0x2f, 0xa5, 0xdc, 0x70, 0x1b, 0xca, 0x99, + 0x86, 0xa2, 0x9c, 0xa2, 0x9c, 0xa2, 0xdc, 0xff, + 0xa3, 0x9c, 0xdd, 0x47, 0x39, 0xfb, 0x5f, 0x28, + 0x67, 0x38, 0x0a, 0x73, 0x8f, 0x31, 0xe7, 0x6c, + 0x85, 0x39, 0xf3, 0x33, 0x62, 0xae, 0xbd, 0xac, + 0xfe, 0x98, 0xe2, 0x4b, 0xd1, 0x50, 0xd1, 0xf0, + 0xed, 0x69, 0xf8, 0x3a, 0xcf, 0x7c, 0x8a, 0x86, + 0x4f, 0x69, 0x38, 0xda, 0x8a, 0x86, 0xb6, 0xa2, + 0xa1, 0xa2, 0xa1, 0xa2, 0xe1, 0x9b, 0xd3, 0x50, + 0x3d, 0x1b, 0x6e, 0x4b, 0xc3, 0x17, 0xf2, 0x70, + 0x78, 0xb0, 0x15, 0x0f, 0xa3, 0xcf, 0xc8, 0xc3, + 0x77, 0x01, 0x9d, 0x42, 0xd3, 0x07, 0x45, 0xd3, + 0xe8, 0x5d, 0xd0, 0xc4, 0x8c, 0x5d, 0x91, 0xf5, + 0x7d, 0x81, 0x5d, 0x1a, 0x81, 0x80, 0x8e, 0x1e, + 0xaa, 0x20, 0x75, 0xe5, 0x1a, 0xf4, 0xdb, 0x1e, + 0x1b, 0x3c, 0x3d, 0x4f, 0xac, 0xf7, 0x1e, 0xc8, + 0x58, 0x3f, 0x50, 0x85, 0x7f, 0xa4, 0x38, 0xab, + 0x2f, 0x84, 0x81, 0x26, 0x45, 0x60, 0xed, 0xd0, + 0x86, 0x74, 0xe8, 0xa6, 0x68, 0x54, 0x14, 0x38, + 0x72, 0xeb, 0x72, 0x89, 0x21, 0xe0, 0xe2, 0xcf, + 0xfd, 0xf8, 0x1b, 0xee, 0x0e, 0xa4, 0xbf, 0x27, + 0x2f, 0x28, 0x89, 0xa6, 0x79, 0x3b, 0x5b, 0x80, + 0x6d, 0xe8, 0x84, 0x8e, 0xb3, 0x5a, 0x85, 0x3c, + 0xf7, 0xa1, 0xc1, 0xfd, 0x32, 0x6c, 0x6f, 0xf7, + 0x18, 0x8b, 0x15, 0xb6, 0x15, 0xb6, 0x3f, 0x37, + 0xb6, 0x9d, 0x3e, 0x6c, 0x5b, 0x1f, 0x1a, 0xdb, + 0x1b, 0x3e, 0x87, 0x14, 0xb5, 0xdf, 0x91, 0xda, + 0xbb, 0x3b, 0x54, 0xac, 0xfd, 0x40, 0x4f, 0x13, + 0xbf, 0x01, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, + 0x24, 0x0b, 0x08, 0x99, 0x46, 0x04, 0x00, 0x00, + 0xae, 0x31, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x46, 0x36, 0x36, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0xed, 0x5b, 0x5d, 0x6f, 0x9b, 0x30, 0x14, + 0x7d, 0xee, 0xa4, 0xfd, 0x87, 0x88, 0xf7, 0x0d, + 0xcc, 0xd7, 0x52, 0x89, 0x22, 0x11, 0x92, 0x56, + 0x95, 0x9a, 0xad, 0x6a, 0x53, 0x35, 0x6f, 0x16, + 0x05, 0x67, 0x43, 0x0d, 0x50, 0x01, 0xed, 0xd2, + 0xfd, 0xfa, 0x19, 0x63, 0x08, 0x6b, 0x20, 0xd4, + 0x31, 0x49, 0x9b, 0x2e, 0x79, 0x69, 0xec, 0x7b, + 0xc0, 0xf7, 0xfa, 0x9c, 0xeb, 0x6b, 0x5b, 0xa9, + 0xe1, 0xa1, 0x27, 0xdf, 0x45, 0x5f, 0xfc, 0x70, + 0x16, 0xc5, 0x81, 0x93, 0xfa, 0x51, 0xd8, 0x7b, + 0x42, 0x71, 0x82, 0xff, 0x9e, 0x08, 0xe0, 0xab, + 0x24, 0x98, 0x9f, 0x3f, 0x1d, 0x19, 0x7e, 0xf0, + 0x10, 0xc5, 0x69, 0x6f, 0xe6, 0xcf, 0xd1, 0x89, + 0xe0, 0xa1, 0x99, 0xf3, 0x38, 0x4f, 0x93, 0xaf, + 0x8b, 0x60, 0x2e, 0x88, 0xd8, 0x9e, 0x21, 0x02, + 0x14, 0x44, 0xf1, 0x73, 0xcf, 0xf7, 0x4e, 0x84, + 0xb1, 0xe3, 0x87, 0xf0, 0x74, 0xee, 0x24, 0xbf, + 0x20, 0x90, 0xfb, 0xf7, 0x50, 0x86, 0x03, 0x27, + 0xbc, 0x4f, 0xa0, 0x3c, 0x78, 0x4e, 0x91, 0x35, + 0xf7, 0x7f, 0x86, 0xc8, 0x13, 0x7a, 0x31, 0x9a, + 0x55, 0xa1, 0x64, 0x9c, 0x23, 0x23, 0x49, 0x9d, + 0x38, 0x35, 0xa5, 0x45, 0x5f, 0x92, 0x24, 0x43, + 0x24, 0x2d, 0x6a, 0xf0, 0xff, 0x20, 0xdc, 0x2f, + 0x4b, 0xc4, 0x90, 0xb5, 0xf2, 0xfe, 0xbb, 0xec, + 0xd5, 0xa6, 0x6c, 0x88, 0xe4, 0x4b, 0xd6, 0x57, + 0xf8, 0x62, 0xb9, 0x2e, 0x4a, 0x12, 0xd3, 0x48, + 0x9f, 0x1f, 0x90, 0x49, 0xc6, 0x18, 0x57, 0xfa, + 0xab, 0xce, 0x18, 0x22, 0xc1, 0x18, 0x62, 0xe5, + 0x41, 0xf2, 0xaa, 0xa2, 0x67, 0x6d, 0x8c, 0xb2, + 0xa6, 0xdf, 0x43, 0xb5, 0x36, 0xc6, 0x0d, 0x83, + 0x54, 0xeb, 0x83, 0x54, 0xb7, 0x1c, 0x64, 0x0f, + 0x7f, 0x3e, 0x7f, 0xea, 0xe5, 0x9f, 0xcc, 0xe0, + 0xce, 0x23, 0xf7, 0xfe, 0x1c, 0x0b, 0x83, 0x84, + 0xac, 0xeb, 0x8b, 0x05, 0x8e, 0x32, 0x41, 0x24, + 0x0a, 0x6a, 0xb5, 0xa3, 0x30, 0x8d, 0xa3, 0xb9, + 0x79, 0x66, 0xdb, 0x70, 0x34, 0x9d, 0x8c, 0xbe, + 0x0f, 0x47, 0x43, 0x43, 0xac, 0x9a, 0x72, 0x30, + 0x42, 0xc1, 0xc4, 0x0f, 0xb0, 0xae, 0xea, 0x5e, + 0xb5, 0x34, 0xf7, 0xfc, 0xd0, 0x43, 0x8b, 0x13, + 0x41, 0xa1, 0xfa, 0xb0, 0x7f, 0x8c, 0x2f, 0xe1, + 0x40, 0x10, 0x1b, 0x60, 0x1a, 0x85, 0x5d, 0x4d, + 0xec, 0x46, 0x4c, 0x9f, 0x62, 0x6e, 0xae, 0xed, + 0x73, 0xd0, 0x88, 0x3a, 0xae, 0xa0, 0xa4, 0x46, + 0x14, 0x90, 0x4a, 0xd8, 0xa0, 0x19, 0x04, 0x28, + 0x68, 0x32, 0xf8, 0x06, 0xd7, 0xbc, 0x4b, 0x2e, + 0x60, 0x96, 0x02, 0xe5, 0x66, 0x98, 0x52, 0x81, + 0x01, 0xb8, 0x66, 0x58, 0xb5, 0x04, 0x6a, 0xeb, + 0x86, 0x2d, 0xe6, 0xec, 0x76, 0x38, 0x81, 0x16, + 0x85, 0x19, 0x62, 0x01, 0xa3, 0x8a, 0x28, 0x99, + 0xc7, 0xcd, 0x06, 0x25, 0x58, 0x9e, 0x3b, 0x74, + 0x5c, 0xf2, 0xb2, 0x55, 0x6d, 0x94, 0xaf, 0xcb, + 0xcc, 0xaf, 0xe0, 0xbb, 0x98, 0x8b, 0xa1, 0x65, + 0x83, 0xe6, 0xb9, 0x28, 0x22, 0xb4, 0x86, 0x18, + 0xc5, 0xe3, 0xfb, 0x85, 0xeb, 0xb5, 0x3a, 0xde, + 0x0e, 0xae, 0x99, 0x5c, 0x0a, 0xbc, 0xb0, 0x87, + 0x03, 0x3e, 0xf7, 0x2c, 0xaf, 0x7d, 0x6a, 0x6b, + 0xf1, 0x4b, 0x9f, 0x77, 0x30, 0x89, 0xcc, 0x1a, + 0xc8, 0x9f, 0x61, 0x51, 0xc1, 0x26, 0x9e, 0xbd, + 0x66, 0xf2, 0x5e, 0x47, 0xe8, 0x26, 0x93, 0x85, + 0xbb, 0x68, 0x51, 0x25, 0x1e, 0x9d, 0xea, 0xba, + 0x76, 0x5c, 0x04, 0x96, 0x57, 0x4e, 0x38, 0x7d, + 0x92, 0xc9, 0x88, 0x19, 0x30, 0x71, 0x63, 0xff, + 0x21, 0x2b, 0xbb, 0xe6, 0xf8, 0xfa, 0x52, 0x55, + 0x24, 0x82, 0x37, 0xc4, 0x8a, 0x21, 0x47, 0xfa, + 0x9e, 0x1d, 0x79, 0x88, 0xfa, 0x49, 0x2b, 0x74, + 0x56, 0x43, 0x80, 0x7c, 0x67, 0x88, 0xb4, 0x4d, + 0xad, 0xc9, 0xe3, 0x5d, 0x09, 0x30, 0xc4, 0x65, + 0x8b, 0x7a, 0x5f, 0xbe, 0x29, 0x0f, 0xd8, 0x1c, + 0x8d, 0x47, 0x53, 0x78, 0x61, 0x5d, 0x9d, 0x8d, + 0xa0, 0x36, 0x9d, 0x92, 0xe8, 0x72, 0x63, 0x19, + 0x57, 0xe6, 0xfd, 0x0a, 0xeb, 0x62, 0xb5, 0x0e, + 0x5d, 0x38, 0xcf, 0xd1, 0x63, 0xda, 0x10, 0x65, + 0x59, 0x39, 0x43, 0x27, 0x40, 0x79, 0x3d, 0x6c, + 0xa8, 0xff, 0x6b, 0x8a, 0xe3, 0xb2, 0x3c, 0xf6, + 0x5f, 0x94, 0xc7, 0xfa, 0x02, 0xd9, 0x65, 0x89, + 0x3c, 0x2a, 0x8b, 0x64, 0x5d, 0x3c, 0x57, 0x4e, + 0x40, 0xc2, 0x21, 0xdf, 0xe4, 0x2c, 0x6c, 0x08, + 0xf0, 0x96, 0x00, 0x90, 0x2d, 0x81, 0x20, 0x36, + 0x3c, 0x22, 0x2f, 0x9f, 0x81, 0x74, 0xc6, 0x56, + 0xe6, 0x60, 0x26, 0x35, 0x4e, 0x02, 0x58, 0x4e, + 0x42, 0xbb, 0x87, 0x37, 0xc9, 0x5d, 0xe1, 0x64, + 0xd1, 0x80, 0x15, 0x96, 0x88, 0x8f, 0xbd, 0xca, + 0xe7, 0x05, 0x5f, 0xbe, 0x77, 0x15, 0x15, 0x4f, + 0x53, 0x91, 0x6a, 0x3a, 0x24, 0x72, 0xc8, 0x6d, + 0x65, 0x62, 0x54, 0xc5, 0x90, 0x77, 0xcd, 0x1e, + 0x43, 0x77, 0x8e, 0xd2, 0xb1, 0xf3, 0x50, 0xa4, + 0x58, 0x8c, 0xf3, 0xed, 0x34, 0xef, 0x35, 0x47, + 0x59, 0x03, 0x7b, 0x60, 0x88, 0xd5, 0x6e, 0x8a, + 0xfc, 0x1d, 0xfb, 0x69, 0xd9, 0x75, 0x8b, 0x1b, + 0x19, 0xf2, 0x36, 0x8a, 0x31, 0x4f, 0x55, 0x13, + 0x1d, 0xfa, 0x9f, 0x81, 0x70, 0x3b, 0x4f, 0x41, + 0x73, 0x35, 0x1f, 0xb5, 0x22, 0x1f, 0x69, 0x6e, + 0x36, 0x67, 0xa2, 0xc6, 0x98, 0x89, 0x8a, 0xc4, + 0x91, 0x89, 0x75, 0xc9, 0x56, 0x64, 0xda, 0x6a, + 0x44, 0x45, 0x48, 0x34, 0x0e, 0xad, 0x25, 0x0e, + 0x45, 0x67, 0x88, 0x43, 0x02, 0x3c, 0x71, 0x74, + 0xb4, 0x1e, 0xac, 0x39, 0x3a, 0x88, 0xaf, 0x4f, + 0x42, 0x41, 0xdc, 0x34, 0x1d, 0x5e, 0xaa, 0x79, + 0x85, 0x02, 0x56, 0x06, 0x34, 0x16, 0x06, 0x24, + 0xc4, 0xc1, 0x40, 0xbd, 0x92, 0xba, 0x5e, 0xb0, + 0xe9, 0xb9, 0xe7, 0xe3, 0x10, 0xf4, 0x8d, 0x85, + 0x20, 0x20, 0x73, 0x10, 0xd4, 0x11, 0x03, 0x0c, + 0x25, 0x53, 0x69, 0x2a, 0x99, 0xca, 0x7b, 0x2a, + 0x99, 0xef, 0x48, 0x0c, 0x7d, 0x26, 0x31, 0xa8, + 0x6f, 0x2f, 0x86, 0x7d, 0x4b, 0xc7, 0xf5, 0x95, + 0x57, 0x67, 0x5c, 0x2f, 0x81, 0xce, 0xc1, 0xc0, + 0x86, 0x7b, 0xe0, 0xff, 0x7c, 0x3d, 0x6d, 0x25, + 0x90, 0x6d, 0xcb, 0xd1, 0xe7, 0x20, 0xb0, 0x2b, + 0x06, 0xf6, 0x6c, 0xcb, 0xd1, 0xca, 0x00, 0x5b, + 0x45, 0x73, 0xde, 0x9e, 0x81, 0x43, 0x45, 0xdb, + 0x9e, 0x18, 0xd8, 0x2a, 0x9a, 0xfb, 0xf6, 0x62, + 0xd8, 0xb7, 0x05, 0xb1, 0x75, 0x4f, 0x21, 0xb1, + 0x30, 0xa0, 0xf0, 0x30, 0x50, 0x16, 0xad, 0x17, + 0xd7, 0x5c, 0x5d, 0x97, 0xac, 0x3d, 0x5b, 0x30, + 0x5b, 0x19, 0x02, 0x4c, 0x0c, 0x75, 0x7d, 0x46, + 0xdb, 0x02, 0x43, 0x87, 0x05, 0x75, 0x7b, 0x62, + 0x91, 0x59, 0xc4, 0xa2, 0xf2, 0x5c, 0xa9, 0xec, + 0x48, 0x2c, 0x1f, 0x6e, 0xc1, 0x55, 0x98, 0x18, + 0xe2, 0x39, 0xd1, 0xef, 0xe8, 0xca, 0xe5, 0xa3, + 0xad, 0xb7, 0x2a, 0x13, 0x41, 0x3c, 0xa7, 0xec, + 0xdd, 0x10, 0x74, 0x58, 0x6e, 0x37, 0xd6, 0x4a, + 0xeb, 0xfe, 0x95, 0x69, 0xf7, 0xa4, 0xf2, 0xdc, + 0x07, 0x34, 0x1c, 0xf9, 0x3b, 0xd6, 0xca, 0xbe, + 0x25, 0x73, 0x2b, 0x41, 0x4c, 0x9b, 0x27, 0x95, + 0xe7, 0xbc, 0xbf, 0x1b, 0x82, 0x0e, 0xc9, 0xbc, + 0x3d, 0xad, 0xb0, 0xed, 0x9d, 0x78, 0x6e, 0x26, + 0x36, 0xb9, 0xdc, 0xeb, 0x58, 0x48, 0xfb, 0xb6, + 0xaf, 0x6a, 0x65, 0x8f, 0x6d, 0x5f, 0xc5, 0x73, + 0x90, 0xdd, 0x84, 0xbd, 0xee, 0xcb, 0xfa, 0x87, + 0x5b, 0xaa, 0xd9, 0xf6, 0x5d, 0x3c, 0xe7, 0xdc, + 0xf7, 0x41, 0xe0, 0x61, 0x29, 0xdf, 0x9a, 0x96, + 0x34, 0x96, 0x7b, 0x45, 0x20, 0xf3, 0x2c, 0x06, + 0xbb, 0x17, 0x83, 0xbe, 0x17, 0x62, 0xe8, 0xe4, + 0x97, 0x46, 0x6b, 0x7e, 0x6e, 0xb5, 0x0f, 0x3f, + 0x34, 0xe2, 0x39, 0x86, 0xb2, 0x49, 0x58, 0x01, + 0x07, 0x09, 0x1f, 0x24, 0xbc, 0x6d, 0x09, 0xe3, + 0xc6, 0xca, 0xff, 0x65, 0x60, 0xc3, 0x5f, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x3d, 0xa7, 0xa8, + 0xbf, 0x50, 0x06, 0x00, 0x00, 0x36, 0x57, 0x00, + 0x00, 0x11, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x36, 0x37, + 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xcd, 0x9c, + 0xdb, 0x6e, 0xd3, 0x40, 0x10, 0x86, 0xaf, 0x41, + 0xe2, 0x1d, 0xaa, 0xdc, 0x83, 0xbd, 0x87, 0xec, + 0xda, 0x92, 0x1b, 0x29, 0x4d, 0x03, 0x42, 0x6a, + 0x01, 0xd1, 0x22, 0x7a, 0x67, 0x99, 0xc4, 0x15, + 0x16, 0x39, 0xa0, 0x24, 0xa0, 0xc2, 0xd3, 0xe3, + 0x38, 0x8e, 0x93, 0xd0, 0xd8, 0xf1, 0x6f, 0xcf, + 0x14, 0xae, 0xa8, 0xe3, 0x89, 0x33, 0xff, 0xec, + 0xce, 0xb7, 0x33, 0xbb, 0x16, 0xc1, 0x38, 0xfe, + 0x99, 0x8c, 0xe2, 0x97, 0xc9, 0xec, 0x7e, 0xbe, + 0x98, 0x46, 0xab, 0x64, 0x3e, 0x3b, 0xfb, 0x19, + 0x2f, 0x96, 0xe9, 0xbf, 0xe7, 0x1d, 0xf1, 0xca, + 0xed, 0xf4, 0x5e, 0x3c, 0x7f, 0x16, 0x24, 0xd3, + 0xef, 0xf3, 0xc5, 0xea, 0xec, 0x3e, 0x99, 0xc4, + 0xe7, 0x9d, 0x71, 0x7c, 0x1f, 0xfd, 0x98, 0xac, + 0x96, 0xaf, 0x1e, 0xa6, 0x93, 0x8e, 0x93, 0xde, + 0x5f, 0x5b, 0x8c, 0x26, 0xf3, 0xd1, 0xb7, 0xb7, + 0xe9, 0x43, 0xce, 0x92, 0xf1, 0x79, 0xe7, 0xb5, + 0xb1, 0x0f, 0x0f, 0xe1, 0x45, 0xb4, 0x8c, 0xb3, + 0xef, 0xe7, 0xb7, 0x07, 0xf3, 0xd9, 0x6a, 0x31, + 0x9f, 0xf4, 0xde, 0x0c, 0x06, 0xe1, 0xf0, 0xee, + 0x76, 0xf8, 0xee, 0x72, 0x78, 0x19, 0x38, 0xfb, + 0xb7, 0x36, 0xc6, 0x71, 0x3c, 0xbd, 0x4d, 0xa6, + 0xa9, 0x13, 0x47, 0x9f, 0xb5, 0xbb, 0x7f, 0x96, + 0xcc, 0xc6, 0xf1, 0xc3, 0x79, 0x47, 0x75, 0xce, + 0x16, 0xf1, 0xfd, 0x79, 0xe7, 0xe6, 0x52, 0xea, + 0x8b, 0x8e, 0x53, 0x62, 0xa5, 0x73, 0xab, 0xfe, + 0xe5, 0x40, 0xb8, 0xa5, 0x56, 0xdd, 0xdc, 0xea, + 0xe3, 0xed, 0xa0, 0xd4, 0xc6, 0xe4, 0x36, 0xf1, + 0xa7, 0x9b, 0xc1, 0xdb, 0x8b, 0xf2, 0x67, 0xd9, + 0x7d, 0xbb, 0xbe, 0x28, 0xb5, 0xf3, 0x0e, 0xec, + 0xca, 0x9f, 0x27, 0x44, 0x6e, 0x78, 0xdb, 0x57, + 0x61, 0x85, 0x99, 0x2c, 0xcc, 0x64, 0x28, 0xc2, + 0x41, 0xb9, 0xa1, 0xda, 0x33, 0x94, 0x55, 0x86, + 0x7a, 0xcf, 0x50, 0x55, 0x19, 0x6e, 0xc3, 0xf7, + 0xf9, 0xf2, 0x36, 0xec, 0xe7, 0x66, 0x81, 0x53, + 0x0c, 0x68, 0x7a, 0x9d, 0x5e, 0x16, 0x73, 0xa5, + 0x62, 0xee, 0xcc, 0xe6, 0x61, 0x7f, 0x78, 0xb3, + 0x79, 0xda, 0xe3, 0xe9, 0x54, 0x3c, 0xb0, 0xee, + 0x37, 0x8e, 0xb8, 0x7a, 0x10, 0x74, 0x55, 0x2a, + 0x49, 0x1e, 0xd8, 0xc9, 0x52, 0x3b, 0xff, 0x60, + 0x52, 0x88, 0xf2, 0x10, 0xb9, 0xb9, 0xe1, 0xe0, + 0xfd, 0xf5, 0x87, 0xf0, 0xa2, 0x4d, 0x8c, 0xb6, + 0x72, 0x0f, 0x23, 0xf0, 0x28, 0x44, 0x8f, 0x2d, + 0x4a, 0x5c, 0xdb, 0x7a, 0x96, 0x9a, 0x08, 0xe9, + 0xd5, 0xf5, 0x6c, 0x1a, 0x4f, 0xe7, 0x8b, 0x5f, + 0x99, 0x5b, 0xd7, 0x51, 0x32, 0x0b, 0x5f, 0x4f, + 0xa2, 0xe5, 0xd7, 0x30, 0x7d, 0xc0, 0xb7, 0x50, + 0xa7, 0x23, 0x30, 0xfb, 0xb6, 0x0c, 0xd7, 0xbf, + 0x9d, 0x3f, 0x7b, 0x67, 0x92, 0xfb, 0xb9, 0x5c, + 0x45, 0x8b, 0x55, 0xcf, 0x7d, 0xd0, 0xae, 0xeb, + 0x06, 0x4e, 0x76, 0x95, 0xdf, 0x48, 0x7e, 0xc7, + 0xe9, 0xe7, 0xd2, 0xcd, 0x6e, 0xac, 0xaf, 0x36, + 0x9f, 0x7f, 0x59, 0x3f, 0xb2, 0xa7, 0x03, 0x67, + 0xfd, 0x47, 0xee, 0xd3, 0xc6, 0x87, 0xd3, 0x0e, + 0x89, 0xcc, 0xa1, 0x53, 0xae, 0x8c, 0xea, 0xb9, + 0x52, 0xeb, 0x67, 0xbb, 0x42, 0x16, 0x71, 0x68, + 0xfa, 0xbb, 0x5e, 0xc3, 0x10, 0x5c, 0x45, 0xbf, + 0xe6, 0x3f, 0x56, 0xbb, 0x09, 0xb3, 0x71, 0x46, + 0xc9, 0x6d, 0x00, 0x2e, 0x37, 0x20, 0x0f, 0xef, + 0x7e, 0xca, 0xcc, 0x93, 0x42, 0xc3, 0x2c, 0x9a, + 0xc6, 0x1b, 0x3f, 0x33, 0xcb, 0x72, 0x41, 0xce, + 0x91, 0xaf, 0x7d, 0x8c, 0xa6, 0xd9, 0xb7, 0xb2, + 0xbf, 0xd6, 0xcf, 0xce, 0x7e, 0xd1, 0xd9, 0x7a, + 0xb9, 0x73, 0xac, 0x86, 0xaf, 0xc2, 0x3c, 0xb5, + 0xaf, 0xc2, 0x34, 0xf0, 0x55, 0x76, 0x4d, 0xeb, + 0xb8, 0x66, 0xcf, 0x90, 0x90, 0xaf, 0x8d, 0xe2, + 0x9a, 0xfe, 0x4e, 0xeb, 0xb8, 0x36, 0xf0, 0xb5, + 0x51, 0x5c, 0xd3, 0x9c, 0x6d, 0xed, 0xeb, 0x5e, + 0xde, 0xb3, 0xbb, 0xea, 0xb5, 0xf7, 0x74, 0x1f, + 0x99, 0x35, 0xfd, 0xf5, 0x9a, 0xba, 0xab, 0xff, + 0x89, 0xbb, 0xba, 0x81, 0xbb, 0xbe, 0x69, 0xe9, + 0x6d, 0x66, 0x58, 0xbe, 0xda, 0xec, 0x58, 0x2b, + 0xbc, 0x03, 0xd6, 0x16, 0xb0, 0x55, 0x7b, 0xb0, + 0x2d, 0x5c, 0x67, 0xd3, 0x6b, 0x74, 0xa1, 0xf7, + 0x30, 0x04, 0x0c, 0x82, 0xdd, 0xe3, 0x82, 0xe5, + 0x31, 0xc1, 0xa8, 0x0e, 0xed, 0x3d, 0x99, 0x8e, + 0x11, 0xa3, 0x0c, 0x95, 0x2e, 0x23, 0xed, 0xe8, + 0xae, 0x64, 0x5d, 0xfa, 0x34, 0x61, 0xba, 0x58, + 0x23, 0xbd, 0x95, 0x7f, 0xc2, 0xd4, 0xf5, 0x4f, + 0x94, 0xfb, 0x97, 0x7e, 0x9a, 0xb7, 0x93, 0x5b, + 0xdf, 0x94, 0x29, 0x71, 0x6a, 0x6d, 0xb8, 0x1c, + 0x2d, 0x92, 0xef, 0xeb, 0x86, 0xb3, 0x77, 0x7d, + 0xf3, 0x41, 0x2b, 0x37, 0xb3, 0x0f, 0x9c, 0xbd, + 0x1b, 0x1b, 0xcb, 0x64, 0x3c, 0x98, 0x8f, 0xb7, + 0xa3, 0x9a, 0xf7, 0xa6, 0xeb, 0xaa, 0x48, 0x98, + 0x51, 0xe0, 0xe4, 0xd7, 0xdb, 0xb9, 0xf0, 0xe3, + 0x4b, 0x61, 0x10, 0x38, 0xbb, 0xab, 0x7c, 0xf4, + 0xf7, 0x9e, 0x14, 0x7c, 0x5f, 0x46, 0xbd, 0xe1, + 0xec, 0x6b, 0x34, 0x1b, 0xc5, 0xe3, 0xc0, 0x49, + 0xaf, 0x8a, 0xb2, 0xb9, 0x37, 0xbc, 0x1e, 0xde, + 0x85, 0x37, 0xd7, 0xfd, 0xab, 0xab, 0xb0, 0x7b, + 0x77, 0x97, 0x15, 0xc0, 0xd9, 0xcd, 0x5d, 0x11, + 0xfe, 0x77, 0x93, 0xb1, 0x8b, 0xdd, 0x2e, 0x24, + 0x5b, 0x9b, 0xdd, 0xea, 0x50, 0x44, 0x6e, 0x13, + 0xa4, 0xde, 0x7e, 0xc4, 0x0a, 0x6b, 0x65, 0xaa, + 0x02, 0x24, 0x5d, 0x20, 0x40, 0x6e, 0xd7, 0x6b, + 0x11, 0xa0, 0xbf, 0xb5, 0x1c, 0x4c, 0x36, 0x0a, + 0x29, 0x02, 0x92, 0xe2, 0x33, 0x48, 0xc9, 0xf2, + 0x9a, 0x42, 0x8a, 0x44, 0xa4, 0x18, 0x97, 0x41, + 0x4a, 0x46, 0x5a, 0x0a, 0x29, 0x0a, 0x92, 0x22, + 0x18, 0xa4, 0x18, 0x4d, 0x23, 0x45, 0x41, 0xb9, + 0x62, 0x24, 0x83, 0x14, 0xaa, 0x5c, 0x51, 0x50, + 0xae, 0x18, 0xc5, 0x20, 0x85, 0x2a, 0x57, 0x14, + 0x96, 0x2b, 0x9a, 0x41, 0x0a, 0x55, 0xae, 0x28, + 0x2c, 0x57, 0xba, 0x0c, 0x52, 0xc8, 0x72, 0x45, + 0x03, 0x52, 0x84, 0x89, 0x18, 0xa4, 0xf8, 0x86, + 0x48, 0x4a, 0x17, 0x92, 0xf2, 0x85, 0x41, 0x8a, + 0x90, 0x44, 0x33, 0x4c, 0x62, 0xc3, 0x32, 0x66, + 0xd0, 0x42, 0x35, 0x2c, 0x12, 0x1b, 0x96, 0x98, + 0x41, 0x0a, 0xdd, 0xb0, 0x60, 0x65, 0xea, 0x3d, + 0x97, 0x16, 0x8a, 0x8a, 0xd2, 0x40, 0x75, 0x98, + 0x54, 0x1c, 0x25, 0x25, 0x15, 0xc5, 0x8c, 0xc6, + 0xb4, 0x70, 0xd4, 0x94, 0x64, 0x03, 0x23, 0xdd, + 0x3e, 0x22, 0xc6, 0x1a, 0x0e, 0x31, 0x44, 0xf5, + 0x8b, 0x14, 0x98, 0x16, 0xcb, 0xa0, 0x85, 0xaa, + 0x80, 0x91, 0x0a, 0xd3, 0xc2, 0x31, 0xc9, 0xa8, + 0x12, 0x46, 0x6a, 0x4c, 0xcb, 0xff, 0xbc, 0xee, + 0xcb, 0x2e, 0xa6, 0xe5, 0xff, 0x5e, 0xf8, 0x0d, + 0x26, 0xa6, 0xcd, 0x4e, 0x08, 0x3b, 0xc9, 0x14, + 0x46, 0x32, 0x8f, 0xa3, 0x3f, 0xa6, 0x22, 0x99, + 0xc2, 0x48, 0xe6, 0x71, 0x34, 0xc8, 0x54, 0x24, + 0x53, 0x18, 0xc9, 0x3c, 0x8e, 0xb6, 0x92, 0x8a, + 0x64, 0x0a, 0x23, 0x99, 0xc7, 0xd1, 0x57, 0x52, + 0x91, 0x4c, 0x61, 0x24, 0xf3, 0x38, 0x1a, 0x4b, + 0x32, 0x92, 0x29, 0x8c, 0x64, 0x1e, 0x4b, 0x19, + 0x43, 0x45, 0x32, 0x03, 0x16, 0x32, 0x1e, 0x47, + 0x21, 0x43, 0x95, 0x32, 0x46, 0x83, 0x62, 0x38, + 0x4a, 0xff, 0xb2, 0xa1, 0x39, 0x7e, 0x9e, 0x60, + 0x7d, 0xec, 0x3c, 0xc1, 0xfa, 0x80, 0x40, 0xe1, + 0xb7, 0x99, 0x7b, 0xa7, 0xce, 0x13, 0xae, 0xfa, + 0x1f, 0xdf, 0x0c, 0xeb, 0x9c, 0x27, 0xa4, 0x6f, + 0xdf, 0x54, 0x1d, 0x27, 0xec, 0xde, 0xe3, 0xa8, + 0xb7, 0x04, 0x58, 0xbf, 0x72, 0x0e, 0x60, 0x01, + 0x6a, 0xbe, 0x9a, 0xb5, 0x71, 0xd2, 0x42, 0x5b, + 0x07, 0x3e, 0xcb, 0x46, 0xee, 0xe6, 0x4d, 0x04, + 0x82, 0x88, 0x5b, 0x68, 0xef, 0xc0, 0xe7, 0x58, + 0x73, 0xd3, 0xd7, 0x37, 0xa8, 0xc4, 0x58, 0x48, + 0x0c, 0xc7, 0xa2, 0x9b, 0x8a, 0x21, 0xca, 0x05, + 0xeb, 0x41, 0x62, 0x38, 0x56, 0xdd, 0x34, 0xb1, + 0x4f, 0x8e, 0x4c, 0x81, 0x42, 0xd1, 0xa9, 0x2b, + 0xcc, 0x47, 0xb6, 0x45, 0x44, 0xd4, 0x46, 0x59, + 0x81, 0xb4, 0xc7, 0xaf, 0x1d, 0xd6, 0x1b, 0x21, + 0x51, 0xa5, 0x44, 0x77, 0x21, 0x25, 0x3e, 0xc7, + 0xf2, 0x8b, 0xa1, 0xa0, 0x5a, 0x8e, 0xc1, 0xe4, + 0x70, 0x2c, 0xc0, 0x18, 0x0c, 0xaa, 0xe5, 0x58, + 0x4c, 0x0e, 0xc7, 0xce, 0x08, 0x86, 0x83, 0x6a, + 0x39, 0x1e, 0x26, 0x87, 0x63, 0x73, 0xa4, 0x0e, + 0x10, 0xea, 0xca, 0xc1, 0x28, 0xe0, 0x73, 0xec, + 0x8f, 0x60, 0x85, 0x4b, 0xa5, 0x1c, 0x03, 0xa2, + 0x80, 0x6d, 0x87, 0x84, 0x66, 0x74, 0x0c, 0x88, + 0x02, 0x8e, 0xa3, 0x1e, 0x42, 0x14, 0x18, 0x10, + 0x05, 0x1c, 0xc7, 0x3d, 0x84, 0x28, 0x30, 0x20, + 0x0a, 0x38, 0x4e, 0x7c, 0x08, 0x51, 0x60, 0x30, + 0x14, 0x44, 0x1c, 0x1b, 0x72, 0x84, 0x28, 0xb0, + 0x18, 0x0a, 0xa2, 0xe6, 0x5d, 0xcc, 0x93, 0xa0, + 0xc0, 0x62, 0x28, 0x88, 0x38, 0xfa, 0x1d, 0x42, + 0x14, 0x58, 0x0c, 0x05, 0x11, 0x5b, 0xc7, 0x43, + 0x34, 0xd9, 0x30, 0x14, 0x44, 0x1c, 0x3d, 0x0f, + 0x86, 0x82, 0xca, 0xa2, 0x00, 0x6a, 0xad, 0xf9, + 0x76, 0x80, 0x68, 0xc4, 0x40, 0xad, 0xb5, 0xc7, + 0x56, 0x7e, 0xd2, 0x88, 0x81, 0x5a, 0x6b, 0x8f, + 0xa3, 0xf8, 0xc4, 0xb2, 0xa6, 0x52, 0x0c, 0xd4, + 0x5a, 0x7b, 0x6c, 0xa5, 0x27, 0xcd, 0xc8, 0x40, + 0x7b, 0x66, 0x1e, 0x47, 0xe1, 0x89, 0x2d, 0x9e, + 0x95, 0xa5, 0x00, 0x06, 0x00, 0x8e, 0xb2, 0x93, + 0x0e, 0x00, 0x06, 0x03, 0x00, 0x5b, 0xd1, 0x49, + 0x23, 0x06, 0x03, 0x00, 0x47, 0xc9, 0x49, 0x07, + 0x00, 0x03, 0x01, 0xc0, 0x67, 0x2b, 0x38, 0x49, + 0x46, 0x46, 0x63, 0xe7, 0x73, 0xa2, 0xcd, 0xb1, + 0x02, 0x7f, 0xd2, 0x68, 0xec, 0x80, 0x4e, 0x70, + 0xec, 0xa9, 0xd1, 0x65, 0x8d, 0xb6, 0x98, 0x1a, + 0x8e, 0x8a, 0x86, 0x2e, 0x6d, 0xb4, 0x87, 0xa9, + 0xe1, 0x28, 0x69, 0x08, 0xf3, 0xc6, 0xc7, 0xd4, + 0x70, 0xd4, 0x34, 0x94, 0x2b, 0x27, 0xa6, 0x86, + 0xa3, 0xa8, 0xa1, 0xa3, 0x80, 0x01, 0x29, 0xc0, + 0x51, 0xd5, 0xd0, 0x51, 0xc0, 0x80, 0x14, 0xe0, + 0x28, 0x6b, 0xe8, 0x28, 0x60, 0x40, 0x0a, 0x70, + 0xd4, 0x35, 0x74, 0x14, 0x30, 0x20, 0x05, 0x38, + 0x0a, 0x1b, 0x3a, 0x0a, 0x58, 0x8c, 0x02, 0x92, + 0xa3, 0xb2, 0xa1, 0xa3, 0x80, 0xc5, 0x28, 0x20, + 0x39, 0x76, 0xd2, 0xe8, 0x28, 0x60, 0x31, 0x0a, + 0x48, 0xb6, 0x8d, 0x34, 0x9a, 0x99, 0x86, 0x51, + 0x40, 0x72, 0xec, 0xa3, 0xd1, 0x51, 0xc0, 0x62, + 0x14, 0x90, 0xcd, 0xb7, 0xd1, 0x82, 0x36, 0xbb, + 0x7d, 0xba, 0x8b, 0xbd, 0x23, 0x25, 0xdb, 0x9c, + 0x9d, 0xd3, 0xe4, 0xf7, 0x89, 0x13, 0x67, 0x50, + 0x0f, 0x47, 0xef, 0x82, 0x65, 0xf8, 0x89, 0x23, + 0x67, 0x50, 0x0f, 0x5b, 0xf7, 0x52, 0x3b, 0xc7, + 0x4f, 0x9c, 0x39, 0x83, 0x7a, 0x38, 0xfa, 0x17, + 0x2c, 0xcb, 0x4f, 0x1c, 0x3a, 0x83, 0x7a, 0xd8, + 0x3a, 0x18, 0x9a, 0xf1, 0x31, 0x28, 0x0f, 0x38, + 0x7a, 0x18, 0x42, 0x1e, 0x18, 0x94, 0x07, 0x1c, + 0x5d, 0x0c, 0x21, 0x0f, 0x0c, 0xca, 0x03, 0xb6, + 0x3e, 0x86, 0x68, 0xbe, 0xa1, 0x3c, 0xe0, 0xe8, + 0x64, 0x08, 0x79, 0x60, 0x50, 0x1e, 0xb0, 0xf5, + 0x32, 0x34, 0xe3, 0x63, 0x51, 0x1e, 0x70, 0x74, + 0x33, 0x84, 0x3c, 0xb0, 0x20, 0x0f, 0x14, 0x47, + 0x3f, 0x43, 0xc8, 0x03, 0x0b, 0xf2, 0x40, 0xb1, + 0x75, 0x34, 0x44, 0xf3, 0x0d, 0xe4, 0x81, 0xe2, + 0xe8, 0x69, 0x08, 0x79, 0x60, 0x41, 0x1e, 0x28, + 0xb6, 0xae, 0xe6, 0xf8, 0xf8, 0xa4, 0x17, 0x8f, + 0xfe, 0x7f, 0xdc, 0xf4, 0xc6, 0x1f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x7d, 0x68, 0xf2, 0x4a, 0x42, 0xa7, 0xf8, 0xd0, + 0xec, 0x01, 0x00, 0x00, 0x6c, 0x08, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x46, 0x47, 0x36, 0x36, + 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xd5, 0x96, + 0x5d, 0x6b, 0xdb, 0x30, 0x14, 0x86, 0xaf, 0x37, + 0xd8, 0x7f, 0x30, 0xbe, 0x5f, 0xe5, 0xef, 0x64, + 0xa0, 0x18, 0x12, 0xdb, 0x0d, 0x85, 0x64, 0x2b, + 0xa9, 0xcb, 0x7c, 0x27, 0x54, 0x5b, 0xa1, 0xc2, + 0x5f, 0xc1, 0x76, 0x42, 0xfa, 0xef, 0x27, 0x5b, + 0x56, 0xa6, 0xd2, 0xda, 0xcc, 0xac, 0x85, 0xf6, + 0x2a, 0x7a, 0x75, 0x1e, 0x1d, 0x9d, 0xbc, 0x39, + 0x3a, 0x04, 0x26, 0xe4, 0x44, 0x63, 0xf2, 0x9d, + 0x16, 0xfb, 0xb2, 0xca, 0x71, 0x43, 0xcb, 0x42, + 0x39, 0x91, 0xaa, 0x66, 0x9f, 0x0b, 0x55, 0xbf, + 0xd2, 0x54, 0xf7, 0xdb, 0xd7, 0x2f, 0x90, 0xe6, + 0x87, 0xb2, 0x6a, 0x94, 0x3d, 0xcd, 0xc8, 0x42, + 0x4d, 0xc8, 0x1e, 0x1f, 0xb3, 0xa6, 0xbe, 0x3a, + 0xe7, 0x99, 0x0a, 0x58, 0x9c, 0x11, 0x7d, 0x1a, + 0x85, 0x26, 0x0b, 0xf5, 0x7a, 0xed, 0x38, 0x86, + 0xa3, 0x2a, 0x15, 0xd9, 0x2f, 0x54, 0x9f, 0xc3, + 0x28, 0x3a, 0x19, 0x5d, 0xaa, 0x96, 0xac, 0xe3, + 0x8a, 0x1e, 0xda, 0x9b, 0xdc, 0xed, 0xdd, 0xad, + 0x65, 0x6a, 0xfc, 0x00, 0x04, 0x52, 0x84, 0xa3, + 0x34, 0xf1, 0xca, 0x84, 0xb4, 0x6b, 0x26, 0xfa, + 0xaa, 0x5c, 0xed, 0x3c, 0x37, 0x4c, 0x0b, 0x82, + 0x5e, 0xf7, 0xd1, 0xfa, 0xf8, 0x70, 0x01, 0x20, + 0xe8, 0xd5, 0x25, 0x11, 0x90, 0x32, 0xc1, 0x43, + 0x8d, 0xdd, 0xa0, 0x78, 0xc4, 0x45, 0x4c, 0x12, + 0x08, 0x98, 0xe2, 0xdb, 0x84, 0xe4, 0x6e, 0xb0, + 0x0d, 0x22, 0xb4, 0x59, 0xee, 0xd6, 0x01, 0xb2, + 0xa3, 0x08, 0x02, 0xb6, 0xc7, 0x83, 0x71, 0x56, + 0xc6, 0xe9, 0x0d, 0xf3, 0xa8, 0x95, 0x42, 0x7b, + 0x65, 0xd1, 0x54, 0x65, 0xe6, 0xae, 0x3d, 0x0f, + 0x05, 0x51, 0x18, 0xfc, 0xf4, 0x03, 0x1f, 0x02, + 0x39, 0xd4, 0xd2, 0x3c, 0x75, 0x48, 0x73, 0x56, + 0x10, 0xd7, 0x7f, 0x37, 0x14, 0x5a, 0x24, 0xe4, + 0xcc, 0x8c, 0xee, 0xdd, 0xda, 0x78, 0xfe, 0x4a, + 0x05, 0x43, 0x94, 0x21, 0x3c, 0x5d, 0x7a, 0xba, + 0x31, 0x8c, 0x99, 0x3d, 0xe6, 0xfd, 0xda, 0xde, + 0xa2, 0x91, 0x74, 0x76, 0xcf, 0xed, 0x42, 0x6f, + 0x18, 0x12, 0xbf, 0xe3, 0xfd, 0x9d, 0x77, 0x63, + 0x0e, 0x63, 0x33, 0x09, 0x1b, 0x29, 0x6d, 0x2e, + 0x61, 0xfa, 0x30, 0xf6, 0x43, 0xc2, 0xb4, 0x61, + 0x4c, 0x17, 0xb6, 0x85, 0xab, 0x19, 0x1a, 0xe3, + 0x0c, 0xc1, 0x2d, 0x4d, 0x64, 0x8c, 0x70, 0xa6, + 0xc4, 0xe9, 0x63, 0xd6, 0xe9, 0xd6, 0x85, 0xb4, + 0x47, 0x6f, 0x16, 0x1e, 0xff, 0xf6, 0x43, 0xb4, + 0x14, 0x1c, 0x04, 0x72, 0x43, 0xb4, 0xfa, 0x79, + 0x7b, 0xc1, 0x9c, 0xe4, 0x65, 0xf5, 0xb4, 0xc1, + 0x4f, 0xe5, 0xb1, 0x79, 0xfd, 0x19, 0x5d, 0x20, + 0xa5, 0xc0, 0x39, 0x7b, 0x93, 0x5b, 0x4c, 0x8b, + 0xee, 0x2a, 0xbe, 0x44, 0xd7, 0x19, 0xae, 0x1f, + 0x91, 0x6e, 0xcc, 0x53, 0x64, 0xa1, 0x15, 0x2e, + 0xd2, 0xba, 0xbd, 0xfc, 0xe5, 0xb9, 0x1d, 0xce, + 0xbb, 0x63, 0xdd, 0xca, 0x68, 0xd3, 0xa3, 0x79, + 0xfa, 0x3a, 0x7a, 0x5f, 0x3f, 0x08, 0x5a, 0x08, + 0x24, 0x97, 0x05, 0xfa, 0xef, 0x22, 0x17, 0xcf, + 0xb6, 0xd8, 0x0e, 0x9f, 0x0d, 0xcf, 0x06, 0x05, + 0xcf, 0xc2, 0x1f, 0xfe, 0xf8, 0x5c, 0xb0, 0x27, + 0xcd, 0x05, 0xfb, 0x3f, 0xe6, 0xc2, 0x5b, 0xb9, + 0xee, 0x58, 0xe9, 0xe7, 0x34, 0xdb, 0x9a, 0x38, + 0x84, 0x9d, 0x0f, 0x60, 0xf6, 0xc4, 0x16, 0xef, + 0x4c, 0xd7, 0xb5, 0xf4, 0xbd, 0x0c, 0x9c, 0xd6, + 0xad, 0xb3, 0x0f, 0x60, 0xe0, 0xbf, 0x75, 0xeb, + 0x34, 0xdf, 0x98, 0x78, 0xf1, 0xaf, 0x82, 0x05, + 0xfe, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, + 0x5e, 0x32, 0x91, 0xdd, 0x61, 0x04, 0x00, 0x00, + 0x64, 0x14, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x46, 0x52, 0x32, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0xed, 0x58, 0x5b, 0x8f, 0xd2, 0x40, 0x14, + 0x7e, 0xd6, 0xc4, 0xff, 0x40, 0xfa, 0xae, 0xed, + 0x14, 0xf0, 0x92, 0x14, 0x12, 0x28, 0xc5, 0x98, + 0x6c, 0x15, 0x59, 0x54, 0xde, 0x9a, 0xb1, 0x1d, + 0xb4, 0xa1, 0xa5, 0x4d, 0x5b, 0xd8, 0xae, 0xbf, + 0xde, 0x33, 0x97, 0x76, 0x7a, 0x5d, 0xc0, 0x88, + 0x4f, 0xf6, 0x41, 0x67, 0xce, 0xf9, 0xe6, 0xdc, + 0xe6, 0x5c, 0x86, 0x35, 0x3c, 0x72, 0xf2, 0x5d, + 0xf2, 0xd2, 0x3f, 0xec, 0xa2, 0x24, 0xc4, 0x99, + 0x1f, 0x1d, 0x06, 0x27, 0x92, 0xa4, 0xf0, 0xff, + 0x44, 0x41, 0xaf, 0x34, 0x65, 0xfa, 0xe2, 0xf9, + 0x33, 0xc3, 0x0f, 0xe3, 0x28, 0xc9, 0x06, 0x3b, + 0x3f, 0x20, 0x13, 0xc5, 0x23, 0x3b, 0x7c, 0x0c, + 0xb2, 0xf4, 0x55, 0x1e, 0x06, 0x8a, 0x0a, 0x7c, + 0x8a, 0x70, 0x83, 0xc8, 0xdd, 0x7f, 0x00, 0x21, + 0x03, 0xdf, 0x9b, 0x28, 0xcb, 0xb5, 0x8e, 0xf2, + 0x9c, 0x9d, 0x15, 0x2c, 0x33, 0x3a, 0x64, 0x49, + 0x14, 0x4c, 0xdf, 0x9b, 0xa6, 0x63, 0x6d, 0x37, + 0xd6, 0xc7, 0x85, 0xb5, 0x30, 0xd4, 0x2a, 0x8b, + 0x83, 0x09, 0x09, 0x37, 0x7e, 0x08, 0x06, 0xb4, + 0xe4, 0x48, 0xde, 0xc0, 0x3f, 0x78, 0x24, 0x9f, + 0x28, 0x9a, 0x32, 0x48, 0xc8, 0x6e, 0xa2, 0xac, + 0x3e, 0xad, 0x37, 0x8a, 0xda, 0x03, 0x1a, 0x09, + 0xd0, 0x6c, 0x61, 0x22, 0xad, 0x17, 0x35, 0x16, + 0xa8, 0xf5, 0xc6, 0xec, 0xc5, 0xbc, 0x13, 0x18, + 0xf2, 0xe5, 0xde, 0xfc, 0x30, 0xe3, 0xb2, 0x06, + 0x95, 0xaf, 0x75, 0x00, 0xe9, 0xe2, 0x84, 0xf9, + 0xc9, 0x5e, 0x39, 0x56, 0xaf, 0x60, 0x34, 0x14, + 0xb8, 0xcd, 0x7c, 0xe8, 0x68, 0xfd, 0xb0, 0xc2, + 0xc8, 0x6f, 0x8b, 0x8d, 0x33, 0x13, 0x30, 0x43, + 0x2d, 0x23, 0x06, 0x7b, 0xd8, 0x96, 0x17, 0xd1, + 0x77, 0x31, 0xc3, 0x3c, 0x67, 0x72, 0x1a, 0xb7, + 0x54, 0x8a, 0x69, 0xf3, 0xda, 0xa6, 0xbc, 0xa9, + 0x86, 0x62, 0xfe, 0x84, 0xc9, 0xa3, 0x8a, 0x67, + 0xe8, 0x52, 0x93, 0x43, 0x12, 0x46, 0xc9, 0x63, + 0x61, 0x6f, 0x9e, 0x3b, 0x6b, 0x1c, 0x0a, 0x39, + 0xb0, 0x72, 0x16, 0x3c, 0xff, 0x84, 0xdd, 0x69, + 0x86, 0x93, 0x6c, 0xaa, 0xe5, 0xba, 0xa6, 0x69, + 0x86, 0xca, 0x76, 0x82, 0xe1, 0xff, 0x22, 0x40, + 0x1f, 0x51, 0x32, 0x5d, 0x73, 0x5d, 0x5c, 0xb6, + 0xb8, 0x39, 0xfe, 0x6f, 0xa7, 0x3e, 0x67, 0x8c, + 0xf4, 0x3f, 0xd6, 0xa9, 0x77, 0xe9, 0xec, 0x73, + 0xce, 0xc6, 0xfe, 0x41, 0x68, 0xa2, 0x4b, 0x67, + 0x99, 0x80, 0xb7, 0xf4, 0x60, 0x81, 0x9d, 0xb9, + 0x2e, 0x49, 0x53, 0x11, 0xe1, 0xec, 0x31, 0x26, + 0x53, 0x0a, 0xb1, 0x2b, 0xbc, 0x39, 0x4e, 0x89, + 0xa1, 0x52, 0x96, 0x40, 0x3d, 0x24, 0x7e, 0x46, + 0x56, 0x49, 0x94, 0x11, 0x97, 0x56, 0x34, 0xa5, + 0x52, 0x32, 0xf6, 0xbc, 0x04, 0xe0, 0x60, 0x21, + 0x7a, 0x0d, 0x16, 0x8a, 0x6d, 0xc1, 0xfd, 0xee, + 0x67, 0x8c, 0x65, 0xa8, 0xb0, 0x2a, 0xa9, 0x21, + 0x4e, 0xf7, 0x40, 0xd5, 0xb4, 0xe5, 0xd2, 0x50, + 0xe9, 0xa6, 0x60, 0xc4, 0x0f, 0x1e, 0xd0, 0x67, + 0x63, 0xea, 0x2b, 0xac, 0x85, 0x66, 0xb5, 0xad, + 0x9a, 0x52, 0xab, 0x9e, 0x5c, 0x1a, 0x14, 0x67, + 0xb4, 0x17, 0x71, 0x91, 0xb4, 0xc6, 0x05, 0x2c, + 0x51, 0xf7, 0x05, 0x2c, 0xaf, 0xbd, 0x00, 0x47, + 0x3f, 0xaf, 0xeb, 0x6d, 0xb7, 0xae, 0xb7, 0xfd, + 0x09, 0x26, 0x73, 0xac, 0x47, 0x2b, 0x3a, 0xaf, + 0xd5, 0xfc, 0x7b, 0x69, 0x4d, 0xc5, 0xd3, 0xbc, + 0x3e, 0xab, 0xd3, 0xba, 0x2e, 0xad, 0x85, 0xc2, + 0xce, 0xe0, 0x6e, 0x82, 0x93, 0x50, 0x37, 0x8f, + 0xa2, 0xcc, 0x8c, 0x3c, 0xe2, 0x6c, 0x4f, 0xba, + 0x52, 0x8f, 0xe0, 0x35, 0xae, 0xcc, 0xd3, 0xc0, + 0xe1, 0x1e, 0xf0, 0xf5, 0x3a, 0x0a, 0x0b, 0x89, + 0x03, 0xf1, 0x95, 0x8e, 0xec, 0x76, 0xae, 0xf4, + 0x44, 0xf2, 0xdb, 0x31, 0x94, 0xbc, 0x7a, 0xcd, + 0xf1, 0x72, 0x03, 0x35, 0xa0, 0x85, 0x93, 0xde, + 0xaf, 0x45, 0xa1, 0xb5, 0x72, 0x9a, 0x9e, 0xae, + 0xa7, 0x9a, 0x98, 0xad, 0x65, 0xe3, 0x45, 0x88, + 0xf9, 0x4d, 0xe9, 0xa9, 0x9b, 0xf8, 0x31, 0xab, + 0x0f, 0xfb, 0x7e, 0x35, 0x1a, 0x6a, 0x9c, 0x6d, + 0xa8, 0x15, 0x0e, 0x87, 0xfa, 0x9e, 0x0d, 0x35, + 0xc7, 0xdd, 0x15, 0x4d, 0x88, 0xb9, 0xab, 0x16, + 0x6c, 0x08, 0x69, 0x51, 0xf5, 0x62, 0x6e, 0xd3, + 0x88, 0xea, 0x3b, 0x70, 0x8d, 0xee, 0x65, 0x09, + 0x56, 0xa0, 0x46, 0x9c, 0xe2, 0xe9, 0x9a, 0xfc, + 0x38, 0x06, 0x38, 0x31, 0x54, 0xd8, 0x70, 0x2a, + 0x2b, 0x7b, 0x5d, 0xab, 0xd4, 0xbf, 0x81, 0x13, + 0xf7, 0xa7, 0x4f, 0x4b, 0xf9, 0x98, 0x90, 0xa9, + 0x19, 0x1f, 0x41, 0xb5, 0xa1, 0x56, 0x89, 0xe5, + 0xf0, 0x98, 0x5a, 0xb6, 0xb5, 0x75, 0xee, 0xed, + 0xd9, 0xdd, 0x9d, 0x33, 0xde, 0x6e, 0x59, 0x93, + 0x67, 0x4c, 0x39, 0x81, 0xa8, 0x17, 0xc5, 0x08, + 0x2a, 0x1c, 0x38, 0x45, 0x41, 0x86, 0x7f, 0x10, + 0xca, 0xee, 0x75, 0x72, 0x47, 0x30, 0x55, 0x95, + 0xb6, 0x00, 0xac, 0x57, 0x16, 0xa8, 0x38, 0x7a, + 0x20, 0xc9, 0x3d, 0xc9, 0x32, 0xff, 0xf0, 0xa3, + 0xec, 0x96, 0x24, 0xcd, 0xc0, 0x4f, 0x9b, 0xf7, + 0x30, 0x68, 0x16, 0xe8, 0xad, 0xa1, 0x56, 0x88, + 0x75, 0x98, 0x90, 0xcc, 0x91, 0x34, 0x37, 0xea, + 0xf4, 0x3a, 0xd8, 0x3a, 0xe0, 0xef, 0x01, 0xb9, + 0x8b, 0xc3, 0x31, 0xc5, 0x4b, 0xb1, 0x92, 0xde, + 0x10, 0xee, 0xa7, 0x8d, 0x03, 0x92, 0xd1, 0x7d, + 0x62, 0xf8, 0x55, 0xd8, 0x3d, 0xd2, 0xe8, 0xa5, + 0xd4, 0xa8, 0x4d, 0x64, 0x61, 0x62, 0x89, 0x93, + 0xb4, 0x26, 0x54, 0x1a, 0x28, 0x45, 0xb7, 0x79, + 0xcd, 0x53, 0xd2, 0x4a, 0x79, 0xac, 0x8b, 0x29, + 0x92, 0xad, 0x7d, 0x19, 0xa2, 0xb0, 0xee, 0xf0, + 0x63, 0x74, 0xcc, 0x5a, 0x25, 0x51, 0x76, 0x8e, + 0x03, 0x0e, 0x89, 0xec, 0x15, 0xa2, 0xce, 0x65, + 0x2b, 0x51, 0x3b, 0xd1, 0x69, 0xd0, 0x6e, 0x08, + 0x5c, 0x6e, 0x4f, 0x9b, 0x86, 0xef, 0xcf, 0x0b, + 0x1d, 0x0e, 0xd7, 0xba, 0x94, 0xfc, 0x5a, 0x66, + 0x55, 0x1b, 0x95, 0xde, 0x6d, 0x3c, 0x14, 0x15, + 0x03, 0xb1, 0x55, 0xf1, 0xce, 0xe8, 0x86, 0x5a, + 0x84, 0x3f, 0x83, 0xd8, 0xea, 0x69, 0x68, 0xf9, + 0x62, 0x92, 0x2f, 0x9a, 0x6e, 0x60, 0xf9, 0xfa, + 0x68, 0x4c, 0xde, 0x6e, 0xf4, 0x8a, 0x40, 0x73, + 0xfa, 0x49, 0x12, 0x1c, 0xa0, 0xd7, 0xd0, 0x24, + 0xd8, 0xc1, 0x16, 0xd5, 0xe9, 0x28, 0x61, 0xb5, + 0x7a, 0xfb, 0xa2, 0xaa, 0x8f, 0x07, 0xf6, 0x42, + 0xb0, 0x71, 0xdc, 0x53, 0xd8, 0xc2, 0x82, 0x6f, + 0xf4, 0x45, 0x41, 0x09, 0x9f, 0x8f, 0xbe, 0xbb, + 0x07, 0xee, 0x94, 0x51, 0xe0, 0x01, 0xf4, 0x2d, + 0x4a, 0xbc, 0x94, 0xb5, 0xa4, 0x16, 0x46, 0xa8, + 0xad, 0x28, 0x91, 0x5a, 0x03, 0x92, 0x89, 0x3d, + 0x10, 0xc0, 0xec, 0x94, 0x2c, 0x39, 0x75, 0x6a, + 0xb1, 0xcd, 0x7a, 0x04, 0x4f, 0x5f, 0x43, 0xad, + 0x71, 0xe4, 0xbb, 0xaa, 0x24, 0x31, 0x9d, 0xa0, + 0x6a, 0xb9, 0x9e, 0xd9, 0x86, 0x5a, 0x65, 0x49, + 0xe5, 0x52, 0x17, 0xec, 0xf9, 0x38, 0xe8, 0x99, + 0x0d, 0xfc, 0xc7, 0xcc, 0x65, 0x83, 0x42, 0xab, + 0x0d, 0x8a, 0x73, 0x93, 0x00, 0xf5, 0x4e, 0x82, + 0x32, 0x6f, 0xab, 0xb7, 0x53, 0x33, 0xa3, 0x91, + 0xe0, 0x97, 0xe4, 0x8e, 0xbe, 0xaf, 0xfd, 0x32, + 0xaa, 0x5f, 0xfd, 0xd9, 0x40, 0x20, 0x84, 0x2e, + 0x0e, 0x04, 0x60, 0xaf, 0x0a, 0x04, 0xee, 0x0e, + 0x44, 0xdf, 0x94, 0x42, 0x74, 0x4a, 0xf5, 0x45, + 0xa9, 0xb4, 0xf7, 0xdf, 0x75, 0xb0, 0xd1, 0x8d, + 0x3a, 0xd8, 0xff, 0x96, 0x04, 0x79, 0xf9, 0xec, + 0x59, 0x5f, 0x66, 0xca, 0x7c, 0x38, 0x93, 0x8d, + 0x57, 0x96, 0xe5, 0xf7, 0xa7, 0xb2, 0xb1, 0x6a, + 0x5b, 0xcd, 0x80, 0xcb, 0x03, 0xa6, 0x17, 0x01, + 0x7b, 0xb2, 0x02, 0xe5, 0x23, 0xfb, 0x5a, 0x77, + 0xb5, 0x6b, 0xdc, 0x1d, 0xea, 0xda, 0x8d, 0xdd, + 0x45, 0x45, 0xdb, 0x91, 0xdf, 0xd9, 0xfc, 0xa3, + 0x3f, 0x86, 0x6e, 0x1a, 0x24, 0xed, 0xca, 0x20, + 0xa1, 0x1b, 0x07, 0x09, 0xfc, 0xbd, 0x5d, 0x94, + 0x5e, 0x3c, 0x87, 0x4d, 0xeb, 0xaf, 0x89, 0xc0, + 0xf8, 0x0d, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x55, 0x45, 0x2c, 0x4b, + 0x18, 0x9d, 0x33, 0x7f, 0xbe, 0x05, 0x00, 0x00, + 0xa9, 0x29, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x46, 0x52, 0x34, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0xed, 0x5a, 0x59, 0x8f, 0xd3, 0x30, 0x10, + 0x7e, 0x06, 0x89, 0xff, 0x10, 0xe5, 0x1d, 0x72, + 0xb5, 0xa5, 0x48, 0x6e, 0xa4, 0x6e, 0x0f, 0x84, + 0xd4, 0xc2, 0xd2, 0x2d, 0xb0, 0x6f, 0x51, 0x48, + 0xdc, 0x25, 0xda, 0xa4, 0x89, 0x92, 0xb4, 0x14, + 0x7e, 0x3d, 0xbe, 0x12, 0xe7, 0x6c, 0x93, 0x5e, + 0xec, 0x0a, 0xf2, 0x00, 0xf6, 0xcc, 0xe7, 0xb1, + 0x3d, 0xdf, 0x78, 0x3c, 0xde, 0x5d, 0x60, 0xc3, + 0xad, 0x63, 0xc1, 0xd7, 0xce, 0x7a, 0xe5, 0x87, + 0x9e, 0x19, 0x3b, 0xfe, 0x5a, 0xd8, 0xc2, 0x30, + 0x42, 0xff, 0x0f, 0x44, 0xe5, 0x8d, 0x2c, 0xea, + 0xaf, 0x5e, 0xbe, 0x00, 0x8e, 0x17, 0xf8, 0x61, + 0x2c, 0xac, 0x1c, 0x17, 0x0e, 0x44, 0x1b, 0xae, + 0xcc, 0x8d, 0x1b, 0x47, 0x6f, 0x76, 0x9e, 0x2b, + 0x4a, 0x48, 0x8f, 0x11, 0x10, 0x7a, 0x4b, 0xc7, + 0x83, 0xa1, 0xe0, 0xd8, 0x03, 0x71, 0x34, 0xbc, + 0x5d, 0x7e, 0xf8, 0x3a, 0x5c, 0x4e, 0x44, 0x1d, + 0xac, 0x4d, 0x0f, 0xea, 0x23, 0x33, 0x88, 0x9d, + 0xad, 0x19, 0x43, 0x20, 0x91, 0x3e, 0xd8, 0x9a, + 0xee, 0x06, 0xea, 0xf2, 0xee, 0xe6, 0x2d, 0x90, + 0x68, 0x1b, 0x48, 0x89, 0x09, 0x66, 0xd1, 0x72, + 0x7d, 0xeb, 0xf1, 0x03, 0x5a, 0x16, 0x31, 0x39, + 0x5d, 0x74, 0x76, 0x3b, 0xe3, 0xc6, 0x8c, 0x20, + 0x59, 0x11, 0x53, 0x8f, 0xfc, 0x75, 0x1c, 0xfa, + 0xae, 0xfe, 0x7e, 0x34, 0x32, 0x26, 0xf7, 0xcb, + 0xc9, 0xc7, 0xf1, 0x64, 0x0c, 0xa4, 0xac, 0x8a, + 0x82, 0x13, 0xd3, 0x51, 0xa5, 0xad, 0xec, 0xea, + 0xd7, 0x36, 0xdc, 0x0d, 0x44, 0x59, 0x14, 0x42, + 0xb8, 0x1a, 0x88, 0xb7, 0x9f, 0x16, 0x4b, 0x51, + 0xaa, 0x01, 0x75, 0x18, 0x68, 0x38, 0x1e, 0x29, + 0x72, 0x2d, 0xaa, 0xcb, 0x50, 0x8b, 0xe5, 0xa8, + 0x16, 0xf3, 0x96, 0x61, 0xe0, 0x97, 0xbb, 0xd1, + 0x87, 0x9b, 0x7a, 0x5b, 0xef, 0xb2, 0xb8, 0x61, + 0x3d, 0x4e, 0xd1, 0x18, 0x70, 0x39, 0xd4, 0x8c, + 0x3d, 0xb0, 0x4e, 0x06, 0xa6, 0xd4, 0xc3, 0x92, + 0x2d, 0x7c, 0x1b, 0x2f, 0x8d, 0x21, 0x83, 0x71, + 0xba, 0x22, 0xd4, 0x47, 0xdd, 0x94, 0x2e, 0x42, + 0x9f, 0x20, 0x08, 0x25, 0x02, 0xd5, 0xae, 0xaa, + 0x9e, 0x8d, 0x41, 0x6c, 0xac, 0x1d, 0x85, 0x42, + 0xe6, 0x2b, 0xef, 0x91, 0xa2, 0x79, 0xe4, 0x1e, + 0x1e, 0x72, 0x59, 0xfa, 0xf7, 0x4e, 0xdd, 0x7f, + 0x26, 0x71, 0x80, 0x17, 0x5f, 0x77, 0x94, 0x67, + 0x96, 0x4d, 0xcd, 0x95, 0x8f, 0x76, 0x6a, 0x11, + 0xeb, 0x9b, 0x1c, 0xd7, 0x84, 0xbd, 0xd9, 0x68, + 0x3c, 0x69, 0xb2, 0xae, 0xaa, 0x35, 0xa9, 0xbd, + 0xdd, 0x8e, 0x98, 0x39, 0x5f, 0xae, 0x69, 0xb9, + 0xfa, 0x4c, 0xec, 0x51, 0xe4, 0x01, 0xde, 0xf7, + 0x30, 0xa5, 0xa4, 0x84, 0xaa, 0x06, 0x3a, 0x26, + 0xf5, 0x40, 0x35, 0x03, 0xd4, 0x8c, 0x9b, 0xa6, + 0xce, 0xf3, 0xa0, 0xe7, 0x87, 0xbf, 0x52, 0x36, + 0xd1, 0x06, 0x17, 0xa6, 0xc7, 0x4c, 0xa1, 0x96, + 0x31, 0xa6, 0x57, 0x04, 0x73, 0x5f, 0x14, 0x9b, + 0x61, 0x8c, 0x92, 0xbd, 0x2a, 0xcb, 0x32, 0x90, + 0x48, 0x8f, 0x9a, 0xa5, 0x66, 0x2a, 0x6d, 0x2a, + 0xc8, 0xe6, 0xdc, 0x74, 0xd6, 0xcc, 0x28, 0x6e, + 0x1a, 0xd3, 0x10, 0x4d, 0x82, 0x47, 0x26, 0xe0, + 0xa1, 0x65, 0xc1, 0x28, 0xd2, 0x41, 0xfc, 0x2b, + 0x80, 0x3a, 0xd6, 0xce, 0x33, 0x62, 0xec, 0x72, + 0x20, 0x11, 0x15, 0xf8, 0x19, 0x3a, 0x31, 0xbc, + 0x0d, 0xfd, 0x18, 0x5a, 0xf8, 0x86, 0xd3, 0x81, + 0x69, 0xdb, 0x21, 0xc2, 0xa0, 0x45, 0x29, 0x3d, + 0xb4, 0xa6, 0xa4, 0x0b, 0xbe, 0x3b, 0x31, 0x11, + 0x02, 0x89, 0xb4, 0x80, 0x54, 0x1a, 0x29, 0x65, + 0xa7, 0x6e, 0xb4, 0x0d, 0xec, 0xb7, 0xe2, 0x36, + 0x0a, 0x9e, 0x51, 0xfa, 0xa9, 0x67, 0x98, 0xc2, + 0xf9, 0x0d, 0xb1, 0xc7, 0xb0, 0x18, 0xb7, 0xaf, + 0xb2, 0x6b, 0xf5, 0x4c, 0xbb, 0x56, 0x7b, 0x4f, + 0x83, 0x3c, 0xcf, 0x8c, 0x1e, 0x51, 0x5f, 0x96, + 0xa7, 0x53, 0x20, 0x91, 0x0e, 0x08, 0x7e, 0xda, + 0x48, 0x32, 0xec, 0x62, 0xbf, 0xa2, 0xf6, 0x79, + 0xb6, 0xfa, 0xfc, 0x08, 0xbe, 0x82, 0x67, 0x48, + 0xe8, 0xdf, 0x44, 0x2e, 0x73, 0x0c, 0x6a, 0x19, + 0x0b, 0xdf, 0x33, 0xee, 0xb7, 0xaa, 0x98, 0xf3, + 0x40, 0xe7, 0xa0, 0x07, 0xd0, 0x50, 0x34, 0x92, + 0x8a, 0xde, 0x2f, 0xe8, 0xde, 0x5b, 0x2e, 0x46, + 0xed, 0x35, 0x5b, 0x4c, 0xff, 0x6a, 0x8b, 0x99, + 0x39, 0xdf, 0xe9, 0xd4, 0xd4, 0x2c, 0xb2, 0x49, + 0x6d, 0x11, 0x19, 0xe5, 0x4b, 0xe9, 0x31, 0xba, + 0x78, 0x24, 0x11, 0x7f, 0x55, 0x47, 0x92, 0x26, + 0xe7, 0xd7, 0x1e, 0xc1, 0x07, 0x0f, 0xae, 0xe3, + 0x3b, 0x24, 0xa0, 0x67, 0x82, 0x0b, 0x92, 0x49, + 0xcc, 0xf5, 0x63, 0xa4, 0x23, 0x0d, 0x69, 0xb0, + 0x1d, 0x9b, 0x41, 0x00, 0x6d, 0x3d, 0x0e, 0x37, + 0x28, 0xc8, 0x68, 0xa7, 0xde, 0x15, 0xbe, 0x1f, + 0x5b, 0xbe, 0x0d, 0x53, 0x7f, 0xb4, 0xf3, 0xc6, + 0xcc, 0xfc, 0xe5, 0x6f, 0xe2, 0x4c, 0xb4, 0xe4, + 0xb2, 0x83, 0x80, 0xdf, 0x09, 0x03, 0x11, 0xcf, + 0x31, 0x42, 0x73, 0x10, 0xe2, 0x78, 0x97, 0x30, + 0x27, 0x55, 0xe0, 0x39, 0xc7, 0x3c, 0x02, 0x2b, + 0x81, 0xe9, 0x99, 0xcd, 0xa5, 0xe9, 0x4a, 0xe8, + 0x28, 0xd8, 0x10, 0x24, 0x69, 0x25, 0x57, 0x5b, + 0x25, 0x72, 0x02, 0xe9, 0x25, 0x48, 0x5a, 0x7b, + 0x91, 0xb7, 0x30, 0x74, 0x82, 0x1f, 0x30, 0x34, + 0x5d, 0xa5, 0x87, 0x38, 0x26, 0xa3, 0x4a, 0xd2, + 0xc4, 0x02, 0xdf, 0x2d, 0x90, 0xb2, 0xbe, 0xab, + 0x77, 0xa7, 0xda, 0x3b, 0xbf, 0x3b, 0xd5, 0x5e, + 0x53, 0x77, 0x22, 0xe4, 0x1e, 0x77, 0xa2, 0xc8, + 0xcf, 0x23, 0x91, 0xe0, 0x19, 0xfa, 0x1d, 0x49, + 0xd9, 0xdb, 0x39, 0x0d, 0x61, 0x4d, 0x23, 0x3e, + 0xc7, 0xf2, 0xc8, 0x42, 0x16, 0x49, 0xd6, 0x9c, + 0xdf, 0xdd, 0x76, 0x34, 0x99, 0xaa, 0x81, 0x94, + 0xd1, 0x50, 0xa8, 0x63, 0xcf, 0x51, 0xfa, 0xa5, + 0xcb, 0xc8, 0x4d, 0x9b, 0xa8, 0x31, 0x3f, 0xac, + 0x7a, 0x63, 0xef, 0x72, 0x9c, 0xa7, 0x94, 0x15, + 0x3a, 0xec, 0xac, 0xcf, 0xb4, 0xd1, 0xe6, 0x7b, + 0x22, 0x40, 0x3a, 0xde, 0x63, 0x15, 0x5d, 0xc6, + 0x12, 0x08, 0x22, 0x53, 0x5f, 0xc0, 0x87, 0x8d, + 0x6b, 0x86, 0x40, 0xc2, 0x1d, 0x9e, 0x74, 0x54, + 0x39, 0x9b, 0x74, 0xcc, 0xd0, 0xfa, 0xe1, 0xe0, + 0xfc, 0xbf, 0x09, 0xa1, 0x8e, 0x58, 0x40, 0x2b, + 0x03, 0x52, 0x56, 0x98, 0x96, 0xbc, 0xfa, 0x64, + 0x3e, 0xb9, 0x37, 0xee, 0xe6, 0xc3, 0xd9, 0xcc, + 0xe8, 0xde, 0xdf, 0x93, 0x0a, 0x92, 0x28, 0x79, + 0xa1, 0x4d, 0x36, 0xc9, 0xab, 0x7f, 0xb4, 0x45, + 0x81, 0x00, 0xb6, 0xbe, 0x1b, 0x9b, 0x0f, 0x10, + 0x43, 0x6a, 0xfd, 0xb0, 0x82, 0x26, 0x9e, 0x2e, + 0x2a, 0x01, 0xc8, 0x65, 0x9b, 0xa0, 0x02, 0xff, + 0x27, 0x0c, 0xef, 0x60, 0x1c, 0x3b, 0xeb, 0x87, + 0x88, 0xb9, 0x25, 0x86, 0x51, 0x8c, 0xf6, 0x3a, + 0xa7, 0x37, 0x9e, 0x22, 0xcb, 0x4a, 0x1f, 0x48, + 0x19, 0x61, 0x1e, 0xc6, 0x2c, 0x13, 0x24, 0x49, + 0xa8, 0x79, 0x79, 0x1e, 0x3c, 0x59, 0x9b, 0xdf, + 0x5d, 0x38, 0x0b, 0xbc, 0x2e, 0xc6, 0x73, 0xb3, + 0x5c, 0x5e, 0x30, 0xee, 0x44, 0x85, 0x01, 0x5c, + 0x51, 0x3d, 0x42, 0xfb, 0xca, 0xd6, 0xdd, 0x91, + 0x31, 0x31, 0x39, 0x69, 0x11, 0x99, 0x2c, 0x31, + 0xc5, 0x71, 0x59, 0x11, 0xca, 0x17, 0xc8, 0x4d, + 0x97, 0x75, 0xc5, 0x51, 0x7c, 0x95, 0x7c, 0x58, + 0x95, 0x92, 0x05, 0x5c, 0x89, 0x8c, 0x7c, 0xa6, + 0xc2, 0x4c, 0xe6, 0x32, 0x7f, 0xf1, 0xa8, 0xa6, + 0x05, 0x64, 0xee, 0x3d, 0xc0, 0xa0, 0xfc, 0x3e, + 0xb4, 0x3a, 0xf9, 0xfb, 0x30, 0x73, 0x23, 0x5a, + 0xb9, 0x1b, 0x31, 0x3d, 0xc4, 0x55, 0x93, 0x25, + 0xcf, 0x97, 0xdc, 0x7b, 0xa6, 0x60, 0xaf, 0x5f, + 0x6f, 0xae, 0x90, 0x20, 0x58, 0xcc, 0x6e, 0xd6, + 0xa4, 0x70, 0x9a, 0x9b, 0x41, 0x4d, 0xd8, 0x32, + 0x43, 0xdf, 0x70, 0xa1, 0x85, 0x05, 0x9f, 0x37, + 0x8e, 0xf5, 0x88, 0xb4, 0x3a, 0x91, 0xa0, 0xaa, + 0xef, 0x9b, 0x1f, 0xda, 0x11, 0x39, 0x74, 0x25, + 0x0c, 0x9b, 0x36, 0x33, 0x09, 0x9f, 0xd5, 0x85, + 0x31, 0xeb, 0xe3, 0xc3, 0x19, 0xa2, 0x8a, 0x71, + 0x4a, 0xa5, 0xfa, 0x04, 0x77, 0xa8, 0x3b, 0x81, + 0x94, 0xd5, 0x50, 0x30, 0xa9, 0x28, 0x53, 0x11, + 0x99, 0x13, 0x4d, 0x35, 0x5d, 0x0c, 0xe7, 0x40, + 0xca, 0xaa, 0xf8, 0xe4, 0x7c, 0x2e, 0xd4, 0xa7, + 0xf9, 0x50, 0xcf, 0x26, 0x47, 0xbc, 0xf3, 0x66, + 0xd9, 0x51, 0xcd, 0x65, 0xc7, 0x43, 0xe9, 0x4f, + 0x39, 0x21, 0xfd, 0x5d, 0x22, 0x0c, 0x61, 0xa1, + 0x2c, 0xcb, 0x96, 0xf8, 0xe7, 0x0d, 0xc3, 0x4e, + 0xab, 0x30, 0x3c, 0x91, 0x14, 0xa5, 0x15, 0x29, + 0xea, 0x13, 0x23, 0x65, 0x55, 0x4b, 0x8a, 0x72, + 0x66, 0x52, 0xd4, 0x33, 0x90, 0x92, 0x94, 0x6e, + 0x88, 0x93, 0x86, 0x04, 0x61, 0x6c, 0x0b, 0x82, + 0x54, 0xcd, 0x3a, 0x81, 0xa0, 0xdc, 0x3d, 0x9e, + 0x16, 0x99, 0x52, 0x99, 0x3d, 0xae, 0x6f, 0xc2, + 0x9e, 0xda, 0xfb, 0xfb, 0x99, 0x5d, 0x91, 0xcf, + 0x40, 0x5f, 0xba, 0x9f, 0xfd, 0x94, 0x75, 0x5b, + 0x52, 0x66, 0x9f, 0x40, 0xd9, 0xf3, 0x66, 0xa5, + 0xdd, 0x7d, 0x7b, 0x12, 0x29, 0xbd, 0x56, 0xb7, + 0x8f, 0xaa, 0xc1, 0x27, 0x46, 0xca, 0xf5, 0x6e, + 0x9f, 0x2b, 0x92, 0xd2, 0x6d, 0x49, 0xca, 0xea, + 0x9f, 0x25, 0xe5, 0x8c, 0x25, 0xc1, 0x21, 0x52, + 0x3a, 0xed, 0xd2, 0x57, 0xe7, 0x94, 0x67, 0xea, + 0x25, 0x48, 0xb9, 0x5e, 0xfa, 0x3a, 0xfe, 0x52, + 0x11, 0xd0, 0x47, 0xff, 0x4d, 0xc8, 0xe1, 0xbf, + 0xf3, 0x14, 0x9b, 0x12, 0xd5, 0x55, 0xdb, 0x9c, + 0x1e, 0x4d, 0x39, 0x9a, 0x28, 0x81, 0x7d, 0xa5, + 0x02, 0x81, 0xff, 0x8e, 0x16, 0x3f, 0xf5, 0x2f, + 0xc6, 0xe8, 0x44, 0xab, 0x2d, 0xf2, 0xc6, 0xb5, + 0x0c, 0x08, 0x99, 0xaf, 0xd1, 0x4f, 0xb2, 0x8a, + 0xa6, 0x4f, 0x8f, 0x15, 0xa1, 0xf0, 0x9d, 0x9c, + 0x61, 0x6b, 0xc3, 0xa6, 0x43, 0xc2, 0x86, 0x73, + 0xb2, 0xf7, 0x7c, 0xb7, 0x0c, 0x9b, 0xa3, 0xdf, + 0x61, 0xff, 0xc3, 0xe6, 0x89, 0x84, 0x4d, 0xd5, + 0x1b, 0x44, 0x6e, 0xf1, 0x06, 0x91, 0xdb, 0xdd, + 0x08, 0x6f, 0xbb, 0xc7, 0x46, 0x4c, 0xcd, 0xcf, + 0x12, 0x59, 0xa8, 0x5c, 0xee, 0x15, 0x79, 0xbd, + 0x2b, 0xe3, 0x04, 0x0e, 0x4b, 0xf7, 0xb8, 0x7c, + 0x80, 0xb5, 0x76, 0xc5, 0xd5, 0xdb, 0xfe, 0x09, + 0xac, 0x5d, 0x82, 0x94, 0x67, 0x50, 0x5c, 0xd5, + 0x5f, 0xe3, 0x4a, 0xf3, 0x7c, 0xdc, 0x55, 0xda, + 0xf0, 0xa4, 0x29, 0xa3, 0x63, 0x79, 0xfa, 0x9f, + 0x8f, 0x8f, 0x0b, 0x95, 0xb3, 0xe7, 0x63, 0xd4, + 0x2c, 0xfd, 0x49, 0x26, 0x12, 0xff, 0x01, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xd6, 0x2f, 0xa2, + 0x38, 0x99, 0x03, 0x00, 0x00, 0x05, 0x20, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x52, 0x35, + 0x37, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xd5, + 0x99, 0x5d, 0x6f, 0xda, 0x30, 0x14, 0x86, 0xaf, + 0x37, 0x69, 0xff, 0x21, 0xca, 0xfd, 0x9a, 0x38, + 0x81, 0x86, 0x4a, 0x21, 0x12, 0x0d, 0x74, 0xaa, + 0x44, 0xb6, 0x0a, 0x98, 0xc6, 0x5d, 0xe4, 0x06, + 0xd3, 0x5a, 0xcd, 0x07, 0x4a, 0x02, 0xa2, 0xfb, + 0xf5, 0xb3, 0x1d, 0x13, 0xc2, 0x20, 0x59, 0xad, + 0xda, 0xd2, 0xca, 0x0d, 0xb6, 0xcf, 0xeb, 0x93, + 0xe3, 0xc7, 0xc7, 0x27, 0x16, 0xb8, 0x2b, 0xb4, + 0xc3, 0x11, 0xfa, 0x8a, 0xd3, 0x75, 0x96, 0x27, + 0xb0, 0xc4, 0x59, 0xaa, 0xed, 0x50, 0x5e, 0x90, + 0xef, 0xa1, 0x0e, 0xae, 0x4c, 0xdd, 0xfb, 0xf2, + 0xf9, 0x93, 0x8b, 0x93, 0x4d, 0x96, 0x97, 0xda, + 0x1a, 0xc7, 0x68, 0xa8, 0xaf, 0xd0, 0x1a, 0x6e, + 0xe3, 0xb2, 0xb8, 0xda, 0x27, 0xb1, 0x6e, 0x10, + 0x3b, 0x55, 0x44, 0x71, 0x16, 0xbd, 0xdc, 0x13, + 0x27, 0x1a, 0x5e, 0x0d, 0xf5, 0xbb, 0x59, 0xdf, + 0xd9, 0xef, 0xc3, 0x79, 0x02, 0xe3, 0x98, 0x79, + 0xe0, 0x02, 0x3f, 0x4b, 0xcb, 0x3c, 0x8b, 0xbd, + 0x6f, 0xbe, 0x1f, 0x4e, 0x96, 0x8b, 0xc9, 0xf7, + 0xf1, 0x64, 0xec, 0x1a, 0x4d, 0x53, 0x25, 0x46, + 0x28, 0x59, 0xe0, 0x84, 0x84, 0x71, 0xee, 0xad, + 0xc5, 0xff, 0x71, 0x8e, 0x86, 0xd3, 0x15, 0xda, + 0x0f, 0x75, 0x5b, 0xd7, 0x72, 0xb4, 0x1e, 0xea, + 0xfe, 0x8f, 0xe0, 0x21, 0x1c, 0xeb, 0x46, 0x8b, + 0xac, 0xcf, 0x65, 0xb3, 0x85, 0xdf, 0xaa, 0x71, + 0xb8, 0x06, 0xfd, 0x9c, 0xfb, 0xf7, 0xb7, 0x66, + 0xab, 0xee, 0xa6, 0xa9, 0x1b, 0xb5, 0xeb, 0x80, + 0xc9, 0x85, 0x8b, 0x5b, 0x3b, 0xec, 0x90, 0xd9, + 0x07, 0xd9, 0xa8, 0x53, 0xd6, 0x6b, 0xc8, 0x40, + 0xbb, 0xec, 0xb0, 0xd2, 0x5f, 0xe3, 0x45, 0x38, + 0xe2, 0x32, 0xd7, 0xa8, 0x51, 0x93, 0x3e, 0xe9, + 0xd6, 0xfb, 0xf8, 0xcf, 0x7d, 0x0d, 0x47, 0xab, + 0x48, 0xee, 0xde, 0x52, 0x8f, 0x2c, 0xc6, 0xb7, + 0x6d, 0xf0, 0x61, 0xd9, 0xa3, 0xb1, 0x0f, 0xcc, + 0xdb, 0x77, 0x2d, 0x68, 0x0a, 0xf3, 0x27, 0x24, + 0x6d, 0x31, 0xcc, 0x9b, 0xc0, 0x42, 0x06, 0x27, + 0x69, 0xd3, 0xb1, 0x83, 0xa0, 0x91, 0x36, 0x1d, + 0x32, 0xab, 0x21, 0xb3, 0xde, 0xcf, 0x45, 0xea, + 0x46, 0xd7, 0x1e, 0x59, 0x8c, 0xa7, 0xc3, 0xf2, + 0x36, 0x5a, 0xa3, 0x1f, 0x32, 0xca, 0xab, 0x5b, + 0x23, 0x00, 0xbe, 0x10, 0xbc, 0x0a, 0x60, 0xf1, + 0x52, 0xb9, 0x1d, 0x57, 0xf5, 0x2c, 0x5c, 0xee, + 0x6a, 0x58, 0x9b, 0x02, 0x7a, 0x33, 0xf4, 0xb4, + 0x8d, 0x61, 0xee, 0x1a, 0xa4, 0x53, 0x8d, 0x3e, + 0xe2, 0xb2, 0xf0, 0x2c, 0xd3, 0x35, 0x68, 0xa3, + 0x1a, 0x82, 0x79, 0xf4, 0x8c, 0x4b, 0x14, 0x95, + 0xdb, 0x1c, 0x79, 0xfe, 0x66, 0x4b, 0x7c, 0xb8, + 0x46, 0x73, 0xb0, 0x46, 0xe1, 0x4d, 0x82, 0xc9, + 0x32, 0x9c, 0x07, 0xa3, 0xe9, 0x34, 0xec, 0x2f, + 0x97, 0x2c, 0xfc, 0xca, 0x58, 0x07, 0x4e, 0xc3, + 0x39, 0x07, 0x75, 0x88, 0x69, 0x97, 0xc5, 0x25, + 0x7c, 0x42, 0x54, 0xd8, 0x1a, 0xf7, 0x1a, 0x41, + 0xfa, 0xd0, 0xe2, 0x4c, 0x10, 0xde, 0xe5, 0x30, + 0x39, 0xa8, 0x12, 0x94, 0x64, 0xf9, 0xeb, 0x14, + 0xbe, 0x66, 0xdb, 0xf2, 0x6f, 0x34, 0xb5, 0x59, + 0x4b, 0x61, 0x42, 0x8a, 0xfd, 0x6d, 0x96, 0x95, + 0x7e, 0xb6, 0xaa, 0xd2, 0xf9, 0xd8, 0xad, 0x1f, + 0x7a, 0x3e, 0xa1, 0x88, 0x99, 0x96, 0xb5, 0xc2, + 0x59, 0x96, 0xb4, 0x4b, 0x09, 0x2f, 0x26, 0x65, + 0xad, 0x90, 0x47, 0x7b, 0x59, 0x3a, 0x41, 0x09, + 0x93, 0xb2, 0x56, 0xb7, 0x94, 0x02, 0x62, 0xda, + 0xaa, 0x59, 0xaf, 0xfe, 0xb2, 0xfa, 0x01, 0xe5, + 0x78, 0xf3, 0x8c, 0x72, 0x18, 0x83, 0x6b, 0xb2, + 0xad, 0x6c, 0xe2, 0xd9, 0x28, 0xf5, 0xc1, 0x0b, + 0xb0, 0xd6, 0xf8, 0x9c, 0x7a, 0x5a, 0xe0, 0xf4, + 0x75, 0x06, 0xab, 0x30, 0xeb, 0x1e, 0x9d, 0xd9, + 0x39, 0xef, 0xec, 0x59, 0xa0, 0x23, 0x04, 0x70, + 0x79, 0x0d, 0x87, 0xa7, 0xb2, 0x56, 0x25, 0x7c, + 0xa9, 0x4f, 0x49, 0x73, 0xb3, 0x79, 0x92, 0x6c, + 0xd3, 0x88, 0xbe, 0xe7, 0x03, 0xb8, 0x69, 0xcb, + 0x93, 0xa3, 0x30, 0x46, 0x65, 0xad, 0x23, 0xf6, + 0xbb, 0xd9, 0x28, 0x60, 0x66, 0xe2, 0xb9, 0x3a, + 0x5b, 0xa4, 0x7d, 0x3c, 0x68, 0x54, 0x77, 0x92, + 0x4e, 0xd4, 0x50, 0x44, 0x64, 0x25, 0xf4, 0x81, + 0x5e, 0x30, 0x7f, 0xe8, 0xd9, 0x26, 0x35, 0x5b, + 0x80, 0xcc, 0x3f, 0x5a, 0x0e, 0x87, 0x92, 0xa6, + 0x16, 0x5f, 0x21, 0xbf, 0x84, 0x78, 0xe6, 0x7e, + 0x60, 0x3a, 0x8e, 0x6b, 0xf0, 0x3e, 0xb7, 0x16, + 0xdb, 0xc7, 0x5a, 0xe0, 0x1a, 0xc7, 0x1e, 0x5f, + 0x74, 0xe5, 0x49, 0xe8, 0x78, 0x35, 0x39, 0x51, + 0x65, 0xe7, 0xa9, 0x08, 0x20, 0x4e, 0x19, 0xf2, + 0xaa, 0xc9, 0xa8, 0x31, 0x21, 0x8b, 0xad, 0x84, + 0x79, 0x49, 0xe2, 0x5e, 0x9b, 0x26, 0x89, 0x8d, + 0xf5, 0x6a, 0x13, 0xfe, 0x8d, 0x88, 0x05, 0x30, + 0x0b, 0xed, 0x50, 0xc3, 0x71, 0x97, 0x2e, 0x6c, + 0x99, 0x04, 0xd4, 0x7d, 0x21, 0xd4, 0x83, 0x0f, + 0x80, 0x3a, 0x1c, 0x90, 0xfc, 0x56, 0x03, 0xcb, + 0x11, 0x82, 0x75, 0xa3, 0x06, 0x96, 0x3c, 0x50, + 0xa0, 0xaf, 0x8c, 0xd4, 0x40, 0x88, 0x14, 0x94, + 0x4e, 0x8a, 0x5d, 0xa9, 0xe4, 0xa6, 0x95, 0x42, + 0x5a, 0x37, 0x42, 0xb4, 0x1e, 0xa5, 0xd3, 0x52, + 0x70, 0x08, 0xd5, 0xd1, 0xb2, 0x4d, 0x21, 0x5a, + 0x91, 0x74, 0x5a, 0x0a, 0x72, 0xab, 0xa7, 0x0c, + 0x96, 0xd8, 0xab, 0x14, 0x49, 0x87, 0xa5, 0x20, + 0xb5, 0xd4, 0xc1, 0xb2, 0x85, 0x60, 0xad, 0xd5, + 0xc0, 0x92, 0x07, 0x4a, 0xd9, 0x8b, 0xd0, 0xee, + 0x09, 0x80, 0x22, 0xf7, 0x19, 0xe9, 0xa0, 0x14, + 0x1c, 0x41, 0x75, 0xb0, 0x44, 0x6e, 0x0d, 0xc0, + 0x04, 0xd2, 0x61, 0x49, 0xce, 0x2a, 0x85, 0x95, + 0x5d, 0xe4, 0xd6, 0x00, 0x4c, 0x4b, 0x3a, 0x29, + 0x05, 0x69, 0xa5, 0x90, 0x96, 0xc8, 0xad, 0x01, + 0x98, 0xb6, 0x74, 0x5a, 0x0a, 0x4a, 0xbb, 0x3a, + 0x5a, 0x96, 0xc8, 0xad, 0x01, 0x38, 0x1f, 0xa2, + 0x64, 0x29, 0x7b, 0x11, 0x5a, 0x96, 0x10, 0x2c, + 0xf9, 0x25, 0x8b, 0xc1, 0x92, 0x07, 0x4a, 0x59, + 0x6d, 0xb7, 0x44, 0x6e, 0x0c, 0xc0, 0x91, 0x5f, + 0xb1, 0x24, 0xd7, 0x76, 0x75, 0xa0, 0x84, 0x6e, + 0x0c, 0x8e, 0xfc, 0x62, 0xa5, 0xe0, 0xf8, 0xa9, + 0x83, 0x75, 0x2d, 0x04, 0xab, 0xa7, 0x06, 0x96, + 0x3c, 0x50, 0xea, 0xaa, 0xba, 0x2d, 0x56, 0xa8, + 0xfa, 0xff, 0x3b, 0x29, 0x65, 0x29, 0x65, 0x8b, + 0xfc, 0xce, 0x07, 0x9c, 0x6b, 0xe9, 0xa0, 0x14, + 0x5c, 0x16, 0xd4, 0xc1, 0x12, 0x3b, 0x7f, 0xf2, + 0x7f, 0x7f, 0x96, 0x9c, 0x55, 0x6f, 0x3c, 0x7f, + 0xa4, 0x79, 0xf6, 0x77, 0x3f, 0x19, 0xfe, 0x03, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x67, 0x65, 0x43, 0x50, 0xbe, 0x6f, + 0x16, 0x2d, 0xc4, 0x0b, 0x00, 0x00, 0xb7, 0x8e, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x52, + 0x36, 0x39, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, + 0xed, 0x5d, 0x5b, 0x6f, 0xd3, 0x30, 0x14, 0x7e, + 0x1e, 0x12, 0xff, 0xa1, 0xda, 0x3b, 0x34, 0x71, + 0x2e, 0x6d, 0xa4, 0x52, 0xa9, 0x2b, 0x1d, 0x42, + 0x5a, 0x61, 0x82, 0x21, 0x78, 0x8b, 0xd2, 0xd6, + 0x83, 0x68, 0x6d, 0x53, 0xa5, 0x29, 0x14, 0x7e, + 0x3d, 0x76, 0x9c, 0x6b, 0x73, 0xf3, 0x2d, 0x6d, + 0x19, 0x9d, 0x10, 0x24, 0xf6, 0xb1, 0x7d, 0xbe, + 0x73, 0xbe, 0xe3, 0x5b, 0xec, 0x31, 0x58, 0xc0, + 0x9f, 0xee, 0x1c, 0xbe, 0x72, 0xd7, 0x8f, 0x9e, + 0xbf, 0x72, 0x02, 0xd7, 0x5b, 0x77, 0x7e, 0x42, + 0x7f, 0x8b, 0xfe, 0x7d, 0x73, 0xad, 0xbe, 0x56, + 0xae, 0x87, 0x2f, 0x5f, 0x5c, 0x0d, 0xdc, 0xd5, + 0xc6, 0xf3, 0x83, 0xce, 0xa3, 0xbb, 0x84, 0x6f, + 0xae, 0x17, 0xf0, 0xd1, 0xd9, 0x2d, 0x83, 0xed, + 0xeb, 0xfd, 0x6a, 0x79, 0xdd, 0x45, 0xf9, 0x58, + 0x02, 0xc2, 0xd5, 0x83, 0xbb, 0x42, 0x05, 0x3b, + 0xee, 0xe2, 0xcd, 0xf5, 0xed, 0x27, 0x73, 0xbf, + 0xdf, 0x87, 0x65, 0xd3, 0xac, 0x8e, 0xbb, 0x5e, + 0xc0, 0xfd, 0x9b, 0x6b, 0xed, 0xba, 0xe3, 0xc3, + 0xc7, 0x37, 0xd7, 0xe3, 0x8f, 0xd3, 0x7b, 0x7b, + 0x82, 0x6a, 0x28, 0x95, 0xd2, 0x23, 0xa9, 0xd1, + 0xdb, 0xb1, 0x0a, 0x6e, 0xaa, 0xa4, 0x8c, 0x48, + 0xea, 0xd3, 0xc3, 0xb8, 0x4a, 0xa4, 0x17, 0x89, + 0xc0, 0x2f, 0x9f, 0xc7, 0xef, 0x6f, 0x94, 0x2a, + 0xb1, 0x7e, 0x56, 0x6c, 0xa4, 0x56, 0x89, 0x59, + 0x39, 0xb1, 0xca, 0xda, 0x54, 0x25, 0x92, 0x7b, + 0xb8, 0xe9, 0xd9, 0xd5, 0x52, 0x6a, 0x2c, 0x35, + 0x02, 0xb6, 0x66, 0xdf, 0x54, 0xca, 0x81, 0x8c, + 0x1c, 0xa8, 0x91, 0xd3, 0x12, 0x39, 0xcd, 0x56, + 0x2b, 0xa5, 0xf4, 0x54, 0xaa, 0x46, 0xb7, 0xd8, + 0xb4, 0x5f, 0xdf, 0x3e, 0xd8, 0x23, 0x22, 0x35, + 0xe8, 0x26, 0x6e, 0x0e, 0xdd, 0xde, 0x41, 0x3f, + 0x05, 0xcf, 0x1b, 0x96, 0xa5, 0x63, 0xcf, 0x77, + 0xa2, 0x9f, 0x42, 0xcd, 0xb1, 0x69, 0xee, 0x3f, + 0x7e, 0x7a, 0x40, 0xf5, 0xd6, 0x48, 0xaa, 0x54, + 0x1c, 0x00, 0x54, 0x7c, 0xd2, 0x9a, 0x99, 0xa2, + 0xd3, 0x31, 0xc5, 0xc8, 0x89, 0x55, 0x9a, 0xd9, + 0xcc, 0x13, 0xaa, 0x1e, 0x69, 0x2f, 0x27, 0x0c, + 0xea, 0x85, 0xfb, 0x74, 0x1c, 0xb4, 0xa8, 0x28, + 0xa8, 0x50, 0x91, 0x41, 0xa5, 0x22, 0x16, 0x3b, + 0x4d, 0x43, 0xda, 0x53, 0x10, 0x55, 0xb7, 0x01, + 0x03, 0x51, 0xab, 0x09, 0x95, 0x77, 0x8a, 0xd6, + 0x20, 0x9d, 0xef, 0x3a, 0x40, 0x83, 0x74, 0x3f, + 0x27, 0xdd, 0x54, 0x77, 0xec, 0x9d, 0xd1, 0xe4, + 0xb3, 0x0a, 0xfa, 0x85, 0xf8, 0x8a, 0xca, 0x56, + 0xc4, 0x98, 0xa9, 0xe8, 0xbd, 0x4b, 0x8c, 0x5d, + 0x62, 0xec, 0x19, 0xc4, 0x58, 0x26, 0x0e, 0x80, + 0x61, 0x96, 0xc5, 0x41, 0x32, 0xd2, 0xcc, 0x97, + 0xde, 0xfc, 0xe9, 0x3d, 0x9a, 0xa8, 0x64, 0xa3, + 0x20, 0x54, 0x98, 0x64, 0x8d, 0xbd, 0x75, 0xe0, + 0x7b, 0xcb, 0xe1, 0xbb, 0xf1, 0xd8, 0x9e, 0x7c, + 0x7b, 0x98, 0x7c, 0x78, 0x3b, 0x79, 0x3b, 0xe8, + 0x66, 0xb3, 0xf2, 0xe8, 0xb6, 0xb8, 0xe5, 0xb8, + 0xa2, 0xb8, 0xe5, 0xa4, 0x91, 0x61, 0xb1, 0xdd, + 0xcc, 0x08, 0x27, 0xa5, 0x5d, 0x5c, 0x51, 0x79, + 0xbb, 0x57, 0x69, 0xa3, 0x99, 0x09, 0x95, 0x94, + 0x46, 0x71, 0x45, 0x74, 0x8d, 0x7e, 0xf0, 0xec, + 0xbb, 0xf9, 0xe2, 0x3a, 0x57, 0xf0, 0xb0, 0xd2, + 0x54, 0x39, 0xfb, 0xce, 0xf1, 0xbf, 0xc3, 0x12, + 0xe9, 0xab, 0xe6, 0xde, 0xa9, 0x4c, 0xc8, 0x2c, + 0xeb, 0x02, 0x9a, 0xe2, 0x46, 0xa9, 0x16, 0x03, + 0xc5, 0xf0, 0x6a, 0x88, 0x9b, 0x34, 0xbe, 0xea, + 0x03, 0xc7, 0xb0, 0x35, 0x22, 0x96, 0x25, 0x2e, + 0x8d, 0x81, 0x1b, 0xad, 0x1b, 0xe7, 0xa5, 0xe6, + 0xad, 0xd2, 0x26, 0xaa, 0xe7, 0x6e, 0xfc, 0x76, + 0x4c, 0xab, 0xcb, 0x0a, 0xae, 0x3c, 0xff, 0x77, + 0xd6, 0x83, 0x53, 0xc7, 0x5d, 0xdb, 0x1a, 0x78, + 0x8a, 0xf4, 0x08, 0x7e, 0x6f, 0xe0, 0xf0, 0x93, + 0xb3, 0x1a, 0x74, 0xf1, 0x13, 0x49, 0x9b, 0xb9, + 0xc1, 0x76, 0xa8, 0x9a, 0x83, 0x2e, 0x7e, 0x20, + 0x49, 0xdb, 0xc0, 0xf1, 0x83, 0xa1, 0xb2, 0xef, + 0x2b, 0x8a, 0x32, 0xe8, 0x86, 0x6f, 0x51, 0x86, + 0xfb, 0x07, 0x26, 0xe9, 0xf8, 0x25, 0x4a, 0x86, + 0xdf, 0x57, 0x70, 0x1d, 0x7c, 0x26, 0xb9, 0x2a, + 0xca, 0x4a, 0x12, 0xe2, 0x46, 0x9c, 0xf5, 0xd3, + 0x76, 0x88, 0x72, 0xc2, 0x07, 0x92, 0xb6, 0x72, + 0x36, 0x1b, 0xb8, 0x18, 0x06, 0xfe, 0x0e, 0x0e, + 0xba, 0xe4, 0x05, 0x67, 0xc4, 0x30, 0x46, 0xf3, + 0x39, 0xdc, 0x6e, 0x87, 0x44, 0xe7, 0x5b, 0xdf, + 0x59, 0x4d, 0x33, 0xc9, 0xb7, 0x9f, 0xf6, 0x56, + 0x04, 0x62, 0xb0, 0xda, 0xec, 0xa2, 0x4a, 0xf0, + 0x13, 0xfa, 0x3b, 0x95, 0x0b, 0x5b, 0x8a, 0x53, + 0xd2, 0xf0, 0x27, 0xef, 0x99, 0xd8, 0x27, 0x76, + 0x02, 0x06, 0x61, 0x68, 0xd1, 0x7a, 0x79, 0xb3, + 0xe8, 0x65, 0x66, 0x21, 0xe9, 0xa9, 0x5d, 0xd2, + 0x0e, 0xf2, 0x40, 0x9f, 0x4e, 0xe6, 0xa7, 0x11, + 0x5c, 0x5e, 0x3c, 0x0f, 0xf5, 0x30, 0xf3, 0x97, + 0xef, 0x06, 0xf0, 0xde, 0xf7, 0x02, 0x38, 0xc7, + 0x8b, 0xbe, 0x50, 0x35, 0xa4, 0x9c, 0xb3, 0x58, + 0xf8, 0xa8, 0x52, 0xec, 0x18, 0x1d, 0x69, 0x17, + 0xbd, 0x86, 0xb9, 0xc4, 0xfb, 0x61, 0x56, 0xc6, + 0xfd, 0xa1, 0x6b, 0xb6, 0x4f, 0x28, 0x55, 0x51, + 0x6e, 0x6f, 0x51, 0x53, 0xe8, 0x25, 0xce, 0xd8, + 0xfc, 0x5a, 0xa0, 0xf4, 0x91, 0x81, 0x71, 0xa2, + 0xe7, 0x88, 0xbb, 0xdd, 0x83, 0xa6, 0x0f, 0x34, + 0xab, 0x76, 0x49, 0x24, 0x98, 0x77, 0x4b, 0x3a, + 0x14, 0x5c, 0xdc, 0x72, 0xc6, 0x6e, 0x41, 0x73, + 0x5c, 0x21, 0xb7, 0x80, 0x8b, 0x5b, 0xd8, 0xdd, + 0x52, 0xd5, 0x81, 0x5d, 0x5c, 0x72, 0x42, 0x97, + 0x54, 0x0e, 0xbc, 0x7a, 0xef, 0x89, 0xce, 0x1f, + 0x7a, 0xb9, 0x3f, 0x66, 0xf3, 0xd8, 0x1d, 0xf4, + 0x6d, 0x9a, 0x1a, 0x69, 0xb3, 0xa8, 0x49, 0xae, + 0xea, 0x47, 0x8e, 0xaa, 0x2d, 0x83, 0xaa, 0x6a, + 0xb5, 0xc7, 0x51, 0xb7, 0x0a, 0x7a, 0x74, 0x95, + 0xa7, 0x8a, 0x37, 0x86, 0xc6, 0x1d, 0x74, 0xd0, + 0x5c, 0xc7, 0x26, 0x11, 0x12, 0x55, 0x8e, 0x13, + 0xde, 0x92, 0xed, 0xce, 0x03, 0x27, 0x80, 0x79, + 0xb9, 0x13, 0xd4, 0x24, 0x26, 0xa8, 0xba, 0xc8, + 0xa8, 0x51, 0xd2, 0x53, 0xca, 0x6f, 0x14, 0xbf, + 0x15, 0xa3, 0x1f, 0x35, 0x7a, 0x0f, 0x7d, 0x77, + 0xf3, 0x03, 0xfa, 0xce, 0x32, 0x37, 0xd7, 0x83, + 0xdf, 0xdd, 0x6d, 0x00, 0xfd, 0xea, 0x09, 0x5f, + 0xca, 0xf4, 0x44, 0x29, 0xa7, 0x9f, 0xe8, 0x94, + 0xe6, 0x26, 0x73, 0xbf, 0x23, 0xcf, 0xfc, 0x62, + 0x04, 0x24, 0xd1, 0xd8, 0xef, 0x23, 0x28, 0xfc, + 0xa3, 0xd7, 0xc5, 0x58, 0x0c, 0xc6, 0xfa, 0xb2, + 0xdd, 0x4a, 0x34, 0xd6, 0x44, 0xa9, 0x31, 0x96, + 0x7a, 0xec, 0x45, 0x05, 0x97, 0xb5, 0x8a, 0x96, + 0x4a, 0xed, 0xa3, 0x9a, 0x08, 0xb8, 0x1d, 0xc5, + 0xa4, 0xca, 0x6a, 0xad, 0x6c, 0xb7, 0x50, 0xda, + 0x29, 0x8c, 0xcc, 0x7f, 0xc1, 0x40, 0xb1, 0x5b, + 0xa9, 0x0d, 0x05, 0x04, 0x0c, 0x75, 0x53, 0xde, + 0x7d, 0x1a, 0xff, 0x04, 0x95, 0x68, 0xad, 0x84, + 0x03, 0xf1, 0xbf, 0xa6, 0x13, 0xb5, 0x91, 0x5a, + 0xa0, 0x92, 0xf6, 0xfc, 0xa8, 0x04, 0xec, 0x0f, + 0x1e, 0xea, 0xd7, 0xe5, 0xdb, 0xea, 0x19, 0x86, + 0x9d, 0x26, 0x60, 0xa5, 0xdb, 0xbc, 0x95, 0xfe, + 0xf5, 0x71, 0xee, 0xc6, 0xf3, 0x82, 0xb1, 0xb7, + 0x80, 0xc4, 0x34, 0x79, 0xc3, 0x78, 0xb4, 0x5b, + 0x8a, 0xaa, 0x75, 0x8a, 0x30, 0xdb, 0x90, 0x95, + 0x9d, 0x33, 0x5b, 0xc2, 0x28, 0x37, 0x93, 0x52, + 0x69, 0x37, 0x0c, 0x78, 0x8e, 0x00, 0x23, 0x74, + 0x24, 0x9d, 0xc6, 0x6e, 0x84, 0x5d, 0x71, 0x7d, + 0x77, 0xce, 0x6f, 0x6f, 0x17, 0x64, 0x56, 0x3b, + 0xf9, 0x75, 0x40, 0x6c, 0xde, 0xb5, 0xb3, 0x82, + 0xa9, 0x81, 0xc9, 0xaa, 0x21, 0xb5, 0xf7, 0xb7, + 0x9f, 0xe1, 0x67, 0x9c, 0xa2, 0xfc, 0x76, 0x19, + 0x8a, 0x86, 0x4f, 0x36, 0xd2, 0xb2, 0x42, 0x32, + 0x5c, 0x80, 0x24, 0x4b, 0x91, 0x50, 0xca, 0x06, + 0x4f, 0xa5, 0x82, 0xe3, 0xcd, 0x2e, 0x14, 0x0c, + 0x9f, 0x62, 0x5d, 0x4b, 0x25, 0x27, 0x90, 0x54, + 0x19, 0x3e, 0xd5, 0x4a, 0xe2, 0x0d, 0xea, 0x50, + 0x94, 0x3c, 0xe2, 0xe6, 0xf1, 0x06, 0x41, 0x89, + 0x6c, 0x21, 0x0a, 0xc3, 0x62, 0x85, 0xd4, 0x10, + 0x80, 0x42, 0x53, 0x5e, 0xad, 0xa9, 0x40, 0x8d, + 0x3f, 0x99, 0x64, 0x3d, 0x95, 0xeb, 0x1e, 0x8a, + 0x3e, 0x8c, 0x3b, 0x50, 0xc3, 0xb4, 0xf5, 0xa7, + 0xec, 0xe7, 0xda, 0x63, 0x39, 0x52, 0x86, 0x7f, + 0xca, 0x75, 0xc6, 0xcb, 0xed, 0xb0, 0x40, 0x61, + 0xf3, 0x95, 0x92, 0x51, 0xfa, 0x53, 0x65, 0xed, + 0xe1, 0xaa, 0x38, 0x2e, 0x71, 0xb0, 0x44, 0xae, + 0x29, 0xf4, 0xe0, 0xae, 0x7f, 0xc7, 0xa5, 0xc8, + 0x5b, 0xd4, 0x56, 0xae, 0x0c, 0x17, 0x01, 0xe2, + 0x49, 0x55, 0xbd, 0xca, 0x69, 0xa9, 0xb0, 0x9a, + 0xf2, 0xe5, 0x36, 0xbd, 0x32, 0xa0, 0x5e, 0x99, + 0x3a, 0x58, 0xb9, 0x65, 0x58, 0xde, 0x4d, 0x28, + 0x8b, 0x47, 0x19, 0xad, 0x5e, 0x19, 0x8d, 0x3f, + 0x3a, 0xd0, 0x2e, 0xe4, 0xff, 0x12, 0x1d, 0x08, + 0xea, 0x25, 0x3a, 0x2e, 0xd1, 0x91, 0x44, 0xc7, + 0xcb, 0x17, 0xcd, 0xc3, 0x06, 0x99, 0x7c, 0xff, + 0x17, 0xe1, 0x71, 0x19, 0x3c, 0x8e, 0x17, 0x1e, + 0x84, 0x56, 0xa2, 0xbd, 0xf6, 0x7f, 0x44, 0xce, + 0x4b, 0xdf, 0xfd, 0x4f, 0x90, 0x13, 0xab, 0x85, + 0x7d, 0xf5, 0x84, 0xdc, 0x10, 0xb6, 0x42, 0xb3, + 0x92, 0x4a, 0x5c, 0x1e, 0xd7, 0x70, 0x04, 0x97, + 0xe3, 0x66, 0x4e, 0xe5, 0x72, 0xdc, 0xf6, 0xd9, + 0xb8, 0x9c, 0x6c, 0xea, 0x56, 0x38, 0xbb, 0xde, + 0xd1, 0x78, 0xc4, 0x90, 0xe1, 0xe8, 0x56, 0x07, + 0x9e, 0x8b, 0xa3, 0x25, 0x38, 0x3a, 0x8c, 0x68, + 0xf4, 0xe7, 0x83, 0x87, 0xf5, 0x12, 0xf5, 0x37, + 0x7d, 0x60, 0xf7, 0x9f, 0xb8, 0x5d, 0x77, 0x86, + 0x7b, 0x15, 0x34, 0xd1, 0x24, 0xcd, 0xc8, 0xf4, + 0x41, 0x25, 0x60, 0x64, 0x2a, 0x4a, 0x9e, 0xc6, + 0xd4, 0x95, 0x7b, 0x7a, 0xf8, 0x44, 0x87, 0xad, + 0x72, 0x76, 0x5a, 0xb9, 0x73, 0x21, 0x94, 0xf6, + 0x55, 0xf9, 0xed, 0xcb, 0x06, 0x0c, 0x1d, 0xbf, + 0xb0, 0x81, 0x30, 0x30, 0xbd, 0x77, 0x2c, 0x7d, + 0x4d, 0x4d, 0x86, 0xbe, 0xa6, 0x76, 0x2c, 0x7d, + 0x2d, 0x43, 0x86, 0xbe, 0x96, 0x71, 0x2c, 0x7d, + 0x55, 0x20, 0x85, 0x10, 0x2a, 0x38, 0x1a, 0x23, + 0x34, 0x20, 0x43, 0x61, 0x0d, 0xc8, 0xd4, 0xb7, + 0xf9, 0xe0, 0x90, 0xd6, 0x78, 0x70, 0xa8, 0xfa, + 0x08, 0x1f, 0xf5, 0xf1, 0x28, 0xd2, 0x52, 0x44, + 0x79, 0x9d, 0xea, 0xa0, 0x9a, 0x59, 0xd1, 0xaa, + 0x7a, 0x39, 0x38, 0xc8, 0x7e, 0x70, 0xb0, 0xe6, + 0xdc, 0x8d, 0x16, 0x3b, 0x80, 0xca, 0x2b, 0x54, + 0xc7, 0xf4, 0x2f, 0x4e, 0xe1, 0x73, 0xca, 0xe1, + 0x4e, 0x89, 0x86, 0x62, 0x25, 0x5e, 0xa1, 0x08, + 0x7f, 0x10, 0x22, 0x35, 0x32, 0xec, 0x5d, 0x24, + 0xe1, 0xca, 0xbc, 0x6a, 0x41, 0x85, 0xb9, 0xf7, + 0xf4, 0x35, 0x44, 0xba, 0x93, 0x63, 0xd6, 0x80, + 0x7c, 0xcc, 0xe8, 0x1e, 0xfc, 0x62, 0x8a, 0xf8, + 0x14, 0x43, 0xb5, 0x92, 0x1b, 0x3b, 0xd1, 0x8d, + 0x79, 0x7c, 0x52, 0x16, 0xfd, 0x0c, 0xba, 0xd1, + 0x7b, 0x14, 0x5f, 0xbb, 0xd9, 0x61, 0x3e, 0x49, + 0x4a, 0x45, 0x7c, 0x74, 0x09, 0x3f, 0x12, 0xc0, + 0xd9, 0xf1, 0x6b, 0xfc, 0x9d, 0x7a, 0xff, 0x29, + 0x9f, 0x9f, 0x49, 0x21, 0xea, 0x12, 0xbd, 0x92, + 0x7e, 0x1b, 0xe9, 0x89, 0x8d, 0x97, 0x4e, 0xee, + 0xf7, 0xd7, 0x45, 0x55, 0x6a, 0xb5, 0x50, 0x15, + 0x2e, 0x2d, 0x70, 0xab, 0xd1, 0x10, 0x4b, 0x5e, + 0x52, 0x53, 0x31, 0xab, 0x00, 0x54, 0x11, 0x15, + 0x52, 0x96, 0x1e, 0x68, 0xa2, 0xb0, 0x6b, 0x22, + 0x66, 0x8c, 0x32, 0x4d, 0x92, 0xb0, 0x40, 0xd5, + 0x8e, 0x64, 0xab, 0xa3, 0x0a, 0xa9, 0x73, 0x33, + 0x5a, 0x2f, 0xa6, 0x9e, 0x0f, 0x59, 0xb5, 0x02, + 0x42, 0x46, 0xba, 0x42, 0x7f, 0x2a, 0xcc, 0xc3, + 0xa9, 0x8f, 0x22, 0xa4, 0x4f, 0x14, 0xf0, 0xd1, + 0x6f, 0xc7, 0xa8, 0x3e, 0x91, 0x41, 0x02, 0x0f, + 0x77, 0x24, 0x31, 0xcd, 0xe3, 0x45, 0xd9, 0x66, + 0xeb, 0xe0, 0xa3, 0x34, 0xbb, 0xa5, 0x83, 0x0e, + 0x00, 0xe1, 0x97, 0xf4, 0xac, 0x0b, 0x50, 0xb2, + 0x67, 0x5d, 0x1c, 0x7f, 0xfe, 0xc3, 0xc5, 0x63, + 0xcf, 0xce, 0x87, 0x43, 0xb4, 0x9b, 0x8d, 0x66, + 0x82, 0x83, 0x6e, 0x36, 0x31, 0xb9, 0x14, 0x38, + 0x9c, 0x4c, 0x27, 0xdf, 0xec, 0xcf, 0xd3, 0xd1, + 0xdd, 0x9d, 0x6d, 0x7c, 0xfb, 0x16, 0x5e, 0xf0, + 0x0b, 0x33, 0xd3, 0x6b, 0x85, 0xf9, 0x4b, 0x9e, + 0x51, 0xe7, 0xe4, 0x2d, 0x03, 0xe7, 0x3b, 0x4c, + 0xb3, 0x23, 0x08, 0xd9, 0xad, 0x8a, 0x47, 0xe8, + 0xe0, 0xa6, 0xb6, 0x05, 0x01, 0x1b, 0x8f, 0xef, + 0xc9, 0xb5, 0xe0, 0x7d, 0x70, 0x1b, 0x09, 0xa6, + 0xf7, 0x10, 0xdf, 0xaf, 0x9d, 0x70, 0x68, 0x74, + 0x67, 0x4b, 0xd4, 0xc6, 0xdd, 0xfd, 0x34, 0x1a, + 0xe4, 0xcb, 0xb2, 0xe2, 0x8b, 0x89, 0x69, 0x3d, + 0x91, 0xb1, 0xbc, 0x5f, 0xd0, 0xff, 0x0c, 0x83, + 0xc0, 0x5d, 0x7f, 0x8f, 0x74, 0x88, 0xdb, 0xb6, + 0xb3, 0xa7, 0x3f, 0x1e, 0x77, 0xeb, 0x70, 0x8c, + 0x9e, 0x3a, 0x9b, 0xbc, 0xa6, 0x95, 0xd2, 0x4b, + 0x18, 0x24, 0xc2, 0xe1, 0x51, 0x92, 0xd1, 0x34, + 0xee, 0xe3, 0x43, 0xdf, 0x1e, 0x84, 0x04, 0x49, + 0xcb, 0xdd, 0x5e, 0xba, 0x2f, 0x5f, 0x0e, 0x84, + 0xe5, 0xae, 0x30, 0x43, 0xb6, 0x73, 0xb4, 0x2f, + 0x10, 0xce, 0x1c, 0xa6, 0x9f, 0xef, 0x75, 0x4d, + 0x21, 0x05, 0x51, 0xfd, 0x69, 0x0e, 0x6e, 0x30, + 0xe6, 0x77, 0x54, 0x5b, 0xda, 0x13, 0xe5, 0xc6, + 0x8f, 0x3e, 0x98, 0x58, 0xb9, 0xf1, 0xe3, 0x90, + 0x95, 0xf9, 0x1b, 0xc9, 0xc5, 0x1b, 0xcc, 0x07, + 0x8b, 0x9b, 0xe2, 0x18, 0xcc, 0x04, 0xbf, 0x35, + 0xec, 0x85, 0xce, 0xa6, 0x68, 0x87, 0xd1, 0x09, + 0xec, 0x50, 0x6d, 0x0b, 0x85, 0xcb, 0x16, 0x0a, + 0xbd, 0x2d, 0x46, 0xd5, 0xb6, 0xd0, 0xc0, 0xe4, + 0xc8, 0xb6, 0xb8, 0xaa, 0x22, 0x84, 0xca, 0x63, + 0x05, 0x54, 0x8c, 0xda, 0x0c, 0xb5, 0x94, 0x38, + 0xb6, 0x19, 0xea, 0x29, 0xa1, 0x71, 0x51, 0x42, + 0xa3, 0xa7, 0x44, 0xad, 0x2d, 0xc6, 0xed, 0xda, + 0x82, 0x7c, 0x84, 0x63, 0xe8, 0x2c, 0x34, 0x3e, + 0x6e, 0x68, 0xb2, 0xb8, 0x71, 0x7b, 0x12, 0x7b, + 0x54, 0xc4, 0x89, 0xc1, 0x63, 0x0a, 0xdd, 0x90, + 0x63, 0x89, 0x9b, 0xb6, 0x2c, 0x41, 0xbe, 0xfa, + 0x57, 0x70, 0xe2, 0xaa, 0xa2, 0xdf, 0xe4, 0x32, + 0x85, 0x42, 0x6f, 0x8a, 0xda, 0x7e, 0xb3, 0x35, + 0x52, 0x20, 0x53, 0x30, 0xf4, 0x9b, 0x1a, 0x97, + 0x11, 0x34, 0x7a, 0x23, 0xd4, 0xf2, 0xe1, 0x6d, + 0xbb, 0x46, 0x60, 0xee, 0x29, 0x50, 0xc9, 0x11, + 0x8f, 0x3d, 0x8a, 0x13, 0x8b, 0x74, 0xfb, 0xc8, + 0xf1, 0xd7, 0x68, 0xee, 0x38, 0x9c, 0x38, 0xfe, + 0xd2, 0x85, 0x7e, 0xfc, 0x2b, 0xec, 0x3a, 0xde, + 0x63, 0x67, 0xeb, 0x2e, 0xdd, 0x39, 0x7a, 0x5c, + 0x40, 0x3c, 0x9f, 0x86, 0x8b, 0xd7, 0x9d, 0xfb, + 0x25, 0x74, 0xb6, 0xb0, 0x83, 0x12, 0x03, 0x67, + 0x1e, 0x74, 0x1e, 0xde, 0x77, 0x02, 0xaf, 0xe3, + 0xcd, 0x02, 0xb4, 0x6f, 0xd0, 0x09, 0x7e, 0xc0, + 0xce, 0xd2, 0x09, 0xe0, 0x16, 0x21, 0x45, 0x5a, + 0x47, 0x95, 0xe0, 0xe4, 0xa4, 0x22, 0x77, 0x1d, + 0x40, 0xf4, 0x5b, 0x37, 0x16, 0x1d, 0xf4, 0x1b, + 0xf3, 0x3a, 0xe8, 0x64, 0xf8, 0x62, 0x17, 0xce, + 0x49, 0x3b, 0xbb, 0x2d, 0x7c, 0x3d, 0xe8, 0x46, + 0x9a, 0xd4, 0x32, 0xf6, 0x1f, 0x98, 0xee, 0xa0, + 0x21, 0x9b, 0xd7, 0x49, 0xea, 0x73, 0xf6, 0xd2, + 0xb9, 0xcd, 0x40, 0xf8, 0x9c, 0xa4, 0x3d, 0xeb, + 0x48, 0x3a, 0xc3, 0x99, 0x11, 0xaf, 0x9b, 0x9e, + 0x75, 0x2c, 0xb5, 0x36, 0x38, 0x73, 0xcd, 0xd8, + 0xf8, 0x5c, 0xa4, 0x1b, 0xcf, 0xd9, 0x43, 0xa7, + 0x99, 0x49, 0x96, 0xc6, 0x10, 0xa7, 0x7f, 0xb4, + 0x67, 0xed, 0x9f, 0xd3, 0xcd, 0xec, 0xf2, 0xfb, + 0xa3, 0xe9, 0x29, 0x22, 0x76, 0x1f, 0xe1, 0x52, + 0x8d, 0xf3, 0x5c, 0x24, 0x54, 0xba, 0x59, 0x36, + 0x52, 0x39, 0x2c, 0x80, 0x5b, 0xac, 0xb2, 0xc0, + 0xe1, 0xd9, 0x42, 0xaa, 0xee, 0x03, 0x17, 0xe0, + 0x58, 0xfc, 0xe2, 0x62, 0xcd, 0x8b, 0xdf, 0x4a, + 0xe8, 0xe0, 0x4c, 0xa0, 0x03, 0x2e, 0xe4, 0x80, + 0x1f, 0xb8, 0xd6, 0x16, 0x70, 0xc4, 0x7a, 0x06, + 0xe0, 0x26, 0x17, 0xd9, 0x4d, 0x01, 0xb2, 0xeb, + 0x6d, 0x01, 0xcf, 0x1f, 0xfd, 0xa3, 0xc5, 0xcf, + 0xe5, 0x78, 0x53, 0xc0, 0xf1, 0x66, 0x5b, 0xf8, + 0x91, 0xe3, 0xeb, 0xf1, 0x5f, 0x15, 0xc0, 0x5b, + 0x95, 0xe0, 0xab, 0xa1, 0x5b, 0x8d, 0xd0, 0xc3, + 0x2f, 0x48, 0x45, 0xe8, 0xaa, 0x59, 0xf1, 0x51, + 0xa0, 0x1c, 0xd7, 0xc1, 0x09, 0xb7, 0x1a, 0x3c, + 0x58, 0x3a, 0x06, 0x54, 0xa7, 0x7b, 0x9f, 0x66, + 0x53, 0xbf, 0x42, 0x77, 0x43, 0xe3, 0xd2, 0x3d, + 0x3c, 0x26, 0x29, 0x47, 0xf7, 0x3e, 0xbf, 0xee, + 0x3a, 0x97, 0xee, 0x7a, 0x4f, 0x9a, 0xdd, 0xf9, + 0x39, 0x63, 0x18, 0x5c, 0xba, 0xcb, 0xe3, 0x8c, + 0x21, 0xc0, 0x99, 0x1e, 0x97, 0xee, 0xf2, 0x38, + 0x63, 0x08, 0x70, 0xa6, 0xcf, 0xa5, 0xbb, 0x3c, + 0xce, 0x18, 0x02, 0x9c, 0x39, 0x75, 0x3f, 0x63, + 0x0a, 0x70, 0x66, 0xc6, 0xa5, 0xbb, 0x3c, 0xce, + 0x98, 0x02, 0x9c, 0x99, 0x73, 0xe9, 0x2e, 0x8f, + 0x33, 0x02, 0x63, 0x93, 0xb1, 0xe0, 0xd2, 0x5d, + 0x1a, 0x67, 0x2c, 0x91, 0xb1, 0xe9, 0x91, 0x4b, + 0x77, 0x69, 0x9c, 0xb1, 0x04, 0xc6, 0x26, 0x53, + 0xe1, 0xd2, 0x5d, 0x1a, 0x67, 0x2c, 0x81, 0xb1, + 0xc9, 0x54, 0xb9, 0x74, 0x97, 0xc7, 0x19, 0x81, + 0xb1, 0xc9, 0x3c, 0xf1, 0x7c, 0xc6, 0x12, 0x18, + 0x9b, 0xcc, 0x13, 0xcf, 0x67, 0x2c, 0x81, 0xb1, + 0xc9, 0x3c, 0xf1, 0x7c, 0xc6, 0x12, 0x18, 0x9b, + 0xcc, 0x13, 0xcf, 0x67, 0x2c, 0x81, 0xb1, 0xc9, + 0x3c, 0xf1, 0x7c, 0xc6, 0x02, 0xfc, 0x9c, 0xe9, + 0xf3, 0xd9, 0xbd, 0x92, 0x33, 0x07, 0x6b, 0x41, + 0xd2, 0x74, 0x9f, 0x79, 0x2d, 0x88, 0xca, 0xf0, + 0x63, 0x72, 0xea, 0xfc, 0x91, 0x5f, 0x00, 0x93, + 0xff, 0x62, 0xa0, 0xdb, 0x80, 0x56, 0x05, 0xb4, + 0xae, 0xc2, 0x7a, 0xd7, 0xc3, 0xe2, 0x0f, 0x11, + 0xc7, 0x94, 0xeb, 0x2a, 0x76, 0xdd, 0xf9, 0x43, + 0xc4, 0xe1, 0xa3, 0x19, 0xb9, 0xd0, 0x45, 0xb3, + 0xdd, 0xc0, 0x4e, 0x31, 0x43, 0x88, 0x62, 0x33, + 0x06, 0x8a, 0xa1, 0x4d, 0x13, 0xb9, 0x2c, 0xc3, + 0xaa, 0xd7, 0x21, 0x13, 0x62, 0x59, 0xeb, 0x0b, + 0x9c, 0x7a, 0xdd, 0x85, 0x58, 0xe6, 0x70, 0xe9, + 0xde, 0xcc, 0x32, 0xda, 0x08, 0xe9, 0x09, 0xd8, + 0x9d, 0x6f, 0x81, 0x43, 0x6d, 0xf7, 0x66, 0xdd, + 0x05, 0xa2, 0x01, 0x72, 0xe9, 0x4e, 0x4f, 0xf8, + 0x46, 0xe5, 0x01, 0xbf, 0xe1, 0x67, 0x80, 0x4b, + 0x79, 0x79, 0x86, 0x07, 0xfc, 0x84, 0x9f, 0xf1, + 0xcd, 0xb4, 0xa5, 0x11, 0xbe, 0x2f, 0xd0, 0xd1, + 0xcc, 0xf8, 0x48, 0x23, 0xcd, 0xee, 0x7d, 0x81, + 0x8e, 0x66, 0xc6, 0xb7, 0x2a, 0x96, 0x68, 0x77, + 0xfe, 0x60, 0x9d, 0xf3, 0xad, 0x8a, 0xe9, 0x83, + 0xb5, 0xa9, 0x87, 0x17, 0x21, 0xcd, 0xbc, 0xf5, + 0x65, 0x71, 0xbd, 0xee, 0x22, 0xa4, 0x99, 0xf3, + 0x75, 0x34, 0xd4, 0xa4, 0x69, 0xd6, 0x5d, 0x80, + 0x34, 0x7c, 0x1d, 0x0d, 0x3d, 0x69, 0x1a, 0x19, + 0x2f, 0x30, 0xb4, 0xce, 0xf9, 0xd6, 0xf4, 0xd4, + 0xa4, 0x69, 0xd6, 0x5d, 0xc0, 0xf0, 0x7c, 0x93, + 0x7e, 0x7a, 0xc3, 0x1b, 0x8d, 0xf3, 0x31, 0x93, + 0x5b, 0xf9, 0x05, 0x5f, 0x37, 0xd9, 0xbc, 0x30, + 0x8e, 0x17, 0x96, 0x3d, 0xc0, 0x3a, 0xeb, 0xc7, + 0x65, 0x4a, 0xf1, 0x4c, 0xa3, 0x7b, 0xd0, 0x0d, + 0x97, 0x55, 0xa9, 0x6e, 0xab, 0x26, 0xd7, 0x4d, + 0x53, 0x53, 0x95, 0x7c, 0xad, 0xd5, 0x67, 0x75, + 0x55, 0x87, 0xb5, 0x52, 0x2f, 0x31, 0x68, 0xd6, + 0x17, 0x0c, 0x7c, 0xee, 0x81, 0x7a, 0x13, 0x2a, + 0x39, 0x13, 0x36, 0xe1, 0xb4, 0x04, 0x70, 0xd6, + 0xec, 0xfc, 0x48, 0x42, 0xd3, 0x67, 0x44, 0x33, + 0x3f, 0x73, 0x34, 0x80, 0x09, 0x0d, 0x6c, 0x03, + 0x8d, 0x3c, 0xa6, 0x01, 0x36, 0xdf, 0x3c, 0xb6, + 0x81, 0x46, 0x9a, 0x6f, 0x18, 0xd1, 0x18, 0xca, + 0x99, 0xa3, 0x61, 0x62, 0x9a, 0xa1, 0xb5, 0x81, + 0x46, 0x22, 0xd3, 0xd8, 0xd0, 0xe8, 0x67, 0x8d, + 0xa6, 0xcf, 0xc8, 0x34, 0xa3, 0x0d, 0x34, 0xd2, + 0x98, 0xc6, 0x8a, 0xc6, 0x3c, 0x73, 0x34, 0x6c, + 0x4c, 0x6b, 0x65, 0xf4, 0x94, 0xc8, 0x34, 0x36, + 0x34, 0xce, 0x69, 0xd0, 0x44, 0xdb, 0xc4, 0x18, + 0x0c, 0x25, 0x32, 0xc3, 0x62, 0x1b, 0x49, 0x8d, + 0x85, 0x00, 0x32, 0xbe, 0x0d, 0xe3, 0x66, 0xd8, + 0xf1, 0x1c, 0xbf, 0x11, 0x2a, 0x5b, 0x80, 0x89, + 0x4c, 0x5c, 0xc5, 0x03, 0xac, 0x11, 0x0d, 0x1b, + 0x25, 0x4d, 0xb5, 0x0d, 0x34, 0xf2, 0x7c, 0xc3, + 0x88, 0x06, 0x9c, 0x35, 0x1a, 0xc6, 0xc9, 0xb6, + 0xd1, 0xca, 0xf4, 0x54, 0x1a, 0xd3, 0x18, 0x27, + 0xdb, 0x66, 0x2b, 0x13, 0xba, 0xd0, 0x37, 0x2c, + 0x37, 0x45, 0x74, 0x8d, 0xfd, 0x58, 0x32, 0x2e, + 0xd5, 0xbc, 0x0d, 0x50, 0xfe, 0x0b, 0x3b, 0x34, + 0x95, 0xe7, 0x20, 0x3e, 0xc5, 0x2d, 0x0c, 0xfc, + 0xbb, 0xc3, 0xd8, 0x2e, 0xc9, 0xe8, 0x1a, 0xc7, + 0x2d, 0x04, 0x5c, 0xac, 0xf9, 0x16, 0x42, 0x25, + 0xf8, 0x96, 0xae, 0xad, 0x72, 0x80, 0xe7, 0xc3, + 0x2e, 0x00, 0x9d, 0xe7, 0x38, 0x3e, 0x15, 0x74, + 0x0d, 0xb0, 0x40, 0x37, 0xb8, 0x28, 0x6f, 0x08, + 0x51, 0xbe, 0xd7, 0x16, 0x74, 0x36, 0xaf, 0x1b, + 0x7c, 0x94, 0x37, 0x84, 0x28, 0xaf, 0xb4, 0x74, + 0x6f, 0x91, 0x03, 0x3c, 0x1f, 0x76, 0x7e, 0xe8, + 0x6a, 0xbf, 0x2d, 0xe8, 0xe5, 0x94, 0x7f, 0xf9, + 0x22, 0x7e, 0x79, 0xe5, 0xa2, 0x1a, 0xfd, 0x95, + 0x13, 0x69, 0xfc, 0x17, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, + 0xf2, 0x4a, 0xd6, 0x5e, 0x9e, 0x5b, 0xf9, 0x03, + 0x00, 0x00, 0x0a, 0x12, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x46, 0x52, 0x4c, 0x31, 0x35, 0x78, + 0x2e, 0x78, 0x6d, 0x6c, 0xe5, 0x58, 0xdb, 0x6e, + 0xdb, 0x30, 0x0c, 0x7d, 0xde, 0xbe, 0xa2, 0xc8, + 0xfb, 0xe6, 0x38, 0x97, 0x5d, 0x00, 0xd7, 0x40, + 0xae, 0xdb, 0xb0, 0x64, 0x2b, 0x9c, 0x6e, 0xcb, + 0x9b, 0xa1, 0xda, 0x4c, 0x6b, 0xd4, 0xb7, 0xc9, + 0x72, 0x96, 0xec, 0xeb, 0x27, 0x4a, 0xb2, 0x2d, + 0x27, 0x4e, 0xe6, 0x6e, 0x6b, 0x5f, 0x56, 0xa0, + 0xa8, 0x48, 0x1e, 0x91, 0x3c, 0x24, 0x25, 0x0b, + 0xb5, 0x7c, 0xd8, 0x06, 0x1e, 0xbc, 0x08, 0xe2, + 0x4d, 0x42, 0x23, 0xc2, 0x82, 0x24, 0xbe, 0xd8, + 0x02, 0xcd, 0xf8, 0xdf, 0xcb, 0x8e, 0xf9, 0xb2, + 0xdb, 0xb1, 0x9f, 0x3f, 0xb3, 0x82, 0x28, 0x4d, + 0x28, 0xbb, 0xd8, 0x04, 0x21, 0x5c, 0x76, 0x7c, + 0xd8, 0x90, 0x3c, 0x64, 0xd9, 0xcb, 0x5d, 0x14, + 0x76, 0x0c, 0xfb, 0x39, 0xb7, 0x03, 0x44, 0xd7, + 0x41, 0x04, 0xf4, 0x22, 0xf0, 0x2f, 0x3b, 0xce, + 0xdc, 0xec, 0x2f, 0x71, 0xdb, 0x33, 0x2b, 0x26, + 0x11, 0xd8, 0x42, 0xb6, 0x0c, 0x5c, 0x0b, 0xe5, + 0x96, 0x84, 0x39, 0xd8, 0xdd, 0xdd, 0x78, 0x6c, + 0x19, 0x62, 0x8d, 0x11, 0x8c, 0xc2, 0x45, 0x93, + 0xbf, 0xd5, 0xd4, 0x1c, 0x68, 0x0e, 0xa5, 0xa2, + 0xc1, 0xe3, 0xf4, 0xed, 0x49, 0x8f, 0x5e, 0x98, + 0x78, 0xf7, 0x1f, 0x38, 0x47, 0xe1, 0x72, 0xee, + 0x2c, 0xcc, 0xe1, 0xce, 0x1d, 0x93, 0x0c, 0xd0, + 0xaf, 0x32, 0x4f, 0x92, 0x98, 0xd1, 0x24, 0xb4, + 0xdf, 0x4d, 0x26, 0xee, 0x6c, 0x7d, 0x3d, 0xfb, + 0x34, 0x9d, 0x4d, 0x2d, 0x43, 0x37, 0x09, 0x2c, + 0xf7, 0x3b, 0x41, 0x5d, 0x66, 0x08, 0xb1, 0x08, + 0x93, 0x35, 0x7a, 0xd6, 0xb9, 0xc4, 0x3e, 0xec, + 0x2e, 0x3b, 0x6f, 0x3a, 0x17, 0x14, 0x36, 0x45, + 0x99, 0x8c, 0x66, 0xd0, 0x5b, 0x05, 0x1a, 0x5d, + 0x7d, 0xfe, 0xbc, 0x38, 0x05, 0x32, 0xfb, 0x0a, + 0x75, 0x3d, 0xea, 0xbb, 0xdd, 0x93, 0xa8, 0xa1, + 0x42, 0x7d, 0x9b, 0x5e, 0xbb, 0x23, 0x89, 0xaa, + 0x8a, 0x93, 0x89, 0x52, 0x95, 0xd5, 0xa9, 0xd7, + 0x0a, 0xf7, 0xd5, 0x29, 0x55, 0x1c, 0x7b, 0x9d, + 0x3a, 0x7b, 0xc4, 0xb6, 0xa1, 0x6f, 0x76, 0x55, + 0x3a, 0xf0, 0x65, 0x35, 0xf9, 0x30, 0x3e, 0x9d, + 0xb6, 0x29, 0x70, 0x45, 0xfb, 0xff, 0x59, 0xde, + 0xfd, 0x3f, 0xcd, 0xfb, 0x91, 0xf2, 0x19, 0xfc, + 0x69, 0x3e, 0x07, 0x75, 0x6c, 0x93, 0xd0, 0x36, + 0x09, 0x19, 0xb9, 0x85, 0x83, 0x63, 0x20, 0x13, + 0xd8, 0x7a, 0xde, 0x32, 0x88, 0x6d, 0x73, 0x30, + 0xec, 0x5a, 0x86, 0x14, 0x4a, 0x3d, 0xd9, 0xd9, + 0xe6, 0x2b, 0xd4, 0x4b, 0xa1, 0xd0, 0xcf, 0x43, + 0x92, 0xdd, 0x21, 0x0e, 0x2d, 0x95, 0x58, 0x98, + 0x57, 0xe0, 0xe5, 0x14, 0x94, 0xbd, 0x94, 0x4b, + 0x40, 0x9a, 0xd6, 0x00, 0x85, 0x7c, 0x0c, 0xe0, + 0x11, 0x6b, 0x80, 0x22, 0x03, 0x06, 0x19, 0xfb, + 0x9a, 0xa6, 0xf6, 0x86, 0x84, 0x19, 0x58, 0x86, + 0x12, 0x05, 0x6d, 0x45, 0xb4, 0x24, 0xbe, 0x01, + 0xc2, 0xf8, 0x4e, 0xfd, 0x88, 0x6a, 0xe7, 0x7e, + 0xb5, 0xcf, 0x18, 0x44, 0xf6, 0x7c, 0xb1, 0xb8, + 0x5a, 0x7c, 0x59, 0x59, 0x86, 0xa6, 0x14, 0xa0, + 0xef, 0x79, 0xe0, 0xdd, 0x2f, 0x21, 0x72, 0x80, + 0xf8, 0x36, 0xa3, 0x39, 0x0f, 0xa6, 0xab, 0x04, + 0xe6, 0x8e, 0x64, 0x73, 0x4a, 0x22, 0x65, 0x56, + 0x92, 0xc8, 0xa5, 0x88, 0x2d, 0x12, 0x89, 0x20, + 0x4a, 0xe8, 0x5e, 0x36, 0x6e, 0x9c, 0x24, 0x6c, + 0x92, 0xf8, 0xe0, 0xae, 0xb7, 0x3d, 0x31, 0x10, + 0x95, 0x46, 0x4f, 0x31, 0x0b, 0x7e, 0xe2, 0xdd, + 0x36, 0xe0, 0x25, 0xc0, 0xa5, 0xd0, 0xa5, 0x34, + 0x61, 0xe0, 0x31, 0x72, 0x13, 0x42, 0x41, 0x5f, + 0x53, 0x89, 0xb0, 0x32, 0xd2, 0x03, 0x82, 0xf6, + 0xea, 0x51, 0x19, 0xa1, 0x0c, 0xc3, 0x0e, 0xba, + 0x3c, 0xb0, 0x90, 0xf4, 0x6c, 0x4c, 0xaf, 0xfb, + 0x6f, 0xf2, 0x59, 0x92, 0x20, 0x76, 0xb1, 0x56, + 0x98, 0x8c, 0x14, 0x1b, 0xf3, 0xd8, 0xbc, 0x19, + 0x34, 0xe5, 0xf1, 0xda, 0xab, 0xd2, 0x28, 0x1c, + 0x8f, 0x3c, 0x0f, 0xb2, 0xcc, 0xb6, 0xd8, 0x3e, + 0x05, 0x1b, 0x5d, 0x2f, 0x35, 0xf5, 0x98, 0x60, + 0x72, 0x68, 0x92, 0xc7, 0xea, 0x07, 0x0d, 0x18, + 0x5c, 0x89, 0x5c, 0xf1, 0xd3, 0x67, 0x5b, 0xc4, + 0xf7, 0x29, 0xc7, 0x21, 0xc7, 0xb7, 0xdc, 0x77, + 0x21, 0x5a, 0x37, 0x01, 0x43, 0xe5, 0x6b, 0xe4, + 0x2d, 0xd6, 0x96, 0x71, 0xb0, 0x57, 0x9e, 0x3f, + 0x3d, 0x87, 0x66, 0xe2, 0x0b, 0xb2, 0x4f, 0x72, + 0x76, 0x30, 0x8a, 0x65, 0x55, 0xf0, 0xa3, 0x56, + 0x35, 0x45, 0x9c, 0xf1, 0xe3, 0xc1, 0x30, 0x4e, + 0xef, 0xe8, 0x1d, 0x6c, 0xe9, 0x9d, 0xd9, 0x33, + 0x49, 0x73, 0x81, 0x16, 0x2b, 0x77, 0x2a, 0xbf, + 0xeb, 0x4d, 0xc0, 0x19, 0x44, 0x02, 0x28, 0x56, + 0xa7, 0x81, 0xb2, 0x7f, 0x9d, 0xaa, 0xb3, 0x67, + 0x62, 0x5f, 0x01, 0x0d, 0xd2, 0x3b, 0xa0, 0x24, + 0x34, 0x5f, 0xf1, 0x7a, 0x8a, 0x4d, 0x47, 0xda, + 0x22, 0x14, 0x4e, 0x6b, 0x93, 0x13, 0x87, 0xc8, + 0xbc, 0xc4, 0x4a, 0x80, 0x10, 0x53, 0x4d, 0x69, + 0x57, 0x9f, 0xd2, 0xaa, 0x15, 0x62, 0x59, 0xb5, + 0xe2, 0x5c, 0x6f, 0x5c, 0x27, 0x89, 0x9e, 0xa6, + 0x3f, 0xb5, 0xcc, 0xa1, 0x29, 0xf1, 0xff, 0xaf, + 0x81, 0xbd, 0x76, 0x65, 0xe0, 0x7b, 0x7b, 0xc7, + 0x6e, 0xb4, 0xdb, 0xc3, 0x84, 0xf2, 0x16, 0x6b, + 0x55, 0xe6, 0xe3, 0xf9, 0x50, 0xcf, 0xe4, 0xa3, + 0x53, 0x1b, 0xf8, 0x4b, 0x92, 0xdd, 0x4b, 0xa7, + 0xea, 0xd9, 0x8c, 0xb7, 0x15, 0xff, 0xb1, 0x0c, + 0x25, 0x4b, 0x23, 0xe1, 0x77, 0xc4, 0x56, 0x3c, + 0xaf, 0x3f, 0xc2, 0x5e, 0x41, 0x24, 0xac, 0x66, + 0x91, 0x89, 0x54, 0x5e, 0xad, 0x34, 0x23, 0xb6, + 0x03, 0xb7, 0x79, 0x48, 0xa8, 0x65, 0x70, 0x01, + 0x95, 0xf2, 0x32, 0xea, 0xa9, 0x9b, 0x48, 0x68, + 0x08, 0xf5, 0xee, 0x02, 0x7e, 0x11, 0xe1, 0xa7, + 0xc6, 0xe6, 0xc3, 0xc0, 0xdd, 0x6a, 0x9a, 0xe2, + 0x89, 0x61, 0xcf, 0x96, 0xb3, 0x35, 0xbe, 0x6d, + 0x9d, 0x91, 0xbb, 0x5a, 0x8e, 0x16, 0x0b, 0x77, + 0xb8, 0x5e, 0x8b, 0x37, 0x83, 0x40, 0x68, 0x9f, + 0x4d, 0x59, 0x4d, 0xbd, 0xfb, 0xd5, 0x47, 0xf4, + 0xd8, 0x04, 0x3b, 0x36, 0x57, 0x56, 0xa9, 0x48, + 0x93, 0x1f, 0x40, 0x57, 0xc0, 0x58, 0x10, 0xdf, + 0x2a, 0x95, 0x5e, 0xd1, 0x26, 0xef, 0x79, 0x2c, + 0x6e, 0xd1, 0x25, 0x49, 0xa5, 0x55, 0x9b, 0x1c, + 0xf9, 0x81, 0xa8, 0x70, 0x21, 0xb0, 0x12, 0xc6, + 0xcd, 0x73, 0x67, 0x24, 0x1f, 0xd2, 0x96, 0x21, + 0xbb, 0xa4, 0x35, 0xac, 0x16, 0xe9, 0xcc, 0xb9, + 0xae, 0xf2, 0xd2, 0x11, 0xad, 0xbc, 0x72, 0x08, + 0xea, 0x33, 0x8f, 0x4f, 0xbe, 0xf8, 0x0e, 0x38, + 0xf3, 0x41, 0xbf, 0x2b, 0x1f, 0xc9, 0xef, 0xf9, + 0xe6, 0xca, 0xa2, 0x26, 0x06, 0x8f, 0xfd, 0xe1, + 0xc4, 0xbc, 0x31, 0xe1, 0xf5, 0x6f, 0x26, 0x86, + 0x0c, 0x87, 0x04, 0x7f, 0x1b, 0x27, 0xa6, 0xf4, + 0xda, 0xfc, 0xec, 0xec, 0xb5, 0x61, 0x82, 0x8c, + 0x9f, 0x8c, 0x0d, 0x72, 0xc1, 0xdf, 0x47, 0x63, + 0x73, 0x8e, 0x49, 0xff, 0x01, 0x4c, 0x36, 0x37, + 0x8f, 0xd8, 0x97, 0x7e, 0x1b, 0x26, 0xd8, 0x97, + 0x27, 0x63, 0xf3, 0x37, 0x7d, 0x69, 0xc5, 0xe6, + 0x1c, 0x93, 0xc1, 0x43, 0x98, 0x78, 0x8f, 0xd8, + 0x97, 0x41, 0x1b, 0x26, 0xd8, 0x97, 0x27, 0x63, + 0xf3, 0x37, 0x7d, 0x39, 0x64, 0xa3, 0x56, 0xd5, + 0x3f, 0x7d, 0x44, 0xd4, 0x5f, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0x2e, 0xe0, 0x4d, 0x67, 0x28, + 0x03, 0x00, 0x00, 0x8c, 0x0d, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4c, 0x30, 0x39, 0x32, 0x2e, + 0x78, 0x6d, 0x6c, 0xd5, 0x57, 0x6d, 0x6f, 0xda, + 0x30, 0x10, 0xfe, 0xbc, 0xfe, 0x0a, 0xc4, 0xf7, + 0x35, 0x01, 0x4a, 0x4b, 0x25, 0x13, 0x89, 0x01, + 0x9d, 0xaa, 0xc1, 0x8a, 0x80, 0x75, 0x7c, 0x8b, + 0x8c, 0x73, 0x69, 0xad, 0xe6, 0x6d, 0x89, 0x83, + 0x60, 0xbf, 0x7e, 0xe7, 0xd8, 0x24, 0xe1, 0x25, + 0xac, 0xeb, 0xda, 0xbd, 0x20, 0x21, 0x7c, 0x77, + 0x8f, 0xef, 0x39, 0xdb, 0x8f, 0x2f, 0x81, 0x38, + 0xb0, 0xe2, 0x0c, 0xde, 0xf3, 0xc0, 0x0d, 0x63, + 0x9f, 0x0a, 0x1e, 0x06, 0xb5, 0x15, 0xc4, 0x09, + 0xfe, 0x76, 0xeb, 0x8d, 0x73, 0xb3, 0x6e, 0x9d, + 0xbd, 0x23, 0xdc, 0x8f, 0xc2, 0x58, 0xd4, 0x5c, + 0xee, 0x41, 0xb7, 0xee, 0x80, 0x4b, 0x53, 0x4f, + 0x24, 0xe7, 0x6b, 0xdf, 0xab, 0x1b, 0xd6, 0x19, + 0xc6, 0x7d, 0xf0, 0xc3, 0x78, 0x53, 0xe3, 0x4e, + 0xb7, 0x3e, 0x0a, 0xd9, 0x13, 0x5d, 0x7a, 0x30, + 0xa5, 0x7e, 0xbd, 0x16, 0x83, 0xdb, 0xad, 0xe3, + 0xc8, 0x1e, 0xa8, 0x39, 0x32, 0xd9, 0x16, 0xdd, + 0x63, 0x0c, 0x92, 0xc4, 0x22, 0x62, 0x13, 0x81, + 0x55, 0x9a, 0x35, 0x2e, 0x45, 0x89, 0x91, 0x45, + 0x89, 0x51, 0x9e, 0x82, 0x39, 0xb6, 0x8e, 0x03, + 0x72, 0xf3, 0xba, 0x69, 0x4f, 0xc3, 0x2a, 0x66, + 0xc5, 0x85, 0x71, 0x95, 0xb7, 0xaa, 0x98, 0x0f, + 0x61, 0x28, 0x58, 0xe8, 0x00, 0x02, 0x7f, 0xb9, + 0x8c, 0x11, 0xdd, 0x84, 0xa9, 0xc8, 0x8b, 0x29, + 0x2f, 0xb8, 0x16, 0x50, 0x1f, 0xb7, 0xaf, 0x1f, + 0xa5, 0x59, 0x79, 0xd9, 0x28, 0x2f, 0xcf, 0x38, + 0x04, 0x0e, 0x41, 0xad, 0x23, 0x1b, 0x9d, 0x02, + 0x4e, 0x20, 0xe6, 0xd1, 0x23, 0xc4, 0xd4, 0x6b, + 0x5c, 0x2e, 0xb9, 0xc8, 0x26, 0x1d, 0x78, 0xb7, + 0x09, 0xec, 0xc5, 0xaa, 0x79, 0x2c, 0x49, 0xe5, + 0x79, 0x21, 0x30, 0x11, 0x34, 0x16, 0x96, 0xb9, + 0x6e, 0xb6, 0x3a, 0x26, 0x31, 0x32, 0x4b, 0x07, + 0xf8, 0x77, 0x40, 0xbf, 0xf4, 0xca, 0xa1, 0x74, + 0x16, 0x7b, 0x92, 0x0d, 0x8b, 0x3d, 0x91, 0x9b, + 0xa4, 0xc5, 0xb6, 0xb3, 0x3d, 0xd2, 0x99, 0x30, + 0xac, 0x55, 0x4a, 0xcf, 0x1a, 0xcf, 0x26, 0x17, + 0x2d, 0x53, 0xc6, 0x88, 0x51, 0xf2, 0x67, 0x38, + 0xee, 0x8c, 0x69, 0xf2, 0xa4, 0x98, 0xb5, 0x44, + 0x91, 0xdc, 0xc5, 0x0f, 0x31, 0xb4, 0xad, 0xcb, + 0x4a, 0x97, 0xfb, 0x71, 0xe5, 0x2a, 0x20, 0x94, + 0x09, 0xbe, 0xca, 0xd4, 0xfe, 0x09, 0x36, 0x1a, + 0xa5, 0x90, 0x3b, 0x11, 0xb5, 0x22, 0x45, 0xac, + 0x6b, 0xe8, 0xa3, 0x32, 0xf6, 0x6b, 0x60, 0x58, + 0xef, 0x89, 0x1a, 0x7e, 0x4e, 0xdf, 0xa6, 0xb4, + 0x2d, 0xbf, 0x47, 0xe9, 0x0b, 0x4e, 0x12, 0x25, + 0xd4, 0x9a, 0xc2, 0x43, 0xea, 0xd1, 0x98, 0x18, + 0x68, 0x64, 0x4e, 0x3c, 0xdd, 0xc4, 0x6a, 0x22, + 0x8b, 0x1c, 0x64, 0x1e, 0x1a, 0xb3, 0x47, 0x2e, + 0x80, 0x89, 0x34, 0x06, 0x0b, 0x65, 0x86, 0x69, + 0x0b, 0x8f, 0xca, 0x04, 0xe0, 0x5b, 0xc3, 0xf1, + 0x70, 0x61, 0x0f, 0x17, 0xf3, 0x69, 0xcf, 0x9e, + 0x8d, 0x7b, 0xa3, 0x91, 0xdd, 0x5e, 0x2c, 0x88, + 0x81, 0x91, 0x0c, 0xc1, 0x3c, 0xbc, 0x94, 0xb7, + 0xd8, 0x16, 0xd0, 0xda, 0x9a, 0xfd, 0x30, 0x10, + 0x71, 0xe8, 0x59, 0x1f, 0xfb, 0x7d, 0x39, 0x71, + 0xf8, 0x79, 0x30, 0x1c, 0x10, 0xa3, 0x1c, 0x42, + 0xb0, 0xca, 0x3e, 0xe7, 0x3e, 0xae, 0x38, 0x33, + 0x0b, 0xbb, 0xc6, 0x03, 0x07, 0xd6, 0xd8, 0x58, + 0xcc, 0xed, 0x1d, 0xe8, 0xcf, 0xea, 0x46, 0x15, + 0xa8, 0xa1, 0x41, 0xbd, 0xc9, 0xdd, 0xdd, 0xa8, + 0x1a, 0xd6, 0xd2, 0xb0, 0x79, 0xaf, 0x65, 0x9b, + 0xd5, 0xb0, 0x8b, 0x12, 0xac, 0x51, 0x0d, 0x6b, + 0x6b, 0xd8, 0xd7, 0xc1, 0xdc, 0xee, 0x69, 0x18, + 0x31, 0x4a, 0x0b, 0x92, 0xe6, 0xce, 0xde, 0x90, + 0x55, 0xe8, 0x09, 0xfa, 0x00, 0xda, 0x96, 0x0e, + 0xc6, 0xc6, 0x3c, 0xb0, 0xae, 0x4d, 0x3c, 0x14, + 0x35, 0x2e, 0xfc, 0x74, 0x6d, 0x35, 0x3a, 0x32, + 0xa0, 0x8c, 0x3c, 0x70, 0xe3, 0xd1, 0xe4, 0x51, + 0x22, 0x65, 0xa8, 0x30, 0xf3, 0xf8, 0x0c, 0x18, + 0x9e, 0x9d, 0x06, 0xe4, 0x76, 0x81, 0x88, 0xa2, + 0x1d, 0x44, 0x6e, 0x1f, 0x22, 0x90, 0x75, 0x07, + 0x91, 0x57, 0x21, 0x20, 0x11, 0xf7, 0x51, 0x64, + 0xb9, 0xd4, 0x4b, 0x80, 0x18, 0xda, 0x54, 0x2b, + 0xde, 0x5b, 0x23, 0x71, 0x81, 0x4a, 0x2d, 0x25, + 0x25, 0x71, 0xcc, 0x36, 0x89, 0x40, 0xed, 0xdc, + 0x8c, 0x46, 0x93, 0xd1, 0x97, 0x19, 0x31, 0x4a, + 0x4e, 0x95, 0xa3, 0x34, 0x67, 0xb7, 0x5f, 0xca, + 0x1d, 0x2f, 0x3a, 0xc2, 0x7e, 0x6b, 0x92, 0xfd, + 0x58, 0xde, 0x80, 0xec, 0x60, 0x8a, 0x26, 0xaf, + 0xa0, 0x45, 0x77, 0x72, 0x3b, 0x66, 0xa9, 0x3b, + 0x55, 0xb4, 0xa7, 0xa2, 0x3f, 0x1d, 0xf2, 0xdc, + 0xc6, 0xf7, 0xc0, 0x34, 0x49, 0xf1, 0x40, 0x3a, + 0xe4, 0x71, 0xe1, 0x38, 0x4f, 0xf3, 0x99, 0x3c, + 0x63, 0xca, 0x83, 0x67, 0xd0, 0x74, 0x3a, 0xc7, + 0x69, 0xae, 0x2e, 0x2b, 0x78, 0xf6, 0x1a, 0xae, + 0x3a, 0xa6, 0x34, 0x60, 0xb2, 0x99, 0x8c, 0x69, + 0xa4, 0x18, 0x77, 0x1e, 0x03, 0x39, 0xc4, 0x03, + 0x91, 0x23, 0x74, 0x04, 0xb3, 0xa9, 0x6e, 0x5d, + 0x6e, 0xdc, 0xc5, 0x39, 0xbd, 0x65, 0x37, 0x94, + 0xbd, 0x50, 0x7e, 0x4f, 0x74, 0xc3, 0x17, 0x6a, + 0xf0, 0x1d, 0xf9, 0x96, 0x72, 0xf6, 0x84, 0xef, + 0x18, 0x53, 0xa0, 0x8e, 0x25, 0xe2, 0x14, 0x75, + 0x5e, 0x76, 0xfd, 0x55, 0xa1, 0x5e, 0xc1, 0x33, + 0x15, 0xf4, 0xaa, 0x4a, 0xfd, 0xbd, 0x77, 0xa0, + 0x57, 0x50, 0x7a, 0x83, 0x55, 0xed, 0x47, 0xe7, + 0x9f, 0x51, 0xfa, 0xe1, 0x3b, 0x4a, 0x7f, 0xff, + 0x1d, 0xe5, 0x2d, 0x6f, 0x84, 0x83, 0xd2, 0x5c, + 0xd2, 0x25, 0x9c, 0xb8, 0x11, 0xff, 0x85, 0x56, + 0x15, 0xcb, 0x0b, 0x85, 0xfa, 0x76, 0x42, 0xfb, + 0xe3, 0x1d, 0x55, 0x8f, 0x8a, 0xbf, 0x5d, 0xd9, + 0xc9, 0xff, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, + 0x4a, 0x1e, 0xea, 0x11, 0x71, 0x16, 0x02, 0x00, + 0x00, 0xa4, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x2e, + 0x78, 0x6d, 0x6c, 0xbd, 0x58, 0xc1, 0x8e, 0xda, + 0x30, 0x10, 0x3d, 0xb7, 0x52, 0xff, 0x01, 0xe5, + 0xde, 0x75, 0x48, 0xbb, 0x29, 0x2b, 0x99, 0x5c, + 0x52, 0xb6, 0xaa, 0xb4, 0x50, 0x89, 0x5e, 0xf6, + 0x86, 0x1c, 0x67, 0xc2, 0x5a, 0x9b, 0xc4, 0x91, + 0xe3, 0x44, 0xa1, 0x5f, 0x5f, 0x27, 0x36, 0x24, + 0x50, 0xe8, 0x5e, 0xda, 0xe1, 0x82, 0xe7, 0xcd, + 0xd8, 0x6f, 0x6c, 0x3f, 0x66, 0x2c, 0x68, 0x0a, + 0xad, 0xe0, 0xf0, 0x51, 0x94, 0x99, 0x54, 0x05, + 0xd3, 0x42, 0x96, 0xb3, 0x16, 0x54, 0x6d, 0xbe, + 0x97, 0xde, 0xfc, 0xce, 0xf7, 0xa2, 0x0f, 0xef, + 0xdf, 0x51, 0x51, 0x54, 0x52, 0xe9, 0x59, 0x26, + 0x72, 0x58, 0x7a, 0x29, 0x64, 0xac, 0xc9, 0x75, + 0x7d, 0xd7, 0x15, 0xb9, 0x47, 0x8c, 0xdf, 0x44, + 0xb8, 0x65, 0x66, 0x22, 0x5d, 0x7a, 0x4f, 0xb0, + 0x67, 0xfc, 0x30, 0x4c, 0xec, 0xf1, 0x9a, 0x2b, + 0x51, 0xf5, 0xeb, 0x46, 0xd6, 0x41, 0xc9, 0x04, + 0xb3, 0x41, 0x22, 0x5d, 0xb3, 0xfa, 0xb5, 0x1f, + 0x1b, 0xc3, 0xb1, 0x47, 0x7e, 0x97, 0x99, 0x0f, + 0x25, 0xce, 0x76, 0xde, 0xba, 0x49, 0x2e, 0x03, + 0x1c, 0x34, 0xc6, 0x28, 0x93, 0x8b, 0x8b, 0xe8, + 0xfd, 0x83, 0x39, 0x7a, 0x0b, 0xd6, 0x6d, 0xcf, + 0x03, 0x8e, 0xc8, 0x29, 0x1f, 0x32, 0x49, 0x88, + 0x56, 0x35, 0x8b, 0xb6, 0xb0, 0x6f, 0x72, 0xa6, + 0x28, 0x31, 0x86, 0x45, 0x13, 0xa1, 0xeb, 0x28, + 0xf0, 0x29, 0xe9, 0x07, 0x16, 0x62, 0x8a, 0xbf, + 0x08, 0x0d, 0x5c, 0x37, 0x0a, 0xa2, 0xb8, 0x6a, + 0x9e, 0xdb, 0x80, 0x92, 0x29, 0x68, 0xc3, 0x00, + 0x8a, 0x68, 0xb5, 0x5e, 0x3d, 0xef, 0x36, 0x3f, + 0x36, 0x2b, 0x4a, 0x8c, 0x69, 0x71, 0x9e, 0x4b, + 0xfe, 0xfa, 0xdd, 0x5c, 0x43, 0x6f, 0x1e, 0xed, + 0x58, 0x96, 0x5a, 0xc9, 0x3c, 0xfa, 0x16, 0xc7, + 0x2e, 0x7e, 0x0a, 0xbb, 0x6c, 0xcf, 0x67, 0xd2, + 0x56, 0xe6, 0x9a, 0xed, 0xa1, 0x07, 0x66, 0x0a, + 0xb2, 0xa5, 0xf7, 0xd5, 0x5e, 0xd8, 0x6e, 0x23, + 0xdb, 0xaa, 0xf2, 0x88, 0x8d, 0xca, 0x80, 0xf5, + 0x39, 0xd5, 0xe7, 0x21, 0x41, 0xd7, 0x1d, 0x03, + 0x0a, 0x28, 0xa4, 0x3a, 0x3c, 0xb1, 0x83, 0x6c, + 0x74, 0x8f, 0x9c, 0xa0, 0x59, 0xc9, 0x0a, 0x23, + 0x83, 0x8d, 0x2c, 0xc1, 0xb3, 0xb3, 0xd7, 0x4c, + 0x94, 0xbb, 0xc7, 0x9c, 0xd5, 0x2f, 0xc3, 0xad, + 0x0f, 0xf7, 0x04, 0xfb, 0x02, 0x4a, 0xfd, 0x53, + 0xfc, 0x82, 0xc8, 0x9c, 0xd2, 0xc4, 0x74, 0x6b, + 0x11, 0xbb, 0x98, 0xdb, 0xc2, 0x05, 0x99, 0x41, + 0xac, 0xa0, 0x6e, 0xa9, 0x6b, 0xf7, 0xb8, 0xed, + 0x1e, 0xba, 0x6e, 0xe0, 0xbf, 0x50, 0x9c, 0x48, + 0x63, 0x99, 0x5e, 0x8b, 0xbd, 0xa2, 0xa0, 0xbf, + 0x8a, 0xe7, 0x0d, 0xe5, 0x04, 0xfe, 0x35, 0xe5, + 0x58, 0xf6, 0xdb, 0x5b, 0x18, 0xf3, 0x1d, 0xf3, + 0xb2, 0x29, 0xdf, 0xf0, 0x8d, 0x6a, 0x5f, 0xcc, + 0xef, 0x3f, 0x8d, 0x3f, 0x87, 0x13, 0xd5, 0x89, + 0xe7, 0x9f, 0xb1, 0x7c, 0x46, 0x61, 0xb9, 0x47, + 0x61, 0xf9, 0x82, 0xc2, 0xb2, 0x40, 0x61, 0x79, + 0x40, 0x61, 0x49, 0x50, 0x58, 0x38, 0x0a, 0x4b, + 0x8a, 0xc2, 0x92, 0x61, 0xb0, 0x84, 0x3e, 0x0a, + 0xcb, 0x1c, 0x85, 0x05, 0xa5, 0x8e, 0x85, 0x28, + 0x75, 0x2c, 0x44, 0xa9, 0x63, 0x21, 0x4a, 0x1d, + 0x0b, 0x51, 0xea, 0x58, 0x78, 0xad, 0x8e, 0xfd, + 0x87, 0x6e, 0xb9, 0x40, 0x39, 0x33, 0x16, 0xa2, + 0xb0, 0xe0, 0xec, 0x05, 0xe5, 0xfe, 0x19, 0x4a, + 0x1f, 0x63, 0x0c, 0x85, 0x05, 0xa5, 0x5b, 0x32, + 0x94, 0x6e, 0xc9, 0x00, 0x83, 0x25, 0x09, 0x50, + 0x58, 0x50, 0x3a, 0x4c, 0x82, 0x73, 0x62, 0x28, + 0xef, 0x0b, 0x8e, 0xf2, 0xbe, 0xe0, 0x28, 0xef, + 0x0b, 0x8e, 0xa2, 0x31, 0x8e, 0xa2, 0x31, 0x8e, + 0xf2, 0x8a, 0xe1, 0x28, 0x5d, 0x2c, 0x7d, 0x43, + 0xc9, 0x66, 0xf8, 0xc7, 0xbf, 0x51, 0x06, 0xfe, + 0x0d, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xb3, + 0x0e, 0x1a, 0x48, 0x78, 0x08, 0x00, 0x00, 0x6d, + 0x45, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x6d, + 0x73, 0x70, 0x34, 0x33, 0x30, 0x2e, 0x78, 0x73, + 0x64, 0xd5, 0x5c, 0x59, 0x8f, 0xd3, 0x30, 0x10, + 0x7e, 0x06, 0x89, 0xff, 0x50, 0xe5, 0x95, 0xa3, + 0x07, 0x37, 0x02, 0x44, 0xe9, 0x01, 0x85, 0x16, + 0x50, 0xcb, 0xb1, 0xe2, 0xd0, 0xca, 0x4d, 0xdd, + 0x36, 0x22, 0x17, 0x71, 0xb2, 0xdb, 0xe5, 0xf8, + 0xef, 0x8c, 0x9d, 0x34, 0x4e, 0x9b, 0xed, 0x7a, + 0xec, 0x04, 0x04, 0x2f, 0xd5, 0xc6, 0xfd, 0xbe, + 0x99, 0xf1, 0x78, 0x3c, 0xb6, 0xc7, 0xe9, 0x3e, + 0xdc, 0xb0, 0x07, 0xcc, 0x5e, 0x53, 0x8f, 0x34, + 0x36, 0x9e, 0xeb, 0xb3, 0x07, 0x1b, 0xf6, 0xc8, + 0x5a, 0xc7, 0x71, 0xf8, 0xa0, 0xd9, 0x3c, 0x3d, + 0x3d, 0xbd, 0x71, 0x7a, 0xf3, 0x46, 0x10, 0xad, + 0x9a, 0x9d, 0x56, 0xab, 0xdd, 0x3c, 0x9a, 0x8c, + 0x67, 0x02, 0x6a, 0x35, 0x4e, 0x68, 0xc4, 0x9c, + 0xc0, 0x7f, 0x64, 0xb5, 0x6f, 0xb4, 0xac, 0xc7, + 0x57, 0x2e, 0x5f, 0xb9, 0x7c, 0x49, 0x48, 0x72, + 0xbc, 0xd0, 0xa5, 0x6f, 0xcf, 0x42, 0xda, 0xf0, + 0x89, 0x47, 0x1f, 0x59, 0x19, 0x8e, 0xb7, 0x70, + 0xd8, 0x25, 0x81, 0x8a, 0x28, 0x8b, 0x23, 0xc7, + 0x8e, 0xe1, 0x8b, 0xc6, 0x9c, 0x30, 0x80, 0x41, + 0xe3, 0x82, 0xda, 0x8e, 0x47, 0x5c, 0x81, 0x4a, + 0x61, 0x21, 0x89, 0x63, 0x1a, 0xf9, 0x8d, 0x13, + 0xe2, 0x26, 0x80, 0xf9, 0xbc, 0xb8, 0xfa, 0xf9, + 0xc6, 0xe7, 0x85, 0xd5, 0x68, 0xa6, 0x82, 0x9a, + 0xbb, 0x92, 0xa0, 0x31, 0x6d, 0x93, 0x36, 0x48, + 0xbb, 0xec, 0x80, 0xb7, 0x6d, 0x0a, 0x86, 0x8d, + 0xbc, 0x30, 0x88, 0xe2, 0x5d, 0xbb, 0x48, 0x0c, + 0xc2, 0xe6, 0x49, 0xbc, 0xc5, 0x2c, 0x1d, 0x97, + 0x5a, 0x8d, 0x18, 0x30, 0xc2, 0x42, 0xae, 0xca, + 0x5f, 0x59, 0xcd, 0x54, 0xd3, 0xae, 0xd4, 0x0b, + 0x5c, 0xf0, 0x9c, 0x6e, 0x9e, 0x9e, 0xc5, 0x17, + 0x75, 0x5f, 0x0a, 0x3f, 0xdc, 0xfb, 0xd6, 0xcf, + 0xd6, 0xe6, 0x53, 0xeb, 0xfa, 0x7d, 0x72, 0xfd, + 0x7b, 0xf7, 0xfa, 0xc7, 0x2f, 0x3f, 0x5a, 0xd7, + 0x3a, 0xbf, 0x2c, 0x03, 0x4f, 0x9c, 0x67, 0xde, + 0x87, 0x20, 0x5a, 0xd4, 0x6e, 0xde, 0xad, 0xda, + 0xcc, 0x1b, 0x07, 0xfe, 0xaa, 0x76, 0xf3, 0xee, + 0xd5, 0x63, 0xde, 0xd3, 0x20, 0x70, 0x75, 0x6d, + 0xa3, 0x7e, 0xe2, 0xd1, 0x88, 0x00, 0x2a, 0xb7, + 0x2f, 0x8e, 0x12, 0x6a, 0x35, 0x2f, 0x84, 0x2c, + 0x89, 0xcb, 0x68, 0x2d, 0x36, 0xcf, 0x96, 0xd1, + 0x84, 0xb0, 0xaf, 0x88, 0x39, 0xa9, 0xef, 0xd6, + 0xf6, 0x9d, 0x7a, 0xfc, 0xda, 0x73, 0x03, 0xfb, + 0x6b, 0x2f, 0xf0, 0xe3, 0x28, 0x70, 0x4d, 0x0c, + 0x3d, 0xc7, 0x81, 0xcf, 0x7a, 0xbd, 0xe3, 0x57, + 0xaf, 0x5f, 0x0d, 0xac, 0xa6, 0x12, 0x36, 0x7b, + 0xdb, 0x7d, 0xd5, 0xef, 0x4e, 0xfb, 0x1a, 0xd0, + 0xe3, 0x11, 0x02, 0x3c, 0x38, 0x7a, 0x3b, 0x78, + 0xd5, 0x1f, 0xf4, 0x6b, 0x71, 0xd1, 0x5b, 0x07, + 0x54, 0x8c, 0xfc, 0x05, 0xdd, 0x20, 0x1c, 0x54, + 0xce, 0xae, 0x1e, 0xd9, 0x0c, 0x36, 0xb6, 0x9b, + 0x30, 0xe7, 0x84, 0x6e, 0x6d, 0x6c, 0xdf, 0xa9, + 0xc5, 0x32, 0x9b, 0x0f, 0xde, 0xec, 0x8c, 0xc5, + 0xd4, 0x43, 0x98, 0x86, 0x19, 0xbb, 0xa7, 0xbd, + 0xe3, 0xf6, 0x66, 0x63, 0x35, 0x55, 0xa0, 0x8e, + 0x12, 0x34, 0x1c, 0x8f, 0xdf, 0x8c, 0xdf, 0xcd, + 0x14, 0xa8, 0xc9, 0xeb, 0xfe, 0xf1, 0xeb, 0x59, + 0xaf, 0x16, 0x6f, 0x0c, 0x6a, 0xf3, 0xc2, 0x60, + 0x32, 0x38, 0xc2, 0x84, 0xb0, 0xc0, 0x8d, 0x5f, + 0x7f, 0xc0, 0xc0, 0x26, 0x83, 0xfe, 0xe8, 0xdd, + 0x04, 0x83, 0x7c, 0x3e, 0x7a, 0xf6, 0x1c, 0x83, + 0x83, 0x20, 0x9f, 0x76, 0x8f, 0x67, 0x93, 0xee, + 0x78, 0x7c, 0x7c, 0xfb, 0xe8, 0x08, 0x43, 0xd1, + 0x02, 0xa7, 0x16, 0x63, 0xd1, 0xe3, 0xee, 0xf4, + 0xd9, 0x80, 0x83, 0x6b, 0x19, 0xcb, 0x61, 0xe2, + 0xdb, 0x2e, 0x8d, 0xeb, 0x1a, 0xcf, 0x08, 0xd0, + 0xfd, 0xde, 0x6b, 0xab, 0xa9, 0x86, 0x1d, 0x21, + 0x71, 0x10, 0xdf, 0x18, 0xd8, 0x11, 0x16, 0x77, + 0xd2, 0x41, 0xc2, 0x86, 0xd3, 0xae, 0x32, 0x8c, + 0x84, 0x81, 0xd3, 0x5b, 0xea, 0xa9, 0xfc, 0x21, + 0x72, 0x62, 0x84, 0x67, 0x38, 0x0c, 0xe3, 0x19, + 0x81, 0xbb, 0x75, 0xb3, 0x35, 0xc2, 0xe0, 0xd4, + 0x9e, 0xe1, 0x30, 0x8c, 0x07, 0x39, 0x0e, 0xe1, + 0x41, 0x0e, 0x43, 0x7a, 0x70, 0x0b, 0xe5, 0x3b, + 0xb6, 0x5a, 0x02, 0x7a, 0xee, 0xc4, 0x0c, 0x11, + 0xcd, 0xdb, 0xe5, 0xe3, 0x42, 0xe3, 0xee, 0x29, + 0x8c, 0x6f, 0xdf, 0x51, 0x00, 0x3a, 0x2d, 0x05, + 0xe0, 0x66, 0xa7, 0x96, 0x4e, 0x87, 0x8c, 0x20, + 0xfa, 0x8c, 0x99, 0xc1, 0x53, 0xba, 0x4a, 0x5c, + 0x12, 0xa9, 0xe2, 0xde, 0x5f, 0x13, 0xdf, 0xa6, + 0xf5, 0x8c, 0x58, 0x37, 0xb2, 0xd7, 0x10, 0x04, + 0x76, 0x9c, 0x44, 0xb4, 0xa6, 0x5e, 0xf4, 0xc2, + 0xc4, 0x6a, 0xaa, 0x10, 0x47, 0x08, 0xc8, 0x49, + 0x3d, 0xe3, 0x33, 0xa1, 0x5e, 0x10, 0x9d, 0x41, + 0x43, 0x5d, 0x1d, 0x1c, 0xba, 0x84, 0xad, 0x15, + 0xf6, 0x4f, 0x89, 0xa7, 0x42, 0x04, 0x4a, 0x04, + 0x5d, 0x39, 0x0c, 0x36, 0xc8, 0x35, 0x7a, 0xe1, + 0x15, 0xf1, 0xea, 0xf2, 0xc2, 0xab, 0xc0, 0xa7, + 0xaa, 0x7d, 0x0f, 0x71, 0x7c, 0x05, 0x64, 0xe4, + 0x2f, 0x03, 0xd5, 0x46, 0x8c, 0xb9, 0x2a, 0x44, + 0x10, 0xc4, 0xbd, 0x60, 0x41, 0x91, 0xb0, 0x8e, + 0x55, 0x79, 0xec, 0x88, 0xa7, 0x12, 0xf2, 0x8e, + 0xcd, 0xd5, 0x72, 0xc6, 0xf6, 0x42, 0x3d, 0x0f, + 0x2e, 0x42, 0xa4, 0x1b, 0xc2, 0xca, 0x32, 0xde, + 0xd0, 0xc8, 0x09, 0xd7, 0xd0, 0xe8, 0xde, 0x83, + 0x14, 0x8e, 0x06, 0xb7, 0xef, 0x68, 0xa3, 0x55, + 0x6e, 0x1b, 0x45, 0xef, 0xa9, 0xad, 0xf2, 0x9a, + 0x33, 0x57, 0x21, 0x28, 0x91, 0x7a, 0xd5, 0x58, + 0x18, 0xa8, 0x5a, 0xe6, 0x98, 0x27, 0xe6, 0x58, + 0xd7, 0xb6, 0x29, 0x63, 0x3d, 0x48, 0x12, 0x98, + 0xb5, 0x10, 0x33, 0xd5, 0xc6, 0x70, 0x00, 0x22, + 0x73, 0x97, 0x82, 0x9d, 0x93, 0x82, 0x0a, 0x44, + 0xb8, 0xdb, 0x10, 0xee, 0x90, 0x68, 0x50, 0xf8, + 0x6d, 0xba, 0x49, 0xc1, 0xb7, 0x95, 0xbb, 0x2a, + 0x3e, 0x75, 0x23, 0x4f, 0x34, 0x89, 0x8c, 0x88, + 0x52, 0x22, 0x90, 0xc5, 0x4e, 0x74, 0x78, 0x35, + 0xab, 0xeb, 0x3a, 0x2b, 0x1f, 0x56, 0x34, 0x65, + 0x22, 0xd0, 0x50, 0x14, 0xed, 0x3a, 0xeb, 0x29, + 0x38, 0x5c, 0x93, 0x32, 0x9c, 0x6e, 0xee, 0xa3, + 0x66, 0x39, 0xca, 0x20, 0xb0, 0x1e, 0x3b, 0x12, + 0x45, 0xe8, 0xb3, 0xa9, 0x49, 0x68, 0x96, 0x2b, + 0x94, 0xce, 0x82, 0xa7, 0xbe, 0xbd, 0x0a, 0xa5, + 0xeb, 0x16, 0xec, 0x70, 0xa9, 0x47, 0xfd, 0x78, + 0xb7, 0xd2, 0x9a, 0xd6, 0x2b, 0x65, 0x59, 0xaf, + 0xe1, 0x39, 0xfe, 0x6b, 0xdb, 0x4e, 0x22, 0x28, + 0xeb, 0xe6, 0xdb, 0xab, 0x32, 0x9b, 0x25, 0xf3, + 0x6a, 0x02, 0x22, 0x7a, 0xe2, 0xec, 0xd1, 0x79, + 0x9c, 0x60, 0xe9, 0x50, 0x8d, 0x98, 0x56, 0x93, + 0x30, 0x24, 0x73, 0x43, 0xe6, 0x8c, 0xba, 0x4b, + 0xc3, 0x5e, 0xdb, 0x81, 0xbf, 0x74, 0x56, 0x82, + 0x2c, 0x6b, 0x95, 0x58, 0xf2, 0x30, 0x61, 0x94, + 0x19, 0xda, 0x4c, 0x20, 0xa2, 0x4e, 0x44, 0x08, + 0xbe, 0xa4, 0x67, 0x18, 0xfd, 0x0f, 0x9b, 0x69, + 0xf8, 0x1c, 0x2c, 0x76, 0x3b, 0xd0, 0xe9, 0x84, + 0xa7, 0xb8, 0x20, 0xe4, 0x62, 0x79, 0x16, 0x2e, + 0x63, 0xf3, 0xc1, 0x5e, 0xee, 0x81, 0xcb, 0x55, + 0x71, 0x55, 0x78, 0x9f, 0x04, 0x6e, 0x4c, 0x56, + 0x94, 0xe7, 0x24, 0x7c, 0x8c, 0xdb, 0xf6, 0xc4, + 0xf1, 0x0b, 0x25, 0xf9, 0xc4, 0x67, 0x22, 0x0f, + 0xcd, 0xd6, 0x50, 0xcc, 0xc7, 0xfa, 0x8e, 0x4b, + 0x21, 0x9b, 0x1a, 0xa4, 0x88, 0xdc, 0x56, 0x8f, + 0x41, 0x33, 0x0a, 0x28, 0x5a, 0x87, 0xac, 0x30, + 0xfc, 0x03, 0xb2, 0xaa, 0xbb, 0x2b, 0x86, 0x3c, + 0xf8, 0x3e, 0x0c, 0x85, 0x98, 0xac, 0x6e, 0xfe, + 0x7f, 0xc4, 0x29, 0xa5, 0x9e, 0x28, 0x46, 0xcb, + 0x20, 0x95, 0x3b, 0x09, 0x5e, 0xa0, 0x86, 0x2e, + 0x16, 0xfa, 0xbc, 0x81, 0x67, 0x76, 0x70, 0xbb, + 0x70, 0xa0, 0x47, 0x50, 0xc3, 0x4d, 0xfd, 0x5b, + 0xaa, 0xea, 0x72, 0xeb, 0x45, 0x3f, 0xbe, 0x25, + 0x4e, 0x54, 0x58, 0x6e, 0x9b, 0x45, 0x5d, 0x99, + 0xdf, 0xf6, 0xad, 0x32, 0xed, 0x28, 0xdb, 0xeb, + 0x29, 0xe8, 0xa6, 0x70, 0x7a, 0x2d, 0x0d, 0xec, + 0x1e, 0x4d, 0x74, 0x60, 0xcf, 0x5f, 0x7b, 0x23, + 0xdc, 0x80, 0x2c, 0x9f, 0x3e, 0xed, 0x96, 0x9a, + 0xa5, 0x92, 0x8b, 0x46, 0xb2, 0x74, 0x13, 0x87, + 0x8f, 0x03, 0x67, 0x81, 0x23, 0x6b, 0xba, 0x4b, + 0x8c, 0x15, 0x3a, 0x79, 0xbd, 0x82, 0xcf, 0x3d, + 0x33, 0xf0, 0x6b, 0xc5, 0x7b, 0xbe, 0xcf, 0x30, + 0x5c, 0x2b, 0x16, 0x74, 0x49, 0x12, 0x37, 0x9e, + 0xc5, 0x41, 0x1d, 0xd3, 0x4f, 0x19, 0xac, 0x88, + 0xf1, 0xf8, 0x77, 0x47, 0x53, 0x3f, 0xf8, 0x05, + 0x2d, 0x35, 0x48, 0x3e, 0xd7, 0x1b, 0xfc, 0xd8, + 0x0e, 0x57, 0xf3, 0xb5, 0x8e, 0xbb, 0xc4, 0x0d, + 0x8f, 0xd6, 0xd2, 0x6d, 0x17, 0x2e, 0xf4, 0x84, + 0x3d, 0xe5, 0x4b, 0x3e, 0x74, 0x40, 0xe7, 0x83, + 0xb5, 0xef, 0x76, 0xa6, 0x29, 0x45, 0x18, 0x90, + 0x4a, 0xd9, 0x4f, 0x80, 0x86, 0xb3, 0xe3, 0x9f, + 0x1b, 0xa9, 0x25, 0x25, 0xbc, 0x52, 0xc8, 0xf4, + 0x06, 0x2a, 0xbd, 0xbc, 0x13, 0xd6, 0xec, 0x36, + 0xe9, 0x38, 0xd8, 0xb5, 0x97, 0x54, 0x99, 0x70, + 0xce, 0xe1, 0xc1, 0x5a, 0x67, 0x7f, 0x85, 0x63, + 0xdd, 0x94, 0x92, 0x85, 0x09, 0x7f, 0xd4, 0xe9, + 0x99, 0xd0, 0x18, 0xe4, 0xc7, 0xa1, 0xeb, 0xf6, + 0xe7, 0x2b, 0x13, 0xf6, 0x9a, 0x30, 0x7e, 0x1a, + 0x55, 0x52, 0x95, 0x21, 0x84, 0x8e, 0x82, 0x4a, + 0x01, 0xa8, 0x13, 0x42, 0xb0, 0xd1, 0x18, 0xea, + 0x46, 0xd1, 0x5b, 0x2f, 0x52, 0xba, 0xe2, 0x1c, + 0xda, 0x8b, 0x98, 0x18, 0x79, 0xbf, 0x1f, 0xdb, + 0x26, 0xb4, 0xd9, 0x99, 0x6f, 0xc4, 0x1b, 0xf9, + 0x2c, 0x36, 0xea, 0xdf, 0x71, 0xfb, 0xe6, 0xdd, + 0xbb, 0x26, 0x44, 0xb8, 0xb2, 0xb0, 0xd7, 0x26, + 0x44, 0x48, 0x6a, 0x23, 0x9f, 0x88, 0xc2, 0x84, + 0x33, 0x77, 0xe1, 0xb8, 0x35, 0x7e, 0x33, 0x51, + 0xca, 0xf9, 0x0f, 0x83, 0x34, 0x0c, 0x4e, 0x69, + 0x34, 0xa3, 0x71, 0x0c, 0xc2, 0xf0, 0x61, 0xca, + 0x4f, 0x25, 0x50, 0x45, 0xe3, 0xaf, 0xc3, 0x60, + 0x0e, 0xd1, 0x87, 0x25, 0xf4, 0xd3, 0x3d, 0x56, + 0x35, 0x21, 0x03, 0x9f, 0xd7, 0x0c, 0xc7, 0xa1, + 0x77, 0xbb, 0x9a, 0x9c, 0xbe, 0xc3, 0xea, 0x11, + 0x74, 0xf3, 0x3d, 0xf7, 0x8c, 0x61, 0x6d, 0x24, + 0x97, 0x91, 0xf9, 0xa6, 0xaa, 0x18, 0xe9, 0x9d, + 0xaa, 0x92, 0xc0, 0x3f, 0x3a, 0xa2, 0x94, 0xb3, + 0xe1, 0x6f, 0x1f, 0x49, 0x97, 0xe9, 0x5b, 0x08, + 0x13, 0x12, 0xa2, 0x03, 0x9d, 0x8a, 0xab, 0xf7, + 0x94, 0xb7, 0xed, 0x73, 0xf6, 0xa8, 0xb3, 0xa4, + 0x9f, 0xc2, 0xfd, 0xb3, 0xae, 0x98, 0x7f, 0xd2, + 0x7d, 0x9c, 0x5b, 0xf2, 0x9f, 0xbd, 0x0e, 0x1c, + 0x9b, 0x1e, 0xde, 0xb6, 0x27, 0xfe, 0x3c, 0x48, + 0xe0, 0xb4, 0x93, 0xbe, 0x2c, 0x99, 0x19, 0xe8, + 0x9f, 0x35, 0xc2, 0x28, 0xe0, 0xf9, 0x35, 0x3b, + 0x77, 0x03, 0xd0, 0x25, 0x9b, 0xbc, 0xf3, 0xb9, + 0xdc, 0x7f, 0xa6, 0xff, 0xe2, 0x25, 0x82, 0x37, + 0x51, 0x10, 0x53, 0xe1, 0x06, 0x74, 0x0c, 0x6d, + 0xaf, 0x1b, 0x30, 0x73, 0x66, 0x87, 0x2e, 0x5f, + 0x35, 0x30, 0xa4, 0x56, 0xc8, 0x42, 0x6f, 0x4e, + 0x17, 0x18, 0xe6, 0x3f, 0x17, 0xa4, 0x85, 0x9b, + 0x29, 0x8d, 0xe5, 0x4c, 0xcc, 0x41, 0xf8, 0x3c, + 0x74, 0xb5, 0xb5, 0xd3, 0xf7, 0xf6, 0xee, 0x99, + 0xf4, 0x82, 0xe2, 0x7c, 0x98, 0x28, 0xb7, 0x0c, + 0x87, 0x92, 0x85, 0x8c, 0x33, 0x21, 0xa2, 0x1c, + 0x7e, 0xff, 0x4f, 0xde, 0x48, 0x6f, 0x9a, 0x8c, + 0x06, 0x43, 0x52, 0x75, 0xb2, 0x6d, 0x3e, 0x63, + 0xd2, 0xbf, 0xb5, 0x4e, 0xb7, 0x2c, 0x26, 0x91, + 0xe9, 0x76, 0x84, 0x39, 0xdf, 0xa9, 0x29, 0x95, + 0xae, 0xf8, 0xd3, 0xcc, 0x5c, 0xc2, 0x9c, 0xf8, + 0xf2, 0x48, 0x0e, 0xdf, 0xce, 0x35, 0x2a, 0x5d, + 0x1e, 0x09, 0x43, 0x6a, 0x74, 0x66, 0xf4, 0xb6, + 0x19, 0x46, 0xbe, 0x1f, 0xad, 0xe3, 0xed, 0x30, + 0x0d, 0x67, 0xd8, 0x55, 0x18, 0x9d, 0x78, 0x8b, + 0x73, 0xf5, 0x9c, 0xf9, 0x5b, 0xb1, 0x20, 0x51, + 0x75, 0x8e, 0x9c, 0x0b, 0x86, 0xcf, 0xb4, 0xab, + 0xa5, 0x37, 0x55, 0x2a, 0xcf, 0xb3, 0xb4, 0xe7, + 0x63, 0x72, 0x16, 0x24, 0xb1, 0x5e, 0x39, 0x2e, + 0x65, 0x96, 0x27, 0x9d, 0x85, 0x59, 0xd3, 0x75, + 0x2b, 0x72, 0x58, 0x4f, 0xd5, 0x91, 0x7a, 0x16, + 0x70, 0x37, 0x6a, 0xe3, 0xef, 0x82, 0x17, 0x94, + 0xd9, 0x91, 0x23, 0xb4, 0x19, 0x57, 0x9c, 0xd3, + 0xeb, 0x67, 0x41, 0xdf, 0x3e, 0x69, 0x25, 0x2f, + 0x67, 0xc1, 0x27, 0x91, 0x39, 0x1f, 0x4e, 0xbc, + 0x82, 0x9c, 0xfe, 0xa9, 0xc3, 0xac, 0x92, 0x36, + 0x89, 0x7c, 0xbb, 0x2e, 0xef, 0x7b, 0x57, 0xb6, + 0x69, 0xf5, 0x20, 0x2f, 0x92, 0x66, 0x82, 0x64, + 0x83, 0x8e, 0x94, 0xec, 0x9e, 0x34, 0x97, 0x23, + 0x9b, 0x74, 0x25, 0x6d, 0x4b, 0x81, 0x42, 0x8c, + 0x7c, 0xd6, 0xf2, 0x4f, 0x5a, 0x0b, 0x92, 0x62, + 0xb2, 0x26, 0x13, 0x49, 0xb2, 0xbe, 0x38, 0xd0, + 0xab, 0x2b, 0xee, 0x1c, 0xf5, 0x85, 0x8c, 0xbd, + 0x46, 0x2d, 0x3b, 0xe4, 0x61, 0x6a, 0x2b, 0x4a, + 0xb6, 0xe8, 0xca, 0xe1, 0x13, 0x2e, 0x17, 0x24, + 0x9b, 0x34, 0x25, 0x15, 0xf3, 0x9f, 0x10, 0xb5, + 0xdb, 0xf6, 0xcf, 0x9e, 0xb4, 0x64, 0x2f, 0x64, + 0xca, 0xba, 0xee, 0xc8, 0x77, 0x8e, 0xb2, 0xd4, + 0x55, 0xa2, 0x5f, 0x32, 0x3b, 0x7d, 0x9d, 0x97, + 0x73, 0xf8, 0x8f, 0xfa, 0x72, 0x9f, 0xc9, 0x9f, + 0xf8, 0xa5, 0x96, 0xd7, 0x90, 0xe6, 0x74, 0xf2, + 0x9c, 0xa0, 0x98, 0x24, 0x06, 0x41, 0x34, 0xb9, + 0xf8, 0x50, 0x13, 0xf7, 0x79, 0x92, 0x66, 0x9a, + 0x7b, 0x04, 0x59, 0x3f, 0xdd, 0x08, 0x9a, 0x69, + 0x86, 0x11, 0x64, 0x6c, 0x52, 0x11, 0x60, 0x93, + 0x0b, 0x20, 0x41, 0xac, 0x92, 0x80, 0x84, 0x00, + 0xb3, 0x9c, 0x23, 0xa8, 0xa6, 0x69, 0x46, 0x90, + 0xf5, 0xf6, 0x47, 0x82, 0x62, 0x9e, 0x8c, 0x32, + 0xfa, 0xc1, 0x2c, 0x20, 0x88, 0xf9, 0x93, 0xa4, + 0x94, 0xea, 0x23, 0xfb, 0xa9, 0xa8, 0xfc, 0x6a, + 0x9b, 0x7c, 0x3c, 0xf8, 0x7e, 0xc4, 0xf9, 0x29, + 0x2a, 0x15, 0x9d, 0xf8, 0xce, 0xb7, 0x64, 0xf7, + 0x0d, 0xbb, 0x77, 0xa2, 0x69, 0x54, 0x2c, 0xea, + 0x30, 0xe8, 0x84, 0x1d, 0x07, 0x51, 0x63, 0x03, + 0x3f, 0x78, 0x5c, 0x3f, 0xb2, 0x6e, 0x34, 0x9b, + 0x29, 0x16, 0x14, 0xf0, 0xef, 0x97, 0x0e, 0x75, + 0x17, 0xdb, 0x2f, 0x9f, 0x38, 0x52, 0x6f, 0xae, + 0xe1, 0x71, 0x49, 0xa1, 0xcc, 0x15, 0x58, 0x85, + 0x1c, 0x5b, 0x51, 0x61, 0x9e, 0x58, 0x70, 0x3a, + 0x73, 0x78, 0x45, 0xb5, 0x79, 0x5a, 0xc2, 0xa9, + 0xcd, 0xe1, 0x35, 0xa9, 0xd5, 0xd3, 0x5a, 0x51, + 0x69, 0x96, 0x10, 0xf1, 0x4e, 0xce, 0x08, 0x35, + 0xb8, 0x39, 0xcb, 0xa8, 0x48, 0x2f, 0x67, 0xe8, + 0xca, 0x4e, 0x86, 0x64, 0xac, 0xa5, 0x97, 0x13, + 0xea, 0x51, 0x0d, 0x29, 0x1d, 0xa7, 0x12, 0x80, + 0x15, 0x55, 0x6d, 0x97, 0x02, 0x6c, 0x1f, 0x33, + 0x78, 0xd5, 0x1e, 0x16, 0x17, 0x11, 0xa4, 0xea, + 0x22, 0xa5, 0xaa, 0x7a, 0xb9, 0x0a, 0xe1, 0x74, + 0x4b, 0x7c, 0x0d, 0x8a, 0xf9, 0x12, 0xa6, 0xa5, + 0x99, 0x13, 0xaa, 0xab, 0x4e, 0x57, 0x41, 0x9c, + 0xd6, 0x74, 0xe1, 0xab, 0xa8, 0x70, 0xaf, 0xfe, + 0x89, 0xd3, 0xbc, 0x47, 0xaa, 0x68, 0x42, 0xa1, + 0xb6, 0x84, 0x8c, 0xb2, 0x02, 0xa3, 0x6a, 0x90, + 0x15, 0x77, 0x0f, 0x3a, 0xca, 0x53, 0x46, 0x45, + 0xe5, 0x62, 0x07, 0x82, 0x5c, 0xf2, 0x05, 0x56, + 0x6f, 0xc9, 0x87, 0xc7, 0x7c, 0x07, 0x24, 0x76, + 0x1d, 0xd0, 0xb0, 0xfd, 0xff, 0x2a, 0xf0, 0xfc, + 0x1b, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0xaa, + 0x87, 0x2b, 0x8c, 0x78, 0x09, 0x00, 0x00, 0xbc, + 0x52, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, + 0x31, 0x35, 0x33, 0x2e, 0x78, 0x6d, 0x6c, 0xed, + 0x1c, 0xd9, 0x72, 0x9b, 0x30, 0xf0, 0x3d, 0x5f, + 0x41, 0xfb, 0xd4, 0xce, 0x34, 0x35, 0xd8, 0x71, + 0xea, 0x74, 0x5c, 0x3a, 0x8e, 0x8f, 0x36, 0x9d, + 0x38, 0x71, 0xed, 0xf4, 0x78, 0xcb, 0x28, 0x20, + 0x27, 0x4c, 0x31, 0x50, 0x84, 0x5b, 0xa7, 0x5f, + 0xdf, 0x15, 0x08, 0x0b, 0x10, 0x60, 0x39, 0x81, + 0xc4, 0x99, 0x36, 0xd3, 0x43, 0x5a, 0xed, 0x4a, + 0x7b, 0xeb, 0x42, 0xe9, 0xbe, 0x5f, 0x2d, 0x6c, + 0xe5, 0x17, 0xf6, 0x89, 0xe5, 0x3a, 0xef, 0x9e, + 0x6b, 0xaf, 0xd5, 0xe7, 0xef, 0xf5, 0xbd, 0xae, + 0x89, 0x7f, 0x59, 0x06, 0xde, 0xb7, 0x9c, 0xb9, + 0xeb, 0x2f, 0x50, 0x00, 0x6d, 0x69, 0x1c, 0x7d, + 0x4f, 0x81, 0x1f, 0x86, 0x16, 0x55, 0x18, 0x80, + 0x18, 0xbe, 0xe5, 0x51, 0x02, 0x7d, 0x3c, 0x9b, + 0x1c, 0xb4, 0xd4, 0xd1, 0xb4, 0xa9, 0xb5, 0x5b, + 0xdd, 0x46, 0xb2, 0x45, 0xe9, 0x3e, 0xdb, 0xdf, + 0x57, 0xd6, 0xed, 0x2d, 0x4d, 0x53, 0xf6, 0xf7, + 0x13, 0xbd, 0x58, 0xe6, 0x18, 0x91, 0x1f, 0x11, + 0x60, 0x0d, 0x64, 0xe3, 0xeb, 0xea, 0x6a, 0x0e, + 0x3f, 0xdd, 0x06, 0xab, 0x67, 0xb0, 0xc8, 0xf2, + 0x2a, 0x8b, 0xc8, 0x40, 0x22, 0xae, 0x0f, 0xdc, + 0x33, 0x4c, 0x8a, 0x17, 0x56, 0x45, 0xac, 0x05, + 0x5a, 0x4d, 0xd3, 0x88, 0x49, 0x08, 0x67, 0xba, + 0xb1, 0xe6, 0x9a, 0x8b, 0xd1, 0x77, 0x4d, 0x5c, + 0x28, 0x46, 0xa7, 0xa5, 0x0d, 0x22, 0x31, 0xb8, + 0x4e, 0x00, 0xda, 0x9c, 0xab, 0xa0, 0x8d, 0x12, + 0xb1, 0xe4, 0x24, 0x52, 0xd5, 0x2a, 0x24, 0x4a, + 0x0b, 0xd0, 0xf5, 0x08, 0xd2, 0xa7, 0xf8, 0x7a, + 0x69, 0x23, 0xbf, 0xdb, 0xa0, 0x15, 0xde, 0x74, + 0x65, 0x05, 0x44, 0x6f, 0xc2, 0xa0, 0x61, 0x81, + 0xc3, 0x91, 0x6f, 0xdc, 0x58, 0x01, 0x36, 0x82, + 0xa5, 0x8f, 0xf5, 0xbe, 0xb7, 0xfc, 0xfe, 0xab, + 0xd9, 0x6d, 0xa4, 0x80, 0x1c, 0x17, 0xe3, 0x85, + 0x3e, 0x1c, 0x0f, 0xbf, 0x5f, 0xce, 0xc6, 0xbd, + 0xd3, 0xd3, 0xcb, 0xf6, 0xf7, 0xef, 0xdd, 0x06, + 0xc0, 0x98, 0x6e, 0xc2, 0x96, 0xb3, 0xf3, 0xb3, + 0xe1, 0xab, 0xb0, 0x74, 0x7a, 0xfe, 0xed, 0x55, + 0x04, 0x1b, 0x0f, 0x07, 0x27, 0x5f, 0xc6, 0xac, + 0xf2, 0xf1, 0xe4, 0xc3, 0x47, 0x56, 0x1c, 0x7e, + 0xbf, 0x98, 0xf6, 0x78, 0x5f, 0x11, 0x94, 0xd7, + 0x53, 0xd4, 0x09, 0xc0, 0x69, 0x6f, 0xfa, 0x61, + 0x98, 0xa8, 0xf7, 0xcf, 0xa7, 0x17, 0x14, 0xef, + 0x20, 0xed, 0xa4, 0x86, 0xed, 0x1a, 0x3f, 0x4e, + 0x20, 0x40, 0x38, 0x8c, 0xc3, 0xfb, 0xae, 0x13, + 0xf8, 0xae, 0xad, 0x7f, 0xe8, 0xf7, 0x29, 0x1b, + 0xc3, 0xb3, 0xc1, 0x10, 0x6c, 0x9d, 0x6c, 0x62, + 0x42, 0x01, 0x42, 0x24, 0x53, 0x58, 0x9a, 0x5d, + 0xf4, 0xce, 0x06, 0xbd, 0xe9, 0x80, 0xd6, 0x38, + 0x61, 0xba, 0xed, 0xf2, 0x64, 0xcd, 0x47, 0x52, + 0x71, 0x7d, 0xda, 0x37, 0x51, 0x1a, 0x62, 0xcb, + 0x85, 0xb5, 0x00, 0x67, 0x59, 0xc3, 0xc5, 0x36, + 0xc5, 0x72, 0x4c, 0xbc, 0x7a, 0xf7, 0x3c, 0x0e, + 0x6b, 0x01, 0xd1, 0x41, 0x0b, 0xac, 0xf7, 0x06, + 0xfd, 0x6e, 0x83, 0x96, 0x0a, 0x90, 0x7e, 0x21, + 0x7b, 0x89, 0xc1, 0x9f, 0xcc, 0x4e, 0xb7, 0x11, + 0x95, 0xc5, 0x11, 0x1b, 0xf1, 0x90, 0x12, 0xdc, + 0x68, 0xa5, 0xdc, 0x4c, 0xc0, 0x28, 0x52, 0xec, + 0xb4, 0xd5, 0x6a, 0xd8, 0x69, 0x96, 0xb2, 0xd3, + 0x77, 0x17, 0x1e, 0xf2, 0x51, 0xe0, 0xfa, 0xca, + 0x50, 0x95, 0xe2, 0x0b, 0x1d, 0x55, 0xc3, 0x57, + 0x4b, 0x9a, 0x2f, 0x4d, 0x8e, 0x2f, 0x54, 0x0d, + 0x5f, 0x07, 0xa5, 0x7c, 0xe1, 0x2f, 0xb3, 0xfe, + 0x49, 0x4f, 0x4e, 0x53, 0x4d, 0xa3, 0x1a, 0x8e, + 0xda, 0x12, 0x1c, 0xc9, 0xe9, 0xa8, 0x69, 0x56, + 0xc3, 0xd1, 0xe1, 0x66, 0x8e, 0x8e, 0xe5, 0x74, + 0xd4, 0xaa, 0xc8, 0xcb, 0xdf, 0x48, 0x70, 0x24, + 0xa7, 0xa3, 0x96, 0x56, 0x0d, 0x47, 0x9d, 0x52, + 0x8e, 0xa6, 0x17, 0x72, 0x49, 0xa9, 0x53, 0xe0, + 0xd5, 0x7c, 0xdd, 0x32, 0x47, 0x4b, 0x3b, 0x98, + 0x05, 0xae, 0xa7, 0x07, 0xfe, 0x12, 0x77, 0x1b, + 0x09, 0xc8, 0x3d, 0x25, 0x38, 0x2a, 0x95, 0x20, + 0x44, 0x55, 0x2f, 0x8f, 0x5b, 0x52, 0x72, 0x1c, + 0xbd, 0x79, 0x3c, 0x39, 0x34, 0x75, 0xb3, 0x20, + 0x9a, 0xb4, 0x20, 0x9d, 0x47, 0x14, 0x44, 0xdb, + 0x2c, 0x48, 0x53, 0x5a, 0x90, 0xa3, 0x47, 0x14, + 0xa4, 0xb9, 0x59, 0x90, 0xd6, 0xe5, 0xf1, 0x1b, + 0x39, 0x41, 0xcc, 0x47, 0x14, 0xa4, 0x7c, 0x16, + 0xfb, 0x86, 0x02, 0xe3, 0xc6, 0x74, 0xaf, 0x95, + 0x90, 0x48, 0x4a, 0x9a, 0x87, 0x89, 0xf7, 0x70, + 0x09, 0x37, 0x82, 0xc9, 0x15, 0xd9, 0xb6, 0x42, + 0x80, 0xd4, 0x43, 0x57, 0x36, 0x56, 0x4e, 0x26, + 0x64, 0xaf, 0x7c, 0x31, 0x41, 0xb3, 0xda, 0xe6, + 0x19, 0x9b, 0x49, 0xaa, 0x9c, 0xb9, 0x01, 0x7e, + 0x0b, 0xbd, 0x2a, 0xb4, 0xba, 0x57, 0x2c, 0x33, + 0x8b, 0xa9, 0x35, 0x45, 0x70, 0x63, 0x11, 0x05, + 0xfe, 0x04, 0x37, 0x58, 0x99, 0x9c, 0x0c, 0xf6, + 0xa4, 0x44, 0x12, 0x78, 0xa5, 0xf9, 0xeb, 0x8e, + 0xb9, 0x2b, 0x27, 0x6f, 0xdd, 0x8d, 0x89, 0x16, + 0xcd, 0x3d, 0x77, 0xcc, 0x3b, 0x32, 0x39, 0x67, + 0x1b, 0x87, 0x90, 0x67, 0x9a, 0xe6, 0x99, 0xfb, + 0x78, 0xb4, 0x84, 0x37, 0x57, 0xc1, 0xf8, 0xeb, + 0xd7, 0xaf, 0x53, 0xf5, 0xfd, 0xfd, 0x22, 0x3a, + 0x92, 0xdc, 0x1d, 0x26, 0x36, 0x40, 0x9c, 0x61, + 0xd7, 0x0e, 0xd0, 0x35, 0xe6, 0x50, 0xde, 0x62, + 0x18, 0x63, 0xcb, 0xd1, 0xb5, 0x0e, 0xdd, 0x98, + 0xb2, 0x8a, 0x88, 0x81, 0x56, 0x7a, 0xeb, 0x90, + 0x62, 0x44, 0x15, 0x11, 0x63, 0x64, 0x23, 0x72, + 0xc3, 0x3b, 0x4a, 0x40, 0x44, 0xdc, 0x19, 0x36, + 0x60, 0x7f, 0x49, 0x9b, 0x9a, 0x6d, 0x8a, 0xcc, + 0x41, 0x22, 0xb6, 0xe7, 0xf1, 0xa6, 0x43, 0x95, + 0x62, 0x03, 0x68, 0x33, 0x36, 0xb0, 0xf8, 0x26, + 0x8d, 0x2d, 0x72, 0x1d, 0x60, 0x12, 0x7c, 0xf5, + 0x62, 0xeb, 0xb0, 0x5a, 0x52, 0x91, 0xb9, 0x4a, + 0xeb, 0xce, 0x31, 0xa2, 0xdb, 0x63, 0x92, 0xb7, + 0xbd, 0x9c, 0xdd, 0x92, 0x00, 0xf6, 0xc5, 0xe3, + 0xf3, 0xc1, 0xe5, 0xf9, 0x0c, 0x56, 0x40, 0x09, + 0x60, 0x06, 0xdd, 0x36, 0xe6, 0x98, 0x8d, 0x4c, + 0x8b, 0x99, 0xd6, 0x9f, 0x4b, 0xcb, 0xf8, 0x31, + 0xc6, 0x8b, 0x29, 0x46, 0x26, 0xc3, 0x4a, 0x82, + 0x32, 0xd8, 0x37, 0x88, 0x8c, 0x7c, 0xb4, 0x60, + 0x88, 0xac, 0x96, 0x14, 0x44, 0x64, 0xb9, 0x8b, + 0x57, 0xc1, 0x48, 0x84, 0x36, 0xf2, 0xc1, 0x9e, + 0xfb, 0x1b, 0xfb, 0x33, 0x1c, 0x04, 0x96, 0x73, + 0x4d, 0x72, 0xb4, 0x08, 0x47, 0x0f, 0x03, 0x8b, + 0xd0, 0x14, 0x7b, 0xea, 0x2d, 0xda, 0x10, 0x17, + 0x1a, 0x44, 0xb4, 0xd8, 0x90, 0x4f, 0xd9, 0xfa, + 0x4a, 0x8f, 0x67, 0x80, 0xe8, 0x40, 0xa5, 0xc7, + 0x14, 0x29, 0x68, 0x11, 0xc5, 0xd0, 0x89, 0xfb, + 0xe4, 0x74, 0xbc, 0x6d, 0xd3, 0x78, 0xc0, 0x52, + 0x31, 0xb9, 0x04, 0xbf, 0x83, 0x28, 0x90, 0xe9, + 0x89, 0x4f, 0x16, 0x96, 0x4f, 0x12, 0xb1, 0x24, + 0xea, 0x66, 0x13, 0xab, 0x4c, 0x31, 0x9a, 0xaa, + 0x26, 0x88, 0x8a, 0xf5, 0xc2, 0x78, 0x08, 0x29, + 0x42, 0xe7, 0x4f, 0xc3, 0x93, 0x76, 0x16, 0x2c, + 0xca, 0xe7, 0xcd, 0x75, 0x65, 0x8c, 0x6e, 0x95, + 0x6b, 0xec, 0x60, 0x98, 0xf4, 0xb0, 0x62, 0xb8, + 0x0e, 0x76, 0x02, 0xc5, 0x9d, 0x2b, 0x18, 0x19, + 0x37, 0x0a, 0xc4, 0x85, 0x72, 0x85, 0x08, 0x36, + 0x15, 0x38, 0x81, 0xfc, 0x74, 0xd1, 0xfb, 0x00, + 0xb3, 0xe0, 0xfe, 0xf7, 0x5e, 0xff, 0x42, 0x31, + 0x51, 0x80, 0xe2, 0x2e, 0xd8, 0x74, 0x37, 0x87, + 0x39, 0x13, 0x8e, 0x13, 0x57, 0xab, 0x55, 0xe3, + 0x00, 0xfe, 0x61, 0x84, 0xd1, 0x19, 0x25, 0xd9, + 0xca, 0xcb, 0xea, 0x52, 0x48, 0x15, 0xc6, 0x7a, + 0xd8, 0x08, 0xd8, 0xda, 0x07, 0x1f, 0x3e, 0x68, + 0x0a, 0xbd, 0x2c, 0xd7, 0x3d, 0xda, 0x47, 0x4f, + 0xcc, 0x33, 0x54, 0xf5, 0xee, 0xce, 0x41, 0xc7, + 0xbc, 0x83, 0x7f, 0x18, 0x2a, 0x7a, 0x28, 0xff, + 0x30, 0xee, 0xeb, 0x1f, 0xe8, 0xee, 0xfe, 0x91, + 0x3a, 0xce, 0x5d, 0xe0, 0x85, 0xeb, 0xdf, 0x9e, + 0xa2, 0x5b, 0x77, 0xc9, 0x38, 0xcf, 0x34, 0x85, + 0x8b, 0xef, 0x77, 0xcf, 0x8f, 0x5d, 0x37, 0xa0, + 0xa7, 0xe2, 0x79, 0x4b, 0xbb, 0xe0, 0xd6, 0x83, + 0x23, 0x09, 0x77, 0xd1, 0x6d, 0xd0, 0x12, 0x47, + 0x48, 0x1f, 0x92, 0x6b, 0x87, 0xd9, 0x43, 0x72, + 0x7e, 0xcc, 0x1f, 0x20, 0x3f, 0x74, 0x96, 0x1e, + 0xb5, 0x5b, 0x58, 0xcb, 0xc3, 0xb2, 0xfe, 0xd0, + 0x45, 0x61, 0xb8, 0x4e, 0xa2, 0xe5, 0x3c, 0x14, + 0x7c, 0xbd, 0x80, 0x3c, 0x3a, 0x8b, 0x30, 0xe1, + 0x28, 0x86, 0x03, 0x72, 0xf9, 0x42, 0xce, 0x0f, + 0xa2, 0x03, 0x5a, 0x54, 0x10, 0x11, 0x16, 0xc8, + 0xf3, 0x70, 0xbc, 0x44, 0x60, 0x15, 0x11, 0xcb, + 0xf3, 0x5d, 0x7a, 0xa8, 0x4f, 0x4d, 0xc0, 0x50, + 0x39, 0x24, 0x1e, 0x56, 0x54, 0x6c, 0xcf, 0x80, + 0x20, 0x64, 0x83, 0xe6, 0xab, 0x94, 0xea, 0xdc, + 0x00, 0x9d, 0x83, 0x6a, 0x23, 0xe4, 0x42, 0x05, + 0x37, 0xb2, 0x5d, 0x8a, 0x6d, 0xfa, 0x9e, 0xb0, + 0x85, 0x7b, 0x74, 0x73, 0x23, 0x6e, 0x6e, 0x96, + 0xac, 0x4c, 0x6b, 0x3e, 0xc7, 0x3e, 0x9d, 0x0a, + 0x43, 0xb0, 0x82, 0x4c, 0xd3, 0x07, 0x91, 0x14, + 0xcf, 0x25, 0xc4, 0x02, 0x6d, 0x16, 0x7a, 0x45, + 0x87, 0x39, 0x85, 0xd8, 0x11, 0x85, 0xca, 0xf4, + 0xf3, 0xdf, 0x75, 0x0a, 0x5d, 0x27, 0xbb, 0x4d, + 0x2a, 0x73, 0x1c, 0x62, 0xd7, 0xeb, 0x33, 0xaa, + 0x44, 0x8a, 0xe8, 0xfc, 0x3b, 0x29, 0x82, 0xd8, + 0x6b, 0x13, 0x7f, 0x98, 0xde, 0xcf, 0xc8, 0xe5, + 0x56, 0x6d, 0xd6, 0x6a, 0xd6, 0xd1, 0xa8, 0x2f, + 0x61, 0xd7, 0x83, 0xff, 0x76, 0xbd, 0xb7, 0x5d, + 0xcb, 0xf3, 0x3e, 0x8c, 0xdb, 0xa8, 0xdd, 0xd8, + 0xff, 0x63, 0xb8, 0x36, 0x5b, 0xcb, 0x27, 0x6a, + 0xf8, 0x26, 0xa1, 0xd8, 0xc8, 0xf8, 0xda, 0x82, + 0x43, 0x15, 0x3f, 0xe2, 0xa5, 0xd0, 0x92, 0x9b, + 0x8d, 0xa8, 0x3d, 0xb8, 0x0d, 0xe7, 0xc8, 0x26, + 0x6b, 0x23, 0xca, 0x68, 0x29, 0xad, 0x95, 0x21, + 0x5e, 0xd4, 0xaf, 0x95, 0xce, 0x53, 0xd3, 0xca, + 0x18, 0x59, 0x4e, 0xb1, 0x5a, 0xd0, 0xfd, 0x33, + 0x42, 0x5f, 0x26, 0x23, 0x1c, 0xa8, 0x3b, 0x9d, + 0x12, 0xa8, 0x8e, 0x2b, 0xcb, 0x09, 0xf4, 0x88, + 0x71, 0x9c, 0xc0, 0x3d, 0x46, 0xb4, 0x6f, 0xda, + 0x54, 0x40, 0xf5, 0xdb, 0x87, 0x0f, 0x8b, 0x26, + 0xd1, 0xd8, 0xeb, 0xcf, 0x99, 0x72, 0x31, 0xd9, + 0x52, 0x98, 0x6a, 0xe9, 0x10, 0xf4, 0xc9, 0xaa, + 0x9c, 0x20, 0xcf, 0x88, 0x21, 0xb6, 0x60, 0x45, + 0x51, 0x67, 0xe4, 0x07, 0xfb, 0xb2, 0x8a, 0x16, + 0x4b, 0x30, 0xbd, 0xdf, 0x26, 0x3d, 0xde, 0x0f, + 0x8f, 0xa7, 0xa1, 0x5c, 0x20, 0x53, 0x63, 0xa3, + 0x50, 0x72, 0x49, 0x71, 0x9b, 0x09, 0xb0, 0x76, + 0x57, 0x9f, 0x6b, 0x12, 0xae, 0x3e, 0xdf, 0x39, + 0x4f, 0xaf, 0xc0, 0x71, 0xd9, 0xce, 0x6c, 0x49, + 0x70, 0x74, 0x43, 0x47, 0x81, 0x70, 0x67, 0xa4, + 0x18, 0x80, 0x42, 0x4f, 0x3e, 0xcf, 0xce, 0x95, + 0xf1, 0xe4, 0xcb, 0x16, 0x7d, 0x8f, 0xa6, 0xab, + 0x23, 0xc9, 0xbe, 0x0b, 0x3b, 0x5e, 0x78, 0x4b, + 0x26, 0x3a, 0x94, 0xe2, 0x6e, 0x20, 0x26, 0x58, + 0x37, 0xe8, 0x1a, 0x4e, 0x60, 0xed, 0x5b, 0xc5, + 0x0a, 0xbb, 0xa0, 0x97, 0x8a, 0xe8, 0x17, 0xb2, + 0x6c, 0x1a, 0xdd, 0xaf, 0x95, 0x73, 0xb8, 0x60, + 0xf4, 0x7f, 0x5b, 0x30, 0x82, 0xe9, 0x2a, 0x8e, + 0x1b, 0x28, 0xa1, 0xbf, 0xae, 0x29, 0xe5, 0x02, + 0x95, 0x0d, 0xd9, 0x8b, 0x87, 0xbc, 0xa2, 0x77, + 0x1a, 0x30, 0x1e, 0x3b, 0xa6, 0x53, 0xc8, 0xd2, + 0xf3, 0x5c, 0x3f, 0xee, 0xdb, 0x5b, 0x13, 0xd6, + 0x17, 0xe0, 0x8c, 0x23, 0x1c, 0x9e, 0x49, 0x35, + 0xcc, 0xe8, 0x6c, 0x49, 0x81, 0xa6, 0xa7, 0x17, + 0xf9, 0xf2, 0xcb, 0x21, 0x7a, 0x0b, 0x55, 0x6b, + 0xdc, 0x6b, 0x1d, 0x89, 0xb8, 0x6f, 0xee, 0x5c, + 0xdc, 0xff, 0x4b, 0x33, 0x5c, 0xf3, 0x9f, 0x98, + 0xe1, 0xfe, 0x7b, 0x7a, 0xb5, 0x33, 0x5c, 0x15, + 0xb3, 0x50, 0x50, 0xe3, 0xd4, 0xb9, 0x2b, 0x33, + 0x1c, 0x4a, 0xcd, 0x70, 0xe1, 0xa0, 0x6b, 0x11, + 0xe8, 0x83, 0x0b, 0xe5, 0x05, 0xbd, 0xdb, 0x7c, + 0x29, 0x4c, 0x74, 0x29, 0x96, 0x80, 0x8c, 0x7e, + 0xd6, 0xc3, 0x26, 0xc7, 0xfa, 0x52, 0x80, 0x30, + 0x07, 0x5e, 0xa1, 0x70, 0x0e, 0x0c, 0x6f, 0xd3, + 0x4e, 0xce, 0x46, 0xe7, 0x4a, 0xe4, 0x2e, 0x4f, + 0x2f, 0x55, 0xc8, 0x4f, 0x89, 0x13, 0x0c, 0x0f, + 0x57, 0xc0, 0xfe, 0xc8, 0xd6, 0x0e, 0x41, 0x29, + 0x77, 0xdf, 0x17, 0xcb, 0x26, 0x8e, 0xcd, 0x59, + 0xe3, 0xf0, 0x89, 0xe6, 0x8c, 0x58, 0x45, 0x11, + 0x66, 0x7b, 0xb5, 0xaa, 0xee, 0x94, 0xa7, 0xd4, + 0x66, 0xcd, 0xfa, 0x8d, 0xd6, 0xdc, 0x6c, 0xb5, + 0xd1, 0xf0, 0xa9, 0xe6, 0xfa, 0x3a, 0xed, 0x06, + 0xb3, 0xb4, 0xbc, 0x21, 0x6b, 0xb7, 0xe3, 0x46, + 0x23, 0x6a, 0xbb, 0x77, 0xfa, 0xb2, 0x03, 0x56, + 0x2c, 0xcf, 0xa0, 0x17, 0x96, 0x73, 0x0b, 0x2b, + 0xaa, 0x5a, 0x57, 0x5b, 0x87, 0x9b, 0x2d, 0xd7, + 0xdb, 0x31, 0xbb, 0xd5, 0xb6, 0xa7, 0x88, 0xf4, + 0xed, 0x98, 0x2e, 0x5b, 0x47, 0x55, 0x71, 0xf5, + 0xb9, 0x4d, 0xd0, 0xee, 0x88, 0xbd, 0xd1, 0x8e, + 0xd9, 0xfb, 0x31, 0xcd, 0x27, 0x1f, 0xac, 0x75, + 0x1b, 0xae, 0x29, 0x73, 0xc6, 0xbd, 0xdb, 0xb7, + 0x5e, 0x62, 0xb0, 0x56, 0x11, 0x35, 0x3b, 0xa1, + 0xf8, 0x9d, 0xba, 0x5a, 0xbe, 0x8b, 0xfb, 0x9e, + 0x5a, 0x57, 0xb5, 0x5e, 0xda, 0x8e, 0x7a, 0x32, + 0x37, 0xf4, 0xed, 0xdd, 0x5b, 0x25, 0x6c, 0xe3, + 0xc0, 0x5b, 0xa5, 0xab, 0x8a, 0xbf, 0xb1, 0xd9, + 0x26, 0x64, 0xea, 0x36, 0xf6, 0x81, 0x4c, 0xc8, + 0xb4, 0x76, 0xcf, 0xd6, 0x8f, 0x64, 0xba, 0x74, + 0x94, 0x6e, 0xb5, 0xce, 0xff, 0x42, 0xae, 0xea, + 0xce, 0x7f, 0x9a, 0x21, 0x61, 0xcc, 0xdd, 0x9b, + 0x78, 0x64, 0x6d, 0x19, 0x6a, 0xf0, 0xb1, 0xcd, + 0x78, 0x8a, 0x11, 0xdf, 0xb1, 0xd5, 0xbe, 0x59, + 0x83, 0x27, 0x6f, 0x32, 0x16, 0x7d, 0xa2, 0x06, + 0x7d, 0xc8, 0xed, 0xda, 0x46, 0xab, 0xd6, 0x1d, + 0x9c, 0x4d, 0x99, 0xe0, 0xdc, 0xad, 0xbd, 0x77, + 0x25, 0xaa, 0xfd, 0x42, 0xc8, 0x43, 0x06, 0x0c, + 0x96, 0xd3, 0xf2, 0xee, 0x28, 0xf9, 0xa9, 0x46, + 0x8c, 0x61, 0xd6, 0x1a, 0x2e, 0x47, 0x12, 0x66, + 0x6c, 0xef, 0x8e, 0x15, 0x37, 0xeb, 0x34, 0xc2, + 0x10, 0x5f, 0x60, 0x74, 0xe7, 0x4b, 0x27, 0x3c, + 0xe7, 0x1f, 0xa3, 0xec, 0x73, 0xd6, 0x63, 0xdb, + 0xfd, 0x3d, 0x82, 0xab, 0x20, 0x3d, 0x2e, 0x8c, + 0x7c, 0xaa, 0xd9, 0xb8, 0xb6, 0xc9, 0x5e, 0xdf, + 0x90, 0x15, 0xc0, 0xdb, 0xed, 0x21, 0xbc, 0x99, + 0x9c, 0xb8, 0xb6, 0xfd, 0x69, 0x16, 0xc0, 0x03, + 0x34, 0xf0, 0xa0, 0x6e, 0x83, 0xb7, 0xb0, 0xfb, + 0x8f, 0xf0, 0x92, 0x46, 0x78, 0x40, 0x14, 0x3f, + 0x48, 0x23, 0xe5, 0x8e, 0x32, 0xbb, 0x75, 0x8c, + 0x4f, 0x70, 0x49, 0x74, 0xd9, 0x23, 0x04, 0xfb, + 0xc1, 0xc4, 0xf5, 0x2f, 0x67, 0xe8, 0x17, 0xa6, + 0xbf, 0x07, 0x08, 0x9e, 0x41, 0xea, 0xe5, 0xcd, + 0xe1, 0xaf, 0x4b, 0x2a, 0x47, 0x29, 0x1a, 0x0e, + 0x9a, 0x4d, 0x8b, 0x6a, 0x0e, 0xd9, 0x29, 0xf4, + 0x52, 0x04, 0x3e, 0xa4, 0x88, 0x54, 0x32, 0xe8, + 0x14, 0x13, 0x78, 0xb1, 0x1e, 0x37, 0x5e, 0x4e, + 0xb1, 0x8d, 0x41, 0x43, 0xb4, 0x03, 0xbd, 0xb8, + 0x29, 0x1c, 0xa8, 0xb8, 0x59, 0x18, 0x02, 0x99, + 0x70, 0x1c, 0x72, 0x7c, 0x1b, 0xc0, 0x9b, 0x51, + 0x56, 0xf9, 0xe6, 0xfa, 0x26, 0x61, 0xdd, 0xf0, + 0x56, 0x81, 0x90, 0xe3, 0x8a, 0x84, 0x09, 0x40, + 0x01, 0xe1, 0x67, 0xfa, 0x22, 0x56, 0x4f, 0x56, + 0x62, 0x42, 0xde, 0x9a, 0xf1, 0x2c, 0x7a, 0x43, + 0xb5, 0xe6, 0x26, 0xae, 0xf1, 0x31, 0x53, 0xed, + 0x02, 0x2d, 0xc7, 0x2e, 0xa4, 0x2d, 0x60, 0x18, + 0x1c, 0x76, 0x00, 0x57, 0x87, 0xc3, 0x95, 0x71, + 0x83, 0x9c, 0x6b, 0xac, 0x67, 0xea, 0x21, 0x7d, + 0x06, 0x96, 0x75, 0x1e, 0x78, 0x21, 0x65, 0xe3, + 0x59, 0x80, 0x3d, 0x9d, 0x17, 0x43, 0x3a, 0x5e, + 0xcd, 0xd1, 0x52, 0xcf, 0xb6, 0xe1, 0x33, 0x5a, + 0x88, 0x1d, 0xa2, 0xa7, 0xab, 0x21, 0x69, 0x0a, + 0x94, 0x2b, 0x6f, 0xa2, 0x35, 0x53, 0xe7, 0x32, + 0x17, 0xf6, 0x30, 0x81, 0xdf, 0x43, 0x06, 0x7f, + 0x43, 0x4c, 0xf8, 0x3f, 0xab, 0x93, 0x15, 0x3c, + 0xcb, 0x0e, 0xf0, 0x08, 0xb2, 0x88, 0x8d, 0x03, + 0x3d, 0x5d, 0x0d, 0x69, 0x32, 0x18, 0xb9, 0x49, + 0x62, 0x06, 0x3e, 0x8a, 0x40, 0x5b, 0xe9, 0x2a, + 0xfc, 0x7a, 0xb2, 0x34, 0xa0, 0xe4, 0x72, 0x33, + 0x95, 0x62, 0xd2, 0x09, 0x07, 0x72, 0xca, 0x1b, + 0x3a, 0x55, 0xa5, 0x80, 0x39, 0xd9, 0xeb, 0x7e, + 0xfd, 0x65, 0x32, 0x19, 0x7f, 0x29, 0xbb, 0x5d, + 0x3a, 0x13, 0x8c, 0x47, 0xb3, 0xee, 0x3a, 0x2c, + 0x72, 0x1c, 0x56, 0xc4, 0x11, 0x25, 0xab, 0xa0, + 0xd3, 0xcd, 0xe2, 0xb1, 0xe7, 0x9e, 0x25, 0x33, + 0x50, 0xee, 0x54, 0xd3, 0x9d, 0x47, 0x8e, 0x01, + 0xc0, 0x12, 0x4d, 0xc0, 0xea, 0x8d, 0x70, 0x27, + 0x0b, 0x2b, 0xd3, 0x03, 0x8d, 0x5a, 0x21, 0xd5, + 0x22, 0x8a, 0x7e, 0x97, 0x5e, 0x98, 0xac, 0x23, + 0x69, 0x31, 0x73, 0x3a, 0x06, 0x9d, 0x8d, 0xa6, + 0xbd, 0x71, 0x59, 0xcf, 0xed, 0x23, 0x69, 0xdd, + 0xd1, 0x9f, 0x3d, 0xe1, 0xe3, 0x87, 0xb8, 0xdb, + 0xd0, 0x80, 0x7c, 0xc4, 0x64, 0x53, 0x5a, 0xfd, + 0x5c, 0xd1, 0x11, 0x24, 0xfe, 0xfd, 0x92, 0x50, + 0x12, 0x7e, 0x21, 0xa5, 0xbe, 0xf7, 0x17, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0xcf, 0x58, 0x43, 0x50, 0x72, 0x35, 0x2f, + 0x6a, 0x77, 0x09, 0x00, 0x00, 0xbd, 0x52, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, + 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, 0x31, 0x35, + 0x35, 0x2e, 0x78, 0x6d, 0x6c, 0xed, 0x1c, 0xd9, + 0x72, 0xd3, 0x30, 0xf0, 0xbd, 0x5f, 0x61, 0x78, + 0x82, 0x19, 0x8a, 0xe3, 0xa4, 0x29, 0x29, 0x13, + 0xcc, 0xa4, 0x39, 0xa0, 0x4c, 0xd3, 0x86, 0xa4, + 0x1c, 0x6f, 0x1d, 0xd5, 0x56, 0x5a, 0x0f, 0x4e, + 0x6c, 0x2c, 0x07, 0x52, 0xbe, 0x9e, 0x95, 0x2d, + 0x47, 0xb6, 0x65, 0x3b, 0x4a, 0x6a, 0xb7, 0xc9, + 0x40, 0x87, 0x43, 0x5a, 0xed, 0x4a, 0x7b, 0xeb, + 0xb2, 0xda, 0x7e, 0xbf, 0x9c, 0xd9, 0xca, 0x2f, + 0xec, 0x11, 0xcb, 0x99, 0xbf, 0x7b, 0xae, 0xbd, + 0xae, 0x3d, 0x7f, 0xaf, 0x1f, 0xb4, 0x4d, 0xfc, + 0xcb, 0x32, 0xf0, 0xa1, 0x35, 0x9f, 0x3a, 0xde, + 0x0c, 0xf9, 0xd0, 0x96, 0xc4, 0xd1, 0x0f, 0x14, + 0xf8, 0x61, 0x68, 0x61, 0x85, 0x01, 0x88, 0xe1, + 0x59, 0x2e, 0x25, 0xd0, 0x87, 0x93, 0xd1, 0x51, + 0xa3, 0x36, 0x18, 0xd7, 0xb5, 0x66, 0xb3, 0xad, + 0xc6, 0x5b, 0x94, 0xf6, 0xb3, 0xc3, 0x43, 0x65, + 0xd5, 0xde, 0xd0, 0x34, 0xe5, 0xf0, 0x30, 0xd6, + 0x8b, 0x65, 0x0e, 0x11, 0xf9, 0x11, 0x02, 0x56, + 0x40, 0x36, 0xbe, 0x5e, 0x5b, 0x4e, 0xe1, 0xa7, + 0xad, 0xb2, 0x7a, 0x0a, 0x8b, 0x2c, 0x6e, 0xd2, + 0x88, 0x0c, 0x24, 0xe2, 0x7a, 0xc0, 0x3d, 0xc3, + 0xa4, 0x78, 0x41, 0x55, 0xc4, 0x9a, 0xa1, 0xe5, + 0x38, 0x89, 0x18, 0x87, 0x70, 0xa6, 0xd5, 0x15, + 0xd7, 0x5c, 0x8c, 0xae, 0x63, 0xe2, 0x5c, 0x31, + 0x5a, 0x0d, 0xad, 0x1f, 0x8a, 0xc1, 0x75, 0x02, + 0xd0, 0xfa, 0xb4, 0x06, 0xda, 0x28, 0x10, 0x4b, + 0x4e, 0xa2, 0x5a, 0xad, 0x0c, 0x89, 0x92, 0x02, + 0xb4, 0x5d, 0x82, 0xf4, 0x31, 0xbe, 0x5d, 0xd8, + 0xc8, 0x6b, 0xab, 0xb4, 0xc2, 0x9b, 0x6e, 0x2c, + 0x9f, 0xe8, 0x75, 0x18, 0x34, 0x28, 0x70, 0x38, + 0xf2, 0x8c, 0x3b, 0xcb, 0xc7, 0x86, 0xbf, 0xf0, + 0xb0, 0xde, 0x75, 0x17, 0xdf, 0x7f, 0xd5, 0xdb, + 0x6a, 0x02, 0xc8, 0x71, 0x31, 0x9e, 0xe9, 0xfd, + 0x61, 0xff, 0xfb, 0xf5, 0x64, 0xd8, 0x39, 0x3f, + 0xbf, 0x6e, 0x7e, 0xff, 0xde, 0x56, 0x01, 0xc6, + 0x74, 0x13, 0xb4, 0x5c, 0x5c, 0x5e, 0xf4, 0x5f, + 0x05, 0xa5, 0xf3, 0xcb, 0x6f, 0xaf, 0x42, 0xd8, + 0xb0, 0xdf, 0x3b, 0xfb, 0x32, 0x64, 0x95, 0x8f, + 0x67, 0x1f, 0x3e, 0xb2, 0x62, 0xff, 0xfb, 0xd5, + 0xb8, 0xc3, 0xfb, 0x0a, 0xa1, 0xbc, 0x9e, 0xa0, + 0x8e, 0x01, 0xce, 0x3b, 0xe3, 0x0f, 0xfd, 0x58, + 0xbd, 0x7b, 0x39, 0xbe, 0xa2, 0x78, 0x47, 0x49, + 0x27, 0x35, 0x6c, 0xc7, 0xf8, 0x71, 0x06, 0x01, + 0xc2, 0x61, 0x1c, 0xde, 0x75, 0xe6, 0xbe, 0xe7, + 0xd8, 0xfa, 0x87, 0x6e, 0x97, 0xb2, 0xd1, 0xbf, + 0xe8, 0xf5, 0x7b, 0x6d, 0x35, 0xde, 0xc4, 0x84, + 0x02, 0x84, 0x50, 0xa6, 0xa0, 0x34, 0xb9, 0xea, + 0x5c, 0xf4, 0x3a, 0xe3, 0x1e, 0xad, 0x71, 0xc2, + 0x64, 0xdb, 0xf5, 0xd9, 0x8a, 0x8f, 0xb8, 0xe2, + 0xba, 0xb4, 0x6f, 0xa2, 0xa8, 0x62, 0xcb, 0x95, + 0x35, 0x03, 0x67, 0x59, 0xc1, 0xc5, 0x36, 0xc5, + 0x9a, 0x9b, 0x78, 0xf9, 0xee, 0x79, 0x14, 0xd6, + 0x02, 0xe2, 0x1c, 0xcd, 0xb0, 0xde, 0xe9, 0x75, + 0xdb, 0x2a, 0x2d, 0xe5, 0x20, 0xfd, 0x42, 0xf6, + 0x02, 0x83, 0x3f, 0x99, 0xad, 0xb6, 0x1a, 0x96, + 0xc5, 0x11, 0xd5, 0x68, 0x48, 0x09, 0x6e, 0xb4, + 0x42, 0x6e, 0x46, 0x60, 0x14, 0x29, 0x76, 0x9a, + 0xb5, 0x72, 0xd8, 0xa9, 0x17, 0xb2, 0xd3, 0x75, + 0x66, 0x2e, 0xf2, 0x90, 0xef, 0x78, 0x4a, 0xbf, + 0x26, 0xc5, 0x17, 0x3a, 0x29, 0x87, 0xaf, 0x86, + 0x34, 0x5f, 0x9a, 0x1c, 0x5f, 0xa8, 0x1c, 0xbe, + 0x8e, 0x0a, 0xf9, 0xc2, 0x5f, 0x26, 0xdd, 0xb3, + 0x8e, 0x9c, 0xa6, 0xea, 0x46, 0x39, 0x1c, 0x35, + 0x25, 0x38, 0x92, 0xd3, 0x51, 0xdd, 0x2c, 0x87, + 0xa3, 0xe3, 0xf5, 0x1c, 0x9d, 0xca, 0xe9, 0xa8, + 0x51, 0x92, 0x97, 0xbf, 0x91, 0xe0, 0x48, 0x4e, + 0x47, 0x0d, 0xad, 0x1c, 0x8e, 0x5a, 0x85, 0x1c, + 0x8d, 0xaf, 0xe4, 0x92, 0x52, 0x2b, 0xc7, 0xab, + 0xf9, 0xba, 0x65, 0x8a, 0x16, 0xb6, 0x3f, 0xf1, + 0x1d, 0x57, 0xf7, 0xbd, 0x05, 0x6e, 0xab, 0x31, + 0xc8, 0x03, 0x25, 0x38, 0x29, 0x94, 0x20, 0x40, + 0xad, 0x5d, 0x9f, 0x36, 0xa4, 0xe4, 0x38, 0x79, + 0xf3, 0x74, 0x72, 0x68, 0xb5, 0xf5, 0x82, 0x68, + 0xd2, 0x82, 0xb4, 0x9e, 0x50, 0x10, 0x6d, 0xbd, + 0x20, 0x75, 0x69, 0x41, 0x4e, 0x9e, 0x50, 0x90, + 0xfa, 0x7a, 0x41, 0x1a, 0xd7, 0xa7, 0x6f, 0xe4, + 0x04, 0x31, 0x9f, 0x50, 0x90, 0xe2, 0x59, 0xec, + 0x1b, 0xf2, 0x8d, 0x3b, 0xd3, 0xb9, 0x55, 0x02, + 0x22, 0x29, 0x69, 0x1e, 0x27, 0xde, 0x83, 0x25, + 0xdc, 0x00, 0x26, 0x57, 0x64, 0xdb, 0x0a, 0x01, + 0x52, 0x17, 0xdd, 0xd8, 0x58, 0x39, 0x1b, 0x91, + 0x83, 0xe2, 0xc5, 0x04, 0xcd, 0x6a, 0xeb, 0x67, + 0x6c, 0x26, 0xa9, 0x72, 0xe1, 0xf8, 0xf8, 0x2d, + 0xf4, 0xaa, 0xd0, 0xea, 0x41, 0xbe, 0xcc, 0x2c, + 0xa6, 0x56, 0x14, 0xfe, 0x9d, 0x45, 0x14, 0xf8, + 0xe3, 0xdf, 0x61, 0x65, 0x74, 0xd6, 0x3b, 0x90, + 0x12, 0x49, 0xe0, 0x95, 0xe6, 0xaf, 0x2d, 0x73, + 0x57, 0x46, 0xde, 0xda, 0x8e, 0x89, 0x06, 0xcd, + 0x3d, 0x5b, 0xe6, 0x1d, 0x99, 0x9c, 0xb3, 0x89, + 0x43, 0xc8, 0x33, 0x4d, 0xf3, 0xcc, 0x43, 0x3c, + 0x5a, 0xc2, 0x9b, 0xcb, 0x60, 0xfc, 0xf5, 0xeb, + 0xd7, 0x89, 0xfa, 0xe1, 0x61, 0x1e, 0x1d, 0x89, + 0xef, 0x0e, 0x63, 0x1b, 0x20, 0xce, 0xb0, 0x63, + 0xfb, 0xe8, 0x16, 0x73, 0x28, 0x6f, 0x31, 0x8c, + 0xa1, 0x35, 0xd7, 0xb5, 0x16, 0xdd, 0x98, 0xb2, + 0x8a, 0x88, 0x81, 0x96, 0x7a, 0xe3, 0x98, 0x62, + 0x84, 0x15, 0x11, 0x63, 0x60, 0x23, 0x72, 0xc7, + 0x3b, 0x8a, 0x41, 0x44, 0xdc, 0x09, 0x36, 0x60, + 0x7f, 0x49, 0x9b, 0xea, 0x4d, 0x8a, 0xcc, 0x41, + 0x22, 0xb6, 0xeb, 0xf2, 0xa6, 0xe3, 0x1a, 0xc5, + 0x06, 0xd0, 0x7a, 0x6c, 0x60, 0xf1, 0x4d, 0x12, + 0x5b, 0xe4, 0xda, 0xc7, 0xc4, 0xff, 0xea, 0x46, + 0xd6, 0x61, 0xb5, 0xb8, 0x22, 0x33, 0x95, 0xd6, + 0x9e, 0x62, 0x44, 0xb7, 0xc7, 0x24, 0x6b, 0x7b, + 0x39, 0xb9, 0x27, 0x3e, 0xec, 0x8b, 0x87, 0x97, + 0xbd, 0xeb, 0xcb, 0x09, 0xac, 0x80, 0x62, 0xc0, + 0x14, 0xba, 0x6d, 0x4c, 0x31, 0x1b, 0x99, 0x16, + 0x53, 0xad, 0x3f, 0x17, 0x96, 0xf1, 0x63, 0x88, + 0x67, 0x63, 0x8c, 0x4c, 0x86, 0x15, 0x07, 0xa5, + 0xb0, 0xef, 0x10, 0x19, 0x78, 0x68, 0xc6, 0x10, + 0x59, 0x2d, 0x2e, 0x88, 0xc8, 0x72, 0x1b, 0x2f, + 0xfd, 0x81, 0x08, 0x55, 0xb3, 0xc1, 0xae, 0xf3, + 0x1b, 0x7b, 0x13, 0xec, 0xfb, 0xd6, 0xfc, 0x96, + 0x64, 0x68, 0x11, 0x8e, 0x1e, 0x7a, 0x16, 0xa1, + 0x29, 0xf6, 0xdc, 0x9d, 0x35, 0x21, 0x2e, 0x34, + 0x88, 0x68, 0xb1, 0x21, 0x9b, 0xb2, 0xf1, 0x95, + 0x1e, 0xcf, 0x00, 0xd1, 0x51, 0x8d, 0x1e, 0x53, + 0x24, 0xa0, 0x79, 0x14, 0xfd, 0x79, 0xd4, 0x27, + 0xa7, 0xe3, 0x6d, 0xeb, 0xc6, 0x03, 0x96, 0xf2, + 0xc9, 0x25, 0xf8, 0xed, 0x85, 0x81, 0x4c, 0x4f, + 0x7c, 0xd2, 0xb0, 0x6c, 0x92, 0x90, 0x25, 0x51, + 0x37, 0xeb, 0x58, 0x65, 0x8a, 0xd1, 0x6a, 0xb5, + 0x18, 0x51, 0xbe, 0x5e, 0x18, 0x0f, 0x01, 0x45, + 0xe0, 0xfc, 0x49, 0x78, 0xdc, 0xce, 0x82, 0x45, + 0xf9, 0xbc, 0xb9, 0xaa, 0x0c, 0xd1, 0xbd, 0x72, + 0x8b, 0xe7, 0x18, 0x26, 0x3d, 0xac, 0x18, 0xce, + 0x1c, 0xcf, 0x7d, 0xc5, 0x99, 0x2a, 0x18, 0x19, + 0x77, 0x0a, 0xc4, 0x85, 0x72, 0x83, 0x08, 0x36, + 0x15, 0x38, 0x81, 0xfc, 0x74, 0xd5, 0xf9, 0x00, + 0xb3, 0xe0, 0xe1, 0xf7, 0x4e, 0xf7, 0x4a, 0x31, + 0x91, 0x8f, 0xa2, 0x2e, 0xd8, 0x74, 0x37, 0x85, + 0x39, 0x13, 0x8e, 0x13, 0x97, 0xcb, 0xa5, 0x7a, + 0x04, 0xff, 0x30, 0xc2, 0xf0, 0x8c, 0x92, 0x6c, + 0xe4, 0x65, 0x55, 0x29, 0xa4, 0x0c, 0x63, 0x3d, + 0x6e, 0x04, 0x6c, 0xec, 0x83, 0x8f, 0x1f, 0x34, + 0xb9, 0x5e, 0x96, 0xe9, 0x1e, 0xcd, 0x93, 0x3d, + 0xf3, 0x8c, 0x5a, 0x6d, 0x7b, 0xe7, 0xa0, 0x63, + 0x6e, 0xe1, 0x1f, 0x46, 0x0d, 0x3d, 0x96, 0x7f, + 0x18, 0x0f, 0xf5, 0x0f, 0xb4, 0xbd, 0x7f, 0x24, + 0x8e, 0x73, 0x67, 0x78, 0xe6, 0x78, 0xf7, 0xe7, + 0xe8, 0xde, 0x59, 0x30, 0xce, 0x53, 0x4d, 0xc1, + 0xe2, 0xfb, 0xdd, 0xf3, 0x53, 0xc7, 0xf1, 0xe9, + 0xa9, 0x78, 0xd6, 0xd2, 0xce, 0xbf, 0x77, 0xe1, + 0x48, 0xc2, 0x99, 0xb5, 0x55, 0x5a, 0xe2, 0x08, + 0xc9, 0x43, 0x72, 0xed, 0x38, 0x7d, 0x48, 0xce, + 0x8f, 0xf9, 0x7d, 0xe4, 0x05, 0xce, 0xd2, 0xa1, + 0x76, 0x0b, 0x6a, 0x59, 0x58, 0xd6, 0x1f, 0xba, + 0x28, 0x0c, 0xd6, 0x49, 0xb4, 0x9c, 0x85, 0x82, + 0x6f, 0x67, 0x90, 0x47, 0x27, 0x21, 0x26, 0x1c, + 0xc5, 0x70, 0x40, 0x26, 0x5f, 0x68, 0xfe, 0x83, + 0xe8, 0x80, 0x16, 0x16, 0x44, 0x84, 0x19, 0x72, + 0x5d, 0x1c, 0x2d, 0x11, 0x58, 0x45, 0xc4, 0x72, + 0x3d, 0x87, 0x1e, 0xea, 0x53, 0x13, 0x30, 0x54, + 0x0e, 0x89, 0x86, 0x15, 0x15, 0xdb, 0x31, 0x20, + 0x08, 0xd9, 0xa0, 0xd9, 0x2a, 0xa5, 0x3a, 0x37, + 0x40, 0xe7, 0xa0, 0xda, 0x10, 0x39, 0x57, 0xc1, + 0x6a, 0xba, 0x4b, 0xb1, 0x4d, 0x3f, 0x10, 0xb6, + 0x70, 0x4f, 0x6e, 0x6e, 0xc4, 0xcd, 0xcd, 0x92, + 0x95, 0x69, 0x4d, 0xa7, 0xd8, 0xa3, 0x53, 0x61, + 0x00, 0x56, 0x90, 0x69, 0x7a, 0x20, 0x92, 0xe2, + 0x3a, 0x84, 0x58, 0xa0, 0xcd, 0x5c, 0xaf, 0x68, + 0x31, 0xa7, 0x10, 0x3b, 0xa2, 0x50, 0x99, 0x7e, + 0xfe, 0xbb, 0x4e, 0xae, 0xeb, 0xa4, 0xb7, 0x49, + 0x45, 0x8e, 0x43, 0xec, 0x6a, 0x7d, 0xa6, 0x26, + 0x91, 0x22, 0x5a, 0xff, 0x4e, 0x8a, 0x20, 0xf6, + 0xca, 0xc4, 0x1f, 0xc6, 0x0f, 0x33, 0x72, 0xb1, + 0x55, 0xeb, 0x95, 0x9a, 0x75, 0x30, 0xe8, 0x4a, + 0xd8, 0xf5, 0xe8, 0xbf, 0x5d, 0x1f, 0x6c, 0xd7, + 0xe2, 0xbc, 0x0f, 0xe3, 0xaa, 0x95, 0x1b, 0xfb, + 0x7f, 0x0c, 0x57, 0x66, 0x6b, 0xf9, 0x44, 0x0d, + 0xdf, 0x24, 0xe4, 0x1b, 0x19, 0xdf, 0x5a, 0x70, + 0xa8, 0xe2, 0x85, 0xbc, 0xe4, 0x5a, 0x72, 0xbd, + 0x11, 0xb5, 0x47, 0xb7, 0xe1, 0x14, 0xd9, 0x64, + 0x65, 0x44, 0x19, 0x2d, 0x25, 0xb5, 0xd2, 0xc7, + 0xb3, 0xea, 0xb5, 0xd2, 0xda, 0x37, 0xad, 0x0c, + 0x91, 0x35, 0xcf, 0x57, 0x0b, 0x7a, 0x78, 0x46, + 0x68, 0x49, 0x66, 0x84, 0x47, 0x57, 0xdc, 0x06, + 0x29, 0x81, 0xea, 0xb8, 0xb4, 0x9c, 0x40, 0x8f, + 0x18, 0x87, 0x31, 0xdc, 0x53, 0x44, 0xfb, 0xa6, + 0x4d, 0x39, 0x54, 0xbf, 0x3d, 0xf8, 0xb0, 0x68, + 0x14, 0x8e, 0xbd, 0xfa, 0x9c, 0x29, 0x13, 0x93, + 0x2d, 0x85, 0xa9, 0x96, 0x8e, 0x41, 0x9f, 0xac, + 0xca, 0x09, 0xb2, 0x8c, 0x18, 0x60, 0x0b, 0x56, + 0x14, 0x75, 0x46, 0x7e, 0xb0, 0x2f, 0xab, 0x68, + 0xb1, 0x00, 0xd3, 0xfd, 0x6d, 0xd2, 0xe3, 0xfd, + 0xe0, 0x78, 0x1a, 0xca, 0x39, 0x32, 0xa9, 0x6b, + 0x85, 0x92, 0x4b, 0x8a, 0x9b, 0x4c, 0x80, 0x95, + 0xbb, 0xfa, 0x54, 0x93, 0x70, 0xf5, 0xe9, 0xce, + 0x79, 0x7a, 0x09, 0x8e, 0xcb, 0x76, 0x66, 0x0b, + 0x82, 0xc3, 0x1b, 0x3a, 0x0a, 0x84, 0x3b, 0x23, + 0xc5, 0x00, 0x14, 0x7a, 0xf2, 0x79, 0x71, 0xa9, + 0x0c, 0x47, 0x5f, 0x36, 0xe8, 0x7b, 0x30, 0x5e, + 0x9e, 0x48, 0xf6, 0x9d, 0xdb, 0xf1, 0xcc, 0x5d, + 0x30, 0xd1, 0xa1, 0x14, 0x75, 0x03, 0x31, 0xc1, + 0xba, 0x41, 0xb7, 0x70, 0x02, 0x6b, 0xdf, 0x2b, + 0x56, 0xd0, 0x05, 0xbd, 0x54, 0x44, 0xbf, 0x90, + 0x65, 0xd3, 0xe8, 0x7e, 0xad, 0x5c, 0xc2, 0x05, + 0xa3, 0xf7, 0xdb, 0x82, 0x11, 0x4c, 0x47, 0x99, + 0x3b, 0xbe, 0x12, 0xf8, 0xeb, 0x8a, 0x52, 0x2e, + 0x50, 0xd9, 0x90, 0x9d, 0x68, 0xc8, 0x1b, 0x7a, + 0xa7, 0x01, 0xe3, 0xb1, 0x63, 0x3a, 0x85, 0x2c, + 0x5c, 0xd7, 0xf1, 0xa2, 0xbe, 0xdd, 0x15, 0x61, + 0x75, 0x01, 0xce, 0x38, 0xc2, 0xc1, 0x99, 0x94, + 0x6a, 0x86, 0x67, 0x4b, 0x0a, 0x34, 0xed, 0x5f, + 0xe4, 0xcb, 0x2f, 0x87, 0xe8, 0x2d, 0x54, 0xa5, + 0x71, 0xaf, 0xb5, 0x24, 0xe2, 0xbe, 0xbe, 0x73, + 0x71, 0xff, 0x2f, 0xcd, 0x70, 0xf5, 0x7f, 0x62, + 0x86, 0xfb, 0xef, 0xe9, 0xe5, 0xce, 0x70, 0x65, + 0xcc, 0x42, 0x7e, 0x85, 0x53, 0xe7, 0xae, 0xcc, + 0x70, 0x28, 0x31, 0xc3, 0x05, 0x83, 0xae, 0x44, + 0xa0, 0x0f, 0x2e, 0x94, 0x17, 0xf4, 0x6e, 0xf3, + 0xa5, 0x30, 0xd1, 0x25, 0x58, 0x02, 0x32, 0xfa, + 0x59, 0x0f, 0x9b, 0x1c, 0xab, 0x4b, 0x01, 0xc2, + 0x1c, 0x78, 0x83, 0x82, 0x39, 0x30, 0xb8, 0x4d, + 0x3b, 0xbb, 0x18, 0x5c, 0x2a, 0xa1, 0xbb, 0xec, + 0x5f, 0xaa, 0x90, 0x9f, 0x12, 0x47, 0x18, 0x1e, + 0xae, 0x80, 0xfd, 0x91, 0xad, 0x1d, 0x83, 0x52, + 0xb6, 0xdf, 0x17, 0xcb, 0x26, 0x8e, 0xf5, 0x59, + 0xe3, 0x78, 0x4f, 0x73, 0x46, 0xa4, 0xa2, 0x10, + 0xb3, 0xb9, 0x5c, 0x96, 0x77, 0xca, 0x53, 0x68, + 0xb3, 0x7a, 0xf5, 0x46, 0xab, 0xaf, 0xb7, 0xda, + 0xa0, 0xbf, 0xaf, 0xb9, 0xbe, 0x4a, 0xbb, 0xc1, + 0x2c, 0x2d, 0x6f, 0xc8, 0xca, 0xed, 0xb8, 0xd6, + 0x88, 0xda, 0xee, 0x9d, 0xbe, 0xec, 0x80, 0x15, + 0x8b, 0x33, 0xe8, 0x95, 0x35, 0xbf, 0x87, 0x15, + 0x55, 0xa5, 0xab, 0xad, 0xe3, 0xf5, 0x96, 0xeb, + 0xec, 0x98, 0xdd, 0x2a, 0xdb, 0x53, 0x84, 0xfa, + 0x9e, 0x9b, 0x0e, 0x5b, 0x47, 0x95, 0x71, 0xf5, + 0xb9, 0x49, 0xd0, 0xee, 0x88, 0xbd, 0xd1, 0x8e, + 0xd9, 0xfb, 0x29, 0xcd, 0x27, 0x1f, 0xac, 0x55, + 0x1b, 0xae, 0x2e, 0x73, 0xc6, 0xbd, 0x83, 0x59, + 0x76, 0x93, 0x68, 0xdd, 0x2e, 0x6c, 0x76, 0x42, + 0xf3, 0x3b, 0x75, 0xb7, 0xbc, 0x8d, 0xff, 0x9e, + 0x5b, 0x37, 0x95, 0xde, 0xda, 0x0e, 0x3a, 0x32, + 0x57, 0xf4, 0xcd, 0xfd, 0x76, 0xe0, 0x8d, 0xf2, + 0x55, 0xc9, 0x1f, 0xd9, 0x6c, 0x12, 0x32, 0x55, + 0x1b, 0xfb, 0x48, 0x26, 0x64, 0x1a, 0xbb, 0x67, + 0xeb, 0x27, 0x32, 0x5d, 0x32, 0x4a, 0x37, 0x5a, + 0xe8, 0x7f, 0x21, 0x37, 0x55, 0xe7, 0x3f, 0xcd, + 0x90, 0x30, 0xe6, 0xee, 0x7d, 0x6f, 0x21, 0x6b, + 0xcb, 0x40, 0x83, 0x4f, 0x6d, 0xc6, 0x73, 0x8c, + 0xf8, 0x96, 0xad, 0xf2, 0xdd, 0x1a, 0xbc, 0x79, + 0x93, 0xb1, 0xe8, 0x9e, 0x1a, 0xf4, 0x31, 0xf7, + 0x6b, 0x6b, 0xad, 0x5a, 0x75, 0x70, 0xd6, 0x65, + 0x82, 0x73, 0xb7, 0x96, 0x85, 0xa5, 0xa8, 0xf6, + 0x0b, 0x21, 0x8f, 0x19, 0x30, 0x58, 0x4e, 0xcb, + 0xbb, 0xa3, 0xe4, 0x7d, 0x8d, 0x18, 0xc3, 0xac, + 0x34, 0x5c, 0x4e, 0x24, 0xcc, 0xd8, 0xdc, 0x1d, + 0x2b, 0xae, 0xd7, 0x69, 0x88, 0x21, 0x3e, 0xc1, + 0x68, 0x4f, 0x17, 0xf3, 0xe0, 0xa0, 0x7f, 0x88, + 0xd2, 0xef, 0x59, 0x4f, 0x6d, 0xe7, 0xf7, 0x00, + 0xee, 0x82, 0xf4, 0xa8, 0x30, 0xf0, 0xa8, 0x66, + 0xa3, 0xda, 0x3a, 0x7b, 0x7d, 0x43, 0x96, 0x0f, + 0x8f, 0xb7, 0xfb, 0xf0, 0x68, 0x72, 0xe4, 0xd8, + 0xf6, 0xa7, 0x89, 0x0f, 0x2f, 0xd0, 0xc0, 0x83, + 0xda, 0x2a, 0x6f, 0x61, 0x17, 0x20, 0xc1, 0x2d, + 0x8d, 0xf0, 0x82, 0x28, 0x7a, 0x91, 0x46, 0x8a, + 0x1d, 0x65, 0x72, 0x3f, 0x37, 0x3e, 0xc1, 0x2d, + 0xd1, 0x75, 0x87, 0x10, 0xec, 0xf9, 0x23, 0xc7, + 0xbb, 0x9e, 0xa0, 0x5f, 0x98, 0xfe, 0x22, 0x20, + 0x78, 0x07, 0xa9, 0x17, 0x37, 0x07, 0xbf, 0x2f, + 0xa9, 0x18, 0x25, 0x6f, 0x38, 0x68, 0x36, 0x2d, + 0xaa, 0x39, 0x64, 0x27, 0xd0, 0x0b, 0x11, 0xf8, + 0x90, 0x22, 0x52, 0xc1, 0xa0, 0x63, 0x4c, 0xe0, + 0xc9, 0x7a, 0xd4, 0x78, 0x3d, 0xc6, 0x36, 0x06, + 0x0d, 0xd1, 0x0e, 0xf4, 0xfc, 0xa6, 0x60, 0xa0, + 0xfc, 0x66, 0x61, 0x08, 0x64, 0xc2, 0x79, 0xc8, + 0xe9, 0xbd, 0x0f, 0x8f, 0x46, 0x59, 0xe5, 0x9b, + 0xe3, 0x99, 0x84, 0x75, 0xc3, 0x5b, 0x05, 0x42, + 0x8e, 0x2b, 0x12, 0xc6, 0x00, 0x39, 0x84, 0x9f, + 0xe9, 0x93, 0x58, 0x3d, 0x5e, 0x89, 0x08, 0x79, + 0x6b, 0xca, 0xb3, 0xe8, 0x15, 0xd5, 0x8a, 0x9b, + 0xa8, 0xc6, 0xc7, 0x4c, 0xb4, 0x0b, 0xb4, 0x1c, + 0x3b, 0x97, 0x36, 0x87, 0x61, 0x70, 0xd8, 0x1e, + 0xdc, 0x1d, 0xf6, 0x97, 0xc6, 0x1d, 0x9a, 0xdf, + 0x62, 0x3d, 0x55, 0x0f, 0xe8, 0x53, 0xb0, 0xb4, + 0xf3, 0xc0, 0x13, 0x29, 0x1b, 0x4f, 0x7c, 0xec, + 0xea, 0xbc, 0x18, 0xd0, 0xf1, 0x6a, 0x86, 0x96, + 0x3a, 0xb6, 0x0d, 0xdf, 0xd1, 0x42, 0xec, 0x10, + 0x3d, 0x59, 0x0d, 0x48, 0x13, 0xa0, 0x4c, 0x79, + 0x63, 0xad, 0xa9, 0x3a, 0x97, 0x39, 0xb7, 0x87, + 0x11, 0xfc, 0x22, 0x32, 0xf8, 0x1b, 0x60, 0xc2, + 0xff, 0x69, 0x9d, 0x2c, 0xe1, 0x5d, 0xb6, 0x8f, + 0x07, 0x90, 0x45, 0x6c, 0xec, 0xeb, 0xc9, 0x6a, + 0x40, 0x93, 0xc2, 0xc8, 0x4c, 0x12, 0x13, 0xf0, + 0x51, 0x04, 0xda, 0x4a, 0x56, 0xe1, 0xf7, 0x93, + 0x25, 0x01, 0x05, 0xb7, 0x9b, 0x89, 0x14, 0x93, + 0x4c, 0x38, 0x90, 0x53, 0xde, 0xd0, 0xa9, 0x2a, + 0x01, 0xcc, 0xc8, 0x5e, 0x0f, 0xeb, 0x2f, 0x95, + 0xc9, 0xf8, 0x53, 0xd9, 0xcd, 0xd2, 0x99, 0x60, + 0x3c, 0x9a, 0x75, 0x57, 0x61, 0x91, 0xe1, 0xb0, + 0x22, 0x8e, 0x28, 0x59, 0x09, 0x9d, 0xae, 0x17, + 0x8f, 0xbd, 0xf7, 0x2c, 0x98, 0x81, 0x32, 0xa7, + 0x9a, 0xf6, 0x34, 0x74, 0x0c, 0x00, 0x16, 0x68, + 0x02, 0x56, 0x6f, 0x84, 0x3b, 0x59, 0x50, 0x19, + 0x1f, 0x69, 0xd4, 0x0a, 0x89, 0x16, 0x51, 0xf4, + 0x6d, 0x7a, 0x61, 0xb2, 0x0e, 0xa4, 0xc5, 0xcc, + 0xe8, 0x18, 0x74, 0x36, 0x18, 0x77, 0x86, 0x45, + 0x3d, 0x37, 0x4f, 0xa4, 0x75, 0x47, 0x7f, 0x0e, + 0x84, 0xaf, 0x1f, 0xa2, 0x6e, 0x03, 0x03, 0xf2, + 0x11, 0xe3, 0x4d, 0x49, 0xf5, 0x73, 0x45, 0x87, + 0x90, 0xe8, 0x17, 0x4c, 0x42, 0x49, 0xf8, 0x8d, + 0x94, 0xfa, 0xc1, 0x5f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, 0x58, + 0x43, 0x50, 0xac, 0x02, 0x97, 0xa6, 0x77, 0x09, + 0x00, 0x00, 0xbc, 0x52, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, 0x30, + 0x46, 0x52, 0x32, 0x33, 0x35, 0x33, 0x2e, 0x78, + 0x6d, 0x6c, 0xed, 0x1c, 0xd9, 0x72, 0x9b, 0x30, + 0xf0, 0x3d, 0x5f, 0x41, 0xfb, 0xd4, 0xce, 0x34, + 0x35, 0xd8, 0x71, 0xea, 0x74, 0x5c, 0x3a, 0x8e, + 0x8f, 0x36, 0x9d, 0x38, 0x71, 0xed, 0xf4, 0x78, + 0xcb, 0x28, 0x20, 0x27, 0x4c, 0x31, 0x50, 0x84, + 0x5b, 0xa7, 0x5f, 0xdf, 0x15, 0x08, 0x0b, 0x10, + 0x60, 0x39, 0x81, 0xc4, 0x99, 0x36, 0xd3, 0x43, + 0x5a, 0xed, 0x4a, 0x7b, 0xeb, 0x42, 0xe9, 0xbe, + 0x5f, 0x2d, 0x6c, 0xe5, 0x17, 0xf6, 0x89, 0xe5, + 0x3a, 0xef, 0x9e, 0x6b, 0xaf, 0xd5, 0xe7, 0xef, + 0xf5, 0xbd, 0xae, 0x89, 0x7f, 0x59, 0x06, 0xde, + 0xb7, 0x9c, 0xb9, 0xeb, 0x2f, 0x50, 0x00, 0x6d, + 0x69, 0x1c, 0x7d, 0x4f, 0x81, 0x1f, 0x86, 0x16, + 0x55, 0x18, 0x80, 0x18, 0xbe, 0xe5, 0x51, 0x02, + 0x7d, 0x3c, 0x9b, 0x1c, 0xb4, 0xd4, 0xd1, 0xb4, + 0xd9, 0x6a, 0xb7, 0xba, 0x8d, 0x64, 0x8b, 0xd2, + 0x7d, 0xb6, 0xbf, 0xaf, 0xf0, 0x76, 0x4d, 0x53, + 0xf6, 0xf7, 0x13, 0xbd, 0x58, 0xe6, 0x18, 0x91, + 0x1f, 0x11, 0x60, 0x0d, 0x64, 0xe3, 0xeb, 0xea, + 0x6a, 0x0e, 0x3f, 0xdd, 0x06, 0xab, 0x67, 0xb0, + 0xc8, 0xf2, 0x2a, 0x8b, 0xc8, 0x40, 0x22, 0xae, + 0x0f, 0xdc, 0x33, 0x4c, 0x8a, 0x17, 0x56, 0x45, + 0xac, 0x05, 0x5a, 0x4d, 0xd3, 0x88, 0x49, 0x08, + 0x67, 0xba, 0xb1, 0xe6, 0x9a, 0x8b, 0xd1, 0x77, + 0x4d, 0x5c, 0x28, 0x46, 0xa7, 0xa5, 0x0e, 0x22, + 0x31, 0xb8, 0x4e, 0x00, 0xda, 0x9c, 0xab, 0xa0, + 0x8d, 0x12, 0xb1, 0xe4, 0x24, 0x52, 0xd5, 0x2a, + 0x24, 0x4a, 0x0b, 0xd0, 0xf5, 0x08, 0xd2, 0xa7, + 0xf8, 0x7a, 0x69, 0x23, 0xbf, 0xdb, 0xa0, 0x15, + 0xde, 0x74, 0x65, 0x05, 0x44, 0x6f, 0xc2, 0xa0, + 0x61, 0x81, 0xc3, 0x91, 0x6f, 0xdc, 0x58, 0x01, + 0x36, 0x82, 0xa5, 0x8f, 0xf5, 0xbe, 0xb7, 0xfc, + 0xfe, 0xab, 0xd9, 0x6d, 0xa4, 0x80, 0x1c, 0x17, + 0xe3, 0x85, 0x3e, 0x1c, 0x0f, 0xbf, 0x5f, 0xce, + 0xc6, 0xbd, 0xd3, 0xd3, 0xcb, 0xf6, 0xf7, 0xef, + 0xdd, 0x06, 0xc0, 0x98, 0x6e, 0xc2, 0x96, 0xb3, + 0xf3, 0xb3, 0xe1, 0xab, 0xb0, 0x74, 0x7a, 0xfe, + 0xed, 0x55, 0x04, 0x1b, 0x0f, 0x07, 0x27, 0x5f, + 0xc6, 0xac, 0xf2, 0xf1, 0xe4, 0xc3, 0x47, 0x56, + 0x1c, 0x7e, 0xbf, 0x98, 0xf6, 0x78, 0x5f, 0x11, + 0x94, 0xd7, 0x53, 0xd4, 0x09, 0xc0, 0x69, 0x6f, + 0xfa, 0x61, 0x98, 0xa8, 0xf7, 0xcf, 0xa7, 0x17, + 0x14, 0xef, 0x20, 0xed, 0xa4, 0x86, 0xed, 0x1a, + 0x3f, 0x4e, 0x20, 0x40, 0x38, 0x8c, 0xc3, 0xfb, + 0xae, 0x13, 0xf8, 0xae, 0xad, 0x7f, 0xe8, 0xf7, + 0x29, 0x1b, 0xc3, 0xb3, 0xc1, 0x10, 0x6c, 0x9d, + 0x6c, 0x62, 0x42, 0x01, 0x42, 0x24, 0x53, 0x58, + 0x9a, 0x5d, 0xf4, 0xce, 0x06, 0xbd, 0xe9, 0x80, + 0xd6, 0x38, 0x61, 0xba, 0xed, 0xf2, 0x64, 0xcd, + 0x47, 0x52, 0x71, 0x7d, 0xda, 0x37, 0x51, 0x1a, + 0x62, 0xcb, 0x85, 0xb5, 0x00, 0x67, 0x59, 0xc3, + 0xc5, 0x36, 0xc5, 0x72, 0x4c, 0xbc, 0x7a, 0xf7, + 0x3c, 0x0e, 0x6b, 0x01, 0xd1, 0x41, 0x0b, 0xac, + 0xf7, 0x06, 0xfd, 0x6e, 0x83, 0x96, 0x0a, 0x90, + 0x7e, 0x21, 0x7b, 0x89, 0xc1, 0x9f, 0xcc, 0x4e, + 0xb7, 0x11, 0x95, 0xc5, 0x11, 0x1b, 0xf1, 0x90, + 0x12, 0xdc, 0x68, 0xa5, 0xdc, 0x4c, 0xc0, 0x28, + 0x52, 0xec, 0xb4, 0xd5, 0x6a, 0xd8, 0x69, 0x96, + 0xb2, 0xd3, 0x77, 0x17, 0x1e, 0xf2, 0x51, 0xe0, + 0xfa, 0xca, 0x50, 0x95, 0xe2, 0x0b, 0x1d, 0x55, + 0xc3, 0x57, 0x4b, 0x9a, 0x2f, 0x4d, 0x8e, 0x2f, + 0x54, 0x0d, 0x5f, 0x07, 0xa5, 0x7c, 0xe1, 0x2f, + 0xb3, 0xfe, 0x49, 0x4f, 0x4e, 0x53, 0x4d, 0xa3, + 0x1a, 0x8e, 0xda, 0x12, 0x1c, 0xc9, 0xe9, 0xa8, + 0x69, 0x56, 0xc3, 0xd1, 0xe1, 0x66, 0x8e, 0x8e, + 0xe5, 0x74, 0xd4, 0xaa, 0xc8, 0xcb, 0xdf, 0x48, + 0x70, 0x24, 0xa7, 0xa3, 0x96, 0x56, 0x0d, 0x47, + 0x9d, 0x52, 0x8e, 0xa6, 0x17, 0x72, 0x49, 0xa9, + 0x53, 0xe0, 0xd5, 0x7c, 0xdd, 0x32, 0x47, 0x4b, + 0x3b, 0x98, 0x05, 0xae, 0xa7, 0x07, 0xfe, 0x12, + 0x77, 0x1b, 0x09, 0xc8, 0x3d, 0x25, 0x38, 0x2a, + 0x95, 0x20, 0x44, 0x55, 0x2f, 0x8f, 0x5b, 0x52, + 0x72, 0x1c, 0xbd, 0x79, 0x3c, 0x39, 0x34, 0x75, + 0xb3, 0x20, 0x9a, 0xb4, 0x20, 0x9d, 0x47, 0x14, + 0x44, 0xdb, 0x2c, 0x48, 0x53, 0x5a, 0x90, 0xa3, + 0x47, 0x14, 0xa4, 0xb9, 0x59, 0x90, 0xd6, 0xe5, + 0xf1, 0x1b, 0x39, 0x41, 0xcc, 0x47, 0x14, 0xa4, + 0x7c, 0x16, 0xfb, 0x86, 0x02, 0xe3, 0xc6, 0x74, + 0xaf, 0x95, 0x90, 0x48, 0x4a, 0x9a, 0x87, 0x89, + 0xf7, 0x70, 0x09, 0x37, 0x82, 0xc9, 0x15, 0xd9, + 0xb6, 0x42, 0x80, 0xd4, 0x43, 0x57, 0x36, 0x56, + 0x4e, 0x26, 0x64, 0xaf, 0x7c, 0x31, 0x41, 0xb3, + 0xda, 0xe6, 0x19, 0x9b, 0x49, 0xaa, 0x9c, 0xb9, + 0x01, 0x7e, 0x0b, 0xbd, 0x2a, 0xb4, 0xba, 0x57, + 0x2c, 0x33, 0x8b, 0xa9, 0x35, 0x45, 0x70, 0x63, + 0x11, 0x05, 0xfe, 0x04, 0x37, 0x58, 0x99, 0x9c, + 0x0c, 0xf6, 0xa4, 0x44, 0x12, 0x78, 0xa5, 0xf9, + 0xeb, 0x8e, 0xb9, 0x2b, 0x27, 0x6f, 0xdd, 0x8d, + 0x89, 0x16, 0xcd, 0x3d, 0x77, 0xcc, 0x3b, 0x32, + 0x39, 0x67, 0x1b, 0x87, 0x90, 0x67, 0x9a, 0xe6, + 0x99, 0xfb, 0x78, 0xb4, 0x84, 0x37, 0x57, 0xc1, + 0xf8, 0xeb, 0xd7, 0xaf, 0x53, 0xf5, 0xfd, 0xfd, + 0x22, 0x3a, 0x92, 0xdc, 0x1d, 0x26, 0x36, 0x40, + 0x9c, 0x61, 0xd7, 0x0e, 0xd0, 0x35, 0xe6, 0x50, + 0xde, 0x62, 0x18, 0x63, 0xcb, 0xd1, 0xb5, 0x0e, + 0xdd, 0x98, 0xb2, 0x8a, 0x88, 0x81, 0x56, 0x7a, + 0xeb, 0x90, 0x62, 0x44, 0x15, 0x11, 0x63, 0x64, + 0x23, 0x72, 0xc3, 0x3b, 0x4a, 0x40, 0x44, 0xdc, + 0x19, 0x36, 0x60, 0x7f, 0x49, 0x9b, 0x9a, 0x6d, + 0x8a, 0xcc, 0x41, 0x22, 0xb6, 0xe7, 0xf1, 0xa6, + 0x43, 0x95, 0x62, 0x03, 0x68, 0x33, 0x36, 0xb0, + 0xf8, 0x26, 0x8d, 0x2d, 0x72, 0x1d, 0x60, 0x12, + 0x7c, 0xf5, 0x62, 0xeb, 0xb0, 0x5a, 0x52, 0x91, + 0xb9, 0x4a, 0xeb, 0xce, 0x31, 0xa2, 0xdb, 0x63, + 0x92, 0xb7, 0xbd, 0x9c, 0xdd, 0x92, 0x00, 0xf6, + 0xc5, 0xe3, 0xf3, 0xc1, 0xe5, 0xf9, 0x0c, 0x56, + 0x40, 0x09, 0x60, 0x06, 0xdd, 0x36, 0xe6, 0x98, + 0x8d, 0x4c, 0x8b, 0x99, 0xd6, 0x9f, 0x4b, 0xcb, + 0xf8, 0x31, 0xc6, 0x8b, 0x29, 0x46, 0x26, 0xc3, + 0x4a, 0x82, 0x32, 0xd8, 0x37, 0x88, 0x8c, 0x7c, + 0xb4, 0x60, 0x88, 0xac, 0x96, 0x14, 0x44, 0x64, + 0xb9, 0x8b, 0x57, 0xc1, 0x48, 0x84, 0x36, 0xf2, + 0xc1, 0x9e, 0xfb, 0x1b, 0xfb, 0x33, 0x1c, 0x04, + 0x96, 0x73, 0x4d, 0x72, 0xb4, 0x08, 0x47, 0x0f, + 0x03, 0x8b, 0xd0, 0x14, 0x7b, 0xea, 0x2d, 0xda, + 0x10, 0x17, 0x1a, 0x44, 0xb4, 0xd8, 0x90, 0x4f, + 0xd9, 0xfa, 0x4a, 0x8f, 0x67, 0x80, 0xe8, 0x40, + 0xa5, 0xc7, 0x14, 0x29, 0x68, 0x11, 0xc5, 0xd0, + 0x89, 0xfb, 0xe4, 0x74, 0xbc, 0x6d, 0xd3, 0x78, + 0xc0, 0x52, 0x31, 0xb9, 0x04, 0xbf, 0x83, 0x28, + 0x90, 0xe9, 0x89, 0x4f, 0x16, 0x96, 0x4f, 0x12, + 0xb1, 0x24, 0xea, 0x66, 0x13, 0xab, 0x4c, 0x31, + 0x9a, 0xaa, 0x26, 0x88, 0x8a, 0xf5, 0xc2, 0x78, + 0x08, 0x29, 0x42, 0xe7, 0x4f, 0xc3, 0x93, 0x76, + 0x16, 0x2c, 0xca, 0xe7, 0xcd, 0x75, 0x65, 0x8c, + 0x6e, 0x95, 0x6b, 0xec, 0x60, 0x98, 0xf4, 0xb0, + 0x62, 0xb8, 0x0e, 0x76, 0x02, 0xc5, 0x9d, 0x2b, + 0x18, 0x19, 0x37, 0x0a, 0xc4, 0x85, 0x72, 0x85, + 0x08, 0x36, 0x15, 0x38, 0x81, 0xfc, 0x74, 0xd1, + 0xfb, 0x00, 0xb3, 0xe0, 0xfe, 0xf7, 0x5e, 0xff, + 0x42, 0x31, 0x51, 0x80, 0xe2, 0x2e, 0xd8, 0x74, + 0x37, 0x87, 0x39, 0x13, 0x8e, 0x13, 0x57, 0xab, + 0x55, 0xe3, 0x00, 0xfe, 0x61, 0x84, 0xd1, 0x19, + 0x25, 0xd9, 0xca, 0xcb, 0xea, 0x52, 0x48, 0x15, + 0xc6, 0x7a, 0xd8, 0x08, 0xd8, 0xda, 0x07, 0x1f, + 0x3e, 0x68, 0x0a, 0xbd, 0x2c, 0xd7, 0x3d, 0xda, + 0x47, 0x4f, 0xcc, 0x33, 0x54, 0xf5, 0xee, 0xce, + 0x41, 0xc7, 0xbc, 0x83, 0x7f, 0x18, 0x2a, 0x7a, + 0x28, 0xff, 0x30, 0xee, 0xeb, 0x1f, 0xe8, 0xee, + 0xfe, 0x91, 0x3a, 0xce, 0x5d, 0xe0, 0x85, 0xeb, + 0xdf, 0x9e, 0xa2, 0x5b, 0x77, 0xc9, 0x38, 0xcf, + 0x34, 0x85, 0x8b, 0xef, 0x77, 0xcf, 0x8f, 0x5d, + 0x37, 0xa0, 0xa7, 0xe2, 0x79, 0x4b, 0xbb, 0xe0, + 0xd6, 0x83, 0x23, 0x09, 0x77, 0xd1, 0x6d, 0xd0, + 0x12, 0x47, 0x48, 0x1f, 0x92, 0x6b, 0x87, 0xd9, + 0x43, 0x72, 0x7e, 0xcc, 0x1f, 0x20, 0x3f, 0x74, + 0x96, 0x1e, 0xb5, 0x5b, 0x58, 0xcb, 0xc3, 0xb2, + 0xfe, 0xd0, 0x45, 0x61, 0xb8, 0x4e, 0xa2, 0xe5, + 0x3c, 0x14, 0x7c, 0xbd, 0x80, 0x3c, 0x3a, 0x8b, + 0x30, 0xe1, 0x28, 0x86, 0x03, 0x72, 0xf9, 0x42, + 0xce, 0x0f, 0xa2, 0x03, 0x5a, 0x54, 0x10, 0x11, + 0x16, 0xc8, 0xf3, 0x70, 0xbc, 0x44, 0x60, 0x15, + 0x11, 0xcb, 0xf3, 0x5d, 0x7a, 0xa8, 0x4f, 0x4d, + 0xc0, 0x50, 0x39, 0x24, 0x1e, 0x56, 0x54, 0x6c, + 0xcf, 0x80, 0x20, 0x64, 0x83, 0xe6, 0xab, 0x94, + 0xea, 0xdc, 0x00, 0x9d, 0x83, 0x6a, 0x23, 0xe4, + 0x42, 0x05, 0x37, 0xb2, 0x5d, 0x8a, 0x6d, 0xfa, + 0x9e, 0xb0, 0x85, 0x7b, 0x74, 0x73, 0x23, 0x6e, + 0x6e, 0x96, 0xac, 0x4c, 0x6b, 0x3e, 0xc7, 0x3e, + 0x9d, 0x0a, 0x43, 0xb0, 0x82, 0x4c, 0xd3, 0x07, + 0x91, 0x14, 0xcf, 0x25, 0xc4, 0x02, 0x6d, 0x16, + 0x7a, 0x45, 0x87, 0x39, 0x85, 0xd8, 0x11, 0x85, + 0xca, 0xf4, 0xf3, 0xdf, 0x75, 0x0a, 0x5d, 0x27, + 0xbb, 0x4d, 0x2a, 0x73, 0x1c, 0x62, 0xd7, 0xeb, + 0x33, 0xaa, 0x44, 0x8a, 0xe8, 0xfc, 0x3b, 0x29, + 0x82, 0xd8, 0x6b, 0x13, 0x7f, 0x98, 0xde, 0xcf, + 0xc8, 0xe5, 0x56, 0x6d, 0xd6, 0x6a, 0xd6, 0xd1, + 0xa8, 0x2f, 0x61, 0xd7, 0x83, 0xff, 0x76, 0xbd, + 0xb7, 0x5d, 0xcb, 0xf3, 0x3e, 0x8c, 0xdb, 0xa8, + 0xdd, 0xd8, 0xff, 0x63, 0xb8, 0x36, 0x5b, 0xcb, + 0x27, 0x6a, 0xf8, 0x26, 0xa1, 0xd8, 0xc8, 0xf8, + 0xda, 0x82, 0x43, 0x15, 0x3f, 0xe2, 0xa5, 0xd0, + 0x92, 0x9b, 0x8d, 0xa8, 0x3d, 0xb8, 0x0d, 0xe7, + 0xc8, 0x26, 0x6b, 0x23, 0xca, 0x68, 0x29, 0xad, + 0x95, 0x21, 0x5e, 0xd4, 0xaf, 0x95, 0xce, 0x53, + 0xd3, 0xca, 0x18, 0x59, 0x4e, 0xb1, 0x5a, 0xd0, + 0xfd, 0x33, 0x42, 0x5f, 0x26, 0x23, 0x1c, 0xa8, + 0x3b, 0x9d, 0x12, 0xa8, 0x8e, 0x2b, 0xcb, 0x09, + 0xf4, 0x88, 0x71, 0x9c, 0xc0, 0x3d, 0x46, 0xb4, + 0x6f, 0xda, 0x54, 0x40, 0xf5, 0xdb, 0x87, 0x0f, + 0x8b, 0x26, 0xd1, 0xd8, 0xeb, 0xcf, 0x99, 0x72, + 0x31, 0xd9, 0x52, 0x98, 0x6a, 0xe9, 0x10, 0xf4, + 0xc9, 0xaa, 0x9c, 0x20, 0xcf, 0x88, 0x21, 0xb6, + 0x60, 0x45, 0x51, 0x67, 0xe4, 0x07, 0xfb, 0xb2, + 0x8a, 0x16, 0x4b, 0x30, 0xbd, 0xdf, 0x26, 0x3d, + 0xde, 0x0f, 0x8f, 0xa7, 0xa1, 0x5c, 0x20, 0x53, + 0x63, 0xa3, 0x50, 0x72, 0x49, 0x71, 0x9b, 0x09, + 0xb0, 0x76, 0x57, 0x9f, 0x6b, 0x12, 0xae, 0x3e, + 0xdf, 0x39, 0x4f, 0xaf, 0xc0, 0x71, 0xd9, 0xce, + 0x6c, 0x49, 0x70, 0x74, 0x43, 0x47, 0x81, 0x70, + 0x67, 0xa4, 0x18, 0x80, 0x42, 0x4f, 0x3e, 0xcf, + 0xce, 0x95, 0xf1, 0xe4, 0xcb, 0x16, 0x7d, 0x8f, + 0xa6, 0xab, 0x23, 0xc9, 0xbe, 0x0b, 0x3b, 0x5e, + 0x78, 0x4b, 0x26, 0x3a, 0x94, 0xe2, 0x6e, 0x20, + 0x26, 0x58, 0x37, 0xe8, 0x1a, 0x4e, 0x60, 0xed, + 0x5b, 0xc5, 0x0a, 0xbb, 0xa0, 0x97, 0x8a, 0xe8, + 0x17, 0xb2, 0x6c, 0x1a, 0xdd, 0xaf, 0x95, 0x73, + 0xb8, 0x60, 0xf4, 0x7f, 0x5b, 0x30, 0x82, 0xe9, + 0x2a, 0x8e, 0x1b, 0x28, 0xa1, 0xbf, 0xae, 0x29, + 0xe5, 0x02, 0x95, 0x0d, 0xd9, 0x8b, 0x87, 0xbc, + 0xa2, 0x77, 0x1a, 0x30, 0x1e, 0x3b, 0xa6, 0x53, + 0xc8, 0xd2, 0xf3, 0x5c, 0x3f, 0xee, 0xdb, 0x5b, + 0x13, 0xd6, 0x17, 0xe0, 0x8c, 0x23, 0x1c, 0x9e, + 0x49, 0x35, 0xcc, 0xe8, 0x6c, 0x49, 0x81, 0xa6, + 0xa7, 0x17, 0xf9, 0xf2, 0xcb, 0x21, 0x7a, 0x0b, + 0x55, 0x6b, 0xdc, 0x6b, 0x1d, 0x89, 0xb8, 0x6f, + 0xee, 0x5c, 0xdc, 0xff, 0x4b, 0x33, 0x5c, 0xf3, + 0x9f, 0x98, 0xe1, 0xfe, 0x7b, 0x7a, 0xb5, 0x33, + 0x5c, 0x15, 0xb3, 0x50, 0x50, 0xe3, 0xd4, 0xb9, + 0x2b, 0x33, 0x1c, 0x4a, 0xcd, 0x70, 0xe1, 0xa0, + 0x6b, 0x11, 0xe8, 0x83, 0x0b, 0xe5, 0x05, 0xbd, + 0xdb, 0x7c, 0x29, 0x4c, 0x74, 0x29, 0x96, 0x80, + 0x8c, 0x7e, 0xd6, 0xc3, 0x26, 0xc7, 0xfa, 0x52, + 0x80, 0x30, 0x07, 0x5e, 0xa1, 0x70, 0x0e, 0x0c, + 0x6f, 0xd3, 0x4e, 0xce, 0x46, 0xe7, 0x4a, 0xe4, + 0x2e, 0x4f, 0x2f, 0x55, 0xc8, 0x4f, 0x89, 0x13, + 0x0c, 0x0f, 0x57, 0xc0, 0xfe, 0xc8, 0xd6, 0x0e, + 0x41, 0x29, 0x77, 0xdf, 0x17, 0xcb, 0x26, 0x8e, + 0xcd, 0x59, 0xe3, 0xf0, 0x89, 0xe6, 0x8c, 0x58, + 0x45, 0x11, 0x66, 0x7b, 0xb5, 0xaa, 0xee, 0x94, + 0xa7, 0xd4, 0x66, 0xcd, 0xfa, 0x8d, 0xd6, 0xdc, + 0x6c, 0xb5, 0xd1, 0xf0, 0xa9, 0xe6, 0xfa, 0x3a, + 0xed, 0x06, 0xb3, 0xb4, 0xbc, 0x21, 0x6b, 0xb7, + 0xe3, 0x46, 0x23, 0x6a, 0xbb, 0x77, 0xfa, 0xb2, + 0x03, 0x56, 0x2c, 0xcf, 0xa0, 0x17, 0x96, 0x73, + 0x0b, 0x2b, 0xaa, 0x5a, 0x57, 0x5b, 0x87, 0x9b, + 0x2d, 0xd7, 0xdb, 0x31, 0xbb, 0xd5, 0xb6, 0xa7, + 0x88, 0xf4, 0xed, 0x98, 0x2e, 0x5b, 0x47, 0x55, + 0x71, 0xf5, 0xb9, 0x4d, 0xd0, 0xee, 0x88, 0xbd, + 0xd1, 0x8e, 0xd9, 0xfb, 0x31, 0xcd, 0x27, 0x1f, + 0xac, 0x75, 0x1b, 0xae, 0x29, 0x73, 0xc6, 0xbd, + 0xdb, 0xb7, 0x5e, 0x62, 0xb0, 0x56, 0x11, 0x35, + 0x3b, 0xa1, 0xf8, 0x9d, 0xba, 0x5a, 0xbe, 0x8b, + 0xfb, 0x9e, 0x5a, 0x57, 0xb5, 0x5e, 0xda, 0x8e, + 0x7a, 0x32, 0x37, 0xf4, 0xed, 0xdd, 0x5b, 0x25, + 0x6c, 0xe3, 0xc0, 0x5b, 0xa5, 0xab, 0x8a, 0xbf, + 0xb1, 0xd9, 0x26, 0x64, 0xea, 0x36, 0xf6, 0x81, + 0x4c, 0xc8, 0xb4, 0x76, 0xcf, 0xd6, 0x8f, 0x64, + 0xba, 0x74, 0x94, 0x6e, 0xb5, 0xce, 0xff, 0x42, + 0xae, 0xea, 0xce, 0x7f, 0x9a, 0x21, 0x61, 0xcc, + 0xdd, 0x9b, 0x78, 0x64, 0x6d, 0x19, 0x6a, 0xf0, + 0xb1, 0xcd, 0x78, 0x8a, 0x11, 0xdf, 0xb1, 0xd5, + 0xbe, 0x59, 0x83, 0x27, 0x6f, 0x32, 0x16, 0x7d, + 0xa2, 0x06, 0x7d, 0xc8, 0xed, 0xda, 0x46, 0xab, + 0xd6, 0x1d, 0x9c, 0x4d, 0x99, 0xe0, 0xdc, 0xad, + 0xbd, 0x77, 0x25, 0xaa, 0xfd, 0x42, 0xc8, 0x43, + 0x06, 0x0c, 0x96, 0xd3, 0xf2, 0xee, 0x28, 0xf9, + 0xa9, 0x46, 0x8c, 0x61, 0xd6, 0x1a, 0x2e, 0x47, + 0x12, 0x66, 0x6c, 0xef, 0x8e, 0x15, 0x37, 0xeb, + 0x34, 0xc2, 0x10, 0x5f, 0x60, 0x74, 0xe7, 0x4b, + 0x27, 0x3c, 0xe7, 0x1f, 0xa3, 0xec, 0x73, 0xd6, + 0x63, 0xdb, 0xfd, 0x3d, 0x82, 0xab, 0x20, 0x3d, + 0x2e, 0x8c, 0x7c, 0xaa, 0xd9, 0xb8, 0xb6, 0xc9, + 0x5e, 0xdf, 0x90, 0x15, 0xc0, 0xdb, 0xed, 0x21, + 0xbc, 0x99, 0x9c, 0xb8, 0xb6, 0xfd, 0x69, 0x16, + 0xc0, 0x03, 0x34, 0xf0, 0xa0, 0x6e, 0x83, 0xb7, + 0xb0, 0xfb, 0x8f, 0xf0, 0x92, 0x46, 0x78, 0x40, + 0x14, 0x3f, 0x48, 0x23, 0xe5, 0x8e, 0x32, 0xbb, + 0x75, 0x8c, 0x4f, 0x70, 0x49, 0x74, 0xd9, 0x23, + 0x04, 0xfb, 0xc1, 0xc4, 0xf5, 0x2f, 0x67, 0xe8, + 0x17, 0xa6, 0xbf, 0x07, 0x08, 0x9e, 0x41, 0xea, + 0xe5, 0xcd, 0xe1, 0xaf, 0x4b, 0x2a, 0x47, 0x29, + 0x1a, 0x0e, 0x9a, 0x4d, 0x8b, 0x6a, 0x0e, 0xd9, + 0x29, 0xf4, 0x52, 0x04, 0x3e, 0xa4, 0x88, 0x54, + 0x32, 0xe8, 0x14, 0x13, 0x78, 0xb1, 0x1e, 0x37, + 0x5e, 0x4e, 0xb1, 0x8d, 0x41, 0x43, 0xb4, 0x03, + 0xbd, 0xb8, 0x29, 0x1c, 0xa8, 0xb8, 0x59, 0x18, + 0x02, 0x99, 0x70, 0x1c, 0x72, 0x7c, 0x1b, 0xc0, + 0x9b, 0x51, 0x56, 0xf9, 0xe6, 0xfa, 0x26, 0x61, + 0xdd, 0xf0, 0x56, 0x81, 0x90, 0xe3, 0x8a, 0x84, + 0x09, 0x40, 0x01, 0xe1, 0x67, 0xfa, 0x22, 0x56, + 0x4f, 0x56, 0x62, 0x42, 0xde, 0x9a, 0xf1, 0x2c, + 0x7a, 0x43, 0xb5, 0xe6, 0x26, 0xae, 0xf1, 0x31, + 0x53, 0xed, 0x02, 0x2d, 0xc7, 0x2e, 0xa4, 0x2d, + 0x60, 0x18, 0x1c, 0x76, 0x00, 0x57, 0x87, 0xc3, + 0x95, 0x71, 0x83, 0x9c, 0x6b, 0xac, 0x67, 0xea, + 0x21, 0x7d, 0x06, 0x96, 0x75, 0x1e, 0x78, 0x21, + 0x65, 0xe3, 0x59, 0x80, 0x3d, 0x9d, 0x17, 0x43, + 0x3a, 0x5e, 0xcd, 0xd1, 0x52, 0xcf, 0xb6, 0xe1, + 0x33, 0x5a, 0x88, 0x1d, 0xa2, 0xa7, 0xab, 0x21, + 0x69, 0x0a, 0x94, 0x2b, 0x6f, 0xa2, 0x35, 0x53, + 0xe7, 0x32, 0x17, 0xf6, 0x30, 0x81, 0xdf, 0x43, + 0x06, 0x7f, 0x43, 0x4c, 0xf8, 0x3f, 0xab, 0x93, + 0x15, 0x3c, 0xcb, 0x0e, 0xf0, 0x08, 0xb2, 0x88, + 0x8d, 0x03, 0x3d, 0x5d, 0x0d, 0x69, 0x32, 0x18, + 0xb9, 0x49, 0x62, 0x06, 0x3e, 0x8a, 0x40, 0x5b, + 0xe9, 0x2a, 0xfc, 0x7a, 0xb2, 0x34, 0xa0, 0xe4, + 0x72, 0x33, 0x95, 0x62, 0xd2, 0x09, 0x07, 0x72, + 0xca, 0x1b, 0x3a, 0x55, 0xa5, 0x80, 0x39, 0xd9, + 0xeb, 0x7e, 0xfd, 0x65, 0x32, 0x19, 0x7f, 0x29, + 0xbb, 0x5d, 0x3a, 0x13, 0x8c, 0x47, 0xb3, 0xee, + 0x3a, 0x2c, 0x72, 0x1c, 0x56, 0xc4, 0x11, 0x25, + 0xab, 0xa0, 0xd3, 0xcd, 0xe2, 0xb1, 0xe7, 0x9e, + 0x25, 0x33, 0x50, 0xee, 0x54, 0xd3, 0x9d, 0x47, + 0x8e, 0x01, 0xc0, 0x12, 0x4d, 0xc0, 0xea, 0x8d, + 0x70, 0x27, 0x0b, 0x2b, 0xd3, 0x03, 0x8d, 0x5a, + 0x21, 0xd5, 0x22, 0x8a, 0x7e, 0x97, 0x5e, 0x98, + 0xac, 0x23, 0x69, 0x31, 0x73, 0x3a, 0x06, 0x9d, + 0x8d, 0xa6, 0xbd, 0x71, 0x59, 0xcf, 0xed, 0x23, + 0x69, 0xdd, 0xd1, 0x9f, 0x3d, 0xe1, 0xe3, 0x87, + 0xb8, 0xdb, 0xd0, 0x80, 0x7c, 0xc4, 0x64, 0x53, + 0x5a, 0xfd, 0x5c, 0xd1, 0x11, 0x24, 0xfe, 0xfd, + 0x92, 0x50, 0x12, 0x7e, 0x21, 0xa5, 0xbe, 0xf7, + 0x17, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0xb3, + 0x46, 0x9a, 0x56, 0x76, 0x09, 0x00, 0x00, 0xbd, + 0x52, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, + 0x33, 0x35, 0x35, 0x2e, 0x78, 0x6d, 0x6c, 0xed, + 0x1c, 0xd9, 0x72, 0xd3, 0x30, 0xf0, 0xbd, 0x5f, + 0x61, 0x78, 0x82, 0x19, 0x4a, 0xe2, 0xa4, 0x29, + 0x29, 0x13, 0xcc, 0xa4, 0x39, 0xa0, 0x4c, 0xd3, + 0x86, 0xa4, 0x1c, 0x6f, 0x1d, 0xd5, 0x56, 0x5a, + 0x0f, 0x8e, 0x6d, 0x2c, 0x07, 0x52, 0xbe, 0x9e, + 0x95, 0x2d, 0x47, 0xb6, 0x65, 0x3b, 0x4a, 0x6a, + 0xb7, 0xc9, 0x40, 0x87, 0x43, 0x5a, 0xed, 0x4a, + 0x7b, 0xeb, 0xb2, 0xda, 0x79, 0xbf, 0x9c, 0x5b, + 0xca, 0x2f, 0xec, 0x11, 0xd3, 0xb1, 0xdf, 0x3d, + 0x57, 0x5f, 0xd7, 0x9f, 0xbf, 0xd7, 0x0e, 0x3a, + 0x06, 0xfe, 0x65, 0xea, 0xf8, 0xd0, 0xb4, 0x67, + 0x8e, 0x37, 0x47, 0x3e, 0xb4, 0x25, 0x71, 0xb4, + 0x03, 0x05, 0x7e, 0x18, 0x5a, 0x58, 0x61, 0x00, + 0xa2, 0x7b, 0xa6, 0x4b, 0x09, 0xb4, 0xd1, 0x74, + 0x7c, 0xd4, 0xac, 0x0f, 0x27, 0x8d, 0x66, 0xab, + 0xd5, 0xa9, 0xc5, 0x5b, 0x94, 0xce, 0xb3, 0xc3, + 0x43, 0x85, 0xb7, 0xab, 0xaa, 0x72, 0x78, 0x18, + 0xeb, 0xc5, 0x34, 0x46, 0x88, 0xfc, 0x08, 0x01, + 0x2b, 0x20, 0x1b, 0x5f, 0xab, 0x2f, 0x67, 0xf0, + 0xd3, 0xa9, 0xb1, 0x7a, 0x0a, 0x8b, 0x2c, 0x6e, + 0xd2, 0x88, 0x0c, 0x24, 0xe2, 0x7a, 0xc0, 0x3d, + 0xc3, 0xa4, 0x78, 0x41, 0x55, 0xc4, 0x9a, 0xa3, + 0xe5, 0x24, 0x89, 0x18, 0x87, 0x70, 0xa6, 0x6b, + 0x2b, 0xae, 0xb9, 0x18, 0x3d, 0xc7, 0xc0, 0xb9, + 0x62, 0xb4, 0x9b, 0xf5, 0x5e, 0x28, 0x06, 0xd7, + 0x09, 0x40, 0x1b, 0xb3, 0x3a, 0x68, 0xa3, 0x40, + 0x2c, 0x39, 0x89, 0xea, 0xf5, 0x32, 0x24, 0x4a, + 0x0a, 0xd0, 0x71, 0x09, 0xd2, 0x26, 0xf8, 0x76, + 0x61, 0x21, 0xaf, 0x53, 0xa3, 0x15, 0xde, 0x74, + 0x63, 0xfa, 0x44, 0x6b, 0xc0, 0xa0, 0x41, 0x81, + 0xc3, 0x91, 0xa7, 0xdf, 0x99, 0x3e, 0xd6, 0xfd, + 0x85, 0x87, 0xb5, 0x9e, 0xbb, 0xf8, 0xfe, 0xab, + 0xd1, 0xa9, 0x25, 0x80, 0x1c, 0x17, 0xe3, 0xb9, + 0x36, 0x18, 0x0d, 0xbe, 0x5f, 0x4f, 0x47, 0xdd, + 0xf3, 0xf3, 0xeb, 0xd6, 0xf7, 0xef, 0x9d, 0x1a, + 0xc0, 0x98, 0x6e, 0x82, 0x96, 0x8b, 0xcb, 0x8b, + 0xc1, 0xab, 0xa0, 0x74, 0x7e, 0xf9, 0xed, 0x55, + 0x08, 0x1b, 0x0d, 0xfa, 0x67, 0x5f, 0x46, 0xac, + 0xf2, 0xf1, 0xec, 0xc3, 0x47, 0x56, 0x1c, 0x7c, + 0xbf, 0x9a, 0x74, 0x79, 0x5f, 0x21, 0x94, 0xd7, + 0x13, 0xd4, 0x31, 0xc0, 0x79, 0x77, 0xf2, 0x61, + 0x10, 0xab, 0xf7, 0x2e, 0x27, 0x57, 0x14, 0xef, + 0x28, 0xe9, 0xa4, 0xba, 0xe5, 0xe8, 0x3f, 0xce, + 0x20, 0x40, 0x38, 0x8c, 0xc3, 0x7b, 0x8e, 0xed, + 0x7b, 0x8e, 0xa5, 0x7d, 0xe8, 0xf5, 0x28, 0x1b, + 0x83, 0x8b, 0xfe, 0xa0, 0xdf, 0xa9, 0xc5, 0x9b, + 0x98, 0x50, 0x80, 0x10, 0xca, 0x14, 0x94, 0xa6, + 0x57, 0xdd, 0x8b, 0x7e, 0x77, 0xd2, 0xa7, 0x35, + 0x4e, 0x98, 0x6c, 0xbb, 0x3e, 0x5b, 0xf1, 0x11, + 0x57, 0x5c, 0x8f, 0xf6, 0x4d, 0x94, 0x9a, 0xd8, + 0x72, 0x65, 0xce, 0xc1, 0x59, 0x56, 0x70, 0xb1, + 0x4d, 0x31, 0x6d, 0x03, 0x2f, 0xdf, 0x3d, 0x8f, + 0xc2, 0x5a, 0x40, 0xb4, 0xd1, 0x1c, 0x6b, 0xdd, + 0x3e, 0x78, 0x2b, 0x2d, 0xe5, 0x20, 0xfd, 0x42, + 0xd6, 0x02, 0x83, 0x3f, 0x19, 0xed, 0x4e, 0x2d, + 0x2c, 0x8b, 0x23, 0xd6, 0xa2, 0x21, 0x25, 0xb8, + 0x51, 0x0b, 0xb9, 0x19, 0x83, 0x51, 0xa4, 0xd8, + 0x69, 0xd5, 0xcb, 0x61, 0xa7, 0x51, 0xc8, 0x4e, + 0xcf, 0x99, 0xbb, 0xc8, 0x43, 0xbe, 0xe3, 0x29, + 0x83, 0xba, 0x14, 0x5f, 0xe8, 0xa4, 0x1c, 0xbe, + 0x9a, 0xd2, 0x7c, 0xa9, 0x72, 0x7c, 0xa1, 0x72, + 0xf8, 0x3a, 0x2a, 0xe4, 0x0b, 0x7f, 0x99, 0xf6, + 0xce, 0xba, 0x72, 0x9a, 0x6a, 0xe8, 0xe5, 0x70, + 0xd4, 0x92, 0xe0, 0x48, 0x4e, 0x47, 0x0d, 0xa3, + 0x1c, 0x8e, 0x8e, 0xd7, 0x73, 0x74, 0x2a, 0xa7, + 0xa3, 0x66, 0x49, 0x5e, 0xfe, 0x46, 0x82, 0x23, + 0x39, 0x1d, 0x35, 0xd5, 0x72, 0x38, 0x6a, 0x17, + 0x72, 0x34, 0xb9, 0x92, 0x4b, 0x4a, 0xed, 0x1c, + 0xaf, 0xe6, 0xeb, 0x96, 0x19, 0x5a, 0x58, 0xfe, + 0xd4, 0x77, 0x5c, 0xcd, 0xf7, 0x16, 0xb8, 0x53, + 0x8b, 0x41, 0x1e, 0x28, 0xc1, 0x49, 0xa1, 0x04, + 0x01, 0x6a, 0xfd, 0xfa, 0xb4, 0x29, 0x25, 0xc7, + 0xc9, 0x9b, 0xa7, 0x93, 0x43, 0xad, 0xaf, 0x17, + 0x44, 0x95, 0x16, 0xa4, 0xfd, 0x84, 0x82, 0xa8, + 0xeb, 0x05, 0x69, 0x48, 0x0b, 0x72, 0xf2, 0x84, + 0x82, 0x34, 0xd6, 0x0b, 0xd2, 0xbc, 0x3e, 0x7d, + 0x23, 0x27, 0x88, 0xf1, 0x84, 0x82, 0x14, 0xcf, + 0x62, 0xdf, 0x90, 0xaf, 0xdf, 0x19, 0xce, 0xad, + 0x12, 0x10, 0x49, 0x49, 0xf3, 0x38, 0xf1, 0x1e, + 0x2c, 0xe1, 0x86, 0x30, 0xb9, 0x22, 0xcb, 0x52, + 0x08, 0x90, 0xba, 0xe8, 0xc6, 0xc2, 0xca, 0xd9, + 0x98, 0x1c, 0x14, 0x2f, 0x26, 0x68, 0x56, 0x5b, + 0x3f, 0x63, 0x33, 0x49, 0x95, 0x0b, 0xc7, 0xc7, + 0x6f, 0xa1, 0x57, 0x85, 0x56, 0x0f, 0xf2, 0x65, + 0x66, 0x31, 0xb5, 0xa2, 0xf0, 0xef, 0x4c, 0xa2, + 0xc0, 0x1f, 0xff, 0x0e, 0x2b, 0xe3, 0xb3, 0xfe, + 0x81, 0x94, 0x48, 0x02, 0xaf, 0x34, 0x7f, 0x6d, + 0x99, 0xbb, 0x32, 0xf2, 0xd6, 0x76, 0x4c, 0x34, + 0x69, 0xee, 0xd9, 0x32, 0xef, 0xc8, 0xe4, 0x9c, + 0x4d, 0x1c, 0x42, 0x9e, 0x69, 0x9a, 0x67, 0x1e, + 0xe2, 0xd1, 0x12, 0xde, 0x5c, 0x06, 0xe3, 0xaf, + 0x5f, 0xbf, 0x4e, 0xd4, 0x0f, 0x0f, 0xf3, 0xe8, + 0x48, 0x7c, 0x77, 0x18, 0xdb, 0x00, 0x71, 0x86, + 0x1d, 0xcb, 0x47, 0xb7, 0x98, 0x43, 0x79, 0x8b, + 0xae, 0x8f, 0x4c, 0x5b, 0x53, 0xdb, 0x74, 0x63, + 0xca, 0x2a, 0x22, 0x06, 0x5a, 0x6a, 0xcd, 0x63, + 0x8a, 0x11, 0x56, 0x44, 0x8c, 0xa1, 0x85, 0xc8, + 0x1d, 0xef, 0x28, 0x06, 0x11, 0x71, 0xa7, 0x58, + 0x87, 0xfd, 0x25, 0x6d, 0x6a, 0xb4, 0x28, 0x32, + 0x07, 0x89, 0xd8, 0xae, 0xcb, 0x9b, 0x8e, 0xeb, + 0x14, 0x1b, 0x40, 0xeb, 0xb1, 0x81, 0xc5, 0x37, + 0x49, 0x6c, 0x91, 0x6b, 0x1f, 0x13, 0xff, 0xab, + 0x1b, 0x59, 0x87, 0xd5, 0xe2, 0x8a, 0xcc, 0x54, + 0x5a, 0x67, 0x86, 0x11, 0xdd, 0x1e, 0x93, 0xac, + 0xed, 0xe5, 0xf4, 0x9e, 0xf8, 0xb0, 0x2f, 0x1e, + 0x5d, 0xf6, 0xaf, 0x2f, 0xa7, 0xb0, 0x02, 0x8a, + 0x01, 0x53, 0xe8, 0x96, 0x3e, 0xc3, 0x6c, 0x64, + 0x5a, 0x4c, 0xb5, 0xfe, 0x5c, 0x98, 0xfa, 0x8f, + 0x11, 0x9e, 0x4f, 0x30, 0x32, 0x18, 0x56, 0x1c, + 0x94, 0xc2, 0xbe, 0x43, 0x64, 0xe8, 0xa1, 0x39, + 0x43, 0x64, 0xb5, 0xb8, 0x20, 0x22, 0xcb, 0x1d, + 0xbc, 0xf4, 0x87, 0x22, 0xb4, 0x96, 0x0d, 0x76, + 0x9d, 0xdf, 0xd8, 0x9b, 0x62, 0xdf, 0x37, 0xed, + 0x5b, 0x92, 0xa1, 0x45, 0x38, 0x7a, 0xe8, 0x9b, + 0x84, 0xa6, 0xd8, 0x73, 0x77, 0xde, 0x82, 0xb8, + 0x50, 0x21, 0xa2, 0xc5, 0x86, 0x6c, 0xca, 0xe6, + 0x57, 0x7a, 0x3c, 0x03, 0x44, 0x47, 0x75, 0x7a, + 0x4c, 0x91, 0x80, 0xe6, 0x51, 0x0c, 0xec, 0xa8, + 0x4f, 0x4e, 0xc7, 0xdb, 0xd6, 0x8d, 0x07, 0x2c, + 0xe5, 0x93, 0x4b, 0xf0, 0xdb, 0x0f, 0x03, 0x99, + 0x9e, 0xf8, 0xa4, 0x61, 0xd9, 0x24, 0x21, 0x4b, + 0xa2, 0x6e, 0xd6, 0xb1, 0xca, 0x14, 0xa3, 0xd6, + 0xeb, 0x31, 0xa2, 0x7c, 0xbd, 0x30, 0x1e, 0x02, + 0x8a, 0xc0, 0xf9, 0x93, 0xf0, 0xb8, 0x9d, 0x05, + 0x8b, 0xf2, 0x79, 0x73, 0x55, 0x19, 0xa1, 0x7b, + 0xe5, 0x16, 0xdb, 0x18, 0x26, 0x3d, 0xac, 0xe8, + 0x8e, 0x8d, 0x6d, 0x5f, 0x71, 0x66, 0x0a, 0x46, + 0xfa, 0x9d, 0x02, 0x71, 0xa1, 0xdc, 0x20, 0x82, + 0x0d, 0x05, 0x4e, 0x20, 0x3f, 0x5d, 0x75, 0x3f, + 0xc0, 0x2c, 0x78, 0xf8, 0xbd, 0xdb, 0xbb, 0x52, + 0x0c, 0xe4, 0xa3, 0xa8, 0x0b, 0x36, 0xdd, 0xcd, + 0x60, 0xce, 0x84, 0xe3, 0xc4, 0xe5, 0x72, 0x59, + 0x3b, 0x82, 0x7f, 0x18, 0x61, 0x78, 0x46, 0x49, + 0x36, 0xf2, 0xb2, 0xaa, 0x14, 0x52, 0x86, 0xb1, + 0x1e, 0x37, 0x02, 0x36, 0xf6, 0xc1, 0xc7, 0x0f, + 0x9a, 0x5c, 0x2f, 0xcb, 0x74, 0x8f, 0xd6, 0xc9, + 0x9e, 0x79, 0x46, 0xbd, 0xbe, 0xbd, 0x73, 0xd0, + 0x31, 0xb7, 0xf0, 0x0f, 0xbd, 0x8e, 0x1e, 0xcb, + 0x3f, 0xf4, 0x87, 0xfa, 0x07, 0xda, 0xde, 0x3f, + 0x12, 0xc7, 0xb9, 0x73, 0x3c, 0x77, 0xbc, 0xfb, + 0x73, 0x74, 0xef, 0x2c, 0x18, 0xe7, 0xa9, 0xa6, + 0x60, 0xf1, 0xfd, 0xee, 0xf9, 0xa9, 0xe3, 0xf8, + 0xf4, 0x54, 0x3c, 0x6b, 0x69, 0xe7, 0xdf, 0xbb, + 0x70, 0x24, 0xe1, 0xcc, 0x3b, 0x35, 0x5a, 0xe2, + 0x08, 0xc9, 0x43, 0x72, 0xf5, 0x38, 0x7d, 0x48, + 0xce, 0x8f, 0xf9, 0x7d, 0xe4, 0x05, 0xce, 0xd2, + 0xa5, 0x76, 0x0b, 0x6a, 0x59, 0x58, 0xe6, 0x1f, + 0xba, 0x28, 0x0c, 0xd6, 0x49, 0xb4, 0x9c, 0x85, + 0x82, 0x6f, 0xe7, 0x90, 0x47, 0xa7, 0x21, 0x26, + 0x1c, 0xc5, 0x70, 0x40, 0x26, 0x5f, 0xc8, 0xfe, + 0x41, 0x34, 0x40, 0x0b, 0x0b, 0x22, 0xc2, 0x1c, + 0xb9, 0x2e, 0x8e, 0x96, 0x08, 0xac, 0x22, 0x62, + 0xb9, 0x9e, 0x43, 0x0f, 0xf5, 0xa9, 0x09, 0x18, + 0x2a, 0x87, 0x44, 0xc3, 0x8a, 0x8a, 0xed, 0xea, + 0x10, 0x84, 0x6c, 0xd0, 0x6c, 0x95, 0x52, 0x9d, + 0xeb, 0xa0, 0x73, 0x50, 0x6d, 0x88, 0x9c, 0xab, + 0xe0, 0x5a, 0xba, 0x4b, 0xb1, 0x4d, 0x3b, 0x10, + 0xb6, 0x70, 0x4f, 0x6e, 0x6e, 0xc4, 0xcd, 0xcd, + 0x92, 0x95, 0x61, 0xce, 0x66, 0xd8, 0xa3, 0x53, + 0x61, 0x00, 0x56, 0x90, 0x61, 0x78, 0x20, 0x92, + 0xe2, 0x3a, 0x84, 0x98, 0xa0, 0xcd, 0x5c, 0xaf, + 0x68, 0x33, 0xa7, 0x10, 0x3b, 0xa2, 0x50, 0x99, + 0x7e, 0xfe, 0xbb, 0x4e, 0xae, 0xeb, 0xa4, 0xb7, + 0x49, 0x45, 0x8e, 0x43, 0xac, 0x6a, 0x7d, 0xa6, + 0x2e, 0x91, 0x22, 0xda, 0xff, 0x4e, 0x8a, 0x20, + 0xd6, 0xca, 0xc4, 0x1f, 0x26, 0x0f, 0x33, 0x72, + 0xb1, 0x55, 0x1b, 0x95, 0x9a, 0x75, 0x38, 0xec, + 0x49, 0xd8, 0xf5, 0xe8, 0xbf, 0x5d, 0x1f, 0x6c, + 0xd7, 0xe2, 0xbc, 0x0f, 0xe3, 0xd6, 0x2a, 0x37, + 0xf6, 0xff, 0x18, 0xae, 0xcc, 0xd6, 0xf2, 0x89, + 0x1a, 0xbe, 0x49, 0xc8, 0x37, 0x32, 0xbe, 0x35, + 0xe1, 0x50, 0xc5, 0x0b, 0x79, 0xc9, 0xb5, 0xe4, + 0x7a, 0x23, 0xaa, 0x8f, 0x6e, 0xc3, 0x19, 0xb2, + 0xc8, 0xca, 0x88, 0x32, 0x5a, 0x4a, 0x6a, 0x65, + 0x80, 0xe7, 0xd5, 0x6b, 0xa5, 0xbd, 0x6f, 0x5a, + 0x19, 0x21, 0xd3, 0xce, 0x57, 0x0b, 0x7a, 0x78, + 0x46, 0x68, 0x4b, 0x66, 0x84, 0x47, 0x57, 0xdc, + 0x06, 0x29, 0x81, 0xea, 0xb8, 0xb4, 0x9c, 0x40, + 0x8f, 0x18, 0x47, 0x31, 0xdc, 0x53, 0x44, 0xfb, + 0xa6, 0x4d, 0x39, 0x54, 0xbf, 0x3d, 0xf8, 0xb0, + 0x68, 0x1c, 0x8e, 0xbd, 0xfa, 0x9c, 0x29, 0x13, + 0x93, 0x2d, 0x85, 0xa9, 0x96, 0x8e, 0x41, 0x9f, + 0xac, 0xca, 0x09, 0xb2, 0x8c, 0x18, 0x60, 0x0b, + 0x56, 0x14, 0x75, 0x46, 0x7e, 0xb0, 0x2f, 0xab, + 0x68, 0xb1, 0x00, 0xd3, 0xfd, 0x6d, 0xd0, 0xe3, + 0xfd, 0xe0, 0x78, 0x1a, 0xca, 0x39, 0x32, 0xd5, + 0xd6, 0x0a, 0x25, 0x97, 0x14, 0x37, 0x99, 0x00, + 0x2b, 0x77, 0xf5, 0x99, 0x2a, 0xe1, 0xea, 0xb3, + 0x9d, 0xf3, 0xf4, 0x12, 0x1c, 0x97, 0xed, 0xcc, + 0x16, 0x04, 0x87, 0x37, 0x74, 0x14, 0x08, 0x77, + 0x46, 0x8a, 0x0e, 0x28, 0xf4, 0xe4, 0xf3, 0xe2, + 0x52, 0x19, 0x8d, 0xbf, 0x6c, 0xd0, 0xf7, 0x70, + 0xb2, 0x3c, 0x91, 0xec, 0x3b, 0xb7, 0xe3, 0xb9, + 0xbb, 0x60, 0xa2, 0x43, 0x29, 0xea, 0x06, 0x62, + 0x82, 0x75, 0x83, 0x6e, 0xe1, 0x04, 0xd6, 0xba, + 0x57, 0xcc, 0xa0, 0x0b, 0x7a, 0xa9, 0x88, 0x7e, + 0x21, 0xd3, 0xa2, 0xd1, 0xfd, 0x5a, 0xb9, 0x84, + 0x0b, 0x46, 0xef, 0xb7, 0x09, 0x23, 0x18, 0x8e, + 0x62, 0x3b, 0xbe, 0x12, 0xf8, 0xeb, 0x8a, 0x52, + 0x2e, 0x50, 0xd9, 0x90, 0xdd, 0x68, 0xc8, 0x1b, + 0x7a, 0xa7, 0x01, 0xe3, 0xb1, 0x63, 0x3a, 0x85, + 0x2c, 0x5c, 0xd7, 0xf1, 0xa2, 0xbe, 0xdd, 0x15, + 0x61, 0x75, 0x01, 0xce, 0x38, 0xc2, 0xc1, 0x99, + 0x54, 0xcd, 0x08, 0xcf, 0x96, 0x14, 0x68, 0xda, + 0xbf, 0xc8, 0x97, 0x5f, 0x0e, 0xd1, 0x5b, 0xa8, + 0x4a, 0xe3, 0x5e, 0x6d, 0x4b, 0xc4, 0x7d, 0x63, + 0xe7, 0xe2, 0xfe, 0x5f, 0x9a, 0xe1, 0x1a, 0xff, + 0xc4, 0x0c, 0xf7, 0xdf, 0xd3, 0xcb, 0x9d, 0xe1, + 0xca, 0x98, 0x85, 0xfc, 0x0a, 0xa7, 0xce, 0x5d, + 0x99, 0xe1, 0x50, 0x62, 0x86, 0x0b, 0x06, 0x5d, + 0x89, 0x40, 0x1f, 0x5c, 0x28, 0x2f, 0xe8, 0xdd, + 0xe6, 0x4b, 0x61, 0xa2, 0x4b, 0xb0, 0x04, 0x64, + 0xf4, 0xb3, 0x1e, 0x36, 0x39, 0x56, 0x97, 0x02, + 0x84, 0x39, 0xf0, 0x06, 0x05, 0x73, 0x60, 0x70, + 0x9b, 0x76, 0x76, 0x31, 0xbc, 0x54, 0x42, 0x77, + 0xd9, 0xbf, 0x54, 0x21, 0x3f, 0x25, 0x8e, 0x31, + 0x3c, 0x5c, 0x01, 0xfb, 0x23, 0x4b, 0x3d, 0x06, + 0xa5, 0x6c, 0xbf, 0x2f, 0x96, 0x4d, 0x1c, 0xeb, + 0xb3, 0xc6, 0xf1, 0x9e, 0xe6, 0x8c, 0x48, 0x45, + 0x21, 0x66, 0x6b, 0xb9, 0x2c, 0xef, 0x94, 0xa7, + 0xd0, 0x66, 0x8d, 0xea, 0x8d, 0xd6, 0x58, 0x6f, + 0xb5, 0xe1, 0x60, 0x5f, 0x73, 0x7d, 0x95, 0x76, + 0x83, 0x59, 0x5a, 0xde, 0x90, 0x95, 0xdb, 0x71, + 0xad, 0x11, 0xd5, 0xdd, 0x3b, 0x7d, 0xd9, 0x01, + 0x2b, 0x16, 0x67, 0xd0, 0x2b, 0xd3, 0xbe, 0x87, + 0x15, 0x55, 0xa5, 0xab, 0xad, 0xe3, 0xf5, 0x96, + 0xeb, 0xee, 0x98, 0xdd, 0x2a, 0xdb, 0x53, 0x84, + 0xfa, 0xb6, 0x0d, 0x87, 0xad, 0xa3, 0xca, 0xb8, + 0xfa, 0xdc, 0x24, 0x68, 0x77, 0xc4, 0xde, 0x68, + 0xc7, 0xec, 0xfd, 0x94, 0xe6, 0x93, 0x0f, 0xd6, + 0xaa, 0x0d, 0xd7, 0x90, 0x39, 0xe3, 0xde, 0xc1, + 0x2c, 0xbb, 0x49, 0xb4, 0x6e, 0x17, 0x36, 0x3b, + 0xa1, 0xf9, 0x9d, 0xba, 0x5b, 0xde, 0xc6, 0x7f, + 0xcf, 0xcd, 0x9b, 0x4a, 0x6f, 0x6d, 0x87, 0x5d, + 0x99, 0x2b, 0xfa, 0xd6, 0x7e, 0x3b, 0xf0, 0x46, + 0xf9, 0xaa, 0xe4, 0x8f, 0x6c, 0x36, 0x09, 0x99, + 0xaa, 0x8d, 0x7d, 0x24, 0x13, 0x32, 0xcd, 0xdd, + 0xb3, 0xf5, 0x13, 0x99, 0x2e, 0x19, 0xa5, 0x1b, + 0x2d, 0xf4, 0xbf, 0x90, 0x9b, 0xaa, 0xf3, 0x9f, + 0xaa, 0x4b, 0x18, 0x73, 0xf7, 0xbe, 0xb7, 0x90, + 0xb5, 0x65, 0xa0, 0xc1, 0xa7, 0x36, 0xe3, 0x39, + 0x46, 0x7c, 0xcb, 0x56, 0xf9, 0x6e, 0x0d, 0xde, + 0xbc, 0xc9, 0x58, 0x74, 0x4f, 0x0d, 0xfa, 0x98, + 0xfb, 0xb5, 0xb5, 0x56, 0xad, 0x3a, 0x38, 0x1b, + 0x32, 0xc1, 0xb9, 0x5b, 0xcb, 0xc2, 0x52, 0x54, + 0xfb, 0x85, 0x90, 0xc7, 0x0c, 0x18, 0x2c, 0xa7, + 0xe5, 0xdd, 0x51, 0xf2, 0xbe, 0x46, 0x8c, 0x6e, + 0x54, 0x1a, 0x2e, 0x27, 0x12, 0x66, 0x6c, 0xed, + 0x8e, 0x15, 0xd7, 0xeb, 0x34, 0xc4, 0x10, 0x9f, + 0x60, 0x74, 0x66, 0x0b, 0x3b, 0x38, 0xe8, 0x1f, + 0xa1, 0xf4, 0x7b, 0xd6, 0x53, 0xcb, 0xf9, 0x3d, + 0x84, 0xbb, 0x20, 0x2d, 0x2a, 0x0c, 0x3d, 0xaa, + 0xd9, 0xa8, 0xb6, 0xce, 0x5e, 0xdf, 0x90, 0xe9, + 0xc3, 0xe3, 0xed, 0x01, 0x3c, 0x9a, 0x1c, 0x3b, + 0x96, 0xf5, 0x69, 0xea, 0xc3, 0x0b, 0x34, 0xf0, + 0xa0, 0x4e, 0x8d, 0xb7, 0xb0, 0x0b, 0x90, 0xe0, + 0x96, 0x46, 0x78, 0x41, 0x14, 0xbd, 0x48, 0x23, + 0xc5, 0x8e, 0x32, 0xbd, 0xb7, 0xf5, 0x4f, 0x70, + 0x4b, 0x74, 0xdd, 0x25, 0x04, 0x7b, 0xfe, 0xd8, + 0xf1, 0xae, 0xa7, 0xe8, 0x17, 0xa6, 0xbf, 0x08, + 0x08, 0xde, 0x41, 0x6a, 0xc5, 0xcd, 0xc1, 0xef, + 0x4b, 0x2a, 0x46, 0xc9, 0x1b, 0x0e, 0x9a, 0x0d, + 0x93, 0x6a, 0x0e, 0x59, 0x09, 0xf4, 0x42, 0x04, + 0x3e, 0xa4, 0x88, 0x54, 0x30, 0xe8, 0x04, 0x13, + 0x78, 0xb2, 0x1e, 0x35, 0x5e, 0x4f, 0xb0, 0x85, + 0x41, 0x43, 0xb4, 0x03, 0x2d, 0xbf, 0x29, 0x18, + 0x28, 0xbf, 0x59, 0x18, 0x02, 0x19, 0x70, 0x1e, + 0x72, 0x7a, 0xef, 0xc3, 0xa3, 0x51, 0x56, 0xf9, + 0xe6, 0x78, 0x06, 0x61, 0xdd, 0xf0, 0x56, 0x81, + 0x90, 0xe3, 0x8a, 0x84, 0x31, 0x40, 0x0e, 0xe1, + 0x67, 0xfa, 0x24, 0x56, 0x8b, 0x57, 0x22, 0x42, + 0xde, 0x9a, 0xf2, 0x2c, 0x7a, 0x45, 0xb5, 0xe2, + 0x26, 0xaa, 0xf1, 0x31, 0x13, 0xed, 0x02, 0x2d, + 0xc7, 0xce, 0xa5, 0xcd, 0x61, 0x18, 0x1c, 0xb6, + 0x0f, 0x77, 0x87, 0x83, 0xa5, 0x7e, 0x87, 0xec, + 0x5b, 0xac, 0xa5, 0xea, 0x01, 0x7d, 0x0a, 0x96, + 0x76, 0x1e, 0x78, 0x22, 0x65, 0xe1, 0xa9, 0x8f, + 0x5d, 0x8d, 0x17, 0x03, 0x3a, 0x5e, 0xcd, 0xd0, + 0x52, 0xd7, 0xb2, 0xe0, 0x3b, 0x5a, 0x88, 0x1d, + 0xa2, 0x25, 0xab, 0x01, 0x69, 0x02, 0x94, 0x29, + 0x6f, 0xac, 0x35, 0x55, 0xe7, 0x32, 0xe7, 0xf6, + 0x30, 0x86, 0x5f, 0x44, 0x06, 0x7f, 0x03, 0x4c, + 0xf8, 0x3f, 0xad, 0x93, 0x25, 0xbc, 0xcb, 0xf6, + 0xf1, 0x10, 0xb2, 0x88, 0x85, 0x7d, 0x2d, 0x59, + 0x0d, 0x68, 0x52, 0x18, 0x99, 0x49, 0x62, 0x0a, + 0x3e, 0x8a, 0x40, 0x5b, 0xc9, 0x2a, 0xfc, 0x7e, + 0xb2, 0x24, 0xa0, 0xe0, 0x76, 0x33, 0x91, 0x62, + 0x92, 0x09, 0x07, 0x72, 0xca, 0x1b, 0x3a, 0x55, + 0x25, 0x80, 0x19, 0xd9, 0xeb, 0x61, 0xfd, 0xa5, + 0x32, 0x19, 0x7f, 0x2a, 0xbb, 0x59, 0x3a, 0x13, + 0x8c, 0x47, 0xb3, 0xee, 0x2a, 0x2c, 0x32, 0x1c, + 0x56, 0xc4, 0x11, 0x25, 0x2b, 0xa1, 0xd3, 0xf5, + 0xe2, 0xb1, 0xf7, 0x9e, 0x05, 0x33, 0x50, 0xe6, + 0x54, 0xd3, 0x99, 0x85, 0x8e, 0x01, 0xc0, 0x02, + 0x4d, 0xc0, 0xea, 0x8d, 0x70, 0x27, 0x0b, 0x2a, + 0x93, 0x23, 0x95, 0x5a, 0x21, 0xd1, 0x22, 0x8a, + 0xbe, 0x4d, 0x2f, 0x4c, 0xd6, 0xa1, 0xb4, 0x98, + 0x19, 0x1d, 0x83, 0xce, 0x86, 0x93, 0xee, 0xa8, + 0xa8, 0xe7, 0xd6, 0x89, 0xb4, 0xee, 0xe8, 0xcf, + 0x81, 0xf0, 0xf5, 0x43, 0xd4, 0x6d, 0x60, 0x40, + 0x3e, 0x62, 0xbc, 0x29, 0xa9, 0x7e, 0xae, 0xe8, + 0x10, 0x12, 0xfd, 0x82, 0x49, 0x28, 0x09, 0xbf, + 0x91, 0x52, 0x3b, 0xf8, 0x0b, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, + 0x58, 0x43, 0x50, 0x32, 0x33, 0xda, 0x89, 0x96, + 0x09, 0x00, 0x00, 0x82, 0x53, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, + 0x30, 0x46, 0x52, 0x32, 0x34, 0x37, 0x35, 0x2e, + 0x78, 0x6d, 0x6c, 0xed, 0x1c, 0xd9, 0x72, 0xd3, + 0x30, 0xf0, 0xbd, 0x5f, 0x61, 0x78, 0x82, 0x19, + 0x8a, 0xed, 0xa4, 0x09, 0x29, 0x13, 0xcc, 0xa4, + 0x39, 0xa0, 0x4c, 0xd3, 0x86, 0x24, 0x1c, 0x6f, + 0x1d, 0xd5, 0x56, 0x5a, 0x0f, 0x4e, 0x6c, 0x2c, + 0x07, 0x52, 0xbe, 0x9e, 0x95, 0x2d, 0x5b, 0x76, + 0x64, 0x3b, 0x4a, 0x1b, 0xb7, 0xe9, 0x40, 0x87, + 0x43, 0xda, 0x5d, 0x49, 0x7b, 0xeb, 0xb2, 0xda, + 0x7e, 0xbf, 0x9a, 0x3b, 0xca, 0x2f, 0xec, 0x13, + 0xdb, 0x5d, 0xbc, 0x7b, 0xae, 0xbf, 0xd6, 0x9e, + 0xbf, 0x37, 0x0e, 0xda, 0x16, 0xfe, 0x65, 0x9b, + 0xf8, 0xd0, 0x5e, 0xcc, 0x5c, 0x7f, 0x8e, 0x02, + 0xc0, 0x65, 0x69, 0x8c, 0x03, 0x05, 0x7e, 0x18, + 0x59, 0x54, 0x61, 0x00, 0x62, 0xfa, 0xb6, 0x47, + 0x1b, 0x18, 0xc3, 0xc9, 0xe8, 0xa8, 0xae, 0x0d, + 0xc6, 0xb5, 0xa3, 0x37, 0x8d, 0xb6, 0x9a, 0xc6, + 0x28, 0xed, 0x67, 0x87, 0x87, 0x4a, 0x82, 0xaf, + 0xeb, 0xba, 0x72, 0x78, 0x98, 0xea, 0xc5, 0xb6, + 0x86, 0x88, 0xfc, 0x88, 0x00, 0x09, 0x90, 0x8d, + 0x6f, 0x68, 0xab, 0x19, 0xfc, 0xb4, 0x55, 0x56, + 0x5f, 0xa3, 0x22, 0xcb, 0xab, 0x75, 0x42, 0x06, + 0x12, 0x69, 0x7d, 0xe0, 0x9e, 0x51, 0x52, 0xba, + 0xb0, 0x2a, 0x52, 0xcd, 0xd1, 0x6a, 0x9c, 0x25, + 0x4c, 0x43, 0x38, 0xd3, 0x6a, 0xc2, 0x35, 0x17, + 0xa3, 0xeb, 0x5a, 0xb8, 0x50, 0x8c, 0x56, 0xbd, + 0x76, 0x12, 0x89, 0xc1, 0x75, 0x02, 0xd0, 0xda, + 0x4c, 0x03, 0x6d, 0x94, 0x88, 0x25, 0x27, 0x91, + 0xa6, 0xed, 0x42, 0xa2, 0xac, 0x00, 0x6d, 0x8f, + 0x20, 0x63, 0x8c, 0xaf, 0x97, 0x0e, 0xf2, 0xdb, + 0x2a, 0xad, 0x70, 0xd4, 0x95, 0x1d, 0x10, 0xa3, + 0x06, 0x83, 0x86, 0x05, 0x0e, 0x47, 0xbe, 0x79, + 0x63, 0x07, 0xd8, 0x0c, 0x96, 0x3e, 0x36, 0xba, + 0xde, 0xf2, 0xfb, 0xaf, 0x5a, 0x5b, 0xcd, 0x00, + 0x39, 0x2d, 0xc6, 0x73, 0xa3, 0x3f, 0xec, 0x7f, + 0xbf, 0x9c, 0x0c, 0x3b, 0x67, 0x67, 0x97, 0x8d, + 0xef, 0xdf, 0xdb, 0x2a, 0xc0, 0x98, 0x6e, 0x42, + 0xcc, 0xf9, 0xc5, 0x79, 0xff, 0x55, 0x58, 0x3a, + 0xbb, 0xf8, 0xf6, 0x2a, 0x82, 0x0d, 0xfb, 0xbd, + 0xd3, 0x2f, 0x43, 0x56, 0xf9, 0x78, 0xfa, 0xe1, + 0x23, 0x2b, 0xf6, 0xbf, 0x4f, 0xc7, 0x1d, 0xde, + 0x57, 0x04, 0xe5, 0xf5, 0x4c, 0xeb, 0x14, 0xe0, + 0xac, 0x33, 0xfe, 0xd0, 0x4f, 0xd5, 0xbb, 0x17, + 0xe3, 0x29, 0xa5, 0x3b, 0xca, 0x3a, 0xa9, 0xe9, + 0xb8, 0xe6, 0x8f, 0x53, 0x08, 0x10, 0x0e, 0xe3, + 0xf0, 0xae, 0xbb, 0x08, 0x7c, 0xd7, 0x31, 0x3e, + 0x74, 0xbb, 0x94, 0x8d, 0xfe, 0x79, 0xaf, 0xdf, + 0x6b, 0xab, 0x69, 0x14, 0x13, 0x0a, 0x08, 0x22, + 0x99, 0xc2, 0xd2, 0x64, 0xda, 0x39, 0xef, 0x75, + 0xc6, 0x3d, 0x5a, 0xe3, 0x0d, 0xb3, 0xb8, 0xcb, + 0xd3, 0x84, 0x8f, 0xb4, 0xe2, 0xba, 0xb4, 0x6f, + 0xa2, 0xa8, 0x22, 0x66, 0x6a, 0xcf, 0xc1, 0x59, + 0x12, 0xb8, 0x88, 0x53, 0xec, 0x85, 0x85, 0x57, + 0xef, 0x9e, 0xc7, 0x61, 0x2d, 0x10, 0x2e, 0xd0, + 0x1c, 0x1b, 0x9d, 0x5e, 0xb7, 0xad, 0xd2, 0x52, + 0x01, 0xd1, 0x2f, 0xe4, 0x2c, 0x31, 0xf8, 0x93, + 0xd5, 0x6c, 0xab, 0x51, 0x59, 0x1c, 0x51, 0x8d, + 0x87, 0x94, 0xe0, 0x46, 0x2f, 0xe5, 0xa6, 0xdb, + 0x19, 0x4d, 0x4f, 0xbf, 0x76, 0xa6, 0x7d, 0x29, + 0x9e, 0x4e, 0xde, 0xec, 0x86, 0xa7, 0x5a, 0x29, + 0x4f, 0x23, 0x70, 0x14, 0x29, 0x76, 0x1a, 0xda, + 0x6e, 0xd8, 0xa9, 0x97, 0xab, 0xc8, 0x9d, 0x7b, + 0xc8, 0x47, 0x81, 0xeb, 0x2b, 0x7d, 0x4d, 0x8a, + 0x2f, 0x74, 0xbc, 0x1b, 0xbe, 0x8e, 0x4a, 0xf9, + 0xc2, 0x5f, 0x26, 0xdd, 0xd3, 0x8e, 0x1c, 0x47, + 0x35, 0x73, 0x37, 0x1c, 0x35, 0x24, 0x38, 0xd2, + 0xe5, 0x38, 0xb2, 0x76, 0xc3, 0x51, 0x73, 0x33, + 0x47, 0x27, 0x72, 0x3a, 0xaa, 0xef, 0xc8, 0x9b, + 0xde, 0x48, 0x70, 0x24, 0xa7, 0xa3, 0xba, 0xbe, + 0x1b, 0x8e, 0x5a, 0xa5, 0x1c, 0x8d, 0xa7, 0x72, + 0x09, 0xa9, 0x85, 0xf2, 0xb9, 0xe1, 0x6b, 0x96, + 0x19, 0x5a, 0x3a, 0xc1, 0x24, 0x70, 0x3d, 0x23, + 0xf0, 0x97, 0xb8, 0xad, 0xa6, 0x20, 0xf7, 0x94, + 0xe0, 0xb8, 0x54, 0x82, 0x90, 0x54, 0xbb, 0xec, + 0xd4, 0xe5, 0xe4, 0xe8, 0x3f, 0x9e, 0x1c, 0xba, + 0xb6, 0x59, 0x10, 0x5d, 0x5a, 0x90, 0xc1, 0x23, + 0x0a, 0xa2, 0x6f, 0x16, 0xa4, 0x26, 0x2b, 0xc8, + 0xb1, 0xf6, 0x88, 0x82, 0xd4, 0x36, 0x0b, 0x52, + 0x97, 0x15, 0xa4, 0x59, 0x7b, 0x44, 0x41, 0xea, + 0x9b, 0x05, 0xd1, 0x2e, 0x4f, 0xde, 0x48, 0x09, + 0x72, 0xdc, 0x7b, 0x44, 0x41, 0xca, 0xa7, 0xbd, + 0x6f, 0x28, 0x30, 0x6f, 0x2c, 0xf7, 0x5a, 0x09, + 0x1b, 0x49, 0x49, 0xf3, 0x30, 0x89, 0x2b, 0x5c, + 0x87, 0x0e, 0x60, 0x95, 0x80, 0x1c, 0x47, 0x21, + 0xd0, 0xd4, 0x43, 0x57, 0x0e, 0x56, 0x4e, 0x47, + 0xe4, 0xa0, 0x7c, 0x31, 0x44, 0xd3, 0xf3, 0xe6, + 0xa5, 0x07, 0x93, 0x54, 0x39, 0x77, 0x03, 0xfc, + 0x16, 0x7a, 0x55, 0x68, 0xf5, 0xa0, 0x58, 0xe6, + 0x56, 0x24, 0x74, 0xd2, 0x22, 0xb8, 0xb1, 0x89, + 0x02, 0x7f, 0x82, 0x1b, 0xac, 0x8c, 0x4e, 0x7b, + 0x07, 0x52, 0x22, 0x09, 0xbc, 0xd2, 0x44, 0x5c, + 0xee, 0x60, 0x49, 0xa4, 0x14, 0x3b, 0x57, 0xb2, + 0x8a, 0xbc, 0x1b, 0x13, 0x75, 0xad, 0x9c, 0x09, + 0x5d, 0x8a, 0x89, 0x56, 0xc2, 0xc4, 0x7d, 0x1c, + 0x42, 0x9e, 0x69, 0x9a, 0x30, 0xef, 0xe3, 0xd1, + 0x12, 0xde, 0xbc, 0x0b, 0xc6, 0x5f, 0xbf, 0x7e, + 0x9d, 0xa9, 0x1f, 0x1e, 0x16, 0xb5, 0x23, 0xe9, + 0x2d, 0x6e, 0x6a, 0x17, 0xc7, 0x19, 0x76, 0x9d, + 0x00, 0x5d, 0x63, 0x0e, 0xe5, 0x18, 0xd3, 0x1c, + 0xda, 0x0b, 0x43, 0x6f, 0xd1, 0xdd, 0x35, 0xab, + 0x88, 0x14, 0x68, 0x65, 0xd4, 0x9b, 0x94, 0x22, + 0xaa, 0x88, 0x14, 0x03, 0x07, 0x91, 0x1b, 0xde, + 0x51, 0x0a, 0x22, 0xd2, 0x4e, 0xb0, 0x09, 0x9b, + 0x64, 0x8a, 0xaa, 0x35, 0x28, 0x31, 0x07, 0x89, + 0xd4, 0x9e, 0xc7, 0x51, 0x4d, 0x8d, 0x52, 0x03, + 0x68, 0x33, 0x35, 0xb0, 0xf8, 0x26, 0x4b, 0x2d, + 0x72, 0x1d, 0x60, 0x12, 0x7c, 0xf5, 0x62, 0xeb, + 0xb0, 0x5a, 0x5a, 0x91, 0xb9, 0x4a, 0x6b, 0xcf, + 0x30, 0xa2, 0x7b, 0x7c, 0x92, 0xb7, 0x47, 0x9e, + 0xdc, 0x92, 0x00, 0x36, 0xf7, 0xc3, 0x8b, 0xde, + 0xe5, 0xc5, 0x04, 0x96, 0x72, 0x29, 0xe0, 0x1a, + 0xb9, 0x63, 0xce, 0x30, 0x1b, 0x99, 0x16, 0xd7, + 0xb0, 0x3f, 0x97, 0xb6, 0xf9, 0x63, 0x88, 0xe7, + 0x63, 0x8c, 0x2c, 0x46, 0x95, 0x06, 0xad, 0x51, + 0xdf, 0x20, 0x32, 0xf0, 0xd1, 0x9c, 0x11, 0xb2, + 0x5a, 0x5a, 0x10, 0x91, 0xe5, 0x36, 0x5e, 0x05, + 0x03, 0x11, 0xaa, 0xe6, 0x83, 0x3d, 0xf7, 0x37, + 0xf6, 0x27, 0x38, 0x08, 0xec, 0xc5, 0x35, 0xc9, + 0xd1, 0x22, 0x9c, 0x9f, 0xd4, 0xbf, 0xf6, 0x6c, + 0x42, 0x93, 0xec, 0x99, 0x37, 0x6f, 0x40, 0x64, + 0x1c, 0x69, 0xf4, 0xe0, 0x24, 0x0f, 0x99, 0xdf, + 0x9e, 0x9e, 0x33, 0x41, 0x33, 0x5d, 0xd3, 0x74, + 0xc8, 0x06, 0x29, 0x60, 0xd1, 0x70, 0x14, 0x27, + 0x8e, 0x53, 0xdc, 0xa2, 0x17, 0x45, 0x5f, 0x38, + 0x46, 0xe8, 0x19, 0x59, 0x78, 0x7e, 0xa3, 0xfe, + 0x22, 0x25, 0x12, 0x65, 0x4c, 0x80, 0x17, 0xb1, + 0x97, 0x0c, 0x17, 0xb7, 0xe1, 0xb0, 0xa2, 0x26, + 0xbc, 0x53, 0x51, 0xae, 0x4d, 0x03, 0xc6, 0xfa, + 0xe5, 0x9c, 0x8a, 0x88, 0xb4, 0x9d, 0x05, 0x8b, + 0xf2, 0x79, 0x33, 0xa9, 0x0c, 0xd1, 0xad, 0x72, + 0x8d, 0x17, 0x18, 0x26, 0x3d, 0xac, 0x98, 0xee, + 0x02, 0x2f, 0x02, 0xc5, 0x9d, 0x29, 0x18, 0x99, + 0x37, 0x0a, 0xc4, 0x85, 0x72, 0x85, 0x08, 0xb6, + 0x14, 0x38, 0x46, 0xfd, 0x34, 0xed, 0x7c, 0x80, + 0x59, 0xf0, 0xf0, 0x7b, 0xa7, 0x3b, 0x55, 0x2c, + 0x14, 0xa0, 0xb8, 0x0b, 0x36, 0xdd, 0xcd, 0x60, + 0xce, 0x84, 0x33, 0xd1, 0xd5, 0x6a, 0xa5, 0x1e, + 0xc1, 0x3f, 0xac, 0x61, 0x74, 0xd0, 0x4a, 0xb6, + 0xf2, 0xb2, 0x2d, 0xbd, 0xe4, 0x41, 0x6d, 0xbe, + 0x9d, 0x09, 0xee, 0xe7, 0xcc, 0x0f, 0xee, 0x5f, + 0x77, 0x09, 0xef, 0x42, 0x2f, 0xcb, 0x75, 0x8f, + 0xc6, 0xf1, 0x13, 0xf3, 0x0c, 0x4d, 0xbb, 0xbb, + 0x73, 0xd0, 0x31, 0xef, 0xe0, 0x1f, 0xa6, 0x86, + 0x1e, 0xca, 0x3f, 0xcc, 0xfb, 0xfa, 0x07, 0xba, + 0xbb, 0x7f, 0x64, 0xce, 0xa4, 0xe7, 0x78, 0xee, + 0xfa, 0xb7, 0x67, 0xe8, 0xd6, 0x5d, 0x32, 0xce, + 0xd7, 0x50, 0xe1, 0xe2, 0xfb, 0xdd, 0xf3, 0x13, + 0xd7, 0x0d, 0xe8, 0xd1, 0x7e, 0xde, 0xd2, 0x2e, + 0xb8, 0xf5, 0xe0, 0x6c, 0xc5, 0x9d, 0xb7, 0x55, + 0x5a, 0xe2, 0x04, 0xd9, 0x93, 0x7e, 0xbd, 0xb9, + 0x7e, 0xd2, 0xcf, 0xef, 0x2a, 0x02, 0xe4, 0x87, + 0xce, 0xd2, 0xa1, 0x76, 0x0b, 0x6b, 0x79, 0x54, + 0xf6, 0x9f, 0x70, 0xe7, 0x49, 0x69, 0x68, 0x39, + 0x8f, 0x04, 0x5f, 0xcf, 0x21, 0x8f, 0x4e, 0x22, + 0x4a, 0x38, 0x53, 0xe2, 0x80, 0x5c, 0xbe, 0xd0, + 0xe2, 0x07, 0x31, 0x80, 0x2c, 0x2a, 0x88, 0x04, + 0x73, 0xe4, 0x79, 0x38, 0x5e, 0x22, 0xb0, 0x8a, + 0x48, 0xe5, 0xf9, 0x2e, 0xbd, 0x99, 0xa0, 0x26, + 0x60, 0xa4, 0x1c, 0x12, 0x0f, 0x2b, 0x2a, 0xb6, + 0x63, 0x42, 0x10, 0xb2, 0x41, 0xf3, 0x55, 0x4a, + 0x75, 0x6e, 0x82, 0xce, 0x41, 0xb5, 0x11, 0x71, + 0xa1, 0x82, 0xd5, 0xf5, 0x2e, 0x45, 0x9c, 0x71, + 0x20, 0x6c, 0xe1, 0x1e, 0xdd, 0xdc, 0x88, 0x9b, + 0x9b, 0x25, 0x2b, 0xcb, 0x9e, 0xcd, 0xb0, 0x4f, + 0xa7, 0xc2, 0x10, 0xac, 0x20, 0xcb, 0xf2, 0x41, + 0x24, 0xc5, 0x73, 0x09, 0xb1, 0x41, 0x9b, 0x85, + 0x5e, 0xd1, 0x62, 0x4e, 0x21, 0x76, 0x44, 0xa1, + 0x32, 0xfd, 0xfc, 0x77, 0x9d, 0x42, 0xd7, 0x59, + 0xdf, 0x26, 0x95, 0x39, 0x0e, 0x71, 0xaa, 0xf5, + 0x19, 0x4d, 0x22, 0x45, 0xb4, 0xfe, 0x9d, 0x14, + 0x41, 0x9c, 0xc4, 0xc4, 0x1f, 0xc6, 0xf7, 0x33, + 0x72, 0xb9, 0x55, 0x6b, 0x95, 0x9a, 0x75, 0x30, + 0xe8, 0x4a, 0xd8, 0xf5, 0xe8, 0xbf, 0x5d, 0xef, + 0x6d, 0xd7, 0xf2, 0xbc, 0x0f, 0xe3, 0xaa, 0x95, + 0x1b, 0xfb, 0x7f, 0x0c, 0x57, 0x66, 0x6b, 0xf9, + 0x44, 0x0d, 0x1f, 0x56, 0x14, 0x1b, 0x19, 0x5f, + 0xdb, 0x70, 0xa8, 0xe2, 0x47, 0xbc, 0x14, 0x5a, + 0x72, 0xb3, 0x11, 0xf5, 0x07, 0xb7, 0xe1, 0x0c, + 0x39, 0x24, 0x31, 0xa2, 0x8c, 0x96, 0xb2, 0x5a, + 0xe9, 0xe3, 0x79, 0xf5, 0x5a, 0x69, 0x3d, 0x35, + 0xad, 0x0c, 0x91, 0xbd, 0x28, 0x56, 0x0b, 0xba, + 0x7f, 0x46, 0x68, 0x49, 0x66, 0x84, 0x07, 0x57, + 0xdc, 0x16, 0x29, 0x81, 0xea, 0x78, 0x67, 0x39, + 0x81, 0x1e, 0x31, 0x0e, 0x53, 0xb4, 0x27, 0x88, + 0xf6, 0x4d, 0x51, 0x05, 0xad, 0x7e, 0xfb, 0xf0, + 0x75, 0xd4, 0x28, 0x1a, 0x3b, 0xf9, 0x26, 0x2b, + 0x97, 0x92, 0x2d, 0x85, 0xa9, 0x96, 0x9a, 0xa0, + 0x4f, 0x56, 0xe5, 0x0d, 0xf2, 0x8c, 0x18, 0x52, + 0x0b, 0x56, 0x14, 0x75, 0x46, 0x7e, 0xb0, 0xcf, + 0xc3, 0x68, 0xb1, 0x84, 0xd2, 0xfb, 0x6d, 0xd1, + 0xe3, 0xfd, 0xf0, 0x78, 0x1a, 0xca, 0x05, 0x32, + 0xa9, 0x1b, 0x85, 0x92, 0x4b, 0x8a, 0xdb, 0x4c, + 0x80, 0x95, 0xbb, 0xfa, 0x4c, 0x97, 0x70, 0xf5, + 0xd9, 0xde, 0x79, 0xfa, 0x0e, 0x1c, 0x97, 0xed, + 0xcc, 0x96, 0x04, 0x47, 0x37, 0x74, 0x14, 0x08, + 0x77, 0x46, 0x8a, 0x09, 0x24, 0xf4, 0xe4, 0xf3, + 0xfc, 0x42, 0x19, 0x8e, 0xbe, 0x6c, 0xd1, 0xf7, + 0x60, 0xbc, 0x3a, 0x96, 0xec, 0xbb, 0xb0, 0xe3, + 0xb9, 0xb7, 0x64, 0xa2, 0x43, 0x29, 0xee, 0x06, + 0x62, 0x82, 0x75, 0x83, 0xae, 0xe1, 0x04, 0xd6, + 0xb9, 0x55, 0xec, 0xb0, 0x0b, 0x7a, 0xa9, 0x88, + 0x7e, 0x21, 0xdb, 0xa1, 0xd1, 0xfd, 0x5a, 0xb9, + 0x80, 0x0b, 0x46, 0xff, 0xb7, 0x0d, 0x23, 0x58, + 0xae, 0xb2, 0x70, 0x03, 0x25, 0xf4, 0xd7, 0xa4, + 0xa5, 0x5c, 0xa0, 0xb2, 0x21, 0x3b, 0xf1, 0x90, + 0x57, 0xf4, 0x4e, 0x03, 0xc6, 0x63, 0xc7, 0x74, + 0x0a, 0x59, 0x7a, 0x9e, 0xeb, 0xc7, 0x7d, 0x7b, + 0x49, 0xc3, 0xea, 0x02, 0x9c, 0x71, 0x84, 0xc3, + 0x33, 0x29, 0xd5, 0x8a, 0xce, 0x96, 0x14, 0x40, + 0x3d, 0xbd, 0xc8, 0x97, 0x5f, 0x0e, 0xd1, 0x5b, + 0xa8, 0x4a, 0xe3, 0x5e, 0x6f, 0x49, 0xc4, 0x7d, + 0x6d, 0xef, 0xe2, 0xfe, 0x5f, 0x9a, 0xe1, 0x6a, + 0xff, 0xc4, 0x0c, 0xf7, 0xdf, 0xd3, 0x77, 0x3b, + 0xc3, 0xed, 0x62, 0x16, 0x0a, 0x2a, 0x9c, 0x3a, + 0xf7, 0x65, 0x86, 0x43, 0x99, 0x19, 0x2e, 0x1c, + 0x34, 0x11, 0x81, 0xbe, 0x1a, 0x51, 0x5e, 0xd0, + 0xbb, 0xcd, 0x97, 0xc2, 0x44, 0x97, 0x61, 0x09, + 0x9a, 0xd1, 0xcf, 0x7a, 0xd8, 0xe4, 0x58, 0x5d, + 0x0a, 0x10, 0xe6, 0xc0, 0x2b, 0x14, 0xce, 0x81, + 0xe1, 0x6d, 0xda, 0xe9, 0xf9, 0xe0, 0x42, 0x89, + 0xdc, 0xe5, 0xe9, 0xa5, 0x0a, 0xf9, 0x29, 0x71, + 0x84, 0xe1, 0xf5, 0x0d, 0xd8, 0x1f, 0x39, 0x7a, + 0x13, 0x94, 0x72, 0xf7, 0x7d, 0xb1, 0x6c, 0xe2, + 0xd8, 0x9c, 0x35, 0x9a, 0x4f, 0x34, 0x67, 0xc4, + 0x2a, 0x8a, 0x28, 0x1b, 0xab, 0xd5, 0xee, 0x4e, + 0x79, 0x4a, 0x6d, 0x56, 0xab, 0xde, 0x68, 0xb5, + 0xcd, 0x56, 0x1b, 0xf4, 0x9f, 0x6a, 0xae, 0xaf, + 0xd2, 0x6e, 0x30, 0x4b, 0xcb, 0x1b, 0xb2, 0x72, + 0x3b, 0x6e, 0x34, 0xa2, 0xbe, 0x7f, 0xa7, 0x2f, + 0x7b, 0x60, 0xc5, 0xf2, 0x0c, 0x3a, 0xb5, 0x17, + 0xb7, 0xb0, 0xa2, 0xaa, 0x74, 0xb5, 0xd5, 0xdc, + 0x6c, 0xb9, 0xce, 0x9e, 0xd9, 0xad, 0xb2, 0x3d, + 0x45, 0xa4, 0xef, 0x85, 0xe5, 0xb2, 0x75, 0xd4, + 0x2e, 0xae, 0x3e, 0xb7, 0x09, 0xda, 0x3d, 0xb1, + 0x37, 0xda, 0x33, 0x7b, 0x3f, 0xa6, 0xf9, 0xe4, + 0x83, 0xb5, 0x6a, 0xc3, 0xd5, 0x64, 0xce, 0xb8, + 0xf7, 0x30, 0xcb, 0x6e, 0x13, 0xad, 0x77, 0x0b, + 0x9b, 0xbd, 0xd0, 0xfc, 0x5e, 0xdd, 0x2d, 0xdf, + 0xc5, 0x7f, 0xcf, 0xec, 0xab, 0x4a, 0x6f, 0x6d, + 0xbb, 0x9a, 0xa4, 0x1a, 0xf7, 0x48, 0x8f, 0x5b, + 0x3b, 0xf0, 0x56, 0xf9, 0x6a, 0xc7, 0x1f, 0xd9, + 0x6c, 0x13, 0x32, 0x55, 0x1b, 0xfb, 0x48, 0xc6, + 0xd6, 0xf5, 0xfd, 0xb3, 0xf5, 0x23, 0x99, 0x2e, + 0x1b, 0xa5, 0x5b, 0x2d, 0xf4, 0xbf, 0x90, 0xab, + 0xaa, 0xf3, 0x9f, 0x6e, 0x4a, 0x18, 0x73, 0xff, + 0xbe, 0xb7, 0x90, 0xb5, 0x65, 0xa8, 0xc1, 0xc7, + 0x36, 0xe3, 0x19, 0x46, 0x7c, 0xcb, 0x56, 0xf9, + 0x6e, 0x0d, 0xde, 0xbc, 0xc9, 0x58, 0xf4, 0x89, + 0x1a, 0xf4, 0x21, 0xf7, 0x6b, 0x1b, 0xad, 0x5a, + 0x75, 0x70, 0xd6, 0x64, 0x82, 0x73, 0xbf, 0x96, + 0x85, 0x3b, 0x51, 0xed, 0x17, 0x42, 0x1e, 0x32, + 0x60, 0xb0, 0x9c, 0x96, 0xf7, 0x47, 0xc9, 0x4f, + 0x35, 0x62, 0x4c, 0xab, 0xd2, 0x70, 0x39, 0x96, + 0x30, 0x63, 0x63, 0x7f, 0xac, 0xb8, 0x59, 0xa7, + 0x11, 0x85, 0xf8, 0x04, 0xa3, 0x3d, 0x5b, 0x2e, + 0xc2, 0x83, 0xfe, 0x21, 0x5a, 0x7f, 0xcf, 0x7a, + 0xe2, 0xb8, 0xbf, 0x07, 0x70, 0x17, 0x64, 0xc4, + 0x85, 0x81, 0x4f, 0x35, 0x1b, 0xd7, 0x36, 0xd9, + 0xeb, 0x1b, 0xb2, 0x03, 0x78, 0xbc, 0xdd, 0x87, + 0x47, 0x93, 0x23, 0xd7, 0x71, 0x3e, 0x4d, 0x02, + 0x78, 0x81, 0x06, 0x1e, 0xd4, 0x56, 0x39, 0x86, + 0x5d, 0x80, 0x84, 0xb7, 0x34, 0xc2, 0x0b, 0xa2, + 0xf8, 0x45, 0x1a, 0x29, 0x77, 0x94, 0xc9, 0xed, + 0xc2, 0xfc, 0x04, 0xb7, 0x44, 0x97, 0x1d, 0x42, + 0xb0, 0x1f, 0x8c, 0x5c, 0xff, 0x72, 0x82, 0x7e, + 0x61, 0xfa, 0xdb, 0x8c, 0xe0, 0x1d, 0xa4, 0x51, + 0x8e, 0x0e, 0x7f, 0xe9, 0x53, 0x39, 0x49, 0xd1, + 0x70, 0x80, 0xb6, 0x6c, 0xaa, 0x39, 0xe4, 0x64, + 0xc8, 0x4b, 0x09, 0xf8, 0x90, 0x22, 0x51, 0xc9, + 0xa0, 0x63, 0x4c, 0xe0, 0xc9, 0x7a, 0x8c, 0xbc, + 0x1c, 0x63, 0x07, 0x83, 0x86, 0x68, 0x07, 0x46, + 0x31, 0x2a, 0x1c, 0xa8, 0x18, 0x2d, 0x0c, 0x81, + 0x2c, 0x38, 0x0f, 0x39, 0xb9, 0x0d, 0xe0, 0xd1, + 0x28, 0xab, 0x7c, 0x73, 0x7d, 0x8b, 0xb0, 0x6e, + 0x38, 0x56, 0x68, 0xc8, 0x69, 0xc5, 0x86, 0x29, + 0x40, 0x41, 0xc3, 0xcf, 0xf4, 0x49, 0xac, 0x91, + 0xae, 0xc4, 0x0d, 0x39, 0x76, 0xcd, 0xb3, 0xe8, + 0x15, 0x55, 0xc2, 0x4d, 0x5c, 0xe3, 0x63, 0x66, + 0xf0, 0x42, 0x5b, 0x4e, 0x5d, 0xd8, 0xb6, 0x80, + 0x61, 0x70, 0xd8, 0x1e, 0xdc, 0x1d, 0xf6, 0x57, + 0xe6, 0x0d, 0x5a, 0x5c, 0x63, 0x63, 0xad, 0x1e, + 0xb6, 0x5f, 0x83, 0xad, 0x3b, 0x0f, 0x3c, 0x91, + 0x72, 0xf0, 0x24, 0xc0, 0x9e, 0xc1, 0x8b, 0x61, + 0x3b, 0x5e, 0xcd, 0xd1, 0x52, 0xc7, 0x71, 0xe0, + 0x3b, 0x5a, 0x88, 0x1d, 0x62, 0x64, 0xab, 0x61, + 0xd3, 0x0c, 0x28, 0x57, 0xde, 0x14, 0x76, 0xad, + 0xce, 0x65, 0x2e, 0xec, 0x61, 0x04, 0xbf, 0x4d, + 0x0d, 0xfe, 0x86, 0x94, 0xf0, 0xff, 0xba, 0x4e, + 0x56, 0xf0, 0x2e, 0x3b, 0xc0, 0x03, 0xc8, 0x22, + 0x0e, 0x0e, 0x8c, 0x6c, 0x35, 0x6c, 0xb3, 0x46, + 0x91, 0x9b, 0x24, 0x26, 0xe0, 0xa3, 0x08, 0xb4, + 0x95, 0xad, 0xc2, 0x2f, 0x59, 0xcb, 0x02, 0x4a, + 0x6e, 0x37, 0x33, 0x29, 0x26, 0x9b, 0x70, 0x20, + 0xa7, 0xbc, 0xa1, 0x53, 0x55, 0x06, 0x98, 0x93, + 0xbd, 0xee, 0xd7, 0xdf, 0x5a, 0x26, 0xe3, 0x4f, + 0x65, 0xb7, 0x4b, 0x67, 0x82, 0xf1, 0x68, 0xd6, + 0x4d, 0xc2, 0x22, 0xc7, 0x61, 0x45, 0x1a, 0x51, + 0xb2, 0x1d, 0x74, 0xba, 0x59, 0x3c, 0xf6, 0xde, + 0xb3, 0x64, 0x06, 0xca, 0x9d, 0x6a, 0xda, 0xb3, + 0xc8, 0x31, 0x00, 0x58, 0xa2, 0x09, 0x58, 0xbd, + 0x11, 0xee, 0x64, 0x61, 0x65, 0x7c, 0xa4, 0x53, + 0x2b, 0x64, 0x30, 0xa2, 0xe8, 0x77, 0xe9, 0x85, + 0xc9, 0x3a, 0x90, 0x16, 0x33, 0xa7, 0x63, 0xd0, + 0xd9, 0x60, 0xdc, 0x19, 0x96, 0xf5, 0xdc, 0x38, + 0x96, 0xd6, 0x1d, 0xfd, 0x39, 0x10, 0xbe, 0x7e, + 0x88, 0xbb, 0x0d, 0x0d, 0xc8, 0x47, 0x4c, 0xa3, + 0xb2, 0xea, 0xe7, 0x8a, 0x8e, 0x20, 0xf1, 0x6f, + 0xc9, 0x84, 0x92, 0xf0, 0x6b, 0x35, 0x8d, 0x83, + 0xbf, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0xca, + 0x61, 0x4b, 0x96, 0x96, 0x09, 0x00, 0x00, 0x83, + 0x53, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, + 0x34, 0x37, 0x36, 0x2e, 0x78, 0x6d, 0x6c, 0xed, + 0x1c, 0x6b, 0x57, 0xd3, 0x30, 0xf4, 0x3b, 0xbf, + 0xa2, 0xfa, 0x49, 0xcf, 0x11, 0xd7, 0x6e, 0x30, + 0x87, 0x67, 0xd6, 0x53, 0xf6, 0x50, 0x3c, 0x0c, + 0xe6, 0x36, 0x95, 0x6f, 0x9c, 0xd0, 0x66, 0xd0, + 0x63, 0xb7, 0xd6, 0xa6, 0xc3, 0xe1, 0xaf, 0xf7, + 0xa6, 0x4d, 0x9b, 0x76, 0x69, 0xbb, 0x0c, 0x56, + 0x18, 0x47, 0x39, 0x3e, 0x92, 0x7b, 0x6f, 0x92, + 0xfb, 0xce, 0xab, 0xa1, 0xfd, 0x71, 0x39, 0x73, + 0x94, 0x5b, 0xec, 0x13, 0xdb, 0x9d, 0x7f, 0x78, + 0xa9, 0xbd, 0x55, 0x5f, 0x7e, 0xd4, 0xf7, 0xda, + 0x16, 0xbe, 0xb5, 0x4d, 0xbc, 0x6f, 0xcf, 0xa7, + 0xae, 0x3f, 0x43, 0x01, 0xe0, 0xb2, 0x34, 0xfa, + 0x9e, 0x02, 0x3f, 0x8c, 0x2c, 0xaa, 0x30, 0x00, + 0x31, 0x7d, 0xdb, 0xa3, 0x0d, 0xf4, 0xc1, 0x78, + 0x78, 0xd0, 0x50, 0xfb, 0xa3, 0xfa, 0xc1, 0xbb, + 0x66, 0xbb, 0x96, 0xc6, 0x28, 0xed, 0x17, 0xfb, + 0xfb, 0x4a, 0x82, 0x6f, 0x68, 0x9a, 0xb2, 0xbf, + 0x9f, 0xea, 0xc5, 0xb6, 0x06, 0x88, 0xfc, 0x8c, + 0x00, 0x09, 0x90, 0x8d, 0xaf, 0xab, 0xcb, 0x29, + 0xfc, 0xb4, 0x6b, 0xac, 0xbe, 0x42, 0x45, 0x16, + 0x57, 0xab, 0x84, 0x0c, 0x24, 0xd2, 0xfa, 0xc0, + 0x3d, 0xa3, 0xa4, 0x74, 0x61, 0x55, 0xa4, 0x9a, + 0xa1, 0xe5, 0x28, 0x4b, 0x98, 0x86, 0x70, 0xa6, + 0x6b, 0x09, 0xd7, 0x5c, 0x8c, 0x8e, 0x6b, 0xe1, + 0x42, 0x31, 0x5a, 0x8d, 0xba, 0x11, 0x89, 0xc1, + 0x75, 0x02, 0xd0, 0xfa, 0x54, 0x05, 0x6d, 0x94, + 0x88, 0x25, 0x27, 0x91, 0xaa, 0x6e, 0x43, 0xa2, + 0xac, 0x00, 0x6d, 0x8f, 0x20, 0x7d, 0x84, 0xaf, + 0x17, 0x0e, 0xf2, 0xdb, 0x35, 0x5a, 0xe1, 0xa8, + 0x2b, 0x3b, 0x20, 0x7a, 0x1d, 0x06, 0x0d, 0x0b, + 0x1c, 0x8e, 0x7c, 0xf3, 0xc6, 0x0e, 0xb0, 0x19, + 0x2c, 0x7c, 0xac, 0x77, 0xbc, 0xc5, 0xc5, 0x6d, + 0xbd, 0x5d, 0xcb, 0x00, 0x39, 0x2d, 0xc6, 0x33, + 0xbd, 0x37, 0xe8, 0x5d, 0x5c, 0x8e, 0x07, 0xc6, + 0xe9, 0xe9, 0xe5, 0xe1, 0xc5, 0x45, 0xbb, 0x06, + 0x30, 0xa6, 0x9b, 0x10, 0x73, 0x76, 0x7e, 0xd6, + 0x7b, 0x13, 0x96, 0x4e, 0xcf, 0x7f, 0xbc, 0x89, + 0x60, 0x83, 0x5e, 0xf7, 0xe4, 0xdb, 0x80, 0x55, + 0x3e, 0x9f, 0x7c, 0xfa, 0xcc, 0x8a, 0xbd, 0x8b, + 0xc9, 0xc8, 0xe0, 0x7d, 0x45, 0x50, 0x5e, 0xcf, + 0xb4, 0x4e, 0x01, 0x4e, 0x8d, 0xd1, 0xa7, 0x5e, + 0xaa, 0xde, 0x39, 0x1f, 0x4d, 0x28, 0xdd, 0x41, + 0xd6, 0x49, 0x4d, 0xc7, 0x35, 0x7f, 0x9e, 0x40, + 0x80, 0x70, 0x18, 0x87, 0x77, 0xdc, 0x79, 0xe0, + 0xbb, 0x8e, 0xfe, 0xa9, 0xd3, 0xa1, 0x6c, 0xf4, + 0xce, 0xba, 0xbd, 0x6e, 0xbb, 0x96, 0x46, 0x31, + 0xa1, 0x80, 0x20, 0x92, 0x29, 0x2c, 0x8d, 0x27, + 0xc6, 0x59, 0xd7, 0x18, 0x75, 0x69, 0x8d, 0x37, + 0xcc, 0xe2, 0x2e, 0x4f, 0x12, 0x3e, 0xd2, 0x8a, + 0xeb, 0xd0, 0xbe, 0x89, 0x52, 0x13, 0x31, 0x13, + 0x7b, 0x06, 0xce, 0x92, 0xc0, 0x45, 0x9c, 0x62, + 0xcf, 0x2d, 0xbc, 0xfc, 0xf0, 0x32, 0x0e, 0x6b, + 0x81, 0x70, 0x8e, 0x66, 0x58, 0x37, 0xba, 0x9d, + 0x76, 0x8d, 0x96, 0x0a, 0x88, 0x6e, 0x91, 0xb3, + 0xc0, 0xe0, 0x4f, 0x16, 0x04, 0x7b, 0x54, 0x16, + 0x47, 0xac, 0xc5, 0x43, 0x4a, 0x70, 0xa3, 0x95, + 0x72, 0xd3, 0x31, 0x86, 0x93, 0x93, 0xef, 0xc6, + 0xa4, 0x27, 0xc5, 0xd3, 0xf1, 0xbb, 0xed, 0xf0, + 0x54, 0x2f, 0xe5, 0x69, 0x08, 0x8e, 0x22, 0xc5, + 0xce, 0xa1, 0xba, 0x1d, 0x76, 0x1a, 0xe5, 0x2a, + 0x72, 0x67, 0x1e, 0xf2, 0x51, 0xe0, 0xfa, 0x4a, + 0x4f, 0x95, 0xe2, 0x0b, 0x1d, 0x6d, 0x87, 0xaf, + 0x83, 0x52, 0xbe, 0xf0, 0xb7, 0x71, 0xe7, 0xc4, + 0x90, 0xe3, 0xa8, 0x6e, 0x6e, 0x87, 0xa3, 0x43, + 0x09, 0x8e, 0x34, 0x39, 0x8e, 0xac, 0xed, 0x70, + 0xd4, 0x5c, 0xcf, 0xd1, 0xb1, 0x9c, 0x8e, 0x1a, + 0x5b, 0xf2, 0xa6, 0x77, 0x12, 0x1c, 0xc9, 0xe9, + 0xa8, 0xa1, 0x6d, 0x87, 0xa3, 0x56, 0x29, 0x47, + 0xa3, 0x89, 0x5c, 0x42, 0x6a, 0xa1, 0x7c, 0x6e, + 0xf8, 0x9a, 0x65, 0x8a, 0x16, 0x4e, 0x30, 0x0e, + 0x5c, 0x4f, 0x0f, 0xfc, 0x05, 0x6e, 0xd7, 0x52, + 0x90, 0x07, 0x4a, 0x70, 0x54, 0x2a, 0x41, 0x48, + 0xaa, 0x5e, 0x1a, 0x0d, 0x39, 0x39, 0x7a, 0x4f, + 0x27, 0x87, 0xa6, 0xae, 0x17, 0x44, 0x93, 0x16, + 0xa4, 0xff, 0x84, 0x82, 0x68, 0xeb, 0x05, 0xa9, + 0xcb, 0x0a, 0x72, 0xa4, 0x3e, 0xa1, 0x20, 0xf5, + 0xf5, 0x82, 0x34, 0x64, 0x05, 0x69, 0xd6, 0x9f, + 0x50, 0x90, 0xc6, 0x7a, 0x41, 0xd4, 0xcb, 0xe3, + 0x77, 0x52, 0x82, 0x1c, 0x75, 0x9f, 0x50, 0x90, + 0xf2, 0x69, 0xef, 0x07, 0x0a, 0xcc, 0x1b, 0xcb, + 0xbd, 0x56, 0xc2, 0x46, 0x52, 0xd2, 0x3c, 0x4e, + 0xe2, 0x0a, 0xd7, 0xa1, 0x7d, 0x58, 0x25, 0x20, + 0xc7, 0x51, 0x08, 0x34, 0xf5, 0xd0, 0x95, 0x83, + 0x95, 0x93, 0x21, 0xd9, 0x2b, 0x5f, 0x0c, 0xd1, + 0xf4, 0xbc, 0x7e, 0xe9, 0xc1, 0x24, 0x55, 0xce, + 0xdc, 0x00, 0xbf, 0x87, 0x5e, 0x15, 0x5a, 0xdd, + 0x2b, 0x96, 0xb9, 0x15, 0x09, 0x9d, 0xb4, 0x08, + 0x6e, 0x6c, 0xa2, 0xc0, 0x9f, 0xe0, 0x06, 0x2b, + 0xc3, 0x93, 0xee, 0x9e, 0x94, 0x48, 0x02, 0xaf, + 0x34, 0x11, 0x97, 0x3b, 0x58, 0x12, 0x29, 0xc5, + 0xce, 0x95, 0xac, 0x22, 0xef, 0xc7, 0x44, 0x43, + 0x2d, 0x67, 0x42, 0x93, 0x62, 0xa2, 0x95, 0x30, + 0xf1, 0x10, 0x87, 0x90, 0x67, 0x9a, 0x26, 0xcc, + 0x87, 0x78, 0xb4, 0x84, 0x37, 0x6f, 0x83, 0xf1, + 0xb7, 0x6f, 0xdf, 0x66, 0xea, 0xfb, 0xfb, 0x45, + 0xed, 0x48, 0x7a, 0x8b, 0x9b, 0xda, 0xc5, 0x71, + 0x86, 0x5d, 0x27, 0x40, 0xd7, 0x98, 0x43, 0x39, + 0xc6, 0x34, 0x07, 0xf6, 0x5c, 0xd7, 0x5a, 0x74, + 0x77, 0xcd, 0x2a, 0x22, 0x05, 0x5a, 0xea, 0x8d, + 0x26, 0xa5, 0x88, 0x2a, 0x22, 0x45, 0xdf, 0x41, + 0xe4, 0x86, 0x77, 0x94, 0x82, 0x88, 0xb4, 0x63, + 0x6c, 0xc2, 0x26, 0x99, 0xa2, 0xea, 0x87, 0x94, + 0x98, 0x83, 0x44, 0x6a, 0xcf, 0xe3, 0xa8, 0xa6, + 0x4a, 0xa9, 0x01, 0xb4, 0x9e, 0x1a, 0x58, 0x7c, + 0x97, 0xa5, 0x16, 0xb9, 0x0e, 0x30, 0x09, 0xbe, + 0x7b, 0xb1, 0x75, 0x58, 0x2d, 0xad, 0xc8, 0x5c, + 0xa5, 0xb5, 0xa7, 0x18, 0xd1, 0x3d, 0x3e, 0xc9, + 0xdb, 0x23, 0x8f, 0xef, 0x48, 0x00, 0x9b, 0xfb, + 0xc1, 0x79, 0xf7, 0xf2, 0x7c, 0x0c, 0x4b, 0xb9, + 0x14, 0x70, 0x85, 0xdc, 0x31, 0xa7, 0x98, 0x8d, + 0x4c, 0x8b, 0x2b, 0xd8, 0x5f, 0x0b, 0xdb, 0xfc, + 0x39, 0xc0, 0xb3, 0x11, 0x46, 0x16, 0xa3, 0x4a, + 0x83, 0x56, 0xa8, 0x6f, 0x10, 0xe9, 0xfb, 0x68, + 0xc6, 0x08, 0x59, 0x2d, 0x2d, 0x88, 0xc8, 0x72, + 0x1b, 0x2f, 0x83, 0xbe, 0x08, 0xad, 0xe5, 0x83, + 0x3d, 0xf7, 0x37, 0xf6, 0xc7, 0x38, 0x08, 0xec, + 0xf9, 0x35, 0xc9, 0xd1, 0x22, 0x9c, 0x9f, 0x34, + 0xbe, 0x77, 0x6d, 0x42, 0x93, 0xec, 0xa9, 0x37, + 0x3b, 0x84, 0xc8, 0x38, 0x50, 0xe9, 0xc1, 0x49, + 0x1e, 0x32, 0xbf, 0x3d, 0x3d, 0x67, 0x82, 0x66, + 0x9a, 0xaa, 0x6a, 0x90, 0x0d, 0x52, 0xc0, 0xa2, + 0xe1, 0x28, 0x4e, 0x1c, 0xa7, 0xb8, 0x45, 0x37, + 0x8a, 0xbe, 0x70, 0x8c, 0xd0, 0x33, 0xb2, 0xf0, + 0xfc, 0x46, 0xbd, 0x79, 0x4a, 0x24, 0xca, 0x98, + 0x00, 0x2f, 0x62, 0x2f, 0x19, 0x2e, 0x6e, 0xc3, + 0x61, 0x45, 0x4d, 0x78, 0xa7, 0xa2, 0x5c, 0xeb, + 0x06, 0x8c, 0xf5, 0xcb, 0x39, 0x15, 0x11, 0x69, + 0x3b, 0x0b, 0x16, 0xe5, 0xf3, 0x66, 0x52, 0x19, + 0xa0, 0x3b, 0xe5, 0x1a, 0xcf, 0x31, 0x4c, 0x7a, + 0x58, 0x31, 0xdd, 0x39, 0x9e, 0x07, 0x8a, 0x3b, + 0x55, 0x30, 0x32, 0x6f, 0x14, 0x88, 0x0b, 0xe5, + 0x0a, 0x11, 0x6c, 0x29, 0x70, 0x8c, 0xfa, 0x65, + 0x62, 0x7c, 0x82, 0x59, 0x70, 0xff, 0xc2, 0xe8, + 0x4c, 0x14, 0x0b, 0x05, 0x28, 0xee, 0x82, 0x4d, + 0x77, 0x53, 0x98, 0x33, 0xe1, 0x4c, 0x74, 0xb9, + 0x5c, 0xd6, 0x0e, 0xe0, 0x1f, 0xd6, 0x30, 0x3a, + 0x68, 0x25, 0x1b, 0x79, 0xd9, 0x86, 0x5e, 0xf2, + 0xa8, 0x36, 0xdf, 0xcc, 0x04, 0x0f, 0x73, 0xe6, + 0x47, 0xf7, 0xaf, 0xfb, 0x84, 0x77, 0xa1, 0x97, + 0xe5, 0xba, 0xc7, 0xe1, 0xd1, 0x33, 0xf3, 0x0c, + 0x55, 0xbd, 0xbf, 0x73, 0xd0, 0x31, 0xef, 0xe1, + 0x1f, 0xa6, 0x8a, 0x1e, 0xcb, 0x3f, 0xcc, 0x87, + 0xfa, 0x07, 0xba, 0xbf, 0x7f, 0x64, 0xce, 0xa4, + 0x67, 0x78, 0xe6, 0xfa, 0x77, 0xa7, 0xe8, 0xce, + 0x5d, 0x30, 0xce, 0x57, 0x50, 0xe1, 0xe2, 0xfb, + 0xc3, 0xcb, 0x63, 0xd7, 0x0d, 0xe8, 0xd1, 0x7e, + 0xde, 0xd2, 0x2e, 0xb8, 0xf3, 0xe0, 0x6c, 0xc5, + 0x9d, 0xb5, 0x6b, 0xb4, 0xc4, 0x09, 0xb2, 0x27, + 0xfd, 0x5a, 0x73, 0xf5, 0xa4, 0x9f, 0xdf, 0x55, + 0x04, 0xc8, 0x0f, 0x9d, 0xc5, 0xa0, 0x76, 0x0b, + 0x6b, 0x79, 0x54, 0xf6, 0x9f, 0x70, 0xe7, 0x49, + 0x69, 0x68, 0x39, 0x8f, 0x04, 0x5f, 0xcf, 0x20, + 0x8f, 0x8e, 0x23, 0x4a, 0x38, 0x53, 0xe2, 0x80, + 0x5c, 0xbe, 0xd0, 0xfc, 0x27, 0xd1, 0x81, 0x2c, + 0x2a, 0x88, 0x04, 0x33, 0xe4, 0x79, 0x38, 0x5e, + 0x22, 0xb0, 0x8a, 0x48, 0xe5, 0xf9, 0x2e, 0xbd, + 0x99, 0xa0, 0x26, 0x60, 0xa4, 0x1c, 0x12, 0x0f, + 0x2b, 0x2a, 0xd6, 0x30, 0x21, 0x08, 0xd9, 0xa0, + 0xf9, 0x2a, 0xa5, 0x3a, 0x37, 0x41, 0xe7, 0xa0, + 0xda, 0x88, 0xb8, 0x50, 0xc1, 0xb5, 0xd5, 0x2e, + 0x45, 0x9c, 0xbe, 0x27, 0x6c, 0xe1, 0x9e, 0xdc, + 0xdc, 0x88, 0x9b, 0x9b, 0x25, 0x2b, 0xcb, 0x9e, + 0x4e, 0xb1, 0x4f, 0xa7, 0xc2, 0x10, 0xac, 0x20, + 0xcb, 0xf2, 0x41, 0x24, 0xc5, 0x73, 0x09, 0xb1, + 0x41, 0x9b, 0x85, 0x5e, 0xd1, 0x62, 0x4e, 0x21, + 0x76, 0x44, 0xa1, 0x32, 0xfd, 0xfc, 0x77, 0x9d, + 0x42, 0xd7, 0x59, 0xdd, 0x26, 0x95, 0x39, 0x0e, + 0x71, 0xaa, 0xf5, 0x19, 0x55, 0x22, 0x45, 0xb4, + 0xfe, 0x9d, 0x14, 0x41, 0x9c, 0xc4, 0xc4, 0x9f, + 0x46, 0x0f, 0x33, 0x72, 0xb9, 0x55, 0xeb, 0x95, + 0x9a, 0xb5, 0xdf, 0xef, 0x48, 0xd8, 0xf5, 0xe0, + 0xbf, 0x5d, 0x1f, 0x6c, 0xd7, 0xf2, 0xbc, 0x0f, + 0xe3, 0xd6, 0x2a, 0x37, 0xf6, 0xff, 0x18, 0xae, + 0xcc, 0xd6, 0xf2, 0x89, 0x1a, 0x3e, 0xac, 0x28, + 0x36, 0x32, 0xbe, 0xb6, 0xe1, 0x50, 0xc5, 0x8f, + 0x78, 0x29, 0xb4, 0xe4, 0x7a, 0x23, 0x6a, 0x8f, + 0x6e, 0xc3, 0x29, 0x72, 0x48, 0x62, 0x44, 0x19, + 0x2d, 0x65, 0xb5, 0xd2, 0xc3, 0xb3, 0xea, 0xb5, + 0xd2, 0x7a, 0x6e, 0x5a, 0x19, 0x20, 0x7b, 0x5e, + 0xac, 0x16, 0xf4, 0xf0, 0x8c, 0xd0, 0x92, 0xc9, + 0x08, 0x90, 0x36, 0x76, 0x3a, 0x27, 0x50, 0x25, + 0x6f, 0x2d, 0x29, 0xd0, 0x33, 0xc6, 0x41, 0x8a, + 0xf6, 0x18, 0xd1, 0xbe, 0x29, 0xaa, 0xa0, 0xd5, + 0x6f, 0x1f, 0x3e, 0x8f, 0x1a, 0x46, 0x63, 0x27, + 0x1f, 0x65, 0xe5, 0x52, 0xb2, 0xb5, 0x30, 0xd5, + 0x52, 0x13, 0xf4, 0xc9, 0xaa, 0xbc, 0x41, 0x9e, + 0x15, 0x43, 0x6a, 0xc1, 0x8c, 0xa2, 0xce, 0xc8, + 0x4f, 0xf6, 0x7d, 0x18, 0x2d, 0x96, 0x50, 0x7a, + 0xbf, 0x2d, 0x7a, 0xbe, 0x1f, 0x9e, 0x4f, 0x43, + 0xb9, 0x40, 0xa6, 0xda, 0x5a, 0xa1, 0xe4, 0xb2, + 0xe2, 0x26, 0x33, 0x60, 0xe5, 0xbe, 0x3e, 0xd5, + 0x24, 0x7c, 0x7d, 0xba, 0x73, 0x9e, 0xbe, 0x05, + 0xc7, 0x65, 0x5b, 0xb3, 0x05, 0xc1, 0xd1, 0x15, + 0x1d, 0x05, 0xc2, 0xa5, 0x91, 0x62, 0x02, 0x09, + 0x3d, 0xfa, 0x3c, 0x3b, 0x57, 0x06, 0xc3, 0x6f, + 0x1b, 0xf4, 0xdd, 0x1f, 0x2d, 0x8f, 0x24, 0xfb, + 0x2e, 0xec, 0x78, 0xe6, 0x2d, 0x98, 0xe8, 0x50, + 0x8a, 0xbb, 0x81, 0x98, 0x60, 0xdd, 0xa0, 0x6b, + 0x38, 0x82, 0x75, 0xee, 0x14, 0x3b, 0xec, 0x82, + 0xde, 0x2a, 0xa2, 0x5b, 0x64, 0x3b, 0x34, 0xba, + 0xdf, 0x2a, 0xe7, 0x70, 0xc3, 0xe8, 0xff, 0xb6, + 0x61, 0x04, 0xcb, 0x55, 0xe6, 0x6e, 0xa0, 0x84, + 0xfe, 0x9a, 0xb4, 0x94, 0x0b, 0x54, 0x36, 0xa4, + 0x11, 0x0f, 0x79, 0x45, 0x2f, 0x35, 0x60, 0x3c, + 0x76, 0x4e, 0xa7, 0x90, 0x85, 0xe7, 0xb9, 0x7e, + 0xdc, 0xb7, 0x97, 0x34, 0xac, 0x2e, 0xc0, 0x19, + 0x47, 0x38, 0x3c, 0x94, 0xaa, 0x59, 0xd1, 0xe1, + 0x92, 0x02, 0xa8, 0xe7, 0x17, 0xf9, 0xf2, 0xeb, + 0x21, 0x7a, 0x0d, 0x55, 0x69, 0xdc, 0x6b, 0x2d, + 0x89, 0xb8, 0xaf, 0xef, 0x5c, 0xdc, 0xff, 0x4b, + 0x33, 0x5c, 0xfd, 0x9f, 0x98, 0xe1, 0xfe, 0x7b, + 0xfa, 0x76, 0x67, 0xb8, 0x6d, 0xcc, 0x42, 0x41, + 0x85, 0x53, 0xe7, 0xae, 0xcc, 0x70, 0x28, 0x33, + 0xc3, 0x85, 0x83, 0x26, 0x22, 0xd0, 0x67, 0x23, + 0xca, 0x2b, 0x7a, 0xb9, 0xf9, 0x5a, 0x98, 0xe8, + 0x32, 0x2c, 0x41, 0x33, 0xfa, 0x5d, 0x0f, 0x9b, + 0x1c, 0xab, 0x4b, 0x01, 0xc2, 0x1c, 0x78, 0x85, + 0xc2, 0x39, 0x30, 0xbc, 0x4e, 0x3b, 0x39, 0xeb, + 0x9f, 0x2b, 0x91, 0xbb, 0x3c, 0xbf, 0x54, 0x21, + 0x3f, 0x25, 0x0e, 0x31, 0x3c, 0xbf, 0x01, 0xfb, + 0x23, 0x47, 0x6b, 0x82, 0x52, 0xee, 0xbf, 0x31, + 0x96, 0x4d, 0x1c, 0xeb, 0xb3, 0x46, 0xf3, 0x99, + 0xe6, 0x8c, 0x58, 0x45, 0x11, 0xe5, 0xe1, 0x72, + 0xb9, 0xbd, 0x63, 0x9e, 0x52, 0x9b, 0xd5, 0xab, + 0x37, 0x5a, 0x7d, 0xbd, 0xd5, 0xfa, 0xbd, 0xe7, + 0x9a, 0xeb, 0xab, 0xb4, 0x1b, 0xcc, 0xd2, 0xf2, + 0x86, 0xac, 0xdc, 0x8e, 0x6b, 0x8d, 0xa8, 0xed, + 0xde, 0xe9, 0xcb, 0x0e, 0x58, 0xb1, 0x3c, 0x83, + 0x4e, 0xec, 0xf9, 0x1d, 0xac, 0xa8, 0x2a, 0x5d, + 0x6d, 0x35, 0xd7, 0x5b, 0xce, 0xd8, 0x31, 0xbb, + 0x55, 0xb6, 0xa7, 0x88, 0xf4, 0x3d, 0xb7, 0x5c, + 0xb6, 0x8e, 0xda, 0xc6, 0xdd, 0xe7, 0x26, 0x41, + 0xbb, 0x23, 0xf6, 0x46, 0x3b, 0x66, 0xef, 0xa7, + 0x34, 0x9f, 0x7c, 0xb0, 0x56, 0x6d, 0xb8, 0xba, + 0xcc, 0x21, 0x77, 0x7d, 0xf7, 0xb2, 0xec, 0x26, + 0xd1, 0x7a, 0xbf, 0xb0, 0xd9, 0x09, 0xcd, 0xef, + 0xd4, 0xe5, 0xf2, 0x7d, 0xfc, 0xf7, 0xd4, 0xbe, + 0xaa, 0xf4, 0xda, 0xb6, 0xa3, 0x4a, 0xaa, 0x71, + 0x87, 0xf4, 0xb8, 0xb1, 0x03, 0x6f, 0x94, 0xaf, + 0xb6, 0xfc, 0x95, 0xcd, 0x26, 0x21, 0x53, 0xb5, + 0xb1, 0x0f, 0x64, 0x6c, 0xdd, 0xd8, 0x3d, 0x5b, + 0x3f, 0x91, 0xe9, 0xb2, 0x51, 0xba, 0xd1, 0x42, + 0xff, 0x1b, 0xb9, 0xaa, 0x3a, 0xff, 0x69, 0xa6, + 0x84, 0x31, 0x77, 0xef, 0x83, 0x0b, 0x59, 0x5b, + 0x86, 0x1a, 0x7c, 0x6a, 0x33, 0x9e, 0x62, 0xc4, + 0xb7, 0x6c, 0x95, 0xef, 0xd6, 0xe0, 0xd1, 0x9b, + 0x8c, 0x45, 0x9f, 0xa9, 0x41, 0x1f, 0x73, 0xbf, + 0xb6, 0xd6, 0xaa, 0x55, 0x07, 0x67, 0x5d, 0x26, + 0x38, 0x77, 0x6b, 0xf3, 0xbd, 0x15, 0xd5, 0x7e, + 0x23, 0xe4, 0x31, 0x03, 0x06, 0xcb, 0x69, 0x79, + 0x77, 0x94, 0xfc, 0x5c, 0x23, 0xc6, 0xb4, 0x2a, + 0x0d, 0x97, 0x23, 0x09, 0x33, 0x1e, 0xee, 0x8e, + 0x15, 0xd7, 0xeb, 0x34, 0xa2, 0x10, 0xdf, 0x60, + 0xb4, 0xa7, 0x8b, 0x79, 0x78, 0xd0, 0x3f, 0x40, + 0xab, 0x0f, 0x5a, 0x8f, 0x1d, 0xf7, 0x77, 0x1f, + 0xee, 0x82, 0xf4, 0xb8, 0xd0, 0xf7, 0xa9, 0x66, + 0xe3, 0xda, 0x3a, 0x7b, 0xfd, 0x40, 0x76, 0x00, + 0xaf, 0xb7, 0x7b, 0xf0, 0x6a, 0x72, 0xe8, 0x3a, + 0xce, 0x97, 0x71, 0x00, 0x4f, 0xd0, 0xc0, 0x83, + 0xda, 0x35, 0x8e, 0x61, 0x17, 0x20, 0xe1, 0x2d, + 0x8d, 0xf0, 0x84, 0x28, 0x7e, 0x92, 0x46, 0xca, + 0x1d, 0x65, 0x7c, 0x37, 0x37, 0xbf, 0xc0, 0x2d, + 0xd1, 0xa5, 0x41, 0x08, 0xf6, 0x83, 0xa1, 0xeb, + 0x5f, 0x8e, 0xd1, 0x2d, 0xa6, 0xbf, 0xce, 0x08, + 0x1e, 0x42, 0xea, 0xe5, 0xe8, 0xf0, 0xb7, 0x3e, + 0x95, 0x93, 0x14, 0x0d, 0x07, 0x68, 0xcb, 0xa6, + 0x9a, 0x43, 0x4e, 0x86, 0xbc, 0x94, 0x80, 0x0f, + 0x29, 0x12, 0x95, 0x0c, 0x3a, 0xc2, 0x04, 0xde, + 0xac, 0xc7, 0xc8, 0xcb, 0x11, 0x76, 0x30, 0x68, + 0x88, 0x76, 0xa0, 0x17, 0xa3, 0xc2, 0x81, 0x8a, + 0xd1, 0xc2, 0x10, 0xc8, 0x82, 0xf3, 0x90, 0xe3, + 0xbb, 0x00, 0x5e, 0x8d, 0xb2, 0xca, 0x0f, 0xd7, + 0xb7, 0x08, 0xeb, 0x86, 0x63, 0x85, 0x86, 0x9c, + 0x56, 0x6c, 0x98, 0x02, 0x14, 0x34, 0xfc, 0x4a, + 0xdf, 0xc4, 0xea, 0xe9, 0x4a, 0xdc, 0x90, 0x63, + 0x57, 0x3c, 0x8b, 0x5e, 0x51, 0x25, 0xdc, 0xc4, + 0x35, 0x3e, 0x66, 0x06, 0x2f, 0xb4, 0xe5, 0xd4, + 0x85, 0x6d, 0x0b, 0x18, 0x06, 0x87, 0xed, 0xc2, + 0xdd, 0x61, 0x6f, 0x69, 0xde, 0xa0, 0xf9, 0x35, + 0xd6, 0x57, 0xea, 0x61, 0xfb, 0x15, 0xd8, 0xaa, + 0xf3, 0xc0, 0x1b, 0x29, 0x07, 0x8f, 0x03, 0xec, + 0xe9, 0xbc, 0x18, 0xb6, 0xe3, 0xd5, 0x1c, 0x2d, + 0x19, 0x8e, 0x03, 0x1f, 0xd2, 0x42, 0xec, 0x10, + 0x3d, 0x5b, 0x0d, 0x9b, 0x66, 0x40, 0xb9, 0xf2, + 0xa6, 0xb0, 0x2b, 0x75, 0x2e, 0x73, 0x61, 0x0f, + 0x43, 0xf8, 0x75, 0x6a, 0xf0, 0x37, 0xa4, 0x84, + 0xff, 0x57, 0x75, 0xb2, 0x84, 0x87, 0xd9, 0x01, + 0xee, 0x43, 0x16, 0x71, 0x70, 0xa0, 0x67, 0xab, + 0x61, 0x9b, 0x15, 0x8a, 0xdc, 0x24, 0x31, 0x06, + 0x1f, 0x45, 0xa0, 0xad, 0x6c, 0x15, 0x7e, 0xcb, + 0x5a, 0x16, 0x50, 0x72, 0xbb, 0x99, 0x49, 0x31, + 0xd9, 0x84, 0x03, 0x39, 0xe5, 0x1d, 0x9d, 0xaa, + 0x32, 0xc0, 0x9c, 0xec, 0xf5, 0xb0, 0xfe, 0x56, + 0x32, 0x19, 0x7f, 0x2b, 0xbb, 0x59, 0x3a, 0x13, + 0x8c, 0x47, 0xb3, 0x6e, 0x12, 0x16, 0x39, 0x0e, + 0x2b, 0xd2, 0x88, 0x92, 0x6d, 0xa1, 0xd3, 0xf5, + 0xe2, 0xb1, 0x07, 0x9f, 0x25, 0x33, 0x50, 0xee, + 0x54, 0xd3, 0x9e, 0x46, 0x8e, 0x01, 0xc0, 0x12, + 0x4d, 0xc0, 0xea, 0x8d, 0x70, 0x27, 0x0b, 0x2b, + 0xa3, 0x03, 0x8d, 0x5a, 0x21, 0x83, 0x11, 0x45, + 0xbf, 0x4f, 0x2f, 0x4c, 0xd6, 0xbe, 0xb4, 0x98, + 0x39, 0x1d, 0x83, 0xce, 0xfa, 0x23, 0x63, 0x50, + 0xd6, 0xf3, 0xe1, 0x91, 0xb4, 0xee, 0xe8, 0xcf, + 0x9e, 0xf0, 0xf5, 0x43, 0xdc, 0x6d, 0x68, 0x40, + 0x3e, 0x62, 0x1a, 0x95, 0x55, 0x3f, 0x57, 0x74, + 0x04, 0x89, 0x7f, 0x4d, 0x26, 0x94, 0x84, 0xdf, + 0xab, 0xa9, 0xef, 0xfd, 0x05, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5d, + 0x65, 0x43, 0x50, 0xab, 0xb9, 0x5f, 0x6e, 0x9b, + 0x09, 0x00, 0x00, 0xb2, 0x55, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, + 0x30, 0x46, 0x52, 0x32, 0x36, 0x37, 0x32, 0x2e, + 0x78, 0x6d, 0x6c, 0xed, 0x1c, 0x69, 0x6f, 0xd3, + 0x30, 0xf4, 0x3b, 0x12, 0xff, 0x21, 0xf0, 0x09, + 0x24, 0x46, 0x92, 0x76, 0x2b, 0x1d, 0x2a, 0x41, + 0x59, 0x0f, 0x18, 0x5a, 0xb7, 0xd2, 0x96, 0xe3, + 0xdb, 0xe4, 0x25, 0xee, 0x16, 0x91, 0x26, 0x21, + 0x49, 0xa1, 0xe3, 0xd7, 0xf3, 0xec, 0xb8, 0x75, + 0xd2, 0x5c, 0xee, 0x96, 0x76, 0x99, 0x60, 0xe2, + 0xb0, 0xdf, 0x61, 0xbf, 0xcb, 0xcf, 0x57, 0xbc, + 0xce, 0xfb, 0xe5, 0xdc, 0x96, 0x7e, 0x61, 0x3f, + 0xb0, 0x5c, 0xe7, 0xdd, 0x73, 0xf5, 0xb5, 0xf2, + 0xfc, 0xbd, 0xf6, 0xf4, 0x49, 0xc7, 0xc4, 0xbf, + 0x2c, 0x03, 0x1f, 0x58, 0xce, 0xcc, 0xf5, 0xe7, + 0x28, 0x04, 0x64, 0x92, 0x08, 0x68, 0x24, 0xf8, + 0x61, 0x74, 0xac, 0xc6, 0x20, 0x81, 0xe1, 0x5b, + 0x1e, 0x61, 0xd1, 0x86, 0x93, 0xd1, 0x61, 0x53, + 0x19, 0x8c, 0x1b, 0xad, 0x37, 0x8d, 0x8e, 0x1c, + 0xc7, 0x48, 0x9d, 0x67, 0x07, 0x07, 0xd2, 0x1a, + 0xdf, 0x54, 0x55, 0xe9, 0xe0, 0x20, 0xde, 0x8c, + 0x65, 0x0e, 0x51, 0xf0, 0x83, 0x41, 0xd6, 0x50, + 0x26, 0x83, 0xa6, 0x2c, 0x67, 0xf0, 0xd3, 0x91, + 0x59, 0x7d, 0x93, 0x2c, 0x58, 0x5c, 0x6d, 0x52, + 0xae, 0x40, 0x69, 0x62, 0x1f, 0x54, 0x60, 0xa4, + 0x84, 0x30, 0xaa, 0xa6, 0xc9, 0xe6, 0x68, 0x39, + 0x4e, 0x52, 0xc6, 0x20, 0x71, 0xc9, 0x65, 0x2e, + 0x3a, 0x57, 0xa6, 0xeb, 0x9a, 0x38, 0x5f, 0x99, + 0x76, 0xb3, 0x79, 0x1c, 0x29, 0xc3, 0x6d, 0x03, + 0xd0, 0xc6, 0x4c, 0x01, 0xab, 0x14, 0x29, 0x27, + 0xa8, 0x97, 0xa2, 0x54, 0xa3, 0xd7, 0x86, 0x16, + 0x1d, 0x2f, 0x40, 0xda, 0x18, 0x5f, 0x2f, 0x6c, + 0xe4, 0x77, 0x64, 0xa8, 0xc4, 0x71, 0x57, 0x56, + 0x18, 0x68, 0x0d, 0xe8, 0x98, 0x14, 0xe2, 0x08, + 0xe4, 0x1b, 0x37, 0x56, 0x88, 0x8d, 0x70, 0xe1, + 0x63, 0xad, 0xeb, 0x2d, 0xbe, 0xff, 0x82, 0xd8, + 0x88, 0x03, 0xe3, 0xc4, 0x18, 0xcf, 0xb5, 0xfe, + 0xb0, 0xff, 0xfd, 0x72, 0x32, 0xd4, 0xcf, 0xce, + 0x2e, 0x8f, 0xbe, 0x7f, 0xef, 0xc8, 0x00, 0x63, + 0x36, 0xa2, 0x98, 0xf3, 0x8b, 0xf3, 0xfe, 0x2b, + 0x5a, 0x3a, 0xbb, 0xf8, 0xf6, 0x2a, 0x82, 0x0d, + 0xfb, 0xbd, 0xd3, 0x2f, 0x43, 0x56, 0xf9, 0x78, + 0xfa, 0xe1, 0x23, 0x2b, 0xf6, 0xbf, 0x4f, 0xc7, + 0x3a, 0x6f, 0x2b, 0x82, 0xf2, 0x7a, 0x82, 0x3b, + 0x06, 0x38, 0xd3, 0xc7, 0x1f, 0xfa, 0xb1, 0x7a, + 0xf7, 0x62, 0x3c, 0x25, 0x74, 0x87, 0x1b, 0x41, + 0x6b, 0xd8, 0xae, 0xf1, 0xe3, 0x14, 0xc6, 0x0c, + 0x03, 0x26, 0x11, 0x5d, 0xd7, 0x09, 0x7d, 0xd7, + 0xd6, 0x3e, 0x74, 0xbb, 0x44, 0x90, 0xfe, 0x79, + 0xaf, 0xdf, 0xeb, 0xc8, 0x71, 0x14, 0x53, 0x0b, + 0x08, 0x22, 0xad, 0x68, 0x69, 0x32, 0xd5, 0xcf, + 0x7b, 0xfa, 0xb8, 0x47, 0x6a, 0x9c, 0x31, 0x89, + 0xbb, 0x3c, 0xe5, 0x92, 0xc4, 0x6d, 0xd7, 0x25, + 0x8d, 0x07, 0x92, 0x9c, 0x81, 0x9a, 0x5a, 0x73, + 0x88, 0x1b, 0x8e, 0x48, 0x23, 0x25, 0xcb, 0x31, + 0xf1, 0xf2, 0xdd, 0xf3, 0xf5, 0x68, 0x4f, 0x51, + 0x3a, 0x68, 0x8e, 0x35, 0xbd, 0xd7, 0xed, 0xc8, + 0xa4, 0x94, 0x47, 0xf5, 0x0b, 0xd9, 0x0b, 0x0c, + 0xb1, 0x65, 0xb6, 0x3a, 0x32, 0x2d, 0x67, 0x75, + 0x2a, 0xaf, 0x7a, 0x15, 0x91, 0x48, 0x2d, 0x96, + 0xa8, 0xab, 0x8f, 0xa6, 0xa7, 0x5f, 0xf5, 0x69, + 0x5f, 0x4c, 0xae, 0x93, 0x37, 0x55, 0xc9, 0xd5, + 0x28, 0x96, 0x6b, 0x04, 0x61, 0x23, 0x26, 0xd2, + 0x91, 0x52, 0x95, 0x48, 0xcd, 0x12, 0x53, 0xb9, + 0x73, 0x0f, 0xf9, 0x28, 0x74, 0x7d, 0xa9, 0xaf, + 0x88, 0xc9, 0x86, 0x8e, 0xab, 0x92, 0xed, 0xb0, + 0x58, 0x36, 0xfc, 0x65, 0xd2, 0x3d, 0xd5, 0x05, + 0xa5, 0x6a, 0x18, 0x55, 0x49, 0x75, 0x24, 0x22, + 0x95, 0x2a, 0x28, 0x95, 0x59, 0x95, 0x54, 0x2d, + 0x01, 0xa9, 0x4e, 0x04, 0x6d, 0xd5, 0xac, 0x2c, + 0xba, 0xde, 0x88, 0x48, 0x25, 0x68, 0xab, 0xa6, + 0x5a, 0x95, 0x54, 0xed, 0x62, 0xa9, 0xc6, 0x53, + 0xc1, 0x84, 0xd5, 0x46, 0x39, 0x12, 0xf1, 0xb5, + 0xce, 0x0c, 0x2d, 0xec, 0x70, 0x12, 0xba, 0x9e, + 0x16, 0xfa, 0x0b, 0xdc, 0x91, 0x63, 0x90, 0x7b, + 0xab, 0x71, 0x5c, 0xac, 0x06, 0xa5, 0x55, 0x2e, + 0xf5, 0xa6, 0xa0, 0x32, 0xfd, 0x07, 0x55, 0x46, + 0x55, 0x04, 0xb4, 0x51, 0xc5, 0xb5, 0x19, 0x3c, + 0xac, 0x36, 0xaa, 0x80, 0x36, 0x0d, 0x61, 0x6d, + 0x8e, 0x95, 0x87, 0xd5, 0xa6, 0x21, 0xa0, 0x4d, + 0x53, 0x58, 0x9b, 0x56, 0xe3, 0x61, 0xb5, 0x69, + 0x0a, 0x68, 0xa3, 0x5c, 0x9e, 0xbc, 0x11, 0xd3, + 0xe6, 0xb8, 0xf7, 0xb0, 0xda, 0x94, 0x4c, 0x92, + 0xdf, 0x50, 0x68, 0xdc, 0x98, 0xee, 0xb5, 0x44, + 0xb9, 0xc4, 0x54, 0xda, 0x5b, 0x5a, 0xa3, 0xab, + 0xd9, 0x01, 0xac, 0x2d, 0x90, 0x6d, 0x4b, 0x01, + 0x30, 0x7b, 0xe8, 0xca, 0xc6, 0xd2, 0xe9, 0x28, + 0x00, 0xba, 0xc2, 0x85, 0x14, 0x4d, 0xe1, 0xe5, + 0x4b, 0x16, 0xa6, 0xaf, 0x74, 0xee, 0x86, 0xf8, + 0x2d, 0xb4, 0x2b, 0x91, 0x2a, 0x67, 0x4c, 0x6b, + 0xde, 0x8e, 0x54, 0x5f, 0xb3, 0x84, 0x37, 0x56, + 0x20, 0xc1, 0x9f, 0xf0, 0x06, 0x4b, 0xa3, 0xd3, + 0xde, 0xd3, 0x27, 0x62, 0x7a, 0xa5, 0xe4, 0xa5, + 0xb9, 0xba, 0x38, 0xde, 0xf8, 0xe8, 0xc9, 0x8f, + 0xb5, 0xf5, 0x4a, 0xf4, 0xae, 0x82, 0x34, 0x95, + 0x12, 0x41, 0x54, 0x31, 0x41, 0xda, 0x5c, 0x90, + 0x7b, 0x85, 0xc7, 0x16, 0x92, 0xd3, 0x94, 0x7a, + 0xaf, 0x20, 0x17, 0x09, 0xf0, 0x6a, 0xa4, 0x7f, + 0xfd, 0xfa, 0x75, 0x12, 0x70, 0x70, 0x90, 0xcb, + 0x1a, 0x24, 0x36, 0xd1, 0xf1, 0x2d, 0x22, 0x97, + 0xdb, 0xb5, 0x43, 0x74, 0x8d, 0x63, 0x60, 0x8e, + 0x32, 0x8c, 0xa1, 0xe5, 0x68, 0x6a, 0x9b, 0xec, + 0xe1, 0xa3, 0x4a, 0x16, 0x09, 0x5a, 0x6a, 0xcd, + 0x16, 0x21, 0x61, 0x95, 0x34, 0xc9, 0xc0, 0x46, + 0xc1, 0x0d, 0x6f, 0x2a, 0x0e, 0x49, 0x13, 0x4f, + 0xb0, 0x01, 0x1b, 0x71, 0x82, 0x6b, 0x1c, 0x51, + 0x6a, 0x0e, 0x4a, 0x93, 0x7b, 0x1e, 0xc7, 0xb5, + 0x14, 0x42, 0x0e, 0x20, 0x01, 0x72, 0x10, 0xf3, + 0xcd, 0x06, 0x79, 0x5a, 0xf2, 0x10, 0x07, 0xe1, + 0x57, 0x6f, 0xe5, 0x2a, 0x56, 0x4b, 0x58, 0x34, + 0xdb, 0x78, 0x9d, 0x19, 0x46, 0xe4, 0x30, 0x21, + 0xc8, 0xdc, 0x8a, 0x4f, 0x6e, 0x83, 0x10, 0x4e, + 0x11, 0x86, 0x17, 0xbd, 0xcb, 0x8b, 0x09, 0xac, + 0x06, 0x63, 0xc0, 0x4d, 0x7a, 0xdb, 0x98, 0x61, + 0xd6, 0x3b, 0x29, 0x6e, 0xa2, 0x7f, 0x2e, 0x2c, + 0xe3, 0xc7, 0x10, 0xcf, 0xc7, 0x18, 0x99, 0x8c, + 0x2c, 0x0e, 0xda, 0x24, 0xbf, 0x41, 0xc1, 0xc0, + 0x47, 0x73, 0x46, 0xc9, 0x6a, 0x09, 0x75, 0x32, + 0xe4, 0xee, 0xe0, 0x65, 0x38, 0xc8, 0x00, 0xcb, + 0x39, 0x70, 0xcf, 0xfd, 0x8d, 0xfd, 0x09, 0x0e, + 0x43, 0xcb, 0xb9, 0x0e, 0xb2, 0x0c, 0x0a, 0x67, + 0x36, 0xcd, 0xaf, 0xbd, 0x28, 0xec, 0xc9, 0x21, + 0xd2, 0x26, 0x2c, 0x97, 0xa7, 0xef, 0x90, 0x04, + 0x7e, 0xe6, 0xcd, 0x8f, 0x60, 0x94, 0x1d, 0x2a, + 0xe4, 0x78, 0x27, 0x03, 0x97, 0xcb, 0x4e, 0xce, + 0xc5, 0xd6, 0x8c, 0x09, 0x68, 0x0e, 0x4b, 0xcf, + 0x0a, 0x62, 0x1d, 0xaa, 0x90, 0x95, 0x38, 0xa2, + 0xb4, 0xb7, 0x18, 0x4d, 0xba, 0xd3, 0xf2, 0x06, + 0x22, 0x7d, 0xd2, 0x5d, 0x97, 0xea, 0xc9, 0xb4, + 0x54, 0x15, 0x25, 0xc6, 0x55, 0xa0, 0x24, 0x33, + 0x3a, 0x65, 0xa1, 0xe3, 0x21, 0x09, 0x4f, 0x78, + 0x3c, 0xed, 0x5a, 0x3e, 0xd3, 0xf2, 0xda, 0x10, + 0xdd, 0x4a, 0xd7, 0xd8, 0xc1, 0x30, 0x4b, 0x62, + 0xc9, 0x70, 0x1d, 0xec, 0x84, 0x92, 0x3b, 0x93, + 0x30, 0x32, 0x6e, 0x24, 0x18, 0x2b, 0xd2, 0x15, + 0x0a, 0xb0, 0x29, 0xc1, 0x99, 0xee, 0xa7, 0xa9, + 0xfe, 0x01, 0xa6, 0xcd, 0x83, 0xef, 0x7a, 0x77, + 0x2a, 0x99, 0x28, 0x44, 0xeb, 0x36, 0xd8, 0xfc, + 0x38, 0x83, 0x59, 0x16, 0xce, 0x67, 0x97, 0xcb, + 0xa5, 0x7c, 0x08, 0xff, 0x30, 0xce, 0xe8, 0xd4, + 0x37, 0xd8, 0x32, 0xe4, 0x76, 0x67, 0x97, 0x4a, + 0xdc, 0x76, 0xaf, 0x58, 0xdb, 0x3a, 0xb2, 0x1f, + 0x64, 0xfc, 0xdd, 0x61, 0x44, 0xe4, 0x87, 0x5c, + 0x76, 0xa8, 0x1c, 0x1d, 0x3f, 0xc2, 0x28, 0x51, + 0x94, 0x7b, 0x04, 0x0a, 0xe9, 0xf5, 0x2e, 0xb1, + 0x62, 0x28, 0x68, 0x7f, 0xb1, 0x62, 0xdc, 0x3b, + 0x56, 0xd0, 0x7d, 0x62, 0x25, 0x79, 0x4c, 0x3e, + 0xc7, 0x73, 0xd7, 0xbf, 0x3d, 0x43, 0xb7, 0xee, + 0x62, 0x25, 0xfe, 0x06, 0x8e, 0xae, 0xe3, 0xdf, + 0x3d, 0x3f, 0x71, 0xdd, 0x90, 0xdc, 0x39, 0x64, + 0xae, 0x0c, 0xc3, 0x5b, 0x0f, 0xce, 0x72, 0xdc, + 0x79, 0x47, 0xa6, 0x25, 0x4e, 0x91, 0xbc, 0x82, + 0x50, 0x5b, 0xa9, 0x2b, 0x08, 0x7e, 0x95, 0x12, + 0x22, 0x9f, 0x46, 0x8e, 0x4e, 0x5c, 0x48, 0x6b, + 0x99, 0x64, 0xd6, 0x1f, 0xba, 0xaf, 0x25, 0x44, + 0xa4, 0x9c, 0x49, 0x83, 0xaf, 0xe7, 0x90, 0x66, + 0x27, 0x11, 0x29, 0x1c, 0x65, 0x71, 0x40, 0xb6, + 0x6c, 0xc8, 0xf9, 0x11, 0x68, 0x40, 0x47, 0x0b, + 0x59, 0x14, 0x73, 0xe4, 0x79, 0x78, 0xb5, 0xa6, + 0x88, 0x2a, 0x59, 0x64, 0x9e, 0xef, 0x92, 0x7b, + 0x13, 0xe2, 0x0e, 0x46, 0xcb, 0x21, 0xeb, 0x9e, + 0xd3, 0x16, 0xd6, 0x0d, 0x18, 0x9a, 0xab, 0x7e, + 0xb3, 0x6d, 0x4b, 0xac, 0x6f, 0x80, 0xf5, 0xc1, + 0xc6, 0x11, 0x75, 0xbe, 0xa5, 0xe5, 0x54, 0xa3, + 0x69, 0x24, 0x80, 0xd3, 0xbb, 0xc3, 0x5a, 0x78, + 0x1f, 0x71, 0xef, 0xb3, 0x5c, 0x66, 0x5a, 0xb3, + 0x19, 0xf6, 0xc9, 0xb4, 0x49, 0xc1, 0x12, 0x32, + 0x4d, 0x1f, 0x34, 0x93, 0x3c, 0x37, 0x08, 0x2c, + 0xb0, 0x6b, 0x7e, 0x90, 0xb4, 0x59, 0x8c, 0xa4, + 0x5b, 0x22, 0x50, 0xa1, 0x86, 0xfe, 0x47, 0x52, + 0x79, 0x24, 0x6d, 0xec, 0xbd, 0x0a, 0xc3, 0x28, + 0xb0, 0x77, 0x1e, 0x41, 0x8a, 0x48, 0xfe, 0x68, + 0xff, 0x6b, 0xf9, 0x23, 0xb0, 0xd7, 0x0e, 0xff, + 0x30, 0xbe, 0xb7, 0xcb, 0x4b, 0x7c, 0xdc, 0xd8, + 0xb5, 0x93, 0x07, 0x83, 0xae, 0x88, 0x97, 0x0f, + 0xff, 0x7b, 0xb9, 0x42, 0x2f, 0x97, 0x4c, 0x11, + 0xd0, 0xb9, 0xbc, 0x0f, 0xdf, 0xff, 0x1f, 0xe0, + 0x7b, 0x70, 0xfd, 0x16, 0x39, 0x1d, 0x3e, 0x1b, + 0x29, 0x70, 0x39, 0xbe, 0xb6, 0xe0, 0x24, 0xc7, + 0x8f, 0x04, 0xca, 0x77, 0xab, 0x80, 0x47, 0xd5, + 0x87, 0x70, 0xe8, 0x0c, 0xd9, 0xc1, 0xda, 0xa3, + 0x62, 0xe6, 0x4a, 0x5a, 0xa7, 0x8f, 0xe7, 0x7b, + 0xb1, 0x4e, 0xfb, 0x51, 0x5a, 0x67, 0x88, 0x2c, + 0xa7, 0xc0, 0x3c, 0xa8, 0x8a, 0x7c, 0xd1, 0x17, + 0xca, 0x17, 0x0d, 0xa5, 0xf6, 0x09, 0x83, 0x58, + 0xbb, 0xc2, 0x8c, 0x41, 0x4e, 0x3b, 0x87, 0x31, + 0xe2, 0x13, 0x44, 0x5a, 0x27, 0xa8, 0x3c, 0xb6, + 0xdf, 0x3e, 0x7c, 0x16, 0x36, 0x8a, 0xba, 0xe7, + 0x1f, 0xa4, 0x65, 0x92, 0xb2, 0xb5, 0x35, 0x31, + 0x56, 0x0b, 0xec, 0xba, 0xaa, 0x72, 0x8e, 0x2c, + 0x7f, 0x52, 0xf2, 0xb4, 0x43, 0xd3, 0xa6, 0x0b, + 0x7e, 0xb0, 0xcf, 0xe3, 0x48, 0xb1, 0x88, 0xd4, + 0xfb, 0x6d, 0x92, 0x2b, 0x08, 0x7a, 0x6e, 0x0e, + 0xe5, 0x3c, 0xc5, 0xe4, 0x72, 0xcd, 0x44, 0x13, + 0xe7, 0x76, 0x73, 0xe6, 0x3e, 0xe2, 0x7f, 0xa6, + 0x8a, 0xc4, 0xff, 0xac, 0x96, 0xe1, 0x5f, 0x45, + 0x30, 0xb3, 0xcd, 0xdf, 0x22, 0xc0, 0xd1, 0x0d, + 0x23, 0x01, 0xc2, 0x45, 0x97, 0x64, 0x00, 0x09, + 0x39, 0x89, 0x3d, 0xbf, 0x90, 0x86, 0xa3, 0x2f, + 0xdb, 0x34, 0x3e, 0x18, 0x2f, 0x8f, 0x05, 0x1b, + 0xcf, 0x6f, 0x79, 0xee, 0x2d, 0x98, 0xfa, 0x50, + 0x5a, 0xb5, 0x03, 0xe3, 0x84, 0xb5, 0x83, 0xae, + 0xe1, 0x4c, 0xd8, 0xbe, 0x95, 0x2c, 0xda, 0x06, + 0xb9, 0x16, 0x45, 0xbf, 0x90, 0x65, 0x93, 0x51, + 0xff, 0x5a, 0xba, 0x80, 0x2b, 0x52, 0xff, 0xb7, + 0x05, 0x5d, 0x98, 0xae, 0xe4, 0xb8, 0xa1, 0x44, + 0xe3, 0x77, 0xcd, 0x29, 0x38, 0x7c, 0x59, 0x9f, + 0xfa, 0xaa, 0xcf, 0x2b, 0x72, 0xf1, 0x02, 0x1d, + 0xb2, 0xc3, 0x42, 0x29, 0x58, 0x78, 0x9e, 0xeb, + 0xaf, 0x1a, 0xf7, 0xd6, 0x8c, 0xbb, 0x1c, 0xf6, + 0x4c, 0x26, 0x4c, 0xcf, 0xc4, 0x64, 0x33, 0x3a, + 0xda, 0x92, 0x00, 0xf5, 0x58, 0xf3, 0xc1, 0x16, + 0x0b, 0x29, 0x72, 0x6b, 0xb6, 0xeb, 0x64, 0xa0, + 0xb6, 0x45, 0x92, 0x41, 0xa3, 0x96, 0xc9, 0xe0, + 0x9f, 0x9b, 0x0b, 0x1b, 0xff, 0xd4, 0x5c, 0xf8, + 0x3f, 0xfc, 0x77, 0x34, 0x17, 0x56, 0x32, 0x5d, + 0x85, 0xbb, 0x9c, 0x65, 0x6b, 0x33, 0x17, 0xa2, + 0xc4, 0x5c, 0x48, 0x7b, 0x5d, 0x2b, 0x41, 0xde, + 0xdf, 0x48, 0x2f, 0xc8, 0xc5, 0xec, 0xcb, 0xd4, + 0x94, 0x98, 0x90, 0x09, 0xd8, 0xc8, 0x37, 0x4c, + 0x6c, 0x1a, 0xdd, 0x65, 0x62, 0x48, 0xcd, 0x96, + 0x57, 0x88, 0xce, 0x96, 0xf4, 0xfe, 0xef, 0xf4, + 0x7c, 0x70, 0x21, 0x45, 0x41, 0xf3, 0x58, 0x13, + 0xc8, 0x16, 0x93, 0xe7, 0x08, 0xc3, 0x73, 0x26, + 0x88, 0x04, 0x64, 0xab, 0x2d, 0xb0, 0xcd, 0x7d, + 0xf6, 0xdc, 0xc2, 0xd9, 0x44, 0x20, 0x95, 0xb4, + 0x1e, 0x73, 0x22, 0x59, 0x99, 0x2a, 0x22, 0x3d, + 0x5a, 0x2e, 0x2b, 0x3d, 0x56, 0x2a, 0xf4, 0x5f, + 0x63, 0x2f, 0x0e, 0x6c, 0x08, 0x78, 0x70, 0xd0, + 0x7f, 0xd4, 0x93, 0xc1, 0x8e, 0x7d, 0x08, 0x73, + 0xfa, 0x16, 0x5e, 0xdd, 0x87, 0x53, 0xcb, 0x3d, + 0xaa, 0xd6, 0xf3, 0xa8, 0xa7, 0x26, 0x2e, 0x2d, + 0xc9, 0xb3, 0x53, 0xcb, 0xb9, 0x85, 0xb5, 0xd8, + 0xae, 0x17, 0x6a, 0x2d, 0x01, 0x37, 0xea, 0x35, + 0x74, 0xe2, 0x0e, 0xf7, 0x28, 0x91, 0xe5, 0x1d, + 0xd3, 0x65, 0x4b, 0xb0, 0x8a, 0x6e, 0x6f, 0xb7, + 0x1b, 0xd0, 0x35, 0x72, 0x3f, 0xaa, 0xa1, 0xfb, + 0x1f, 0xda, 0x99, 0x5b, 0x0c, 0xe4, 0x3d, 0x78, + 0xb1, 0x21, 0x74, 0xf2, 0x5e, 0xff, 0x9b, 0xba, + 0xd2, 0x81, 0x7c, 0xe7, 0xe1, 0x54, 0x1b, 0x27, + 0xd4, 0xee, 0xa6, 0xfc, 0x6e, 0x41, 0x7d, 0x66, + 0x5d, 0xed, 0xfa, 0xfa, 0xb9, 0xab, 0x88, 0x1a, + 0xb4, 0x66, 0x16, 0xdd, 0x3e, 0xac, 0xb7, 0x4b, + 0x69, 0xd5, 0x7f, 0x58, 0xb4, 0xdd, 0x58, 0xda, + 0x83, 0xef, 0x0f, 0x85, 0x5c, 0xdf, 0xac, 0xa7, + 0xeb, 0x1f, 0xd0, 0x91, 0xc9, 0x11, 0xbc, 0xe5, + 0x1e, 0xe2, 0x4b, 0x70, 0xb5, 0x87, 0x34, 0xa9, + 0x1a, 0x22, 0xae, 0xad, 0xe7, 0x5c, 0x25, 0xec, + 0x59, 0x6a, 0xca, 0x5a, 0x38, 0xf5, 0x0c, 0x23, + 0xbe, 0x37, 0xdc, 0xc7, 0xb6, 0x10, 0x9e, 0x1b, + 0x0a, 0xf9, 0xf7, 0x31, 0xbb, 0x77, 0xdf, 0x1b, + 0xc3, 0x72, 0x1f, 0xef, 0x61, 0xe0, 0x36, 0x84, + 0x06, 0x6e, 0xfd, 0xf6, 0xfc, 0x55, 0x59, 0xf9, + 0x4b, 0x10, 0xec, 0x79, 0x24, 0x61, 0x41, 0x83, + 0xd7, 0xcb, 0xde, 0x8f, 0x7b, 0x28, 0x19, 0xe6, + 0xae, 0xc7, 0xd1, 0xb1, 0x88, 0x53, 0x8f, 0xea, + 0xe5, 0x53, 0x11, 0xf3, 0x32, 0x9a, 0xf4, 0x13, + 0x97, 0xce, 0x6c, 0xe1, 0xd0, 0x0b, 0x8a, 0x21, + 0x4a, 0xbd, 0x35, 0x3e, 0xb1, 0xdd, 0xdf, 0x03, + 0xb8, 0xcb, 0xd2, 0x56, 0x85, 0x81, 0x4f, 0x8c, + 0xbc, 0xaa, 0x95, 0x7b, 0xef, 0x1b, 0xb2, 0x42, + 0x78, 0x6c, 0xdf, 0x87, 0x37, 0xac, 0x23, 0xd7, + 0xb6, 0x3f, 0x4d, 0x42, 0x78, 0xfe, 0x07, 0x41, + 0xd5, 0x91, 0x39, 0x86, 0x5d, 0xdf, 0xd0, 0x5b, + 0xa6, 0xd4, 0x8b, 0xad, 0xd5, 0x73, 0xc0, 0xa0, + 0x2c, 0x72, 0x26, 0xb7, 0x8e, 0xf1, 0x09, 0x2e, + 0xba, 0x2e, 0xf5, 0x20, 0xc0, 0x7e, 0x38, 0x72, + 0xfd, 0xcb, 0x09, 0xfa, 0x85, 0xc9, 0x6f, 0xb1, + 0x82, 0x27, 0xa9, 0x5a, 0x31, 0x9a, 0xfe, 0xbe, + 0xaf, 0x62, 0x92, 0xdc, 0xfe, 0x00, 0x6f, 0x5a, + 0xc4, 0x7e, 0xc8, 0x4e, 0xd0, 0x17, 0x12, 0xf0, + 0x3e, 0xd3, 0x44, 0x45, 0xbd, 0x8e, 0xe1, 0xb5, + 0x93, 0xeb, 0xaf, 0xb0, 0x97, 0x63, 0x6c, 0x63, + 0xb0, 0x12, 0x69, 0x41, 0xcb, 0x47, 0xd1, 0x9e, + 0xf2, 0xd1, 0xe9, 0x3e, 0x90, 0x09, 0xa7, 0x31, + 0x27, 0xb7, 0x21, 0x3c, 0xe1, 0x65, 0x95, 0x6f, + 0xae, 0x6f, 0x06, 0xac, 0x1d, 0x8e, 0x4d, 0x73, + 0x72, 0xe2, 0x34, 0x67, 0x0c, 0x90, 0xc7, 0xf9, + 0x99, 0x3c, 0x53, 0xd6, 0xe2, 0x95, 0x15, 0x27, + 0xc7, 0x6e, 0x46, 0x18, 0xb9, 0x65, 0x5b, 0x0b, + 0xb4, 0xaa, 0xf1, 0x5e, 0x13, 0xf8, 0x34, 0x33, + 0x27, 0xcf, 0x65, 0xce, 0x93, 0x19, 0x42, 0xb7, + 0x07, 0xb7, 0xa0, 0xfd, 0xa5, 0x71, 0x83, 0x9c, + 0x6b, 0xac, 0x6d, 0xd4, 0x69, 0x03, 0x1b, 0xb0, + 0x54, 0x10, 0xc1, 0x9b, 0x34, 0x1b, 0x4f, 0x42, + 0xec, 0x69, 0xbc, 0x48, 0x19, 0x79, 0x35, 0xcb, + 0x54, 0xba, 0x6d, 0xc3, 0xe7, 0xc6, 0x30, 0x8e, + 0x02, 0x2d, 0x59, 0xa5, 0xbc, 0x09, 0x50, 0xb6, + 0xce, 0x31, 0xf4, 0x46, 0x9d, 0xeb, 0x9d, 0xdf, + 0xc4, 0x08, 0x7e, 0xad, 0x1e, 0xfc, 0xa5, 0xa4, + 0xf0, 0x7f, 0xca, 0x30, 0x4b, 0x78, 0x39, 0x1f, + 0xe2, 0x01, 0xe4, 0x15, 0x1b, 0x87, 0x5a, 0xb2, + 0x4a, 0x99, 0x36, 0x28, 0xb2, 0x93, 0xc6, 0x04, + 0xe2, 0x15, 0x81, 0xcd, 0x92, 0x55, 0xf8, 0x65, + 0x7b, 0x49, 0x40, 0xd1, 0x55, 0x6d, 0x22, 0xe7, + 0x24, 0x33, 0x10, 0x24, 0x99, 0x37, 0x64, 0x3a, + 0x4b, 0x00, 0xcb, 0x13, 0xda, 0xd6, 0x2d, 0x6e, + 0x24, 0x37, 0xfe, 0x72, 0x79, 0xdb, 0x0c, 0x97, + 0x72, 0x22, 0x49, 0xc6, 0xeb, 0x41, 0x92, 0x11, + 0xbc, 0x29, 0x9a, 0x72, 0xed, 0xee, 0xd6, 0x6c, + 0xb9, 0x8a, 0xec, 0xd9, 0x6d, 0xe1, 0xf4, 0x94, + 0x3d, 0x0d, 0x75, 0x66, 0x51, 0x8c, 0x00, 0xb4, + 0xc8, 0x1e, 0xb0, 0xe8, 0x0b, 0x78, 0xc0, 0xd1, + 0xca, 0xf8, 0x50, 0x25, 0xde, 0x88, 0x63, 0xca, + 0x0d, 0x20, 0xd8, 0x0e, 0xd3, 0x78, 0x20, 0xae, + 0x6c, 0x46, 0xcb, 0x60, 0xba, 0xc1, 0x58, 0x1f, + 0xe6, 0x34, 0x5d, 0xfa, 0x72, 0x39, 0x33, 0x48, + 0xd6, 0x35, 0xfe, 0x79, 0xc7, 0xaa, 0x65, 0xea, + 0x4a, 0xde, 0x69, 0x1c, 0xb5, 0xe9, 0x07, 0x6e, + 0xf0, 0x08, 0xb4, 0xfe, 0x8d, 0xaa, 0x50, 0x4c, + 0xfd, 0x12, 0x56, 0x00, 0xff, 0x05, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x5d, 0x65, 0x43, 0x50, 0xb6, 0x11, 0x0f, 0x60, + 0x9c, 0x09, 0x00, 0x00, 0xb3, 0x55, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, + 0x33, 0x30, 0x46, 0x52, 0x32, 0x36, 0x37, 0x33, + 0x2e, 0x78, 0x6d, 0x6c, 0xed, 0x1c, 0x69, 0x6f, + 0xd3, 0x30, 0xf4, 0x3b, 0x12, 0xff, 0x21, 0xf0, + 0x09, 0x24, 0x46, 0x92, 0x76, 0x2b, 0x1d, 0x2a, + 0x41, 0x59, 0x0f, 0x18, 0x5a, 0xb7, 0xd2, 0x96, + 0xe3, 0xdb, 0xe4, 0x25, 0xee, 0x16, 0x91, 0x26, + 0x21, 0x49, 0xa1, 0xe3, 0xd7, 0xf3, 0xec, 0xb8, + 0x75, 0xd2, 0x5c, 0xee, 0x96, 0x76, 0x99, 0x60, + 0xe2, 0xb0, 0xdf, 0x61, 0xbf, 0xcb, 0xcf, 0x57, + 0xbc, 0xce, 0xfb, 0xe5, 0xdc, 0x96, 0x7e, 0x61, + 0x3f, 0xb0, 0x5c, 0xe7, 0xdd, 0x73, 0xf5, 0xb5, + 0xf2, 0xfc, 0xbd, 0xf6, 0xf4, 0x49, 0xc7, 0xc4, + 0xbf, 0x2c, 0x03, 0x1f, 0x58, 0xce, 0xcc, 0xf5, + 0xe7, 0x28, 0x04, 0x64, 0x92, 0x08, 0x68, 0x24, + 0xf8, 0x61, 0x74, 0xac, 0xc6, 0x20, 0x81, 0xe1, + 0x5b, 0x1e, 0x61, 0xd1, 0x86, 0x93, 0xd1, 0x61, + 0x53, 0x19, 0x8c, 0x1b, 0xad, 0x37, 0xcd, 0x8e, + 0x1c, 0xc7, 0x48, 0x9d, 0x67, 0x07, 0x07, 0xd2, + 0x1a, 0xdf, 0x54, 0x55, 0xe9, 0xe0, 0x20, 0xde, + 0x8c, 0x65, 0x0e, 0x51, 0xf0, 0x83, 0x41, 0xd6, + 0x50, 0x26, 0x83, 0xa6, 0x2c, 0x67, 0xf0, 0xd3, + 0x91, 0x59, 0x7d, 0x93, 0x2c, 0x58, 0x5c, 0x6d, + 0x52, 0xae, 0x40, 0x69, 0x62, 0x1f, 0x54, 0x60, + 0xa4, 0x84, 0x30, 0xaa, 0xa6, 0xc9, 0xe6, 0x68, + 0x39, 0x4e, 0x52, 0xc6, 0x20, 0x71, 0xc9, 0x65, + 0x2e, 0x3a, 0x57, 0xa6, 0xeb, 0x9a, 0x38, 0x5f, + 0x99, 0x76, 0xb3, 0xd9, 0x8e, 0x94, 0xe1, 0xb6, + 0x01, 0x68, 0x63, 0xa6, 0x80, 0x55, 0x8a, 0x94, + 0x13, 0xd4, 0x4b, 0x51, 0xaa, 0xd1, 0x6b, 0x43, + 0x8b, 0x8e, 0x17, 0x20, 0x6d, 0x8c, 0xaf, 0x17, + 0x36, 0xf2, 0x3b, 0x32, 0x54, 0xe2, 0xb8, 0x2b, + 0x2b, 0x0c, 0xb4, 0x06, 0x74, 0x4c, 0x0a, 0x71, + 0x04, 0xf2, 0x8d, 0x1b, 0x2b, 0xc4, 0x46, 0xb8, + 0xf0, 0xb1, 0xd6, 0xf5, 0x16, 0xdf, 0x7f, 0x35, + 0x3a, 0x72, 0x1c, 0x18, 0x27, 0xc6, 0x78, 0xae, + 0xf5, 0x87, 0xfd, 0xef, 0x97, 0x93, 0xa1, 0x7e, + 0x76, 0x76, 0x79, 0xf4, 0xfd, 0x7b, 0x47, 0x06, + 0x18, 0xb3, 0x11, 0xc5, 0x9c, 0x5f, 0x9c, 0xf7, + 0x5f, 0xd1, 0xd2, 0xd9, 0xc5, 0xb7, 0x57, 0x11, + 0x6c, 0xd8, 0xef, 0x9d, 0x7e, 0x19, 0xb2, 0xca, + 0xc7, 0xd3, 0x0f, 0x1f, 0x59, 0xb1, 0xff, 0x7d, + 0x3a, 0xd6, 0x79, 0x5b, 0x11, 0x94, 0xd7, 0x13, + 0xdc, 0x31, 0xc0, 0x99, 0x3e, 0xfe, 0xd0, 0x8f, + 0xd5, 0xbb, 0x17, 0xe3, 0x29, 0xa1, 0x3b, 0xdc, + 0x08, 0x5a, 0xc3, 0x76, 0x8d, 0x1f, 0xa7, 0x30, + 0x66, 0x18, 0x30, 0x89, 0xe8, 0xba, 0x4e, 0xe8, + 0xbb, 0xb6, 0xf6, 0xa1, 0xdb, 0x25, 0x82, 0xf4, + 0xcf, 0x7b, 0xfd, 0x5e, 0x47, 0x8e, 0xa3, 0x98, + 0x5a, 0x40, 0x10, 0x69, 0x45, 0x4b, 0x93, 0xa9, + 0x7e, 0xde, 0xd3, 0xc7, 0x3d, 0x52, 0xe3, 0x8c, + 0x49, 0xdc, 0xe5, 0x29, 0x97, 0x24, 0x6e, 0xbb, + 0x2e, 0x69, 0x3c, 0x90, 0xe4, 0x0c, 0xd4, 0xd4, + 0x9a, 0x43, 0xdc, 0x70, 0x44, 0x1a, 0x29, 0x59, + 0x8e, 0x89, 0x97, 0xef, 0x9e, 0xaf, 0x47, 0x7b, + 0x8a, 0xd2, 0x41, 0x73, 0xac, 0xe9, 0xbd, 0x6e, + 0x47, 0x26, 0xa5, 0x3c, 0xaa, 0x5f, 0xc8, 0x5e, + 0x60, 0x88, 0x2d, 0xb3, 0xd5, 0x91, 0x69, 0x39, + 0xab, 0x53, 0x79, 0xd5, 0xab, 0x88, 0x44, 0x6a, + 0xb1, 0x44, 0x5d, 0x7d, 0x34, 0x3d, 0xfd, 0xaa, + 0x4f, 0xfb, 0x62, 0x72, 0x9d, 0xbc, 0xa9, 0x4a, + 0xae, 0x46, 0xb1, 0x5c, 0x23, 0x08, 0x1b, 0x31, + 0x91, 0x8e, 0x94, 0xaa, 0x44, 0x6a, 0x96, 0x98, + 0xca, 0x9d, 0x7b, 0xc8, 0x47, 0xa1, 0xeb, 0x4b, + 0x7d, 0x45, 0x4c, 0x36, 0x74, 0x5c, 0x95, 0x6c, + 0x87, 0xc5, 0xb2, 0xe1, 0x2f, 0x93, 0xee, 0xa9, + 0x2e, 0x28, 0x55, 0xc3, 0xa8, 0x4a, 0xaa, 0x23, + 0x11, 0xa9, 0x54, 0x41, 0xa9, 0xcc, 0xaa, 0xa4, + 0x6a, 0x09, 0x48, 0x75, 0x22, 0x68, 0xab, 0x66, + 0x65, 0xd1, 0xf5, 0x46, 0x44, 0x2a, 0x41, 0x5b, + 0x35, 0xd5, 0xaa, 0xa4, 0x6a, 0x17, 0x4b, 0x35, + 0x9e, 0x0a, 0x26, 0xac, 0x36, 0xca, 0x91, 0x88, + 0xaf, 0x75, 0x66, 0x68, 0x61, 0x87, 0x93, 0xd0, + 0xf5, 0xb4, 0xd0, 0x5f, 0xe0, 0x8e, 0x1c, 0x83, + 0xdc, 0x5b, 0x8d, 0xe3, 0x62, 0x35, 0x28, 0xad, + 0x72, 0xa9, 0x37, 0x05, 0x95, 0xe9, 0x3f, 0xa8, + 0x32, 0xaa, 0x22, 0xa0, 0x8d, 0x2a, 0xae, 0xcd, + 0xe0, 0x61, 0xb5, 0x51, 0x05, 0xb4, 0x69, 0x08, + 0x6b, 0x73, 0xac, 0x3c, 0xac, 0x36, 0x0d, 0x01, + 0x6d, 0x9a, 0xc2, 0xda, 0xb4, 0x1a, 0x0f, 0xab, + 0x4d, 0x53, 0x40, 0x1b, 0xe5, 0xf2, 0xe4, 0x8d, + 0x98, 0x36, 0xc7, 0xbd, 0x87, 0xd5, 0xa6, 0x64, + 0x92, 0xfc, 0x86, 0x42, 0xe3, 0xc6, 0x74, 0xaf, + 0x25, 0xca, 0x25, 0xa6, 0xd2, 0xde, 0xd2, 0x1a, + 0x5d, 0xcd, 0x0e, 0x60, 0x6d, 0x81, 0x6c, 0x5b, + 0x0a, 0x80, 0xd9, 0x43, 0x57, 0x36, 0x96, 0x4e, + 0x47, 0x01, 0xd0, 0x15, 0x2e, 0xa4, 0x68, 0x0a, + 0x2f, 0x5f, 0xb2, 0x30, 0x7d, 0xa5, 0x73, 0x37, + 0xc4, 0x6f, 0xa1, 0x5d, 0x89, 0x54, 0x39, 0x63, + 0x5a, 0xf3, 0x76, 0xa4, 0xfa, 0x9a, 0x25, 0xbc, + 0xb1, 0x02, 0x09, 0xfe, 0x84, 0x37, 0x58, 0x1a, + 0x9d, 0xf6, 0x9e, 0x3e, 0x11, 0xd3, 0x2b, 0x25, + 0x2f, 0xcd, 0xd5, 0xc5, 0xf1, 0xc6, 0x47, 0x4f, + 0x7e, 0xac, 0xad, 0x57, 0xa2, 0x77, 0x15, 0xa4, + 0xa9, 0x94, 0x08, 0xa2, 0x8a, 0x09, 0xd2, 0xe6, + 0x82, 0xdc, 0x2b, 0x3c, 0xb6, 0x90, 0x9c, 0xa6, + 0xd4, 0x7b, 0x05, 0xb9, 0x48, 0x80, 0x57, 0x23, + 0xfd, 0xeb, 0xd7, 0xaf, 0x93, 0x80, 0x83, 0x83, + 0x5c, 0xd6, 0x20, 0xb1, 0x89, 0x8e, 0x6f, 0x11, + 0xb9, 0xdc, 0xae, 0x1d, 0xa2, 0x6b, 0x1c, 0x03, + 0x73, 0x94, 0x61, 0x0c, 0x2d, 0x47, 0x53, 0xdb, + 0x64, 0x0f, 0x1f, 0x55, 0xb2, 0x48, 0xd0, 0x52, + 0x6b, 0xb6, 0x08, 0x09, 0xab, 0xa4, 0x49, 0x06, + 0x36, 0x0a, 0x6e, 0x78, 0x53, 0x71, 0x48, 0x9a, + 0x78, 0x82, 0x0d, 0xd8, 0x88, 0x13, 0x5c, 0xe3, + 0x88, 0x52, 0x73, 0x50, 0x9a, 0xdc, 0xf3, 0x38, + 0xae, 0xa5, 0x10, 0x72, 0x00, 0x09, 0x90, 0x83, + 0x98, 0x6f, 0x36, 0xc8, 0xd3, 0x92, 0x87, 0x38, + 0x08, 0xbf, 0x7a, 0x2b, 0x57, 0xb1, 0x5a, 0xc2, + 0xa2, 0xd9, 0xc6, 0xeb, 0xcc, 0x30, 0x22, 0x87, + 0x09, 0x41, 0xe6, 0x56, 0x7c, 0x72, 0x1b, 0x84, + 0x70, 0x8a, 0x30, 0xbc, 0xe8, 0x5d, 0x5e, 0x4c, + 0x60, 0x35, 0x18, 0x03, 0x6e, 0xd2, 0xdb, 0xc6, + 0x0c, 0xb3, 0xde, 0x49, 0x71, 0x13, 0xfd, 0x73, + 0x61, 0x19, 0x3f, 0x86, 0x78, 0x3e, 0xc6, 0xc8, + 0x64, 0x64, 0x71, 0xd0, 0x26, 0xf9, 0x0d, 0x0a, + 0x06, 0x3e, 0x9a, 0x33, 0x4a, 0x56, 0x4b, 0xa8, + 0x93, 0x21, 0x77, 0x07, 0x2f, 0xc3, 0x41, 0x06, + 0x58, 0xce, 0x81, 0x7b, 0xee, 0x6f, 0xec, 0x4f, + 0x70, 0x18, 0x5a, 0xce, 0x75, 0x90, 0x65, 0x50, + 0x38, 0xb3, 0x69, 0x7e, 0xed, 0x45, 0x61, 0x4f, + 0x0e, 0x91, 0x36, 0x61, 0xb9, 0x3c, 0x7d, 0x87, + 0x24, 0xf0, 0x33, 0x6f, 0x7e, 0x04, 0xa3, 0xec, + 0x50, 0x21, 0xc7, 0x3b, 0x19, 0xb8, 0x5c, 0x76, + 0x72, 0x2e, 0xb6, 0x66, 0x4c, 0x40, 0x73, 0x58, + 0x7a, 0x56, 0x10, 0xeb, 0x50, 0x85, 0xac, 0xc4, + 0x11, 0xa5, 0xbd, 0xc5, 0x68, 0xd2, 0x9d, 0x96, + 0x37, 0x10, 0xe9, 0x93, 0xee, 0xba, 0x54, 0x4f, + 0xa6, 0xa5, 0xaa, 0x28, 0x31, 0xae, 0x02, 0x25, + 0x99, 0xd1, 0x29, 0x0b, 0x1d, 0x0f, 0x49, 0x78, + 0xc2, 0xe3, 0x69, 0xd7, 0xf2, 0x99, 0x96, 0xd7, + 0x86, 0xe8, 0x56, 0xba, 0xc6, 0x0e, 0x86, 0x59, + 0x12, 0x4b, 0x86, 0xeb, 0x60, 0x27, 0x94, 0xdc, + 0x99, 0x84, 0x91, 0x71, 0x23, 0xc1, 0x58, 0x91, + 0xae, 0x50, 0x80, 0x4d, 0x09, 0xce, 0x74, 0x3f, + 0x4d, 0xf5, 0x0f, 0x30, 0x6d, 0x1e, 0x7c, 0xd7, + 0xbb, 0x53, 0xc9, 0x44, 0x21, 0x5a, 0xb7, 0xc1, + 0xe6, 0xc7, 0x19, 0xcc, 0xb2, 0x70, 0x3e, 0xbb, + 0x5c, 0x2e, 0xe5, 0x43, 0xf8, 0x87, 0x71, 0x46, + 0xa7, 0xbe, 0xc1, 0x96, 0x21, 0xb7, 0x3b, 0xbb, + 0x54, 0xe2, 0xb6, 0x7b, 0xc5, 0xda, 0xd6, 0x91, + 0xfd, 0x20, 0xe3, 0xef, 0x0e, 0x23, 0x22, 0x3f, + 0xe4, 0xb2, 0x43, 0xe5, 0xe8, 0xf8, 0x11, 0x46, + 0x89, 0xa2, 0xdc, 0x23, 0x50, 0x48, 0xaf, 0x77, + 0x89, 0x15, 0x43, 0x41, 0xfb, 0x8b, 0x15, 0xe3, + 0xde, 0xb1, 0x82, 0xee, 0x13, 0x2b, 0xc9, 0x63, + 0xf2, 0x39, 0x9e, 0xbb, 0xfe, 0xed, 0x19, 0xba, + 0x75, 0x17, 0x2b, 0xf1, 0x37, 0x70, 0x74, 0x1d, + 0xff, 0xee, 0xf9, 0x89, 0xeb, 0x86, 0xe4, 0xce, + 0x21, 0x73, 0x65, 0x18, 0xde, 0x7a, 0x70, 0x96, + 0xe3, 0xce, 0x3b, 0x32, 0x2d, 0x71, 0x8a, 0xe4, + 0x15, 0x84, 0xda, 0x4a, 0x5d, 0x41, 0xf0, 0xab, + 0x94, 0x10, 0xf9, 0x34, 0x72, 0x74, 0xe2, 0x42, + 0x5a, 0xcb, 0x24, 0xb3, 0xfe, 0xd0, 0x7d, 0x2d, + 0x21, 0x22, 0xe5, 0x4c, 0x1a, 0x7c, 0x3d, 0x87, + 0x34, 0x3b, 0x89, 0x48, 0xe1, 0x28, 0x8b, 0x03, + 0xb2, 0x65, 0x43, 0xce, 0x8f, 0x40, 0x03, 0x3a, + 0x5a, 0xc8, 0xa2, 0x98, 0x23, 0xcf, 0xc3, 0xab, + 0x35, 0x45, 0x54, 0xc9, 0x22, 0xf3, 0x7c, 0x97, + 0xdc, 0x9b, 0x10, 0x77, 0x30, 0x5a, 0x0e, 0x59, + 0xf7, 0x9c, 0xb6, 0xb0, 0x6e, 0xc0, 0xd0, 0x5c, + 0xf5, 0x9b, 0x6d, 0x5b, 0x62, 0x7d, 0x03, 0xac, + 0x0f, 0x36, 0x8e, 0xa8, 0xf3, 0x2d, 0x2d, 0xa7, + 0x1a, 0x4d, 0x23, 0x01, 0x9c, 0xde, 0x1d, 0xd6, + 0xc2, 0xfb, 0x88, 0x7b, 0x9f, 0xe5, 0x32, 0xd3, + 0x9a, 0xcd, 0xb0, 0x4f, 0xa6, 0x4d, 0x0a, 0x96, + 0x90, 0x69, 0xfa, 0xa0, 0x99, 0xe4, 0xb9, 0x41, + 0x60, 0x81, 0x5d, 0xf3, 0x83, 0xa4, 0xcd, 0x62, + 0x24, 0xdd, 0x12, 0x81, 0x0a, 0x35, 0xf4, 0x3f, + 0x92, 0xca, 0x23, 0x69, 0x63, 0xef, 0x55, 0x18, + 0x46, 0x81, 0xbd, 0xf3, 0x08, 0x52, 0x44, 0xf2, + 0x47, 0xfb, 0x5f, 0xcb, 0x1f, 0x81, 0xbd, 0x76, + 0xf8, 0x87, 0xf1, 0xbd, 0x5d, 0x5e, 0xe2, 0xe3, + 0xc6, 0xae, 0x9d, 0x3c, 0x18, 0x74, 0x45, 0xbc, + 0x7c, 0xf8, 0xdf, 0xcb, 0x15, 0x7a, 0xb9, 0x64, + 0x8a, 0x80, 0xce, 0xe5, 0x7d, 0xf8, 0xfe, 0xff, + 0x00, 0xdf, 0x83, 0xeb, 0xb7, 0xc8, 0xe9, 0xf0, + 0xd9, 0x48, 0x81, 0xcb, 0xf1, 0xb5, 0x05, 0x27, + 0x39, 0x7e, 0x24, 0x50, 0xbe, 0x5b, 0x05, 0x3c, + 0xaa, 0x3e, 0x84, 0x43, 0x67, 0xc8, 0x0e, 0xd6, + 0x1e, 0x15, 0x33, 0x57, 0xd2, 0x3a, 0x7d, 0x3c, + 0xdf, 0x8b, 0x75, 0xda, 0x8f, 0xd2, 0x3a, 0x43, + 0x64, 0x39, 0x05, 0xe6, 0x41, 0x55, 0xe4, 0x8b, + 0xae, 0x50, 0xbe, 0x38, 0x54, 0x6a, 0x9f, 0x30, + 0x88, 0xb5, 0x2b, 0xcc, 0x18, 0xe4, 0xb4, 0x73, + 0x18, 0x23, 0x3e, 0x41, 0xa4, 0x75, 0x82, 0xca, + 0x63, 0xfb, 0xed, 0xc3, 0x67, 0x61, 0xa3, 0xa8, + 0x7b, 0xfe, 0x41, 0x5a, 0x26, 0x29, 0x5b, 0x5b, + 0x13, 0x63, 0xb5, 0xc0, 0xae, 0xab, 0x2a, 0xe7, + 0xc8, 0xf2, 0x27, 0x25, 0x4f, 0x3b, 0x34, 0x6d, + 0xba, 0xe0, 0x07, 0xfb, 0x3c, 0x8e, 0x14, 0x8b, + 0x48, 0xbd, 0xdf, 0x26, 0xb9, 0x82, 0xa0, 0xe7, + 0xe6, 0x50, 0xce, 0x53, 0x4c, 0x2e, 0xd7, 0x4c, + 0x34, 0x71, 0x6e, 0x37, 0x67, 0xee, 0x23, 0xfe, + 0x67, 0xaa, 0x48, 0xfc, 0xcf, 0x6a, 0x19, 0xfe, + 0x55, 0x04, 0x33, 0xdb, 0xfc, 0x2d, 0x02, 0x1c, + 0xdd, 0x30, 0x12, 0x20, 0x5c, 0x74, 0x49, 0x06, + 0x90, 0x90, 0x93, 0xd8, 0xf3, 0x0b, 0x69, 0x38, + 0xfa, 0xb2, 0x4d, 0xe3, 0x83, 0xf1, 0xf2, 0x58, + 0xb0, 0xf1, 0xfc, 0x96, 0xe7, 0xde, 0x82, 0xa9, + 0x0f, 0xa5, 0x55, 0x3b, 0x30, 0x4e, 0x58, 0x3b, + 0xe8, 0x1a, 0xce, 0x84, 0xed, 0x5b, 0xc9, 0xa2, + 0x6d, 0x90, 0x6b, 0x51, 0xf4, 0x0b, 0x59, 0x36, + 0x19, 0xf5, 0xaf, 0xa5, 0x0b, 0xb8, 0x22, 0xf5, + 0x7f, 0x5b, 0xd0, 0x85, 0xe9, 0x4a, 0x8e, 0x1b, + 0x4a, 0x34, 0x7e, 0xd7, 0x9c, 0x82, 0xc3, 0x97, + 0xf5, 0xa9, 0xaf, 0xfa, 0xbc, 0x22, 0x17, 0x2f, + 0xd0, 0x21, 0x3b, 0x2c, 0x94, 0x82, 0x85, 0xe7, + 0xb9, 0xfe, 0xaa, 0x71, 0x6f, 0xcd, 0xb8, 0xcb, + 0x61, 0xcf, 0x64, 0xc2, 0xf4, 0x4c, 0x4c, 0x36, + 0xa3, 0xa3, 0x2d, 0x09, 0x50, 0x8f, 0x35, 0x1f, + 0x6c, 0xb1, 0x90, 0x22, 0xb7, 0x66, 0xbb, 0x4e, + 0x06, 0x6a, 0x5b, 0x24, 0x19, 0x34, 0x6a, 0x99, + 0x0c, 0xfe, 0xb9, 0xb9, 0xb0, 0xf1, 0x4f, 0xcd, + 0x85, 0xff, 0xc3, 0x7f, 0x47, 0x73, 0x61, 0x25, + 0xd3, 0x55, 0xb8, 0xcb, 0x59, 0xb6, 0x36, 0x73, + 0x21, 0x4a, 0xcc, 0x85, 0xb4, 0xd7, 0xb5, 0x12, + 0xe4, 0xfd, 0x8d, 0xf4, 0x82, 0x5c, 0xcc, 0xbe, + 0x4c, 0x4d, 0x89, 0x09, 0x99, 0x80, 0x8d, 0x7c, + 0xc3, 0xc4, 0xa6, 0xd1, 0x5d, 0x26, 0x86, 0xd4, + 0x6c, 0x79, 0x85, 0xe8, 0x6c, 0x49, 0xef, 0xff, + 0x4e, 0xcf, 0x07, 0x17, 0x52, 0x14, 0x34, 0x8f, + 0x35, 0x81, 0x6c, 0x31, 0x79, 0x8e, 0x30, 0x3c, + 0x67, 0x82, 0x48, 0x40, 0xb6, 0xda, 0x02, 0xdb, + 0xdc, 0x67, 0xcf, 0x2d, 0x9c, 0x4d, 0x04, 0x52, + 0x49, 0xeb, 0x31, 0x27, 0x92, 0x95, 0xa9, 0x22, + 0xd2, 0xa3, 0xe5, 0xb2, 0xd2, 0x63, 0xa5, 0x42, + 0xff, 0x35, 0xf6, 0xe2, 0xc0, 0x86, 0x80, 0x07, + 0x07, 0xfd, 0x47, 0x3d, 0x19, 0xec, 0xd8, 0x87, + 0x30, 0xa7, 0x6f, 0xe1, 0xd5, 0x7d, 0x38, 0xb5, + 0xdc, 0xa3, 0x6a, 0x3d, 0x8f, 0x7a, 0x6a, 0xe2, + 0xd2, 0x92, 0x3c, 0x3b, 0xb5, 0x9c, 0x5b, 0x58, + 0x8b, 0xed, 0x7a, 0xa1, 0xd6, 0x12, 0x70, 0xa3, + 0x5e, 0x43, 0x27, 0xee, 0x70, 0x8f, 0x12, 0x59, + 0xde, 0x31, 0x5d, 0xb6, 0x04, 0xab, 0xe8, 0xf6, + 0x76, 0xbb, 0x01, 0x5d, 0x23, 0xf7, 0xa3, 0x1a, + 0xba, 0xff, 0xa1, 0x9d, 0xb9, 0xc5, 0x40, 0xde, + 0x83, 0x17, 0x1b, 0x42, 0x27, 0xef, 0x35, 0x4d, + 0xc7, 0x5b, 0x8d, 0xe4, 0x3b, 0x8f, 0xa7, 0xda, + 0x78, 0xa1, 0x76, 0x57, 0xe5, 0x77, 0x8b, 0xea, + 0x33, 0xeb, 0x6a, 0xd7, 0xf7, 0xcf, 0x5d, 0x45, + 0xd4, 0xa0, 0x35, 0xb3, 0xe8, 0xf6, 0x61, 0xbd, + 0x5d, 0x4e, 0xab, 0xfe, 0xcb, 0xa2, 0xed, 0xc6, + 0xd2, 0x1e, 0x7c, 0x7f, 0x28, 0xe4, 0xfa, 0x66, + 0x3d, 0x5d, 0xff, 0x80, 0x8e, 0x4c, 0x8e, 0xe0, + 0x2d, 0x37, 0x11, 0x5f, 0x82, 0xab, 0x3d, 0xa4, + 0x49, 0xd5, 0x10, 0x71, 0x6d, 0x3d, 0x3f, 0x2b, + 0x11, 0xf6, 0x2c, 0x35, 0x65, 0x2d, 0x9c, 0x7a, + 0x86, 0x11, 0xdf, 0x1c, 0xee, 0x63, 0x5f, 0x08, + 0xef, 0x0d, 0x85, 0xfc, 0xfb, 0x98, 0xdd, 0xbb, + 0xef, 0x9d, 0x61, 0xb9, 0x8f, 0xf7, 0x30, 0x70, + 0x1b, 0x42, 0x03, 0xb7, 0x7e, 0xab, 0xcc, 0xaa, + 0xac, 0xfc, 0x25, 0x08, 0xf6, 0x3c, 0x92, 0xb0, + 0xa0, 0xc1, 0xeb, 0x65, 0xef, 0xc7, 0x3d, 0x94, + 0x0c, 0x73, 0xd7, 0xe3, 0xe8, 0x58, 0xc4, 0xa9, + 0x47, 0xf5, 0xf2, 0xa9, 0x88, 0x79, 0x19, 0x4d, + 0xfa, 0x8d, 0x4b, 0x67, 0xb6, 0x70, 0xe8, 0x0d, + 0xc5, 0x10, 0xa5, 0x1e, 0x1b, 0x9f, 0xd8, 0xee, + 0xef, 0x01, 0x5c, 0x66, 0x69, 0xab, 0xc2, 0xc0, + 0x27, 0x46, 0x5e, 0xd5, 0xca, 0xbd, 0xf7, 0x0d, + 0x59, 0x21, 0xbc, 0xb6, 0xef, 0xc3, 0x23, 0xd6, + 0x91, 0x6b, 0xdb, 0x9f, 0x26, 0x21, 0xbc, 0xff, + 0x83, 0xa0, 0xea, 0xc8, 0x1c, 0xc3, 0xee, 0x6f, + 0xe8, 0x35, 0x53, 0xea, 0xc9, 0xd6, 0xea, 0x3d, + 0x60, 0x50, 0x16, 0x39, 0x93, 0x5b, 0xc7, 0xf8, + 0x04, 0x37, 0x5d, 0x97, 0x7a, 0x10, 0x60, 0x3f, + 0x1c, 0xb9, 0xfe, 0xe5, 0x04, 0xfd, 0xc2, 0xe4, + 0xd7, 0x58, 0xc1, 0x9b, 0x54, 0xad, 0x18, 0x4d, + 0x7f, 0xe1, 0x57, 0x31, 0x49, 0x6e, 0x7f, 0x80, + 0x37, 0x2d, 0x62, 0x3f, 0x64, 0x27, 0xe8, 0x0b, + 0x09, 0x78, 0x9f, 0x69, 0xa2, 0xa2, 0x5e, 0xc7, + 0xf0, 0xdc, 0xc9, 0xf5, 0x57, 0xd8, 0xcb, 0x31, + 0xb6, 0x31, 0x58, 0x89, 0xb4, 0xa0, 0xe5, 0xa3, + 0x68, 0x4f, 0xf9, 0xe8, 0x74, 0x1f, 0xc8, 0x84, + 0xe3, 0x98, 0x93, 0xdb, 0x10, 0xde, 0xf0, 0xb2, + 0xca, 0x37, 0xd7, 0x37, 0x03, 0xd6, 0x0e, 0xc7, + 0xa6, 0x39, 0x39, 0x71, 0x9a, 0x33, 0x06, 0xc8, + 0xe3, 0xfc, 0x4c, 0xde, 0x29, 0x6b, 0xf1, 0xca, + 0x8a, 0x93, 0x63, 0x37, 0x23, 0x8c, 0x5c, 0xb3, + 0xad, 0x05, 0x5a, 0xd5, 0x78, 0xaf, 0x09, 0x7c, + 0x9a, 0x99, 0x93, 0xe7, 0x32, 0xe7, 0xc9, 0x0c, + 0xa1, 0xdb, 0x83, 0x6b, 0xd0, 0xfe, 0xd2, 0xb8, + 0x41, 0xce, 0x35, 0xd6, 0x36, 0xea, 0xb4, 0x81, + 0x0d, 0x58, 0x2a, 0x88, 0xe0, 0x51, 0x9a, 0x8d, + 0x27, 0x21, 0xf6, 0x34, 0x5e, 0xa4, 0x8c, 0xbc, + 0x9a, 0x65, 0x2a, 0xdd, 0xb6, 0xe1, 0x7b, 0x63, + 0x18, 0x47, 0x81, 0x96, 0xac, 0x52, 0xde, 0x04, + 0x28, 0x5b, 0xe7, 0x18, 0x7a, 0xa3, 0xce, 0xf5, + 0xce, 0x6f, 0x62, 0x04, 0xbf, 0x57, 0x0f, 0xfe, + 0x52, 0x52, 0xf8, 0x3f, 0x65, 0x98, 0x25, 0x3c, + 0x9d, 0x0f, 0xf1, 0x00, 0xf2, 0x8a, 0x8d, 0x43, + 0x2d, 0x59, 0xa5, 0x4c, 0x1b, 0x14, 0xd9, 0x49, + 0x63, 0x02, 0xf1, 0x8a, 0xc0, 0x66, 0xc9, 0x2a, + 0xfc, 0xb6, 0xbd, 0x24, 0xa0, 0xe8, 0xae, 0x36, + 0x91, 0x73, 0x92, 0x19, 0x08, 0x92, 0xcc, 0x1b, + 0x32, 0x9d, 0x25, 0x80, 0xe5, 0x09, 0x6d, 0xeb, + 0x16, 0x37, 0x92, 0x1b, 0x7f, 0xba, 0xbc, 0x6d, + 0x86, 0x4b, 0x39, 0x91, 0x24, 0xe3, 0xf5, 0x20, + 0xc9, 0x08, 0xde, 0x14, 0x4d, 0xb9, 0x76, 0x77, + 0x6b, 0xb6, 0x5c, 0x45, 0xf6, 0xee, 0xb6, 0x70, + 0x7a, 0xca, 0x9e, 0x86, 0x3a, 0xb3, 0x28, 0x46, + 0x00, 0x5a, 0x64, 0x0f, 0x58, 0xf4, 0x05, 0x3c, + 0xe0, 0x68, 0x65, 0x7c, 0xa8, 0x12, 0x6f, 0xc4, + 0x31, 0xe5, 0x06, 0x10, 0x6c, 0x87, 0x69, 0x3c, + 0x10, 0x57, 0x36, 0xa3, 0x65, 0x30, 0xdd, 0x60, + 0xac, 0x0f, 0x73, 0x9a, 0x2e, 0x7d, 0xba, 0x9c, + 0x19, 0x24, 0xeb, 0x1a, 0xff, 0xbe, 0x63, 0xd5, + 0x32, 0x75, 0x25, 0xef, 0x34, 0x8e, 0xda, 0xf4, + 0x03, 0x37, 0x78, 0x04, 0x5a, 0xff, 0x4a, 0x55, + 0x28, 0xa6, 0x7e, 0x0b, 0x2b, 0x80, 0xff, 0x02, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0x64, 0x05, + 0x39, 0xcb, 0x96, 0x09, 0x00, 0x00, 0x82, 0x53, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, 0x53, + 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, 0x36, + 0x37, 0x35, 0x2e, 0x78, 0x6d, 0x6c, 0xed, 0x1c, + 0xd9, 0x72, 0xd3, 0x30, 0xf0, 0xbd, 0x5f, 0x61, + 0x78, 0x82, 0x19, 0x8a, 0xed, 0xa4, 0x09, 0x29, + 0x13, 0xcc, 0xa4, 0x39, 0xa0, 0x4c, 0xd3, 0x86, + 0x24, 0x1c, 0x6f, 0x1d, 0xd5, 0x56, 0x5a, 0x0f, + 0x4e, 0x6c, 0x2c, 0x07, 0x52, 0xbe, 0x9e, 0x95, + 0x2d, 0x47, 0x76, 0x64, 0x3b, 0x4a, 0x6b, 0xb7, + 0xe9, 0x40, 0x87, 0x43, 0xda, 0x5d, 0x49, 0x7b, + 0xeb, 0xb2, 0xda, 0x7e, 0xbf, 0x9a, 0x3b, 0xca, + 0x2f, 0xec, 0x13, 0xdb, 0x5d, 0xbc, 0x7b, 0xae, + 0xbf, 0xd6, 0x9e, 0xbf, 0x37, 0x0e, 0xda, 0x16, + 0xfe, 0x65, 0x9b, 0xf8, 0xd0, 0x5e, 0xcc, 0x5c, + 0x7f, 0x8e, 0x02, 0xc0, 0xa5, 0x69, 0x8c, 0x03, + 0x05, 0x7e, 0x18, 0x59, 0x54, 0x61, 0x00, 0x62, + 0xfa, 0xb6, 0x47, 0x1b, 0x18, 0xc3, 0xc9, 0xe8, + 0xa8, 0xae, 0x0d, 0xc6, 0xb5, 0xe6, 0x9b, 0x46, + 0x5b, 0x4d, 0x62, 0x94, 0xf6, 0xb3, 0xc3, 0x43, + 0x65, 0x8d, 0xaf, 0xeb, 0xba, 0x72, 0x78, 0x98, + 0xe8, 0xc5, 0xb6, 0x86, 0x88, 0xfc, 0x88, 0x00, + 0x6b, 0x20, 0x1b, 0xdf, 0xd0, 0x56, 0x33, 0xf8, + 0x69, 0xab, 0xac, 0xbe, 0x41, 0x45, 0x96, 0x57, + 0x9b, 0x84, 0x0c, 0x24, 0xd2, 0xfa, 0xc0, 0x3d, + 0xa3, 0xa4, 0x74, 0x61, 0x55, 0xa4, 0x9a, 0xa3, + 0xd5, 0x38, 0x4d, 0x98, 0x84, 0x70, 0xa6, 0xd5, + 0x35, 0xd7, 0x5c, 0x8c, 0xae, 0x6b, 0xe1, 0x5c, + 0x31, 0x5a, 0xf5, 0xda, 0x71, 0x24, 0x06, 0xd7, + 0x09, 0x40, 0x6b, 0x33, 0x0d, 0xb4, 0x51, 0x20, + 0x96, 0x9c, 0x44, 0x9a, 0x56, 0x86, 0x44, 0x69, + 0x01, 0xda, 0x1e, 0x41, 0xc6, 0x18, 0x5f, 0x2f, + 0x1d, 0xe4, 0xb7, 0x55, 0x5a, 0xe1, 0xa8, 0x2b, + 0x3b, 0x20, 0x46, 0x0d, 0x06, 0x0d, 0x0b, 0x1c, + 0x8e, 0x7c, 0xf3, 0xc6, 0x0e, 0xb0, 0x19, 0x2c, + 0x7d, 0x6c, 0x74, 0xbd, 0xe5, 0xf7, 0x5f, 0xb5, + 0xb6, 0x9a, 0x02, 0x72, 0x5a, 0x8c, 0xe7, 0x46, + 0x7f, 0xd8, 0xff, 0x7e, 0x39, 0x19, 0x76, 0xce, + 0xce, 0x2e, 0x1b, 0xdf, 0xbf, 0xb7, 0x55, 0x80, + 0x31, 0xdd, 0x84, 0x98, 0xf3, 0x8b, 0xf3, 0xfe, + 0xab, 0xb0, 0x74, 0x76, 0xf1, 0xed, 0x55, 0x04, + 0x1b, 0xf6, 0x7b, 0xa7, 0x5f, 0x86, 0xac, 0xf2, + 0xf1, 0xf4, 0xc3, 0x47, 0x56, 0xec, 0x7f, 0x9f, + 0x8e, 0x3b, 0xbc, 0xaf, 0x08, 0xca, 0xeb, 0xa9, + 0xd6, 0x09, 0xc0, 0x59, 0x67, 0xfc, 0xa1, 0x9f, + 0xa8, 0x77, 0x2f, 0xc6, 0x53, 0x4a, 0x77, 0x94, + 0x76, 0x52, 0xd3, 0x71, 0xcd, 0x1f, 0xa7, 0x10, + 0x20, 0x1c, 0xc6, 0xe1, 0x5d, 0x77, 0x11, 0xf8, + 0xae, 0x63, 0x7c, 0xe8, 0x76, 0x29, 0x1b, 0xfd, + 0xf3, 0x5e, 0xbf, 0xd7, 0x56, 0x93, 0x28, 0x26, + 0x14, 0x10, 0x44, 0x32, 0x85, 0xa5, 0xc9, 0xb4, + 0x73, 0xde, 0xeb, 0x8c, 0x7b, 0xb4, 0xc6, 0x1b, + 0xa6, 0x71, 0x97, 0xa7, 0x6b, 0x3e, 0x92, 0x8a, + 0xeb, 0xd2, 0xbe, 0x89, 0xa2, 0x8a, 0x98, 0xa9, + 0x3d, 0x07, 0x67, 0x59, 0xc3, 0x45, 0x9c, 0x62, + 0x2f, 0x2c, 0xbc, 0x7a, 0xf7, 0x3c, 0x0e, 0x6b, + 0x81, 0x70, 0x81, 0xe6, 0xd8, 0xe8, 0xf4, 0xba, + 0x6d, 0x95, 0x96, 0x72, 0x88, 0x7e, 0x21, 0x67, + 0x89, 0xc1, 0x9f, 0xac, 0x66, 0x5b, 0x8d, 0xca, + 0xe2, 0x88, 0x6a, 0x3c, 0xa4, 0x04, 0x37, 0x7a, + 0x21, 0x37, 0xdd, 0xce, 0x68, 0x7a, 0xfa, 0xb5, + 0x33, 0xed, 0x4b, 0xf1, 0x74, 0xf2, 0xa6, 0x1c, + 0x9e, 0x6a, 0x85, 0x3c, 0x8d, 0xc0, 0x51, 0xa4, + 0xd8, 0x69, 0x68, 0xe5, 0xb0, 0x53, 0x2f, 0x56, + 0x91, 0x3b, 0xf7, 0x90, 0x8f, 0x02, 0xd7, 0x57, + 0xfa, 0x9a, 0x14, 0x5f, 0xe8, 0xb8, 0x1c, 0xbe, + 0x8e, 0x0a, 0xf9, 0xc2, 0x5f, 0x26, 0xdd, 0xd3, + 0x8e, 0x1c, 0x47, 0x35, 0xb3, 0x1c, 0x8e, 0x1a, + 0x12, 0x1c, 0xe9, 0x72, 0x1c, 0x59, 0xe5, 0x70, + 0xd4, 0xdc, 0xce, 0xd1, 0x89, 0x9c, 0x8e, 0xea, + 0x25, 0x79, 0xd3, 0x1b, 0x09, 0x8e, 0xe4, 0x74, + 0x54, 0xd7, 0xcb, 0xe1, 0xa8, 0x55, 0xc8, 0xd1, + 0x78, 0x2a, 0x97, 0x90, 0x5a, 0x28, 0x9b, 0x1b, + 0xbe, 0x66, 0x99, 0xa1, 0xa5, 0x13, 0x4c, 0x02, + 0xd7, 0x33, 0x02, 0x7f, 0x89, 0xdb, 0x6a, 0x02, + 0x72, 0x4f, 0x09, 0x8e, 0x0b, 0x25, 0x08, 0x49, + 0xb5, 0xcb, 0x4e, 0x5d, 0x4e, 0x8e, 0xfe, 0xe3, + 0xc9, 0xa1, 0x6b, 0xdb, 0x05, 0xd1, 0xa5, 0x05, + 0x19, 0x3c, 0xa2, 0x20, 0xfa, 0x76, 0x41, 0x6a, + 0xb2, 0x82, 0x1c, 0x6b, 0x8f, 0x28, 0x48, 0x6d, + 0xbb, 0x20, 0x75, 0x59, 0x41, 0x9a, 0xb5, 0x47, + 0x14, 0xa4, 0xbe, 0x5d, 0x10, 0xed, 0xf2, 0xe4, + 0x8d, 0x94, 0x20, 0xc7, 0xbd, 0x47, 0x14, 0xa4, + 0x78, 0xda, 0xfb, 0x86, 0x02, 0xf3, 0xc6, 0x72, + 0xaf, 0x95, 0xb0, 0x91, 0x94, 0x34, 0x0f, 0x93, + 0xb8, 0xc2, 0x75, 0xe8, 0x00, 0x56, 0x09, 0xc8, + 0x71, 0x14, 0x02, 0x4d, 0x3d, 0x74, 0xe5, 0x60, + 0xe5, 0x74, 0x44, 0x0e, 0x8a, 0x17, 0x43, 0x34, + 0x3d, 0x6f, 0x5f, 0x7a, 0x30, 0x49, 0x95, 0x73, + 0x37, 0xc0, 0x6f, 0xa1, 0x57, 0x85, 0x56, 0x0f, + 0xf2, 0x65, 0x6e, 0x45, 0x42, 0xaf, 0x5b, 0x04, + 0x37, 0x36, 0x51, 0xe0, 0x4f, 0x70, 0x83, 0x95, + 0xd1, 0x69, 0xef, 0x40, 0x4a, 0x24, 0x81, 0x57, + 0x9a, 0x88, 0x8b, 0x1d, 0x6c, 0x1d, 0x29, 0xf9, + 0xce, 0xb5, 0x5e, 0x45, 0xde, 0x8d, 0x89, 0xba, + 0x56, 0xcc, 0x84, 0x2e, 0xc5, 0x44, 0x6b, 0xcd, + 0xc4, 0x7d, 0x1c, 0x42, 0x9e, 0x69, 0x9a, 0x30, + 0xef, 0xe3, 0xd1, 0x12, 0xde, 0x5c, 0x06, 0xe3, + 0xaf, 0x5f, 0xbf, 0x4e, 0xd5, 0x0f, 0x0f, 0xf3, + 0xda, 0x91, 0xe4, 0x16, 0x37, 0xb1, 0x8b, 0xe3, + 0x0c, 0xbb, 0x4e, 0x80, 0xae, 0x31, 0x87, 0x72, + 0x8c, 0x69, 0x0e, 0xed, 0x85, 0xa1, 0xb7, 0xe8, + 0xee, 0x9a, 0x55, 0x44, 0x0a, 0xb4, 0x32, 0xea, + 0x4d, 0x4a, 0x11, 0x55, 0x44, 0x8a, 0x81, 0x83, + 0xc8, 0x0d, 0xef, 0x28, 0x01, 0x11, 0x69, 0x27, + 0xd8, 0x84, 0x4d, 0x32, 0x45, 0xd5, 0x1a, 0x94, + 0x98, 0x83, 0x44, 0x6a, 0xcf, 0xe3, 0xa8, 0xa6, + 0x46, 0xa9, 0x01, 0xb4, 0x9d, 0x1a, 0x58, 0x7c, + 0x93, 0xa6, 0x16, 0xb9, 0x0e, 0x30, 0x09, 0xbe, + 0x7a, 0xb1, 0x75, 0x58, 0x2d, 0xa9, 0xc8, 0x4c, + 0xa5, 0xb5, 0x67, 0x18, 0xd1, 0x3d, 0x3e, 0xc9, + 0xda, 0x23, 0x4f, 0x6e, 0x49, 0x00, 0x9b, 0xfb, + 0xe1, 0x45, 0xef, 0xf2, 0x62, 0x02, 0x4b, 0xb9, + 0x04, 0x70, 0x83, 0xdc, 0x31, 0x67, 0x98, 0x8d, + 0x4c, 0x8b, 0x1b, 0xd8, 0x9f, 0x4b, 0xdb, 0xfc, + 0x31, 0xc4, 0xf3, 0x31, 0x46, 0x16, 0xa3, 0x4a, + 0x82, 0x36, 0xa8, 0x6f, 0x10, 0x19, 0xf8, 0x68, + 0xce, 0x08, 0x59, 0x2d, 0x29, 0x88, 0xc8, 0x72, + 0x1b, 0xaf, 0x82, 0x81, 0x08, 0x55, 0xb3, 0xc1, + 0x9e, 0xfb, 0x1b, 0xfb, 0x13, 0x1c, 0x04, 0xf6, + 0xe2, 0x9a, 0x64, 0x68, 0x11, 0xce, 0x4f, 0xea, + 0x5f, 0x7b, 0x36, 0xa1, 0x49, 0xf6, 0xcc, 0x9b, + 0x37, 0x20, 0x32, 0x8e, 0x34, 0x7a, 0x70, 0x92, + 0x85, 0xcc, 0x6e, 0x4f, 0xcf, 0x99, 0xa0, 0x99, + 0xae, 0x69, 0x3a, 0x64, 0x83, 0x04, 0x30, 0x6f, + 0x38, 0x8a, 0x13, 0xc7, 0xc9, 0x6f, 0xd1, 0x8b, + 0xa2, 0x2f, 0x1c, 0x23, 0xf4, 0x8c, 0x34, 0x3c, + 0xbb, 0x51, 0x7f, 0x91, 0x10, 0x89, 0x32, 0x26, + 0xc0, 0xf3, 0xd8, 0x5b, 0x0f, 0x17, 0xb7, 0xe1, + 0xb0, 0xbc, 0x26, 0xbc, 0x53, 0x51, 0xae, 0x6d, + 0x03, 0xc6, 0xfa, 0xe5, 0x9c, 0x8a, 0x88, 0xa4, + 0x9d, 0x05, 0x8b, 0xf2, 0x79, 0x73, 0x5d, 0x19, + 0xa2, 0x5b, 0xe5, 0x1a, 0x2f, 0x30, 0x4c, 0x7a, + 0x58, 0x31, 0xdd, 0x05, 0x5e, 0x04, 0x8a, 0x3b, + 0x53, 0x30, 0x32, 0x6f, 0x14, 0x88, 0x0b, 0xe5, + 0x0a, 0x11, 0x6c, 0x29, 0x70, 0x8c, 0xfa, 0x69, + 0xda, 0xf9, 0x00, 0xb3, 0xe0, 0xe1, 0xf7, 0x4e, + 0x77, 0xaa, 0x58, 0x28, 0x40, 0x71, 0x17, 0x6c, + 0xba, 0x9b, 0xc1, 0x9c, 0x09, 0x67, 0xa2, 0xab, + 0xd5, 0x4a, 0x3d, 0x82, 0x7f, 0x58, 0xc3, 0xe8, + 0xa0, 0x95, 0xec, 0xe4, 0x65, 0x3b, 0x7a, 0xc9, + 0x83, 0xda, 0x7c, 0x37, 0x13, 0xdc, 0xcf, 0x99, + 0x1f, 0xdc, 0xbf, 0xee, 0x12, 0xde, 0xb9, 0x5e, + 0x96, 0xe9, 0x1e, 0x8d, 0xe3, 0x27, 0xe6, 0x19, + 0x9a, 0x76, 0x77, 0xe7, 0xa0, 0x63, 0xde, 0xc1, + 0x3f, 0x4c, 0x0d, 0x3d, 0x94, 0x7f, 0x98, 0xf7, + 0xf5, 0x0f, 0x74, 0x77, 0xff, 0x48, 0x9d, 0x49, + 0xcf, 0xf1, 0xdc, 0xf5, 0x6f, 0xcf, 0xd0, 0xad, + 0xbb, 0x64, 0x9c, 0x6f, 0xa0, 0xc2, 0xc5, 0xf7, + 0xbb, 0xe7, 0x27, 0xae, 0x1b, 0xd0, 0xa3, 0xfd, + 0xac, 0xa5, 0x5d, 0x70, 0xeb, 0xc1, 0xd9, 0x8a, + 0x3b, 0x6f, 0xab, 0xb4, 0xc4, 0x09, 0xd2, 0x27, + 0xfd, 0x7a, 0x73, 0xf3, 0xa4, 0x9f, 0xdf, 0x55, + 0x04, 0xc8, 0x0f, 0x9d, 0xa5, 0x43, 0xed, 0x16, + 0xd6, 0xb2, 0xa8, 0xec, 0x3f, 0xe1, 0xce, 0x93, + 0xd2, 0xd0, 0x72, 0x16, 0x09, 0xbe, 0x9e, 0x43, + 0x1e, 0x9d, 0x44, 0x94, 0x70, 0xa6, 0xc4, 0x01, + 0x99, 0x7c, 0xa1, 0xc5, 0x0f, 0x62, 0x00, 0x59, + 0x54, 0x10, 0x09, 0xe6, 0xc8, 0xf3, 0x70, 0xbc, + 0x44, 0x60, 0x15, 0x91, 0xca, 0xf3, 0x5d, 0x7a, + 0x33, 0x41, 0x4d, 0xc0, 0x48, 0x39, 0x24, 0x1e, + 0x56, 0x54, 0x6c, 0xc7, 0x84, 0x20, 0x64, 0x83, + 0x66, 0xab, 0x94, 0xea, 0xdc, 0x04, 0x9d, 0x83, + 0x6a, 0x23, 0xe2, 0x5c, 0x05, 0xab, 0x9b, 0x5d, + 0x8a, 0x38, 0xe3, 0x40, 0xd8, 0xc2, 0x3d, 0xba, + 0xb9, 0x11, 0x37, 0x37, 0x4b, 0x56, 0x96, 0x3d, + 0x9b, 0x61, 0x9f, 0x4e, 0x85, 0x21, 0x58, 0x41, + 0x96, 0xe5, 0x83, 0x48, 0x8a, 0xe7, 0x12, 0x62, + 0x83, 0x36, 0x73, 0xbd, 0xa2, 0xc5, 0x9c, 0x42, + 0xec, 0x88, 0x42, 0x65, 0xfa, 0xf9, 0xef, 0x3a, + 0xb9, 0xae, 0xb3, 0xb9, 0x4d, 0x2a, 0x72, 0x1c, + 0xe2, 0x54, 0xeb, 0x33, 0x9a, 0x44, 0x8a, 0x68, + 0xfd, 0x3b, 0x29, 0x82, 0x38, 0x6b, 0x13, 0x7f, + 0x18, 0xdf, 0xcf, 0xc8, 0xc5, 0x56, 0xad, 0x55, + 0x6a, 0xd6, 0xc1, 0xa0, 0x2b, 0x61, 0xd7, 0xa3, + 0xff, 0x76, 0xbd, 0xb7, 0x5d, 0x8b, 0xf3, 0x3e, + 0x8c, 0xab, 0x56, 0x6e, 0xec, 0xff, 0x31, 0x5c, + 0x99, 0xad, 0xe5, 0x13, 0x35, 0x7c, 0x58, 0x91, + 0x6f, 0x64, 0x7c, 0x6d, 0xc3, 0xa1, 0x8a, 0x1f, + 0xf1, 0x92, 0x6b, 0xc9, 0xed, 0x46, 0xd4, 0x1f, + 0xdc, 0x86, 0x33, 0xe4, 0x90, 0xb5, 0x11, 0x65, + 0xb4, 0x94, 0xd6, 0x4a, 0x1f, 0xcf, 0xab, 0xd7, + 0x4a, 0xeb, 0xa9, 0x69, 0x65, 0x88, 0xec, 0x45, + 0xbe, 0x5a, 0xd0, 0xfd, 0x33, 0x42, 0x4b, 0x32, + 0x23, 0x3c, 0xb8, 0xe2, 0x76, 0x48, 0x09, 0x54, + 0xc7, 0xa5, 0xe5, 0x04, 0x7a, 0xc4, 0x38, 0x4c, + 0xd0, 0x9e, 0x20, 0xda, 0x37, 0x45, 0xe5, 0xb4, + 0xfa, 0xed, 0xc3, 0xd7, 0x51, 0xa3, 0x68, 0xec, + 0xf5, 0x37, 0x59, 0x99, 0x94, 0x6c, 0x29, 0x4c, + 0xb5, 0xd4, 0x04, 0x7d, 0xb2, 0x2a, 0x6f, 0x90, + 0x65, 0xc4, 0x90, 0x5a, 0xb0, 0xa2, 0xa8, 0x33, + 0xf2, 0x83, 0x7d, 0x1e, 0x46, 0x8b, 0x05, 0x94, + 0xde, 0x6f, 0x8b, 0x1e, 0xef, 0x87, 0xc7, 0xd3, + 0x50, 0xce, 0x91, 0x49, 0xdd, 0x2a, 0x94, 0x5c, + 0x52, 0xdc, 0x65, 0x02, 0xac, 0xdc, 0xd5, 0x67, + 0xba, 0x84, 0xab, 0xcf, 0xf6, 0xce, 0xd3, 0x4b, + 0x70, 0x5c, 0xb6, 0x33, 0x5b, 0x12, 0x1c, 0xdd, + 0xd0, 0x51, 0x20, 0xdc, 0x19, 0x29, 0x26, 0x90, + 0xd0, 0x93, 0xcf, 0xf3, 0x0b, 0x65, 0x38, 0xfa, + 0xb2, 0x43, 0xdf, 0x83, 0xf1, 0xea, 0x58, 0xb2, + 0xef, 0xdc, 0x8e, 0xe7, 0xde, 0x92, 0x89, 0x0e, + 0xa5, 0xb8, 0x1b, 0x88, 0x09, 0xd6, 0x0d, 0xba, + 0x86, 0x13, 0x58, 0xe7, 0x56, 0xb1, 0xc3, 0x2e, + 0xe8, 0xa5, 0x22, 0xfa, 0x85, 0x6c, 0x87, 0x46, + 0xf7, 0x6b, 0xe5, 0x02, 0x2e, 0x18, 0xfd, 0xdf, + 0x36, 0x8c, 0x60, 0xb9, 0xca, 0xc2, 0x0d, 0x94, + 0xd0, 0x5f, 0xd7, 0x2d, 0xe5, 0x02, 0x95, 0x0d, + 0xd9, 0x89, 0x87, 0xbc, 0xa2, 0x77, 0x1a, 0x30, + 0x1e, 0x3b, 0xa6, 0x53, 0xc8, 0xd2, 0xf3, 0x5c, + 0x3f, 0xee, 0xdb, 0x5b, 0x37, 0xac, 0x2e, 0xc0, + 0x19, 0x47, 0x38, 0x3c, 0x93, 0x52, 0xad, 0xe8, + 0x6c, 0x49, 0x01, 0xd4, 0xd3, 0x8b, 0x7c, 0xf9, + 0xe5, 0x10, 0xbd, 0x85, 0xaa, 0x34, 0xee, 0xf5, + 0x96, 0x44, 0xdc, 0xd7, 0xf6, 0x2e, 0xee, 0xff, + 0xa5, 0x19, 0xae, 0xf6, 0x4f, 0xcc, 0x70, 0xff, + 0x3d, 0xbd, 0xdc, 0x19, 0xae, 0x8c, 0x59, 0x28, + 0xa8, 0x70, 0xea, 0xdc, 0x97, 0x19, 0x0e, 0xa5, + 0x66, 0xb8, 0x70, 0xd0, 0xb5, 0x08, 0xf4, 0xd5, + 0x88, 0xf2, 0x82, 0xde, 0x6d, 0xbe, 0x14, 0x26, + 0xba, 0x14, 0x4b, 0xd0, 0x8c, 0x7e, 0xd6, 0xc3, + 0x26, 0xc7, 0xea, 0x52, 0x80, 0x30, 0x07, 0x5e, + 0xa1, 0x70, 0x0e, 0x0c, 0x6f, 0xd3, 0x4e, 0xcf, + 0x07, 0x17, 0x4a, 0xe4, 0x2e, 0x4f, 0x2f, 0x55, + 0xc8, 0x4f, 0x89, 0x23, 0x0c, 0xaf, 0x6f, 0xc0, + 0xfe, 0xc8, 0xd1, 0x9b, 0xa0, 0x94, 0xbb, 0xef, + 0x8b, 0x65, 0x13, 0xc7, 0xf6, 0xac, 0xd1, 0x7c, + 0xa2, 0x39, 0x23, 0x56, 0x51, 0x44, 0xd9, 0x58, + 0xad, 0xca, 0x3b, 0xe5, 0x29, 0xb4, 0x59, 0xad, + 0x7a, 0xa3, 0xd5, 0xb6, 0x5b, 0x6d, 0xd0, 0x7f, + 0xaa, 0xb9, 0xbe, 0x4a, 0xbb, 0xc1, 0x2c, 0x2d, + 0x6f, 0xc8, 0xca, 0xed, 0xb8, 0xd5, 0x88, 0xfa, + 0xfe, 0x9d, 0xbe, 0xec, 0x81, 0x15, 0x8b, 0x33, + 0xe8, 0xd4, 0x5e, 0xdc, 0xc2, 0x8a, 0xaa, 0xd2, + 0xd5, 0x56, 0x73, 0xbb, 0xe5, 0x3a, 0x7b, 0x66, + 0xb7, 0xca, 0xf6, 0x14, 0x91, 0xbe, 0x17, 0x96, + 0xcb, 0xd6, 0x51, 0x65, 0x5c, 0x7d, 0xee, 0x12, + 0xb4, 0x7b, 0x62, 0x6f, 0xb4, 0x67, 0xf6, 0x7e, + 0x4c, 0xf3, 0xc9, 0x07, 0x6b, 0xd5, 0x86, 0xab, + 0xc9, 0x9c, 0x71, 0xeb, 0xfb, 0x7d, 0xed, 0x25, + 0x46, 0x6b, 0x19, 0x61, 0xb3, 0x17, 0x9a, 0xdf, + 0xab, 0xbb, 0xe5, 0xbb, 0xf8, 0xef, 0x99, 0x7d, + 0x55, 0xe9, 0xad, 0x6d, 0x57, 0x93, 0x54, 0xe3, + 0x1e, 0xe9, 0x71, 0x67, 0x07, 0xde, 0x29, 0x5f, + 0x95, 0xfc, 0x91, 0xcd, 0x2e, 0x21, 0x53, 0xb5, + 0xb1, 0x8f, 0x64, 0x6c, 0x5d, 0xdf, 0x3f, 0x5b, + 0x3f, 0x92, 0xe9, 0xd2, 0x51, 0xba, 0xd3, 0x42, + 0xff, 0x0b, 0xb9, 0xaa, 0x3a, 0xff, 0xe9, 0xa6, + 0x84, 0x31, 0xf7, 0x6f, 0xe2, 0x91, 0xb5, 0x65, + 0xa8, 0xc1, 0xc7, 0x36, 0xe3, 0x19, 0x46, 0x7c, + 0xcb, 0x56, 0xf9, 0x6e, 0x0d, 0xde, 0xbc, 0xc9, + 0x58, 0xf4, 0x89, 0x1a, 0xf4, 0x21, 0xf7, 0x6b, + 0x5b, 0xad, 0x5a, 0x75, 0x70, 0xd6, 0x64, 0x82, + 0x73, 0xbf, 0x36, 0xdf, 0xa5, 0xa8, 0xf6, 0x0b, + 0x21, 0x0f, 0x19, 0x30, 0x58, 0x4e, 0xcb, 0xfb, + 0xa3, 0xe4, 0xa7, 0x1a, 0x31, 0xa6, 0x55, 0x69, + 0xb8, 0x1c, 0x4b, 0x98, 0xb1, 0xb1, 0x3f, 0x56, + 0xdc, 0xae, 0xd3, 0x88, 0x42, 0x7c, 0x82, 0xd1, + 0x9e, 0x2d, 0x17, 0xe1, 0x41, 0xff, 0x10, 0x6d, + 0xbe, 0x67, 0x3d, 0x71, 0xdc, 0xdf, 0x03, 0xb8, + 0x0b, 0x32, 0xe2, 0xc2, 0xc0, 0xa7, 0x9a, 0x8d, + 0x6b, 0xdb, 0xec, 0xf5, 0x0d, 0xd9, 0x01, 0x3c, + 0xde, 0xee, 0xc3, 0xa3, 0xc9, 0x91, 0xeb, 0x38, + 0x9f, 0x26, 0x01, 0xbc, 0x40, 0x03, 0x0f, 0x6a, + 0xab, 0x1c, 0xc3, 0x2e, 0x40, 0xc2, 0x5b, 0x1a, + 0xe1, 0x05, 0x51, 0xfc, 0x22, 0x8d, 0x14, 0x3b, + 0xca, 0xe4, 0x76, 0x61, 0x7e, 0x82, 0x5b, 0xa2, + 0xcb, 0x0e, 0x21, 0xd8, 0x0f, 0x46, 0xae, 0x7f, + 0x39, 0x41, 0xbf, 0x30, 0xfd, 0x6d, 0x46, 0xf0, + 0x0e, 0xd2, 0x28, 0x46, 0x87, 0xbf, 0xf4, 0xa9, + 0x98, 0x24, 0x6f, 0x38, 0x40, 0x5b, 0x36, 0xd5, + 0x1c, 0x72, 0x52, 0xe4, 0x85, 0x04, 0x7c, 0x48, + 0x91, 0xa8, 0x60, 0xd0, 0x31, 0x26, 0xf0, 0x64, + 0x3d, 0x46, 0x5e, 0x8e, 0xb1, 0x83, 0x41, 0x43, + 0xb4, 0x03, 0x23, 0x1f, 0x15, 0x0e, 0x94, 0x8f, + 0x16, 0x86, 0x40, 0x16, 0x9c, 0x87, 0x9c, 0xdc, + 0x06, 0xf0, 0x68, 0x94, 0x55, 0xbe, 0xb9, 0xbe, + 0x45, 0x58, 0x37, 0x1c, 0x2b, 0x34, 0xe4, 0xb4, + 0x62, 0xc3, 0x04, 0x20, 0xa7, 0xe1, 0x67, 0xfa, + 0x24, 0xd6, 0x48, 0x56, 0xe2, 0x86, 0x1c, 0xbb, + 0xe1, 0x59, 0xf4, 0x8a, 0x6a, 0xcd, 0x4d, 0x5c, + 0xe3, 0x63, 0xa6, 0xf0, 0x42, 0x5b, 0x4e, 0x9d, + 0xdb, 0x36, 0x87, 0x61, 0x70, 0xd8, 0x1e, 0xdc, + 0x1d, 0xf6, 0x57, 0xe6, 0x0d, 0x5a, 0x5c, 0x63, + 0x63, 0xa3, 0x1e, 0xb6, 0xdf, 0x80, 0x6d, 0x3a, + 0x0f, 0x3c, 0x91, 0x72, 0xf0, 0x24, 0xc0, 0x9e, + 0xc1, 0x8b, 0x61, 0x3b, 0x5e, 0xcd, 0xd0, 0x52, + 0xc7, 0x71, 0xe0, 0x3b, 0x5a, 0x88, 0x1d, 0x62, + 0xa4, 0xab, 0x61, 0xd3, 0x14, 0x28, 0x53, 0xde, + 0x04, 0x76, 0xa3, 0xce, 0x65, 0xce, 0xed, 0x61, + 0x04, 0xbf, 0x4d, 0x0d, 0xfe, 0x86, 0x94, 0xf0, + 0xff, 0xa6, 0x4e, 0x56, 0xf0, 0x2e, 0x3b, 0xc0, + 0x03, 0xc8, 0x22, 0x0e, 0x0e, 0x8c, 0x74, 0x35, + 0x6c, 0xb3, 0x41, 0x91, 0x99, 0x24, 0x26, 0xe0, + 0xa3, 0x08, 0xb4, 0x95, 0xae, 0xc2, 0x2f, 0x59, + 0x4b, 0x03, 0x0a, 0x6e, 0x37, 0x53, 0x29, 0x26, + 0x9d, 0x70, 0x20, 0xa7, 0xbc, 0xa1, 0x53, 0x55, + 0x0a, 0x98, 0x91, 0xbd, 0xee, 0xd7, 0xdf, 0x46, + 0x26, 0xe3, 0x4f, 0x65, 0x77, 0x4b, 0x67, 0x82, + 0xf1, 0x68, 0xd6, 0x5d, 0x87, 0x45, 0x86, 0xc3, + 0x8a, 0x34, 0xa2, 0x64, 0x25, 0x74, 0xba, 0x5d, + 0x3c, 0xf6, 0xde, 0xb3, 0x60, 0x06, 0xca, 0x9c, + 0x6a, 0xda, 0xb3, 0xc8, 0x31, 0x00, 0x58, 0xa0, + 0x09, 0x58, 0xbd, 0x11, 0xee, 0x64, 0x61, 0x65, + 0x7c, 0xa4, 0x53, 0x2b, 0xa4, 0x30, 0xa2, 0xe8, + 0x77, 0xe9, 0x85, 0xc9, 0x3a, 0x90, 0x16, 0x33, + 0xa3, 0x63, 0xd0, 0xd9, 0x60, 0xdc, 0x19, 0x16, + 0xf5, 0xdc, 0x38, 0x96, 0xd6, 0x1d, 0xfd, 0x39, + 0x10, 0xbe, 0x7e, 0x88, 0xbb, 0x0d, 0x0d, 0xc8, + 0x47, 0x4c, 0xa2, 0xd2, 0xea, 0xe7, 0x8a, 0x8e, + 0x20, 0xf1, 0x6f, 0xc9, 0x84, 0x92, 0xf0, 0x6b, + 0x35, 0x8d, 0x83, 0xbf, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, 0x58, + 0x43, 0x50, 0x0f, 0xd5, 0x76, 0xe0, 0x96, 0x09, + 0x00, 0x00, 0x83, 0x53, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, 0x30, + 0x46, 0x52, 0x32, 0x36, 0x37, 0x36, 0x2e, 0x78, + 0x6d, 0x6c, 0xed, 0x1c, 0x6b, 0x57, 0xd3, 0x30, + 0xf4, 0x3b, 0xbf, 0xa2, 0xfa, 0x49, 0xcf, 0x11, + 0xd7, 0x6e, 0x30, 0x87, 0x67, 0xd6, 0x33, 0xf6, + 0x50, 0x3c, 0x0c, 0xe6, 0x36, 0x95, 0x6f, 0x9c, + 0xd0, 0x66, 0xd0, 0x63, 0xd7, 0xd6, 0xa6, 0xc3, + 0xe1, 0xaf, 0xf7, 0xa6, 0x4d, 0x9b, 0x76, 0x69, + 0xbb, 0x0c, 0x56, 0x18, 0x47, 0x39, 0x3e, 0x92, + 0x7b, 0x6f, 0x92, 0xfb, 0xce, 0xab, 0xa1, 0xfd, + 0x71, 0x39, 0xb7, 0x95, 0x5b, 0xec, 0x13, 0xcb, + 0x75, 0x3e, 0xbc, 0xd4, 0xde, 0xaa, 0x2f, 0x3f, + 0xea, 0x7b, 0x6d, 0x13, 0xdf, 0x5a, 0x06, 0xde, + 0xb7, 0x9c, 0x99, 0xeb, 0xcf, 0x51, 0x00, 0xb8, + 0x2c, 0x8d, 0xbe, 0xa7, 0xc0, 0x0f, 0x23, 0x8b, + 0x2a, 0x0c, 0x40, 0x0c, 0xdf, 0xf2, 0x68, 0x03, + 0x7d, 0x38, 0x19, 0x1d, 0x34, 0xd4, 0xc1, 0xb8, + 0xde, 0x7c, 0xd7, 0x6c, 0xd7, 0xd2, 0x18, 0xa5, + 0xfd, 0x62, 0x7f, 0x5f, 0x49, 0xf0, 0x0d, 0x4d, + 0x53, 0xf6, 0xf7, 0x53, 0xbd, 0x58, 0xe6, 0x10, + 0x91, 0x9f, 0x11, 0x20, 0x01, 0xb2, 0xf1, 0x75, + 0x75, 0x39, 0x83, 0x9f, 0x76, 0x8d, 0xd5, 0x57, + 0xa8, 0xc8, 0xe2, 0x6a, 0x95, 0x90, 0x81, 0x44, + 0x5a, 0x1f, 0xb8, 0x67, 0x94, 0x94, 0x2e, 0xac, + 0x8a, 0x54, 0x73, 0xb4, 0x1c, 0x67, 0x09, 0xd3, + 0x10, 0xce, 0x74, 0x2d, 0xe1, 0x9a, 0x8b, 0xd1, + 0x75, 0x4d, 0x5c, 0x28, 0x46, 0xab, 0x51, 0x6f, + 0x45, 0x62, 0x70, 0x9d, 0x00, 0xb4, 0x3e, 0x53, + 0x41, 0x1b, 0x25, 0x62, 0xc9, 0x49, 0xa4, 0xaa, + 0xdb, 0x90, 0x28, 0x2b, 0x40, 0xdb, 0x23, 0x48, + 0x1f, 0xe3, 0xeb, 0x85, 0x8d, 0xfc, 0x76, 0x8d, + 0x56, 0x38, 0xea, 0xca, 0x0a, 0x88, 0x5e, 0x87, + 0x41, 0xc3, 0x02, 0x87, 0x23, 0xdf, 0xb8, 0xb1, + 0x02, 0x6c, 0x04, 0x0b, 0x1f, 0xeb, 0x5d, 0x6f, + 0x71, 0x71, 0x5b, 0x6f, 0xd7, 0x32, 0x40, 0x4e, + 0x8b, 0xf1, 0x5c, 0xef, 0x0f, 0xfb, 0x17, 0x97, + 0x93, 0x61, 0xe7, 0xf4, 0xf4, 0xf2, 0xf0, 0xe2, + 0xa2, 0x5d, 0x03, 0x18, 0xd3, 0x4d, 0x88, 0x39, + 0x3b, 0x3f, 0xeb, 0xbf, 0x09, 0x4b, 0xa7, 0xe7, + 0x3f, 0xde, 0x44, 0xb0, 0x61, 0xbf, 0x77, 0xf2, + 0x6d, 0xc8, 0x2a, 0x9f, 0x4f, 0x3e, 0x7d, 0x66, + 0xc5, 0xfe, 0xc5, 0x74, 0xdc, 0xe1, 0x7d, 0x45, + 0x50, 0x5e, 0xcf, 0xb4, 0x4e, 0x01, 0x4e, 0x3b, + 0xe3, 0x4f, 0xfd, 0x54, 0xbd, 0x7b, 0x3e, 0x9e, + 0x52, 0xba, 0x83, 0xac, 0x93, 0x1a, 0xb6, 0x6b, + 0xfc, 0x3c, 0x81, 0x00, 0xe1, 0x30, 0x0e, 0xef, + 0xba, 0x4e, 0xe0, 0xbb, 0xb6, 0xfe, 0xa9, 0xdb, + 0xa5, 0x6c, 0xf4, 0xcf, 0x7a, 0xfd, 0x5e, 0xbb, + 0x96, 0x46, 0x31, 0xa1, 0x80, 0x20, 0x92, 0x29, + 0x2c, 0x4d, 0xa6, 0x9d, 0xb3, 0x5e, 0x67, 0xdc, + 0xa3, 0x35, 0xde, 0x30, 0x8b, 0xbb, 0x3c, 0x49, + 0xf8, 0x48, 0x2b, 0xae, 0x4b, 0xfb, 0x26, 0x4a, + 0x4d, 0xc4, 0x4c, 0xad, 0x39, 0x38, 0x4b, 0x02, + 0x17, 0x71, 0x8a, 0xe5, 0x98, 0x78, 0xf9, 0xe1, + 0x65, 0x1c, 0xd6, 0x02, 0xa1, 0x83, 0xe6, 0x58, + 0xef, 0xf4, 0xba, 0xed, 0x1a, 0x2d, 0x15, 0x10, + 0xdd, 0x22, 0x7b, 0x81, 0xc1, 0x9f, 0x4c, 0x08, + 0xf6, 0xa8, 0x2c, 0x8e, 0x58, 0x8b, 0x87, 0x94, + 0xe0, 0x46, 0x2b, 0xe5, 0xa6, 0xdb, 0x19, 0x4d, + 0x4f, 0xbe, 0x77, 0xa6, 0x7d, 0x29, 0x9e, 0x8e, + 0xdf, 0x6d, 0x87, 0xa7, 0x7a, 0x29, 0x4f, 0x23, + 0x70, 0x14, 0x29, 0x76, 0x0e, 0xd5, 0xed, 0xb0, + 0xd3, 0x28, 0x57, 0x91, 0x3b, 0xf7, 0x90, 0x8f, + 0x02, 0xd7, 0x57, 0xfa, 0xaa, 0x14, 0x5f, 0xe8, + 0x68, 0x3b, 0x7c, 0x1d, 0x94, 0xf2, 0x85, 0xbf, + 0x4d, 0xba, 0x27, 0x1d, 0x39, 0x8e, 0xea, 0xc6, + 0x76, 0x38, 0x3a, 0x94, 0xe0, 0x48, 0x93, 0xe3, + 0xc8, 0xdc, 0x0e, 0x47, 0xcd, 0xf5, 0x1c, 0x1d, + 0xcb, 0xe9, 0xa8, 0xb1, 0x25, 0x6f, 0x7a, 0x27, + 0xc1, 0x91, 0x9c, 0x8e, 0x1a, 0xda, 0x76, 0x38, + 0x6a, 0x95, 0x72, 0x34, 0x9e, 0xca, 0x25, 0xa4, + 0x16, 0xca, 0xe7, 0x86, 0xaf, 0x59, 0x66, 0x68, + 0x61, 0x07, 0x93, 0xc0, 0xf5, 0xf4, 0xc0, 0x5f, + 0xe0, 0x76, 0x2d, 0x05, 0x79, 0xa0, 0x04, 0x47, + 0xa5, 0x12, 0x84, 0xa4, 0xea, 0x65, 0xa7, 0x21, + 0x27, 0x47, 0xff, 0xe9, 0xe4, 0xd0, 0xd4, 0xf5, + 0x82, 0x68, 0xd2, 0x82, 0x0c, 0x9e, 0x50, 0x10, + 0x6d, 0xbd, 0x20, 0x75, 0x59, 0x41, 0x8e, 0xd4, + 0x27, 0x14, 0xa4, 0xbe, 0x5e, 0x90, 0x86, 0xac, + 0x20, 0xcd, 0xfa, 0x13, 0x0a, 0xd2, 0x58, 0x2f, + 0x88, 0x7a, 0x79, 0xfc, 0x4e, 0x4a, 0x90, 0xa3, + 0xde, 0x13, 0x0a, 0x52, 0x3e, 0xed, 0xfd, 0x40, + 0x81, 0x71, 0x63, 0xba, 0xd7, 0x4a, 0xd8, 0x48, + 0x4a, 0x9a, 0xc7, 0x49, 0x5c, 0xe1, 0x3a, 0x74, + 0x00, 0xab, 0x04, 0x64, 0xdb, 0x0a, 0x81, 0xa6, + 0x1e, 0xba, 0xb2, 0xb1, 0x72, 0x32, 0x22, 0x7b, + 0xe5, 0x8b, 0x21, 0x9a, 0x9e, 0xd7, 0x2f, 0x3d, + 0x98, 0xa4, 0xca, 0x99, 0x1b, 0xe0, 0xf7, 0xd0, + 0xab, 0x42, 0xab, 0x7b, 0xc5, 0x32, 0xb7, 0x22, + 0xa1, 0x93, 0x16, 0xc1, 0x8d, 0x45, 0x14, 0xf8, + 0x13, 0xdc, 0x60, 0x65, 0x74, 0xd2, 0xdb, 0x93, + 0x12, 0x49, 0xe0, 0x95, 0x26, 0xe2, 0x72, 0x07, + 0x4b, 0x22, 0xa5, 0xd8, 0xb9, 0x92, 0x55, 0xe4, + 0xfd, 0x98, 0x68, 0xa8, 0xe5, 0x4c, 0x68, 0x52, + 0x4c, 0xb4, 0x12, 0x26, 0x1e, 0xe2, 0x10, 0xf2, + 0x4c, 0xd3, 0x84, 0xf9, 0x10, 0x8f, 0x96, 0xf0, + 0xe6, 0x6d, 0x30, 0xfe, 0xf6, 0xed, 0xdb, 0x4c, + 0x7d, 0x7f, 0xbf, 0xa8, 0x1d, 0x49, 0x6f, 0x71, + 0x53, 0xbb, 0x38, 0xce, 0xb0, 0x6b, 0x07, 0xe8, + 0x1a, 0x73, 0x28, 0xc7, 0x18, 0xc6, 0xd0, 0x72, + 0x74, 0xad, 0x45, 0x77, 0xd7, 0xac, 0x22, 0x52, + 0xa0, 0xa5, 0xde, 0x68, 0x52, 0x8a, 0xa8, 0x22, + 0x52, 0x0c, 0x6c, 0x44, 0x6e, 0x78, 0x47, 0x29, + 0x88, 0x48, 0x3b, 0xc1, 0x06, 0x6c, 0x92, 0x29, + 0xaa, 0x7e, 0x48, 0x89, 0x39, 0x48, 0xa4, 0xf6, + 0x3c, 0x8e, 0x6a, 0xaa, 0x94, 0x1a, 0x40, 0xeb, + 0xa9, 0x81, 0xc5, 0x77, 0x59, 0x6a, 0x91, 0xeb, + 0x00, 0x93, 0xe0, 0xbb, 0x17, 0x5b, 0x87, 0xd5, + 0xd2, 0x8a, 0xcc, 0x55, 0x5a, 0x7b, 0x86, 0x11, + 0xdd, 0xe3, 0x93, 0xbc, 0x3d, 0xf2, 0xe4, 0x8e, + 0x04, 0xb0, 0xb9, 0x1f, 0x9e, 0xf7, 0x2e, 0xcf, + 0x27, 0xb0, 0x94, 0x4b, 0x01, 0x57, 0xc8, 0x6d, + 0x63, 0x86, 0xd9, 0xc8, 0xb4, 0xb8, 0x82, 0xfd, + 0xb5, 0xb0, 0x8c, 0x9f, 0x43, 0x3c, 0x1f, 0x63, + 0x64, 0x32, 0xaa, 0x34, 0x68, 0x85, 0xfa, 0x06, + 0x91, 0x81, 0x8f, 0xe6, 0x8c, 0x90, 0xd5, 0xd2, + 0x82, 0x88, 0x2c, 0xb7, 0xf1, 0x32, 0x18, 0x88, + 0xd0, 0x5a, 0x3e, 0xd8, 0x73, 0x7f, 0x63, 0x7f, + 0x82, 0x83, 0xc0, 0x72, 0xae, 0x49, 0x8e, 0x16, + 0xe1, 0xfc, 0xa4, 0xf1, 0xbd, 0x67, 0x11, 0x9a, + 0x64, 0x4f, 0xbd, 0xf9, 0x21, 0x44, 0xc6, 0x81, + 0x4a, 0x0f, 0x4e, 0xf2, 0x90, 0xf9, 0xed, 0xe9, + 0x39, 0x13, 0x34, 0xd3, 0x54, 0x55, 0x83, 0x6c, + 0x90, 0x02, 0x16, 0x0d, 0x47, 0x71, 0xe2, 0x38, + 0xc5, 0x2d, 0x7a, 0x51, 0xf4, 0x85, 0x63, 0x84, + 0x9e, 0x91, 0x85, 0xe7, 0x37, 0xea, 0x3b, 0x29, + 0x91, 0x28, 0x63, 0x02, 0xbc, 0x88, 0xbd, 0x64, + 0xb8, 0xb8, 0x0d, 0x87, 0x15, 0x35, 0xe1, 0x9d, + 0x8a, 0x72, 0xad, 0x1b, 0x30, 0xd6, 0x2f, 0xe7, + 0x54, 0x44, 0xa4, 0xed, 0x2c, 0x58, 0x94, 0xcf, + 0x9b, 0x49, 0x65, 0x88, 0xee, 0x94, 0x6b, 0xec, + 0x60, 0x98, 0xf4, 0xb0, 0x62, 0xb8, 0x0e, 0x76, + 0x02, 0xc5, 0x9d, 0x29, 0x18, 0x19, 0x37, 0x0a, + 0xc4, 0x85, 0x72, 0x85, 0x08, 0x36, 0x15, 0x38, + 0x46, 0xfd, 0x32, 0xed, 0x7c, 0x82, 0x59, 0x70, + 0xff, 0xa2, 0xd3, 0x9d, 0x2a, 0x26, 0x0a, 0x50, + 0xdc, 0x05, 0x9b, 0xee, 0x66, 0x30, 0x67, 0xc2, + 0x99, 0xe8, 0x72, 0xb9, 0xac, 0x1d, 0xc0, 0x3f, + 0xac, 0x61, 0x74, 0xd0, 0x4a, 0x36, 0xf2, 0xb2, + 0x0d, 0xbd, 0xe4, 0x51, 0x6d, 0xbe, 0x99, 0x09, + 0x1e, 0xe6, 0xcc, 0x8f, 0xee, 0x5f, 0xf7, 0x09, + 0xef, 0x42, 0x2f, 0xcb, 0x75, 0x8f, 0xc3, 0xa3, + 0x67, 0xe6, 0x19, 0xaa, 0x7a, 0x7f, 0xe7, 0xa0, + 0x63, 0xde, 0xc3, 0x3f, 0x0c, 0x15, 0x3d, 0x96, + 0x7f, 0x18, 0x0f, 0xf5, 0x0f, 0x74, 0x7f, 0xff, + 0xc8, 0x9c, 0x49, 0xcf, 0xf1, 0xdc, 0xf5, 0xef, + 0x4e, 0xd1, 0x9d, 0xbb, 0x60, 0x9c, 0xaf, 0xa0, + 0xc2, 0xc5, 0xf7, 0x87, 0x97, 0xc7, 0xae, 0x1b, + 0xd0, 0xa3, 0xfd, 0xbc, 0xa5, 0x5d, 0x70, 0xe7, + 0xc1, 0xd9, 0x8a, 0x3b, 0x6f, 0xd7, 0x68, 0x89, + 0x13, 0x64, 0x4f, 0xfa, 0xb5, 0xe6, 0xea, 0x49, + 0x3f, 0xbf, 0xab, 0x08, 0x90, 0x1f, 0x3a, 0x4b, + 0x87, 0xda, 0x2d, 0xac, 0xe5, 0x51, 0x59, 0x7f, + 0xc2, 0x9d, 0x27, 0xa5, 0xa1, 0xe5, 0x3c, 0x12, + 0x7c, 0x3d, 0x87, 0x3c, 0x3a, 0x89, 0x28, 0xe1, + 0x4c, 0x89, 0x03, 0x72, 0xf9, 0x42, 0xce, 0x4f, + 0xa2, 0x03, 0x59, 0x54, 0x10, 0x09, 0xe6, 0xc8, + 0xf3, 0x70, 0xbc, 0x44, 0x60, 0x15, 0x91, 0xca, + 0xf3, 0x5d, 0x7a, 0x33, 0x41, 0x4d, 0xc0, 0x48, + 0x39, 0x24, 0x1e, 0x56, 0x54, 0x6c, 0xc7, 0x80, + 0x20, 0x64, 0x83, 0xe6, 0xab, 0x94, 0xea, 0xdc, + 0x00, 0x9d, 0x83, 0x6a, 0x23, 0xe2, 0x42, 0x05, + 0xd7, 0x56, 0xbb, 0x14, 0x71, 0xfa, 0x9e, 0xb0, + 0x85, 0x7b, 0x72, 0x73, 0x23, 0x6e, 0x6e, 0x96, + 0xac, 0x4c, 0x6b, 0x36, 0xc3, 0x3e, 0x9d, 0x0a, + 0x43, 0xb0, 0x82, 0x4c, 0xd3, 0x07, 0x91, 0x14, + 0xcf, 0x25, 0xc4, 0x02, 0x6d, 0x16, 0x7a, 0x45, + 0x8b, 0x39, 0x85, 0xd8, 0x11, 0x85, 0xca, 0xf4, + 0xf3, 0xdf, 0x75, 0x0a, 0x5d, 0x67, 0x75, 0x9b, + 0x54, 0xe6, 0x38, 0xc4, 0xae, 0xd6, 0x67, 0x54, + 0x89, 0x14, 0xd1, 0xfa, 0x77, 0x52, 0x04, 0xb1, + 0x13, 0x13, 0x7f, 0x1a, 0x3f, 0xcc, 0xc8, 0xe5, + 0x56, 0xad, 0x57, 0x6a, 0xd6, 0xc1, 0xa0, 0x2b, + 0x61, 0xd7, 0x83, 0xff, 0x76, 0x7d, 0xb0, 0x5d, + 0xcb, 0xf3, 0x3e, 0x8c, 0x5b, 0xab, 0xdc, 0xd8, + 0xff, 0x63, 0xb8, 0x32, 0x5b, 0xcb, 0x27, 0x6a, + 0xf8, 0xb0, 0xa2, 0xd8, 0xc8, 0xf8, 0xda, 0x82, + 0x43, 0x15, 0x3f, 0xe2, 0xa5, 0xd0, 0x92, 0xeb, + 0x8d, 0xa8, 0x3d, 0xba, 0x0d, 0x67, 0xc8, 0x26, + 0x89, 0x11, 0x65, 0xb4, 0x94, 0xd5, 0x4a, 0x1f, + 0xcf, 0xab, 0xd7, 0x4a, 0xeb, 0xb9, 0x69, 0x65, + 0x88, 0x2c, 0xa7, 0x58, 0x2d, 0xe8, 0xe1, 0x19, + 0xa1, 0x25, 0x93, 0x11, 0x20, 0x6d, 0xec, 0x74, + 0x4e, 0xa0, 0x4a, 0xde, 0x5a, 0x52, 0xa0, 0x67, + 0x8c, 0xc3, 0x14, 0xed, 0x31, 0xa2, 0x7d, 0x53, + 0x54, 0x41, 0xab, 0xdf, 0x3e, 0x7c, 0x1e, 0x35, + 0x8a, 0xc6, 0x4e, 0x3e, 0xca, 0xca, 0xa5, 0x64, + 0x6b, 0x61, 0xaa, 0xa5, 0x26, 0xe8, 0x93, 0x55, + 0x79, 0x83, 0x3c, 0x2b, 0x86, 0xd4, 0x82, 0x19, + 0x45, 0x9d, 0x91, 0x9f, 0xec, 0xfb, 0x30, 0x5a, + 0x2c, 0xa1, 0xf4, 0x7e, 0x9b, 0xf4, 0x7c, 0x3f, + 0x3c, 0x9f, 0x86, 0x72, 0x81, 0x4c, 0xb5, 0xb5, + 0x42, 0xc9, 0x65, 0xc5, 0x4d, 0x66, 0xc0, 0xca, + 0x7d, 0x7d, 0xa6, 0x49, 0xf8, 0xfa, 0x6c, 0xe7, + 0x3c, 0x7d, 0x0b, 0x8e, 0xcb, 0xb6, 0x66, 0x0b, + 0x82, 0xa3, 0x2b, 0x3a, 0x0a, 0x84, 0x4b, 0x23, + 0xc5, 0x00, 0x12, 0x7a, 0xf4, 0x79, 0x76, 0xae, + 0x0c, 0x47, 0xdf, 0x36, 0xe8, 0x7b, 0x30, 0x5e, + 0x1e, 0x49, 0xf6, 0x5d, 0xd8, 0xf1, 0xdc, 0x5b, + 0x30, 0xd1, 0xa1, 0x14, 0x77, 0x03, 0x31, 0xc1, + 0xba, 0x41, 0xd7, 0x70, 0x04, 0x6b, 0xdf, 0x29, + 0x56, 0xd8, 0x05, 0xbd, 0x55, 0x44, 0xb7, 0xc8, + 0xb2, 0x69, 0x74, 0xbf, 0x55, 0xce, 0xe1, 0x86, + 0xd1, 0xff, 0x6d, 0xc1, 0x08, 0xa6, 0xab, 0x38, + 0x6e, 0xa0, 0x84, 0xfe, 0x9a, 0xb4, 0x94, 0x0b, + 0x54, 0x36, 0x64, 0x27, 0x1e, 0xf2, 0x8a, 0x5e, + 0x6a, 0xc0, 0x78, 0xec, 0x9c, 0x4e, 0x21, 0x0b, + 0xcf, 0x73, 0xfd, 0xb8, 0x6f, 0x2f, 0x69, 0x58, + 0x5d, 0x80, 0x33, 0x8e, 0x70, 0x78, 0x28, 0x55, + 0x33, 0xa3, 0xc3, 0x25, 0x05, 0x50, 0xcf, 0x2f, + 0xf2, 0xe5, 0xd7, 0x43, 0xf4, 0x1a, 0xaa, 0xd2, + 0xb8, 0xd7, 0x5a, 0x12, 0x71, 0x5f, 0xdf, 0xb9, + 0xb8, 0xff, 0x97, 0x66, 0xb8, 0xfa, 0x3f, 0x31, + 0xc3, 0xfd, 0xf7, 0xf4, 0xed, 0xce, 0x70, 0xdb, + 0x98, 0x85, 0x82, 0x0a, 0xa7, 0xce, 0x5d, 0x99, + 0xe1, 0x50, 0x66, 0x86, 0x0b, 0x07, 0x4d, 0x44, + 0xa0, 0xcf, 0x46, 0x94, 0x57, 0xf4, 0x72, 0xf3, + 0xb5, 0x30, 0xd1, 0x65, 0x58, 0x82, 0x66, 0xf4, + 0xbb, 0x1e, 0x36, 0x39, 0x56, 0x97, 0x02, 0x84, + 0x39, 0xf0, 0x0a, 0x85, 0x73, 0x60, 0x78, 0x9d, + 0x76, 0x72, 0x36, 0x38, 0x57, 0x22, 0x77, 0x79, + 0x7e, 0xa9, 0x42, 0x7e, 0x4a, 0x1c, 0x61, 0x78, + 0x7e, 0x03, 0xf6, 0x47, 0xb6, 0xd6, 0x04, 0xa5, + 0xdc, 0x7f, 0x63, 0x2c, 0x9b, 0x38, 0xd6, 0x67, + 0x8d, 0xe6, 0x33, 0xcd, 0x19, 0xb1, 0x8a, 0x22, + 0xca, 0xc3, 0xe5, 0x72, 0x7b, 0xc7, 0x3c, 0xa5, + 0x36, 0xab, 0x57, 0x6f, 0xb4, 0xfa, 0x7a, 0xab, + 0x0d, 0xfa, 0xcf, 0x35, 0xd7, 0x57, 0x69, 0x37, + 0x98, 0xa5, 0xe5, 0x0d, 0x59, 0xb9, 0x1d, 0xd7, + 0x1a, 0x51, 0xdb, 0xbd, 0xd3, 0x97, 0x1d, 0xb0, + 0x62, 0x79, 0x06, 0x9d, 0x5a, 0xce, 0x1d, 0xac, + 0xa8, 0x2a, 0x5d, 0x6d, 0x35, 0xd7, 0x5b, 0xae, + 0xb3, 0x63, 0x76, 0xab, 0x6c, 0x4f, 0x11, 0xe9, + 0xdb, 0x31, 0x5d, 0xb6, 0x8e, 0xda, 0xc6, 0xdd, + 0xe7, 0x26, 0x41, 0xbb, 0x23, 0xf6, 0x46, 0x3b, + 0x66, 0xef, 0xa7, 0x34, 0x9f, 0x7c, 0xb0, 0x56, + 0x6d, 0xb8, 0xba, 0xcc, 0x21, 0x77, 0x7d, 0xf7, + 0xb2, 0xec, 0x26, 0xd1, 0x7a, 0xbf, 0xb0, 0xd9, + 0x09, 0xcd, 0xef, 0xd4, 0xe5, 0xf2, 0x7d, 0xfc, + 0xf7, 0xd4, 0xba, 0xaa, 0xf4, 0xda, 0xb6, 0xab, + 0x4a, 0xaa, 0x71, 0x87, 0xf4, 0xb8, 0xb1, 0x03, + 0x6f, 0x94, 0xaf, 0xb6, 0xfc, 0x95, 0xcd, 0x26, + 0x21, 0x53, 0xb5, 0xb1, 0x0f, 0x64, 0x6c, 0xdd, + 0xd8, 0x3d, 0x5b, 0x3f, 0x91, 0xe9, 0xb2, 0x51, + 0xba, 0xd1, 0x42, 0xff, 0x1b, 0xb9, 0xaa, 0x3a, + 0xff, 0x69, 0x86, 0x84, 0x31, 0x77, 0xef, 0x83, + 0x0b, 0x59, 0x5b, 0x86, 0x1a, 0x7c, 0x6a, 0x33, + 0x9e, 0x62, 0xc4, 0xb7, 0x6c, 0x95, 0xef, 0xd6, + 0xe0, 0xd1, 0x9b, 0x8c, 0x45, 0x9f, 0xa9, 0x41, + 0x1f, 0x73, 0xbf, 0xb6, 0xd6, 0xaa, 0x55, 0x07, + 0x67, 0x5d, 0x26, 0x38, 0x77, 0x6b, 0xf3, 0xbd, + 0x15, 0xd5, 0x7e, 0x23, 0xe4, 0x31, 0x03, 0x06, + 0xcb, 0x69, 0x79, 0x77, 0x94, 0xfc, 0x5c, 0x23, + 0xc6, 0x30, 0x2b, 0x0d, 0x97, 0x23, 0x09, 0x33, + 0x1e, 0xee, 0x8e, 0x15, 0xd7, 0xeb, 0x34, 0xa2, + 0x10, 0xdf, 0x60, 0xb4, 0x67, 0x0b, 0x27, 0x3c, + 0xe8, 0x1f, 0xa2, 0xd5, 0x07, 0xad, 0xc7, 0xb6, + 0xfb, 0x7b, 0x00, 0x77, 0x41, 0x7a, 0x5c, 0x18, + 0xf8, 0x54, 0xb3, 0x71, 0x6d, 0x9d, 0xbd, 0x7e, + 0x20, 0x2b, 0x80, 0xd7, 0xdb, 0x7d, 0x78, 0x35, + 0x39, 0x72, 0x6d, 0xfb, 0xcb, 0x24, 0x80, 0x27, + 0x68, 0xe0, 0x41, 0xed, 0x1a, 0xc7, 0xb0, 0x0b, + 0x90, 0xf0, 0x96, 0x46, 0x78, 0x42, 0x14, 0x3f, + 0x49, 0x23, 0xe5, 0x8e, 0x32, 0xb9, 0x73, 0x8c, + 0x2f, 0x70, 0x4b, 0x74, 0xd9, 0x21, 0x04, 0xfb, + 0xc1, 0xc8, 0xf5, 0x2f, 0x27, 0xe8, 0x16, 0xd3, + 0x5f, 0x67, 0x04, 0x0f, 0x21, 0xf5, 0x72, 0x74, + 0xf8, 0x5b, 0x9f, 0xca, 0x49, 0x8a, 0x86, 0x03, + 0xb4, 0x69, 0x51, 0xcd, 0x21, 0x3b, 0x43, 0x5e, + 0x4a, 0xc0, 0x87, 0x14, 0x89, 0x4a, 0x06, 0x1d, + 0x63, 0x02, 0x6f, 0xd6, 0x63, 0xe4, 0xe5, 0x18, + 0xdb, 0x18, 0x34, 0x44, 0x3b, 0xd0, 0x8b, 0x51, + 0xe1, 0x40, 0xc5, 0x68, 0x61, 0x08, 0x64, 0xc2, + 0x79, 0xc8, 0xf1, 0x5d, 0x00, 0xaf, 0x46, 0x59, + 0xe5, 0x87, 0xeb, 0x9b, 0x84, 0x75, 0xc3, 0xb1, + 0x42, 0x43, 0x4e, 0x2b, 0x36, 0x4c, 0x01, 0x0a, + 0x1a, 0x7e, 0xa5, 0x6f, 0x62, 0xf5, 0x74, 0x25, + 0x6e, 0xc8, 0xb1, 0x2b, 0x9e, 0x45, 0xaf, 0xa8, + 0x12, 0x6e, 0xe2, 0x1a, 0x1f, 0x33, 0x83, 0x17, + 0xda, 0x72, 0xea, 0xc2, 0xb6, 0x05, 0x0c, 0x83, + 0xc3, 0xf6, 0xe0, 0xee, 0xb0, 0xbf, 0x34, 0x6e, + 0x90, 0x73, 0x8d, 0xf5, 0x95, 0x7a, 0xd8, 0x7e, + 0x05, 0xb6, 0xea, 0x3c, 0xf0, 0x46, 0xca, 0xc6, + 0x93, 0x00, 0x7b, 0x3a, 0x2f, 0x86, 0xed, 0x78, + 0x35, 0x47, 0x4b, 0x1d, 0xdb, 0x86, 0x0f, 0x69, + 0x21, 0x76, 0x88, 0x9e, 0xad, 0x86, 0x4d, 0x33, + 0xa0, 0x5c, 0x79, 0x53, 0xd8, 0x95, 0x3a, 0x97, + 0xb9, 0xb0, 0x87, 0x11, 0xfc, 0x3a, 0x35, 0xf8, + 0x1b, 0x52, 0xc2, 0xff, 0xab, 0x3a, 0x59, 0xc2, + 0xc3, 0xec, 0x00, 0x0f, 0x20, 0x8b, 0xd8, 0x38, + 0xd0, 0xb3, 0xd5, 0xb0, 0xcd, 0x0a, 0x45, 0x6e, + 0x92, 0x98, 0x80, 0x8f, 0x22, 0xd0, 0x56, 0xb6, + 0x0a, 0xbf, 0x65, 0x2d, 0x0b, 0x28, 0xb9, 0xdd, + 0xcc, 0xa4, 0x98, 0x6c, 0xc2, 0x81, 0x9c, 0xf2, + 0x8e, 0x4e, 0x55, 0x19, 0x60, 0x4e, 0xf6, 0x7a, + 0x58, 0x7f, 0x2b, 0x99, 0x8c, 0xbf, 0x95, 0xdd, + 0x2c, 0x9d, 0x09, 0xc6, 0xa3, 0x59, 0x37, 0x09, + 0x8b, 0x1c, 0x87, 0x15, 0x69, 0x44, 0xc9, 0xb6, + 0xd0, 0xe9, 0x7a, 0xf1, 0xd8, 0x83, 0xcf, 0x92, + 0x19, 0x28, 0x77, 0xaa, 0x69, 0xcf, 0x22, 0xc7, + 0x00, 0x60, 0x89, 0x26, 0x60, 0xf5, 0x46, 0xb8, + 0x93, 0x85, 0x95, 0xf1, 0x81, 0x46, 0xad, 0x90, + 0xc1, 0x88, 0xa2, 0xdf, 0xa7, 0x17, 0x26, 0xeb, + 0x40, 0x5a, 0xcc, 0x9c, 0x8e, 0x41, 0x67, 0x83, + 0x71, 0x67, 0x58, 0xd6, 0xf3, 0xe1, 0x91, 0xb4, + 0xee, 0xe8, 0xcf, 0x9e, 0xf0, 0xf5, 0x43, 0xdc, + 0x6d, 0x68, 0x40, 0x3e, 0x62, 0x1a, 0x95, 0x55, + 0x3f, 0x57, 0x74, 0x04, 0x89, 0x7f, 0x4d, 0x26, + 0x94, 0x84, 0xdf, 0xab, 0xa9, 0xef, 0xfd, 0x05, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x53, 0x9d, + 0xb0, 0x3f, 0x03, 0x07, 0x00, 0x00, 0x43, 0x49, + 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x70, 0x34, + 0x30, 0x31, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xed, + 0x5c, 0x5b, 0x6f, 0xd3, 0x30, 0x14, 0x7e, 0x06, + 0x89, 0xff, 0x30, 0xf5, 0x1d, 0x12, 0xbb, 0x01, + 0x81, 0x14, 0x22, 0x8d, 0x31, 0x2e, 0x12, 0x85, + 0x69, 0x43, 0x5c, 0x9e, 0xaa, 0xac, 0x75, 0x47, + 0x44, 0x6e, 0x4a, 0xd2, 0xd1, 0xf1, 0xeb, 0x39, + 0x8e, 0x9d, 0xd8, 0xb9, 0x37, 0x4e, 0x03, 0x6d, + 0x59, 0x1e, 0xba, 0xc4, 0x3e, 0xc7, 0x3e, 0xe7, + 0xf3, 0x77, 0xec, 0x13, 0xd7, 0x9d, 0xb9, 0x24, + 0xb7, 0xce, 0x82, 0x3c, 0x76, 0xfc, 0x55, 0x10, + 0x79, 0x76, 0xe2, 0x04, 0xfe, 0xc9, 0x2d, 0x89, + 0x62, 0xf8, 0xfb, 0x72, 0x82, 0x9e, 0xe8, 0x13, + 0xeb, 0xd1, 0xc3, 0x07, 0xa6, 0xe3, 0x85, 0x41, + 0x94, 0x9c, 0xac, 0x1c, 0x97, 0xbc, 0x9c, 0x2c, + 0xc9, 0xca, 0x5e, 0xbb, 0x49, 0xfc, 0x64, 0xe3, + 0xb9, 0x13, 0x0d, 0xea, 0xa9, 0x04, 0x21, 0xde, + 0x67, 0xc7, 0x03, 0xc5, 0x13, 0x67, 0xf9, 0x72, + 0x12, 0x1a, 0x3a, 0xda, 0xcc, 0xb9, 0x20, 0x6b, + 0x42, 0xcb, 0x25, 0xe0, 0xf1, 0x04, 0x2e, 0xf6, + 0x69, 0x2e, 0xdc, 0x60, 0xf1, 0xf3, 0x3d, 0xf4, + 0xde, 0xa0, 0xf8, 0x80, 0x49, 0x9c, 0x05, 0x7e, + 0x12, 0x05, 0xae, 0xf5, 0xf6, 0xec, 0x6c, 0xfe, + 0xf1, 0xd3, 0xc7, 0x73, 0x53, 0x93, 0x8b, 0x99, + 0xa0, 0xb0, 0x21, 0x22, 0xab, 0x72, 0x5b, 0x1a, + 0xb3, 0x22, 0xef, 0xae, 0x68, 0x85, 0x47, 0xbc, + 0x20, 0xba, 0x4b, 0x4d, 0x38, 0x0b, 0xd7, 0xf3, + 0x54, 0xf5, 0x75, 0xc1, 0x8a, 0xe4, 0x2e, 0x24, + 0xd6, 0x25, 0xb9, 0x71, 0xe2, 0x84, 0x44, 0xa6, + 0x46, 0x1f, 0x59, 0x45, 0x9c, 0xd8, 0x51, 0x62, + 0xe9, 0xa6, 0x96, 0xde, 0xf0, 0x32, 0xe7, 0x37, + 0xb1, 0xf4, 0x0d, 0x32, 0xa0, 0x14, 0x6e, 0x79, + 0x5f, 0x69, 0x4f, 0xd7, 0x4e, 0x12, 0x43, 0x15, + 0x06, 0x05, 0x7a, 0xcb, 0xe5, 0xc9, 0x8d, 0x47, + 0xfc, 0xe4, 0x8a, 0xab, 0x81, 0x96, 0x28, 0x60, + 0x12, 0xd7, 0xb6, 0xff, 0x33, 0xb6, 0xa0, 0x26, + 0xbd, 0x61, 0x65, 0x9e, 0x1d, 0x86, 0x64, 0x69, + 0xad, 0x6c, 0x37, 0x26, 0xa6, 0xc6, 0x9e, 0x98, + 0x97, 0xcc, 0x1d, 0x3e, 0x34, 0xec, 0x41, 0x82, + 0x77, 0x66, 0x3b, 0xfe, 0x1c, 0x3f, 0x7d, 0xf6, + 0x53, 0x76, 0xed, 0x8d, 0x6b, 0xc7, 0x3f, 0x24, + 0xbf, 0x98, 0xa1, 0x53, 0x9c, 0x9b, 0x29, 0x5c, + 0xdd, 0xd4, 0x3a, 0x6b, 0xe8, 0x70, 0xe5, 0xfe, + 0x56, 0x9d, 0x82, 0xda, 0x7e, 0x7e, 0x25, 0xd1, + 0xba, 0xe0, 0x56, 0xe6, 0xc9, 0xe9, 0x62, 0x41, + 0x62, 0xc6, 0x22, 0x71, 0x31, 0x27, 0x4e, 0x23, + 0x2f, 0xf5, 0x63, 0x26, 0x09, 0x32, 0x9f, 0xca, + 0xe2, 0xbf, 0x22, 0x27, 0x21, 0x17, 0x51, 0x90, + 0x90, 0x05, 0xe5, 0x7c, 0xda, 0x3e, 0xf4, 0x60, + 0x2f, 0x97, 0x11, 0xe8, 0x80, 0xbd, 0xe7, 0xba, + 0x6e, 0x18, 0x3a, 0x1d, 0x26, 0x5e, 0xc6, 0x45, + 0x6a, 0x07, 0x30, 0x35, 0x3a, 0xfe, 0x49, 0xa1, + 0xd1, 0xa7, 0x6f, 0x4c, 0x8d, 0x3e, 0x64, 0x15, + 0xe1, 0xaf, 0x25, 0x94, 0x3f, 0x7b, 0xf1, 0xf4, + 0xd4, 0xd4, 0xe0, 0x5e, 0x18, 0x22, 0x8c, 0x59, + 0xfb, 0x94, 0x95, 0xa7, 0xc5, 0xbe, 0x53, 0xbc, + 0xf2, 0x1a, 0x61, 0x81, 0xa9, 0x55, 0x6d, 0xcf, + 0x5b, 0xd2, 0x8a, 0x10, 0x09, 0x2e, 0x34, 0xd2, + 0x3d, 0x34, 0x10, 0x42, 0x8c, 0x12, 0x4f, 0x11, + 0xde, 0x2d, 0x25, 0x9e, 0xef, 0x29, 0x25, 0xf0, + 0xec, 0x9e, 0x14, 0xdb, 0x92, 0x02, 0x79, 0x3b, + 0xa5, 0x04, 0xd2, 0xef, 0x39, 0x71, 0xf0, 0x9c, + 0xc0, 0xbb, 0xe5, 0x04, 0xbe, 0xe7, 0xc4, 0xc1, + 0x72, 0x22, 0xcf, 0x27, 0x10, 0x7e, 0xbe, 0xdb, + 0xc5, 0x03, 0xef, 0x29, 0x29, 0xee, 0x29, 0x91, + 0x53, 0x42, 0x5c, 0xb5, 0x79, 0xe6, 0xa5, 0xed, + 0xcd, 0x9f, 0x19, 0x05, 0x56, 0x40, 0xd1, 0xb6, + 0x9c, 0x60, 0x2b, 0x45, 0x2d, 0x35, 0xa0, 0x18, + 0x09, 0x76, 0xec, 0x20, 0x85, 0xee, 0xa0, 0x46, + 0x4e, 0x86, 0x4b, 0xdb, 0x5f, 0x06, 0x5e, 0x0d, + 0x1b, 0x3a, 0x81, 0x62, 0x9f, 0x8d, 0x18, 0xcd, + 0xb1, 0x1a, 0x4a, 0x58, 0xff, 0x2f, 0x50, 0x7a, + 0xe5, 0x24, 0xaf, 0xa0, 0x51, 0x75, 0x36, 0x61, + 0x06, 0x94, 0xda, 0xf2, 0xb3, 0x6f, 0x28, 0xd1, + 0xab, 0x8b, 0x53, 0x53, 0xac, 0x88, 0x54, 0x47, + 0xdc, 0xe9, 0xcf, 0x0f, 0x0b, 0xab, 0x86, 0x3c, + 0x86, 0x62, 0x44, 0x97, 0xac, 0x71, 0x40, 0xc2, + 0x07, 0x46, 0xa8, 0x16, 0x90, 0xe8, 0x3e, 0xc1, + 0x38, 0x20, 0x19, 0x47, 0x00, 0x92, 0x88, 0xb6, + 0xb1, 0x66, 0xf0, 0x63, 0x8b, 0xb7, 0x91, 0x60, + 0x3a, 0xb6, 0x88, 0x1b, 0x09, 0xa6, 0x63, 0x89, + 0x39, 0x9e, 0x0f, 0xa8, 0xaf, 0x72, 0x3c, 0x1f, + 0x50, 0xdb, 0xa2, 0x38, 0x04, 0x94, 0x80, 0x4c, + 0x19, 0x4a, 0x03, 0xd6, 0xb9, 0xa3, 0x4a, 0x9b, + 0x3a, 0x60, 0x1a, 0xb0, 0xd2, 0xb5, 0xc1, 0x64, + 0x1c, 0x03, 0x4c, 0x34, 0xe6, 0x2e, 0x48, 0xe4, + 0x84, 0x3f, 0x48, 0x64, 0xbb, 0x6a, 0x20, 0x19, + 0xfa, 0x91, 0x87, 0x5c, 0x11, 0x24, 0xce, 0x2a, + 0x45, 0xac, 0x3a, 0xe3, 0xee, 0x90, 0xc0, 0x6a, + 0xc1, 0xeb, 0x35, 0xb9, 0x5e, 0xdf, 0xa8, 0x61, + 0x74, 0xae, 0x77, 0x62, 0x74, 0x48, 0x20, 0x35, + 0x2e, 0x75, 0x41, 0x50, 0xfc, 0x0a, 0x32, 0xd8, + 0x16, 0x20, 0xac, 0xa3, 0xa6, 0x70, 0xfb, 0xbb, + 0x3b, 0x6b, 0x02, 0x1d, 0x62, 0x2f, 0x03, 0xdf, + 0xbd, 0x03, 0x7c, 0xa2, 0x60, 0x57, 0xf8, 0xc4, + 0xae, 0xea, 0xb6, 0x23, 0xd6, 0x71, 0x13, 0x7f, + 0xc6, 0x05, 0x28, 0xdf, 0x5e, 0x0b, 0xd9, 0xa6, + 0x9b, 0x7d, 0xed, 0x12, 0x2e, 0x23, 0x95, 0xb4, + 0x21, 0x09, 0x5e, 0xa7, 0x9e, 0xaa, 0x31, 0xad, + 0x66, 0xaf, 0x8e, 0x7e, 0x25, 0xae, 0x8e, 0xa3, + 0xbe, 0x67, 0x44, 0xa3, 0xde, 0x0c, 0xc0, 0xa7, + 0x26, 0x4f, 0xb8, 0x67, 0x5a, 0xe1, 0x7b, 0x91, + 0xed, 0xb1, 0x7c, 0x50, 0x02, 0xf2, 0xff, 0xe0, + 0x5a, 0x1f, 0x84, 0xe8, 0x67, 0x3d, 0x48, 0x57, + 0x64, 0x11, 0xf8, 0x4b, 0x75, 0xa8, 0x8c, 0xa6, + 0x9c, 0xf4, 0x30, 0xa1, 0x92, 0xd8, 0xf4, 0xc1, + 0xbe, 0x0b, 0xd6, 0x49, 0xd3, 0x91, 0xa1, 0x0c, + 0x4d, 0xdf, 0xf6, 0xe0, 0xbc, 0x12, 0x5d, 0x41, + 0xcf, 0x82, 0x25, 0x99, 0xf0, 0x63, 0x41, 0x62, + 0x59, 0xd5, 0xea, 0xa4, 0x63, 0xb7, 0x20, 0x08, + 0xcf, 0xb5, 0x72, 0x90, 0xa8, 0xa4, 0x72, 0xe5, + 0x2f, 0x3b, 0x34, 0x29, 0xea, 0x2a, 0x1a, 0xb8, + 0x4e, 0x65, 0x8e, 0xdb, 0x95, 0xa6, 0x42, 0x49, + 0xbc, 0xfa, 0xf2, 0xbe, 0x32, 0xa5, 0xb2, 0x7d, + 0xe9, 0x31, 0xa6, 0x54, 0xaf, 0x72, 0xa0, 0xa9, + 0xde, 0xed, 0x73, 0x92, 0xbb, 0x23, 0x12, 0xb3, + 0x5a, 0x49, 0x3a, 0x88, 0x05, 0x51, 0x5a, 0x50, + 0x2b, 0x29, 0x92, 0x61, 0xf4, 0x0c, 0xe8, 0x59, + 0x50, 0x12, 0x75, 0xdb, 0xa8, 0xa2, 0x06, 0x5d, + 0x0e, 0x46, 0x0b, 0x7e, 0xf4, 0xbb, 0xc9, 0x54, + 0xb9, 0x72, 0xf8, 0x29, 0x3b, 0x11, 0x26, 0x13, + 0x4a, 0x6a, 0x86, 0xdd, 0xd5, 0xd3, 0x8d, 0x41, + 0x55, 0xa1, 0x9e, 0x50, 0xee, 0xa6, 0xca, 0x14, + 0xf7, 0xa6, 0xca, 0x14, 0x2b, 0x52, 0x85, 0xf5, + 0x95, 0x6a, 0xf4, 0x83, 0x09, 0x36, 0x0e, 0x04, + 0xc9, 0xea, 0xc0, 0x6a, 0x00, 0x4a, 0xbc, 0x5c, + 0xab, 0x03, 0x25, 0xed, 0x86, 0x6d, 0x8d, 0x94, + 0xa4, 0xd3, 0x03, 0xaa, 0xd2, 0x1e, 0x40, 0x3f, + 0xac, 0xa4, 0x33, 0x11, 0x54, 0x4f, 0xe8, 0x34, + 0xcc, 0x2a, 0x22, 0x97, 0xc8, 0x81, 0xed, 0x08, + 0x31, 0x24, 0x42, 0x4c, 0xb6, 0xa9, 0xaa, 0xc1, + 0x70, 0xa8, 0xae, 0x1f, 0xa0, 0xa8, 0x32, 0x7a, + 0x1b, 0xf0, 0x6c, 0x08, 0xd3, 0x0f, 0x6d, 0x00, + 0xd1, 0x31, 0x0e, 0x20, 0x3d, 0xd2, 0x37, 0x7c, + 0x08, 0x61, 0x1e, 0xe8, 0x3d, 0x84, 0xa0, 0xa3, + 0x38, 0x84, 0xa0, 0xa9, 0x38, 0x84, 0xd4, 0xdb, + 0x83, 0x1c, 0xc4, 0x6c, 0x7e, 0x75, 0x96, 0x33, + 0x38, 0xe9, 0xd1, 0x98, 0xd6, 0xf0, 0x83, 0xd9, + 0x90, 0xa3, 0xad, 0xe0, 0x32, 0x35, 0xfe, 0xcc, + 0x2a, 0x23, 0x38, 0xc8, 0xcd, 0x6b, 0x69, 0x5d, + 0xf6, 0x98, 0x25, 0x6a, 0x9b, 0xcb, 0x62, 0xbd, + 0x5c, 0x92, 0x9a, 0xc5, 0xfa, 0x86, 0x7b, 0x66, + 0x12, 0xd8, 0x42, 0x93, 0xa6, 0xdc, 0x16, 0x2a, + 0xfd, 0x4a, 0xa6, 0x8d, 0xdc, 0xa1, 0x81, 0x44, + 0x87, 0x92, 0x48, 0xa9, 0x5b, 0x03, 0xd7, 0x74, + 0xcb, 0xba, 0xb1, 0xf2, 0xb1, 0x2e, 0xf7, 0xce, + 0x91, 0xc4, 0x1e, 0xb9, 0x19, 0xd6, 0xfb, 0x6a, + 0xa5, 0xd8, 0x7b, 0x65, 0x1c, 0x0a, 0x7d, 0x4f, + 0x95, 0xa0, 0x16, 0xbd, 0xf2, 0x1e, 0x57, 0x6b, + 0x7f, 0xe1, 0x92, 0x64, 0x66, 0x87, 0x8d, 0xbd, + 0x42, 0xc2, 0x13, 0x93, 0x37, 0x4c, 0xce, 0x9a, + 0x5d, 0x5d, 0x18, 0x53, 0x7c, 0x61, 0x6c, 0x36, + 0x73, 0x5e, 0x64, 0x6a, 0xb2, 0x40, 0xaa, 0x92, + 0x9e, 0x4a, 0x6a, 0x55, 0x91, 0x05, 0x64, 0xe8, + 0x5e, 0xdb, 0x21, 0xd0, 0x76, 0x1d, 0x11, 0x59, + 0x2b, 0x2f, 0x34, 0x35, 0x51, 0x2f, 0xd3, 0x57, + 0x13, 0x5e, 0xe4, 0x8d, 0xd5, 0xf9, 0x97, 0x05, + 0x2d, 0x1d, 0xd4, 0x0e, 0xe7, 0xf0, 0x4c, 0xc5, + 0x3f, 0x59, 0x4b, 0x96, 0x61, 0xd6, 0xee, 0xd4, + 0xcf, 0xac, 0xb9, 0xb6, 0x71, 0xa4, 0xa1, 0xd3, + 0xe1, 0xe7, 0xc5, 0x5b, 0x84, 0x54, 0x3c, 0x2d, + 0xea, 0x15, 0xa4, 0x1a, 0xcc, 0xad, 0x1a, 0x9c, + 0x9e, 0xfa, 0x62, 0x16, 0xb7, 0x2d, 0x13, 0x5f, + 0x6d, 0x27, 0x79, 0x13, 0x44, 0xf0, 0xa6, 0x60, + 0xf1, 0xdb, 0xf4, 0x25, 0xe1, 0x9d, 0xed, 0x26, + 0xf0, 0x6e, 0x67, 0x6a, 0xa2, 0x9e, 0x99, 0x7c, + 0xe5, 0xf8, 0x37, 0x2e, 0xb9, 0x4a, 0x48, 0x68, + 0x89, 0xdb, 0x54, 0x52, 0x3c, 0x32, 0x49, 0xba, + 0x2f, 0x78, 0xea, 0xba, 0xf0, 0xa2, 0x02, 0x3f, + 0xb0, 0x88, 0xad, 0xe2, 0x63, 0xaa, 0x51, 0x2c, + 0x62, 0x5a, 0x5f, 0xa9, 0xb3, 0x52, 0xa1, 0x78, + 0x16, 0x7a, 0x65, 0x19, 0x06, 0x87, 0x70, 0x59, + 0xf2, 0xaf, 0x7c, 0xc7, 0x7f, 0x19, 0x53, 0x47, + 0xd7, 0x6c, 0xa2, 0xae, 0xfd, 0x9d, 0x49, 0xe3, + 0x7b, 0xb9, 0x1d, 0x2d, 0x7e, 0x38, 0x74, 0xcb, + 0x85, 0xd2, 0x09, 0xac, 0x03, 0x9b, 0x4c, 0x4d, + 0x2e, 0xcc, 0x7f, 0xc5, 0x62, 0x9d, 0xcf, 0xce, + 0xbf, 0xcd, 0xcf, 0x3e, 0x5d, 0x7e, 0x86, 0x3f, + 0x33, 0x03, 0xf8, 0xc0, 0x31, 0x15, 0xbf, 0x96, + 0x69, 0xe9, 0xfa, 0x36, 0x70, 0x13, 0xfb, 0x86, + 0x08, 0x29, 0xfe, 0xde, 0x37, 0xff, 0x76, 0x8b, + 0xb9, 0x8c, 0x3c, 0xea, 0xcd, 0x2d, 0x65, 0x64, + 0xce, 0x85, 0x04, 0x0c, 0x20, 0xc1, 0xa8, 0xc5, + 0x40, 0x2a, 0x2d, 0x63, 0xac, 0xb0, 0x4a, 0xa7, + 0xff, 0x1c, 0x3c, 0x49, 0xa8, 0x1e, 0x3f, 0xf6, + 0x59, 0x86, 0x2f, 0xa2, 0xd3, 0x47, 0x73, 0x12, + 0xf7, 0x80, 0xe2, 0x1d, 0x2f, 0xe0, 0x95, 0x98, + 0xda, 0x94, 0xcd, 0x0d, 0x20, 0x77, 0x09, 0xad, + 0x8b, 0x8a, 0xd4, 0xa8, 0x6c, 0x61, 0x13, 0x6d, + 0xe5, 0x53, 0x53, 0x21, 0xbd, 0x38, 0x85, 0x2d, + 0xa0, 0x42, 0x7a, 0x21, 0x16, 0x2d, 0x31, 0xd2, + 0x5b, 0xe1, 0x29, 0x27, 0x3b, 0xf5, 0x62, 0xa2, + 0xc1, 0x06, 0xc8, 0xa8, 0x89, 0x55, 0xbc, 0x6a, + 0x78, 0x16, 0x8d, 0x05, 0x52, 0xd6, 0xd6, 0xbf, + 0x06, 0x4a, 0xf8, 0xdf, 0x30, 0x59, 0x6d, 0xb3, + 0x43, 0xd1, 0x08, 0xc5, 0x6c, 0x30, 0x14, 0x68, + 0x4c, 0x28, 0x3c, 0x9e, 0xaa, 0xcb, 0x30, 0x9c, + 0xb4, 0xc6, 0x0d, 0x52, 0x00, 0x61, 0x20, 0x1f, + 0x6c, 0x38, 0x8a, 0x34, 0x26, 0x08, 0xdd, 0x7c, + 0xe8, 0xe0, 0x85, 0x0a, 0x26, 0x03, 0x89, 0x01, + 0x98, 0x4c, 0xc7, 0xc4, 0x84, 0x11, 0xa3, 0x42, + 0x8d, 0x93, 0x76, 0x72, 0x60, 0x05, 0x20, 0x86, + 0x93, 0xc3, 0x18, 0x13, 0x08, 0x59, 0x6c, 0xdb, + 0xc5, 0xc5, 0x53, 0xc1, 0x61, 0x38, 0x21, 0x9e, + 0x8e, 0x89, 0x03, 0x27, 0x44, 0x11, 0x82, 0x86, + 0xa4, 0x6e, 0x52, 0xce, 0x6c, 0xda, 0x5c, 0xa7, + 0x42, 0x9d, 0xae, 0xe7, 0x2f, 0xab, 0x55, 0xb7, + 0xd1, 0x88, 0x6b, 0x05, 0x98, 0xc6, 0xdc, 0xae, + 0x86, 0x82, 0x28, 0x6b, 0xc9, 0x6e, 0x93, 0xbf, + 0x8a, 0x04, 0xfe, 0x57, 0x48, 0xb4, 0x61, 0x70, + 0xd7, 0x1b, 0x83, 0xef, 0x83, 0x30, 0x18, 0x71, + 0xa5, 0xe0, 0x9b, 0xb7, 0x02, 0x86, 0x2d, 0xb3, + 0x4d, 0x84, 0x6e, 0x7b, 0x83, 0xf0, 0x65, 0x10, + 0x08, 0xcf, 0xc6, 0x05, 0x81, 0x6e, 0x09, 0xf6, + 0x87, 0x41, 0xef, 0x1d, 0x0f, 0xfa, 0xc0, 0x78, + 0x78, 0x31, 0x1e, 0x0c, 0x8a, 0xf1, 0xa0, 0xf7, + 0x8e, 0x07, 0x7d, 0x60, 0x3c, 0x5c, 0x8f, 0x87, + 0x81, 0x6a, 0x3c, 0xe8, 0xbd, 0xe3, 0x41, 0x1f, + 0x18, 0x0f, 0xab, 0x71, 0x41, 0x90, 0xe3, 0xa1, + 0x47, 0x36, 0x0d, 0x93, 0x63, 0x3f, 0x18, 0x06, + 0xce, 0x8d, 0x68, 0x3f, 0xe7, 0xc6, 0xbe, 0x18, + 0x0c, 0xa2, 0x02, 0xda, 0xd7, 0xa9, 0xb1, 0x1f, + 0x0a, 0x03, 0x67, 0x46, 0xb4, 0x97, 0x33, 0x63, + 0x5f, 0x08, 0x86, 0x05, 0xc3, 0x7e, 0x4e, 0x8c, + 0x7d, 0x31, 0x18, 0x16, 0x0c, 0xff, 0x70, 0x5e, + 0xcc, 0x50, 0x80, 0x82, 0xca, 0x3f, 0x4b, 0x82, + 0xca, 0x3f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, + 0x6c, 0x08, 0x23, 0xa2, 0xa4, 0x01, 0x00, 0x00, + 0xd2, 0x05, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x52, 0x46, 0x34, 0x33, 0x30, 0x46, 0x35, 0x78, + 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0xdd, 0x94, 0x5d, + 0x4f, 0x83, 0x30, 0x14, 0x86, 0xaf, 0xdd, 0xaf, + 0x20, 0xbd, 0xd7, 0xae, 0x63, 0xf8, 0x91, 0x14, + 0x92, 0x09, 0xcc, 0x98, 0x6c, 0x6a, 0x26, 0x46, + 0xee, 0x9a, 0x0a, 0x5d, 0x6c, 0xa4, 0x74, 0x01, + 0xb6, 0xe0, 0xbf, 0xb7, 0xd0, 0xce, 0x61, 0x94, + 0xc5, 0x99, 0x5d, 0xc9, 0x05, 0x9c, 0xc3, 0x79, + 0xf2, 0x9e, 0xf6, 0xa5, 0x07, 0x9c, 0xb2, 0x0d, + 0x4f, 0xd8, 0x29, 0xcf, 0x97, 0xb2, 0x10, 0xb4, + 0xe2, 0x32, 0xb7, 0x36, 0xac, 0x28, 0xd5, 0xd3, + 0x05, 0xe8, 0x6c, 0x08, 0xbc, 0xc1, 0x09, 0xe6, + 0x62, 0x25, 0x8b, 0xca, 0x5a, 0xf2, 0x8c, 0xb9, + 0x20, 0x65, 0x4b, 0xba, 0xce, 0xaa, 0xf2, 0xac, + 0x16, 0x19, 0x80, 0xde, 0x40, 0xd5, 0xb5, 0x86, + 0xc5, 0x53, 0x17, 0x2c, 0xa6, 0x63, 0x7b, 0x38, + 0x75, 0xea, 0xba, 0x06, 0x56, 0xc1, 0x96, 0x2e, + 0x08, 0x34, 0x4e, 0xe2, 0xcd, 0xa8, 0xd1, 0x6a, + 0xe0, 0x32, 0x29, 0xf8, 0xaa, 0xe9, 0xe4, 0x19, + 0x1a, 0x5d, 0x38, 0x18, 0x76, 0xde, 0xb7, 0x1c, + 0x4f, 0x7d, 0x99, 0x32, 0x15, 0xaa, 0xd8, 0xac, + 0xc8, 0x1b, 0xd6, 0x97, 0x88, 0xbd, 0x60, 0x68, + 0x72, 0x5d, 0x2c, 0xd7, 0x2f, 0x9f, 0x75, 0x0c, + 0x4d, 0xb6, 0x55, 0x81, 0x3b, 0x19, 0xcc, 0x98, + 0xf0, 0xc2, 0x79, 0x18, 0x93, 0xc7, 0xf9, 0x64, + 0x36, 0x23, 0x4e, 0x1c, 0x63, 0xa8, 0xde, 0xb5, + 0xb5, 0x24, 0x93, 0xc9, 0xdb, 0xad, 0x32, 0x41, + 0x65, 0xdb, 0xd4, 0x97, 0x79, 0x55, 0xc8, 0xcc, + 0xbb, 0xf1, 0x7d, 0x12, 0xc6, 0x51, 0x78, 0x17, + 0x84, 0x01, 0x86, 0xdd, 0x92, 0x82, 0xb5, 0x6e, + 0xc4, 0x85, 0x6a, 0xda, 0xa6, 0xbb, 0xdc, 0xe2, + 0x79, 0xca, 0x6a, 0x17, 0xd8, 0xc6, 0x0a, 0xff, + 0x7e, 0xfe, 0x40, 0xae, 0x01, 0xec, 0xc1, 0x1c, + 0x83, 0x2d, 0x22, 0xbf, 0x97, 0xb9, 0x34, 0xcc, + 0xd3, 0xa3, 0x7f, 0x8b, 0x7a, 0xa9, 0xab, 0x0e, + 0x35, 0xec, 0xa5, 0x10, 0x32, 0x58, 0x14, 0xd8, + 0x04, 0xf5, 0x63, 0xa3, 0x0e, 0xb6, 0x47, 0xcd, + 0xde, 0x62, 0x93, 0xbd, 0xd8, 0x76, 0x97, 0xcf, + 0x41, 0x44, 0x26, 0x06, 0xc3, 0xb0, 0x63, 0x61, + 0x93, 0x7e, 0xf9, 0x1a, 0x58, 0x30, 0x21, 0x8b, + 0xf7, 0x19, 0x7d, 0x97, 0xeb, 0xea, 0xc7, 0x43, + 0xf5, 0xc9, 0x58, 0x39, 0x15, 0xea, 0x88, 0xce, + 0x29, 0xcf, 0xdb, 0x36, 0x3a, 0x24, 0xd3, 0x8c, + 0x96, 0xaf, 0xc4, 0x1e, 0xbd, 0xa9, 0x7e, 0xdf, + 0xe9, 0x05, 0x15, 0x2d, 0xdc, 0x46, 0x8d, 0x24, + 0x69, 0x40, 0xbd, 0x90, 0x6e, 0x6b, 0x6f, 0x60, + 0x99, 0x0b, 0xaf, 0x4a, 0xea, 0x85, 0xf9, 0x2b, + 0xcd, 0x13, 0x96, 0x62, 0xd8, 0x64, 0x03, 0x05, + 0xeb, 0x31, 0xd0, 0x58, 0x7b, 0x33, 0x83, 0xa1, + 0xc5, 0x77, 0x93, 0xd1, 0x3f, 0x07, 0xce, 0x21, + 0x73, 0x40, 0xff, 0x3a, 0x07, 0x47, 0xf2, 0x13, + 0x9d, 0xff, 0xd6, 0x4f, 0xf4, 0xa3, 0x9f, 0x47, + 0xf2, 0x6c, 0x3c, 0x3e, 0xc0, 0xb3, 0xab, 0xff, + 0xe4, 0x99, 0x8e, 0x76, 0x3f, 0x6f, 0xbd, 0xfd, + 0x0f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xee, + 0xed, 0x38, 0x0f, 0xd4, 0x02, 0x00, 0x00, 0x58, + 0x0a, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x76, + 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x2e, 0x78, + 0x6d, 0x6c, 0xe5, 0x56, 0xcd, 0x6e, 0xdb, 0x30, + 0x0c, 0x3e, 0xaf, 0x4f, 0x11, 0xf8, 0xbe, 0x2a, + 0xbf, 0x45, 0x0f, 0xaa, 0x80, 0xd4, 0x49, 0xb7, + 0x6c, 0xcd, 0x5a, 0x24, 0x05, 0xda, 0x9b, 0xa1, + 0x3a, 0x74, 0x6b, 0x44, 0xfe, 0x81, 0x24, 0xa7, + 0xc9, 0x9e, 0x7e, 0x94, 0x64, 0xc7, 0x4e, 0x9a, + 0xa6, 0x87, 0xad, 0x40, 0x81, 0xf9, 0xe0, 0x90, + 0x1f, 0x3f, 0x8a, 0x94, 0x4c, 0x52, 0xa1, 0x0b, + 0x58, 0xc5, 0x21, 0x7c, 0x8d, 0xd3, 0x28, 0x93, + 0x09, 0xd7, 0x71, 0x96, 0xb6, 0x56, 0x20, 0x15, + 0xfe, 0x5e, 0x78, 0x9d, 0xd3, 0xb6, 0xc7, 0x4e, + 0xbe, 0xd0, 0x38, 0xc9, 0x33, 0xa9, 0x5b, 0x51, + 0x2c, 0xe0, 0xc2, 0x5b, 0x40, 0xc4, 0x0b, 0xa1, + 0xd5, 0xe9, 0x3a, 0x11, 0x1e, 0x61, 0x27, 0x68, + 0x77, 0x6b, 0x20, 0xd3, 0x88, 0x2a, 0x94, 0x71, + 0x6e, 0xd6, 0x61, 0xd3, 0xf9, 0x6d, 0xbf, 0xd7, + 0x9e, 0x74, 0xdb, 0xfd, 0x75, 0x80, 0xef, 0x9e, + 0x7d, 0x77, 0xd7, 0x94, 0x34, 0x48, 0xd6, 0x29, + 0x5e, 0x4c, 0xb9, 0x5a, 0xa2, 0x88, 0x72, 0x19, + 0x9c, 0xb5, 0xd7, 0x11, 0x3e, 0x94, 0x18, 0xbd, + 0xe2, 0x11, 0x47, 0x2c, 0x7d, 0xfc, 0x6c, 0x01, + 0xfb, 0x3e, 0x18, 0xab, 0xbd, 0xe7, 0x53, 0x13, + 0x69, 0xae, 0x38, 0x9b, 0xc1, 0x53, 0x21, 0xb8, + 0xa4, 0x04, 0x15, 0x0b, 0x3e, 0xc6, 0x5a, 0xb1, + 0xce, 0x19, 0x25, 0x46, 0xb0, 0x08, 0x97, 0xe1, + 0x73, 0xac, 0x21, 0xd4, 0x85, 0x04, 0xe6, 0xe7, + 0x05, 0x25, 0x4d, 0xc4, 0x52, 0x00, 0x12, 0x36, + 0x9e, 0x8e, 0x1f, 0x82, 0xeb, 0x9b, 0x7b, 0x4a, + 0x50, 0xb3, 0x68, 0x28, 0xb2, 0x70, 0x39, 0xc1, + 0x93, 0x44, 0xad, 0x52, 0xfd, 0x2c, 0xd5, 0x32, + 0x13, 0xec, 0x9b, 0xef, 0x07, 0xf3, 0xbb, 0xe1, + 0xaf, 0xd1, 0x70, 0x36, 0x0a, 0x26, 0x94, 0x34, + 0x8d, 0x48, 0x77, 0x6b, 0xfa, 0x06, 0x34, 0x49, + 0x34, 0xf5, 0x56, 0x9c, 0x2e, 0x60, 0x8d, 0x5f, + 0x03, 0x3f, 0xc6, 0xdd, 0xd0, 0xbf, 0xfe, 0x89, + 0x01, 0x4b, 0xd3, 0x5b, 0xcc, 0xbe, 0xc7, 0x0e, + 0x10, 0x6b, 0xd5, 0xed, 0x93, 0xec, 0xe4, 0x4b, + 0x57, 0x99, 0xd0, 0xfc, 0x09, 0x8c, 0xde, 0x92, + 0x10, 0x5d, 0x78, 0x23, 0xf7, 0xa5, 0x3d, 0x62, + 0xcd, 0x11, 0x70, 0xb3, 0x7d, 0xb5, 0x63, 0x0b, + 0xba, 0xeb, 0x75, 0x69, 0x4f, 0x20, 0xc9, 0xe4, + 0xe6, 0x9a, 0x6f, 0xb2, 0x42, 0x23, 0xb0, 0x45, + 0x5a, 0x29, 0x4f, 0xb0, 0x6c, 0x2e, 0x95, 0xf0, + 0x8c, 0xab, 0x95, 0x82, 0x7a, 0xe9, 0xd7, 0x4c, + 0x3c, 0x71, 0xcb, 0xb4, 0xd2, 0x51, 0xe6, 0x18, + 0x12, 0xcb, 0xb4, 0xd2, 0x51, 0xa6, 0xd9, 0x94, + 0x57, 0x9e, 0x96, 0xde, 0xe4, 0xc0, 0xae, 0x04, + 0x57, 0xcf, 0x94, 0x18, 0xd9, 0xc0, 0xfb, 0x75, + 0x50, 0x62, 0x4a, 0x73, 0xa9, 0xb1, 0xac, 0x3a, + 0xed, 0x36, 0x96, 0x95, 0xd5, 0x2a, 0x4b, 0xfc, + 0x1b, 0xd0, 0xd0, 0x37, 0xb8, 0x91, 0x2b, 0x18, + 0x9e, 0x12, 0x48, 0xf5, 0xbc, 0x61, 0xad, 0xa1, + 0x6d, 0x24, 0x9e, 0x2e, 0x31, 0x14, 0x46, 0x32, + 0x42, 0x09, 0x26, 0x3c, 0xcf, 0x61, 0xc1, 0xb4, + 0x2c, 0x80, 0x12, 0xa7, 0x94, 0x96, 0x5c, 0x66, + 0xa6, 0xf4, 0xf8, 0xa3, 0x80, 0xd2, 0x5c, 0x23, + 0x66, 0xc9, 0x7a, 0xb3, 0xc3, 0x30, 0x04, 0xa5, + 0x98, 0xdb, 0xe1, 0xa4, 0xee, 0x68, 0xbb, 0x59, + 0x67, 0x2c, 0xb7, 0x8c, 0x21, 0x6a, 0x0f, 0x97, + 0x42, 0x05, 0x1d, 0x38, 0xbd, 0x29, 0x8f, 0xd3, + 0xbf, 0x38, 0xbd, 0xf3, 0x83, 0xa7, 0x67, 0x0d, + 0x1f, 0x7e, 0x7c, 0x47, 0x76, 0x75, 0x0b, 0x38, + 0x83, 0x9e, 0x41, 0x72, 0xd1, 0x39, 0xc3, 0xac, + 0x6d, 0x25, 0xbd, 0x42, 0x8f, 0x56, 0x55, 0xcd, + 0x3d, 0x3f, 0xb4, 0xc0, 0x79, 0xd3, 0x7f, 0x9b, + 0xa7, 0x5a, 0xda, 0xd9, 0x56, 0x3f, 0x94, 0x18, + 0xf0, 0xbd, 0x6c, 0x67, 0xdc, 0xd5, 0xba, 0x95, + 0x82, 0x6d, 0xfb, 0x2d, 0xcb, 0xee, 0x23, 0xfb, + 0xed, 0x47, 0xa3, 0x22, 0x0d, 0xcd, 0xc7, 0x9f, + 0xf2, 0xdc, 0x2d, 0x77, 0x29, 0xb2, 0x97, 0xab, + 0x42, 0x01, 0x1b, 0x15, 0x49, 0xb2, 0x99, 0xf2, + 0x50, 0x66, 0x94, 0x54, 0xa0, 0xa3, 0xdc, 0x66, + 0x42, 0xfc, 0x98, 0x6b, 0xae, 0x01, 0xc7, 0x24, + 0xdb, 0xd1, 0xcc, 0x24, 0xa7, 0x64, 0x07, 0x72, + 0x3e, 0x33, 0x50, 0xa0, 0x1f, 0x56, 0x5d, 0x66, + 0x05, 0x47, 0xab, 0x30, 0x97, 0x5a, 0x23, 0x93, + 0x6d, 0x66, 0x02, 0xf4, 0x36, 0x31, 0x3c, 0x2b, + 0x05, 0x57, 0x0e, 0x64, 0x63, 0xa3, 0x8c, 0xfc, + 0x1b, 0x4a, 0x9a, 0xb0, 0x23, 0xbe, 0xc8, 0x58, + 0x6f, 0x91, 0x7b, 0xa3, 0xb8, 0x70, 0x4d, 0xbc, + 0x0a, 0x59, 0x87, 0x40, 0xd5, 0x5d, 0x50, 0xef, + 0xdf, 0x55, 0x77, 0xfe, 0xf7, 0xc1, 0xf8, 0x23, + 0xef, 0xa7, 0x41, 0xd8, 0x1d, 0x7c, 0x82, 0xfb, + 0xc9, 0x15, 0x92, 0xbd, 0x4c, 0x3c, 0xf2, 0x7f, + 0x0c, 0x7f, 0x43, 0x75, 0x62, 0xcd, 0x7d, 0x63, + 0xd4, 0x59, 0xae, 0x13, 0x03, 0x3b, 0xe9, 0x82, + 0xce, 0x19, 0xf6, 0xd9, 0x27, 0x1b, 0x21, 0xbd, + 0x5e, 0x14, 0x75, 0xfe, 0xc1, 0x08, 0x19, 0x74, + 0xba, 0x97, 0x6f, 0x0e, 0x91, 0xba, 0x8f, 0x9c, + 0x23, 0x36, 0x26, 0x72, 0x77, 0x5a, 0x0a, 0xc5, + 0x57, 0x7f, 0x21, 0xd9, 0xc9, 0x1f, 0x50, 0x4b, + 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x67, 0x65, 0x43, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x0a, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, + 0x2f, 0xfa, 0x14, 0x1e, 0x87, 0xda, 0xd5, 0x01, + 0x2f, 0xfa, 0x14, 0x1e, 0x87, 0xda, 0xd5, 0x01, + 0x60, 0x84, 0xa0, 0xa6, 0x79, 0x74, 0xd5, 0x01, + 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, + 0xe6, 0x17, 0xe1, 0x9e, 0x2a, 0x03, 0x00, 0x00, + 0x56, 0x26, 0x00, 0x00, 0x11, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x43, + 0x34, 0x33, 0x30, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, + 0xff, 0xd2, 0x01, 0x1c, 0xb5, 0xcc, 0x01, 0x2b, + 0x75, 0xd5, 0x01, 0xa0, 0x91, 0xa3, 0xa6, 0x79, + 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0xd8, 0xa3, 0x73, 0xc1, 0x73, + 0x0d, 0x00, 0x00, 0x3d, 0x6a, 0x00, 0x00, 0x14, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x7f, 0x03, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, + 0x01, 0x3a, 0x7a, 0xd1, 0x01, 0x2b, 0x75, 0xd5, + 0x01, 0xa0, 0x91, 0xa3, 0xa6, 0x79, 0x74, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, + 0x4a, 0x5a, 0x51, 0x84, 0xf7, 0x9b, 0x05, 0x00, + 0x00, 0x19, 0x66, 0x00, 0x00, 0x10, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x24, 0x11, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, + 0x31, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, + 0xff, 0xd2, 0x01, 0xfd, 0xdc, 0xd3, 0x01, 0x2b, + 0x75, 0xd5, 0x01, 0xa0, 0x91, 0xa3, 0xa6, 0x79, + 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0xaf, 0x0c, 0x9a, 0x7f, 0xc5, + 0x06, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x10, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xed, 0x16, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x46, 0x32, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, + 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x22, 0xa3, 0xd8, + 0x01, 0x2b, 0x75, 0xd5, 0x01, 0x40, 0x18, 0xa5, + 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x21, 0x5c, 0x34, + 0xe6, 0x8e, 0x0a, 0x00, 0x00, 0x85, 0x78, 0x00, + 0x00, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xe0, + 0x1d, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x46, 0x34, 0x78, 0x78, 0x2e, + 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, + 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0xaa, + 0x64, 0xdd, 0x01, 0x2b, 0x75, 0xd5, 0x01, 0x40, + 0x18, 0xa5, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, + 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x80, + 0xc8, 0x27, 0x44, 0x01, 0x02, 0x00, 0x00, 0xad, + 0x09, 0x00, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x9c, 0x28, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x35, 0x31, + 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, 0xff, + 0xd2, 0x01, 0x59, 0xc9, 0xdf, 0x01, 0x2b, 0x75, + 0xd5, 0x01, 0x80, 0x25, 0xa8, 0xa6, 0x79, 0x74, + 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, + 0xf2, 0x4a, 0xd6, 0xa1, 0x4b, 0x3c, 0x55, 0x03, + 0x00, 0x00, 0xd2, 0x32, 0x00, 0x00, 0x11, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0xcc, 0x2a, 0x00, 0x00, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x46, 0x35, 0x32, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, + 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x45, 0x8c, 0xe4, + 0x01, 0x2b, 0x75, 0xd5, 0x01, 0x80, 0x25, 0xa8, + 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xfb, 0x1e, 0x09, + 0x61, 0xa8, 0x03, 0x00, 0x00, 0x08, 0x3b, 0x00, + 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x50, + 0x2e, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x46, 0x35, 0x33, 0x78, 0x78, + 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, + 0x00, 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, + 0xc8, 0x4f, 0xe9, 0x01, 0x2b, 0x75, 0xd5, 0x01, + 0x20, 0xac, 0xa9, 0xa6, 0x79, 0x74, 0xd5, 0x01, + 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, + 0x6f, 0x98, 0x01, 0xd9, 0xa6, 0x02, 0x00, 0x00, + 0xf4, 0x13, 0x00, 0x00, 0x11, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x27, 0x32, 0x00, 0x00, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x35, + 0x34, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, + 0xff, 0xd2, 0x01, 0x72, 0x15, 0xee, 0x01, 0x2b, + 0x75, 0xd5, 0x01, 0x20, 0xac, 0xa9, 0xa6, 0x79, + 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0xbc, 0xd5, 0x41, 0x97, 0x7d, + 0x03, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x11, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x34, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x46, 0x35, 0x35, 0x78, 0x78, 0x2e, 0x78, + 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, + 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x72, 0x76, + 0xf0, 0x01, 0x2b, 0x75, 0xd5, 0x01, 0x60, 0xb9, + 0xac, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, + 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x50, 0xfa, + 0x80, 0x2f, 0xe3, 0x02, 0x00, 0x00, 0xb7, 0x1f, + 0x00, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xa8, 0x38, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x46, 0x36, 0x34, 0x78, + 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, + 0x01, 0x27, 0x3b, 0xf5, 0x01, 0x2b, 0x75, 0xd5, + 0x01, 0x60, 0xb9, 0xac, 0xa6, 0x79, 0x74, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, + 0x4a, 0x24, 0x0b, 0x08, 0x99, 0x46, 0x04, 0x00, + 0x00, 0xae, 0x31, 0x00, 0x00, 0x11, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0xba, 0x3b, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, + 0x36, 0x36, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, + 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, + 0xbd, 0xff, 0xd2, 0x01, 0x35, 0x9e, 0xf7, 0x01, + 0x2b, 0x75, 0xd5, 0x01, 0x60, 0xb9, 0xac, 0xa6, + 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, + 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x7d, 0x68, 0xf2, 0x4a, 0x3d, 0xa7, 0xa8, 0xbf, + 0x50, 0x06, 0x00, 0x00, 0x36, 0x57, 0x00, 0x00, + 0x11, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2f, 0x40, + 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x46, 0x36, 0x37, 0x78, 0x78, 0x2e, + 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, + 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0xa4, + 0x62, 0xfc, 0x01, 0x2b, 0x75, 0xd5, 0x01, 0xa0, + 0xc6, 0xaf, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, + 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x42, + 0xa7, 0xf8, 0xd0, 0xec, 0x01, 0x00, 0x00, 0x6c, + 0x08, 0x00, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0xae, 0x46, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, 0x47, 0x36, + 0x36, 0x78, 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, + 0xff, 0xd2, 0x01, 0x14, 0x26, 0x01, 0x02, 0x2b, + 0x75, 0xd5, 0x01, 0xa0, 0xc6, 0xaf, 0xa6, 0x79, + 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0x5e, 0x32, 0x91, 0xdd, 0x61, + 0x04, 0x00, 0x00, 0x64, 0x14, 0x00, 0x00, 0x11, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xca, 0x48, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x46, 0x52, 0x32, 0x78, 0x78, 0x2e, 0x78, + 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, + 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x78, 0x89, + 0x03, 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x40, 0x4d, + 0xb1, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, + 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x55, 0x45, 0x2c, 0x4b, 0x18, 0x9d, + 0x33, 0x7f, 0xbe, 0x05, 0x00, 0x00, 0xa9, 0x29, + 0x00, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x5a, 0x4d, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x46, 0x52, 0x34, 0x78, + 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x00, 0x45, 0x0e, 0xb7, 0x9a, 0x2b, 0xd3, + 0x01, 0x87, 0xeb, 0x05, 0x02, 0x2b, 0x75, 0xd5, + 0x01, 0x40, 0x4d, 0xb1, 0xa6, 0x79, 0x74, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, + 0x4a, 0xd6, 0x2f, 0xa2, 0x38, 0x99, 0x03, 0x00, + 0x00, 0x05, 0x20, 0x00, 0x00, 0x12, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x47, 0x53, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, + 0x52, 0x35, 0x37, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, + 0xef, 0xbd, 0xff, 0xd2, 0x01, 0xf8, 0xae, 0x0a, + 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x40, 0x4d, 0xb1, + 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x67, 0x65, 0x43, 0x50, 0xbe, 0x6f, 0x16, + 0x2d, 0xc4, 0x0b, 0x00, 0x00, 0xb7, 0x8e, 0x00, + 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, + 0x57, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x46, 0x52, 0x36, 0x39, 0x78, + 0x78, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x2f, 0xfa, 0x14, 0x1e, 0x87, 0xda, 0xd5, + 0x01, 0x2f, 0xfa, 0x14, 0x1e, 0x87, 0xda, 0xd5, + 0x01, 0x80, 0x5a, 0xb4, 0xa6, 0x79, 0x74, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, + 0x4a, 0xd6, 0x5e, 0x9e, 0x5b, 0xf9, 0x03, 0x00, + 0x00, 0x0a, 0x12, 0x00, 0x00, 0x12, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x04, 0x63, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x46, + 0x52, 0x4c, 0x31, 0x35, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, + 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x0b, 0xd7, 0x11, + 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x20, 0xe1, 0xb5, + 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x2e, 0xe0, 0x4d, + 0x67, 0x28, 0x03, 0x00, 0x00, 0x8c, 0x0d, 0x00, + 0x00, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2d, + 0x67, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4c, 0x30, 0x39, 0x32, 0x2e, + 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, + 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x33, + 0x9b, 0x16, 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x20, + 0xe1, 0xb5, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, + 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x1e, + 0xea, 0x11, 0x71, 0x16, 0x02, 0x00, 0x00, 0xa4, + 0x12, 0x00, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x83, 0x6a, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x6c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, + 0xff, 0xd2, 0x01, 0xbf, 0x5f, 0x1b, 0x02, 0x2b, + 0x75, 0xd5, 0x01, 0x20, 0xe1, 0xb5, 0xa6, 0x79, + 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0xb3, 0x0e, 0x1a, 0x48, 0x78, + 0x08, 0x00, 0x00, 0x6d, 0x45, 0x00, 0x00, 0x12, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xc9, 0x6c, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x6d, 0x73, 0x70, 0x34, 0x33, 0x30, 0x2e, + 0x78, 0x73, 0x64, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, + 0x0b, 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0xd9, + 0xc0, 0x1d, 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x60, + 0xee, 0xb8, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, + 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0xaa, + 0x87, 0x2b, 0x8c, 0x78, 0x09, 0x00, 0x00, 0xbc, + 0x52, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x71, 0x75, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, + 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, 0x31, 0x35, + 0x33, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x0a, 0x5f, 0x52, 0x9a, 0x79, 0xda, 0xd5, + 0x01, 0x0a, 0x5f, 0x52, 0x9a, 0x79, 0xda, 0xd5, + 0x01, 0x60, 0xee, 0xb8, 0xa6, 0x79, 0x74, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, + 0x50, 0x72, 0x35, 0x2f, 0x6a, 0x77, 0x09, 0x00, + 0x00, 0xbd, 0x52, 0x00, 0x00, 0x18, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x1f, 0x7f, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, + 0x31, 0x35, 0x35, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x0a, 0x5f, 0x52, 0x9a, 0x79, + 0xda, 0xd5, 0x01, 0x0a, 0x5f, 0x52, 0x9a, 0x79, + 0xda, 0xd5, 0x01, 0x00, 0x75, 0xba, 0xa6, 0x79, + 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, + 0x58, 0x43, 0x50, 0xac, 0x02, 0x97, 0xa6, 0x77, + 0x09, 0x00, 0x00, 0xbc, 0x52, 0x00, 0x00, 0x18, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xcc, 0x88, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, + 0x52, 0x32, 0x33, 0x35, 0x33, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x2e, 0x85, 0x52, + 0x9a, 0x79, 0xda, 0xd5, 0x01, 0x2e, 0x85, 0x52, + 0x9a, 0x79, 0xda, 0xd5, 0x01, 0x00, 0x75, 0xba, + 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0xcf, 0x58, 0x43, 0x50, 0xb3, 0x46, 0x9a, + 0x56, 0x76, 0x09, 0x00, 0x00, 0xbd, 0x52, 0x00, + 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x79, + 0x92, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, + 0x30, 0x46, 0x52, 0x32, 0x33, 0x35, 0x35, 0x2e, + 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x2e, + 0x85, 0x52, 0x9a, 0x79, 0xda, 0xd5, 0x01, 0x2e, + 0x85, 0x52, 0x9a, 0x79, 0xda, 0xd5, 0x01, 0x40, + 0x82, 0xbd, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, + 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0x32, + 0x33, 0xda, 0x89, 0x96, 0x09, 0x00, 0x00, 0x82, + 0x53, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x25, 0x9c, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, + 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, 0x34, 0x37, + 0x35, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0xaa, 0x1d, 0x53, 0x9a, 0x79, 0xda, 0xd5, + 0x01, 0xaa, 0x1d, 0x53, 0x9a, 0x79, 0xda, 0xd5, + 0x01, 0x76, 0x48, 0x26, 0x24, 0x09, 0xa9, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, + 0x50, 0xca, 0x61, 0x4b, 0x96, 0x96, 0x09, 0x00, + 0x00, 0x83, 0x53, 0x00, 0x00, 0x18, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0xf1, 0xa5, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, + 0x34, 0x37, 0x36, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0x71, 0x02, 0x54, 0x9a, 0x79, + 0xda, 0xd5, 0x01, 0x71, 0x02, 0x54, 0x9a, 0x79, + 0xda, 0xd5, 0x01, 0xa3, 0x94, 0x26, 0x24, 0x09, + 0xa9, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5d, + 0x65, 0x43, 0x50, 0xab, 0xb9, 0x5f, 0x6e, 0x9b, + 0x09, 0x00, 0x00, 0xb2, 0x55, 0x00, 0x00, 0x18, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xbd, 0xaf, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, + 0x52, 0x32, 0x36, 0x37, 0x32, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0xf1, 0xfa, 0xf9, + 0x13, 0x87, 0xda, 0xd5, 0x01, 0xf1, 0xfa, 0xf9, + 0x13, 0x87, 0xda, 0xd5, 0x01, 0x8b, 0x88, 0xf9, + 0x13, 0x87, 0xda, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x5d, 0x65, 0x43, 0x50, 0xb6, 0x11, 0x0f, + 0x60, 0x9c, 0x09, 0x00, 0x00, 0xb3, 0x55, 0x00, + 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x8e, + 0xb9, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, 0x34, 0x33, + 0x30, 0x46, 0x52, 0x32, 0x36, 0x37, 0x33, 0x2e, + 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x59, + 0x6d, 0xfa, 0x13, 0x87, 0xda, 0xd5, 0x01, 0x59, + 0x6d, 0xfa, 0x13, 0x87, 0xda, 0xd5, 0x01, 0x03, + 0x21, 0xfa, 0x13, 0x87, 0xda, 0xd5, 0x01, 0x50, + 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, 0x50, 0x64, + 0x05, 0x39, 0xcb, 0x96, 0x09, 0x00, 0x00, 0x82, + 0x53, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x60, 0xc3, 0x00, 0x00, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, 0x53, 0x50, + 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, 0x36, 0x37, + 0x35, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0x00, 0x8b, 0x59, 0x55, 0x9a, 0x79, 0xda, 0xd5, + 0x01, 0x8b, 0x59, 0x55, 0x9a, 0x79, 0xda, 0xd5, + 0x01, 0x3f, 0x53, 0x27, 0x24, 0x09, 0xa9, 0xd5, + 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x08, 0x00, 0xcf, 0x58, 0x43, + 0x50, 0x0f, 0xd5, 0x76, 0xe0, 0x96, 0x09, 0x00, + 0x00, 0x83, 0x53, 0x00, 0x00, 0x18, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x2c, 0xcd, 0x00, 0x00, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x46, 0x52, 0x32, + 0x36, 0x37, 0x36, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x00, 0xb0, 0x7f, 0x55, 0x9a, 0x79, + 0xda, 0xd5, 0x01, 0xb0, 0x7f, 0x55, 0x9a, 0x79, + 0xda, 0xd5, 0x01, 0xb1, 0xc5, 0x27, 0x24, 0x09, + 0xa9, 0xd5, 0x01, 0x50, 0x4b, 0x01, 0x02, 0x3f, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7d, + 0x68, 0xf2, 0x4a, 0x53, 0x9d, 0xb0, 0x3f, 0x03, + 0x07, 0x00, 0x00, 0x43, 0x49, 0x00, 0x00, 0x11, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0xf8, 0xd6, 0x00, + 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x70, 0x34, 0x30, 0x31, 0x78, 0x2e, 0x78, + 0x6d, 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, + 0x8c, 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x8e, 0x83, + 0x41, 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x20, 0x16, + 0xc2, 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, + 0x01, 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0x6c, 0x08, + 0x23, 0xa2, 0xa4, 0x01, 0x00, 0x00, 0xd2, 0x05, + 0x00, 0x00, 0x15, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2a, 0xde, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x52, 0x46, 0x34, 0x33, + 0x30, 0x46, 0x35, 0x78, 0x78, 0x2e, 0x78, 0x6d, + 0x6c, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x0b, 0x8c, + 0xef, 0xbd, 0xff, 0xd2, 0x01, 0x53, 0xe5, 0x43, + 0x02, 0x2b, 0x75, 0xd5, 0x01, 0x20, 0x16, 0xc2, + 0xa6, 0x79, 0x74, 0xd5, 0x01, 0x50, 0x4b, 0x01, + 0x02, 0x3f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x7d, 0x68, 0xf2, 0x4a, 0xee, 0xed, 0x38, + 0x0f, 0xd4, 0x02, 0x00, 0x00, 0x58, 0x0a, 0x00, + 0x00, 0x13, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x76, 0x61, 0x72, 0x69, 0x6f, + 0x75, 0x73, 0x2e, 0x78, 0x6d, 0x6c, 0x0a, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x18, 0x00, 0x00, 0x0b, 0x8c, 0xef, 0xbd, 0xff, + 0xd2, 0x01, 0xe2, 0xa8, 0x48, 0x02, 0x2b, 0x75, + 0xd5, 0x01, 0x60, 0x23, 0xc5, 0xa6, 0x79, 0x74, + 0xd5, 0x01, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x34, 0x0e, + 0x00, 0x00, 0x06, 0xe3, 0x00, 0x00, 0x00, 0x00 + }; + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/exportxml.cpp b/DLL430_v3/src/TI/DLL430/DeviceDb/exportxml.cpp new file mode 100644 index 0000000..61c1b66 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/exportxml.cpp @@ -0,0 +1,355 @@ +/* + * Copyright (C) 2011 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. + */ + +#include + +#include "exportxml.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "DeviceInfo.h" +#include "pugixml.hpp" + + +using namespace TI::DLL430; +using namespace DeviceDb; + + +static inline pugi::xml_node addXmlElement(pugi::xml_node parent, const char* name) +{ + return parent.append_child(name); +} + +static inline pugi::xml_node addXmlElement(pugi::xml_node parent, const char* name, const char* value) +{ + pugi::xml_node e = parent.append_child(name); + e.text().set(value); + return e; +} + +static inline pugi::xml_node addXmlElement(pugi::xml_node parent, const char* name, const std::string& value) +{ + return addXmlElement(parent, name, value.c_str()); +} + +template +static pugi::xml_node addXmlElement(pugi::xml_node parent, const char* name, const T& value, decltype(std::hex) base = std::hex) +{ + std::stringstream s; + s << std::boolalpha << std::showbase << base << value; + return addXmlElement(parent, name, s.str()); +} + +static inline pugi::xml_node addXmlElement(pugi::xml_node parent, const char* name, const uint8_t& value, decltype(std::hex) base = std::hex) +{ + return addXmlElement(parent, name, (unsigned)value, base); +} + +static inline pugi::xml_node addXmlElement(pugi::xml_node parent, const char* name, const int8_t& value, decltype(std::hex) base = std::hex) +{ + return addXmlElement(parent, name, (int)value, base); +} + + +void DeviceDb::exportXml(const DeviceMap& deviceMap, const char *filename) +{ +#define MACRO(x) #x, + const char* macroStrings[] = { + MACRO(Zero) + MACRO_LIST + }; +#undef MACRO + static const bool FULL_EXPORT = false; + + pugi::xml_document doc; + auto xmlRoot = addXmlElement(doc, "device-information"); + xmlRoot.append_attribute("version").set_value("1.0"); + + for (const auto& entry : deviceMap) + { + const DeviceInfo& device = entry.second; + + auto xmlDevice = addXmlElement(xmlRoot, "device"); + + addXmlElement(xmlDevice, "description", device.description); + + const IdMask& mask = device.idMask; + const IdCode& value = device.idCode; + + auto xmlIdMask = addXmlElement(xmlDevice, "idMask"); + addXmlElement(xmlIdMask, "version", mask.version); + if (FULL_EXPORT || mask.subversion != 0) addXmlElement(xmlIdMask, "subversion", mask.subversion); + if (FULL_EXPORT || mask.revision != 0) addXmlElement(xmlIdMask, "revision", mask.revision); + if (FULL_EXPORT || mask.maxRevision != 0) addXmlElement(xmlIdMask, "maxRevision", mask.maxRevision); + if (FULL_EXPORT || mask.fab != 0) addXmlElement(xmlIdMask, "fab", mask.fab); + if (FULL_EXPORT || mask.self != 0) addXmlElement(xmlIdMask, "self", mask.self); + if (FULL_EXPORT || mask.config != 0) addXmlElement(xmlIdMask, "config", (int)mask.config); + if (FULL_EXPORT || mask.fuses != 0) addXmlElement(xmlIdMask, "fuses", mask.fuses); + if (FULL_EXPORT || mask.activationKey != 0) addXmlElement(xmlIdMask, "activationKey", mask.activationKey); + + auto xmlIdCode = addXmlElement(xmlDevice, "idCode"); + addXmlElement(xmlIdCode, "version", value.version); + if (FULL_EXPORT || mask.subversion != 0) addXmlElement(xmlIdCode, "subversion", value.subversion); + if (FULL_EXPORT || mask.revision != 0) addXmlElement(xmlIdCode, "revision", value.revision); + if (FULL_EXPORT || mask.maxRevision != 0) addXmlElement(xmlIdCode, "maxRevision", value.maxRevision); + if (FULL_EXPORT || mask.fab != 0) addXmlElement(xmlIdCode, "fab", value.fab); + if (FULL_EXPORT || mask.self != 0) addXmlElement(xmlIdCode, "self", value.self); + if (FULL_EXPORT || mask.config != 0) addXmlElement(xmlIdCode, "config", (int)value.config); + if (FULL_EXPORT || mask.fuses != 0) addXmlElement(xmlIdCode, "fuses", value.fuses); + if (FULL_EXPORT || mask.activationKey != 0) addXmlElement(xmlIdCode, "activationKey", value.activationKey); + + addXmlElement(xmlDevice, "psa", toString(device.psa)); + addXmlElement(xmlDevice, "bits", device.bits, std::dec); + addXmlElement(xmlDevice, "architecture", toString(device.architecture)); + addXmlElement(xmlDevice, "eem", toString(device.eem)); + + auto xmlClockInfo = addXmlElement(xmlDevice, "clockInfo"); + addXmlElement(xmlClockInfo, "clockControl", toString(device.clockInfo.clockControl)); + + int idx = 16; + + auto xmlEemClocks = addXmlElement(xmlClockInfo, "eemClocks"); + for (const auto& clock : device.clockInfo.eemClocks) + { + if (!clock.empty()) + { + addXmlElement(xmlEemClocks, "eemClock", clock).append_attribute("index").set_value(idx -16); + } + ++idx; + } + + idx = 16; + auto xmlEemTimers = addXmlElement(xmlClockInfo, "eemTimers"); + for (const auto& timer : device.clockInfo.eemTimers) + { + if (FULL_EXPORT || !timer.name.empty()) + { + auto eemTimer = addXmlElement(xmlEemTimers, "eemTimer"); + eemTimer.append_attribute("index").set_value(idx); + addXmlElement(eemTimer, "name", timer.name); + addXmlElement(eemTimer, "value", timer.value); + const bool defaultStop = (device.clockInfo.mclkCntrl0 & (1 << (32 - idx))) != 0; + if (FULL_EXPORT || defaultStop) addXmlElement(eemTimer, "defaultStop", defaultStop); + } + ++idx; + } + + auto xmlVoltage = addXmlElement(xmlDevice, "voltageInfo"); + addXmlElement(xmlVoltage, "vccMin", device.voltageInfo.vccMin, std::dec); + addXmlElement(xmlVoltage, "vccMax", device.voltageInfo.vccMax, std::dec); + addXmlElement(xmlVoltage, "vccFlashMin", device.voltageInfo.vccFlashMin, std::dec); + addXmlElement(xmlVoltage, "vccSecureMin", device.voltageInfo.vccSecureMin, std::dec); + addXmlElement(xmlVoltage, "vppSecureMin", device.voltageInfo.vppSecureMin, std::dec); + addXmlElement(xmlVoltage, "vppSecureMax", device.voltageInfo.vppSecureMax, std::dec); + addXmlElement(xmlVoltage, "testVpp", device.voltageInfo.testVpp, std::dec); + + auto xmlFeatures = addXmlElement(xmlDevice, "features"); + addXmlElement(xmlFeatures, "clockSystem", toString(device.features.clockSystem)); + if (FULL_EXPORT || device.features.lcfe) addXmlElement(xmlFeatures, "lcfe", device.features.lcfe, std::dec); + if (FULL_EXPORT || device.features.quickMemRead) addXmlElement(xmlFeatures, "quickMemRead", device.features.quickMemRead, std::dec); + if (FULL_EXPORT || device.features.i2c) addXmlElement(xmlFeatures, "i2c", device.features.i2c, std::dec); + if (FULL_EXPORT || device.features.stopFllDbg) addXmlElement(xmlFeatures, "stopFllDbg", device.features.stopFllDbg, std::dec); + if (FULL_EXPORT || device.features.hasFram) addXmlElement(xmlFeatures, "hasFram", device.features.hasFram, std::dec); + + auto xmlExtFeatures = addXmlElement(xmlDevice, "extFeatures"); + if (FULL_EXPORT || device.extFeatures.tmr) addXmlElement(xmlExtFeatures, "tmr", device.extFeatures.tmr, std::dec); + if (FULL_EXPORT || device.extFeatures.jtag) addXmlElement(xmlExtFeatures, "jtag", device.extFeatures.jtag, std::dec); + if (FULL_EXPORT || device.extFeatures.dtc) addXmlElement(xmlExtFeatures, "dtc", device.extFeatures.dtc, std::dec); + if (FULL_EXPORT || device.extFeatures.sync) addXmlElement(xmlExtFeatures, "sync", device.extFeatures.sync, std::dec); + if (FULL_EXPORT || device.extFeatures.instr) addXmlElement(xmlExtFeatures, "instr", device.extFeatures.instr, std::dec); + if (FULL_EXPORT || device.extFeatures._1377) addXmlElement(xmlExtFeatures, "_1377", device.extFeatures._1377, std::dec); + if (FULL_EXPORT || device.extFeatures.psach) addXmlElement(xmlExtFeatures, "psach", device.extFeatures.psach, std::dec); + if (FULL_EXPORT || device.extFeatures.eemInaccessibleInLPM) addXmlElement(xmlExtFeatures, "eemInaccessibleInLPM", device.extFeatures.eemInaccessibleInLPM, std::dec); + + auto xmlPower = addXmlElement(xmlDevice, "powerSettings"); + if (FULL_EXPORT || device.powerSettings.testRegMask != 0) + { + addXmlElement(xmlPower, "testRegMask", device.powerSettings.testRegMask); + addXmlElement(xmlPower, "testRegDefault", device.powerSettings.testRegDefault); + addXmlElement(xmlPower, "testRegEnableLpm5", device.powerSettings.testRegEnableLpm5); + addXmlElement(xmlPower, "testRegDisableLpm5", device.powerSettings.testRegDisableLpm5); + } + if (FULL_EXPORT || device.powerSettings.testReg3VMask) + { + addXmlElement(xmlPower, "testReg3VMask", device.powerSettings.testReg3VMask); + addXmlElement(xmlPower, "testReg3VDefault", device.powerSettings.testReg3VDefault); + addXmlElement(xmlPower, "testReg3VEnableLpm5", device.powerSettings.testReg3VEnableLpm5); + addXmlElement(xmlPower, "testReg3VDisableLpm5", device.powerSettings.testReg3VDisableLpm5); + } + + auto xmlMemoryMap = addXmlElement(xmlDevice, "memoryLayout"); + for (const auto& memoryArea : device.memoryLayout) + { + const auto& mem = memoryArea.second; + + auto xmlMemory = addXmlElement(xmlMemoryMap, "memory"); + xmlMemory.append_attribute("name").set_value(memoryArea.first.c_str()); + + addXmlElement(xmlMemory, "type", toString(mem.type)); + + if (FULL_EXPORT || mem.bits != 0) addXmlElement(xmlMemory, "bits", mem.bits, std::dec); + addXmlElement(xmlMemory, "start", mem.start); + addXmlElement(xmlMemory, "size", mem.size); + addXmlElement(xmlMemory, "segmentSize", mem.segmentSize); + addXmlElement(xmlMemory, "banks", mem.banks, std::dec); + addXmlElement(xmlMemory, "mapped", mem.mapped, std::dec); + if (FULL_EXPORT || mem.protectable) addXmlElement(xmlMemory, "protectable", mem.protectable); + + uint64_t mask = 0; + for (const uint8_t m : mem.mask) mask <<= 8, mask |= static_cast(m); + if (FULL_EXPORT || mask != 0) addXmlElement(xmlMemory, "mask", mask); + + if (mem.memoryCreatorPtr) + { + auto xmlAccess = addXmlElement(xmlMemory, "memoryAccess"); + + const auto exportAccess = [&xmlAccess](const std::string& type, bool hasMpu, + uint32_t address, uint16_t bits, uint16_t mask, uint16_t pwd) + { + addXmlElement(xmlAccess, "type", type); + if (FULL_EXPORT || hasMpu) addXmlElement(xmlAccess, "mpu", hasMpu, std::dec); + if (address) + { + auto xmlWriteProt = addXmlElement(xmlAccess, "writeProtection"); + addXmlElement(xmlWriteProt, "address", address); + addXmlElement(xmlWriteProt, "bits", bits); + if (FULL_EXPORT || mask != 0xFFFF) addXmlElement(xmlWriteProt, "mask", mask); + if (FULL_EXPORT || pwd) addXmlElement(xmlWriteProt, "pwd", pwd); + } + }; + + if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "LockableRamMemoryAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "InformationFlashAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "BootcodeRomAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "FlashMemoryAccess2ByteAligned"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "BslFlashAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "BslRomAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "BslRomAccessGR"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "UsbRamAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "RegisterAccess5xx"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "TinyRandomMemoryAccess"); + else if (MemoryCreatorFR* mc = dynamic_cast*>(mem.memoryCreatorPtr.get())) + exportAccess("FramMemoryAccessBase", mc->hasMpu, mc->address, mc->bits, mc->mask, mc->pwd); + else if (MemoryCreatorFR* mc = dynamic_cast*>(mem.memoryCreatorPtr.get())) + exportAccess("FramMemoryAccessFRx9", mc->hasMpu, mc->address, mc->bits, mc->mask, mc->pwd); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "ArmRandomMemoryAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "ArmReadonlyMemroyAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "ArmBslFlashMemoryAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "ArmInfoFlashMemoryAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator432)) addXmlElement(xmlAccess, "type", "ArmFlashMemoryAccess"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator432)) addXmlElement(xmlAccess, "type", "ArmFlashMemoryAccess2M"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "ArmBslFlashMemoryAccess2M"); + else if (typeid(*mem.memoryCreatorPtr) == typeid(MemoryCreator)) addXmlElement(xmlAccess, "type", "ArmInfoFlashMemoryAccess2M"); + else throw std::runtime_error("Unknown memory creator: " + std::string(typeid(*mem.memoryCreatorPtr).name())); + } + } + auto xmlFunctions = addXmlElement(xmlDevice, "functionMap"); + for (const auto& it : device.functionMap) + { + addXmlElement(xmlFunctions, macroStrings[it.first], macroStrings[it.second]); + } + + static const FuncletCode funcletEraseDco = FuncletCode(eraseFuncletCodeDCO, sizeof(eraseFuncletCodeDCO), 4); + static const FuncletCode funcletEraseXDco = FuncletCode(eraseFuncletCodeXDCO, sizeof(eraseFuncletCodeXDCO), 4); + static const FuncletCode funcletEraseFll = FuncletCode(eraseFuncletCodeFLL, sizeof(eraseFuncletCodeFLL), 4); + static const FuncletCode funcletEraseXFll = FuncletCode(eraseFuncletCodeXFLL, sizeof(eraseFuncletCodeXFLL), 4); + static const FuncletCode funcletEraseXv2 = FuncletCode(eraseFuncletCodeXv2, sizeof(eraseFuncletCodeXv2)); + static const FuncletCode funcletEraseXv2Fram = FuncletCode(eraseFuncletCodeXv2FRAM, sizeof(eraseFuncletCodeXv2FRAM)); + static const FuncletCode funcletEraseXv2FR41xx = FuncletCode(eraseFuncletCodeXv2FR41xx, sizeof(eraseFuncletCodeXv2FR41xx)); + + static const FuncletCode funcletWriteDco = FuncletCode(writeFuncletCodeDCO, sizeof(writeFuncletCodeDCO), 128); + static const FuncletCode funcletWriteXDco = FuncletCode(writeFuncletCodeXDCO, sizeof(writeFuncletCodeXDCO), 256); + static const FuncletCode funcletWrite430I = FuncletCode(writeFuncletCode430I, sizeof(writeFuncletCode430I), 128); + static const FuncletCode funcletWriteFll = FuncletCode(writeFuncletCodeFLL, sizeof(writeFuncletCodeFLL), 128); + static const FuncletCode funcletWriteXFll = FuncletCode(writeFuncletCodeXFLL, sizeof(writeFuncletCodeXFLL), 256); + static const FuncletCode funcletWriteXv2 = FuncletCode(writeFuncletCodeXv2, sizeof(writeFuncletCodeXv2)); + static const FuncletCode funcletWriteXv2Fram = FuncletCode(writeFuncletCodeXv2FRAM, sizeof(writeFuncletCodeXv2FRAM)); + static const FuncletCode funcletWriteXv2Word = FuncletCode(writeFuncletCodeXv2WordMode, sizeof(writeFuncletCodeXv2WordMode)); + + static const FuncletCode funcletMSP432P4xx_2M_Funclet = FuncletCode(MSP432P4xx_2M_Funclet, sizeof(MSP432P4xx_2M_Funclet) + 2, 0x4000); + static const FuncletCode funcletMSP432P4xx_PG11_Funclet = FuncletCode(MSP432P4xx_PG11_Funclet, sizeof(MSP432P4xx_PG11_Funclet) + 2, 0x5000); + static const FuncletCode funcletMSP432P4xx_Funclet = FuncletCode(MSP432P4xx_Funclet, sizeof(MSP432P4xx_Funclet) + 2, 0x4000); + + auto xmlFunclets = addXmlElement(xmlDevice, "funcletMap"); + for (const auto& it : device.funcletMap) + { + if (it.first == FuncletCode::ERASE) + { + if (it.second == funcletEraseXv2) addXmlElement(xmlFunclets, "eraseFunclet", "EraseXv2"); + else if (it.second == funcletEraseXv2Fram) addXmlElement(xmlFunclets, "eraseFunclet", "EraseXv2FRAM"); + else if (it.second == funcletEraseDco) addXmlElement(xmlFunclets, "eraseFunclet", "EraseDCO"); + else if (it.second == funcletEraseXDco) addXmlElement(xmlFunclets, "eraseFunclet", "EraseXDCO"); + else if (it.second == funcletEraseFll) addXmlElement(xmlFunclets, "eraseFunclet", "EraseFLL"); + else if (it.second == funcletEraseXFll) addXmlElement(xmlFunclets, "eraseFunclet", "EraseXFLL"); + else if (it.second == funcletEraseXv2FR41xx) addXmlElement(xmlFunclets, "eraseFunclet", "EraseFR41xx"); + else if (it.second == funcletMSP432P4xx_Funclet) addXmlElement(xmlFunclets, "eraseFunclet", "MSP432P4xx_Funclet"); + else if (it.second == funcletMSP432P4xx_2M_Funclet) addXmlElement(xmlFunclets, "eraseFunclet", "MSP432P4xx_2M_Funclet"); + else if (it.second == funcletMSP432P4xx_PG11_Funclet) addXmlElement(xmlFunclets, "eraseFunclet", "MSP432P4xx_PG11_Funclet"); + else throw std::runtime_error("Unknown erase funclet"); + } + if (it.first == FuncletCode::WRITE) + { + if (it.second == funcletWriteXv2) addXmlElement(xmlFunclets, "writeFunclet", "WriteXv2"); + else if (it.second == funcletWriteXv2Fram) addXmlElement(xmlFunclets, "writeFunclet", "WriteXv2FRAM"); + else if (it.second == funcletWriteXv2Word) addXmlElement(xmlFunclets, "writeFunclet", "WriteXv2Word"); + else if (it.second == funcletWriteDco) addXmlElement(xmlFunclets, "writeFunclet", "WriteDCO"); + else if (it.second == funcletWriteXDco) addXmlElement(xmlFunclets, "writeFunclet", "WriteXDCO"); + else if (it.second == funcletWriteFll) addXmlElement(xmlFunclets, "writeFunclet", "WriteFLL"); + else if (it.second == funcletWriteXFll) addXmlElement(xmlFunclets, "writeFunclet", "WriteXFLL"); + else if (it.second == funcletWrite430I) addXmlElement(xmlFunclets, "writeFunclet", "Write430I"); + else if (it.second == funcletMSP432P4xx_Funclet) addXmlElement(xmlFunclets, "eraseFunclet", "MSP432P4xx_Funclet"); + else if (it.second == funcletMSP432P4xx_2M_Funclet) addXmlElement(xmlFunclets, "eraseFunclet", "MSP432P4xx_2M_Funclet"); + else if (it.second == funcletMSP432P4xx_PG11_Funclet) addXmlElement(xmlFunclets, "eraseFunclet", "MSP432P4xx_PG11_Funclet"); + else throw std::runtime_error("Unknown write funclet"); + } + if (it.first == FuncletCode::SECURE) + { + addXmlElement(xmlFunclets, "DapSecure", "MSP432P4xx_DapSecure"); + } + } + } + doc.save_file(filename); +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/exportxml.h b/DLL430_v3/src/TI/DLL430/DeviceDb/exportxml.h new file mode 100644 index 0000000..ddb4840 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/exportxml.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2015 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. + */ + +#pragma once + +#include "Database.h" + +namespace TI { namespace DLL430 { namespace DeviceDb { + + void exportXml(const DeviceMap& deviceMap, const char *filename); + +} //namespace DeviceDb +}//namespace DLL430 +}//namespace TI diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/fromelement.h b/DLL430_v3/src/TI/DLL430/DeviceDb/fromelement.h new file mode 100644 index 0000000..5726cd9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/fromelement.h @@ -0,0 +1,66 @@ +/* +* fromelement.h +* +* Copyright (C) 2015 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. +*/ + +#pragma once + +#include "adapt_enum.h" +#include "readelement.h" +#include "pugixml.hpp" + + +template +typename std::enable_if::value, void>::type +fromElement(const pugi::xml_node e, ElementType& element) +{ + readElement(e, element); +} + +template +typename std::enable_if::value, void>::type +fromElement(const pugi::xml_node e, ElementType& element) +{ + TI::DLL430::fromString(e.text().get(), element); +} + +inline void fromElement(const pugi::xml_node e, std::string& v) { v = e.text().get(); } +inline void fromElement(const pugi::xml_node e, int8_t& v) { v = (int8_t)strtol(e.text().get(), nullptr, 0); } +inline void fromElement(const pugi::xml_node e, int16_t& v) { v = (int16_t)strtol(e.text().get(), nullptr, 0); } +inline void fromElement(const pugi::xml_node e, int32_t& v) { v = strtol(e.text().get(), nullptr, 0); } +inline void fromElement(const pugi::xml_node e, uint8_t& v) { v = (uint8_t)strtoul(e.text().get(), nullptr, 0); } +inline void fromElement(const pugi::xml_node e, uint16_t& v) { v = (uint16_t)strtoul(e.text().get(), nullptr, 0); } +inline void fromElement(const pugi::xml_node e, uint32_t& v) { v = strtoul(e.text().get(), nullptr, 0); } +inline void fromElement(const pugi::xml_node e, float& v) { v = (float)strtod(e.text().get(), nullptr); } +inline void fromElement(const pugi::xml_node e, double& v) { v = strtod(e.text().get(), nullptr); } +inline void fromElement(const pugi::xml_node e, bool& v) { v = !strcmp(e.text().get(), "true"); } diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/fromxml.cpp b/DLL430_v3/src/TI/DLL430/DeviceDb/fromxml.cpp new file mode 100644 index 0000000..4209ee2 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/fromxml.cpp @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2011 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. + */ + +#include + +#include +#include + +#include "fromxml.h" +#include "setmember.h" +#include "readelement.h" + +#include +#include "SpecialMemoryTypes.h" +#include +#include "MpuFRx.h" +#include "WriteProtection.h" +#include "RegisterAccessBase.h" +#include "ArmFlashMemoryAccess.h" +#include "ArmRandomMemoryAccess.h" +#include "ArmSpecialFlashMemoryAccess.h" +#include "ArmReadonlyMemroyAccess.h" +#include "TinyRandomMemoryAccess.h" +#include "../MSP432P4xx_FlashLibFc.h" +#include "../MSP432P4xx_PG11_FlashLibFc.h" +#include "../MSP432P4xx_2M_FlashLibFc.h" +#include "../DAP_LOCK.h" + + +using namespace std; +using namespace TI::DLL430; + + +typedef unordered_map> MacroStrings; +#define MACRO(x) {#x, ID_##x}, +static const MacroStrings macroStrings = { MACRO_LIST }; +#undef MACRO + + +int getIndex(int maxIdx, const pugi::xml_node e) +{ + const pugi::xml_attribute index = e.attribute("index"); + if (index.empty()) + throw runtime_error("missing clock index"); + + const int idx = index.as_int(0xFFFFFFFF); + if (idx >= maxIdx) + throw runtime_error("clock index out of range: " + to_string(idx)); + + return idx; +} + +void fromXml(ClockNames* clocks, const pugi::xml_node e) +{ + if (!strcmp(e.name(), "eemClock")) + { + const int idx = getIndex(static_cast(clocks->size()), e); + (*clocks)[idx] = e.text().get(); + } +} + +void fromXml(ClockMapping* timers, const pugi::xml_node e) +{ + if (!strcmp(e.name(), "eemTimer")) + { + const int idx = getIndex(static_cast(timers->size()), e); + readElement(e, (*timers)[idx]); + } +} + +void fromXml(FunctionMapping* functionMap, const pugi::xml_node e) +{ + const char* name = e.name(); + const char* value = e.text().get(); + + const MacroStrings::const_iterator from = macroStrings.find(name); + const MacroStrings::const_iterator to = macroStrings.find(value); + + if (from == macroStrings.end()) + throw runtime_error(string("invalid hal macro: ") + name); + + if (to == macroStrings.end()) + throw runtime_error(string("invalid hal macro: ") + value); + + (*functionMap)[from->second] = to->second; +} + +void fromXml(FuncletMapping* funcletMap, const pugi::xml_node e) +{ + FuncletCode::Type type = FuncletCode::NONE; + FuncletCode funcletCode; + + const char* name = e.name(); + + if (!strcmp(name, "eraseFunclet")) type = FuncletCode::ERASE; + else if (!strcmp(name, "writeFunclet")) type = FuncletCode::WRITE; + else if (!strcmp(name, "DapSecure")) type = FuncletCode::SECURE; + else throw runtime_error(string("invalid funclet type: ") + name); + + const string txt = e.text().get(); + if (txt == "EraseDCO") funcletCode = FuncletCode(eraseFuncletCodeDCO, sizeof(eraseFuncletCodeDCO), 4); + else if (txt == "EraseXDCO") funcletCode = FuncletCode(eraseFuncletCodeXDCO, sizeof(eraseFuncletCodeXDCO), 4); + else if (txt == "EraseFLL") funcletCode = FuncletCode(eraseFuncletCodeFLL, sizeof(eraseFuncletCodeFLL), 4); + else if (txt == "EraseXFLL") funcletCode = FuncletCode(eraseFuncletCodeXFLL, sizeof(eraseFuncletCodeXFLL), 4); + else if (txt == "EraseXv2") funcletCode = FuncletCode(eraseFuncletCodeXv2, sizeof(eraseFuncletCodeXv2)); + else if (txt == "EraseXv2FRAM") funcletCode = FuncletCode(eraseFuncletCodeXv2FRAM, sizeof(eraseFuncletCodeXv2FRAM)); + else if (txt == "EraseFR41xx") funcletCode = FuncletCode(eraseFuncletCodeXv2FR41xx, sizeof(eraseFuncletCodeXv2FR41xx)); + else if (txt == "WriteDCO") funcletCode = FuncletCode(writeFuncletCodeDCO, sizeof(writeFuncletCodeDCO), 128); + else if (txt == "WriteXDCO") funcletCode = FuncletCode(writeFuncletCodeXDCO, sizeof(writeFuncletCodeXDCO), 256); + else if (txt == "Write430I") funcletCode = FuncletCode(writeFuncletCode430I, sizeof(writeFuncletCode430I), 128); + else if (txt == "WriteFLL") funcletCode = FuncletCode(writeFuncletCodeFLL, sizeof(writeFuncletCodeFLL), 128); + else if (txt == "WriteXFLL") funcletCode = FuncletCode(writeFuncletCodeXFLL, sizeof(writeFuncletCodeXFLL), 256); + else if (txt == "WriteXv2") funcletCode = FuncletCode(writeFuncletCodeXv2, sizeof(writeFuncletCodeXv2)); + else if (txt == "WriteXv2FRAM") funcletCode = FuncletCode(writeFuncletCodeXv2FRAM, sizeof(writeFuncletCodeXv2FRAM)); + else if (txt == "WriteXv2Word") funcletCode = FuncletCode(writeFuncletCodeXv2WordMode, sizeof(writeFuncletCodeXv2WordMode)); + else if (txt == "MSP432P4xx_Funclet") funcletCode = FuncletCode(MSP432P4xx_Funclet, sizeof(MSP432P4xx_Funclet) + 2, 0x4000); + else if (txt == "MSP432P4xx_2M_Funclet") funcletCode = FuncletCode(MSP432P4xx_2M_Funclet, sizeof(MSP432P4xx_2M_Funclet) + 2, 0x4000); + else if (txt == "MSP432P4xx_PG11_Funclet") funcletCode = FuncletCode(MSP432P4xx_PG11_Funclet, sizeof(MSP432P4xx_PG11_Funclet) + 2, 0x5000); + else if (txt == "MSP432P4xx_DapSecure") funcletCode = FuncletCode(DAP_LOCK, sizeof(DAP_LOCK) + 2); + else throw runtime_error("invalid funclet: " + txt); + + (*funcletMap)[type] = funcletCode; +} + +void fromXml(MemoryInfo* memory, const pugi::xml_node e) +{ + const char* name = e.name(); + + if (!strcmp(name, "mask")) + { + uint64_t mask = stoull(e.text().get(), 0, 16); + memory->mask.resize(6); + for (int i = 5; i >= 0; --i) + { + memory->mask[i] = (mask & 0xFF); + mask >>= 8; + } + } + else if (!strcmp(name, "memoryAccess")) + { + MemoryAccess access; + readElement(e, access); + + if (access.type == "LockableRamMemoryAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "BootcodeRomAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "InformationFlashAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "FlashMemoryAccess2ByteAligned") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "BslFlashAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "BslRomAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "BslRomAccessGR") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "RegisterAccess5xx") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "TinyRandomMemoryAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "UsbRamAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "FramMemoryAccessFRx9") memory->memoryCreatorPtr = make_shared>(access); + else if (access.type == "FramMemoryAccessBase") memory->memoryCreatorPtr = make_shared>(access); + else if (access.type == "ArmFlashMemoryAccess") memory->memoryCreatorPtr = make_shared>(access); + else if (access.type == "ArmRandomMemoryAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "ArmReadonlyMemroyAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "ArmBslFlashMemoryAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "ArmInfoFlashMemoryAccess") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "ArmFlashMemoryAccess2M") memory->memoryCreatorPtr = make_shared>(access); + else if (access.type == "ArmBslFlashMemoryAccess2M") memory->memoryCreatorPtr = make_shared>(); + else if (access.type == "ArmInfoFlashMemoryAccess2M") memory->memoryCreatorPtr = make_shared>(); + else throw runtime_error("invalid memory access class: " + access.type); + } + else setMember(*memory, e); +} + +void fromXml(MemoryLayout* memoryMap, const pugi::xml_node e) +{ + if (!strcmp(e.name(), "memory")) + { + const char* const memName = e.attribute("name").value(); + if (!memName[0]) + throw runtime_error("missing memory name"); + + MemoryInfo memory; + readElement(e, memory); + fromString(memName, memory.name); + + (*memoryMap)[memName] = memory; + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/fromxml.h b/DLL430_v3/src/TI/DLL430/DeviceDb/fromxml.h new file mode 100644 index 0000000..662ea4e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/fromxml.h @@ -0,0 +1,56 @@ +/* +* fromxml.h +* +* Copyright (C) 2015 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. +*/ + +#pragma once + +#include +#include "pugixml.hpp" + + +template +void setMember(StructType& c, pugi::xml_node e); + + +template +void fromXml(T* structure, const pugi::xml_node e) +{ + setMember(*structure, e); +} +void fromXml(TI::DLL430::ClockNames* clocks, const pugi::xml_node e); +void fromXml(TI::DLL430::ClockMapping* timers, const pugi::xml_node e); +void fromXml(TI::DLL430::FunctionMapping* functionMap, const pugi::xml_node e); +void fromXml(TI::DLL430::FuncletMapping* funcletMap, const pugi::xml_node e); +void fromXml(TI::DLL430::MemoryInfo* memory, const pugi::xml_node e); +void fromXml(TI::DLL430::MemoryLayout* memoryMap, const pugi::xml_node e); diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/loadxml.cpp b/DLL430_v3/src/TI/DLL430/DeviceDb/loadxml.cpp new file mode 100644 index 0000000..230927b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/loadxml.cpp @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2011 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. + */ + +#include + +#include + +#include "loadxml.h" +#include "Database.h" +#include "ziparchive.h" +#include "setmember.h" + + +using namespace std; +using namespace TI::DLL430; +using namespace DeviceDb; + + +void checkVersion(const pugi::xml_node root) +{ + static const int VERSION_MIN = 10, VERSION_MAX = 19; + + const string versionString = root.attribute("version").value(); + + if (versionString.empty()) + { + throw runtime_error("'device-information' missing version number"); + } + + const size_t len = versionString.length(); + if (len < 3 || versionString[len - 2] != '.') + { + throw runtime_error("malformed version number (expected 'x.y')"); + } + + const int version = 10 * stoi(versionString.substr(0, len - 2)) + stoi(versionString.substr(len - 1, 1)); + + if (version < VERSION_MIN || version > VERSION_MAX) + { + throw runtime_error("unsupported device-information version '" + versionString + + "' (must be " + to_string(VERSION_MIN / 10) + '.' + to_string(VERSION_MIN % 10) + + " - " + to_string(VERSION_MAX / 10) + '.' + to_string(VERSION_MAX % 10) + ")"); + } +} + + +void readXmlDocument(const pugi::xml_document& doc) +{ + pugi::xml_node root = doc.child("device-information"); + + if (root.empty()) + { + throw runtime_error("wrong root element (expected 'device-information')"); + } + + checkVersion(root); + + DeviceInfo dummyDevice; + MemoryInfo dummyMemory; + + for (pugi::xml_node element : doc.first_child().children()) + { + const string name = element.name(); + + if (name == "eemTimer") + { + readElement(element, dummyDevice.clockInfo.eemTimers[0]); + } + else if (name == "eemTimers") + { + readElement(element, dummyDevice.clockInfo.eemTimers); + } + else if (name == "eemClocks") + { + readElement(element, dummyDevice.clockInfo.eemClocks); + } + else if (name == "memory") + { + readElement(element, dummyMemory); + } + else if (name == "device") + { + DeviceInfo device; + readElement(element, device); + if (device.idCode.version && !device.description.empty()) + { + device.clockInfo.mclkCntrl0 = 0; + for (int i = 0; i < 32; ++i) + { + device.clockInfo.mclkCntrl0 |= device.clockInfo.eemTimers[i].defaultStop << (31 - i); + } + + device.clockInfo.mclkCntrl0 = (device.clockInfo.mclkCntrl0 & 0xFFFF0000) >> 16 | ((device.clockInfo.mclkCntrl0 & 0xFFFF) << 16); + + if (!Database::instance().insert(DeviceMap::value_type(Match({ device.idMask, device.idCode }), device)).second) + { + throw runtime_error("device match already exists"); + } + } + } + else + { + setMember(dummyDevice, element); + } + } +} + + +void XmlLoader::loadImports(const pugi::xml_document& doc) +{ + for (pugi::xml_node imp : doc.first_child().children("import")) + { + if (const pugi::xml_attribute file = imp.attribute("file")) + { + loadFile(file.value()); + } + } +} + + +void XmlLoader::load() +{ + vector files; + archive.getFileList(&files); + + for (const auto& filename : files) + { + loadFile(filename); + } +} + + +void XmlLoader::loadFile(const string& file) +{ + FileState& state = fileStates[file]; + + try + { + if (state == LOADING) + throw runtime_error("cyclic imports detected"); + + if (state == NONE) + { + vector data; + archive.readFile(file, &data); + + pugi::xml_document doc; + const pugi::xml_parse_result result = doc.load_buffer_inplace(data.data(), data.size()); + + if (result.status != pugi::status_ok) + { + throw runtime_error(result.description()); + } + + state = LOADING; + + loadImports(doc); + + readXmlDocument(doc); + + state = LOADED; + } + } + catch (const runtime_error& e) + { + throw runtime_error("In file '" + file + "':\n" + e.what()); + } +} + + +XmlLoader::~XmlLoader() +{ + ElementTableBase::clearTables(); +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/loadxml.h b/DLL430_v3/src/TI/DLL430/DeviceDb/loadxml.h new file mode 100644 index 0000000..43b1cab --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/loadxml.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2011 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. + */ + +#pragma once + +#include "pugixml.hpp" + +namespace TI { namespace DLL430 { namespace DeviceDb { + + class Archive; + + class XmlLoader + { + public: + XmlLoader(const Archive& archive) : archive(archive) {} + ~XmlLoader(); + + void load(); + + private: + void loadFile(const std::string& file); + void loadImports(const pugi::xml_document&); + + enum FileState { NONE, LOADING, LOADED }; + std::map fileStates; + + const Archive& archive; + }; + +} //namespace DeviceDb +}//namespace DLL430 +}//namespace TI diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/readelement.h b/DLL430_v3/src/TI/DLL430/DeviceDb/readelement.h new file mode 100644 index 0000000..bd809af --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/readelement.h @@ -0,0 +1,108 @@ +/* +* readelement.h +* +* Copyright (C) 2015 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. +*/ + +#pragma once + +#include +#include "pugixml.hpp" +#include "fromxml.h" + + +class ElementTableBase +{ +public: + static void clearTables() + { + for (auto& table : tables()) + table->clear(); + } + +protected: + ElementTableBase() { tables().push_back(this); } + virtual ~ElementTableBase() {} + + virtual void clear() = 0; + +private: + static std::vector& tables() { + static std::vector tables_; + return tables_; + } +}; + + +template +class ElementTable : ElementTableBase +{ +public: + const ElementType& getElement(const std::string& id) + { + const auto it = table.find(id); + if (it == table.end()) + throw std::runtime_error("element id not found: '" + id + "' for type " + typeid(ElementType).name()); + + return it->second; + } + + void addElement(const std::string& id, const ElementType& element) + { + if (!table.insert(typename std::unordered_map >::value_type(id, element)).second) + throw std::runtime_error("element id already in use: '" + id + "' for type " + typeid(ElementType).name()); + } + + void clear() OVERRIDE { table.clear(); } + +private: + std::unordered_map> table; +}; + + +template +void readElement(const pugi::xml_node e, ElementType& element) +{ + const char* id = e.attribute("id").as_string(nullptr); + const char* ref = e.attribute("ref").as_string(nullptr); + + static ElementTable table; + element = ref ? table.getElement(ref) : ElementType(); + + for (pugi::xml_node f : e.children()) + { + fromXml(&element, f); + } + + if (id) + table.addElement(id, element); +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/setmember.h b/DLL430_v3/src/TI/DLL430/DeviceDb/setmember.h new file mode 100644 index 0000000..5a0c29a --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/setmember.h @@ -0,0 +1,69 @@ +/* +* setmember.h +* +* Copyright (C) 2015 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. +*/ + +#pragma once + + +#include +#include +#include + +#include "fromelement.h" + + +template +static void setFieldByName(pugi::xml_node, StructType&, std::true_type) {} + + +template +static void setFieldByName(pugi::xml_node xmlElement, StructType& obj, std::false_type) +{ + const char* fieldName = boost::fusion::extension::struct_member_name::call(); + + if (!strcmp(xmlElement.name(), fieldName)) + { + fromElement(xmlElement, boost::fusion::at_c(obj)); + return; + } + + setFieldByName(xmlElement, obj, std::integral_constant::value>()); +} + + +template +void setMember(StructType& c, pugi::xml_node e) +{ + setFieldByName(e, c, std::integral_constant::value>()); +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/ziparchive.cpp b/DLL430_v3/src/TI/DLL430/DeviceDb/ziparchive.cpp new file mode 100644 index 0000000..8ab9dc1 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/ziparchive.cpp @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2011 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. + */ + +#include +#include +#include "ziparchive.h" +#include "devicedb.h" + +using namespace std; +using namespace TI::DLL430; +using namespace DeviceDb; + + +#pragma pack(push, 1) + struct LocalFileHeader + { + uint32_t signature; + uint16_t version; + uint16_t bitFlag; + uint16_t compression; + uint16_t modificationTime; + uint16_t modificationDate; + uint32_t crc; + uint32_t compressedSize; + uint32_t uncompressedSize; + uint16_t fileNameLength; + uint16_t extraFieldLength; + }; + + struct DirectoryFileHeader + { + uint32_t signature; + uint16_t versionMadeBy; + uint16_t versionNeeded; + uint16_t bitFlag; + uint16_t compression; + uint16_t modificationTime; + uint16_t modificationDate; + uint32_t crc; + uint32_t compressedSize; + uint32_t uncompressedSize; + uint16_t fileNameLength; + uint16_t extraFieldLength; + uint16_t fileCommentLength; + uint16_t diskNumberStart; + uint16_t internalFileAttributes; + uint32_t externalFileAttributes; + uint32_t offset; + }; + + struct EndOfDirectory + { + uint32_t signature; + uint16_t diskNumber; + uint16_t directoryStartDisk; + uint16_t entriesOnDisk; + uint16_t totalEntries; + uint32_t directorySize; + uint32_t directoryOffset; + uint16_t commentLength; + }; +#pragma pack(pop) + + +void Archive::open(const string& filename, bool usefile) +{ + useFile = usefile; + + EndOfDirectory endOfDir; + uint8_t * pzip = &g_database[0]; + + if (useFile) + { + file.open(filename, ios::binary | ios::in); + if (!file) + { + throw runtime_error("failed to open archive"); + } + file.seekg(-(int)sizeof(endOfDir), ios::end); + file.read((char*)&endOfDir, sizeof(endOfDir)); + } + else + { + memcpy(&endOfDir, &TI::DLL430::DeviceDb::g_database[sizeof(TI::DLL430::DeviceDb::g_database) - sizeof(endOfDir)], sizeof(endOfDir)); + } + + if (endOfDir.signature != 0x06054b50) + { + throw runtime_error("no file comment allowed"); + } + + if (useFile) + { + file.seekg(endOfDir.directoryOffset, ios::beg); + } + else + { + pzip = pzip + endOfDir.directoryOffset; + } + + DirectoryFileHeader header; + + const uint16_t supportedCompressions[] = {0, 8, 9}; + + for (int i = 0; i < endOfDir.totalEntries; ++i) + { + if (useFile) + { + file.read((char*)&header, sizeof(header)); + } + else + { + memcpy(&header, pzip, sizeof(header)); + pzip = pzip + sizeof(header); + } + + const uint16_t* endComp = end(supportedCompressions); + if (find(begin(supportedCompressions), endComp, header.compression) == endComp) + throw runtime_error("compression type not supported (only deflate/deflate64)"); + + if (header.bitFlag & 0xfff9) + throw runtime_error("unsupported option (encrypted?)"); + + vector name(header.fileNameLength); + if (useFile) + { + file.read(name.data(), name.size()); + } + else + { + memcpy(name.data(), pzip, name.size()); + pzip = pzip + name.size(); + } + if (header.compressedSize > 0) + { + string n(name.data(), name.size()); + size_t pos = n.find_last_of("/") + 1; + directory[n.substr(pos)] = header.offset; + } + if (useFile) + { + file.seekg(header.extraFieldLength + header.fileCommentLength, ios::cur); + } + else + { + pzip = pzip + header.extraFieldLength + header.fileCommentLength; + } + } +} + +void Archive::readFile(const string& filename, vector* dst) const +{ + const auto it = directory.find(filename); + if (it == directory.end()) + throw runtime_error("file does not exist"); + + const uint32_t offset = it->second; + uint8_t * pzip = &g_database[0]; + if (useFile) + { + file.seekg(offset, ios::beg); + } + else + { + pzip = pzip + offset; + } + + LocalFileHeader header; + if (useFile) + { + file.read((char*)&header, sizeof(header)); + } + else + { + memcpy(&header, pzip, sizeof(header)); + pzip = pzip + sizeof(header); + } + + if (useFile) + { + file.seekg(header.fileNameLength + header.extraFieldLength, ios::cur); + } + else + { + dst->resize(header.uncompressedSize); + pzip = pzip + header.fileNameLength + header.extraFieldLength; + } + + if (header.compression != 0) + { + vector compressedData(header.compressedSize); + if (useFile) + { + file.read((char*)compressedData.data(), compressedData.size()); + } + else + { + memcpy(compressedData.data(), pzip, compressedData.size()); + } + size_t uncompressed = tinfl_decompress_mem_to_mem(dst->data(), dst->size(), compressedData.data(), compressedData.size(), 0); + if (uncompressed != header.uncompressedSize) + { + throw runtime_error("error decompressing data"); + } + } + else + { + if (useFile) + { + file.read(dst->data(), dst->size()); + } + else + { + memcpy(dst->data(), pzip, dst->size()); + pzip = pzip + dst->size(); + } + } +} + + +void Archive::getFileList(vector* list) const +{ + for (const auto& it : directory) + { + if (it.first.rfind(".xml") != string::npos) + list->push_back(it.first); + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDb/ziparchive.h b/DLL430_v3/src/TI/DLL430/DeviceDb/ziparchive.h new file mode 100644 index 0000000..abe2de8 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceDb/ziparchive.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2011 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. + */ + +#pragma once + +namespace TI { namespace DLL430 { namespace DeviceDb { + + class Archive + { + public: + Archive(const std::string& filename, bool usefile) { open(filename, usefile); } + + void readFile(const std::string& filename, std::vector* dst) const; + + void getFileList(std::vector* list) const; + + private: + void open(const std::string& filename, bool usefile); + + mutable std::ifstream file; + std::map directory; + bool useFile; + }; + +} //namespace DeviceDb +}//namespace DLL430 +}//namespace TI diff --git a/DLL430_v3/include/DLL430/DeviceDbManager.h b/DLL430_v3/src/TI/DLL430/DeviceDbManager.h similarity index 60% rename from DLL430_v3/include/DLL430/DeviceDbManager.h rename to DLL430_v3/src/TI/DLL430/DeviceDbManager.h index a811724..5188410 100644 --- a/DLL430_v3/include/DLL430/DeviceDbManager.h +++ b/DLL430_v3/src/TI/DLL430/DeviceDbManager.h @@ -1,81 +1,62 @@ /* - * DebugManager.h + * IDebugManager.h * * Interface for classes which provide access to a device DB. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DEVICEDBMANAGER_H -#define DLL430_DEVICEDBMANAGER_H -#include - -#include namespace TI { namespace DLL430 { /** \brief device information unrelated to other managers */ - class DLL430_SYMBOL DeviceDbManager + class DeviceDbManager { public: virtual ~DeviceDbManager () {}; - /** \brief get the name of a device - * - * \param id the device ID - * \return pointer to the name of the device - */ - virtual const char* getEntryName (size_t id) const = 0; - /** \brief the maximum device ID * * \return the highest device ID known */ virtual size_t getMaxId () const = 0; - - /** \brief check if the device has TestVPP - * - * \param id the device ID to check - * \return true if the device has a TestVPP, else false + + /** \brief Write device database to CSV file */ - virtual bool hasTestVpp (size_t id) const = 0; + virtual void dumpDatabase() const = 0; }; - }; -}; - -#endif /* DLL430_DEVICEDBMANAGER_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDbManagerExt.cpp b/DLL430_v3/src/TI/DLL430/DeviceDbManagerExt.cpp deleted file mode 100644 index f9726d5..0000000 --- a/DLL430_v3/src/TI/DLL430/DeviceDbManagerExt.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * DeviceDbManagerExt.cpp - * - * Gives access to TemplateDeviceDb. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "DeviceDbManagerExt.h" - -#include "DeviceInfo.h" -#include "TemplateDeviceDb/Registration.h" -#include "TemplateDeviceDb/Utility.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; - -TemplateDeviceDbManagerExt::TemplateDeviceDbManagerExt () -{ - -} - -TemplateDeviceDbManagerExt::~TemplateDeviceDbManagerExt () -{ -} - -DeviceInfoPtr TemplateDeviceDbManagerExt::queryDb (size_t id) const -{ - DeviceInfoPtr info = TemplateDeviceDb::Registration().GetDeviceInfo(id); - return info; -} - -//converts MSP430_device_idCode to IdCodeImpl -//creates a match -//prepares Registration to point to according device when queryDb (size_t id) is called -size_t TemplateDeviceDbManagerExt::queryDb (const MSP430_device_idCode& idCode) const -{ - using TemplateDeviceDb::Registration; - using TemplateDeviceDb::IdCodeImpl; - - return Registration().FindAndPrepareDevice( - IdCodeImpl( - idCode.verId, idCode.verSubId, - idCode.revisison, idCode.fab, - idCode.self, idCode.config, idCode.fuses, - idCode.activationKey - ) - ); -} - -const char* TemplateDeviceDbManagerExt::getEntryName (size_t id) const -{ - if (id > getMaxId()) - return NULL; - - return TemplateDeviceDb::Registration().GetCurrentDeviceDescription(); -} - -size_t TemplateDeviceDbManagerExt::getMaxId () const -{ - return TemplateDeviceDb::Registration().GetDatabaseSize() - 1; -} - -bool TemplateDeviceDbManagerExt::hasTestVpp (size_t) const -{ - return TemplateDeviceDb::Registration().HasCurrentDeviceVpp(); -} diff --git a/DLL430_v3/src/TI/DLL430/DeviceDbManagerExt.h b/DLL430_v3/src/TI/DLL430/DeviceDbManagerExt.h deleted file mode 100644 index cd774a5..0000000 --- a/DLL430_v3/src/TI/DLL430/DeviceDbManagerExt.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * DebugManager.h - * - * Implementation for accessing TemplateDeviceDb. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_DEVICEDBMANAGEREXT_H -#define DLL430_DEVICEDBMANAGEREXT_H - -#include -#include -#include - -namespace TI -{ - namespace DLL430 - { - //identifier to find devices in DB - struct MSP430_device_idCode { - uint16_t verId; - uint16_t verSubId; - uint8_t revisison; - uint8_t fab; - uint16_t self; - char config; - uint8_t fuses; - uint32_t activationKey; - }; - - class DeviceInfo; - typedef boost::shared_ptr DeviceInfoPtr; - - class TemplateDeviceDbManagerExt : public DeviceDbManager //public DeviceDbManagerExt - { - public: - TemplateDeviceDbManagerExt (); - virtual ~TemplateDeviceDbManagerExt (); - - /** \brief Creates DeviceInfo and returns pointer to it. - * The parameter wouldn't be necessary, but defined by interface. - * - * \param to be compatible to interface you have to give a vaule here, - but it is not evaluated. All necessary steps to get correct device - are done by queryDb (size_t). - * \return pointer to DeviceInfo as SmartPointer - */ - virtual DeviceInfoPtr queryDb (size_t) const; - - /** \brief Prepares templateDeviceDb to point to correct device - * See description of queryDb (size_t id) above - * - * \param idCode to find device with as MSP430_device_idCode - * \return dummy value of '1' which is of no meaning. - */ - virtual size_t queryDb ( const struct MSP430_device_idCode& idCode ) const; - - /** \brief Get device name for database entry - * - * \param id of database entry - * \return name of device - */ - virtual const char* getEntryName (size_t id) const; - - /** \brief Get highest valid database entry - * - * \return max allowed id - */ - virtual size_t getMaxId () const; - - /** \brief Does device have TestVpp - * - * \param id of database entry - * \return true if device has TestVpp - */ - virtual bool hasTestVpp (size_t id) const; - }; - } //namespace DLL430 -} //namespace TI - -#endif /* DLL430_DEVICEDBMANAGEREXT_H */ diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleMSP430.cpp b/DLL430_v3/src/TI/DLL430/DeviceHandleMSP430.cpp new file mode 100644 index 0000000..dce65c4 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceHandleMSP430.cpp @@ -0,0 +1,836 @@ +/* + * DeviceHandleMSP430.cpp + * + * Communication with target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include +#include + +#include "VersionInfo.h" +#include "DeviceHandleMSP430.h" +#include "DeviceDb/Database.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "FetHandle.h" +#include "MemoryManager.h" +#include "CpuRegisters.h" +#include "DebugManagerMSP430.h" +#include "ClockCalibration.h" +#include "EM/EmulationManager/EmulationManager430.h" +#include "EM/SoftwareBreakpoints/ISoftwareBreakpoints.h" +#include "EM/SoftwareBreakpoints/SoftwareBreakpointManager.h" +#include "EM/EemRegisters/EemRegisterAccess430.h" +#include "EM/Exceptions/Exceptions.h" +#include "EemMemoryAccess.h" +#include "JtagId.h" +#include "JtagShifts.h" +#include "FileReader.h" + +#include "../../Bios/include/error_def.h" +#include "../../Bios/include/ConfigureParameters.h" + +using namespace TI::DLL430; + +DeviceHandleMSP430::DeviceHandleMSP430(FetHandle* parent, uint32_t deviceCode) + : parent(parent) + , memoryManager(nullptr) + , debugManager(nullptr) + , clockCalibration(nullptr) + , deviceHasLPMx5(false) + , jtagId(0) + , deviceIdPtr(0) + , eemVersion(0) + , mode(JTAG_IF) + , deviceCode(deviceCode) +{ + etwCodes.fill(0); +} + +DeviceHandleMSP430::~DeviceHandleMSP430 () +{ + setEemRegisterAccess430(0); + SoftwareBreakpointManager::setMemoryAccessFunctions(nullptr, nullptr, nullptr); + + delete memoryManager; + delete debugManager; + delete clockCalibration; +} + + +EmulationManagerPtr DeviceHandleMSP430::getEmulationManager() +{ + if (!emulationManager) + throw EM_NoEmulationManagerException(); + + return this->emulationManager; +} + +MemoryManager* DeviceHandleMSP430::getMemoryManager () +{ + return this->memoryManager; +} + +DebugManagerMSP430* DeviceHandleMSP430::getDebugManager () +{ + return this->debugManager; +} + + +long DeviceHandleMSP430::magicPatternSend(uint16_t ifMode) +{ + uint16_t mode[6] = {0}; + + if (ifMode == AUTOMATIC_IF) + { + mode[0] = SPYBIWIRE_IF; + mode[1] = SPYBIWIRE_IF; + mode[2] = SPYBIWIREJTAG_IF; + mode[3] = SPYBIWIREJTAG_IF; + mode[4] = SPYBIWIRE_MSP_FET_IF; + mode[5] = SPYBIWIRE_MSP_FET_IF; + } + else + { + mode[0] = ifMode; + mode[1] = ifMode; + mode[2] = ifMode; + if (ifMode != SPYBIWIRE_IF) + { + mode[3] = SPYBIWIRE_MSP_FET_IF; + mode[4] = SPYBIWIRE_MSP_FET_IF; + mode[5] = SPYBIWIRE_MSP_FET_IF; + } + else + { + mode[3] = ifMode; + mode[4] = ifMode; + mode[5] = ifMode; + } + } + + for (uint16_t i = 0; i < 6; i++) + { + IConfigManager* cm = parent->getConfigManager(); + + HalExecElement* el = new HalExecElement(ID_MagicPattern); + el->appendInputData16(mode[i]); + + if (mode[i] == SPYBIWIRE_MSP_FET_IF) + { + cm->setJtagMode((INTERFACE_TYPE)SPYBIWIREJTAG_IF); + } + else + { + cm->setJtagMode((INTERFACE_TYPE)mode[i]); + } + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + if (!this->send(cmd)) + { + uint16_t errorCode = el->getOutputAt16(0); + + if (errorCode != HALERR_MAGIC_PATTERN ) + { + return errorCode; + } + } + const uint8_t chainLen = el->getOutputAt8(0); + const uint8_t iJtagID = el->getOutputAt8(1); + + if ((chainLen > 0) && jtagIdIsValid(iJtagID)) + { + return 0; + } + } + return -1; +} + + +int32_t DeviceHandleMSP430::identifyDevice (uint32_t activationKey, bool afterMagicPattern) +{ + const bool assertBSLValid = (activationKey == 0x20404020); + + sendDeviceConfiguration(CONFIG_PARAM_CLK_CONTROL_TYPE, GccNone); + sendDeviceConfiguration(CONFIG_PARAM_SFLLDEH, 0); + sendDeviceConfiguration(CONFIG_PARAM_DEFAULT_CLK_CONTROL, 0x040f); + sendDeviceConfiguration(CONFIG_PARAM_ENHANCED_PSA, static_cast(PsaType::Regular)); + sendDeviceConfiguration(CONFIG_PARAM_PSA_TCKL_HIGH, 0); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_MASK, 0x0000); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_MASK, 0x0000); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_DEFAULT, 0); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_DEFAULT, 0); + sendDeviceConfiguration(CONFIG_ALT_ROM_ADDR_FOR_CPU_READ, 0); + sendDeviceConfiguration(CONFIG_ASSERT_BSL_VALID_BIT, (assertBSLValid ? 1 : 0)); + + if (this->getWatchdogControl()) + { + sendDeviceConfiguration(CONFIG_WDT_ADDRESS_5XX, this->getWatchdogControl()->getAddress()); + } + + if (this->isJtagFuseBlown()) + { + return -5555; + } + + long devId = -1; + uint32_t pc = 0; + uint32_t sr = 0; + + if (jtagIdIsValid(this->getJtagId())) + { + devId = this->getDeviceIdentity(activationKey, &pc, &sr, afterMagicPattern); + } + if (devId < 0) + { + return static_cast(devId); + } + this->setDeviceId(devId); + IMemoryManager* mm = this->getMemoryManager(); + if (mm) + { + CpuRegisters* cpu = mm->getCpuRegisters(); + if (cpu) + { + cpu->write(0, pc); + cpu->write(2, sr); + cpu->fillCache(0, 16); + } + if (MemoryArea* tinyRam = mm ? mm->getMemoryArea(MemoryArea::TinyRam) : nullptr) + { + tinyRam->fillCache(); + } + } + return static_cast(devId); +} + +const std::string & DeviceHandleMSP430::getDescription()const +{ + return deviceInfo.description; +} + +bool DeviceHandleMSP430::restoreTinyRam() +{ + MemoryManager* mm = this->getMemoryManager(); + if (mm == nullptr) + return false; + if (MemoryArea* tinyRam = mm ? mm->getMemoryArea(MemoryArea::TinyRam) : nullptr) + { + tinyRam->flushCache(); + } + return true; +} + +// reset moved from IConfigManager to Device +bool DeviceHandleMSP430::reset (bool hardReset) +{ + std::shared_ptr wdt = this->getWatchdogControl(); + + MemoryManager* mm = this->getMemoryManager(); + if (mm == nullptr) + { + return false; + } + + restoreTinyRam(); + + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(this->checkHalId(ID_SyncJtag_AssertPor_SaveContext)); + + wdt->addHoldParamsTo(el); + + el->appendInputData8(this->getJtagId()); + + for (int i = 0; i < nrUsedClockModules; i++) + { + el->appendInputData8(etwCodes[i]); + } + + cmd.elements.emplace_back(el); + if (!this->parent->getControl()->send(cmd)) + return false; + + uint16_t wdtCtrl = el->getOutputAt16(0); + if (!WatchdogControl::checkRead(wdtCtrl)) + { + return false; + } + + wdt->set(wdtCtrl); + + if ( CpuRegisters* cpu = mm->getCpuRegisters() ) + { + cpu->write(0, el->getOutputAt32(2)); + cpu->write(2, el->getOutputAt16(6)); + cpu->fillCache(0, 16); + } + if (MemoryArea* tinyRam = mm ? mm->getMemoryArea(MemoryArea::TinyRam) : nullptr) + { + tinyRam->fillCache(); + } + return true; +} + +int32_t DeviceHandleMSP430::setDeviceId (long id) +{ + const DeviceInfo* devInfo = DeviceDb::Database().getDeviceInfo(id); + if (devInfo) + { + this->configure(*devInfo); + return 0; + } + return -1; +} + + +void DeviceHandleMSP430::configure (const DeviceInfo& info) +{ + using namespace std::placeholders; + + SoftwareBreakpointManager::setMemoryAccessFunctions(nullptr, nullptr, nullptr); + setEemRegisterAccess430(nullptr); + + deviceInfo = info; + + this->deviceHasLPMx5 = (info.powerSettings.testRegMask != 0) || (info.powerSettings.testReg3VMask != 0); + + delete this->memoryManager; + this->memoryManager = new MemoryManager(this, info); + + delete this->debugManager; + this->debugManager = new DebugManagerMSP430(this, info); + + this->emulationManager = EmulationManager430::create(info.eem); + + SoftwareBreakpointManager::setMemoryAccessFunctions( + std::bind(&IMemoryManager::read, memoryManager, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3), + std::bind(&IMemoryManager::overwrite, memoryManager, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3), + std::bind(&IMemoryManager::sync, memoryManager)); + + setEemRegisterAccess430( dynamic_cast(memoryManager->getMemoryArea(MemoryArea::Eem)) ); + + const IConfigManager* configManager = parent->getConfigManager(); + this->clockCalibration = ClockCalibration::create(this, memoryManager, configManager, info.features.clockSystem); + + // If frequency calibration is disabled, remap funclets to FLL versions (those won't change any settings) + + const ClockMapping& clockMapping = info.clockInfo.eemTimers; + assert(nrUsedClockModules <= clockMapping.size()); + + for (uint32_t i = 0; i < nrUsedClockModules/2; ++i) + { + etwCodes[(nrUsedClockModules/2) - (i + 1)] = clockMapping[i].value; + etwCodes[(nrUsedClockModules) - (i + 1)] = clockMapping[i+16].value; + } + + sendDeviceConfiguration(CONFIG_PARAM_CLK_CONTROL_TYPE, info.clockInfo.clockControl); + sendDeviceConfiguration(CONFIG_PARAM_SFLLDEH, info.features.stopFllDbg); + sendDeviceConfiguration(CONFIG_PARAM_DEFAULT_CLK_CONTROL, info.clockInfo.mclkCntrl0); + sendDeviceConfiguration(CONFIG_PARAM_ENHANCED_PSA, static_cast(info.psa)); + + if (this->getJtagId() == 0x89) + { + sendDeviceConfiguration(CONFIG_PARAM_PSA_TCKL_HIGH, info.extFeatures.psach); + } + else + { + sendDeviceConfiguration(CONFIG_PARAM_PSA_TCKL_HIGH, 2); + } + + // Set power settings + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_MASK, info.powerSettings.testRegMask); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_DEFAULT, info.powerSettings.testRegDefault); + sendDeviceConfiguration(CONFIG_PARAM_TESTREG_ENABLE_LPMX5, info.powerSettings.testRegEnableLpm5); + sendDeviceConfiguration(CONFIG_PARAM_TESTREG_DISABLE_LPMX5, info.powerSettings.testRegDisableLpm5); + + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_MASK, info.powerSettings.testReg3VMask); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_DEFAULT, info.powerSettings.testReg3VDefault); + sendDeviceConfiguration(CONFIG_PARAM_TESTREG3V_ENABLE_LPMX5, info.powerSettings.testReg3VEnableLpm5); + sendDeviceConfiguration(CONFIG_PARAM_TESTREG3V_DISABLE_LPMX5, info.powerSettings.testReg3VDisableLpm5); + + sendDeviceConfiguration(CONFIG_ALT_ROM_ADDR_FOR_CPU_READ, info.extFeatures._1377 ? 1 : 0); +} + +bool DeviceHandleMSP430::sendDeviceConfiguration(uint32_t parameter, uint32_t value) +{ + HalExecElement* el = new HalExecElement(ID_Configure); + el->appendInputData32(parameter); + el->appendInputData32(value); + + HalExecCommand configCmd; + configCmd.elements.emplace_back(el); + + return this->send(configCmd); +} + +long DeviceHandleMSP430::getDeviceIdentity(uint32_t activationKey, uint32_t* pc, uint32_t* sr, bool afterMagicPattern) +{ + const bool isXv2 = (jtagIdIsXv2(jtagId) != 0); + + HalExecCommand syncCmd; + syncCmd.setTimeout(5000); + + hal_id syncMacro = isXv2 ? ID_SyncJtag_AssertPor_SaveContextXv2 : ID_SyncJtag_AssertPor_SaveContext; + if (isXv2 && afterMagicPattern && (jtagId != 0x99)) + { + syncMacro = ID_SyncJtag_Conditional_SaveContextXv2; + } + + HalExecElement* elSync = new HalExecElement(syncMacro); + + std::shared_ptr wdt = this->getWatchdogControl(); + wdt->addHoldParamsTo(elSync); + + elSync->appendInputData8(this->getJtagId()); + + for (int i = 0; i < nrUsedClockModules; i++) + { + elSync->appendInputData8(etwCodes[i]); + } + syncCmd.elements.emplace_back(elSync); + + HalExecElement* elDeviceIdPtr = new HalExecElement(ID_GetDeviceIdPtr); + syncCmd.elements.emplace_back(elDeviceIdPtr); + + if (!this->send(syncCmd)) + { + return -1; + } + + uint16_t wdtCtrl = elSync->getOutputAt16(0); + // check read watchdog password + if (!WatchdogControl::checkRead(wdtCtrl)) + { + return -1; + } + wdt->set(wdtCtrl); + + if (syncMacro != ID_SyncJtag_Conditional_SaveContextXv2) + { + *pc = elSync->getOutputAt32(2); + *sr = elSync->getOutputAt16(6); + } + else + { + HalExecElement* elReset = new HalExecElement(ID_ReadMemWordsXv2); + elReset->appendInputData32(0xFFFE); + elReset->appendInputData32(1); + + HalExecCommand readReset; + readReset.elements.emplace_back(elReset); + if (!this->send(readReset)) + { + return -1; + } + + *pc = elReset->getOutputAt16(0); + *sr = 0; + } + + this->deviceIdPtr = elDeviceIdPtr->getOutputAt32(0); + + IdCode idCode; + if (!isXv2) + { + const uint32_t idDataAddr = elDeviceIdPtr->getOutputAt32(4); + if (idDataAddr == 0) + { + return -1; + } + + HalExecElement* elId = new HalExecElement(ID_ReadMemWords); + elId->appendInputData32(idDataAddr); + elId->appendInputData32(8); + + HalExecCommand devIdCmd; + devIdCmd.elements.emplace_back(elId); + + HalExecElement* elFuses = new HalExecElement(ID_GetFuses); + + devIdCmd.elements.emplace_back(elFuses); + + if (!this->send(devIdCmd)) + { + return -1; + } + idCode.version = elId->getOutputAt16(0); + idCode.subversion = 0x0000; + idCode.revision = elId->getOutputAt8(2); + idCode.fab = elId->getOutputAt8(3); + idCode.self = elId->getOutputAt16(4); + idCode.config = (char)(elId->getOutputAt8(13) & 0x7F); + idCode.fuses = elFuses->getOutputAt8(0); + idCode.activationKey = 0; + } + else // must be xv2 CPU device 99, 95, 91 + { + if (this->deviceIdPtr == 0) + { + return -1; + } + + HalExecElement* elId = new HalExecElement(ID_ReadMemQuickXv2); + elId->appendInputData32(this->deviceIdPtr); + elId->appendInputData32(4); + elId->appendInputData32(*pc); + + HalExecCommand devDesc; + devDesc.elements.emplace_back(elId); + if (!this->send(devDesc)) + { + return -1; + } + uint8_t info_len = elId->getOutputAt8(0); + + // get device ID was read out with comand before + idCode.version = (elId->getOutputAt8(5) << 8) + elId->getOutputAt8(4); + + idCode.subversion = 0; + idCode.revision = elId->getOutputAt8(6); // HW Revision + idCode.config = elId->getOutputAt8(7); // SW Revision + + idCode.subversion = 0x0000; // init with zero = no sub id + + /* #TAG_NO_OPEN_SOURCE_START */ + // If device id is not the 5438a one return error. + if ((activationKey == 0x80058005) && (idCode.version != (activationKey >> 16))) + { + return -1; + } + /* #TAG_NO_OPEN_SOURCE_END*/ + + //Sub ID should be everything but not -1 + int16_t SubId= getSubID(info_len, deviceIdPtr, *pc); + if (SubId != -1) + { + idCode.subversion = (uint16_t)SubId; + } + else + { + // in case we have an error during sub id detectin + return -1; + } + HalExecCommand eemv; + HalExecElement* elEem = new HalExecElement(ID_EemDataExchangeXv2); + elEem->appendInputData8(1); + elEem->appendInputData8(0x87); + eemv.elements.emplace_back(elEem); + if (!this->send(eemv)) + { + return -1; + } + eemVersion = elEem->getOutputAt32(0); + + idCode.fab = 0x55; + idCode.self = 0x5555; + + idCode.fuses = 0x55; + idCode.activationKey = activationKey; + } + return DeviceDb::Database().findDevice(idCode); +}; + +int16_t DeviceHandleMSP430::getSubID(uint32_t info_len, uint32_t deviceIdPtr, uint32_t pc) +{ + const int UNDEFINED_00 = 0x00; + if ((info_len > 1)&&(info_len < 11)) + { + int tlv_size=4*((int)pow(2.0, (double)info_len))-2; + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(ID_ReadMemQuickXv2); + el->appendInputData32(deviceIdPtr); + el->appendInputData32(tlv_size/2); + el->appendInputData32(pc); + el->setOutputSize(tlv_size); + + cmd.elements.emplace_back(el); + if (!this->send(cmd)) + { + return -1; + } + + const std::vector& tlv = el->getOutput(); + int pos = 8; + //Must have at least 2 byte data left + while (pos + 3 < tlv_size) + { + const uint8_t tag = tlv[pos++]; + const uint8_t len = tlv[pos++]; + const uint8_t *value = &tlv[pos]; + pos += len; + + const int SUBVERSION_TAG = 0x14; + const int UNDEFINED_FF = 0xFF; + + if (tag == SUBVERSION_TAG) + { + return (value[1]<<8) + value[0]; + } + if ((tag == UNDEFINED_FF) || (tag == UNDEFINED_00) || (tag == SUBVERSION_TAG)) + { + return UNDEFINED_00; + } + } + } + return UNDEFINED_00; +} + +uint32_t DeviceHandleMSP430::getDeviceCode() const +{ + return this->deviceCode; +} + +uint32_t DeviceHandleMSP430::getJtagId() +{ + return this->jtagId; +} + +uint32_t DeviceHandleMSP430::getDeviceIdPtr() +{ + return this->deviceIdPtr; +} + +uint32_t DeviceHandleMSP430::getEemVersion() +{ + return this->eemVersion; +} + +uint32_t DeviceHandleMSP430::readJtagId() +{ + + HalExecElement* el = new HalExecElement(ID_GetJtagId); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + if (!this->send(cmd)) + { + return 0; + } + + uint16_t Id = el->getOutputAt16(0); + +#ifndef NDEBUG + printf("JtagID: %2x\n", Id); +#endif + if (jtagIdIsValid(Id)) + { + uint16_t wdtAddress = jtagIdIsXv2(Id) ? WDT_ADDR_XV2 : WDT_ADDR_CPU; + if (Id == 0x98) + { + wdtAddress = WDT_ADDR_FR41XX; + } + + this->setWatchdogControl( std::make_shared(wdtAddress) ); + this->jtagId = Id; + } + return Id; +}; + +bool DeviceHandleMSP430::isJtagFuseBlown() +{ + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(ID_IsJtagFuseBlown); + cmd.elements.emplace_back(el); + + if (!send(cmd)) + { + return false; + } + if (el->getOutputAt16(0) == 0x5555) // If the fuse is blown, the device will be in JTAG bypass mode, and data + { // input to the device will be echoed with a one-bit delay. + return true; // Fuse is blown. + } + else + { + return false; // Fuse blow error. + } +} + + +bool DeviceHandleMSP430::secure () +{ + HalExecCommand cmd; + HalExecElement* el = nullptr; + if (this->checkHalId(ID_BlowFuse) == ID_DummyMacro) + { + throw SECURE_NOT_SUPPORTED_ERR; + } + else if (this->checkHalId(ID_BlowFuse) == ID_BlowFuse) + { + el = new HalExecElement(this->checkHalId(ID_BlowFuse)); + el->appendInputData8(deviceInfo.voltageInfo.testVpp ? 1: 0); + cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec + cmd.elements.emplace_back(el); + } + else if (this->checkHalId(ID_BlowFuse) == ID_BlowFuseFram) + { + const uint32_t jtagSignatureAddress = (deviceInfo.description.find("RF430FRL15") == 0) ? 0xFFD0 : 0xFF80; + uint8_t lockKey[4] = { 0x55, 0x55, 0x55, 0x55 }; + + if (!memoryManager->write(jtagSignatureAddress, lockKey, 4) || !memoryManager->sync()) + { + return false; + } + + //Trigger BOR via test register + send(JtagShifts(HIL_CMD_JTAG_IR, 0x2A, 8)(HIL_CMD_JTAG_DR, 0x200, 32)); + } + else if (this->checkHalId(ID_BlowFuse) == ID_BlowFuseXv2) + { + if (!(memoryManager->uploadFunclet(FuncletCode::WRITE))) + { + return false; + } + IMemoryManager* mm = this->getMemoryManager(); + MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram, 0); + const FuncletCode& funclet = this->getFunclet(FuncletCode::WRITE); + + const uint32_t type = 0; + const uint32_t lenght =2; // 2 words + const uint16_t flags = 0xA508; + const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); + + el = new HalExecElement(this->checkHalId(ID_BlowFuse)); + cmd.setTimeout(15000); // overwrite 3 sec default with 10 sec + + el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); + el->appendInputData16(static_cast(ram->getSize() & 0xFFFF)); + el->appendInputData16(programStartAddress); + el->appendInputData32(static_cast(0x17FC)); + el->appendInputData32(lenght); + el->appendInputData16(type); + el->appendInputData16(flags); + el->appendInputData16(0); + el->appendInputData16(0); + cmd.elements.emplace_back(el); + } + if (el && !send(cmd)) + { + unsigned short error = el->getOutputAt16(0); + if (error == API_CALL_NOT_SUPPORTED) + throw INTERFACE_SUPPORT_ERR; + + return false; + } + + IConfigManager* cm = parent->getConfigManager(); + cm->setDeviceCode(0); + cm->setPassword(""); + cm->start(); + return this->isJtagFuseBlown(); +} + + +FetControl* DeviceHandleMSP430::getControl () +{ + return parent->getControl(); +} + +bool DeviceHandleMSP430::send (HalExecCommand &command) +{ + return this->parent->getControl()->send(command); +} + +void DeviceHandleMSP430::setWatchdogControl (std::shared_ptr ctrl) +{ + this->wdt = ctrl; +} + +std::shared_ptr DeviceHandleMSP430::getWatchdogControl() const +{ + return this->wdt; +} + +hal_id DeviceHandleMSP430::checkHalId(hal_id base_id) const +{ + const auto it = deviceInfo.functionMap.find(base_id); + return (it != deviceInfo.functionMap.end()) ? it->second : base_id; +} + +const FuncletCode& DeviceHandleMSP430::getFunclet(FuncletCode::Type funclet) +{ + static FuncletCode dummy; + const auto it = deviceInfo.funcletMap.find(funclet); + return (it != deviceInfo.funcletMap.end()) ? it->second : dummy; +} + +bool DeviceHandleMSP430::supportsQuickMemRead() const +{ + return deviceInfo.features.quickMemRead; +} + +uint16_t DeviceHandleMSP430::getMinFlashVcc() const +{ + return deviceInfo.voltageInfo.vccFlashMin; +} + +bool DeviceHandleMSP430::hasFram() const +{ + return deviceInfo.features.hasFram; +} + +bool DeviceHandleMSP430::hasLPMx5() const +{ + return deviceHasLPMx5; +} + +void DeviceHandleMSP430::disableHaltOnWakeup() +{ + sendDeviceConfiguration(CONFIG_PARAM_TESTREG_ENABLE_LPMX5, deviceInfo.powerSettings.testRegDefault); + sendDeviceConfiguration(CONFIG_PARAM_TESTREG3V_ENABLE_LPMX5, deviceInfo.powerSettings.testReg3VDefault); + + sendDeviceConfiguration(CONFIG_PARAM_TESTREG_DISABLE_LPMX5, deviceInfo.powerSettings.testRegDefault); + sendDeviceConfiguration(CONFIG_PARAM_TESTREG3V_DISABLE_LPMX5, deviceInfo.powerSettings.testReg3VDefault); +} + +bool DeviceHandleMSP430::eemAccessibleInLpm() const +{ + const uint32_t eemPollMacro = checkHalId(ID_WaitForEem); + return (eemPollMacro != ID_PollJStateReg) && (eemPollMacro != ID_PollJStateReg20); +} + +bool DeviceHandleMSP430::deviceSupportsEnergyTrace() const +{ + const uint32_t eemPollMacro = checkHalId(ID_WaitForEem); + return (eemPollMacro == ID_PollJStateReg); +} + +TARGET_ARCHITECTURE_t DeviceHandleMSP430::getTargetArchitecture()const +{ + return TARGET_ARCHITECTURE_t::MSP430; +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleMSP430.h b/DLL430_v3/src/TI/DLL430/DeviceHandleMSP430.h new file mode 100644 index 0000000..37199fc --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceHandleMSP430.h @@ -0,0 +1,167 @@ +/* + * DeviceHandleMSP430.h + * + * Communication with target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include +#include +#include + +#include "VersionInfo.h" +#include "DeviceHandleMSP430.h" +#include "DeviceDb/Database.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "FetHandle.h" +#include "MemoryManager.h" +#include "CpuRegisters.h" +#include "DebugManagerMSP430.h" +#include "ClockCalibration.h" +#include "EM/EmulationManager/EmulationManager430.h" +#include "EM/SoftwareBreakpoints/ISoftwareBreakpoints.h" +#include "EM/SoftwareBreakpoints/SoftwareBreakpointManager.h" +#include "EM/EemRegisters/EemRegisterAccess430.h" +#include "EM/Exceptions/Exceptions.h" +#include "EemMemoryAccess.h" +#include "JtagId.h" +#include "JtagShifts.h" +#include "FileReader.h" + +#include "../../Bios/include/error_def.h" +#include "../../Bios/include/ConfigureParameters.h" + +namespace TI +{ + namespace DLL430 + { + class HalCommand; + + class DeviceHandleMSP430 : public IDeviceHandle + { + public: + DeviceHandleMSP430(FetHandle*, uint32_t deviceCode); + ~DeviceHandleMSP430(); + + DeviceHandleMSP430(const DeviceHandleMSP430&) = delete; + DeviceHandleMSP430& operator=(const DeviceHandleMSP430&) = delete; + + EmulationManagerPtr getEmulationManager(); + MemoryManager* getMemoryManager (); + DebugManagerMSP430* getDebugManager (); + FetHandle* getFetHandle () { return parent; } + ClockCalibration* getClockCalibration() { return clockCalibration; } + + /// \brief Run the boot code writing the the specified command in the mailbox first + /// \param command[in] Command to be put in the mailbox + /// \return True if bootcode execution succeeded + long magicPatternSend(uint16_t ifMode); + int32_t identifyDevice(uint32_t activationKey, bool afterMagicPattern); + const std::string& getDescription() const; + bool secure (); + bool reset(bool hardReset); + + FetControl* getControl (); + + bool send (HalExecCommand &command); + + void setWatchdogControl (std::shared_ptr); + std::shared_ptr getWatchdogControl() const; + + uint32_t readJtagId(); + uint32_t getJtagId(); + uint32_t getDeviceIdPtr(); + uint32_t getEemVersion(); + bool isJtagFuseBlown(); + uint32_t getDeviceCode() const; + + int32_t setDeviceId (long id); + + hal_id checkHalId(hal_id base_id) const; + + const FuncletCode& getFunclet(FuncletCode::Type funclet); + + bool supportsQuickMemRead() const; + uint16_t getMinFlashVcc() const; + bool hasFram() const; + bool hasLPMx5() const; + + void disableHaltOnWakeup(); + + bool eemAccessibleInLpm() const; + + bool deviceSupportsEnergyTrace() const; + + TARGET_ARCHITECTURE_t getTargetArchitecture() const; + + INTERFACE_TYPE getInterfaceMode(){ return SPYBIWIREJTAG_IF; } + + bool restoreTinyRam(); + protected: + + private: + FetHandle* parent; + EmulationManagerPtr emulationManager; + MemoryManager* memoryManager; + DebugManagerMSP430* debugManager; + ClockCalibration* clockCalibration; + + DeviceInfo deviceInfo; + bool deviceHasLPMx5; + + uint32_t jtagId; + uint32_t deviceIdPtr; + uint32_t eemVersion; + enum INTERFACE_TYPE mode; + uint32_t deviceCode; + + + std::shared_ptr wdt; + + + typedef std::array EtwCodes; + EtwCodes etwCodes; + + void configure (const DeviceInfo& info); + long getDeviceIdentity(uint32_t activationKey, uint32_t* pc, uint32_t* sr, bool afterMagicPattern); + + bool sendDeviceConfiguration(uint32_t parameter, uint32_t value); + + int16_t getSubID(uint32_t info_len, uint32_t deviceIdPtr, uint32_t pc); + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleManager.cpp b/DLL430_v3/src/TI/DLL430/DeviceHandleManager.cpp new file mode 100644 index 0000000..06f7436 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceHandleManager.cpp @@ -0,0 +1,70 @@ +/* + * DeviceHandleManager.cpp + * + * Handles one or more device handles via JTAG. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "FetHandle.h" +#include "DeviceHandleManager.h" +#include "HalExecCommand.h" + +using namespace TI::DLL430; + +DeviceHandleManager::DeviceHandleManager (FetHandle* parent) + : parent(parent) +{ +} + +IDeviceHandle* DeviceHandleManager::createDeviceHandle(uint32_t deviceCode, INTERFACE_TYPE iMode) +{ + IDeviceHandle* handle = nullptr; + if (deviceCode == 0x432) + { + handle = new DeviceHandleArm(this->parent, deviceCode, iMode); + } + else + { + handle = new DeviceHandleMSP430(this->parent, deviceCode); + } + + handle->readJtagId(); + + return handle; +} + +void DeviceHandleManager::destroyDeviceHandle(IDeviceHandle* handle) +{ + delete handle; +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleManager.h b/DLL430_v3/src/TI/DLL430/DeviceHandleManager.h new file mode 100644 index 0000000..2ed6cf1 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DeviceHandleManager.h @@ -0,0 +1,65 @@ +/* + * DeviceHandleManager.h + * + * Handles one or more device handles via JTAG. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IDeviceHandleManager.h" +#include "DeviceHandleMSP430.h" +#include "MSP432/DeviceHandleArm.h" + +namespace TI +{ + namespace DLL430 + { + class FetHandle; + class IDeviceHandle; + + class DeviceHandleManager : public IDeviceHandleManager + { + public: + explicit DeviceHandleManager (FetHandle*); + + IDeviceHandle* createDeviceHandle(uint32_t deviceCode, INTERFACE_TYPE iMode); + void destroyDeviceHandle(IDeviceHandle* handle); + protected: + + private: + FetHandle* parent; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleManagerV3.cpp b/DLL430_v3/src/TI/DLL430/DeviceHandleManagerV3.cpp deleted file mode 100644 index a913bc4..0000000 --- a/DLL430_v3/src/TI/DLL430/DeviceHandleManagerV3.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * DeviceHandleManagerV3.cpp - * - * Handles one or more device handles via JTAG. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "FetHandleV3.h" -#include "DeviceHandleManagerV3.h" -#include "HalExecCommand.h" -#include - -using namespace TI::DLL430; - -DeviceHandleManagerV3::DeviceHandleManagerV3 (FetHandleV3* parent) - : parent(parent) -{ -} - -DeviceHandleManagerV3::~DeviceHandleManagerV3 () -{ - -} - -DeviceChainInfoList* DeviceHandleManagerV3::getDeviceChainInfo (bool update) -{ - if (update) - { - list.clear(); - } - - if (list.empty()) - { - DeviceChainInfo info0("Device0",0,true,8); - - list.push_back(info0); - } - - return &list; -} - -DeviceHandleV3* DeviceHandleManagerV3::createDeviceHandle (DeviceChainInfoList::iterator& device, uint32_t deviceCode) -{ - DeviceHandleV3* handle = NULL; - uint16_t jtagId; - - if (device->isInUse() || !device->isMSP430()) - { - return NULL; - } - - handle = new DeviceHandleV3(this->parent, &(*device)); - device->setInUse(true); - - jtagId = handle->getDeviceJtagId(); - - return handle; -} - -void DeviceHandleManagerV3::destroyDeviceHandle(DeviceHandle* handle) -{ - if(handle) - { - delete handle; - handle = NULL; - } -} diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleV3.cpp b/DLL430_v3/src/TI/DLL430/DeviceHandleV3.cpp deleted file mode 100644 index 5b00c1b..0000000 --- a/DLL430_v3/src/TI/DLL430/DeviceHandleV3.cpp +++ /dev/null @@ -1,856 +0,0 @@ -/* - * DeviceHandleV3.cpp - * - * Communication with target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include - -#include "DeviceHandleV3.h" -#include "DeviceDbManagerExt.h" -#include "HalExecCommand.h" -#include "FetControl.h" -#include "WatchdogControl.h" -#include "FetHandleV3.h" -#include "MemoryManagerV3.h" -#include "DebugManagerV3.h" -#include "ClockCalibration.h" -#include "EM/EmulationManager/EmulationManager430.h" -#include "EM/EemRegisters/EemRegisterAccess.h" -#include "EM/Exceptions/Exceptions.h" -#include "EemMemoryAccess.h" - -#include "../../Bios/include/ConfigureParameters.h" - -#include - -using namespace TI::DLL430; - -DeviceHandleV3::DeviceHandleV3 (FetHandleV3* parent, DeviceChainInfo* deviceChainInfo) - : parent(parent) - , deviceChainInfo(deviceChainInfo) - , memoryManager(NULL) - , debugManager(NULL) - , fileManager(NULL) - , clockCalibration(NULL) - , minFlashVcc(2700) - , hasTestVpp(false) - , quickMemRead(true) - , deviceHasFram(false) - , clockSystem(BC_1xx) - , jtagId(0) - , deviceIdPtr(0) - , CoreIpId(0) - , IdDataAddr(0) - , eemVersion(0) - , mode(JTAG_MODE_4WIRE) - , myMutex(0) -{ - this->myMutex = parent->getControl()->getMutex(); - - assert(DeviceInfo::nrUsedClockModules == etwCodes.size()); - for (int i=0;iemulationManager; -} - -MemoryManagerV3* DeviceHandleV3::getMemoryManager () -{ - return this->memoryManager; -} - -DebugManagerV3* DeviceHandleV3::getDebugManager () -{ - return this->debugManager; -} - -FileFunc* DeviceHandleV3::getFileRef() -{ - if (fileManager!=NULL) - delete fileManager; - - fileManager=new FileFuncImpl(); - - return (FileFunc*)fileManager; -} - -bool DeviceHandleV3::writeSegments() -{ - if (fileManager==NULL) - return false; - - return fileManager->writeSegs(this); -} - -bool DeviceHandleV3::runBootCode(uint32_t command) -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_StartJtagActivationCode); - - el->appendInputData8(0); // Protocol: 0 - JTAG - el->appendInputData32(command); // Code - el->appendInputData32(100); // Delay ms - - cmd.elements.push_back(el); - - if (!this->send(cmd)) - { - return false; - } - return (this->identifyDevice(0) >= 0); -} - -bool DeviceHandleV3::verifySegments() -{ - if (fileManager==NULL) - return false; - - return fileManager->verifySegs(this,false); -} - -long DeviceHandleV3::magicPatternSend() -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_MagicPattern); - cmd.elements.push_back(el); - - if (!this->send(cmd)) - { - return -1; - } - - //GET Chain Length - uint8_t chainLen= cmd.elements.at(0).getOutputAt8(0); - //Get JTAG ID - uint8_t iJtagID= cmd.elements.at(0).getOutputAt8(1); - - if ((chainLen > 0) && - (iJtagID == 0x91) || // FR57xx - (iJtagID == 0x99)) - { - // Return the protocol - return cmd.elements.at(0).getOutputAt8(2); - } - return -1; -} - -long DeviceHandleV3::identifyDevice (uint32_t activationKey) -{ - sendDeviceConfiguration(CONFIG_PARAM_CLK_CONTROL_TYPE, GccNone); - sendDeviceConfiguration(CONFIG_PARAM_DEFAULT_CLK_CONTROL, 0x040f); - sendDeviceConfiguration(CONFIG_PARAM_ENHANCED_PSA, DeviceInfo::PSATYPE_REGULAR); - sendDeviceConfiguration(CONFIG_PARAM_PSA_TCKL_HIGH, false); - sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_MASK, 0x0000); - sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_MASK, 0x0000); - sendDeviceConfiguration(CONFIG_NO_BSL, 0x0000); - sendDeviceConfiguration(CONFIG_ALT_ROM_ADDR_FOR_CPU_READ, 0); - - if (this->isJtagFuseBlown()) - { - return -5555; - } - - long devId = -1; - uint32_t pc = 0; - uint32_t sr = 0; - - switch (this->getJtagId()) - { - case 0x89: // msp430 cpu - case 0x91: // 5xx - case 0x95: // L092 - case 0x99: - devId = this->getDeviceIdentity(activationKey, &pc, &sr); - break; - } - if (devId < 0) - { - return devId; - } - this->setDeviceId(devId); - MemoryManager* mm = this->getMemoryManager(); - if (mm) - { - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (cpu) - { - cpu->write(0, pc); - cpu->write(2, sr); - cpu->getCacheCtrl()->fill(0, 16); - } - } - return devId; -} - -const std::string & DeviceHandleV3::getDescription() -{ - return description; -} - -// reset moved from ConfigManager to Device -bool DeviceHandleV3::reset () -{ - boost::shared_ptr wdt = this->getWatchdogControl(); - - HalExecCommand cmd; - - HalExecElement* el = new HalExecElement(this->checkHalId(ID_SyncJtag_AssertPor_SaveContext)); - - wdt->addParamsTo(el, true); - - el->appendInputData8(this->getJtagId()); - - for(int i=0;i<16;i++) - { - el->appendInputData8(etwCodes[i]); - } - - el->setOutputSize(8); - cmd.elements.push_back(el); - if (!this->parent->getControl()->send(cmd)) - return false; - - uint16_t wdtCtrl = el->getOutputAt16(0); - if (!WatchdogControl::checkRead(wdtCtrl)) - return false; - - wdt->set(wdtCtrl); - - MemoryManagerV3* mm = this->getMemoryManager(); - if (mm==NULL) - return false; - - if ( MemoryArea* cpu = mm->getMemoryArea("CPU") ) - { - cpu->write(0, el->getOutputAt32(2)); - cpu->write(2, el->getOutputAt16(6)); - cpu->getCacheCtrl()->fill(0, 16); - } - return true; -} - -void DeviceHandleV3::setDeviceId (long id) -{ - TemplateDeviceDbManagerExt dbm; - boost::shared_ptr info = dbm.queryDb(id); - this->configure(info.get()); -} - - -void DeviceHandleV3::configure (const DeviceInfo* info) -{ - boost::mutex::scoped_lock lock(*(this->myMutex)); - - setEemRegisterAccess(0); - - if (this->debugManager) - delete this->debugManager; - - if (this->memoryManager) - delete this->memoryManager; - - this->parent->getControl()->setObjectDbEntry(info->getObjectId()); - this->map = info->getMap(); - - this->funcletTable = info->getFuncletMap(); - - this->minFlashVcc = info->minFlashVcc(); - this->hasTestVpp = info->hasTestVpp(); - this->quickMemRead = info->quickMemRead(); - this->deviceHasFram = info->hasFram(); - this->clockSystem = info->clockSystem(), - - this->description=info->getDescription(); - - this->memoryManager = new MemoryManagerV3(this, info); - this->debugManager = new DebugManagerV3(this, info); - this->emulationManager = EmulationManager430::create(info->getEmulationLevel()); - - setEemRegisterAccess( dynamic_cast(memoryManager->getMemoryArea("EEM")) ); - - const ConfigManager* configManager = parent->getConfigManager(); - this->clockCalibration = ClockCalibration::create(this, memoryManager, configManager, *info); - - // If frequency calibration is disabled, remap funclets to FLL versions (those won't change any settings) - if (configManager && !configManager->freqCalibrationEnabled()) - { - const FuncletCode& erase = funcletTable[FuncletCode::ERASE]; - if ( erase == FuncletCode(eraseFuncletCodeDCO, sizeof(eraseFuncletCodeDCO), 4) ) - { - funcletTable[FuncletCode::ERASE] = FuncletCode( eraseFuncletCodeFLL, sizeof(eraseFuncletCodeFLL), 4 ); - funcletTable[FuncletCode::WRITE] = FuncletCode( writeFuncletCodeFLL, sizeof(writeFuncletCodeFLL), 128 ); - } - else if ( erase == FuncletCode( eraseFuncletCodeXDCO, sizeof(eraseFuncletCodeXDCO), 4 ) ) - { - funcletTable[FuncletCode::ERASE] = FuncletCode( eraseFuncletCodeXFLL, sizeof(eraseFuncletCodeXFLL), 4 ); - funcletTable[FuncletCode::WRITE] = FuncletCode( writeFuncletCodeXFLL, sizeof(writeFuncletCodeXFLL), 256 ); - } - } - - const DeviceInfo::ClockMapping& clockMapping = info->getClockMapping(); - assert(DeviceInfo::nrUsedClockModules <= clockMapping.size()); - - for (uint32_t i=0;igetClockControl()); - sendDeviceConfiguration(CONFIG_PARAM_SFLLDEH,info->getSFll()); - sendDeviceConfiguration(CONFIG_PARAM_DEFAULT_CLK_CONTROL, info->getClockModDefault()); - sendDeviceConfiguration(CONFIG_PARAM_ENHANCED_PSA, info->getPsaType()); - sendDeviceConfiguration(CONFIG_PARAM_PSA_TCKL_HIGH, info->psach()); - - // Set power settings - sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_MASK, info->powerTestRegMask()); - sendDeviceConfiguration(CONFIG_PARAM_TESTREG_ENABLE_LPMX5, info->testRegEnableLpmx5()); - sendDeviceConfiguration(CONFIG_PARAM_TESTREG_DISABLE_LPMX5, info->testRegDisableLpmx5()); - - sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_MASK, info->powerTestReg3VMask()); - sendDeviceConfiguration(CONFIG_PARAM_TESTREG3V_ENABLE_LPMX5, info->testReg3VEnableLpmx5()); - sendDeviceConfiguration(CONFIG_PARAM_TESTREG3V_DISABLE_LPMX5, info->testReg3VDisableLpmx5()); - - sendDeviceConfiguration(CONFIG_NO_BSL, info->noBsl()); - sendDeviceConfiguration(CONFIG_ALT_ROM_ADDR_FOR_CPU_READ, info->b1377() ? 1 : 0); -} - -bool DeviceHandleV3::sendDeviceConfiguration(uint32_t parameter, uint32_t value) -{ - HalExecElement* el = new HalExecElement(ID_Configure); - el->appendInputData32(parameter); - el->appendInputData32(value); - el->setOutputSize(0); - - HalExecCommand configCmd; - configCmd.elements.push_back(el); - - return this->send(configCmd); -} - -bool DeviceHandleV3::sendSyncCommand() -{ - boost::shared_ptr wdt = this->getWatchdogControl(); - - HalExecCommand devId; - - HalExecElement* el = new HalExecElement(this->checkHalId(ID_SyncJtag_AssertPor_SaveContext)); - wdt->addParamsTo(el, true); - el->appendInputData8(this->getJtagId()); - for(int i=0;i<16;i++) - el->appendInputData8(etwCodes[i]); - - el->setOutputSize(8); - devId.elements.push_back(el); - - return this->send(devId); -} - -long DeviceHandleV3::getDeviceIdentity(uint32_t activationKey, uint32_t* pc, uint32_t* sr) -{ - MSP430_device_idCode idCode; - boost::shared_ptr wdt = this->getWatchdogControl(); - - uint32_t sync_jtag_id = 0; - uint32_t read_mem_id = 0; - bool is_xv2_device = false; - int read_size = 0; - - uint32_t JtagId = this->getJtagId(); - - // CPUxv2 devices - if (0x99 == JtagId || 0x95 == JtagId || 0x91 == JtagId) - { - sync_jtag_id = ID_SyncJtag_AssertPor_SaveContextXv2; - read_mem_id = ID_ReadMemQuickXv2; - is_xv2_device = true; - read_size = 4 ; - } - else // JTAG ID is 89 - { - sync_jtag_id = ID_SyncJtag_AssertPor_SaveContext; - read_mem_id = ID_ReadMemWords; - is_xv2_device = false; - read_size = 8; - } - HalExecCommand devId; - // Set device Chain info - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->deviceChainInfo->getBusId())); - devId.elements.push_back(el); - - el = new HalExecElement(sync_jtag_id); // ID_SyncJtag_AssertPor_SaveContext/...Xv2 this will return PC & SR - - wdt->addParamsTo(el, true); - - el->appendInputData8(this->getJtagId()); - - for (int i=0;i<16;i++) - { - el->appendInputData8(etwCodes[i]); - } - el->setOutputSize(8); - devId.elements.push_back(el); - - if(!is_xv2_device) - { - el = new HalExecElement(read_mem_id); // ID_ReadMemWords/...Xv2 - - el->appendInputData32(this->getIdDataAddr()); - el->appendInputData32(read_size); - - el->setOutputSize(read_size*2); - devId.elements.push_back(el); - - el = new HalExecElement(ID_GetFuses); - el->setOutputSize(1); - - devId.elements.push_back(el); - - if (!this->send(devId)) - { - return -1; - } - uint16_t wdtCtrl = devId.elements.at(1).getOutputAt16(0); - if (!WatchdogControl::checkRead(wdtCtrl)) - { - return -1; - } - wdt->set(wdtCtrl); - *pc = devId.elements.at(1).getOutputAt32(2); - *sr = devId.elements.at(1).getOutputAt16(6); - - idCode.verId = devId.elements.at(2).getOutputAt16(0); - idCode.verSubId = 0x0000; - idCode.revisison = devId.elements.at(2).getOutputAt8(2); - idCode.fab = devId.elements.at(2).getOutputAt8(3); - idCode.self = devId.elements.at(2).getOutputAt16(4); - idCode.config = (char)(devId.elements.at(2).getOutputAt8(13) & 0x7F); - idCode.fuses = devId.elements.at(3).getOutputAt8(0); - idCode.activationKey = 0; - } - else // must be xv2 CPU device 99,95,91 - { - HalExecCommand devDesc; - - if (!this->send(devId)) - { - return -1; - } - uint16_t wdtCtrl = devId.elements.at(1).getOutputAt16(0); - - // check read watchdog password - if (!WatchdogControl::checkRead(wdtCtrl)) - { - return -1; - } - wdt->set(wdtCtrl); - - *pc = devId.elements.at(1).getOutputAt32(2); - *sr = devId.elements.at(1).getOutputAt16(6); - - el = new HalExecElement(read_mem_id); - - el->appendInputData32(this->getDeviceIdPtr()); - el->appendInputData32(4); - - devDesc.elements.push_back(el); - if (!this->send(devDesc)) - { - return -1; - } - uint8_t info_len = el->getOutputAt8(0); - uint8_t crc_len = el->getOutputAt8(1); - - // get device ID was read out with comand before - idCode.verId = (el->getOutputAt8(5) << 8) + el->getOutputAt8(4); -#ifndef NDEBUG - printf("version ID (0x91): %4x\n",idCode.verId); -#endif - idCode.verSubId = 0; - idCode.config = el->getOutputAt8(6); // SW Revision - idCode.revisison = el->getOutputAt8(7); // HW Revision - - idCode.verSubId = 0x0000; // init with zero = no sub id - - //Sub ID should be everything but not -1 - uint16_t SubId= getSubID(info_len, deviceIdPtr, *pc); - if((short)SubId != -1) - { - idCode.verSubId = SubId; - } - else - { - // in case we have an error during sub id detectin - return -1; - } - HalExecCommand eemv; - HalExecElement* el = new HalExecElement(ID_EemDataExchangeXv2); - el->appendInputData8(1); - el->appendInputData8(0x87); - eemv.elements.push_back(el); - if (!this->send(eemv)) - { - return -1; - } - eemVersion=el->getOutputAt32(0); - - idCode.fab = 0x55; - idCode.self = 0x5555; - - idCode.fuses = 0x55; - idCode.activationKey = activationKey; - } - TemplateDeviceDbManagerExt db; - return (long)db.queryDb(idCode); -}; - -uint16_t DeviceHandleV3::getSubID(uint32_t info_len, uint32_t deviceIdPtr , uint32_t pc) -{ - const int UNDEFINED_00 = 0x00; - if ((info_len > 1)&&(info_len < 11)) - { - int tlv_size=4*((int)pow(2.0,(double)info_len))-2; - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_ReadMemQuickXv2); - el->appendInputData32(deviceIdPtr); - el->appendInputData32(tlv_size/2); - el->appendInputData32(pc); - el->setOutputSize(tlv_size); - - cmd.elements.push_back(el); - if (!this->send(cmd)) - { - return -1; - } - - const vector& tlv = el->getOutput(); - int pos = 8; - //Must have at least 2 byte data left - while (pos + 3 < tlv_size) - { - const uint8_t tag = tlv[pos++]; - const uint8_t len = tlv[pos++]; - const uint8_t *value = &tlv[pos]; - pos += len; - - const int SUBVERSION_TAG = 0x14; - const int UNDEFINED_FF = 0xFF; - - if (tag == SUBVERSION_TAG) - { - return ((value[1]<<8) + value[0]); - } - if ((tag == UNDEFINED_FF) || (tag == UNDEFINED_00) || (tag == SUBVERSION_TAG)) - { - return UNDEFINED_00; - } - } - } - return UNDEFINED_00; -} - - -uint8_t DeviceHandleV3::getJtagId() -{ - return this->jtagId; -} -uint16_t DeviceHandleV3::getCoreIpId() -{ - return this->CoreIpId; -} -uint32_t DeviceHandleV3::getIdDataAddr() -{ - return this->IdDataAddr; -} - -uint32_t DeviceHandleV3::getDeviceIdPtr() -{ - return this->deviceIdPtr; -} - -uint32_t DeviceHandleV3::getEemVersion() -{ - return this->eemVersion; -} - -uint8_t DeviceHandleV3::getDeviceJtagId() -{ - if (this->jtagId != 0) - { - return this->jtagId; - } - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->deviceChainInfo->getBusId())); - cmd.elements.push_back(el); - - el = new HalExecElement(ID_GetJtagId); - - el->setOutputSize(12); - cmd.elements.push_back(el); - if (!this->send(cmd)) - { - return 0; - } - - uint16_t Id = cmd.elements.at(1).getOutputAt16(0); - -#ifndef NDEBUG - printf("JtagID: %2x\n",Id); -#endif - switch (Id) - { - case 0x89: - this->setWatchdogControl( - boost::shared_ptr(new WatchdogControl(0x0120)) - ); - break; - case 0x91: - case 0x95: - case 0x99: - this->setWatchdogControl( - boost::shared_ptr(new WatchdogControl(0x015C)) - ); - break; - } - if((Id==0x89)||(Id==0x91)||(Id==0x95)|| (Id==0x99)) - { - this->jtagId = (uint8_t)Id; - this->CoreIpId = cmd.elements.at(1).getOutputAt16(2); - this->deviceIdPtr = cmd.elements.at(1).getOutputAt32(4); - this->IdDataAddr = cmd.elements.at(1).getOutputAt32(8); - } - else - { - this->jtagId = 0x00; - this->CoreIpId = 0x00; - this->deviceIdPtr = 0x00; - this->IdDataAddr = 0x00; - } - return static_cast(Id); -}; -bool DeviceHandleV3::isJtagFuseBlown() -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_IsJtagFuseBlown); - el->setOutputSize(2); - cmd.elements.push_back(el); - - if(!send(cmd)) - { - return false; - } - if(el->getOutputAt16(0) == 0x5555) // If the fuse is blown, the device will be in JTAG bypass mode, and data - { // input to the device will be echoed with a one-bit delay. - return true; // Fuse is blown. - } - else - { - return false; // Fuse blow error. - } -} - -bool DeviceHandleV3::secure () -{ - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->deviceChainInfo->getBusId())); - cmd.elements.push_back(el); - // Device with silicon fuse - if(this->checkHalId(ID_BlowFuse) == ID_BlowFuse) - { - el = new HalExecElement(this->checkHalId(ID_BlowFuse)); - el->appendInputData8(this->hasTestVpp ? 1: 0); - cmd.elements.push_back(el); - } - if(this->checkHalId(ID_BlowFuse) == ID_BlowFuseFram) - { - el = new HalExecElement(this->checkHalId(ID_BlowFuseFram)); - cmd.elements.push_back(el); - } - if(this->checkHalId(ID_BlowFuse) == ID_BlowFuseXv2) - { - if(!(memoryManager->uploadFunclet(FuncletCode::WRITE))) - { - return false; - } - MemoryManager* mm = this->getMemoryManager(); - MemoryArea* ram = mm->getMemoryArea("system", 0); - const FuncletCode& funclet = this->getFunclet(FuncletCode::WRITE); - - const uint32_t type = 0; - const uint32_t lenght =2; // 2 words - const uint16_t flags = 0xA508; - const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); - - el = new HalExecElement(this->checkHalId(ID_BlowFuse)); - cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec - - el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); - el->appendInputData16(static_cast(ram->getSize() & 0xFFFF)); - el->appendInputData16(programStartAddress); - el->appendInputData32(static_cast(0x17FC)); - el->appendInputData32(lenght); - el->appendInputData16(type); - el->appendInputData16(flags); - el->appendInputData16(0); - el->appendInputData16(0); - el->setOutputSize(2); - cmd.elements.push_back(el); - } - if(!send(cmd)) - { - return false; - } - - ConfigManager* cm = parent->getConfigManager(); - cm->setDeviceCode(0); - cm->setPassword(""); - cm->start(); - return this->isJtagFuseBlown(); -} - - - -FetControl* DeviceHandleV3::getControl () -{ - return parent->getControl(); -} - -DeviceChainInfo* DeviceHandleV3::getDevChainInfo () -{ - return this->deviceChainInfo; -} - -bool DeviceHandleV3::send (HalExecCommand &command) -{ - this->myMutex = parent->getControl()->getMutex(); - boost::mutex::scoped_lock lock(*(this->myMutex)); - - return this->parent->getControl()->send(command,&this->map); -} - -void DeviceHandleV3::setWatchdogControl (boost::shared_ptr ctrl) -{ - this->wdt = ctrl; -} - -boost::shared_ptr DeviceHandleV3::getWatchdogControl () -{ - return this->wdt; -} - -uint32_t DeviceHandleV3::checkHalId(uint32_t base_id) const -{ - function_map_type::const_iterator it = map.find(base_id); - return (it != map.end()) ? it->second : base_id; -} - -uint32_t DeviceHandleV3::getBaseHalId(uint32_t mapped_id) const -{ - for (function_map_type::const_iterator it = map.begin(); it != map.end(); ++it) - { - if ( it->second == mapped_id ) - return it->first; - } - return mapped_id; -} - -const FuncletCode& DeviceHandleV3::getFunclet(FuncletCode::Type funclet) -{ - return funcletTable[funclet]; -} - -bool DeviceHandleV3::supportsQuickMemRead() const -{ - return quickMemRead; -} - -uint16_t DeviceHandleV3::getMinFlashVcc() const -{ - return minFlashVcc; -} - -bool DeviceHandleV3::hasFram() const -{ - return deviceHasFram; -} - -ClockSystem DeviceHandleV3::getClockSystem() const -{ - return clockSystem; -} diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleV3.h b/DLL430_v3/src/TI/DLL430/DeviceHandleV3.h deleted file mode 100644 index bb6a149..0000000 --- a/DLL430_v3/src/TI/DLL430/DeviceHandleV3.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * DeviceHandleV3.h - * - * Communication with target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_DeviceHandleV3_H -#define DLL430_DeviceHandleV3_H - -#include -#include -#include - -#include -#include "MemoryManagerV3.h" -#include "DebugManagerV3.h" -#include "DeviceInfo.h" -#include "FileFuncImpl.h" -#include -#include "WatchdogControl.h" -#include "FuncletCode.h" -#include - -namespace TI -{ - namespace DLL430 - { - class FetHandleV3; - class DeviceInfo; - class DeviceChainInfo; - class FetControl; - class HalCommand; - class ClockCalibration; - - class DeviceHandleV3 : public DeviceHandle - { - public: - DeviceHandleV3 (FetHandleV3*, DeviceChainInfo*); - ~DeviceHandleV3 (); - - EmulationManagerPtr getEmulationManager(); - MemoryManagerV3* getMemoryManager (); - DebugManagerV3* getDebugManager (); - FetHandleV3* getFetHandle () { return parent; } - ClockCalibration* getClockCalibration() { return clockCalibration; } - - FileFunc* getFileRef(); - bool writeSegments(); - - /// \brief Run the boot code writing the the specified command in the mailbox first - /// \param command[in] Command to be put in the mailbox - /// \return True if bootcode execution succeeded - bool runBootCode(uint32_t command); - long magicPatternSend(); - long identifyDevice (uint32_t activationKey); - const std::string & getDescription(); - bool secure (); - bool reset (); - bool sendSyncCommand(); - - bool verifySegments(); - - FetControl* getControl (); - - bool send (HalExecCommand &command); - - DeviceChainInfo* getDevChainInfo (); - - void setWatchdogControl (boost::shared_ptr); - boost::shared_ptr getWatchdogControl (); - uint8_t getDeviceJtagId(); - uint8_t getJtagId(); - uint32_t getDeviceIdPtr(); - uint32_t getEemVersion(); - uint16_t getCoreIpId(); - uint32_t getIdDataAddr(); - bool isJtagFuseBlown(); - uint16_t getSubID(uint32_t info_len, uint32_t deviceIdPtr , uint32_t pc); - - typedef std::map function_map_type; - typedef std::map funclet_map_type; - - void setDeviceId (long id); - - uint32_t checkHalId(uint32_t base_id) const; - uint32_t getBaseHalId(uint32_t mapped_id) const; - - const FuncletCode& getFunclet(FuncletCode::Type funclet); - - bool supportsQuickMemRead() const; - uint16_t getMinFlashVcc() const; - bool hasFram() const; - ClockSystem getClockSystem() const; - - protected: - - private: - uint8_t jtagId; - uint32_t deviceIdPtr; - uint32_t CoreIpId; - uint32_t IdDataAddr; - uint32_t eemVersion; - - boost::shared_ptr wdt; - function_map_type map; - funclet_map_type funcletTable; - enum DeviceHandle::jtagMode mode; - - FetHandleV3* parent; - DeviceChainInfo* deviceChainInfo; - EmulationManagerPtr emulationManager; - MemoryManagerV3* memoryManager; - DebugManagerV3* debugManager; - FileFuncImpl* fileManager; - ClockCalibration* clockCalibration; - - uint16_t minFlashVcc; - bool hasTestVpp; - bool quickMemRead; - bool deviceHasFram; - ClockSystem clockSystem; - - typedef boost::mutex mutex_type; - mutex_type* myMutex; - - std::string description; - - typedef boost::array EtwCodes; - EtwCodes etwCodes; - - void configure (const DeviceInfo* info); - long getDeviceIdentity(uint32_t activationKey, uint32_t* pc, uint32_t* sr); - - bool sendDeviceConfiguration(uint32_t parameter, uint32_t value); - }; - - }; -}; - -#endif /* DLL430_DeviceHandle_H */ diff --git a/DLL430_v3/src/TI/DLL430/DeviceInfo.cpp b/DLL430_v3/src/TI/DLL430/DeviceInfo.cpp deleted file mode 100644 index 0ed77f2..0000000 --- a/DLL430_v3/src/TI/DLL430/DeviceInfo.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* - * DeviceInfo.cpp - * - * Data of device currently under control. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "DeviceInfo.h" - -using namespace TI::DLL430; - - -DeviceInfo::DeviceInfo () - : objectId(0) - , type(DeviceInfo::PSATYPE_REGULAR) - , hasTestVpp(false) - , description(NULL) - , clockControl(0) - , mclkcntrl0(0) - , stateStorage(0) - , cycleCounter(0) - , cycleCounterOperations(0) - , emulationLevel(0) - , triggerMask(0) - , triggerOptionsModes(0) - , triggerDmaModes(0) - , triggerReadWriteModes(0) - , regTriggerOperations(0) - , maxSequencerStates(0) - , sFll(0) -{ - memset(possibleTrigger, 0, sizeof(possibleTrigger)); -} - -DeviceInfo::~DeviceInfo () -{ -} - -void DeviceInfo::setDescription(const char * dev_decription) -{ - description=dev_decription; -} - -const char * DeviceInfo::getDescription() const -{ - return description; -} - -void DeviceInfo::addMemoryInfo (memoryInfo* info) -{ - this->mem.push_back(info); -} - -const DeviceInfo::memoryInfo_list_type& DeviceInfo::getMemoryInfo () const -{ - return this->mem; -} - -void DeviceInfo::setObjectId (size_t id) -{ - this->objectId = id; -} - -size_t DeviceInfo::getObjectId () const -{ - return this->objectId; -} - -void DeviceInfo::setPsaType (enum DeviceInfo::psaType type) -{ - this->type = type; -} - -enum DeviceInfo::psaType DeviceInfo::getPsaType () const -{ - return this->type; -} - -void DeviceInfo::addFunctionMapping (unsigned long apiId, uint16_t halId) -{ - this->map[apiId] = halId; -} - -const IoChannel::function_map_type& DeviceInfo::getMap () const -{ - return this->map; -} - -void DeviceInfo::setFuncletMap(const funclet_map_type& map) -{ - this->funcletTable = map; -} - -const DeviceInfo::funclet_map_type& DeviceInfo::getFuncletMap() const -{ - return this->funcletTable; -} - -void DeviceInfo::setPossibleTrigger (uint8_t triggerSize, uint8_t triggerType) -{ - if (triggerType <= 2) - possibleTrigger[triggerType]=triggerSize; -} - -uint8_t DeviceInfo::getPossibleTrigger (uint8_t triggerType) const -{ - if (triggerType <= 2) - return possibleTrigger[triggerType]; - return 0; -} - -void DeviceInfo::setClockControl (uint8_t clock) -{ - this->clockControl=clock; -} - -uint8_t DeviceInfo::getClockControl () const -{ - return this->clockControl; -} - -void DeviceInfo::setClockModDefault (uint16_t mclkcntrl0) -{ - this->mclkcntrl0=mclkcntrl0; -} - -uint16_t DeviceInfo::getClockModDefault () const -{ - return this->mclkcntrl0; -} - -void DeviceInfo::setStateStorage (uint8_t state) -{ - this->stateStorage=state; -} - -uint8_t DeviceInfo::getStateStorage () const -{ - return this->stateStorage; -} - -void DeviceInfo::setCycleCounter (uint8_t cycle) -{ - this->cycleCounter=cycle; -} - -uint8_t DeviceInfo::getCycleCounter () const -{ - return this->cycleCounter; -} - -void DeviceInfo::setCycleCounterOperations (uint8_t cycleOps) -{ - this->cycleCounterOperations=cycleOps; -} - -uint8_t DeviceInfo::getCycleCounterOperations () const -{ - return this->cycleCounterOperations; -} - -void DeviceInfo::setEmulationLevel(uint8_t level) -{ - emulationLevel=level; -} - -uint8_t DeviceInfo::getEmulationLevel () const -{ - return this->emulationLevel; -} - -void DeviceInfo::setTriggerOptionsModes(uint8_t optModes) -{ - triggerOptionsModes = optModes; -} - -uint8_t DeviceInfo::getTriggerOptionsModes() const -{ - return this->triggerOptionsModes; -} - -void DeviceInfo::setTriggerDmaModes(uint8_t dmaModes) -{ - triggerDmaModes = dmaModes; -} - -uint8_t DeviceInfo::getTriggerDmaModes() const -{ - return this->triggerDmaModes; -} - -void DeviceInfo::setTriggerReadWriteModes(uint8_t rwModes) -{ - triggerReadWriteModes = rwModes; -} - -uint8_t DeviceInfo::getTriggerReadWriteModes() const -{ - return this->triggerReadWriteModes; -} - -void DeviceInfo::setRegTriggerOperations(uint8_t regTrigOps) -{ - regTriggerOperations = regTrigOps; -} - -uint8_t DeviceInfo::getRegTriggerOperations() const -{ - return this->regTriggerOperations; -} - -void DeviceInfo::setMaxSequencerStates(uint8_t states) -{ - maxSequencerStates = states; -} - -uint8_t DeviceInfo::getMaxSequencerStates() const -{ - return this->maxSequencerStates; -} - -void DeviceInfo::setTriggerMask(uint8_t mask) -{ - triggerMask = mask; -} - -uint8_t DeviceInfo::getTriggerMask() const -{ - return this->triggerMask; -} - -void DeviceInfo::setSFll (uint8_t Fll) -{ - this->sFll=Fll; -} - -uint8_t DeviceInfo::getSFll () const -{ - return this->sFll; -} diff --git a/DLL430_v3/src/TI/DLL430/DeviceInfo.h b/DLL430_v3/src/TI/DLL430/DeviceInfo.h index eb9ae71..b50631a 100644 --- a/DLL430_v3/src/TI/DLL430/DeviceInfo.h +++ b/DLL430_v3/src/TI/DLL430/DeviceInfo.h @@ -35,218 +35,413 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DEVICEINFO_H -#define DLL430_DEVICEINFO_H - -#include -#include -#include -#include -#include "IoChannel.h" + +#include + #include "MemoryAreaBase.h" +#include "MpuFRx.h" +#include "WriteProtection.h" #include "FuncletCode.h" +#include "../MSP432P4xx_FlashLibFc.h" +#include "../MSP432P4xx_PG11_FlashLibFc.h" +#include "../DAP_LOCK.h" + +#include +#include + +#include + namespace TI { namespace DLL430 { - enum ClockSystem { BC_1xx, BC_2xx, FLLPLUS, MOD_OSC }; + DEFINE_ENUM(Architecture, (Cpu)(CpuX)(CpuXv2)(ArmCpu)) + + DEFINE_ENUM(ClockSystemType, (BC_1xx)(BC_2xx)(FLLPLUS)(MOD_OSC)) + + DEFINE_ENUM(PsaType, (Regular)(Enhanced)) + + DEFINE_ENUM(MemoryType, (Flash)(Rom)(Ram)(Register)) + + ADAPT_ENUM(DEVICE_CLOCK_CONTROL, + (GCC_NONE)(GCC_STANDARD)(GCC_EXTENDED)(GCC_STANDARD_I)) + + ADAPT_ENUM(EMEX_MODE, + (EMEX_NONE)(EMEX_LOW)(EMEX_MEDIUM)(EMEX_HIGH)(EMEX_EXTRA_SMALL_5XX)(EMEX_SMALL_5XX)(EMEX_MEDIUM_5XX)(EMEX_LARGE_5XX)(EMEX_CORTEX_M4)) + + inline void fromString(const char* txt, TI::DLL430::MemoryArea::Name& v) + { + std::string str(txt); + + //Memory name can continue after initial part (ie. Ram2, CpuXYZ, etc.) + if (str.find("None") == 0) v = TI::DLL430::MemoryArea::None; + else if (str.find("Main") == 0) v = TI::DLL430::MemoryArea::Main; + else if (str.find("Info") == 0) v = TI::DLL430::MemoryArea::Info; + else if (str.find("Bsl") == 0) v = TI::DLL430::MemoryArea::Bsl; + else if (str.find("BootCode") == 0) v = TI::DLL430::MemoryArea::BootCode; + else if (str.find("Ram") == 0) v = TI::DLL430::MemoryArea::Ram; + else if (str.find("UsbRam") == 0) v = TI::DLL430::MemoryArea::UsbRam; + else if (str.find("Lcd") == 0) v = TI::DLL430::MemoryArea::Lcd; + else if (str.find("Cpu") == 0) v = TI::DLL430::MemoryArea::Cpu; + else if (str.find("Eem") == 0) v = TI::DLL430::MemoryArea::Eem; + else if (str.find("Peripheral8bit") == 0) v = TI::DLL430::MemoryArea::Peripheral8bit; + else if (str.find("Peripheral16bit") == 0) v = TI::DLL430::MemoryArea::Peripheral16bit; + else if (str.find("IrVec") == 0) v = TI::DLL430::MemoryArea::IrVec; + else if (str.find("Lib") == 0) v = TI::DLL430::MemoryArea::Lib; + else if (str.find("LeaPeripheral") == 0) v = TI::DLL430::MemoryArea::LeaPeripheral; + else if (str.find("LeaRam") == 0) v = TI::DLL430::MemoryArea::LeaRam; + else if (str.find("TinyRam") == 0) v = TI::DLL430::MemoryArea::TinyRam; + else if (str.find("MidRom") == 0) v = TI::DLL430::MemoryArea::MidRom; + else if (str.find("UssPeripheral") == 0) v = TI::DLL430::MemoryArea::UssPeripheral; + else throw std::runtime_error("invalid memory name: " + str); + } + } +} + + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), IdCode, + (uint16_t, version) + (uint16_t, subversion) + (uint8_t, revision) + (uint8_t, maxRevision) + (uint8_t, fab) + (uint16_t, self) + (uint8_t, config) + (uint8_t, fuses) + (uint32_t, activationKey) +) + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), IdMask, + (uint16_t, version) + (uint16_t, subversion) + (uint8_t, revision) + (uint8_t, maxRevision) + (uint8_t, fab) + (uint16_t, self) + (uint8_t, config) + (uint8_t, fuses) + (uint32_t, activationKey) +) + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), ClockPair, + (std::string, name) + (uint8_t, value) + (bool, defaultStop) +) + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), PowerSettings, + (uint32_t, testRegMask) + (uint32_t, testRegDefault) + (uint32_t, testRegEnableLpm5) + (uint32_t, testRegDisableLpm5) + (uint16_t, testReg3VMask) + (uint16_t, testReg3VDefault) + (uint16_t, testReg3VEnableLpm5) + (uint16_t, testReg3VDisableLpm5) +) + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), Features, + (TI::DLL430::ClockSystemType, clockSystem) + (bool, i2c) + (bool, lcfe) + (bool, quickMemRead) + (bool, stopFllDbg) + (bool, hasFram) +) + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), ExtendedFeatures, + (bool, tmr) + (bool, jtag) + (bool, dtc) + (bool, sync) + (bool, instr) + (bool, _1377) + (bool, psach) + (bool, eemInaccessibleInLPM) +) + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), VoltageInfo, + (uint16_t, vccMin) + (uint16_t, vccMax) + (uint16_t, vccFlashMin) + (uint16_t, vccSecureMin) + (uint16_t, vppSecureMin) + (uint16_t, vppSecureMax) + (bool, testVpp) +) + + +namespace TI +{ + namespace DLL430 + { + typedef std::map FunctionMapping; + + typedef std::map FuncletMapping; + + static const size_t nrUsedClockModules = 32; + typedef std::array ClockMapping; + + typedef std::array ClockNames; + } +} + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), ClockInfo, + (DEVICE_CLOCK_CONTROL, clockControl) + (uint32_t, mclkCntrl0) + (TI::DLL430::ClockMapping, eemTimers) + (TI::DLL430::ClockNames, eemClocks) +) + +namespace TI +{ + namespace DLL430 + { + struct WriteProtectionInfo + { + uint32_t address; + uint32_t unlockAddress; + uint16_t bits; + uint16_t mask; + uint16_t pwd; + + WriteProtectionInfo() : address(0), unlockAddress(0), bits(0), mask(0xFFFF), pwd(0) {} + }; + } +} + +BOOST_FUSION_ADAPT_STRUCT(TI::DLL430::WriteProtectionInfo, + (uint32_t, address) + (uint32_t, unlockAddress) + (uint16_t, bits) + (uint16_t, mask) + (uint16_t, pwd) + ) +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), MemoryAccess, + (std::string, type) + (bool, mpu) + (TI::DLL430::WriteProtectionInfo, writeProtection) +) + + +namespace TI +{ + namespace DLL430 + { struct MemoryCreatorBase { - virtual bool isImplemented() const = 0; - virtual TI::DLL430::MemoryAreaBase* operator()( - const std::string&, TI::DLL430::DeviceHandleV3*, - uint32_t, uint32_t, - uint32_t, uint32_t, - bool, const bool, MemoryManager*, uint8_t - ) const = 0; + virtual TI::DLL430::MemoryAreaBase* operator()(MemoryArea::Name, TI::DLL430::IDeviceHandle*, + uint32_t, uint32_t, uint32_t, uint32_t, + bool, const bool, IMemoryManager*, uint8_t) const = 0; + }; + typedef std::shared_ptr MemoryCreatorPtr; + + template + struct MemoryCreatorFR : public TI::DLL430::MemoryCreatorBase + { + MemoryCreatorFR(const MemoryAccess& access) + : hasMpu(access.mpu) + , address(access.writeProtection.address) + , bits(access.writeProtection.bits) + , mask(access.writeProtection.mask) + , pwd(access.writeProtection.pwd) {} + + virtual TI::DLL430::MemoryAreaBase* operator()(MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, uint32_t end, + uint32_t seg, uint32_t banks, + bool mapped, const bool protectable, + TI::DLL430::IMemoryManager* mm, uint8_t psa) const + { + IMpu* mpu = hasMpu ? static_cast(new MpuFRx(devHandle, mm)) : static_cast(new NoMpu()); + IWriteProtection* writeProt = address ? + static_cast(new WriteProtection(mm, address, bits, mask, pwd)) : + static_cast(new NoWriteProtection(mm)); + return new MemoryType(name, devHandle, start, end, seg, banks, mapped, protectable, mm, psa, writeProt, mpu); + } + + const bool hasMpu; + const uint32_t address; + const uint16_t bits; + const uint16_t mask; + const uint16_t pwd; }; - typedef boost::shared_ptr MemoryCreatorPtr; - template - class Property + template + struct MemoryCreator432 : public TI::DLL430::MemoryCreatorBase { - protected: - T value; - public: - Property() : value(T()) {} - Property(const T& val) : value(val) {} - inline const T& operator()() const { return value; } - inline void operator()(const T& newVal) { value=newVal; } + MemoryCreator432(const MemoryAccess& access) + : address(access.writeProtection.address) + , bits(access.writeProtection.bits) + , mask(access.writeProtection.mask) + , pwd(access.writeProtection.pwd) + , unlockAddress(access.writeProtection.unlockAddress) {} + + virtual TI::DLL430::MemoryAreaBase* operator()(MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, uint32_t end, + uint32_t seg, uint32_t banks, + bool mapped, const bool protectable, + TI::DLL430::IMemoryManager* mm, uint8_t psa) const + { + IWriteProtection* writeProt = address ? + static_cast(new WriteProtection432(mm, address, bits, mask, pwd, unlockAddress)) : + static_cast(new NoWriteProtection(mm)); + return new MemoryType(name, devHandle, start, end, seg, banks, mapped, protectable, mm, psa, writeProt); + } + + const uint32_t address; + const uint32_t unlockAddress; + const uint16_t bits; + const uint16_t mask; + const uint16_t pwd; }; - class DeviceInfo + template + struct MemoryCreator : public TI::DLL430::MemoryCreatorBase { - public: - static const size_t nrClockModules = 32; - static const size_t nrUsedClockModules = 16; - static const size_t nrClockNames = 16; - - typedef boost::array, nrClockModules> ClockMapping; - typedef boost::array ClockNames; - - enum memoryType { - MEMTYPE_FLASH, - MEMTYPE_ROM, - MEMTYPE_RAM, - MEMTYPE_REGISTER - }; - enum psaType { - PSATYPE_REGULAR, - PSATYPE_ENHANCED - }; - - class MemoryCreatorBase; - struct memoryInfo { - std::string name; - memoryType type; - uint8_t bits; - uint32_t size; - uint32_t offset; - uint32_t seg_size; - uint32_t banks; - std::vector mask; - bool mmapped; - bool isProtected; - MemoryCreatorPtr memoryCreatorPtr; - }; - - - typedef boost::ptr_vector memoryInfo_list_type; - typedef std::map funclet_map_type; - - DeviceInfo (); - ~DeviceInfo (); - - void setDescription(const char *); - const char * getDescription() const; - - void addMemoryInfo (memoryInfo*); - const memoryInfo_list_type& getMemoryInfo () const; - - void setObjectId (size_t); - size_t getObjectId () const; - - void setPsaType (enum psaType); - enum psaType getPsaType () const; - - Property minVcc; - Property maxVcc; - Property minFlashVcc; - Property minSecureVcc; - Property minSecureVpp; - Property maxSecureVpp; - - Property hasTestVpp; - Property quickMemRead; - Property psach; - Property b1377; - Property hasFram; - Property clockSystem; - - Property powerTestRegMask; - Property testRegEnableLpmx5; - Property testRegDisableLpmx5; - - Property powerTestReg3VMask; - Property testReg3VEnableLpmx5; - Property testReg3VDisableLpmx5; - - Property noBsl; - - void addFunctionMapping (unsigned long apiId, uint16_t halId); - const IoChannel::function_map_type& getMap () const; - - void setFuncletMap(const funclet_map_type& map); - const funclet_map_type& getFuncletMap() const; - - void setPossibleTrigger (uint8_t, uint8_t); - uint8_t getPossibleTrigger (uint8_t) const; - - void setClockControl (uint8_t); - uint8_t getClockControl () const; - - void setClockModDefault (uint16_t); - uint16_t getClockModDefault () const; - - void setStateStorage (uint8_t); - uint8_t getStateStorage () const; - - void setCycleCounter (uint8_t); - uint8_t getCycleCounter () const; - - void setCycleCounterOperations (uint8_t); - uint8_t getCycleCounterOperations () const; - - void setEmulationLevel(uint8_t); - uint8_t getEmulationLevel () const; - - void setTriggerOptionsModes(uint8_t); - uint8_t getTriggerOptionsModes() const; - - void setTriggerDmaModes(uint8_t); - uint8_t getTriggerDmaModes() const; - - void setTriggerReadWriteModes(uint8_t); - uint8_t getTriggerReadWriteModes() const; - - void setRegTriggerOperations(uint8_t); - uint8_t getRegTriggerOperations() const; - - void setTriggerMask(uint8_t); - uint8_t getTriggerMask() const; - - void setMaxSequencerStates(uint8_t states); - uint8_t getMaxSequencerStates() const; - - //used to fill clockMapping - ClockMapping& getWritableClockMapping() {return clockMapping;} - const ClockMapping& getClockMapping() const {return clockMapping;} - - ClockNames& getClockNames() { return clockNames; } - const ClockNames& getClockNames() const { return clockNames; } - - void setSFll (uint8_t); - uint8_t getSFll () const; - - private: - size_t objectId; - memoryInfo_list_type mem; - enum psaType type; - IoChannel::function_map_type map; - funclet_map_type funcletTable; - - const char * description; + virtual TI::DLL430::MemoryAreaBase* operator()(MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, uint32_t end, + uint32_t seg, uint32_t banks, + bool mapped, const bool protectable, + TI::DLL430::IMemoryManager* mm, uint8_t psa) const + { + return new MemoryType(name, devHandle, start, end, seg, banks, mapped, protectable, mm, psa); + } + }; - uint8_t clockControl; - uint16_t mclkcntrl0; - uint8_t stateStorage; /**< depth of available state storage modul. (0 means "not present") */ - uint8_t cycleCounter; /**< number of available cycle counters. (0 means "not present") */ - uint8_t cycleCounterOperations; - - uint8_t emulationLevel; + typedef std::vector MemoryMask; - uint8_t triggerMask; - uint8_t triggerOptionsModes; - uint8_t triggerDmaModes; - uint8_t triggerReadWriteModes; - uint8_t possibleTrigger[3]; - uint8_t regTriggerOperations; + struct MemoryInfo + { + MemoryArea::Name name; + MemoryType type; + uint8_t bits; + uint32_t size; + uint32_t start; + uint32_t segmentSize; + uint32_t banks; + bool mapped; + bool protectable; + MemoryMask mask; + MemoryCreatorPtr memoryCreatorPtr; + + MemoryInfo() : + name(MemoryArea::None), + type(MemoryType::Flash), + bits(0), + size(0), + start(0), + segmentSize(0), + banks(0), + mapped(false), + protectable(false) + {} + }; + } +} + +BOOST_FUSION_ADAPT_STRUCT(TI::DLL430::MemoryInfo, + (TI::DLL430::MemoryArea::Name, name) + (TI::DLL430::MemoryType, type) + (uint8_t, bits) + (uint32_t, size) + (uint32_t, start) + (uint32_t, segmentSize) + (uint32_t, banks) + (bool, mapped) + (bool, protectable) +) - uint8_t maxSequencerStates; +namespace TI +{ + namespace DLL430 + { + typedef std::map MemoryLayout; + } +} + + +BOOST_FUSION_DEFINE_STRUCT((TI)(DLL430), DeviceInfo, + (std::string, description) + (std::string, warning) + (uint8_t, bits) + (TI::DLL430::PsaType, psa) + (TI::DLL430::Architecture, architecture) + (EMEX_MODE, eem) + (TI::DLL430::IdMask, idMask) + (TI::DLL430::IdCode, idCode) + (TI::DLL430::VoltageInfo, voltageInfo) + (TI::DLL430::ClockInfo, clockInfo) + (TI::DLL430::FunctionMapping, functionMap) + (TI::DLL430::FuncletMapping, funcletMap) + (TI::DLL430::Features, features) + (TI::DLL430::ExtendedFeatures, extFeatures) + (TI::DLL430::PowerSettings, powerSettings) + (TI::DLL430::MemoryLayout, memoryLayout) +) - ClockMapping clockMapping; - ClockNames clockNames; - uint8_t sFll; +namespace TI +{ + namespace DLL430 + { + struct Match + { + IdMask idMask; + IdCode idCode; }; - typedef boost::shared_ptr DeviceInfoPtr; - } //namespace DLL430 - -} //namespace TI -#endif /* DLL430_DEVICEINFO_H */ + inline bool operator<(const Match& lhs, const Match& rhs) + { + if (lhs.idCode.version != rhs.idCode.version) + return lhs.idCode.version < rhs.idCode.version; + + else if (lhs.idCode.subversion != rhs.idCode.subversion) + return lhs.idCode.subversion < rhs.idCode.subversion; + + else if (lhs.idCode.revision != rhs.idCode.revision) + return lhs.idCode.revision < rhs.idCode.revision; + + else if (lhs.idCode.fab != rhs.idCode.fab) + return lhs.idCode.fab < rhs.idCode.fab; + + else if (lhs.idCode.self != rhs.idCode.self) + return lhs.idCode.self < rhs.idCode.self; + + else if (lhs.idCode.config != rhs.idCode.config) + return lhs.idCode.config < rhs.idCode.config; + + else if (lhs.idCode.fuses != rhs.idCode.fuses) + return lhs.idCode.fuses < rhs.idCode.fuses; + + else + return lhs.idCode.activationKey < rhs.idCode.activationKey; + } + + inline bool operator==(const Match& match, const IdCode& idCode) + { + bool revisionMatch = ((idCode.revision & match.idMask.revision) == match.idCode.revision); + if (match.idMask.maxRevision != 0) + { + revisionMatch = ((idCode.revision & match.idMask.revision) >= match.idCode.revision) && + ((idCode.revision & match.idMask.maxRevision) <= match.idCode.maxRevision); + } + + return ((idCode.version & match.idMask.version) == match.idCode.version + && (idCode.subversion & match.idMask.subversion) == match.idCode.subversion + && revisionMatch + && (idCode.fab & match.idMask.fab) == match.idCode.fab + && (idCode.self & match.idMask.self) == match.idCode.self + && (idCode.config & match.idMask.config) == match.idCode.config + && (idCode.fuses & match.idMask.fuses) == match.idCode.fuses + && (idCode.activationKey & match.idMask.activationKey) == match.idCode.activationKey); + } + + typedef std::map DeviceMap; + } +} diff --git a/DLL430_v3/src/TI/DLL430/DoubleBuffer.h b/DLL430_v3/src/TI/DLL430/DoubleBuffer.h new file mode 100644 index 0000000..f0c2e6c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/DoubleBuffer.h @@ -0,0 +1,173 @@ +/* + * DoubleBuffer.h + * + * Template class for doing double-buffering + * + * Copyright (C) 2007 - 2012 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. + */ + +#pragma once + +namespace TI +{ + namespace DLL430 + { + template + class DoubleBuffer + { + public: + /** + * \brief Constructor creates the two buffers + * \param size The desired size of the buffers + */ + DoubleBuffer(size_t size) + : mSize(size) + { + mBuffers[0] = new T[size]; + mBuffers[1] = new T[size]; + Reset(); + } + + ~DoubleBuffer() + { + delete[] mBuffers[0]; + delete[] mBuffers[1]; + } + + /** + * \brief Resets the current state of the double buffer + */ + void Reset() + { + mCurrentBufferIndex = 0; + mCurrentBufferLevel = 0; + mDataAvailable = false; + } + + /** + * \brief Add data to the buffer and indicate that a swap has happened + * \param data The data element to be written + * \return Indicates whether a swap between buffers has occured and the user + * may start reading from the other buffer + */ + bool AddData(const T &data) + { + mBuffers[mCurrentBufferIndex][mCurrentBufferLevel++] = data; + + return doSwap(); + } + + /** + * \brief Add an array of data to the buffer and indicate that a swap has happened + * \param data The data element to be written + * \return Indicates whether a swap between buffers has occured and the user + * may start reading from the other buffer + */ + bool AddData(const T *data, size_t size = 1) + { + bool retVal = false; + + size_t copySize; + size_t sizeInBytes = size * sizeof(T); + + while (sizeInBytes) + { + if ((mCurrentBufferLevel + sizeInBytes) > mSize) + { + copySize = mSize - mCurrentBufferLevel; + } + else + { + copySize = sizeInBytes; + } + memcpy(&mBuffers[mCurrentBufferIndex][mCurrentBufferLevel], data, copySize); + + mCurrentBufferLevel += copySize; + sizeInBytes -= copySize; + + retVal = retVal || doSwap(); + } + + return retVal; + } + + /** + * \brief Get the pointer for reading data from the buffer + * \return A pointer to the current read buffer + */ + T* GetReadBufferPtr() + { + T* retVal = 0; + + if (mDataAvailable) + { + retVal = mBuffers[(mCurrentBufferIndex + 1) % 2]; + } + + return retVal; + } + + /** + * \brief Get the buffer size + * \return the size + */ + size_t GetBufferSize() const + { + return mSize; + } + + private: + /** + * \brief Swap buffers if needed + */ + bool doSwap() + { + bool retVal = false; + if (mCurrentBufferLevel >= mSize) + { + // swap buffers + mCurrentBufferIndex = (mCurrentBufferIndex + 1) % 2; + mCurrentBufferLevel = 0; + mDataAvailable = true; + retVal = true; + } + return retVal; + } + + T* mBuffers[2]; /**< Actual buffers where data is stored */ + unsigned char mCurrentBufferIndex; /**< Indicates which buffer is currently being written to */ + size_t mCurrentBufferLevel; /**< Inidcates the fill-level of the current write buffer */ + size_t mSize; /**< The size of the double buffer */ + bool mDataAvailable; /**< Indicates whether data is available for reading */ + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.cpp b/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.cpp index 754b40a..b573dc8 100644 --- a/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.cpp +++ b/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.cpp @@ -3,54 +3,59 @@ * * Handles cycle counter functionality * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +#include #include "DeviceInfo.h" #include "CycleCounter.h" -#include "DebugManagerV3.h" -#include "DeviceHandleV3.h" -#include "EemMemoryAccess.h" -#include "CpuMemoryAccess.h" -#include "TemplateDeviceDb/MSP430Defaults.h" -#include +#include "EM/EemRegisters/EemRegisterAccess430.h" +#include "EM/Exceptions/Exceptions.h" using namespace TI::DLL430; -using namespace TI::DLL430::TemplateDeviceDb; + +enum EemCycleCounterRegisters +{ + CCNT0CTL = 0xb0, + CCNT0L = 0xb2, + CCNT0H = 0xb4, +}; + +uint64_t fromLFSR(uint64_t lfsr); static const unsigned resetBit = (1 << 6); static const unsigned defaultMode = 0x5; - //Used for old software cycle counter code static uint32_t CPUCycles = 0; static bool deviceHasMSP430X = false; @@ -59,84 +64,59 @@ uint32_t GetCycles(uint16_t Instruction); uint32_t GetExtensionCycles(uint16_t wExtensionWord, uint16_t Instruction); - -CycleCounter::CycleCounter(DeviceHandleV3* deviceHandle, const DeviceInfo* info) - : deviceHandle(deviceHandle) - , emulationLevel((EMEX_MODE)info->getEmulationLevel()) - , cycleCounterControl(resetBit | defaultMode) +CycleCounter::CycleCounter(uint8_t eemMode, uint8_t bits) + : emulationLevel(eemMode) , counterValue(0) - , isCpuX(false) + , isCpuX(bits == 20) + , enabled(true) { - BOOST_FOREACH(const DeviceInfo::memoryInfo& memInfo, info->getMemoryInfo()) - { - if (memInfo.name == "CPU" && memInfo.bits == 20) - { - isCpuX = true; - } - } } - void CycleCounter::reset() { - if (emulationLevel >= EMEX_EXTRA_SMALL_5XX) + try { - MemoryManager* mm = deviceHandle->getMemoryManager(); - EemMemoryAccess* ema = (EemMemoryAccess*)mm->getMemoryArea("EEM"); - + if (enabled && emulationLevel >= EMEX_EXTRA_SMALL_5XX) + { + writeEemRegister430(CCNT0CTL, resetBit | defaultMode, true); + } counterValue = 0; - cycleCounterControl = resetBit | defaultMode; - ema->writeEemRegister(CCNT0CTL, cycleCounterControl) && ema->sync(); } + catch (const EM_Exception&) {} } -void CycleCounter::configure() +void CycleCounter::configure() const { - if (emulationLevel >= EMEX_EXTRA_SMALL_5XX) + try { - MemoryManager* mm = deviceHandle->getMemoryManager(); - EemMemoryAccess* ema = (EemMemoryAccess*)mm->getMemoryArea("EEM"); - - cycleCounterControl = defaultMode; - ema->writeEemRegister(CCNT0CTL, cycleCounterControl) && ema->sync(); + if (enabled && emulationLevel >= EMEX_EXTRA_SMALL_5XX) + { + writeEemRegister430(CCNT0CTL, defaultMode); + } } + catch (const EM_Exception&) {} } uint64_t CycleCounter::read() { - if (emulationLevel >= EMEX_EXTRA_SMALL_5XX) - { - MemoryManager* mm = deviceHandle->getMemoryManager(); - EemMemoryAccess* ema = (EemMemoryAccess*)mm->getMemoryArea("EEM"); - - union CycleCount { struct { uint32_t low, high; }; uint64_t value; }; - CycleCount cycleCount; - - ema->readEemRegister(CCNT0L, &cycleCount.low) && ema->sync(); - ema->readEemRegister(CCNT0H, &cycleCount.high) && ema->sync(); - - counterValue = 0; - - uint32_t factor = 1; - uint32_t lsfr2hex[16] = {0x0, 0x1, 0x2, 0x7, 0x5, 0x3, 0x8, 0xb, 0xe, 0x6, 0x4, 0xa, 0xd, 0x9, 0xc, 0}; - for (int i = 0; i < 10; ++i) + try + { + if (enabled && emulationLevel >= EMEX_EXTRA_SMALL_5XX) { - counterValue += factor * lsfr2hex[(cycleCount.value & 0xf)]; - cycleCount.value >>= 4; - factor *= 15; - } + const uint32_t low = readEemRegister430(CCNT0L); + const uint64_t high = readEemRegister430(CCNT0H); + counterValue = fromLFSR((high << 32) | low); + } } + catch (const EM_Exception&) {} return counterValue; } - - - void CycleCounter::countInstruction(uint32_t instruction, bool steppedIntoInterrupt) { if (emulationLevel < EMEX_EXTRA_SMALL_5XX) @@ -150,7 +130,6 @@ void CycleCounter::countInstruction(uint32_t instruction, bool steppedIntoInterr if ((instruction & 0xF800) == 0x1800) { extensionWord = (instruction & 0xffff); - instruction >>= 16; } GetCycles(instructionWord); @@ -168,16 +147,6 @@ void CycleCounter::countInstruction(uint32_t instruction, bool steppedIntoInterr } } - - - - -#define PC 0 -#define SP 1 -#define SR 2 -#define CG1 2 -#define CG2 3 - // #defines. ------------------------------------------------------------------ // BIT MASKS FOR ADDRESSING MODES AND DOUBLE AND SINGLE OPERAND INSTRUCTION FORMATS (As/Ad): @@ -236,32 +205,32 @@ void CycleCounter::countInstruction(uint32_t instruction, bool steppedIntoInterr // CYCLES FOR DOUBLE OPERAND INSTRUCTIONS: // The following Array contains the cycles for each DOIF. To get the cycles for a DOIF, // place As into Bit 2+3 and Ad into Bit 0 of a Byte. Bit 1 and 4 to 7 are zero. This Byte -// has to be used as index into the following array +// has to be used as index into the following array static unsigned int const DOICycles[16] = { -/*Src,Dst AdAs Index Cycles[AdAs] */ -/*Rn,Rn 0000 0 */ 1, -/*X(Rn),Rn 0001 1 */ 3, -/*@Rn,Rn 0010 2 */ 2, -/*@Rn+,Rn 0011 3 */ 2, -/*Rn,@Rn ---- 4 not possible*/ 0, -/*X(Rn),@Rn ---- 5 not possible*/ 0, -/*@Rn,@Rn ---- 6 not possible*/ 0, -/*@Rn+,@Rn ---- 7 not possible*/ 0, -/*Rn,X(Rn) 1000 8 */ 4, -/*X(Rn),X(Rn) 1001 9 */ 6, -/*@Rn,X(Rn) 1010 A */ 5, -/*@Rn+,X(Rn) 1011 B */ 5, -/*Rn,@Rn+ ---- C not possible*/ 0, -/*X(Rn),@Rn+ ---- D not possible*/ 0, -/*@Rn,@Rn+ ---- E not possible*/ 0, -/*@Rn+,@Rn+ ---- F not possible*/ 0 +/*Src, Dst AdAs Index Cycles[AdAs] */ +/*Rn, Rn 0000 0 */ 1, +/*X(Rn), Rn 0001 1 */ 3, +/*@Rn, Rn 0010 2 */ 2, +/*@Rn+, Rn 0011 3 */ 2, +/*Rn, @Rn ---- 4 not possible*/ 0, +/*X(Rn), @Rn ---- 5 not possible*/ 0, +/*@Rn, @Rn ---- 6 not possible*/ 0, +/*@Rn+, @Rn ---- 7 not possible*/ 0, +/*Rn, X(Rn) 1000 8 */ 4, +/*X(Rn), X(Rn) 1001 9 */ 6, +/*@Rn, X(Rn) 1010 A */ 5, +/*@Rn+, X(Rn) 1011 B */ 5, +/*Rn, @Rn+ ---- C not possible*/ 0, +/*X(Rn), @Rn+ ---- D not possible*/ 0, +/*@Rn, @Rn+ ---- E not possible*/ 0, +/*@Rn+, @Rn+ ---- F not possible*/ 0 }; // CYCLES FOR SINGLE OPERAND INSTRUCTIONS: // The following Arrays contain the cycles for each SOIF. To get the cycles for a SOIF, // place Ad into Bit 0 and 1 of a Byte. Bit 2 to 7 are zero. This Byte has to be used as -// index into the corresponding array +// index into the corresponding array // RRC, RRA, SWPB, SXT: static unsigned int const SOICycles_1[4] = { @@ -350,13 +319,13 @@ void DOIF(uint16_t Instruction) CPUCycles++; // check if the device has CPUX - if(deviceHasMSP430X) + if (deviceHasMSP430X) { // check instruction: MOV || CMP || BIT - if(DOpCode == DOI_MOV || DOpCode == DOI_CMP || DOpCode == DOI_BIT) + if (DOpCode == DOI_MOV || DOpCode == DOI_CMP || DOpCode == DOI_BIT) { // check addressing DST mode: x(Rn) || EDE || &EDE - if(Ad == AM_IdxMode) + if (Ad == AM_IdxMode) { CPUCycles--; } @@ -373,7 +342,7 @@ void SOIF(uint16_t Instruction) uint16_t Ad = (Instruction & IM_AsMask) >> 4; uint16_t SOICycles = 0; - switch(Instruction & IF_SOpCodeMask) + switch (Instruction & IF_SOpCodeMask) { case SOI_PUSH: SOICycles = 2; break; @@ -402,7 +371,7 @@ void SOIF(uint16_t Instruction) { CPUCycles += XSOICycles_2[Ad]; // one more cycle for X(Rn) when Rn == SP - if(DstRegNo == SP && Ad == AM_IdxMode) + if (DstRegNo == SP && Ad == AM_IdxMode) { CPUCycles++; } @@ -416,7 +385,7 @@ void SOIF(uint16_t Instruction) { CPUCycles += XSOICycles_3[Ad]; // one more cycle for X(Rn) when Rn == SP - if(DstRegNo == SP && Ad == AM_IdxMode) + if (DstRegNo == SP && Ad == AM_IdxMode) { CPUCycles++; } @@ -474,7 +443,7 @@ void ADDRI(uint16_t Instruction) uint16_t BitLoc = (Instruction & 0x0C00) >> 10; // is is a rotate instruction?? - if((Instruction & Rotate_OpCodeId) == 0x0040) + if ((Instruction & Rotate_OpCodeId) == 0x0040) { // The rotate instructions take 1, 2, 3 or 4 CPU cycles according to the // number of bit positions shifted. @@ -482,7 +451,7 @@ void ADDRI(uint16_t Instruction) } else { - switch(Instruction & ADDRI_OpCodeMask) + switch (Instruction & ADDRI_OpCodeMask) { case MOVA_ATRsrcRdst: case MOVA_ATRsrcPlusRdst: @@ -501,7 +470,7 @@ void ADDRI(uint16_t Instruction) case ADDA_Imm20Rdst: case SUBA_Imm20Rdst: CPUCycles += 2; - if(DstRegNo == PC) + if (DstRegNo == PC) { CPUCycles++; } @@ -511,7 +480,7 @@ void ADDRI(uint16_t Instruction) case ADDA_RsrcRdst: case SUBA_RsrcRdst: CPUCycles ++; - if(DstRegNo == PC) + if (DstRegNo == PC) { CPUCycles++; } @@ -543,29 +512,29 @@ bool XSOIF(uint16_t Instruction) uint16_t DstRegNo = Instruction & IM_DstMask; uint16_t MultBits = (Instruction & 0x00F0) >> 4; - switch(Instruction & 0xFF00) + switch (Instruction & 0xFF00) { // RETI or CALLA?? case NOI_RETI: // RETI?? - if(Instruction == NOI_RETI) + if (Instruction == NOI_RETI) { // RETI needs 3 cycles CPUCycles += 3; } else { - switch(Instruction & 0x00F0) + switch (Instruction & 0x00F0) { case CALLA_Imm20: case CALLA_Rdst: CPUCycles += 4; break; case CALLA_AtRdst: - case CALLA_AtRdstPlus: CPUCycles += 5; break; + case CALLA_AtRdstPlus: CPUCycles += 5; break; - case CALLA_IdxRdst: if(DstRegNo == SP) CPUCycles++; CPUCycles += 6; break; + case CALLA_IdxRdst: if (DstRegNo == SP) CPUCycles++; CPUCycles += 6; break; case CALLA_Abs20: - case CALLA_Symbolic: CPUCycles += 6; break; + case CALLA_Symbolic: CPUCycles += 6; break; } } RetState = false; @@ -583,7 +552,7 @@ bool XSOIF(uint16_t Instruction) break; } - return (RetState); + return RetState; } //-------------------------------------------------------------------------- @@ -599,7 +568,7 @@ uint32_t GetCycles(uint16_t Instruction) case 0x0000: ADDRI(Instruction); break; // CPUX Address Instructions case 0x1000: // look for CPUX instructions first - if(deviceHasMSP430X) + if (deviceHasMSP430X) { RetState = XSOIF(Instruction); } @@ -614,7 +583,7 @@ uint32_t GetCycles(uint16_t Instruction) default: DOIF(Instruction); //Double Operand Instruction Format }; - return (CPUCycles - lastCPUCycles); + return CPUCycles - lastCPUCycles; } #define EXT_AL 0x0040 @@ -633,39 +602,39 @@ uint32_t GetExtensionCycles(uint16_t wExtensionWord, uint16_t Instruction) CPUCycles++; // handle a few exceptions - // 1. @Rn,PC - if(DstRegNo == PC && As == AM_IdtMode && Ad == AM_RegMode) + // 1. @Rn, PC + if (DstRegNo == PC && As == AM_IdtMode && Ad == AM_RegMode) { CPUCycles--; } - // 1. @Rn,PC - if(DstRegNo == PC && SrcRegNo == PC && As == AM_IdAMode && Ad == AM_RegMode) + // 1. @Rn, PC + if (DstRegNo == PC && SrcRegNo == PC && As == AM_IdAMode && Ad == AM_RegMode) { CPUCycles--; } - // 2. x(Rn),PC == x(Rn),EDE == x(Rn),&EDE - if(DstRegNo == PC && As == AM_IdxMode && Ad == AM_RegMode) + // 2. x(Rn), PC == x(Rn), EDE == x(Rn), &EDE + if (DstRegNo == PC && As == AM_IdxMode && Ad == AM_RegMode) { // but only if it's NOT MOV, ADD or SUB - if(!(DOpCode == DOI_MOV || DOpCode == DOI_ADD || DOpCode == DOI_SUB)) + if (!(DOpCode == DOI_MOV || DOpCode == DOI_ADD || DOpCode == DOI_SUB)) { // CPUCycles++; } } // ADDRESS access?? EXT_AL must be 0! - if(!(wExtensionWord & EXT_AL)) + if (!(wExtensionWord & EXT_AL)) { - // Rn,x(Rm) - // #N,x(Rm) - if(Ad == AM_IdxMode) + // Rn, x(Rm) + // #N, x(Rm) + if (Ad == AM_IdxMode) { - if(As == AM_RegMode || As == AM_IdtMode || SrcRegNo == PC) + if (As == AM_RegMode || As == AM_IdtMode || SrcRegNo == PC) { CPUCycles += 1; - if(As == AM_IdxMode) + if (As == AM_IdxMode) { CPUCycles += 1; } @@ -675,27 +644,27 @@ uint32_t GetExtensionCycles(uint16_t wExtensionWord, uint16_t Instruction) CPUCycles += 2; } } - // @Rx,Rx - // @Rx+,Rx - if(Ad == AM_RegMode && (As == AM_IdxMode || As == AM_IdtMode || As == AM_IdAMode)) + // @Rx, Rx + // @Rx+, Rx + if (Ad == AM_RegMode && (As == AM_IdxMode || As == AM_IdtMode || As == AM_IdAMode)) { CPUCycles += 1; } // RRA, RRC - if((Instruction & 0xF000) == 0x1000 && As != AM_RegMode) + if ((Instruction & 0xF000) == 0x1000 && As != AM_RegMode) { CPUCycles += 1; } // PUSHX Rx - if((Instruction &0xFFF0) == 0x1240) + if ((Instruction &0xFFF0) == 0x1240) { CPUCycles += 1; } - if(!(DOpCode == DOI_MOV || DOpCode == DOI_CMP || DOpCode == DOI_BIT)) + if (!(DOpCode == DOI_MOV || DOpCode == DOI_CMP || DOpCode == DOI_BIT)) { // check addressing DST mode: x(Rn) || EDE || &EDE - if(Ad == AM_IdxMode) + if (Ad == AM_IdxMode) { CPUCycles++; } @@ -704,10 +673,10 @@ uint32_t GetExtensionCycles(uint16_t wExtensionWord, uint16_t Instruction) // repeat instruction, lower nibbel of wExtensionword // defines the number of repetitions - if(!(wExtensionWord & EXT_GATTER)) + if (!(wExtensionWord & EXT_GATTER)) { CPUCycles += (wExtensionWord & 0x000F); } - return (CPUCycles - lastCPUCycles); + return CPUCycles - lastCPUCycles; } diff --git a/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.h b/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.h index 7ae6bd3..795a4ff 100644 --- a/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.h +++ b/DLL430_v3/src/TI/DLL430/EEM/CycleCounter.h @@ -3,76 +3,65 @@ * * Handles cycle counter functionality. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_CYCLECOUNTER_H -#define DLL430_CYCLECOUNTER_H - -#include -#include "TemplateDeviceDb/MSP430Defaults.h" namespace TI { namespace DLL430 { - - class DeviceInfo; - class DeviceHandleV3; - class CycleCounter { public: - explicit CycleCounter(DeviceHandleV3* deviceHandle, const DeviceInfo* info); + explicit CycleCounter(uint8_t eemMode, uint8_t bits); void reset(); - void configure(); + void configure() const; void countInstruction(uint32_t instruction, bool steppedIntoInterrupt); uint64_t read(); - uint64_t getValue() const { return counterValue; } + uint64_t getValue() const { return enabled ? counterValue : 0; } + + void enable(bool setEnabled) { enabled = setEnabled; } + bool isEnabled() const { return enabled; } private: - DeviceHandleV3* deviceHandle; - TemplateDeviceDb::EMEX_MODE emulationLevel; + uint8_t emulationLevel; - uint32_t cycleCounterControl; uint64_t counterValue; bool isCpuX; + bool enabled; }; } }; - -#endif /* DLL430_CYCLECOUNTER_H */ diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.cpp b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.cpp index 561d283..e549c79 100644 --- a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.cpp @@ -3,39 +3,39 @@ * * Breakpoint implementation for MSP430. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include "Breakpoint430.h" #include "../TriggerCondition/ITriggerCondition.h" @@ -67,18 +67,18 @@ void Breakpoint430::addTriggerCondition(TriggerConditionPtr condition) if (condition) { mTriggerConditions.push_back(condition); + + if (mIsEnabled) + { + condition->addReaction(TR_BREAK); + } } - if (mIsEnabled) - { - condition->addReaction(TR_BREAK); - } - } void Breakpoint430::enable() { - BOOST_FOREACH(TriggerConditionPtr& condition, mTriggerConditions) + for (TriggerConditionPtr& condition : mTriggerConditions) { condition->addReaction(TR_BREAK); } @@ -88,7 +88,7 @@ void Breakpoint430::enable() void Breakpoint430::disable() { - BOOST_FOREACH(TriggerConditionPtr& condition, mTriggerConditions) + for (TriggerConditionPtr& condition : mTriggerConditions) { condition->removeReaction(TR_BREAK); } diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.h b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.h index 7cf14a1..3326365 100644 --- a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.h +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint430.h @@ -3,43 +3,41 @@ * * Breakpoint implementation for MSP430. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_BREAKPOINT_430_H -#define DLL430_BREAKPOINT_430_H +#pragma once -#include #include "IBreakpoint.h" #include "../TriggerCondition/ITriggerCondition.h" @@ -49,7 +47,7 @@ class Breakpoint430 : public IBreakpoint { public: Breakpoint430(); - Breakpoint430(TriggerConditionPtr condition); + explicit Breakpoint430(TriggerConditionPtr condition); ~Breakpoint430(); virtual void addTriggerCondition(TriggerConditionPtr condition); @@ -62,5 +60,3 @@ class Breakpoint430 : public IBreakpoint }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint432.cpp b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint432.cpp new file mode 100644 index 0000000..9a881c6 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint432.cpp @@ -0,0 +1,83 @@ +/* + * Breakpoint432.cpp + * + * Breakpoint implementation for MSP432. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include "Breakpoint432.h" +#include "../TriggerCondition/ITriggerCondition.h" + + +using namespace TI::DLL430; + +Breakpoint432::Breakpoint432() + : mIsEnabled(true) +{ +} + + +Breakpoint432::Breakpoint432(TriggerConditionPtr condition) + : mIsEnabled(true) +{ + addTriggerCondition(condition); +} + + +Breakpoint432::~Breakpoint432() +{ + disable(); +} + + +void Breakpoint432::addTriggerCondition(TriggerConditionPtr condition) +{ + if (condition) + { + mTriggerConditions.push_back(condition); + } +} + + +void Breakpoint432::enable() +{ + mIsEnabled = true; +} + + +void Breakpoint432::disable() +{ + mIsEnabled = false; +} diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint432.h b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint432.h new file mode 100644 index 0000000..0f6efad --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/Breakpoint432.h @@ -0,0 +1,62 @@ +/* + * Breakpoint432.h + * + * Breakpoint implementation for MSP432. + * + * Copyright (C) 2007 - 2011 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. + */ + + +#pragma once + +#include "IBreakpoint.h" +#include "../TriggerCondition/ITriggerCondition.h" + +namespace TI { namespace DLL430 { + +class Breakpoint432 : public IBreakpoint +{ +public: + Breakpoint432(); + explicit Breakpoint432(TriggerConditionPtr condition); + ~Breakpoint432(); + + virtual void addTriggerCondition(TriggerConditionPtr condition); + virtual void enable(); + virtual void disable(); + +private: + std::vector mTriggerConditions; + bool mIsEnabled; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.cpp b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.cpp index de03f6a..1ea501d 100644 --- a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.cpp @@ -3,41 +3,39 @@ * * Handles creation of breakpoint for MSP430. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include -#include +#include #include "../TriggerCondition/ITriggerConditionManager.h" #include "BreakpointManager430.h" @@ -48,10 +46,10 @@ using namespace TI::DLL430; BreakpointPtr BreakpointManager430::createBreakpoint() const { - return boost::make_shared(); + return std::make_shared(); } BreakpointPtr BreakpointManager430::createBreakpoint(TriggerConditionPtr condition) const { - return boost::make_shared(condition); + return std::make_shared(condition); } diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.h b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.h index 3c319db..23ded63 100644 --- a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.h +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager430.h @@ -3,41 +3,40 @@ * * Handles creation of breakpoint for MSP430. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_BREAKPOINT_MANAGER_430_H -#define DLL430_BREAKPOINT_MANAGER_430_H +#pragma once #include "IBreakpointManager.h" @@ -46,8 +45,6 @@ namespace TI { namespace DLL430 { class BreakpointManager430 : public IBreakpointManager { public: - virtual void initialize() {} - virtual void cleanup() {} virtual void writeConfiguration() {} virtual BreakpointPtr createBreakpoint() const; @@ -55,5 +52,3 @@ class BreakpointManager430 : public IBreakpointManager }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager432.cpp b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager432.cpp new file mode 100644 index 0000000..af3a3f6 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager432.cpp @@ -0,0 +1,55 @@ +/* + * BreakpointManager430.cpp + * + * Handles creation of breakpoint for MSP430. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include "../TriggerCondition/ITriggerConditionManager.h" +#include "BreakpointManager432.h" +#include "Breakpoint432.h" + + +using namespace TI::DLL430; + +BreakpointPtr BreakpointManager432::createBreakpoint() const +{ + return std::make_shared(); +} + +BreakpointPtr BreakpointManager432::createBreakpoint(TriggerConditionPtr condition) const +{ + return std::make_shared(condition); +} diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager432.h b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager432.h new file mode 100644 index 0000000..1c4cc6f --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/BreakpointManager432.h @@ -0,0 +1,56 @@ +/* + * BreakpointManager432.h + * + * Handles creation of breakpoint for MSP432 + * + * Copyright (C) 2007 - 2011 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. + */ + + +#pragma once + +#include "IBreakpointManager.h" + +namespace TI { namespace DLL430 { + +class BreakpointManager432 : public IBreakpointManager +{ +public: + virtual void initialize() {} + virtual void cleanup() {} + virtual void writeConfiguration() {} + + virtual BreakpointPtr createBreakpoint() const; + virtual BreakpointPtr createBreakpoint(TriggerConditionPtr condition) const; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpoint.h b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpoint.h index 04c0d09..787766c 100644 --- a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpoint.h +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpoint.h @@ -3,41 +3,40 @@ * * Interface for breakpoints * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_IBREAKPOINT_H -#define DLL430_IBREAKPOINT_H +#pragma once #include "../TriggerCondition/ITriggerConditionManager.h" @@ -57,5 +56,3 @@ class IBreakpoint }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpointManager.h b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpointManager.h index cf0356a..2a6c4da 100644 --- a/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpointManager.h +++ b/DLL430_v3/src/TI/DLL430/EM/BreakpointManager/IBreakpointManager.h @@ -3,49 +3,48 @@ * * Interface for breakpoint manager * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_IBREAKPOINT_MANAGER_H -#define DLL430_IBREAKPOINT_MANAGER_H +#pragma once + -#include #include "../TriggerCondition/ITriggerConditionManager.h" namespace TI { namespace DLL430 { class IBreakpoint; -typedef boost::shared_ptr BreakpointPtr; +typedef std::shared_ptr BreakpointPtr; //Responsible for creation of breakpoints (class might be obsoleted) @@ -61,11 +60,7 @@ class IBreakpointManager virtual BreakpointPtr createBreakpoint(TriggerConditionPtr condition) const = 0; //Only used by EmulationManager - virtual void initialize() = 0; - virtual void cleanup() = 0; virtual void writeConfiguration() = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.cpp b/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.cpp index e24235e..678282f 100644 --- a/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.cpp @@ -3,47 +3,48 @@ * * Cycle counter functionality for MSP430. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "CycleCounter430.h" #include "../TriggerCondition/ITriggerCondition.h" -#include "../EemRegisters/EemRegisterAccess.h" +#include "../EemRegisters/EemRegisterAccess430.h" +#include "../Exceptions/Exceptions.h" using namespace TI::DLL430; namespace { - enum ClockControlRegister + enum CycleCounterRegister { CCNT0CTL = 0xb0, CCNT0L = 0xb2, @@ -53,12 +54,17 @@ namespace { CCNT1H = 0xbc }; - const ClockControlRegister cycleCounterRegisters[2][3] = { {CCNT0CTL, CCNT0L, CCNT0H}, + enum CycleCounterControlBits + { + RESET = 0x40 + }; + + const CycleCounterRegister cycleCounterRegisters[2][3] = { {CCNT0CTL, CCNT0L, CCNT0H}, {CCNT1CTL, CCNT1L, CCNT1H} }; struct LfsrRegister { - LfsrRegister(uint64_t value = 0) : value(value) {} + explicit LfsrRegister(uint64_t value = 0) : value(value) {} union { @@ -66,59 +72,50 @@ namespace { uint64_t value; }; }; +} - uint64_t toLFSR(uint64_t value) - { - const uint64_t hex2lfsr[16] = {0x0, 0x1, 0x2, 0x5, 0xa, 0x4, 0x9, 0x3, 0x6, 0xd, 0xb, 0x7, 0xe, 0xc, 0x8, 0xf}; - - uint64_t lfsr = 0; - for (int i = 0; i < 10; ++i) - { - uint8_t fraction = (value % 15); - lfsr |= hex2lfsr[fraction] << (i*4); - value /= 15; - } - return lfsr; - } +uint64_t toLFSR(uint64_t value) +{ + const uint64_t hex2lfsr[15] = { 0x0, 0x1, 0x2, 0x5, 0xa, 0x4, 0x9, 0x3, 0x6, 0xd, 0xb, 0x7, 0xe, 0xc, 0x8 }; - uint64_t fromLFSR(uint64_t lfsr) - { - const uint32_t lfsr2hex[16] = {0x0, 0x1, 0x2, 0x7, 0x5, 0x3, 0x8, 0xb, 0xe, 0x6, 0x4, 0xa, 0xd, 0x9, 0xc, 0}; + uint64_t lfsr = 0; - uint64_t value = 0; - uint32_t factor = 1; - - for (int i = 0; i < 10; ++i) - { - value += factor * lfsr2hex[(lfsr & 0xf)]; - lfsr >>= 4; - factor *= 15; - } - return value; + for (int i = 0; i < 40; i += 4) + { + lfsr |= hex2lfsr[value % 15] << i; + value /= 15; } - + return lfsr; } +uint64_t fromLFSR(uint64_t lfsr) +{ + const uint32_t lfsr2hex[16] = {0x0, 0x1, 0x2, 0x7, 0x5, 0x3, 0x8, 0xb, 0xe, 0x6, 0x4, 0xa, 0xd, 0x9, 0xc, 0}; + uint64_t value = 0; -CycleCounter430::CycleCounter430(int numCounters) + for (int i = 36; i >= 0; i -= 4) + { + value *= 15; + value += lfsr2hex[(lfsr >> i) & 0xf]; + } + return value; +} + + +CycleCounter430::CycleCounter430(size_t numCounters) : mCounters(numCounters) { for (size_t i = 0; i < mCounters.size(); ++i) { //Start/stop with Jtag control, count CPU bus cycles - mCounters[i].cycleCounterCntrl = 0x6; + mCounters[i].cycleCounterCntrl = CC_COUNT_ON_CPU_BUS; } } -CycleCounter430::~CycleCounter430() -{ -} - - void CycleCounter430::writeConfiguration() { for (size_t i = 0; i < mCounters.size(); ++i) @@ -128,70 +125,106 @@ void CycleCounter430::writeConfiguration() } -void CycleCounter430::setCounterCondition(int counter, TriggerConditionPtr condition) +void CycleCounter430::addTriggerCondition(TriggerConditionPtr triggerCondition) { - //Only counter 1 has a reaction register - if (counter == 1) + if (triggerCondition) { - mCondition = condition; - mCondition->addReaction(TR_CYCLE_COUNTER); + triggerConditions_.push_back(triggerCondition); + triggerCondition->addReaction(TR_CYCLE_COUNTER); } } -void CycleCounter430::clearCounterCondition(int counter) +void CycleCounter430::clearTriggerConditions() { - if (counter == 1) + for (TriggerConditionPtr& condition : triggerConditions_) { - mCondition->removeReaction(TR_CYCLE_COUNTER); - mCondition.reset(); + condition->removeReaction(TR_CYCLE_COUNTER); } + triggerConditions_.clear(); } -uint64_t CycleCounter430::getCounterValue(int counter) +uint64_t CycleCounter430::getCounterValue(size_t counter) const { - return mCounters[counter].value; + return getCounter(counter).value; } -void CycleCounter430::setCounterValue(int counter, uint64_t value) +void CycleCounter430::setCounterValue(size_t counter, uint64_t value) { - mCounters[counter].value = value; + getCounter(counter).value = value; } -void CycleCounter430::setCounterMode(int counter, CounterMode mode) +void CycleCounter430::setCountMode(size_t counter, CounterCountMode mode) { - //@TODO consider all modes (start, stop, clear conditions, counting modes) - mCounters[counter].cycleCounterCntrl &= ~0xf; - mCounters[counter].cycleCounterCntrl |= 0x6; + if (counter == 0 && mode == CC_COUNT_ON_REACTION) + throw EM_Exception(PARAMETER_ERR, "Invalid mode for counter 0"); + + getCounter(counter).cycleCounterCntrl &= ~0xF; + getCounter(counter).cycleCounterCntrl |= mode; } -void CycleCounter430::readCounter(int counter) +void CycleCounter430::setMode(size_t counter, uint32_t mode, uint32_t shift) { + if (counter == 0 && mode == 0x1) + throw EM_Exception(PARAMETER_ERR, "Invalid mode for counter 0"); + + if (mCounters.size() < 2 && mode == 0x2) + throw EM_Exception(PARAMETER_ERR, "Invalid mode with only one counter"); + + getCounter(counter).cycleCounterCntrl &= ~(0x3 << shift); + getCounter(counter).cycleCounterCntrl |= (mode << shift); +} + + +void CycleCounter430::resetCounter(size_t counter) +{ + getCounter(counter).cycleCounterCntrl |= RESET; +} + + +void CycleCounter430::readCounter(size_t counter) +{ + Counter& cnt = getCounter(counter); + cnt.cycleCounterCntrl = readEemRegister430(cycleCounterRegisters[counter][0]); + LfsrRegister lfsrRegister; - //Read - mCounters[counter].cycleCounterCntrl = readEemRegister(cycleCounterRegisters[counter][0]); - lfsrRegister.low = readEemRegister(cycleCounterRegisters[counter][1]); - lfsrRegister.high = readEemRegister(cycleCounterRegisters[counter][2]); + lfsrRegister.low = readEemRegister430(cycleCounterRegisters[counter][1]); + lfsrRegister.high = readEemRegister430(cycleCounterRegisters[counter][2]); - mCounters[counter].value = fromLFSR(lfsrRegister.value); + cnt.value = fromLFSR(lfsrRegister.value); } -void CycleCounter430::writeCounter(int counter) +void CycleCounter430::writeCounter(size_t counter) { - LfsrRegister lfsrRegister( toLFSR(mCounters[counter].value) ); - - writeEemRegister(cycleCounterRegisters[counter][0], mCounters[counter].cycleCounterCntrl); - writeEemRegister(cycleCounterRegisters[counter][1], lfsrRegister.low); - writeEemRegister(cycleCounterRegisters[counter][2], lfsrRegister.high); + Counter& cnt = getCounter(counter); + const bool isReset = (cnt.cycleCounterCntrl & RESET) != 0; + + writeEemRegister430(cycleCounterRegisters[counter][0], cnt.cycleCounterCntrl, isReset); + cnt.cycleCounterCntrl &= ~RESET; + + LfsrRegister lfsrRegister( toLFSR(cnt.value) ); + writeEemRegister430(cycleCounterRegisters[counter][1], lfsrRegister.low); + writeEemRegister430(cycleCounterRegisters[counter][2], lfsrRegister.high); } -void CycleCounter430::resetCounter(int counter) +CycleCounter430::Counter& CycleCounter430::getCounter(size_t counter) { - mCounters[counter].cycleCounterCntrl |= (1<<6); + if (counter >= mCounters.size()) + throw EM_Exception(PARAMETER_ERR, "Invalid counter id"); + + return mCounters[counter]; +} + +const CycleCounter430::Counter& CycleCounter430::getCounter(size_t counter) const +{ + if (counter >= mCounters.size()) + throw EM_Exception(PARAMETER_ERR, "Invalid counter id"); + + return mCounters[counter]; } diff --git a/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.h b/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.h index 297ea4c..36f6240 100644 --- a/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.h +++ b/DLL430_v3/src/TI/DLL430/EM/CycleCounter/CycleCounter430.h @@ -3,44 +3,40 @@ * * Cycle counter functionality for MSP430. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_CYCLE_COUNTER_430_H -#define DLL430_CYCLE_COUNTER_430_H - -#include -#include #include "ICycleCounter.h" namespace TI { namespace DLL430 { @@ -48,23 +44,25 @@ namespace TI { namespace DLL430 { class CycleCounter430 : public ICycleCounter { public: - CycleCounter430(int numCounters); - virtual ~CycleCounter430(); + explicit CycleCounter430(size_t numCounters); - virtual void initialize() {} - virtual void cleanup() {} virtual void writeConfiguration(); - virtual void setCounterCondition(int counter, TriggerConditionPtr condition); - virtual void clearCounterCondition(int counter); + virtual void addTriggerCondition(TriggerConditionPtr condition); + virtual void clearTriggerConditions(); + + virtual uint64_t getCounterValue(size_t counter) const; + virtual void setCounterValue(size_t counter, uint64_t value); + + virtual void setCountMode(size_t counter, CounterCountMode mode); + virtual void setStartMode(size_t counter, CounterStartMode mode) { setMode(counter, mode, 8); } + virtual void setStopMode(size_t counter, CounterStopMode mode) { setMode(counter, mode, 10); } + virtual void setClearMode(size_t counter, CounterClearMode mode) { setMode(counter, mode, 12); } - virtual uint64_t getCounterValue(int counter); - virtual void setCounterValue(int counter, uint64_t value); - virtual void setCounterMode(int counter, CounterMode mode); - - virtual void readCounter(int counter); - virtual void writeCounter(int counter); - virtual void resetCounter(int counter); + virtual void resetCounter(size_t counter); + + virtual void readCounter(size_t counter); + virtual void writeCounter(size_t counter); private: struct Counter @@ -75,10 +73,13 @@ class CycleCounter430 : public ICycleCounter uint64_t value; }; + void setMode(size_t counter, uint32_t mode, uint32_t shift); + + Counter& getCounter(size_t counter); + const Counter& getCounter(size_t counter) const; + std::vector mCounters; - TriggerConditionPtr mCondition; + std::vector triggerConditions_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/CycleCounter/ICycleCounter.h b/DLL430_v3/src/TI/DLL430/EM/CycleCounter/ICycleCounter.h index 3477565..ea75809 100644 --- a/DLL430_v3/src/TI/DLL430/EM/CycleCounter/ICycleCounter.h +++ b/DLL430_v3/src/TI/DLL430/EM/CycleCounter/ICycleCounter.h @@ -3,49 +3,77 @@ * * Interface for cycle counter module * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once - -#ifndef DLL430_ICYCLE_COUNTER_H -#define DLL430_ICYCLE_COUNTER_H - -#include #include "../TriggerCondition/ITriggerConditionManager.h" namespace TI { namespace DLL430 { -enum CounterMode {}; +enum CounterCountMode +{ + CC_COUNT_STOPPED = 0x0, + CC_COUNT_ON_REACTION = 0x1, + CC_COUNT_ON_IFCLK = 0x2, + CC_COUNT_ON_FETCH = 0x4, + CC_COUNT_ON_ALL_BUS = 0x5, + CC_COUNT_ON_CPU_BUS = 0x6, + CC_COUNT_ON_DMA_BUS = 0x7, +}; + +enum CounterStartMode +{ + CC_START_ON_RELEASE = 0x0, + CC_START_ON_REACTION = 0x1, + CC_START_ON_COUNTER = 0x2, + CC_START_IMMEDIATELY = 0x3 +}; + +enum CounterStopMode +{ + CC_STOP_ON_DBG_HALT = 0x0, + CC_STOP_ON_REACTION = 0x1, + CC_STOP_ON_COUNTER = 0x2, + CC_STOP_NO_EVENT = 0x3 +}; + +enum CounterClearMode +{ + CC_CLEAR_NO_EVENT = 0x0, + CC_CLEAR_ON_REACTION = 0x1, + CC_CLEAR_ON_COUNTER = 0x2 +}; class ICycleCounter @@ -53,23 +81,24 @@ class ICycleCounter public: virtual ~ICycleCounter() {} - //Limit to AddressRangeCondition ?? - virtual void setCounterCondition(int counter, TriggerConditionPtr condition) = 0; - virtual void clearCounterCondition(int counter) = 0; + virtual void addTriggerCondition(TriggerConditionPtr condition) = 0; + virtual void clearTriggerConditions() = 0; - virtual uint64_t getCounterValue(int counter) = 0; - virtual void setCounterValue(int counter, uint64_t value) = 0; - - virtual void readCounter(int counter) = 0; - virtual void writeCounter(int counter) = 0; - virtual void resetCounter(int counter) = 0; + virtual uint64_t getCounterValue(size_t counter) const = 0; + virtual void setCounterValue(size_t counter, uint64_t value) = 0; + + virtual void setCountMode(size_t counter, CounterCountMode mode) = 0; + virtual void setStartMode(size_t counter, CounterStartMode mode) = 0; + virtual void setStopMode(size_t counter, CounterStopMode mode) = 0; + virtual void setClearMode(size_t counter, CounterClearMode mode) = 0; + + virtual void resetCounter(size_t counter) = 0; + + virtual void readCounter(size_t counter) = 0; + virtual void writeCounter(size_t counter) = 0; //Only used by EmulationManager - virtual void initialize() = 0; - virtual void cleanup() = 0; virtual void writeConfiguration() = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess.cpp b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess430.cpp similarity index 68% rename from DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess.cpp rename to DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess430.cpp index c6f5a8f..db4cc49 100644 --- a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess430.cpp @@ -1,49 +1,48 @@ /* - * EemRegisterAccess.cpp + * EemRegisterAccess430.cpp * - * Handles access to eem registers through EemMemoryAccess + * Handles access to eem registers through EemMemoryAccess * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include +#include -#include "EemRegisterAccess.h" +#include "EemRegisterAccess430.h" #include "EemMemoryAccess.h" #include "../Exceptions/Exceptions.h" -namespace +namespace { static TI::DLL430::EemMemoryAccess* ema_ = 0; @@ -59,18 +58,41 @@ namespace } +void TI::DLL430::setEemRegisterAccess430(EemMemoryAccess* ema) +{ + resetEemRegisterCache430(); + ema_ = ema; +} + -void TI::DLL430::setEemRegisterAccess(EemMemoryAccess* ema) +void TI::DLL430::resetEemRegisterCache430() { cache.clear(); //0xBE currently largest used address, no odd addresses - cache.resize((0xBE / 2) + 1); - ema_ = ema; + cache.resize((0xBE / 2) + 1); } +void TI::DLL430::rewriteEemRegisters430() +{ + if (!ema_) + throw EM_RegisterWriteException(); + + for (size_t i = 0; i < cache.size(); ++i) + { + if (cache[i].valid) + { + if (!ema_->writeEemRegister((EemRegister)(i*2), cache[i].value)) + throw EM_RegisterWriteException(); + } + } + + if (!ema_->sync()) + throw EM_RegisterWriteException(); +} + -void TI::DLL430::writeEemRegister(uint32_t reg, uint32_t value, bool ignoreCache) +void TI::DLL430::writeEemRegister430(uint32_t reg, uint32_t value, bool ignoreCache) { const size_t slot = reg / 2; if (slot >= cache.size()) @@ -86,7 +108,7 @@ void TI::DLL430::writeEemRegister(uint32_t reg, uint32_t value, bool ignoreCache cache[slot].valid = true; } -uint32_t TI::DLL430::readEemRegister(uint32_t reg) +uint32_t TI::DLL430::readEemRegister430(uint32_t reg) { const size_t slot = reg / 2; if (slot > cache.size()) diff --git a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess430.h b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess430.h new file mode 100644 index 0000000..8c75673 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess430.h @@ -0,0 +1,54 @@ +/* + * EemRegisterAccess.h + * + * Handles access to eem registers through EemMemoryAccess + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +namespace TI { namespace DLL430 { + +class EemMemoryAccess; + +void setEemRegisterAccess430(EemMemoryAccess* ema); + +void resetEemRegisterCache430(); + +void rewriteEemRegisters430(); + +uint32_t readEemRegister430(uint32_t reg); + +void writeEemRegister430(uint32_t reg, uint32_t value, bool ignoreCache = false); + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess432.cpp b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess432.cpp new file mode 100644 index 0000000..00960b9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess432.cpp @@ -0,0 +1,68 @@ +/* + * EemRegisterAccess.cpp + * + * Handles access to eem registers through EemMemoryAccess + * + * Copyright (C) 2007 - 2011 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. + */ + + +#include + +#include "EemRegisterAccess432.h" +#include "ArmRandomMemoryAccess.h" +#include "../Exceptions/Exceptions.h" + +namespace +{ + static TI::DLL430::ArmRandomMemoryAccess* ema_ = 0; +} + +void TI::DLL430::setEemRegisterAccess432(ArmRandomMemoryAccess* ema) +{ + ema_ = ema; +} + +void TI::DLL430::writeEemRegister432(uint32_t reg, uint32_t value) +{ + if (!(ema_ && ema_->write(reg, value) && ema_->sync())) + throw EM_RegisterWriteException(); +} + +uint32_t TI::DLL430::readEemRegister432(uint32_t reg) +{ + uint8_t value[4] = {0}; + if (!(ema_ && ema_->read(reg, value, sizeof(value)) && ema_->sync())) + throw EM_RegisterReadException(); + + return value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); +} diff --git a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess432.h b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess432.h new file mode 100644 index 0000000..8261b5a --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess432.h @@ -0,0 +1,50 @@ +/* + * EemRegisterAccess.h + * + * Handles access to eem registers through EemMemoryAccess + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +namespace TI { namespace DLL430 { + +class ArmRandomMemoryAccess; + +void setEemRegisterAccess432(ArmRandomMemoryAccess* ema); + +uint32_t readEemRegister432(uint32_t reg); + +void writeEemRegister432(uint32_t reg, uint32_t value); + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.cpp b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.cpp index a9381d7..f03e913 100644 --- a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.cpp @@ -3,39 +3,39 @@ * * Emulation manager holds and manages the different modules * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "EmulationManager430.h" #include "../BreakpointManager/IBreakpointManager.h" #include "../CycleCounter/ICycleCounter.h" @@ -45,28 +45,15 @@ #include "../StateStorage430/StateStorage430.h" #include "../Exceptions/Exceptions.h" +#include "../EemRegisters/EemRegisterAccess430.h" + using namespace TI::DLL430; EmulationManager430::EmulationManager430() { -} - - -EmulationManager430::~EmulationManager430() -{ - if (mBreakpointManager) - mBreakpointManager->cleanup(); - - if (mCycleCounter) - mCycleCounter->cleanup(); - - if (mTrace) - mTrace->cleanup(); - - if (mSequencer) - mSequencer->cleanup(); + resetEemRegisterCache430(); } @@ -133,45 +120,60 @@ VariableWatchPtr EmulationManager430::getVariableWatch() const } -bool EmulationManager430::hasTriggerConditionManager() const +SoftwareBreakpointsPtr EmulationManager430::getSoftwareBreakpoints() const { - return mTriggerConditionManager; + if (!mSoftwareBreakpoints) + throw EM_NoSoftwareBreakpointsException(); + + return mSoftwareBreakpoints; } -bool EmulationManager430::hasBreakpointManager() const +bool EmulationManager430::hasTriggerConditionManager() const { - return mBreakpointManager; + return static_cast(mTriggerConditionManager); } -bool EmulationManager430::hasClockControl() const +bool EmulationManager430::hasBreakpointManager() const { - return mClockControl; + return static_cast(mBreakpointManager); } -bool EmulationManager430::hasCycleCounter() const +bool EmulationManager430::hasClockControl() const { - return mCycleCounter; + return static_cast(mClockControl); } -bool EmulationManager430::hasSequencer() const +bool EmulationManager430::hasCycleCounter() const { - return mSequencer; + return static_cast(mCycleCounter); } -bool EmulationManager430::hasTrace() const +bool EmulationManager430::hasSequencer() const { - return mTrace; + return static_cast(mSequencer); } -bool EmulationManager430::hasVariableWatch() const +bool EmulationManager430::hasTrace() const { - return mVariableWatch; + return static_cast(mTrace); +} + + +bool EmulationManager430::hasVariableWatch() const +{ + return static_cast(mVariableWatch); +} + + +bool EmulationManager430::hasSoftwareBreakpoints() const +{ + return static_cast(mSoftwareBreakpoints); } @@ -193,7 +195,7 @@ void EmulationManager430::writeConfiguration() const if (mCycleCounter) { - //mCycleCounter->writeConfiguration(); + mCycleCounter->writeConfiguration(); } if (mTrace) @@ -208,15 +210,39 @@ void EmulationManager430::writeConfiguration() const } +void EmulationManager430::rewriteConfiguration() const +{ + rewriteEemRegisters430(); +} + + void EmulationManager430::onEvent(MessageDataPtr messageData) const { - if (mTrace) + if (TracePtr trace = mTrace) { - mTrace->onEvent(messageData); + trace->onEvent(messageData); } - if (mVariableWatch) + if (VariableWatchPtr varWatch = mVariableWatch) { - mVariableWatch->onEvent(messageData); + varWatch->onEvent(messageData); } } + + +void EmulationManager430::writeRegister(uint32_t reg, uint32_t value) const +{ + writeEemRegister430(reg, value, false); +} + + +uint32_t EmulationManager430::readRegister(uint32_t reg) const +{ + return readEemRegister430(reg); +} + +void EmulationManager430::fillEMInfo(DEVICE_T *deviceData) +{ + deviceData->nDataWatchpoints = -1; + deviceData->nDataWatchpointsValueMatch = -1; +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.h b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.h index 559d37f..b9ee595 100644 --- a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.h +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430.h @@ -3,43 +3,43 @@ * * Emulation manager holds and manages the different modules * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_EMULATION_MANAGER_H -#define DLL430_EMULATION_MANAGER_H +#pragma once #include "IEmulationManager.h" +#include "../TriggerManager/TriggerManager430.h" namespace TI { namespace DLL430 { @@ -50,7 +50,7 @@ class EmulationManager430 : public IEmulationManager { public: static EmulationManagerPtr create(uint8_t emulationLevel); - + virtual TriggerConditionManagerPtr getTriggerConditionManager() const; virtual BreakpointManagerPtr getBreakpointManager() const; virtual ClockControlPtr getClockControl() const; @@ -58,6 +58,7 @@ class EmulationManager430 : public IEmulationManager virtual SequencerPtr getSequencer() const; virtual TracePtr getTrace() const; virtual VariableWatchPtr getVariableWatch() const; + virtual SoftwareBreakpointsPtr getSoftwareBreakpoints() const; virtual bool hasTriggerConditionManager() const; virtual bool hasBreakpointManager() const; @@ -66,13 +67,21 @@ class EmulationManager430 : public IEmulationManager virtual bool hasSequencer() const; virtual bool hasTrace() const; virtual bool hasVariableWatch() const; + virtual bool hasSoftwareBreakpoints() const; virtual void writeConfiguration() const; + virtual void rewriteConfiguration() const; virtual void onEvent(MessageDataPtr messageData) const; + virtual void reset() = 0; + + virtual void fillEMInfo(DEVICE_T *deviceData); + //These functions will be removed after reimplementation of clock control and cycle counter + virtual void writeRegister(uint32_t reg, uint32_t value) const; + virtual uint32_t readRegister(uint32_t reg) const; + protected: EmulationManager430(); - virtual ~EmulationManager430(); BreakpointManagerPtr mBreakpointManager; ClockControlPtr mClockControl; @@ -81,12 +90,9 @@ class EmulationManager430 : public IEmulationManager TriggerConditionManagerPtr mTriggerConditionManager; TracePtr mTrace; VariableWatchPtr mVariableWatch; - - typedef boost::shared_ptr TriggerManager430Ptr; + SoftwareBreakpointsPtr mSoftwareBreakpoints; TriggerManager430Ptr mTriggerManager; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430Create.cpp b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430Create.cpp index 64759f1..6aebb5a 100644 --- a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430Create.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager430Create.cpp @@ -1,42 +1,42 @@ /* * EmulationManager430Create.cpp * - * Creators for different EEM modules for MSP430 + * Creators for different EEM modules for MSP430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include "EmulationManager430.h" @@ -46,6 +46,7 @@ #include "../CycleCounter/CycleCounter430.h" #include "../StateStorage430/StateStorage430.h" #include "../Sequencer/Sequencer430.h" +#include "../SoftwareBreakpoints/SoftwareBreakpoints430.h" using namespace TI::DLL430; @@ -55,165 +56,201 @@ namespace { class EmNone : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); + std::shared_ptr em = std::make_shared(); return em; } + + virtual void reset() { *this = *create(); } }; class EmSmall : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(2, 0, 2, 0); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(2, 0, 2, 0); + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + } return em; } + + virtual void reset() { *this = *create(); } }; class EmMedium : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(3, 0, 3, 0); - em->mTriggerManager->setExtendedComparisons(); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(3, 0, 3, 0); + em->mTriggerManager->setExtendedComparisons(); + + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + } return em; } + + virtual void reset() { *this = *create(); } }; class EmLarge : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(8, 2, 8, 7); - em->mTriggerManager->setExtendedComparisons(); - em->mTriggerManager->setExtendedAccessTypes(); - em->mTriggerManager->setBitwiseMasking(); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); - em->mSequencer = boost::make_shared(em->mTriggerManager, false); - em->mTrace = boost::make_shared(); + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(8, 2, 8, 7); + em->mTriggerManager->setExtendedComparisons(); + em->mTriggerManager->setExtendedAccessTypes(); + em->mTriggerManager->setBitwiseMasking(); + + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + em->mSequencer = std::make_shared(em->mTriggerManager, false); + em->mTrace = std::make_shared(); + } return em; } + + virtual void reset() { *this = *create(); } }; class EmExtraSmall_5xx : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(2, 0, 2, 0); - em->mTriggerManager->setExtendedAccessTypes(); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); - em->mCycleCounter = boost::make_shared(1); + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(2, 0, 2, 0); + em->mTriggerManager->setExtendedAccessTypes(); + + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + em->mCycleCounter = std::make_shared(1); + } return em; } + + virtual void reset() { *this = *create(); } }; class EmSmall_5xx : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(3, 1, 4, 0); - em->mTriggerManager->setExtendedComparisons(); - em->mTriggerManager->setExtendedAccessTypes(); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); - em->mCycleCounter = boost::make_shared(1); + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(3, 1, 4, 0); + em->mTriggerManager->setExtendedComparisons(); + em->mTriggerManager->setExtendedAccessTypes(); + + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + em->mCycleCounter = std::make_shared(1); + } return em; } + + virtual void reset() { *this = *create(); } }; class EmMedium_5xx : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(5, 1, 6, 5); - em->mTriggerManager->setExtendedComparisons(); - em->mTriggerManager->setExtendedAccessTypes(); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); - em->mCycleCounter = boost::make_shared(1); - em->mSequencer = boost::make_shared(em->mTriggerManager, true); + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(5, 1, 6, 5); + em->mTriggerManager->setExtendedComparisons(); + em->mTriggerManager->setExtendedAccessTypes(); + + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + em->mCycleCounter = std::make_shared(1); + em->mSequencer = std::make_shared(em->mTriggerManager, true); + } return em; } + + virtual void reset() { *this = *create(); } }; class EmLarge_5xx : public EmulationManager430 { public: - static EmulationManagerPtr create() + static std::shared_ptr create() { - boost::shared_ptr em = boost::make_shared(); - - em->mTriggerManager = boost::make_shared(8, 2, 10, 7); - em->mTriggerManager->setExtendedComparisons(); - em->mTriggerManager->setExtendedAccessTypes(); - em->mTriggerManager->setBitwiseMasking(); - - em->mTriggerConditionManager = boost::make_shared(em->mTriggerManager); - em->mBreakpointManager = boost::make_shared(); - em->mCycleCounter = boost::make_shared(2); - em->mSequencer = boost::make_shared(em->mTriggerManager, false); - - boost::shared_ptr stateStorage = boost::make_shared(); - em->mTrace = stateStorage; - em->mVariableWatch = stateStorage; + std::shared_ptr em = std::make_shared(); + if (em.get()) + { + em->mTriggerManager = std::make_shared(8, 2, 10, 7); + em->mTriggerManager->setExtendedComparisons(); + em->mTriggerManager->setExtendedAccessTypes(); + em->mTriggerManager->setBitwiseMasking(); + + em->mSoftwareBreakpoints = std::make_shared(em->mTriggerManager); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager, em->mSoftwareBreakpoints); + em->mBreakpointManager = std::make_shared(); + em->mCycleCounter = std::make_shared(2); + em->mSequencer = std::make_shared(em->mTriggerManager, false); + + std::shared_ptr stateStorage = std::make_shared(); + em->mTrace = stateStorage; + em->mVariableWatch = stateStorage; + } return em; } + + virtual void reset() { *this = *create(); } }; } - + EmulationManagerPtr EmulationManager430::create(uint8_t emulationLevel) { - typedef EmulationManagerPtr (*CreatorFunction)(); - const CreatorFunction creatorFunctions[8] = + switch (emulationLevel) { - EmNone::create, - EmSmall::create, - EmMedium::create, - EmLarge::create, - EmExtraSmall_5xx::create, - EmSmall_5xx::create, - EmMedium_5xx::create, - EmLarge_5xx::create - }; - - return (emulationLevel < 8) ? creatorFunctions[emulationLevel]() : EmNone::create(); + case 0: return EmNone::create(); + case 1: return EmSmall::create(); + case 2: return EmMedium::create(); + case 3: return EmLarge::create(); + case 4: return EmExtraSmall_5xx::create(); + case 5: return EmSmall_5xx::create(); + case 6: return EmMedium_5xx::create(); + case 7: return EmLarge_5xx::create(); + default: break; + } + + return EmNone::create(); } diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432.cpp b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432.cpp new file mode 100644 index 0000000..57bf892 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432.cpp @@ -0,0 +1,188 @@ +/* + * EmulationManager432.cpp + * + * Emulation manager holds and manages the different modules + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "EmulationManager432.h" +#include "../BreakpointManager/IBreakpointManager.h" +#include "../TriggerManager/TriggerManager432.h" +#include "../TriggerCondition/TriggerConditionManager432.h" +#include "../Exceptions/Exceptions.h" + +#include "../EemRegisters/EemRegisterAccess432.h" + + +using namespace TI::DLL430; + + +TriggerConditionManagerPtr EmulationManager432::getTriggerConditionManager() const +{ + if (!mTriggerConditionManager) + throw EM_NoTriggerConditionManagerException(); + + return mTriggerConditionManager; +} + + +BreakpointManagerPtr EmulationManager432::getBreakpointManager() const +{ + if (!mBreakpointManager) + throw EM_NoBreakpointManagerException(); + + return mBreakpointManager; +} + + +ClockControlPtr EmulationManager432::getClockControl() const +{ + throw EM_NoClockControlException(); +} + + +CycleCounterPtr EmulationManager432::getCycleCounter() const +{ + throw EM_NoCycleCounterException(); +} + + +SequencerPtr EmulationManager432::getSequencer() const +{ + throw EM_NoSequencerException(); +} + + +TracePtr EmulationManager432::getTrace() const +{ + throw EM_NoTraceException(); +} + + +VariableWatchPtr EmulationManager432::getVariableWatch() const +{ + throw EM_NoVariableWatchException(); +} + + +SoftwareBreakpointsPtr EmulationManager432::getSoftwareBreakpoints() const +{ + throw EM_NoSoftwareBreakpointsException(); +} + + +bool EmulationManager432::hasTriggerConditionManager() const +{ + return static_cast(mTriggerConditionManager); +} + + +bool EmulationManager432::hasBreakpointManager() const +{ + return static_cast(mBreakpointManager); +} + + +bool EmulationManager432::hasClockControl() const +{ + return false; +} + + +bool EmulationManager432::hasCycleCounter() const +{ + return false; +} + + +bool EmulationManager432::hasSequencer() const +{ + return false; +} + + +bool EmulationManager432::hasTrace() const +{ + return false; +} + + +bool EmulationManager432::hasVariableWatch() const +{ + return false; +} + + +bool EmulationManager432::hasSoftwareBreakpoints() const +{ + return false; +} + + +void EmulationManager432::writeConfiguration() const +{ + if (mTriggerManager) + { + mTriggerManager->writeAllTriggers(); + } +} + + +void EmulationManager432::rewriteConfiguration() const +{ + writeConfiguration(); +} + + +void EmulationManager432::onEvent(MessageDataPtr messageData) const +{ +} + + +void EmulationManager432::writeRegister(uint32_t reg, uint32_t value) const +{ + writeEemRegister432(reg, value); +} + + +uint32_t EmulationManager432::readRegister(uint32_t reg) const +{ + return readEemRegister432(reg); +} + +void EmulationManager432::fillEMInfo(DEVICE_T *deviceData) +{ + deviceData->nDataWatchpoints = this->mTriggerManager->numAvailableDataAddressTriggers(); + deviceData->nDataWatchpointsValueMatch = this->mTriggerManager->numAvailableDataValueTriggers(); +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432.h b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432.h new file mode 100644 index 0000000..281453e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432.h @@ -0,0 +1,89 @@ +/* + * EmulationManager430.h + * + * Emulation manager holds and manages the different modules + * + * Copyright (C) 2007 - 2011 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. + */ + + +#pragma once + +#include "IEmulationManager.h" +#include "../TriggerManager/TriggerManager432.h" + +namespace TI { namespace DLL430 { + +class EmulationManager432 : public IEmulationManager +{ +public: + static EmulationManagerPtr create(uint8_t emulationLevel); + + virtual TriggerConditionManagerPtr getTriggerConditionManager() const; + virtual BreakpointManagerPtr getBreakpointManager() const; + virtual ClockControlPtr getClockControl() const; + virtual CycleCounterPtr getCycleCounter() const; + virtual SequencerPtr getSequencer() const; + virtual TracePtr getTrace() const; + virtual VariableWatchPtr getVariableWatch() const; + virtual SoftwareBreakpointsPtr getSoftwareBreakpoints() const; + + virtual bool hasTriggerConditionManager() const; + virtual bool hasBreakpointManager() const; + virtual bool hasClockControl() const; + virtual bool hasCycleCounter() const; + virtual bool hasSequencer() const; + virtual bool hasTrace() const; + virtual bool hasVariableWatch() const; + virtual bool hasSoftwareBreakpoints() const; + + virtual void writeConfiguration() const; + virtual void rewriteConfiguration() const; + virtual void onEvent(MessageDataPtr messageData) const; + + virtual void reset() = 0; + + virtual void fillEMInfo(DEVICE_T *deviceData); + //These functions will be removed after reimplementation of clock control and cycle counter + virtual void writeRegister(uint32_t reg, uint32_t value) const; + virtual uint32_t readRegister(uint32_t reg) const; + +protected: + virtual ~EmulationManager432() {} + + BreakpointManagerPtr mBreakpointManager; + TriggerConditionManagerPtr mTriggerConditionManager; + + TriggerManager432Ptr mTriggerManager; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432Create.cpp b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432Create.cpp new file mode 100644 index 0000000..510ca39 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/EmulationManager432Create.cpp @@ -0,0 +1,101 @@ +/* + * EmulationManager430Create.cpp + * + * Creators for different EEM modules for MSP430 + * + * Copyright (C) 2007 - 2011 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. + */ + + +#include + +#include "EmulationManager432.h" + +#include "../TriggerManager/TriggerManager432.h" +#include "../TriggerCondition/TriggerConditionManager432.h" +#include "../BreakpointManager/BreakpointManager432.h" + +using namespace TI::DLL430; + +namespace { + + class EmCortex_M4 : public EmulationManager432 + { + public: + static std::shared_ptr create() + { + std::shared_ptr em = std::make_shared(); + + std::vector vecCodeTriggers = { 0, 1, 2, 3, 4, 5 }; + std::vector vecLiteralTriggers; + std::vector vecDataAddressTriggers = { 2, 3 }; + std::vector vecDataValuesTriggers = { 1 }; + em->mTriggerManager = std::make_shared(vecCodeTriggers, vecLiteralTriggers, vecDataAddressTriggers, vecDataValuesTriggers); + em->mBreakpointManager = std::make_shared(); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager); + return em; + } + + virtual void reset() { *this = *create(); } + }; + + class EmCortex_M0 : public EmulationManager432 + { + public: + static std::shared_ptr create() + { + std::shared_ptr em = std::make_shared(); + + std::vector vecCodeTriggers = { 0, 1, 2, 3 }; + std::vector vecLiteralTriggers; + std::vector vecDataAddressTriggers = { 0 }; + std::vector vecDataValuesTriggers = { 1 }; + em->mTriggerManager = std::make_shared(vecCodeTriggers, vecLiteralTriggers, vecDataAddressTriggers, vecDataValuesTriggers); + em->mBreakpointManager = std::make_shared(); + em->mTriggerConditionManager = std::make_shared(em->mTriggerManager); + return em; + } + + virtual void reset() { *this = *create(); } + }; + +} + +EmulationManagerPtr EmulationManager432::create(uint8_t emulationLevel) +{ + switch (emulationLevel) + { + case 8: return EmCortex_M4::create(); + case 9: return EmCortex_M0::create(); + } + return EmCortex_M4::create(); +} diff --git a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/IEmulationManager.h b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/IEmulationManager.h index 352aaae..5d33f29 100644 --- a/DLL430_v3/src/TI/DLL430/EM/EmulationManager/IEmulationManager.h +++ b/DLL430_v3/src/TI/DLL430/EM/EmulationManager/IEmulationManager.h @@ -3,73 +3,70 @@ * * Interface for emulation manager * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_IEMULATION_MANAGER_H -#define DLL430_IEMULATION_MANAGER_H - -#include -#include +#include +#include "../TriggerCondition/ITriggerConditionManager.h" +#include "../SoftwareBreakpoints/ISoftwareBreakpoints.h" namespace TI { namespace DLL430 { class IEmulationManager; -class ITriggerConditionManager; class IBreakpointManager; class IClockControl; class ICycleCounter; class ISequencer; class ITrace; class IVariableWatch; -class MessageData; -typedef boost::shared_ptr EmulationManagerPtr; -typedef boost::shared_ptr TriggerConditionManagerPtr; -typedef boost::shared_ptr BreakpointManagerPtr; -typedef boost::shared_ptr ClockControlPtr; -typedef boost::shared_ptr CycleCounterPtr; -typedef boost::shared_ptr SequencerPtr; -typedef boost::shared_ptr TracePtr; -typedef boost::shared_ptr VariableWatchPtr; -typedef boost::shared_ptr MessageDataPtr; +typedef std::shared_ptr EmulationManagerPtr; +typedef std::shared_ptr BreakpointManagerPtr; +typedef std::shared_ptr ClockControlPtr; +typedef std::shared_ptr CycleCounterPtr; +typedef std::shared_ptr SequencerPtr; +typedef std::shared_ptr TracePtr; +typedef std::shared_ptr VariableWatchPtr; //Encapsulating the entire emulation module and managing its components class IEmulationManager { public: + virtual ~IEmulationManager() {} + //Get components (will throw if component does not exist/is not supported) virtual TriggerConditionManagerPtr getTriggerConditionManager() const = 0; virtual BreakpointManagerPtr getBreakpointManager() const = 0; @@ -78,6 +75,7 @@ class IEmulationManager virtual SequencerPtr getSequencer() const = 0; virtual TracePtr getTrace() const = 0; virtual VariableWatchPtr getVariableWatch() const = 0; + virtual SoftwareBreakpointsPtr getSoftwareBreakpoints() const = 0; //Check if a specific component is supported virtual bool hasTriggerConditionManager() const = 0; @@ -87,14 +85,24 @@ class IEmulationManager virtual bool hasSequencer() const = 0; virtual bool hasTrace() const = 0; virtual bool hasVariableWatch() const = 0; + virtual bool hasSoftwareBreakpoints() const = 0; //Write current configuration for all components to target device virtual void writeConfiguration() const = 0; + //Rewrite the current configuration (ex. after a reset) + virtual void rewriteConfiguration() const = 0; + //Process asynchronous events reported by the UIF virtual void onEvent(MessageDataPtr) const = 0; + + //Reset to default values, clear cache and triggers + virtual void reset() = 0; + + virtual void fillEMInfo(DEVICE_T *deviceData) = 0; + //These functions will be removed after reimplementation of clock control and cycle counter + virtual void writeRegister(uint32_t reg, uint32_t value) const = 0; + virtual uint32_t readRegister(uint32_t reg) const = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.cpp b/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.cpp index cd29448..7a90f10 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.cpp @@ -3,125 +3,148 @@ * * Emulation module exceptions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include +#include #include "Exceptions.h" using namespace TI::DLL430; -EM_NoEmulationManagerException::EM_NoEmulationManagerException() - : EM_Exception(INTERNAL_ERR, "No emulation manager") {} +DLL430_FileOpenException::DLL430_FileOpenException() + : DLL430_Exception(FILE_OPEN_ERR, "Can't open file") {} + +EM_NoEmulationManagerException::EM_NoEmulationManagerException() + : EM_Exception(INTERNAL_ERR, "No emulation manager") {} -EM_NoTriggerConditionManagerException::EM_NoTriggerConditionManagerException() +EM_NoTriggerConditionManagerException::EM_NoTriggerConditionManagerException() : EM_Exception(INTERNAL_ERR, "Module does not exist") {} - -EM_NoBreakpointManagerException::EM_NoBreakpointManagerException() +EM_NoBreakpointManagerException::EM_NoBreakpointManagerException() : EM_Exception(BREAKPOINT_ERR, "Module does not exist") {} - -EM_NoClockControlException::EM_NoClockControlException() +EM_NoClockControlException::EM_NoClockControlException() : EM_Exception(CLK_CTRL_ERR, "Module does not exist") {} - -EM_NoCycleCounterException::EM_NoCycleCounterException() +EM_NoCycleCounterException::EM_NoCycleCounterException() : EM_Exception(RESOURCE_ERR, "Module does not exist") {} - -EM_NoSequencerException::EM_NoSequencerException() +EM_NoSequencerException::EM_NoSequencerException() : EM_Exception(SEQUENCER_ERR, "Module does not exist") {} - -EM_NoTraceException::EM_NoTraceException() +EM_NoTraceException::EM_NoTraceException() : EM_Exception(STATE_STOR_ERR, "Module does not exist") {} - -EM_NoVariableWatchException::EM_NoVariableWatchException() +EM_NoVariableWatchException::EM_NoVariableWatchException() : EM_Exception(STATE_STOR_ERR, "Module does not exist") {} +EM_NoSoftwareBreakpointsException::EM_NoSoftwareBreakpointsException() + : EM_Exception(RESOURCE_ERR, "Module does not exist") {} -EM_NotSupportedException::EM_NotSupportedException() - : EM_Exception(RESOURCE_ERR, "Function is not supported") {} +EM_NotSupportedException::EM_NotSupportedException() + : EM_Exception(RESOURCE_ERR, "Function is not supported") {} -EM_TriggerResourceException::EM_TriggerResourceException() +EM_TriggerResourceException::EM_TriggerResourceException() : EM_Exception(RESOURCE_ERR, "Out of trigger resources") {} - -EM_TriggerParameterException::EM_TriggerParameterException() +EM_TriggerParameterException::EM_TriggerParameterException() : EM_Exception(PARAMETER_ERR, "Option not supported") {} - -EM_RegisterWriteException::EM_RegisterWriteException() +EM_RegisterWriteException::EM_RegisterWriteException() : EM_Exception(WRITE_REGISTER_ERR, "Error writing EEM registers") {} - -EM_RegisterReadException::EM_RegisterReadException() +EM_RegisterReadException::EM_RegisterReadException() : EM_Exception(READ_REGISTER_ERR, "Error reading EEM registers") {} - -EM_SequencerException::EM_SequencerException() +EM_SequencerException::EM_SequencerException() : EM_Exception(PARAMETER_ERR, "Invalid state or transition") {} - -EM_StateStorageConflictException::EM_StateStorageConflictException() +EM_StateStorageConflictException::EM_StateStorageConflictException() : EM_Exception(RESOURCE_ERR, "Trace and Variable watch can't be used simultaneously") {} - -EM_NotVariableWatchModeException::EM_NotVariableWatchModeException() +EM_NotVariableWatchModeException::EM_NotVariableWatchModeException() : EM_Exception(VAR_WATCH_EN_ERR, "Not in variable watch mode") {} - -EM_TriggerConfigurationException::EM_TriggerConfigurationException() +EM_TriggerConfigurationException::EM_TriggerConfigurationException() : EM_Exception(RESOURCE_ERR, "No valid trigger configuration possible") {} + + +EM_EemNotAccessibleException::EM_EemNotAccessibleException() + : EM_Exception(EEM_NOT_ACCESSIBLE, "EEM module not accessible while running in Low Power Debug Mode - Activate High Power Debug Mode to enable this feature") {} + + +EM_TriggerConflictException::EM_TriggerConflictException() + : EM_Exception(TRIGGER_CONFLICT_ERR, "Trigger conflicts with existing trigger") {} + + +EM_SwbpCriticalInstruction::EM_SwbpCriticalInstruction() + : EM_Exception(SWBP_CRITICAL_INSTRUCTION, "Software breakpoint can't be set (followed by critical value)") {} + + +EM_SoftwareBreakpointsNotEnabledException::EM_SoftwareBreakpointsNotEnabledException() + : EM_Exception(RESOURCE_ERR, "Software breakpoints are not enabled") {} + + +EM_MemoryAccessFunctionException::EM_MemoryAccessFunctionException() + : EM_Exception(INTERNAL_ERR, "Memory access functions not configured") {} + + +EM_InstructionEntryMissingException::EM_InstructionEntryMissingException() + : EM_Exception(INTERNAL_ERR, "No instruction stored for this address") {} + + +EM_MemoryReadErrorException::EM_MemoryReadErrorException() + : EM_Exception(READ_MEMORY_ERR, "Failed reading device memory") {} + + +EM_MemoryWriteErrorException::EM_MemoryWriteErrorException() + : EM_Exception(WRITE_MEMORY_ERR, "Failed writing device memory") {} diff --git a/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.h b/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.h index 095e55f..7418baa 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.h +++ b/DLL430_v3/src/TI/DLL430/EM/Exceptions/Exceptions.h @@ -3,110 +3,120 @@ * * Emulation module exceptions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_EXCEPTIONS_H -#define DLL430_EXCEPTIONS_H +#pragma once #include -#include + namespace TI { namespace DLL430 { class EM_Exception : public std::runtime_error { public: + EM_Exception(uint32_t error, const char* msg) : errorCode_(error), runtime_error(msg) {} + uint32_t errorCode() const { return errorCode_; } -protected: - EM_Exception(uint32_t error, const char* msg) : errorCode_(error), runtime_error(msg) {} +private: + uint32_t errorCode_; +}; + + +class DLL430_Exception : public std::runtime_error +{ +public: + explicit DLL430_Exception(uint32_t error) : errorCode_(error), runtime_error("") {} + DLL430_Exception(uint32_t error, const char* msg) : errorCode_(error), runtime_error(msg) {} + + uint32_t errorCode() const { return errorCode_; } private: uint32_t errorCode_; }; +class DLL430_FileOpenException : public DLL430_Exception +{ +public: + DLL430_FileOpenException(); +}; + -class EM_NoEmulationManagerException : public EM_Exception +class EM_NoEmulationManagerException : public EM_Exception { public: EM_NoEmulationManagerException(); }; - -class EM_NoTriggerConditionManagerException : public EM_Exception +class EM_NoTriggerConditionManagerException : public EM_Exception { public: EM_NoTriggerConditionManagerException(); }; - -class EM_NoBreakpointManagerException : public EM_Exception +class EM_NoBreakpointManagerException : public EM_Exception { public: EM_NoBreakpointManagerException(); }; - -class EM_NoClockControlException : public EM_Exception +class EM_NoClockControlException : public EM_Exception { public: EM_NoClockControlException(); }; - -class EM_NoCycleCounterException : public EM_Exception +class EM_NoCycleCounterException : public EM_Exception { public: EM_NoCycleCounterException(); }; - -class EM_NoSequencerException : public EM_Exception +class EM_NoSequencerException : public EM_Exception { public: EM_NoSequencerException(); }; - class EM_NoTraceException : public EM_Exception { public: @@ -114,7 +124,6 @@ class EM_NoTraceException : public EM_Exception }; - class EM_NoVariableWatchException : public EM_Exception { public: @@ -122,23 +131,27 @@ class EM_NoVariableWatchException : public EM_Exception }; +class EM_NoSoftwareBreakpointsException : public EM_Exception +{ +public: + EM_NoSoftwareBreakpointsException(); +}; + -class EM_NotSupportedException : public EM_Exception +class EM_NotSupportedException : public EM_Exception { public: EM_NotSupportedException(); }; - -class EM_TriggerResourceException : public EM_Exception +class EM_TriggerResourceException : public EM_Exception { public: EM_TriggerResourceException(); }; - class EM_TriggerParameterException : public EM_Exception { public: @@ -146,7 +159,6 @@ class EM_TriggerParameterException : public EM_Exception }; - class EM_RegisterWriteException : public EM_Exception { public: @@ -154,7 +166,6 @@ class EM_RegisterWriteException : public EM_Exception }; - class EM_RegisterReadException : public EM_Exception { public: @@ -162,7 +173,6 @@ class EM_RegisterReadException : public EM_Exception }; - class EM_SequencerException : public EM_Exception { public: @@ -170,7 +180,6 @@ class EM_SequencerException : public EM_Exception }; - class EM_StateStorageConflictException : public EM_Exception { public: @@ -178,7 +187,6 @@ class EM_StateStorageConflictException : public EM_Exception }; - class EM_NotVariableWatchModeException : public EM_Exception { public: @@ -186,13 +194,66 @@ class EM_NotVariableWatchModeException : public EM_Exception }; - class EM_TriggerConfigurationException : public EM_Exception { public: EM_TriggerConfigurationException(); }; -}} -#endif +class EM_EemNotAccessibleException : public EM_Exception +{ +public: + EM_EemNotAccessibleException(); +}; + + +class EM_TriggerConflictException : public EM_Exception +{ +public: + EM_TriggerConflictException(); +}; + + +class EM_SwbpCriticalInstruction : public EM_Exception +{ +public: + EM_SwbpCriticalInstruction(); +}; + + +class EM_SoftwareBreakpointsNotEnabledException : public EM_Exception +{ +public: + EM_SoftwareBreakpointsNotEnabledException(); +}; + + +class EM_MemoryAccessFunctionException : public EM_Exception +{ +public: + EM_MemoryAccessFunctionException(); +}; + + +class EM_InstructionEntryMissingException : public EM_Exception +{ +public: + EM_InstructionEntryMissingException(); +}; + + +class EM_MemoryReadErrorException : public EM_Exception +{ +public: + EM_MemoryReadErrorException(); +}; + + +class EM_MemoryWriteErrorException : public EM_Exception +{ +public: + EM_MemoryWriteErrorException(); +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/Sequencer/ISequencer.h b/DLL430_v3/src/TI/DLL430/EM/Sequencer/ISequencer.h index 88d24ee..6b26280 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Sequencer/ISequencer.h +++ b/DLL430_v3/src/TI/DLL430/EM/Sequencer/ISequencer.h @@ -3,43 +3,40 @@ * * Interface for sequencer module * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_ISEQUENCER_H -#define DLL430_ISEQUENCER_H - -#include #include "../TriggerCondition/ITriggerCondition.h" namespace TI { namespace DLL430 { @@ -53,21 +50,12 @@ class ISequencer : public ITriggerCondition public: virtual ~ISequencer() {} - //Returns max. number of states (only final state can trigger reactions) - virtual uint32_t getMaxStates() const = 0; - - //Return number of transitions going out from each state - virtual uint32_t getMaxTransitions() const = 0; - //Read current sequencer state from device virtual uint32_t readCurrentState() const = 0; //Reset sequencer to state 0 virtual void reset() = 0; - - //Set triggers to be either edge or level sensitive - virtual void setTriggerMode(SequencerTriggerMode mode) = 0; - + //Set a trigger condition to automatically reset the sequencer virtual void setResetTrigger(TriggerConditionPtr triggerCondition) = 0; @@ -88,13 +76,11 @@ class ISequencer : public ITriggerCondition virtual void clearAllTransitions() = 0; //Only used by EmulationManager - virtual void initialize() = 0; - virtual void cleanup() = 0; virtual void writeConfiguration() = 0; + virtual void enable() = 0; + virtual void disable() = 0; virtual bool isEnabled() const = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.cpp b/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.cpp index d5251b5..a4033ca 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.cpp @@ -3,46 +3,44 @@ * * Sequencer implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include -#include +#include #include "Sequencer430.h" #include "../TriggerManager/TriggerManager430.h" -#include "../EemRegisters/EemRegisterAccess.h" +#include "../EemRegisters/EemRegisterAccess430.h" #include "../Exceptions/Exceptions.h" @@ -56,8 +54,8 @@ namespace { } Sequencer430::Sequencer430(TriggerManager430Ptr triggerManager, bool sixTriggerEem) - : triggerManager_(triggerManager) - , states_(NUM_STATES) + : states_(NUM_STATES) + , triggerManager_(triggerManager) , seqCntrl_(0) , nxtState0_(0) , nxtState1_(0) @@ -66,25 +64,8 @@ Sequencer430::Sequencer430(TriggerManager430Ptr triggerManager, bool sixTriggerE } -Sequencer430::~Sequencer430() -{ -} - - -void Sequencer430::initialize() -{ -} - - -void Sequencer430::cleanup() -{ -} - - void Sequencer430::writeConfiguration() { - const uint8_t TRANS_A = 0, TRANS_B = 1; - nxtState0_ = 0; nxtState1_ = 0; @@ -94,8 +75,8 @@ void Sequencer430::writeConfiguration() const uint32_t trans = i % NUM_TRANSITIONS; const uint32_t offset = (i < 4) ? (i*4) : (i-4)*4; uint16_t& reg = (i < 4) ? nxtState0_ : nxtState1_; - - reg |= states_[state].nextState[trans] << offset; + + reg |= static_cast(states_[state].nextState[trans]) << offset; if (states_[state].trigger[trans]) { @@ -113,27 +94,15 @@ void Sequencer430::writeConfiguration() seqCntrl_ &= ~SEQ_RESET; - writeEemRegister(SEQ_NXTSTATE0, nxtState0_); - writeEemRegister(SEQ_NXTSTATE1, nxtState1_); - writeEemRegister(SEQ_CTL, seqCntrl_, forceCntrlRegisterWrite); -} - - -uint32_t Sequencer430::getMaxStates() const -{ - return NUM_STATES; -} - - -uint32_t Sequencer430::getMaxTransitions() const -{ - return NUM_TRANSITIONS; + writeEemRegister430(SEQ_NXTSTATE0, nxtState0_); + writeEemRegister430(SEQ_NXTSTATE1, nxtState1_); + writeEemRegister430(SEQ_CTL, seqCntrl_, forceCntrlRegisterWrite); } uint32_t Sequencer430::readCurrentState() const { - const uint32_t cntrlRegister = readEemRegister(SEQ_CTL); + const uint32_t cntrlRegister = readEemRegister430(SEQ_CTL); return (cntrlRegister >> 8) & 0x3; } @@ -206,28 +175,12 @@ void Sequencer430::clearAllTransitions() } - - - -void Sequencer430::reset() +void Sequencer430::reset() { seqCntrl_ |= SEQ_RESET; } -void Sequencer430::setTriggerMode(SequencerTriggerMode mode) -{ - if (mode == STM_LEVEL_TRIGGER) - { - seqCntrl_ |= SEQ_LEVEL_SENSITIVE; - } - else - { - seqCntrl_ &= ~SEQ_LEVEL_SENSITIVE; - } -} - - void Sequencer430::addReaction(TriggerReaction reaction) { triggerManager_->addSequencerOutReaction(reaction); @@ -252,7 +205,7 @@ void Sequencer430::enable() triggerManager_->enableSequencerOutReactions(); - BOOST_FOREACH(State& state, states_) + for (State& state : states_) { if (state.trigger[0]) state.trigger[0]->addReaction(TR_SEQUENCER); @@ -267,13 +220,14 @@ void Sequencer430::enable() } } + void Sequencer430::disable() { seqCntrl_ &= ~SEQ_ENABLE; triggerManager_->disableSequencerOutReactions(); - BOOST_FOREACH(State& state, states_) + for (State& state : states_) { if (state.trigger[0]) state.trigger[0]->removeReaction(TR_SEQUENCER); @@ -288,6 +242,7 @@ void Sequencer430::disable() } } + bool Sequencer430::isEnabled() const { return (seqCntrl_ & SEQ_ENABLE) != 0; diff --git a/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.h b/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.h index 885bb5a..09972f5 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.h +++ b/DLL430_v3/src/TI/DLL430/EM/Sequencer/Sequencer430.h @@ -3,75 +3,57 @@ * * Sequencer implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_SEQUENCER_430_H -#define DLL430_SEQUENCER_430_H - -#include -#include -#include #include "ISequencer.h" +#include "../TriggerManager/TriggerManager430.h" namespace TI { namespace DLL430 { -class TriggerManager430; -typedef boost::shared_ptr TriggerManager430Ptr; - - class Sequencer430 : public ISequencer { public: Sequencer430(TriggerManager430Ptr triggerManager, bool sixTriggerEem); - virtual ~Sequencer430(); - virtual void initialize(); - virtual void cleanup(); - virtual void writeConfiguration(); - virtual uint32_t getMaxStates() const; - - virtual uint32_t getMaxTransitions() const; - virtual uint32_t readCurrentState() const; virtual void reset(); - - virtual void setTriggerMode(SequencerTriggerMode mode); virtual void setResetTrigger(TriggerConditionPtr triggerCondition); @@ -84,7 +66,6 @@ class Sequencer430 : public ISequencer virtual void clearAllTransitions(); - virtual void addReaction(TriggerReaction reaction); virtual void removeReaction(TriggerReaction reaction); @@ -103,7 +84,7 @@ class Sequencer430 : public ISequencer struct State { - State() { memset(nextState, 0, sizeof(nextState)); } + State() { std::fill_n(nextState, NUM_TRANSITIONS, 0); } uint8_t nextState[NUM_TRANSITIONS]; TriggerConditionPtr trigger[NUM_TRANSITIONS]; }; @@ -122,5 +103,3 @@ class Sequencer430 : public ISequencer }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/ISoftwareBreakpoints.h b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/ISoftwareBreakpoints.h new file mode 100644 index 0000000..f4f27c5 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/ISoftwareBreakpoints.h @@ -0,0 +1,59 @@ +/* + * ISoftwareBreakpoints.h + * + * Interface for software breakpoints. + * + * Copyright (C) 2007 - 2013 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. + */ + +#pragma once + + +#include "SoftwareBreakpointManager.h" + + +namespace TI { namespace DLL430 { + +class ISoftwareBreakpoints +{ +public: + virtual ~ISoftwareBreakpoints() {} + + virtual void enable() = 0; + virtual void disable() = 0; + virtual bool isEnabled() const = 0; + virtual SoftwareBreakpointManagerPtr getSwbpManager() const = 0; +}; + +typedef std::shared_ptr SoftwareBreakpointsPtr; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpointManager.cpp b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpointManager.cpp new file mode 100644 index 0000000..51d7269 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpointManager.cpp @@ -0,0 +1,255 @@ +/* + * SoftwareBreakpointManager.cpp + * + * Manages software breakpoints and replaced instruction opcodes. + * + * Copyright (C) 2007 - 2013 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. + */ + +#include +#include "SoftwareBreakpointManager.h" +#include "../Exceptions/Exceptions.h" + + +using namespace TI::DLL430; + +SoftwareBreakpointManager::ReadFunction SoftwareBreakpointManager::sRead; +SoftwareBreakpointManager::WriteFunction SoftwareBreakpointManager::sWrite; +SoftwareBreakpointManager::SyncFunction SoftwareBreakpointManager::sSync; + +void SoftwareBreakpointManager::setMemoryAccessFunctions(SoftwareBreakpointManager::ReadFunction read, + SoftwareBreakpointManager::WriteFunction write, + SoftwareBreakpointManager::SyncFunction sync) +{ + sRead = read; + sWrite = write; + sSync = sync; +} + + +SoftwareBreakpointManager::SoftwareBreakpointManager(uint16_t triggerOpCode) + : mTriggerOpCode(triggerOpCode) +{ +} + +void SoftwareBreakpointManager::setSoftwareTriggerAt(uint32_t address) +{ + if (!(sRead && sWrite && sSync)) + throw EM_MemoryAccessFunctionException(); + + uint8_t instruction[2] = {0}; + if (!sRead(address, instruction, 2) || !sSync()) + throw EM_MemoryReadErrorException(); + + const uint8_t opCode[2] = { static_cast(mTriggerOpCode), static_cast(mTriggerOpCode >> 8)}; + if (!sWrite(address, opCode, 2) || !sSync()) + throw EM_MemoryWriteErrorException(); + + if (!verifyValueAt(address, mTriggerOpCode)) + throw EM_MemoryWriteErrorException(); + + mInstructionTable[address] = (uint16_t)((instruction[0] & 0xFF) | (instruction[1] << 8)); +} + +void SoftwareBreakpointManager::removeSoftwareTriggerAt(uint32_t address) +{ + if (!(sRead && sWrite && sSync)) + throw EM_MemoryAccessFunctionException(); + + uint8_t opCodeTmp[2] = {0}; + if (!sRead(address, opCodeTmp, 2) || !sSync()) + throw EM_MemoryReadErrorException(); + + const uint16_t opCode = (uint16_t)((opCodeTmp[0] & 0xFF) + (opCodeTmp[1] << 8)); + + if (opCode == mTriggerOpCode) + { + const uint16_t instruction = getInstructionAt(address); + if (instruction == 0) + throw EM_InstructionEntryMissingException(); + + const uint8_t instrTmp[2] = {static_cast(instruction), static_cast(instruction >> 8)}; + if (!sWrite(address, instrTmp, 2) || !sSync()) + throw EM_MemoryWriteErrorException(); + + if (!verifyValueAt(address, instruction)) + throw EM_MemoryWriteErrorException(); + } + mInstructionTable.erase(address); +} + + +void SoftwareBreakpointManager::writeGroup(const std::vector& group) +{ + const uint32_t start = group.front()->first; + const uint32_t end = group.back()->first + 2; + + std::vector data(end - start); + sRead(start, &data[0], data.size()) && sSync(); + + for (const auto& entry : group) + { + data[entry->first - start] = entry->second & 0xFF; + data[entry->first - start + 1] = entry->second >> 8; + } + + sWrite(start, &data[0], data.size()) && sSync; +} + +void SoftwareBreakpointManager::clearSoftwareTriggers() +{ + if (!(sRead && sWrite && sSync)) + throw EM_MemoryAccessFunctionException(); + + std::vector group; + for (InstructionTable::iterator it = mInstructionTable.begin(); it != mInstructionTable.end(); ++it) + { + //Read and verify it still exists + uint8_t opCodeTmp[2] = {0}; + if (!sRead(it->first, opCodeTmp, 2) || !sSync()) + throw EM_MemoryReadErrorException(); + + const uint16_t opCode = (uint16_t)((opCodeTmp[0] & 0xFF) + (opCodeTmp[1] << 8)); + + if (opCode != mTriggerOpCode) + continue; + + //Check if location is less than one segment away from previous location + if (group.empty() || (it->first - group.back()->first <= 0x200)) + { + group.push_back(it); + } + else + { + writeGroup(group); + group.clear(); + group.push_back(it); + } + } + if (!group.empty()) + writeGroup(group); + + mInstructionTable.clear(); +} + +uint32_t SoftwareBreakpointManager::numberOfActiveSoftwareTriggers() const +{ + return static_cast(mInstructionTable.size()); +} + +const uint32_t opcodeSize = 2; + +void SoftwareBreakpointManager::patchMemoryWrite(uint32_t address, uint8_t* data, size_t size) +{ + const uint32_t endAddress = address + static_cast(size); + + InstructionTable::iterator it = mInstructionTable.begin(); + const InstructionTable::const_iterator end = mInstructionTable.end(); + + while ((it != end) && (it->first + (opcodeSize-1) < address)) ++it; + + for (; (it != end) && (it->first < endAddress); ++it) + { + const uint32_t swbpAddress = it->first; + const uint32_t overlapBegin = std::max(swbpAddress, address); + const uint32_t overlapEnd = std::min(swbpAddress + opcodeSize, endAddress); + const uint32_t dataOffset = (swbpAddress < address) ? 0 : swbpAddress - address; + const uint32_t opcodeOffset = (swbpAddress < address) ? address - swbpAddress : 0; + + for (uint32_t i = 0; i < overlapEnd - overlapBegin; ++i) + { + const int shift = 8*(i + opcodeOffset); + it->second &= ~(0xFF << shift); + it->second |= data[i + dataOffset] << shift; + + data[i + dataOffset] = (mTriggerOpCode >> shift) & 0xFF; + } + } +} + +void SoftwareBreakpointManager::patchMemoryRead(uint32_t address, uint8_t* data, size_t size) +{ + const uint32_t endAddress = address + static_cast(size); + + InstructionTable::iterator it = mInstructionTable.begin(); + const InstructionTable::const_iterator end = mInstructionTable.end(); + + while ((it != end) && (it->first + (opcodeSize-1) < address)) ++it; + + while ((it != end) && (it->first < endAddress)) + { + InstructionTable::const_iterator tmp = it++; + + const uint32_t swbpAddress = tmp->first; + const uint32_t overlapBegin = std::max(swbpAddress, address); + const uint32_t overlapEnd = std::min(swbpAddress + opcodeSize, endAddress); + const uint32_t dataOffset = (swbpAddress < address) ? 0 : swbpAddress - address; + const uint32_t opcodeOffset = (swbpAddress < address) ? address - swbpAddress : 0; + + for (uint32_t i = 0; i < overlapEnd - overlapBegin; ++i) + { + const int shift = 8*(i + opcodeOffset); + + if (data[i + dataOffset] != ((mTriggerOpCode >> shift) & 0xFF)) + { + mInstructionTable.erase(tmp->first); + return; //swbp has been removed or modified + } + } + + for (uint32_t i = 0; i < overlapEnd - overlapBegin; ++i) + { + const int shift = 8*(i + opcodeOffset); + data[i + dataOffset] = (tmp->second >> shift) & 0xFF; + } + } +} + +uint16_t SoftwareBreakpointManager::getInstructionAt(uint32_t address) const +{ + InstructionTable::const_iterator it = mInstructionTable.find(address); + return (it != mInstructionTable.end()) ? it->second : 0; +} + +bool SoftwareBreakpointManager::verifyValueAt(uint32_t address, uint16_t expectedValue) const +{ + uint8_t actualValue[2] = { 0 }; + if (!sRead(address, actualValue, 2) || !sSync()) + throw EM_MemoryReadErrorException(); + + return (actualValue[0] | (actualValue[1] << 8)) == expectedValue; +} + +void SoftwareBreakpointManager::importInstructionTable(const SoftwareBreakpointManager& swbp) +{ + mInstructionTable.insert(swbp.mInstructionTable.begin(), swbp.mInstructionTable.end()); +} diff --git a/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpointManager.h b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpointManager.h new file mode 100644 index 0000000..4a5d2fc --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpointManager.h @@ -0,0 +1,87 @@ +/* + * SoftwareBreakpointManager.h + * + * Manages software breakpoints and replaced instruction opcodes. + * + * Copyright (C) 2007 - 2013 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. + */ + +#pragma once + +namespace TI { namespace DLL430 { + +class SoftwareBreakpointManager +{ +public: + typedef std::function ReadFunction; + typedef std::function WriteFunction; + typedef std::function SyncFunction; + + static void setMemoryAccessFunctions(ReadFunction read, WriteFunction write, SyncFunction sync); + + explicit SoftwareBreakpointManager(uint16_t triggerOpCode); + + ~SoftwareBreakpointManager() {} + + void setSoftwareTriggerAt(uint32_t address); + + void removeSoftwareTriggerAt(uint32_t address); + + void clearSoftwareTriggers(); + + uint32_t numberOfActiveSoftwareTriggers() const; + + void patchMemoryWrite(uint32_t address, uint8_t* data, size_t size); + + void patchMemoryRead(uint32_t address, uint8_t* data, size_t size); + + uint16_t getInstructionAt(uint32_t address) const; + + void importInstructionTable(const SoftwareBreakpointManager& swbp); + +private: + typedef std::map InstructionTable; + + void writeGroup(const std::vector& group); + bool verifyValueAt(uint32_t address, uint16_t expectedValue) const; + + InstructionTable mInstructionTable; + uint16_t mTriggerOpCode; + + static ReadFunction sRead; + static WriteFunction sWrite; + static SyncFunction sSync; +}; + +typedef std::shared_ptr SoftwareBreakpointManagerPtr; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpoints430.cpp b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpoints430.cpp new file mode 100644 index 0000000..e5577e9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpoints430.cpp @@ -0,0 +1,85 @@ +/* + * SoftwareBreakpoints430.cpp + * + * Software breakpoint functionality for MSP430. + * + * Copyright (C) 2007 - 2013 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. + */ + +#include + +#include "SoftwareBreakpoints430.h" +#include "../Exceptions/Exceptions.h" +#include "../TriggerCondition/DataValueCondition430.h" + +using namespace TI::DLL430; + +static const uint16_t swbpInstruction = 0x4343; + +SoftwareBreakpoints430::SoftwareBreakpoints430(TriggerManager430Ptr triggerManager) + : mTriggerManager(triggerManager) + , mSwbpManager(std::make_shared(swbpInstruction)) +{ +} + + +void SoftwareBreakpoints430::enable() +{ + if (!mSwbpInstructionTrigger) + { + if (mTriggerManager->numAvailableBusTriggers() < 1) + throw EM_TriggerResourceException(); + + mSwbpInstructionTrigger = std::make_shared(mTriggerManager, swbpInstruction, 0xffff); + mSwbpInstructionTrigger->addReaction(TR_BREAK); + } +} + + +void SoftwareBreakpoints430::disable() +{ + mSwbpManager->clearSoftwareTriggers(); + mSwbpInstructionTrigger.reset(); +} + +bool SoftwareBreakpoints430::isEnabled() const +{ + return static_cast(mSwbpInstructionTrigger); +} + +SoftwareBreakpointManagerPtr SoftwareBreakpoints430::getSwbpManager() const +{ + if (!mSwbpManager) + throw EM_NoSoftwareBreakpointsException(); + + return mSwbpManager; +} diff --git a/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpoints430.h b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpoints430.h new file mode 100644 index 0000000..8370336 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/SoftwareBreakpoints430.h @@ -0,0 +1,64 @@ +/* + * SoftwareBreakpoints430.h + * + * Software breakpoint functionality for MSP430. + * + * Copyright (C) 2007 - 2013 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. + */ + +#pragma once + +#include "ISoftwareBreakpoints.h" +#include "../TriggerManager/TriggerManager430.h" +#include "../TriggerCondition/ITriggerCondition.h" + + +namespace TI { namespace DLL430 { + + +class SoftwareBreakpoints430 : public ISoftwareBreakpoints +{ +public: + explicit SoftwareBreakpoints430(TriggerManager430Ptr); + + void enable(); + void disable(); + bool isEnabled() const; + SoftwareBreakpointManagerPtr getSwbpManager() const; + +private: + TriggerManager430Ptr mTriggerManager; + TriggerConditionPtr mSwbpInstructionTrigger; + SoftwareBreakpointManagerPtr mSwbpManager; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.cpp b/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.cpp index 3fb3fd7..295b371 100644 --- a/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.cpp @@ -3,45 +3,44 @@ * * Shared trace and variable watch implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include +#include #include "StateStorage430.h" #include "../TriggerCondition/ITriggerCondition.h" -#include "../EemRegisters/EemRegisterAccess.h" +#include "../EemRegisters/EemRegisterAccess430.h" using namespace std; @@ -52,12 +51,10 @@ namespace { enum StateStorageRegisters { STOR_CTL = 0x9E - }; + }; } - - StateStorage430::StateStorage430() : controlRegister_(0), traceBuffer_(8) { @@ -70,20 +67,10 @@ StateStorage430::~StateStorage430() } -void StateStorage430::initialize() -{ -} - - -void StateStorage430::cleanup() -{ -} - - -void StateStorage430::writeConfiguration() +void StateStorage430::writeConfiguration() { //Force write if reset bit is set - writeEemRegister(STOR_CTL, controlRegister_, (controlRegister_ & STOR_RESET) != 0); + writeEemRegister430(STOR_CTL, controlRegister_, (controlRegister_ & STOR_RESET) != 0); controlRegister_ &= ~STOR_RESET; } diff --git a/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.h b/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.h index 3465f0d..f01755c 100644 --- a/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.h +++ b/DLL430_v3/src/TI/DLL430/EM/StateStorage430/StateStorage430.h @@ -3,60 +3,50 @@ * * Shared trace and variable watch implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_STATE_STORAGE_430_H -#define DLL430_STATE_STORAGE_430_H - -#include -#include -#include -#include +#pragma once #include "../Trace/Trace430.h" +#include "../TriggerCondition/ITriggerConditionManager.h" #include "../VariableWatch/VariableWatch430.h" #include "../VariableWatch/WatchedVariable430.h" - +#include namespace TI { namespace DLL430 { -class MessageData; -typedef boost::shared_ptr MessageDataPtr; - - enum StateStorageControlBits { STOR_EN = 0x1, @@ -72,16 +62,12 @@ enum StateStorageControlBits }; - class StateStorage430 : public Trace430InterfaceSplitter, public VariableWatch430InterfaceSplitter { public: StateStorage430(); ~StateStorage430(); - virtual void initialize(); - virtual void cleanup(); - virtual void writeConfiguration(); @@ -109,7 +95,6 @@ class StateStorage430 : public Trace430InterfaceSplitter, public VariableWatch43 virtual const TraceBuffer getTraceData(); - //VariableWatch Interface implementation virtual void onEventVWatch(MessageDataPtr messageData); @@ -119,25 +104,18 @@ class StateStorage430 : public Trace430InterfaceSplitter, public VariableWatch43 virtual WatchedVariablePtr createWatchedVariable(uint32_t address, uint32_t bitSize, TriggerConditionManagerPtr tcManager); private: - void updateWatchedVariable(uint32_t triggerId, uint16_t value); + void updateWatchedVariable(uint32_t slot, uint32_t address, uint16_t value); uint16_t controlRegister_; std::vector triggerConditions_; - + TraceBuffer traceBuffer_; boost::mutex traceBufferMutex_; - std::vector > watchedVariables_; + std::vector > watchedVariables_; }; - - - - - }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/Trace/ITrace.h b/DLL430_v3/src/TI/DLL430/EM/Trace/ITrace.h index 3cc0fd4..3cd5f93 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Trace/ITrace.h +++ b/DLL430_v3/src/TI/DLL430/EM/Trace/ITrace.h @@ -3,56 +3,45 @@ * * Interface for trace module * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_ITRACE_H -#define DLL430_ITRACE_H - -#include -#include -#include - +#include +#include "../TriggerCondition/ITriggerCondition.h" namespace TI { namespace DLL430 { - -class ITriggerCondition; -class MessageData; - -typedef boost::shared_ptr TriggerConditionPtr; -typedef boost::shared_ptr MessageDataPtr; - //Trace data contains the values of the address bus, data bus and control register struct TraceData { @@ -77,25 +66,25 @@ class ITrace //Remove all trace triggers virtual void clearTriggerConditions() = 0; - + //Enable/disable trace feature (on 430 trace is mutually exclusive with variable watch) virtual void enable() = 0; virtual void disable() = 0; - + //Reset/restart trace module (must always be called after changing sequencer configuration) virtual void reset() = 0; - + //Trace will start when a trace trigger is hit virtual void setStartOnTrigger(bool startOnTrigger) = 0; //Trace will stop when a trace trigger is hit virtual void setStopOnTrigger(bool stopOnTrigger) = 0; - + //Store state on instruction fetch, when trace trigger is hit or on every clock cycle virtual void setStoreOnInstructionFetch() = 0; virtual void setStoreOnTrigger() = 0; virtual void setStoreOnClock() = 0; - + //Store states indefinitely in ring buffer or stop trace when buffer is full virtual void setStoreContinuously() = 0; virtual void setStoreUntilFull() = 0; @@ -104,12 +93,8 @@ class ITrace virtual const TraceBuffer getTraceData() = 0; //Only used by EmulationManager - virtual void initialize() = 0; - virtual void cleanup() = 0; virtual void writeConfiguration() = 0; virtual void onEvent(MessageDataPtr msgData) = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.cpp b/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.cpp index 91d57fe..0869a21 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.cpp @@ -3,45 +3,46 @@ * * Trace implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include "../TriggerCondition/ITriggerCondition.h" #include "../StateStorage430/StateStorage430.h" #include "../Exceptions/Exceptions.h" #include "../../MessageData.h" +#include using namespace TI::DLL430; @@ -52,16 +53,16 @@ void StateStorage430::onEventTrace(MessageDataPtr msgData) uint16_t eventMask = 0; (*msgData) >> eventMask; - + if (eventMask & 0x2) { uint16_t newEntries = 0; (*msgData) >> newEntries; - boost::mutex::scoped_lock lock(traceBufferMutex_); + boost::lock_guard lock(traceBufferMutex_); - traceBuffer_.clear(); - do + //Append new values to buffer + while (!msgData->fail()) { TraceData data; (*msgData) >> data.mab >> data.mdb >> data.ctl; @@ -70,27 +71,33 @@ void StateStorage430::onEventTrace(MessageDataPtr msgData) { traceBuffer_.push_back(data); } - } while (!msgData->fail()); + }; + + //Trim to 8 entries + const size_t entriesToRemove = std::max(0, (int)traceBuffer_.size() - 8); + traceBuffer_.erase(traceBuffer_.begin(), traceBuffer_.begin() + entriesToRemove); + } } -void StateStorage430::addTriggerCondition(TriggerConditionPtr triggerCondition) +void StateStorage430::addTriggerCondition(TriggerConditionPtr triggerCondition) { if (triggerCondition) { triggerConditions_.push_back(triggerCondition); - } - if (controlRegister_ & STOR_EN) - { - triggerCondition->addReaction(TR_STATE_STORAGE); + + if (controlRegister_ & STOR_EN) + { + triggerCondition->addReaction(TR_STATE_STORAGE); + } } } void StateStorage430::clearTriggerConditions() { - BOOST_FOREACH(TriggerConditionPtr& condition, triggerConditions_) + for (TriggerConditionPtr& condition : triggerConditions_) { condition->removeReaction(TR_STATE_STORAGE); } @@ -104,7 +111,7 @@ void StateStorage430::enableTrace() if ((controlRegister_ & STOR_EN) && (controlRegister_ & 0x6) == STOR_MODE_VAR_WATCH) throw EM_StateStorageConflictException(); - BOOST_FOREACH(TriggerConditionPtr& condition, triggerConditions_) + for (TriggerConditionPtr& condition : triggerConditions_) { condition->addReaction(TR_STATE_STORAGE); } @@ -112,12 +119,12 @@ void StateStorage430::enableTrace() } -void StateStorage430::disableTrace() +void StateStorage430::disableTrace() { //Ignore if in variable watch mode if ((controlRegister_ & 0x6) != STOR_MODE_VAR_WATCH) { - BOOST_FOREACH(TriggerConditionPtr& condition, triggerConditions_) + for (TriggerConditionPtr& condition : triggerConditions_) { condition->removeReaction(TR_STATE_STORAGE); } @@ -129,6 +136,9 @@ void StateStorage430::disableTrace() void StateStorage430::reset() { controlRegister_ |= STOR_RESET; + + boost::lock_guard lock(traceBufferMutex_); + traceBuffer_.clear(); } @@ -193,6 +203,6 @@ void StateStorage430::setStoreUntilFull() const TraceBuffer StateStorage430::getTraceData() { - boost::mutex::scoped_lock lock(traceBufferMutex_); + boost::lock_guard lock(traceBufferMutex_); return TraceBuffer(traceBuffer_); } diff --git a/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.h b/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.h index 4ec5c85..3ca5dad 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.h +++ b/DLL430_v3/src/TI/DLL430/EM/Trace/Trace430.h @@ -3,44 +3,41 @@ * * Trace implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_TRACE_430_H -#define DLL430_TRACE_430_H - -#include #include "ITrace.h" @@ -63,5 +60,3 @@ class Trace430InterfaceSplitter : public ITrace }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/DataAddressTrigger432.cpp b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataAddressTrigger432.cpp new file mode 100644 index 0000000..a9e9490 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataAddressTrigger432.cpp @@ -0,0 +1,79 @@ +/* + * DataAddressTrigger432.cpp + * + * Common implementation for triggers on 432 + * + * Copyright (C) 2016 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. + */ + + +#include + +#include "DataAddressTrigger432.h" +#include "../EemRegisters/EemRegisterAccess432.h" +#include "../Exceptions/Exceptions.h" + +using namespace std; +using namespace TI::DLL430; + +DataAddressTrigger432::DataAddressTrigger432(TYPE type, uint32_t id) + : DataTrigger432(type, id) +{ +} + +void DataAddressTrigger432::read() +{ +} + + +void DataAddressTrigger432::write() const +{ + static uint32_t tmp = readEemRegister432(0x0DFC); + // Disable DWT before config - function regsier to 0 + writeEemRegister432(0x1028 + id_ * 0x10, 0); + writeEemRegister432(0x1020 + id_ * 0x10, comparatorRegister_); + // set mask + writeEemRegister432(0x1024 + id_ * 0x10, mask_); + // Enable DWT after config - function regsier to 0 + writeEemRegister432(0x1028 + id_ * 0x10, functionRegister_);// function regsier to 0 +} + +void DataAddressTrigger432::reset() +{ + + comparatorRegister_ = 0; + functionRegister_ = 0; + mask_ = 0; + + isInUse_ = false; + isEnabled_ = false; +} diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/DataAddressTrigger432.h b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataAddressTrigger432.h new file mode 100644 index 0000000..34160c8 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataAddressTrigger432.h @@ -0,0 +1,62 @@ +/* + * DataAddressTrigger432.h + * + * Common implementation for triggers on 432 + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include +#include "../TriggerCondition/TriggerDefinitions.h" +#include "DataTrigger432.h" + +namespace TI { namespace DLL430 { + +class DataAddressTrigger432 : public DataTrigger432 +{ +public: + + DataAddressTrigger432(TYPE type, uint32_t id); + virtual ~DataAddressTrigger432() {} + + virtual void read(); + virtual void write() const; + virtual void reset(); + + +private: + +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/DataTrigger432.cpp b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataTrigger432.cpp new file mode 100644 index 0000000..d227f7e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataTrigger432.cpp @@ -0,0 +1,109 @@ +/* + * DataTrigger432.cpp + * + * Common implementation for triggers on 432 + * + * Copyright (C) 2016 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. + */ + + +#include + +#include "DataTrigger432.h" +#include "../EemRegisters/EemRegisterAccess432.h" +#include "../Exceptions/Exceptions.h" + +using namespace std; +using namespace TI::DLL430; + +map DataTrigger432::accessTypeBits; + +DataTrigger432::DataTrigger432(TYPE type, uint32_t id) + : type_(type) + , id_(id) + , isInUse_(false) + , isEnabled_(false) + , comparatorRegister_(0) + , functionRegister_(0) + , mask_(0) +{ +} + + +uint32_t DataTrigger432::getId() const +{ + return id_; +} + +void DataTrigger432::setValue(uint32_t value) +{ + comparatorRegister_ = value; +} + +void DataTrigger432::setAccessType(AccessType accessType) +{ + if ((type_ != DATA_TRIGGER) || (accessTypeBits.find(accessType) == accessTypeBits.end())) + throw EM_TriggerParameterException(); + functionRegister_ = (functionRegister_ & (~0x0f)) | accessTypeBits[accessType]; +} + +void DataTrigger432::setMask(uint32_t mask) +{ + /* convert mask to register format */ + uint8_t i = 0; + while (!(mask & (1< +#include "../TriggerCondition/TriggerDefinitions.h" + +namespace TI { namespace DLL430 { + +class DataTrigger432 +{ +public: + enum TYPE { DATA_TRIGGER }; + + DataTrigger432(TYPE type, uint32_t id); + virtual ~DataTrigger432() {} + + virtual uint32_t getId() const; + + virtual void read() = 0; + virtual void write() const = 0; + virtual void reset() = 0; + + virtual void setValue(uint32_t value); + + virtual bool isInUse() const; + virtual void isInUse(bool inUse); + + virtual bool isEnabled() const; + virtual void isEnabled(bool enabled); + + virtual void setAccessType(AccessType accessType); + virtual void setMask(uint32_t mask); + + static std::map accessTypeBits; + +protected: + + TYPE type_; + + uint32_t id_; + + bool isInUse_; + bool isEnabled_; + + uint32_t comparatorRegister_; + uint32_t functionRegister_; + uint32_t mask_; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/DataValueTrigger432.cpp b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataValueTrigger432.cpp new file mode 100644 index 0000000..170352e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataValueTrigger432.cpp @@ -0,0 +1,115 @@ +/* + * DataValueTrigger432.cpp + * + * Common implementation for triggers on 432 + * + * Copyright (C) 2016 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. + */ + + +#include + +#include "DataValueTrigger432.h" +#include "../EemRegisters/EemRegisterAccess432.h" +#include "../Exceptions/Exceptions.h" + +using namespace std; +using namespace TI::DLL430; + +DataValueTrigger432::DataValueTrigger432(TYPE type, uint32_t id) + : DataTrigger432(type, id), + dependencyTrigger_(nullptr), + dataSize_(0) +{ +} + +void DataValueTrigger432::read() +{ +} + + +void DataValueTrigger432::write() const +{ + if (dependencyTrigger_ == nullptr) + return; + static uint32_t tmp = readEemRegister432(0x0DFC); + /* write linked trigger first, since the function register will be overwritten by the hardware + * when setting data value trigger + */ + dependencyTrigger_->write(); + // Disable DWT before config - function regsier to 0 + writeEemRegister432(0x1028 + id_ * 0x10, 0); + writeEemRegister432(0x1020 + id_ * 0x10, comparatorRegister_); + // set mask + writeEemRegister432(0x1024 + id_ * 0x10, mask_); + // Enable DWT after config + writeEemRegister432(0x1028 + id_ * 0x10, functionRegister_); +} + +void DataValueTrigger432::reset() +{ + if (dependencyTrigger_ != nullptr) + dependencyTrigger_->reset(); + dependencyTrigger_ = nullptr; + + comparatorRegister_ = 0; + functionRegister_ = 0; + mask_ = 0; + + isInUse_ = false; + isEnabled_ = false; +} + +void DataValueTrigger432::setDependencyTrigger(DataTrigger432 *dependencyTrigger) +{ + dependencyTrigger_ = dependencyTrigger; + /* set DATAVADDR0 and DATAVADDR1 to dependency comperator register (12:15 and 16:19) + */ + functionRegister_ = (functionRegister_ & (~(0xff << 12))) | (dependencyTrigger_->getId() << 12) | (dependencyTrigger_->getId() << 16); +} + +void DataValueTrigger432::setAddress(uint32_t address, uint32_t mask) +{ + if (dependencyTrigger_ == nullptr) + return; + dependencyTrigger_->setValue(address); + dependencyTrigger_->setMask(mask); + /* Set DATAVMATCH bit */ + functionRegister_ |= (1 << 8); +} + +void DataValueTrigger432::setDataSize(uint8_t dataSize) +{ + dataSize_ = dataSize; + /* bit 10..11 */ + functionRegister_ = (functionRegister_ & (~(0x3<<10))) | (dataSize_ << 10); +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/DataValueTrigger432.h b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataValueTrigger432.h new file mode 100644 index 0000000..c64465b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/DataValueTrigger432.h @@ -0,0 +1,65 @@ +/* + * DataValueTrigger432.h + * + * Common implementation for triggers on 432 + * + * Copyright (C) 2016 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. + */ + +#pragma once + +#include +#include "../TriggerCondition/TriggerDefinitions.h" +#include "DataTrigger432.h" + +namespace TI { namespace DLL430 { + +class DataValueTrigger432 : public DataTrigger432 +{ +public: + DataValueTrigger432(TYPE type, uint32_t id); + virtual ~DataValueTrigger432() {} + + virtual void read(); + virtual void write() const; + virtual void reset(); + virtual void setDependencyTrigger(DataTrigger432 *dependencyTrigger); + virtual void setAddress(uint32_t address, uint32_t mask); + virtual void setDataSize(uint8_t dataSize); + + +protected: + DataTrigger432 *dependencyTrigger_; + uint8_t dataSize_; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.cpp b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.cpp index 2c2c08b..6f64703 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.cpp @@ -3,57 +3,55 @@ * * Common implementation for triggers on 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include +#include #include "Trigger430.h" -#include "../EemRegisters/EemRegisterAccess.h" +#include "../EemRegisters/EemRegisterAccess430.h" #include "../Exceptions/Exceptions.h" using namespace std; using namespace TI::DLL430; - -namespace +namespace { enum RegisterOffset { - VALUE_REGISTER = 0, - CONTROL_REGISTER = 2, + VALUE_REGISTER = 0, + CONTROL_REGISTER = 2, MASK_REGISTER = 4, COMBINATION_REGISTER = 6, TRIGGER_BLOCK_SIZE = 8 @@ -68,8 +66,6 @@ map Trigger430::accessTypeBits; bool Trigger430::bitwiseMasks; - - //Default is MAB, ==, Instruction Fetch, compare all bits Trigger430::Trigger430(TYPE type, uint32_t id) : type_(type) @@ -84,13 +80,12 @@ Trigger430::Trigger430(TYPE type, uint32_t id) } -uint32_t Trigger430::getId() const +uint32_t Trigger430::getId() const { return id_; } - void Trigger430::combineWith(Trigger430* trigger) { combinedWith_.insert(trigger); @@ -108,7 +103,7 @@ void Trigger430::uncombineWith(Trigger430* trigger) uint32_t Trigger430::getCombinationValue() const { uint32_t combinationValue = (1 << getId()); - BOOST_FOREACH(const Trigger430* trigger, combinedWith_) + for (const Trigger430* trigger : combinedWith_) { combinationValue |= (1 << trigger->getId()); } @@ -125,16 +120,11 @@ void Trigger430::swapTriggerBlock(Trigger430& trigger) } -void Trigger430::read() -{ -} - - -void Trigger430::write() +void Trigger430::write() const { - writeEemRegister(valueRegisterAddress(), triggerValueRegister_); - writeEemRegister(controlRegisterAddress(), triggerControlRegister_); - writeEemRegister(maskRegisterAddress(), triggerMaskRegister_); + writeEemRegister430(valueRegisterAddress(), triggerValueRegister_); + writeEemRegister430(controlRegisterAddress(), triggerControlRegister_); + writeEemRegister430(maskRegisterAddress(), triggerMaskRegister_); } @@ -147,7 +137,7 @@ void Trigger430::reset() isInUse_ = false; isEnabled_ = true; isCombinationTrigger_ = false; - + reactions_.clear(); combinedWith_.clear(); } @@ -158,12 +148,13 @@ void Trigger430::addReaction(TriggerReaction reaction) reactions_.insert(reaction); } + void Trigger430::removeReaction(TriggerReaction reaction) { reactions_.erase(reaction); } -const std::set& Trigger430::getReactions() const +const std::set& Trigger430::getReactions() const { return reactions_; } @@ -193,8 +184,8 @@ void Trigger430::setMask(uint32_t mask) const uint32_t maskHigh = mask & 0x0FF00; const uint32_t maskX = mask & 0xF0000; - if ((maskLow != 0 && maskLow != 0x000FF) || - (maskHigh != 0 && maskHigh != 0x0FF00) || + if ((maskLow != 0 && maskLow != 0x000FF) || + (maskHigh != 0 && maskHigh != 0x0FF00) || (maskX != 0 && maskX != 0xF0000)) { throw EM_TriggerParameterException(); @@ -205,7 +196,6 @@ void Trigger430::setMask(uint32_t mask) } - bool Trigger430::isCombinationTrigger() const { return isCombinationTrigger_; @@ -217,7 +207,6 @@ void Trigger430::isCombinationTrigger(bool isInCombination) } - bool Trigger430::isInUse() const { return isInUse_; @@ -229,7 +218,6 @@ void Trigger430::isInUse(bool inUse) } - bool Trigger430::isEnabled() const { return isEnabled_; @@ -241,7 +229,6 @@ void Trigger430::isEnabled(bool enabled) } - uint32_t Trigger430::valueRegisterAddress() const { return (getId() * TRIGGER_BLOCK_SIZE) + VALUE_REGISTER; @@ -260,17 +247,6 @@ uint32_t Trigger430::maskRegisterAddress() const } - - -void Trigger430::setMemoryAddressBus() -{ - if (type_ != BUS_TRIGGER) - throw EM_TriggerParameterException(); - - triggerControlRegister_ &= ~0x1; -} - - void Trigger430::setMemoryDataBus() { if (type_ != BUS_TRIGGER) @@ -286,32 +262,15 @@ void Trigger430::setAccessType(AccessType accessType) throw EM_TriggerParameterException(); triggerControlRegister_ &= ~0x66; - triggerControlRegister_ |= accessTypeBits[accessType]; + triggerControlRegister_ |= (uint16_t)(accessTypeBits[accessType]); } - - void Trigger430::setRegister(uint32_t reg) { if (type_ != REGISTER_TRIGGER) throw EM_TriggerParameterException(); - + triggerControlRegister_ &= ~(0xf << 8); triggerControlRegister_ |= (reg & 0xf) << 8; } - -void Trigger430::setHold(bool hold) -{ - if (type_ != REGISTER_TRIGGER) - throw EM_TriggerParameterException(); - - if (hold) - { - triggerControlRegister_ |= (1 << 6); - } - else - { - triggerControlRegister_ &= ~(1 << 6); - } -} diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.h b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.h index e27c7d6..41000aa 100644 --- a/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.h +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger430.h @@ -3,45 +3,39 @@ * * Common implementation for triggers on 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_TRIGGER_430_H -#define DLL430_TRIGGER_430_H - -#include -#include -#include +#pragma once #include "../TriggerCondition/TriggerDefinitions.h" @@ -56,9 +50,8 @@ class Trigger430 virtual ~Trigger430() {} virtual uint32_t getId() const; - - virtual void read(); - virtual void write(); + + virtual void write() const; virtual void reset(); virtual void combineWith(Trigger430* trigger); @@ -85,14 +78,11 @@ class Trigger430 virtual void isEnabled(bool enabled); //Bus triggers - virtual void setMemoryAddressBus(); virtual void setMemoryDataBus(); virtual void setAccessType(AccessType accessType); //Register triggers virtual void setRegister(uint32_t reg); - virtual void setHold(bool hold); - static std::map comparisonOpBits; static std::map accessTypeBits; @@ -113,11 +103,9 @@ class Trigger430 bool isInUse_; bool isEnabled_; bool isCombinationTrigger_; - + std::set reactions_; std::set combinedWith_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger432.cpp b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger432.cpp new file mode 100644 index 0000000..17d37d5 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger432.cpp @@ -0,0 +1,112 @@ +/* + * Trigger432.cpp + * + * Common implementation for triggers on 430 + * + * Copyright (C) 2007 - 2011 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. + */ + + +#include + +#include "Trigger432.h" +#include "../EemRegisters/EemRegisterAccess432.h" +#include "../Exceptions/Exceptions.h" + +using namespace std; +using namespace TI::DLL430; + +Trigger432::Trigger432(TYPE type, uint32_t id) + : type_(type) + , id_(id) + , isInUse_(false) + , isEnabled_(false) + , comparatorRegister_(0) +{ +} + +uint32_t Trigger432::getId() const +{ + return id_; +} + +void Trigger432::read() +{ +} + +void Trigger432::write() const +{ + writeEemRegister432(0x2008 + id_ * 4, comparatorRegister_ | (isEnabled_ ? 1 : 0)); +} + +void Trigger432::reset() +{ + isInUse_ = false; + isEnabled_ = false; +} + +void Trigger432::setValue(uint32_t value) +{ + comparatorRegister_ = (value & 2) ? 0x80000000 : 0x40000000; + comparatorRegister_ |= (value & 0xFFFFFFFC); +} + +void Trigger432::setAccessType(AccessType accessType) +{ + +} + +void Trigger432::setMask(uint32_t mask) +{ + +} + +bool Trigger432::isInUse() const +{ + return isInUse_; +} + +void Trigger432::isInUse(bool inUse) +{ + isInUse_ = inUse; + isEnabled_ = inUse; +} + +bool Trigger432::isEnabled() const +{ + return isEnabled_; +} + +void Trigger432::isEnabled(bool enabled) +{ + isEnabled_ = enabled; +} diff --git a/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger432.h b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger432.h new file mode 100644 index 0000000..cde0d68 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/Trigger/Trigger432.h @@ -0,0 +1,83 @@ +/* + * Trigger432.h + * + * Common implementation for triggers on 432 + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include +#include "../TriggerCondition/TriggerDefinitions.h" + +namespace TI { namespace DLL430 { + +class Trigger432 +{ +public: + enum TYPE { CODE_TRIGGER, LITERAL_TRIGGER}; + + Trigger432(TYPE type, uint32_t id); + virtual ~Trigger432() {} + + virtual uint32_t getId() const; + + virtual void read(); + virtual void write() const; + virtual void reset(); + + virtual void setValue(uint32_t value); + + virtual bool isInUse() const; + virtual void isInUse(bool inUse); + + virtual bool isEnabled() const; + virtual void isEnabled(bool enabled); + + virtual void setAccessType(AccessType accessType); + virtual void setMask(uint32_t mask); + + static std::map accessTypeBits; + +private: + TYPE type_; + + uint32_t id_; + + bool isInUse_; + bool isEnabled_; + + uint32_t comparatorRegister_; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.cpp index b3218fb..562e804 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.cpp @@ -3,39 +3,39 @@ * * Implementation of data and instruction address trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "AddressCondition430.h" #include "../TriggerManager/TriggerManager430.h" @@ -44,22 +44,22 @@ using namespace TI::DLL430; AddressCondition430::AddressCondition430(TriggerManager430Ptr triggerManager, uint32_t address, uint32_t mask, AccessType accessType, ComparisonOperation op) : TriggerCondition430(triggerManager) - , mainTrigger_(NULL) + , mainTrigger_(nullptr) { mainTrigger_ = triggerManager->getBusTrigger(); - if (mainTrigger_ != NULL) + if (mainTrigger_) { addTrigger(mainTrigger_); setAddress(address, mask); setAccessType(accessType); - setComparator(op); + setComparator(op); } } void AddressCondition430::setComparator(ComparisonOperation op) { - if (mainTrigger_ != NULL) + if (mainTrigger_) { mainTrigger_->setComparisonOperation(op); } @@ -67,7 +67,7 @@ void AddressCondition430::setComparator(ComparisonOperation op) void AddressCondition430::setAccessType(AccessType accessType) { - if (mainTrigger_ != NULL) + if (mainTrigger_) { mainTrigger_->setAccessType(accessType); } @@ -75,7 +75,7 @@ void AddressCondition430::setAccessType(AccessType accessType) void AddressCondition430::setAddress(uint32_t address, uint32_t mask) { - if (mainTrigger_ != NULL) + if (mainTrigger_) { mainTrigger_->setValue(address); mainTrigger_->setMask(mask); diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.h index e87593c..f604333 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition430.h @@ -3,44 +3,41 @@ * * Implementation of data and instruction address trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_ADDRESS_CONDITION_430_H -#define DLL430_ADDRESS_CONDITION_430_H - -#include #include "TriggerCondition430.h" #include "IInstructionAddressCondition.h" #include "IDataAddressCondition.h" @@ -63,13 +60,8 @@ class AddressCondition430 : public TriggerCondition430, public IInstructionAddre virtual void combine(TriggerConditionPtr condition) { TriggerCondition430::combine(condition); } virtual uint32_t getId() const { return TriggerCondition430::getId(); } - virtual void enable() { TriggerCondition430::enable(); } - virtual void disable() { TriggerCondition430::disable(); } - private: Trigger430* mainTrigger_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/DeviceChainInfo.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition432.cpp similarity index 55% rename from DLL430_v3/src/TI/DLL430/DeviceChainInfo.cpp rename to DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition432.cpp index 2a135d4..3364727 100644 --- a/DLL430_v3/src/TI/DLL430/DeviceChainInfo.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition432.cpp @@ -1,84 +1,77 @@ /* - * DeviceChainInfo.cpp + * AddressCondition432.cpp * - * Information about JTAG ports. + * Implementation of data and instruction address trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include +#include "AddressCondition432.h" +#include "../TriggerManager/TriggerManager432.h" using namespace TI::DLL430; -DeviceChainInfo::DeviceChainInfo (std::string name, long busId, bool isMSP430, long lenIR) - : name(name) - , inUse(false) - , MSP430(isMSP430) - , busId(busId) - , lenIR(lenIR) -{ -} -DeviceChainInfo::~DeviceChainInfo () +AddressCondition432::AddressCondition432(TriggerManager432Ptr triggerManager, uint32_t address, uint32_t mask, AccessType accessType) + : mainTrigger_(nullptr), + triggerManager_(triggerManager) { -} + mainTrigger_ = triggerManager->getCodeTrigger(); -bool DeviceChainInfo::isInUse() -{ - return this->inUse; + if (mainTrigger_ != nullptr) + { + setAddress(address, mask); + } } -void DeviceChainInfo::setInUse(bool status) +AddressCondition432::~AddressCondition432() { - this->inUse = status; + triggerManager_->releaseTrigger(mainTrigger_); } -std::string DeviceChainInfo::getName() -{ - return this->name; -} - -long DeviceChainInfo::getLenIR() -{ - return this->lenIR; -} - - -long DeviceChainInfo::getBusId() +void AddressCondition432::setAccessType(AccessType accessType) { - return this->busId; + if (mainTrigger_ != nullptr) + { + mainTrigger_->setAccessType(accessType); + } } -bool DeviceChainInfo::isMSP430() +void AddressCondition432::setAddress(uint32_t address, uint32_t mask) { - return this->MSP430; + if (mainTrigger_ != nullptr) + { + mainTrigger_->setValue(address); + mainTrigger_->setMask(mask); + } } diff --git a/DLL430_v3/include/DLL430_plugin.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition432.h similarity index 54% rename from DLL430_v3/include/DLL430_plugin.h rename to DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition432.h index 5e3e70f..df921e9 100644 --- a/DLL430_v3/include/DLL430_plugin.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressCondition432.h @@ -1,63 +1,67 @@ /* - * DLL430_plugin.h + * AddressCondition430.h * - * C-interface for loading dll. + * Implementation of data and instruction address trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** - * - * Only use this header if you plan to use the MSP430DLL APIv3 - * but have to use a C interface to load symbols, like - * Windows: LoadLibrary()/GetProcAddress() - * Linux: dlopen()/dlsym() - * or a C++ compiler with a different name mangling. - * - * In any other case, use the API directly. - */ - -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_PLUGIN_H -#define DLL430_PLUGIN_H -#include +#include "../TriggerManager/TriggerManager432.h" +#include "IInstructionAddressCondition.h" +#include "IDataAddressCondition.h" +#include "../Trigger/Trigger432.h" + +namespace TI { namespace DLL430 { + +class AddressCondition432 : public IInstructionAddressCondition, public IDataAddressCondition +{ +public: + AddressCondition432(TriggerManager432Ptr triggerManager, uint32_t address, uint32_t mask, AccessType accessType); + ~AddressCondition432(); + + virtual void setAddress(uint32_t address, uint32_t mask = 0xffffffff); -//symbol: "createFetHandleManager" -typedef TI::DLL430::FetHandleManager* (*createFetHandleManager_t)(); + virtual void setComparator(ComparisonOperation op) {} + virtual void setAccessType(AccessType accessType); + virtual void combine(TriggerConditionPtr condition) {} + virtual uint32_t getId() const {return 0;} + virtual void addReaction(TriggerReaction reaction) {} + virtual void removeReaction(TriggerReaction reaction) {} -//symbol: "destroyFetHandleManager" -typedef void (*destroyFetHandleManager_t)(TI::DLL430::FetHandleManager*); +private: + Trigger432* mainTrigger_; + TriggerManager432Ptr triggerManager_; +}; -#endif /* DLL430_PLUGIN_H */ +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.cpp index 2640bec..1c40b81 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.cpp @@ -3,39 +3,39 @@ * * Implementation of address range trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "AddressRangeCondition430.h" #include "../TriggerManager/TriggerManager430.h" #include "../Trigger/Trigger430.h" @@ -43,21 +43,21 @@ using namespace TI::DLL430; -AddressRangeCondition430::AddressRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minAddress, uint32_t maxAddress, +AddressRangeCondition430::AddressRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minAddress, uint32_t maxAddress, uint32_t minMask, uint32_t maxMask, AccessType accessType, bool outside) : TriggerCondition430(triggerManager) - , minTrigger_(NULL) - , maxTrigger_(NULL) + , minTrigger_(nullptr) + , maxTrigger_(nullptr) { minTrigger_ = triggerManager->getBusTrigger(); maxTrigger_ = triggerManager->getBusTrigger(); - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { addTrigger(minTrigger_); addTrigger(maxTrigger_); - setMinAddress(minAddress, minMask); + setMinAddress(minAddress, minMask); setMaxAddress(maxAddress, maxMask); setAccessType(accessType); @@ -74,7 +74,7 @@ AddressRangeCondition430::AddressRangeCondition430(TriggerManager430Ptr triggerM void AddressRangeCondition430::setAccessType(AccessType accessType) { - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { minTrigger_->setAccessType(accessType); maxTrigger_->setAccessType(accessType); @@ -83,7 +83,7 @@ void AddressRangeCondition430::setAccessType(AccessType accessType) void AddressRangeCondition430::setInside() { - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { minTrigger_->setComparisonOperation(CO_GREATER_EQUAL); maxTrigger_->setComparisonOperation(CO_LESS_EQUAL); @@ -94,7 +94,7 @@ void AddressRangeCondition430::setInside() void AddressRangeCondition430::setOutside() { - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { minTrigger_->setComparisonOperation(CO_LESS_EQUAL); maxTrigger_->setComparisonOperation(CO_GREATER_EQUAL); @@ -105,7 +105,7 @@ void AddressRangeCondition430::setOutside() void AddressRangeCondition430::setMinAddress(uint32_t address, uint32_t mask) { - if (minTrigger_ != NULL) + if (minTrigger_ != nullptr) { minTrigger_->setValue(address); minTrigger_->setMask(mask); @@ -114,7 +114,7 @@ void AddressRangeCondition430::setMinAddress(uint32_t address, uint32_t mask) void AddressRangeCondition430::setMaxAddress(uint32_t address, uint32_t mask) { - if (maxTrigger_ != NULL) + if (maxTrigger_ != nullptr) { maxTrigger_->setValue(address); maxTrigger_->setMask(mask); diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.h index c777ba1..90980d5 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/AddressRangeCondition430.h @@ -3,44 +3,41 @@ * * Implementation of address range trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_ADDRESS_RANGE_CONDITION_430_H -#define DLL430_ADDRESS_RANGE_CONDITION_430_H - -#include #include "TriggerCondition430.h" #include "IInstructionRangeCondition.h" #include "IAddressRangeCondition.h" @@ -52,7 +49,7 @@ class Trigger430; class AddressRangeCondition430 : public TriggerCondition430, public IInstructionRangeCondition, public IAddressRangeCondition { public: - AddressRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minAddress, uint32_t maxAddress, + AddressRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minAddress, uint32_t maxAddress, uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, AccessType = AT_FETCH, bool outside = false); virtual void setAccessType(AccessType accessType); @@ -67,14 +64,9 @@ class AddressRangeCondition430 : public TriggerCondition430, public IInstruction virtual void combine(TriggerConditionPtr condition) { TriggerCondition430::combine(condition); } virtual uint32_t getId() const { return TriggerCondition430::getId(); } - virtual void enable() { TriggerCondition430::enable(); } - virtual void disable() { TriggerCondition430::disable(); } - private: Trigger430 *minTrigger_; Trigger430 *maxTrigger_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataAddressCondition432.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataAddressCondition432.cpp new file mode 100644 index 0000000..a6a8d1a --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataAddressCondition432.cpp @@ -0,0 +1,77 @@ +/* + * DataAddressCondition432.cpp + * + * Implementation of data and instruction address trigger conditions for 430 + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "DataAddressCondition432.h" +#include "../TriggerManager/TriggerManager432.h" + +using namespace TI::DLL430; + + +DataAddressCondition432::DataAddressCondition432(TriggerManager432Ptr triggerManager, uint32_t address, uint32_t mask, AccessType accessType) + : mainTrigger_(nullptr), + triggerManager_(triggerManager) +{ + mainTrigger_ = triggerManager->getDataAddressTrigger(); + if (mainTrigger_ != nullptr) + { + setAddress(address, mask); + setAccessType(accessType); + } +} + +DataAddressCondition432::~DataAddressCondition432() +{ + triggerManager_->releaseDataTrigger432(mainTrigger_); +} + +void DataAddressCondition432::setAccessType(AccessType accessType) +{ + if (mainTrigger_ != nullptr) + { + mainTrigger_->setAccessType(accessType); + } +} + +void DataAddressCondition432::setAddress(uint32_t address, uint32_t mask) +{ + if (mainTrigger_ != nullptr) + { + mainTrigger_->setValue(address); + mainTrigger_->setMask(mask); + } +} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataAddressCondition432.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataAddressCondition432.h new file mode 100644 index 0000000..b127e30 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataAddressCondition432.h @@ -0,0 +1,66 @@ +/* + * DataAddressCondition432.h + * + * Implementation of data and instruction address trigger conditions for 430 + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "../TriggerManager/TriggerManager432.h" +#include "IDataAddressCondition.h" +#include "../Trigger/Trigger432.h" + +namespace TI { namespace DLL430 { + +class DataAddressCondition432 : public IDataAddressCondition +{ +public: + DataAddressCondition432(TriggerManager432Ptr triggerManager, uint32_t address, uint32_t mask, AccessType accessType); + ~DataAddressCondition432(); + + virtual void setAddress(uint32_t address, uint32_t mask = 0xffffffff); + + virtual void setComparator(ComparisonOperation op) {} + virtual void setAccessType(AccessType accessType); + virtual void combine(TriggerConditionPtr condition) {} + virtual uint32_t getId() const {return 0;} + virtual void addReaction(TriggerReaction reaction) {} + virtual void removeReaction(TriggerReaction reaction) {} + +private: + DataTrigger432* mainTrigger_; + TriggerManager432Ptr triggerManager_; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.cpp index 36c4ac7..82ca297 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.cpp @@ -3,39 +3,39 @@ * * Implementation of data value range trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "DataRangeCondition430.h" #include "../TriggerManager/TriggerManager430.h" @@ -44,15 +44,15 @@ using namespace TI::DLL430; -DataRangeCondition430::DataRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minValue, uint32_t maxValue, +DataRangeCondition430::DataRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minValue, uint32_t maxValue, uint32_t minMask, uint32_t maxMask, AccessType accessType, bool outside) : TriggerCondition430(triggerManager) - , minTrigger_(NULL) - , maxTrigger_(NULL) + , minTrigger_(nullptr) + , maxTrigger_(nullptr) { minTrigger_ = triggerManager->getBusTrigger(); maxTrigger_ = triggerManager->getBusTrigger(); - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ && maxTrigger_) { minTrigger_->setMemoryDataBus(); maxTrigger_->setMemoryDataBus(); @@ -60,7 +60,7 @@ DataRangeCondition430::DataRangeCondition430(TriggerManager430Ptr triggerManager addTrigger(minTrigger_); addTrigger(maxTrigger_); - setMinValue(minValue, minMask); + setMinValue(minValue, minMask); setMaxValue(maxValue, maxMask); setAccessType(accessType); @@ -77,7 +77,7 @@ DataRangeCondition430::DataRangeCondition430(TriggerManager430Ptr triggerManager void DataRangeCondition430::setAccessType(AccessType accessType) { - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { minTrigger_->setAccessType(accessType); maxTrigger_->setAccessType(accessType); @@ -86,7 +86,7 @@ void DataRangeCondition430::setAccessType(AccessType accessType) void DataRangeCondition430::setInside() { - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { minTrigger_->setComparisonOperation(CO_GREATER_EQUAL); maxTrigger_->setComparisonOperation(CO_LESS_EQUAL); @@ -97,7 +97,7 @@ void DataRangeCondition430::setInside() void DataRangeCondition430::setOutside() { - if (minTrigger_ != NULL && maxTrigger_ != NULL) + if (minTrigger_ != nullptr && maxTrigger_ != nullptr) { minTrigger_->setComparisonOperation(CO_LESS_EQUAL); maxTrigger_->setComparisonOperation(CO_GREATER_EQUAL); @@ -108,18 +108,18 @@ void DataRangeCondition430::setOutside() void DataRangeCondition430::setMinValue(uint32_t value, uint32_t mask) { - if (minTrigger_ != NULL) + if (minTrigger_ != nullptr) { minTrigger_->setValue(value); - minTrigger_->setMask(value); + minTrigger_->setMask(mask); } } void DataRangeCondition430::setMaxValue(uint32_t value, uint32_t mask) { - if (maxTrigger_ != NULL) + if (maxTrigger_ != nullptr) { maxTrigger_->setValue(value); - maxTrigger_->setMask(value); + maxTrigger_->setMask(mask); } } diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.h index 929e663..e3dd9c2 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataRangeCondition430.h @@ -3,44 +3,41 @@ * * Implementation of data value range trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_DATA_RANGE_CONDITION_430_H -#define DLL430_DATA_RANGE_CONDITION_430_H - -#include #include "TriggerCondition430.h" #include "IDataRangeCondition.h" @@ -51,7 +48,7 @@ class Trigger430; class DataRangeCondition430 : public TriggerCondition430, public IDataRangeCondition { public: - DataRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minValue, uint32_t maxValue, + DataRangeCondition430(TriggerManager430Ptr triggerManager, uint32_t minValue, uint32_t maxValue, uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, AccessType = AT_FETCH, bool outside = false); virtual void setAccessType(AccessType accessType); @@ -59,21 +56,16 @@ class DataRangeCondition430 : public TriggerCondition430, public IDataRangeCondi virtual void setOutside(); virtual void setMinValue(uint32_t value, uint32_t mask = 0xffffffff); virtual void setMaxValue(uint32_t value, uint32_t mask = 0xffffffff); - + virtual void addReaction(TriggerReaction reaction) { TriggerCondition430::addReaction(reaction); } virtual void removeReaction(TriggerReaction reaction) { TriggerCondition430::removeReaction(reaction); } virtual void combine(TriggerConditionPtr condition) { TriggerCondition430::combine(condition); } virtual uint32_t getId() const { return TriggerCondition430::getId(); } - virtual void enable() { TriggerCondition430::enable(); } - virtual void disable() { TriggerCondition430::disable(); } - private: Trigger430* minTrigger_; Trigger430* maxTrigger_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.cpp index a58d253..c7ab582 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.cpp @@ -3,39 +3,39 @@ * * Implementation of data value trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "DataValueCondition430.h" #include "../TriggerManager/TriggerManager430.h" #include "../Trigger/Trigger430.h" @@ -45,10 +45,10 @@ using namespace TI::DLL430; DataValueCondition430::DataValueCondition430(TriggerManager430Ptr triggerManager, uint32_t value, uint32_t mask, AccessType accessType, ComparisonOperation op) : TriggerCondition430(triggerManager) - , mainTrigger_(NULL) + , mainTrigger_(nullptr) { mainTrigger_ = triggerManager->getBusTrigger(); - if (mainTrigger_ != NULL) + if (mainTrigger_ != nullptr) { mainTrigger_->setMemoryDataBus(); @@ -62,7 +62,7 @@ DataValueCondition430::DataValueCondition430(TriggerManager430Ptr triggerManager void DataValueCondition430::setComparator(ComparisonOperation op) { - if (mainTrigger_ != NULL) + if (mainTrigger_ != nullptr) { mainTrigger_->setComparisonOperation(op); } @@ -70,7 +70,7 @@ void DataValueCondition430::setComparator(ComparisonOperation op) void DataValueCondition430::setAccessType(AccessType accessType) { - if (mainTrigger_ != NULL) + if (mainTrigger_ != nullptr) { mainTrigger_->setAccessType(accessType); } @@ -78,7 +78,7 @@ void DataValueCondition430::setAccessType(AccessType accessType) void DataValueCondition430::setValue(uint32_t value, uint32_t mask) { - if (mainTrigger_ != NULL) + if (mainTrigger_ != nullptr) { mainTrigger_->setValue(value); mainTrigger_->setMask(mask); diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.h index f355d09..679d059 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition430.h @@ -3,44 +3,41 @@ * * Implementation of data value trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_DATA_VALUE_CONDITION_430_H -#define DLL430_DATA_VALUE_CONDITION_430_H - -#include #include "TriggerCondition430.h" #include "IDataValueCondition.h" @@ -48,7 +45,7 @@ namespace TI { namespace DLL430 { class Trigger430; -class DataValueCondition430 : public TriggerCondition430, public IDataValueCondition +class DataValueCondition430 : public TriggerCondition430, public IDataValueCondition { public: DataValueCondition430(TriggerManager430Ptr triggerManager, uint32_t value, uint32_t mask = 0xffffffff, AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL); @@ -63,13 +60,8 @@ class DataValueCondition430 : public TriggerCondition430, public IDataValueCondi virtual void combine(TriggerConditionPtr condition) { TriggerCondition430::combine(condition); } virtual uint32_t getId() const { return TriggerCondition430::getId(); } - virtual void enable() { TriggerCondition430::enable(); } - virtual void disable() { TriggerCondition430::disable(); } - private: Trigger430* mainTrigger_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition432.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition432.cpp new file mode 100644 index 0000000..b235666 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition432.cpp @@ -0,0 +1,95 @@ +/* + * DataValueCondition432.cpp + * + * Implementation of data and instruction address trigger conditions for 432 + * + * Copyright (C) 2016 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. + */ + +#include +#include "DataValueCondition432.h" +#include "../TriggerManager/TriggerManager432.h" + +using namespace TI::DLL430; + + +DataValueCondition432::DataValueCondition432(TriggerManager432Ptr triggerManager, uint32_t value, uint32_t address, uint32_t addressMask, uint8_t dataSize, AccessType accessType) + : mainTrigger_(nullptr), + triggerManager_(triggerManager) +{ + mainTrigger_ = dynamic_cast(triggerManager->getDataValueTrigger()); + if (mainTrigger_ != nullptr) + { + setValue(value); + setAccessType(accessType); + setDataSize(dataSize); + setAddress(address, addressMask); + } +} + +DataValueCondition432::~DataValueCondition432() +{ + triggerManager_->releaseDataTrigger432(mainTrigger_); +} + +void DataValueCondition432::setAccessType(AccessType accessType) +{ + if (mainTrigger_ != nullptr) + { + mainTrigger_->setAccessType(accessType); + } +} + +void DataValueCondition432::setValue(uint32_t value, uint32_t mask) +{ + if (mainTrigger_ != nullptr) + { + mainTrigger_->setValue(value); + mainTrigger_->setMask(mask); + } +} + +void DataValueCondition432::setAddress(uint32_t address, uint32_t mask) +{ + if (mainTrigger_ != nullptr) + { + mainTrigger_->setAddress(address, mask); + } +} + +void DataValueCondition432::setDataSize(uint8_t dataSize) +{ + if (mainTrigger_ != nullptr) + { + mainTrigger_->setDataSize(dataSize); + } +} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition432.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition432.h new file mode 100644 index 0000000..93adce2 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/DataValueCondition432.h @@ -0,0 +1,68 @@ +/* + * DataValueCondition432.h + * + * Implementation of data and instruction address trigger conditions for 432 + * + * Copyright (C) 2016 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. + */ + +#pragma once + +#include "../TriggerManager/TriggerManager432.h" +#include "IDataValueCondition.h" +#include "../Trigger/Trigger432.h" + +namespace TI { namespace DLL430 { + + class DataValueCondition432 : public IDataValueCondition +{ +public: + DataValueCondition432(TriggerManager432Ptr triggerManager, uint32_t value, uint32_t address, uint32_t addressMask, uint8_t dataSize, AccessType accessType); + ~DataValueCondition432(); + + virtual void setValue(uint32_t value, uint32_t mask = 0xffffffff); + virtual void setAddress(uint32_t address, uint32_t mask = 0xffffffff); + virtual void setDataSize(uint8_t dataSize); + + virtual void setComparator(ComparisonOperation op) {} + virtual void setAccessType(AccessType accessType); + virtual void combine(TriggerConditionPtr condition) {} + virtual uint32_t getId() const {return 0;} + virtual void addReaction(TriggerReaction reaction) {} + virtual void removeReaction(TriggerReaction reaction) {} + +private: + DataValueTrigger432* mainTrigger_; + TriggerManager432Ptr triggerManager_; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IAddressRangeCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IAddressRangeCondition.h index 07d4e35..11862ce 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IAddressRangeCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IAddressRangeCondition.h @@ -3,49 +3,48 @@ * * Interface for address range trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_IADDRESS_RANGE_CONDITION_H -#define DLL430_IADDRESS_RANGE_CONDITION_H +#pragma once + -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { //Will trigger when accessing data on an address inside/outside a specified range -class IAddressRangeCondition : public ITriggerCondition +class IAddressRangeCondition : public ITriggerCondition { public: //Type of access to trigger on (instruction fetch, read, write, etc.) @@ -65,5 +64,3 @@ class IAddressRangeCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataAddressCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataAddressCondition.h index b3de541..b7733f3 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataAddressCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataAddressCondition.h @@ -3,43 +3,42 @@ * * Interface for data address trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_IDATA_ADDRESS_CONDITION_H -#define DLL430_IDATA_ADDRESS_CONDITION_H +#pragma once + -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { @@ -59,5 +58,3 @@ class IDataAddressCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataRangeCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataRangeCondition.h index 87a5fe7..8ab0c10 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataRangeCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataRangeCondition.h @@ -3,44 +3,40 @@ * * Interface for data value range trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once - -#ifndef DLL430_IDATA_RANGE_CONDITION_H -#define DLL430_IDATA_RANGE_CONDITION_H - -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { @@ -66,5 +62,3 @@ class IDataRangeCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataValueCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataValueCondition.h index bb4c4bb..6bf60ba 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataValueCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IDataValueCondition.h @@ -3,50 +3,47 @@ * * Interface for data value trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_IDATA_VALUE_CONDITION_H -#define DLL430_IDATA_VALUE_CONDITION_H - -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { //Will trigger when a specified data value appears on the data bus -class IDataValueCondition : public ITriggerCondition +class IDataValueCondition : public ITriggerCondition { public: //Set comparison operation (trigger on equal, not equal, etc.) @@ -60,5 +57,3 @@ class IDataValueCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionAddressCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionAddressCondition.h index 4f3e279..72798e1 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionAddressCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionAddressCondition.h @@ -3,49 +3,47 @@ * * Interface for instruction address trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_IINSTRUCTION_ADDRESS_CONDITION_H -#define DLL430_IINSTRUCTION_ADDRESS_CONDITION_H -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { //Will trigger if an instruction at a specified address is accessed -class IInstructionAddressCondition : public ITriggerCondition +class IInstructionAddressCondition : public ITriggerCondition { public: //Set comparison operation (trigger on equal, not equal, etc.) @@ -59,5 +57,3 @@ class IInstructionAddressCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionRangeCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionRangeCondition.h index 9441b49..ee5e6de 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionRangeCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IInstructionRangeCondition.h @@ -3,44 +3,40 @@ * * Interface for instruction address range trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once - -#ifndef DLL430_IINSTRUCTION_RANGE_CONDITION_H -#define DLL430_IINSTRUCTION_RANGE_CONDITION_H - -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { @@ -66,5 +62,3 @@ class IInstructionRangeCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IRegisterCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IRegisterCondition.h index 535b213..40e4b9c 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IRegisterCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/IRegisterCondition.h @@ -3,43 +3,41 @@ * * Interface for register trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_IREGISTER_CONDITION_H -#define DLL430_IREGISTER_CONDITION_H -#include #include "ITriggerCondition.h" namespace TI { namespace DLL430 { @@ -59,5 +57,3 @@ class IRegisterCondition : public ITriggerCondition }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ISoftwareTriggerCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ISoftwareTriggerCondition.h index fdac5a9..db176ad 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ISoftwareTriggerCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ISoftwareTriggerCondition.h @@ -3,41 +3,39 @@ * * Interface for software trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_ISOFTWARE_TRIGGER_CONDITION_H -#define DLL430_ISOFTWARE_TRIGGER_CONDITION_H +#pragma once #include "ITriggerCondition.h" @@ -46,11 +44,6 @@ namespace TI { namespace DLL430 { //Will trigger when code execution hits a specified address class ISoftwareTriggerCondition : public ITriggerCondition { -public: - //Set instruction address to trigger on - virtual void setAddress(uint32_t address) = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerCondition.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerCondition.h index d157fe8..1614812 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerCondition.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerCondition.h @@ -3,52 +3,47 @@ * * Base interface for trigger conditions * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_ITRIGGER_CONDITION_H -#define DLL430_ITRIGGER_CONDITION_H - -#include -#include -#include #include "TriggerDefinitions.h" namespace TI { namespace DLL430 { class ITriggerCondition; -typedef boost::shared_ptr TriggerConditionPtr; +typedef std::shared_ptr TriggerConditionPtr; //Common interface for all trigger conditions class ITriggerCondition @@ -58,15 +53,11 @@ class ITriggerCondition //Combine with another condition (second trigger condition will become invalid) virtual void combine(TriggerConditionPtr condition) = 0; - + //Only internally used by other modules virtual uint32_t getId() const = 0; - virtual void enable() = 0; - virtual void disable() = 0; virtual void addReaction(TriggerReaction reaction) = 0; virtual void removeReaction(TriggerReaction reaction) = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerConditionManager.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerConditionManager.h index f23ffff..a1fdf50 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerConditionManager.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/ITriggerConditionManager.h @@ -3,44 +3,39 @@ * * Interface for trigger condition manager * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_ITRIGGER_CONDITION_MANAGER_H -#define DLL430_ITRIGGER_CONDITION_MANAGER_H - -#include -#include +#pragma once #include "ISoftwareTriggerCondition.h" #include "IRegisterCondition.h" @@ -54,15 +49,14 @@ namespace TI { namespace DLL430 { -typedef boost::shared_ptr TriggerConditionPtr; -typedef boost::shared_ptr SoftwareTriggerConditionPtr; -typedef boost::shared_ptr RegisterConditionPtr; -typedef boost::shared_ptr InstructionAddressConditionPtr; -typedef boost::shared_ptr DataAddressConditionPtr; -typedef boost::shared_ptr DataValueConditionPtr; -typedef boost::shared_ptr InstructionRangeConditionPtr; -typedef boost::shared_ptr AddressRangeConditionPtr; -typedef boost::shared_ptr DataRangeConditionPtr; +typedef std::shared_ptr SoftwareTriggerConditionPtr; +typedef std::shared_ptr RegisterConditionPtr; +typedef std::shared_ptr InstructionAddressConditionPtr; +typedef std::shared_ptr DataAddressConditionPtr; +typedef std::shared_ptr DataValueConditionPtr; +typedef std::shared_ptr InstructionRangeConditionPtr; +typedef std::shared_ptr AddressRangeConditionPtr; +typedef std::shared_ptr DataRangeConditionPtr; //Responsible for checking resources and creating trigger conditions @@ -74,31 +68,41 @@ class ITriggerConditionManager //Creator functions for all trigger condition types (will throw on error) virtual SoftwareTriggerConditionPtr createSoftwareTriggerCondition(uint32_t address = 0) = 0; - virtual RegisterConditionPtr createRegisterCondition(uint8_t reg = 0, uint32_t value = 0, uint32_t mask = 0xffffffff, + virtual RegisterConditionPtr createRegisterCondition(uint8_t reg = 0, uint32_t value = 0, uint32_t mask = 0xffffffff, ComparisonOperation op = CO_EQUAL) = 0; - - virtual InstructionAddressConditionPtr createInstructionAddressCondition(uint32_t address = 0, uint32_t mask = 0xffffffff, - AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL) = 0; - - virtual DataAddressConditionPtr createDataAddressCondition(uint32_t address = 0, uint32_t mask = 0xffffffff, + + virtual InstructionAddressConditionPtr createInstructionAddressCondition(uint32_t address = 0, uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL) = 0; + + virtual DataAddressConditionPtr createDataAddressCondition(uint32_t address = 0, uint32_t mask = 0xffffffff, AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL) = 0; - - virtual DataValueConditionPtr createDataValueCondition(uint32_t value = 0, uint32_t mask = 0xffffffff, + + virtual DataValueConditionPtr createDataValueCondition(uint32_t value = 0, uint32_t mask = 0xffffffff, AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL) = 0; - - virtual InstructionRangeConditionPtr createInstructionRangeCondition(uint32_t minAddress = 0, uint32_t maxAddress = 0, - uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, + + virtual InstructionRangeConditionPtr createInstructionRangeCondition(uint32_t minAddress = 0, uint32_t maxAddress = 0, + uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, AccessType = AT_FETCH, bool outside = false) = 0; - - virtual AddressRangeConditionPtr createAddressRangeCondition(uint32_t minAddress = 0, uint32_t maxAddress = 0, - uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, + + virtual AddressRangeConditionPtr createAddressRangeCondition(uint32_t minAddress = 0, uint32_t maxAddress = 0, + uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, AccessType = AT_FETCH, bool outside = false) = 0; - + virtual DataRangeConditionPtr createDataRangeCondition(uint32_t minValue = 0, uint32_t maxValue = 0, - uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, + uint32_t minMask = 0xffffffff, uint32_t maxMask = 0xffffffff, AccessType = AT_FETCH, bool outside = false) = 0; + + virtual DataValueConditionPtr createDataAddressValueCondition(uint32_t value = 0, + uint32_t address = 0x00, + uint32_t valueMask = 0xffffffff, + uint32_t addressMask = 0xffffffff, + AccessType condAccessType = AT_FETCH, + AccessType accessType = AT_FETCH, + ComparisonOperation condOp = CO_EQUAL, + ComparisonOperation op = CO_EQUAL, + DataSize dataSize = DS_32Bit) = 0; }; -}} +typedef std::shared_ptr TriggerConditionManagerPtr; -#endif +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.cpp index c5163a5..e4471b8 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.cpp @@ -3,40 +3,39 @@ * * Implementation of register trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - +#include #include "RegisterCondition430.h" #include "../TriggerManager/TriggerManager430.h" #include "../Trigger/Trigger430.h" @@ -46,14 +45,14 @@ using namespace TI::DLL430; RegisterCondition430::RegisterCondition430(TriggerManager430Ptr triggerManager, uint8_t reg, uint32_t value, uint32_t mask, ComparisonOperation op) : TriggerCondition430(triggerManager) - , registerTrigger_(NULL) + , registerTrigger_(nullptr) { registerTrigger_ = triggerManager->getRegisterTrigger(); - - if (registerTrigger_ != NULL) + + if (registerTrigger_ != nullptr) { addTrigger(registerTrigger_); - + setRegister(reg); setValue(value, mask); setComparator(op); @@ -62,7 +61,7 @@ RegisterCondition430::RegisterCondition430(TriggerManager430Ptr triggerManager, void RegisterCondition430::setComparator(ComparisonOperation op) { - if (registerTrigger_ != NULL) + if (registerTrigger_ != nullptr) { registerTrigger_->setComparisonOperation(op); } @@ -70,7 +69,7 @@ void RegisterCondition430::setComparator(ComparisonOperation op) void RegisterCondition430::setRegister(uint8_t reg) { - if (registerTrigger_ != NULL) + if (registerTrigger_ != nullptr) { registerTrigger_->setRegister(reg); } @@ -78,7 +77,7 @@ void RegisterCondition430::setRegister(uint8_t reg) void RegisterCondition430::setValue(uint32_t value, uint32_t mask) { - if (registerTrigger_ != NULL) + if (registerTrigger_ != nullptr) { registerTrigger_->setValue(value); registerTrigger_->setMask(mask); diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.h index 7082d86..3a28a65 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/RegisterCondition430.h @@ -3,43 +3,41 @@ * * Implementation of register trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_REGISTER_CONDITION_430_H -#define DLL430_REGISTER_CONDITION_430_H -#include #include "TriggerCondition430.h" #include "IRegisterCondition.h" @@ -56,20 +54,15 @@ class RegisterCondition430 : public TriggerCondition430, public IRegisterConditi virtual void setComparator(ComparisonOperation op); virtual void setRegister(uint8_t reg); virtual void setValue(uint32_t value, uint32_t mask = 0xffffffff); - + virtual void addReaction(TriggerReaction reaction) { TriggerCondition430::addReaction(reaction); } virtual void removeReaction(TriggerReaction reaction) { TriggerCondition430::removeReaction(reaction); } virtual void combine(TriggerConditionPtr condition) { TriggerCondition430::combine(condition); } virtual uint32_t getId() const { return TriggerCondition430::getId(); } - virtual void enable() { TriggerCondition430::enable(); } - virtual void disable() { TriggerCondition430::disable(); } - private: Trigger430* registerTrigger_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/SoftwareTriggerCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/SoftwareTriggerCondition430.cpp new file mode 100644 index 0000000..2bf2f02 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/SoftwareTriggerCondition430.cpp @@ -0,0 +1,53 @@ +/* + * SoftwareTriggerCondition430.cpp + * + * Implementation of software trigger conditions for 430 + * + * Copyright (C) 2007 - 2013 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. + */ + +#include +#include "SoftwareTriggerCondition430.h" + +using namespace TI::DLL430; + + +SoftwareTriggerCondition430::SoftwareTriggerCondition430(SoftwareBreakpointManagerPtr swbpManager, uint32_t address) + : mSwbpManager(swbpManager), mAddress(address) +{ + mSwbpManager->setSoftwareTriggerAt(address); +} + +SoftwareTriggerCondition430::~SoftwareTriggerCondition430() +{ + mSwbpManager->removeSoftwareTriggerAt(mAddress); +} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/SoftwareTriggerCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/SoftwareTriggerCondition430.h new file mode 100644 index 0000000..77dd5d8 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/SoftwareTriggerCondition430.h @@ -0,0 +1,64 @@ +/* + * SoftwareTriggerCondition430.h + * + * Implementation of software trigger conditions for 430 + * + * Copyright (C) 2007 - 2013 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. + */ + +#pragma once + + +#include "ISoftwareTriggerCondition.h" +#include "../Exceptions/Exceptions.h" +#include "../SoftwareBreakpoints/SoftwareBreakpointManager.h" + +namespace TI { namespace DLL430 { + + +class SoftwareTriggerCondition430 : public ISoftwareTriggerCondition +{ +public: + SoftwareTriggerCondition430(SoftwareBreakpointManagerPtr swbpManager, uint32_t address); + ~SoftwareTriggerCondition430(); + + virtual void addReaction(TriggerReaction reaction) { throw EM_NotSupportedException(); } + virtual void removeReaction(TriggerReaction reaction) { throw EM_NotSupportedException(); } + virtual void combine(TriggerConditionPtr condition) { throw EM_NotSupportedException(); } + virtual uint32_t getId() const { throw EM_NotSupportedException(); } + +private: + SoftwareBreakpointManagerPtr mSwbpManager; + uint32_t mAddress; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.cpp index fa8867d..3d332e2 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.cpp @@ -3,41 +3,40 @@ * * Common implementation of trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include +#include #include "TriggerCondition430.h" #include "../Trigger/Trigger430.h" @@ -64,7 +63,7 @@ TriggerCondition430::~TriggerCondition430() void TriggerCondition430::addReaction(TriggerReaction reaction) { - BOOST_FOREACH(Trigger430* trigger, triggers_) + for (Trigger430* trigger : triggers_) { if (!trigger->isCombinationTrigger()) { @@ -76,7 +75,7 @@ void TriggerCondition430::addReaction(TriggerReaction reaction) void TriggerCondition430::removeReaction(TriggerReaction reaction) { - BOOST_FOREACH(Trigger430* trigger, triggers_) + for (Trigger430* trigger : triggers_) { trigger->removeReaction(reaction); } @@ -89,7 +88,7 @@ void TriggerCondition430::combine(TriggerConditionPtr condition) { if (!triggers_.empty()) { - BOOST_FOREACH(Trigger430* trigger, otherCondition->triggers_) + for (Trigger430* trigger : otherCondition->triggers_) { triggers_.front()->combineWith(trigger); triggers_.push_back(trigger); @@ -105,21 +104,3 @@ uint32_t TriggerCondition430::getId() const const Trigger430* mainTrigger = triggers_.empty() ? 0 : triggers_.front(); return triggerManager_->getCombinationTrigger(mainTrigger); } - - -void TriggerCondition430::enable() -{ - BOOST_FOREACH(Trigger430* trigger, triggers_) - { - trigger->isEnabled(true); - } -} - - -void TriggerCondition430::disable() -{ - BOOST_FOREACH(Trigger430* trigger, triggers_) - { - trigger->isEnabled(false); - } -} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.h index 4ae8ee7..0a49973 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerCondition430.h @@ -3,60 +3,52 @@ * * Common implementation of trigger conditions for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_TRIGGER_CONDITION_430_H -#define DLL430_TRIGGER_CONDITION_430_H - -#include -#include -#include -#include #include "ITriggerCondition.h" +#include "../TriggerManager/TriggerManager430.h" namespace TI { namespace DLL430 { class Trigger430; -class TriggerManager430; - -typedef boost::shared_ptr TriggerManager430Ptr; class TriggerCondition430 { protected: - TriggerCondition430(TriggerManager430Ptr triggerManager); + explicit TriggerCondition430(TriggerManager430Ptr triggerManager); virtual ~TriggerCondition430(); virtual void addReaction(TriggerReaction reaction); @@ -64,18 +56,13 @@ class TriggerCondition430 virtual void combine(TriggerConditionPtr condition); virtual uint32_t getId() const; - - virtual void enable(); - virtual void disable(); - TriggerManager430Ptr triggerManager() { return triggerManager_; } + TriggerManager430Ptr triggerManager() const { return triggerManager_; } void addTrigger(Trigger430* trigger) { triggers_.push_back(trigger); } -private: +private: std::list triggers_; TriggerManager430Ptr triggerManager_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.cpp index 8d310b5..e9ccd85 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.cpp @@ -3,70 +3,75 @@ * * Implementation of trigger condition manager for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include "TriggerConditionManager430.h" #include "TriggerCondition430.h" -#include "TriggerCondition430.h" #include "RegisterCondition430.h" #include "AddressCondition430.h" #include "DataValueCondition430.h" #include "AddressRangeCondition430.h" #include "DataRangeCondition430.h" +#include "SoftwareTriggerCondition430.h" #include "../TriggerManager/TriggerManager430.h" #include "../Exceptions/Exceptions.h" +#include "../SoftwareBreakpoints/SoftwareBreakpointManager.h" using namespace TI::DLL430; -TriggerConditionManager430::TriggerConditionManager430(TriggerManager430Ptr triggerManager) +TriggerConditionManager430::TriggerConditionManager430(TriggerManager430Ptr triggerManager, SoftwareBreakpointsPtr swbp) : triggerManager_(triggerManager) + , softwareBreakpoints_(swbp) { } -SoftwareTriggerConditionPtr TriggerConditionManager430::createSoftwareTriggerCondition(uint32_t) +SoftwareTriggerConditionPtr TriggerConditionManager430::createSoftwareTriggerCondition(uint32_t address) { - throw EM_NotSupportedException(); + if (!softwareBreakpoints_ || !softwareBreakpoints_->isEnabled()) + throw EM_SoftwareBreakpointsNotEnabledException(); + + return std::make_shared(softwareBreakpoints_->getSwbpManager(), address); } -RegisterConditionPtr TriggerConditionManager430::createRegisterCondition(uint8_t reg, uint32_t value, uint32_t mask, - ComparisonOperation op) +RegisterConditionPtr TriggerConditionManager430::createRegisterCondition(uint8_t reg, uint32_t value, uint32_t mask, + ComparisonOperation op) { if (!triggerManager_->hasRegisterTriggers()) throw EM_TriggerParameterException(); @@ -74,69 +79,87 @@ RegisterConditionPtr TriggerConditionManager430::createRegisterCondition(uint8_t if (triggerManager_->numAvailableRegisterTriggers() < 1) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, reg, value, mask, op); + return std::make_shared(triggerManager_, reg, value, mask, op); } -InstructionAddressConditionPtr TriggerConditionManager430::createInstructionAddressCondition(uint32_t address, uint32_t mask, - AccessType accessType, - ComparisonOperation op) +InstructionAddressConditionPtr TriggerConditionManager430::createInstructionAddressCondition(uint32_t address, uint32_t mask, + AccessType accessType, + ComparisonOperation op) { if (triggerManager_->numAvailableBusTriggers() < 1) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, address, mask, accessType, op); + return std::make_shared(triggerManager_, address, mask, accessType, op); } -DataAddressConditionPtr TriggerConditionManager430::createDataAddressCondition(uint32_t address, uint32_t mask, - AccessType accessType, ComparisonOperation op) +DataAddressConditionPtr TriggerConditionManager430::createDataAddressCondition(uint32_t address, uint32_t mask, + AccessType accessType, ComparisonOperation op) { if (triggerManager_->numAvailableBusTriggers() < 1) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, address, mask, accessType, op); + return std::make_shared(triggerManager_, address, mask, accessType, op); } -DataValueConditionPtr TriggerConditionManager430::createDataValueCondition(uint32_t value, uint32_t mask, - AccessType accessType, ComparisonOperation op) +DataValueConditionPtr TriggerConditionManager430::createDataValueCondition(uint32_t value, uint32_t mask, + AccessType accessType, ComparisonOperation op) { if (triggerManager_->numAvailableBusTriggers() < 1) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, value, mask, accessType, op); + return std::make_shared(triggerManager_, value, mask, accessType, op); } -InstructionRangeConditionPtr TriggerConditionManager430::createInstructionRangeCondition(uint32_t minAddress, uint32_t maxAddress, - uint32_t minMask, uint32_t maxMask, - AccessType accessType, bool outside) +InstructionRangeConditionPtr TriggerConditionManager430::createInstructionRangeCondition(uint32_t minAddress, uint32_t maxAddress, + uint32_t minMask, uint32_t maxMask, + AccessType accessType, bool outside) { if (triggerManager_->numAvailableBusTriggers() < 2) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, minAddress, maxAddress, minMask, maxMask, accessType, outside); + return std::make_shared(triggerManager_, minAddress, maxAddress, minMask, maxMask, accessType, outside); } -AddressRangeConditionPtr TriggerConditionManager430::createAddressRangeCondition(uint32_t minAddress, uint32_t maxAddress, +AddressRangeConditionPtr TriggerConditionManager430::createAddressRangeCondition(uint32_t minAddress, uint32_t maxAddress, uint32_t minMask, uint32_t maxMask, - AccessType accessType, bool outside) + AccessType accessType, bool outside) { if (triggerManager_->numAvailableBusTriggers() < 2) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, minAddress, maxAddress, minMask, maxMask, accessType, outside); + return std::make_shared(triggerManager_, minAddress, maxAddress, minMask, maxMask, accessType, outside); } -DataRangeConditionPtr TriggerConditionManager430::createDataRangeCondition(uint32_t minValue, uint32_t maxValue, +DataRangeConditionPtr TriggerConditionManager430::createDataRangeCondition(uint32_t minValue, uint32_t maxValue, uint32_t minMask, uint32_t maxMask, - AccessType accessType, bool outside) + AccessType accessType, bool outside) { if (triggerManager_->numAvailableBusTriggers() < 2) throw EM_TriggerResourceException(); - return boost::make_shared(triggerManager_, minValue, maxValue, minMask, maxMask, accessType, outside); + return std::make_shared(triggerManager_, minValue, maxValue, minMask, maxMask, accessType, outside); +} + +DataValueConditionPtr TriggerConditionManager430::createDataAddressValueCondition(uint32_t value, uint32_t address, + uint32_t valueMask, uint32_t addressMask, AccessType condAccessType, AccessType accessType, ComparisonOperation condOp, + ComparisonOperation op, DataSize dataSize) +{ + //throw EM_TriggerResourceException(); + + DataValueConditionPtr triggerCondition = createDataValueCondition(address, addressMask, + accessType, + op); + + DataValueConditionPtr dataCond = createDataValueCondition(value, valueMask, + condAccessType, + condOp); + triggerCondition->combine(dataCond); + + return triggerCondition; } diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.h index 55dfa21..25a0bff 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager430.h @@ -3,47 +3,42 @@ * * Implementation of trigger condition manager for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_TRIGGER_CONDITION_FACTORY_430_H -#define DLL430_TRIGGER_CONDITION_FACTORY_430_H - -#include +#pragma once #include "ITriggerConditionManager.h" #include "ITriggerCondition.h" -#include "ITriggerConditionManager.h" #include "ISoftwareTriggerCondition.h" #include "IRegisterCondition.h" #include "IInstructionAddressCondition.h" @@ -52,65 +47,74 @@ #include "IInstructionRangeCondition.h" #include "IAddressRangeCondition.h" #include "IDataRangeCondition.h" +#include "../TriggerManager/TriggerManager430.h" +#include "../SoftwareBreakpoints/ISoftwareBreakpoints.h" +#include "../SoftwareBreakpoints/SoftwareBreakpointManager.h" namespace TI { namespace DLL430 { -class TriggerManager430; -typedef boost::shared_ptr TriggerManager430Ptr; - class TriggerConditionManager430 : public ITriggerConditionManager { public: - TriggerConditionManager430(TriggerManager430Ptr triggerManager); + TriggerConditionManager430(TriggerManager430Ptr triggerManager, SoftwareBreakpointsPtr softwareBreakpoints); virtual SoftwareTriggerConditionPtr createSoftwareTriggerCondition(uint32_t address = 0); - - virtual RegisterConditionPtr createRegisterCondition(uint8_t reg = 0, - uint32_t value = 0, - uint32_t mask = 0xffffffff, + + virtual RegisterConditionPtr createRegisterCondition(uint8_t reg = 0, + uint32_t value = 0, + uint32_t mask = 0xffffffff, ComparisonOperation = CO_EQUAL); - - virtual InstructionAddressConditionPtr createInstructionAddressCondition(uint32_t address = 0, - uint32_t mask = 0xffffffff, - AccessType = AT_FETCH, + + virtual InstructionAddressConditionPtr createInstructionAddressCondition(uint32_t address = 0, + uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL); - - virtual DataAddressConditionPtr createDataAddressCondition(uint32_t address = 0, - uint32_t mask = 0xffffffff, - AccessType = AT_FETCH, + + virtual DataAddressConditionPtr createDataAddressCondition(uint32_t address = 0, + uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL); - - virtual DataValueConditionPtr createDataValueCondition(uint32_t value = 0, - uint32_t mask = 0xffffffff, - AccessType = AT_FETCH, + + virtual DataValueConditionPtr createDataValueCondition(uint32_t value = 0, + uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, ComparisonOperation = CO_EQUAL); - - virtual InstructionRangeConditionPtr createInstructionRangeCondition(uint32_t minAddress = 0, - uint32_t maxAddress = 0, - uint32_t minMask = 0xffffffff, - uint32_t maxMask = 0xffffffff, - AccessType = AT_FETCH, + + virtual InstructionRangeConditionPtr createInstructionRangeCondition(uint32_t minAddress = 0, + uint32_t maxAddress = 0, + uint32_t minMask = 0xffffffff, + uint32_t maxMask = 0xffffffff, + AccessType = AT_FETCH, bool outside = false); - - virtual AddressRangeConditionPtr createAddressRangeCondition(uint32_t minAddress = 0, - uint32_t maxAddress = 0, - uint32_t minMask = 0xffffffff, - uint32_t maxMask = 0xffffffff, - AccessType = AT_FETCH, + + virtual AddressRangeConditionPtr createAddressRangeCondition(uint32_t minAddress = 0, + uint32_t maxAddress = 0, + uint32_t minMask = 0xffffffff, + uint32_t maxMask = 0xffffffff, + AccessType = AT_FETCH, bool outside = false); - - virtual DataRangeConditionPtr createDataRangeCondition(uint32_t minValue = 0, - uint32_t maxValue = 0, - uint32_t minMask = 0xffffffff, - uint32_t maxMask = 0xffffffff, - AccessType = AT_FETCH, + + virtual DataRangeConditionPtr createDataRangeCondition(uint32_t minValue = 0, + uint32_t maxValue = 0, + uint32_t minMask = 0xffffffff, + uint32_t maxMask = 0xffffffff, + AccessType = AT_FETCH, bool outside = false); + virtual DataValueConditionPtr createDataAddressValueCondition(uint32_t value = 0, + uint32_t address = 0x00, + uint32_t valueMask = 0xffffffff, + uint32_t addressMask = 0xffffffff, + AccessType condAccessType = AT_FETCH, + AccessType accessType = AT_FETCH, + ComparisonOperation condOp = CO_EQUAL, + ComparisonOperation op = CO_EQUAL, + DataSize dataSize = DS_32Bit); + private: TriggerManager430Ptr triggerManager_; + SoftwareBreakpointsPtr softwareBreakpoints_; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager432.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager432.cpp new file mode 100644 index 0000000..13d1124 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager432.cpp @@ -0,0 +1,171 @@ +/* + * TriggerConditionManager432.cpp + * + * Implementation of trigger condition manager for 432 + * + * Copyright (C) 2007 - 2011 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. + */ + + +#include + +#include "TriggerConditionManager432.h" +#include "AddressCondition432.h" +#include "DataAddressCondition432.h" +#include "DataValueCondition432.h" +#include "../TriggerManager/TriggerManager432.h" +#include "../Exceptions/Exceptions.h" + +using namespace TI::DLL430; + + +TriggerConditionManager432::TriggerConditionManager432(TriggerManager432Ptr triggerManager) + : triggerManager_(triggerManager) +{ +} + + +SoftwareTriggerConditionPtr TriggerConditionManager432::createSoftwareTriggerCondition(uint32_t address) +{ + throw EM_SoftwareBreakpointsNotEnabledException(); +} + + +RegisterConditionPtr TriggerConditionManager432::createRegisterCondition(uint8_t reg, uint32_t value, uint32_t mask, + ComparisonOperation op) +{ + throw EM_TriggerResourceException(); +} + + +InstructionAddressConditionPtr TriggerConditionManager432::createInstructionAddressCondition(uint32_t address, uint32_t mask, + AccessType accessType, ComparisonOperation) +{ + if (triggerManager_->numAvailableCodeTriggers() < 1) + throw EM_TriggerResourceException(); + + return std::make_shared(triggerManager_, address, mask, accessType); +} + + +DataAddressConditionPtr TriggerConditionManager432::createDataAddressCondition(uint32_t address, uint32_t mask, + AccessType accessType, ComparisonOperation) +{ + if (triggerManager_->numAvailableDataAddressTriggers() < 1) + throw EM_TriggerResourceException(); + + /* address mask sanity check + * mask must be: + * 0xFFFFFFFF + * 0xFFFFFFFE + * 0xFFFFFFFC + * ... + * 0xFFFF8000 + */ + if ((mask & 0xffff8000) != 0xffff8000) + throw EM_TriggerParameterException(); + + bool found_1 = false; + for (uint32_t i = 1; i < (1 << 16); i <<= 1) + { + if (found_1 && !(mask & i)) + throw EM_TriggerParameterException(); + + if (mask & i) + found_1 = true; + } + + return std::make_shared(triggerManager_, address, mask, accessType); +} + +DataValueConditionPtr TriggerConditionManager432::createDataValueCondition(uint32_t value, uint32_t mask, + AccessType accessType, ComparisonOperation op) +{ + throw EM_TriggerResourceException(); +} + +InstructionRangeConditionPtr TriggerConditionManager432::createInstructionRangeCondition(uint32_t minAddress, uint32_t maxAddress, + uint32_t minMask, uint32_t maxMask, + AccessType accessType, bool outside) +{ + throw EM_TriggerResourceException(); +} + + +AddressRangeConditionPtr TriggerConditionManager432::createAddressRangeCondition(uint32_t minAddress, uint32_t maxAddress, + uint32_t minMask, uint32_t maxMask, + AccessType accessType, bool outside) +{ + throw EM_TriggerResourceException(); +} + + +DataRangeConditionPtr TriggerConditionManager432::createDataRangeCondition(uint32_t minValue, uint32_t maxValue, + uint32_t minMask, uint32_t maxMask, + AccessType accessType, bool outside) +{ + throw EM_TriggerResourceException(); +} + +DataValueConditionPtr TriggerConditionManager432::createDataAddressValueCondition(uint32_t value, uint32_t address, + uint32_t valueMask, uint32_t addressMask, AccessType condAccessType, AccessType accessType, ComparisonOperation condOp, + ComparisonOperation op, DataSize dataSize) +{ + /* Match on data value always requires an additonal address matching */ + if (triggerManager_->numAvailableDataAddressTriggers() < 1 || triggerManager_->numAvailableDataValueTriggers() < 1) + throw EM_TriggerResourceException(); + + /* address mask sanity check + * mask must be: + * 0xFFFFFFFF + * 0xFFFFFFFE + * 0xFFFFFFFC + * ... + * 0xFFFF8000 + */ + if ((addressMask & 0xffff8000) != 0xffff8000) + throw EM_TriggerParameterException(); + + bool found_1 = false; + for (uint32_t i = 1; i < (1<<16); i <<= 1) + { + if (found_1 && !(addressMask & i)) + throw EM_TriggerParameterException(); + + if (addressMask & i) + found_1 = true; + } + + std::shared_ptr trigger = std::make_shared(triggerManager_, value, address, addressMask, dataSize, accessType); + + return trigger; +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager432.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager432.h new file mode 100644 index 0000000..6ad456b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerConditionManager432.h @@ -0,0 +1,117 @@ +/* + * TriggerConditionManager432.h + * + * Implementation of trigger condition manager for 430 + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "ITriggerConditionManager.h" +#include "ITriggerCondition.h" +#include "ISoftwareTriggerCondition.h" +#include "IRegisterCondition.h" +#include "IInstructionAddressCondition.h" +#include "IDataAddressCondition.h" +#include "IDataValueCondition.h" +#include "IInstructionRangeCondition.h" +#include "IAddressRangeCondition.h" +#include "IDataRangeCondition.h" +#include "../TriggerManager/TriggerManager432.h" + +namespace TI { namespace DLL430 { + + +class TriggerConditionManager432 : public ITriggerConditionManager +{ +public: + explicit TriggerConditionManager432(TriggerManager432Ptr triggerManager); + + virtual SoftwareTriggerConditionPtr createSoftwareTriggerCondition(uint32_t address = 0); + + virtual RegisterConditionPtr createRegisterCondition(uint8_t reg = 0, + uint32_t value = 0, + uint32_t mask = 0xffffffff, + ComparisonOperation = CO_EQUAL); + + virtual InstructionAddressConditionPtr createInstructionAddressCondition(uint32_t address = 0, + uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, + ComparisonOperation = CO_EQUAL); + + virtual DataAddressConditionPtr createDataAddressCondition(uint32_t address = 0, + uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, + ComparisonOperation = CO_EQUAL); + + virtual DataValueConditionPtr createDataValueCondition(uint32_t value = 0, + uint32_t mask = 0xffffffff, + AccessType = AT_FETCH, + ComparisonOperation = CO_EQUAL); + + virtual InstructionRangeConditionPtr createInstructionRangeCondition(uint32_t minAddress = 0, + uint32_t maxAddress = 0, + uint32_t minMask = 0xffffffff, + uint32_t maxMask = 0xffffffff, + AccessType = AT_FETCH, + bool outside = false); + + virtual AddressRangeConditionPtr createAddressRangeCondition(uint32_t minAddress = 0, + uint32_t maxAddress = 0, + uint32_t minMask = 0xffffffff, + uint32_t maxMask = 0xffffffff, + AccessType = AT_FETCH, + bool outside = false); + + virtual DataRangeConditionPtr createDataRangeCondition(uint32_t minValue = 0, + uint32_t maxValue = 0, + uint32_t minMask = 0xffffffff, + uint32_t maxMask = 0xffffffff, + AccessType = AT_FETCH, + bool outside = false); + + virtual DataValueConditionPtr createDataAddressValueCondition(uint32_t value = 0, + uint32_t address = 0x00, + uint32_t valueMask = 0xffffffff, + uint32_t addressMask = 0xffffffff, + AccessType condAccessType = AT_FETCH, + AccessType accessType = AT_FETCH, + ComparisonOperation condOp = CO_EQUAL, + ComparisonOperation op = CO_EQUAL, + DataSize dataSize = DS_32Bit); + +private: + TriggerManager432Ptr triggerManager_; +}; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerDefinitions.h b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerDefinitions.h index 70f4c38..a572fdf 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerDefinitions.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerCondition/TriggerDefinitions.h @@ -3,46 +3,44 @@ * * Definitions used for trigger condition configuration * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_TRIGGER_DEFINITIONS_H -#define DLL430_TRIGGER_DEFINITIONS_H +#pragma once namespace TI { namespace DLL430 { - enum TriggerReaction - { + enum TriggerReaction + { TR_BREAK, TR_CYCLE_COUNTER, TR_SEQUENCER, @@ -53,14 +51,14 @@ namespace TI { namespace DLL430 { }; enum ComparisonOperation - { + { CO_EQUAL, CO_GREATER_EQUAL, CO_LESS_EQUAL, CO_NOT_EQUAL }; - - enum AccessType + + enum AccessType { AT_FETCH, AT_FETCH_HOLD, @@ -77,9 +75,15 @@ namespace TI { namespace DLL430 { AT_NO_FETCH_READ_NO_DMA, AT_READ_NO_DMA, AT_READ_DMA, - AT_WRITE_DMA + AT_WRITE_DMA, + AT_READ_WRITE }; -}} + enum DataSize + { + DS_8Bit = 0, + DS_16Bit = 1, + DS_32Bit = 2 + }; -#endif +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.cpp index b22f312..7205caf 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.cpp @@ -3,51 +3,45 @@ * * Handles assignment of triggers to trigger blocks * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include #include "TriggerConfigurator430.h" -#include -#include - using namespace std; using namespace TI::DLL430; -//@OPTION In case of performance issues with trigger configuration -#define REDUCED_TRIGGER_TABLE - template set arrayToSet(const T(&a)[N]) @@ -63,13 +57,12 @@ TriggerConfigurator430::TriggerConfigurator430(deque& trigger , sequencerEnabled(sequencerEnabled) , sequencerOutId(0xFF) , sequencerResetId(0xFF) - + { setupConstraints(combinationTriggers.size()); } -//Must be adjusted for each EEM (use this for large >=8 combinations) void TriggerConfigurator430::setupConstraints(size_t numCombinationTriggers) { for (uint32_t id = 0; id < numCombinationTriggers; ++id) @@ -83,31 +76,36 @@ void TriggerConfigurator430::setupConstraints(size_t numCombinationTriggers) if (id > 0) { possibleIDs[TR_CYCLE_COUNTER].insert(id); - + if (numCombinationTriggers >= 8) { possibleIDs[TR_STATE_STORAGE].insert(id); - possibleIDs[TR_VARIABLE_WATCH].insert(id); + + //Only 8 slots in the storage buffer, each mapped to the corresponding combination register + if (id < 8) + { + possibleIDs[TR_VARIABLE_WATCH].insert(id); + } } } } if (numCombinationTriggers == 6) { - const uint32_t validForSequencer[] = {2,3,4,5}; + const uint32_t validForSequencer[] = {2, 3, 4, 5}; possibleIDs[TR_SEQUENCER] = arrayToSet(validForSequencer); - possibleIDs[TR_SEQUENCER_RESET].insert(1); - + possibleIDs[TR_SEQUENCER_RESET].insert(1); + sequencerOutId = 5; sequencerResetId = 1; } if (numCombinationTriggers >= 8) { - const uint32_t validForSequencer[] = {4,5,6,7}; + const uint32_t validForSequencer[] = {4, 5, 6, 7}; possibleIDs[TR_SEQUENCER] = arrayToSet(validForSequencer); - possibleIDs[TR_SEQUENCER_RESET].insert(3); - + possibleIDs[TR_SEQUENCER_RESET].insert(3); + sequencerOutId = 7; sequencerResetId = 3; } @@ -125,9 +123,9 @@ bool TriggerConfigurator430::checkReactionCounts() const } size_t reactionCounts[TR_NUM_REACTIONS] = {0}; - BOOST_FOREACH(const Trigger430* trigger, triggers) + for (const Trigger430* trigger : triggers) { - BOOST_FOREACH(TriggerReaction reaction, trigger->getReactions()) + for (TriggerReaction reaction : trigger->getReactions()) { if (++reactionCounts[reaction] > possibleIDs[reaction].size()) return false; @@ -142,10 +140,10 @@ set TriggerConfigurator430::getValidIDsForTriggerReactions(const Trigg { set idSet = availableIDs; - BOOST_FOREACH(TriggerReaction r, trigger.getReactions()) + for (TriggerReaction r : trigger.getReactions()) { set intersection; - set_intersection(idSet.begin(), idSet.end(), + set_intersection(idSet.begin(), idSet.end(), possibleIDs[r].begin(), possibleIDs[r].end(), inserter(intersection, intersection.end())); idSet = intersection; @@ -190,9 +188,9 @@ void TriggerConfigurator430::filterSequencerIDs() //Quick check if there are still any valid ids left for all triggers -bool TriggerConfigurator430::hasImpossibleTrigger() +bool TriggerConfigurator430::hasImpossibleTrigger() const { - BOOST_FOREACH(const set& options, triggerOptions) + for (const set& options : triggerOptions) { if (options.empty()) return true; @@ -201,7 +199,6 @@ bool TriggerConfigurator430::hasImpossibleTrigger() } - bool TriggerConfigurator430::assignTriggers() { //Setup helper constructs @@ -223,8 +220,11 @@ bool TriggerConfigurator430::assignTriggers() idInUse[id] = false; } - while (++id < numCombinationTriggers && (idInUse[id] || triggerOptions[curTrigger].count(id) == 0) ) ; - + do + { + ++id; + } while (id < numCombinationTriggers && (idInUse[id] || triggerOptions[curTrigger].count(id) == 0)); + if (id < numCombinationTriggers) { idInUse[id] = true; @@ -301,7 +301,7 @@ bool TriggerConfigurator430::checkTriggerConfiguration() const //Check for unassigned triggers, invalid combination trigger ids //or multiple triggers mapped to the same combination trigger vector inUse(combinationTriggers.size(), false); - BOOST_FOREACH(const Trigger430* trigger, triggers) + for (const Trigger430* trigger : triggers) { const uint32_t id = getCombinationTriggerId(trigger); if (id >= combinationTriggers.size() || inUse[id]) @@ -312,9 +312,9 @@ bool TriggerConfigurator430::checkTriggerConfiguration() const } //Make sure no combination triggers are configured for unused triggers - BOOST_FOREACH(const Trigger430* triggerPtr, combinationTriggers) + for (const Trigger430* triggerPtr : combinationTriggers) { - if ( triggerPtr != NULL && find(triggers.begin(), triggers.end(), triggerPtr) == triggers.end() ) + if ( triggerPtr && find(triggers.begin(), triggers.end(), triggerPtr) == triggers.end() ) { return false; } @@ -323,21 +323,21 @@ bool TriggerConfigurator430::checkTriggerConfiguration() const int collisions = 0; - BOOST_FOREACH(const Trigger430* trigger, triggers) + for (const Trigger430* trigger : triggers) { if (!trigger->getReactions().empty()) { const uint32_t assignedCombinationTriggerId = getCombinationTriggerId(trigger); //Check if trigger id is valid for all reactions - BOOST_FOREACH(TriggerReaction reaction, trigger->getReactions()) + for (TriggerReaction reaction : trigger->getReactions()) { if (possibleIDs[reaction].count(assignedCombinationTriggerId) == 0) { ++collisions; } } - + //Check if trigger using sequencer out id is only configured as sequencer input if (sequencerEnabled && assignedCombinationTriggerId == sequencerOutId) { diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.h index 69c4272..151a3d6 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerConfigurator430.h @@ -3,49 +3,39 @@ * * Handles assignment of triggers to trigger blocks * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_TRIGGER_CONFIGURATOR_H -#define DLL430_TRIGGER_CONFIGURATOR_H - -#include -#include -#include -#include -#include -#include +#pragma once #include "../TriggerCondition/TriggerDefinitions.h" #include "../Trigger/Trigger430.h" @@ -55,7 +45,7 @@ namespace TI { namespace DLL430 { class TriggerConfigurator430 { public: - TriggerConfigurator430(std::deque& busTriggers, + TriggerConfigurator430(std::deque& busTriggers, std::deque& combinationTriggers, bool sequencerEnabled); @@ -76,7 +66,7 @@ class TriggerConfigurator430 void filterSequencerIDs(); - bool hasImpossibleTrigger(); + bool hasImpossibleTrigger() const; bool assignTriggers(); @@ -91,12 +81,10 @@ class TriggerConfigurator430 std::vector< std::set > triggerOptions; std::deque& combinationTriggers; - + bool sequencerEnabled; uint32_t sequencerOutId; uint32_t sequencerResetId; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.cpp index 48814da..bc69805 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.cpp @@ -3,50 +3,47 @@ * * Handles trigger resources on 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include -#include - +#include #include "../Trigger/Trigger430.h" #include "TriggerManager430.h" #include "TriggerConfigurator430.h" -#include "../EemRegisters/EemRegisterAccess.h" +#include "../EemRegisters/EemRegisterAccess430.h" #include "../Exceptions/Exceptions.h" using namespace TI::DLL430; @@ -72,9 +69,10 @@ TriggerManager430::TriggerManager430(int numBusTriggers, int numRegisterTriggers mRegisterTriggers.push_back( Trigger430(Trigger430::REGISTER_TRIGGER, id++) ); } - mCombinationTriggers.resize(numCombinationTriggers, NULL); - + mCombinationTriggers.resize(numCombinationTriggers, nullptr); + Trigger430::accessTypeBits[AT_READ] = 0x24; + Trigger430::accessTypeBits[AT_WRITE] = 0x26; //Configure always available options Trigger430::comparisonOpBits.clear(); Trigger430::comparisonOpBits[CO_EQUAL] = 0x0; @@ -120,9 +118,9 @@ void TriggerManager430::setBitwiseMasking() const } -Trigger430* TriggerManager430::getBusTrigger() +Trigger430* TriggerManager430::getBusTrigger() { - BOOST_FOREACH(Trigger430& trigger, mBusTriggers) + for (Trigger430& trigger : mBusTriggers) { if (!trigger.isInUse()) { @@ -130,13 +128,13 @@ Trigger430* TriggerManager430::getBusTrigger() return &trigger; } } - return NULL; + return nullptr; } -Trigger430* TriggerManager430::getRegisterTrigger() +Trigger430* TriggerManager430::getRegisterTrigger() { - BOOST_FOREACH(Trigger430& trigger, mRegisterTriggers) + for (Trigger430& trigger : mRegisterTriggers) { if (!trigger.isInUse()) { @@ -144,7 +142,7 @@ Trigger430* TriggerManager430::getRegisterTrigger() return &trigger; } } - return NULL; + return nullptr; } @@ -156,7 +154,7 @@ void TriggerManager430::releaseTrigger(Trigger430* trigger) uint32_t TriggerManager430::getCombinationTrigger(const Trigger430* trigger) const { - if (trigger != NULL) + if (trigger) { for (uint32_t id = 0; id < (uint32_t)mCombinationTriggers.size(); ++id) { @@ -175,11 +173,11 @@ bool TriggerManager430::hasRegisterTriggers() const return !mRegisterTriggers.empty(); } -int TriggerManager430::numAvailableBusTriggers() const +int TriggerManager430::numAvailableBusTriggers() const { int count = 0; - BOOST_FOREACH(const Trigger430& trigger, mBusTriggers) + for (const Trigger430& trigger : mBusTriggers) { if (!trigger.isInUse()) { @@ -190,11 +188,11 @@ int TriggerManager430::numAvailableBusTriggers() const } -int TriggerManager430::numAvailableRegisterTriggers() const +int TriggerManager430::numAvailableRegisterTriggers() const { int count = 0; - BOOST_FOREACH(const Trigger430& trigger, mRegisterTriggers) + for (const Trigger430& trigger : mRegisterTriggers) { if (!trigger.isInUse()) { @@ -205,12 +203,12 @@ int TriggerManager430::numAvailableRegisterTriggers() const } -void TriggerManager430::configureTriggers(bool sequencerEnabled) +void TriggerManager430::configureTriggers(bool sequencerEnabled) { //Collect all active triggers with reactions, that aren't combination triggers std::deque triggers; - BOOST_FOREACH(const Trigger430& trigger, mBusTriggers) + for (const Trigger430& trigger : mBusTriggers) { if (trigger.isInUse() && trigger.isEnabled() && !trigger.isCombinationTrigger() && !trigger.getReactions().empty()) { @@ -218,7 +216,7 @@ void TriggerManager430::configureTriggers(bool sequencerEnabled) } } - BOOST_FOREACH(const Trigger430& trigger, mRegisterTriggers) + for (const Trigger430& trigger : mRegisterTriggers) { if (trigger.isInUse() && trigger.isEnabled() && !trigger.isCombinationTrigger() && !trigger.getReactions().empty()) { @@ -239,25 +237,28 @@ void TriggerManager430::configureTriggers(bool sequencerEnabled) } -void TriggerManager430::verifyForSingleStepping(const std::deque usedTriggers) +void TriggerManager430::verifyForSingleStepping(const std::deque& usedTriggers) { std::map > reactionsByTriggerBlock; - BOOST_FOREACH(const Trigger430* trigger, usedTriggers) + + const uint32_t numBusTriggers = static_cast(mBusTriggers.size()); + + for (const Trigger430* trigger : usedTriggers) { - uint32_t triggerBlocks = trigger->getCombinationValue(); - for (size_t i = 0; i < mBusTriggers.size(); ++i) + const uint32_t triggerBlocks = trigger->getCombinationValue(); + for (uint32_t i = 0; i < numBusTriggers; ++i) { if (triggerBlocks & (1<& reactions = reactionsByTriggerBlock[i]; - const std::set newReactions = trigger->getReactions(); + const std::set& newReactions = trigger->getReactions(); reactions.insert(newReactions.begin(), newReactions.end()); } } } uint32_t firstValidForBlock0 = 0; - for (uint32_t triggerId = 0; triggerId < mBusTriggers.size(); ++triggerId) + for (uint32_t triggerId = 0; triggerId < numBusTriggers; ++triggerId) { const std::set& reactions = reactionsByTriggerBlock[triggerId]; @@ -267,14 +268,14 @@ void TriggerManager430::verifyForSingleStepping(const std::deque 0) { Trigger430* triggerAt0 = getTriggerAtBlock(0); Trigger430* validTrigger = getTriggerAtBlock(firstValidForBlock0); - if (triggerAt0 == NULL || validTrigger == NULL) + if (triggerAt0 == nullptr || validTrigger == nullptr) throw EM_TriggerConfigurationException(); triggerAt0->swapTriggerBlock(*validTrigger); @@ -284,8 +285,8 @@ void TriggerManager430::verifyForSingleStepping(const std::dequegetCombinationValue() : 0); + writeEemRegister430((combinationTriggerId * 8) + 6, trigger ? trigger->getCombinationValue() : 0); - if (trigger != NULL) + if (trigger) { - const std::set reactions = trigger->getReactions(); - + const std::set& reactions = trigger->getReactions(); + if (contains(reactions, TR_BREAK)) { breakReactionRegister |= (1 << combinationTriggerId); @@ -377,13 +378,12 @@ void TriggerManager430::writeTriggerReactions() } - writeEemRegister(BREAK_REACT, breakReactionRegister); - writeEemRegister(CCNT1_REACT, cycleCounterReactionRegister); - writeEemRegister(STOR_REACT, stateStorageReactionRegister); + writeEemRegister430(BREAK_REACT, breakReactionRegister); + writeEemRegister430(CCNT1_REACT, cycleCounterReactionRegister); + writeEemRegister430(STOR_REACT, stateStorageReactionRegister); } - void TriggerManager430::enableSequencerOutReactions() { mSequencerOutReactionsEnabled = true; diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.h b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.h index 503691c..f7aaec1 100644 --- a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.h +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager430.h @@ -3,45 +3,39 @@ * * Handles trigger resources on 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_TRIGGER_MANAGER_H -#define DLL430_TRIGGER_MANAGER_H - -#include -#include -#include +#pragma once #include "../Trigger/Trigger430.h" @@ -56,7 +50,7 @@ class TriggerManager430 void setExtendedComparisons() const; void setExtendedAccessTypes() const; void setBitwiseMasking() const; - + Trigger430* getBusTrigger(); Trigger430* getRegisterTrigger(); void releaseTrigger(Trigger430* trigger); @@ -67,10 +61,10 @@ class TriggerManager430 int numAvailableBusTriggers() const; int numAvailableRegisterTriggers() const; - + void configureTriggers(bool sequencerEnabled); - void writeAllTriggers(); - void writeTriggerReactions(); + void writeAllTriggers() const; + void writeTriggerReactions() const; void enableSequencerOutReactions(); @@ -81,7 +75,7 @@ class TriggerManager430 void clearSequencerOutReactions(); private: - void verifyForSingleStepping(const std::deque usedTriggers); + void verifyForSingleStepping(const std::deque& usedTriggers); Trigger430* getTriggerAtBlock(uint32_t blockId); std::deque mBusTriggers; @@ -93,6 +87,6 @@ class TriggerManager430 bool mSequencerOutReactionsEnabled; }; -}} +typedef std::shared_ptr TriggerManager430Ptr; -#endif +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager432.cpp b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager432.cpp new file mode 100644 index 0000000..93e4a01 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager432.cpp @@ -0,0 +1,226 @@ +/* + * TriggerManager432.cpp + * + * Handles trigger resources on 432 + * + * Copyright (C) 2007 - 2011 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. + */ + + +#include + +#include "../Trigger/Trigger432.h" +#include "../Trigger/DataAddressTrigger432.h" + +#include "TriggerManager432.h" + +#include "../Exceptions/Exceptions.h" + +using namespace TI::DLL430; + +TriggerManager432::TriggerManager432(std::vector& vecCodeTriggers, std::vector& vecLiteralTriggers, std::vector& vecDataAddressTriggers, std::vector& vecDataValueTriggers) +{ + for (const unsigned int codeTrigger : vecCodeTriggers) + { + mCodeTriggers.push_back(Trigger432(Trigger432::CODE_TRIGGER, codeTrigger)); + } + + for (const unsigned int literalTrigger : vecLiteralTriggers) + { + mLiteralTriggers.push_back(Trigger432(Trigger432::LITERAL_TRIGGER, literalTrigger)); + } + + for (const unsigned int dataAddressTrigger : vecDataAddressTriggers) + { + mDataAddressTriggers.push_back(DataAddressTrigger432(DataTrigger432::DATA_TRIGGER, dataAddressTrigger)); + } + + for (const unsigned int dataValueTrigger : vecDataValueTriggers) + { + mDataValueTriggers.push_back(DataValueTrigger432(DataTrigger432::DATA_TRIGGER, dataValueTrigger)); + } + //Configure always available options + DataTrigger432::accessTypeBits.clear(); + DataTrigger432::accessTypeBits[AT_NO_FETCH] = 0x8; + DataTrigger432::accessTypeBits[AT_READ] = 0x5; + DataTrigger432::accessTypeBits[AT_WRITE] = 0x6; + DataTrigger432::accessTypeBits[AT_READ_WRITE] = 0x7; +} + + +Trigger432* TriggerManager432::getCodeTrigger() +{ + for (Trigger432& trigger : mCodeTriggers) + { + if (!trigger.isInUse()) + { + trigger.isInUse(true); + return &trigger; + } + } + return nullptr; +} + + +Trigger432* TriggerManager432::getLiteralTrigger() +{ + for (Trigger432& trigger : mLiteralTriggers) + { + if (!trigger.isInUse()) + { + trigger.isInUse(true); + return &trigger; + } + } + return nullptr; +} + + +DataTrigger432* TriggerManager432::getDataAddressTrigger() +{ + for (DataAddressTrigger432& trigger : mDataAddressTriggers) + { + if (!trigger.isInUse()) + { + trigger.isInUse(true); + return &trigger; + } + } + return nullptr; +} + +DataTrigger432* TriggerManager432::getDataValueTrigger() +{ + for (DataValueTrigger432& trigger : mDataValueTriggers) + { + if (!trigger.isInUse()) + { + /* DataValueTrigger always requires a DataAddressTrigger */ + DataTrigger432 *dependencyTrigger = getDataAddressTrigger(); + if (dependencyTrigger == nullptr) + break; + trigger.isInUse(true); + trigger.setDependencyTrigger(dependencyTrigger); + return &trigger; + } + } + return nullptr; +} + + +void TriggerManager432::releaseTrigger(Trigger432* trigger) +{ + trigger->reset(); +} + +void TriggerManager432::releaseDataTrigger432(DataTrigger432* trigger) +{ + trigger->reset(); +} + + +int TriggerManager432::numAvailableCodeTriggers() const +{ + int count = 0; + + for (const Trigger432& trigger : mCodeTriggers) + { + if (!trigger.isInUse()) + { + ++count; + } + } + return count; +} + +int TriggerManager432::numAvailableDataAddressTriggers() const +{ + int count = 0; + + for (const DataAddressTrigger432& trigger : mDataAddressTriggers) + { + if (!trigger.isInUse()) + { + ++count; + } + } + return count; +} + +int TriggerManager432::numAvailableDataValueTriggers() const +{ + int count = 0; + + for (const DataValueTrigger432& trigger : mDataValueTriggers) + { + if (!trigger.isInUse()) + { + ++count; + } + } + return count; +} + +int TriggerManager432::numAvailableLiteralTriggers() const +{ + int count = 0; + + for (const Trigger432& trigger : mLiteralTriggers) + { + if (!trigger.isInUse()) + { + ++count; + } + } + return count; +} + +void TriggerManager432::writeAllTriggers() const +{ + for (const Trigger432& trigger : mCodeTriggers) + { + trigger.write(); + } + for (const Trigger432& trigger : mLiteralTriggers) + { + trigger.write(); + } + for (const DataAddressTrigger432& trigger : mDataAddressTriggers) + { + trigger.write(); + } + + for (const DataValueTrigger432& trigger : mDataValueTriggers) + { + trigger.write(); + } +} diff --git a/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager432.h b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager432.h new file mode 100644 index 0000000..b2ad318 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EM/TriggerManager/TriggerManager432.h @@ -0,0 +1,75 @@ +/* + * TriggerManager432.h + * + * Handles trigger resources on 430 + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "../Trigger/Trigger432.h" +#include "../Trigger/DataAddressTrigger432.h" +#include "../Trigger/DataValueTrigger432.h" + +namespace TI { namespace DLL430 { + +class TriggerManager432 +{ +public: + //TriggerManager432(int numCodeTriggers, int numLiteralTriggers, int numDataAddressTriggers, int numDataValueTriggers); + TriggerManager432(std::vector& vecCodeTriggers, std::vector& vecLiteralTriggers, std::vector& vecDataAddressTriggers, std::vector& vecDataValueTriggers); + + Trigger432* getCodeTrigger(); + Trigger432* getLiteralTrigger(); + DataTrigger432* getDataAddressTrigger(); + DataTrigger432* getDataValueTrigger(); + void releaseTrigger(Trigger432* trigger); + void releaseDataTrigger432(DataTrigger432* trigger); + + int numAvailableCodeTriggers() const; + int numAvailableDataAddressTriggers() const; + int numAvailableDataValueTriggers() const; + int numAvailableLiteralTriggers() const; + + void writeAllTriggers() const; + +private: + std::deque mCodeTriggers; + std::deque mLiteralTriggers; + std::deque mDataAddressTriggers; + std::deque mDataValueTriggers; +}; + +typedef std::shared_ptr TriggerManager432Ptr; + +}} diff --git a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IVariableWatch.h b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IVariableWatch.h index 62742ee..ba37c76 100644 --- a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IVariableWatch.h +++ b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IVariableWatch.h @@ -3,56 +3,48 @@ * * Interface for variable watch module * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_IVARIABLE_WATCH_H -#define DLL430_IVARIABLE_WATCH_H -#include +#include +#include "IWatchedVariable.h" #include "../TriggerCondition/ITriggerConditionManager.h" namespace TI { namespace DLL430 { -class IWatchedVariable; -class MessageData; - -typedef boost::shared_ptr WatchedVariablePtr; -typedef boost::shared_ptr MessageDataPtr; -typedef boost::shared_ptr TriggerConditionManagerPtr; - - //Class is responsible to create and update watched variables class IVariableWatch { @@ -62,17 +54,13 @@ class IVariableWatch //Enable/disable variable watch function (on 430 variable watch and trace are mutually exclusive) virtual void enable() = 0; virtual void disable() = 0; - + //Create a watched variable and setup required triggers virtual WatchedVariablePtr createWatchedVariable(uint32_t address, uint32_t bitSize, TriggerConditionManagerPtr tcManager) = 0; //Only used by EmulationManager - virtual void initialize() = 0; - virtual void cleanup() = 0; virtual void writeConfiguration() = 0; virtual void onEvent(MessageDataPtr msgData) = 0; }; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IWatchedVariable.h b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IWatchedVariable.h index 4e00f57..74112a9 100644 --- a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IWatchedVariable.h +++ b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/IWatchedVariable.h @@ -3,43 +3,40 @@ * * Interface for variables under variable watch * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_IWATCHED_VARIABLE_H -#define DLL430_IWATCHED_VARIABLE_H - -#include #include "../TriggerCondition/ITriggerConditionManager.h" namespace TI { namespace DLL430 { @@ -52,13 +49,13 @@ class IWatchedVariable { public: virtual ~IWatchedVariable() {} - + //Return the address of the watched variable virtual uint32_t address() const = 0; - + //Return size of watched variable in bits (8/16/32) virtual uint32_t bitSize() const = 0; - + //Return current value of variable virtual uint32_t value() const = 0; @@ -70,8 +67,6 @@ class IWatchedVariable virtual void disable() = 0; }; -typedef boost::shared_ptr WatchedVariablePtr; +typedef std::shared_ptr WatchedVariablePtr; }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.cpp b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.cpp index 4f092c8..d503052 100644 --- a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.cpp @@ -3,42 +3,40 @@ * * Variable watch implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include -#include +#include #include "../TriggerCondition/ITriggerCondition.h" #include "../TriggerCondition/ITriggerConditionManager.h" @@ -58,9 +56,10 @@ void StateStorage430::onEventVWatch(MessageDataPtr msgData) uint16_t eventMask = 0; (*msgData) >> eventMask; - - if (eventMask & 0x8) + + if (eventMask & 0x10) { + uint32_t storageBufferSlot = 0; do { uint32_t variableAddress = 0; @@ -70,28 +69,29 @@ void StateStorage430::onEventVWatch(MessageDataPtr msgData) if (!msgData->fail()) { - updateWatchedVariable(variableAddress, variableValue); + updateWatchedVariable(storageBufferSlot++, variableAddress, variableValue); } } while (!msgData->fail()); } } - -void StateStorage430::updateWatchedVariable(uint32_t address, uint16_t value) +void StateStorage430::updateWatchedVariable(uint32_t bufferSlot, uint32_t address, uint16_t value) { - vector< boost::weak_ptr >::iterator it = watchedVariables_.begin(); + vector< std::weak_ptr >::iterator it = watchedVariables_.begin(); while (it != watchedVariables_.end()) { - if (boost::shared_ptr ptr = it->lock()) + + std::shared_ptr ptr = it->lock(); + if (ptr.get()) { - if (ptr->address() == address) + if ((ptr->slotLowWord() == bufferSlot) && (ptr->address() == address)) { ptr->setValue(value); } //upper word of 32bit variable - if ((ptr->address() + 2 == address) && (ptr->bitSize() > 16)) + if ((ptr->slotHighWord() == bufferSlot) && (ptr->address() + 2 == address)) { ptr->setValueHighWord(value); } @@ -100,13 +100,12 @@ void StateStorage430::updateWatchedVariable(uint32_t address, uint16_t value) else { it = watchedVariables_.erase(it); - } + } } } - -void StateStorage430::enableVWatch() +void StateStorage430::enableVWatch() { //Can't use variable watch if already active in another mode if ((controlRegister_ & STOR_EN) && (controlRegister_ & 0x6) != STOR_MODE_VAR_WATCH) @@ -117,12 +116,14 @@ void StateStorage430::enableVWatch() controlRegister_ |= 0xe000; //Watch triggers 0-15 - vector< boost::weak_ptr >::iterator it = watchedVariables_.begin(); - while (it != watchedVariables_.end()) + vector< std::weak_ptr >::iterator it = watchedVariables_.begin(); + + while (it != watchedVariables_.end()) { - vector< boost::weak_ptr >::iterator tmpIt = it++; + vector< std::weak_ptr >::iterator tmpIt = it++; - if (boost::shared_ptr ptr = tmpIt->lock()) + std::shared_ptr ptr = tmpIt->lock(); + if (ptr.get()) { ptr->enable(); } @@ -139,12 +140,13 @@ void StateStorage430::disableVWatch() controlRegister_ |= STOR_MODE_INSTR_FETCH | STOR_RESET; } - vector< boost::weak_ptr >::iterator it = watchedVariables_.begin(); - while (it != watchedVariables_.end()) + vector< std::weak_ptr >::iterator it = watchedVariables_.begin(); + while (it != watchedVariables_.end()) { - vector< boost::weak_ptr >::iterator tmpIt = it++; + vector< std::weak_ptr >::iterator tmpIt = it++; - if (boost::shared_ptr ptr = tmpIt->lock()) + std::shared_ptr ptr = tmpIt->lock(); + if (ptr.get()) { ptr->disable(); } @@ -152,7 +154,6 @@ void StateStorage430::disableVWatch() } - WatchedVariablePtr StateStorage430::createWatchedVariable(uint32_t address, uint32_t bitSize, TriggerConditionManagerPtr tcManager) { if ((controlRegister_ & 0x6) != STOR_MODE_VAR_WATCH) @@ -160,7 +161,7 @@ WatchedVariablePtr StateStorage430::createWatchedVariable(uint32_t address, uint DataAddressConditionPtr lowWordCondition = tcManager->createDataAddressCondition(address); lowWordCondition->setAccessType(AT_WRITE); - + DataAddressConditionPtr highWordCondition; if (bitSize == 32) { @@ -168,8 +169,8 @@ WatchedVariablePtr StateStorage430::createWatchedVariable(uint32_t address, uint highWordCondition->setAccessType(AT_WRITE); } - boost::shared_ptr variable = boost::make_shared(address, bitSize, lowWordCondition, highWordCondition); - watchedVariables_.push_back( boost::weak_ptr(variable) ); - + std::shared_ptr variable = std::make_shared(address, bitSize, lowWordCondition, highWordCondition); + watchedVariables_.push_back( std::weak_ptr(variable) ); + return variable; } diff --git a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.h b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.h index a224dfb..6406e63 100644 --- a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.h +++ b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/VariableWatch430.h @@ -3,51 +3,46 @@ * * Variable watch implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#pragma once -#ifndef DLL430_VARIABLE_WATCH_430_H -#define DLL430_VARIABLE_WATCH_430_H - -#include #include "IVariableWatch.h" -namespace TI { namespace DLL430 { +#include - -class MessageData; -typedef boost::shared_ptr MessageDataPtr; +namespace TI { namespace DLL430 { class VariableWatch430InterfaceSplitter : public IVariableWatch @@ -67,5 +62,3 @@ class VariableWatch430InterfaceSplitter : public IVariableWatch }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.cpp b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.cpp index 9b0d03f..c9c7479 100644 --- a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.cpp +++ b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.cpp @@ -3,50 +3,49 @@ * * Watched variable implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include +#include #include "WatchedVariable430.h" #include "../TriggerCondition/ITriggerCondition.h" - +#include using namespace TI::DLL430; -WatchedVariable430::WatchedVariable430(uint32_t address, uint32_t bitSize, +WatchedVariable430::WatchedVariable430(uint32_t address, uint32_t bitSize, TriggerConditionPtr lowWordCondition, TriggerConditionPtr highWordCondition) : conditionLow_(lowWordCondition) @@ -73,10 +72,9 @@ WatchedVariable430::~WatchedVariable430() } - -void WatchedVariable430::setValue(uint16_t value) +void WatchedVariable430::setValue(uint16_t value) { - boost::mutex::scoped_lock lock(accessMutex_); + boost::lock_guard lock(accessMutex_); validLowWord_ = true; @@ -86,10 +84,9 @@ void WatchedVariable430::setValue(uint16_t value) } - -void WatchedVariable430::setValueHighWord(uint16_t value) +void WatchedVariable430::setValueHighWord(uint16_t value) { - boost::mutex::scoped_lock lock(accessMutex_); + boost::lock_guard lock(accessMutex_); validHighWord_ = true; @@ -97,37 +94,44 @@ void WatchedVariable430::setValueHighWord(uint16_t value) } - uint32_t WatchedVariable430::address() const { - return address_; + return address_; } - uint32_t WatchedVariable430::bitSize() const { - return bits_; + return bits_; } - uint32_t WatchedVariable430::value() const { - boost::mutex::scoped_lock lock(accessMutex_); - return value_; + boost::lock_guard lock(accessMutex_); + return value_; } +uint32_t WatchedVariable430::slotLowWord() const +{ + return conditionLow_ ? conditionLow_->getId() : 0xFFFFFFFF; +} + + +uint32_t WatchedVariable430::slotHighWord() const +{ + return conditionHigh_ ? conditionHigh_->getId() : 0xFFFFFFFF; +} + bool WatchedVariable430::isValid() const { - boost::mutex::scoped_lock lock(accessMutex_); + boost::lock_guard lock(accessMutex_); return validLowWord_ && validHighWord_; } - void WatchedVariable430::enable() { enabled_ = true; diff --git a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.h b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.h index 5cffec0..7140f9e 100644 --- a/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.h +++ b/DLL430_v3/src/TI/DLL430/EM/VariableWatch/WatchedVariable430.h @@ -3,47 +3,42 @@ * * Watched variable implementation for 430 * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_WATCHED_VARIABLE_430_H -#define DLL430_WATCHED_VARIABLE_430_H - -#include -#include -#include +#pragma once #include "IWatchedVariable.h" +#include namespace TI { namespace DLL430 { @@ -51,18 +46,22 @@ namespace TI { namespace DLL430 { class WatchedVariable430 : public IWatchedVariable { public: - WatchedVariable430(uint32_t address, uint32_t bitSize, - TriggerConditionPtr lowWordCondition, + WatchedVariable430(uint32_t address, uint32_t bitSize, + TriggerConditionPtr lowWordCondition, TriggerConditionPtr highWordCondition = TriggerConditionPtr()); - + virtual ~WatchedVariable430(); virtual uint32_t address() const; - + virtual uint32_t bitSize() const; virtual uint32_t value() const; + virtual uint32_t slotLowWord() const; + + virtual uint32_t slotHighWord() const; + virtual bool isValid() const; virtual void enable(); @@ -71,7 +70,7 @@ class WatchedVariable430 : public IWatchedVariable private: friend class StateStorage430; - + void setValue(uint16_t value); void setValueHighWord(uint16_t value); @@ -92,5 +91,3 @@ class WatchedVariable430 : public IWatchedVariable }} - -#endif diff --git a/DLL430_v3/src/TI/DLL430/EemMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/EemMemoryAccess.cpp index e2764e2..8ee9d63 100644 --- a/DLL430_v3/src/TI/DLL430/EemMemoryAccess.cpp +++ b/DLL430_v3/src/TI/DLL430/EemMemoryAccess.cpp @@ -3,149 +3,133 @@ * * Memory class for EEM register access. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "EemMemoryAccess.h" #include "HalExecCommand.h" #include "FetControl.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; -EemMemoryAccess::EemMemoryAccess (const std::string& name,DeviceHandleV3* devHandle, - uint32_t start, - uint32_t size, - uint32_t seg, - uint32_t banks, +EemMemoryAccess::EemMemoryAccess(MemoryArea::Name name, IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, bool mapped, uint8_t bits) - : MemoryAreaBase(name,devHandle,start,size,seg,banks,mapped,false/*isprotected*/,0xff) - , maxAddress(0x7F) + : MemoryAreaBase(name, devHandle, start, size, seg, banks, mapped, false/*isprotected*/, 0xff) + , maxAddress(0xFE) , words((bits + 15) / 16) //number of words that bits fit in - , queueCount(0) - , readPtr(NULL) - , nsent(0) + , readPtr(nullptr) { } -EemMemoryAccess::~EemMemoryAccess () +bool EemMemoryAccess::doRead(uint32_t address, uint32_t* value) { -} + if (address > this->maxAddress) + return false; + this->queue.push_back(static_cast(address | 0x1)); -bool EemMemoryAccess::doRead (uint32_t address, uint32_t* buffer, size_t count) -{ - for (uint32_t i = 0; i < count; ++i) - { - if ((address + i) > this->maxAddress) - return false; - - this->queue.push_back(static_cast(((address + i) << 1) | 0x1)); - ++this->queueCount; - } - readPtr=buffer; - nsent=count; + readPtr = value; return true; } -bool EemMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t count) -{ - for (uint32_t i = 0; i < count; ++i) - { - if (!this->doWrite(address + i, buffer[i])) - return false; - } - return true; -} - -bool EemMemoryAccess::doWrite (uint32_t address, uint32_t value) +bool EemMemoryAccess::doWrite(uint32_t address, uint32_t value) { if (address > this->maxAddress) return false; - this->queue.push_back(static_cast(address << 1)); - - for (uint8_t i = 0; i < this->words*2; ++i) + this->queue.push_back(static_cast(address & ~0x1)); + for (uint8_t i = 0; i < this->words * 2; ++i) this->queue.push_back(static_cast((value >> (i * 8)) & 0xFF)); - ++this->queueCount; return true; } -bool EemMemoryAccess::preSync () +bool EemMemoryAccess::preSync() { - if (!this->queueCount) + if (queue.empty()) return true; this->elements.clear(); HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_EemDataExchange)); - el->appendInputData8(this->queueCount); - el->appendInputData8(this->queue.begin(), this->queue.end()); - this->elements.push_back(el); + if (!el) + { + return false; + } + + el->appendInputData8(static_cast(queue.size())); + el->appendInputData8(queue.begin(), queue.end()); + + this->elements.emplace_back(el); return true; } -bool EemMemoryAccess::postSync (const HalExecCommand& cmd) +bool EemMemoryAccess::postSync(const HalExecCommand& cmd) { - const HalExecElement& el = cmd.elements.at(1); + if (cmd.elements[0] == NULL) + { + return false; + } + + const HalExecElement& el = *cmd.elements[0]; - //Write the read values to the queued buffer addresses - if(this->readPtr) + //Write the read values to the queued buffer addresses + if (this->readPtr) { - for (size_t i = 0; i < this->nsent; ++i) + uint32_t tmp = 0; + for (uint8_t k = 0; k < this->words; ++k) { - uint32_t tmp = 0; - for (uint8_t k = 0; k < this->words; ++k) - { - tmp |= (el.getOutputAt16(2*(i+k)) << (k * 16)); - } - this->readPtr[i] = tmp; + tmp |= (el.getOutputAt16(2 * k) << (k * 16)); } - this->readPtr=NULL; - this->nsent=0; + *this->readPtr = tmp; + this->readPtr = nullptr; } - this->queueCount = 0; this->queue.clear(); return true; } bool EemMemoryAccess::writeEemRegister(EemRegister reg, uint32_t value) { - return this->doWrite(reg>>1,value); + return this->doWrite(reg, value); } bool EemMemoryAccess::readEemRegister(EemRegister reg, uint32_t* buffer) { - return this->doRead(reg>>1,buffer,1); + return this->doRead(reg, buffer); } diff --git a/DLL430_v3/src/TI/DLL430/EemMemoryAccess.h b/DLL430_v3/src/TI/DLL430/EemMemoryAccess.h index 7bcd856..e5d72b4 100644 --- a/DLL430_v3/src/TI/DLL430/EemMemoryAccess.h +++ b/DLL430_v3/src/TI/DLL430/EemMemoryAccess.h @@ -1,50 +1,43 @@ /* * EemMemoryAccess.h * - * EEM Memory Access for 16bit targets. + * Memory class for EEM register access. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_EEMMEMORYACCESS_H -#define DLL430_EEMMEMORYACCESS_H #include "MemoryAreaBase.h" -#include "EemTriggerAccess.h" -#include - namespace TI { @@ -52,64 +45,40 @@ namespace TI { enum EemRegister { - // general control registers - BREAK_REACT = 0x80, // CPU stop reaction register GENCTRL = 0x82, // general debug control register - EEMVER = 0x86, // Emulation Module Version GENCLKCTRL = 0x88, // general clock control register MODCLKCTRL0 = 0x8A, // clock module control register - TRIGFLAG = 0x8E, // debug trigger register - // state storage - STOR_REACT = 0x98, // reaction register: state storage - STOR_ADDR = 0x9a, // state storage memory address - STOR_DATA = 0x9c, // state storage memory data - STOR_CTL = 0x9e, // state storage control register - // sequencer - SEQ_NXTSTATE0 = 0xa0, // sequencer next state 0 register - SEQ_NXTSTATE1 = 0xa2, // sequencer next state 1 register - SEQ_CTRL = 0xa6, // sequencer control register - // cycle counter - CCNT0CTL = 0xb0, // cycle counter 0 control register - CCNT0L = 0xb2, // cycle counter 0 value low - CCNT0H = 0xb4, // cycle counter 0 value high - CCNT1CTL = 0xb8, // cycle counter 1 control register }; class EemMemoryAccess : public MemoryAreaBase { public: - EemMemoryAccess (const std::string& name, DeviceHandleV3* devHandle, - uint32_t start, - uint32_t size, - uint32_t seg, - uint32_t banks, + EemMemoryAccess(MemoryArea::Name name, IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, bool mapped, uint8_t bits); - ~EemMemoryAccess (); - bool doRead (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t value); + bool doRead(uint32_t address, uint32_t* value); + bool doWrite(uint32_t address, uint32_t value); // write given value to eem register reg bool writeEemRegister(EemRegister reg, uint32_t value); // read value of eem register reg - bool readEemRegister(EemRegister reg, uint32_t* buffer); + bool readEemRegister(EemRegister reg, uint32_t* buffer); private: const size_t maxAddress; uint8_t words; std::vector queue; - uint8_t queueCount; uint32_t* readPtr; - size_t nsent; - - bool preSync (); - bool postSync (const HalExecCommand&); + + bool preSync(); + bool postSync(const HalExecCommand&); }; }; }; - -#endif /* DLL430_EEMMEMORYACCESS_H */ diff --git a/DLL430_v3/src/TI/DLL430/EemTriggerAccess.cpp b/DLL430_v3/src/TI/DLL430/EemTriggerAccess.cpp deleted file mode 100644 index d231525..0000000 --- a/DLL430_v3/src/TI/DLL430/EemTriggerAccess.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/* - * EemTriggerAccess.cpp - * - * Memory class for EEM trigger access. - * - * Copyright (C) 2008 - 2011 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. - */ - -#include "EemTriggerAccess.h" - -using namespace TI::DLL430; - -EemTriggerAccess::EemTriggerAccess () - : mask(0xFFFFFFFF) - , value(0) - , control(0) - , combination(0) - , base (0) -{ -} - -void EemTriggerAccess::init(uint8_t id) -{ - if (id>16) - return; - - base=id; - this->reset(); -} - -void EemTriggerAccess::reset() -{ - type=MEMBUS_ADDRESS; // default - mask=0; - control=0; - value=0; - combination=0; // default to 0 > not active -} - - -EemTriggerAccess::~EemTriggerAccess () -{ -} - -bool EemTriggerAccess::setType (TI::DLL430::TriggerType t_type) -{ - this->control=0; // reset control register anyway - - if (t_type==MEMBUS_DATA) - this->control |= 0x1; - - type=t_type; - - return true; -} - -void EemTriggerAccess::enableHold (bool enable) -{ - if (type!=REGISTER) - return; - - if (enable) - this->control |= (1 << 6); - else - this->control &= ~(1 << 6); -} - -void EemTriggerAccess::setRegister(TI::DLL430::Register reg) -{ - if(type!=REGISTER) - return; - - this->control &= ~0xF00; - this->control |= ((reg & 0xF) << 8); -} - -bool EemTriggerAccess::setMask (uint32_t mask) -{ - // some models do only allow some special masks - // -> DebugManager - this->mask = mask; - return true; -} - -void EemTriggerAccess::setValue (uint32_t value) -{ - this->value = value; -} - -void EemTriggerAccess::setControl (uint32_t value) -{ - this->control = value; -} - -void EemTriggerAccess::setCondition(TriggerCondition c) -{ - if((type!=MEMBUS_ADDRESS)&&(type!=MEMBUS_DATA)) - return; - - this->control &= ~0x66; - this->control |= ((c & 0xC) << 3) | ((c & 0x3) << 1); -} - -void EemTriggerAccess::setCompare (CompareMode mode) -{ - this->control &= ~0x18; - this->control |= (mode << 3) & 0x18; -} - -void EemTriggerAccess::setCombination(uint32_t value) -{ - this->combination|=value; -} - -void EemTriggerAccess::setDefaultCombination() -{ - this->combination=(0x1<value; -} - -uint32_t EemTriggerAccess::getControl () -{ - return this->control; -} - -uint32_t EemTriggerAccess::getMask () -{ - return this->mask; -} - -uint32_t EemTriggerAccess::getCombination () -{ - return this->combination; -} - -TriggerType EemTriggerAccess::getTriggerType() -{ - return this->type; -} - -uint8_t EemTriggerAccess::getId() -{ - return base; -} - -uint32_t EemTriggerAccess::getValueAdr() const -{ - return (uint32_t)base<<3; -} - -uint32_t EemTriggerAccess::getControlAdr() -{ - return ((uint32_t)base<<3)+2; -} - -uint32_t EemTriggerAccess::getMaskAdr() -{ - return ((uint32_t)base<<3)+4; -} - -uint32_t EemTriggerAccess::getCombinationAdr() -{ - return ((uint32_t)base<<3)+6; -} diff --git a/DLL430_v3/src/TI/DLL430/EemTriggerAccess.h b/DLL430_v3/src/TI/DLL430/EemTriggerAccess.h deleted file mode 100644 index daf9cbc..0000000 --- a/DLL430_v3/src/TI/DLL430/EemTriggerAccess.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * EemTriggerAccess.h - * - * Base class for EEM-Triggers. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_EEMTRIGGERACCESS_H -#define DLL430_EEMTRIGGERACCESS_H - -#include - -namespace TI -{ - namespace DLL430 - { - - enum TriggerType - { - MEMBUS_ADDRESS = 0, /* MAB */ - MEMBUS_DATA = 1, /* MDB */ - REGISTER = 2 /* Register */ - }; - - enum Register - { - REG_PC = 0x0, - REG_R1 = 0x1, - REG_SR = 0x2, - REG_SR_FBITS = 0x3, - REG_R4 = 0x4, - REG_R5 = 0x5, - REG_R6 = 0x6, - REG_R7 = 0x7, - REG_R8 = 0x8, - REG_R9 = 0x9, - REG_R10 = 0xA, - REG_R11 = 0xB, - REG_R12 = 0xC, - REG_R13 = 0xD, - REG_R14 = 0xE, - REG_R15 = 0xF - }; - - - /* Some devices can only use EQ, - * others can only use EQ and NE, - * and there are devices that can handle all modes. - */ - enum CompareMode - { - COMPARE_EQ = 0, /* equal */ - COMPARE_GE = 1, /* greater than or equal */ - COMPARE_LE = 2, /* less than or equal */ - COMPARE_NE = 3 /* not equal */ - }; - - enum TriggerCondition - { - /* These 4 conditions can be used by all devices */ - COND_FETCH = 0x0, - COND_FETCH_HOLD = 0x1, - COND_NOFETCH = 0x2, - COND_DONT_CARE = 0x3, - - /* some devices cannot use the following 12 conditions */ - COND_FETCH_READ = 0x4, - COND_FETCH_WRITE = 0x5, - COND_READ = 0x6, - COND_WRITE = 0x7, - - /* some devices cannot use the following 8 conditions - * but the 4 conditions above - */ - COND_FETCH_NODMA = 0x8, - COND_DMA = 0x9, - COND_NODMA = 0xA, - COND_WRITE_NODMA = 0xB, - COND_FETCH_READ_NODMA = 0xC, - COND_READ_NODMA = 0xD, - COND_READ_DMA = 0xE, - COND_WRITE_DMA = 0xF - }; - - class EemTriggerAccess - { - public: - EemTriggerAccess (); - ~EemTriggerAccess (); - - // init to MAB - trigger - void init(uint8_t id); // private/friend??? - void reset(); - - // set restrictions to trigger type - bool setType (TriggerType); - // set trigger type independent values - void setValue (uint32_t); - void setControl (uint32_t); - void setDefaultCombination(); - void setCombination(uint32_t); - void setCompare (CompareMode); - bool setMask (uint32_t); - // set trigger type dependent values - void setCondition(TriggerCondition); // only bus - void setRegister(Register); // only register - void enableHold (bool); // only register - // get register values - uint32_t getValue (); - uint32_t getControl (); // ??? only sub-bitmaps? - uint32_t getMask (); - uint32_t getCombination (); - TriggerType getTriggerType(); - - // get register-id (0-15) - uint8_t getId(); - // get value addresses - uint32_t getValueAdr() const; - uint32_t getControlAdr(); - uint32_t getMaskAdr(); - uint32_t getCombinationAdr(); - - private: - uint8_t base; - uint32_t mask; - uint32_t value; - uint32_t control; - uint32_t combination; - - TriggerType type; - }; - }; -}; - -#endif /* DLL430_EEMTRIGGERACCESS_H */ diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceJstateParser.cpp b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceJstateParser.cpp new file mode 100644 index 0000000..cc566e1 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceJstateParser.cpp @@ -0,0 +1,130 @@ +/* + * EnergyTraceProcessorJState.cpp + * + * Process incoming serial data into EnergyTrace records + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "EnergyTraceJstateParser.h" + + +bool TI::DLL430::isJstateValid(const uint64_t Jstate) +{ + static const uint64_t LPMX5_0_MASK_J = 0x4000000000000000ull; + static const uint64_t LPMX5_1_MASK_J = 0x8000000000000000ull; + + static const uint64_t PGACTCPU_MASK_J = 0x200000000000000ull; + static const uint64_t MCLKACT_MASK_J = 0x100000000000000ull; + static const uint64_t SMCLKACT_MASK_J = 0x80000000000000ull; + static const uint64_t ACLKACT_MASK_J = 0x40000000000000ull; + + static const uint64_t LPM4P5_MASK_J = 0x80ull; + static const uint64_t MODACT0_MASK_J = 0x80000000ull; + + + const bool LPMXP5_1 = (Jstate & LPMX5_1_MASK_J) != 0; + const bool LPMXP5_0 = (Jstate & LPMX5_0_MASK_J) != 0; + + const bool PGACTCPU = (Jstate & PGACTCPU_MASK_J) != 0; + const bool MCLKACT = (Jstate & MCLKACT_MASK_J) != 0; + const bool SMCLKACT = (Jstate & SMCLKACT_MASK_J) != 0; + const bool ACLKACT = (Jstate & ACLKACT_MASK_J) != 0; + + const bool LPM4P5 = (Jstate & LPM4P5_MASK_J) != 0; + const bool MODACT0 = (Jstate & MODACT0_MASK_J) != 0; + + + if (!LPMXP5_1 && !LPMXP5_0 && !PGACTCPU && !MCLKACT) // Sync broken discard sample + { + return false; + } + else if (!LPMXP5_1 && !LPMXP5_0 && PGACTCPU && !MCLKACT) // Sync broken discard sample + { + return false; + } + else if (!LPMXP5_1 && !LPMXP5_0 && PGACTCPU && MCLKACT) // AM + { + return true; + } + else if (LPMXP5_1 && !LPMXP5_0 && PGACTCPU && !MCLKACT && SMCLKACT && ACLKACT && MODACT0) //LPM0 + { + return true; + } + else if (LPMXP5_1 && !LPMXP5_0 && PGACTCPU && !MCLKACT && SMCLKACT && ACLKACT && !MODACT0) //LPM1 + { + return true; + } + else if (LPMXP5_1 && !LPMXP5_0 && PGACTCPU && !MCLKACT && !SMCLKACT && ACLKACT) //LPM2 + { + return true; + } + else if (LPMXP5_1 && !LPMXP5_0 && !PGACTCPU && !MCLKACT && !SMCLKACT && ACLKACT) // LPM3 + { + return true; + } + else if (LPMXP5_1 && !LPMXP5_0 && !PGACTCPU && !MCLKACT && !SMCLKACT) // LPM4 + { + return true; + } + else if (LPMXP5_1 && LPMXP5_0 && !LPM4P5) // LPM3.5 + { + return true; + } + else if (LPMXP5_1 && LPMXP5_0 && LPM4P5) // LPM4.5 + { + return true; + } + else if (!LPMXP5_1 && LPMXP5_0) //Protected code + { + return true; + } + return false; +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceJstateParser.h b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceJstateParser.h new file mode 100644 index 0000000..daebb11 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceJstateParser.h @@ -0,0 +1,63 @@ +/* + * EnergyTraceProcessorJState.h + * + * Process incoming serial data into EnergyTrace records + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + + +namespace TI +{ + namespace DLL430 + { + bool isJstateValid(const uint64_t Jstate); + } +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceManager.cpp b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceManager.cpp new file mode 100644 index 0000000..cc13754 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceManager.cpp @@ -0,0 +1,305 @@ +/* + * EnergyTraceManager.cpp + * + * Functionality for EnergyTrace. + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "EnergyTraceManager.h" +#include "EnergyTraceProcessorId7.h" +#include "EnergyTraceProcessorId8.h" +#include "FetHandle.h" +#include "HalExecCommand.h" +#include "HalResponse.h" +#include "HalResponseHandler.h" +#include "FetControl.h" +#include "PollingManager.h" +#include "../warnings/Warnings.h" +#include + +using namespace TI::DLL430; + +static const uint32_t ENERGYTRACE_BUFFER_SIZE = 12; + +//------------------------------------------------------------- +EnergyTraceManager::EnergyTraceManager(FetHandle* parent, PollingManager* pollingManager) + : mParent(parent) + , mCbx(0) + , mPollingManager(pollingManager) + , vcc(0) +{ + mPollingManager->setEnergyTraceCallback(std::bind(&EnergyTraceManager::runEvent, this, std::placeholders::_1)); + + if (parent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC + || parent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_NO_FLOWCT + || parent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + calibrationValues.resize(2); + const double resistors[2] = {DBL_MAX, 2200.0}; + resistorValues = std::vector(resistors, resistors+2); + + // no load, Calibrate Resistor 4 + uint16_t calResistors[] = {0, 1}; + calibrationResistors = std::vector(calResistors, calResistors + (sizeof(calResistors) / sizeof(uint16_t))); + timerStep = 640; + } + + if (parent->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || parent->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + calibrationValues.resize(5); + const double resistors[5] = {DBL_MAX, 1000.0 + 0.75, 162 + 0.75, 82.0 + 0.75, 51.98};//+0.75 --> R of Switch + resistorValues = std::vector(resistors, resistors+5); + + uint16_t calResistors[] = {0, 4, 2, 1, 7}; + calibrationResistors = std::vector(calResistors, calResistors + (sizeof(calResistors) / sizeof(uint16_t))); + timerStep = 800; + } +} + +//------------------------------------------------------------- +EnergyTraceManager::~EnergyTraceManager () +{ + mPollingManager->setEnergyTraceCallback(nullptr); +} + +bool EnergyTraceManager::ResetEnergyTrace() +{ + boost::lock_guard lock(callbackMutex); + + if (mDataProcessor) + { + mDataProcessor->Reset(); + mDataProcessor->setCalibrationValues(&calibrationValues[0], vcc); + return true; + } + return false; +} + +//------------------------------------------------------------- +bool EnergyTraceManager::startEnergyTrace(DebugEventTarget* cb, ETMode_t mode, ETCallback_mode callbackMode, IDeviceHandle* devHandle) +{ + // Reset the processor at the start of a new EnergyTrace session + if (cb != nullptr) + { + mCbx = cb; + } + + boost::lock_guard lock(callbackMutex); + + if (mParent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + //switch on dcdc supply + HalExecElement* el = new HalExecElement(ID_Zero, coreSwitchFet); + el->appendInputData16(mParent->getConfigManager()->ET_ON); + HalExecCommand dcdcCmd; + dcdcCmd.elements.emplace_back(el); + dcdcCmd.setTimeout(15000); + + if (!mParent->getControl()->send(dcdcCmd)) + { + return false; + } + + if (WarningFactory::instance()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_INFORMATION, WarningCode::WARNING_DCDC_SUPPLY); + } + } + + // Event type 7 ------------------------------------------------------------------------------------ + if (mode == ET_PROFILING_ANALOG_DSTATE) + { + mDataProcessor.reset(new EnergyTraceProcessorId7(static_cast(calibrationValues.size()), ENERGYTRACE_BUFFER_SIZE, devHandle)); + // Pass on the calibration values to the processor + mDataProcessor->setTimerStep(timerStep); + mDataProcessor->setResistorValues(&resistorValues[0]); + mDataProcessor->setCalibrationValues(&calibrationValues[0], vcc); + + if ((callbackMode == ET_CALLBACKS_ONLY_DURING_RUN) && devHandle) + { + if (devHandle->getTargetArchitecture() == MSP430) + return mPollingManager->startEnergyTracePolling(ET_POLLING_ANALOG_DSTATE, ET_POLLING_GATED_ON); + else + return mPollingManager->startEnergyTracePolling(ET_POLLING_ANALOG_DSTATE_PC, ET_POLLING_GATED_ON); + } + } + + // Event type 8 --------------------------------------------------------------------------------------- + if (mode == ET_PROFILING_ANALOG) + { + mDataProcessor.reset(new EnergyTraceProcessorId8(static_cast(calibrationValues.size()), ENERGYTRACE_BUFFER_SIZE, devHandle)); + // Pass on the calibration values to the processor + mDataProcessor->setTimerStep(timerStep); + mDataProcessor->setResistorValues(&resistorValues[0]); + mDataProcessor->setCalibrationValues(&calibrationValues[0], vcc); + + const EtGatedMode gatedMode = (callbackMode == ET_CALLBACKS_ONLY_DURING_RUN) ? ET_POLLING_GATED_ON : ET_POLLING_GATED_OFF; + + return mPollingManager->startEnergyTracePolling(ET_POLLING_ANALOG, gatedMode); + } + + return false; +} + +//------------------------------------------------------------- +void EnergyTraceManager::runEvent(MessageDataPtr messageData) +{ + uint16_t eventMask = 0; + (*messageData) >> eventMask; + + if (mCbx) + { + uint8_t numRecords = 0; + uint8_t sizeOfRecords = 0; + + (*messageData) >> numRecords; + (*messageData) >> sizeOfRecords; + + boost::lock_guard lock(callbackMutex); + + if (this->mDataProcessor->AddData((void*)messageData->data(), numRecords * sizeOfRecords)) + { + mCbx->event(DebugEventTarget::EnergyTraceData); + } + } +} + +//------------------------------------------------------------- +void* EnergyTraceManager::getEnergyTraceBuffer() +{ + if (mDataProcessor) + { + return mDataProcessor->GetReadBufferPtr(); + } + return nullptr; +} + +//------------------------------------------------------------- +size_t EnergyTraceManager::getEnergyTraceBufferSize() +{ + if (mDataProcessor) + { + return mDataProcessor->GetReadBufferSize(); + } + return 0; +} + +//------------------------------------------------------------- +void EnergyTraceManager::doCalibration(uint16_t vcc) +{ + if (mParent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC || + mParent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_NO_FLOWCT || + mParent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + calibrateResistor(vcc); + } + + if (mParent->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || mParent->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + calibrateResistor(vcc); + } + + this->vcc = vcc; +} + +//------------------------------------------------------------- +void EnergyTraceManager::calibrateResistor(uint16_t vcc) +{ + // send Calibration comand to dcdc Firmware + HalExecElement* el = new HalExecElement(ID_Zero, dcdcCalibrate); + el->setAddrFlag(false); + + el->appendInputData16(static_cast(calibrationResistors.size())); //count resistors + + // now add Resistors + for (size_t i = 0; i < calibrationResistors.size(); i++) + { + el->appendInputData16(calibrationResistors[i]); + } + //cal. VCC + el->appendInputData16(vcc); + + HalExecCommand dcdcCmd; + dcdcCmd.setTimeout(20000); + dcdcCmd.elements.emplace_back(el); + mParent->getControl()->send(dcdcCmd); + + int pos = 0; + for (size_t i = 0; i < calibrationResistors.size(); i++, pos+=8) + { + double ticks = el->getOutputAt32(pos); + double time = el->getOutputAt32(pos + 4) * timerStep; // time in ns + calibrationValues[i] = ticks * 1000.0 * 1000.0 / time; + } +} + +//------------------------------------------------------------- +void EnergyTraceManager::stopPolling() +{ + mPollingManager->stopEnergyTracePolling(); + + if (mParent->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + //switch on dcdc supply + HalExecElement* el = new HalExecElement(ID_Zero, coreSwitchFet); + el->appendInputData16(mParent->getConfigManager()->LDO_ON); + HalExecCommand dcdcCmd; + dcdcCmd.elements.emplace_back(el); + dcdcCmd.setTimeout(15000); + mParent->getControl()->send(dcdcCmd); + + if (WarningFactory::instance()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_INFORMATION, WarningCode::WARNING_LDO_SUPPLY); + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceManager.h b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceManager.h new file mode 100644 index 0000000..96bf83b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceManager.h @@ -0,0 +1,109 @@ +/* + * EnergyTraceManager.h + * + * Functionality for EnergyTrace + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "HalExecCommand.h" +#include "FetHandle.h" +#include "MSP430_EnergyTrace.h" +#include "MessageData.h" +#include + +namespace TI +{ + namespace DLL430 + { + class IFetHandle; + class IDataProcessor; + class PollingManager; + class IDeviceHandle; + + class EnergyTraceManager + { + public: + EnergyTraceManager(FetHandle* parent, PollingManager* pollingManager); + ~EnergyTraceManager (); + //! \brief Do calibration for all resistors + void doCalibration(uint16_t vcc); + + bool startEnergyTrace(DebugEventTarget * cb, ETMode_t mode, ETCallback_mode callbackMode, IDeviceHandle* devHandle); + + void * getEnergyTraceBuffer(); + + size_t getEnergyTraceBufferSize(); + + void stopPolling(); + + bool ResetEnergyTrace(); + + protected: + + private: + void runEvent(MessageDataPtr messageData); + void calibrateResistor(uint16_t resistor); + + FetHandle* mParent; + std::shared_ptr mDataProcessor; // Post-processing of EnergyTrace Data + DebugEventTarget* mCbx; + PollingManager* mPollingManager; + std::vector calibrationValues; + std::vector resistorValues; + uint32_t timerStep; + uint16_t vcc; + std::vector calibrationResistors; + + boost::mutex callbackMutex; + }; + + }; +}; diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessor.cpp b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessor.cpp new file mode 100644 index 0000000..1ad7a7b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessor.cpp @@ -0,0 +1,137 @@ +/* + * EnergyTraceProcessor.cpp + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "EnergyTraceProcessor.h" + +using namespace TI::DLL430; + +//--------------------------------- +EnergyTraceProcessor::EnergyTraceProcessor(uint32_t numCalibrationPoints) + : numCalibrationPoints(numCalibrationPoints) + , tickThreshold(0) + , oneTickinMicroWsec(numCalibrationPoints) + , mVoutFilter(50) + , mFilterEnable(true) + , mTimeTag_us(0.0) + , mPrevTimeTag(0) + , mPrevCurrentTick(0) + , mCalibrationValues(numCalibrationPoints) + , mResistorValues(numCalibrationPoints, 0) + , timeBase_ns(640) + , mSkip(0) +{ +} + +//--------------------------------- +EnergyTraceProcessor::~EnergyTraceProcessor() +{ +} + +//--------------------------------- +void EnergyTraceProcessor::calculateCalibration(uint16_t vcc) +{ + for (uint32_t i = 1; i < numCalibrationPoints; ++i) + { + const double x0 = mCalibrationValues[i-1].refCurrent; + const double y0 = mCalibrationValues[i-1].threshold; + + const double x1 = mCalibrationValues[i].refCurrent; + const double y1 = mCalibrationValues[i].threshold; + + mCalibrationValues[i-1].gradient = (x1 - x0) / (y1 - y0); + mCalibrationValues[i-1].offset = y0; // Offset is tick count + + // Calculate energy content in uWsec (=uJ) per 1 tick + // This calculation assumes that the value stored in + // calibrationTickArray[x] is per 1msec + // First we calculate the equivalent of 1 tick per 1 msec in mA current + // Then we simply multiply it with the actual voltage + + const double oneTickPerMsecinNA = mCalibrationValues[i].refCurrent / + (mCalibrationValues[i].threshold - mCalibrationValues[0].threshold); + oneTickinMicroWsec[i-1] = (oneTickPerMsecinNA/1000.0)*(((double)vcc)/1000.0)/1000.0; + } + + const double y0 = mCalibrationValues[0].threshold; + //Added - calculate threshold for current update when current is 0 (standby) + tickThreshold = (unsigned int)(y0*(double)minUpdateRateInMsec); // Adaptive filter threshold +} + +//--------------------------------- +void EnergyTraceProcessor::setCalibrationValues(double *calibrationValues, uint16_t vcc) +{ + mCalibrationValues[0].refCurrent = 0; + mCalibrationValues[0].threshold = calibrationValues[0]; + + for (size_t i = 1; i < numCalibrationPoints; ++i) + { + mCalibrationValues[i].refCurrent = ((double)vcc) / mResistorValues[i] * 1000.0 * 1000.0; + mCalibrationValues[i].threshold = calibrationValues[i]; + } + + calculateCalibration(vcc); +} + +//--------------------------------- +void EnergyTraceProcessor::setResistorValues(double *resistorValues) +{ + for (uint32_t i = 1; i < numCalibrationPoints; ++i) + { + mResistorValues[i] = resistorValues[i]; + } +} + +//--------------------------------- +void EnergyTraceProcessor::setTimerStep(uint32_t step) +{ + timeBase_ns = step; +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessor.h b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessor.h new file mode 100644 index 0000000..91eb589 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessor.h @@ -0,0 +1,188 @@ +/* + * EnergyTraceProcessor.h + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include "IDataProcessor.h" +#include "EnergyTraceRunningAverageFilter.h" + +namespace TI +{ + namespace DLL430 + { + class EnergyTraceProcessor : public IDataProcessor + { + public: + /** + * \brief Constructor creates the two buffers + * \param size The desired size of the buffers + */ + explicit EnergyTraceProcessor(uint32_t numCalibrationPoints); + ~EnergyTraceProcessor(); + + EnergyTraceProcessor(const EnergyTraceProcessor&) = delete; + EnergyTraceProcessor& operator=(const EnergyTraceProcessor&) = delete; + + + void setTimerStep(uint32_t step); + void setResistorValues(double *resistorValues); + void setCalibrationValues(double *calibrationValues, uint16_t vcc); + + protected: + ///< \brief Calculate the correct values to use when calculating the current + void calculateCalibration(uint16_t vcc); + + static const uint32_t minUpdateRateInMsec = 1000; + + static const uint32_t SKIP_COUNTER = 5; + static const uint16_t ACCUMULATED_N_DIV_MIN = 1; + static const uint16_t ACCUMULATED_N_DIV_STEP_SIZE = 5; + static const uint8_t POWERSTATE_INVALID = 0x0; + static const uint8_t POWERSTATE_ACTIVE = 0x1; + static const uint8_t POWERSTATE_LOWPOWER = 0x3; + + + uint32_t numCalibrationPoints; + uint32_t tickThreshold; // Adaptive filter threshold + std::vector oneTickinMicroWsec; // Energy equivalent of 1 tick in uWsec (uJ) + +#pragma pack(1) + typedef struct + { + uint32_t pc; + uint32_t pstate; + } DStateMsp432_t; +#pragma pack() + +#pragma pack(1) + typedef struct + { + uint64_t JState; + } DStateMsp430_t; +#pragma pack() + +#pragma pack(1) + typedef union + { + DStateMsp430_t dStateMsp430; + DStateMsp432_t dStateMsp432; + } DState_t; +#pragma pack() + +#pragma pack(1) + ///< \brief The EnergyTrace Record sent to the IDE + typedef struct + { + uint64_t header; ///< The header consists of: [1byte eventID][7byte timestamp in usec] + DState_t dstate; ///< Device state + uint32_t current; ///< Current I in nA + uint16_t voltage; ///< Voltage V in mV + uint32_t energy; ///< Energy E in nw + } EnergyRecord; +#pragma pack() + + +#pragma pack(1) + ///< \brief The EnergyTrace Record sent to the IDE + typedef struct + { + uint64_t header; ///< The header consists of: [1byte eventID][7byte timestamp in usec] + uint32_t current; ///< Current I in nA + uint16_t voltage; ///< Voltage V in mV + uint32_t energy; ///< Energy E in nw + } EnergyRecordEt8; +#pragma pack() + +#pragma pack(1) + ///< \brief The record received from the firmware - differs from the one sent to the IDE(Analog and Dstate mode) + typedef struct EnergyTraceRecord + { + uint8_t eventID; + uint32_t TimeStamp; + DState_t dstate; + uint32_t currentTicks; + uint16_t voltage; + } EnergyTraceRecord_t; +#pragma pack() + +#pragma pack(1) + ///< \brief The record received from the firmware - differs from the one sent to the IDE (Analog mode) + typedef struct EnergyTraceRecordEt8 + { + uint8_t eventID; + uint32_t TimeStamp; + uint32_t currentTicks; + uint16_t voltage; + } EnergyTraceRecordEt8_t; +#pragma pack() + + ///< \brief Calibration values used to calculate the correct value + typedef struct Calibration + { + double threshold; ///< Threshold value at which this calibration record must be used + double refCurrent; ///< Reference current for calibration point + double gradient; ///< Gradient with which to calculate actual value + double offset; ///< Offset with which to calculate actual value + } Calibration_t; + + EnergyTraceRunningAverageFilter mVoutFilter; + bool mFilterEnable; + double mTimeTag_us; ///< The current timetag + uint32_t mPrevTimeTag; ///< Previous timetag value received from the firmware + uint32_t mPrevCurrentTick; ///< Previous current value received from firmware + std::vector mCalibrationValues; ///< Calibration values used to calculate the current + std::vector mResistorValues; ///< Resistor values used to calculate ref currents + uint8_t mSkip; ///< First record that was recorded + uint32_t timeBase_ns; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId7.cpp b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId7.cpp new file mode 100644 index 0000000..8931d13 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId7.cpp @@ -0,0 +1,295 @@ +/* + * EnergyTraceProcessorId7.cpp + * + * Process incoming serial data into EnergyTrace records + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "EnergyTraceProcessorId7.h" +#include "EnergyTraceJstateParser.h" +#include "IDeviceHandle.h" + +using namespace TI::DLL430; +using namespace std; + +EnergyTraceProcessorId7::EnergyTraceProcessorId7(uint32_t calibrationPoints, size_t dataSize, IDeviceHandle *devHandle) + : EnergyTraceProcessor(calibrationPoints) + , mBuffer(dataSize) + , mPrevCurrent(0) + , mEnergyMicroWsec(0) + , mDevice(devHandle) +{ + Reset(); + +#ifdef ETLOG + filePtr = fopen("etlog.csv", "w"); + Log("Timestamp, deltaT, deltaN, CurrentTicks, Current, dStateValues"); +#endif +} + +EnergyTraceProcessorId7::~EnergyTraceProcessorId7() +{ +#ifdef ETLOG + if (filePtr) fclose(filePtr); +#endif +} + + +#ifdef ETLOG +void EnergyTraceProcessorId7::Log(char * str) +{ + if (filePtr) + { + fprintf(filePtr, "%s\n", str); + fflush(filePtr); + } +} +#endif + + +void EnergyTraceProcessorId7::Reset() +{ + mBuffer.Reset(); + mVoutFilter.Reset(); + mAccumulatedT = 0; + mAccumulatedN = 0; + mEnergyMicroWsec = 0; + mEnergyMicroWsecAdder = 0; + mAccumulatedNDiv = 1; + mCurrent = 0; + mCurrentValid = false; + mPrevTimeTag = 0; + + mSkip = SKIP_COUNTER; +} + +bool EnergyTraceProcessorId7::AddData(void *data, size_t size) +{ + bool retVal = false; + + // Process the stream and store it in the buffer + EnergyTraceRecord_t *pRecord = (EnergyTraceRecord_t *)data; + + size_t numEntries = size/sizeof(*pRecord); + while (numEntries--) + { + // ---------------------------------------------------- + // Discard first samples + if (mSkip > 0) + { + --mSkip; + mPrevCurrentTick = pRecord->currentTicks; + mPrevTimeTag = pRecord->TimeStamp; + mVoutFilter.Reset(); + mTimeTag_us = 0; + mCurrent = 0; + if (mSkip == 0) + { + mCurrentValid = true; + } + mAccumulatedT = 0; + mAccumulatedN = 0; + mEnergyMicroWsec = 0; + mEnergyMicroWsecAdder = 0; + mAccumulatedNDiv = 1; + return false; + } + EnergyRecord newRecord; + + // ---------------------------------------------------------------------------------- + // Calculate timestamp in usec and passed time between this and last sample + double deltaT = (double)(pRecord->TimeStamp - mPrevTimeTag) * timeBase_ns / 1000.00; // Convert to micro-seconds + + //------- Current calculation----------------------------------------------------------- + uint32_t deltaN = pRecord->currentTicks - mPrevCurrentTick; + +#ifdef ETLOG + // For debug + sprintf(logStr, "%d, %4.0f, %d, %d, %d, %llx", + pRecord->TimeStamp, deltaT, deltaN, pRecord->currentTicks, mCurrent, pRecord->JState); + + Log(logStr); +#endif + + const size_t uint32Max = numeric_limits::max(); + if ((pRecord->TimeStamp <= mPrevTimeTag) && (mPrevTimeTag - pRecord->TimeStamp < uint32Max / 2)) + { + return false; + } + + if (pRecord->currentTicks < mPrevCurrentTick) + { + return false; + } + + newRecord.dstate = pRecord->dstate; + + if (mDevice->getTargetArchitecture() == MSP430) + { + if (!isJstateValid(pRecord->dstate.dStateMsp430.JState)) + { + newRecord.dstate.dStateMsp430.JState &= 0x3CFFFFFFFFFFFFFFull; + } + } + else + { + // Check CPM in PCMCTL0 register (Bit 8-13) + uint8_t cpm = (newRecord.dstate.dStateMsp432.pstate >> 8) & 0x3F; + if (cpm < 0x0A) + newRecord.dstate.dStateMsp432.pstate = POWERSTATE_ACTIVE; + else if ( ((cpm >> 4) == 1 && !(cpm & 0x02)) || cpm == 0x20) + newRecord.dstate.dStateMsp432.pstate = POWERSTATE_LOWPOWER; + else + newRecord.dstate.dStateMsp432.pstate = POWERSTATE_INVALID; + } + + //------- Voltage measurement + uint32_t VOut = pRecord->voltage; + + // ---------------------------------------------------------------------------------- + // Average voltage + if (mFilterEnable) + { + mVoutFilter.AddData(&VOut, sizeof(VOut)); + newRecord.voltage = *((uint32_t *)mVoutFilter.GetReadBufferPtr()); + } + else + { + newRecord.voltage = VOut; + } + + //------- Current calculation----------------------------------------------------------- + // Setup integrators + const double mAccumulatedTMin = 1000; + const double mAccumulatedNMin = (double)tickThreshold/mAccumulatedNDiv; + + // Add up samples------------------------------------------------------------------------------- + mAccumulatedT += deltaT; + mAccumulatedN += deltaN; + + uint32_t range = 0; + + if (mCurrentValid || ((mAccumulatedT > mAccumulatedTMin) && (mAccumulatedN > mAccumulatedNMin))) // Calculate sample every 1000usec, need to have at least 1 tick + { + //Determine left side of range the value lies in + double normalizedN = (double)mAccumulatedN / mAccumulatedT * 1000.00; // Normalized ticks per 1msec + + // Calculate current for all calibration points + double currents[5] = {0}; + for (unsigned int i=0; i mCalibrationValues[range+1].threshold)) + { + range++; + } + + if (currents[range] < 0) currents[range] = 0; + mCurrent = (unsigned int) currents[range]; + + + //------- Current calculation----------------------------------------------------------- + if (mAccumulatedNDiv > ACCUMULATED_N_DIV_MIN) + { + mAccumulatedNDiv -= ACCUMULATED_N_DIV_STEP_SIZE; + } + + mAccumulatedT = 0; + mAccumulatedN = 0; + mCurrentValid = false; + } + + // ---------------------------------------------------------------------------------- + // Round current to next 100nA + mCurrent = ((mCurrent + 50) / 100) * 100; + + // ---------------------------------------------------------------------------------- + // Assemble header + mTimeTag_us += deltaT; // Time tag is in micro-seconds + newRecord.header = ((uint64_t)mTimeTag_us << 8) + ((uint64_t)pRecord->eventID & 0xFF); + + // ---------------------------------------------------------------------------------- + // Calculate total energy in 0.1uWsec + mEnergyMicroWsecAdder += (double)deltaN - ((double)mCalibrationValues[0].threshold*(deltaT/1000)); + if (mEnergyMicroWsecAdder > 0) // Only increase energy + { + mEnergyMicroWsec += mEnergyMicroWsecAdder * oneTickinMicroWsec[range] * 10; + mEnergyMicroWsecAdder = 0; + } + newRecord.energy = (uint32_t)mEnergyMicroWsec; + + newRecord.current = mCurrent; + retVal |= mBuffer.AddData(newRecord); // Add the current record to the double buffer + + // Store the current state + mPrevTimeTag = pRecord->TimeStamp; + mPrevCurrentTick = pRecord->currentTicks; + pRecord++; + } + return retVal; +} + + +//--------------------------------- +void* EnergyTraceProcessorId7::GetReadBufferPtr() +{ + return mBuffer.GetReadBufferPtr(); +} + +//--------------------------------- +size_t EnergyTraceProcessorId7::GetReadBufferSize() +{ + return mBuffer.GetBufferSize() * sizeof(*mBuffer.GetReadBufferPtr()); +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId7.h b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId7.h new file mode 100644 index 0000000..9d28eaa --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId7.h @@ -0,0 +1,123 @@ +/* + * EnergyTraceProcessor.h + * + * Process incoming serial data into EnergyTrace records + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "EnergyTraceProcessor.h" +#include + + +//#define ETLOG + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class EnergyTraceProcessorId7 : public EnergyTraceProcessor + { + public: + /** + * \brief Constructor creates the two buffers + * \param size The desired size of the buffers + */ + EnergyTraceProcessorId7(uint32_t calibrationPoints, size_t dataSize, IDeviceHandle *devHandle); + ~EnergyTraceProcessorId7(); + + /** + * \brief Resets the internal state of the processor + */ + void Reset(); + + /** + * \brief Add data to be processed + * \param data The data element to be written + * \return Indicates whether new output data is available for reading + */ + bool AddData(void *data, size_t size); + + /** + * \brief Get the pointer for reading data from the buffer + * \return A pointer to the current read buffer + */ + void* GetReadBufferPtr(); + + /** + * \brief Get the buffer size + * \return the size + */ + size_t GetReadBufferSize(); +#ifdef ETLOG + void Log(char * str); +#endif + + private: + DoubleBuffer mBuffer; ///< The Double buffer that stores all the records + uint32_t mPrevCurrent; + double mEnergyMicroWsec; + double mEnergyMicroWsecAdder; + double mAccumulatedNDiv; + + double mAccumulatedT; + uint32_t mAccumulatedN; + uint32_t mCurrent; + bool mCurrentValid; + IDeviceHandle *mDevice; + +#ifdef ETLOG + char logStr [256]; + FILE *filePtr; +#endif + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId8.cpp b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId8.cpp new file mode 100644 index 0000000..b9301ff --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId8.cpp @@ -0,0 +1,317 @@ +/* + * EnergyTraceProcessorID8.cpp + * + * Process incoming serial data into EnergyTrace records + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "EnergyTraceProcessorId8.h" + + +using namespace TI::DLL430; +using namespace std; + + +EnergyTraceProcessorId8::EnergyTraceProcessorId8(uint32_t calibrationPoints, size_t dataSize, IDeviceHandle *devHandle) + : EnergyTraceProcessor(calibrationPoints) + , mBuffer(dataSize) + , mPrevCurrent(0) + , mEnergyMicroWsec(0) + , mDevice(devHandle) +{ + Reset(); + +#ifdef ETLOG + filePtr = fopen("etlog.csv", "a"); + + filePtrCalls = fopen("calls.csv", "a"); + LogCalls("call, mAccumulatedN, mAccumulatedNMin, currents[range], current, ticks, deltaTicks"); +#endif +} + +EnergyTraceProcessorId8::~EnergyTraceProcessorId8() +{ +#ifdef ETLOG + if (filePtr) fclose(filePtr); + if (filePtrCalls) fclose(filePtrCalls); +#endif +} + + +#ifdef ETLOG + +void EnergyTraceProcessorId8::LogCalls(char * str) +{ + if (filePtrCalls) + { + fprintf(filePtrCalls, "%s\n", str); + fflush(filePtrCalls); + } +} + +void EnergyTraceProcessorId8::Log(char * str) +{ + if (filePtr) + { + fprintf(filePtr, "%s\n", str); + fflush(filePtr); + } +} +#endif + + +void EnergyTraceProcessorId8::Reset() +{ + mBuffer.Reset(); + mVoutFilter.Reset(); + mAccumulatedT = 0; + mAccumulatedN = 0; + mEnergyMicroWsec = 0; + mEnergyMicroWsecAdder = 0; + mAccumulatedNDiv = 1; + mCurrent = 0; + mCurrentValid = false; + mPrevTimeTag = 0; + + mSkip = SKIP_COUNTER; +} + +bool EnergyTraceProcessorId8::AddData(void *data, size_t size) +{ + bool retVal = false; + + // Process the stream and store it in the buffer + EnergyTraceRecordEt8_t *pRecord = (EnergyTraceRecordEt8_t *)data; + + size_t numEntries = size/sizeof(*pRecord); + while (numEntries--) + { + // ---------------------------------------------------- + // Discard first samples + if (mSkip > 0) + { + --mSkip; + mPrevCurrentTick = pRecord->currentTicks; + mPrevTimeTag = pRecord->TimeStamp; + mVoutFilter.Reset(); + mTimeTag_us = 0; + mCurrent = 0; + if (mSkip == 0) + { + mCurrentValid = true; + } + mAccumulatedT = 0; + mAccumulatedN = 0; + mEnergyMicroWsec = 0; + mEnergyMicroWsecAdder = 0; + mAccumulatedNDiv = 1; + +#ifdef ETLOG + LogCalls("RESET"); + + sprintf(logStr, "calvalues, numCalibrationPoints, actPoint, threshold, refCurrent, gradient, offset"); + LogCalls(logStr); + + for (unsigned int i = 0; iTimeStamp - mPrevTimeTag) * timeBase_ns / 1000.00; // Convert to micro-seconds + + //------- Current calculation----------------------------------------------------------- + uint32_t deltaN = pRecord->currentTicks - mPrevCurrentTick; + + const size_t uint32Max = numeric_limits::max(); + if ((pRecord->TimeStamp <= mPrevTimeTag) && (mPrevTimeTag - pRecord->TimeStamp < uint32Max / 2)) + { + return false; + } + + if (pRecord->currentTicks < mPrevCurrentTick) + { + return false; + } + //------- Voltage measurement + uint32_t VOut = pRecord->voltage; + + // ---------------------------------------------------------------------------------- + // Average voltage + if (mFilterEnable) + { + mVoutFilter.AddData(&VOut, sizeof(VOut)); + newRecord.voltage = *((uint32_t *)mVoutFilter.GetReadBufferPtr()); + } + else + { + newRecord.voltage = VOut; + } + + //------- Current calculation----------------------------------------------------------- + // Setup integrators + const double mAccumulatedTMin = 1000; + const double mAccumulatedNMin = (double)tickThreshold/mAccumulatedNDiv; + + // Add up samples------------------------------------------------------------------------------- + mAccumulatedT += deltaT; + mAccumulatedN += deltaN; + + uint32_t range = 0; + + if ((mAccumulatedT > mAccumulatedTMin) && (mAccumulatedN > mAccumulatedNMin)) // Calculate sample every 1000usec, need to have at least 1 tick + { + + //Determine left side of range the value lies in + double normalizedN = (double)mAccumulatedN / mAccumulatedT * 1000.00; // Normalized ticks per 1msec + + // Calculate current for all calibration points + double currents[5] = {0}; + for (unsigned int i=0; i mCalibrationValues[range+1].threshold)) + { + range++; + } + + if (currents[range] < 0) + { + currents[range] = 0; + } + mCurrent = (unsigned int) currents[range]; + + //------- Current calculation----------------------------------------------------------- + if (mAccumulatedNDiv > ACCUMULATED_N_DIV_MIN) + { + mAccumulatedNDiv -= ACCUMULATED_N_DIV_STEP_SIZE; + } + +#ifdef ETLOG + sprintf(logStr, "CURRENT calculation, %u, %lf, %lf, %u, %u, %u", mAccumulatedN, mAccumulatedNMin, currents[range], mCurrent, pRecord->currentTicks, deltaN); + LogCalls(logStr); +#endif + + mAccumulatedT = 0; + mAccumulatedN = 0; + mCurrentValid = false; + } + +#ifdef ETLOG + else + { + sprintf(logStr, "NO calcution, %u, %lf, %lf, %u, %u, %u", mAccumulatedN, mAccumulatedNMin, 0.0, mCurrent, pRecord->currentTicks, deltaN); + LogCalls(logStr); + + } +#endif + // ---------------------------------------------------------------------------------- + //round current to next 100nA + mCurrent = ((mCurrent + 50) / 100) * 100; + + // ---------------------------------------------------------------------------------- + // Assemble header + mTimeTag_us += deltaT; // Time tag is in micro-seconds + newRecord.header = ((uint64_t)mTimeTag_us << 8) + ((uint64_t)pRecord->eventID & 0xFF); + + // ---------------------------------------------------------------------------------- + // Calculate total energy in 0.1uWsec + mEnergyMicroWsecAdder += (double)deltaN - ((double)mCalibrationValues[0].threshold*(deltaT/1000)); + if (mEnergyMicroWsecAdder > 0) // Only increase energy + { + mEnergyMicroWsec += mEnergyMicroWsecAdder * oneTickinMicroWsec[range] * 10; + mEnergyMicroWsecAdder = 0; + } + newRecord.energy = (uint32_t)mEnergyMicroWsec; + + newRecord.current = mCurrent; + +#ifdef ETLOG + // For debug + sprintf(logStr, "%lf, %d, %lf, %d, %d, %d", mTimeTag_us, VOut, mEnergyMicroWsec, mCurrent, pRecord->currentTicks, deltaN); + Log(logStr); +#endif + + retVal |= mBuffer.AddData(newRecord); // Add the current record to the double buffer + + // Store the current state + mPrevTimeTag = pRecord->TimeStamp; + mPrevCurrentTick = pRecord->currentTicks; + pRecord++; + } + return retVal; +} + + +//--------------------------------- +void* EnergyTraceProcessorId8::GetReadBufferPtr() +{ + return mBuffer.GetReadBufferPtr(); +} + +//--------------------------------- +size_t EnergyTraceProcessorId8::GetReadBufferSize() +{ + return mBuffer.GetBufferSize() * sizeof(*mBuffer.GetReadBufferPtr()); +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId8.h b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId8.h new file mode 100644 index 0000000..04a338e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceProcessorId8.h @@ -0,0 +1,124 @@ +/* + * EnergyTraceProcessor.h + * + * Process incoming serial data into EnergyTrace records + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "EnergyTraceProcessor.h" +#include + +//#define ETLOG + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class EnergyTraceProcessorId8 : public EnergyTraceProcessor + { + public: + /** + * \brief Constructor creates the two buffers + * \param size The desired size of the buffers + */ + EnergyTraceProcessorId8(uint32_t calibrationPoints, size_t dataSize, IDeviceHandle *devHandle); + ~EnergyTraceProcessorId8(); + + /** + * \brief Resets the internal state of the processor + */ + void Reset(); + + /** + * \brief Add data to be processed + * \param data The data element to be written + * \return Indicates whether new output data is available for reading + */ + bool AddData(void *data, size_t size); + + /** + * \brief Get the pointer for reading data from the buffer + * \return A pointer to the current read buffer + */ + void* GetReadBufferPtr(); + + /** + * \brief Get the buffer size + * \return the size + */ + size_t GetReadBufferSize(); +#ifdef ETLOG + void Log(char * str); + void LogCalls(char * str); +#endif + + private: + DoubleBuffer mBuffer; ///< The Double buffer that stores all the records + uint32_t mPrevCurrent; + double mEnergyMicroWsec; + double mEnergyMicroWsecAdder; + double mAccumulatedNDiv; + + double mAccumulatedT; + uint32_t mAccumulatedN; + uint32_t mCurrent; + bool mCurrentValid; + IDeviceHandle *mDevice; + +#ifdef ETLOG + char logStr [500]; + FILE *filePtr; + FILE *filePtrCalls; +#endif + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceRunningAverageFilter.cpp b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceRunningAverageFilter.cpp new file mode 100644 index 0000000..02c65c9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceRunningAverageFilter.cpp @@ -0,0 +1,113 @@ +/* + * EnergyTraceRunningAverageFilter.cpp + * + * Filter incoming value using low-pass filter + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "EnergyTraceRunningAverageFilter.h" + +using namespace TI::DLL430; + +//--------------------------------- +EnergyTraceRunningAverageFilter::EnergyTraceRunningAverageFilter(size_t bufferSize) + : mBufferSize(bufferSize) + , mOutput(0) +{ +} + +//--------------------------------- +EnergyTraceRunningAverageFilter::~EnergyTraceRunningAverageFilter() +{ +} + +//--------------------------------- +void EnergyTraceRunningAverageFilter::setCalibrationValues(double*, uint16_t) +{ +} + +//--------------------------------- +void EnergyTraceRunningAverageFilter::Reset() +{ + mBuffer.clear(); +} + +//--------------------------------- +bool EnergyTraceRunningAverageFilter::AddData(void *data, size_t) +{ + double avg = 0; + + mBuffer.push_back(*((uint32_t *)data)); + if (mBuffer.size() > mBufferSize) + { + mBuffer.pop_front(); + } + + for (size_t i = 0; i < mBuffer.size(); ++i) + { + avg += mBuffer[i]; + } + + mOutput = (uint32_t)(avg / (double)mBuffer.size()); + + return true; +} + +//--------------------------------- +void* EnergyTraceRunningAverageFilter::GetReadBufferPtr() +{ + return (void *)(&mOutput); +} + +//--------------------------------- +size_t EnergyTraceRunningAverageFilter::GetReadBufferSize() +{ + return sizeof(mOutput); +} diff --git a/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceRunningAverageFilter.h b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceRunningAverageFilter.h new file mode 100644 index 0000000..71376ad --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/EnergyTraceRunningAverageFilter.h @@ -0,0 +1,105 @@ +/* + * EnergyTraceRunningAverageFilter.h + * + * Filter incoming value using low-pass filter + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include + + +namespace TI +{ + namespace DLL430 + { + class EnergyTraceRunningAverageFilter : public IDataProcessor + { + public: + /** + * \brief Constructor creates the buffer + * \param size The desired size of the buffer + */ + explicit EnergyTraceRunningAverageFilter(size_t bufferSize); + ~EnergyTraceRunningAverageFilter(); + + /** + * \brief Resets the internal state of the processor + */ + void Reset(); + + /** + * \brief Add data to be processed + * \param data The data element to be written + * \return Indicates whether new output data is available for reading + */ + bool AddData(void *data, size_t size); + + /** + * \brief Get the pointer for reading data from the buffer + * \return A pointer to the current read buffer + */ + void* GetReadBufferPtr(); + + /** + * \brief Get the buffer size + * \return the size + */ + size_t GetReadBufferSize(); + + void setCalibrationValues(double *calibrationValues, uint16_t vcc); + + private: + size_t mBufferSize; + std::deque mBuffer; + uint32_t mOutput; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/EventNotifier.h b/DLL430_v3/src/TI/DLL430/EventNotifier.h index a31efd3..5e469ff 100644 --- a/DLL430_v3/src/TI/DLL430/EventNotifier.h +++ b/DLL430_v3/src/TI/DLL430/EventNotifier.h @@ -1,74 +1,67 @@ /* * EventNotifier.h * - * Copyright (C) 2009 - 2011 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 + * Copyright (C) 2009 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_EVENT_NOTIFIER_H -#define DLL430_EVENT_NOTIFIER_H - - -#include #include "MessageQueue.h" -//The event notifier will run a separate thread to process queued events by calling a +//The event notifier will run a separate thread to process queued events by calling a //specified event handler callback function on each of them. template class EventNotifier -{ +{ public: - typedef boost::function1 Callback; + typedef std::function Callback; - EventNotifier() : mRunning(false), mCallback(0) {} + EventNotifier() : mRunning(false), mCallback(nullptr) {} explicit EventNotifier(Callback callback) : mRunning(false), mCallback(callback) {} ~EventNotifier() { stopProcessingEvents(); } - void startProcessingEvents() + void startProcessingEvents() { if (!mRunning) { mRunning = true; - mThread = boost::thread(&EventNotifier::execute, this); + mThread = std::thread(&EventNotifier::execute, this); } } - void stopProcessingEvents() + void stopProcessingEvents() { if (mRunning) { @@ -98,12 +91,9 @@ class EventNotifier bool mRunning; Callback mCallback; - boost::thread mThread; + std::thread mThread; //Since it is critical to cancel waiting for messages before the queue is destroyed, //the queue has been made a member instead of being passed from the outside MessageQueue mMessageQueue; }; - - -#endif diff --git a/DLL430_v3/src/TI/DLL430/FetControl.cpp b/DLL430_v3/src/TI/DLL430/FetControl.cpp index c82efcc..f2058b8 100644 --- a/DLL430_v3/src/TI/DLL430/FetControl.cpp +++ b/DLL430_v3/src/TI/DLL430/FetControl.cpp @@ -3,59 +3,95 @@ * * Flash Emulation Tool Control. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "FetControl.h" #include "IoChannel.h" #include "HalResponseHandler.h" #include "FetControlThread.h" #include "HalExecCommand.h" +#include "VersionInfo.h" -#include +#include using namespace TI::DLL430; -FetControl::FetControl (IoChannel* channel) - : communication(true) - , channel(channel) - , fetSwVersion(0) - , fetHwVersion(0) - , currentId(0) - , reader(0) +FetControl::FetControl(IoChannel* channel) + : communication(true) + , channel(channel) + , fetCoreVersion(0) + , fetHilVersion(0) + , fetFpgaVersion(0) + , fetToolId(0x1111) + , fetDcdcLayerVersion(0) + , fetDcdcSubMcuVersion(0) + , fetComChannelVersion(0) + , fetHilCrc(0) + , fetHalCrc(0) + , fetDcdcCrc(0) + , fetCoreCrc(0) + , fetComChannelCrc(0) + , currentId(0) + , reader(0) { + + const uint8_t INFO_U1_HW[] = { 0x55, 0xFF, 40, 1 }; + fetHardwareVersions[0xCCCC] = std::vector(INFO_U1_HW, INFO_U1_HW + 4); + + const uint8_t INFO_EZ_FET_HW[] = { 0x45, 0xFF, 0, 4 }; + fetHardwareVersions[0xAAAA] = std::vector(INFO_EZ_FET_HW, INFO_EZ_FET_HW + 4); + + const uint8_t INFO_EZ_FET_HW_NO_FLOW_CTS[] = { 0x45, 0xFF, 0, 5 }; + fetHardwareVersions[0xAAAC] = std::vector(INFO_EZ_FET_HW_NO_FLOW_CTS, INFO_EZ_FET_HW_NO_FLOW_CTS + 4); + + const uint8_t INFO_EZ_FET_HW_V2[] = { 0x45, 0xFF, 0, 6 }; + fetHardwareVersions[0xAAAD] = std::vector(INFO_EZ_FET_HW_V2, INFO_EZ_FET_HW_V2 + 4); + + const uint8_t INFO_EZ_FET_LITE_HW[] = { 0x45, 0xFF, 0, 3 }; + fetHardwareVersions[0xAAAB] = std::vector(INFO_EZ_FET_LITE_HW, INFO_EZ_FET_LITE_HW + 4); + + const uint8_t INFO_MSP_FET_HW[] = { 0x55, 0xFF, 0, 3 }; + fetHardwareVersions[0xBBBB] = std::vector(INFO_MSP_FET_HW, INFO_MSP_FET_HW + 4); + + const uint8_t INFO_MSP_FET_HW2x[] = { 0x55, 0xFF, 0, 3 }; + fetHardwareVersions[0xBBBC] = std::vector(INFO_MSP_FET_HW2x, INFO_MSP_FET_HW2x + 4); + this->reader = new FetControlThread(*this); this->channel->setParent(this); + + this->channel->open(); this->reader->start(); //needs to be true for resetCommunication @@ -64,7 +100,7 @@ FetControl::FetControl (IoChannel* channel) FetControl::~FetControl () { - boost::mutex::scoped_lock lock(this->rhMutex); + boost::unique_lock lock(this->rhMutex); this->responseHandlers.clear(); @@ -77,9 +113,9 @@ FetControl::~FetControl () void FetControl::shutdown() { - if(hasCommunication()) + if (hasCommunication()) { - // Send Close comand to UIF and Release Hil layer driver signals + // com Reset std::vector data; data.push_back(0x03); data.push_back(0x92); @@ -92,47 +128,39 @@ void FetControl::shutdown() communication = false; } -bool FetControl::hasCommunication() +bool FetControl::hasCommunication() const { return communication; } -void FetControl::setObjectDbEntry (size_t index) const +bool FetControl::send(HalExecCommand& command) { - this->channel->setObjectDbEntry(index); -} - -void FetControl::setFunctionMap (IoChannel::function_map_type* map) const -{ - this->channel->setFunctionMap(map); -} - -bool FetControl::send (HalExecCommand& command, function_map_type* fctMap) -{ - this->channel->setFunctionMap(fctMap); + boost::unique_lock lock(sendMutex); return command.send(*this, *this->channel); } bool FetControl::sendData(const std::vector& data) { - if(data.size()>250) + boost::unique_lock lock(sendMutex); + if (data.size()>250) + { return false; - + } return this->channel->write(&data[0], data.size()) > 0; } bool FetControl::pauseLoopCmd (uint8_t id) { bool success = true; - if(id > 0) + if (id > 0) { HalExecElement* el = new HalExecElement(ID_Zero, CmdPauseLoop); el->appendInputData8(id); - + HalExecCommand command; - command.elements.push_back(el); + command.elements.emplace_back(el); - success = command.send(*this, *this->channel); + success = this->send(command); } return success; } @@ -140,15 +168,15 @@ bool FetControl::pauseLoopCmd (uint8_t id) bool FetControl::resumeLoopCmd (uint8_t id) { bool success = true; - if(id > 0) + if (id > 0) { HalExecElement* el = new HalExecElement(ID_Zero, CmdResumeLoop); el->appendInputData8(id); - + HalExecCommand command; - command.elements.push_back(el); + command.elements.emplace_back(el); - success = command.send(*this, *this->channel); + success = send(command); } return success; } @@ -159,7 +187,7 @@ bool FetControl::kill (uint8_t id) if (id > 0) { - boost::mutex::scoped_lock lock(this->rhMutex); + boost::unique_lock lock(this->rhMutex); ResponseHandlerTable::iterator it = responseHandlers.find(id); if (it != responseHandlers.end()) @@ -169,16 +197,18 @@ bool FetControl::kill (uint8_t id) HalExecCommand kill; HalExecElement* el = new HalExecElement(ID_Zero, CmdKill); el->appendInputData8(id); - kill.elements.push_back(el); - - success = kill.send(*this, *this->channel); + kill.elements.emplace_back(el); + success = this->send(kill); // Free the ID from the reserved list - std::map::iterator it = reservedIds.find(id & 0x3f); - - if(it != reservedIds.end()) { - reservedIds.erase(it); + boost::unique_lock lock(this->CriMutex); + std::map::iterator it = reservedIds.find(id & 0x3f); + + if (it != reservedIds.end()) + { + reservedIds.erase(it); + } } return success; @@ -186,6 +216,8 @@ bool FetControl::kill (uint8_t id) bool FetControl::resetCommunication() { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + std::vector data; data.push_back(0x03); data.push_back(0x92); @@ -193,17 +225,16 @@ bool FetControl::resetCommunication() data.push_back(0x00); this->sendData(data); // reset connection - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(100)); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); HalExecElement* el = new HalExecElement(ID_Zero); el->appendInputData8(STREAM_CORE_ZERO_VERSION); - el->setOutputSize(12); HalExecCommand cmd; - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); - const bool success = cmd.send(*this, *this->channel); - if(success) + const bool success = send(cmd); + if (success) { fetSwVersion.push_back(el->getOutputAt8(0)); fetSwVersion.push_back(el->getOutputAt8(1)); @@ -213,25 +244,123 @@ bool FetControl::resetCommunication() fetHwVersion.push_back(el->getOutputAt8(5)); fetHwVersion.push_back(el->getOutputAt8(6)); fetHwVersion.push_back(el->getOutputAt8(7)); - fetCoreVersion = (el->getOutputAt16(8)); - fetSafeCoreVersion = (el->getOutputAt16(10)); + + + unsigned char major=fetSwVersion.at(1); + uint8_t minor = (major & 0x3f); + uint8_t patch = fetSwVersion.at(0); + uint16_t flavor = (fetSwVersion.at(3) << 8) + fetSwVersion.at(2); + VersionInfo HalVersion((((major & 0xC0) >> 6) + 1), minor, patch, flavor); + + // this is the minimum hal version number for new eZ-FET or MSP-FET + if (HalVersion.get() >= 30300000 || + (fetSwVersion[0] == 0xAA && fetSwVersion[1] == 0xAA && fetSwVersion[2] == 0xAA && fetSwVersion[3] == 0xAA) || /*eZ-FET*/ + (fetSwVersion[0] == 0xCC && fetSwVersion[1] == 0xCC && fetSwVersion[2] == 0xCC && fetSwVersion[3] == 0xCC) || /*MSP-FET UIF*/ + (fetSwVersion[0] == 0xAA && fetSwVersion[1] == 0xAB && fetSwVersion[2] == 0xAA && fetSwVersion[3] == 0xAB) ||/*eZ-FET no DCDC*/ + (fetSwVersion[0] == 0xBB && fetSwVersion[1] == 0xBB && fetSwVersion[2] == 0xBB && fetSwVersion[3] == 0xBB) || /*MSP-FET*/ + (fetSwVersion[0] == 0xBB && fetSwVersion[1] == 0xBC && fetSwVersion[2] == 0xBB && fetSwVersion[3] == 0xBC) ||/*MSP-FET v2*/ + (fetSwVersion[0] == 0xAA && fetSwVersion[1] == 0xAD && fetSwVersion[2] == 0xAA && fetSwVersion[3] == 0xAD)) /*eZ-FET v2*/ + { + fetToolId = (el->getOutputAt16(8)); + fetCoreVersion = (el->getOutputAt16(10)); + fetHilVersion = (el->getOutputAt16(12)); + fetDcdcLayerVersion = (el->getOutputAt16(14)); + fetDcdcSubMcuVersion = (el->getOutputAt16(16)); + fetComChannelVersion = (el->getOutputAt16(18)); + + fetHilCrc = (el->getOutputAt16(20)); + fetHalCrc = (el->getOutputAt16(22)); + fetDcdcCrc = (el->getOutputAt16(24)); + fetCoreCrc = (el->getOutputAt16(26)); + fetComChannelCrc = (el->getOutputAt16(28)); + + fetFpgaVersion = (el->getOutputAt16(30)); + } + else if (HalVersion.get() <= 30300000 && HalVersion.get() >= 30000000) // this handles an older verion of MSP-FET430UIF + { + fetToolId = 0xCCCC; + fetCoreVersion = (el->getOutputAt16(8)); + } + else + { + fetToolId = 0x1111; + } } - return true; + return success; +} + +bool FetControl::resetFetState() +{ + // reset global vars + HalExecCommand ResetCmd; + HalExecElement* el = new HalExecElement(ID_ResetStaticGlobalVars); + ResetCmd.elements.emplace_back(el); + return this->send(ResetCmd); +} + +uint16_t FetControl::getFetToolId() const +{ + return fetToolId; +} + +uint16_t FetControl::getHilVersion() const +{ + return fetHilVersion; +} + +uint16_t FetControl::getDcdcLayerVersion() const +{ + return fetDcdcLayerVersion; +} + +uint16_t FetControl::getDcdcSubMcuVersion() const +{ + return fetDcdcSubMcuVersion; +} + +uint16_t FetControl::getFetCoreVersion() const +{ + return fetCoreVersion; +} + +uint16_t FetControl::getFetCoreCrc() const +{ + return fetCoreCrc; +} + +uint16_t FetControl::getFetHalCrc() const +{ + return fetHalCrc; +} + +uint16_t FetControl::getFetHilCrc() const +{ + return fetHilCrc; } -uint16_t FetControl::getFetCoreVersion() +uint16_t FetControl::getFetFpgaVersion() const { - return fetCoreVersion; + return fetFpgaVersion; } -uint16_t FetControl::getFetSafeCoreVersion() +uint16_t FetControl::getFetDcdcCrc() const { - return fetSafeCoreVersion; + return fetDcdcCrc; +} + +uint16_t FetControl::getFetComChannelVersion() const +{ + return fetComChannelVersion; +} + +uint16_t FetControl::getFetComChannelCrc() const +{ + return fetComChannelCrc; } bool FetControl::registerResponseHandler (uint8_t id, HalResponseHandlerPtr h) { - boost::mutex::scoped_lock lock(this->rhMutex); + boost::lock_guard lock(this->rhMutex); HalResponseHandlerPtr& handler = responseHandlers[id]; if (!handler) @@ -244,7 +373,7 @@ bool FetControl::registerResponseHandler (uint8_t id, HalResponseHandlerPtr h) void FetControl::unregisterResponseHandler (uint8_t id, HalResponseHandlerPtr h) { - boost::mutex::scoped_lock lock(rhMutex); + boost::lock_guard lock(rhMutex); ResponseHandlerTable::iterator it = responseHandlers.find(id); if (it != responseHandlers.end() && it->second == h) @@ -253,7 +382,7 @@ void FetControl::unregisterResponseHandler (uint8_t id, HalResponseHandlerPtr h) void FetControl::unregisterResponseHandler (HalResponseHandlerPtr h) { - boost::mutex::scoped_lock lock(rhMutex); + boost::lock_guard lock(rhMutex); ResponseHandlerTable::iterator it = responseHandlers.begin(); while (it != responseHandlers.end()) @@ -272,7 +401,7 @@ HalResponseHandlerPtr FetControl::findResponseHandler (uint8_t id) return HalResponseHandlerPtr(); } - boost::mutex::scoped_lock lock(rhMutex); + boost::lock_guard lock(rhMutex); ResponseHandlerTable::iterator it = responseHandlers.find(id); @@ -280,6 +409,7 @@ HalResponseHandlerPtr FetControl::findResponseHandler (uint8_t id) { if (it->second->isAsync() && !it->second->isContinuous() && (id & 0x40)) { + boost::lock_guard lock(this->CriMutex); // If this was an event that we were waiting for, remove the ID from the reserved list std::map::iterator idIt= reservedIds.find(id & 0x3f); if (idIt != reservedIds.end()) @@ -294,11 +424,11 @@ HalResponseHandlerPtr FetControl::findResponseHandler (uint8_t id) HalResponseHandlerPtr FetControl::findResponseHandler (HalResponseHandlerPtr h) { - boost::mutex::scoped_lock lock(this->rhMutex); + boost::lock_guard lock(this->rhMutex); ResponseHandlerTable::iterator iter; - for(iter = responseHandlers.begin(); iter != responseHandlers.end(); ++iter ) + for (iter = responseHandlers.begin(); iter != responseHandlers.end(); ++iter ) { if (iter->second == h) return h; @@ -308,11 +438,12 @@ HalResponseHandlerPtr FetControl::findResponseHandler (HalResponseHandlerPtr h) uint8_t FetControl::createResponseId (bool reserveId) { + boost::lock_guard lock(this->CriMutex); do { if (++currentId > 0x3f) currentId = 0x1; - } while(reservedIds.count(currentId)>0); // Do not use reserved IDs! + } while (reservedIds.count(currentId)>0); // Do not use reserved IDs! if (reserveId) { @@ -325,23 +456,18 @@ uint8_t FetControl::createResponseId (bool reserveId) void FetControl::clearResponse() { - boost::mutex::scoped_lock lock(this->rhMutex); + boost::lock_guard lock(this->rhMutex); currentId = 0x3f; this->responseHandlers.clear(); } -boost::mutex* FetControl::getMutex() +const std::vector* FetControl::getHwVersion() { - return &this->sendMutex; + return &fetHardwareVersions[this->getFetToolId()]; } -std::vector * FetControl::getHwVersion() -{ - return &this->fetHwVersion; -} - -std::vector * FetControl::getSwVersion() +const std::vector* FetControl::getSwVersion() const { return &this->fetSwVersion; } @@ -354,40 +480,51 @@ std::string FetControl::getSerial() const void FetControl::provideSystemErrorMsg(HalResponse& resp) { const HalResponse::errorType error = resp.getError(); - + const std::vector& respData = resp.get(); + if ( error != HalResponse::Error_None ) { if (lNotifyCallback) - lNotifyCallback(0, error, 0, 0); + { + lNotifyCallback(error); + } } - else + else if (respData.size() > 4 && respData[0] == 0x92) + { + #ifndef NDEBUG + printf("firmware system error %02x%02x\n", respData[4], respData[3]); + #endif + } + else if (respData.size() > 3 && respData[0] == 0x95) { - std::vector data=resp.get(); - if(data.size()>=5) + if (lNotifyCallback) { - if(data[0]==0x92) - { -#ifndef NDEBUG - printf("firmware system error %02x%02x\n",data[4],data[3]); -#endif - } + this->lNotifyCallback(respData[3]); } } + else + { + #ifndef NDEBUG + printf("firmware system error \n"); + #endif + } + } void FetControl::provideSystemConnectMsg(bool connect) { if (!connect && this->lNotifyCallback) { - if(communication) + if (communication) { communication=false; - this->lNotifyCallback(0,0,0,0); + this->lNotifyCallback(0); } } } void FetControl::addSystemNotifyCallback(const NotifyCallback& callback) { + boost::lock_guard lock(rhMutex); lNotifyCallback = callback; } diff --git a/DLL430_v3/src/TI/DLL430/FetControl.h b/DLL430_v3/src/TI/DLL430/FetControl.h index 4983b67..0765541 100644 --- a/DLL430_v3/src/TI/DLL430/FetControl.h +++ b/DLL430_v3/src/TI/DLL430/FetControl.h @@ -3,55 +3,49 @@ * * Flash Emulation Tool Control. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FETCONTROL_H -#define DLL430_FETCONTROL_H - -#include -#include -#include -#include -#include -#include + +#include "PortInfo.h" #include "WatchdogControl.h" #include "IoChannel.h" #include "FetControlThread.h" #include "HalResponseHandler.h" +#include +#include + namespace TI { namespace DLL430 @@ -59,26 +53,23 @@ namespace TI class HalCommand; - typedef boost::function4 NotifyCallback; - class FetControl { public: - FetControl (IoChannel* channel); + explicit FetControl (IoChannel* channel); ~FetControl (); - typedef boost::mutex mutex_type; - void setObjectDbEntry (size_t index) const ; - void setFunctionMap (IoChannel::function_map_type*) const; - - typedef std::map function_map_type; - bool send (HalExecCommand& command, function_map_type* fctMap = NULL); + FetControl(const FetControl&) = delete; + FetControl& operator=(const FetControl&) = delete; + bool send (HalExecCommand& command); bool sendData(const std::vector& data); void shutdown(); bool resetCommunication(); + bool resetFetState(); + bool kill (uint8_t id); bool pauseLoopCmd (uint8_t id); bool resumeLoopCmd (uint8_t id); @@ -98,27 +89,51 @@ namespace TI void provideSystemErrorMsg(HalResponse& resp); void provideSystemConnectMsg(bool connect); + typedef std::function NotifyCallback; void addSystemNotifyCallback(const NotifyCallback& notifyCallback); - bool hasCommunication(); + bool hasCommunication() const; - boost::mutex *getMutex (); + const std::vector* getHwVersion(); + const std::vector* getSwVersion() const; - std::vector * getHwVersion(); - std::vector * getSwVersion(); + uint16_t getFetCoreVersion() const; - uint16_t getFetCoreVersion(); - uint16_t getFetSafeCoreVersion(); + uint16_t getFetToolId() const; + uint16_t getHilVersion() const; + uint16_t getDcdcLayerVersion() const; + uint16_t getDcdcSubMcuVersion() const; + uint16_t getFetComChannelVersion() const; + + uint16_t getFetCoreCrc() const; + uint16_t getFetHalCrc() const; + uint16_t getFetHilCrc() const; + uint16_t getFetDcdcCrc() const; + uint16_t getFetComChannelCrc() const; + + uint16_t getFetFpgaVersion() const; bool communication; private: IoChannel* channel; std::vector fetSwVersion; - std::vector fetHwVersion; - + std::vector fetHwVersion; + uint16_t fetCoreVersion; - uint16_t fetSafeCoreVersion; + uint16_t fetHilVersion; + uint16_t fetFpgaVersion; + uint16_t fetToolId; + + uint16_t fetDcdcLayerVersion; + uint16_t fetDcdcSubMcuVersion; + uint16_t fetComChannelVersion; + + uint16_t fetHilCrc; + uint16_t fetHalCrc; + uint16_t fetDcdcCrc; + uint16_t fetCoreCrc; + uint16_t fetComChannelCrc; uint8_t currentId; @@ -129,15 +144,17 @@ namespace TI ResponseHandlerTable responseHandlers; /* this mutex protects the reponseHandlers list, so iterators keep stable */ - mutex_type rhMutex; - mutex_type sendMutex; + boost::mutex rhMutex; + boost::mutex CriMutex; + boost::recursive_mutex sendMutex; NotifyCallback lNotifyCallback; std::map reservedIds; + std::map > fetHardwareVersions; + + }; }; }; - -#endif /* DLL430_FETCONTROL_H */ diff --git a/DLL430_v3/src/TI/DLL430/FetControlThread.cpp b/DLL430_v3/src/TI/DLL430/FetControlThread.cpp index 44e60fe..8a214e7 100644 --- a/DLL430_v3/src/TI/DLL430/FetControlThread.cpp +++ b/DLL430_v3/src/TI/DLL430/FetControlThread.cpp @@ -3,38 +3,39 @@ * * Asynchronous data reception from FET. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "IoChannel.h" #include "HalResponseHandler.h" @@ -48,7 +49,7 @@ FetControlThread::FetControlThread (FetControl& ctrl) : ctrl(ctrl) , stopThread(false) , com(ComStateDisconnect) - , thread(NULL) + , thread(nullptr) { } @@ -62,16 +63,22 @@ bool FetControlThread::start () // start thread here, check for running thread assert (this->thread == 0); - this->thread = new boost::thread(&FetControlThread::run, this); + this->stopThread = false; + + this->thread = new std::thread(&FetControlThread::run, this); - return (this->thread != 0); + return (this->thread != nullptr); } void FetControlThread::stop () { - if (this->thread != 0) + if (this->thread != 0) { this->stopThread = true; + if (ctrl.channel) + { + ctrl.channel->cancel(); + } this->thread->join(); delete this->thread; this->thread = 0; @@ -89,37 +96,38 @@ void FetControlThread::run() void FetControlThread::readFromIoChannel () { - IoChannel* ch = ctrl.channel; + HalResponse resp; - com = ch->poll(); - if(com == ComStateRcv) + com = ctrl.channel->poll(); + if (com == ComStateRcv) { - HalResponse resp; - const int msgLength = ch->read(resp, 1000); + const size_t msgLength = ctrl.channel->read(resp); if (msgLength > 0) { - if ( resp.getError() == HalResponse::Error_None ) + if (resp.getError() == HalResponse::Error_None) { invokeResponseHandler(resp); - } - else - { - ch->close(); - ctrl.provideSystemConnectMsg(false); } } } - if(com == ComStateDisconnect) + if (com == ComStateDisconnect || resp.getError() != HalResponse::Error_None) + { + ctrl.channel->close(); ctrl.provideSystemConnectMsg(false); + } } void FetControlThread::invokeResponseHandler (HalResponse& resp) { - if(resp.getId()==0) + if (resp.getId()==0) + { this->ctrl.provideSystemErrorMsg(resp); + } HalResponseHandlerPtr rh = this->ctrl.findResponseHandler(resp.getId()); if (rh) + { rh->recv(this->ctrl, resp); + } } diff --git a/DLL430_v3/src/TI/DLL430/FetControlThread.h b/DLL430_v3/src/TI/DLL430/FetControlThread.h index 62c628f..1756f70 100644 --- a/DLL430_v3/src/TI/DLL430/FetControlThread.h +++ b/DLL430_v3/src/TI/DLL430/FetControlThread.h @@ -3,48 +3,42 @@ * * Asynchronous data reception from FET. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FETCONTROLTHREAD_H -#define DLL430_FETCONTROLTHREAD_H #include "HalResponse.h" -#include - namespace TI { namespace DLL430 @@ -53,8 +47,12 @@ namespace TI class FetControlThread { public: - FetControlThread (FetControl& ctrl); + explicit FetControlThread (FetControl& ctrl); ~FetControlThread (); + + FetControlThread(const FetControlThread&) = delete; + FetControlThread& operator=(const FetControlThread&) = delete; + bool start (); void stop (); void run (); @@ -65,13 +63,11 @@ namespace TI FetControl& ctrl; bool stopThread; ComState com; - boost::thread *thread; - + std::thread *thread; + void readFromIoChannel (); void invokeResponseHandler (HalResponse& resp); }; }; }; - -#endif /* DLL430_FETCONTROLTHREAD_H */ diff --git a/DLL430_v3/src/TI/DLL430/FetHandle.cpp b/DLL430_v3/src/TI/DLL430/FetHandle.cpp new file mode 100644 index 0000000..317364a --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FetHandle.cpp @@ -0,0 +1,210 @@ +/* + * FetHandle.h + * + * Communication with FET. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "FetHandle.h" +#include "FetControl.h" +#include "../../../version.h" +#include "HalExecCommand.h" +#include "ConfigManager.h" +#include "DeviceHandleManager.h" +#include "IoChannelFactory.h" + + +using namespace TI::DLL430; + +const char* FetHandle::id = "FetHandle"; + +FetHandle::FetHandle(const PortInfo& portInfo, FetHandleManager* fhm, TARGET_ARCHITECTURE_t arch) + : version(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD) + , channel(0) + , control(0) + , configManager(0) + , deviceHandleManager(nullptr) + , communication(false) +{ + channel = IoChannelFactory::createIoChannel(portInfo); + + if (!this->channel) + return; + + this->control = new FetControl(this->channel); + + if (this->control->hasCommunication()) + { + communication=true; + this->deviceHandleManager = new DeviceHandleManager(this); + this->configManager = new ConfigManager(this, fhm, arch); + this->configManager->init(); + } +} + +FetHandle::~FetHandle() +{ + delete configManager; + delete control; + delete deviceHandleManager; + delete channel; +} + +void FetHandle::shutdown() +{ + if (control) + control->shutdown(); +} + +bool FetHandle::hasCommunication() const +{ + return communication; +} + +std::string FetHandle::getCurrentPortName() +{ + return this->channel->getName(); +} + +IConfigManager* FetHandle::getConfigManager () +{ + return this->configManager; +} + +FetControl* FetHandle::getControl () +{ + return this->control; +} + +IDeviceHandleManager* FetHandle::getDeviceHandleManager () +{ + return this->deviceHandleManager; +} + +bool FetHandle::send (HalExecCommand &command) +{ + return this->control->send(command); +} + +bool FetHandle::kill(HalExecCommand &command) +{ + bool retVal = false; + if (control->kill(command.getResponseId())) + { + command.clearResponseId(); + retVal = true; + } + return retVal; +} + +bool FetHandle::kill(uint8_t respId) +{ + return control->kill(respId); +} + +bool FetHandle::pauseLoopCmd(unsigned long respId) +{ + return (respId == 0) || control->pauseLoopCmd((uint8_t)respId); +} + +bool FetHandle::resumeLoopCmd(unsigned long respId) +{ + return (respId == 0) || control->resumeLoopCmd((uint8_t)respId); +} + +const std::vector* FetHandle::getHwVersion() const +{ + return control ? control->getHwVersion() : nullptr; +} + +const std::vector* FetHandle::getSwVersion() const +{ + return control ? control->getSwVersion() : nullptr; +} + +void FetHandle::addSystemNotifyCallback(const NotifyCallback& notifyCallback) +{ + if (this->control!=nullptr) + this->control->addSystemNotifyCallback(notifyCallback); +} + +bool FetHandle::sendHilCommand(HIL_COMMAND command, uint32_t data) +{ + HalExecElement *el = new HalExecElement(ID_HilCommand); + el->appendInputData32((uint32_t)command); + el->appendInputData32(data); + el->appendInputData32(0); + el->appendInputData32(0); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + return send(cmd); +} + +uint64_t FetHandle::sendJtagShift(HIL_COMMAND shiftType, uint64_t data, int32_t bitSize) +{ + HalExecElement *el = new HalExecElement(ID_HilCommand); + el->appendInputData32((uint32_t)shiftType); + el->appendInputData64(data); + el->appendInputData32((uint32_t)bitSize); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + uint64_t result = (uint64_t)-1; + if (send(cmd)) + { + result = cmd.elements[0]->getOutputAt64(0); + } + return result; +} + +bool FetHandle::setJtagPin(JTAG_PIN pin, bool state) +{ + HalExecElement* el = new HalExecElement(ID_BitSequence); + el->appendInputData8(1); + el->appendInputData16(state << pin); + el->appendInputData16(1 << pin); + el->appendInputData16(0); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + return send(cmd); +} + +bool FetHandle::resetState() +{ + return control ? control->resetFetState() : false; +} diff --git a/DLL430_v3/src/TI/DLL430/FetHandleV3.h b/DLL430_v3/src/TI/DLL430/FetHandle.h similarity index 56% rename from DLL430_v3/src/TI/DLL430/FetHandleV3.h rename to DLL430_v3/src/TI/DLL430/FetHandle.h index 89615d0..346568b 100644 --- a/DLL430_v3/src/TI/DLL430/FetHandleV3.h +++ b/DLL430_v3/src/TI/DLL430/FetHandle.h @@ -1,114 +1,111 @@ /* - * FetHandleV3.cpp + * FetHandle.cpp * * Communication with FET. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FETHANDLEV3_H -#define DLL430_FETHANDLEV3_H -#include -#include -#include +#include "IFetHandle.h" +#include "VersionInfo.h" + namespace TI { namespace DLL430 { - class PortInfo; + struct PortInfo; class FetControl; class IoChannel; - class DeviceInfo; class HalExecCommand; - class ConfigManagerV3; - class MemoryManagerV3; - class DebugManagerV3; - class DeviceHandleManagerV3; + class IConfigManager; + class IMemoryManager; + class DebugManagerMSP430; + class DeviceHandleManager; + class FetHandleManager; - class FetHandleV3 : public FetHandle + class FetHandle : public IFetHandle { public: static const char* id; - - FetHandleV3 (PortInfo *); - ~FetHandleV3 (); - /* public API */ - const VersionInfo& getDllVersion () const { return this->version; }; - ConfigManager* getConfigManager (); - DeviceHandleManager* getDeviceHandleManager (); + FetHandle(const PortInfo&, FetHandleManager*, TARGET_ARCHITECTURE_t arch); + ~FetHandle(); + + FetHandle(const FetHandle&) = delete; + FetHandle& operator=(const FetHandle&) = delete; + + /* public API */ + const VersionInfo& getDllVersion() const { return this->version; }; + IConfigManager* getConfigManager(); + IDeviceHandleManager* getDeviceHandleManager(); /* internal API */ - FetControl* getControl (); - void configure (const DeviceInfo*); + FetControl* getControl(); - bool send (HalExecCommand &command); - + bool send(HalExecCommand &command); + + bool kill(HalExecCommand &command); bool kill(uint8_t respId); bool pauseLoopCmd(unsigned long respId); bool resumeLoopCmd(unsigned long respId); - bool hasCommunication(); + bool hasCommunication() const; void addSystemNotifyCallback(const NotifyCallback& notifyCallback); void shutdown(); bool sendHilCommand(HIL_COMMAND command, uint32_t data = 0); - uint64_t sendJtagShift(HIL_COMMAND shiftType, uint64_t data, long bitSize = 16); + uint64_t sendJtagShift(HIL_COMMAND shiftType, uint64_t data, int32_t bitSize = 16); bool setJtagPin(JTAG_PIN pin, bool state); - std::vector * getHwVersion(); - std::vector * getSwVersion(); + bool resetState(); + + const std::vector* getHwVersion() const; + const std::vector* getSwVersion() const; + std::string getCurrentPortName(); private: VersionInfo version; IoChannel* channel; FetControl* control; - ConfigManagerV3* configManager; - DeviceHandleManagerV3* deviceHandleManager; - - typedef boost::mutex mutex_type; - mutex_type* myMutex; + IConfigManager* configManager; + IDeviceHandleManager* deviceHandleManager; bool communication; }; - }; -}; - -#endif /* DLL430_FETHANDLEV3_H */ + } +} diff --git a/DLL430_v3/include/DLL430/FetHandleManager.h b/DLL430_v3/src/TI/DLL430/FetHandleManager.h similarity index 56% rename from DLL430_v3/include/DLL430/FetHandleManager.h rename to DLL430_v3/src/TI/DLL430/FetHandleManager.h index 9c8ecbf..1e949d2 100644 --- a/DLL430_v3/include/DLL430/FetHandleManager.h +++ b/DLL430_v3/src/TI/DLL430/FetHandleManager.h @@ -3,66 +3,54 @@ * * Base class singleton for managing fet handles. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FETHANDLEMANAGER_H -#define DLL430_FETHANDLEMANAGER_H -#include -#include -#include -#include +#include "IFetHandle.h" +#include "PortInfo.h" +#include "Log.h" -#include namespace TI { namespace DLL430 { /** \brief manager to create and destroy API handles */ - class DLL430_SYMBOL FetHandleManager + class FetHandleManager { public: - /** \brief get a pointer to the FetHandleManager instance - * - * \return pointer to the instance - */ - static FetHandleManager* instance(); + virtual ~FetHandleManager() {}; - virtual ~FetHandleManager () {}; - /** \brief create a list of available ports * * The scans the system for connected and supported devices. The result @@ -73,7 +61,7 @@ namespace TI * \param open if false, the device is scanned but not opened * \return pointer to the list */ - virtual bool createPortList (char * type, bool update = false, bool open = true) = 0; + virtual bool createPortList(const char* type, bool update = false, bool open = true) = 0; /** \brief delete list of available ports * @@ -88,59 +76,49 @@ namespace TI * * \return number of ports */ - virtual size_t getPortNumber () = 0; + virtual size_t getPortNumber() = 0; /** \brief return the instance PortInfo * * searches in the port list for the connection with given name - * - * \return pointer to PortInfo instance or NULL if no instance found + * + * \return pointer to PortInfo instance or nullptr if no instance found */ - virtual PortInfo * getPortElement(std::string name) = 0; + virtual PortInfo* getPortElement(std::string name) = 0; /** \brief return the instance PortInfo * * return the instance at the given position * - * \return pointer to PortInfo instance or NULL if no instance found + * \return pointer to PortInfo instance or nullptr if no instance found */ - virtual PortInfo * getPortElement(long idx) = 0; - + virtual PortInfo* getPortElement(long idx) = 0; + + /** \brief return the instance PortInfo + * + * return the instance by using the serial number + * + * \return pointer to PortInfo instance or nullptr if no instance found + */ + virtual PortInfo* getPortElementBySN(std::string serialnumber) = 0; + /** \brief create a new API handle instance * * This creates a new API handle. You can have more than one but do * not create multiple handles for the same port! The handle MUST be - * deleted using destroyFetHandle()! + * deleted using destroyFetHandle()! * * \param port the PortInfoList iterator of the selected port - * \param vcc optional parameter that sets the voltage (in mV) * \return pointer to the API handle */ - virtual FetHandle* createFetHandle (PortInfo * port, uint16_t vcc = 0) const = 0; + virtual IFetHandle* createFetHandle(const PortInfo&, TARGET_ARCHITECTURE_t) = 0; /** \brief destroy a previously created API handle * * \param handle the API handle to destroy */ - virtual void destroyFetHandle (FetHandle* handle) const = 0; - - /** \brief get the pointer to the device database manager - * - * The device database manager contains information about devices - * that are not represented by other means. You must not delete - * the pointer. - * - * \return pointer to the device database manager - */ - virtual DeviceDbManager* getDeviceDbManager () = 0; - - protected: - FetHandleManager () {}; - FetHandleManager (const FetHandleManager&) {}; - FetHandleManager& operator= (const FetHandleManager&) { return *this; }; + virtual void destroyFetHandle(IFetHandle* handle) const = 0; }; }; }; - -#endif /* DLL430_FETHANDLEMANAGER_H */ diff --git a/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.cpp b/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.cpp index d2b0fb6..0f72818 100644 --- a/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.cpp +++ b/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.cpp @@ -1,84 +1,77 @@ /* * FetHandleManagerImpl.cpp * - * Implementation of FetHandle interface. + * Implementation of IFetHandle interface. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #include "FetHandleManagerImpl.h" -#include "FetHandleV3.h" -#include "DeviceDbManagerExt.h" -#include "Logger.h" +#include "FetHandle.h" +#include "Log.h" #include "IoChannelFactory.h" #include "UsbCdcIoChannel.h" +#include "HidUpdateManager.h" using namespace TI::DLL430; -static FetHandleManagerImpl* manager = 0; -FetHandleManager* FetHandleManager::instance () -{ - if (manager == 0) - manager = new FetHandleManagerImpl; - - return manager; -} -FetHandleManagerImpl::FetHandleManagerImpl () - : dbm(0) -{ -} - -FetHandleManagerImpl::~FetHandleManagerImpl () -{ - manager = 0; - if (this->dbm) - delete this->dbm; -} -bool FetHandleManagerImpl::createPortList (char * type, bool update, bool open) +bool FetHandleManagerImpl::createPortList(const char* type, bool update, bool open) { - if( !ids.empty() && update ) + if ( !ids.empty() && update ) clearPortList(); - const string port(type); - if (port != "USB" && port != "TIUSB" && port != "CDC" && port.substr(0,3) != "LPT") - ids[port] = new UsbCdcIoChannel(port, ""); + const std::string hid = "HID_FET"; + + if (HidUpdateManager::countHidDevices(MSPBSL_EZ_FET_USB_PID) > 0) + { + ids[hid] = PortInfo(hid, "", PortInfo::BSL); + } + else if (HidUpdateManager::countHidDevices(MSPBSL_MSP_FET_USB_PID) > 0) + { + ids[hid] = PortInfo(hid, "", PortInfo::BSL); + } + else + { + IoChannelFactory::enumeratePorts(ids, type, open); + } - IoChannelFactory::enumeratePorts(ids, type, open); return true; } -PortInfo * FetHandleManagerImpl::getPortElement(std::string name) +PortInfo* FetHandleManagerImpl::getPortElement(std::string name) { PortMap::iterator it = ids.begin(); @@ -89,7 +82,7 @@ PortInfo * FetHandleManagerImpl::getPortElement(std::string name) for (it = ids.begin(); it != ids.end(); ++it) { - if (it->second->getStatus() == PortInfo::freeForUse) + if (it->second.status == PortInfo::freeForUse) break; } } @@ -97,70 +90,46 @@ PortInfo * FetHandleManagerImpl::getPortElement(std::string name) { it = ids.find(name); } - return (it != ids.end()) ? it->second : NULL; + return (it != ids.end()) ? &it->second : nullptr; } -void FetHandleManagerImpl::clearPortList() +PortInfo* FetHandleManagerImpl::getPortElementBySN(std::string serialnumber) { - for (PortMap::iterator it = ids.begin(); it != ids.end(); ++it) + createPortList("CDC", true, false); + + PortMap::iterator it = ids.begin(); + for (it = ids.begin(); it != ids.end(); ++it) { - if ( PortInfo* currInfo = it->second ) - { - currInfo->close(); - delete currInfo; - } + if (it->second.serial == serialnumber) + break; } + return (it != ids.end()) ? &it->second : nullptr; +} + +void FetHandleManagerImpl::clearPortList() +{ ids.clear(); } -PortInfo * FetHandleManagerImpl::getPortElement(long idx) +PortInfo* FetHandleManagerImpl::getPortElement(long idx) { PortMap::iterator it = ids.begin(); - for(int i =0; i < idx; ++i) + for (int i = 0; (i < idx) && (it != ids.end()); ++i) { ++it; } - return (ids.end() != it) ? it->second : NULL; + return (ids.end() != it) ? &it->second : nullptr; } -FetHandle* FetHandleManagerImpl::createFetHandle (PortInfo * portInfo, uint16_t vcc) const +IFetHandle* FetHandleManagerImpl::createFetHandle(const PortInfo& portInfo, TARGET_ARCHITECTURE_t arch) { - if(portInfo==NULL) - return NULL; + std::unique_ptr handle(new FetHandle(portInfo, this,arch)); - auto_ptr handle(new FetHandleV3(portInfo)); - - if (!handle->hasCommunication()) - { - return 0; - } - - ConfigManager* c = handle->getConfigManager(); - if (!c) - { - return 0; - } - if (vcc > 0) - { - if (!c->setDeviceVcc(vcc)) - { - return 0; - } - } - - return handle.release(); + return handle->hasCommunication() ? handle.release() : nullptr; } -void FetHandleManagerImpl::destroyFetHandle (FetHandle* handle) const +void FetHandleManagerImpl::destroyFetHandle (IFetHandle* handle) const { delete handle; } - -DeviceDbManager* FetHandleManagerImpl::getDeviceDbManager () -{ - if (!this->dbm) - this->dbm = new TemplateDeviceDbManagerExt; - return this->dbm; -} - diff --git a/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.h b/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.h index 3c57171..5303dcb 100644 --- a/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.h +++ b/DLL430_v3/src/TI/DLL430/FetHandleManagerImpl.h @@ -1,52 +1,45 @@ /* * FetHandleManagerImpl.h * - * Implementation of FetHandle. + * Implementation of IFetHandle. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FETHANDLEMANAGERIMPL_H -#define DLL430_FETHANDLEMANAGERIMPL_H -#include -#include -#include -#include -#include -#include +#include "FetHandleManager.h" +#include "IFetHandle.h" +#include "PortInfo.h" namespace TI { @@ -56,27 +49,20 @@ namespace TI class FetHandleManagerImpl : public FetHandleManager { public: - FetHandleManagerImpl (); - ~FetHandleManagerImpl (); - - bool createPortList (char * type, bool update = false, bool open = true); + bool createPortList (const char* type, bool update = false, bool open = true); void clearPortList(); size_t getPortNumber() {return ids.size();} PortInfo * getPortElement(std::string name); PortInfo * getPortElement(long idx); - - FetHandle* createFetHandle (PortInfo * info, uint16_t vcc = 0) const; - void destroyFetHandle (FetHandle*) const; - - DeviceDbManager* getDeviceDbManager (); + PortInfo * getPortElementBySN(std::string serialnumber); + + IFetHandle* createFetHandle(const PortInfo& portInfo, TARGET_ARCHITECTURE_t arch); + void destroyFetHandle (IFetHandle*) const; private: - DeviceDbManager* dbm; PortMap ids; }; - }; -}; - -#endif /* DLL430_FETHANDLEMANAGERIMPL_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/FetHandleV3.cpp b/DLL430_v3/src/TI/DLL430/FetHandleV3.cpp deleted file mode 100644 index dce8312..0000000 --- a/DLL430_v3/src/TI/DLL430/FetHandleV3.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* - * FetHandleV3.h - * - * Communication with FET. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "FetHandleV3.h" -#include "FetControl.h" -#include "DeviceInfo.h" -#include "../../../version.h" -#include "HalExecCommand.h" -#include "ConfigManagerV3.h" -#include "DeviceHandleManagerV3.h" - - -using namespace TI::DLL430; - -const char* FetHandleV3::id = "FetHandleV3"; -typedef boost::mutex mutex_type; - - -FetHandleV3::FetHandleV3 (PortInfo * info) - : version(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD) - , channel(0) - , control(0) - , configManager(0) - , deviceHandleManager(NULL) - , myMutex(0) - , communication(false) -{ - this->channel = dynamic_cast(info); - if (!this->channel) - return; - - this->control = new FetControl(this->channel); - - if (this->control->hasCommunication()) - { - communication=true; - this->myMutex = this->control->getMutex(); - this->deviceHandleManager = new DeviceHandleManagerV3(this); - this->configManager = new ConfigManagerV3(this); - if (!this->configManager->init()) - { - delete this->configManager; - this->configManager = 0; - delete this->deviceHandleManager; - this->deviceHandleManager = 0; - } - } -} - -FetHandleV3::~FetHandleV3 () -{ - delete configManager; - configManager = 0; - - delete control; - control = 0; - - delete deviceHandleManager; - deviceHandleManager = 0; -} - -void FetHandleV3::shutdown() -{ - if (control) - control->shutdown(); -} - -bool FetHandleV3::hasCommunication() -{ - return communication; -} - -void FetHandleV3::configure (const DeviceInfo* info) -{ - this->control->setObjectDbEntry(info->getObjectId()); -} - -ConfigManager* FetHandleV3::getConfigManager () -{ - return this->configManager; -} - -FetControl* FetHandleV3::getControl () -{ - return this->control; -} - -DeviceHandleManager* FetHandleV3::getDeviceHandleManager () -{ - return this->deviceHandleManager; -} - -bool FetHandleV3::send (HalExecCommand &command) -{ - boost::mutex::scoped_lock lock(*(this->myMutex)); - return this->control->send(command,NULL); -} - -bool FetHandleV3::kill(uint8_t respId) -{ - return control->kill(respId); -} - -bool FetHandleV3::pauseLoopCmd(unsigned long respId) -{ - return (respId == 0) || control->pauseLoopCmd((uint8_t)respId); -} - -bool FetHandleV3::resumeLoopCmd(unsigned long respId) -{ - return (respId == 0) || control->resumeLoopCmd((uint8_t)respId); -} - -std::vector * FetHandleV3::getHwVersion() -{ - return control ? control->getHwVersion() : NULL; -} - -std::vector * FetHandleV3::getSwVersion() -{ - return control ? control->getSwVersion() : NULL; -} - -void FetHandleV3::addSystemNotifyCallback(const NotifyCallback& notifyCallback) -{ - if(this->control!=NULL) - this->control->addSystemNotifyCallback(notifyCallback); -} - -bool FetHandleV3::sendHilCommand(HIL_COMMAND command, uint32_t data) -{ - HalExecElement *el = new HalExecElement(ID_HilCommand); - el->appendInputData32((uint32_t)command); - el->appendInputData32(data); - el->appendInputData32(0); - el->appendInputData32(0); - el->setOutputSize(0); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - return send(cmd); -} - -uint64_t FetHandleV3::sendJtagShift(HIL_COMMAND shiftType, uint64_t data, long bitSize) -{ - HalExecElement *el = new HalExecElement(ID_HilCommand); - el->appendInputData32((uint32_t)shiftType); - el->appendInputData32((uint32_t)(data & 0xFFFFFFFF) ); - el->appendInputData32((uint32_t)(data >> 32) ); - el->appendInputData32(bitSize); - el->setOutputSize(8); - - HalExecCommand cmd; - cmd.elements.push_back(el); - - uint64_t result = (uint64_t)-1; - if ( send(cmd) ) - { - result = cmd.elements.at(0).getOutputAt32(0); - result |= (uint64_t)cmd.elements.at(0).getOutputAt32(4) << 32; - } - return result; -} - -bool FetHandleV3::setJtagPin(JTAG_PIN pin, bool state) -{ - HalExecElement* el = new HalExecElement(ID_BitSequence); - el->appendInputData8(1); - el->appendInputData16(state << pin); - el->appendInputData16(1 << pin); - el->appendInputData16(0); - - HalExecCommand cmd; - cmd.elements.push_back(el); - return send(cmd); -} diff --git a/DLL430_v3/src/TI/DLL430/FileFuncImpl.cpp b/DLL430_v3/src/TI/DLL430/FileFuncImpl.cpp deleted file mode 100644 index 07ea2af..0000000 --- a/DLL430_v3/src/TI/DLL430/FileFuncImpl.cpp +++ /dev/null @@ -1,671 +0,0 @@ -/* - * FileFunc.cpp - * - * File access for code image files. - * - * Copyright (C) 2008 - 2011 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. - */ - -#ifdef _MSC_VER -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS //disabling warnings to use secure c-function versions (e.g. strcpy_s) as not compatible none MS development -#endif -#endif - -#include -#include -#include - -#include - -#include -#include - -#include - -#include "FileFuncImpl.h" - -using namespace TI::DLL430; -using namespace std; - -static const size_t INTEL_HEX_LINE_DATA_LEN = 0x10; - - -FileFuncImpl::FileFuncImpl() -{ - type=UNKNOWN; -} - -FileFuncImpl::FileFuncImpl(const char * fname, fileType mode) -{ - type=UNKNOWN; - - if (!readOpen(fname,mode)) - type=FILE_ERROR; -} - -FileFuncImpl::~FileFuncImpl() -{ -} - -int FileFuncImpl::readOpen(const char * fname, fileType mode) -{ - file.open((const char *)fname,ios::in); - - if (!file.is_open()) - return -1; - - if (detectFileType() != 0) // format detection was ok - return -2; - - if (mode != UNKNOWN) // AUTO detection OK - { - if (mode != type) // no AUTO detection, format is the expected one? - { - type = UNKNOWN; - return -2; - } - } - - file.open((const char *)fname,ios::in); - file.seekg(ios_base::beg); - - if ((type==UNKNOWN)||(type==FILE_ERROR)) - return -2; - - if (type==TI_TXT) - return readTiFile(); - - if (type==INTEL_HEX) - return readIntelFile(); - - return 0; -} - -void FileFuncImpl::close(void) -{ - file.close(); -} - -void FileFuncImpl::trimWhitespace(string& str) -{ - const string whitespaces(" \t\n\r"); - size_t start = str.find_first_not_of(whitespaces); - size_t end = str.find_last_not_of(whitespaces); - - if ( start == string::npos || end == string::npos ) - str.clear(); - - else - str = str.substr(start, end - start + 1); -} - -fileType FileFuncImpl::getFileType(void) -{ - return type; -} - -int FileFuncImpl::detectFileType() -{ - type=UNKNOWN; - - if (!file.is_open()) - return -1; - - while (!file.eof()) - { - // read a line from file - string line; - getline(file, line); - - trimWhitespace(line); - - // ignore empty lines - if (!line.empty()) - { - file.close(); - if (line[0] == '@') - { - type = TI_TXT; - return 0; - } - if (line[0] == ':') - { - type = INTEL_HEX; - return 0; - } - } - } - file.close(); - return -1; // Could not open file. -} - -//-- GetAddress --------------------------------------------------------------- -// GetAddress converts an address tag "@xxxx" -// Arguments: char* Record (the line from the file) -// LONG* wAddress (receives the address) -// Result: BOOL (TRUE if ok, otherwise FALSE) - -bool FileFuncImpl::getTiFileAddress(const string& record, uint32_t * address) -{ - // max. 6 chars (including '@') - if (record.length() > 6) - return false; - - stringstream stream(record.substr(1, string::npos)); - uint32_t ulAddress = 0xffffffff; - stream >> hex >> ulAddress; - - // check for conversion error: - if (stream.fail()) - return false; - - *address = ulAddress; - return true; -} - -//-- GetBytes ----------------------------------------------------------------- -// GetBytes converts a line from the file into bytes -// Arguments: const string& Record (the line from the file) -// WORD* ByteCnt (receives the number of values stored) -// Result: bool (true if line is ok, otherwise false) - -bool FileFuncImpl::getTiFileBytes(const string& Record, uint32_t* ByteCnt) -{ - stringstream stream(Record); - int numBytes = 0; - while(!stream.eof()) - { - uint32_t byte = 0xffffffff; - stream >> hex >> byte; - - if (stream.fail() || byte > 255 || ++numBytes > 16) - return false; - - segment.data.push_back(byte); - *ByteCnt = (uint32_t)segment.data.size(); - } - return true; -} - -int FileFuncImpl::readTiFile() -{ - uint32_t StartAddress=0; - - bool HaveAddress = false; - bool LastRecordWasEOF = false; - - if (!file.is_open()) - return -1; - - segments.clear(); - - segment.size = 0; - segment.startAddress = 0; - segment.data.clear(); - - while (!file.eof()) - { - // read a line from file - string line; - getline(file, line); - trimWhitespace(line); - - if (!line.empty()) - { - if (line == "q" || line == "Q") // "q" or "Q" indicates EOF. - { - LastRecordWasEOF = true; - if (HaveAddress) - { - addSegment(); - segment.startAddress=StartAddress; - } - } - else - { - LastRecordWasEOF = false; - - if (line[0] == '@') // Record is possibly an address. - { - if (!getTiFileAddress(line, &StartAddress)) // copy to buffer - { - break; // Invalid address. - } - - if (HaveAddress) // Flush the current data. - { - addSegment(); - } - HaveAddress = true; // following data starts on this address - segment.startAddress=StartAddress; // save given start address - } - else - { - if (!getTiFileBytes(line, &segment.size)) - { - break; // Invalid data. - } - } - } // if (record[0] == '@') - } // if (strlen(record) != 0) - - } // while(true) - file.close(); - - return LastRecordWasEOF ? 0 : -4; -} - -void FileFuncImpl::addSegment() -{ - if (!segment.data.empty()) - segments.push_back(segment); - - segment.data.clear(); - segment.size = 0; - segment.startAddress = 0; -} - -bool FileFuncImpl::gotoIntelRecordStart() -{ - while (!file.eof()) - { - char character = '\0'; - file >> character; - if (character == ':') - return true; - } - return false; -} - -namespace // Intel Hex specific functions -{ - struct IntelHeader - { - uint8_t size; - uint16_t address; - uint8_t type; - }; - - template - T readHexFromStream(istream& stream, T* value) - { - const int numCharacters = 2 * sizeof(T); - char byteString[numCharacters]; - stream.read(byteString, numCharacters); - - stringstream conv( string(byteString, numCharacters) ); - unsigned int tmp = 0; - conv >> hex >> tmp; - return *value = static_cast(tmp); - } - - IntelHeader readIntelHeader(istream& file) - { - IntelHeader header; - readHexFromStream(file, &header.size); - readHexFromStream(file, &header.address); - readHexFromStream(file, &header.type); - return header; - } - - //Check CRC - bool checkIntelCRC(const string& line, uint8_t crc) - { - uint8_t actualCRC = 0; - size_t bytesInLine = line.size()/2 - 1; - - stringstream crcStream(line); - - for (size_t i = 0; i < bytesInLine; ++i) - { - uint8_t byte = readHexFromStream(crcStream, &byte); - actualCRC += byte; - } - - actualCRC = ~actualCRC + 1; - return (actualCRC == crc); - } - - void writeIntelRecord(ostream& stream, uint8_t size, uint16_t address, uint8_t type, uint32_t* data) - { - stream << hex << setfill('0'); - stream << ':' << setw(2) << (int)size << setw(4) << address << setw(2) << (int)type; - uint8_t crc = size + (address & 0xFF) + (address >> 8) + type; - - for (int i = 0; i < size; ++i) - { - stream << setw(2) << (int)data[i]; - crc += data[i]; - } - crc = ~crc + 1; - - stream << (int)crc << '\n'; - } - - void writeIntelSegment(ostream& stream, uint32_t* data, uint32_t address32, size_t size) - { - if (data == 0 || size == 0) - return; - - uint32_t addressOffset = 0; - - while (size > 0) - { - uint8_t crc = 0; - if (address32 - addressOffset > 0xFFFFF) //32bit offset - { - addressOffset = (address32 & 0xFFFF0000); - uint32_t offset[2] = {(addressOffset >> 16) & 0xFF, (addressOffset >> 24)}; - writeIntelRecord(stream, 2, 0, 4, offset); - } - else if (address32 - addressOffset > 0xFFFF) //20bit offset - { - addressOffset = (address32 & 0xFFFF0); - uint32_t offset[2] = {(addressOffset >> 4) & 0xFF, (addressOffset >> 12) & 0xFF}; - writeIntelRecord(stream, 2, 0, 2, offset); - } - - const uint16_t address16 = static_cast(address32 - addressOffset); - uint8_t toWrite = static_cast( min(size, INTEL_HEX_LINE_DATA_LEN) ); - - const size_t align = address16 % INTEL_HEX_LINE_DATA_LEN; - if (align > 0) - toWrite = static_cast( min(size, INTEL_HEX_LINE_DATA_LEN - align) ); - - writeIntelRecord(stream, toWrite, address16, 0, data); - - address32 += toWrite; - data += toWrite; - size -= toWrite; - } - writeIntelRecord(stream, 0, 0, 1, 0); - } -} - - -int FileFuncImpl::readIntelFile() -{ - //Size Address Type Data CRC - //:10 0100 00 214601360121470136007EFE09D21901 40 - - bool firstData = true; - bool eofFound = false; - - string line; - - uint32_t addressOffset = 0; - - while (!file.eof() && !eofFound) - { - if (!gotoIntelRecordStart()) - return -3; - - uint16_t offset = 0; - - getline(file, line); - stringstream stream(line); - - IntelHeader header = readIntelHeader(stream); - - switch (header.type) - { - case 0: //Regular data - readIntelData(stream, header.size, addressOffset + header.address, firstData); - firstData = false; - break; - - case 1: //EOF record - eofFound = true; - addSegment(); - break; - - case 2: //Extended address (20bit) - readHexFromStream(stream, &offset); - addressOffset = (uint32_t)offset << 4; - break; - - case 3: //Only for x86 architecture, skip line - continue; - - case 4: //Extended address (32bit) - readHexFromStream(stream, &offset); - addressOffset = (uint32_t)offset << 16; - break; - - case 5: //Only for 386 architecture or higher, skip line - continue; - - default: //Unknown record type, be generous and ignore - continue; - } - - uint8_t crc = 0; - readHexFromStream(stream, &crc); - - if (!checkIntelCRC(line, crc)) - return -1; - } - return 0; -} - -void FileFuncImpl::readIntelData(istream& stream, uint8_t size, uint32_t address, bool firstData) -{ - const bool newSegment = firstData || (address != segment.startAddress + segment.size); - - if (newSegment && !firstData) - addSegment(); - - if (newSegment) - segment.startAddress = address; - - for (int i = 0; i < size; ++i) - { - uint8_t byte = readHexFromStream(stream, &byte); - segment.data.push_back(byte); - ++segment.size; - } -} - -bool FileFuncImpl::readFirmware(const char * fname) -{ - return readOpen(fname, TI_TXT) == 0; -} - -bool FileFuncImpl::readFirmware(const uint16_t* data, const uint32_t* address, - const uint32_t* length, uint32_t sections) -{ - for (uint32_t i = 0; i < sections; ++i) - { - segment.data.clear(); - segment.size = 2 * length[i]; - segment.startAddress = address[i]; - - for (uint32_t word = 0; word < length[i]; ++word, ++data) - { - segment.data.push_back((uint8_t)(*data & 0xFF)); - segment.data.push_back((uint8_t)(*data >> 8)); - } - addSegment(); - } - return true; -} - -bool FileFuncImpl::readFirmware(const unsigned char * i_data, size_t i_size) -{ - i_data+=6; - i_size-=6; - while(i_size>0) - { - uint32_t s_addr=i_data[0]+(((uint32_t)i_data[1])<<8)+(((uint32_t)i_data[2])<<16)+(((uint32_t)i_data[3])<<24); - uint32_t s_size=i_data[4]+(((uint32_t)i_data[5])<<8)+(((uint32_t)i_data[6])<<16)+(((uint32_t)i_data[7])<<24); - i_data+=8; - i_size-=8; - segment.size=s_size; - segment.startAddress=s_addr; - - if(i_sizeaddSegment(); - i_data+=s_size; - i_size-=s_size; - } - return true; -} - -size_t FileFuncImpl::getNumberOfSegments() const -{ - return segments.size(); -} - -bool FileFuncImpl::printSeg(const char * fname, uint32_t * buffer, uint32_t start, size_t n, fileType type) -{ - ofstream filestr(fname); - if(!filestr.is_open()) - return false; - - int count = (int)n; - int i; - - switch (type) - { - case INTEL_HEX: - writeIntelSegment(filestr, buffer, start, n); - break; - - case TI_TXT: - // print first line with address - filestr << '@' << setw(4) << hex << setfill ('0') << uppercase << (uint32_t)start << '\n'; - while (count > 0) - { - int bytesInLine = min(count, 16); - for (i = 0; i < bytesInLine; ++i) - { - filestr << setw(2) << hex << setfill ('0') << uppercase << (uint16_t)buffer[i]; - if (i != bytesInLine-1) - filestr << ' '; - } - filestr << '\n'; // line finished - count -= 16; - buffer += 16; - } - // all data written, set 'q' as end sign - filestr << 'q' << '\n'; - break; - - default: - filestr.close(); - return false; - } - filestr.close(); - return true; -} - -void FileFuncImpl::printSegs() -{ - for(size_t i=0;igetMemoryManager(); - - if (mm == NULL) // identifyDevice not called? - return false; - - for (size_t i = 0; i < segments.size(); ++i) - { - if (!segments[i].data.empty()) - { - if((!mm->write(segments[i].startAddress, - &segments[i].data[0], - segments[i].size))) - { - return false; //adr,buf,count - } - } - } - if(!mm->sync()) - return false; - - return true; -} - -bool FileFuncImpl::verify(uint32_t address, uint32_t* buffer, size_t count) -{ - return false; -} - -bool FileFuncImpl::verifySegs(DeviceHandle * device, bool intern) -{ - if (device == NULL) - return false; - - MemoryManager * mm = device->getMemoryManager(); - - if (mm == NULL) - return false; - - if (!intern) - { - for (size_t i = 0; i < segments.size(); ++i) - { - if (!mm->verify(segments[i].startAddress, &segments[i].data[0], segments[i].size)) - { - return false; - } - } - } - return true; -} - -const DownloadSegment* FileFuncImpl::getFirmwareSeg(size_t index) const -{ - if (index >= segments.size()) - return NULL; - - return &(segments[index]); -} diff --git a/DLL430_v3/src/TI/DLL430/FileFuncImpl.h b/DLL430_v3/src/TI/DLL430/FileFuncImpl.h deleted file mode 100644 index 466879b..0000000 --- a/DLL430_v3/src/TI/DLL430/FileFuncImpl.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * FileFuncImpl.h - * - * File access for code image files. - * - * Copyright (C) 2008 - 2011 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. - */ - -#include -#include - -#include -#include - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_FileFuncImpl_H -#define DLL430_FileFuncImpl_H - -#include - -#define WORD uint16_t - -using namespace std; - -#define MAX_LINE_SIZE 1024 - -namespace TI -{ - namespace DLL430 - { - class DeviceHandle; - - struct DownloadSegment - { - std::vector data; - uint32_t startAddress; - uint32_t size; - - DownloadSegment() : startAddress(0), size(0) {} - }; - - class FileFuncImpl : FileFunc - { - public: - FileFuncImpl(); - - /** \brief constructor - * - * \param fname file name - * \param mode expected file mode ti-txt/intel - * \return true if successful, else false - */ - FileFuncImpl(const char * fname, fileType mode); - - /** \brief destructor - */ - ~FileFuncImpl(); - - /** \brief open - * - * open given file, test format and read it - * - * \param fname file name - * \param mode expected file mode ti-txt/intel - * \return true if reading was successful, else false - */ - int readOpen(const char * fname, fileType mode); - - /** \brief close - * - * close file - * - */ - void close(void); - - /** \brief test file type - * - * read first bytes to detect the file type - * - * \return file type ti-txt or intel-hex - */ - fileType getFileType(); - - /** \brief read ti file - * - * read the file as ti-txt-file and copy data to internal buffer - * - * \return true if reading was successful, else false - */ - int readTiFile(); - - /** \brief read intel hex file - * - * read the file as intel-hex-file and copy data to internal buffer - * - * \return true if reading was successful, else false - */ - - int readIntelFile(); - - bool readFirmware(const char * fname); - - bool readFirmware(const unsigned char * data, size_t size); - - bool readFirmware(const uint16_t* data, const uint32_t* address, - const uint32_t* length, uint32_t sections); - - size_t getNumberOfSegments() const; - - /** \brief print data segements to stdout - * - * \param fname file name - * \param buffer of values to write - * \param number of elements in buffer - * \param mode expected file mode ti-txt/intel - * \return true if write was successful, else false - */ - bool printSeg(const char * fname, uint32_t * buffer, uint32_t start, size_t n, fileType type); - - /** \brief print data segements to stdout - * - */ - void printSegs(); - - /** \brief write segments - * - * write segment information to device - * - * \return 0 if reading was successful, else -1 - */ - bool writeSegs(DeviceHandle * device); - - /** \brief verify segments - * - * activate verification on device - * - * \return 0 if reading was successful, else -1 - */ - bool verifySegs(DeviceHandle * device, bool intern); - - bool verify(uint32_t address, uint32_t* buffer, size_t count); - - const DownloadSegment* getFirmwareSeg(size_t index) const; - - private: - ifstream file; - fileType type; - - vector segments; - DownloadSegment segment; - - int detectFileType(); - void addSegment(); - - void trimWhitespace(string& str); - bool getTiFileAddress(const string& record, uint32_t* address); - bool getTiFileBytes(const string& Record, uint32_t* ByteCnt); - - bool gotoIntelRecordStart(); - void readIntelData(istream& stream, uint8_t size, uint32_t address, bool firstData); - }; - } -} - -#endif //DLL430_FileFuncImpl_H diff --git a/DLL430_v3/src/TI/DLL430/FileReader.cpp b/DLL430_v3/src/TI/DLL430/FileReader.cpp new file mode 100644 index 0000000..b5769e9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileReader.cpp @@ -0,0 +1,63 @@ +/* + * FileReader.cpp + * + * File reader interface class + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "FileReader.h" +#include "FileReaderTI.h" +#include "FileReaderIntel.h" + +#include "EM/Exceptions/Exceptions.h" + + +using namespace TI::DLL430; +using namespace std; + + +FileReaderPtr FileReader::create(const char* filename) +{ + if (!ifstream(filename)) + throw DLL430_FileOpenException(); + + if (FileReaderTI::fileIsTiTxt(filename)) + return std::make_shared(filename); + + else if (FileReaderIntel::fileIsIntelHex(filename)) + return std::make_shared(filename); + + throw DLL430_Exception(FILE_DETECT_ERR, "Unknown file type"); +} diff --git a/DLL430_v3/src/TI/DLL430/FileReader.h b/DLL430_v3/src/TI/DLL430/FileReader.h new file mode 100644 index 0000000..66a0d1b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileReader.h @@ -0,0 +1,57 @@ +/* + * FileReader.h + * + * File reader interface class + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + +namespace TI +{ + namespace DLL430 + { + class FileReader; + class MemoryContent; + + typedef std::shared_ptr FileReaderPtr; + + class FileReader + { + public: + static FileReaderPtr create(const char* filename); + + virtual void read(MemoryContent* dst) = 0; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileReaderIntel.cpp b/DLL430_v3/src/TI/DLL430/FileReaderIntel.cpp new file mode 100644 index 0000000..1526a40 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileReaderIntel.cpp @@ -0,0 +1,194 @@ +/* + * FileReaderIntel.cpp + * + * File reader for Intel hex files + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "FileReaderIntel.h" +#include "MemoryContent.h" +#include "EM/Exceptions/Exceptions.h" + + +using namespace TI::DLL430; +using namespace std; + + +bool FileReaderIntel::fileIsIntelHex(const char* filename) +{ + string firstWord; + ifstream(filename) >> firstWord; + + return !firstWord.empty() && (firstWord[0] == ':'); +} + + +FileReaderIntel::FileReaderIntel(const char* filename) : filename(filename) {} + +template +T readHexFromStream(istream& stream, T* value) +{ + const int numCharacters = 2 * sizeof(T); + char byteString[numCharacters]; + stream.read(byteString, numCharacters); + + if (stream.fail()) + throw DLL430_Exception(INTEL_HEX_CODE_ERR, "Incomplete value in data record"); + + stringstream conv( string(byteString, numCharacters) ); + uint64_t tmp = 0; + conv >> hex >> tmp; + + if (conv.fail() || !conv.eof()) + throw DLL430_Exception(INTEL_HEX_CODE_ERR, "Error in data record"); + + return *value = static_cast(tmp); +} + +FileReaderIntel::IntelHeader FileReaderIntel::readIntelHeader(istream& stream) +{ + IntelHeader header; + readHexFromStream(stream, &header.size); + readHexFromStream(stream, &header.address); + readHexFromStream(stream, &header.type); + return header; +} + +bool FileReaderIntel::checkIntelCRC(const string& line, uint8_t crc) +{ + uint8_t actualCRC = 0; + const int bytesInLine = static_cast(line.size() / 2 - 1); + + stringstream crcStream(line); + + for (int i = 0; i < bytesInLine; ++i) + { + uint8_t byte = readHexFromStream(crcStream, &byte); + actualCRC += byte; + } + + actualCRC = ~actualCRC + 1; + return (actualCRC == crc); +} + +void FileReaderIntel::readIntelData(istream& stream, uint8_t size, DataSegment* segment) +{ + for (int i = 0; i < size; ++i) + { + uint8_t byte = readHexFromStream(stream, &byte); + segment->data.push_back(byte); + } +} + +void FileReaderIntel::read(MemoryContent* data) +{ + //Size Address Type Data CRC + //:10 0100 00 214601360121470136007EFE09D21901 40 + ifstream file(filename); + if (!file.is_open()) + throw DLL430_FileOpenException(); + + DataSegment segment; + uint32_t addressOffset = 0; + bool done = false; + string line; + + while (getline(file, line)) + { + if (line.empty() || line[0] != ':') + throw DLL430_Exception(INTEL_HEX_CODE_ERR, "Line not starting with ':'"); + + if (done) + throw DLL430_Exception(FILE_END_ERR, "Content after EOF marker"); + + line.erase(0, 1); + + uint16_t offset = 0; + + stringstream stream(line); + + IntelHeader header = readIntelHeader(stream); + + switch (header.type) + { + case 0: //Regular data + if ((addressOffset + header.address) != (segment.startAddress + segment.data.size())) + { + if (!segment.data.empty()) + { + data->segments.push_back(segment); + } + segment = DataSegment(addressOffset + header.address); + } + readIntelData(stream, header.size, &segment); + break; + + case 1: //EOF record + done = true; + if (!segment.data.empty()) + { + data->segments.push_back(segment); + } + break; + + case 2: //Extended address (20bit) + readHexFromStream(stream, &offset); + addressOffset = (uint32_t)offset << 4; + break; + + case 3: //Only for x86 architecture, skip line + continue; + + case 4: //Extended address (32bit) + readHexFromStream(stream, &offset); + addressOffset = (uint32_t)offset << 16; + break; + + case 5: //Only for 386 architecture or higher, skip line + continue; + + default: //Unknown record type, be generous and ignore + continue; + } + + uint8_t crc = 0; + readHexFromStream(stream, &crc); + + if (!checkIntelCRC(line, crc)) + throw DLL430_Exception(INTEL_HEX_CODE_ERR, "CRC error"); + } + if (!done) + throw DLL430_Exception(FILE_END_ERR, "No EOF record"); +} diff --git a/DLL430_v3/src/TI/DLL430/FileReaderIntel.h b/DLL430_v3/src/TI/DLL430/FileReaderIntel.h new file mode 100644 index 0000000..f23a076 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileReaderIntel.h @@ -0,0 +1,72 @@ +/* + * FileReaderIntel.h + * + * File reader for Intel hex files + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + +#include "FileReader.h" + +namespace TI +{ + namespace DLL430 + { + struct DataSegment; + + class FileReaderIntel : public FileReader + { + public: + explicit FileReaderIntel(const char* filename); + virtual void read(MemoryContent* dst); + + static bool fileIsIntelHex(const char* filename); + + private: + struct IntelHeader + { + uint8_t size; + uint16_t address; + uint8_t type; + }; + + IntelHeader readIntelHeader(std::istream& stream); + bool checkIntelCRC(const std::string& line, uint8_t crc); + void readIntelData(std::istream& stream, uint8_t size, DataSegment* segment); + void readIntelFile(const char* filename, MemoryContent* data); + + const std::string filename; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileReaderTI.cpp b/DLL430_v3/src/TI/DLL430/FileReaderTI.cpp new file mode 100644 index 0000000..095631c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileReaderTI.cpp @@ -0,0 +1,139 @@ +/* + * FileReaderTI.cpp + * + * File reader for TI txt files + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "FileReaderTI.h" +#include "MemoryContent.h" +#include "EM/Exceptions/Exceptions.h" + + +using namespace TI::DLL430; +using namespace std; + + +bool FileReaderTI::fileIsTiTxt(const char* filename) +{ + string firstWord; + ifstream(filename) >> firstWord; + + return !firstWord.empty() && (firstWord[0] == '@'); +} + + +FileReaderTI::FileReaderTI(const char* filename) : filename(filename) {} + + +void FileReaderTI::read(MemoryContent* data) +{ + ifstream file(filename); + if (!file.is_open()) + throw DLL430_FileOpenException(); + + DataSegment segment; + + bool done = false; + string line; + while (getline(file, line)) + { + // trim leading whitespace + const string whitespaces(" \t\n\r"); + line.erase(0, line.find_first_not_of(whitespaces)); + + if (!line.empty()) + { + if (done) + throw DLL430_Exception(FILE_END_ERR, "Content after EOF marker"); + + done = (line[0] == 'q' || line[0] == 'Q'); + + if (done || line[0] == '@') + { + if (!segment.data.empty()) + { + data->segments.push_back(segment); + } + + if (line[0] == '@') + { + segment = DataSegment(getTiFileAddress(line)); + } + } + else + { + getTiFileBytes(line, &segment.data); + } + } + } + + if (!done) + throw DLL430_Exception(FILE_END_ERR, "No EOF marker"); +} + + +uint32_t FileReaderTI::getTiFileAddress(const string& line) +{ + stringstream stream(line.substr(1)); + + uint32_t address = 0; + stream >> hex >> address; + if (stream.fail() || address > 0xFFFFFFFF) + throw DLL430_Exception(FILE_DATA_ERR, "Invalid address"); + + return address; +} + + +void FileReaderTI::getTiFileBytes(const string& line, vector* buffer) +{ + stringstream stream(line); + int numBytes = 0; + + uint32_t tmp = 0; + while (stream >> hex >> tmp) + { + const uint8_t byte = (tmp & 0xFF); + + if (++numBytes > 16) + throw DLL430_Exception(FILE_DATA_ERR, "Over 16 bytes in line"); + + buffer->push_back(byte); + } + + if (stream.fail() && !stream.eof()) + throw DLL430_Exception(FILE_DATA_ERR, "Invalid data"); +} diff --git a/DLL430_v3/src/TI/DLL430/FileReaderTI.h b/DLL430_v3/src/TI/DLL430/FileReaderTI.h new file mode 100644 index 0000000..38aa6eb --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileReaderTI.h @@ -0,0 +1,61 @@ +/* + * FileReaderTI.h + * + * File reader for TI txt files + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + +#include "FileReader.h" + +namespace TI +{ + namespace DLL430 + { + class FileReaderTI : public FileReader + { + public: + explicit FileReaderTI(const char* filename); + virtual void read(MemoryContent* dst); + + static bool fileIsTiTxt(const char* filename); + + private: + uint32_t getTiFileAddress(const std::string& line); + void getTiFileBytes(const std::string& line, std::vector* buffer); + + const std::string filename; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileWriter.cpp b/DLL430_v3/src/TI/DLL430/FileWriter.cpp new file mode 100644 index 0000000..49ce37f --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileWriter.cpp @@ -0,0 +1,62 @@ +/* + * FileWriter.cpp + * + * File writer interface class + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "FileWriter.h" +#include "FileWriterTI.h" +#include "FileWriterIntel.h" + +#include "EM/Exceptions/Exceptions.h" + + +using namespace TI::DLL430; +using namespace std; + + +FileWriterPtr FileWriter::create(const char* filename, FileType type) +{ + switch (type) + { + case TI_TXT: + return std::make_shared(filename); + case INTEL_HEX: + return std::make_shared(filename); + default: + throw DLL430_Exception(PARAMETER_ERR, "Invalid file type"); + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileWriter.h b/DLL430_v3/src/TI/DLL430/FileWriter.h new file mode 100644 index 0000000..016fa65 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileWriter.h @@ -0,0 +1,60 @@ +/* + * FileWriter.h + * + * File writer interface class + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + + +namespace TI +{ + namespace DLL430 + { + class FileWriter; + class MemoryContent; + + typedef std::shared_ptr FileWriterPtr; + + enum FileType { TI_TXT, INTEL_HEX }; + + class FileWriter + { + public: + static FileWriterPtr create(const char* filename, FileType type); + + virtual void write(const MemoryContent& src) = 0; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileWriterIntel.cpp b/DLL430_v3/src/TI/DLL430/FileWriterIntel.cpp new file mode 100644 index 0000000..572336d --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileWriterIntel.cpp @@ -0,0 +1,127 @@ +/* + * FileWriterIntel.cpp + * + * File writer for Intel hex files + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "FileWriterIntel.h" +#include "MemoryContent.h" +#include "EM/Exceptions/Exceptions.h" + + +using namespace TI::DLL430; +using namespace std; + + +FileWriterIntel::FileWriterIntel(const char* filename) + : file(filename) +{ + if (!file) + throw DLL430_FileOpenException(); +} + + +void FileWriterIntel::write(const MemoryContent& src) +{ + for (const DataSegment& seg : src.segments) + { + writeSegment(seg); + } + writeRecord(0, 0, 1, 0); +} + + +void FileWriterIntel::writeSegment(const DataSegment& segment) +{ + static const size_t INTEL_HEX_LINE_DATA_LEN = 0x10; + + uint32_t addressOffset = 0; + + uint32_t address32 = segment.startAddress; + size_t size = segment.data.size(); + size_t offset = 0; + + while (size > 0) + { + if (address32 - addressOffset > 0xFFFFF) //32bit offset + { + addressOffset = (address32 & 0xFFFF0000); + uint8_t offset[2] = { static_cast(addressOffset >> 24), static_cast(addressOffset >> 16) }; + writeRecord(2, 0, 4, offset); + } + else if (address32 - addressOffset > 0xFFFF) //20bit offset + { + addressOffset = (address32 & 0xFFFF0); + uint8_t offset[2] = { static_cast(addressOffset >> 12), static_cast(addressOffset >> 4) }; + writeRecord(2, 0, 2, offset); + } + + const uint16_t address16 = static_cast(address32 - addressOffset); + + uint8_t toWrite = static_cast( min(size, INTEL_HEX_LINE_DATA_LEN) ); + + const size_t align = address16 % INTEL_HEX_LINE_DATA_LEN; + if (align > 0) + toWrite = static_cast( min(size, INTEL_HEX_LINE_DATA_LEN - align) ); + + writeRecord(toWrite, address16, 0, &segment.data[offset]); + + address32 += toWrite; + offset += toWrite; + size -= toWrite; + } +} + + +void FileWriterIntel::writeRecord(uint8_t size, uint16_t address, uint8_t type, const uint8_t* data) +{ + file << hex << setfill('0') << uppercase; + file << ':' << setw(2) << (uint32_t)size << setw(4) << address << setw(2) << (int)type; + + uint8_t crc = size + (address & 0xFF) + (address >> 8) + type; + + if (data) + { + for (uint32_t i = 0; i < size; ++i) + { + file << setw(2) << (uint32_t)data[i]; + crc += data[i]; + } + } + crc = ~crc + 1; + + file << setw(2) << (uint32_t)crc << '\n'; +} diff --git a/DLL430_v3/src/TI/DLL430/FileWriterIntel.h b/DLL430_v3/src/TI/DLL430/FileWriterIntel.h new file mode 100644 index 0000000..92f1d1e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileWriterIntel.h @@ -0,0 +1,62 @@ +/* + * FileWriterIntel.h + * + * File writer for Intel hex files + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + + +#include "FileWriter.h" + +namespace TI +{ + namespace DLL430 + { + struct DataSegment; + + class FileWriterIntel : public FileWriter + { + public: + explicit FileWriterIntel(const char* filename); + virtual void write(const MemoryContent& src); + + private: + void writeRecord(uint8_t size, uint16_t address, uint8_t type, const uint8_t* data); + void writeSegment(const DataSegment& segment); + + std::ofstream file; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileWriterTI.cpp b/DLL430_v3/src/TI/DLL430/FileWriterTI.cpp new file mode 100644 index 0000000..60e69ba --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileWriterTI.cpp @@ -0,0 +1,81 @@ +/* + * FileWriterTI.cpp + * + * File writer for TI txt files + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "FileWriterTI.h" +#include "MemoryContent.h" +#include "EM/Exceptions/Exceptions.h" + + +using namespace TI::DLL430; +using namespace std; + + +FileWriterTI::FileWriterTI(const char* filename) + : file(filename) +{ + if (!file) + throw DLL430_FileOpenException(); +} + + +void FileWriterTI::write(const MemoryContent& src) +{ + for (const DataSegment& seg : src.segments) + { + writeTiSegment(seg); + } + file << "q\n"; +} + + +void FileWriterTI::writeTiSegment(const DataSegment& segment) +{ + file << '@' << setw(4) << hex << setfill ('0') << uppercase << segment.startAddress << '\n'; + + if (!segment.data.empty()) + { + size_t numBytes = 0; + for (uint8_t byte : segment.data) + { + file << setw(2) << hex << setfill ('0') << uppercase << (uint32_t)byte; + size_t numInLine = (++numBytes % 16); + file << (numInLine == 0 || numBytes >= segment.data.size() ? '\n' : ' '); + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/FileWriterTI.h b/DLL430_v3/src/TI/DLL430/FileWriterTI.h new file mode 100644 index 0000000..8f6e05e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FileWriterTI.h @@ -0,0 +1,61 @@ +/* + * FileWriterTI.h + * + * File writer for TI txt files + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + +#include "FileReader.h" +#include "FileWriter.h" + +namespace TI +{ + namespace DLL430 + { + struct DataSegment; + + class FileWriterTI : public FileWriter + { + public: + explicit FileWriterTI(const char* filename); + virtual void write(const MemoryContent& src); + + private: + void writeTiSegment(const DataSegment& segment); + + std::ofstream file; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.cpp b/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.cpp index f462fd0..73bb54b 100644 --- a/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.cpp +++ b/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.cpp @@ -3,106 +3,149 @@ * * Memory class for accessing flash memory. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "FlashMemoryAccessBase.h" #include "HalExecCommand.h" -#include "DeviceHandleV3.h" -#include "FetHandleV3.h" +#include "IDeviceHandle.h" +#include "FetHandle.h" #include "ClockCalibration.h" +#include "CpuRegisters.h" +#include "warnings/Warnings.h" + using namespace TI::DLL430; -using boost::bind; -using boost::shared_ptr; +using namespace std; FlashMemoryAccessBase::FlashMemoryAccessBase ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, - const bool isProtected, - MemoryManager* mm, - uint8_t psa + const bool isProtected, + IMemoryManager* mm, + uint8_t psa ) - : MemoryAreaBase(name,devHandle,start,end,seg,banks,mapped, isProtected, psa) - , mm(mm), funcletToUpload(FuncletCode::NONE) + : MainMemoryAccessBase(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) + , funcletToUpload(FuncletCode::NONE) { } -FlashMemoryAccessBase::~FlashMemoryAccessBase () -{ -} -bool FlashMemoryAccessBase::erase (uint32_t start, uint32_t end, uint32_t block_size, int type) +bool FlashMemoryAccessBase::erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock) { - using boost::shared_ptr; - using boost::bind; - - if((type != ERASE_SEGMENT)&&(type != ERASE_MAIN)) + // check if valid erase type is used + if ((type != ERASE_SEGMENT) && (type != ERASE_MAIN)) + { return false; - - if(block_size<1) + } + if (block_size < 1 || !mm) + { return false; + } - MemoryArea* ram = mm->getMemoryArea("system", 0); + // get Device RAM parameters for funclet upload + MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram, 0); if (!ram) + { return false; + } if ( !mm->checkMinFlashVoltage() ) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_WARNING, WarningCode::WARNING_FLASH_VCC); return false; + } ClockCalibration* calibration = devHandle->getClockCalibration(); if ( !calibration->backupSettings() ) + { return false; + } - shared_ptr restoreFrequencyExit(static_cast(0), + shared_ptr restoreFrequencyExit(static_cast(0), bind(&ClockCalibration::restoreSettings, calibration)); if ( !calibration->determineSettings() ) + { return false; + } if ( !calibration->makeSettings() ) + { return false; + } + + if (getFlags() & LOCK_INFO_A_FLAG) + { + if (!backupInfo()) + { + return false; + } + } if ( !uploadFunclet(FuncletCode::ERASE) ) + { return false; + } + + shared_ptr restoreRamOnExit(static_cast(0), + bind(&FlashMemoryAccessBase::restoreRam, this)); + + if (mm) + { + /* FLASH31 workaround */ + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + { + return false; + } + cpu->fillCache(2, 1); + + uint32_t sr = 0; + cpu->read(2, &sr, 1); - shared_ptr restoreRamOnExit(static_cast(0), - bind(&FlashMemoryAccessBase::restoreRam, this)); + // disable GIE on target + sr &= ~ (0x08); + + cpu->write(2, &sr, 1); + cpu->flushCache(); + } //Erase main in reverse, using end of bank as address (5xxx issue) //First bank is erased twice (with end and start of bank as address) @@ -125,19 +168,16 @@ bool FlashMemoryAccessBase::erase (uint32_t start, uint32_t end, uint32_t block_ const int32_t regularSegmentsStart = getStart() + smallerSegmentSize; do - { + { HalExecCommand cmd; cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd.elements.push_back(el); - + do { if (address+2 == (int32_t)start) address += 2; - el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); el->appendInputData16(static_cast(availableRam & 0xFFFF)); el->appendInputData16(programStartAddress); @@ -151,8 +191,7 @@ bool FlashMemoryAccessBase::erase (uint32_t start, uint32_t end, uint32_t block_ //Dummy data to trigger execution of erase funclet el->appendInputData32(0xDEADBEEF); - el->setOutputSize(2); - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); if (address < regularSegmentsStart) address += smallerSegmentSize; @@ -170,75 +209,96 @@ bool FlashMemoryAccessBase::erase (uint32_t start, uint32_t end, uint32_t block_ } while (!done); + if (getFlags() & LOCK_INFO_A_FLAG) + { + restoreInfo(); + } return true; } -bool FlashMemoryAccessBase::doRead (uint32_t address, uint32_t* buffer, size_t count) +bool FlashMemoryAccessBase::doOverwrite(uint32_t address, const uint8_t* data, size_t size) { - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; + const uint32_t startAddress = getStart() + address; + const uint32_t endAddress = startAddress + static_cast(size); + const uint32_t segSize = getSegmentSize(); - uint32_t pc = 0; - cpu->read(0, &pc, 1); + const uint32_t firstSegmentStart = max(getStart(), (startAddress/segSize)*segSize); + const uint32_t lastSegmentEnd = ((endAddress+segSize-1) / segSize) * segSize; - bool omitFirst = (address & 0x1); - if (omitFirst) { - --address; - ++count; - } - bool omitLast = (count & 1); - if (omitLast) { - ++count; - } + const uint32_t bufferOffset = startAddress - firstSegmentStart; + const uint32_t totalSize = lastSegmentEnd - firstSegmentStart; - const hal_id readMacro = devHandle->supportsQuickMemRead() ? - ID_ReadMemQuick : ID_ReadMemWords; + vector memBuffer(totalSize); - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - el->appendInputData32(pc); + if (startAddress > firstSegmentStart) + { + if (!doRead(firstSegmentStart - getStart(), &memBuffer[0], bufferOffset) || !sync()) + return false; + } - el->setOutputSize(count); + copy(data, data+size, memBuffer.begin() + bufferOffset); - ReadElement r(buffer, count, omitFirst, omitLast, 0); - this->readMap[this->elements.size()] = r; - this->elements.push_back(el); - return true; -} + if (endAddress < lastSegmentEnd) + { + if (!doRead(endAddress - getStart(), &memBuffer[bufferOffset + size], lastSegmentEnd - endAddress) || !sync()) + return false; + } -MemoryAreaBase::Alignment FlashMemoryAccessBase::alignData(uint32_t address, uint32_t count) const -{ - const uint32_t alignedAddress = address & 0xfffffffc; - const int frontPadding = address - alignedAddress; - const int stubble = (address + count) % 4; - const int backPadding = (4 - stubble) % 4; + if (!MainMemoryAccessBase::erase(firstSegmentStart, lastSegmentEnd)) + return false; - return Alignment(alignedAddress, frontPadding, backPadding); + if (!doWrite(firstSegmentStart - getStart(), &memBuffer[0], memBuffer.size())) + return false; + + return true; } -bool FlashMemoryAccessBase::doWrite (uint32_t address, uint32_t* buffer, size_t count) +bool FlashMemoryAccessBase::doWrite(uint32_t address, const uint8_t* buffer, size_t count) { - if (count > this->getSize()) + if (count > this->getSize() || !mm) + { return false; + } - address+=this->getStart(); + address += this->getStart(); - MemoryArea* ram=mm->getMemoryArea("system"); - if(ram==NULL) + MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram); + if (ram == nullptr) + { return false; + } - if ( !mm->checkMinFlashVoltage() ) + if (!mm->checkMinFlashVoltage()) + { + WarningFactory::instance()->message(MESSAGE_LEVEL_T::MSPDS_MESSAGE_LEVEL_WARNING, WarningCode::WARNING_FLASH_VCC); return false; + } + + if (mm) + { + /* FLASH31 workaround */ + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + { + return false; + } + cpu->fillCache(2, 1); + + uint32_t sr = 0; + cpu->read(2, &sr, 1); + + // disable GIE on target + sr &= ~(0x08); + + cpu->write(2, &sr, 1); + cpu->flushCache(); + } const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::WRITE); const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); - - Alignment alignedData = alignData(address, count); - + Alignment alignedData = alignData(address, static_cast(count)); const uint16_t flags = ( getFlags() & LOCK_INFO_A_FLAG ) ? 0xA548 : 0xA508; const size_t availableRam = min(funclet.maxPayloadSize(), ram->getSize() - funclet.codeSize()); @@ -255,110 +315,29 @@ bool FlashMemoryAccessBase::doWrite (uint32_t address, uint32_t* buffer, size_t el->appendInputData16(devHandle->getClockCalibration()->getCal1()); for (int i = 0; i < alignedData.frontPadding; ++i) + { el->appendInputData8(0xff); + } for (size_t i = 0; i < count; ++i) { - if (buffer[i] > 0xFF) - { - delete el; - return false; - } el->appendInputData8(static_cast(buffer[i])); } for (int i = 0; i < alignedData.backPadding; ++i) + { el->appendInputData8(0xff); + } - - //data length of el so far has at least 14 Bytes (see the first 5 appendInputData calls - 3x16 + 2x32) - el->setInputMinSize(14); - - this->elements.push_back(el); + this->elements.emplace_back(el); funcletToUpload = FuncletCode::WRITE; return true; } -bool FlashMemoryAccessBase::doWrite (uint32_t address, uint32_t value) -{ - return this->doWrite(address, &value, 1); -} -bool FlashMemoryAccessBase::erase (uint32_t start, uint32_t end) -{ - return(erase(start,end,this->getSegmentSize(),0)); -} - -bool FlashMemoryAccessBase::erase () -{ - uint32_t bank_size=this->getSize()/this->getBanks(); - - return(erase(this->getStart(),this->getEnd(),bank_size,1)); -} - -bool FlashMemoryAccessBase::uploadFunclet(FuncletCode::Type type) -{ - bool success = false; - - const FuncletCode& funclet = devHandle->getFunclet(type); - - funcletToUpload = FuncletCode::NONE; - - if ( !funclet.code() ) - { - success = true; - ramBackup.clear(); - } - else if ( MemoryArea* ram = mm ? mm->getMemoryArea("system", 0) : 0 ) - { - if ( funclet.codeSize() <= ram->getSize() ) - { - if ( mm->getRamPreserveMode() ) - { - const size_t backupSize = min((size_t)ram->getSize(), - funclet.codeSize() + funclet.maxPayloadSize()); - - ramBackup.resize( backupSize ); - if (!ram->read(0, &ramBackup[0], ramBackup.size()) || !ram->sync()) - return false; - } - else - ramBackup.clear(); - - const uint8_t* code = (uint8_t*)funclet.code(); - const size_t count = funclet.codeSize(); - - vector tmp(count); - for (size_t i = 0; i < count; ++i) - tmp[i] = static_cast(code[i]); - - success = ram->write(0, &tmp[0], count) && ram->sync(); - } - } - return success; -} - -void FlashMemoryAccessBase::restoreRam() -{ - if (!ramBackup.empty()) - { - if ( MemoryArea* ram = mm->getMemoryArea("system", 0) ) - { - size_t count = ramBackup.size(); - vector tmp(count); - for (size_t i = 0; i < count; ++i) - tmp[i] = ramBackup[i]; - - ram->write(0, &tmp[0], count) && ram->sync(); - } - ramBackup.clear(); - } -} - - -bool FlashMemoryAccessBase::preSync () +bool FlashMemoryAccessBase::preSync() { bool success = true; @@ -376,62 +355,50 @@ bool FlashMemoryAccessBase::preSync () success = uploadFunclet(funcletToUpload); funcletToUpload = FuncletCode::NONE; } - + return success; } -bool FlashMemoryAccessBase::postSync (const HalExecCommand& cmd) +bool FlashMemoryAccessBase::postSync(const HalExecCommand& cmd) { devHandle->getClockCalibration()->restoreSettings(); - restoreRam(); - - for (size_t i = 1; i < cmd.elements.size(); ++i) - { - ReadElement_map::iterator it = this->readMap.find(i-1); - if (it != this->readMap.end()) - { - ReadElement r = it->second; - size_t size = r.size; - if (r.omitLast) - --size; - - const HalExecElement& el = cmd.elements.at(i); - for (size_t i = 0, k = (r.omitFirst? 1: 0); k < size; ++k, ++i) - { - r.v_buffer[i] = el.getOutputAt8(k); - } - this->readMap.erase(it); - } - } - return true; + return MainMemoryAccessBase::postSync(cmd); } +MemoryAreaBase::Alignment FlashMemoryAccessBase::alignData(uint32_t address, uint32_t count) const +{ + const uint32_t alignedAddress = address & 0xfffffffc; + const int frontPadding = address - alignedAddress; + const int stubble = (address + count) % 4; + const int backPadding = (4 - stubble) % 4; + return Alignment(alignedAddress, frontPadding, backPadding); +} FlashMemoryAccess2ByteAligned::FlashMemoryAccess2ByteAligned( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, - const bool isProtected, - MemoryManager* mm, - uint8_t psa + const bool isProtected, + IMemoryManager* mm, + uint8_t psa ) -: FlashMemoryAccessBase(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) +: FlashMemoryAccessBase(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) { } MemoryAreaBase::Alignment FlashMemoryAccess2ByteAligned::alignData(uint32_t address, uint32_t count) const { - const uint32_t alignedAddress = address & 0xfffffffE; + const uint32_t alignedAddress = address & 0xfffffffe; const int frontPadding = address - alignedAddress; const int stubble = (address + count) % 2; const int backPadding = (stubble > 0) ? 1 : 0; diff --git a/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.h b/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.h index 199bb85..4d60411 100644 --- a/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.h +++ b/DLL430_v3/src/TI/DLL430/FlashMemoryAccessBase.h @@ -3,112 +3,95 @@ * * Handles access to flash memory. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FLASHMEMORYACCESSBASE_H -#define DLL430_FLASHMEMORYACCESSBASE_H -#include "MemoryAreaBase.h" -#include -#include "FuncletCode.h" +#include "MainMemoryAccessBase.h" namespace TI { namespace DLL430 { - class FlashMemoryAccessBase : public MemoryAreaBase + class FlashMemoryAccessBase : public MainMemoryAccessBase { public: - FlashMemoryAccessBase ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + FlashMemoryAccessBase( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, + IMemoryManager* mm, uint8_t psa ); - virtual ~FlashMemoryAccessBase (); - - bool doRead (uint32_t address, uint32_t* buffer , size_t count); - bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t value); - - bool erase (); - bool erase (uint32_t start, uint32_t end); + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doOverwrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; protected: - bool uploadFunclet(FuncletCode::Type type); - void restoreRam(); - virtual bool preSync (); - virtual bool postSync (const HalExecCommand&); + virtual bool preSync() OVERRIDE; + virtual bool postSync(const HalExecCommand&) OVERRIDE; virtual Alignment alignData(uint32_t address, uint32_t count) const; - MemoryManager* mm; - bool erase (uint32_t start, uint32_t end, uint32_t block_size, int type); - + virtual bool erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock = false) OVERRIDE; + private: FuncletCode::Type funcletToUpload; - std::vector ramBackup; }; + class FlashMemoryAccess2ByteAligned : public FlashMemoryAccessBase { public: FlashMemoryAccess2ByteAligned ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, + IMemoryManager* mm, uint8_t psa ); protected: - virtual Alignment alignData(uint32_t address, uint32_t count) const; + virtual Alignment alignData(uint32_t address, uint32_t count) const OVERRIDE; }; - }; -}; - -#endif /* DLL430_FLASHMEMORYACCESSBASE_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.cpp b/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.cpp index c881578..459a395 100644 --- a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.cpp +++ b/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.cpp @@ -1,474 +1,222 @@ /* - * FlashMemoryAccessBase.cpp + * FramMemoryAccessBase.cpp * - * Memory class for accessing flash memory. + * Handles access to fram memory. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #include "FramMemoryAccessBase.h" -#include "HalExecCommand.h" -#include "DeviceHandleV3.h" -#include "ConfigManagerV3.h" -#include "FetHandleV3.h" -#include "MpuFr5969.h" -#include "MpuFr5739.h" #include "ClockCalibration.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "MpuFRx.h" +#include "WriteProtection.h" -using namespace TI::DLL430; -using boost::bind; -using boost::shared_ptr; -#define RST_PIN 10 -#define STOP_DEVICE 0xA55A -#define MAIN_ERASE_MODE 0x1A1A -#define MASS_ERASE_MODE 0x1B1B -#define LONG_MAILBOX_MODE 0x11 +using namespace TI::DLL430; -template -FramMemoryAccessBase::FramMemoryAccessBase +FramMemoryAccessBase::FramMemoryAccessBase ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, - bool mapped, - const bool isProtected, - MemoryManager* mm, - uint8_t psa + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection* writeProt, + IMpu* mpu ) - : MemoryAreaBase(name,devHandle,start,end,seg,banks,mapped, isProtected, psa) - , mm(mm), funcletToUpload(FuncletCode::NONE), mpu(devHandle, mm) -{ -} -template -FramMemoryAccessBase::~FramMemoryAccessBase () +: MainMemoryAccessBase(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) +, writeProtection(writeProt) +, mpu(mpu) +, mustUnlockMpu(false) { } -template -bool FramMemoryAccessBase::erase(uint32_t start, uint32_t end, uint32_t block_size, int type) +bool FramMemoryAccessBase::doWrite(uint32_t address, const uint8_t* buffer, size_t count) { - using boost::shared_ptr; - using boost::bind; - - // check if valid erase type is used - if ((type != ERASE_ALL) && (type != ERASE_MAIN) && (type != ERASE_TOTAL)&&(type != ERASE_SEGMENT)) - { - return false; - } - if (block_size < 1) + if (count > this->getSize()) { return false; } - // get Device RAM parameters for funclet upload - MemoryArea* ram = mm->getMemoryArea("system", 0); - if (!ram) + address += this->getStart(); + + MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram); + if (ram == nullptr) { return false; } - MemoryArea* main = mm->getMemoryArea("main", 0); - if (!main) + + //32bit alignment + const uint32_t alignedAddress = address & 0xfffffffc; + const int frontPadding = address - alignedAddress; + const int stubble = (address + static_cast(count)) % 4; + const int backPadding = (4 - stubble) % 4; + + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteFramQuickXv2)); + el->appendInputData32(alignedAddress); + el->appendInputData32((static_cast(count)+frontPadding + backPadding) / 2); + + std::vector frontBuffer(frontPadding); + std::vector backBuffer(backPadding); + + if (frontPadding != 0) { - return false; + mm->read(alignedAddress, &frontBuffer[0], frontPadding); + mm->sync(); } - if ((type == ERASE_MAIN) && (main->getStart() <= start) && (main->getEnd() > start)) + if (backPadding != 0) { - HalExecCommand cmd; - cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd.elements.push_back(el); - - el = new HalExecElement(this->devHandle->checkHalId(ID_SendJtagMailboxXv2)); - el->appendInputData16(LONG_MAILBOX_MODE); // Mailbox Mode - el->appendInputData16(STOP_DEVICE); // Data 1 Mailbox - el->appendInputData16(MAIN_ERASE_MODE); // Data 2 Mailbox - el->appendInputData16(0x1); // execute por - cmd.elements.push_back(el); - - if (!this->devHandle->send(cmd)) - { - return false; - } - ConfigManager* cm = this->devHandle->getFetHandle()->getConfigManager(); - - /* assert hard RST/NMI and feed in magic pattern to stop device execution */ - /* thr RST/NMI will remove the register protection */ - if(!cm->reset(false, RST_PIN, devHandle->getJtagId())) - { - return false; - } - /* restart jtag connection and if needed feed in JTAG passowrd */ - if(cm->start() != 0x1) - { - return false; - } - if(!devHandle->reset()) - { - return false; - } + mm->read(address + static_cast(count), &backBuffer[0], backPadding); + mm->sync(); } - else if((type == ERASE_TOTAL) && (main->getStart() <= start) && (main->getEnd() > start)) - { - HalExecCommand cmd; - cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd.elements.push_back(el); - - el = new HalExecElement(this->devHandle->checkHalId(ID_SendJtagMailboxXv2)); - el->appendInputData16(LONG_MAILBOX_MODE); // Mailbox Mode - el->appendInputData16(STOP_DEVICE); // Data 1 Mailbox - el->appendInputData16(MASS_ERASE_MODE); // Data 2 Mailbox - el->appendInputData16(0x1); // execute por - cmd.elements.push_back(el); - - if (!this->devHandle->send(cmd)) - { - return false; - } - ConfigManager* cm = this->devHandle->getFetHandle()->getConfigManager(); - /* assert hard RST/NMI and feed in magic pattern to stop device execution */ - /* thr RST/NMI will remove the register protection */ - if(!cm->reset(false, RST_PIN, devHandle->getJtagId())) - { - return false; - } - /* restart jtag connection and if needed feed in JTAG passowrd */ - if(cm->start() != 0x1) - { - return false; - } - if(!devHandle->reset()) - { - return false; - } - } - else + if (!frontBuffer.empty()) { - if ((type != ERASE_SEGMENT) && (type != ERASE_MAIN)) - { - return false; - } - /* if the MPU is enabled, disable it to enable memory erase*/ - if(!mpu.readMpuSettings() || !mpu.disableMpu()) - { - return false; - } - - if (!uploadFunclet(FuncletCode::ERASE) ) - { - return false; - } - shared_ptr restoreRamOnExit(static_cast(0), - bind(&FramMemoryAccessBase::restoreRam, this)); - - //Note the erase on an FRAM device is just a dummy write with 0xFFFF to the device FRAm - int32_t erase_address = start; - - const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::ERASE); - - const uint32_t eraseType = 0; - const uint32_t eraseLength = end - start + 1; - const uint16_t flags = 0x0; - const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); - - HalExecCommand cmd; - cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd.elements.push_back(el); - - el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); - el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); - el->appendInputData16(static_cast(ram->getSize() & 0xFFFF)); - el->appendInputData16(programStartAddress); - el->appendInputData32(static_cast(erase_address)); - el->appendInputData32(eraseLength); - el->appendInputData16(eraseType); - el->appendInputData16(flags); - el->appendInputData16(devHandle->getClockCalibration()->getCal0()); - el->appendInputData16(devHandle->getClockCalibration()->getCal1()); - - //Dummy data to trigger execution of erase funclet - el->appendInputData32(0xDEADBEEF); - - // set value for return length - el->setOutputSize(2); - cmd.elements.push_back(el); - - if (!this->devHandle->send(cmd)) - { - return false; - } + el->appendInputData8(&frontBuffer[0], frontBuffer.size()); } - return true; -} -template -bool FramMemoryAccessBase::doRead (uint32_t address, uint32_t* buffer, size_t count) -{ - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; + el->appendInputData8(buffer, count); - uint32_t pc = 0; - cpu->read(0, &pc, 1); - - bool omitFirst = (address & 0x1); - if (omitFirst) + if (!backBuffer.empty()) { - --address; - ++count; + el->appendInputData8(&backBuffer[0], backBuffer.size()); } - bool omitLast = (count & 1); - if (omitLast) - { - ++count; - } - const hal_id readMacro = devHandle->supportsQuickMemRead() ? - ID_ReadMemQuick : ID_ReadMemWords; + this->elements.emplace_back(el); - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - el->appendInputData32(pc); - - el->setOutputSize(count); - - ReadElement r(buffer, count, omitFirst, omitLast, 0); - this->readMap[this->elements.size()] = r; - this->elements.push_back(el); + mustUnlockMpu = true; return true; } -template -bool FramMemoryAccessBase::doWrite (uint32_t address, uint32_t* buffer, size_t count) +bool FramMemoryAccessBase::erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock) { - if (count > this->getSize()) + // check if valid erase type is used + if ((type != ERASE_SEGMENT) && (type != ERASE_MAIN)) { return false; } - address += this->getStart(); - - MemoryArea* ram = mm->getMemoryArea("system"); - if (ram == NULL) + if (!writeProtection->disableIfEnabled()) { return false; } - - const uint16_t flags = 0; - - //32bit alignment - const uint32_t alignedAddress = address & 0xfffffffc; - const int frontPadding = address - alignedAddress; - const int stubble = (address + count) % 4; - const int backPadding = (4 - stubble) % 4; - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteFramQuickXv2)); - el->appendInputData32(alignedAddress); - el->appendInputData32( (static_cast(count) + frontPadding + backPadding)/2 ); - - vector frontBuffer(frontPadding); - vector backBuffer(backPadding); - - if(frontPadding != 0) - { - mm->read(alignedAddress, &frontBuffer[0], frontPadding); - mm->sync(); - } - - if(backPadding != 0) + // if the MPU is enabled, disable it to enable memory erase + if (!mpu->disableIfEnabled((type == ERASE_MAIN) || forceUnlock)) { - mm->read(address+count, &backBuffer[0], backPadding); - mm->sync(); + writeProtection->restore(); + return false; } - for (int i = 0; i < frontPadding; ++i) + // get Device RAM parameters for funclet upload + MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram, 0); + if (!ram) { - el->appendInputData8(frontBuffer[i]); + return false; } - for (size_t i = 0; i < count; ++i) - { - if (buffer[i] > 0xFF) - { - delete el; - return false; - } - el->appendInputData8(static_cast(buffer[i])); - } - - for (int i = 0; i < backPadding; ++i) + if (!uploadFunclet(FuncletCode::ERASE)) { - el->appendInputData8(backBuffer[i]); + return false; } - this->elements.push_back(el); + std::shared_ptr restoreRamOnExit(static_cast(0), + std::bind(&FramMemoryAccessBase::restoreRam, this)); - return true; -} + //Note the erase on an FRAM device is just a dummy write with 0xFFFF to the device FRAM + int32_t erase_address = start; -template -bool FramMemoryAccessBase::doWrite (uint32_t address, uint32_t value) -{ - return this->doWrite(address, &value, 1); -} + const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::ERASE); -template -bool FramMemoryAccessBase::erase (uint32_t start, uint32_t end) -{ - return erase(start, end, this->getSegmentSize(), 0); -} - -template -bool FramMemoryAccessBase::erase () -{ - const uint32_t bank_size = this->getSize() / this->getBanks(); + const uint32_t eraseType = 0; + const uint32_t eraseLength = end - start + 1; + const uint16_t flags = 0x0; + const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); - return erase(this->getStart(), this->getEnd(), bank_size, 1); -} + HalExecCommand cmd; + cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec -template -bool FramMemoryAccessBase::uploadFunclet(FuncletCode::Type type) -{ - bool success = false; + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); + el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); + el->appendInputData16(static_cast(ram->getSize() & 0xFFFF)); + el->appendInputData16(programStartAddress); + el->appendInputData32(static_cast(erase_address)); + el->appendInputData32(eraseLength); + el->appendInputData16(eraseType); + el->appendInputData16(flags); + el->appendInputData16(devHandle->getClockCalibration()->getCal0()); + el->appendInputData16(devHandle->getClockCalibration()->getCal1()); - const FuncletCode& funclet = devHandle->getFunclet(type); + //Dummy data to trigger execution of erase funclet + el->appendInputData32(0xDEADBEEF); - funcletToUpload = FuncletCode::NONE; + cmd.elements.emplace_back(el); - if ( !funclet.code() ) - { - success = true; - ramBackup.clear(); - } - else if ( MemoryArea* ram = mm ? mm->getMemoryArea("system", 0) : 0 ) - { - if ( funclet.codeSize() <= ram->getSize() ) - { - if ( mm && mm->getRamPreserveMode() ) - { - const size_t backupSize = min((size_t)ram->getSize(), - funclet.codeSize() + funclet.maxPayloadSize()); - - ramBackup.resize( backupSize ); - if (!ram->read(0, &ramBackup[0], ramBackup.size()) || !ram->sync()) - return false; - } - else - { - ramBackup.clear(); - } - - const uint8_t* code = (uint8_t*)funclet.code(); - const size_t count = funclet.codeSize(); - - vector tmp(count); - for (size_t i = 0; i < count; ++i) - { - tmp[i] = static_cast(code[i]); - } - success = ram->write(0, &tmp[0], count) && ram->sync(); - } - } + bool success = this->devHandle->send(cmd); + this->mpu->restore(); + this->writeProtection->restore(); return success; } -template -void FramMemoryAccessBase::restoreRam() +bool FramMemoryAccessBase::preSync() { - if (!ramBackup.empty()) + if (mustUnlockMpu) { - if ( MemoryArea* ram = mm->getMemoryArea("system", 0) ) + mustUnlockMpu = false; + if (!writeProtection->disableIfEnabled()) { - size_t count = ramBackup.size(); - vector tmp(count); - for (size_t i = 0; i < count; ++i) - tmp[i] = ramBackup[i]; - - ram->write(0, &tmp[0], count) && ram->sync(); + return false; } - } -} - -template -bool FramMemoryAccessBase::preSync () -{ - bool success = true; - - if (funcletToUpload != FuncletCode::NONE) - { - success = uploadFunclet(funcletToUpload); - funcletToUpload = FuncletCode::NONE; - } - - return success; -} - -template -bool FramMemoryAccessBase::postSync (const HalExecCommand& cmd) -{ - restoreRam(); - - for (size_t i = 1; i < cmd.elements.size(); ++i) - { - ReadElement_map::iterator it = this->readMap.find(i-1); - if (it != this->readMap.end()) + if (!mpu->disableIfEnabled(false)) { - ReadElement r = it->second; - size_t size = r.size; - if (r.omitLast) - --size; - - const HalExecElement& el = cmd.elements.at(i); - for (size_t i = 0, k = (r.omitFirst? 1: 0); k < size; ++k, ++i) - { - r.v_buffer[i] = el.getOutputAt8(k); - } - this->readMap.erase(it); + writeProtection->restore(); + return false; } } - - return true; + return MainMemoryAccessBase::preSync(); } -template class FramMemoryAccessBase; -template class FramMemoryAccessBase; +bool FramMemoryAccessBase::postSync(const HalExecCommand& cmd) +{ + mpu->restore(); + writeProtection->restore(); + return MainMemoryAccessBase::postSync(cmd); +} diff --git a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.h b/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.h index 2f370c4..2bac01b 100644 --- a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.h +++ b/DLL430_v3/src/TI/DLL430/FramMemoryAccessBase.h @@ -3,93 +3,79 @@ * * Handles access to fram memory. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FRAMMEMORYACCESSBASE_H -#define DLL430_FRAMMEMORYACCESSBASE_H - -#include "MemoryAreaBase.h" -#include -#include "FuncletCode.h" +#include "MainMemoryAccessBase.h" +#include "Mpu.h" +#include "WriteProtection.h" namespace TI { namespace DLL430 { - template - class FramMemoryAccessBase : public MemoryAreaBase + class IDeviceHandle; + + class FramMemoryAccessBase : public MainMemoryAccessBase { public: - FramMemoryAccessBase - ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + FramMemoryAccessBase( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, - uint8_t psa + IMemoryManager* mm, + uint8_t psa, + IWriteProtection* writeProtection, + IMpu* mpu ); - virtual ~FramMemoryAccessBase (); - bool doRead (uint32_t address, uint32_t* buffer , size_t count); - bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t value); + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; - bool erase (); - bool erase (uint32_t start, uint32_t end); - protected: - bool uploadFunclet(FuncletCode::Type type); - void restoreRam(); - virtual bool preSync (); - virtual bool postSync (const HalExecCommand&); - MemoryManager* mm; - bool erase (uint32_t start, uint32_t end, uint32_t block_size, int type); + virtual bool erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock = false) OVERRIDE; - private: - FuncletCode::Type funcletToUpload; - std::vector ramBackup; - MPU mpu; - }; - }; -}; + virtual bool preSync() OVERRIDE; + virtual bool postSync(const HalExecCommand& cmd) OVERRIDE; -#endif /* DLL430_FRAMMEMORYACCESSBASE_H */ + std::unique_ptr writeProtection; + std::unique_ptr mpu; + bool mustUnlockMpu; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBaseFR57.cpp b/DLL430_v3/src/TI/DLL430/FramMemoryAccessBaseFR57.cpp deleted file mode 100644 index 4c03087..0000000 --- a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBaseFR57.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* - * FramMemoryAccessBaseFR57.cpp - * - * Memory class for accessing flash memory. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "FramMemoryAccessBaseFR57.h" -#include "HalExecCommand.h" -#include "DeviceHandleV3.h" -#include "ConfigManagerV3.h" -#include "FetHandleV3.h" -#include "MpuFr5739.h" -#include "ClockCalibration.h" - -using namespace TI::DLL430; -using boost::bind; -using boost::shared_ptr; - -template -FramMemoryAccessBaseFR57::FramMemoryAccessBaseFR57 -( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, - bool mapped, - const bool isProtected, - MemoryManager* mm, - uint8_t psa -) - : MemoryAreaBase(name,devHandle,start,end,seg,banks,mapped, isProtected, psa) - , mm(mm), funcletToUpload(FuncletCode::NONE), mpu(devHandle, mm) -{ -} -template -FramMemoryAccessBaseFR57::~FramMemoryAccessBaseFR57 () -{ -} - -template -bool FramMemoryAccessBaseFR57::erase(uint32_t start, uint32_t end, uint32_t block_size, int type) -{ - using boost::shared_ptr; - using boost::bind; - - // check if valid erase type is used - if ((type != ERASE_SEGMENT) && (type != ERASE_MAIN)) - { - return false; - } - if (block_size < 1) - { - return false; - } - // if the MPU is enabled, disable it to enable memory erase - if(!mpu.readMpuSettings() || !mpu.disableMpu()) - { - return false; - } - - // get Device RAM parameters for funclet upload - MemoryArea* ram = mm->getMemoryArea("system", 0); - if (!ram) - { - return false; - } - - if ( !uploadFunclet(FuncletCode::ERASE) ) - { - return false; - } - shared_ptr restoreRamOnExit(static_cast(0), - bind(&FramMemoryAccessBaseFR57::restoreRam, this)); - - //Note the erase on an FRAM device is just a dummy write with 0xFFFF to the device FRAm - int32_t erase_address = start; - - const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::ERASE); - - const uint32_t eraseType = 0; - const uint32_t eraseLength = end - start + 1; - const uint16_t flags = 0x0; - const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); - - HalExecCommand cmd; - cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd.elements.push_back(el); - - el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); - el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); - el->appendInputData16(static_cast(ram->getSize() & 0xFFFF)); - el->appendInputData16(programStartAddress); - el->appendInputData32(static_cast(erase_address)); - el->appendInputData32(eraseLength); - el->appendInputData16(eraseType); - el->appendInputData16(flags); - el->appendInputData16(devHandle->getClockCalibration()->getCal0()); - el->appendInputData16(devHandle->getClockCalibration()->getCal1()); - - //Dummy data to trigger execution of erase funclet - el->appendInputData32(0xDEADBEEF); - - // set value for return length - el->setOutputSize(2); - cmd.elements.push_back(el); - - if (!this->devHandle->send(cmd)) - { - return false; - } - return true; -} - -template -bool FramMemoryAccessBaseFR57::doRead (uint32_t address, uint32_t* buffer, size_t count) -{ - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; - - uint32_t pc = 0; - cpu->read(0, &pc, 1); - - bool omitFirst = (address & 0x1); - if (omitFirst) { - --address; - ++count; - } - bool omitLast = (count & 1); - if (omitLast) { - ++count; - } - - const hal_id readMacro = devHandle->supportsQuickMemRead() ? - ID_ReadMemQuick : ID_ReadMemWords; - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - el->appendInputData32(pc); - - el->setOutputSize(count); - - ReadElement r(buffer, count, omitFirst, omitLast, 0); - this->readMap[this->elements.size()] = r; - this->elements.push_back(el); - return true; -} - -template -bool FramMemoryAccessBaseFR57::doWrite (uint32_t address, uint32_t* buffer, size_t count) -{ - if (count > this->getSize()) - { - return false; - } - - address += this->getStart(); - - MemoryArea* ram = mm->getMemoryArea("system"); - if (ram == NULL) - { - return false; - } - - //32bit alignment - const uint32_t alignedAddress = address & 0xfffffffc; - const int frontPadding = address - alignedAddress; - const int stubble = (address + count) % 4; - const int backPadding = (4 - stubble) % 4; - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteFramQuickXv2)); - el->appendInputData32(alignedAddress); - el->appendInputData32( (static_cast(count) + frontPadding + backPadding)/2 ); - - vector frontBuffer(frontPadding); - vector backBuffer(backPadding); - - if(frontPadding != 0) - { - mm->read(alignedAddress, &frontBuffer[0], frontPadding); - mm->sync(); - } - - if(backPadding != 0) - { - mm->read(address+count, &backBuffer[0], backPadding); - mm->sync(); - } - - for (int i = 0; i < frontPadding; ++i) - { - el->appendInputData8(frontBuffer[i]); - } - - for (size_t i = 0; i < count; ++i) - { - if (buffer[i] > 0xFF) - { - delete el; - return false; - } - el->appendInputData8(static_cast(buffer[i])); - } - - for (int i = 0; i < backPadding; ++i) - { - el->appendInputData8(backBuffer[i]); - } - - this->elements.push_back(el); - - return true; -} - -template -bool FramMemoryAccessBaseFR57::doWrite (uint32_t address, uint32_t value) -{ - return this->doWrite(address, &value, 1); -} - -template -bool FramMemoryAccessBaseFR57::erase (uint32_t start, uint32_t end) -{ - return erase(start, end, this->getSegmentSize(), 0); -} - -template -bool FramMemoryAccessBaseFR57::erase () -{ - const uint32_t bank_size = this->getSize() / this->getBanks(); - - return erase(this->getStart(), this->getEnd(), bank_size, 1); -} - -template -bool FramMemoryAccessBaseFR57::uploadFunclet(FuncletCode::Type type) -{ - bool success = false; - - const FuncletCode& funclet = devHandle->getFunclet(type); - - funcletToUpload = FuncletCode::NONE; - - if ( !funclet.code() ) - { - success = true; - ramBackup.clear(); - } - else if ( MemoryArea* ram = mm ? mm->getMemoryArea("system", 0) : 0 ) - { - if ( funclet.codeSize() <= ram->getSize() ) - { - if ( mm && mm->getRamPreserveMode() ) - { - const size_t backupSize = min((size_t)ram->getSize(), - funclet.codeSize() + funclet.maxPayloadSize()); - - ramBackup.resize( backupSize ); - if (!ram->read(0, &ramBackup[0], ramBackup.size()) || !ram->sync()) - return false; - } - else - { - ramBackup.clear(); - } - - const uint8_t* code = (uint8_t*)funclet.code(); - const size_t count = funclet.codeSize(); - - vector tmp(count); - for (size_t i = 0; i < count; ++i) - { - tmp[i] = static_cast(code[i]); - } - success = ram->write(0, &tmp[0], count) && ram->sync(); - } - } - return success; -} - -template -void FramMemoryAccessBaseFR57::restoreRam() -{ - if (!ramBackup.empty()) - { - if ( MemoryArea* ram = mm->getMemoryArea("system", 0) ) - { - size_t count = ramBackup.size(); - vector tmp(count); - for (size_t i = 0; i < count; ++i) - tmp[i] = ramBackup[i]; - - ram->write(0, &tmp[0], count) && ram->sync(); - } - } -} - -template -bool FramMemoryAccessBaseFR57::preSync () -{ - bool success = true; - - if (funcletToUpload != FuncletCode::NONE) - { - success = uploadFunclet(funcletToUpload); - funcletToUpload = FuncletCode::NONE; - } - - return success; -} - -template -bool FramMemoryAccessBaseFR57::postSync (const HalExecCommand& cmd) -{ - restoreRam(); - - for (size_t i = 1; i < cmd.elements.size(); ++i) - { - ReadElement_map::iterator it = this->readMap.find(i-1); - if (it != this->readMap.end()) - { - ReadElement r = it->second; - size_t size = r.size; - if (r.omitLast) - --size; - - const HalExecElement& el = cmd.elements.at(i); - - for (size_t i = 0, k = (r.omitFirst? 1: 0); k < size; ++k, ++i) - { - r.v_buffer[i] = el.getOutputAt8(k); - } - this->readMap.erase(it); - } - } - - return true; -} - -template class FramMemoryAccessBaseFR57; diff --git a/DLL430_v3/src/TI/DLL430/FramMemoryAccessFRx9.cpp b/DLL430_v3/src/TI/DLL430/FramMemoryAccessFRx9.cpp new file mode 100644 index 0000000..34d7e35 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FramMemoryAccessFRx9.cpp @@ -0,0 +1,97 @@ +/* + * FlashMemoryAccessFRx9.cpp + * + * Memory class for accessing fram memory on FR59xx/FR69xx. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "FramMemoryAccessFRx9.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "IConfigManager.h" +#include "MpuFRx.h" +#include "EM/EmulationManager/IEmulationManager.h" + + +using namespace TI::DLL430; + +FramMemoryAccessFRx9::FramMemoryAccessFRx9 +( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection* writeProt, + IMpu* mpu +) +:FramMemoryAccessBase(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa, writeProt, mpu) +{} + +bool FramMemoryAccessFRx9::erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock) +{ + MemoryArea* main = this->mm->getMemoryArea(MemoryArea::Main, 0); + if (!main) + { + return false; + } + + if ((type == ERASE_MAIN) && (start == main->getStart())) + { + HalExecCommand cmd; + cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec + + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_SendJtagMailboxXv2)); + el->appendInputData16(LONG_MAILBOX_MODE); // Mailbox Mode + el->appendInputData16(STOP_DEVICE); // Data 1 Mailbox + el->appendInputData16(MAIN_ERASE_MODE); // Data 2 Mailbox + cmd.elements.emplace_back(el); + + if (!this->devHandle->send(cmd)) + { + return false; + } + + this->devHandle->getEmulationManager()->rewriteConfiguration(); + + return this->devHandle->reset(); + } + + return FramMemoryAccessBase::erase(start, end, block_size, type, forceUnlock); +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/FramMemoryAccessFRx9.h b/DLL430_v3/src/TI/DLL430/FramMemoryAccessFRx9.h new file mode 100644 index 0000000..8f3be33 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/FramMemoryAccessFRx9.h @@ -0,0 +1,69 @@ +/* + * FramMemoryAccessFRx9.h + * + * Memory class for accessing fram memory on FR59xx/FR69xx. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "FramMemoryAccessBase.h" + +namespace TI +{ + namespace DLL430 + { + class FramMemoryAccessFRx9 : public FramMemoryAccessBase + { + public: + FramMemoryAccessFRx9 + ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa, + IWriteProtection* writeProt, + IMpu* mpu + ); + + protected: + bool erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock = false) OVERRIDE; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/FuncletCode.h b/DLL430_v3/src/TI/DLL430/FuncletCode.h index 32d4094..f7fd426 100644 --- a/DLL430_v3/src/TI/DLL430/FuncletCode.h +++ b/DLL430_v3/src/TI/DLL430/FuncletCode.h @@ -1,43 +1,42 @@ /* * FuncletCode.h * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 FUNCLET_CODE_H -#define FUNCLET_CODE_H +#pragma once + -#include -/** +/** \struct FuncletCode. \brief Non POD data holding struct which can be initialized at once through ctor. @@ -48,21 +47,24 @@ class FuncletCode { public: - enum Type { NONE, ERASE, WRITE, BSLUNLOCK}; + enum Type { NONE, ERASE, WRITE, BSLUNLOCK, SECURE}; FuncletCode(const uint16_t* code = 0, size_t size = 0, size_t maxPayload = 0) : code_(code), codeSize_(size-2), maxPayload_(maxPayload) {} - const uint16_t *code() const { return &code_[1]; } - size_t codeSize() const { return codeSize_; } + const uint16_t *code() const { return code_ ? &code_[1] : nullptr; } + const uint16_t *codeNoOffset() const { return &code_[0]; } + + size_t codeSize() const { return (codeSize_ < 0x1000) ? codeSize_ : 0; } + size_t codeSizeNoCheck() const { return (codeSize_); } uint16_t programStartOffset() const { return code_ ? code_[0] : 0; } size_t maxPayloadSize() const { return maxPayload_; } bool operator==(const FuncletCode& b) const { - return (codeSize_ == b.codeSize_) && + return (codeSize_ == b.codeSize_) && (maxPayload_ == b.maxPayload_) && - (memcmp(code_, b.code_, codeSize_+2) == 0); + (memcmp(code_, b.code_, codeSize_) == 0); } private: @@ -72,186 +74,198 @@ class FuncletCode }; - - const uint16_t eraseFuncletCodeDCO[] = { - 0x0000, - 0x400a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, 0x0057, - 0x503a, 0x005c, 0x40ba, 0xbeef, 0x0000, 0x3c02, 0x0000, 0x0000, - 0x403b, 0xdead, 0xea2b, 0x23fc, 0x403b, 0x000a, 0x4982, 0x0128, - 0x450c, 0x40bc, 0xdead, 0x0000, 0x403c, 0x227a, 0x831c, 0x23fe, - 0x40b2, 0xa500, 0x0128, 0x831b, 0x23f1, 0x40f2, 0x0087, 0x0057, - 0x3c05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x4303 + 0x0000, + 0x400a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, 0x0057, + 0x503a, 0x005c, 0x40ba, 0xbeef, 0x0000, 0x3c02, 0x0000, 0x0000, + 0x403b, 0xdead, 0xea2b, 0x23fc, 0x403b, 0x000a, 0x4982, 0x0128, + 0x450c, 0x40bc, 0xdead, 0x0000, 0x403c, 0x227a, 0x831c, 0x23fe, + 0x40b2, 0xa500, 0x0128, 0x831b, 0x23f1, 0x3c08, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x4303 }; const uint16_t writeFuncletCodeDCO[] = { 0x0000, - 0x400a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, 0x0057, - 0x503a, 0x005c, 0x40ba, 0xbeef, 0x0000, 0x3c02, 0x0000, 0x0000, - 0x403b, 0xdead, 0xea2b, 0x23fc, 0x4a0b, 0x532b, 0x450c, 0x40b2, - 0xa540, 0x0128, 0x4bac, 0x0000, 0xb392, 0x012c, 0x23fd, 0x40b2, - 0xa500, 0x0128, 0x40b2, 0xa500, 0x012c, 0x532b, 0x532c, 0x8316, - 0x23ee, 0x40f2, 0x0087, 0x0057, 0x3c01, 0x0000, 0x3fff, 0x4303 + 0x400a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, 0x0057, + 0x503a, 0x005c, 0x40ba, 0xbeef, 0x0000, 0x3c02, 0x0000, 0x0000, + 0x403b, 0xdead, 0xea2b, 0x23fc, 0x4a0b, 0x532b, 0x450c, 0x40b2, + 0xa540, 0x0128, 0x4bac, 0x0000, 0xb392, 0x012c, 0x23fd, 0x40b2, + 0xa500, 0x0128, 0x40b2, 0xa500, 0x012c, 0x532b, 0x532c, 0x8316, + 0x23ee, 0x3c04, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x4303 }; const uint16_t eraseFuncletCodeFLL[] = { - 0x0000, - 0x400A, 0x40B2, 0x5A80, 0x0120, 0x503A, 0x005C, 0x40BA, 0xBEEF, - 0x0000, 0x3C06, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0x403B, 0xDEAD, 0xEA2B, 0x23FC, 0x403B, 0x000A, 0x4982, 0x0128, - 0x450C, 0x40BC, 0xDEAD, 0x0000, 0x403C, 0x227A, 0x831C, 0x23FE, + 0x0000, + 0x400A, 0x40B2, 0x5A80, 0x0120, 0x503A, 0x005C, 0x40BA, 0xBEEF, + 0x0000, 0x3C06, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0x403B, 0xDEAD, 0xEA2B, 0x23FC, 0x403B, 0x000A, 0x4982, 0x0128, + 0x450C, 0x40BC, 0xDEAD, 0x0000, 0x403C, 0x227A, 0x831C, 0x23FE, 0x40B2, 0xA500, 0x0128, 0x831B, 0x23F1, 0x3C08, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3FFF, 0x4303 }; const uint16_t writeFuncletCodeFLL[] = { 0x0000, - 0x400A, 0x40B2, 0x5A80, 0x0120, 0x503A, 0x005C, 0x40BA, 0xBEEF, - 0x0000, 0x3C06, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0x403B, 0xDEAD, 0xEA2B, 0x23FC, 0x4A0B, 0x532B, 0x450C, 0x9BAC, - 0x0000, 0x240E, 0x40B2, 0xA540, 0x0128, 0x4BAC, 0x0000, 0xB392, + 0x400A, 0x40B2, 0x5A80, 0x0120, 0x503A, 0x005C, 0x40BA, 0xBEEF, + 0x0000, 0x3C06, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0x403B, 0xDEAD, 0xEA2B, 0x23FC, 0x4A0B, 0x532B, 0x450C, 0x9BAC, + 0x0000, 0x240E, 0x40B2, 0xA540, 0x0128, 0x4BAC, 0x0000, 0xB392, 0x012C, 0x23FD, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA500, 0x012C, 0x532B, 0x532C, 0x8316, 0x23EB, 0x3C01, 0xFFFF, 0x3FFF, 0x4303 }; +const uint16_t writeFuncletCode430I[] = { + 0x0000, + 0x400A, 0x40B2, 0x5A80, 0x0120, 0x503A, 0x005C, 0x40BA, 0xBEEF, + 0x0000, 0x3C06, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0x403B, 0xDEAD, 0xEA2B, 0x23FC, 0x4A0B, 0x532B, 0x450C, 0x40B2, + 0xA540, 0x0128, 0x4BAC, 0x0000, 0xB392, 0x012C, 0x23FD, 0x40B2, + 0xA500, 0x0128, 0x532B, 0x532C, 0x8316, 0x23F1, 0x40B2, 0xA500, + 0x012C, 0x3C04, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3FFF, 0x4303 +}; + const uint16_t eraseFuncletCodeXDCO[] = { 0x0000, - 0x1800, 0x404a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, - 0x0057, 0x1840, 0x503a, 0x0066, 0x1840, 0x40ba, 0xbeef, 0x0000, - 0x3c00, 0x403b, 0xdead, 0x1840, 0xea1b, 0x0000, 0x23fa, 0x1840, - 0x403b, 0x000a, 0x1840, 0x4982, 0x0128, 0x1800, 0x454c, 0x1840, - 0x40bc, 0xdead, 0x0000, 0x1840, 0x403c, 0x227a, 0x832c, 0x23fe, - 0x1840, 0x40b2, 0xa500, 0x0128, 0x832b, 0x23ec, 0x40f2, 0x0087, - 0x0057, 0x3c02, 0x0000, 0x0000, 0x3fff, 0x4303 + 0x1800, 0x404a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, + 0x0057, 0x1840, 0x503a, 0x0066, 0x1840, 0x40ba, 0xbeef, 0x0000, + 0x3c00, 0x403b, 0xdead, 0x1840, 0xea1b, 0x0000, 0x23fa, 0x1840, + 0x403b, 0x000a, 0x1840, 0x4982, 0x0128, 0x1800, 0x454c, 0x1840, + 0x40bc, 0xdead, 0x0000, 0x1840, 0x403c, 0x227a, 0x832c, 0x23fe, + 0x1840, 0x40b2, 0xa500, 0x0128, 0x832b, 0x23ec, 0x3c05, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x4303 }; const uint16_t writeFuncletCodeXDCO[] = { 0x0000, - 0x1800, 0x404a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, - 0x0057, 0x1840, 0x503a, 0x0066, 0x1840, 0x40ba, 0xbeef, 0x0000, - 0x3c00, 0x403b, 0xdead, 0x1840, 0xea1b, 0x0000, 0x23fa, 0x1840, - 0x4a0b, 0x1840, 0x532b, 0x1800, 0x454c, 0x40b2, 0xa540, 0x0128, - 0x4bac, 0x0000, 0xb392, 0x012c, 0x23fd, 0x40b2, 0xa500, 0x0128, - 0x40b2, 0xa500, 0x012c, 0x03eb, 0x03ec, 0x8316, 0x23ee, 0x40f2, - 0x0087, 0x0057, 0x3c01, 0x0000, 0x3fff, 0x4303 + 0x1800, 0x404a, 0x40b2, 0x5a80, 0x0120, 0x4bc2, 0x0056, 0x4cc2, + 0x0057, 0x1840, 0x503a, 0x0066, 0x1840, 0x40ba, 0xbeef, 0x0000, + 0x3c00, 0x403b, 0xdead, 0x1840, 0xea1b, 0x0000, 0x23fa, 0x1840, + 0x4a0b, 0x1840, 0x532b, 0x1800, 0x454c, 0x40b2, 0xa540, 0x0128, + 0x4bac, 0x0000, 0xb392, 0x012c, 0x23fd, 0x40b2, 0xa500, 0x0128, + 0x40b2, 0xa500, 0x012c, 0x03eb, 0x03ec, 0x8316, 0x23ee, 0x3c04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x4303 }; const uint16_t eraseFuncletCodeXFLL[] = { 0x0000, - 0x1800, 0x404a, 0x40b2, 0x5a80, 0x0120, 0x1840, 0x503a, 0x0066, - 0x1840, 0x40ba, 0xbeef, 0x0000, 0x3c04, 0x0000, 0x0000, 0x0000, - 0x0000, 0x403b, 0xdead, 0x1840, 0xea1b, 0x0000, 0x23fa, 0x1840, - 0x403b, 0x000a, 0x1840, 0x4982, 0x0128, 0x1800, 0x454c, 0x1840, - 0x40bc, 0xdead, 0x0000, 0x1840, 0x403c, 0x227a, 0x832c, 0x23fe, - 0x1840, 0x40b2, 0xa500, 0x0128, 0x832b, 0x23ec, 0x3c05, 0x0000, + 0x1800, 0x404a, 0x40b2, 0x5a80, 0x0120, 0x1840, 0x503a, 0x0066, + 0x1840, 0x40ba, 0xbeef, 0x0000, 0x3c04, 0x0000, 0x0000, 0x0000, + 0x0000, 0x403b, 0xdead, 0x1840, 0xea1b, 0x0000, 0x23fa, 0x1840, + 0x403b, 0x000a, 0x1840, 0x4982, 0x0128, 0x1800, 0x454c, 0x1840, + 0x40bc, 0xdead, 0x0000, 0x1840, 0x403c, 0x227a, 0x832c, 0x23fe, + 0x1840, 0x40b2, 0xa500, 0x0128, 0x832b, 0x23ec, 0x3c05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x4303 }; const uint16_t writeFuncletCodeXFLL[] = { 0x0000, - 0x1800, 0x404A, 0x40B2, 0x5A80, 0x0120, 0x1840, 0x503A, 0x0066, - 0x1840, 0x40BA, 0xBEEF, 0x0000, 0x3C04, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0x403B, 0xDEAD, 0x1840, 0xEA1B, 0x0000, 0x23FA, 0x1840, - 0x4A0B, 0x1840, 0x532B, 0x1800, 0x454C, 0x1840, 0x9BAC, 0x0000, - 0x240E, 0x40B2, 0xA540, 0x0128, 0x4BAC, 0x0000, 0xB392, 0x012C, - 0x23FD, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA500, 0x012C, 0x03EB, + 0x1800, 0x404A, 0x40B2, 0x5A80, 0x0120, 0x1840, 0x503A, 0x0066, + 0x1840, 0x40BA, 0xBEEF, 0x0000, 0x3C04, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0x403B, 0xDEAD, 0x1840, 0xEA1B, 0x0000, 0x23FA, 0x1840, + 0x4A0B, 0x1840, 0x532B, 0x1800, 0x454C, 0x1840, 0x9BAC, 0x0000, + 0x240E, 0x40B2, 0xA540, 0x0128, 0x4BAC, 0x0000, 0xB392, 0x012C, + 0x23FD, 0x40B2, 0xA500, 0x0128, 0x40B2, 0xA500, 0x012C, 0x03EB, 0x03EC, 0x8316, 0x23EA, 0x3C00, 0x3FFF, 0x4303 }; -const uint16_t eraseFuncletCodeXv2[] = +const uint16_t eraseFuncletCodeXv2[] = { 0x000E, 0x000E, 0x00CA, 0xA508, 0xA500, 0xA500, 0xDEAD, 0x000B, 0x40B2, - 0x5A80, 0x015C, 0x4213, 0xFFFE, 0x4290, 0x0140, 0xFFEA, 0x4290, - 0x0144, 0xFFE6, 0x180F, 0x4AC0, 0xFFE2, 0x40B2, 0x00D0, 0x0186, - 0x40B2, 0xABAD, 0x018E, 0x40B2, 0xBABE, 0x018C, 0xB3A2, 0x0186, + 0x5A80, 0x015C, 0x4213, 0xFFFE, 0x4290, 0x0140, 0xFFEA, 0x4290, + 0x0144, 0xFFE6, 0x180F, 0x4AC0, 0xFFE2, 0x40B2, 0x00D0, 0x0186, + 0x40B2, 0xABAD, 0x018E, 0x40B2, 0xBABE, 0x018C, 0xB3A2, 0x0186, 0x27FD, 0x90B2, 0xBEEF, 0x0188, 0x23F9, 0x90B2, 0xDEAD, 0x018A, - 0x23F5, 0xB392, 0x0144, 0x23FD, 0x4882, 0x0144, 0x4290, 0x0144, - 0xFFA4, 0x98C0, 0xFFA0, 0x2405, 0x480A, 0xD03A, 0x0040, 0x4A82, - 0x0144, 0x1800, 0x454A, 0x4982, 0x0140, 0x40BA, 0xDEAD, 0x0000, - 0xB392, 0x0144, 0x23FD, 0x1F80, 0x405A, 0xFF80, 0xE0B0, 0x3300, + 0x23F5, 0xB392, 0x0144, 0x23FD, 0x4882, 0x0144, 0x4290, 0x0144, + 0xFFA4, 0x98C0, 0xFFA0, 0x2405, 0x480A, 0xD03A, 0x0040, 0x4A82, + 0x0144, 0x1800, 0x454A, 0x4982, 0x0140, 0x40BA, 0xDEAD, 0x0000, + 0xB392, 0x0144, 0x23FD, 0x1F80, 0x405A, 0xFF80, 0xE0B0, 0x3300, 0xFF76, 0xE0B0, 0x3300, 0xFF72, 0x4092, 0xFF6C, 0x0140, 0x4092, - 0xFF68, 0x0144, 0x4290, 0x0144, 0xFF5C, 0x90D0, 0xFF5C, 0xFF56, - 0x2406, 0xD0B0, 0x0040, 0xFF52, 0x4092, 0xFF4E, 0x0144, 0x40B2, + 0xFF68, 0x0144, 0x4290, 0x0144, 0xFF5C, 0x90D0, 0xFF5C, 0xFF56, + 0x2406, 0xD0B0, 0x0040, 0xFF52, 0x4092, 0xFF4E, 0x0144, 0x40B2, 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x3FFF }; -const uint16_t writeFuncletCodeXv2WordMode[] = +const uint16_t writeFuncletCodeXv2WordMode[] = { 0x0012, - 0x0012, 0x011e, 0xa508, 0xa500, 0xa500, 0xdead, 0x000b, 0xdead, - 0x000b, 0x40b2, 0x5a80, 0x015c, 0x40b2, 0xabad, 0x018e, 0x40b2, - 0xbabe, 0x018c, 0x4290, 0x0140, 0xffde, 0x4290, 0x0144, 0xffda, - 0x180f, 0x4ac0, 0xffd6, 0x180f, 0x4bc0, 0xffd4, 0xb392, 0x0144, - 0x23fd, 0x4882, 0x0144, 0x4290, 0x0144, 0xffba, 0x98c0, 0xffb6, - 0x2405, 0x480a, 0xd03a, 0x0040, 0x4a82, 0x0144, 0x1800, 0x454a, - 0x1800, 0x464b, 0x40b2, 0x00d0, 0x0186, 0xb392, 0x0186, 0x27fd, - 0x421d, 0x0188, 0xc392, 0x0186, 0xb392, 0x0144, 0x23fd, 0x40b2, - 0xa500, 0x0140, 0x40b2, 0xa540, 0x0140, 0x4d8a, 0x0000, 0x1800, - 0x536a, 0x1800, 0x835b, 0x2417, 0xb3a2, 0x0186, 0x27fd, 0x421e, - 0x018a, 0xc3a2, 0x0186, 0xb392, 0x0144, 0x23fd, 0x40b2, 0xa500, - 0x0140, 0x40b2, 0xa540, 0x0140, 0x4e8a, 0x0000, 0x1800, 0x536a, - 0x1800, 0x835b, 0x23d2, 0xb392, 0x0144, 0x23fd, 0xc3a2, 0x0186, - 0xc392, 0x0186, 0x1f80, 0x405a, 0xff32, 0x1f80, 0x405b, 0xff30, - 0xe0b0, 0x3300, 0xff22, 0xe0b0, 0x3300, 0xff1e, 0x4092, 0xff18, - 0x0140, 0x4092, 0xff14, 0x0144, 0x4290, 0x0144, 0xff08, 0x90d0, - 0xff08, 0xff02, 0x2406, 0xd0b0, 0x0040, 0xfefe, 0x4092, 0xfefa, + 0x0012, 0x011e, 0xa508, 0xa500, 0xa500, 0xdead, 0x000b, 0xdead, + 0x000b, 0x40b2, 0x5a80, 0x015c, 0x40b2, 0xabad, 0x018e, 0x40b2, + 0xbabe, 0x018c, 0x4290, 0x0140, 0xffde, 0x4290, 0x0144, 0xffda, + 0x180f, 0x4ac0, 0xffd6, 0x180f, 0x4bc0, 0xffd4, 0xb392, 0x0144, + 0x23fd, 0x4882, 0x0144, 0x4290, 0x0144, 0xffba, 0x98c0, 0xffb6, + 0x2405, 0x480a, 0xd03a, 0x0040, 0x4a82, 0x0144, 0x1800, 0x454a, + 0x1800, 0x464b, 0x40b2, 0x00d0, 0x0186, 0xb392, 0x0186, 0x27fd, + 0x421d, 0x0188, 0xc392, 0x0186, 0xb392, 0x0144, 0x23fd, 0x40b2, + 0xa500, 0x0140, 0x40b2, 0xa540, 0x0140, 0x4d8a, 0x0000, 0x1800, + 0x536a, 0x1800, 0x835b, 0x2417, 0xb3a2, 0x0186, 0x27fd, 0x421e, + 0x018a, 0xc3a2, 0x0186, 0xb392, 0x0144, 0x23fd, 0x40b2, 0xa500, + 0x0140, 0x40b2, 0xa540, 0x0140, 0x4e8a, 0x0000, 0x1800, 0x536a, + 0x1800, 0x835b, 0x23d2, 0xb392, 0x0144, 0x23fd, 0xc3a2, 0x0186, + 0xc392, 0x0186, 0x1f80, 0x405a, 0xff32, 0x1f80, 0x405b, 0xff30, + 0xe0b0, 0x3300, 0xff22, 0xe0b0, 0x3300, 0xff1e, 0x4092, 0xff18, + 0x0140, 0x4092, 0xff14, 0x0144, 0x4290, 0x0144, 0xff08, 0x90d0, + 0xff08, 0xff02, 0x2406, 0xd0b0, 0x0040, 0xfefe, 0x4092, 0xfefa, 0x0144, 0x40b2, 0xcafe, 0x018e, 0x40b2, 0xbabe, 0x018c, 0x3fff }; -const uint16_t writeFuncletCodeXv2[] = +const uint16_t writeFuncletCodeXv2[] = { 0x0012, - 0x0012, 0x00F2, 0xA508, 0xA500, 0xA500, 0xDEAD, 0x000B, 0xDEAD, - 0x000B, 0x40B2, 0x5A80, 0x015C, 0x40B2, 0xABAD, 0x018E, 0x40B2, - 0xBABE, 0x018C, 0x4290, 0x0140, 0xFFDE, 0x4290, 0x0144, 0xFFDA, - 0x180F, 0x4AC0, 0xFFD6, 0x180F, 0x4BC0, 0xFFD4, 0xB392, 0x0144, + 0x0012, 0x00F2, 0xA508, 0xA500, 0xA500, 0xDEAD, 0x000B, 0xDEAD, + 0x000B, 0x40B2, 0x5A80, 0x015C, 0x40B2, 0xABAD, 0x018E, 0x40B2, + 0xBABE, 0x018C, 0x4290, 0x0140, 0xFFDE, 0x4290, 0x0144, 0xFFDA, + 0x180F, 0x4AC0, 0xFFD6, 0x180F, 0x4BC0, 0xFFD4, 0xB392, 0x0144, 0x23FD, 0x4882, 0x0144, 0x4290, 0x0144, 0xFFBA, 0x98C0, 0xFFB6, - 0x2405, 0x480A, 0xD03A, 0x0040, 0x4A82, 0x0144, 0x1800, 0x454A, - 0x1800, 0x464B, 0x40B2, 0x00D0, 0x0186, 0xB3A2, 0x0186, 0x27FD, - 0x40B2, 0xA580, 0x0140, 0x429A, 0x0188, 0x0000, 0x1800, 0x536A, - 0x1800, 0x835B, 0x429A, 0x018A, 0x0000, 0xC3A2, 0x0186, 0xC392, + 0x2405, 0x480A, 0xD03A, 0x0040, 0x4A82, 0x0144, 0x1800, 0x454A, + 0x1800, 0x464B, 0x40B2, 0x00D0, 0x0186, 0xB3A2, 0x0186, 0x27FD, + 0x40B2, 0xA580, 0x0140, 0x429A, 0x0188, 0x0000, 0x1800, 0x536A, + 0x1800, 0x835B, 0x429A, 0x018A, 0x0000, 0xC3A2, 0x0186, 0xC392, 0x0186, 0xB392, 0x0144, 0x23FD, 0x40B2, 0xA500, 0x0140, 0x1800, - 0x536A, 0x1800, 0x835B, 0x23E1, 0x1F80, 0x405A, 0xFF5E, 0x1F80, - 0x405B, 0xFF5C, 0xE0B0, 0x3300, 0xFF4E, 0xE0B0, 0x3300, 0xFF4A, - 0x4092, 0xFF44, 0x0140, 0x4092, 0xFF40, 0x0144, 0x4290, 0x0144, - 0xFF34, 0x90D0, 0xFF34, 0xFF2E, 0x2406, 0xD0B0, 0x0040, 0xFF2A, + 0x536A, 0x1800, 0x835B, 0x23E1, 0x1F80, 0x405A, 0xFF5E, 0x1F80, + 0x405B, 0xFF5C, 0xE0B0, 0x3300, 0xFF4E, 0xE0B0, 0x3300, 0xFF4A, + 0x4092, 0xFF44, 0x0140, 0x4092, 0xFF40, 0x0144, 0x4290, 0x0144, + 0xFF34, 0x90D0, 0xFF34, 0xFF2E, 0x2406, 0xD0B0, 0x0040, 0xFF2A, 0x4092, 0xFF26, 0x0144, 0x40B2, 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x3FFF }; -const uint16_t eraseFuncletCodeXv2FRAM[] = +const uint16_t eraseFuncletCodeXv2FRAM[] = +{ + 0x000C, + 0x000C, 0x0076, 0xDEAD, 0x000B, 0xDEAD, 0x000B, 0x40B2, 0x5A80, 0x015C, 0x180F, + 0x4AC0, 0xFFEE, 0x180F, 0x4BC0, 0xFFEC, 0x40B2, 0x00D0, 0x0186, 0x40B2, 0xABAD, + 0x018E, 0x40B2, 0xBABE, 0x018C, 0xB3A2, 0x0186, 0x27FD, 0x90B2, 0xBEEF, 0x0188, + 0x23F9, 0x90B2, 0xDEAD, 0x018A, 0x23F5, 0x1800, 0x454A, 0x1800, 0x464B, 0x43BA, + 0x0000, 0x1800, 0x536A, 0x1800, 0x836B, 0x930B, 0x23F8, 0x1F80, 0x405A, 0xFFA2, + 0x1F80, 0x405B, 0xFFA0, 0x40B2, 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x3FFF +}; + +const uint16_t writeFuncletCodeXv2FRAM[] = { 0x0012, - 0x0012, 0x00BE, 0xDEAD, 0x000B, 0xDEAD, 0x000B, 0x0000, 0x0000, 0x0000, 0x40B2, - 0x5A80, 0x015C, 0x4292, 0x0162, 0x1C0C, 0x4292, 0x0164, 0x1C0E, 0x4292, 0x0166, - 0x1C10, 0x40B2, 0xA500, 0x0160, 0x40B2, 0x0006, 0x0162, 0x40B2, 0x0033, 0x0164, - 0x40B2, 0x0033, 0x0166, 0x180F, 0x4AC0, 0xFFBE, 0x180F, 0x4BC0, 0xFFBC, 0x40B2, - 0x00D0, 0x0186, 0x40B2, 0xABAD, 0x018E, 0x40B2, 0xBABE, 0x018C, 0xB3A2, 0x0186, - 0x27FD, 0x90B2, 0xBEEF, 0x0188, 0x23F9, 0x90B2, 0xDEAD, 0x018A, 0x23F5, 0x1800, - 0x454A, 0x1800, 0x464B, 0x43BA, 0x0000, 0x1800, 0x536A, 0x1800, 0x836B, 0x930B, - 0x23F8, 0x1F80, 0x405A, 0xFF72, 0x1F80, 0x405B, 0xFF70, 0x40B2, 0xA500, 0x0160, - 0x4292, 0x1C0C, 0x0162, 0x4292, 0x1C0E, 0x0164, 0x4292, 0x1C10, 0x0166, 0x40B2, - 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x3FFF + 0x0012, 0x008C, 0x0000, 0xA500, 0xA500, 0xDEAD, 0x000B, 0xDEAD, 0x000B, 0x40B2, + 0x5A80, 0x015C, 0x40B2, 0xABAD, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x180F, 0x4AC0, + 0xFFE2, 0x180F, 0x4BC0, 0xFFE0, 0x1800, 0x454A, 0x1800, 0x464B, 0x40B2, 0x00D0, + 0x0186, 0xB3A2, 0x0186, 0x27FD, 0x429A, 0x0188, 0x0000, 0xC392, 0x0186, 0x1800, + 0x536A, 0x1800, 0x835B, 0x930B, 0x2001, 0x3C0C, 0x429A, 0x018A, 0x0000, 0xC3A2, + 0x0186, 0x1800, 0x536A, 0x1800, 0x835B, 0x930B, 0x23E6, 0x3C00, 0x1F80, 0x405A, + 0xFF92, 0x1F80, 0x405B, 0xFF90, 0x40B2, 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, + 0x3FFF }; -const uint16_t writeFuncletCodeXv2FRAM[] = +const unsigned short eraseFuncletCodeXv2FR41xx[] = { - 0x0018, - 0x0018, 0x00D4, 0x0000, 0xA500, 0xA500, 0xDEAD, 0x000B, 0xDEAD, 0x000B, 0x0000, - 0x0000, 0x0000, 0x40B2, 0x5A80, 0x015C, 0x4292, 0x0162, 0x1C12, 0x4292, 0x0164, - 0x1C14, 0x4292, 0x0166, 0x1C16, 0x40B2, 0xA500, 0x0160, 0x40B2, 0x0006, 0x0162, - 0x40B2, 0x0033, 0x0164, 0x40B2, 0x0033, 0x0166, 0x40B2, 0xABAD, 0x018E, 0x40B2, - 0xBABE, 0x018C, 0x180F, 0x4AC0, 0xFFB2, 0x180F, 0x4BC0, 0xFFB0, 0x1800, 0x454A, - 0x1800, 0x464B, 0x40B2, 0x00D0, 0x0186, 0xB3A2, 0x0186, 0x27FD, 0x429A, 0x0188, - 0x0000, 0xC392, 0x0186, 0x1800, 0x536A, 0x1800, 0x835B, 0x930B, 0x2001, 0x3C0C, - 0x429A, 0x018A, 0x0000, 0xC3A2, 0x0186, 0x1800, 0x536A, 0x1800, 0x835B, 0x930B, - 0x23E6, 0x3C00, 0x1F80, 0x405A, 0xFF62, 0x1F80, 0x405B, 0xFF60, 0x40B2, 0xA500, - 0x0160, 0x4292, 0x1C12, 0x0162, 0x4292, 0x1C14, 0x0164, 0x4292, 0x1C16, 0x0166, - 0x40B2, 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x3FFF + 0x0000, + 0x40B2, 0x5A80, 0x01CC, 0x40B2, 0x00D0, 0x0146, 0x40B2, 0xABAD, + 0x014E, 0x40B2, 0xBABE, 0x014C, 0xB3A2, 0x0146, 0x27FD, 0x90B2, + 0xBEEF, 0x0148, 0x23F9, 0x90B2, 0xDEAD, 0x014A, 0x23F5, 0x1800, + 0x454A, 0x1800, 0x464B, 0x43BA, 0x0000, 0x1800, 0x536A, 0x1800, + 0x836B, 0x930B, 0x23F8, 0x40B2, 0xCAFE, 0x014E, 0x40B2, 0xBABE, + 0x014C, 0x3FFF, }; -const uint16_t UnlockBslFuncletCodeXv2[] = +const uint16_t UnlockBslFuncletCodeXv2[] = { 0x0018, 0x0018, 0x008E, 0xDEAD, 0x000B, 0xDEAD, 0x000B, 0xDEAD, 0x000B, 0xDEAD, 0x000B, @@ -263,5 +277,3 @@ const uint16_t UnlockBslFuncletCodeXv2[] = 0x405C, 0xFF8A, 0x1F80, 0x405D, 0xFF88, 0x40B2, 0xCAFE, 0x018E, 0x40B2, 0xBABE, 0x018C, 0x3FFF, }; - -#endif diff --git a/DLL430_v3/src/TI/DLL430/HalExecBuffered.cpp b/DLL430_v3/src/TI/DLL430/HalExecBuffered.cpp index 8604ddd..d216c45 100644 --- a/DLL430_v3/src/TI/DLL430/HalExecBuffered.cpp +++ b/DLL430_v3/src/TI/DLL430/HalExecBuffered.cpp @@ -3,61 +3,59 @@ * * Sending and receiving on hal level. * - * Copyright (C) 2009 - 2011 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 + * Copyright (C) 2009 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include +#include #include "HalExecBuffered.h" #include "HalResponse.h" #include "FetControl.h" #include "IoChannel.h" #include "MessageData.h" +#include using namespace TI::DLL430; using namespace std; -#define HEAD_SIZE 3 -#define DATA_SIZE 251 - -#define ERR_CODE_IMPL 0x8001 -#define ERR_CODE_MSG_ID 0x8002 -#define ERR_CODE_CRC 0x8003 -#define ERR_CODE_RX 0x8004 -#define ERR_CODE_TX 0x8005 +static const uint8_t HEAD_SIZE = 3; +static const uint8_t DATA_SIZE = 251; +static const uint8_t ACT_WAIT = 0x10; +static const uint8_t ACT_ACK_NEEDED = 0x08; +static const uint8_t ACT_ACK_RCV = 0x02; +static const uint8_t ACT_NACK_RCV = 0x04; +static const uint8_t ACT_DATA_COMPLETE = 0x20; HalExecBuffered::HalExecBuffered () : trans(0) @@ -67,19 +65,13 @@ HalExecBuffered::HalExecBuffered () , async(false) , cont(false) , tout(0) - , syncDelay(0) , tmp_channel(0) , extClientHandle(0) - , eventType(0) , loopCmdId(0) { memset(buf, 0, sizeof(buf)); } -HalExecBuffered::~HalExecBuffered () -{ -} - void HalExecBuffered::createMessage(std::vector& tdata, uint8_t type, uint8_t response, @@ -93,15 +85,15 @@ void HalExecBuffered::createMessage(std::vector& tdata, tbuf[1] = type; tbuf[2] = response; tbuf[3] = 0; // timeout - - if(hasaddr) + + if (hasaddr) { tbuf[4] = addr & 0xFF; tbuf[5] = (addr >> 8) & 0xFF; offset +=2; tbuf[0] +=2; } - + if (tdata.size() > 0) { memcpy(&tbuf[HEAD_SIZE+offset], &tdata[0], tdata.size()); @@ -128,8 +120,6 @@ void HalExecBuffered::sendAck(uint8_t response, IoChannel& chan, std::vector(chan.getFunctionAddress(el.functionId) & 0xFFFF); - trans=⪙ int respid=fetCtrl.createResponseId(true); @@ -138,31 +128,29 @@ bool HalExecBuffered::sendAsync(HalExecElement& el, FetControl& fetCtrl, IoChann { return false; } - if (el.addTransaction(respid)==false) - { - return false; - } + + el.addTransaction(respid); if (continued) { // report events until kill - createMessage(el.inData,0x8A,respid,addr,true,buf); + createMessage(el.inData, 0x8A, respid, el.functionId, true, buf); } else { // kill loop after event - createMessage(el.inData,0x82,respid,addr,true,buf); + createMessage(el.inData, 0x82, respid, el.functionId, true, buf); } uint8_t length=buf[0]+1; // write to output channel and wait for answer - int len = chan.write(buf, length); + const size_t len = chan.write(buf, length); if (len!=length) return false; // wait for ACK - waitForSingleEvent(3000,syncDelay,el,respid); + waitForSingleEvent(3000, el, respid); if (hal_error) { @@ -180,21 +168,13 @@ bool HalExecBuffered::sendAsync(HalExecElement& el, FetControl& fetCtrl, IoChann bool HalExecBuffered::sendElement(HalExecElement& el, FetControl& fetCtrl, IoChannel& chan) { - trans=⪙ + static const uint8_t FOLLOWER = 0x80; - uint16_t addr = static_cast(chan.getFunctionAddress(el.functionId) & 0xFFFF); - - if (addr==0xffff) - return false; + trans = ⪙ // iterators for payload, init with there own start and end - std::vector::iterator start_it=el.inData.begin(); - std::vector::iterator end_it=el.inData.end(); - - if (el.inData.size()>1000) - setDelay(0); - else - setDelay(1); + std::vector::iterator start_it = el.inData.begin(); + std::vector::iterator end_it = el.inData.end(); size_t pos=0; @@ -210,17 +190,15 @@ bool HalExecBuffered::sendElement(HalExecElement& el, FetControl& fetCtrl, IoCha const int respid = fetCtrl.createResponseId(false); if (!fetCtrl.registerResponseHandler(respid, responseHandlerPtr)) - return false; - - if (el.addTransaction(respid)==false) { return false; } + + el.addTransaction(respid); + // check HAL function id, needed only for first telegram // some telegrams do not need a HAL function ID - bool send_addr=false; - if (el.getAddrFlag() && leading) - send_addr=true; + const bool send_addr = (el.getAddrFlag() && leading); // calc possible payload size size_t space=(DATA_SIZE-(HEAD_SIZE+2+2)); @@ -244,36 +222,37 @@ bool HalExecBuffered::sendElement(HalExecElement& el, FetControl& fetCtrl, IoCha std::vector tmp(start_it, end_it); // ...and create a telegram - createMessage(tmp,el.msgType,respid|ctrl,addr,send_addr,buf); + createMessage(tmp, el.msgType, respid|ctrl, el.functionId, send_addr, buf); // save length (could be changed by CRC or channel) uint8_t length=buf[0]+1; // write to output channel and wait for answer - const int len = chan.write(buf,length); + const size_t len = chan.write(buf, length); if (len != length) + { return false; + } - // loop over respond data + // loop over respond data do { - if (this->waitForSingleEvent(cmd_timeout,syncDelay,el,respid)) + if (this->waitForSingleEvent(cmd_timeout, el, respid)) { if (hal_error) { hal_error=false; return false; } - if (el.checkTransaction(respid,ACT_NACK_RCV)) + if (el.checkTransaction(respid, ACT_NACK_RCV)) return false; } else { return false; } - el.changeTransaction(respid,0x1f,false); // delete all flags - } - while (!el.checkTransaction(respid,ACT_DATA_COMPLETE)); + el.changeTransaction(respid, 0x1f, false); // delete all flags + } while (!el.checkTransaction(respid, ACT_DATA_COMPLETE)); leading = false; start_it=end_it; @@ -285,27 +264,30 @@ bool HalExecBuffered::sendElement(HalExecElement& el, FetControl& fetCtrl, IoCha // HalExecCommand call this public function with a list of // HAL commands, which can be sync, or async -bool HalExecBuffered::send (list_type & list, FetControl& fetCtrl, IoChannel& chan) +bool HalExecBuffered::send (list_type& list, FetControl& fetCtrl, IoChannel& chan) { if (!fetCtrl.hasCommunication()) + { return false; + } - list_type::iterator it; - elem=&list; + elem = &list; - tmp_channel=(&chan); + tmp_channel = &chan; - for (it = list.begin(); it != list.end(); ++it) + for (auto& it : list) { if (async) { - if(this->sendAsync(*it,fetCtrl,chan,cont)==false) + if (!this->sendAsync(*it, fetCtrl, chan, cont)) return false; } else { - if(this->sendElement(*it,fetCtrl,chan)==false) + if (!this->sendElement(*it, fetCtrl, chan)) + { return false; + } } } return true; @@ -316,54 +298,54 @@ bool HalExecBuffered::send (list_type & list, FetControl& fetCtrl, IoChannel& ch // returns true if answer is recieved or false if // timeout happened -bool HalExecBuffered::waitForSingleEvent(int timeout, int sleep, HalExecElement& el, uint8_t id) +bool HalExecBuffered::waitForSingleEvent(int timeout, HalExecElement& el, uint8_t id) { - const boost::system_time waitUntil = boost::get_system_time() + boost::posix_time::milliseconds(timeout); - bool ioTimedOut = false; + const auto pred = [&el, id]() { return el.checkTransaction(id, ACT_WAIT) != 0; }; boost::unique_lock lock(dataMutex); - while (!el.checkTransaction(id,ACT_WAIT) && !ioTimedOut) - { #ifndef NDEBUG - dataCondition.wait(lock); + dataCondition.wait(lock, pred); + return true; #else - ioTimedOut = !dataCondition.timed_wait(lock, waitUntil); + return dataCondition.wait_for(lock, boost::chrono::milliseconds(timeout), pred); #endif - } - - return(!ioTimedOut); } bool HalExecBuffered::checkException(HalResponse& resp) { #ifndef NDEBUG - for(unsigned int i=0;i lock(dataMutex); const uint8_t maskedId = resp.getId() & 0x3f; //Without async bit - switch (resp.getType()) + switch (resp.getType()) { case HalResponse::Type_Exception: + this->recv_data(resp); this->checkException(resp); fetCtrl.unregisterResponseHandler(maskedId, responseHandlerPtr); - trans->changeTransaction(maskedId,ACT_WAIT,true); - trans->changeTransaction(maskedId,ACT_NACK_RCV,true); + trans->changeTransaction(maskedId, ACT_WAIT, true); + trans->changeTransaction(maskedId, ACT_NACK_RCV, true); //log error break; @@ -436,30 +416,34 @@ void HalExecBuffered::recv (FetControl& fetCtrl, HalResponse& resp) break; case HalResponse::Type_Data: - trans->changeTransaction(maskedId,ACT_ACK_NEEDED,true); - this->recv_data(resp); - - if (this->isAsync() || trans->checkTransaction(maskedId,ACT_ACK_NEEDED)) + trans->changeTransaction(maskedId, ACT_ACK_NEEDED, true); + + if (!this->isAsync()) + { + this->recv_data(resp); + } + + if (this->isAsync() || trans->checkTransaction(maskedId, ACT_ACK_NEEDED)) { // if ACK needs additional data std::vector ackdata; - + // add counter sent with 'timeout' field if (tout && !this->isAsync()) { ackdata.push_back(tout); } - sendAck(maskedId, *tmp_channel, ackdata); + sendAck(maskedId, *tmp_channel, ackdata); } if (this->isAsync() ) { - if( resp.get().size() < 6 ) + if ( resp.get().size() < 6 ) break; - + if ( info_callback ) { - info_callback( boost::shared_ptr(new MessageData(resp.get().begin() + 3, resp.get().end())), + info_callback( std::shared_ptr(new MessageData(resp.get().begin() + 3, resp.get().end())), extClientHandle); } @@ -469,30 +453,32 @@ void HalExecBuffered::recv (FetControl& fetCtrl, HalResponse& resp) } loopCmdId=0; - trans->changeTransaction(maskedId,ACT_WAIT,true); + trans->changeTransaction(maskedId, ACT_WAIT, true); } if (msgComplete) { - trans->changeTransaction(maskedId,ACT_DATA_COMPLETE,true); + trans->changeTransaction(maskedId, ACT_DATA_COMPLETE, true); fetCtrl.unregisterResponseHandler(resp.getId(), responseHandlerPtr); } - trans->changeTransaction(maskedId,ACT_WAIT,true); + trans->changeTransaction(maskedId, ACT_WAIT, true); break; case HalResponse::Type_Acknoledge: this->recv_data(resp); - trans->changeTransaction(maskedId,ACT_DATA_COMPLETE,true); - trans->changeTransaction(maskedId,ACT_ACK_RCV,true); + trans->changeTransaction(maskedId, ACT_DATA_COMPLETE, true); + trans->changeTransaction(maskedId, ACT_ACK_RCV, true); if (msgComplete) { fetCtrl.unregisterResponseHandler(maskedId, responseHandlerPtr); - trans->changeTransaction(maskedId,ACT_WAIT,true); + trans->changeTransaction(maskedId, ACT_WAIT, true); - if(this->isAsync()) + if (this->isAsync()) { - loopCmdId = maskedId | 0x40; + static const uint8_t LOOP_FLAG = 0x40; + + loopCmdId = maskedId | LOOP_FLAG; fetCtrl.registerResponseHandler(loopCmdId, responseHandlerPtr); } } @@ -500,12 +486,13 @@ void HalExecBuffered::recv (FetControl& fetCtrl, HalResponse& resp) case HalResponse::Type_Status: // currently not used, prepared for state messages of firmware + this->recv_data(resp); break; default: - trans->changeTransaction(maskedId,ACT_WAIT,true); + trans->changeTransaction(maskedId, ACT_WAIT, true); #ifndef NDEBUG - printf("response: %2x\n",resp.getType()); + printf("response: %2x\n", resp.getType()); #endif } dataCondition.notify_all(); @@ -515,22 +502,27 @@ void HalExecBuffered::recv (FetControl& fetCtrl, HalResponse& resp) // for update-read: collect data and create an outData-vector bool HalExecBuffered::recv_data (HalResponse& resp) { - if (elem==NULL) + if (elem==nullptr) return false; - if (resp.getSize()) + if (resp.getSize()) { - trans->outData.insert(trans->outData.end(),resp.get().begin()+3,resp.get().end()); + trans->outData.insert(trans->outData.end(), resp.get().begin()+3, resp.get().end()); tout=resp.at(2); } return true; } -uint8_t HalExecBuffered::getResponseId() +uint8_t HalExecBuffered::getResponseId() const { return loopCmdId; } +void HalExecBuffered::clearResponseId() +{ + loopCmdId = 0; +} + void HalExecBuffered::setAsyncMode(bool continued) { async=true; @@ -554,11 +546,6 @@ void HalExecBuffered::setCallBack(const EventCallback& callback, uint32_t client extClientHandle = clientHandle; } -void HalExecBuffered::setDelay(int time) -{ - syncDelay=time; -} - void HalExecBuffered::setTimeout(uint32_t msec) { cmd_timeout=msec; diff --git a/DLL430_v3/src/TI/DLL430/HalExecBuffered.h b/DLL430_v3/src/TI/DLL430/HalExecBuffered.h index 45c30a7..55f6b54 100644 --- a/DLL430_v3/src/TI/DLL430/HalExecBuffered.h +++ b/DLL430_v3/src/TI/DLL430/HalExecBuffered.h @@ -3,58 +3,44 @@ * * Sending and receiving on hal level. * - * Copyright (C) 2009 - 2011 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 + * Copyright (C) 2009 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_HALEXECBUFFERED_H -#define DLL430_HALEXECBUFFERED_H #include "HalExecElement.h" #include "HalResponseHandler.h" #include "IoChannel.h" -#include -#include -#include -#include -#include -#include - -#define FOLLOWER 0x80 -#define LOOP_FLAG 0x40 - - +#include namespace TI { @@ -62,25 +48,25 @@ namespace TI { class MessageData; - typedef boost::function2, uint32_t> EventCallback; + typedef std::function, uint32_t)> EventCallback; - typedef boost::shared_ptr HalExecBufferedPtr; + typedef std::shared_ptr HalExecBufferedPtr; class HalExecBuffered : public HalResponseHandler { public: - typedef boost::ptr_vector list_type; - - HalExecBuffered (); - ~HalExecBuffered (); - - bool send (list_type &, FetControl&, IoChannel&); - - void recv (FetControl& , HalResponse& resp); + typedef std::vector> list_type; + + HalExecBuffered(); + + bool send(list_type &, FetControl&, IoChannel&); + void recv(FetControl&, HalResponse& resp); + bool isAsync(); bool isContinuous(); - uint8_t getResponseId(); + uint8_t getResponseId() const; + void clearResponseId(); void setAsyncMode(bool continued); @@ -91,11 +77,7 @@ namespace TI HalResponseHandlerPtr responseHandlerPtr; private: - void setDelay(int time); - - void setEventType(uint8_t type); - - bool waitForSingleEvent(int timeout, int sleep, HalExecElement& el, uint8_t id); + bool waitForSingleEvent(int timeout, HalExecElement& el, uint8_t id); void createMessage(std::vector& tdata, uint8_t type, @@ -108,35 +90,31 @@ namespace TI bool sendElement(HalExecElement& el, FetControl& fetCtrl, IoChannel& chan); bool sendAsync(HalExecElement& el, FetControl& fetCtrl, IoChannel& chan, bool continued); bool checkException(HalResponse& resp); - + bool recv_data (HalResponse& resp); boost::condition_variable dataCondition; boost::mutex dataMutex; - HalExecElement * trans; + HalExecElement* trans; uint8_t buf[256]; int cmd_timeout; bool hal_error; - list_type * elem; + list_type* elem; bool async; bool cont; - uint8_t tout; - int syncDelay; - + uint8_t tout; + IoChannel * tmp_channel; EventCallback info_callback; uint32_t extClientHandle; - uint8_t eventType; uint8_t loopCmdId; }; }; }; - -#endif /* DLL430_HALEXEBUFFERED_H */ diff --git a/DLL430_v3/src/TI/DLL430/HalExecCommand.cpp b/DLL430_v3/src/TI/DLL430/HalExecCommand.cpp index 39877fa..30ed10f 100644 --- a/DLL430_v3/src/TI/DLL430/HalExecCommand.cpp +++ b/DLL430_v3/src/TI/DLL430/HalExecCommand.cpp @@ -3,38 +3,40 @@ * * Forwards calls to HalExecBuffered. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #include "HalExecCommand.h" #include "HalResponse.h" #include "FetControl.h" @@ -44,8 +46,8 @@ using namespace TI::DLL430; HalExecCommand::HalExecCommand () : fetControl(0) + , exec(new HalExecBuffered()) { - exec = HalExecBufferedPtr(new HalExecBuffered()); exec->responseHandlerPtr = exec; } @@ -53,7 +55,7 @@ HalExecCommand::~HalExecCommand () { if (fetControl) fetControl->unregisterResponseHandler(exec); - + //Remove self-reference to allow deletion exec->responseHandlerPtr.reset(); } @@ -66,14 +68,19 @@ bool HalExecCommand::send (FetControl& fetCtrl, IoChannel& chan) void HalExecCommand::setCallBack(const EventCallback& callback, uint32_t clientHandle) { - exec->setCallBack(callback,clientHandle); + exec->setCallBack(callback, clientHandle); } -uint8_t HalExecCommand::getResponseId() +uint8_t HalExecCommand::getResponseId() const { return exec->getResponseId(); } +void HalExecCommand::clearResponseId() +{ + exec->clearResponseId(); +} + void HalExecCommand::setAsyncMode(bool continued) { exec->setAsyncMode(continued); diff --git a/DLL430_v3/src/TI/DLL430/HalExecCommand.h b/DLL430_v3/src/TI/DLL430/HalExecCommand.h index 30542e2..ac40e64 100644 --- a/DLL430_v3/src/TI/DLL430/HalExecCommand.h +++ b/DLL430_v3/src/TI/DLL430/HalExecCommand.h @@ -3,70 +3,72 @@ * * Forwards calls to HalExecBuffered. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_HALEXECCOMMAND_H -#define DLL430_HALEXECCOMMAND_H - -#include -#include -#include +#include #include "HalExecBuffered.h" #include "HalExecElement.h" #include "FetControl.h" -#include -#include -#include - - - namespace TI { namespace DLL430 { - enum HalMsgType { + enum HalMsgType + { UpInit = 0x51, UpErase = 0x52, UpWrite = 0x53, UpRead = 0x54, UpCore = 0x55, - + + // Fet-Dcdc functions + dcdcCalibrate = 0x56, + dcdcInitInterface = 0x57, + dcdcSubMcuVersion = 0x58, + dcdcLayerVersion = 0x59, + dcdcPowerDown = 0x60, + dcdcSetVcc = 0x61, + + dcdcRestart = 0x62, + + coreSetVcc = 0x63, + coreGetVcc = 0x64, + coreSwitchFet = 0x65, + CmdLegacy = 0x7E, CmdSync = 0x80, CmdExecute = 0x81, @@ -78,31 +80,36 @@ namespace TI CmdMove = 0x87, CmdUnload = 0x88, CmdBypass = 0x89, - CmdExecuteLoopCont = 0x8A, - CmdComReset = 0x8B, - CmdPauseLoop = 0x8C, - CmdResumeLoop = 0x8D + CmdExecuteLoopCont = 0x8A, + CmdComReset = 0x8B, + CmdPauseLoop = 0x8C, + CmdResumeLoop = 0x8D, + CmdKillAll = 0x8E, + CmdOverCurrent = 0x8F }; class HalExecCommand { public: - HalExecCommand (); - ~HalExecCommand (); + HalExecCommand(); + ~HalExecCommand(); - bool send (FetControl&, IoChannel&); - void recv (FetControl& , HalResponse& resp, uint8_t type=0); + HalExecCommand(const HalExecCommand&) = delete; + HalExecCommand& operator=(const HalExecCommand&) = delete; + + bool send(FetControl&, IoChannel&); + void recv(FetControl&, HalResponse& resp, uint8_t type=0); void setCallBack(const EventCallback& callback, uint32_t clientHandle); - uint8_t getResponseId(); + uint8_t getResponseId() const; + void clearResponseId(); void setAsyncMode(bool continued); void setTimeout(uint32_t msec); - typedef boost::ptr_vector list_type; - list_type elements; - + HalExecBuffered::list_type elements; + private: FetControl* fetControl; HalExecBufferedPtr exec; @@ -110,5 +117,3 @@ namespace TI }; }; - -#endif /* DLL430_HALEXECCOMMAND_H */ diff --git a/DLL430_v3/src/TI/DLL430/HalExecElement.cpp b/DLL430_v3/src/TI/DLL430/HalExecElement.cpp index 166eb59..f3ed014 100644 --- a/DLL430_v3/src/TI/DLL430/HalExecElement.cpp +++ b/DLL430_v3/src/TI/DLL430/HalExecElement.cpp @@ -3,147 +3,140 @@ * * Buffer for sending. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "HalExecElement.h" - - -#include +#include using namespace TI::DLL430; -HalExecElement::HalExecElement (uint16_t functionId, uint8_t msgType) +HalExecElement::HalExecElement(uint16_t functionId, uint8_t msgType) : functionId(functionId) , msgType(msgType) - , inMinSize(0) - , outSize(0) , hasAddr(true) { } -HalExecElement::~HalExecElement () +void HalExecElement::appendInputData64(uint64_t data) +{ + this->appendInputData32(static_cast(data & 0xFFFFFFFF)); + this->appendInputData32(static_cast((data >> 32) & 0xFFFFFFFF)); +} + +void HalExecElement::appendInputData64(const uint64_t* data, size_t len) { + for (size_t i = 0; i < len; ++i) + appendInputData64(data[i]); } -void HalExecElement::appendInputData32 (uint32_t data) +void HalExecElement::appendInputData32(uint32_t data) { this->appendInputData16(static_cast(data & 0xFFFF)); this->appendInputData16(static_cast((data >> 16) & 0xFFFF)); } -void HalExecElement::appendInputData32 (uint32_t* data, size_t len) +void HalExecElement::appendInputData32(const uint32_t* data, size_t len) { for (size_t i = 0; i < len; ++i) appendInputData32(data[i]); - - this->inMinSize += len; } -void HalExecElement::appendInputData16 (uint16_t data) +void HalExecElement::appendInputData16(uint16_t data) { - this->inData.push_back(static_cast(data & 0xFF)); + this->inData.push_back(static_cast(data & 0xFF)); this->inData.push_back(static_cast((data >> 8) & 0xFF)); - this->inMinSize += sizeof(data); } -void HalExecElement::appendInputData16 (uint16_t* data, size_t len) +void HalExecElement::appendInputData16(const uint16_t* data, size_t len) { for (size_t i = 0; i < len; ++i) appendInputData16(data[i]); } -void HalExecElement::appendInputData16 (const std::vector::const_iterator& begin, const std::vector::const_iterator& end) +void HalExecElement::appendInputData16(const std::vector::const_iterator& begin, const std::vector::const_iterator& end) { std::vector::const_iterator it = begin; - for (; it < end; ++it) + for (; it < end; ++it) { this->appendInputData16(*it); } } -void HalExecElement::appendInputData8 (uint8_t data) +void HalExecElement::appendInputData8(uint8_t data) { this->inData.push_back(data); - this->inMinSize += sizeof(data); } -void HalExecElement::appendInputData8 (uint8_t* data, size_t len) +void HalExecElement::appendInputData8(const uint8_t* data, size_t len) { - for (size_t i = 0; i < len; ++i) + for (size_t i = 0; i < len; ++i) { this->inData.push_back(data[i]); } - this->inMinSize += len; } -void HalExecElement::appendInputData8 (const std::vector::const_iterator& begin, const std::vector::const_iterator& end) +void HalExecElement::appendInputData8(const std::vector::const_iterator& begin, const std::vector::const_iterator& end) { this->inData.insert(this->inData.end(), begin, end); - this->inMinSize += end-begin; } -void HalExecElement::setInputMinSize (size_t s) +void HalExecElement::setOutputSize(size_t len) { - this->inMinSize = s; -} - -uint16_t HalExecElement::getFunctionId() const -{ - return this->functionId; + this->outData.reserve(len); } -void HalExecElement::setOutputSize (size_t len) +const std::vector& HalExecElement::getOutput() const { - this->outSize = len; - this->outData.reserve(len); + return this->outData; } -const std::vector& HalExecElement::getOutput () const +uint64_t HalExecElement::getOutputAt64(size_t pos) const { - return this->outData; + return getOutputAt32(pos) | ((uint64_t)getOutputAt32(pos + 4) << 32); } -uint32_t HalExecElement::getOutputAt32 (size_t pos) const +uint32_t HalExecElement::getOutputAt32(size_t pos) const { - return (getOutputAt16(pos) | (getOutputAt16(pos+2) << 16)); + return getOutputAt16(pos) | (getOutputAt16(pos + 2) << 16); } -uint16_t HalExecElement::getOutputAt16 (size_t pos) const +uint16_t HalExecElement::getOutputAt16(size_t pos) const { - return (getOutputAt8(pos) | (getOutputAt8(pos+1) << 8)); + return getOutputAt8(pos) | (getOutputAt8(pos + 1) << 8); } -uint8_t HalExecElement::getOutputAt8 (size_t pos) const +uint8_t HalExecElement::getOutputAt8(size_t pos) const { if (pos < this->outData.size()) return this->outData[pos]; @@ -153,31 +146,23 @@ uint8_t HalExecElement::getOutputAt8 (size_t pos) const void HalExecElement::setAddrFlag(bool flag) { - hasAddr=flag; + hasAddr = flag; } -bool HalExecElement::getAddrFlag() +bool HalExecElement::getAddrFlag() const { return hasAddr; } -bool HalExecElement::addTransaction(uint8_t id) -{ - boost::mutex::scoped_lock lock(respRefMutex); - respRef[id]=0x00; - return true; -} - -bool HalExecElement::remTransaction(uint8_t id) +void HalExecElement::addTransaction(uint8_t id) { - boost::mutex::scoped_lock lock(respRefMutex); - respRef.erase(id); - return true; + boost::lock_guard lock(respRefMutex); + respRef[id] = 0x00; } uint8_t HalExecElement::checkTransaction(uint8_t id, uint8_t mask) { - boost::mutex::scoped_lock lock(respRefMutex); + boost::lock_guard lock(respRefMutex); std::map::iterator id_it; id_it = this->respRef.find(id); if (id_it == this->respRef.end()) @@ -192,18 +177,18 @@ uint8_t HalExecElement::checkTransaction(uint8_t id, uint8_t mask) uint8_t HalExecElement::changeTransaction(uint8_t id, uint8_t mask, bool set) { - boost::mutex::scoped_lock lock(respRefMutex); + boost::lock_guard lock(respRefMutex); std::map::iterator id_it; id_it = this->respRef.find(id); if (id_it == this->respRef.end()) { #ifndef NDEBUG - printf("HalExecElement::changeTransaction: %i not found\n",id); + printf("HalExecElement::changeTransaction: %i not found\n", id); #endif return 0; } - if(set) + if (set) return id_it->second |= mask; else return id_it->second &= (mask^0xff); diff --git a/DLL430_v3/src/TI/DLL430/HalExecElement.h b/DLL430_v3/src/TI/DLL430/HalExecElement.h index f15fecc..984c6d3 100644 --- a/DLL430_v3/src/TI/DLL430/HalExecElement.h +++ b/DLL430_v3/src/TI/DLL430/HalExecElement.h @@ -3,56 +3,41 @@ * * Buffer for sending. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_HALEXECELEMENT_H -#define DLL430_HALEXECELEMENT_H - -#include -#include -#include -#include -#define ACT_WAIT 0x10 -#define ACT_ACK_NEEDED 0x08 -#define ACT_DATA_RCV 0x01 -#define ACT_ACK_RCV 0x02 -#define ACT_NACK_RCV 0x04 -#define ACT_DATA_COMPLETE 0x20 -#define ACT_ASYNC_ACTIVE 0x40 +#include namespace TI { @@ -64,32 +49,30 @@ namespace TI class HalExecElement { public: - HalExecElement (uint16_t functionId, uint8_t msgType = 0x81); - ~HalExecElement (); - - void appendInputData32 (uint32_t); - void appendInputData32 (uint32_t* data, size_t dwords); - void appendInputData16 (uint16_t); - void appendInputData16 (uint16_t* data, size_t words); - void appendInputData16 (const std::vector::const_iterator& begin, const std::vector::const_iterator& end); - void appendInputData8 (uint8_t); - void appendInputData8 (uint8_t* data, size_t bytes); - void appendInputData8 (const std::vector::const_iterator& begin, const std::vector::const_iterator& end); - void setInputMinSize (size_t); - - uint16_t getFunctionId() const; + HalExecElement(uint16_t functionId, uint8_t msgType = 0x81); - void setOutputSize (size_t); - const std::vector& getOutput () const; - uint32_t getOutputAt32 (size_t pos) const; - uint16_t getOutputAt16 (size_t pos) const; - uint8_t getOutputAt8 (size_t pos) const; + void appendInputData64(uint64_t data); + void appendInputData64(const uint64_t* data, size_t dwords); + void appendInputData32(uint32_t); + void appendInputData32(const uint32_t* data, size_t dwords); + void appendInputData16(uint16_t); + void appendInputData16(const uint16_t* data, size_t words); + void appendInputData16(const std::vector::const_iterator& begin, const std::vector::const_iterator& end); + void appendInputData8(uint8_t); + void appendInputData8(const uint8_t* data, size_t bytes); + void appendInputData8(const std::vector::const_iterator& begin, const std::vector::const_iterator& end); + + void setOutputSize(size_t); + const std::vector& getOutput() const; + uint64_t getOutputAt64(size_t pos) const; + uint32_t getOutputAt32(size_t pos) const; + uint16_t getOutputAt16(size_t pos) const; + uint8_t getOutputAt8(size_t pos) const; void setAddrFlag(bool flag); - bool getAddrFlag(); + bool getAddrFlag() const; - bool addTransaction(uint8_t id); - bool remTransaction(uint8_t id); + void addTransaction(uint8_t id); uint8_t checkTransaction(uint8_t id, uint8_t flag); uint8_t changeTransaction(uint8_t id, uint8_t flag, bool set); @@ -100,12 +83,10 @@ namespace TI uint16_t functionId; uint8_t msgType; std::vector inData; - size_t inMinSize; std::vector outData; - size_t outSize; // key is response id and value transaction flags - std::map respRef; + std::map respRef; boost::mutex respRefMutex; bool hasAddr; @@ -113,5 +94,3 @@ namespace TI }; }; - -#endif /* DLL430_HALEXECELEMENT_H */ diff --git a/DLL430_v3/src/TI/DLL430/HalResponse.cpp b/DLL430_v3/src/TI/DLL430/HalResponse.cpp index a5d8905..154589f 100644 --- a/DLL430_v3/src/TI/DLL430/HalResponse.cpp +++ b/DLL430_v3/src/TI/DLL430/HalResponse.cpp @@ -3,38 +3,39 @@ * * Container and parser for a Response frame. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "HalResponse.h" using namespace TI::DLL430; @@ -48,20 +49,10 @@ HalResponse::HalResponse () { } -HalResponse::~HalResponse () -{ -} - void HalResponse::append (uint8_t* data, uint16_t len) { - if (!data || !len) - return; - - this->data.reserve(this->data.size() + len); - for (uint16_t i = 0; i < len; ++i) - { - this->data.push_back(data[i]); - } + if (data) + this->data.insert(this->data.end(), data, data+len); } void HalResponse::setId (uint8_t id) @@ -104,16 +95,6 @@ HalResponse::errorType HalResponse::getError () const return error; } -void HalResponse::setAck (bool rack) -{ - this->ack=rack; -} - -bool HalResponse::getAck () const -{ - return this->ack; -} - size_t HalResponse::getSize () const { return this->data.size(); diff --git a/DLL430_v3/src/TI/DLL430/HalResponse.h b/DLL430_v3/src/TI/DLL430/HalResponse.h index 0502b0e..d15365c 100644 --- a/DLL430_v3/src/TI/DLL430/HalResponse.h +++ b/DLL430_v3/src/TI/DLL430/HalResponse.h @@ -3,47 +3,39 @@ * * Container and parser for a Response frame. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_HALRESPONSE_H -#define DLL430_HALRESPONSE_H - -#include -#include -#include namespace TI { @@ -66,10 +58,9 @@ namespace TI Type_DataRequest = 0x94, Type_Status = 0x95 }; - + HalResponse (); - ~HalResponse (); - + void append (uint8_t* data, uint16_t len); void setId (uint8_t id); @@ -84,9 +75,6 @@ namespace TI void setError (errorType error); errorType getError () const; - void setAck (bool ack); - bool getAck () const; - size_t getSize() const; const std::vector& get() const; uint8_t at (size_t index) const; @@ -100,7 +88,5 @@ namespace TI bool ack; }; - }; -}; - -#endif /* DLL430_HALRESPONSE_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/HalResponseHandler.h b/DLL430_v3/src/TI/DLL430/HalResponseHandler.h index 17d2bbb..73d12d1 100644 --- a/DLL430_v3/src/TI/DLL430/HalResponseHandler.h +++ b/DLL430_v3/src/TI/DLL430/HalResponseHandler.h @@ -3,46 +3,39 @@ * * Interface to handle reponse Message from the HAL. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_HALRESPONSEHANDLER_H -#define DLL430_HALRESPONSEHANDLER_H - -#include -#include namespace TI { @@ -61,8 +54,6 @@ namespace TI virtual bool isContinuous() = 0; }; - typedef boost::shared_ptr HalResponseHandlerPtr; - }; -}; - -#endif /* DLL430_HALRESPONSEHANDLER_H */ + typedef std::shared_ptr HalResponseHandlerPtr; + } +} diff --git a/DLL430_v3/src/TI/DLL430/HidUpdateManager.cpp b/DLL430_v3/src/TI/DLL430/HidUpdateManager.cpp new file mode 100644 index 0000000..e1358df --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/HidUpdateManager.cpp @@ -0,0 +1,292 @@ +/* + * HidUpdateManager.h + * + * Recovery for broken eZ-FETs and MSP-FET Debuggers + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "HidUpdateManager.h" + +#include + +#include +#include +#include + +#include "MemoryContent.h" + +#include "../../../../Bios/include/eZ_FetCore.h" +#include "../../../../Bios/include/MSP_FetCore.h" + +using namespace TI::DLL430; +using namespace std; + +struct BslFetWrapper +{ + explicit BslFetWrapper(MSPBSL_Connection5xxUSB *ptr) : ptr_(ptr) + { + } + + BslFetWrapper& operator=(BslFetWrapper& bsl) + { + return *this; + } + + ~BslFetWrapper() + { + if (ptr_) + { + ptr_->closeBslconnection(); + delete ptr_; + } + + ptr_ = nullptr; + + hid_exit(); + } + + MSPBSL_Connection5xxUSB* get() + { + return ptr_; + } + + bool isNull() const + { + return ptr_ == nullptr; + } + + MSPBSL_Connection5xxUSB *ptr_; +}; + +uint32_t HidUpdateManager::countHidDevices(uint16_t productId) +{ + hid_device_info *hidDevices = hid_enumerate(MSPBSL_STANDARD_USB_VID, productId); + hid_device_info *hidDevicesIt = hidDevices; + + uint32_t count = 0; + while (hidDevicesIt != nullptr) + { + count++; + hidDevicesIt = hidDevicesIt->next; + } + hid_free_enumeration(hidDevices); + hid_exit(); + + return count; +} + + +HidUpdateManager::HidUpdateManager () +{ +} + +HidUpdateManager::~HidUpdateManager (){} + +bool HidUpdateManager::hid_firmWareUpdate(const char * fname, UpdateNotifyCallback callback) +{ + bool returnValue = false; + try + { + const bool eZRecoveryNeeded = (HidUpdateManager::countHidDevices(MSPBSL_EZ_FET_USB_PID) > 0); + const bool mspFetRecoveryNeeded = (HidUpdateManager::countHidDevices(MSPBSL_MSP_FET_USB_PID) > 0); + + uint16_t currentPid = 0; + if (eZRecoveryNeeded) + { + currentPid = MSPBSL_EZ_FET_USB_PID; + } + else if (mspFetRecoveryNeeded) + { + currentPid = MSPBSL_MSP_FET_USB_PID; + } + + //------------------------------------------------------------------------------------------ + BslFetWrapper bslWrapper(hid_enumerateBSL(currentPid)); + + if (bslWrapper.isNull()) + { + return false; + } + + uint32_t requiredUpdates = 3; + const uint32_t percent = 100/requiredUpdates; + + if (callback) + { + callback(BL_INIT, 0, 0); + callback(BL_PROGRAM_FIRMWARE, 0, 0); + callback(BL_DATA_BLOCK_PROGRAMMED, 0, 0); + } + + MemoryContent firmware; + + if (eZRecoveryNeeded) + { + uint16_t toolIdBSL = hid_getBSLToolId(bslWrapper.get()); + if (toolIdBSL == eZ_FET_WITH_DCDC || toolIdBSL == eZ_FET_WITH_DCDC_0X3FF || toolIdBSL == eZ_FET_NO_DCDC || toolIdBSL == eZ_FET_WITH_DCDC_NO_FLOWCT || toolIdBSL == eZ_FET_WITH_DCDC_V2x) + { + //load eZ-FET CORE imag ewith TOOL ID 0xAAAA -> DCDC Sub mcu is present + firmware.fromSRec(eZ_FetCoreImage, eZ_FetCoreImage_address, eZ_FetCoreImage_length_of_sections, eZ_FetCoreImage_sections); + } + } + else if (mspFetRecoveryNeeded) + { + uint16_t toolIdBSL = hid_getBSLToolId(bslWrapper.get()); + if (toolIdBSL == MSP_FET_WITH_DCDC || toolIdBSL == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetCoreImage, MSP_FetCoreImage_address, MSP_FetCoreImage_length_of_sections, MSP_FetCoreImage_sections); + } + } + + if (callback) + { + callback(BL_DATA_BLOCK_PROGRAMMED, (100-(--requiredUpdates)*percent), 0); + } + + returnValue = hid_updateCore(firmware, bslWrapper.get()); + + if (callback) + { + callback(BL_DATA_BLOCK_PROGRAMMED, (100-(--requiredUpdates)*percent), 0); + } + } + catch (...) + { + returnValue = false; + } + + if (callback) + { + callback(BL_DATA_BLOCK_PROGRAMMED, 100, 0); + callback(BL_UPDATE_DONE, 0, 0); + callback(BL_EXIT, 0, 0); + } + return returnValue; +} + +uint16_t HidUpdateManager::hid_getBSLToolId(MSPBSL_Connection5xxUSB* bsl) +{ + uint8_t data[2]; + // read tool-ID stored in BSL memory + bsl->TX_DataBlock(data, 0x100e, 2); + uint16_t toolId = data[1]; + toolId = toolId<<8; + toolId |= static_cast(data[0]); + return toolId; +} + +MSPBSL_Connection5xxUSB* HidUpdateManager::hid_enumerateBSL(uint16_t currentPid) +{ + string currentDevice = ""; + + if (currentPid == MSPBSL_MSP_FET_USB_PID) + { + currentDevice = "MSP430F6638"; + } + if (currentPid == MSPBSL_EZ_FET_USB_PID) + { + currentDevice = "MSP430F5528"; + } + + MSPBSL_Connection5xxUSB* BslFet = dynamic_cast(MSPBSL_Factory::getMSPBSL_Connection("DEVICE:" + currentDevice + " VID:0x2047 PID:0x"+ convertPid(currentPid) +"")); // works for 6638 and 5528 because of generic usb bsl + + if (BslFet) + { + if (BslFet->loadRAM_BSL(currentPid) != 0) + { + //Reset FET + BslFet->closeBslconnection(); + delete BslFet; + return 0; + } + string verString = "BUG"; + BslFet->TX_BSL_Version(verString); + } + + return BslFet; +} + +bool HidUpdateManager::hid_updateCore(const MemoryContent &firmware, MSPBSL_Connection5xxUSB* BslFet) const +{ + // erase reset vector of core + BslFet->massErase(); + BslFet->eraseSegment(0x197F); + BslFet->eraseSegment(0x18FF); + BslFet->eraseSegment(0x187F); + + // Info A hanlding -> unlock it + BslFet->toggleInfo(); + // erase Info A + BslFet->eraseSegment(0x19FF); + + if (firmware.segments.empty()) + { + return false; + } + + for (size_t i = 0; i < firmware.segments.size(); i++) + { + const DataSegment& seg = firmware.segments[i]; + + vector Buffer(seg.data.size()); + + MSPBSL_CRCEngine crcEngine("5xx_CRC"); + crcEngine.initEngine(0xFFFF); + + for (uint32_t n=0; n < seg.data.size(); n++) + { + Buffer[n]= (seg.data[n] & 0xff); + crcEngine.addByte(seg.data[n] & 0xff); + } + + BslFet->RX_DataBlockFast(&Buffer[0], (uint32_t)seg.startAddress&0xfffffffe, (uint16_t)seg.data.size()); + + uint16_t currentCoreCRC[1]; + BslFet->CRC_Check(currentCoreCRC, (uint32_t)seg.startAddress & 0xfffffffe, static_cast(seg.data.size())); + + uint32_t expectedCoreCRC = crcEngine.getHighByte()<<8; + expectedCoreCRC |= static_cast(crcEngine.getLowByte()); + + if (expectedCoreCRC != currentCoreCRC[0]) + { + if (i != 0)// just debug exeption + { + BslFet->closeBslconnection(); + return false; + } + } + + } + return true; +} diff --git a/DLL430_v3/src/TI/DLL430/HidUpdateManager.h b/DLL430_v3/src/TI/DLL430/HidUpdateManager.h new file mode 100644 index 0000000..479913a --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/HidUpdateManager.h @@ -0,0 +1,75 @@ +/* + * HidUpdateManager.h + * + * Recovery for broken eZ-FETs and MSP-FET Debuggers + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IUpdateManager.h" + +class MSPBSL_Connection5xxUSB; + +namespace TI +{ + namespace DLL430 + { + class MemoryContent; + + inline std::string convertPid(int pid) + { + std::stringstream tempPid; + tempPid << std::hex << pid; + return tempPid.str(); + } + + class HidUpdateManager + { + public: + static uint32_t countHidDevices(uint16_t productId); + + HidUpdateManager (); + ~HidUpdateManager (); + + bool hid_firmWareUpdate(const char* fname, UpdateNotifyCallback callback); + + private: + bool hid_updateCore(const MemoryContent &firmware, MSPBSL_Connection5xxUSB* bsl) const; + + MSPBSL_Connection5xxUSB* hid_enumerateBSL(uint16_t currentPid); + uint16_t hid_getBSLToolId(MSPBSL_Connection5xxUSB* bsl); + }; + + } +} diff --git a/DLL430_v3/include/DLL430/ConfigManager.h b/DLL430_v3/src/TI/DLL430/IConfigManager.h similarity index 58% rename from DLL430_v3/include/DLL430/ConfigManager.h rename to DLL430_v3/src/TI/DLL430/IConfigManager.h index d10742c..65f3899 100644 --- a/DLL430_v3/include/DLL430/ConfigManager.h +++ b/DLL430_v3/src/TI/DLL430/IConfigManager.h @@ -1,77 +1,68 @@ /* - * ConfigManager.h + * IConfigManager.h * * Handles JTAG communication. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_CONFIGMANAGER_H -#define DLL430_CONFIGMANAGER_H - -#include -#include -#include +#include "VersionInfo.h" +#include "IUpdateManager.h" -#include namespace TI { namespace DLL430 { - enum UPDATE_STATUS_MESSAGES { - BL_INIT = 0, /**< Initializing Update Bootloader */ - BL_ERASE_INT_VECTORS = 1, /**< Erasing mapped interrupt vectors */ - BL_ERASE_FIRMWARE = 2, /**< Erasing firmware memory section */ - BL_PROGRAM_FIRMWARE = 3, /**< Program new firmware */ - BL_DATA_BLOCK_PROGRAMMED = 4, /**< One data block of the new firmware was successfully programmed */ - BL_EXIT = 5, /**< Exit Update Bootlader and reboot firmware */ - BL_UPDATE_DONE = 6, /**< Update was successfully finished */ - BL_UPDATE_ERROR = 7, /**< An error occured during firmware update */ - BL_WAIT_FOR_TIMEOUT = 8 /**< An error occured during firmware update */ - }; - + static const uint16_t STOP_DEVICE = 0xA55A; + static const uint16_t MAIN_ERASE_MODE = 0x1A1A; + static const uint16_t MASS_ERASE_MODE = 0x1B1B; + static const uint16_t LONG_MAILBOX_MODE = 0x11; + + class IDeviceHandle; + class FetHandleManager; + class EnergyTraceManager; /** \brief manage the target device and the connection between FET and target device */ - class DLL430_SYMBOL ConfigManager + class IConfigManager { public: + virtual ~IConfigManager() {} + /** \brief get the version of the FET BIOS * * \return the version information */ - virtual VersionInfo getBiosVersion () const = 0; + virtual VersionInfo getHalVersion () const = 0; /** \brief set the VCC for the target device * @@ -86,63 +77,72 @@ namespace TI */ virtual uint16_t getDeviceVcc () const = 0; - /** \brief read out Biso core version and compare it against the internal image - * - * \return true when core version is identical - */ - virtual bool checkCoreVersion () = 0; - /** \brief get the external VCC of the target device * * \return the external VCC in mV */ virtual uint16_t getExternalVcc () const = 0; - /** \brief JTAG mode */ - enum jtagMode { - JTAG_MODE_4WIRE = 0, /**< 4-wire JTAG directly */ - JTAG_MODE_SPYBIWIRE = 1, /**< SpyBiWire (2-wire JTAG) */ - JTAG_MODE_4AFTER2 = 2, /**< use 4-wire JTAG after entry sequence with SpyBiWire */ - JTAG_MODE_AUTOMATIC =3, /**< no interface given -> detect */ - JTAG_MODE_UNDEF =4, /**< jtag mode not defined */ - }; - /** \brief JTAG speed */ enum JTAG_4WIRE_SPEED { - JTAG_4WIRE_SPEED_8_MHZ = 2, + JTAG_4WIRE_SPEED_15_MHZ = 1, + JTAG_4WIRE_SPEED_8_MHZ = 2, JTAG_4WIRE_SPEED_4_MHZ = 4, JTAG_4WIRE_SPEED_2_MHZ = 8, JTAG_4WIRE_SPEED_1_MHZ = 16, JTAG_4WIRE_SPEED_500_KHZ = 32, - JTAG_4WIRE_SPEED_250_KHZ = 64 + JTAG_4WIRE_SPEED_250_KHZ = 64, + JTAG_4WIRE_SPEED_750_KHZ = 128 + }; + + /** \brief VCC_SUPPLY opptions for eZ-FET */ + typedef enum VCC_SUPPLY + { + NO_SUPPLY = 0x04, + ET_OFF = 0x05, + ET_ON = 0x06, + LDO_OFF = 0x07, + ALL_OFF = 0x8, + LDO_ON = 0x09 + } VCC_SUPPLY_T; + + enum JTAG_2WIRE_SPEED + { + JTAG_2WIRE_SPEED_1200_KHZ = 0x800A, + JTAG_2WIRE_SPEED_600_KHZ = 0x600A, + JTAG_2WIRE_SPEED_400_KHZ = 0x400A, + JTAG_2WIRE_SPEED_200_KHZ = 0x200A, + JTAG_2WIRE_SPEED_100_KHZ = 0x100A + }; + /** \brief select a JTAG mode * * \param mode select the mode to use (default: JTAG_MODE_4WIRE) */ - virtual void setJtagMode (jtagMode mode) = 0; + virtual void setJtagMode(INTERFACE_TYPE mode) = 0; /** \brief select JTAG speed * * \param speed is the devicer for SPI moudule */ - virtual bool setJtagSpeed(JTAG_4WIRE_SPEED speed) = 0; + virtual bool setJtagSpeed(JTAG_4WIRE_SPEED speedJtag, JTAG_2WIRE_SPEED speedSbw) = 0; /** \get Interface mode SBW2, SBW4 or JTAG * * \return selected JTAG protocol */ - virtual jtagMode getInterfaceMode() const = 0; + virtual INTERFACE_TYPE getInterfaceMode(TARGET_ARCHITECTURE_t arch) const = 0; /** \brief start JTAG control (without sync) * * \return true if JTAG was started successfully, else false */ - virtual uint16_t start() = 0; + virtual int16_t start() = 0; /** \brief start JTAG control (without sync) * * \return true if JTAG was started successfully, else false */ - virtual uint16_t start(const std::string& pwd, uint32_t deviceCode) = 0; - + virtual int16_t start(const std::string& pwd, uint32_t deviceCode) = 0; + /** \brief stop JTAG control * * \param pwd start with password @@ -152,23 +152,22 @@ namespace TI virtual bool stop () = 0; /** \brief reset the target device - * + * * \param vcc turn VCC off and on * \param pin pull the reset pin (in microSeconds) * \return true if every step was successful, else false */ - virtual bool reset (bool vcc, uint16_t pin = 0 ,uint16_t JtagId =0) = 0; + virtual bool reset(bool vcc, bool nmi, uint16_t JtagId, uint32_t rstHalId) = 0; - typedef boost::function3 FetNotifyCallback; /** \brief perform firmwareupdate * - * \param fname defines the TI-txt file to be used for update or NULL for internal image - * \param callback defines the callback for update messages or NULL for no messages + * \param fname defines the TI-txt file to be used for update or nullptr for internal image + * \param callback defines the callback for update messages or nullptr for no messages * \param clientHandle reference given by the caller instance, returned in callback * \return true on success - */ - virtual bool firmWareUpdate(const char *fname, FetNotifyCallback callback = 0) = 0; + */ + virtual bool firmWareUpdate(const char * fname, UpdateNotifyCallback callback = 0, bool* coreUpdate = 0) = 0; /** \brief set device password * @@ -180,15 +179,43 @@ namespace TI * * \param deviceCode for devices that need more specific identification (L092) */ - virtual bool setDeviceCode(uint32_t deviceCode = 0) = 0; + virtual bool setDeviceCode(uint32_t deviceCode = 0 )= 0; /** \brief check if calibration before flash access is enabled */ virtual bool freqCalibrationEnabled() const = 0; - virtual bool totalErase() = 0; - }; - }; -}; + virtual void init() = 0; + + virtual long MSP430I_MagicPattern(uint16_t ifMode) = 0; + + virtual bool isUpdateRequired(TARGET_ARCHITECTURE_t arch) const = 0; + + virtual bool jtagErase(uint16_t eraseKey) = 0; + + virtual void setEnergyTraceManager(EnergyTraceManager*) = 0; + + virtual bool isEnergyTraceSupported() = 0; + + virtual void setCurrentDrive(uint32_t value) = 0; + + virtual bool configureJtagSpeed(uint32_t speed = 0) = 0; -#endif /* DLL430_CONFIGMANAGER_H */ + virtual bool ulpDebugEnabled() const = 0; + + virtual bool atProbeStateEnabled() const = 0; + + virtual void setUlpDebug(bool ulp = false)= 0; + + virtual bool configureOverCurrent(bool state = false) = 0; + + virtual void setDisableInterruptsMode(uint32_t mode) = 0; + + virtual uint32_t getDisableInterruptsMode() const = 0; + + virtual bool updateDisableInterruptsMode() = 0; + + virtual bool setJTAGLock5xx(uint32_t value) = 0; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/IDataProcessor.h b/DLL430_v3/src/TI/DLL430/IDataProcessor.h new file mode 100644 index 0000000..27d41d0 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/IDataProcessor.h @@ -0,0 +1,108 @@ +/* + * IDataProcessor.h + * + * Generic Interface class for providing a module that can take serial input data and produce output data. + * + * Copyright (c) 2007 - 2016 Texas Instruments Incorporated - http://www.ti.com/ + * + * All rights reserved not granted herein. + * Limited License. + * + * Texas Instruments Incorporated grants a world-wide, royalty-free, + * non-exclusive license under copyrights and patents it now or hereafter + * owns or controls to make, have made, use, import, offer to sell and sell ("Utilize") + * this software subject to the terms herein. With respect to the foregoing patent + * license, such license is granted solely to the extent that any such patent is necessary + * to Utilize the software alone. The patent license shall not apply to any combinations which + * include this software, other than combinations with devices manufactured by or for TI (“TI Devices”). + * No hardware patent is licensed hereunder. + * + * Redistributions must preserve existing copyright notices and reproduce this license (including the + * above copyright notice and the disclaimer and (if applicable) source code license limitations below) + * in the documentation and/or other materials provided with the distribution + * + * Redistribution and use in binary form, without modification, are permitted provided that the following + * conditions are met: + * + * * No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any + * software provided in binary form. + * * any redistribution and use are licensed by TI for use only with TI Devices. + * * Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code. + * + * If software source code is provided to you, modification and redistribution of the source code are permitted + * provided that the following conditions are met: + * + * * any redistribution and use of the source code, including any resulting derivative works, are licensed by + * TI for use only with TI Devices. + * * any redistribution and use of any object code compiled from the source code and any resulting derivative + * works, are licensed by TI for use only with TI Devices. + * + * Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or + * promote products derived from this software without specific prior written permission. + * + * DISCLAIMER. + * + * THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +namespace TI +{ + namespace DLL430 + { + class IDataProcessor + { + public: + /** + * \brief Constructor creates the two buffers + * \param size The desired size of the buffers + */ + IDataProcessor() + { + } + + virtual ~IDataProcessor() + { + } + + /** + * \brief Resets the internal state of the processor + */ + virtual void Reset() = 0; + + /** + * \brief Add data to be processed + * \param data The data element to be written + * \return Indicates whether new output data is available for reading + */ + virtual bool AddData(void *data, size_t size) = 0; + + /** + * \brief Get the pointer for reading data from the buffer + * \return A pointer to the current read buffer + */ + virtual void* GetReadBufferPtr() = 0; + + /** + * \brief Get the buffer size + * \return the size + */ + virtual size_t GetReadBufferSize() = 0; + + virtual void setTimerStep(uint32_t step) {} + + virtual void setResistorValues(double *resistorValues) {} + + virtual void setCalibrationValues(double *calibrationValues, uint16_t vcc) = 0; + + virtual void setPrevSample(double){}; + }; + } +} diff --git a/DLL430_v3/include/DLL430/DebugManager.h b/DLL430_v3/src/TI/DLL430/IDebugManager.h similarity index 72% rename from DLL430_v3/include/DLL430/DebugManager.h rename to DLL430_v3/src/TI/DLL430/IDebugManager.h index 884f20b..5c8a229 100644 --- a/DLL430_v3/include/DLL430/DebugManager.h +++ b/DLL430_v3/src/TI/DLL430/IDebugManager.h @@ -1,53 +1,41 @@ /* - * DebugManager.h + * IDebugManager.h * * Provides routines for handling a debug session. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DEBUGMANAGER_H -#define DLL430_DEBUGMANAGER_H - -#include - -#include -#include -#include - -#include namespace TI { @@ -79,7 +67,7 @@ namespace TI enum TriggerModeType { Options, Dma, - ReadWrite + ReadWrite }; enum TraceMode { @@ -109,7 +97,8 @@ namespace TI Storage, VariableWatch, Lpm5Sleep, - Lpm5Wakeup + Lpm5Wakeup, + EnergyTraceData, }; /** \brief called once for each debug event @@ -119,13 +108,17 @@ namespace TI virtual void event(EventType e, uint32_t lParam=0, uint16_t wParam=0) = 0; }; + class PollingManager; + /** \brief manage debug actions on the target device */ - class DLL430_SYMBOL DebugManager + class IDebugManager { public: + virtual ~IDebugManager() {} + /** \brief reestablish JTAG connection after releasing it * - * Function will reconnect JTAG and resume any polling + * Function will reconnect JTAG and resume any polling * * \return true if run started successfully, else false */ @@ -151,7 +144,7 @@ namespace TI * \return true if stopped successfully, else false */ virtual bool stop (bool jtagWasReleased = false) = 0; - + /** \brief do a single step * * A SingleStep is performed on the target device. When this function returns, @@ -167,7 +160,7 @@ namespace TI * * the returned value depends on the identification of the device * and the database - * + * * \return level of clock control (1-3) */ virtual uint8_t getClockControl() const = 0; @@ -175,45 +168,41 @@ namespace TI /** \brief return the general clock control setting * * return the 16Bit control value - * + * * \return control value */ virtual uint16_t getClockControlSetting() const =0; - /** \brief set the general clock control setting + /** \brief return the default generals clock control setting + * + * return the 16Bit control value * - * set the 16Bit control value + * \return control value */ - virtual void setClockControlSetting(uint16_t clkcntrl)=0; + virtual uint16_t getGeneralClockDefaultSetting() const = 0; /** \brief return the default clock control module setting * - * return the 16Bit control value - * + * return the 32Bit control value + * * \return control value */ - virtual uint16_t getClockModuleDefaultSetting() const =0; + virtual uint32_t getClockModuleDefaultSetting() const =0; /** \brief return the clock control module setting * - * return the 16Bit control value - * - * \return control value - */ - virtual uint16_t getClockModuleSetting() const =0; - - /** \brief set the clock control module setting + * return the 32Bit control value * - * set the 16Bit control value + * \return control value */ - virtual void setClockModuleSetting(uint16_t modules)=0; + virtual uint32_t getClockModuleSetting() const =0; /** \brief return module strings * * the returned value depends on the identification of the device * and the database - * - * \param n pointer to given value filled with number of strings + * + * \param n pointer to given value filled with number of strings * * \return pointer to n strings */ @@ -223,40 +212,18 @@ namespace TI * * the returned value depends on the identification of the device * and the database - * - * \param n pointer to given value filled with number of strings + * + * \param n pointer to given value filled with number of strings * * \return pointer to n strings */ virtual char ** getClockStrings(uint32_t * n) const = 0; - /** \brief write a value directly to an EEM register - * - * implements the corresponding API call - * - * \param reg register to write - * \param value value to write into register - * - * \return true if successfull, otherwise false - */ - virtual bool eemWriteRegister(uint32_t reg, uint32_t value)= 0; - - /** \brief read a value directly from an EEM register - * - * implements the corresponding API call - * - * \param reg register to write - * \param value the pointer to a existing variable which is filled with register content - * - * \return true if successfull, otherwise false - */ - virtual bool eemReadRegister(uint32_t reg, uint32_t* buffer)= 0; - /** \brief init the EEM-Register * * depending on the target hardware, the existing EEM-register are * set to default (0) - * + * * \return true if data is successfully written to device, else false */ virtual bool initEemRegister() = 0; @@ -264,7 +231,7 @@ namespace TI /** \brief Enable eem polling loop * * \param mask of events to poll for - * + * * \return true if successfull, otherwise false */ virtual bool activatePolling(uint16_t) = 0; @@ -272,33 +239,25 @@ namespace TI /** \brief Enable polling of JState register * * \param cb Callback target to handle jstate changes - * + * * \return true if successfull, otherwise false */ - virtual bool activateJStatePolling(DebugEventTarget * cb) = 0; + virtual bool activateJStatePolling(DebugEventTarget* cb) = 0; /** \brief Check if device is in low power mode x.5 * * Queries the device and returns the current state - * - * \return true if device is in LPMx.5 - */ - virtual bool queryLpm5State() = 0; - - /** \brief Return current low power mode x.5 state * - * Returns the last reported state without actively querying - * * \return true if device is in LPMx.5 */ - virtual bool isDeviceInLpm5() = 0; + virtual bool queryIsInLpm5State() = 0; /** \brief set the opcode parameter * * needed for ID_RestoreContext_ReleaseJtag and set by SET_MDB_BEFORE_RUN - * + * * \param value opcode to be used by ID_RestoreContext_ReleaseJtag - * + * * \return true if successfull, otherwise false */ virtual void setOpcode(uint16_t value)=0; @@ -312,13 +271,6 @@ namespace TI */ virtual bool saveContext()=0; - /** \brief get the current response ID of a loop response (breakpoint, etc.) - * - * synchronize the call and response of a loop command - * - * \return true on success - */ - virtual uint8_t getRunEemResponseId()=0; /** \brief enable/disable low power mode debugging * * synchronize the call and response of a loop command @@ -336,7 +288,7 @@ namespace TI * */ virtual void pausePolling()=0; - + /** \brief Resume all polling loops * * @@ -366,15 +318,19 @@ namespace TI * */ virtual bool startStoragePolling() = 0; - + /** \brief Stop polling loop for state storage events on UIF * * */ virtual bool stopStoragePolling() = 0; - }; - }; -}; + virtual void setPollingManager(PollingManager* pollingManager) = 0; + + virtual void enableLegacyCycleCounter(bool enable) = 0; + virtual bool legacyCycleCounterEnabled() const = 0; + virtual bool setPCtoSafeLocation() = 0; + }; -#endif /* DLL430_DEBUGMANAGER_H */ + } +} diff --git a/DLL430_v3/include/DLL430/DeviceHandle.h b/DLL430_v3/src/TI/DLL430/IDeviceHandle.h similarity index 53% rename from DLL430_v3/include/DLL430/DeviceHandle.h rename to DLL430_v3/src/TI/DLL430/IDeviceHandle.h index 103ba1d..1bf4617 100644 --- a/DLL430_v3/include/DLL430/DeviceHandle.h +++ b/DLL430_v3/src/TI/DLL430/IDeviceHandle.h @@ -1,70 +1,67 @@ /* - * DeviceHandle.h + * IDeviceHandle.h * * Interface for providing pointers to classes necessary to communicate with one device. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DeviceHandle_H -#define DLL430_DeviceHandle_H - -#include -#include -#include -#include -#include +#include "IMemoryManager.h" +#include "IDebugManager.h" +#include "EM/EmulationManager/IEmulationManager.h" +#include "FuncletCode.h" +#include namespace TI { namespace DLL430 { - class IEmulationManager; - typedef boost::shared_ptr EmulationManagerPtr; + class ClockCalibration; + class FetHandle; + class WatchdogControl; + class HalExecCommand; - class DLL430_SYMBOL DeviceHandle + class IDeviceHandle { public: - virtual ~DeviceHandle () {}; + virtual ~IDeviceHandle () {}; /** \brief the memory manager * * \return pointer to a memory manager instance */ - virtual MemoryManager* getMemoryManager () = 0; + virtual IMemoryManager* getMemoryManager () = 0; /** \brief the emulation manager * @@ -76,28 +73,15 @@ namespace TI * * \return pointer to a debug manager instance */ - virtual DebugManager* getDebugManager () = 0; - - /** \brief file handle - * - * \return pointer to the file referece instance - */ - virtual FileFunc* getFileRef() = 0; + virtual IDebugManager* getDebugManager () = 0; - /** \brief write segment data to device - * - * the data of a file is written to the device using the memory manager - * - * \return true on success - */ - virtual bool writeSegments() = 0; /** \brief identify device by stopping and sending into LPM4 or BSL memory * * depending on the family the device is detected * * \return true on success */ - virtual long magicPatternSend() =0; + virtual long magicPatternSend(uint16_t ifMode) =0; /** \brief identify device * @@ -105,7 +89,7 @@ namespace TI * * \return true on success */ - virtual long identifyDevice (uint32_t activationKey) = 0; + virtual int32_t identifyDevice(uint32_t activationKey, bool afterMagicPattern) = 0; /** \brief return description string of device * @@ -113,90 +97,44 @@ namespace TI * * \return string */ - virtual const std::string & getDescription() = 0; - - /** \brief send sync command - * - * call ID_SyncJtag_AssertPor_SaveContext macro - * - * \return true on success - */ - virtual bool sendSyncCommand() = 0; - - /** \brief write segment data to device - * - * verify the data of a file with written data using the memory manager - * - * \return true on success - */ - virtual bool verifySegments() = 0; + virtual const std::string & getDescription() const = 0; /** \brief reset the device (power-on-reset) - * + * * \return true if every step was successful, else false */ - virtual bool reset () = 0; + virtual bool reset (bool hardReset = false) = 0; /** \brief stores the device ID which was read out from the target - * + * * \param id which was given back from the target */ - virtual void setDeviceId (long id) = 0; + virtual int32_t setDeviceId (long id) = 0; /** \brief returns the jtag id of the identified device - * + * * \return stored jtag id, defaults to 0x00 if no detection happened */ - virtual uint8_t getJtagId() = 0; - - /** \brief returns the core ip id of the identified device - * - * \return stored coreip id, defaults to 0x00 if no detection happened - */ - virtual uint16_t getCoreIpId() = 0; - - /** \brief returns the memory location containing device id data - * - * \return address of id data - */ - virtual uint32_t getIdDataAddr() =0; + virtual uint32_t getJtagId() = 0; /** \brief checks if the device is locked (fuse blown) - * + * * \return true if device is locked */ virtual bool isJtagFuseBlown() =0; - /** \brief retrieve sub id from device - * - * \param info_len info data size of device - * \param deviceIdPtr address of info data - * \param pc program counter to restore after reading - * - * \return sub id - */ - virtual uint16_t getSubID(uint32_t info_len, uint32_t deviceIdPtr , uint32_t pc) = 0; - - /** \brief returns the address of the TLV area of the device - * + * * \return stored address, defaults to 0x00 if not avaiable */ virtual uint32_t getDeviceIdPtr() = 0; /** \brief returns the EEM Id - * + * * \return value of EEM address 0x86 (EEMVER), defaults to 0 */ virtual uint32_t getEemVersion() = 0; - /** \brief JTAG mode */ - enum jtagMode { - JTAG_MODE_4WIRE = 0, /**< 4-wire JTAG directly */ - JTAG_MODE_SPYBIWIRE = 1, /**< SpyBiWire (2-wire JTAG) */ - JTAG_MODE_4AFTER2 = 2, /**< use 4-wire JTAG after entry sequence with SpyBiWire */ - }; - /** \brief secure the device by blowing the fuse * * \return true if securing the device successfully, else false @@ -208,13 +146,39 @@ namespace TI * \return true if the device has FRAM */ virtual bool hasFram() const = 0; - protected: - private: + /** \brief return whether the device supports LPMx.5 + * + * \return true if the device supports LPMx.5 + */ + virtual bool hasLPMx5() const = 0; - }; + /** \brief disable device halt when waking from LPMx.5 + */ + virtual void disableHaltOnWakeup() = 0; - }; -}; + /** \brief is EEM module accessible while in LPM + */ + virtual bool eemAccessibleInLpm() const = 0; + + /** \brief is EnergyTrace (ET7) supported by selected device and revision + */ + virtual bool deviceSupportsEnergyTrace() const = 0; + + virtual hal_id checkHalId(hal_id base_id) const = 0; + virtual bool send (HalExecCommand &command) = 0; + virtual bool supportsQuickMemRead() const = 0; + virtual const FuncletCode& getFunclet(FuncletCode::Type funclet) = 0; + virtual ClockCalibration* getClockCalibration() = 0; + virtual FetHandle* getFetHandle () = 0; + virtual std::shared_ptr getWatchdogControl() const = 0; + virtual uint16_t getMinFlashVcc() const = 0; + virtual uint32_t getDeviceCode() const = 0; + virtual uint32_t readJtagId() = 0; + virtual TARGET_ARCHITECTURE_t getTargetArchitecture() const = 0; + virtual INTERFACE_TYPE getInterfaceMode() = 0; + virtual bool restoreTinyRam() = 0; + }; -#endif /* DLL430_DeviceHandle_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/IDeviceHandleManager.h b/DLL430_v3/src/TI/DLL430/IDeviceHandleManager.h new file mode 100644 index 0000000..7b8c77a --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/IDeviceHandleManager.h @@ -0,0 +1,62 @@ +/* + * IDeviceHandleManager.h + * + * Controls access to one or more DeviceHandles. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IDeviceHandle.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandleManager + { + public: + + virtual ~IDeviceHandleManager () {}; + + virtual IDeviceHandle* createDeviceHandle(uint32_t device_code, INTERFACE_TYPE iMode) = 0; + + /** \brief destroy a given device handle + * + * \param handle the device handle to destroy + */ + virtual void destroyDeviceHandle (IDeviceHandle*) = 0; + }; + + } +} diff --git a/DLL430_v3/include/DLL430/FetHandle.h b/DLL430_v3/src/TI/DLL430/IFetHandle.h similarity index 72% rename from DLL430_v3/include/DLL430/FetHandle.h rename to DLL430_v3/src/TI/DLL430/IFetHandle.h index af011bf..b632868 100644 --- a/DLL430_v3/include/DLL430/FetHandle.h +++ b/DLL430_v3/src/TI/DLL430/IFetHandle.h @@ -1,62 +1,56 @@ /* - * FetHandle.h + * IFetHandle.h * * Interface for fet handle definition. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FetHandle_H -#define DLL430_FetHandle_H - -#include -#include -#include -#include -#include -#include +#include "VersionInfo.h" +#include "IConfigManager.h" +#include "IMemoryManager.h" +#include "IDebugManager.h" +#include "IDeviceHandleManager.h" -#include namespace TI { namespace DLL430 { //Commands for HilCommand macro - enum HIL_COMMAND { + enum HIL_COMMAND + { HIL_CMD_RESET_JTAG_TAP, HIL_CMD_OPEN, HIL_CMD_CONNECT, @@ -68,10 +62,19 @@ namespace TI HIL_CMD_QUERY_JSTATE, HIL_CMD_WRITE_JMB, HIL_CMD_READ_JMB, + HIL_CMD_CONFIGURE, + HIL_CMD_BSL, + HIL_CMD_FUSE_CHECK, + HIL_CMD_JTAG_IR4, + HIL_CMD_DPACC, + HIL_CMD_APACC, + HIL_CMD_MEMAP, + HIL_CMD_BSL_1XX_4XX, + HIL_CMD_TCLK }; //Pin definitions for setJtagPin - enum JTAG_PIN + enum JTAG_PIN { JTAG_PIN_TMS = 0, JTAG_PIN_TDI = 1, @@ -82,18 +85,19 @@ namespace TI JTAG_PIN_TST = 8 }; - typedef boost::function4 NotifyCallback; + class FetHandleManager; + class HalExecCommand; /** \brief a handle to act on a target * * This class acts as a container for the different managers * that contain the functional parts for target device interactions. */ - class DLL430_SYMBOL FetHandle + class IFetHandle { public: - virtual ~FetHandle () {}; - + virtual ~IFetHandle () {}; + /** \brief the DLL version of this handle * * \return the version information @@ -104,36 +108,38 @@ namespace TI * * \return the version information */ - virtual std::vector * getHwVersion() =0; + const virtual std::vector* getHwVersion() const = 0; /** \brief the firmware version information as given back from the UIF (emty if LPT) * * \return the version information */ - virtual std::vector * getSwVersion() =0; + const virtual std::vector* getSwVersion() const = 0; /** \brief the configuration manager * * \return pointer to a configuration manager instance */ - virtual ConfigManager* getConfigManager () = 0; + virtual IConfigManager* getConfigManager() = 0; /** \brief the device handle manager * * \return pointer to a device handle manager instance - */ - virtual DeviceHandleManager* getDeviceHandleManager () = 0; + */ + virtual IDeviceHandleManager* getDeviceHandleManager () = 0; /** \brief configure and send the kill command * * \return true on success - */ + */ + virtual bool kill(HalExecCommand &command) = 0; + virtual bool kill(uint8_t respId) = 0; /** \brief pauses a command that is running in a loop in firmware * * \return true on success - */ + */ virtual bool pauseLoopCmd(unsigned long respId) = 0; /** \brief resumes a paused a command loop @@ -145,18 +151,19 @@ namespace TI /** \brief return if there is any communication to UIF * * \return true on success - */ - virtual bool hasCommunication() = 0; - + */ + virtual bool hasCommunication() const = 0; + + typedef std::function NotifyCallback; /** \brief install a callback for system messages (USB plug events, etc) * * \param notifyCallback this will be called on enexpected evente - */ + */ virtual void addSystemNotifyCallback(const NotifyCallback& notifyCallback) = 0; /** \brief shutdown communication with Fet * - */ + */ virtual void shutdown() = 0; /** \brief send low level hil commands @@ -165,15 +172,15 @@ namespace TI * \param data the instruction or data to shift * \param bitSize the number of bits for data shifts */ - virtual bool sendHilCommand(HIL_COMMAND command, uint32_t data = 0) = 0; - + virtual bool sendHilCommand(HIL_COMMAND command, uint32_t data = 0) = 0; + /** \brief send low level jtag shifts * * \param shiftType the type of jtag shift to perform * \param data the instruction or data to shift * \param bitSize the number of bits for data shifts */ - virtual uint64_t sendJtagShift(HIL_COMMAND shiftType, uint64_t data, long bitSize = 16) = 0; + virtual uint64_t sendJtagShift(HIL_COMMAND shiftType, uint64_t data, int32_t bitSize = 16) = 0; /** \brief send low level hil commands * @@ -181,9 +188,13 @@ namespace TI * \param state set the pin high (1) or low(0) */ virtual bool setJtagPin(JTAG_PIN pin, bool state) = 0; + + /** \brief reset internal state of FET + */ + virtual bool resetState() = 0; + + virtual std::string getCurrentPortName() = 0; }; }; }; - -#endif /* DLL430_FetHandle_H */ diff --git a/DLL430_v3/src/TI/DLL430/IMemoryManager.h b/DLL430_v3/src/TI/DLL430/IMemoryManager.h new file mode 100644 index 0000000..d08a8b9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/IMemoryManager.h @@ -0,0 +1,229 @@ +/* + * IMemoryManager.h + * + * Handles access to different memory modules by means of address. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + + +#include "MemoryArea.h" + +namespace TI +{ + namespace DLL430 + { + class CpuRegisters; + + /** \brief manages global address space or all memory areas */ + class IMemoryManager + { + public: + virtual ~IMemoryManager() {} + + /** \brief get a memory area by name and sub-index + * + * \param name the name of the area + * \param subIndex addresses multiple areas of the same name (usually 0) + * \return pointer to a memory area if the combination of name and subIndex exists, else 0 + */ + virtual MemoryArea* getMemoryArea(MemoryArea::Name type, size_t subIndex = 0) = 0; + + /** \brief get the index by memory area by name and address + * + * \param name the name of the area + * \param addresses of memory area to be accessed + * \param size lenght of memory access + * \return index of area + */ + virtual int16_t getMemoryAreaIndex(MemoryArea::Name type, uint32_t address = 0, uint32_t size = 0) = 0; + + /** \brief get a memory area by index + * + * \param index the index of the area + * \return pointer to a memory area if index is valid, else 0 + */ + virtual MemoryArea* getMemoryArea(size_t index) = 0; + + virtual CpuRegisters* getCpuRegisters(size_t index = 0) = 0; + + /** \brief get the number of memory areas + * + * \return the number of memory areas + */ + virtual size_t count() const = 0; + + /** \brief read from memory + * + * This registers a read call. The content of buffer is undefined + * until you call the sync() method. + * + * \param address the first address + * \param buffer the buffer to write the read data to + * \param count the number of elements to read + * \return true if the read was registered successfully, else false + */ + virtual bool read(uint32_t address, uint8_t* buffer, size_t count) = 0; + + /** \brief overwrite memory + * + * Convenience function for flash memory (internally handles erase, etc.) + * + * \param address the first address + * \param buffer the buffer to read the data to write from + * \param count the number of elements to write + * \return true if the write was registered successfully, else false + */ + virtual bool overwrite(uint32_t address, const uint8_t* buffer, size_t count) = 0; + + /** \brief write to memory + * + * This registers a write call. The content of buffer must stay valid + * until you call the sync() method. + * + * \param address the first address + * \param buffer the buffer to read the data to write from + * \param count the number of elements to write + * \return true if the write was registered successfully, else false + */ + virtual bool write(uint32_t address, const uint8_t* buffer, size_t count) = 0; + + /** \brief write to memory + * + * This registers a write call. The transfer is delayed + * until you call the sync() method. + * + * \param address the first address + * \param value the value to write to address + * \return true if the write was registered successfully, else false + */ + virtual bool write(uint32_t address, uint32_t value) = 0; + + /** \brief This function must be called after using read() or write() + * + * This function MUST be called to complete a read or write call. + * Reads and writes can be combined in any order unless they are inter-dependent. + * + * \return true if the sync was successfull, else false + */ + virtual bool sync() = 0; + + /** \brief erase a flash area completely + * + * This function erases a complete flash area. It will do nothing + * if the area is not a flash. + * + * \return true if flash was erased successfully, else false + */ + virtual bool erase() = 0; + + /** \brief erase a flash segment + * + * This function erases a flash segment. It will do nothing + * if the area is not a flash. The given start and end address + * mark all segments that any of the addresses in this range + * is in as to be erased. The addresses to no have to be aligned + * to segment size. + * + * \param start the first address + * \param end the last address + * \param if true forces to unlock any memory protection (for example disables MPU lock bit) + * \return true if flash segments were erased successfully, else false + */ + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) = 0; + + /** \brief verify memory content + * + * This function verifies the contents of memory by using the + * Pseudo Signature Algorithm (PSA). This is a lot faster then reading + * all memory since the PSA is executed on the target device itself. + * Note that this will flush all affected cache contents. + * + * \param address the first address + * \param buffer the data to verify against (one byte per buffer element) + * \param count the number of buffer elements + * \return true if the PSA values matched, else false + */ + virtual bool verify(uint32_t address, const uint8_t* buffer, size_t count) = 0; + + /** \brief check of the area is cacheable + * + * \return true if the area is readOnly, else false + */ + virtual bool isReadOnly() const = 0; + + /** \brief Locks/unlocks desired memory module. + * Memory Module is identified by name. + * Action == true locks module, + * Action == false unlocks module. + * \return true if module isProtected and the state switched actually from + * locked to unlocked or vice versa, false otherwise. + */ + virtual bool lock(MemoryArea::Name name, bool action) = 0; + + /** \brief get last error code + * + * Read and reset the last error code that occured during a memory operation. + * + * \return Error code + */ + virtual MemoryError getLastError() = 0; + + /** \brief Enable/disable preservation of Ram + * + * Ram will be saved and restored for operations that can modify Ram content + * if set to true. + * + */ + virtual void setRamPreserveMode(bool enabled) = 0; + + /** \brief Current Ram preservation mode + * + * Get current setting for Ram preservation + * + * \return Current state (enabled or not) + */ + virtual bool getRamPreserveMode() const = 0; + + /** \brief Check voltage for flash programming + * + * Check internal and external voltage against minimum voltage + * + * \return Voltage sufficient + */ + virtual bool checkMinFlashVoltage() const = 0; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/IUpdateManager.h b/DLL430_v3/src/TI/DLL430/IUpdateManager.h new file mode 100644 index 0000000..f1872a9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/IUpdateManager.h @@ -0,0 +1,92 @@ +/* + * IUpdateManager.h + * + * Provides routines for update handling for various debuggers + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include +#include "VersionInfo.h" + + +static const uint16_t MSPBSL_STANDARD_USB_VID = 0x2047; +static const uint16_t MSPBSL_EZ_FET_USB_PID = 0x0203; +static const uint16_t MSPBSL_MSP_FET_USB_PID = 0x0204; + +static const uint16_t eZ_FET_WITH_DCDC = 0xAAAA; +static const uint16_t eZ_FET_NO_DCDC = 0xAAAB; +static const uint16_t eZ_FET_WITH_DCDC_NO_FLOWCT = 0xAAAC; +static const uint16_t eZ_FET_WITH_DCDC_V2x = 0xAAAD; +static const uint16_t eZ_FET_WITH_DCDC_0X3FF = 0x3FFF; +static const uint16_t MSP_FET_WITH_DCDC = 0xBBBB; +static const uint16_t MSP_FET_WITH_DCDC_V2x = 0xBBBC; +static const uint16_t MSP_FET430 = 0xCCCC; +static const uint16_t DUMMY = 0x1111; + +namespace TI +{ + namespace DLL430 + { + typedef std::function UpdateNotifyCallback; + + /** \brief manage the target device and the connection between FET and target device */ + class IUpdateManager + { + public: + virtual ~IUpdateManager() {} + + /** \brief get the version of the FET Hal + * + * \return the version information + */ + virtual VersionInfo getHalVersion () const = 0; + + /** \brief chick if firmware update is required + * + * \return true if firmware update is required + */ + virtual bool isUpdateRequired(TARGET_ARCHITECTURE_t arch) const = 0; + + /** \brief perform firmwareupdate + * + * \param fname defines the TI-txt file to be used for update or nullptr for internal image + * \param callback defines the callback for update messages or nullptr for no messages + * \param clientHandle reference given by the caller instance, returned in callback + * \return true on success + */ + virtual bool firmWareUpdate(const char* fname, UpdateNotifyCallback callback = 0, bool* coreUpdate = 0) = 0; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/IoChannel.cpp b/DLL430_v3/src/TI/DLL430/IoChannel.cpp index f6e414d..109da90 100644 --- a/DLL430_v3/src/TI/DLL430/IoChannel.cpp +++ b/DLL430_v3/src/TI/DLL430/IoChannel.cpp @@ -3,38 +3,39 @@ * * Implementation of Base functionality for all derived classes. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "IoChannel.h" #include "FetControl.h" diff --git a/DLL430_v3/src/TI/DLL430/IoChannel.h b/DLL430_v3/src/TI/DLL430/IoChannel.h index 3f434cf..42b2561 100644 --- a/DLL430_v3/src/TI/DLL430/IoChannel.h +++ b/DLL430_v3/src/TI/DLL430/IoChannel.h @@ -1,54 +1,46 @@ /* - * IoChannel.h + * IoChannel.h * * Interface for IoChannel derived classes. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 + #pragma once -#endif -#ifndef DLL430_IOCHANNEL_H -#define DLL430_IOCHANNEL_H -#include +#include "PortInfo.h" -#include -#include -#include #define STREAM_CORE_ZERO_VERSION 0x00 -#define STREAM_CORE_ZERO_MACRO_SIZE 0x01 -#define STREAM_CORE_ZERO_MACRO_ADDR 0x02 #define STREAM_CORE_ZERO_PUC_RESET 0x03 namespace TI @@ -66,34 +58,31 @@ namespace TI ComStateDisconnect = 3 }; - class IoChannel : public PortInfo + class IoChannel { - IoChannel(const IoChannel&); - void operator=(const IoChannel&); public: - IoChannel (); - virtual ~IoChannel (); + IoChannel(); + IoChannel(const IoChannel&) = delete; + IoChannel& operator=(const IoChannel&) = delete; + + virtual ~IoChannel(); + void setParent(FetControl*); - - virtual enum ComState poll () = 0; - virtual int read (HalResponse& resp, uint32_t timeout) = 0; - virtual int write (const uint8_t* payload, size_t len) = 0; + virtual bool open() = 0; + virtual bool close() = 0; + virtual void cancel() = 0; - virtual bool setObjectDbEntry (size_t entry) = 0; - virtual size_t getFunctionAddress (unsigned long id) = 0; + virtual ComState poll() = 0; + virtual size_t read(HalResponse& resp) = 0; - typedef std::map function_map_type; - void setFunctionMap (function_map_type* functionTable) { this->functionTable = functionTable; }; + virtual size_t write(const uint8_t* payload, size_t len) = 0; - virtual const char* getName () =0; - virtual const std::string getSerial() =0; + virtual const char* getName() const = 0; + virtual std::string getSerial() const = 0; protected: FetControl* parent; - function_map_type* functionTable; }; - }; -}; - -#endif /* DLL430_IOCHANNEL_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/IoChannelFactory.cpp b/DLL430_v3/src/TI/DLL430/IoChannelFactory.cpp index c6d5409..6c050b7 100644 --- a/DLL430_v3/src/TI/DLL430/IoChannelFactory.cpp +++ b/DLL430_v3/src/TI/DLL430/IoChannelFactory.cpp @@ -3,52 +3,68 @@ * * Creates IoChannel classes due to given parameters. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "IoChannelFactory.h" #include "UsbCdcIoChannel.h" -#include +#include using namespace TI::DLL430; -void IoChannelFactory::enumeratePorts (PortMap & list, char * type, bool open) +void IoChannelFactory::enumeratePorts (PortMap& list, const char* type, bool open) { - if((!::strncmp(type,"USB",3)||(!::strncmp(type,"TIUSB",5))||(!::strncmp(type,"CDC",3)))) + if (type) { - if(list.size()==0) + const std::string t(type); + if (t == "USB" || t == "TIUSB" || t == "CDC") { UsbCdcIoChannel::enumeratePorts(list, open); } } } + + +IoChannel* IoChannelFactory::createIoChannel(const PortInfo& portInfo) +{ + IoChannel* channel = nullptr; + + switch (portInfo.type) + { + case PortInfo::CDC: channel = new UsbCdcIoChannel(portInfo); break; + default: break; + } + + return channel; +} diff --git a/DLL430_v3/src/TI/DLL430/IoChannelFactory.h b/DLL430_v3/src/TI/DLL430/IoChannelFactory.h index 811bbb0..7bc0d51 100644 --- a/DLL430_v3/src/TI/DLL430/IoChannelFactory.h +++ b/DLL430_v3/src/TI/DLL430/IoChannelFactory.h @@ -3,45 +3,42 @@ * * Creates IoChannel classes due to given parameters. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_IOCHANNELFACTORY_H -#define DLL430_IOCHANNELFACTORY_H -#include +#include "IoChannel.h" +#include "PortInfo.h" namespace TI { @@ -50,10 +47,10 @@ namespace TI class IoChannelFactory { public: - static void enumeratePorts (PortMap& list, char* type, bool open); - }; + static void enumeratePorts(PortMap& list, const char* type, bool open); - }; -}; + static IoChannel* createIoChannel(const PortInfo&); + }; -#endif /* DLL430_IOCHANNELFACTORY_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/JtagShifts.h b/DLL430_v3/src/TI/DLL430/JtagShifts.h new file mode 100644 index 0000000..b708fd8 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/JtagShifts.h @@ -0,0 +1,79 @@ +/* + * JtagShifts.h + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "HalExecCommand.h" + +namespace TI +{ + namespace DLL430 + { + class JtagShifts + { + public: + JtagShifts() { cmd.elements.emplace_back(new HalExecElement(ID_HilCommand)); } + + JtagShifts(HIL_COMMAND instruction, uint64_t data, uint32_t bits) + { + cmd.elements.emplace_back(new HalExecElement(ID_HilCommand)); + addShift(instruction, data, bits); + } + + operator HalExecCommand&() { return cmd; } + + JtagShifts& operator()(HIL_COMMAND instruction, uint64_t data, uint32_t bits) + { + return addShift(instruction, data, bits); + } + + JtagShifts& addShift(HIL_COMMAND instruction, uint64_t data, uint32_t bits) + { + cmd.elements[0]->appendInputData32((uint32_t)instruction); + cmd.elements[0]->appendInputData64(data); + cmd.elements[0]->appendInputData32(bits); + return *this; + } + + HalExecCommand& getCommand() { return cmd; } + + const HalExecElement& getData() const { return *cmd.elements[0]; } + + private: + HalExecCommand cmd; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.cpp index efe85ff..5c74795 100644 --- a/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.cpp +++ b/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.cpp @@ -3,199 +3,129 @@ * * Handles access to lockable ram memory. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "LockableRamMemoryAccess.h" +#include "CpuRegisters.h" #include "HalExecCommand.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; -using boost::bind; -using boost::shared_ptr; +using std::bind; +using std::shared_ptr; LockableRamMemoryAccess::LockableRamMemoryAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, - const bool isProtected, - MemoryManager* mm, + const bool isProtected, + IMemoryManager* mm, uint8_t psa ) - : MemoryAreaBase(name,devHandle,start,end,seg,banks,mapped, isProtected, psa) - , mm(mm), unlockBeforeSync(false), lockState(2,0) -{ -} - -LockableRamMemoryAccess::~LockableRamMemoryAccess () + : RandomMemoryAccess(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) + , unlockBeforeSync(false), lockState(2, 0) { } bool LockableRamMemoryAccess::erase(uint32_t start, uint32_t end, uint32_t block_size, int type) { const size_t size = end - start + 1; - eraseDummyBuffer = vector(size, 0xFF); + const std::vector eraseDummyBuffer(size, 0xFF); return write(start - getStart(), &eraseDummyBuffer[0], size) && sync(); } -bool LockableRamMemoryAccess::doRead (uint32_t address, uint32_t* buffer, size_t count) +bool LockableRamMemoryAccess::doRead(uint32_t address, uint8_t* buffer, size_t count) { - MemoryArea* cpu = mm->getMemoryArea("CPU"); - if (!cpu) - return false; - - uint32_t pc = 0; - cpu->read(0, &pc, 1); - - bool omitFirst = (address & 0x1); - if (omitFirst) - { - --address; - ++count; - } - bool omitLast = (count & 1); - if (omitLast) - { - ++count; - } - - const hal_id readMacro = devHandle->supportsQuickMemRead() ? - ID_ReadMemQuick : ID_ReadMemWords; - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - el->appendInputData32(pc); - - el->setOutputSize(count); - - ReadElement r(buffer, count, omitFirst, omitLast, 0); - this->readMap[this->elements.size()] = r; - this->elements.push_back(el); - return true; + const hal_id readMacro = devHandle->supportsQuickMemRead() ? ID_ReadMemQuick : ID_ReadMemWords; + return defaultRead(readMacro, mm, address, buffer, count); } -bool LockableRamMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t count) +bool LockableRamMemoryAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count) { - if (count > this->getSize()) - return false; - - uint32_t start_val = 0; - const uint32_t end_adr = address + count; - size_t paddedCount = count; + const bool success = RandomMemoryAccess::doWrite(address, buffer, count); - if(address & 1) + if (success) { - ++paddedCount; - if( !doRead(address - 1, &start_val, 1) || !sync() ) - return false; + unlockBeforeSync = true; } - - uint32_t end_val = 0; - if(end_adr & 1) - { - ++paddedCount; - if( !doRead(end_adr, &end_val, 1) || !sync() ) - return false; - } - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); - - address += getStart(); - - el->appendInputData32(static_cast(address & 0xfffffffe)); - el->appendInputData32(static_cast(paddedCount / 2)); - - if(address & 1) - { - el->appendInputData8(static_cast(start_val)); - } - for (size_t i = 0; i < count; ++i) - { - el->appendInputData8(static_cast(buffer[i])); - } - if (end_adr & 1) - { - el->appendInputData16(static_cast(end_val)); - } - - el->setInputMinSize(8); // at least address and size (4+4) - this->elements.push_back(el); - - unlockBeforeSync = true; - - return true; + return success; } -bool LockableRamMemoryAccess::doWrite (uint32_t address, uint32_t value) +bool LockableRamMemoryAccess::doWrite(uint32_t address, uint32_t value) { - return this->doWrite(address, &value, 1); + return this->doWrite(address, (uint8_t*)&value, 1); } -bool LockableRamMemoryAccess::erase (uint32_t start, uint32_t end) +bool LockableRamMemoryAccess::erase(uint32_t start, uint32_t end, bool forceUnlock) { - return erase(start,end,this->getSegmentSize(),0); + return erase(start, end, this->getSegmentSize(), 0); } -bool LockableRamMemoryAccess::erase () +bool LockableRamMemoryAccess::erase() { uint32_t bank_size=this->getSize()/this->getBanks(); - return erase(this->getStart(),this->getEnd(),bank_size,1); + return erase(this->getStart(), this->getEnd(), bank_size, 1); } -bool LockableRamMemoryAccess::preSync () +bool LockableRamMemoryAccess::preSync() { bool success = true; if ( unlockBeforeSync ) { success = false; - - MemoryArea* peripheral16bit = mm->getMemoryArea("peripheral16bit"); - if (peripheral16bit && - peripheral16bit->read(0x0190 - peripheral16bit->getStart(), &lockState[0], 2) && + int16_t index = mm->getMemoryAreaIndex(MemoryArea::Peripheral16bit, 0x0190, 0x2); + if (index < 0) + { + return false; + } + MemoryArea* peripheral16bit = mm->getMemoryArea(MemoryArea::Peripheral16bit, index); + if (peripheral16bit && + peripheral16bit->read(0x0190 - peripheral16bit->getStart(), &lockState[0], 2) && peripheral16bit->sync()) - { - uint32_t tmp[2] = { 0, lockState[1] & 0x08 }; + { + const uint8_t tmp[2] = { 0, static_cast(lockState[1] & 0x08) }; success = peripheral16bit->write(0x0190 - peripheral16bit->getStart(), tmp, 2) && peripheral16bit->sync(); } - } + } return success; } @@ -204,30 +134,11 @@ bool LockableRamMemoryAccess::postSync (const HalExecCommand& cmd) { if ( unlockBeforeSync ) { - MemoryArea* peripheral16bit = mm->getMemoryArea("peripheral16bit"); + MemoryArea* peripheral16bit = mm->getMemoryArea(MemoryArea::Peripheral16bit); peripheral16bit->write(0x0190 - peripheral16bit->getStart(), &lockState[0], 2); peripheral16bit->sync(); unlockBeforeSync = false; } - for (size_t i = 1; i < cmd.elements.size(); ++i) - { - ReadElement_map::iterator it = this->readMap.find(i-1); - if (it != this->readMap.end()) - { - ReadElement r = it->second; - size_t size = r.size; - if (r.omitLast) - --size; - - const HalExecElement& el = cmd.elements.at(i); - for (size_t i = 0, k = (r.omitFirst? 1: 0); k < size; ++k, ++i) - { - r.v_buffer[i] = el.getOutputAt8(k); - } - this->readMap.erase(it); - } - } - - return true; + return MemoryAreaBase::postSync(cmd); } diff --git a/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.h b/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.h index f431c71..f60f97f 100644 --- a/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.h +++ b/DLL430_v3/src/TI/DLL430/LockableRamMemoryAccess.h @@ -3,89 +3,79 @@ * * Handles access to lockable ram memory. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_LOCKABLERAMMEMORYACCESS_H -#define DLL430_LOCKABLERAMMEMORYACCESS_H -#include "MemoryAreaBase.h" -#include +#include "RandomMemoryAccess.h" #include "FuncletCode.h" namespace TI { namespace DLL430 { - class LockableRamMemoryAccess : public MemoryAreaBase + class LockableRamMemoryAccess : public RandomMemoryAccess { public: - LockableRamMemoryAccess + LockableRamMemoryAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, + IMemoryManager* mm, uint8_t psa ); - virtual ~LockableRamMemoryAccess (); - bool doRead (uint32_t address, uint32_t* buffer , size_t count); - bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t value); + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doWrite(uint32_t address, uint32_t value) OVERRIDE; - bool erase (); - bool erase (uint32_t start, uint32_t end); + virtual bool erase() OVERRIDE; + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; protected: - virtual bool preSync (); - virtual bool postSync (const HalExecCommand&); - MemoryManager* mm; - bool erase (uint32_t start, uint32_t end, uint32_t block_size, int type); + virtual bool preSync() OVERRIDE; + virtual bool postSync(const HalExecCommand&) OVERRIDE; + bool erase(uint32_t start, uint32_t end, uint32_t block_size, int type); private: bool unlockBeforeSync; - std::vector lockState; - std::vector eraseDummyBuffer; + std::vector lockState; }; - }; -}; - -#endif /* DLL430_LOCKABLERAMMEMORYACCESS_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/Log.h b/DLL430_v3/src/TI/DLL430/Log.h new file mode 100644 index 0000000..06d7f20 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/Log.h @@ -0,0 +1,54 @@ +/* + * Log.h + * + * Log handler interface. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +namespace TI +{ + namespace DLL430 + { + namespace LogTarget + { + enum Severity { + FATAL = 0, /**< marks a fatal error, that cannot be recovered from */ + ERR = 1, /**< marks a non-fatal error */ + WARN = 2, /**< marks a warning */ + INFO = 3 /**< marks an informational message */ + }; + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/Logger.cpp b/DLL430_v3/src/TI/DLL430/Logger.cpp deleted file mode 100644 index 32746e0..0000000 --- a/DLL430_v3/src/TI/DLL430/Logger.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Logger.cpp - * - * Logging class with different levels. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "Logger.h" -#include - -using namespace TI::DLL430; - -Logger* Logger::instance () -{ - static Logger* instance = 0; - if (!instance) instance = new Logger; - return instance; -} - - -void Logger::fatal (Logger::Id id, const char* message) -{ - this->log(LogTarget::FATAL, id, message); -} - -void Logger::error (Logger::Id id, const char* message) -{ - this->log(LogTarget::ERR, id, message); -} - -void Logger::warn (Logger::Id id, const char* message) -{ - this->log(LogTarget::WARN, id, message); -} - -void Logger::info (Logger::Id id, const char* message) -{ - this->log(LogTarget::INFO, id, message); -} - -void Logger::log (LogTarget::Severity severity, Logger::Id id, const char* message) -{ - mutex_type::scoped_lock lock(this->listMutex); - list_type::iterator it = this->targets.begin(); - for (; it != this->targets.end(); ++it) - { - LogTarget* target = *it; - target->log(severity, id, message); - } -} - -void Logger::registerLogTarget (LogTarget* t) -{ - mutex_type::scoped_lock lock(this->listMutex); - list_type::iterator it = std::find(this->targets.begin(), this->targets.end(), t); - if (it == this->targets.end()) - this->targets.push_back(t); -} - -void Logger::deregisterLogTarget (LogTarget* t) -{ - mutex_type::scoped_lock lock(this->listMutex); - list_type::iterator it = std::find(this->targets.begin(), this->targets.end(), t); - if (it != this->targets.end()) - this->targets.erase(it); -} diff --git a/DLL430_v3/src/TI/DLL430/Logger.h b/DLL430_v3/src/TI/DLL430/Logger.h deleted file mode 100644 index 9d7ee48..0000000 --- a/DLL430_v3/src/TI/DLL430/Logger.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Logger.h - * - * Implementing Log interface. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_LOGGERIMPL_H -#define DLL430_LOGGERIMPL_H - -#include -#include -#include -#include - -namespace TI -{ - namespace DLL430 - { - - class Logger : public LogRegistry, private boost::noncopyable - { - public: - enum Id { - ID_OK - }; - /** \brief return the Logger instance - * This returns the instance of the Logger class that is - * implemented as Singleton. - */ - static Logger* instance(); - - void fatal (Id, const char*); - void error (Id, const char*); - void warn (Id, const char*); - void info (Id, const char*); - - void registerLogTarget (LogTarget*); - void deregisterLogTarget (LogTarget*); - - private: - Logger () {}; - - void log (LogTarget::Severity, Id, const char*); - typedef std::vector list_type; - list_type targets; - typedef boost::mutex mutex_type; - mutex_type listMutex; - }; - - }; -}; - -#endif /* DLL430_LOGGERIMPL_H */ diff --git a/DLL430_v3/src/TI/DLL430/MSP432/DebugManagerArm.cpp b/DLL430_v3/src/TI/DLL430/MSP432/DebugManagerArm.cpp new file mode 100644 index 0000000..82fdaa5 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432/DebugManagerArm.cpp @@ -0,0 +1,313 @@ +/* + * DebugManagerArm.cpp + * + * Functionality for debugging target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "DebugManagerArm.h" +#include "DeviceHandleArm.h" +#include "HalExecCommand.h" +#include "PollingManager.h" +#include "CpuRegisters.h" + +using namespace TI::DLL430; + +/** \brief manage debug actions on the target device */ +DebugManagerArm::DebugManagerArm(IDeviceHandle* deviceHandle, const DeviceInfo& devInfo) + : mDeviceHandle(deviceHandle), + mPollingManager(nullptr), + mCallback(nullptr), + ulpDebug(false) +{ +} + +DebugManagerArm::~DebugManagerArm() +{ + if (mDeviceHandle->getFetHandle() && mPollingManager) + { + mPollingManager->stopBreakpointPolling(*this->mDeviceHandle); + mPollingManager->setBreakpointCallback(PollingManager::Callback()); + + mPollingManager->stopStateStoragePolling(*this->mDeviceHandle); + mPollingManager->setStateStorageCallback(PollingManager::Callback()); + + mPollingManager->stopLpmPolling(*this->mDeviceHandle); + mPollingManager->setLpmCallback(PollingManager::Callback()); + } +} + +bool DebugManagerArm::reconnectJTAG() +{ + return false; +} + +bool DebugManagerArm::run(uint16_t controlType, DebugEventTarget* target, bool releaseJTAG) +{ + bool retVal = false; + + mCallback = target; + + IMemoryManager *mm = mDeviceHandle->getMemoryManager(); + + CpuRegisters* cpu = mm->getCpuRegisters(); + cpu->flushCache(); + + HalExecCommand cmd; + + HalExecElement* el = new HalExecElement(this->mDeviceHandle->checkHalId(ID_RunArm)); + el->appendInputData16(releaseJTAG ? 1 : 0); + cmd.elements.emplace_back(el); + + if (this->mDeviceHandle->send(cmd)) + { + if (releaseJTAG) + { + pausePolling(); + } + else + { + this->resumePolling(); + } + + if (controlType) + { + retVal = mPollingManager && mPollingManager->startBreakpointPolling(*this->mDeviceHandle); + } + else + { + retVal = mPollingManager && mPollingManager->stopBreakpointPolling(*this->mDeviceHandle); + } + } + + return retVal; +} + +bool DebugManagerArm::stop(bool jtagWasReleased) +{ + IMemoryManager *mm = mDeviceHandle->getMemoryManager(); + CpuRegisters *cpu = mm->getCpuRegisters(); + + // Pause the polling loop while we try to wake up the device and sync again + this->pausePolling(); + + + HalExecCommand cmd; + cmd.elements.emplace_back(new HalExecElement(this->mDeviceHandle->checkHalId(ID_HaltArm))); + + + if (mDeviceHandle->send(cmd)) + { + return cpu->fillCache(0, 18); + } + + return false; +} + +bool DebugManagerArm::singleStep(uint32_t* cycles) +{ + IMemoryManager *mm = mDeviceHandle->getMemoryManager(); + CpuRegisters *cpu = mm->getCpuRegisters(); + + cpu->flushCache(); + + HalExecCommand cmd; + cmd.elements.emplace_back(new HalExecElement(this->mDeviceHandle->checkHalId(ID_SingleStepArm))); + + if (mDeviceHandle->send(cmd)) + { + return cpu->fillCache(0, 18); + } + + return false; +} + +uint8_t DebugManagerArm::getClockControl() const +{ + return 0; +} + +uint16_t DebugManagerArm::getClockControlSetting() const +{ + return 0; +} + +void DebugManagerArm::setClockControlSetting(uint16_t clkcntrl) +{ +} + +uint16_t DebugManagerArm::getGeneralClockDefaultSetting() const +{ + return 0; +} + +uint32_t DebugManagerArm::getClockModuleDefaultSetting() const +{ + return 0; +} + +uint32_t DebugManagerArm::getClockModuleSetting() const +{ + return 0; +} + +void DebugManagerArm::setClockModuleSetting(uint32_t modules) +{ +} + +char** DebugManagerArm::getModuleStrings(uint32_t* n) const +{ + *n = 0; + return nullptr; +} + +char** DebugManagerArm::getClockStrings(uint32_t* n) const +{ + *n = 0; + return nullptr; +} + +bool DebugManagerArm::initEemRegister() +{ + return false; +} + +bool DebugManagerArm::activatePolling(uint16_t mask) +{ + return false; +} + +bool DebugManagerArm::activateJStatePolling(DebugEventTarget* cb) +{ + return false; +} + +bool DebugManagerArm::queryIsInLpm5State() +{ + return false; +} + +void DebugManagerArm::setOpcode(uint16_t value) +{ +} + +bool DebugManagerArm::saveContext() +{ + return false; +} + +void DebugManagerArm::setLpmDebugging(bool enable) +{ + ulpDebug = enable; +} + +bool DebugManagerArm::getLpmDebugging() +{ + return ulpDebug; +} + +void DebugManagerArm::pausePolling() +{ + if (mPollingManager) + { + mPollingManager->pausePolling(); + } +} + +void DebugManagerArm::resumePolling() +{ + if (mPollingManager) + { + mPollingManager->resumePolling(); + } +} + +bool DebugManagerArm::syncDeviceAfterLPMx5() +{ + return false; +} + +uint64_t DebugManagerArm::getCycleCounterValue() +{ + return 0; +} + +void DebugManagerArm::resetCycleCounterValue() +{ +} + +bool DebugManagerArm::startStoragePolling() +{ + return false; +} + +bool DebugManagerArm::stopStoragePolling() +{ + return false; +} + +void DebugManagerArm::setPollingManager(PollingManager* pollingManager) +{ + this->mPollingManager = pollingManager; + pollingManager->setBreakpointCallback(std::bind(&DebugManagerArm::runEvent, this, std::placeholders::_1)); +} + +void DebugManagerArm::enableLegacyCycleCounter(bool enable) +{ +} + +bool DebugManagerArm::legacyCycleCounterEnabled() const +{ + return false; +} + +void DebugManagerArm::runEvent(MessageDataPtr messageData) +{ + uint32_t DHCSR = 0; + (*messageData) >> DHCSR; + + if (DHCSR & 0x00020000) + { // Breakpoint hit + + IMemoryManager *mm = mDeviceHandle->getMemoryManager(); + CpuRegisters *cpu = mm->getCpuRegisters(); + + cpu->fillCache(0, 18); + + if (mCallback) + { + mCallback->event(DebugEventTarget::BreakpointHit); + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/MSP432/DebugManagerArm.h b/DLL430_v3/src/TI/DLL430/MSP432/DebugManagerArm.h new file mode 100644 index 0000000..e854635 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432/DebugManagerArm.h @@ -0,0 +1,278 @@ +/* + * DebugManagerArm.h + * + * Provides routines for handling a debug session. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IDebugManager.h" +#include + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + struct DeviceInfo; + + /** \brief manage debug actions on the target device */ + class DebugManagerArm : public IDebugManager + { + public: + DebugManagerArm(IDeviceHandle*, const DeviceInfo&); + ~DebugManagerArm(); + + DebugManagerArm(const DebugManagerArm&) = delete; + DebugManagerArm& operator=(const DebugManagerArm&) = delete; + + /** \brief reestablish JTAG connection after releasing it + * Function will reconnect JTAG and resume any polling + * \return true if run started successfully, else false + */ + bool reconnectJTAG(); + + /** \brief release JTAG control to let the device execute + * + * The developper must not assume any amount of time until the JTAG pins are + * released. + * + * \param controlType indicates wether waitForEem is activated + * \param target call the event method of target (only valid if toBreakpoint is true) + * \param eventType bitmask for type of event to react on + * \return true if run started successfully, else false + */ + bool run (uint16_t controlType, DebugEventTarget* target = 0, bool releaseJTAG=false); + + /** \brief stop the device + * + * If a command is running in the FET, this kills it if possible. It also + * starts and syncs JTAG. + * + * \return true if stopped successfully, else false + */ + bool stop (bool jtagWasReleased = false); + + /** \brief do a single step + * + * A SingleStep is performed on the target device. When this function returns, + * the device is already stopped. Prior to using this function, the PC must be + * set the CPU memory area. The updated value can also be read from there. + * + * \param cycles the number of device target CPU cycles of the instruction + * \return true on successful action, else false + */ + bool singleStep (uint32_t* cycles = 0); + + /** \brief return the clock control level of device + * + * the returned value depends on the identification of the device + * and the database + * + * \return level of clock control (1-3) + */ + uint8_t getClockControl() const; + + /** \brief return the general clock control setting + * + * return the 16Bit control value + * + * \return control value + */ + uint16_t getClockControlSetting() const; + + /** \brief set the general clock control setting + * + * set the 16Bit control value + */ + void setClockControlSetting(uint16_t clkcntrl); + + /** \brief return the default generals clock control setting + * + * return the 16Bit control value + * + * \return control value + */ + uint16_t getGeneralClockDefaultSetting() const; + + /** \brief return the default clock control module setting + * + * return the 16Bit control value + * + * \return control value + */ + uint32_t getClockModuleDefaultSetting() const; + + /** \brief return the clock control module setting + * + * return the 16Bit control value + * + * \return control value + */ + uint32_t getClockModuleSetting() const; + + /** \brief set the clock control module setting + * + * set the 32Bit control value + */ + void setClockModuleSetting(uint32_t modules); + + char** getModuleStrings(uint32_t * n) const; + + char** getClockStrings(uint32_t * n) const; + + /** \brief init the EEM-Register + * + * depending on the target hardware, the existing EEM-register are + * set to default (0) + * + * \return true if data is successfully written to device, else false + */ + bool initEemRegister(); + + /** \brief Enable eem polling loop + * + * \param mask of events to poll for + * + * \return true if successfull, otherwise false + */ + bool activatePolling(uint16_t); + + /** \brief Enable polling of JState register + * + * \param cb Callback target to handle jstate changes + * + * \return true if successfull, otherwise false + */ + bool activateJStatePolling(DebugEventTarget* cb); + + /** \brief Return current low power mode x.5 state + * + * Returns the last reported state without actively querying + * + * \return true if device is in LPMx.5 + */ + bool queryIsInLpm5State(); + + /** \brief set the opcode parameter + * + * needed for ID_RestoreContext_ReleaseJtag and set by SET_MDB_BEFORE_RUN + * + * \param value opcode to be used by ID_RestoreContext_ReleaseJtag + * + * \return true if successfull, otherwise false + */ + void setOpcode(uint16_t value); + + /** \brief call macro ID_SyncJtag_Conditional_SaveContext + * + * calles the macro ID_SyncJtag_Conditional_SaveContext and saves + * the returned register values + * + * \return true on success + */ + bool saveContext(); + + /** \brief enable/disable low power mode debugging + * + * synchronize the call and response of a loop command + */ + void setLpmDebugging(bool enable); + + /** \brief Check for low power mode debugging + * + * return true if power mode debugging is enabled + */ + bool getLpmDebugging(); + + /** \brief Pause all polling loops + * + * + */ + void pausePolling(); + + /** \brief Resume all polling loops + * + * + */ + void resumePolling(); + + /** \brief sync JTAG if an externl wakeup event happends + * + * + */ + bool syncDeviceAfterLPMx5(); + + /** \brief Retrieve current cycle counter value + * + * + */ + uint64_t getCycleCounterValue(); + + /** \brief Reset cycle counter value + * + * + */ + void resetCycleCounterValue(); + + /** \brief Start polling loop for state storage events on UIF + * + * + */ + bool startStoragePolling(); + + /** \brief Stop polling loop for state storage events on UIF + * + * + */ + bool stopStoragePolling(); + + void setPollingManager(PollingManager* pollingManager); + + void enableLegacyCycleCounter(bool enable); + bool legacyCycleCounterEnabled() const; + + bool setPCtoSafeLocation(){ return false; } + + private: + IDeviceHandle *mDeviceHandle; + PollingManager* mPollingManager; + DebugEventTarget* mCallback; + bool ulpDebug; + + void runEvent(MessageDataPtr messageData); + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/MSP432/DeviceHandleArm.cpp b/DLL430_v3/src/TI/DLL430/MSP432/DeviceHandleArm.cpp new file mode 100644 index 0000000..c10f43e --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432/DeviceHandleArm.cpp @@ -0,0 +1,584 @@ +/* + * DeviceHandleArm.cpp + * + * Communication with target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include + +#include "VersionInfo.h" +#include "DeviceHandleArm.h" +#include "DeviceDb/Database.h" +#include "DebugManagerArm.h" +#include "MemoryManager.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "FetHandle.h" +#include "ClockCalibration.h" +#include "EM/EmulationManager/EmulationManager432.h" +#include "EM/SoftwareBreakpoints/ISoftwareBreakpoints.h" +#include "EM/SoftwareBreakpoints/SoftwareBreakpointManager.h" +#include "EM/EemRegisters/EemRegisterAccess432.h" +#include "EM/Exceptions/Exceptions.h" +#include "ArmRandomMemoryAccess.h" +#include "CpuRegisters.h" +#include "DeviceInfo.h" + +#include "../../Bios/include/error_def.h" +#include "../../Bios/include/ConfigureParameters.h" + +#include + +using namespace TI::DLL430; + +static const uint32_t DAP_CHECK_LOCKED = 0x10; +static const int32_t DAP_IS_LOCKED= -2; + +DeviceHandleArm::DeviceHandleArm(FetHandle* parent, uint32_t deviceCode, INTERFACE_TYPE iMode) + : parent(parent) + , memoryManager(nullptr) + , debugManager(nullptr) + , clockCalibration(nullptr) + , minFlashVcc(1800) + , jtagId(0) + , eemVersion(0) + , mode(iMode) + , mDeviceHasBeenIdentified(false) +{ + accessPortIds.clear(); +} + +DeviceHandleArm::~DeviceHandleArm() +{ + setEemRegisterAccess432(nullptr); + SoftwareBreakpointManager::setMemoryAccessFunctions(nullptr, nullptr, nullptr); + + delete memoryManager; + delete debugManager; + delete clockCalibration; +} + +EmulationManagerPtr DeviceHandleArm::getEmulationManager() +{ + if (!emulationManager) + throw EM_NoEmulationManagerException(); + + return this->emulationManager; +} + +IMemoryManager* DeviceHandleArm::getMemoryManager() +{ + return this->memoryManager; +} + +IDebugManager* DeviceHandleArm::getDebugManager() +{ + return this->debugManager; +} + +long DeviceHandleArm::magicPatternSend(uint16_t ifMode) +{ + HalExecCommand writeMagicPattern; + HalExecElement *eMagic = new HalExecElement(ID_UnlockDap); + writeMagicPattern.elements.emplace_back(eMagic); + + if (!this->send(writeMagicPattern)) + { + return -1; + } + return 1; +} + +INTERFACE_TYPE DeviceHandleArm::getInterfaceMode() +{ + return mode; +} + +int32_t DeviceHandleArm::readCpuId() +{ + // Read the CPUID + HalExecElement* el; + + el = new HalExecElement(ID_GetCpuIdArm); + + HalExecCommand readCpuIDCmd; + readCpuIDCmd.elements.emplace_back(el); + if (!this->send(readCpuIDCmd)) + { + return -1; + } + + IdCode idCode; + idCode.version = readCpuIDCmd.elements[0]->getOutputAt32(0) & 0xFFFF; + idCode.subversion = 0x0000; + idCode.revision = readCpuIDCmd.elements[0]->getOutputAt32(4) & 0xFFFF; + idCode.maxRevision = 0xFF; + idCode.activationKey = 0; + + if (idCode.version == 0) + { + return -1; + } + + long devId = DeviceDb::Database().findDevice(idCode); + if (devId > 0) + { + mDeviceHasBeenIdentified = true; + setDeviceId(devId); + this->debugManager->stop(); + } + return devId; +} + +int32_t DeviceHandleArm::identifyDevice(uint32_t activationKey, bool afterMagicPattern) +{ + sendDeviceConfiguration(CONFIG_PARAM_CLK_CONTROL_TYPE, 0); + sendDeviceConfiguration(CONFIG_PARAM_SFLLDEH, 0); + sendDeviceConfiguration(CONFIG_PARAM_DEFAULT_CLK_CONTROL, 0); + sendDeviceConfiguration(CONFIG_PARAM_ENHANCED_PSA, 0); + sendDeviceConfiguration(CONFIG_PARAM_PSA_TCKL_HIGH, 0); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_MASK, 0x0000); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_MASK, 0x0000); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG_DEFAULT, 0); + sendDeviceConfiguration(CONFIG_PARAM_POWER_TESTREG3V_DEFAULT, 0); + sendDeviceConfiguration(CONFIG_ALT_ROM_ADDR_FOR_CPU_READ, 0); + sendDeviceConfiguration(CONFIG_ASSERT_BSL_VALID_BIT,0); + sendDeviceConfiguration(CONFIG_WDT_ADDRESS_5XX, 0); + sendDeviceConfiguration(CONFIG_PARAM_INTERRUPT_OPTIONS, DISABLE_INTERRUPTS_NONE); + sendDeviceConfiguration(CONFIG_PARAM_ULP_MSP432, 0); + + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(ID_ScanApArm); + + cmd.elements.emplace_back(el); + cmd.setTimeout(5000); + + if (!this->send(cmd)) + { + return -1; + } + + if (isJtagFuseBlown()) + { + return DAP_IS_LOCKED; + } + + AccessPort temp; + accessPortIds.clear(); + + temp.idr = cmd.elements[0]->getOutputAt32(accessPortIds.size() * 13); + if (temp.idr) + { + temp.base = cmd.elements[0]->getOutputAt32(accessPortIds.size() * 13 + 4); + temp.cfg = cmd.elements[0]->getOutputAt32(accessPortIds.size() * 13 + 8); + temp.portNum = cmd.elements[0]->getOutputAt8(accessPortIds.size() * 13 + 12); + if (temp.validate()) + { + // Discover all the components in the AP + parseAndAddComponent(static_cast(accessPortIds.size()), temp.components, temp.base & 0xFFFFFFFC, &temp.pid); + accessPortIds.push_back(temp); + } + } + + // No APs/Components found + if (!accessPortIds.size() || accessPortIds[0].components.size() < 2) + { + return -1; + } + + int32_t devId = readCpuId(); + if(!devId) + { + return -1; + } + return devId; +} + +bool DeviceHandleArm::reset(bool hardReset) +{ + HalExecElement *el = new HalExecElement(ID_ResetArm); + el->appendInputData16(hardReset ? 1 : 0); // RsetType: 0 = Core, 1 = System + + HalExecCommand resetCmd; + resetCmd.elements.emplace_back(el); + + if (!this->send(resetCmd)) + { + return false; + } + + if (!this->memoryManager) + { + return false; + } + CpuRegisters *cpu = this->memoryManager->getCpuRegisters(); + if(cpu) + { + cpu->fillCache(0,18); + } + return true; +} + +int32_t DeviceHandleArm::setDeviceId(long id) +{ + if (mDeviceHasBeenIdentified) + { + // Enable debug + HalExecCommand enableDebugCmd; + enableDebugCmd.elements.emplace_back(new HalExecElement(ID_EnableDebugArm)); + this->send(enableDebugCmd); + + const DeviceInfo* devInfo = DeviceDb::Database().getDeviceInfo(id); + if (devInfo) + { + this->configure(*devInfo); + return 0; + } + return -1; + } + else + { + return this->identifyDevice(0, true); + } +} + +void DeviceHandleArm::setWatchdogControl(std::shared_ptr ctrl) +{ + this->wdt = ctrl; +} + +std::shared_ptr DeviceHandleArm::getWatchdogControl() const +{ + return this->wdt; +} + + +void DeviceHandleArm::configure(const DeviceInfo& info) +{ + setEemRegisterAccess432(nullptr); + + deviceInfo = info; + + delete this->memoryManager; + this->memoryManager = new MemoryManager(this, info); + + setEemRegisterAccess432( dynamic_cast(memoryManager->getMemoryArea(MemoryArea::Eem)) ); + + delete this->debugManager; + this->debugManager = new DebugManagerArm(this, info); + + this->emulationManager = EmulationManager432::create(info.eem); + + //this->funcletTable = info.funcletMap; + this->minFlashVcc = info.voltageInfo.vccFlashMin; +} + +bool DeviceHandleArm::restoreTinyRam() +{ + return true; +} + +bool DeviceHandleArm::sendDeviceConfiguration(uint32_t parameter, uint32_t value) +{ + HalExecElement* el = new HalExecElement(ID_Configure); + el->appendInputData32(parameter); + el->appendInputData32(value); + + HalExecCommand configCmd; + configCmd.elements.emplace_back(el); + + return this->send(configCmd); +} + +uint32_t DeviceHandleArm::getDeviceCode() const +{ + return 0; +} + +uint32_t DeviceHandleArm::getJtagId() +{ + return this->jtagId; +} + +uint32_t DeviceHandleArm::getDeviceIdPtr() +{ + return 0; +} + +uint32_t DeviceHandleArm::getEemVersion() +{ + return 0; +} + +uint32_t DeviceHandleArm::readJtagId() +{ + HalExecCommand cmd; + HalExecElement* el = new HalExecElement(ID_GetJtagIdCodeArm); + + cmd.elements.emplace_back(el); + if (!this->send(cmd)) + { + return 0; + } + + this->jtagId = cmd.elements[0]->getOutputAt32(0); + + return this->jtagId; +}; + +bool DeviceHandleArm::isJtagFuseBlown() +{ + HalExecCommand readlock; + HalExecElement* lock = new HalExecElement(ID_CheckDapLockArm); + readlock.elements.emplace_back(lock); + + if (!this->send(readlock)) + { + return false; + } + + uint32_t lockVal = readlock.elements[0]->getOutputAt32(0); + + if (lockVal & DAP_CHECK_LOCKED) + { + return true; + } + return false; +} + +bool DeviceHandleArm::secure() +{ + bool success = false, successErase = false; + + const FuncletCode& funclet = this->getFunclet(FuncletCode::Type::SECURE); + + const uint8_t* code = (uint8_t*)funclet.codeNoOffset(); + const size_t count = funclet.codeSize(); + + if (count > 0x10000) + { + return false; + } + + MemoryArea* info = memoryManager->getMemoryArea(MemoryArea::Info, 0); + + successErase = info->erase(info->getStart(), info->getStart() + static_cast(count)); + success = info->write(0, code, count); + + return success && successErase; +} + +FetControl* DeviceHandleArm::getControl() +{ + return parent->getControl(); +} + +bool DeviceHandleArm::send(HalExecCommand &command) +{ + return this->parent->getControl()->send(command); +} + +hal_id DeviceHandleArm::checkHalId(hal_id base_id) const +{ + const auto it = deviceInfo.functionMap.find(base_id); + return (it != deviceInfo.functionMap.end()) ? it->second : base_id; +} + +const FuncletCode& DeviceHandleArm::getFunclet(FuncletCode::Type funclet) +{ + static FuncletCode dummy; + const auto it = deviceInfo.funcletMap.find(funclet); + return (it != deviceInfo.funcletMap.end()) ? it->second : dummy; +} + +bool DeviceHandleArm::supportsQuickMemRead() const +{ + return false; +} + +uint16_t DeviceHandleArm::getMinFlashVcc() const +{ + return minFlashVcc; +} + +bool DeviceHandleArm::hasFram() const +{ + return false; +} + +bool DeviceHandleArm::hasLPMx5() const +{ + return false; +} + +void DeviceHandleArm::disableHaltOnWakeup() +{ + // Disable Debug + HalExecCommand cmd; + cmd.elements.emplace_back(new HalExecElement(ID_DisableDebugArm)); + this->send(cmd); +} + +bool DeviceHandleArm::eemAccessibleInLpm() const +{ + return false; +} + +bool DeviceHandleArm::deviceSupportsEnergyTrace() const +{ + return true; +} + +TARGET_ARCHITECTURE_t DeviceHandleArm::getTargetArchitecture()const +{ + return TARGET_ARCHITECTURE_t::MSP432_M4; +} + +bool DeviceHandleArm::parseAndAddComponent(uint8_t portNum, std::vector &vec, uint32_t baseAddress, uint64_t *ROMpid) +{ + HalExecElement *el; + if (mode == SWD_MSP432) + { + el = new HalExecElement(ID_MemApTransactionArmSwd); + } + else + { + el = new HalExecElement(ID_MemApTransactionArm); + } + + + el->appendInputData16(portNum); // APSEL + el->appendInputData16(1); // rnw = READ + el->appendInputData16(2); // dataWidth = 32 + el->appendInputData32(baseAddress + PID_OFFSET);// address + el->appendInputData32(12 * 4); // size in bytes + + HalExecCommand readPidCidCmd; + readPidCidCmd.elements.emplace_back(el); + readPidCidCmd.setTimeout(5000); + + if (!this->send(readPidCidCmd)) + { + return false; + } + + uint32_t PID[] = {readPidCidCmd.elements[0]->getOutputAt32(0x10), + readPidCidCmd.elements[0]->getOutputAt32(0x14), + readPidCidCmd.elements[0]->getOutputAt32(0x18), + readPidCidCmd.elements[0]->getOutputAt32(0x1C), + readPidCidCmd.elements[0]->getOutputAt32(0x00), + readPidCidCmd.elements[0]->getOutputAt32(0x04), + readPidCidCmd.elements[0]->getOutputAt32(0x08), + readPidCidCmd.elements[0]->getOutputAt32(0x0C)}; + + uint32_t CID[] = {readPidCidCmd.elements[0]->getOutputAt32(0x20), + readPidCidCmd.elements[0]->getOutputAt32(0x24), + readPidCidCmd.elements[0]->getOutputAt32(0x28), + readPidCidCmd.elements[0]->getOutputAt32(0x2C)}; + + ComponentPeripheral component(baseAddress, PID, CID); + + if (component.getComponentType() != COMPONENT_UNKNOWN) + { + vec.push_back(component); + } + if (component.getComponentType() == COMPONENT_ROM_TABLE) + { + *ROMpid = (((uint64_t)PID[7] & 0xff) << 56) | + (((uint64_t)PID[6] & 0xff) << 48) | + (((uint64_t)PID[5] & 0xff) << 40) | + (((uint64_t)PID[4] & 0xff) << 32) | + (((uint64_t)PID[3] & 0xff) << 24) | + (((uint64_t)PID[2] & 0xff) << 16) | + (((uint64_t)PID[1] & 0xff) << 8) | + (((uint64_t)PID[0] & 0xff)); + + uint32_t tableOffset = 0; + uint32_t ROMEntry; + do + { + HalExecElement *el; + if (mode == SWD_MSP432) + { + el = new HalExecElement(ID_MemApTransactionArmSwd); + } + else + { + el = new HalExecElement(ID_MemApTransactionArm); + } + + + el->appendInputData16(portNum); // APSEL + el->appendInputData16(1); // rnw = READ + el->appendInputData16(2); // dataWidth = 32 + el->appendInputData32(baseAddress + tableOffset); // address + el->appendInputData32(4); // size in bytes + + HalExecCommand readRomEntry; + readRomEntry.elements.emplace_back(el); + readRomEntry.setTimeout(5000); + if (!this->send(readRomEntry)) + { + return false; + } + ROMEntry = readRomEntry.elements[0]->getOutputAt32(0); + if (ROMEntry & 0x1) + { + parseAndAddComponent(portNum, vec, baseAddress + (ROMEntry & 0xFFFFF000), ROMpid); + } + tableOffset += 4; + } while (ROMEntry); + } + + switch (component.getComponentType()) + { + case COMPONENT_SCS: + // Configure the base address for the SCS + sendDeviceConfiguration(CONFIG_PARAM_SCS_BASE_ADDRESS, component.getBase()); + break; + + case COMPONENT_FPB: + // Configure the base address for the FPB + sendDeviceConfiguration(CONFIG_PARAM_FPB_BASE_ADDRESS, component.getBase()); + break; + + default: + // Do nothing + break; + } + + return true; +} diff --git a/DLL430_v3/src/TI/DLL430/MSP432/DeviceHandleArm.h b/DLL430_v3/src/TI/DLL430/MSP432/DeviceHandleArm.h new file mode 100644 index 0000000..1763dc6 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432/DeviceHandleArm.h @@ -0,0 +1,268 @@ +/* + * DeviceHandleArm.h + * + * Communication with target device. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IDeviceHandle.h" +#include "MemoryManager.h" +#include "DebugManagerArm.h" +#include "DeviceInfo.h" +#include "WatchdogControl.h" +#include "EM/EmulationManager/EmulationManager430.h" +#include "EM/Exceptions/Exceptions.h" +#include "EemMemoryAccess.h" + +namespace TI +{ + namespace DLL430 + { + class FetHandle; + struct DeviceInfo; + class FetControl; + class HalCommand; + class ClockCalibration; + + static const uint32_t MEMTYPE_OFFSET = 0x00000FCC; + static const uint32_t PID_OFFSET = 0x00000FD0; + static const uint32_t CID_OFFSET = 0x00000FF0; + static const uint32_t CPUID_OFFSET = 0x00000D00; + + /// \brief Defines the peripheral class + typedef enum + { + COMPONENT_ROM_TABLE, + COMPONENT_SCS, + COMPONENT_SCS_WITH_FPU, + COMPONENT_DWT, + COMPONENT_FPB, + COMPONENT_ITM, + COMPONENT_TPIU, + COMPONENT_ETM, + COMPONENT_UNKNOWN + } ComponentType; + + /// \brief Component/Peripheral contained insied the MEM-AP + class ComponentPeripheral + { + public: + ComponentPeripheral(uint32_t base, uint32_t PID[8], uint32_t CID[4]) + { + m_base = base; + + if ((CID[0] == 0x0000000D) && // Coresight ROM Table + (CID[1] == 0x00000010) && + (CID[2] == 0x00000005) && + (CID[3] == 0x000000B1)) + { + m_componentType = COMPONENT_ROM_TABLE; + } + else if ((PID[4] == 0x00000004) && // Coresight SCS + (PID[0] == 0x00000000 || PID[0] == 0x0000000C) && + (PID[1] == 0x000000B0) && + (PID[2] == 0x0000000B) && + (PID[3] == 0x00000000) && + (CID[0] == 0x0000000D) && + (CID[1] == 0x000000E0) && + (CID[2] == 0x00000005) && + (CID[3] == 0x000000B1)) + { + m_componentType = PID[0] ? COMPONENT_SCS_WITH_FPU : COMPONENT_SCS; + } + else if ((PID[4] == 0x00000004) && // Coresight DWT + (PID[5] == 0x00000000) && + (PID[6] == 0x00000000) && + (PID[7] == 0x00000000) && + (PID[0] == 0x00000002) && + (PID[1] == 0x000000B0) && + (PID[2] == 0x0000003B) && + (PID[3] == 0x00000000) && + (CID[0] == 0x0000000D) && + (CID[1] == 0x000000E0) && + (CID[2] == 0x00000005) && + (CID[3] == 0x000000B1)) + { + m_componentType = COMPONENT_DWT; + } + else if ((PID[4] == 0x00000004) && // Coresight FPB + (PID[5] == 0x00000000) && + (PID[6] == 0x00000000) && + (PID[7] == 0x00000000) && + (PID[0] == 0x00000003) && + (PID[1] == 0x000000B0) && + (PID[2] == 0x0000002B) && + (PID[3] == 0x00000000) && + (CID[0] == 0x0000000D) && + (CID[1] == 0x000000E0) && + (CID[2] == 0x00000005) && + (CID[3] == 0x000000B1)) + { + m_componentType = COMPONENT_FPB; + } + else if ((PID[4] == 0x00000004) && // Coresight ITM + (PID[5] == 0x00000000) && + (PID[6] == 0x00000000) && + (PID[7] == 0x00000000) && + (PID[0] == 0x00000001) && + (PID[1] == 0x000000B0) && + (PID[2] == 0x0000003B) && + (PID[3] == 0x00000000) && + (CID[0] == 0x0000000D) && + (CID[1] == 0x000000E0) && + (CID[2] == 0x00000005) && + (CID[3] == 0x000000B1)) + { + m_componentType = COMPONENT_ITM; + } + else + { + m_componentType = COMPONENT_UNKNOWN; + } + }; + ~ComponentPeripheral() {}; + + uint32_t getBase() const {return m_base;}; + ComponentType getComponentType() const {return m_componentType;}; + + private: + ComponentType m_componentType; + uint32_t m_base; + }; + + /// \brief Access Port Identification structure + typedef struct + { + uint8_t portNum; // Access port number + uint32_t idr; // Identification register + uint32_t base; // Base address register + uint32_t cfg; // Configuration register + uint64_t pid; // PID of the ROM Table is used for device identification + std::vector components; + + /// \brief Validate the values + // Only little-endian MEM-APs are supported + bool validate() const {return !cfg && (base & 0x3) && ((idr & 0x0001FF00) == 0x00010000);}; + } AccessPort; + + class DeviceHandleArm : public IDeviceHandle + { + public: + DeviceHandleArm(FetHandle*, uint32_t deviceCode, INTERFACE_TYPE iMode); + ~DeviceHandleArm(); + + DeviceHandleArm(const DeviceHandleArm&) = delete; + DeviceHandleArm& operator=(const DeviceHandleArm&) = delete; + + EmulationManagerPtr getEmulationManager(); + IMemoryManager* getMemoryManager (); + IDebugManager* getDebugManager (); + FetHandle* getFetHandle () { return parent; } + ClockCalibration* getClockCalibration() { return clockCalibration; } + + /// \brief Run the boot code writing the the specified command in the mailbox first + /// \param command[in] Command to be put in the mailbox + /// \return True if bootcode execution succeeded + long magicPatternSend(uint16_t ifMode); + int32_t identifyDevice (uint32_t activationKey, bool afterMagicPattern); + bool secure (); + bool reset (bool hardReset = false); + + FetControl* getControl (); + + bool send (HalExecCommand &command); + + uint32_t readJtagId(); + uint32_t getJtagId(); + uint32_t getDeviceIdPtr(); + uint32_t getEemVersion(); + bool isJtagFuseBlown(); + uint32_t getDeviceCode() const; + INTERFACE_TYPE getInterfaceMode(); + + const std::string & getDescription() const { return deviceInfo.description; } + + int32_t setDeviceId (long id); + + hal_id checkHalId(hal_id base_id) const; + + const FuncletCode& getFunclet(FuncletCode::Type funclet); + + bool supportsQuickMemRead() const; + uint16_t getMinFlashVcc() const; + bool hasFram() const; + bool hasLPMx5() const; + + void disableHaltOnWakeup(); + + bool eemAccessibleInLpm() const; + + bool deviceSupportsEnergyTrace() const; + + TARGET_ARCHITECTURE_t getTargetArchitecture() const; + + void setWatchdogControl(std::shared_ptr); + std::shared_ptr getWatchdogControl() const; + + bool restoreTinyRam(); + + private: + FetHandle* parent; + EmulationManagerPtr emulationManager; + IMemoryManager* memoryManager; + DebugManagerArm* debugManager; + ClockCalibration* clockCalibration; + + uint16_t minFlashVcc; + + uint32_t jtagId; + DeviceInfo deviceInfo; + uint32_t eemVersion; + INTERFACE_TYPE mode; + + std::vector accessPortIds; + + std::shared_ptr wdt; + + void configure (const DeviceInfo& info); + bool sendDeviceConfiguration(uint32_t parameter, uint32_t value); + bool parseAndAddComponent(uint8_t portNum, std::vector &vec, uint32_t baseAddress, uint64_t *ROMpid); + bool mDeviceHasBeenIdentified; + int32_t readCpuId(); + int32_t isDaplocked(); + + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/MSP432P4xx_2M_FlashLibFc.h b/DLL430_v3/src/TI/DLL430/MSP432P4xx_2M_FlashLibFc.h new file mode 100644 index 0000000..795336c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432P4xx_2M_FlashLibFc.h @@ -0,0 +1,249 @@ +/****************************************************************************** +* MSP432P4xx_FlashLibFC.h +* +* Copyright (C) 2014 - 2016 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. +******************************************************************************/ +/* File generated: Thu 03/16/2017 11:16:05.82 */ +#pragma once +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP432P4xx_2M_Funclet[] = +{ +0x1000, 0x0100, 0x0141, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, +0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0000, +0x0000, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, +0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, +0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, +0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, +0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, +0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, +0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, +0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, +0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, +0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0AF5, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xBC36, +0x4770, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xB508, 0x4896, 0x6800, 0x6800, 0x4780, 0xF000, 0xFCA0, +0xE040, 0x4894, 0x4993, 0x6800, 0x6008, 0xF000, 0xF84C, 0x4992, 0x2000, +0x6008, 0xE036, 0x488F, 0x498E, 0x6800, 0x6008, 0xF000, 0xF893, 0x498D, +0x2000, 0x6008, 0xE02C, 0x488A, 0x4989, 0x6800, 0x6008, 0xF000, 0xF8AF, +0x4988, 0x2000, 0x6008, 0xE022, 0x4885, 0x4984, 0x6800, 0x6008, 0xF000, +0xF8CE, 0x4983, 0x2000, 0x6008, 0xE018, 0x4880, 0x497F, 0x6800, 0x6008, +0xF000, 0xF908, 0x497E, 0x2000, 0x6008, 0xE00E, 0x487B, 0x497A, 0x6800, +0x6008, 0xF000, 0xFA50, 0x4979, 0x2000, 0x6008, 0xE004, 0x4878, 0x4975, +0x6800, 0x6008, 0xE7FF, 0x4875, 0x6800, 0x2800, 0xD0FB, 0x1E40, 0xD0C2, +0x1E40, 0xD0CA, 0x1E80, 0xD0D2, 0x1F00, 0xD0B2, 0x3808, 0xD0E2, 0x3810, +0xD0D6, 0xE7E9, 0xB508, 0x2000, 0xF88D, 0x0000, 0x496C, 0xF04F, 0x7080, +0x6008, 0x486C, 0x6800, 0x6D80, 0x4601, 0x2000, 0x4788, 0x4968, 0x6008, +0x4868, 0x6800, 0x6D80, 0x4601, 0x2001, 0x4788, 0x49BA, 0x6008, 0x48BB, +0x6800, 0x6840, 0x4780, 0x49B8, 0x7008, 0x48B8, 0x6800, 0x6A00, 0x4780, +0x49B7, 0x7008, 0x48B8, 0x49B7, 0x6800, 0xF400, 0x20E0, 0x6008, 0x48B2, +0x6800, 0x6980, 0x4601, 0x2000, 0x4788, 0xF88D, 0x0000, 0x4857, 0x6800, +0x6D40, 0x2102, 0x4602, 0x2000, 0x4790, 0x4854, 0x6800, 0x6D40, 0x2102, +0x4602, 0x2001, 0x4790, 0xF44F, 0x2080, 0xF000, 0xF9D4, 0xF89D, 0x0000, +0xB920, 0x48A8, 0x4946, 0x6800, 0x6008, 0xE003, 0x48A6, 0x4944, 0x6800, +0x6008, 0xBD08, 0xB50E, 0x2000, 0xF88D, 0x0000, 0xF000, 0xF945, 0x2005, +0x9001, 0xE008, 0x4843, 0x6800, 0x6A00, 0x4780, 0xF88D, 0x0000, 0x9801, +0x1E40, 0x9001, 0xF89D, 0x0000, 0xB910, 0x9801, 0x2800, 0xDCF0, 0x9801, +0xB920, 0x48B3, 0x4934, 0x6800, 0x6008, 0xE003, 0x4894, 0x4932, 0x6800, +0x6008, 0xF000, 0xF98A, 0xBD0E, 0xB50E, 0x2000, 0xF88D, 0x0000, 0xF000, +0xF957, 0x2005, 0x9001, 0xE00B, 0x4830, 0x6800, 0x4ABD, 0x6A40, 0x4601, +0x6810, 0x4788, 0xF88D, 0x0000, 0x9801, 0x1E40, 0x9001, 0xF89D, 0x0000, +0xB910, 0x9801, 0x2800, 0xDCED, 0x9801, 0xB920, 0x48C0, 0x4920, 0x6800, +0x6008, 0xE003, 0x4880, 0x491D, 0x6800, 0x6008, 0xF000, 0xF961, 0xBD0E, +0xB508, 0x2000, 0xF88D, 0x0000, 0xF000, 0xF92E, 0x48C3, 0x49C2, 0x6800, +0x6809, 0x4201, 0xD0F9, 0x49C0, 0x48C1, 0x680A, 0x6800, 0x4310, 0x6008, +0x4BBF, 0x48A5, 0x4ABF, 0x6801, 0x6818, 0x6812, 0xF000, 0xF9C0, 0xF88D, +0x0000, 0x49B9, 0x48B7, 0x4AB7, 0x680B, 0x6800, 0x6811, 0x4318, 0x4381, +0x6011, 0xF000, 0xF939, 0xF89D, 0x0000, 0xB920, 0x48A5, 0x4905, 0x6800, +0x6008, 0xE003, 0x4865, 0x4902, 0x6800, 0x6008, 0xBD08, 0x0864, 0x0200, +0x0154, 0x2000, 0x0B18, 0x0100, 0x0150, 0x2000, 0x0B28, 0x0100, 0xED08, +0xE000, 0x0180, 0x2000, 0x086C, 0x0200, 0xB500, 0xF1AD, 0x0D1C, 0x2000, +0xF88D, 0x0000, 0x2000, 0xF88D, 0x0001, 0x2000, 0x9001, 0x2000, 0xF88D, +0x0008, 0x48A0, 0x6800, 0x9003, 0x2000, 0x9004, 0x4883, 0x6800, 0x9005, +0x9803, 0x2800, 0xF000, 0x8084, 0x48C4, 0x9903, 0x6800, 0x4288, 0xD207, +0x48C2, 0x6800, 0x9004, 0x9904, 0x9803, 0x1A40, 0x9003, 0xE005, 0x9803, +0x9004, 0x9904, 0x9803, 0x1A40, 0x9003, 0xF000, 0xF8C1, 0x488D, 0x498B, +0x6800, 0x6809, 0x4201, 0xD105, 0x48B8, 0x4988, 0x6800, 0x6809, 0x4201, +0xD0F3, 0x4887, 0x4985, 0x6800, 0x6809, 0x4201, 0xD00C, 0x4984, 0x4884, +0x680A, 0x6800, 0x4310, 0x6008, 0x4883, 0x6800, 0x9001, 0x2001, 0xF88D, +0x0000, 0xE011, 0x48AB, 0x497C, 0x6800, 0x6809, 0x4201, 0xD00B, 0x49A8, +0x487B, 0x680A, 0x6800, 0x4310, 0x6008, 0x48A6, 0x6800, 0x9001, 0x2001, +0xF88D, 0x0001, 0xF89D, 0x0000, 0xB910, 0xF89D, 0x0001, 0xB150, 0x9905, +0x9801, 0x9A04, 0xF000, 0xF92B, 0xF88D, 0x0008, 0x9905, 0x9804, 0x1840, +0x9005, 0xF89D, 0x0000, 0xB160, 0x496B, 0x4869, 0x4A69, 0x680B, 0x6800, +0x6811, 0x4318, 0x4381, 0x6011, 0x2000, 0xF88D, 0x0000, 0xE00E, 0xF89D, +0x0001, 0xB158, 0x4963, 0x4861, 0x4A8F, 0x680B, 0x6800, 0x6811, 0x4318, +0x4381, 0x6011, 0x2000, 0xF88D, 0x0001, 0xF000, 0xF88A, 0xF89D, 0x0008, +0xB920, 0x484E, 0x4989, 0x6800, 0x6008, 0xE003, 0x9803, 0x2800, 0xF47F, +0xAF7C, 0xF89D, 0x0008, 0xB118, 0x480A, 0x4983, 0x6800, 0x6008, 0xB007, +0xBD00, 0x46C0, 0x0184, 0x2000, 0x018C, 0x2000, 0x0834, 0x0200, 0x018D, +0x2000, 0x0188, 0x2000, 0x0404, 0x4001, 0x0B2C, 0x0100, 0x0B1C, 0x0100, +0xB508, 0x487A, 0x4978, 0x6800, 0x6809, 0x4201, 0xD009, 0x4878, 0x6800, +0x6840, 0x4780, 0x497E, 0x6809, 0x690A, 0x1E41, 0x2000, 0x4790, 0x4872, +0x4973, 0x6800, 0x6809, 0x4201, 0xD01C, 0x4878, 0x6800, 0x4971, 0x6900, +0x4602, 0xF44F, 0x1000, 0x4790, 0x4870, 0x496E, 0x6800, 0x6809, 0x4288, +0xD106, 0x4871, 0x6800, 0x496E, 0x6900, 0x4602, 0x486B, 0x4790, 0x486D, +0x6800, 0x496B, 0x6900, 0x4602, 0xF44F, 0x1001, 0x4790, 0xBD08, 0x46C0, +0x0B24, 0x0100, 0xB508, 0x485F, 0x6800, 0x6840, 0x4780, 0x4965, 0x6809, +0x690A, 0x1E41, 0x2000, 0x4790, 0x4862, 0x6800, 0x495B, 0x6900, 0x4602, +0xF44F, 0x1000, 0x4790, 0x485A, 0x4958, 0x6800, 0x6809, 0x4288, 0xD106, +0x485B, 0x6800, 0x4958, 0x6900, 0x4602, 0x4855, 0x4790, 0x4857, 0x6800, +0x4955, 0x6900, 0x4602, 0xF44F, 0x1001, 0x4790, 0xBD08, 0x46C0, 0x015C, +0x2000, 0xB508, 0x4849, 0x6800, 0x6840, 0x4780, 0x494F, 0x6809, 0x694A, +0x1E41, 0x2000, 0x4790, 0x484C, 0x6800, 0x6940, 0xF44F, 0x1102, 0x4602, +0xF44F, 0x1000, 0x4790, 0xBD08, 0x46C0, 0x0B20, 0x0100, 0xF1AD, 0x0D08, +0x9000, 0x4945, 0xF646, 0x105A, 0x6008, 0x4844, 0x4A43, 0x9900, 0x6800, +0xF420, 0x20E0, 0x4301, 0x6011, 0x493F, 0x2000, 0x6008, 0xB002, 0x4770, +0x0B04, 0x0100, 0x0164, 0x2000, 0x0B00, 0x0100, 0x0AF8, 0x0100, 0x0160, +0x2000, 0xB508, 0x2000, 0xF88D, 0x0000, 0xF44F, 0x3080, 0xF7FF, 0xFFDA, +0x4832, 0x4935, 0x6800, 0x6809, 0x6D40, 0x4602, 0x2000, 0x4790, 0x482E, +0x4932, 0x6800, 0x6809, 0x6D40, 0x4602, 0x2001, 0x4790, 0x482F, 0x6800, +0x4A2F, 0x6980, 0x4601, 0x7810, 0x4788, 0xF88D, 0x0000, 0x482B, 0x6800, +0x4A2C, 0x6800, 0x4601, 0x7810, 0x4788, 0xF89D, 0x2000, 0x2100, 0x4210, +0xD000, 0x2101, 0xF88D, 0x1000, 0x4826, 0x6800, 0xF7FF, 0xFFAE, 0x4925, +0x2000, 0x6008, 0xF89D, 0x0000, 0xB920, 0x4823, 0x490E, 0x6800, 0x6008, +0xE003, 0x4822, 0x490B, 0x6800, 0x6008, 0xBD08, 0xB50E, 0x9202, 0x9101, +0x9000, 0x4812, 0x6800, 0x9901, 0x9A02, 0x6A80, 0x4603, 0x9800, 0x4798, +0xBD0E, 0x46C0, 0x0B08, 0x0100, 0x0168, 0x2000, 0x0AFC, 0x0100, 0x0154, +0x2000, 0x0B0C, 0x0100, 0x016C, 0x2000, 0x0868, 0x0200, 0x0B10, 0x0100, +0x0FFF, 0x0020, 0x0170, 0x2000, 0x0B14, 0x0100, 0x2000, 0x0020, 0x3FFF, +0x0020, 0x7FFF, 0x0020, 0x086C, 0x0200, 0x0400, 0x4001, 0x0404, 0x4001, +0x0180, 0x2000, 0x0184, 0x2000, 0x0834, 0x0200, 0x018D, 0x2000, 0x018C, +0x2000, 0x0188, 0x2000, 0xED08, 0xE000, 0x0B20, 0x0100, 0x0B1C, 0x0100, +0x2A00, 0xD04A, 0xEA5F, 0x0C00, 0x078B, 0xD11C, 0x0783, 0xD122, 0x2A10, +0xD308, 0xB470, 0x3A10, 0xC978, 0xC078, 0x3A10, 0xD2FB, 0xBC70, 0x3210, +0xD038, 0x2A04, 0xD32C, 0x2A08, 0xD305, 0x2A0C, 0xBF24, 0xC908, 0xC008, +0xC908, 0xC008, 0xC908, 0xC008, 0x0792, 0xD02A, 0x0F92, 0xE022, 0x780B, +0x7003, 0x1C49, 0x1C40, 0x1E52, 0xD022, 0x078B, 0xD1F7, 0x07C3, 0xD114, +0x0783, 0xD0D8, 0x1F12, 0xD312, 0xC908, 0x8003, 0x0C1B, 0x8043, 0x1D00, +0x1F12, 0xD2F8, 0xE00A, 0xC908, 0x7003, 0x0A1B, 0x7043, 0x0A1B, 0x7083, +0x0A1B, 0x70C3, 0x1D00, 0x1F12, 0xD2F4, 0x1D12, 0xD005, 0x780B, 0x7003, +0x1C49, 0x1C40, 0x1E52, 0xD1F9, 0x4660, 0x4770, 0x2200, 0x4613, 0x460A, +0x4619, 0xB571, 0xF010, 0x0F03, 0xD00B, 0x2A00, 0xBF82, 0xF800, 0x1B01, +0xF1B2, 0x0201, 0xF010, 0x0F03, 0xD1F6, 0x2A00, 0xBF08, 0xBD71, 0xF011, +0x01FF, 0xEA41, 0x2101, 0x2A04, 0xD318, 0xEA41, 0x4101, 0x2A08, 0xD30F, +0x460E, 0x2A10, 0xD308, 0x460C, 0x460D, 0xF1B2, 0x030F, 0xF012, 0x020F, +0xC072, 0x3B10, 0xD8FC, 0xF012, 0x0F08, 0xBF18, 0xC042, 0xF012, 0x0F04, +0xBF18, 0xF840, 0x1B04, 0xF012, 0x0F02, 0xBF18, 0xF820, 0x1B02, 0xF012, +0x0F01, 0xBF18, 0x7001, 0xBD71, 0x4770, 0x4814, 0xB5B0, 0xF1B0, 0x3FFF, +0xD001, 0xF000, 0xF8BB, 0x4D12, 0x4812, 0x42A8, 0xD010, 0x4812, 0x4C12, +0x42A0, 0xD00C, 0x1B00, 0x3C08, 0x10C7, 0xF854, 0x0F08, 0x7801, 0xF855, +0x2021, 0x6861, 0x1C40, 0x4790, 0x1E7F, 0xD1F5, 0xF000, 0xF84F, 0x4D0A, +0x4C0B, 0x42A5, 0xD005, 0xE002, 0xF854, 0x0B04, 0x4780, 0x42A5, 0xD1FA, +0xBDB0, 0x46C0, 0xFFFF, 0xFFFF, 0x0B60, 0x0100, 0x0B68, 0x0100, 0x0B70, +0x0100, 0x0B68, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0xE92D, 0x41F0, +0x4605, 0xF815, 0x7B01, 0x4690, 0x460E, 0xE01C, 0xF1B8, 0x0F00, 0xF105, +0x0501, 0xD00B, 0x2CFF, 0xD809, 0x2002, 0xF815, 0x1B01, 0x1E40, 0xEA41, +0x2404, 0xD1F9, 0xE001, 0x2C04, 0xD302, 0xF815, 0x1B01, 0xE000, 0x4639, +0x4630, 0x4622, 0xF7FF, 0xFF6D, 0x19A6, 0xE001, 0xF806, 0x0B01, 0xF815, +0x0B01, 0x4287, 0xD1F9, 0xF815, 0x4B01, 0x2C00, 0xD1E9, 0xF815, 0x0B01, +0x782C, 0x0200, 0x1824, 0xD1D4, 0xE8BD, 0x81F0, 0x4770, 0xF64E, 0x5188, +0xF2CE, 0x0100, 0x6808, 0xF04F, 0x03F0, 0xEA40, 0x4003, 0x6008, 0x480C, +0x4685, 0x480C, 0x4485, 0x466F, 0x2007, 0x4387, 0x46BD, 0x480A, 0x466F, +0x6007, 0xF7FF, 0xFF7A, 0xF000, 0xF887, 0x2800, 0xD001, 0xF7FF, 0xFF75, +0xF000, 0xF85B, 0x2001, 0xF000, 0xF80E, 0xE7FE, 0x46C0, 0x0E00, 0x0100, +0x0200, 0x0000, 0x0B44, 0x0100, 0xBF00, 0x4770, 0xB508, 0xF7FF, 0xFFFB, +0xE7FE, 0xB538, 0x4C0D, 0x4605, 0x68A0, 0xB120, 0x480C, 0xF1B0, 0x3FFF, +0xD000, 0x4780, 0x480A, 0x6800, 0x4780, 0x6860, 0xB110, 0x4601, 0x4628, +0x4788, 0x6820, 0xB100, 0x4780, 0x4806, 0x6800, 0x4780, 0xF7FF, 0xFFE2, +0xBD38, 0x46C0, 0x0B30, 0x0100, 0xFFFF, 0xFFFF, 0x0B3C, 0x0100, 0x0B40, +0x0100, 0xB5F8, 0x4606, 0x4D0F, 0x4F10, 0x8873, 0x2400, 0xE017, 0x00A0, +0xEB00, 0x00C4, 0x1832, 0x6851, 0x6890, 0x68D2, 0xB952, 0x42AF, 0xD00B, +0x780A, 0xF855, 0x2022, 0x4603, 0x1C49, 0x4608, 0x4619, 0x4790, 0xE001, +0xF7FF, 0xFE96, 0x8873, 0x1C64, 0xB2A4, 0x42A3, 0xDCE5, 0xBDF8, 0x0B60, +0x0100, 0x0B68, 0x0100, 0x4904, 0xF1B1, 0x3FFF, 0xBF07, 0x2100, 0x1C08, +0x6808, 0x1D09, 0xF7FF, 0xBB6C, 0xFFFF, 0xFFFF, 0x4903, 0x6008, 0x4770, +0x4902, 0x1F09, 0x6008, 0x4770, 0x4770, 0x0B40, 0x0100, 0xF8D0, 0x2003, +0x1DC3, 0x4608, 0x4619, 0xF7FF, 0xBE6F, 0xF3EF, 0x8010, 0xB672, 0x4770, +0x2000, 0x4770, 0x2201, 0xF7FF, 0xBF2A, 0x2001, 0x4770, 0xE7FE, 0x0000, +0x2000, 0x2000, 0x3000, 0x2000, 0x0001, 0x0000, 0x0010, 0x0000, 0x1000, +0x0000, 0x0001, 0x0000, 0x0002, 0x0000, 0x000B, 0x0000, 0x0001, 0x0000, +0x0ACE, 0x0000, 0xDEAD, 0x0000, 0xDEAD, 0xDEAD, 0x0BAD, 0x0000, 0xAD00, +0x00DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0200, 0x0802, 0x0100, 0x0000, 0xCB00, +0x000A, 0xCB01, 0x000A, 0x0201, 0x0004, 0x0002, 0x0000, 0x0AEB, 0x0100, +0x0AD1, 0x0100, 0x0B48, 0x0100, 0x0B30, 0x0100, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, +}; +const uint32_t MSP432P4xx_2M_Funclet_termination = 0x00000000; +const uint32_t MSP432P4xx_2M_Funclet_start = 0x01000000; +const uint32_t MSP432P4xx_2M_Funclet_finish = 0x01000E00; +const uint32_t MSP432P4xx_2M_Funclet_length = 0x00000E00; + +#define MSP432P4XX_2M_FUNCLET_TERMINATION 0x00000000 +#define MSP432P4XX_2M_FUNCLET_START 0x01000000 +#define MSP432P4XX_2M_FUNCLET_FINISH 0x01000E00 +#define MSP432P4XX_2M_FUNCLET_LENGTH 0x00000E00 diff --git a/DLL430_v3/src/TI/DLL430/MSP432P4xx_FlashLibFc.h b/DLL430_v3/src/TI/DLL430/MSP432P4xx_FlashLibFc.h new file mode 100644 index 0000000..28fe1bd --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432P4xx_FlashLibFc.h @@ -0,0 +1,178 @@ +/****************************************************************************** +* MSP432P4xx_FlashLibFC.h +* +* Copyright (C) 2014 - 2016 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. +******************************************************************************/ +/* File generated: Thu 01/12/2017 12:36:38.42 */ +#pragma once +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP432P4xx_Funclet[] = +{ +0x1000, 0x0100, 0x0141, 0x0100, 0x08C1, 0x0100, 0x08C3, 0x0100, 0x08C5, +0x0100, 0x08C5, 0x0100, 0x08C5, 0x0100, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xBB28, +0x4770, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0xB538, 0x4CDC, 0x6820, 0x0840, 0xD30F, 0xF04F, 0x7500, +0xF8D5, 0x081C, 0x6902, 0xF04F, 0x31FF, 0x2001, 0x4790, 0xF8D5, 0x081C, +0x6902, 0xF04F, 0x31FF, 0x2002, 0x4790, 0x6820, 0x0880, 0xD312, 0xF04F, +0x7000, 0xF600, 0x051C, 0xF8D0, 0x081C, 0x6902, 0x2003, 0x4601, 0x4790, +0x1D24, 0x6820, 0x280B, 0xD104, 0x6828, 0x6902, 0x2103, 0x2004, 0x4790, +0xBD38, 0xB538, 0xF04F, 0x7500, 0xF605, 0x041C, 0x6820, 0x6902, 0xF04F, +0x31FF, 0x2001, 0x4790, 0xF8D5, 0x081C, 0x6902, 0xF04F, 0x31FF, 0x2002, +0x4790, 0xF8D5, 0x081C, 0x6902, 0x2003, 0x4601, 0x4790, 0x48BA, 0x1D00, +0x6800, 0x280B, 0xD104, 0x6820, 0x6902, 0x2103, 0x2004, 0x4790, 0xBD38, +0xB508, 0x4BD1, 0x681B, 0x6A9B, 0x4798, 0xBD08, 0xB510, 0xF04F, 0x7400, +0xF8D4, 0x081C, 0x6942, 0xF04F, 0x31FF, 0x2001, 0x4790, 0xF8D4, 0x081C, +0x6942, 0xF04F, 0x31FF, 0x2002, 0x4790, 0xF8D4, 0x081C, 0x6942, 0x2003, +0x4601, 0x4790, 0xF8D4, 0x081C, 0x6942, 0x2103, 0x2004, 0x4790, 0xBD10, +0xB598, 0xF7FF, 0xFFB6, 0x4CA1, 0x3C18, 0x6920, 0x0940, 0xD3FC, 0x6920, +0xF040, 0x0001, 0x6120, 0x68A1, 0x68E2, 0xF04F, 0x2020, 0xF7FF, 0xFFCA, +0x4607, 0x6920, 0xF020, 0x0011, 0x6120, 0xF7FF, 0xFFC9, 0x2F00, 0xBF14, +0xF640, 0x20CE, 0xF64D, 0x60AD, 0x6020, 0xBD98, 0xB5B0, 0xF7FF, 0xFF95, +0x4C91, 0x4DAD, 0x2705, 0x2000, 0x3C18, 0xE004, 0x6828, 0x6A41, 0x68A0, +0x4788, 0x1E7F, 0xB908, 0x2F00, 0xDCF7, 0x2F00, 0xBF0C, 0xF64D, 0x60AD, +0xF640, 0x20CE, 0x6020, 0xF7FF, 0xFFA7, 0xBDB0, 0xB598, 0xF7FF, 0xFF4E, +0x4CA0, 0x2705, 0x2000, 0xE003, 0x6820, 0x6A00, 0x4780, 0x1E7F, 0xB908, +0x2F00, 0xDCF8, 0x2F00, 0xBF0C, 0x489C, 0xF640, 0x20CE, 0x4999, 0x6008, +0xF7FF, 0xFF8F, 0xBD98, 0x4A99, 0xF646, 0x115A, 0x6011, 0x6851, 0xF421, +0x21E0, 0x4308, 0x6050, 0x2000, 0x6010, 0x4770, 0xB5F8, 0x4893, 0x4D92, +0xF04F, 0x7180, 0xF04F, 0x7600, 0x1A28, 0x6001, 0xF8D6, 0x081C, 0x6D81, +0x2000, 0x4788, 0x4C8A, 0x62E0, 0xF8D6, 0x081C, 0x6D81, 0x2001, 0x4788, +0x6320, 0xF8D6, 0x0834, 0x6840, 0x4780, 0xF884, 0x0038, 0xF8D6, 0x0834, +0x6A00, 0x4780, 0xF884, 0x0039, 0x6868, 0xF400, 0x20E0, 0x6360, 0xF8D6, +0x0834, 0x6981, 0x2000, 0x4788, 0x4607, 0xF8D6, 0x081C, 0x6D42, 0x2102, +0x2000, 0x4790, 0xF8D6, 0x081C, 0x6D42, 0x2102, 0x2001, 0x4790, 0xF44F, +0x2080, 0xF7FF, 0xFFB8, 0x2F00, 0xBF14, 0xF640, 0x20CE, 0x4875, 0x6020, +0xBDF8, 0xB570, 0xF44F, 0x3080, 0xF7FF, 0xFFAC, 0xF04F, 0x7600, 0x4C6C, +0xF8D6, 0x081C, 0x6AE1, 0x6D42, 0x2000, 0x4790, 0xF8D6, 0x081C, 0x6B21, +0x6D42, 0x2001, 0x4790, 0xF8D6, 0x0834, 0x6981, 0xF894, 0x0039, 0x4788, +0x4605, 0xF8D6, 0x0834, 0x6801, 0xF894, 0x0038, 0x4788, 0xEA00, 0x0305, +0x6B60, 0xF7FF, 0xFF8B, 0x4961, 0x2000, 0x6008, 0x2B00, 0xBF14, 0xF640, +0x20CE, 0xF64D, 0x60AD, 0x6020, 0xBD70, 0xE92D, 0x4FF8, 0x4E56, 0x68F7, +0xF8D6, 0x9008, 0xF04F, 0x0800, 0x2F00, 0xD060, 0x4644, 0x4645, 0xF8DF, +0xB160, 0x9400, 0xF5B7, 0x5F80, 0xBF99, 0x46BA, 0xEBA7, 0x070A, 0xF5A7, +0x5780, 0xF44F, 0x5A80, 0xF7FF, 0xFECA, 0x6930, 0x0940, 0xD202, 0x6970, +0x0940, 0xD3F9, 0x6930, 0x0940, 0xD20E, 0x6970, 0x0940, 0xD204, 0xEA45, +0x0004, 0x2801, 0xD00F, 0xE025, 0x6970, 0x4B46, 0x2501, 0xF040, 0x0001, +0x6170, 0xE006, 0x6930, 0x2401, 0xF040, 0x0001, 0x6130, 0xF04F, 0x2320, +0x9300, 0x9800, 0x4649, 0x4652, 0xF7FF, 0xFEC8, 0x2C01, 0x4680, 0xD007, +0xB165, 0xF89B, 0x0002, 0xF000, 0x00BF, 0xF88B, 0x0002, 0xE005, 0xF89B, +0x0023, 0xF000, 0x00EF, 0xF88B, 0x0023, 0x44D1, 0x2C01, 0xD006, 0xB155, +0x6970, 0x2500, 0xF020, 0x0011, 0x6170, 0xE004, 0x6930, 0x2400, 0xF020, +0x0011, 0x6130, 0xF7FF, 0xFEAC, 0xF1B8, 0x0F00, 0xD002, 0x2F00, 0xD1A7, +0xE002, 0xF64D, 0x60AD, 0x6030, 0xF1B8, 0x0F00, 0xBF1C, 0xF640, 0x20CE, +0x6030, 0xE8BD, 0x8FF8, 0x016C, 0x2000, 0x4824, 0xB5F8, 0x6800, 0x6800, +0x4780, 0xF000, 0xF9CC, 0x4C22, 0xF640, 0x36AD, 0x2501, 0x2700, 0xE015, +0x6066, 0xE013, 0x6065, 0xF7FF, 0xFF79, 0xE00E, 0x6065, 0xF7FF, 0xFF44, +0xE00A, 0x6065, 0xF7FF, 0xFEFD, 0xE006, 0x6065, 0xF7FF, 0xFE99, 0xE002, +0x6065, 0xF7FF, 0xFEB6, 0x6027, 0x6820, 0x2800, 0xD0FC, 0x1E40, 0xD00A, +0x1E40, 0xD0F4, 0x1E80, 0xD0EE, 0x1F00, 0xD0E8, 0x3808, 0xD0E2, 0x3810, +0xD0DC, 0xE7D9, 0x6065, 0xF7FF, 0xFEBD, 0xE7EA, 0x46C0, 0x081C, 0x0200, +0x0154, 0x2000, 0xDEAD, 0xDEAD, 0x0400, 0x4001, 0x16F8, 0x6000, 0xAD00, +0x00DE, 0xED08, 0xE000, 0x3000, 0x2000, 0x4C20, 0x4000, 0x0864, 0x0200, +0x0150, 0x2000, 0x2A00, 0xD04A, 0xEA5F, 0x0C00, 0x078B, 0xD11C, 0x0783, +0xD122, 0x2A10, 0xD308, 0xB470, 0x3A10, 0xC978, 0xC078, 0x3A10, 0xD2FB, +0xBC70, 0x3210, 0xD038, 0x2A04, 0xD32C, 0x2A08, 0xD305, 0x2A0C, 0xBF24, +0xC908, 0xC008, 0xC908, 0xC008, 0xC908, 0xC008, 0x0792, 0xD02A, 0x0F92, +0xE022, 0x780B, 0x7003, 0x1C49, 0x1C40, 0x1E52, 0xD022, 0x078B, 0xD1F7, +0x07C3, 0xD114, 0x0783, 0xD0D8, 0x1F12, 0xD312, 0xC908, 0x8003, 0x0C1B, +0x8043, 0x1D00, 0x1F12, 0xD2F8, 0xE00A, 0xC908, 0x7003, 0x0A1B, 0x7043, +0x0A1B, 0x7083, 0x0A1B, 0x70C3, 0x1D00, 0x1F12, 0xD2F4, 0x1D12, 0xD005, +0x780B, 0x7003, 0x1C49, 0x1C40, 0x1E52, 0xD1F9, 0x4660, 0x4770, 0x2200, +0x4613, 0x460A, 0x4619, 0xB571, 0xF010, 0x0F03, 0xD00B, 0x2A00, 0xBF82, +0xF800, 0x1B01, 0xF1B2, 0x0201, 0xF010, 0x0F03, 0xD1F6, 0x2A00, 0xBF08, +0xBD71, 0xF011, 0x01FF, 0xEA41, 0x2101, 0x2A04, 0xD318, 0xEA41, 0x4101, +0x2A08, 0xD30F, 0x460E, 0x2A10, 0xD308, 0x460C, 0x460D, 0xF1B2, 0x030F, +0xF012, 0x020F, 0xC072, 0x3B10, 0xD8FC, 0xF012, 0x0F08, 0xBF18, 0xC042, +0xF012, 0x0F04, 0xBF18, 0xF840, 0x1B04, 0xF012, 0x0F02, 0xBF18, 0xF820, +0x1B02, 0xF012, 0x0F01, 0xBF18, 0x7001, 0xBD71, 0x0000, 0x4813, 0xB5B0, +0xF1B0, 0x3FFF, 0xD001, 0xF000, 0xF88D, 0x4D11, 0x4811, 0x42A8, 0xD010, +0x4811, 0x4C11, 0x42A0, 0xD00C, 0x1B00, 0x3C08, 0x10C7, 0xF854, 0x0F08, +0x7801, 0xF855, 0x2021, 0x6861, 0x1C40, 0x4790, 0x1E7F, 0xD1F5, 0x4D0A, +0x4C0B, 0x42A5, 0xD005, 0xE002, 0xF854, 0x0B04, 0x4780, 0x42A5, 0xD1FA, +0xBDB0, 0x46C0, 0xFFFF, 0xFFFF, 0x08FC, 0x0100, 0x0904, 0x0100, 0x090C, +0x0100, 0x0904, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0xE92D, 0x41F0, +0x4605, 0xF815, 0x7B01, 0x4690, 0x460E, 0xE01C, 0xF1B8, 0x0F00, 0xF105, +0x0501, 0xD00B, 0x0A20, 0xD109, 0x2002, 0xF815, 0x1B01, 0x1E40, 0xEA41, +0x2404, 0xD1F9, 0xE001, 0x2C04, 0xD302, 0xF815, 0x1B01, 0xE000, 0x4639, +0x4630, 0x4622, 0xF7FF, 0xFF6F, 0x19A6, 0xE001, 0xF806, 0x0B01, 0xF815, +0x0B01, 0x4287, 0xD1F9, 0xF815, 0x4B01, 0x2C00, 0xD1E9, 0xF815, 0x0B01, +0x782C, 0x0200, 0x1824, 0xD1D4, 0xE8BD, 0x81F0, 0x0000, 0xF64E, 0x5188, +0xF2CE, 0x0100, 0x6808, 0xF04F, 0x03F0, 0xEA40, 0x4003, 0x6008, 0x480B, +0x4685, 0x480B, 0x4485, 0x466F, 0x2007, 0x4387, 0x46BD, 0x4809, 0x466F, +0x6007, 0xF000, 0xF882, 0x2800, 0xD001, 0xF7FF, 0xFF79, 0xF000, 0xF853, +0x2001, 0xF000, 0xF834, 0xE7FE, 0x46C0, 0x0E00, 0x0100, 0x0200, 0x0000, +0x08DC, 0x0100, 0xB5F8, 0x4606, 0x4D0F, 0x4F10, 0x8873, 0x2400, 0xE017, +0x00A0, 0xEB00, 0x00C4, 0x1832, 0x6851, 0x6890, 0x68D2, 0xB952, 0x42AF, +0xD00B, 0x780A, 0xF855, 0x2022, 0x4603, 0x1C49, 0x4608, 0x4619, 0x4790, +0xE001, 0xF7FF, 0xFEC4, 0x8873, 0x1C64, 0xB2A4, 0x42A3, 0xDCE5, 0xBDF8, +0x08FC, 0x0100, 0x0904, 0x0100, 0xBF00, 0x4770, 0xB508, 0xF7FF, 0xFFFB, +0xE7FE, 0xB538, 0x4605, 0x4809, 0x6800, 0x4780, 0x4C09, 0x1D20, 0x6800, +0xB110, 0x4601, 0x4628, 0x4788, 0x6820, 0xB100, 0x4780, 0x4805, 0x6800, +0x4780, 0xF7FF, 0xFFE8, 0xBD38, 0x46C0, 0x08CC, 0x0100, 0x08D4, 0x0100, +0x08D0, 0x0100, 0x4904, 0xF1B1, 0x3FFF, 0xBF07, 0x2100, 0x1C08, 0x6808, +0x1D09, 0xF7FF, 0xBE40, 0xFFFF, 0xFFFF, 0x4903, 0x6008, 0x4770, 0x4902, +0x1F09, 0x6008, 0x4770, 0x4770, 0x08D0, 0x0100, 0xF8D0, 0x2003, 0x1DC3, +0x4608, 0x4619, 0xF7FF, 0xBE7B, 0xF3EF, 0x8010, 0xB672, 0x4770, 0x2000, +0x4770, 0x2201, 0xF7FF, 0xBF34, 0xE7FE, 0xE7FE, 0xE7FE, 0x2001, 0x4770, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0200, 0x089B, 0x0100, +0x089B, 0x0100, 0x0D02, 0x2000, 0x2000, 0x0002, 0x0000, 0x08BB, 0x0100, +0x08A1, 0x0100, 0x08E8, 0x0100, 0x08CC, 0x0100, +}; +const uint32_t MSP432P4xx_Funclet_termination = 0x00000000; +const uint32_t MSP432P4xx_Funclet_start = 0x01000000; +const uint32_t MSP432P4xx_Funclet_finish = 0x0100090C; +const uint32_t MSP432P4xx_Funclet_length = 0x0000090C; + +#define MSP432P4XX_FUNCLET_TERMINATION 0x00000000 +#define MSP432P4XX_FUNCLET_START 0x01000000 +#define MSP432P4XX_FUNCLET_FINISH 0x0100090C +#define MSP432P4XX_FUNCLET_LENGTH 0x0000090C diff --git a/DLL430_v3/src/TI/DLL430/MSP432P4xx_PG11_FlashLibFc.h b/DLL430_v3/src/TI/DLL430/MSP432P4xx_PG11_FlashLibFc.h new file mode 100644 index 0000000..062d0a8 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432P4xx_PG11_FlashLibFc.h @@ -0,0 +1,476 @@ +/****************************************************************************** +* MSP432P4xx_FlashLibFC.h +* +* Copyright (C) 2014 - 2016 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. +******************************************************************************/ +/* File generated: Thu 01/12/2017 12:36:54.61 */ +#pragma once +/* http://srecord.sourceforge.net/ */ +const uint16_t MSP432P4xx_PG11_Funclet[] = +{ +0x2000, 0x0100, 0x0141, 0x0100, 0x1D95, 0x0100, 0x1D97, 0x0100, 0x1D99, +0x0100, 0x1D99, 0x0100, 0x1D99, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x1060, 0x4001, 0x1064, +0x4001, 0x1068, 0x4001, 0x106C, 0x4001, 0x1070, 0x4001, 0x1074, 0x4001, +0x1078, 0x4001, 0x107C, 0x4001, 0x1080, 0x4001, 0x1084, 0x4001, 0x1088, +0x4001, 0x108C, 0x4001, 0x1090, 0x4001, 0x1094, 0x4001, 0x1098, 0x4001, +0x109C, 0x4001, 0x0E13, 0x0100, 0x0E13, 0x0100, 0x0D02, 0x2000, 0x2000, +0x0002, 0x0000, 0x1D8F, 0x0100, 0x1D21, 0x0100, 0x00D0, 0x0100, 0x1DA4, +0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF001, 0xBC50, +0x4770, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0xB508, 0x2001, 0xF04F, 0x31FF, 0xF001, 0xFB80, 0x2002, +0xF04F, 0x31FF, 0xF001, 0xFB7B, 0x2003, 0x4601, 0xF001, 0xFB77, 0x48C3, +0x6800, 0x280B, 0xD103, 0x2004, 0x2103, 0xF001, 0xFB6F, 0xBD08, 0xB5F8, +0x4615, 0x460C, 0x4606, 0xF001, 0xFDCA, 0x42A0, 0xD303, 0xF001, 0xFDC6, +0x0842, 0xE000, 0x4AB9, 0x42A2, 0xD90C, 0x1960, 0x4282, 0xD209, 0x1B12, +0x4630, 0x4621, 0x4617, 0xF000, 0xFD94, 0xB138, 0x193C, 0x19BE, 0x1BED, +0x4630, 0x4621, 0x462A, 0xF000, 0xFD8B, 0xBDF8, 0xB508, 0x2001, 0xF04F, +0x31FF, 0xF001, 0xFB72, 0x2002, 0xF04F, 0x31FF, 0xF001, 0xFB6D, 0x2003, +0x4601, 0xF001, 0xFB69, 0x2004, 0x2103, 0xF001, 0xFB65, 0xBD08, 0xE92D, +0x4FF8, 0x4CA2, 0x3C1C, 0x68E7, 0xF8D4, 0x9008, 0xF04F, 0x0800, 0x2F00, +0xD060, 0x4645, 0x4646, 0xF8DF, 0xB2F0, 0x9500, 0xF5B7, 0x5F80, 0xBF99, +0x46BA, 0xEBA7, 0x070A, 0xF5A7, 0x5780, 0xF44F, 0x5A80, 0xF7FF, 0xFF96, +0x6920, 0x0940, 0xD202, 0x6960, 0x0940, 0xD3F9, 0x6920, 0x0940, 0xD20E, +0x6960, 0x0940, 0xD204, 0xEA46, 0x0005, 0x2801, 0xD00F, 0xE025, 0x6960, +0x4BAA, 0x2601, 0xF040, 0x0001, 0x6160, 0xE006, 0x6920, 0x2501, 0xF040, +0x0001, 0x6120, 0xF04F, 0x2320, 0x9300, 0x9800, 0x4649, 0x4652, 0xF7FF, +0xFF89, 0x2D01, 0x4680, 0xD007, 0xB166, 0xF89B, 0x0002, 0xF000, 0x00BF, +0xF88B, 0x0002, 0xE005, 0xF89B, 0x0023, 0xF000, 0x00EF, 0xF88B, 0x0023, +0x44D1, 0x2D01, 0xD006, 0xB156, 0x6960, 0x2600, 0xF020, 0x0011, 0x6160, +0xE004, 0x6920, 0x2500, 0xF020, 0x0011, 0x6120, 0xF7FF, 0xFF89, 0xF1B8, +0x0F00, 0xD002, 0x2F00, 0xD1A7, 0xE002, 0xF64D, 0x60AD, 0x6020, 0xF1B8, +0x0F00, 0xBF1C, 0xF640, 0x20CE, 0x6020, 0xE8BD, 0x8FF8, 0x4A89, 0xF646, +0x115A, 0x6011, 0x6851, 0xF421, 0x21E0, 0x4308, 0x6050, 0x2000, 0x6010, +0x4770, 0xB538, 0xF44F, 0x3080, 0xF7FF, 0xFFEF, 0x4C7E, 0x6AE1, 0x2000, +0xF001, 0xFC4E, 0x6B21, 0x2001, 0xF001, 0xFC4A, 0xF894, 0x0039, 0xF001, +0xFD1B, 0x4605, 0xF894, 0x0038, 0xF001, 0xFD0E, 0xEA00, 0x0305, 0x6B60, +0xF7FF, 0xFFD8, 0x4976, 0x2000, 0x6008, 0x2B00, 0xBF14, 0xF640, 0x20CE, +0xF64D, 0x60AD, 0x6020, 0xBD38, 0xB5B0, 0x4871, 0x4D6F, 0xF04F, 0x7180, +0x1A28, 0x6001, 0x2000, 0xF001, 0xFC83, 0x4C68, 0x62E0, 0x2001, 0xF001, +0xFC7E, 0x6320, 0xF001, 0xFBF3, 0xF884, 0x0038, 0xF001, 0xFCD7, 0xF884, +0x0039, 0x6868, 0xF400, 0x20E0, 0x6360, 0x2000, 0xF001, 0xFCE7, 0x4607, +0x2102, 0x2000, 0xF001, 0xFC0D, 0x2001, 0x2102, 0xF001, 0xFC09, 0xF44F, +0x2080, 0xF7FF, 0xFFA1, 0x2F00, 0xBF14, 0xF640, 0x20CE, 0x485B, 0x6020, +0xBDB0, 0xB598, 0xF7FF, 0xFED5, 0x4C52, 0x6920, 0x0940, 0xD3FC, 0x6920, +0xF040, 0x0001, 0x6120, 0x68A1, 0x68E2, 0xF04F, 0x2020, 0xF7FF, 0xFEDF, +0x4607, 0x6920, 0xF020, 0x0011, 0x6120, 0xF7FF, 0xFEFA, 0x2F00, 0xBF14, +0xF640, 0x20CE, 0xF64D, 0x60AD, 0x6020, 0xBD98, 0xB598, 0xF7FF, 0xFEB5, +0x4C42, 0x2705, 0x2000, 0xE003, 0x68A0, 0xF000, 0xFCF0, 0x1E7F, 0xB908, +0x2F00, 0xDCF8, 0x2F00, 0xBF0C, 0xF64D, 0x60AD, 0xF640, 0x20CE, 0x6020, +0xF7FF, 0xFEDB, 0xBD98, 0xB510, 0x4C3E, 0x6820, 0x0840, 0xD309, 0x2001, +0xF04F, 0x31FF, 0xF001, 0xFA1C, 0x2002, 0xF04F, 0x31FF, 0xF001, 0xFA17, +0x6820, 0x0880, 0xD30B, 0x2003, 0x4601, 0xF001, 0xFA10, 0x480F, 0x6800, +0x280B, 0xD103, 0x2004, 0x2103, 0xF001, 0xFA08, 0xBD10, 0xB510, 0xF7FF, +0xFFDE, 0x2405, 0x2000, 0xE002, 0xF000, 0xFBA5, 0x1E64, 0xB908, 0x2C00, +0xDCF9, 0x2C00, 0xBF0C, 0x4829, 0xF640, 0x20CE, 0x491F, 0x6008, 0xF7FF, +0xFEA6, 0xBD10, 0x46C0, 0x0170, 0x2000, 0x2000, 0x0020, 0xB5F8, 0xF001, +0xFBF3, 0xF001, 0xFC30, 0x4C21, 0xF640, 0x36AD, 0x2501, 0x2700, 0xE015, +0x6066, 0xE013, 0x6065, 0xF7FF, 0xFEA4, 0xE00E, 0x6065, 0xF7FF, 0xFF20, +0xE00A, 0x6065, 0xF7FF, 0xFF43, 0xE006, 0x6065, 0xF7FF, 0xFF72, 0xE002, +0x6065, 0xF7FF, 0xFF8E, 0x6027, 0x6820, 0x2800, 0xD0FC, 0x1E40, 0xD00A, +0x1E40, 0xD0F4, 0x1E80, 0xD0EE, 0x1F00, 0xD0E8, 0x3808, 0xD0E2, 0x3810, +0xD0DC, 0xE7D9, 0x6065, 0xF7FF, 0xFFB1, 0xE7EA, 0x46C0, 0x0154, 0x2000, +0x3000, 0x2000, 0x4C20, 0x4000, 0x0400, 0x4001, 0xED08, 0xE000, 0x16F8, +0x6000, 0xAD00, 0x00DE, 0x016C, 0x2000, 0xDEAD, 0xDEAD, 0x0150, 0x2000, +0xE92D, 0x4FF0, 0x4691, 0x460F, 0x4605, 0xF1AD, 0x0D14, 0xF001, 0xFC01, +0x9002, 0xF001, 0xFBC0, 0x4C6A, 0x42AC, 0xBF2C, 0xF04F, 0x0A00, 0xF04F, +0x0A02, 0xF001, 0xFBEF, 0x42A8, 0xD303, 0xF001, 0xFBEB, 0x0841, 0xE000, +0x4964, 0x2300, 0x42A9, 0xBF98, 0x2301, 0x197A, 0x2000, 0x4291, 0xBF98, +0x2001, 0x4606, 0x4618, 0xF001, 0xFB75, 0x4683, 0x4618, 0xF001, 0xFB3D, +0xEA4F, 0x014B, 0x1C49, 0x9001, 0x4618, 0xF001, 0xFB0E, 0x429E, 0xD00D, +0x4630, 0xF001, 0xFB65, 0x4601, 0x4630, 0x9103, 0xF001, 0xFB2C, 0x0049, +0x1C49, 0x9000, 0x4630, 0xF001, 0xFAFE, 0xF1B9, 0x0F10, 0xF04F, 0x0800, +0xD00A, 0x4618, 0x2103, 0xF001, 0xFA21, 0x429E, 0xD002, 0x4630, 0xF001, +0xFA1C, 0x4642, 0xE012, 0x4618, 0x2104, 0xF001, 0xFA16, 0x429E, 0xD002, +0x4630, 0xF001, 0xFA11, 0xF04F, 0x32FF, 0xE006, 0x1C6D, 0xF815, 0x1C01, +0xB2D0, 0x4288, 0xD15E, 0x1E7F, 0xF8DF, 0xE100, 0xF015, 0x0F03, 0xD007, +0x2F00, 0xD1F1, 0xE004, 0x6828, 0x4282, 0xD152, 0x1D2D, 0x1F3F, 0xF015, +0x0F0F, 0xD001, 0x2F04, 0xD2F5, 0x2F3F, 0xD932, 0x4835, 0x42AC, 0xD304, +0x6A01, 0x46C4, 0xF021, 0x0106, 0xE006, 0x6A01, 0xF44F, 0x1C00, 0xF021, +0x0104, 0xF041, 0x0102, 0x6201, 0x4674, 0x2101, 0x3C14, 0x7521, 0x4641, +0x6401, 0xEBA5, 0x010C, 0x6241, 0xF027, 0x010F, 0x6281, 0x6A81, 0x194D, +0xEA4A, 0x0109, 0xF041, 0x0109, 0x6201, 0xE000, 0xBF00, 0x6A01, 0xF401, +0x3140, 0xF5B1, 0x3F40, 0xD1F8, 0x7821, 0xB9E1, 0x7924, 0xB9D4, 0x6C04, +0xB9C4, 0xF007, 0x070F, 0x2F04, 0xD309, 0x08B8, 0x6829, 0x428A, 0xD110, +0x1E40, 0xF105, 0x0504, 0xF1A7, 0x0704, 0xD1F6, 0xB13F, 0xB2D1, 0x1C6D, +0xF815, 0x0C01, 0x4281, 0xD103, 0x1E7F, 0xD1F8, 0xF04F, 0x0801, 0x2001, +0x4674, 0x9901, 0x7020, 0x4618, 0xF001, 0xF9A2, 0x4618, 0x4659, 0xF001, +0xFA72, 0x429E, 0xD007, 0x9900, 0x4630, 0xF001, 0xF998, 0x9903, 0x4630, +0xF001, 0xFA68, 0x9802, 0xB908, 0xF001, 0xFAF6, 0x4640, 0xB005, 0xE8BD, +0x8FF0, 0xFFFF, 0x0003, 0x2000, 0x0020, 0x1000, 0x4001, 0x045C, 0x4222, +0xB570, 0x460E, 0x4601, 0xF001, 0xFB0F, 0x4615, 0x4281, 0xBF08, 0x2001, +0xF000, 0x80C4, 0x4608, 0x2814, 0xDC15, 0x2814, 0xD047, 0x2800, 0xF000, +0x80AE, 0x1E40, 0xF000, 0x809C, 0x1EC0, 0xF000, 0x808C, 0x1E40, 0xD07C, +0x1EC0, 0xD06C, 0x1E40, 0xD05B, 0x1FC0, 0xD048, 0x1E40, 0xD040, 0xE054, +0x3815, 0xD02B, 0x1EC0, 0xD01C, 0x1E40, 0xD014, 0x1FC0, 0xD006, 0x1E40, +0xD007, 0x387F, 0xD008, 0x3820, 0xD008, 0xE045, 0xF000, 0xFF05, 0xE040, +0xF001, 0xFABA, 0xE03D, 0x20A0, 0xE000, 0x20C0, 0xF001, 0xF8CE, 0xE037, +0x2001, 0x4631, 0xF000, 0xFD51, 0xB930, 0xE033, 0x2000, 0x4631, 0xF000, +0xFD4B, 0x2800, 0xD02D, 0x462A, 0x2002, 0x4631, 0xF000, 0xFC7E, 0xBB18, +0xE026, 0x2001, 0x4631, 0xF000, 0xFD3E, 0xB928, 0xE020, 0x2000, 0x4631, +0xF000, 0xFD38, 0xB1D8, 0x462A, 0x2001, 0x4631, 0xF000, 0xFC6C, 0xB988, +0xE014, 0x2001, 0x4631, 0xF000, 0xFD2C, 0xB928, 0xE00E, 0x2000, 0x4631, +0xF000, 0xFD26, 0xB148, 0x462A, 0x2000, 0x4631, 0xF000, 0xFC5A, 0xB118, +0xF001, 0xF9F5, 0x4604, 0xE054, 0x2000, 0xBD70, 0x2001, 0x4631, 0xF000, +0xFD15, 0x2400, 0x2800, 0xD03C, 0x462A, 0x2002, 0x4631, 0xF000, 0xFC47, +0x2800, 0xD035, 0xE033, 0x2400, 0x4631, 0x4620, 0xF000, 0xFD05, 0x2800, +0xD02D, 0x462A, 0x2002, 0x4631, 0xF000, 0xFC38, 0xB338, 0xE025, 0x2001, +0x4631, 0xF000, 0xFCF8, 0x2400, 0xB300, 0x462A, 0x2001, 0x4631, 0xF000, +0xFC2B, 0xB1D0, 0xE018, 0x2400, 0x4631, 0x4620, 0xF000, 0xFCEA, 0xB198, +0x462A, 0x2001, 0x4631, 0xF000, 0xFC1E, 0xB168, 0xE00B, 0x2001, 0x4631, +0xF000, 0xFCDE, 0x2400, 0xB130, 0x462A, 0x4620, 0x4631, 0xF000, 0xFC11, +0xB100, 0x2401, 0x4620, 0xE7B5, 0x2400, 0x4631, 0x4620, 0xF000, 0xFCCE, +0xB130, 0x462A, 0x4620, 0x4631, 0xF000, 0xFC02, 0xB100, 0x2401, 0x4620, +0xBD70, 0x4965, 0x4281, 0xBF38, 0xF5A0, 0x3000, 0xF5B0, 0x3F80, 0xDC37, +0xF5B0, 0x3F80, 0xF000, 0x808E, 0xF5B0, 0x4F00, 0xDC1A, 0xF5B0, 0x4F00, +0xD06F, 0x2800, 0xD05D, 0xF5B0, 0x5080, 0xD05C, 0xF5B0, 0x5080, 0xD05B, +0xF5B0, 0x5080, 0xD05A, 0xF5B0, 0x5080, 0xD059, 0xF5B0, 0x5080, 0xD058, +0xF5B0, 0x5080, 0xD057, 0xF5B0, 0x5080, 0xD056, 0xE09F, 0xF5B0, 0x4010, +0xD057, 0xF5B0, 0x5080, 0xD057, 0xF5B0, 0x5080, 0xD057, 0xF5B0, 0x5080, +0xD057, 0xF5B0, 0x5080, 0xD057, 0xF5B0, 0x5080, 0xD057, 0xF5B0, 0x5080, +0xD057, 0xE089, 0xF5B0, 0x3FC0, 0xDC18, 0xF5B0, 0x3FC0, 0xD06B, 0xF5B0, +0x3088, 0xD053, 0xF5B0, 0x5080, 0xD053, 0xF5B0, 0x5080, 0xD053, 0xF5B0, +0x5080, 0xD053, 0xF5B0, 0x5080, 0xD053, 0xF5B0, 0x5080, 0xD053, 0xF5B0, +0x5080, 0xD053, 0xE06D, 0xF5B0, 0x30C8, 0xD055, 0xF5B0, 0x5080, 0xD055, +0xF5B0, 0x5080, 0xD055, 0xF5B0, 0x5080, 0xD055, 0xF5B0, 0x5080, 0xD055, +0xF5B0, 0x5080, 0xD055, 0xF5B0, 0x5080, 0xD055, 0xE057, 0x2001, 0x4770, +0x2002, 0x4770, 0x2004, 0x4770, 0x2008, 0x4770, 0x2010, 0x4770, 0x2020, +0x4770, 0x2040, 0x4770, 0x2080, 0x4770, 0xF44F, 0x7080, 0x4770, 0xF44F, +0x7000, 0x4770, 0xF44F, 0x6080, 0x4770, 0xF44F, 0x6000, 0x4770, 0xF44F, +0x5080, 0x4770, 0xF44F, 0x5000, 0x4770, 0xF44F, 0x4080, 0x4770, 0xF44F, +0x4000, 0x4770, 0xF44F, 0x3080, 0x4770, 0xF44F, 0x3000, 0x4770, 0xF44F, +0x2080, 0x4770, 0xF44F, 0x2000, 0x4770, 0xF44F, 0x1080, 0x4770, 0xF44F, +0x1000, 0x4770, 0xF44F, 0x0080, 0x4770, 0xF44F, 0x0000, 0x4770, 0xF04F, +0x7080, 0x4770, 0xF04F, 0x7000, 0x4770, 0xF04F, 0x6080, 0x4770, 0xF04F, +0x6000, 0x4770, 0xF04F, 0x5080, 0x4770, 0xF04F, 0x5000, 0x4770, 0xF04F, +0x4080, 0x4770, 0xF04F, 0x4000, 0x4770, 0x2000, 0x4770, 0xFFFF, 0x0001, +0xE92D, 0x4FF0, 0x4605, 0xF1AD, 0x0D14, 0x4616, 0x9302, 0x200C, 0x9101, +0xF001, 0xF849, 0x20C0, 0xF001, 0xF864, 0xF04F, 0x0901, 0x2000, 0x4F53, +0xF8DF, 0xB14C, 0x9003, 0xE009, 0xF885, 0x9000, 0xE095, 0xBF00, 0xE046, +0xF885, 0x9044, 0xE037, 0xF88B, 0x9000, 0x6D78, 0xF410, 0x2FE0, 0xD1F9, +0x484B, 0x9901, 0x4288, 0xD304, 0x6D78, 0x9903, 0xF020, 0x0006, 0xE006, +0x6D78, 0xF44F, 0x1100, 0xF020, 0x0004, 0xF040, 0x0002, 0x6578, 0xF8DF, +0xA110, 0x9801, 0x9C03, 0x1A40, 0x65B8, 0xB146, 0xF85A, 0x1024, 0x6828, +0x1C64, 0x1F36, 0x1D2D, 0x2C10, 0x6008, 0xD3F5, 0x9802, 0x2800, 0xD065, +0xF8DD, 0x800C, 0xF3C4, 0x009C, 0x465D, 0x00C0, 0x3D44, 0x9000, 0xF8D7, +0x00F8, 0xF040, 0x0016, 0xF8C7, 0x00F8, 0x6D78, 0xF410, 0x2FE0, 0xD1C0, +0x6D79, 0x9800, 0xF021, 0x0138, 0x4308, 0xF040, 0x0001, 0x6578, 0x6D78, +0xF400, 0x20E0, 0xF5B0, 0x2FE0, 0xD1B0, 0xF895, 0x003C, 0x2800, 0xD141, +0x782E, 0xB1DE, 0xF895, 0x0034, 0xB1C0, 0x9801, 0x00A1, 0xF000, 0xFA49, +0x9E03, 0xB184, 0xF1AA, 0x0104, 0x4620, 0xF851, 0x2F04, 0x6812, 0xF1B2, +0x3FFF, 0xD104, 0x1E40, 0xF106, 0x0601, 0xD1F5, 0xE002, 0x2040, 0xF000, +0xFFCC, 0x42B4, 0xD11E, 0xF895, 0x0038, 0xB1C0, 0x9801, 0x00A1, 0xF000, +0xF9BB, 0x9E03, 0xB184, 0xF1AA, 0x0104, 0x4620, 0xF851, 0x2F04, 0x6812, +0xF1B2, 0x3FFF, 0xD104, 0x1E40, 0xF106, 0x0601, 0xD1F5, 0xE002, 0x20C0, +0xF000, 0xFFCE, 0x42B4, 0xD102, 0xF8CD, 0x900C, 0xE004, 0x9802, 0xF108, +0x0801, 0x4540, 0xD8A1, 0x465D, 0x6D78, 0xF410, 0x2FE0, 0xF47F, 0xAF62, +0x9803, 0xB005, 0xE8BD, 0x8FF0, 0x1000, 0x4001, 0x0ADC, 0x4222, 0xFFFF, +0x0003, 0x1DA4, 0x0100, 0xE92D, 0x4FFE, 0xF001, 0xF8BE, 0x9001, 0xF001, +0xF87D, 0x2001, 0xF8DF, 0xA110, 0x4D44, 0xF88A, 0x0000, 0xF8D5, 0x00A0, +0xF040, 0x0003, 0xF8C5, 0x00A0, 0x2000, 0x9000, 0xE000, 0xBF00, 0xF8D5, +0x00A0, 0xF400, 0x3040, 0xF5B0, 0x3F80, 0xD0F7, 0xF8D5, 0x00A0, 0xF400, +0x3040, 0xF5B0, 0x3F00, 0xD0F0, 0xF81A, 0x0C04, 0x2800, 0xD15E, 0xF001, +0xF891, 0x0847, 0xD058, 0x9C00, 0xF8DF, 0x80CC, 0xF607, 0x70FF, 0x0B06, +0x4620, 0xF7FF, 0xFE3C, 0x4681, 0xF8D5, 0x00B4, 0xEA19, 0x0F00, 0xD10B, +0x4620, 0xF44F, 0x5180, 0x2210, 0xF7FF, 0xFC76, 0xB920, 0x4620, 0xF000, +0xF8D0, 0x2800, 0xD03F, 0xF8D5, 0x00C4, 0xEA19, 0x0F00, 0xD10D, 0xEB07, +0x0B04, 0xF44F, 0x5180, 0x2210, 0x4658, 0xF7FF, 0xFC63, 0xB920, 0x4658, +0xF000, 0xF8BD, 0x2800, 0xD02C, 0xF1B9, 0x0F04, 0xD223, 0xF8D5, 0x00B0, +0xEA19, 0x0F00, 0xD10C, 0xF504, 0x1000, 0xF44F, 0x5180, 0x2210, 0xF7FF, +0xFC4E, 0xB920, 0xF504, 0x1000, 0xF000, 0xF8A7, 0xB1B8, 0xF8D5, 0x00C0, +0xEA19, 0x0F00, 0xD10C, 0xEB08, 0x0004, 0xF44F, 0x5180, 0x2210, 0xF7FF, +0xFC3C, 0xB920, 0xEB08, 0x0004, 0xF000, 0xF895, 0xB128, 0x1E76, 0xF504, +0x5480, 0xD1AC, 0x2001, 0x9000, 0x2001, 0x9F01, 0xF88A, 0x0000, 0xB90F, +0xF000, 0xFFFD, 0x9800, 0xE8BD, 0x8FFE, 0x144C, 0x4222, 0x1000, 0x4001, +0x2000, 0x0020, 0xE92D, 0x47FC, 0x4617, 0x460C, 0x4605, 0xF001, 0xF823, +0x4681, 0xF000, 0xFFE2, 0x2004, 0x2100, 0xAA01, 0x466B, 0xF000, 0xFE2E, +0x9801, 0xB128, 0x9800, 0x6800, 0x2800, 0xBF18, 0x4680, 0xD101, 0xF04F, +0x0805, 0x2002, 0xF000, 0xFF91, 0xF04F, 0x0A00, 0xE009, 0x4628, 0x4621, +0x4642, 0xF000, 0xFB7D, 0x2800, 0xD04B, 0x1C6D, 0x1C64, 0x1E7F, 0xF014, +0x0F03, 0xD00C, 0x2F00, 0xD1F0, 0xE009, 0x4628, 0x4621, 0x4642, 0xF000, +0xFA11, 0x2800, 0xD03B, 0x1D2D, 0x1D24, 0x1F3F, 0xF014, 0x0F0F, 0xD124, +0x2F11, 0xD310, 0x2F3F, 0xBF8C, 0x2640, 0xF027, 0x060F, 0x4628, 0x4621, +0x4643, 0x4632, 0xF7FF, 0xFE5E, 0xB338, 0x1BBF, 0x1975, 0x1934, 0x2F10, +0xD8EE, 0x2F04, 0xD311, 0x08BE, 0x4628, 0x4621, 0x4642, 0xF000, 0xF9EE, +0xB1C8, 0x1E76, 0xF105, 0x0504, 0xF104, 0x0404, 0xF1A7, 0x0704, 0xD1F1, +0xE001, 0x2F04, 0xD2CB, 0xB15F, 0x4628, 0x4621, 0x4642, 0xF000, 0xFB38, +0xB138, 0x1E7F, 0xF105, 0x0501, 0xF104, 0x0401, 0xD1F3, 0xF04F, 0x0A01, +0xF1B9, 0x0F00, 0xD101, 0xF000, 0xFF7C, 0xF000, 0xFF6A, 0x4650, 0xE8BD, +0x87FC, 0x4770, 0xE92D, 0x4FFE, 0x4606, 0xF000, 0xFFA7, 0x4682, 0xF000, +0xFF66, 0x4833, 0x42B0, 0xBF34, 0x2402, 0x2400, 0x2100, 0x2004, 0xAA01, +0x466B, 0xF000, 0xFDAD, 0x9801, 0xF04F, 0x0900, 0xB130, 0x9800, 0x6840, +0xB118, 0x4680, 0xF640, 0x70FF, 0xE005, 0xF04F, 0x0832, 0xE7F9, 0xBF00, +0xE026, 0x1E76, 0x4230, 0xD1FC, 0x4D25, 0x2701, 0x2C02, 0x4825, 0x702F, +0xD006, 0x4683, 0xF8DB, 0x10A0, 0x4648, 0xF021, 0x010C, 0xE008, 0x4683, +0xF8DB, 0x10A0, 0xF44F, 0x1000, 0xF021, 0x0108, 0xF041, 0x0104, 0xF8CB, +0x10A0, 0x1A30, 0xF805, 0x9C48, 0xF1B8, 0x0F00, 0xF8CB, 0x00A4, 0xD020, +0x464C, 0x702F, 0xF805, 0x7C4C, 0xF8DB, 0x00A0, 0xF400, 0x3040, 0xF5B0, +0x3F80, 0xD0CF, 0xF8DB, 0x00A0, 0xF400, 0x3040, 0xF5B0, 0x3F00, 0xD0C8, +0xF815, 0x0C04, 0xB958, 0x4630, 0xF44F, 0x5180, 0x2210, 0xF7FF, 0xFB41, +0xB918, 0x1C64, 0x45A0, 0xD8E1, 0xE000, 0x46B9, 0xF1BA, 0x0F00, 0x702F, +0xD101, 0xF000, 0xFF09, 0x4648, 0xE8BD, 0x8FFE, 0xFFFF, 0x0003, 0x144C, +0x4222, 0x1000, 0x4001, 0xE92D, 0x47F0, 0x460F, 0x4A33, 0x4933, 0x4605, +0x2601, 0xE000, 0x7016, 0x6808, 0xF410, 0x2FE0, 0xD1FA, 0xF000, 0xFF21, +0x42A8, 0xD303, 0xF000, 0xFF1D, 0x0840, 0xE000, 0x482C, 0x2300, 0x42A8, +0xBF98, 0x1C33, 0x1979, 0x2400, 0x4288, 0xBF98, 0x1C34, 0x4618, 0xF000, +0xFEA8, 0x4606, 0x4618, 0xF000, 0xFE70, 0x0071, 0x1C49, 0x4682, 0x4618, +0xF000, 0xFE42, 0x2103, 0x4618, 0xF000, 0xFD6A, 0x429C, 0xD011, 0x4620, +0xF000, 0xFE95, 0x4680, 0x4620, 0xF000, 0xFE5D, 0xEA4F, 0x0148, 0x1C49, +0x4681, 0x4620, 0xF000, 0xFE2E, 0x4620, 0x2103, 0xF000, 0xFD56, 0x08BF, +0xD00E, 0xF8DF, 0xC050, 0xF85C, 0x1B04, 0x680A, 0x6828, 0x1E7F, 0xF105, +0x0504, 0xEA20, 0x0002, 0xEA6F, 0x0000, 0x6008, 0xD1F2, 0x4618, 0x4651, +0xF000, 0xFD41, 0x4618, 0x4631, 0xF000, 0xFE11, 0x429C, 0xD007, 0x4620, +0x4649, 0xF000, 0xFD37, 0x4620, 0x4641, 0xF000, 0xFE07, 0xE8BD, 0x87F0, +0x46C0, 0x0ADC, 0x4222, 0x1054, 0x4001, 0x2000, 0x0020, 0x1DA4, 0x0100, +0xE92D, 0x47F0, 0x460F, 0x4A33, 0x4933, 0x4605, 0x2601, 0xE000, 0x7016, +0x6808, 0xF410, 0x2FE0, 0xD1FA, 0xF000, 0xFEAF, 0x42A8, 0xD303, 0xF000, +0xFEAB, 0x0840, 0xE000, 0x482C, 0x2300, 0x42A8, 0xBF98, 0x1C33, 0x1979, +0x2400, 0x4288, 0xBF98, 0x1C34, 0x4618, 0xF000, 0xFE36, 0x4606, 0x4618, +0xF000, 0xFDFE, 0x0071, 0x1C49, 0x4682, 0x4618, 0xF000, 0xFDD0, 0x2103, +0x4618, 0xF000, 0xFCF8, 0x429C, 0xD011, 0x4620, 0xF000, 0xFE23, 0x4680, +0x4620, 0xF000, 0xFDEB, 0xEA4F, 0x0148, 0x1C49, 0x4681, 0x4620, 0xF000, +0xFDBC, 0x4620, 0x2103, 0xF000, 0xFCE4, 0x08BF, 0xD00E, 0xF8DF, 0xC050, +0xF85C, 0x1B04, 0x680A, 0x6828, 0x4310, 0x680A, 0x1E7F, 0xF105, 0x0504, +0xEA62, 0x0000, 0x6008, 0xD1F2, 0x4618, 0x4651, 0xF000, 0xFCCF, 0x4618, +0x4631, 0xF000, 0xFD9F, 0x429C, 0xD007, 0x4620, 0x4649, 0xF000, 0xFCC5, +0x4620, 0x4641, 0xF000, 0xFD95, 0xE8BD, 0x87F0, 0x46C0, 0x0ADC, 0x4222, +0x1054, 0x4001, 0x2000, 0x0020, 0x1DA4, 0x0100, 0xE92D, 0x4FF8, 0x460F, +0x4611, 0x4602, 0x9100, 0xF000, 0xFD6C, 0x4290, 0xD050, 0xF000, 0xFE3A, +0x2300, 0xB107, 0x2301, 0xF8DF, 0xA0B8, 0x4C2A, 0xF8DF, 0xB0AC, 0xF64F, +0x75F0, 0x4698, 0x4629, 0x46D1, 0x6823, 0xB1C8, 0x1E40, 0xD008, 0x1EC0, +0xD029, 0x1E40, 0xD021, 0x1EC0, 0xD025, 0x1E40, 0xD01D, 0xE028, 0x2A01, +0xD007, 0x2A02, 0xD124, 0x4628, 0x4656, 0x4018, 0xF106, 0x0309, 0xE016, +0xEA05, 0x0003, 0xF10A, 0x0305, 0xE011, 0x2A01, 0xD006, 0x2A02, 0xD115, +0xEA05, 0x0003, 0xF10A, 0x0308, 0xE008, 0xEA01, 0x0003, 0xF109, 0x0304, +0xE003, 0xEA01, 0x0003, 0xF109, 0x0301, 0x4303, 0xE004, 0x4E0F, 0x4628, +0x4018, 0xEA46, 0x0300, 0x6023, 0x9800, 0xB148, 0xF89B, 0x6000, 0xB94E, +0xF000, 0xFD1E, 0x4603, 0xF000, 0xFDED, 0x429A, 0xD1BD, 0x2001, 0xE8BD, +0x8FF8, 0xF1B8, 0x0F00, 0xD0EF, 0x1E7F, 0xD1ED, 0x2000, 0xE8BD, 0x8FF8, +0x0000, 0x4001, 0x0000, 0x695A, 0x00A0, 0x4220, 0x0000, 0x695A, 0xE92D, +0x4FF8, 0x4604, 0x4617, 0x4688, 0x200C, 0xF000, 0xFCCC, 0x20C0, 0xF000, +0xFCAB, 0x6824, 0x2F00, 0xD03E, 0x4E20, 0x2500, 0xF8DF, 0xB084, 0xF8DF, +0xA084, 0xF8DF, 0x9078, 0xF8D6, 0x10F8, 0xF240, 0x200E, 0x4308, 0xF8C6, +0x00F8, 0xF8C8, 0x4000, 0xE000, 0xBF00, 0xF000, 0xFDAF, 0x0900, 0xD3FA, +0xF10B, 0x0008, 0x7803, 0xB15B, 0xF1AA, 0x0004, 0x7803, 0xB13B, 0x4620, +0x4641, 0xF000, 0xF8D5, 0x4604, 0xF1B4, 0x3FFF, 0xD111, 0xF899, 0x3000, +0xB13B, 0x4620, 0x4641, 0xF000, 0xF874, 0x4604, 0xF1B4, 0x3FFF, 0xD102, +0x2001, 0xE8BD, 0x8FF8, 0x200C, 0xF000, 0xFC8E, 0xE002, 0x2004, 0xF000, +0xFC6C, 0x1C6D, 0x42AF, 0xD8C8, 0x2000, 0xE8BD, 0x8FF8, 0x1000, 0x4001, +0x1E08, 0x4222, 0x0A00, 0x4222, 0x1E08, 0x4222, 0xE92D, 0x4FF8, 0x4616, +0x4602, 0xF000, 0xFCA8, 0x4681, 0xF000, 0xFC8F, 0x460F, 0x2100, 0xB107, +0x2101, 0x4688, 0x4282, 0xD033, 0x4C1F, 0xF64F, 0x71F0, 0xF8DF, 0xB084, +0xF8DF, 0xA078, 0x4D1E, 0x6823, 0xF000, 0xFD65, 0xB148, 0x1E40, 0xD00C, +0x1EC0, 0xD00A, 0x1E40, 0xD003, 0x1EC0, 0xD006, 0x1E40, 0xD109, 0x400B, +0xF10B, 0x0001, 0x4318, 0xE003, 0xEA01, 0x0003, 0xEA4A, 0x0000, 0x6020, +0xB196, 0x782B, 0xB99B, 0xF000, 0xFC63, 0x4282, 0xD1E0, 0xF000, 0xFC75, +0x4548, 0xD008, 0xF1B9, 0x0F01, 0xBF0C, 0x2001, 0x2002, 0xF000, 0xFD53, +0xE8BD, 0x8FF8, 0x2001, 0xE8BD, 0x8FF8, 0xF1B8, 0x0F00, 0xD0E6, 0x1E7F, +0xD1E4, 0x2000, 0xE8BD, 0x8FF8, 0x46C0, 0x0000, 0x4001, 0x0000, 0x695A, +0x00A0, 0x4220, 0x0000, 0x695A, 0xE92D, 0x47F0, 0x460D, 0x4606, 0xF000, +0xFD28, 0x42A8, 0xD303, 0xF000, 0xFD24, 0x0840, 0xE000, 0x4823, 0x2300, +0x42A8, 0xBF98, 0x2301, 0x1D29, 0x2400, 0x4288, 0xBF98, 0x2401, 0x4618, +0xF000, 0xFCAF, 0x4607, 0x4618, 0xF000, 0xFC77, 0x0079, 0x1C49, 0x4682, +0x4618, 0xF000, 0xFC49, 0x2103, 0x4618, 0xF000, 0xFB71, 0x429C, 0xD011, +0x4620, 0xF000, 0xFC9C, 0x4680, 0x4620, 0xF000, 0xFC64, 0xEA4F, 0x0148, +0x1C49, 0x4681, 0x4620, 0xF000, 0xFC35, 0x4620, 0x2103, 0xF000, 0xFB5D, +0x6828, 0x4651, 0x43B0, 0x43C6, 0x4618, 0xF000, 0xFB56, 0x4618, 0x4639, +0xF000, 0xFC26, 0x429C, 0xD007, 0x4620, 0x4649, 0xF000, 0xFB4C, 0x4620, +0x4641, 0xF000, 0xFC1C, 0x4630, 0xE8BD, 0x87F0, 0x46C0, 0x2000, 0x0020, +0xE92D, 0x47F0, 0x460E, 0x4605, 0xF000, 0xFCD2, 0x42B0, 0xD303, 0xF000, +0xFCCE, 0x0840, 0xE000, 0x4823, 0x2300, 0x42B0, 0xBF98, 0x2301, 0x1D31, +0x2400, 0x4288, 0xBF98, 0x2401, 0x4618, 0xF000, 0xFC59, 0x4607, 0x4618, +0xF000, 0xFC21, 0x0079, 0x1C49, 0x4682, 0x4618, 0xF000, 0xFBF3, 0x2103, +0x4618, 0xF000, 0xFB1B, 0x429C, 0xD011, 0x4620, 0xF000, 0xFC46, 0x4680, +0x4620, 0xF000, 0xFC0E, 0xEA4F, 0x0148, 0x1C49, 0x4681, 0x4620, 0xF000, +0xFBDF, 0x4620, 0x2103, 0xF000, 0xFB07, 0x6830, 0x4651, 0x4328, 0xEA65, +0x0500, 0x4618, 0xF000, 0xFAFF, 0x4618, 0x4639, 0xF000, 0xFBCF, 0x429C, +0xD007, 0x4620, 0x4649, 0xF000, 0xFAF5, 0x4620, 0x4641, 0xF000, 0xFBC5, +0x4628, 0xE8BD, 0x87F0, 0x2000, 0x0020, 0xE92D, 0x4FF8, 0x4604, 0x4617, +0x4689, 0x200C, 0xF000, 0xFB70, 0x20C0, 0xF000, 0xFB4F, 0x7824, 0x2F00, +0xD03B, 0x4E1F, 0x2500, 0xF240, 0x2B0E, 0xF8DF, 0xA07C, 0xF8DF, 0x8074, +0xF8D6, 0x00F8, 0xEA4B, 0x0000, 0xF8C6, 0x00F8, 0xF889, 0x4000, 0xE000, +0xBF00, 0xF000, 0xFC54, 0x0900, 0xD3FA, 0xF1AA, 0x0090, 0x7803, 0xB153, +0xF1A8, 0x0004, 0x7803, 0xB133, 0x4620, 0x4649, 0xF000, 0xF8EE, 0x4604, +0x2CFF, 0xD110, 0xF898, 0x3000, 0xB133, 0x4620, 0x4649, 0xF000, 0xF986, +0x4604, 0x2CFF, 0xD102, 0x2001, 0xE8BD, 0x8FF8, 0x200C, 0xF000, 0xFB35, +0xE002, 0x2004, 0xF000, 0xFB13, 0x1C6D, 0x42AF, 0xD8CB, 0x2000, 0xE8BD, +0x8FF8, 0x46C0, 0x1000, 0x4001, 0x1E08, 0x4222, 0x0A98, 0x4222, 0x2A00, +0xD04A, 0xEA5F, 0x0C00, 0x078B, 0xD11C, 0x0783, 0xD122, 0x2A10, 0xD308, +0xB470, 0x3A10, 0xC978, 0xC078, 0x3A10, 0xD2FB, 0xBC70, 0x3210, 0xD038, +0x2A04, 0xD32C, 0x2A08, 0xD305, 0x2A0C, 0xBF24, 0xC908, 0xC008, 0xC908, +0xC008, 0xC908, 0xC008, 0x0792, 0xD02A, 0x0F92, 0xE022, 0x780B, 0x7003, +0x1C49, 0x1C40, 0x1E52, 0xD022, 0x078B, 0xD1F7, 0x07C3, 0xD114, 0x0783, +0xD0D8, 0x1F12, 0xD312, 0xC908, 0x8003, 0x0C1B, 0x8043, 0x1D00, 0x1F12, +0xD2F8, 0xE00A, 0xC908, 0x7003, 0x0A1B, 0x7043, 0x0A1B, 0x7083, 0x0A1B, +0x70C3, 0x1D00, 0x1F12, 0xD2F4, 0x1D12, 0xD005, 0x780B, 0x7003, 0x1C49, +0x1C40, 0x1E52, 0xD1F9, 0x4660, 0x4770, 0xB570, 0x481B, 0x4D19, 0x7800, +0xB950, 0x4C1A, 0x6820, 0xF000, 0x00F0, 0x28A0, 0xD004, 0x6820, 0xF000, +0x00F0, 0x28C0, 0xD101, 0x2000, 0xBD70, 0xF000, 0xFAF4, 0x4601, 0xF000, +0xFBC3, 0x4606, 0x2901, 0xBF18, 0x2902, 0xD102, 0x2000, 0xF000, 0xFBD0, +0x6821, 0x4B0D, 0xF64F, 0x700F, 0x4008, 0xEA43, 0x0100, 0x6021, 0x6928, +0xF040, 0x0004, 0x6128, 0xF000, 0xFBD0, 0x6928, 0xF020, 0x0004, 0x6128, +0x4630, 0xF000, 0xFBBF, 0xBD70, 0x46C0, 0xED00, 0xE000, 0x00A0, 0x4220, +0x0000, 0x4001, 0x0000, 0x695A, 0x2200, 0x4613, 0x460A, 0x4619, 0xB571, +0xF010, 0x0F03, 0xD00B, 0x2A00, 0xBF82, 0xF800, 0x1B01, 0xF1B2, 0x0201, +0xF010, 0x0F03, 0xD1F6, 0x2A00, 0xBF08, 0xBD71, 0xF011, 0x01FF, 0xEA41, +0x2101, 0x2A04, 0xD318, 0xEA41, 0x4101, 0x2A08, 0xD30F, 0x460E, 0x2A10, +0xD308, 0x460C, 0x460D, 0xF1B2, 0x030F, 0xF012, 0x020F, 0xC072, 0x3B10, +0xD8FC, 0xF012, 0x0F08, 0xBF18, 0xC042, 0xF012, 0x0F04, 0xBF18, 0xF840, +0x1B04, 0xF012, 0x0F02, 0xBF18, 0xF820, 0x1B02, 0xF012, 0x0F01, 0xBF18, +0x7001, 0xBD71, 0x0000, 0xE92D, 0x41F0, 0x460F, 0x4605, 0xF000, 0xFB5E, +0x42B8, 0xD303, 0xF000, 0xFB5A, 0x0840, 0xE000, 0x4813, 0x2400, 0x42B8, +0xBF98, 0x2401, 0x4620, 0xF000, 0xFAEA, 0x4606, 0x4620, 0xF000, 0xFAB2, +0x0071, 0x1C49, 0x4680, 0x4620, 0xF000, 0xFA84, 0x2103, 0x4620, 0xF000, +0xF9AC, 0x7838, 0x4641, 0xEA45, 0x0300, 0x4620, 0xF000, 0xF9A5, 0x4620, +0x4631, 0xF000, 0xFA75, 0xF083, 0x03FF, 0x432B, 0x4618, 0xE8BD, 0x81F0, +0x46C0, 0x2000, 0x0020, 0x4813, 0xB5B0, 0xF1B0, 0x3FFF, 0xD001, 0xF000, +0xF9B7, 0x4D11, 0x4811, 0x42A8, 0xD010, 0x4811, 0x4C11, 0x42A0, 0xD00C, +0x1B00, 0x3C08, 0x10C7, 0xF854, 0x0F08, 0x7801, 0xF855, 0x2021, 0x6861, +0x1C40, 0x4790, 0x1E7F, 0xD1F5, 0x4D0A, 0x4C0B, 0x42A5, 0xD005, 0xE002, +0xF854, 0x0B04, 0x4780, 0x42A5, 0xD1FA, 0xBDB0, 0x46C0, 0xFFFF, 0xFFFF, +0x0124, 0x0100, 0x012C, 0x0100, 0x0134, 0x0100, 0x012C, 0x0100, 0x0000, +0x0000, 0x0000, 0x0000, 0xE92D, 0x41F0, 0x4605, 0xF815, 0x7B01, 0x4690, +0x460E, 0xE01C, 0xF1B8, 0x0F00, 0xF105, 0x0501, 0xD00B, 0x0A20, 0xD109, +0x2002, 0xF815, 0x1B01, 0x1E40, 0xEA41, 0x2404, 0xD1F9, 0xE001, 0x2C04, +0xD302, 0xF815, 0x1B01, 0xE000, 0x4639, 0x4630, 0x4622, 0xF7FF, 0xFF39, +0x19A6, 0xE001, 0xF806, 0x0B01, 0xF815, 0x0B01, 0x4287, 0xD1F9, 0xF815, +0x4B01, 0x2C00, 0xD1E9, 0xF815, 0x0B01, 0x782C, 0x0200, 0x1824, 0xD1D4, +0xE8BD, 0x81F0, 0x0000, 0xB5F8, 0x460C, 0x4606, 0xF000, 0xFABD, 0x42A0, +0xD303, 0xF000, 0xFAB9, 0x0840, 0xE000, 0x4813, 0x2300, 0x42A0, 0xBF98, +0x2301, 0x4618, 0xF000, 0xFA49, 0x4605, 0x4618, 0xF000, 0xFA11, 0x0069, +0x1C49, 0x4607, 0x4618, 0xF000, 0xF9E3, 0x2103, 0x4618, 0xF000, 0xF90B, +0x7820, 0xF086, 0x01FF, 0x4008, 0xF080, 0x04FF, 0x4639, 0x4618, 0xF000, +0xF901, 0x4618, 0x4629, 0xF000, 0xF9D1, 0x4620, 0xBDF8, 0x46C0, 0x2000, +0x0020, 0x468C, 0x4914, 0x1E40, 0xD006, 0x1E40, 0xD00B, 0x1E40, 0xD00F, +0x1E40, 0xD014, 0xE01B, 0x3910, 0x6809, 0x2000, 0xEA1C, 0x0F01, 0xD016, +0xE012, 0x6809, 0x2000, 0xEA1C, 0x0F01, 0xD010, 0xE00C, 0x3914, 0x6809, +0x2000, 0xEA1C, 0x0F01, 0xD009, 0xE005, 0x1F09, 0x6809, 0x2000, 0xEA1C, +0x0F01, 0xD002, 0x2001, 0x4770, 0x2000, 0x4770, 0x46C0, 0x10C4, 0x4001, +0x4A14, 0xB580, 0x4607, 0x1E40, 0xD017, 0x1E40, 0xD00F, 0x1E40, 0xD007, +0x1E40, 0xD116, 0xF8D2, 0x00C0, 0x4388, 0xF8C2, 0x00C0, 0xE010, 0xF8D2, +0x00B0, 0x4388, 0xF8C2, 0x00B0, 0xE00A, 0xF8D2, 0x00C4, 0x4388, 0xF8C2, +0x00C4, 0xE004, 0xF8D2, 0x00B4, 0x4388, 0xF8C2, 0x00B4, 0x4638, 0xF7FF, +0xFFAF, 0x2200, 0xB900, 0x2201, 0x4610, 0xBD80, 0x1000, 0x4001, 0x4A12, +0xB580, 0x4607, 0x1E40, 0xD017, 0x1E40, 0xD00F, 0x1E40, 0xD007, 0x1E40, +0xD116, 0xF8D2, 0x00C0, 0x4308, 0xF8C2, 0x00C0, 0xE010, 0xF8D2, 0x00B0, +0x4308, 0xF8C2, 0x00B0, 0xE00A, 0xF8D2, 0x00C4, 0x4308, 0xF8C2, 0x00C4, +0xE004, 0xF8D2, 0x00B4, 0x4308, 0xF8C2, 0x00B4, 0x4638, 0xF7FF, 0xFF83, +0xBD80, 0x1000, 0x4001, 0xB580, 0x28A0, 0xBF0C, 0x20C0, 0x20A0, 0x490E, +0x4A0C, 0x780F, 0x2F00, 0xBF18, 0x2000, 0xD111, 0x6811, 0xF041, 0x0104, +0x6011, 0x4A09, 0x6813, 0xF64F, 0x770F, 0xEA07, 0x0103, 0x4F07, 0x4308, +0xEA47, 0x0100, 0x6011, 0xF000, 0xFA0E, 0x2001, 0xBD80, 0x46C0, 0xED10, +0xE000, 0x00A0, 0x4220, 0x0000, 0x4001, 0x0000, 0x695A, 0xB5B0, 0x460F, +0x4601, 0x4811, 0x1D00, 0x6804, 0x42A1, 0xD014, 0x6804, 0x4D0D, 0x42A5, +0xD00B, 0x42A1, 0xD101, 0xB147, 0x1E7F, 0x6844, 0x1CA4, 0xEB00, 0x0084, +0x6804, 0x42A1, 0xD1F2, 0xE004, 0x42A1, 0xBF1C, 0x2000, 0x1C01, 0xD102, +0x6841, 0x3008, 0x0089, 0x6011, 0x6018, 0xBDB0, 0x46C0, 0xE11D, 0x0BD0, +0x1000, 0x0020, 0xF64E, 0x5188, 0xF2CE, 0x0100, 0x6808, 0xF04F, 0x03F0, +0xEA40, 0x4003, 0x6008, 0x480B, 0x4685, 0x480B, 0x4485, 0x466F, 0x2007, +0x4387, 0x46BD, 0x4809, 0x466F, 0x6007, 0xF000, 0xF9C6, 0x2800, 0xD001, +0xF7FF, 0xFE75, 0xF000, 0xF955, 0x2001, 0xF000, 0xF85A, 0xE7FE, 0x46C0, +0x1E00, 0x0100, 0x0200, 0x0000, 0x1DF4, 0x0100, 0xB580, 0x4607, 0x4810, +0x3810, 0x6802, 0x0A12, 0xD202, 0xB177, 0x2F01, 0xD001, 0x2000, 0xBD80, +0x6942, 0xF022, 0x020F, 0x430A, 0x6142, 0x6942, 0xF002, 0x020F, 0x4291, +0xD1FA, 0xE009, 0x6902, 0xF022, 0x020F, 0x430A, 0x6102, 0x6902, 0xF002, +0x020F, 0x4291, 0xD1FA, 0x2001, 0xBD80, 0x46C0, 0x1010, 0x4001, 0xB5F8, +0x4606, 0x4D0F, 0x4F10, 0x8873, 0x2400, 0xE017, 0x00A0, 0xEB00, 0x00C4, +0x1832, 0x6851, 0x6890, 0x68D2, 0xB952, 0x42AF, 0xD00B, 0x780A, 0xF855, +0x2022, 0x4603, 0x1C49, 0x4608, 0x4619, 0x4790, 0xE001, 0xF7FF, 0xFD26, +0x8873, 0x1C64, 0xB2A4, 0x42A3, 0xDCE5, 0xBDF8, 0x0124, 0x0100, 0x012C, +0x0100, 0xBF00, 0x4770, 0xB508, 0xF7FF, 0xFFFB, 0xE7FE, 0xB538, 0x4605, +0x4809, 0x6800, 0x4780, 0x4C09, 0x1D20, 0x6800, 0xB110, 0x4601, 0x4628, +0x4788, 0x6820, 0xB100, 0x4780, 0x4805, 0x6800, 0x4780, 0xF7FF, 0xFFE8, +0xBD38, 0x46C0, 0x1DE4, 0x0100, 0x1DEC, 0x0100, 0x1DE8, 0x0100, 0x490C, +0x0A02, 0xD303, 0x460A, 0x2300, 0x1D12, 0x7013, 0x09C2, 0xD303, 0x4A09, +0x2300, 0x3298, 0x7013, 0x08C2, 0xD303, 0x460A, 0x2300, 0x3A90, 0x7013, +0x0900, 0xD303, 0x460A, 0x2000, 0x3A8C, 0x7010, 0x4770, 0x0A98, 0x4222, +0x0A00, 0x4222, 0x490C, 0x0A02, 0xD303, 0x460A, 0x2301, 0x1D12, 0x7013, +0x09C2, 0xD302, 0x2301, 0x460A, 0x7013, 0x08C2, 0xD303, 0x460A, 0x2301, +0x3A90, 0x7013, 0x0900, 0xD303, 0x460A, 0x2001, 0x3A8C, 0x7010, 0x4770, +0x46C0, 0x0A98, 0x4222, 0xB508, 0xF000, 0xF8E5, 0x1E40, 0xD00E, 0x1F00, +0xD00C, 0x1F00, 0xD00A, 0x3808, 0xD008, 0x1F00, 0xD006, 0x1F00, 0xD004, +0x1FC0, 0xBF14, 0x2000, 0x2002, 0xBD08, 0x2001, 0xBD08, 0xB508, 0xF000, +0xF8CF, 0x1F00, 0x2801, 0xD90C, 0x1F00, 0x2801, 0xD907, 0x380C, 0x2801, +0xD906, 0x1F00, 0x2801, 0xBF88, 0x2000, 0xD802, 0x2002, 0xBD08, 0x2001, +0xBD08, 0x0000, 0x4A08, 0xB140, 0x2801, 0xD10C, 0x6950, 0xF420, 0x4070, +0xEA40, 0x3001, 0x6150, 0x4770, 0x6910, 0xF420, 0x4070, 0xEA40, 0x3001, +0x6110, 0x4770, 0x1000, 0x4001, 0xB508, 0x4808, 0x4906, 0x7800, 0x2800, +0xBF18, 0x2000, 0xD106, 0x6808, 0xF020, 0x0004, 0x6008, 0xF000, 0xF8BD, +0x2001, 0xBD08, 0xED10, 0xE000, 0x00A0, 0x4220, 0xB130, 0x2801, 0xBF04, +0x4806, 0x1D00, 0xD002, 0x2000, 0x4770, 0x4802, 0x6800, 0xF000, 0x000F, +0x4770, 0x46C0, 0x1010, 0x4001, 0x1010, 0x4001, 0x4906, 0x8808, 0xF000, +0x00FF, 0xF440, 0x4025, 0x8008, 0x4804, 0x2101, 0xF880, 0x1038, 0x2100, +0x7001, 0x4770, 0x4400, 0x4000, 0x8020, 0x4208, 0x2802, 0xD004, 0x2801, +0xD107, 0x2101, 0x4608, 0xE001, 0x2101, 0x2000, 0x4A02, 0x7011, 0x7110, +0x4770, 0x46C0, 0x0A00, 0x4222, 0x4905, 0xB120, 0x2801, 0xBF0C, 0x1D09, +0x2000, 0xD102, 0x6808, 0xF3C0, 0x3003, 0x4770, 0x46C0, 0x1010, 0x4001, +0x4904, 0x8988, 0xF040, 0x0080, 0xB2C0, 0xF500, 0x40B4, 0x8188, 0x4770, +0x46C0, 0x4800, 0x4000, 0x4904, 0xF1B1, 0x3FFF, 0xBF07, 0x2100, 0x1C08, +0x6808, 0x1D09, 0xF7FE, 0xBBF4, 0xFFFF, 0xFFFF, 0x4802, 0x2100, 0x38DC, +0x7001, 0x4770, 0x46C0, 0x0ADC, 0x4222, 0xB510, 0xF000, 0xF81C, 0x2400, +0xB100, 0x2401, 0x4620, 0xBD10, 0xB510, 0xF000, 0xF81A, 0x2400, 0xB100, +0x2401, 0x4620, 0xBD10, 0xB508, 0xF7FF, 0xFFCD, 0xF7FF, 0xFF9B, 0xF7FF, +0xFC41, 0xBD08, 0xF8D0, 0x2003, 0x1DC3, 0x4608, 0x4619, 0xF7FF, 0xBBEB, +0xF3EF, 0x8010, 0xB672, 0x4770, 0x2000, 0x4770, 0xF3EF, 0x8010, 0xB662, +0x4770, 0x2000, 0x4770, 0x0000, 0x4801, 0x30F0, 0x6800, 0x4770, 0x1000, +0x4001, 0x4801, 0x6800, 0xB2C0, 0x4770, 0x0000, 0x4001, 0x4801, 0x3020, +0x6800, 0x4770, 0x3000, 0xE004, 0xF3EF, 0x8010, 0x4770, 0x2000, 0x4770, +0x2100, 0x2201, 0xF7FF, 0xBA6B, 0x2100, 0x2201, 0xF7FF, 0xB9A1, 0x2100, +0x2201, 0xF7FE, 0xBCCF, 0x2201, 0xF7FF, 0xBCEE, 0xE7FE, 0xE7FE, 0xE7FE, +0xBF30, 0x4770, 0x2001, 0x4770, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, +}; +const uint32_t MSP432P4xx_PG11_Funclet_termination = 0x00000000; +const uint32_t MSP432P4xx_PG11_Funclet_start = 0x01000000; +const uint32_t MSP432P4xx_PG11_Funclet_finish = 0x01001E00; +const uint32_t MSP432P4xx_PG11_Funclet_length = 0x00001E00; + +#define MSP432P4XX_PG11_FUNCLET_TERMINATION 0x00000000 +#define MSP432P4XX_PG11_FUNCLET_START 0x01000000 +#define MSP432P4XX_PG11_FUNCLET_FINISH 0x01001E00 +#define MSP432P4XX_PG11_FUNCLET_LENGTH 0x00001E00 diff --git a/DLL430_v3/src/TI/DLL430/MSP432_FlashLib.h b/DLL430_v3/src/TI/DLL430/MSP432_FlashLib.h new file mode 100644 index 0000000..8a878d4 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432_FlashLib.h @@ -0,0 +1,48 @@ +/****************************************************************************** +* MSP432_FlashLibIf.h +* +* Copyright (C) 2014 - 2015 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. +******************************************************************************/ + +#pragma once + +namespace MSP432_FlashLib +{ + // the RAM flash loader interface + #include "MSP432_FlashLibIf.h" + // the RAM flash loader funclet for PG2.0 + #include "MSP432P4xx_FlashLibFc.h" + // the RAM flash loader funclet for PG1.1 + #include "MSP432P4xx_PG11_FlashLibFc.h" + // the RAM flash loader funclet for 2M + #include "MSP432P4xx_2M_FlashLibFc.h" +} diff --git a/DLL430_v3/src/TI/DLL430/MSP432_FlashLibIf.h b/DLL430_v3/src/TI/DLL430/MSP432_FlashLibIf.h new file mode 100644 index 0000000..17b4e7f --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MSP432_FlashLibIf.h @@ -0,0 +1,150 @@ +/****************************************************************************** +* MSP432_FlashLibIf.h +* +* Copyright (C) 2014 - 2015 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. +******************************************************************************/ + +#pragma once + +#include +#include + +// RAM loader +static const uint32_t RAM_LOADER_START = 0x01000000u; // Mapped to code space +static const uint32_t RAM_LOADER_MAIN = 0x01000140u; // Mapped to code space +static const uint32_t RAM_LOADER_BUFFER1 = 0x20002000u; // Mapped to SBUS data space +static const uint32_t RAM_LOADER_BUFFER2 = 0x20003000u; // Mapped to SBUS data space +static const uint32_t RAM_LOADER_STACK = 0x20002000u; // Mapped to SBUS data space + +// Address for flash function to be executed +static const uint32_t FLASH_FUNCTION_ADDRESS = 0x20000150u; + +enum FlashCommand +{ + FLASH_NO_COMMAND = 0, + FLASH_MASS_ERASE = 1, + FLASH_SECTOR_ERASE = 2, + FLASH_PROGRAM = 4, + FLASH_INIT = 8, + FLASH_EXIT = 16, + FLASH_CONTIOUS_PROGRAM = 32 +}; + +// Address for algorithm program and flash buffer +static const uint32_t DST_ADDRESS = 0x2000015Cu; +static const uint32_t SRC_LENGTH_ADDRESS = 0x20000160u; + +static const uint32_t BUFFER1_STATUS_REGISTER = 0x20000164u; +static const uint32_t BUFFER2_STATUS_REGISTER = 0x20000168u; +static const uint32_t BUFFER_INACTIVE = 0x00000000u; +static const uint32_t BUFFER_ACTIVE = 0x00000001u; +static const uint32_t BUFFER_DATA_READY = 0x00000010u; + +static const size_t SRC_LENGTH_MAX = 4096u; + +// erase options +static const uint32_t ERASE_PARAM_ADDRESS = 0x2000016Cu; +static const uint32_t ERASE_MAIN = 0x00000001u; +static const uint32_t ERASE_INFO = 0x00000002u; + +// Unlock BSL +static const uint32_t UNLOCK_BSL_ADDRESS = 0x20000170u; +static const uint32_t LOCK_BSL_KEY = 0x00000000u; +static const uint32_t UNLOCK_BSL_KEY = 0x0000000Bu; + +// Address for return code +static const uint32_t RETURN_CODE_ADDRESS = 0x20000154u; + +// Return codes +static const uint32_t FLASH_BUSY = 0x00000001u; +static const uint32_t FLASH_SUCCESS = 0x00000ACEu; +static const uint32_t FLASH_ERROR = 0x0000DEADu; +static const uint32_t FLASH_TIMEOUT_ERROR = 0xDEAD0000u; +static const uint32_t FLASH_VERIFY_ERROR = 0xDEADDEADu; +static const uint32_t FLASH_WRONG_COMMAND = 0x00000BADu; +static const uint32_t FLASH_POWER_ERROR = 0x00DEAD00u; + +// device ID address +static const uint32_t DEVICE_ID_ADDRESS = 0x0020100Cu; + +static const uint32_t PC_REGISTER = 15u; +static const uint32_t SP_REGISTER = 13u; + +// CS silicon and boot code revisions +static const uint32_t SILICON_REV_ADDRESS = 0x00201010u; +static const uint32_t SILICON_REV_B = 0x00000042u; +static const uint32_t SILICON_REV_C = 0x00000043u; +static const uint32_t SILICON_REV_D = 0x00000044u; +static const uint32_t SILICON_REV_E = 0x00000045u; +static const uint32_t SILICON_REV_F = 0x00000046u; +static const uint32_t SILICON_REV_G = 0x00000047u; +static const uint32_t SILICON_REV_H = 0x00000048u; +static const uint32_t SILICON_REV_I = 0x00000049u; +static const uint32_t SILICON_REV_B_WRONG = 0x00004100u; +static const uint32_t SILICON_2M_REV_A = 0x00000041u; + +// Power mode control +static uint32_t PCM_CTL = 0x40010004; +static uint32_t PCM_CTL0_KEY = 0x695A0000; +static uint32_t PCM_CTL1_LOCKLPM5 = 0x00000001; +static uint32_t PCM_CTL1_LOCKBKUP = 0x00000002; + +// SRAM bank control +static uint32_t SYS_SRAM_BANKEN = 0xE0043014; +static uint32_t SRAM_EN = 0x000000FF; + +static uint32_t SRAM_RDY = 0x10000; + +// SRAM bank control P4111 2MB +static uint32_t SYS_SRAM_STAT = 0xE0043090; +static uint32_t SYS_SRAM_NUMBANKS = 0xE0043014; +static uint32_t SYS_SRAM_BNKEN_CTL0 = 0xE0043050; + +static uint32_t BNKEN_RDY = 0x00000001; +static uint32_t BNK3_EN = 0x00000008; +static uint32_t BNK1_EN = 0x00000002; + +typedef struct { + volatile uint32_t FLASH_FUNCTION; + volatile uint32_t RETURN_CODE; + volatile uint32_t _RESERVED0; + volatile uint32_t DST_ADDRESS; + volatile uint32_t SRC_LENGTH; + volatile uint32_t BUFFER1_STATUS_REGISTER; + volatile uint32_t BUFFER2_STATUS_REGISTER; + volatile uint32_t ERASE_PARAM; + volatile uint32_t UNLOCK_BSL; +} FlashInterface_Type; + +#define FLASH_LOADER_BASE ((uint32_t)0x20000150u) +#define FLASH_LOADER ((FlashInterface_Type *) FLASH_LOADER_BASE) + diff --git a/DLL430_v3/src/TI/DLL430/MainMemoryAccessBase.cpp b/DLL430_v3/src/TI/DLL430/MainMemoryAccessBase.cpp new file mode 100644 index 0000000..93b54f1 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MainMemoryAccessBase.cpp @@ -0,0 +1,192 @@ +/* + * MainMemoryAccessBase.cpp + * + * Base class for Flash and FRAM memory access + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "MainMemoryAccessBase.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "CpuRegisters.h" + +using namespace TI::DLL430; + +MainMemoryAccessBase::MainMemoryAccessBase ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa +) + : MemoryAreaBase(name, devHandle, start, end, seg, banks, mapped, isProtected, psa) + , mm(mm) +{ +} + +bool MainMemoryAccessBase::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + const hal_id readMacro = devHandle->supportsQuickMemRead() ? ID_ReadMemQuick : ID_ReadMemWords; + return defaultRead(readMacro, mm, address, buffer, count); +} + + +bool MainMemoryAccessBase::doWrite(uint32_t address, uint32_t value) +{ + return this->doWrite(address, (uint8_t*)&value, 1); +} + + +bool MainMemoryAccessBase::erase(uint32_t start, uint32_t end, bool forceUnlock) +{ + return erase(start, end, this->getSegmentSize(), ERASE_SEGMENT, forceUnlock); +} + + +bool MainMemoryAccessBase::erase() +{ + const uint32_t bank_size = this->getSize() / this->getBanks(); + return erase(this->getStart(), this->getEnd(), bank_size, ERASE_MAIN, true); +} + + +bool MainMemoryAccessBase::uploadFunclet(FuncletCode::Type type) +{ + bool success = false; + + const FuncletCode& funclet = devHandle->getFunclet(type); + + if ( !funclet.code() ) + { + success = true; + ramBackup.clear(); + } + else if ( MemoryArea* ram = mm ? mm->getMemoryArea(MemoryArea::Ram, 0) : 0 ) + { + if ( funclet.codeSize() <= ram->getSize() ) + { + if ( mm && mm->getRamPreserveMode() ) + { + const size_t backupSize = std::min((size_t)ram->getSize(), + funclet.codeSize() + funclet.maxPayloadSize()); + + ramBackup.resize( backupSize ); + if (!ram->read(0, &ramBackup[0], ramBackup.size()) || !ram->sync()) + return false; + } + else + { + ramBackup.clear(); + } + + const uint8_t* code = (uint8_t*)funclet.code(); + const size_t count = funclet.codeSize(); + success = ram->write(0, code, count) && ram->sync(); + } + } + return success; +} + + +void MainMemoryAccessBase::restoreRam() +{ + if (!ramBackup.empty()) + { + if ( MemoryArea* ram = mm->getMemoryArea(MemoryArea::Ram, 0) ) + { + ram->write(0, &ramBackup[0], ramBackup.size()) && ram->sync(); + } + ramBackup.clear(); + } +} + +void MainMemoryAccessBase::restoreInfo() +{ + if (MemoryArea* info = mm ? mm->getMemoryArea(MemoryArea::Info, 0) : 0) + { + std::vector cmpInfo; + const size_t segmentSize = info->getSegmentSize(); + + cmpInfo.resize(segmentSize); + + info->read(segmentSize * (info->getBanks() - 1), &cmpInfo[0], cmpInfo.size()); + info->sync(); + + //Compare if the Info memroy content has changed during the erase. + //If yes restore the saved content + if (!(std::equal(infoBackup.begin(), infoBackup.end(), cmpInfo.begin()))) + { + // 0 is the offset to the start of the info memory of the current connected SoC. + info->write(segmentSize * (info->getBanks() - 1), &infoBackup[0], segmentSize); + } + cmpInfo.clear(); + } + clearBackupInfo(); +} + +void MainMemoryAccessBase::clearBackupInfo() +{ + infoBackup.clear(); +} + +bool MainMemoryAccessBase::backupInfo() +{ + clearBackupInfo(); + + if (mm) + { + if (MemoryArea* info = mm ? mm->getMemoryArea(MemoryArea::Info, 0) : 0) + { + //only backup the last Info segment that holds the TLV data + const size_t segmentSize = info->getSegmentSize(); + infoBackup.resize(segmentSize); + if (!info->read(segmentSize * (info->getBanks() -1), &infoBackup[0], segmentSize) || !info->sync()) + { + return false; + } + } + } + return true; +} + +bool MainMemoryAccessBase::postSync(const HalExecCommand& cmd) +{ + restoreRam(); + return MemoryAreaBase::postSync(cmd); +} diff --git a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBaseFR57.h b/DLL430_v3/src/TI/DLL430/MainMemoryAccessBase.h similarity index 51% rename from DLL430_v3/src/TI/DLL430/FramMemoryAccessBaseFR57.h rename to DLL430_v3/src/TI/DLL430/MainMemoryAccessBase.h index 53ad584..12c34d3 100644 --- a/DLL430_v3/src/TI/DLL430/FramMemoryAccessBaseFR57.h +++ b/DLL430_v3/src/TI/DLL430/MainMemoryAccessBase.h @@ -1,95 +1,88 @@ /* - * FramMemoryAccessBaseFR57.h + * MainMemoryAccessBase.h * - * Handles access to fram memory. + * Base class for Flash and FRAM memory access * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_FRAMMEMORYACCESSBASEFR57_H -#define DLL430_FRAMMEMORYACCESSBASEFR57_H #include "MemoryAreaBase.h" -#include #include "FuncletCode.h" - namespace TI { namespace DLL430 { - template - class FramMemoryAccessBaseFR57 : public MemoryAreaBase + class IMemoryManager; + + class MainMemoryAccessBase : public MemoryAreaBase { public: - FramMemoryAccessBaseFR57 - ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MainMemoryAccessBase( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, + IMemoryManager* mm, uint8_t psa ); - virtual ~FramMemoryAccessBaseFR57 (); - bool doRead (uint32_t address, uint32_t* buffer , size_t count); - bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t value); + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE = 0; + virtual bool doWrite(uint32_t address, uint32_t value) OVERRIDE; + + virtual bool erase() OVERRIDE; + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; - bool erase (); - bool erase (uint32_t start, uint32_t end); - protected: bool uploadFunclet(FuncletCode::Type type); void restoreRam(); - virtual bool preSync (); - virtual bool postSync (const HalExecCommand&); - MemoryManager* mm; - bool erase (uint32_t start, uint32_t end, uint32_t block_size, int type); + void restoreInfo(); + void clearBackupInfo(); + bool backupInfo(); + virtual bool postSync(const HalExecCommand&) OVERRIDE; + + IMemoryManager* mm; + virtual bool erase(uint32_t start, uint32_t end, uint32_t block_size, int type, bool forceUnlock = false) = 0; private: - FuncletCode::Type funcletToUpload; - std::vector ramBackup; - MPU mpu; + std::vector ramBackup; + std::vector infoBackup; }; - }; -}; - -#endif /* DLL430_FRAMMEMORYACCESSBASEFR57_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryArea.h b/DLL430_v3/src/TI/DLL430/MemoryArea.h new file mode 100644 index 0000000..13ae23c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MemoryArea.h @@ -0,0 +1,233 @@ +/* + * MemoryArea.h + * + * Interface for memory access + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + + +namespace TI +{ + namespace DLL430 + { + enum MemoryError { MEMORY_NO_ERROR, MEMORY_READ_ERROR, MEMORY_WRITE_ERROR, MEMORY_LOCKED_ERROR, MEMORY_UNLOCK_ERROR }; + + /** \brief memory area management */ + class MemoryArea + { + public: + enum Name { None, Main, Info, Bsl, BootCode, Ram, UsbRam, Cpu, Eem, Peripheral8bit, Peripheral16bit, Lcd, IrVec, Lib, LeaPeripheral, LeaRam, MidRom, TinyRam, UssPeripheral}; + + virtual ~MemoryArea() {} + + /** \brief read from memory + * + * This registers a read call. The content of buffer is undefined + * until you call the sync() method. + * + * \param address the first address + * \param buffer the buffer to write the read data to + * \param count the number of elements to read + * \return true if the read was registered successfully, else false + */ + + virtual bool read(uint32_t address, uint8_t* buffer, size_t count) = 0; + + /** \brief overwrite memory + * + * Convenience function for flash memory (internally handles erase, etc.) + * + * \param address the first address + * \param buffer the buffer to read the data to write from + * \param count the number of elements to write + * \return true if the write was registered successfully, else false + */ + virtual bool overwrite(uint32_t address, const uint8_t* buffer, size_t count) = 0; + + /** \brief write to memory + * + * This registers a write call. The content of buffer must stay valid + * until you call the sync() method. + * + * \param address the first address + * \param buffer the buffer to read the data to write from + * \param count the number of elements to write + * \return true if the write was registered successfully, else false + */ + virtual bool write(uint32_t address, const uint8_t* buffer, size_t count) = 0; + + /** \brief write to memory + * + * This registers a write call. The transfer is delayed + * until you call the sync() method. + * + * \param address the first address + * \param value the value to write to address + * \return true if the write was registered successfully, else false + */ + virtual bool write(uint32_t address, uint32_t value) = 0; + + /** \brief This function must be called after using read() or write() + * + * This function MUST be called to complete a read or write call. + * Reads and writes can be combined in any order unless they are inter-dependent. + * + * \return true if the sync was successfull, else false + */ + virtual bool sync() = 0; + + /** \brief erase a flash area completely + * + * This function erases a complete flash area. It will do nothing + * if the area is not a flash. + * + * \param mode for selection of erase mode all/segments + * \return true if flash was erased successfully, else false + */ + virtual bool erase() = 0; + + /** \brief erase a flash segment + * + * This function erases a flash segment. It will do nothing + * if the area is not a flash. The given start and end address + * mark all segments that any of the addresses in this range + * is in as to be erased. The addresses to no have to be aligned + * to segment size. + * + * \param start the first address + * \param end the last address + * \param if true forces to unlock any memory protection (for example disables MPU lock bit) + * \return true if flash segments were erased successfully, else false + */ + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) = 0; + + /** \brief verify memory content + * + * This function verifies the contents of memory by using the + * Pseudo Signature Algorithm (PSA). This is a lot faster then reading + * all memory since the PSA is executed on the target device itself. + * Note that this will flush all affected cache contents. + * + * \param address the first address + * \param buffer the data to verify against (one byte per buffer element) + * \param count the number of buffer elements + * \return true if the PSA values matched, else false + */ + virtual bool verify(uint32_t address, const uint8_t* buffer, size_t count) = 0; + + /** \brief check of the area is cacheable + * + * \return true if the area is readOnly, else false + */ + virtual bool isReadOnly() const = 0; + + /** \brief get the memory start address + * + * \return the memory start address value + */ + virtual uint32_t getStart() const = 0; + + /** \brief get the memory end address + * + * \return the memory end address value + */ + virtual uint32_t getEnd() const = 0; + + /** \brief get the memory size + * + * \return the memory size value + */ + virtual uint32_t getSize() const = 0; + + /** \brief get the memory segment size + * + * This value only makes sense if the memory is a flash. + * + * \return the memory segment size value + */ + virtual uint32_t getSegmentSize() const = 0; + + /** \brief get number of memory banks + * + * This value only makes sense if the memory is a flash. + * + * \return the memory segment size value + */ + virtual uint32_t getBanks() const = 0; + + /** \brief check if a memory is mapped to global address space + * + * \return true if the memory is mapped, else false + */ + virtual bool isMapped() const = 0; + + /** \brief get the name of the area + * + * \return the memory area name + */ + virtual MemoryArea::Name getName() const = 0; + + /** \brief set whether the area is currently accessible + * + */ + virtual void setAccessible(bool accessible) = 0; + + /** \brief query if area is currently accessible + * + * \return true if accessible, else false + */ + virtual bool isAccessible() const = 0; + + virtual bool fillCache() = 0; + /** \brief query if area is currently accessible + * + * \return true if cache was filled + */ + virtual bool flushCache() const = 0; + /** \brief query if area is currently accessible + * + * \return true if cache was flushed and written back to target device + */ + virtual bool wakeup() = 0; + /** \brief query if area is currently accessible + * + * \return true if cache was flushed and written back to target device + */ + + virtual bool isProtectionEnabled() = 0; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryAreaBase.cpp b/DLL430_v3/src/TI/DLL430/MemoryAreaBase.cpp index f423180..9f460a3 100644 --- a/DLL430_v3/src/TI/DLL430/MemoryAreaBase.cpp +++ b/DLL430_v3/src/TI/DLL430/MemoryAreaBase.cpp @@ -3,78 +3,75 @@ * * Base class for all memory classes. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "MemoryAreaBase.h" +#include "CpuRegisters.h" +#include "IMemoryManager.h" #include "HalExecCommand.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; -MemoryAreaBase::MemoryAreaBase (const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t size, - uint32_t seg, - uint32_t banks, +MemoryAreaBase::MemoryAreaBase (MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t size, + uint32_t seg, + uint32_t banks, bool mapped, const bool protectable, uint8_t psa) : name(name) , devHandle(devHandle) + , psaType(psa) + , err(MEMORY_NO_ERROR) , start(start) - , end(start + size - 1) + , end(start + size - 1) , segmentSize(seg) , banks(banks) , mapped(mapped) - , isProtectable(protectable) + , isProtectable(protectable) , locked(isProtectable ? true : false) - , cache(NULL) - , psaType(psa) - , err(MEMORY_NO_ERROR) -{ -} - -MemoryAreaBase::~MemoryAreaBase () + , isAccessible_(true) { - if(cache!=NULL) - delete cache; } -const char* MemoryAreaBase::getName () const +MemoryArea::Name MemoryAreaBase::getName () const { - return this->name.c_str(); + return this->name; } MemoryError MemoryAreaBase::getError () @@ -84,30 +81,11 @@ MemoryError MemoryAreaBase::getError () return error; } -bool MemoryAreaBase::isCacheable () const -{ - return cache!=NULL; -} - -bool MemoryAreaBase::isReadOnly () +bool MemoryAreaBase::isReadOnly () const { return false; } -MemoryCacheCtrl* MemoryAreaBase::getCacheCtrl () -{ - return cache; -} - -bool MemoryAreaBase::addCache(MemoryCacheCtrl * mem_cache) -{ - if(cache!=NULL) - return false; - - cache=mem_cache; - return true; -} - uint32_t MemoryAreaBase::getStart () const { return start; @@ -147,7 +125,7 @@ bool MemoryAreaBase::isLocked () const //(otherwise certain IDEs will abort initialization) bool MemoryAreaBase::lock () { - if(isProtectable) + if (isProtectable) locked = true; return true; @@ -155,13 +133,13 @@ bool MemoryAreaBase::lock () bool MemoryAreaBase::unlock () { - if(isProtectable) + if (isProtectable) locked = false; - + return true; } -bool MemoryAreaBase::read (uint32_t address, uint32_t* buffer, size_t count) +bool MemoryAreaBase::read (uint32_t address, uint8_t* buffer, size_t count) { err = MEMORY_READ_ERROR; bool success = doRead(address, buffer, count); @@ -178,15 +156,25 @@ MemoryAreaBase::Alignment MemoryAreaBase::alignData(uint32_t address, uint32_t c } -bool MemoryAreaBase::write (uint32_t address, uint32_t* buffer, size_t count) +bool MemoryAreaBase::overwrite (uint32_t address, const uint8_t* buffer, size_t count) { err = MEMORY_WRITE_ERROR; - bool success = doWrite(address, buffer, count); + bool success = doOverwrite(address, buffer, count); if (success) err = MEMORY_NO_ERROR; return success; +} + + +bool MemoryAreaBase::write (uint32_t address, const uint8_t* buffer, size_t count) +{ + err = MEMORY_WRITE_ERROR; + bool success = doWrite(address, buffer, count); + if (success) + err = MEMORY_NO_ERROR; + return success; } bool MemoryAreaBase::write (uint32_t address, uint32_t value) @@ -200,32 +188,57 @@ bool MemoryAreaBase::write (uint32_t address, uint32_t value) } -bool MemoryAreaBase::doRead (uint32_t address, uint32_t* buffer, size_t count) +bool MemoryAreaBase::defaultRead(hal_id readMacro, IMemoryManager* mm, uint32_t address, uint8_t* buffer, size_t count) { - bool omitFirst = (address & 0x1); - if (omitFirst) + uint32_t pc = 0; + + if (mm) + { + CpuRegisters* cpu = mm->getCpuRegisters(); + if (!cpu) + { + return false; + } + + cpu->read(0, &pc, 1); + } + + const bool omitFirst = (address & 0x1); + if (omitFirst) { --address; ++count; } - bool omitLast = (count & 1); - if (omitLast) + const bool omitLast = (count & 1); + if (omitLast) { ++count; - } + } - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ReadMemWords)); + HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); + el->appendInputData32(static_cast(count / 2)); + el->appendInputData32(pc); el->setOutputSize(count); - ReadElement r(buffer, count, omitFirst, omitLast, 0); + ReadElement r(buffer, count, omitFirst, omitLast, address); this->readMap[this->elements.size()] = r; - this->elements.push_back(el); + this->elements.emplace_back(el); return true; } -bool MemoryAreaBase::doWrite (uint32_t address, uint32_t* buffer, size_t count) + +bool MemoryAreaBase::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + return defaultRead(ID_ReadMemWords, nullptr, address, buffer, count); +} + +bool MemoryAreaBase::doOverwrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + return doWrite(address, buffer, count); +} + +bool MemoryAreaBase::doWrite (uint32_t address, const uint8_t* buffer, size_t count) { return false; } @@ -241,21 +254,17 @@ bool MemoryAreaBase::erase () return true; } -bool MemoryAreaBase::erase (uint32_t start, uint32_t end) +bool MemoryAreaBase::erase(uint32_t start, uint32_t end, bool forceUnlock) { //return true if nothing implemented, means nothing to do return true; } -bool MemoryAreaBase::verify(uint32_t address, uint32_t* buffer, size_t count) +bool MemoryAreaBase::verify(uint32_t address, const uint8_t* buffer, size_t count) { - MemoryCacheCtrl* cc = this->getCacheCtrl(); - if (cc && !cc->flush(address,count)) - return false; - - if (address & 0x1) + if (address & 0x1) { - uint32_t tmp = 0; + uint8_t tmp = 0; if (!this->read(address++, &tmp, 1) || !this->sync()) return false; @@ -265,28 +274,27 @@ bool MemoryAreaBase::verify(uint32_t address, uint32_t* buffer, size_t count) --count; } - if (count > 1) + if (count > 1) { HalExecCommand cmd; - cmd.setTimeout(20000); // overwrite default of 3 sec - + cmd.setTimeout( std::max(20000u, static_cast(count) / 15) ); //Set timeout according to data size + HalExecElement*el = new HalExecElement(this->devHandle->checkHalId(ID_Psa)); el->appendInputData32(static_cast((address+this->getStart()) & 0xFFFFFFFF)); el->appendInputData32(static_cast((count / 2) & 0xFFFFFFFF)); el->appendInputData8(this->psaType); - el->setOutputSize(2); - cmd.elements.push_back(el); + cmd.elements.emplace_back(el); if (!this->devHandle->send(cmd)) return false; - + if (MemoryAreaBase::psa(address+this->getStart(), buffer, (size_t)((uint32_t)count&0xfffffffe)) != el->getOutputAt16(0)) - return false; + return false; } - if (count & 1) + if (count & 1) { - uint32_t tmp = 0; - if (!this->read(address + count - 1, &tmp, 1) || !this->sync()) + uint8_t tmp = 0; + if (!this->read(address + static_cast(count) - 1, &tmp, 1) || !this->sync()) return false; if (buffer? tmp != buffer[count - 1]: tmp != 0xFF) @@ -295,36 +303,20 @@ bool MemoryAreaBase::verify(uint32_t address, uint32_t* buffer, size_t count) return true; } -bool MemoryAreaBase::sendWithChainInfo(boost::ptr_vector * elem, HalExecCommand * cmd) -{ - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd->elements.push_back(el); - /* this transfers all object from given elements to cmd.elements */ - cmd->elements.transfer(cmd->elements.end(), *elem); - if (!this->devHandle->send(*cmd)) - { - this->elements.transfer(elem->end(), cmd->elements); - return false; - } - return true; -} - -bool MemoryAreaBase::sendWithChainInfo(HalExecElement * elem, HalExecCommand * cmd) +bool MemoryAreaBase::send(std::vector< std::unique_ptr >* elem, HalExecCommand* cmd) { - HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); - el->appendInputData16(static_cast(this->devHandle->getDevChainInfo()->getBusId())); - cmd->elements.push_back(el); - /* this transfers one object to cmd.elements */ - cmd->elements.push_back(elem); - if (!this->devHandle->send(*cmd)) + move(elem->begin(), elem->end(), back_inserter(cmd->elements)); + elem->clear(); + if (!this->devHandle->send(*cmd)) { + move(cmd->elements.begin(), cmd->elements.end(), back_inserter(*elem)); + cmd->elements.clear(); return false; } return true; } -bool MemoryAreaBase::sync () +bool MemoryAreaBase::sync() { if (!preSync()) return false; @@ -335,13 +327,13 @@ bool MemoryAreaBase::sync () HalExecCommand cmd; cmd.setTimeout(60000); - if (!sendWithChainInfo(&this->elements,&cmd)) + if (!send(&this->elements, &cmd)) return false; return postSync(cmd); } -uint16_t MemoryAreaBase::psa (uint32_t address, uint32_t* buffer, size_t count) +uint16_t MemoryAreaBase::psa(uint32_t address, const uint8_t* buffer, size_t count) { if (address & 0x1) return false; @@ -354,7 +346,7 @@ uint16_t MemoryAreaBase::psa (uint32_t address, uint32_t* buffer, size_t count) /* Polynom value for PSA calculation */ const uint16_t polynom = 0x0805; - uint16_t remainder = initial; + uint16_t remainder = initial; for (size_t i = 0; i < count; i += 2) { // Calculate the PSA (Pseudo Signature Analysis) value if ((remainder & 0x8000) != 0) @@ -371,3 +363,38 @@ uint16_t MemoryAreaBase::psa (uint32_t address, uint32_t* buffer, size_t count) return remainder; } + +void MemoryAreaBase::setAccessible(bool accessible) +{ + isAccessible_ = accessible; +} + +bool MemoryAreaBase::isAccessible() const +{ + return isAccessible_; +} + +bool MemoryAreaBase::postSync(const HalExecCommand& cmd) +{ + for (size_t n = 0; n < cmd.elements.size(); ++n) + { + ReadElement_map::iterator it = this->readMap.find(n); + if (it != this->readMap.end()) + { + ReadElement r = it->second; + size_t size = r.size; + if (r.omitLast) + { + --size; + } + + const HalExecElement& el = *cmd.elements[n]; + for (size_t i = 0, k = (r.omitFirst ? 1 : 0); k < size; ++k, ++i) + { + r.v_buffer[i] = el.getOutputAt8(k); + } + this->readMap.erase(it); + } + } + return true; +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryAreaBase.h b/DLL430_v3/src/TI/DLL430/MemoryAreaBase.h index 9f83968..af5d333 100644 --- a/DLL430_v3/src/TI/DLL430/MemoryAreaBase.h +++ b/DLL430_v3/src/TI/DLL430/MemoryAreaBase.h @@ -3,101 +3,106 @@ * * Base class for all memory classes. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_MEMORYAREABASE_H -#define DLL430_MEMORYAREABASE_H -#include -#include "FetControl.h" -#include "MemoryCache.h" -#include -#include + +#include "MemoryArea.h" +#include "HalExecElement.h" +#include namespace TI { namespace DLL430 { - class DeviceHandleV3; + class IDeviceHandle; + class HalExecCommand; + class IMemoryManager; + class MemoryAreaBase : public MemoryArea { public: - MemoryAreaBase (const std::string&, DeviceHandleV3* devHandle, - uint32_t start, uint32_t end, - uint32_t seg, uint32_t banks, - bool mapped, const bool protectable, - uint8_t psa_type); - virtual ~MemoryAreaBase (); - - const char* getName () const; - MemoryError getError (); - bool isCacheable () const; - virtual bool isReadOnly (); - virtual MemoryCacheCtrl* getCacheCtrl (); - - uint32_t getStart () const; - uint32_t getEnd () const; - uint32_t getSize () const; - uint32_t getSegmentSize () const; - uint32_t getBanks () const; - bool isMapped () const; - bool isLocked () const; - bool lock (); - bool unlock (); - - bool read (uint32_t address, uint32_t* buffer, size_t count); - bool write (uint32_t address, uint32_t* buffer, size_t count); - bool write (uint32_t address, uint32_t value); - - virtual bool doRead (uint32_t address, uint32_t* buffer, size_t count); - virtual bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - virtual bool doWrite (uint32_t address, uint32_t value); - - virtual bool sync (); - - bool sendWithChainInfo(HalExecElement * elem, HalExecCommand * cmd); - bool sendWithChainInfo(boost::ptr_vector * elem, HalExecCommand * cmd); - - virtual bool erase (); - bool erase (uint32_t start, uint32_t end); - bool verify(uint32_t address, uint32_t* buffer, size_t count); - static uint16_t psa (uint32_t address, uint32_t* buffer, size_t count); - - bool addCache(MemoryCacheCtrl *); - + MemoryAreaBase(MemoryArea::Name, IDeviceHandle* devHandle, + uint32_t start, uint32_t end, + uint32_t seg, uint32_t banks, + bool mapped, const bool protectable, + uint8_t psa_type); + + MemoryAreaBase(const MemoryAreaBase&) = delete; + MemoryAreaBase& operator=(const MemoryAreaBase&) = delete; + + MemoryArea::Name getName() const OVERRIDE; + MemoryError getError(); + virtual bool isReadOnly() const OVERRIDE; + + uint32_t getStart() const OVERRIDE; + uint32_t getEnd() const OVERRIDE; + uint32_t getSize() const OVERRIDE; + uint32_t getSegmentSize() const OVERRIDE; + uint32_t getBanks() const OVERRIDE; + bool isMapped() const OVERRIDE; + bool isLocked() const; + bool lock(); + bool unlock(); + + bool read(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + bool overwrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + bool write(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + bool write(uint32_t address, uint32_t value) OVERRIDE; + + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count); + virtual bool doOverwrite(uint32_t address, const uint8_t* buffer, size_t count); + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count); + virtual bool doWrite(uint32_t address, uint32_t value); + + virtual bool sync() OVERRIDE; + + bool send(std::vector< std::unique_ptr >* elem, HalExecCommand* cmd); + + virtual bool erase() OVERRIDE; + bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; + bool verify(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + static uint16_t psa(uint32_t address, const uint8_t* buffer, size_t count); + + virtual void setAccessible(bool accessible) OVERRIDE; + virtual bool isAccessible() const OVERRIDE; + + virtual bool fillCache() OVERRIDE { return false; } + virtual bool flushCache() const OVERRIDE { return false; } + + virtual bool wakeup() OVERRIDE { return false; } + virtual bool isProtectionEnabled() OVERRIDE { return false; } protected: struct Alignment { @@ -109,26 +114,27 @@ namespace TI const int backPadding; }; + bool defaultRead(hal_id readMacro, IMemoryManager* mm, uint32_t address, uint8_t* buffer, size_t count); + virtual Alignment alignData(uint32_t address, uint32_t count) const; - virtual bool preSync () { return true; }; - virtual bool postSync (const HalExecCommand&) { return true; }; + virtual bool preSync() { return true; }; + virtual bool postSync(const HalExecCommand&) = 0; virtual unsigned short getFlags() {return 0;} - std::string name; - DeviceHandleV3* devHandle; - boost::ptr_vector elements; - - struct ReadElement + MemoryArea::Name name; + IDeviceHandle* devHandle; + + struct ReadElement { ReadElement() : v_buffer(0), size(0), omitFirst(false), omitLast(false), offset(0) {} - ReadElement(uint32_t* buffer, size_t size, bool omitFirst, bool omitLast, size_t offset) + ReadElement(uint8_t* buffer, size_t size, bool omitFirst, bool omitLast, size_t offset) : v_buffer(buffer), size(size), omitFirst(omitFirst), omitLast(omitLast), offset(offset) {} - uint32_t* v_buffer; + uint8_t* v_buffer; size_t size; - + bool omitFirst; bool omitLast; size_t offset; @@ -138,6 +144,9 @@ namespace TI uint8_t psaType; MemoryError err; + protected: + std::vector> elements; + private: uint32_t start; uint32_t end; @@ -146,11 +155,7 @@ namespace TI bool mapped; const bool isProtectable; bool locked; - MemoryCacheCtrl * cache; + bool isAccessible_; }; - - typedef MemoryAreaBase UncachedMemoryArea; - }; -}; - -#endif /* DLL430_MEMORYAREABASE_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.cpp b/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.cpp index 74975a7..60070a1 100644 --- a/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.cpp +++ b/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.cpp @@ -3,213 +3,177 @@ * * Abstract Factory for creating classes of interface type MemoryAreaBase. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "MemoryAreaFactory.h" -#include #include "EemMemoryAccess.h" #include "CpuMemoryAccess.h" -#include "MemoryCacheGeneric.h" +#include "ArmCpuMemoryAccess.h" #include "ReadonlyMemoryAccess.h" #include "RegisterAccessBase.h" #include "FlashMemoryAccessBase.h" -#include "FramMemoryAccessBase.h" #include "DeviceInfo.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; -MemoryAreaFactory::MemoryAreaFactory (DeviceHandleV3* devHandle, const DeviceInfo* devInfo) +MemoryAreaFactory::MemoryAreaFactory (IDeviceHandle* devHandle, PsaType psaType, uint8_t bits) : devHandle(devHandle) - , psa(devInfo->getPsaType()) + , psa(psaType) + , defaultBits(bits) { } -MemoryAreaBase* MemoryAreaFactory::createMemoryArea (MemoryManager* mm, const DeviceInfo::memoryInfo& memInfo) +CpuRegisters* MemoryAreaFactory::createCpuRegisters(const MemoryInfo& memInfo) { - - if (memInfo.name == "EEM") + const uint8_t bits = (memInfo.bits != 0) ? memInfo.bits : defaultBits; + if (memInfo.name == MemoryArea::Cpu) { - return new EemMemoryAccess(memInfo.name,this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.bits); + if (memInfo.bits != 32) + { + return new CpuMemoryAccess(memInfo.name, + this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + bits); + } + else + { + return new ArmCpuMemoryAccess(memInfo.name, + this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + bits); + } + } + return nullptr; +} - } else if (memInfo.name == "CPU") { - return new CpuMemoryAccess(memInfo.name, +MemoryAreaBase* MemoryAreaFactory::createMemoryArea(IMemoryManager* mm, const MemoryInfo& memInfo) +{ + const uint8_t bits = (memInfo.bits != 0) ? memInfo.bits : defaultBits; + + if (memInfo.memoryCreatorPtr) + { + return (*memInfo.memoryCreatorPtr)(memInfo.name, this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.bits); + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + memInfo.protectable, + mm, + static_cast(this->psa)); + } + else + { + if (memInfo.name == MemoryArea::Eem) + { + return new EemMemoryAccess(memInfo.name, this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + bits); + } - } else { - switch (memInfo.type) + switch (memInfo.type) { - case DeviceInfo::MEMTYPE_FLASH: - { - MemoryAreaBase * access = NULL; - if(memInfo.memoryCreatorPtr->isImplemented()) - { - access = (*memInfo.memoryCreatorPtr)(memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.isProtected, - mm, - this->psa - ); - }else{ - access=new FlashMemoryAccessBase(memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.isProtected, - mm, - this->psa - ); - } - assert(NULL != access); - MemoryCacheCtrl * cache = new MemoryCacheGeneric(access); - access->addCache(cache); - return access; - } + case MemoryType::Flash: + return new FlashMemoryAccessBase(memInfo.name, + this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + memInfo.protectable, + mm, + static_cast(this->psa)); break; - case DeviceInfo::MEMTYPE_ROM: - { - MemoryAreaBase * access = NULL; - if(memInfo.memoryCreatorPtr->isImplemented()) - { - access = (*memInfo.memoryCreatorPtr)(memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.isProtected, - mm, - this->psa - ); - }else{ - access = new ReadonlyMemoryAccess( - memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.isProtected, - mm, - this->psa - ); - } - assert(NULL != access); - MemoryCacheCtrl * cache = new MemoryCacheGeneric(access); - access->addCache(cache); - return access; - } + case MemoryType::Rom: + return new ReadonlyMemoryAccess( + memInfo.name, + this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + memInfo.protectable, + mm, + static_cast(this->psa)); break; - case DeviceInfo::MEMTYPE_RAM: - { - MemoryAreaBase * access = NULL; - if(memInfo.memoryCreatorPtr->isImplemented()) - { - access = (*memInfo.memoryCreatorPtr)(memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.isProtected, - mm, - this->psa - ); - }else{ - access = new RandomMemoryAccess( - memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.isProtected, - mm, - this->psa - ); - } - assert(NULL != access); - MemoryCacheCtrl * cache = new MemoryCacheGeneric(access); - access->addCache(cache); - return access; - } + case MemoryType::Ram: + return new RandomMemoryAccess( + memInfo.name, + this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + memInfo.protectable, + mm, + static_cast(this->psa)); break; - case DeviceInfo::MEMTYPE_REGISTER: - { - //Handles 8 and 16bit register access - RegisterAccess * access = new RegisterAccess(memInfo.name, - this->devHandle, - memInfo.offset, - memInfo.size, - memInfo.seg_size, - memInfo.banks, - memInfo.mmapped, - memInfo.bits, - memInfo.mask); - MemoryCacheCtrl * cache = new MemoryCacheGeneric(access); - access->addCache(cache); - return access; - } + case MemoryType::Register: + //Handles 8 and 16bit register access + return new RegisterAccess(memInfo.name, + this->devHandle, + memInfo.start, + memInfo.size, + memInfo.segmentSize, + memInfo.banks, + memInfo.mapped, + memInfo.bits, + memInfo.mask); break; } } - return 0; + + return nullptr; } diff --git a/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.h b/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.h index f30ecb4..f03de16 100644 --- a/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.h +++ b/DLL430_v3/src/TI/DLL430/MemoryAreaFactory.h @@ -3,44 +3,41 @@ * * Abstract Factory for creating classes of interface type MemoryAreaBase. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_MEMORYAREAFACTORY_H -#define DLL430_MEMORYAREAFACTORY_H +#include "CpuRegisters.h" #include "MemoryAreaBase.h" #include "DeviceInfo.h" @@ -48,19 +45,19 @@ namespace TI { namespace DLL430 { - class DeviceHandleV3; + class IDeviceHandle; class MemoryAreaFactory { public: - MemoryAreaFactory (DeviceHandleV3* devHandle, const DeviceInfo* devInfo); - MemoryAreaBase* createMemoryArea (MemoryManager* mm, const DeviceInfo::memoryInfo&); + MemoryAreaFactory(IDeviceHandle* devHandle, PsaType psaType, uint8_t bits); + MemoryAreaBase* createMemoryArea(IMemoryManager* mm, const MemoryInfo&); + CpuRegisters* createCpuRegisters(const MemoryInfo&); private: - DeviceHandleV3* devHandle; - DeviceInfo::psaType psa; + IDeviceHandle* devHandle; + PsaType psa; + uint8_t defaultBits; }; - }; -}; - -#endif /* DLL430_MEMORYAREAFACTORY_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryCache.h b/DLL430_v3/src/TI/DLL430/MemoryCache.h deleted file mode 100644 index 010b768..0000000 --- a/DLL430_v3/src/TI/DLL430/MemoryCache.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * MemoryCache.h - * - * Interface for handling caching memory. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_MEMORYCACHE_H -#define DLL430_MEMORYCACHE_H - -#include - -namespace TI -{ - namespace DLL430 - { - - class MemoryCache : public MemoryCacheCtrl - { - public: - virtual ~MemoryCache () {}; - - virtual bool read (uint32_t address, uint32_t* buffer, size_t count) = 0; - virtual bool write (uint32_t address, uint32_t* buffer, size_t count) = 0; - virtual bool write (uint32_t address, uint32_t value) = 0; - virtual bool sync () { return true; }; - virtual bool erase () { return false; }; - virtual bool erase (uint32_t start, uint32_t end) { return false; }; - virtual bool verify(uint32_t address, uint32_t* buffer, size_t count) { return false; }; - - virtual void enable (bool) = 0; - virtual bool fill (uint32_t address, size_t count) = 0; - virtual bool flush (uint32_t address, size_t count) = 0; - virtual void clear (uint32_t address, size_t count) = 0; - - virtual bool isReadOnly()=0; - }; - - }; -}; - -#endif /* DLL430_MEMORYCACHE_H */ diff --git a/DLL430_v3/src/TI/DLL430/MemoryCacheGeneric.cpp b/DLL430_v3/src/TI/DLL430/MemoryCacheGeneric.cpp deleted file mode 100644 index 56e2f37..0000000 --- a/DLL430_v3/src/TI/DLL430/MemoryCacheGeneric.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/* - * MemoryCacheGeneric.cpp - * - * Base class for all memory classes with caching capabilities. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include -#include -#include - -#include "MemoryCacheGeneric.h" - -#define CACHE_FLAG_VALID (1 << 0) -#define CACHE_FLAG_DIRTY (1 << 1) - -using namespace TI::DLL430; - -MemoryCacheGeneric::MemoryCacheGeneric (MemoryArea* parent) - : parent(parent) - , enabled(true) - , syncNeeded(false) - , cache(parent->getSize(), 0) - , dirty(false) - , flags(parent->getSize(), 0) -{ -} - -size_t MemoryCacheGeneric::size () const -{ - return this->parent->getSize(); -} - -bool MemoryCacheGeneric::read (uint32_t address, uint32_t* buffer, size_t count) -{ - if (!this->enabled) - return this->parent->read(address, buffer, count); - - if (address+count > this->size()) - return false; - - this->fillNosync(address, count); - if (buffer) - { - readElement r; - r.address = address; - r.v_buffer = buffer; - r.count = count; - this->readList.push_back(r); - } - return true; -} - -bool MemoryCacheGeneric::write (uint32_t address, uint32_t* buffer, size_t count) -{ - if (!this->enabled) - return this->parent->write(address, buffer, count); - - if (address+count > this->size()) - return false; - - for (size_t i = 0; i < count && address+i < this->size(); ++i) - { - this->cache[address+i] = buffer[i]; - this->setFlag(address+i, CACHE_FLAG_DIRTY | CACHE_FLAG_VALID); - } - - this->dirty = true; - return true; -} - -bool MemoryCacheGeneric::write (uint32_t address, uint32_t value) -{ - if (!this->enabled) - return this->parent->write(address, value); - - if (address >= this->size()) - return false; - - this->cache[address] = value; - this->setFlag(address, CACHE_FLAG_DIRTY | CACHE_FLAG_VALID); - this->dirty = true; - return true; -} - -bool MemoryCacheGeneric::isReadOnly() -{ - return this->parent->isReadOnly(); -} - -bool MemoryCacheGeneric::sync () -{ - if (this->syncNeeded) - { - /* the real I/O sync updates the cache... */ - if (!this->parent->sync()) - return false; - - this->syncNeeded = false; - } - - /* ...so we can fill the buffers the the read - * function was called with. - */ - readElement_list::iterator it = this->readList.begin(); - for (; it != this->readList.end(); ++it) - { - readElement r = *it; - for (size_t i = 0; i < r.count; ++i) - r.v_buffer[i] = this->cache[r.address+i]; - } - this->readList.clear(); - return true; -} - -bool MemoryCacheGeneric::erase () -{ - if (this->enabled) - this->clear(0, this->size()); - - return this->parent->erase(); -} - -bool MemoryCacheGeneric::erase (uint32_t start, uint32_t end) -{ - uint32_t segSize = this->parent->getSegmentSize(); - start = (start / segSize) * segSize; - end = ((start / segSize) * segSize) + (segSize - 1); - - if (this->enabled) - this->clear(start, end - start + 1); - - return this->parent->erase(start, end); -} - -bool MemoryCacheGeneric::verify(uint32_t address, uint32_t* buffer, size_t count) -{ - if (!this->flush(address, count)) - return false; - - return this->parent->verify(address, buffer, count); -} - -void MemoryCacheGeneric::enable (bool enable) -{ - if (!enable && this->enabled) - flush(0, this->size()); - - this->enabled = enable; -} - -bool MemoryCacheGeneric::isEnabled () const -{ - return this->enabled; -} - -bool MemoryCacheGeneric::checkCache (uint32_t address) const -{ - return (this->enabled && address < this->size() && this->checkFlag(address, CACHE_FLAG_VALID)); -} - -bool MemoryCacheGeneric::markDirty (uint32_t address, size_t count) -{ - if (!fill(address, count)) - return false; - - while (count--) - this->setFlag(address++, CACHE_FLAG_DIRTY); - - return true; -} - -bool MemoryCacheGeneric::fillNosync (uint32_t address, size_t count) -{ - for (uint32_t i = address; i < address+count;) - { - uint32_t start = i; - uint32_t size = 0; - while (i < this->size() && - i < address+count && - !this->checkFlag(i++, CACHE_FLAG_VALID)) - { - ++size; - } - if (size) - { - if (!this->parent->read(start, &cache[start], size)) - { - return false; - } - - for (size_t k = 0; k < size; ++k) - { - setFlag(start+k, CACHE_FLAG_VALID); - } - this->syncNeeded = true; - } - } - return true; -} - -bool MemoryCacheGeneric::fill (uint32_t address, size_t count) -{ - if (!this->enabled || address+count > this->size()) - return false; - - return fillNosync(address, count) && sync(); -} - -bool MemoryCacheGeneric::flush (uint32_t address, size_t count) -{ - if (address+count > this->size()) - return false; - - if (!this->enabled || !this->dirty) - return true; - - for (uint32_t i = 0; i < count;) - { - uint32_t start = i; - uint32_t size = 0; - while (i < count && this->checkFlag(address + i++, CACHE_FLAG_DIRTY)) - ++size; - - if (size) - { - if (!this->parent->write(address + start, &cache[address + start], size)) - { - return false; - } - } - } - if (!this->parent->sync()) - return false; - - for (uint32_t i = 0; i < count; ++i) - this->setFlag(address + i, CACHE_FLAG_DIRTY, false); - - this->dirty = false; - return true; -} - -void MemoryCacheGeneric::clear (uint32_t address, size_t count) -{ - if (address > this->size()) - return; - - if (address+count > this->size()) - count = this->size()-address; - - for (size_t i = 0; i < count; ++i) - { - this->setFlag(address + i, CACHE_FLAG_VALID | CACHE_FLAG_DIRTY, false); - } - memset(&this->cache[address], 0, count); -} - -bool MemoryCacheGeneric::checkFlag (uint32_t address, uint8_t flag) const -{ - return (this->flags[address] & flag) != 0; -} - -void MemoryCacheGeneric::setFlag (uint32_t address, uint8_t flag, bool set) -{ - if (set) - this->flags[address] |= flag; - else - this->flags[address] &= ~flag; -} diff --git a/DLL430_v3/src/TI/DLL430/MemoryCacheGeneric.h b/DLL430_v3/src/TI/DLL430/MemoryCacheGeneric.h deleted file mode 100644 index 5486e73..0000000 --- a/DLL430_v3/src/TI/DLL430/MemoryCacheGeneric.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * MemoryCacheGeneric.h - * - * Generic implemtation for caching memory types. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_MEMORYCACHEGENERIC_H -#define DLL430_MEMORYCACHEGENERIC_H - -#include "MemoryCache.h" -#include -#include -#include -#include - -namespace TI -{ - namespace DLL430 - { - - class MemoryCacheGeneric : public MemoryCache - { - public: - MemoryCacheGeneric (MemoryArea* parent); - - bool read (uint32_t address, uint32_t* buffer, size_t count); - bool write (uint32_t address, uint32_t* buffer, size_t count); - bool write (uint32_t address, uint32_t value); - bool sync (); - bool erase (); - bool erase (uint32_t start, uint32_t end); - bool verify(uint32_t address, uint32_t* buffer, size_t count); - - bool isReadOnly(); - - void enable (bool); - bool isEnabled () const; - bool checkCache (uint32_t address) const; - bool markDirty (uint32_t address, size_t count); - bool fill (uint32_t address, size_t count); - bool flush (uint32_t address, size_t count); - void clear (uint32_t address, size_t count); - - private: - MemoryArea* parent; - bool enabled; - - bool fillNosync (uint32_t address, size_t count); - bool syncNeeded; - - struct readElement { - uint32_t address; - uint32_t* v_buffer; - size_t count; - }; - typedef std::vector readElement_list; - readElement_list readList; - - std::vector cache; - bool dirty; - std::vector flags; - - size_t size() const; - bool checkFlag (uint32_t address, uint8_t flag) const; - void setFlag (uint32_t address, uint8_t flag, bool set = true); - }; - - }; -}; - -#endif /* DLL430_MEMORYCACHEGENERIC_H */ diff --git a/DLL430_v3/src/TI/DLL430/MemoryContent.cpp b/DLL430_v3/src/TI/DLL430/MemoryContent.cpp new file mode 100644 index 0000000..775fb48 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MemoryContent.cpp @@ -0,0 +1,76 @@ +/* + * MemoryContent.cpp + * + * Class holding memory segment data + * + * Copyright (C) 2008 - 2014 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. + */ + +#include + +#include "MemoryContent.h" + +using namespace TI::DLL430; + + +MemoryContent::MemoryContent(uint32_t address, const uint8_t* data, size_t size) +{ + fromBuffer(address, data, size); +} + + +MemoryContent::MemoryContent(const uint16_t* data, const uint32_t* address, const uint32_t* length, uint32_t sections) +{ + fromSRec(data, address, length, sections); +} + + +void MemoryContent::fromBuffer(uint32_t address, const uint8_t* data, size_t size) +{ + segments.push_back( DataSegment(address, data, size) ); +} + + +void MemoryContent::fromSRec(const uint16_t* data, const uint32_t* address, const uint32_t* length, uint32_t sections) +{ + for (uint32_t i = 0; i < sections; ++i) + { + DataSegment segment(address[i]); + + for (uint32_t word = 0; word < length[i]; ++word, ++data) + { + segment.data.push_back((uint8_t)(*data & 0xFF)); + segment.data.push_back((uint8_t)(*data >> 8)); + } + segments.push_back(segment); + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryContent.h b/DLL430_v3/src/TI/DLL430/MemoryContent.h new file mode 100644 index 0000000..28e6e44 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MemoryContent.h @@ -0,0 +1,67 @@ +/* + * MemoryContent.h + * + * Class holding memory segment data + * + * Copyright (C) 2008 - 2014 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. + */ + +#pragma once + + +namespace TI +{ + namespace DLL430 + { + struct DataSegment + { + uint32_t startAddress; + std::vector data; + + explicit DataSegment(uint32_t address = 0) : startAddress(address) {} + DataSegment(uint32_t address, const uint8_t* data, size_t size) : startAddress(address), data(data, data+size) {} + }; + + class MemoryContent + { + public: + MemoryContent() {} + MemoryContent(uint32_t address, const uint8_t* data, size_t size); + MemoryContent(const uint16_t* data, const uint32_t* address, const uint32_t* length, uint32_t sections); + + void fromBuffer(uint32_t address, const uint8_t* data, size_t size); + void fromSRec(const uint16_t* data, const uint32_t* address, const uint32_t* length, uint32_t sections); + + std::vector segments; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryManager.cpp b/DLL430_v3/src/TI/DLL430/MemoryManager.cpp new file mode 100644 index 0000000..f46e0c9 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MemoryManager.cpp @@ -0,0 +1,323 @@ +/* + * MemoryManager.cpp + * + * Manages to which MemoryAreaBases to communicate dependent on address. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include "MemoryManager.h" +#include "DeviceInfo.h" +#include "MemoryAreaFactory.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" +#include "FetHandle.h" + +using namespace TI::DLL430; + +MemoryManager::MemoryManager (IDeviceHandle* parent, const DeviceInfo& devInfo) + : parent(parent), lastError(MEMORY_NO_ERROR), preserveRam(true) +{ + MemoryAreaFactory fac(parent, devInfo.psa, devInfo.bits); + for (const auto& it : devInfo.memoryLayout) + { + if (it.second.name == MemoryArea::Cpu) + { + CpuRegisters* cpu = fac.createCpuRegisters(it.second); + if (cpu) + { + cpus.emplace_back(cpu); + } + } + else + { + MemoryAreaBase* area = fac.createMemoryArea(this, it.second); + if (area) + { + types.emplace_back(area); + } + } + } +} + +int16_t MemoryManager::getMemoryAreaIndex(MemoryArea::Name type, uint32_t address, uint32_t size) +{ + size_t count = 0; + for (const auto& it : types) + { + + if (it->getName() == type) + { + if (address >= it->getStart() && (address + size) < it->getEnd()) + { + return static_cast(count); + } + count++; + } + } + return -1; +} + + +MemoryAreaBase* MemoryManager::getMemoryArea(MemoryArea::Name name, size_t subIndex) +{ + for (const auto& it : types) + { + if (it->getName() == name && subIndex-- == 0) + { + return &(*it); + } + } + return nullptr; +} + +CpuRegisters* MemoryManager::getCpuRegisters(size_t index) +{ + return (index < cpus.size()) ? this->cpus[index].get() : 0; +} + +MemoryAreaBase* MemoryManager::getMemoryArea (size_t index) +{ + return index < count() ? this->types[index].get() : nullptr; +} + +size_t MemoryManager::count () const +{ + return this->types.size(); +} + +bool MemoryManager::doForMemoryAreas(uint32_t address, const uint8_t* buffer, size_t count, AccessFunction function) +{ + if (count == 0) //Nothing to do + { + return true; + } + + for (const auto& it : types) + { + if (!it->isMapped() || !it->isAccessible()) + continue; + + const uint32_t bottom = std::max(address, it->getStart()); + const uint32_t top = std::min(address + static_cast(count) - 1, it->getEnd()); + if (bottom > top) + continue; + + const uint8_t* bufferPtr = buffer ? (buffer + bottom - address) : 0; + if (!((*it).*function)(bottom - it->getStart(), bufferPtr, top - bottom + 1)) + { + lastError = it->getError(); + return false; + } + } + return true; +} + +bool MemoryManager::read(uint32_t address, uint8_t* buffer, size_t count) +{ + if (count == 0) //Nothing to do + { + return true; + } + + for (const auto& it : types) + { + if (!it->isMapped()) + continue; + + const uint32_t bottom = std::max(address, it->getStart()); + const uint32_t top = std::min(static_cast(address + count - 1), it->getEnd()); + if (bottom > top) + continue; + + uint8_t* bufferPtr = buffer ? (buffer + bottom - address) : 0; + if (!it->read(bottom - it->getStart(), bufferPtr, top - bottom + 1)) + { + lastError = it->getError(); + return false; + } + } + return true; +} + +bool MemoryManager::verify(uint32_t address, const uint8_t* buffer, size_t count) +{ + return doForMemoryAreas(address, buffer, count, &MemoryArea::verify); +} + +bool MemoryManager::overwrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + return doForMemoryAreas(address, buffer, count, &MemoryArea::overwrite); +} + +bool MemoryManager::write(uint32_t address, const uint8_t* buffer, size_t count) +{ + return doForMemoryAreas(address, buffer, count, &MemoryArea::write); +} + +bool MemoryManager::write(uint32_t address, uint32_t value) +{ + for (const auto& it : types) + { + if (!it->isMapped() || !it->isAccessible() || it->isReadOnly()) + continue; + + if (it->getStart() <= address && address <= it->getEnd()) + { + bool success = it->write(address - it->getStart(), value); + if (!success) + lastError = it->getError(); + + return success; + } + } + return true; +} + +bool MemoryManager::sync() +{ + for (const auto& it : types) + { + if (!it->isMapped() || !it->isAccessible()) + continue; + + if (!it->sync()) + return false; + } + return true; + +} + +bool MemoryManager::isReadOnly() const +{ + return false; +} + +bool MemoryManager::lock(MemoryArea::Name name, bool action) +{ + MemoryAreaBase* mab = getMemoryArea(name); + if (nullptr != mab) + { + return action ? mab->lock() : mab->unlock(); + } + return true; +} + +bool MemoryManager::erase() +{ + MemoryArea* main = this->getMemoryArea(MemoryArea::Main); + MemoryArea* info = this->getMemoryArea(MemoryArea::Info); + MemoryArea* info2 = this->getMemoryArea(MemoryArea::Info, 1); + MemoryArea* bsl = this->getMemoryArea(MemoryArea::Bsl); + + if (main && !main->erase()) + return false; + + if (info && !info->erase()) + return false; + + if (bsl && !bsl->erase()) + return false; + + if (info2 && !info2->erase()) + return false; + + return true; +} + +bool MemoryManager::erase(uint32_t start, uint32_t end, bool forceUnlock) +{ + for (const auto& it : types) + { + if (!it->isMapped() || !it->isAccessible()) + continue; + + if (it->isReadOnly()) + continue; + + const uint32_t bottom = std::max(start, it->getStart()); + const uint32_t top = std::min(end, it->getEnd()); + if (bottom > top) + continue; + + if (!it->erase(bottom, top, forceUnlock)) + return false; + } + return true; +} + +MemoryError MemoryManager::getLastError() +{ + MemoryError error = lastError; + lastError = MEMORY_NO_ERROR; + return error; +} + +void MemoryManager::setRamPreserveMode(bool enabled) +{ + preserveRam = enabled; +} + +bool MemoryManager::getRamPreserveMode() const +{ + return preserveRam; +} + +bool MemoryManager::uploadFunclet(FuncletCode::Type type) +{ + const FuncletCode& funclet = parent->getFunclet(type); + const uint8_t* code = (uint8_t*)funclet.code(); + const size_t count = funclet.codeSize(); + + MemoryArea* ram = this->getMemoryArea(MemoryArea::Ram, 0); + + return ram && ram->write(0, code, count) && ram->sync(); +} + +bool MemoryManager::checkMinFlashVoltage() const +{ + const unsigned minFlashVcc = parent->getMinFlashVcc(); + + if ( IFetHandle* fetHandle = parent->getFetHandle() ) + { + if ( const IConfigManager* configManager = fetHandle->getConfigManager() ) + { + //Don't check during updates (no valid voltage will be returned) + return configManager->isUpdateRequired(parent->getTargetArchitecture()) || + configManager->getDeviceVcc() >= minFlashVcc || + configManager->getExternalVcc() >= minFlashVcc; + } + } + return false; +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryManager.h b/DLL430_v3/src/TI/DLL430/MemoryManager.h new file mode 100644 index 0000000..62efd42 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MemoryManager.h @@ -0,0 +1,99 @@ +/* + * MemoryManager.h + * + * Manages to which MemoryAreaBases to communicate dependent on address. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "MemoryAreaBase.h" +#include "IMemoryManager.h" +#include "FuncletCode.h" + + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + struct DeviceInfo; + + class MemoryManager : public IMemoryManager + { + public: + MemoryManager (IDeviceHandle*, const DeviceInfo&); + + MemoryAreaBase* getMemoryArea (MemoryArea::Name name, size_t subIndex = 0); + int16_t getMemoryAreaIndex(MemoryArea::Name type, uint32_t address, uint32_t size); + + MemoryAreaBase* getMemoryArea(size_t index) OVERRIDE; + CpuRegisters* getCpuRegisters(size_t index = 0) OVERRIDE; + size_t count() const OVERRIDE; + + bool read(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + bool overwrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + bool write(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + bool write(uint32_t address, uint32_t value) OVERRIDE; + bool sync() OVERRIDE; + bool erase() OVERRIDE; + bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; + bool verify(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + + bool isReadOnly() const OVERRIDE; + bool lock(MemoryArea::Name name, bool action) OVERRIDE; + + MemoryError getLastError() OVERRIDE; + + void setRamPreserveMode(bool enabled) OVERRIDE; + bool getRamPreserveMode() const OVERRIDE; + + bool uploadFunclet(FuncletCode::Type type); + bool checkMinFlashVoltage() const OVERRIDE; + + private: + typedef bool (MemoryArea::*AccessFunction)(uint32_t, const uint8_t*, size_t); + bool doForMemoryAreas(uint32_t address, const uint8_t* buffer, size_t count, AccessFunction function); + + typedef std::vector> MemoryList; + typedef std::vector> CpuList; + + IDeviceHandle* parent; + MemoryList types; + CpuList cpus; + MemoryError lastError; + bool preserveRam; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/MemoryManagerV3.cpp b/DLL430_v3/src/TI/DLL430/MemoryManagerV3.cpp deleted file mode 100644 index ba70d1f..0000000 --- a/DLL430_v3/src/TI/DLL430/MemoryManagerV3.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* - * MemoryManagerV3.cpp - * - * Manages to which MemoryAreaBases to communicate dependent on address. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "MemoryManagerV3.h" -#include "DeviceInfo.h" -#include "MemoryAreaFactory.h" -#include "HalExecCommand.h" -#include "DeviceHandleV3.h" -#include "FetHandleV3.h" - -using namespace TI::DLL430; - -MemoryManagerV3::MemoryManagerV3 (DeviceHandleV3* parent, const DeviceInfo* devInfo) - : parent(parent), lastError(MEMORY_NO_ERROR), preserveRam(true) -{ - MemoryAreaFactory fac(parent, devInfo); - const DeviceInfo::memoryInfo_list_type& infoList = devInfo->getMemoryInfo(); - DeviceInfo::memoryInfo_list_type::const_iterator it = infoList.begin(); - for (; it != infoList.end(); ++it) - { - MemoryAreaBase* area = fac.createMemoryArea(this, *it); - if (area) - types.push_back(area); - } -} - -MemoryManagerV3::~MemoryManagerV3 () -{ - while(types.size() > 0) - { - types.pop_back(); - } - types.clear(); -} - -MemoryAreaBase* MemoryManagerV3::getMemoryArea (const char* name, size_t subIndex) -{ - memory_list_type::iterator it = this->types.begin(); - for (; it != this->types.end(); ++it) - { - if (strcmp(it->getName(), name) == 0 && subIndex-- == 0) - { - return &(*it); - } - } - return 0; -} - -MemoryAreaBase* MemoryManagerV3::getMemoryArea (size_t index) -{ - return index < count() ? &this->types[index] : 0; -} - -size_t MemoryManagerV3::count () const -{ - return this->types.size(); -} - -bool MemoryManagerV3::read (uint32_t address, uint32_t* buffer, size_t count) -{ - memory_list_type::iterator it = this->types.begin(); - - for (; it != this->types.end(); ++it) - { - if (!it->isMapped()) - continue; - - uint32_t bottom = std::max(address, it->getStart()); - uint32_t top = std::min(address + count - 1, it->getEnd()); - if (bottom > top) - continue; - - if (!it->read(bottom - it->getStart(), buffer + (bottom-address), top - bottom + 1)) - { - lastError = it->getError(); - return false; - } - } - return true; -} - -bool MemoryManagerV3::write (uint32_t address, uint32_t* buffer, size_t count) -{ - memory_list_type::iterator it = this->types.begin(); - for (; it != this->types.end(); ++it) - { - if (!it->isMapped()) - continue; - - uint32_t bottom = std::max(address, it->getStart()); - uint32_t top = std::min(address + count - 1, it->getEnd()); - - if (bottom > top) - continue; - - if (!it->write(bottom - it->getStart(), buffer+(bottom-address), top - bottom + 1)) - { - lastError = it->getError(); - return false; - } - } - - return true; -} - -bool MemoryManagerV3::write (uint32_t address, uint32_t value) -{ - memory_list_type::iterator it = this->types.begin(); - for (; it != this->types.end(); ++it) - { - if (!it->isMapped()) - continue; - - if(it->isReadOnly()) - continue; - - if (it->getStart() <= address && address <= it->getEnd()) - { - bool success = it->write(address - it->getStart(), value); - if (!success) - lastError = it->getError(); - - return success; - } - } - return true; -} - -bool MemoryManagerV3::sync () -{ - memory_list_type::iterator it = this->types.begin(); - for (; it != this->types.end(); ++it) - { - if (!it->isMapped()) - continue; - - if (!it->sync()) - return false; - } - return true; - -} - -bool MemoryManagerV3::isReadOnly() -{ - return false; -} - -bool MemoryManagerV3::lock(const char* name, bool action) -{ - MemoryAreaBase* mab = getMemoryArea(name); - if (NULL != mab) - { - return action ? mab->lock() : mab->unlock(); - } - return true; -} - -bool MemoryManagerV3::erase () -{ - MemoryArea* main = this->getMemoryArea("main"); - MemoryArea* info = this->getMemoryArea("information"); - MemoryArea* bsl = this->getMemoryArea("boot"); - - if (main && !main->erase()) - return false; - - if (info && !info->erase()) - return false; - - if (bsl && !bsl->erase()) - return false; - - return true; -} - -bool MemoryManagerV3::erase (uint32_t start, uint32_t end) -{ - memory_list_type::iterator it = this->types.begin(); - for (; it != this->types.end(); ++it) - { - if (!it->isMapped()) - continue; - - if(it->isReadOnly()) - continue; - - uint32_t bottom = std::max(start, it->getStart()); - uint32_t top = std::min(end, it->getEnd()); - if (bottom > top) - continue; - - if (!it->erase(bottom, top)) - return false; - } - return true; -} - -bool MemoryManagerV3::verify(uint32_t address, uint32_t* buffer, size_t count) -{ - memory_list_type::iterator it = this->types.begin(); - for (; it != this->types.end(); ++it) - { - if (!it->isMapped()) - continue; - - if(it->isReadOnly()) - continue; - - uint32_t bottom = std::max(address, it->getStart()); - uint32_t top = std::min(address + count - 1, it->getEnd()); - if (bottom > top) - continue; - - if (!it->verify(bottom - it->getStart(), buffer+(bottom-address), top - bottom + 1)) - return false; - } - return true; -} - -bool MemoryManagerV3::flushAll() -{ - for (unsigned int i = 0; i < this->count(); ++i) - { - MemoryArea* area = this->getMemoryArea(i); - MemoryCacheCtrl* ctrl = area->getCacheCtrl(); - if (ctrl) - { - if (!ctrl->flush(0, area->getSize())) - return false; - - ctrl->clear(0, area->getSize()); - } - } - return true; -} - -MemoryError MemoryManagerV3::getLastError() -{ - MemoryError error = lastError; - lastError = MEMORY_NO_ERROR; - return error; -} - -void MemoryManagerV3::setRamPreserveMode(bool enabled) -{ - preserveRam = enabled; -} - -bool MemoryManagerV3::getRamPreserveMode() const -{ - return preserveRam; -} - -bool MemoryManagerV3::uploadFunclet(FuncletCode::Type type) -{ - const FuncletCode& funclet = parent->getFunclet(type); - const uint8_t* code = (uint8_t*)funclet.code(); - const size_t count = funclet.codeSize(); - - vector tmp(code, code + count); // copy funclet into vector - MemoryArea* ram = this->getMemoryArea("system", 0); - - return ram && ram->write(0, &tmp[0], count) && ram->sync(); -} - -bool MemoryManagerV3::checkMinFlashVoltage() const -{ - const unsigned minFlashVcc = parent->getMinFlashVcc(); - - if ( FetHandle* fetHandle = parent->getFetHandle() ) - { - if ( const ConfigManager* configManager = fetHandle->getConfigManager() ) - { - return configManager->getDeviceVcc() >= minFlashVcc || - configManager->getExternalVcc() >= minFlashVcc; - } - } - return false; -} diff --git a/DLL430_v3/src/TI/DLL430/MemoryManagerV3.h b/DLL430_v3/src/TI/DLL430/MemoryManagerV3.h deleted file mode 100644 index 7409fb5..0000000 --- a/DLL430_v3/src/TI/DLL430/MemoryManagerV3.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * MemoryManagerV3.h - * - * Manages to which MemoryAreaBases to communicate dependent on address. - * - * Copyright (C) 2007 - 2011 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. - */ - -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_MEMORYMANAGERV3_H -#define DLL430_MEMORYMANAGERV3_H - -#include "MemoryAreaBase.h" -#include "FuncletCode.h" - -#include -#include - - -namespace TI -{ - namespace DLL430 - { - class DeviceHandleV3; - class DeviceInfo; - - class MemoryManagerV3 : public MemoryManager - { - public: - MemoryManagerV3 (DeviceHandleV3*, const DeviceInfo*); - ~MemoryManagerV3 (); - - MemoryAreaBase* getMemoryArea (const char* name, size_t subIndex = 0); - MemoryAreaBase* getMemoryArea (size_t index); - size_t count () const; - - bool read (uint32_t address, uint32_t* buffer, size_t count); - bool write (uint32_t address, uint32_t* buffer, size_t count); - bool write (uint32_t address, uint32_t value); - bool sync (); - bool erase (); - bool erase (uint32_t start, uint32_t end); - bool verify(uint32_t address, uint32_t* buffer, size_t count); - - bool isReadOnly(); - bool lock(const char* name, bool action); - - bool flushAll(); - MemoryError getLastError(); - - void setRamPreserveMode(bool enabled); - bool getRamPreserveMode() const; - bool uploadFunclet(FuncletCode::Type type); - bool checkMinFlashVoltage() const; - - private: - typedef boost::ptr_vector memory_list_type; - - DeviceHandleV3* parent; - memory_list_type types; - MemoryError lastError; - bool preserveRam; - }; - - }; -}; - -#endif /* DLL430_MEMORYMANAGERV3_H */ diff --git a/DLL430_v3/src/TI/DLL430/MessageData.cpp b/DLL430_v3/src/TI/DLL430/MessageData.cpp index 2365794..68f8d9c 100644 --- a/DLL430_v3/src/TI/DLL430/MessageData.cpp +++ b/DLL430_v3/src/TI/DLL430/MessageData.cpp @@ -3,39 +3,40 @@ * * Encapsulate raw message data for easier access * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "MessageData.h" using namespace TI::DLL430; @@ -47,20 +48,20 @@ MessageData::MessageData() } -MessageData::MessageData(const std::vector& data) - : mData(data), mReadPos(0), mFail(false) +MessageData::MessageData(const std::vector& data) + : mData(data), mReadPos(0), mFail(false) { } MessageData::MessageData(const uint8_t* start, const uint8_t* end) - : mData(start, end), mReadPos(0), mFail(false) + : mData(start, end), mReadPos(0), mFail(false) { } MessageData::MessageData(std::vector::const_iterator start, std::vector::const_iterator end) - : mData(start, end), mReadPos(0), mFail(false) + : mData(start, end), mReadPos(0), mFail(false) { } @@ -72,9 +73,9 @@ void MessageData::reset() } -bool MessageData::fail() const +bool MessageData::fail() const { - return mFail; + return mFail; } @@ -94,10 +95,12 @@ MessageData& MessageData::discard(size_t count) void MessageData::read(void* dst, size_t count) { - if (mReadPos + count <= mData.size()) + const size_t newReadPos = mReadPos + count; + if (newReadPos <= mData.size()) { - memcpy(dst, &mData[mReadPos], count); - mReadPos += count; + const uint8_t* data = &mData[mReadPos]; + std::copy(data, data + count, (uint8_t*)dst); + mReadPos = newReadPos; } else { @@ -108,7 +111,6 @@ void MessageData::read(void* dst, size_t count) void MessageData::write(const void* data, size_t count) { - size_t end = mData.size(); - mData.resize( end + count ); - memcpy(&mData[end], data, count); + const uint8_t* ptr = (uint8_t*)data; + mData.insert(mData.end(), ptr, ptr + count); } diff --git a/DLL430_v3/src/TI/DLL430/MessageData.h b/DLL430_v3/src/TI/DLL430/MessageData.h index c483293..ed8ba9d 100644 --- a/DLL430_v3/src/TI/DLL430/MessageData.h +++ b/DLL430_v3/src/TI/DLL430/MessageData.h @@ -3,49 +3,39 @@ * * Encapsulate raw message data for easier access * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_MESSAGE_DATA_H -#define DLL430_MESSAGE_DATA_H - -#include -#include -#include -#include - namespace TI { @@ -62,7 +52,7 @@ namespace TI MessageData(const uint8_t* start, const uint8_t* end); MessageData(std::vector::const_iterator start, std::vector::const_iterator end); - + template MessageData& operator>>(T& t) { @@ -83,18 +73,18 @@ namespace TI bool fail() const; - private: void read(void* dst, size_t count); void write(const void* data, size_t count); + const uint8_t* data() const { return &mData[mReadPos]; } + + private: std::vector mData; size_t mReadPos; bool mFail; }; - typedef boost::shared_ptr MessageDataPtr; - }; -}; - -#endif /* DLL430_MESSAGE_DATA_H */ + typedef std::shared_ptr MessageDataPtr; + } +} diff --git a/DLL430_v3/src/TI/DLL430/MessageQueue.h b/DLL430_v3/src/TI/DLL430/MessageQueue.h index 15c07b1..78c9778 100644 --- a/DLL430_v3/src/TI/DLL430/MessageQueue.h +++ b/DLL430_v3/src/TI/DLL430/MessageQueue.h @@ -1,48 +1,39 @@ /* * MessageQueue.h * - * Copyright (C) 2009 - 2011 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 + * Copyright (C) 2009 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_MESSAGE_QUEUE_H -#define DLL430_MESSAGE_QUEUE_H - - -#include -#include - //MessageQueue is meant to be used with either primitive types or pointers. While it //technically works with any Object that can be default constructed, the preferred @@ -52,18 +43,28 @@ //have several threads waiting for messages, which will only be processed by the first thread //to receive them. +#include +#include + template class MessageQueue { public: + MessageQueue() : mCancelled(false) {} + //While a queue will automatically remove all content on destruction //it is important to not do so while another thread is adding or removing elements ~MessageQueue() { - boost::mutex::scoped_lock l(mMutex); + boost::lock_guard lock(mMutex); + mCancelled = true; while (!mMessages.empty()) { - mMessages.pop(); + size_t i = mMessages.size(); + while (i--) + { + mMessages.pop(); + } } mMessageAvailable.notify_all(); } @@ -71,25 +72,25 @@ class MessageQueue //Will wake up a single receiver to process the queued message void queueMessage(MessageType msg) { - boost::mutex::scoped_lock l(mMutex); + boost::lock_guard lock(mMutex); mMessages.push(msg); mMessageAvailable.notify_one(); } //In case of cancelling, this will return a default constructed message - //(ie. 0, NULL, empty string or depending on the type of MessageType) + //(ie. 0, nullptr, empty string or depending on the type of MessageType) MessageType retrieveMessage() { - boost::mutex::scoped_lock l(mMutex); + boost::unique_lock lock(mMutex); - if (mMessages.empty()) + if (!mCancelled && mMessages.empty()) { - mMessageAvailable.wait(l); + mMessageAvailable.wait(lock); } MessageType msg = MessageType(); - if (!mMessages.empty()) + if (!mCancelled && !mMessages.empty()) { msg = mMessages.front(); mMessages.pop(); @@ -101,7 +102,8 @@ class MessageQueue //Cancel will wake up all threads waiting for a message, so they can exit the retrieveMessage function void cancelWait() { - boost::mutex::scoped_lock l(mMutex); + boost::lock_guard lock(mMutex); + mCancelled = true; mMessageAvailable.notify_all(); } @@ -109,6 +111,6 @@ class MessageQueue boost::condition_variable mMessageAvailable; boost::mutex mMutex; std::queue mMessages; -}; -#endif + bool mCancelled; +}; diff --git a/DLL430_v3/src/TI/DLL430/Mpu.h b/DLL430_v3/src/TI/DLL430/Mpu.h new file mode 100644 index 0000000..7810dab --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/Mpu.h @@ -0,0 +1,60 @@ +/* + * Mpu.h + * + * Interface for MPU. + * + * Copyright (C) 2007 - 2014 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. + */ + +#pragma once + +namespace TI +{ + namespace DLL430 + { + class IMpu + { + public: + virtual ~IMpu() {} + + virtual bool disableIfEnabled(bool killLockBit) = 0; + virtual void restore() = 0; + }; + + class NoMpu : public IMpu + { + public: + bool disableIfEnabled(bool) { return true; } + void restore() {} + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/MpuFRx.cpp b/DLL430_v3/src/TI/DLL430/MpuFRx.cpp new file mode 100644 index 0000000..5eb855b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/MpuFRx.cpp @@ -0,0 +1,174 @@ +/* + * MpuFRx.cpp + * + * Functionality for configuring MPU. + * + * Copyright (C) 2007 - 2014 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. + */ + +#include +#include "ConfigManager.h" +#include "IDeviceHandle.h" +#include "FetHandle.h" +#include "MpuFRx.h" + +using namespace TI::DLL430; + +MpuFRx::MpuFRx(IDeviceHandle* devHandle, IMemoryManager* mm) + : devHandle(devHandle) + , mm(mm) + , MPUCTL0(0) + , MPUCTL0_original(0) +{ +} + + +bool MpuFRx::disableIfEnabled(bool killLockBit) +{ + if (MPUCTL0_original != MPUCTL0) + { + return false; + } + if (!readSettings()) + { + return false; + } + return (MPUCTL0 & 0x1) ? disable(killLockBit) : true; +} + + +bool MpuFRx::readSettings() +{ + // read out mpu settings + + int16_t index = mm->getMemoryAreaIndex(MemoryArea::Peripheral16bit, MPUCTL0_Address, 0x2); + if (index < 0) + { + return false; + } + MemoryArea* peripheral = mm->getMemoryArea(MemoryArea::Peripheral16bit, index); + if (!peripheral) + { + return false; + } + uint8_t tmp[8] = {0}; + if (!peripheral->read(MPUCTL0_Address - peripheral->getStart(), tmp, 8) || !peripheral->sync()) + { + if (!peripheral->read(MPUCTL0_Address - peripheral->getStart(), tmp, 8) || !peripheral->sync()) + { + return false; + } + } + + this->MPUCTL0 = framCtlKey | tmp[0]; + MPUCTL0_original = MPUCTL0; + + return true; +} + +bool MpuFRx::disable(bool killLockBit) +{ + // Check if lock bit of MPU is set + if ((MPUCTL0 & 0x2) == 0x2) + { + if (!killLockBit) + { + //Don't do anything + return true; + } + + if (!removeLockBit()) + { + return false; + } + } + int16_t index = mm->getMemoryAreaIndex(MemoryArea::Peripheral16bit, MPUCTL0_Address, 0x2); + if (index < 0) + { + return false; + } + MemoryArea* peripheral = mm->getMemoryArea(MemoryArea::Peripheral16bit, index); + if (!peripheral) + { + return false; + } + // mpu ist not locked (anymore), disable it set Mpuena = 0 + // write also Fram MPUCTL0 key also into register to gain access + if (!peripheral->write(MPUCTL0_Address - peripheral->getStart(), framCtlKey) || !peripheral->sync()) + { + return false; + } + + const uint16_t backup = MPUCTL0_original; + + this->readSettings(); + + MPUCTL0_original = backup; + + return (MPUCTL0 & 0x1) == 0; +} + +bool MpuFRx::removeLockBit() +{ + IConfigManager* cm = this->devHandle->getFetHandle()->getConfigManager(); + + // assert hard RST/NMI and feed in magic pattern to stop device execution + // thr RST/NMI will remove the register protection + if (!cm->reset(false, true, devHandle->getJtagId(), devHandle->checkHalId(ID_ResetXv2))) + { + return false; + } + // restart jtag connection and if needed feed in JTAG password + if (cm->start() != 0x1) + { + return false; + } + return devHandle->reset(); +} + +void MpuFRx::restore() +{ + if (MPUCTL0_original != MPUCTL0) + { + int16_t index = mm->getMemoryAreaIndex(MemoryArea::Peripheral16bit, MPUCTL0_Address, 0x2); + if (index >= 0) + { + if (MemoryArea* peripheral = mm->getMemoryArea(MemoryArea::Peripheral16bit, index)) + { + if (peripheral->write(MPUCTL0_Address - peripheral->getStart(), MPUCTL0_original) && peripheral->sync()) + { + MPUCTL0 = MPUCTL0_original; + } + } + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/MpuFr5969.h b/DLL430_v3/src/TI/DLL430/MpuFRx.h similarity index 57% rename from DLL430_v3/src/TI/DLL430/MpuFr5969.h rename to DLL430_v3/src/TI/DLL430/MpuFRx.h index 6872e96..019a064 100644 --- a/DLL430_v3/src/TI/DLL430/MpuFr5969.h +++ b/DLL430_v3/src/TI/DLL430/MpuFRx.h @@ -1,79 +1,69 @@ /* - * MpuFr5969.h + * MpuFRx.h * - * Functionality for configuring target device. + * Functionality for configuring MPU. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2014 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 + #pragma once -#endif -#ifndef DLL430_MPUFR5969_H -#define DLL430_MPUFR5969_H +#include "Mpu.h" namespace TI { namespace DLL430 { - class MpuFr5969 + class MpuFRx : public IMpu { public: + MpuFRx(IDeviceHandle* devHandle, IMemoryManager* mm); - MpuFr5969( - DeviceHandleV3* devHandlev, - MemoryManager* mmv - ); - virtual ~MpuFr5969() {}; - - bool calculateMpuBorders(); - bool readMpuSettings(); - bool disableMpu(); - bool isMpuEnabled(); + bool disableIfEnabled(bool killLockBit); + void restore(); private: + bool readSettings(); + bool disable(bool killLockBit); + bool removeLockBit(); + static const uint32_t framCtlKey = 0xA500; static const uint32_t MPUCTL0_Address = 0x000005A0; - static const uint32_t MPUIPC0_Address = 0x05AA; - - DeviceHandleV3* devHandle; - MemoryManager* mm; + + IDeviceHandle* devHandle; + IMemoryManager* mm; // MPU control register 0 uint16_t MPUCTL0; - // MPU control register 1 - uint16_t MPUIPC0; - - + uint16_t MPUCTL0_original; }; - }; -}; -#endif /* DLL430_MPUFR5739_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/MpuFr5739.cpp b/DLL430_v3/src/TI/DLL430/MpuFr5739.cpp deleted file mode 100644 index 188fe32..0000000 --- a/DLL430_v3/src/TI/DLL430/MpuFr5739.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - * MpuFr5739.cpp - * - * Functionality for configuring target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "ConfigManagerV3.h" -#include "DeviceHandleV3.h" -#include "FetHandleV3.h" -#include "MpuFr5739.h" - -using namespace TI::DLL430; - -MpuFr5739::MpuFr5739(DeviceHandleV3* devHandle, MemoryManager* mm) - : devHandle(devHandle), mm(mm) - , MPUCTL0(0), MPUCTL1(0) - , MPUSEG(0), MPUSAM(0) - , mpuBorder1(0), mpuBorder2(0) -{ - -} - -bool MpuFr5739::isMpuEnabled() -{ - readMpuSettings(); - - return (MPUCTL0 & 0x1) != 0; -} - -bool MpuFr5739::calculateMpuBorders() -{ - readMpuSettings(); - - MemoryArea* main = mm->getMemoryArea("main", 0); - MemoryArea* info = mm->getMemoryArea("information", 0); - MemoryArea* bootcode = mm->getMemoryArea("bootcode", 0); - - if (!main || !info || !bootcode) - { - return false; - } - const uint32_t MemorySize = (main->getEnd() - main->getStart() + 1) + - (info->getEnd() - info->getStart() + 1) + - (bootcode->getEnd() - bootcode->getStart() + 1); - const uint32_t segmentSize = MemorySize / 32; - const uint32_t memoryBegin = main->getEnd() - MemorySize + 1; - - this->mpuBorder1 = memoryBegin + (this->MPUSEG & 0x1F) * segmentSize; - this->mpuBorder2 = memoryBegin + ((this->MPUSEG>>8) & 0x1F) * segmentSize; - - return true; -} - -/* this function returns the address and length of data which could be written to a segment, take care of segment boarders etc */ -std::vector MpuFr5739::checkAccessRights(uint32_t address, uint32_t count, MpuAccessType access) -{ - std::vector MpuSegments; - - readMpuSettings(); - - MemoryArea* main = mm->getMemoryArea("main", 0); - MemoryArea* info = mm->getMemoryArea("information", 0); - - if (!main || !info) - { - return MpuSegments; - } - - struct SegmentRange - { - SegmentRange(uint32_t begin = 0, uint32_t end = 0, uint16_t bit = 0) : begin(begin), end(end), accessBit(bit) {} - uint32_t begin, end; - uint16_t accessBit; - }; - - SegmentRange segments[] = - { - SegmentRange( info->getStart(), info->getEnd() + 1, (access << 12) ), - SegmentRange( main->getStart(), mpuBorder1, (access << 0) ), - SegmentRange( mpuBorder1, mpuBorder2, (access << 4) ), - SegmentRange( mpuBorder2, main->getEnd() + 1, (access << 8) ) - }; - const size_t numSegments = sizeof(segments) / sizeof(*segments); - - const uint32_t endAddress = address + count; - - for (size_t i = 0; i < numSegments; ++i) - { - if ( (address < segments[i].end) && (endAddress > segments[i].begin) && (MPUSAM & segments[i].accessBit) ) - { - const uint32_t writeAddress = max(address, segments[i].begin); - const uint32_t writeEndAddress = min(endAddress, segments[i].end); - const uint32_t writeCount = writeEndAddress - writeAddress; - - if (writeCount > 0) - { - MpuSegments.push_back( MpuAccessibleSegments(writeAddress, writeCount) ); - } - } - } - - return MpuSegments; -} - -bool MpuFr5739::readMpuSettings() -{ - /* read out mpu settings*/ - MemoryArea* peripheral = mm->getMemoryArea("peripheral16bit", 0); - if (!peripheral) - { - return false; - } - uint32_t tmp[8] = {0}; - if (!peripheral->read(mpuRegAddress, tmp, 8) || !peripheral->sync()) - { - return false; - } - this->MPUCTL0 = tmp[0] | (tmp[1] << 8); - this->MPUCTL1 = tmp[2] | (tmp[3] << 8); - this->MPUSEG = tmp[4] | (tmp[5] << 8); - this->MPUSAM = tmp[6] | (tmp[7] << 8); - - return true; -} - -bool MpuFr5739::disableMpu() -{ - /* MPU is not enabled just return no error */ - if ((MPUCTL0 & 0x1)==0) - { - return true; - } - /* Check if lock bit of MPU is set */ - if ((MPUCTL0 & 0x3)!=1) - { - ConfigManager* cm = this->devHandle->getFetHandle()->getConfigManager(); - - /* assert hard RST/NMI and feed in magic pattern to stop device execution */ - /* thr RST/NMI will remove the register protection */ - if(!cm->reset(false, 10, 0x91)) - { - return false; - } - /* restart jtag connection and if needed feed in JTAG passowrd */ - if(cm->start() != 0x1) - { - return false; - } - if(!devHandle->reset()) - { - - return false; - } - } - MemoryArea* peripheral = mm->getMemoryArea("peripheral16bit", 0); - if (!peripheral) - { - return false; - } - /* mpu ist not locked (anymore), disable it set Mpuena = 0 */ - /* write also Fram MPUCTL0 key also into register to gain access */ - if (!peripheral->write(mpuRegAddress, framCtlKey)|| !peripheral->sync()) - { - return false; - } - - this->readMpuSettings(); - /* MPU is not enabled just return no error */ - return (MPUCTL0 & 0x1) == 0; -} diff --git a/DLL430_v3/src/TI/DLL430/MpuFr5739.h b/DLL430_v3/src/TI/DLL430/MpuFr5739.h deleted file mode 100644 index bab1e9d..0000000 --- a/DLL430_v3/src/TI/DLL430/MpuFr5739.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * MpuFr5739.h - * - * Functionality for configuring target device. - * - * Copyright (C) 2007 - 2011 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. - */ -#if _MSC_VER > 1000 -#pragma once -#endif -#ifndef DLL430_MPUFR5739_H -#define DLL430_MPUFR5739_H - - -namespace TI -{ - namespace DLL430 - { - enum MpuAccessType { MPU_READ = 1, MPU_WRITE = 2, MPU_EXEC = 4 }; - - struct MpuAccessibleSegments - { - MpuAccessibleSegments(uint32_t address, uint32_t count): address(address), count(count){} - MpuAccessibleSegments(): address(0), count(0){} - - uint32_t address; - uint32_t count; - }; - - class MpuFr5739 - { - public: - - MpuFr5739( - DeviceHandleV3* devHandlev, - MemoryManager* mmv - ); - virtual ~MpuFr5739() {}; - - bool calculateMpuBorders(); - bool readMpuSettings(); - bool disableMpu(); - bool isMpuEnabled(); - - std::vector checkAccessRights(uint32_t address, uint32_t count, MpuAccessType access); - - private : - static const uint32_t framCtlKey = 0xA500; - static const uint32_t mpuRegAddress = 0x000005A0; - - DeviceHandleV3* devHandle; - MemoryManager* mm; - // MPU control register 0 - uint16_t MPUCTL0; - // MPU control register 1 - uint16_t MPUCTL1; - // MPU segmentaition register - uint16_t MPUSEG; - // MPUSAM register - uint16_t MPUSAM; - - uint32_t mpuBorder1; - uint32_t mpuBorder2; - }; - }; -}; -#endif /* DLL430_MPUFR5739_H */ diff --git a/DLL430_v3/src/TI/DLL430/MpuFr5969.cpp b/DLL430_v3/src/TI/DLL430/MpuFr5969.cpp deleted file mode 100644 index 7bb785d..0000000 --- a/DLL430_v3/src/TI/DLL430/MpuFr5969.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * MpuFr5969.cpp - * - * Functionality for configuring target device. - * - * Copyright (C) 2007 - 2011 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. - */ - -#include "ConfigManagerV3.h" -#include "DeviceHandleV3.h" -#include "FetHandleV3.h" -#include "MpuFr5969.h" - -using namespace TI::DLL430; - -MpuFr5969::MpuFr5969(DeviceHandleV3* devHandle, MemoryManager* mm) - : devHandle(devHandle), mm(mm), MPUCTL0(0), MPUIPC0(0) -{ -} - -bool MpuFr5969::isMpuEnabled() -{ - readMpuSettings(); - - return (MPUCTL0 & 0x1) != 0; -} - -bool MpuFr5969::calculateMpuBorders() -{ - return true; -} - -bool MpuFr5969::readMpuSettings() -{ - /* read out mpu settings*/ - MemoryArea* peripheral = mm->getMemoryArea("peripheral16bit", 0); - if (!peripheral) - { - return false; - } - uint32_t tmp[8] = {0}; - // read control register of MPU protection - if (!peripheral->read(MPUCTL0_Address, tmp, 8) || !peripheral->sync()) - { - if (!peripheral->read(MPUCTL0_Address, tmp, 8) || !peripheral->sync()) - { - return false; - } - } - - // set MPUCTL0 - this->MPUCTL0 = tmp[0] | (tmp[1] << 8); - - return true; -} - -bool MpuFr5969::disableMpu() -{ - /* MPU is not enabled just return no error */ - if ((MPUCTL0 & 0x1)==0) - { - return true; - } - /* Check if lock bit of MPU is set */ - if ((MPUCTL0 & 0x3)!=1) - { - ConfigManager* cm = this->devHandle->getFetHandle()->getConfigManager(); - - /* assert hard RST/NMI and feed in magic pattern to stop device execution */ - /* thr RST/NMI will remove the register protection */ - if(!cm->reset(false, 10, 0x91)) - { - return false; - } - /* restart jtag connection and if needed feed in JTAG passowrd */ - if(cm->start() != 0x1) - { - return false; - } - if(!devHandle->reset()) - { - - return false; - } - } - MemoryArea* peripheral = mm->getMemoryArea("peripheral16bit", 0); - if (!peripheral) - { - return false; - } - /* mpu ist not locked (anymore), disable it set Mpuena = 0 */ - /* write also Fram MPUCTL0 key also into register to gain access */ - if (!peripheral->write(MPUCTL0_Address, framCtlKey)|| !peripheral->sync()) - { - return false; - } - - this->readMpuSettings(); - /* MPU is not enabled just return no error */ - return (MPUCTL0 & 0x1) == 0; -} - - - - - - diff --git a/DLL430_v3/src/TI/DLL430/PinSequence.cpp b/DLL430_v3/src/TI/DLL430/PinSequence.cpp new file mode 100644 index 0000000..725558b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/PinSequence.cpp @@ -0,0 +1,92 @@ +/* + * PinSequence.cpp + * + * Wrapper to send JTAG pin sequences + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include "PinSequence.h" +#include "FetHandle.h" +#include "HalExecElement.h" +#include "HalExecCommand.h" + +using namespace std; +using namespace TI::DLL430; + + +PinState::PinState(JTAG_PIN pin, bool set, uint16_t delay) + : mask(1<& pinStates, FetHandle* handle) +{ + HalExecElement* el = new HalExecElement(ID_BitSequence); + el->appendInputData8( (uint8_t)pinStates.size() ); + + for (const auto& it : pinStates) + { + el->appendInputData16( it.states ); + el->appendInputData16( it.mask ); + el->appendInputData16( it.delay ); + } + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + return handle->send(cmd); +} diff --git a/DLL430_v3/src/TI/DLL430/PinSequence.h b/DLL430_v3/src/TI/DLL430/PinSequence.h new file mode 100644 index 0000000..664e203 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/PinSequence.h @@ -0,0 +1,70 @@ +/* + * PinSequence.cpp + * + * Wrapper to send JTAG pin sequences + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include + +#include "IFetHandle.h" + +#include "FetHandle.h" +#include "HalExecElement.h" +#include "HalExecCommand.h" + +namespace TI +{ + namespace DLL430 + { + class FetHandle; + + class PinState + { + public: + PinState(JTAG_PIN pin, bool set, uint16_t delay = 0); + + PinState& operator()(JTAG_PIN pin, bool set); + + PinState& setDelay(uint16_t ms); + + uint16_t mask; + uint16_t states; + uint16_t delay; + }; + + bool sendPinSequence(const std::list& pinStates, FetHandle* handle); + } +} diff --git a/DLL430_v3/src/TI/DLL430/PollingManager.cpp b/DLL430_v3/src/TI/DLL430/PollingManager.cpp new file mode 100644 index 0000000..dd990ec --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/PollingManager.cpp @@ -0,0 +1,376 @@ +/* + * PollingManager.cpp + * + * Manages the various polling macros and their combinations. + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include "PollingManager.h" +#include "DeviceHandleMSP430.h" +#include "FetHandle.h" +#include + + +using namespace TI::DLL430; + + +PollingManager::PollingManager(FetHandle* fetHandle) + : mFetHandle(fetHandle) + , mEnergyTraceMode(ET_POLLING_OFF) + , mEtGatedMode(ET_POLLING_GATED_OFF) +{ + //Set base macros for polling types + mPollingMacro[PT_BREAKPOINT] = ID_WaitForEem; + mPollingMacro[PT_LPM] = ID_PollJStateReg; + mPollingMacro[PT_STATE_STORAGE] = ID_WaitForStorage; + + //Mapping Energy Trace modes to polling macros + mEtModeToMacro[ET_POLLING_ANALOG] = ID_PollJStateRegEt8; + mEtModeToMacro[ET_POLLING_ANALOG_DSTATE] = ID_PollJStateReg; + mEtModeToMacro[ET_POLLING_ANALOG_DSTATE_PC] = ID_PollDStatePCRegEt; + + //Initialize event handling + mEventNotifier.setEventHandler( std::bind(&PollingManager::runEvent, this, std::placeholders::_1) ); + mEventNotifier.startProcessingEvents(); +} + +void PollingManager::shutdown() +{ + mEventNotifier.stopProcessingEvents(); +} + +bool PollingManager::startBreakpointPolling(const IDeviceHandle& devHandle) +{ + const hal_id macro = devHandle.checkHalId(ID_WaitForEem); + + //Breakpoint polling can turn itself off, which will set response id to 0 + //If polling automatically stopped, set to inactive and remove before restarting + boost::lock_guard lock(mMutexActiveMacros); + MacroTable::iterator it = mActiveMacros.find(macro); + if (it != mActiveMacros.end() && it->second.cmd->getResponseId() == 0) + { + mPollingActive[PT_BREAKPOINT] = false; + if (!removeMacro(macro)) + { + return false; + } + } + + return startPolling(PT_BREAKPOINT, devHandle); +} + +bool PollingManager::stopBreakpointPolling(const IDeviceHandle& devHandle) +{ + return stopPolling(PT_BREAKPOINT, devHandle); +} + +bool PollingManager::startLpmPolling(const IDeviceHandle& devHandle) +{ + boost::lock_guard lock(mMutexActiveMacros); + return startPolling(PT_LPM, devHandle); +} + +bool PollingManager::stopLpmPolling(const IDeviceHandle& devHandle) +{ + return stopPolling(PT_LPM, devHandle); +} + +bool PollingManager::startStateStoragePolling(const IDeviceHandle& devHandle) +{ + boost::lock_guard lock(mMutexActiveMacros); + return startPolling(PT_STATE_STORAGE, devHandle); +} + +bool PollingManager::stopStateStoragePolling(const IDeviceHandle& devHandle) +{ + return stopPolling(PT_STATE_STORAGE, devHandle); +} + + +bool PollingManager::startPolling(POLLING_TYPE type, const IDeviceHandle& devHandle) +{ + //Check if not already active, determine device specific macro and add to loop + if (!mPollingActive[type]) + { + const hal_id macro = devHandle.checkHalId(mPollingMacro[type]); + mPollingActive[type] = true; + return addMacro(macro); + } + return true; +} + +bool PollingManager::stopPolling(POLLING_TYPE type, const IDeviceHandle& devHandle) +{ + //If active, determine device specific macro and disable + boost::lock_guard lock(mMutexActiveMacros); + if (mPollingActive[type]) + { + const hal_id macro = devHandle.checkHalId(mPollingMacro[type]); + mPollingActive[type] = false; + return removeMacro(macro); + } + return true; +} + + +bool PollingManager::startEnergyTracePolling(EtPollingMode mode, EtGatedMode gating) +{ + //If currently off and have macro for polling mode, set configuration and add to loop + if (mEnergyTraceMode == ET_POLLING_OFF) + { + const hal_id macroId = mEtModeToMacro[mode]; + if (macroId != 0) + { + mEnergyTraceMode = mode; + mEtGatedMode = gating; + return addMacro(macroId); + } + } + //Only return error if trying to set a different mode without disabling first + return (mEnergyTraceMode == mode); +} + +bool PollingManager::stopEnergyTracePolling() +{ + boost::lock_guard lock(mMutexActiveMacros); + const hal_id macroId = mEtModeToMacro[mEnergyTraceMode]; + if (macroId != 0) + { + mEnergyTraceMode = ET_POLLING_OFF; + return removeMacro(macroId); + } + return false; +} + + +bool PollingManager::addMacro(hal_id macroId) +{ + //If already in loop, kill it first, so it will restart with new parameters + Macro& macro = mActiveMacros[macroId]; + if ((macro.count++ > 0) && (macro.cmd->getResponseId() > 0)) + { + if (!mFetHandle->kill(*macro.cmd)) + { + return false; + } + } + return addToLoop(macroId); +} + +bool PollingManager::removeMacro(hal_id macroId) +{ + MacroTable::iterator it = mActiveMacros.find(macroId); + if (it != mActiveMacros.end()) + { + //Kill and restart with new parameters if still active + //Otherwise remove from table of active macros + if (it->second.cmd->getResponseId() > 0) + { + if (!mFetHandle->kill(*it->second.cmd)) + { + return false; + } + } + + if (--it->second.count == 0) + { + mActiveMacros.erase(it); + } + else + { + return addToLoop(macroId); + } + } + return true; +} + +bool PollingManager::addToLoop(hal_id macroId) +{ + const uint16_t eemBpMask = 0x80; + + HalExecElement* el = nullptr; + switch (macroId) + { + case ID_PollJStateReg: + case ID_PollJStateReg20: + case ID_PollJStateRegEt8: + case ID_PollDStatePCRegEt: + case ID_PollJStateRegFR57xx: + //Parameters for jstate polling have been set by calling functions + el = new HalExecElement(macroId); + el->appendInputData16(0); //ForceSendState (only for direct execution, not loop) + el->appendInputData16(mPollingActive[PT_BREAKPOINT]); + el->appendInputData16(mPollingActive[PT_LPM]); + el->appendInputData16(mEnergyTraceMode == ET_POLLING_ANALOG_DSTATE || mEnergyTraceMode == ET_POLLING_ANALOG_DSTATE_PC); + el->appendInputData16((uint16_t)mEtGatedMode); + break; + + case ID_WaitForEem: + el = new HalExecElement(macroId); + el->appendInputData16(eemBpMask); + break; + + case ID_WaitForStorage: + case ID_WaitForStorageX: + case ID_WaitForDebugHaltArm: + el = new HalExecElement(macroId); + break; + + default: break; + } + + if (el) + { + //Get/create command, configure and send + HalExecCommand& cmd = *mActiveMacros[macroId].cmd; + cmd.setCallBack( std::bind(&PollingManager::queueEvent, this, std::placeholders::_1), 0 ); + cmd.setAsyncMode(!mKillAfterEvent[macroId]); + + cmd.elements.clear(); + cmd.elements.emplace_back(el); + return mFetHandle->getControl()->send(cmd); + } + return false; +} + +uint8_t PollingManager::getResponseId(hal_id baseMacroId, const IDeviceHandle& devHandle) const +{ + MacroTable::const_iterator it = mActiveMacros.find( devHandle.checkHalId(baseMacroId) ); + return (it != mActiveMacros.end()) ? it->second.cmd->getResponseId() : 0; +} + + +void PollingManager::pauseStateStoragePolling(const IDeviceHandle& devHandle) +{ + pausePolling(PT_STATE_STORAGE, devHandle); +} + +void PollingManager::resumeStateStoragePolling(const IDeviceHandle& devHandle) +{ + resumePolling(PT_STATE_STORAGE, devHandle); +} + +void PollingManager::pausePolling(POLLING_TYPE type, const IDeviceHandle& devHandle) +{ + boost::lock_guard lock(mMutexActiveMacros); + const hal_id macroId = mPollingMacro[type]; + if (const uint8_t id = getResponseId(macroId, devHandle)) + { + mFetHandle->pauseLoopCmd(id); + } +} + +void PollingManager::resumePolling(POLLING_TYPE type, const IDeviceHandle& devHandle) +{ + boost::lock_guard lock(mMutexActiveMacros); + const hal_id macroId = mPollingMacro[type]; + if (const uint8_t id = getResponseId(macroId, devHandle)) + { + mFetHandle->resumeLoopCmd(id); + } +} + +void PollingManager::pausePolling() +{ + boost::lock_guard lock(mMutexActiveMacros); + for (const MacroTable::value_type& entry : mActiveMacros) + { + //Don't pause analog energy trace macro + if (entry.first == ID_PollJStateRegEt8) + { + continue; + } + + if (const uint8_t id = entry.second.cmd->getResponseId()) + { + mFetHandle->pauseLoopCmd(id); + } + } +} + +void PollingManager::resumePolling() +{ + boost::lock_guard lock(mMutexActiveMacros); + for (const MacroTable::value_type& entry : mActiveMacros) + { + if (const uint8_t id = entry.second.cmd->getResponseId()) + { + mFetHandle->resumeLoopCmd(id); + } + } +} + +void PollingManager::setBreakpointCallback(const Callback& callback) +{ + mCallbacks[BP_HIT_FLAG] = callback; +} + +void PollingManager::setLpmCallback(const Callback& callback) +{ + mCallbacks[JSTATE_CAPTURE_FLAG] = callback; +} + +void PollingManager::setStateStorageCallback(const Callback& callback) +{ + mCallbacks[STATE_STORAGE_FLAG] = callback; + mCallbacks[VARIABLE_WATCH_FLAG] = callback; +} + +void PollingManager::setEnergyTraceCallback(const Callback& callback) +{ + mCallbacks[ENERGYTRACE_INFO] = callback; +} + +void PollingManager::queueEvent(MessageDataPtr messageData) +{ + mEventNotifier.queueEvent(messageData); +} + +void PollingManager::runEvent(MessageDataPtr messageData) const +{ + uint16_t eventMask = 0; + (*messageData) >> eventMask; + + messageData->reset(); + + //Check callback table for matching entries and execute if valid + for (const CallbackTable::value_type& entry : mCallbacks) + { + if ((eventMask & entry.first) && entry.second) + { + entry.second(messageData); + } + } +} diff --git a/DLL430_v3/src/TI/DLL430/PollingManager.h b/DLL430_v3/src/TI/DLL430/PollingManager.h new file mode 100644 index 0000000..00c1953 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/PollingManager.h @@ -0,0 +1,180 @@ +/* + * PollingManager.h + * + * Manages the various polling macros and their combinations. + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "HalExecCommand.h" +#include "MessageData.h" +#include "EventNotifier.h" +#include + +/* + Polling is encapsulated in this class to transparently handle situations + where multiple kinds of polling are performed by the same macro. For example, + ID_PollJStateReg is used to poll for breakpoints, LPMx.5 and Energy Trace. + + This makes it necessary to keep track of what a macro is polling for and which + macro is used for a particular device (not all devices are polling for + breakpoints in ID_PollJStateReg). + + Usage: + -Configure callbacks for different events (ex. breakpoints) + void breakpointCallback(MessageDataPtr data) {...} + + pollingManager.setBreakpointCallback(breakpointCallback); + + For member functions as callbacks, use std::bind + pollingManager.setBreakpointCallback( bind(&MyClass::callback, instance, _1) ); + + -Start polling (this will add a macro to the polling loop or modify an existing one) + pollingManager.startBreakpointPolling(deviceHandle); + + -pause/resume polling will pause/resume all polling loops, + only State Storage polling can currently be paused separately. + Pausing only skips macros in the loop, they are not removed. + pollingManager.pausePolling(); + pollingManager.resumeStateStoragePolling(deviceHandle); + pollingManager.resumePolling(); + + -Stop polling (remove macro from loop or modify existing one) + pollingManager.stopBreakpointPolling(deviceHandle); +*/ + +namespace TI +{ + namespace DLL430 + { + enum EtPollingMode + { + ET_POLLING_OFF, + ET_POLLING_ANALOG, + ET_POLLING_ANALOG_DSTATE, + ET_POLLING_ANALOG_DSTATE_PC, + }; + + enum EtGatedMode + { + ET_POLLING_GATED_OFF, + ET_POLLING_GATED_ON + }; + + class IDeviceHandle; + class FetHandle; + + class PollingManager + { + public: + typedef std::function Callback; + + explicit PollingManager(FetHandle* fetHandle); + + PollingManager(const PollingManager&) = delete; + PollingManager& operator=(const PollingManager&) = delete; + + void shutdown(); + + bool startBreakpointPolling(const IDeviceHandle& devHandle); + bool startLpmPolling(const IDeviceHandle& devHandle); + bool startStateStoragePolling(const IDeviceHandle& devHandle); + bool startEnergyTracePolling(EtPollingMode, EtGatedMode); + + bool stopBreakpointPolling(const IDeviceHandle& devHandle); + bool stopLpmPolling(const IDeviceHandle& devHandle); + bool stopStateStoragePolling(const IDeviceHandle& devHandle); + bool stopEnergyTracePolling(); + + void pausePolling(); //Pause all polling loops + void pauseStateStoragePolling(const IDeviceHandle&); + + void resumePolling(); //Resume all polling loops + void resumeStateStoragePolling(const IDeviceHandle&); + + void setEnergyTraceCallback(const Callback&); + void setBreakpointCallback(const Callback&); + void setLpmCallback(const Callback&); + void setStateStorageCallback(const Callback&); + + void queueEvent(MessageDataPtr messageData); + + private: + enum POLLING_TYPE {PT_BREAKPOINT, PT_LPM, PT_STATE_STORAGE, PT_ENERGY_TRACE}; + + bool startPolling(POLLING_TYPE, const IDeviceHandle&); + bool stopPolling(POLLING_TYPE, const IDeviceHandle&); + + void pausePolling(POLLING_TYPE, const IDeviceHandle&); + void resumePolling(POLLING_TYPE, const IDeviceHandle&); + + void runEvent(MessageDataPtr messageData) const; + + bool addMacro(hal_id macroId); + bool removeMacro(hal_id macroId); + + bool addToLoop(hal_id macroId); + + uint8_t getResponseId(hal_id baseMacroId, const IDeviceHandle&) const; + + FetHandle* mFetHandle; + + std::map mPollingActive; + std::map mPollingMacro; + + EtPollingMode mEnergyTraceMode; + EtGatedMode mEtGatedMode; + + struct Macro + { + Macro() : count(0), cmd(new HalExecCommand) {} + int count; + //Can't be copied due to contained std::mutex + std::shared_ptr cmd; + }; + typedef std::map MacroTable; + MacroTable mActiveMacros; + + typedef std::map CallbackTable; + CallbackTable mCallbacks; + + std::map mKillAfterEvent; + std::map mEtModeToMacro; + + EventNotifier mEventNotifier; + + boost::mutex mMutexActiveMacros; + }; + } +} diff --git a/DLL430_v3/include/DLL430/PortInfo.h b/DLL430_v3/src/TI/DLL430/PortInfo.h similarity index 52% rename from DLL430_v3/include/DLL430/PortInfo.h rename to DLL430_v3/src/TI/DLL430/PortInfo.h index 893e2f3..74ea647 100644 --- a/DLL430_v3/include/DLL430/PortInfo.h +++ b/DLL430_v3/src/TI/DLL430/PortInfo.h @@ -1,50 +1,42 @@ /* - * PortInfo.h + * PortInfo.h * * Information about a physical communication port. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_PORTINFO_H -#define DLL430_PORTINFO_H - -#include -#include -#include namespace TI { @@ -58,48 +50,33 @@ namespace TI * Human Interface Devices protocol) or LPT (for devices * using the parallel port) and a number as postfix. */ - class DLL430_SYMBOL PortInfo + struct PortInfo { - PortInfo(const PortInfo&); - void operator=(const PortInfo&); - public: - enum Status{freeForUse, inUseByAnotherInstance}; - PortInfo(){} - virtual ~PortInfo () {}; - - /** \brief get the name of the port - * - * \return pointer to the port name - */ - virtual const char* getName () = 0; + enum Status {freeForUse, inUseByAnotherInstance}; + enum Type { UNKNOWN, CDC, HID, BSL }; - /** \brief get the name of the interface - * - * \return pointer to the port name - */ - virtual const char* getInterfaceName () = 0; + PortInfo() : name(""), path(""), type(UNKNOWN), serial(""), status(freeForUse), useCrc(false), useFlowControl(false) {} - /** \brief open an interface to an external (USB) device - * - * \return true on success - */ - virtual bool open () = 0; + PortInfo(const std::string& name, const std::string& path, Type type, const std::string& serial = "") + : name(name) + , path(path) + , type(type) + , serial(serial) + , status(freeForUse) + , useCrc(false) + , useFlowControl(false) + { + } - /** \brief close an interface to an external (USB) device - * - * \return true on success - */ - virtual bool close () = 0; - - /** \brief return the status of the port - * - * \return status - */ - virtual long getStatus () = 0; + std::string name; + std::string path; + Type type; + std::string serial; + Status status; + bool useCrc; + bool useFlowControl; }; - typedef std::map PortMap; - }; -}; - -#endif /* DLL430_PORTINFO_H */ + typedef std::map PortMap; + } +} diff --git a/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.cpp index e12c184..580ead3 100644 --- a/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.cpp +++ b/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.cpp @@ -3,85 +3,86 @@ * * Memory class for accessing RAM. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "RandomMemoryAccess.h" #include "HalExecCommand.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; -RandomMemoryAccess::RandomMemoryAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, +RandomMemoryAccess::RandomMemoryAccess ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, - const bool isProtected, - MemoryManager* mm, + const bool isProtected, + IMemoryManager* mm, uint8_t psa) - : MemoryAreaBase(name,devHandle,start,end,seg,banks,mapped,isProtected,psa), mm(mm) -{ -} - -RandomMemoryAccess::~RandomMemoryAccess () + : MemoryAreaBase(name, devHandle, start, end, seg, banks, mapped, isProtected, psa), mm(mm) { } -bool RandomMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t count) +bool RandomMemoryAccess::doWrite (uint32_t address, const uint8_t* buffer, size_t count) { if (count > this->getSize()) return false; - uint32_t start_val = 0; - const uint32_t end_adr = address + count; + uint8_t start_val = 0; + const uint32_t end_adr = address + static_cast(count); size_t paddedCount = count; - if(address & 1) + if (address & 1) { ++paddedCount; - if( !doRead(address - 1, &start_val, 1) || !sync() ) + if (!doRead(address - 1, &start_val, 1) || !sync()) + { return false; + } } - uint32_t end_val = 0; - if(end_adr & 1) + uint8_t end_val = 0; + if (end_adr & 1) { ++paddedCount; - if( !doRead(end_adr, &end_val, 1) || !sync() ) + if (!doRead(end_adr, &end_val, 1) || !sync()) + { return false; + } } HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); @@ -91,7 +92,7 @@ bool RandomMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t cou el->appendInputData32(static_cast(address & 0xfffffffe)); el->appendInputData32(static_cast(paddedCount / 2)); - if(address & 1) + if (address & 1) { el->appendInputData8(static_cast(start_val)); } @@ -99,90 +100,36 @@ bool RandomMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t cou { el->appendInputData8(static_cast(buffer[i])); } - if (end_adr & 1) + if (end_adr & 1) { el->appendInputData16(static_cast(end_val)); } - el->setInputMinSize(8); // at least address and size (4+4) - this->elements.push_back(el); + this->elements.emplace_back(el); return true; } -bool RandomMemoryAccess::writeBytes (uint32_t address, uint32_t* buffer, size_t count) +bool RandomMemoryAccess::writeBytes(uint32_t address, const uint8_t* buffer, size_t count) { HalExecElement* el = new HalExecElement(ID_WriteMemBytes); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast(count)); - for (size_t i = 0; i < count; ++i) + for (size_t i = 0; i < count; ++i) { - if (buffer[i] > 0xFF) - { - delete el; - return false; - } el->appendInputData8(static_cast(buffer[i])); } - el->setInputMinSize(9); - this->elements.push_back(el); - return true; -} - -/** each buffer element contains one _byte_ */ -bool RandomMemoryAccess::writeWords (uint32_t address, uint32_t* buffer, size_t count) -{ - if (address & 0x1) - return false; - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - for (size_t i = 0; i+1 < count; i += 2) - { - if (buffer[i] > 0xFF || buffer[i+1] > 0xFF) - { - delete el; - return false; - } - el->appendInputData16(static_cast(buffer[i] | (buffer[i+1] << 8))); - } - el->setInputMinSize(10); - this->elements.push_back(el); + this->elements.emplace_back(el); return true; } bool RandomMemoryAccess::doWrite (uint32_t address, uint32_t value) { - return this->writeBytes(address, &value, 1); + return this->writeBytes(address, (uint8_t*)&value, 1); } -bool RandomMemoryAccess::postSync (const HalExecCommand& cmd) +bool RandomMemoryAccess::postSync(const HalExecCommand& cmd) { - for (size_t i = 1; i < cmd.elements.size(); ++i) - { - ReadElement_map::iterator it = this->readMap.find(i-1); - if (it != this->readMap.end()) - { - ReadElement r = it->second; - size_t size = r.size; - if (r.omitLast) - --size; - - const HalExecElement& el = cmd.elements.at(i); - - for (size_t i = 0, k = (r.omitFirst? 1: 0); k < size; ++k, ++i) - { - r.v_buffer[i] = el.getOutputAt8(k); - } - this->readMap.erase(it); - } - } - return true; + return MemoryAreaBase::postSync(cmd); } - -bool RandomMemoryAccess::isReadOnly () -{ - return false; -} - diff --git a/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.h b/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.h index d3fdaf7..55b7352 100644 --- a/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.h +++ b/DLL430_v3/src/TI/DLL430/RandomMemoryAccess.h @@ -3,89 +3,76 @@ * * Memory class for accessing RAM. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_RANDOMMEMORYACCESS_H -#define DLL430_RANDOMMEMORYACCESS_H - - #include "MemoryAreaBase.h" -#include namespace TI { namespace DLL430 { - class DeviceHandleV3; + class IDeviceHandle; class RandomMemoryAccess : public MemoryAreaBase { public: - RandomMemoryAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + RandomMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, + IMemoryManager* mm, uint8_t psa); - virtual ~RandomMemoryAccess (); - virtual bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - virtual bool doWrite (uint32_t address, uint32_t value); + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doWrite(uint32_t address, uint32_t value) OVERRIDE; + + virtual bool erase() OVERRIDE { return true; } + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE{ return true; } - virtual bool isReadOnly(); - - virtual bool erase () { return true; } - bool erase (uint32_t start, uint32_t end) { return true; } - protected: - bool postSync (const HalExecCommand&); + bool postSync(const HalExecCommand&) OVERRIDE; - MemoryManager* mm; + IMemoryManager* mm; private: - bool writeBytes (uint32_t address, uint32_t* buffer, size_t count); - bool writeWords (uint32_t address, uint32_t* buffer, size_t count); + bool writeBytes(uint32_t address, const uint8_t* buffer, size_t count); }; - }; -}; - -#endif /* DLL430_RANDOMMEMORYACCESS_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/ReadonlyMemoryAccess.h b/DLL430_v3/src/TI/DLL430/ReadonlyMemoryAccess.h index 4e76214..4194d35 100644 --- a/DLL430_v3/src/TI/DLL430/ReadonlyMemoryAccess.h +++ b/DLL430_v3/src/TI/DLL430/ReadonlyMemoryAccess.h @@ -3,76 +3,68 @@ * * Memory class for accessing ROM. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_READONLYMEMORYACCESS_H -#define DLL430_READONLYMEMORYACCESS_H #include "RandomMemoryAccess.h" -#include namespace TI { namespace DLL430 { - class DeviceHandleV3; + class IDeviceHandle; class ReadonlyMemoryAccess : public RandomMemoryAccess { public: ReadonlyMemoryAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, const bool isProtected, - MemoryManager* mm, + IMemoryManager* mm, uint8_t psa) - : RandomMemoryAccess(name,devHandle, start,end,seg,banks,mapped,isProtected,mm,psa) {} - ~ReadonlyMemoryAccess () {} + : RandomMemoryAccess(name, devHandle, start, end, seg, banks, mapped, isProtected, mm, psa) {} - bool isReadOnly() {return true; } + virtual bool isReadOnly() const OVERRIDE { return true; } - bool doWrite (uint32_t address, uint32_t* buffer, size_t count) { return true; } - bool doWrite (uint32_t address, uint32_t value) { return true; } + bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE { return false; } + bool doWrite(uint32_t address, uint32_t value) OVERRIDE { return false; } }; - }; -}; - -#endif /* DLL430_READONLYMEMORYACCESS_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/Record.cpp b/DLL430_v3/src/TI/DLL430/Record.cpp index 87c318b..91574b7 100644 --- a/DLL430_v3/src/TI/DLL430/Record.cpp +++ b/DLL430_v3/src/TI/DLL430/Record.cpp @@ -1,41 +1,44 @@ /* * Record.cpp * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - + +#include #include "Record.h" +#include + + using namespace TI::DLL430; //provides access to Record Code Array @@ -48,57 +51,24 @@ Record::Record(const uint16_t* data, const uint32_t* address, const uint32_t* le : data(data) , address(address) , length(length) -, sectCount(sections) -, currentSect(1) -, currentWord(1) +, sectionCount(sections) +, currentSection(0) +, currentWord(0) { } //params: none //returns: true, if there's a next word in current section -bool Record::sectHasNextWord() +bool Record::sectionHasNextWord() const { - uint32_t maxPos = comMaxPos(currentSect); - - if(currentWord <= maxPos) - { - return true; - } - else - { - return false; - } + return currentWord < sectionEnd(currentSection); } //params: none //returns: true, if there's a next section -bool Record::hasNextSect() -{ - if(currentSect <= sectCount) - { - return true; - } - else - { - return false; - } -} - -//params: section -//returns: sets current section to given section -// (nextWord returns the first word in section) -bool Record::setSection(uint32_t sect) +bool Record::hasNextSection() const { - if(sect > 0 && sect <= sectCount) - { - currentSect = sect; - currentWord = comMaxPos(sect-1) + 1; - return true; - } - else - { - return false; - } + return currentSection < sectionCount; } //params: none @@ -106,10 +76,9 @@ bool Record::setSection(uint32_t sect) // (nextWord returns the first word in the new section) bool Record::nextSection() { - if(this->hasNextSect()) + if (this->hasNextSection()) { - currentWord = comMaxPos(currentSect) + 1; - currentSect++; + currentWord = sectionEnd(currentSection++); return true; } return false; @@ -119,170 +88,77 @@ bool Record::nextSection() //returns: current word in section uint16_t Record::getNextWord() { - uint16_t retWord = data[currentWord - 1]; - currentWord++; - return retWord; + return data[currentWord++]; } //params: address -//params: if data contains given address, +//params: if data contains given address, //returns: true, if data contains given address -bool Record::getWordAtAdr(uint32_t searchAdr, uint16_t* retWord) +bool Record::getWordAtAdr(uint32_t searchAdr, uint16_t* retWord) const { - bool isSectFound = false; - uint32_t foundSect = 0; - uint32_t actSect = 1; - uint32_t tmpSearchAdr; + const uint16_t *sectorPtr = data; - while(actSect < sectCount && !isSectFound) - { - uint32_t sectStart = address[actSect-1]; - uint32_t sectEnd = sectStart + (length[actSect-1]); - - tmpSearchAdr = (searchAdr - sectStart)/2 + sectStart; - - if((tmpSearchAdr <= sectEnd) && (tmpSearchAdr >= sectStart)) + for (uint32_t section = 0; section < sectionCount; ++section) + { + if (address[section] <= searchAdr) { - foundSect = actSect; - isSectFound = true; + const uint32_t dataOffset = (searchAdr - address[section]) / 2; + if (dataOffset < length[section]) + { + *retWord = sectorPtr[dataOffset]; + return true; + } } - actSect++; - } - if(isSectFound) - { - uint32_t offset = tmpSearchAdr - address[foundSect-1]; - *retWord = data[comMaxPos(foundSect - 1) + offset]; - return true; - } - else - { - return false; + sectorPtr += length[section]; } + return false; } //params: none //returns: physical start address of current section -uint32_t Record::getSectStartAdr() -{ - return this->getSectStartAdr(currentSect); -} - -//params: section -//returns: physical start address of given section -uint32_t Record::getSectStartAdr(uint32_t sect) -{ - if(sect > 0 && sect <= sectCount) - { - return address[sect-1]; - } - else - { - return 0; - } -} - -//params: none -//returns: current position in words -uint32_t Record::getCurrentPosWord() +uint32_t Record::getSectionStartAdr() const { - return currentWord; + return (currentSection < sectionCount) ? address[currentSection] : 0; } //params: none //returns: current position in bytes -uint32_t Record::getCurrentPosByte() +uint32_t Record::getCurrentPosByte() const { - return currentWord*2; -} - -uint32_t Record::getPosWordinSect() -{ - if(currentSect == 1) - { - return currentWord; - } - else - { - return (currentWord - comMaxPos(currentSect-1) + 1); - } -} - -//params: none -//returns: current section -uint32_t Record::getCurrentSect() -{ - return currentSect; + return currentWord * 2; } //params: none //returns: length of current section in words -uint32_t Record::getSectLength() -{ - return this->getSectLength(currentSect); -} - -//params: none -//returns: length of current section in bytes -uint32_t Record::getSectByteLength() +uint32_t Record::getSectionLength() const { - return this->getSectLength()*2; -} - -//params: section -//returns: length of given section -uint32_t Record::getSectLength(uint32_t sect) -{ - if(sect > 0 && sect <= sectCount) - { - return length[sect-1]; - } - else - { - return 0; - } + return (currentSection < sectionCount) ? length[currentSection] : 0; } //params: none //returns: number of all sections in array -uint32_t Record::getSectCount() +uint32_t Record::getSectionCount() const { - return sectCount; + return sectionCount; } //params: none //returns: number of all words in data array -uint32_t Record::getNumOfAllDataWords() +uint32_t Record::getNumOfAllDataWords() const { - uint32_t numWords = 0; - - for(uint32_t i = 1; i<= sectCount; i++) - { - numWords += length[i-1]; - } - return numWords; + return std::accumulate(length, length + sectionCount, 0); } //params: true, if core signature will be added to output //returns: number of additional words for section-address and -length -uint32_t Record::getNumOfManageWords(bool hasCoreSignature) +uint32_t Record::getNumOfManageWords() const { - uint32_t manageWords = sectCount*2 + 1; - if(hasCoreSignature) - { - manageWords += 2; - } - return manageWords; + return sectionCount * 2 + 1; } //params: section //returns: absolute position of last word in section -uint32_t Record::comMaxPos(uint32_t sect) +uint32_t Record::sectionEnd(uint32_t section) const { - uint32_t offset = 0; - - for(uint32_t i = 1; i<= sect; i++) - { - offset += length[i-1]; - } - return offset; + return std::accumulate(length, length + section + 1, 0); } diff --git a/DLL430_v3/src/TI/DLL430/Record.h b/DLL430_v3/src/TI/DLL430/Record.h index 17139c2..5e6b656 100644 --- a/DLL430_v3/src/TI/DLL430/Record.h +++ b/DLL430_v3/src/TI/DLL430/Record.h @@ -3,46 +3,40 @@ * * Handles access to different memory modules by means of address. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif - -#ifndef RECORD_H -#define RECORD_H -#include namespace TI { @@ -52,44 +46,29 @@ namespace TI class Record { public: - Record(const uint16_t* data, const uint32_t* address, const uint32_t* length, const uint32_t sections); - - const static uint32_t coreSignature = 0xFEDF2112; - bool sectHasNextWord(); - bool hasNextSect(); + bool sectionHasNextWord() const; + bool hasNextSection() const; bool nextSection(); - bool setSection(uint32_t sect); - bool getWordAtAdr(uint32_t address, uint16_t* retWord); + bool getWordAtAdr(uint32_t address, uint16_t* retWord) const; uint16_t getNextWord(); - uint32_t getSectStartAdr(); - uint32_t getSectStartAdr(uint32_t sect); - uint32_t getCurrentPosWord(); - uint32_t getCurrentPosByte(); - uint32_t getPosWordinSect(); - uint32_t getCurrentSect(); - uint32_t getSectLength(); - uint32_t getSectLength(uint32_t sect); - uint32_t getSectByteLength(); - uint32_t getSectCount(); - uint32_t getNumOfAllDataWords(); - uint32_t getNumOfManageWords(bool hasCoreSignature); + uint32_t getSectionStartAdr() const; + uint32_t getCurrentPosByte() const; + uint32_t getSectionLength() const; + uint32_t getSectionCount() const; + uint32_t getNumOfAllDataWords() const; + uint32_t getNumOfManageWords() const; private: - const uint16_t* data; const uint32_t* address; const uint32_t* length; - const uint32_t sectCount; - uint32_t currentSect; + const uint32_t sectionCount; + uint32_t currentSection; uint32_t currentWord; - uint32_t comMaxPos(uint32_t sect); - uint32_t comStartPos(uint32_t sect); - + uint32_t sectionEnd(uint32_t section) const; }; - }; -}; - -#endif + } +} diff --git a/DLL430_v3/src/TI/DLL430/RegisterAccessBase.cpp b/DLL430_v3/src/TI/DLL430/RegisterAccessBase.cpp index e61f632..42c5b36 100644 --- a/DLL430_v3/src/TI/DLL430/RegisterAccessBase.cpp +++ b/DLL430_v3/src/TI/DLL430/RegisterAccessBase.cpp @@ -3,95 +3,77 @@ * * Base class for all memory classes which access some type of register. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "RegisterAccessBase.h" -#include #include "HalExecCommand.h" -#include "DeviceHandleV3.h" +#include "IDeviceHandle.h" using namespace TI::DLL430; RegisterAccess::RegisterAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, uint8_t bits, const std::vector& mask ) - : MemoryAreaBase(name,devHandle,start,end,seg,banks,mapped,false/*isProtected*/ ,0xff) + : MemoryAreaBase(name, devHandle, start, end, seg, banks, mapped, false/*isProtected*/, 0xff) , bits(bits), mask(mask) { } -bool RegisterAccess::doRead(uint32_t address, uint32_t* buffer, size_t count) +bool RegisterAccess::doRead(uint32_t address, uint8_t* buffer, size_t count) { - bool omitFirst = (address & 0x1); - if (omitFirst) - { - --address; - ++count; - } - bool omitLast = (count & 1); - if (omitLast) - { - ++count; - } - const hal_id readMacro = (bits == 8) ? ID_ReadMemBytes : ID_ReadMemWords; - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - el->setOutputSize(count); - - ReadElement r(buffer, count, omitFirst, omitLast, address); - this->readMap[this->elements.size()] = r; - this->elements.push_back(el); + defaultRead(readMacro, nullptr, address, buffer, count); //Patch in the watchdog value the device would have while running const int wdtOffset = devHandle->getWatchdogControl()->getAddress() - getStart() - address; - - if ( wdtOffset >= 0 && wdtOffset < (int)count ) + + if (wdtOffset >= 0 && wdtOffset < (int)count) { //Force sync immediately, instead of trying to patch watchdog in postSync if (!sync()) + { return false; + } buffer[wdtOffset] = devHandle->getWatchdogControl()->get() & 0xFF; } @@ -101,14 +83,12 @@ bool RegisterAccess::doRead(uint32_t address, uint32_t* buffer, size_t count) bool RegisterAccess::doWrite(uint32_t address, uint32_t value) { const size_t numBytes = bits / 8; - const uint8_t *p = reinterpret_cast(&value); - uint32_t buffer[4] = { p[0], p[1], p[2], p[3] }; - - return this->doWrite(address, buffer, numBytes); + const uint8_t *buf = reinterpret_cast(&value); + return this->doWrite(address, buf, numBytes); } /** each buffer element contains one _byte_ */ -bool RegisterAccess::doWrite(uint32_t address, uint32_t* buffer, size_t count) +bool RegisterAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count) { //If watchdog is written, set password and stop bit //and store value the watchdog will have while running @@ -116,34 +96,28 @@ bool RegisterAccess::doWrite(uint32_t address, uint32_t* buffer, size_t count) const uint8_t WDT_PW = 0x5A; const int wdtOffset = devHandle->getWatchdogControl()->getAddress() - getStart() - address; - - if ( wdtOffset >= 0 && wdtOffset < (int)count ) - { - devHandle->getWatchdogControl()->set( buffer[wdtOffset] ); - buffer[wdtOffset] |= WDT_STOP_BIT; - - if (wdtOffset + 1 < (int)count) - buffer[wdtOffset+1] = WDT_PW; - } - - uint32_t start_val = 0; - const uint32_t end_adr = address + count; + uint8_t start_val = 0; + const uint32_t end_adr = address + static_cast(count); size_t paddedCount = count; - if(address & 1) + if (address & 1) { ++paddedCount; - if( !doRead(address - 1, &start_val, 1) || !sync() ) + if (!doRead(address - 1, &start_val, 1) || !sync()) + { return false; + } } - uint32_t end_val = 0; - if(end_adr & 1) + uint8_t end_val = 0; + if (end_adr & 1) { ++paddedCount; - if( !doRead(end_adr, &end_val, 1) || !sync() ) + if (!doRead(end_adr, &end_val, 1) || !sync()) + { return false; + } } const hal_id writeMacro = (bits == 8) ? ID_WriteMemBytes : ID_WriteMemWords; @@ -151,48 +125,69 @@ bool RegisterAccess::doWrite(uint32_t address, uint32_t* buffer, size_t count) HalExecElement* el = new HalExecElement(devHandle->checkHalId(writeMacro)); address += getStart(); - el->appendInputData32(static_cast(address & 0xfffffffe)); + el->appendInputData32(address & 0xfffffffe); el->appendInputData32(static_cast(paddedCount / 2)); - - if(address & 1) + + if (address & 1) { - el->appendInputData8(static_cast(start_val)); + el->appendInputData8(start_val); } for (size_t i = 0; i < count; ++i) { - el->appendInputData8(static_cast(buffer[i])); + uint8_t val = buffer[i]; + if (i == wdtOffset) + { + devHandle->getWatchdogControl()->set(buffer[i]); + val |= WDT_STOP_BIT; + } + else if (i == wdtOffset + 1) + { + val = WDT_PW; + } + el->appendInputData8(val); } - if (end_adr & 1) + if (end_adr & 1) { - el->appendInputData16(static_cast(end_val)); + el->appendInputData16(end_val); } - el->setInputMinSize(8); // at least address and size (4+4) - this->elements.push_back(el); + this->elements.emplace_back(el); return true; } -bool RegisterAccess::postSync (const HalExecCommand& cmd) +bool RegisterAccess::postSync(const HalExecCommand& cmd) { - for (size_t i = 1; i < cmd.elements.size(); ++i) + ReadElement_map readElements = this->readMap; + + const bool success = MemoryAreaBase::postSync(cmd); + + if (success) { - ReadElement_map::iterator it = this->readMap.find(i-1); - if (it != this->readMap.end()) + for (const ReadElement_map::value_type& e : readElements) { - ReadElement r = it->second; - size_t size = r.size; - if (r.omitLast) - --size; - - const HalExecElement& el = cmd.elements.at(i); - for (size_t i = 0, k = (r.omitFirst? 1: 0); k < size; ++k, ++i) + if (this->readMap.find(e.first) == this->readMap.end()) { - const uint8_t bitMask = (r.offset + i < mask.size()) ? mask[r.offset + i] : 0xff; - r.v_buffer[i] = el.getOutputAt8(k) & bitMask; + const size_t address = e.second.offset + (e.second.omitFirst ? 1 : 0); + const size_t size = e.second.size - (e.second.omitFirst ? 1 : 0) - (e.second.omitLast ? 1 : 0); + for (size_t i = 0; i < size; ++i) + { + e.second.v_buffer[i] &= (address + i < mask.size()) ? mask[address + i] : 0xff; + } } - this->readMap.erase(it); } } - return true; + return success; +} + + +bool RegisterAccess5xx::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + const uint32_t sfrIfgRegister = 0x102; + uint8_t sfrIfgBackup[2] = {0}; + + //Save and restore state of VMAIFG + return RegisterAccess::doRead(sfrIfgRegister - this->getStart(), sfrIfgBackup, 2) && sync() && + RegisterAccess::doRead(address, buffer, count) && + doWrite(sfrIfgRegister - this->getStart(), sfrIfgBackup, 2); } diff --git a/DLL430_v3/src/TI/DLL430/RegisterAccessBase.h b/DLL430_v3/src/TI/DLL430/RegisterAccessBase.h index 7e39402..aa008fc 100644 --- a/DLL430_v3/src/TI/DLL430/RegisterAccessBase.h +++ b/DLL430_v3/src/TI/DLL430/RegisterAccessBase.h @@ -3,81 +3,95 @@ * * Base class for accessing registers. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_REGISTERACCESSBASE_H -#define DLL430_REGISTERACCESSBASE_H #include "MemoryAreaBase.h" -#include -#include namespace TI { namespace DLL430 { - class DeviceHandleV3; + class IDeviceHandle; class RegisterAccess : public MemoryAreaBase { public: RegisterAccess ( - const std::string& name, - DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, bool mapped, uint8_t bits, const std::vector& mask ); virtual ~RegisterAccess() {}; - bool doRead(uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t* buffer, size_t count); - bool doWrite (uint32_t address, uint32_t value); - + bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + bool doWrite(uint32_t address, uint32_t value) OVERRIDE; + protected: - bool postSync (const HalExecCommand&); + bool postSync(const HalExecCommand&) OVERRIDE; uint8_t bits; std::vector mask; std::vector v_buffer; }; - }; -}; -#endif /* DLL430_REGISTERACCESSBASE_H */ + + class RegisterAccess5xx : public RegisterAccess + { + public: + RegisterAccess5xx ( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool, + IMemoryManager*, + uint8_t + ) + : RegisterAccess(name, devHandle, start, end, seg, banks, mapped, 16, std::vector()) + {} + + bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + }; + } +} diff --git a/DLL430_v3/src/TI/DLL430/SpecialMemoryTypes.cpp b/DLL430_v3/src/TI/DLL430/SpecialMemoryTypes.cpp new file mode 100644 index 0000000..37063f0 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/SpecialMemoryTypes.cpp @@ -0,0 +1,275 @@ +/* + * SpecialMemoryTypes.cpp + * + * Memory Types whith special handling. + * + * Copyright (C) 2011 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. + */ + +#include +#include "SpecialMemoryTypes.h" +#include "IDeviceHandle.h" +#include "ConfigManager.h" +#include "FetHandle.h" +#include "MemoryManager.h" + +using namespace TI::DLL430; + + +bool InformationFlashAccess::erase() +{ + for ( uint32_t i = 0; i < getBanks(); ++i ) + { + if ( i == getBanks()-1 && isLocked() ) + continue; + + const uint32_t offset = getStart() + i*getSegmentSize(); + if ( !MainMemoryAccessBase::erase(offset, offset + getSegmentSize()-1) ) + return false; + } + return true; +} + + +bool BootcodeRomAccess::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + return defaultRead(ID_ReadMemQuick, mm, address, buffer, count); +} + + +bool BslRomAccessGR::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + bool success = false; + try + { + const uint16_t sysbslc = readSysbslc(); + bool bslLocked = (sysbslc & 0x8000) != 0; + if (bslLocked && !isLocked()) + { + writeSysbslc(sysbslc & ~0x8000); + + bslLocked = (readSysbslc() & 0x8000) != 0; + if (bslLocked) + { + throw MEMORY_UNLOCK_ERROR; + } + } + success = bslLocked ? true : BootcodeRomAccess::doRead(address, buffer, count); + } + catch (const MemoryError& error) + { + err = error; + } + return success; +} + +uint16_t BslRomAccessGR::readSysbslc() const +{ + uint8_t sysbslc[2] = {0}; + if (!mm->read(sysBslcAddr, sysbslc, 2) || !mm->sync()) + { + throw MEMORY_READ_ERROR; + } + + return (sysbslc[1] << 8) | sysbslc[0]; +} + +void BslRomAccessGR::writeSysbslc(uint16_t value) const +{ + if (!mm->write(sysBslcAddr, value) || !mm->sync()) + { + throw MEMORY_WRITE_ERROR; + } +} + + +bool BslMemoryAccessBase::doRead(uint32_t address, uint8_t* buffer, size_t count) +{ + bool success = false; + + try + { + const uint32_t lockedStartAddress = getLockedStartAddress(); + + const size_t unlockedCount = std::min(lockedStartAddress - address, count); + if (unlockedCount > 0) + { + if (!memoryAccess->doRead(address, buffer, unlockedCount)) + { + throw MEMORY_READ_ERROR; + } + + address += static_cast(unlockedCount); + buffer += unlockedCount; + } + + const size_t lockedCount = count - unlockedCount; + if ((lockedCount > 0) && !isLocked()) + { + if (!doUnlockBslMemory()) + { + throw MEMORY_UNLOCK_ERROR; + } + + if (!memoryAccess->doRead(address, buffer, lockedCount)) + { + throw MEMORY_READ_ERROR; + } + } + success = true; + } + catch (const MemoryError& error) + { + err = error; + } + + return success; +} + +bool BslMemoryAccessBase::doWrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + if (isLocked()) + { + err = MEMORY_LOCKED_ERROR; + return false; + } + + if (!doUnlockBslMemory()) + { + err = MEMORY_UNLOCK_ERROR; + return false; + } + + return memoryAccess->doWrite(address, buffer, count); +} + +bool BslMemoryAccessBase::doWrite (uint32_t address, uint32_t value) +{ + return doWrite(address, (uint8_t*)&value, 1); +} + +//erase segment wise +bool BslMemoryAccessBase::erase() +{ + return erase(getStart(), getEnd()); +} + +bool BslMemoryAccessBase::erase(uint32_t start, uint32_t end, bool forceUnlock) +{ + if (isLocked()) + { + err = MEMORY_LOCKED_ERROR; + return true; + } + + if (!doUnlockBslMemory()) + { + err = MEMORY_UNLOCK_ERROR; + return false; + } + + return memoryAccess->erase(start, end); +} + +bool BslMemoryAccessBase::doUnlockBslMemory() +{ + bool success = false; + + std::vector bslPe; + const bool readBslPeSuccess = readBslPe(&bslPe); + const bool deviceLocked = readBslPeSuccess && isDeviceLocked(bslPe); + + // get first the status of the memory area -LOCKED/UNLOCKED + if (!deviceLocked) + { + success = true; + } + else + { + const unsigned short sysBslDefaultSize = 0x03; + success = unlockBslPeAndCheck(sysBslDefaultSize); + } + return success; +} + +bool BslMemoryAccessBase::readBslPe(std::vector* bslPeBuffer) const +{ + bslPeBuffer->resize(2); + const bool readBslPeSuccess = mm->read(mySysBslc, &(*bslPeBuffer)[0], 2); + const bool sendCommandSuccess = readBslPeSuccess && mm->sync(); + + return sendCommandSuccess; +} + +bool BslMemoryAccessBase::unlockBslPeAndCheck(uint32_t bslSize) +{ + std::vector bslPeBuffer; + bslPeBuffer.reserve(2); + bslPeBuffer.push_back(bslSize); + bslPeBuffer.push_back(0x00); + + const bool writeBslPeSuccess = mm->write(mySysBslc, &bslPeBuffer[0], mySysBslcSize); + const bool sendCommandSuccess = writeBslPeSuccess && mm->sync(); + const bool readBackSuccess = sendCommandSuccess && readBslPe(&bslPeBuffer); + const bool correctBslSize = (bslPeBuffer.size() == mySysBslcSize) && (bslPeBuffer[0] == bslSize); + return readBackSuccess && !isDeviceLocked(bslPeBuffer) && correctBslSize; +} + +bool BslMemoryAccessBase::isDeviceLocked(const std::vector& bslPeBuffer) const +{ + if (bslPeBuffer.size() == mySysBslcSize) + { + //it's sufficient to check one byte + const unsigned int sysBslPe = 0x80; + return bslPeBuffer[1] == sysBslPe; + } + return false; +} + +uint32_t BslMemoryAccessBase::getLockedStartAddress() const +{ + const uint32_t maxBslSize = 0x03; + std::vector lockStartAddr; + + const bool readBslPeSuccess = readBslPe(&lockStartAddr); + const bool bslSizeValid = lockStartAddr[0] <= maxBslSize; + + if ( !isDeviceLocked(lockStartAddr) ) + { + return getSize(); + } + else if ( bslSizeValid && readBslPeSuccess ) + { + return (maxBslSize - lockStartAddr[0]) * getSegmentSize(); + } + return 0; +} diff --git a/DLL430_v3/src/TI/DLL430/SpecialMemoryTypes.h b/DLL430_v3/src/TI/DLL430/SpecialMemoryTypes.h new file mode 100644 index 0000000..a02ae5b --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/SpecialMemoryTypes.h @@ -0,0 +1,223 @@ +/* + * SpecialMemoryTypes.h + * + * Memory Types whith special handling. + * + * Copyright (C) 2011 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. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace TI { namespace DLL430 { + class IMemoryManager; + + + class InformationFlashAccess : public FlashMemoryAccessBase + { + public: + InformationFlashAccess ( + MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool protectable, + IMemoryManager* mm, + uint8_t psa) + : FlashMemoryAccessBase( + name, devHandle, + start, end, seg, banks, + mapped, protectable, mm, psa + ) {} + + virtual unsigned short getFlags() {return isLocked() ? LOCK_INFO_A_FLAG : NO_FLAG;} + + virtual bool erase() OVERRIDE; + }; + + + //actual Bootcode is flash, but behaves like ROM + class BootcodeRomAccess : public ReadonlyMemoryAccess + { + public: + BootcodeRomAccess (MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool protectable, + IMemoryManager* mm, + uint8_t psa) + : ReadonlyMemoryAccess (name, devHandle, start, end, seg, banks, mapped, protectable, mm, psa) + {} + + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + }; + + + class BslRomAccessGR : public BootcodeRomAccess + { + public: + BslRomAccessGR (MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool protectable, + IMemoryManager* mm, + uint8_t psa) + : BootcodeRomAccess(name, devHandle, start, end, seg, banks, mapped, protectable, mm, psa) + {} + + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + + private: + static const uint32_t sysBslcAddr = 0x142; + + uint16_t readSysbslc() const; + void writeSysbslc(uint16_t value) const; + }; + + + class BslMemoryAccessBase : public MemoryAreaBase + { + public: + virtual bool sync() OVERRIDE { return memoryAccess->sync(); } + + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + + virtual bool doWrite(uint32_t address, uint32_t value) OVERRIDE; + + virtual bool erase() OVERRIDE; + + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE; + + bool doUnlockBslMemory(); + + bool readBslPe(std::vector* bslPeBuffer) const; + + bool unlockBslPeAndCheck(uint32_t bslSize); + + bool isDeviceLocked(const std::vector& bslPeBuffer) const; + + uint32_t getLockedStartAddress() const; + + protected: + BslMemoryAccessBase (MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool protectable, + uint8_t psa, + IMemoryManager* mm, + MemoryAreaBase* memoryAccess) + : MemoryAreaBase(name, devHandle, start, end, seg, banks, mapped, protectable, psa) + , mm(mm) + , memoryAccess(memoryAccess) + {} + + virtual ~BslMemoryAccessBase() + { + if (memoryAccess) + { + delete memoryAccess; + } + memoryAccess = nullptr; + } + + private: + virtual bool postSync(const HalExecCommand&) { return true; } + + IMemoryManager* mm; + MemoryAreaBase* memoryAccess; + + static const uint16_t mySysBslcSize = 2; + static const uint16_t mySysBslc = 0x182; + }; + + template + class BslMemoryAccess : public BslMemoryAccessBase + { + public: + BslMemoryAccess(MemoryArea::Name name, TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, uint32_t end, uint32_t seg, uint32_t banks, + bool mapped, const bool protectable, IMemoryManager* mm, uint8_t psa) + : BslMemoryAccessBase(name, devHandle, start, end, seg, banks, mapped, protectable, psa, mm, + new BaseAccessType(MemoryArea::None, devHandle, start, end, seg, banks, mapped, protectable, mm, psa)) + {} + }; + + typedef BslMemoryAccess BslFlashAccess; + typedef BslMemoryAccess BslRomAccess; + class UsbRamAccess : public TI::DLL430::RandomMemoryAccess + { + public: + UsbRamAccess( + MemoryArea::Name name, + TI::DLL430::IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool protectable, + IMemoryManager* mm, + uint8_t psa) + : RandomMemoryAccess( + name, devHandle, + start, end, seg, banks, + mapped, protectable, mm, psa + ) {} + virtual bool doRead(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE + { + return MemoryAreaBase::doRead(address, buffer, count); + } + }; +}//namespace DLL430 +}//namespace TI diff --git a/DLL430_v3/src/TI/DLL430/SyncedCallWrapper.h b/DLL430_v3/src/TI/DLL430/SyncedCallWrapper.h new file mode 100644 index 0000000..edeea9c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/SyncedCallWrapper.h @@ -0,0 +1,58 @@ +/* + * CallWrapper.h + * + * Call wrapper base class . + * + * Copyright (C) 20013 - 2014 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. + */ + +#pragma once + + +template +class SyncedCallWrapper +{ +public: + SyncedCallWrapper(T* obj, boost::recursive_mutex* mtx) : ptr(obj), mtx(mtx) + { + if (mtx) mtx->lock(); + } + ~SyncedCallWrapper() + { + if (mtx) mtx->unlock(); + } + T* operator->() { return ptr; } + +private: + T* ptr; + boost::recursive_mutex* mtx; +}; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/CC430F5_6xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/CC430F5_6xx.cpp deleted file mode 100644 index 3ee1efe..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/CC430F5_6xx.cpp +++ /dev/null @@ -1,333 +0,0 @@ -/* - * CC4305_6xx.cpp - * - * Definition CC430F5xx and CC430F5xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -const ClockPair CC430F5_6xxTimerTA3_1 = {"Timer1_A3", 57}; - - -struct CC430F6xx_EemTimer_ADC_LCD : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - CC430F6xx_EemTimer_ADC_LCD() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::AES, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::LCD_B, Eem::Empty, - Eem::Empty, CC430F5_6xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct CC430F6xx_EemTimer_LCD : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - CC430F6xx_EemTimer_LCD() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::AES, Eem::COMP_B, - Eem::Empty, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::LCD_B, Eem::Empty, - Eem::Empty, CC430F5_6xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct CC430F6xx_EemTimer_ADC : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - CC430F6xx_EemTimer_ADC() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::AES, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::Empty, - Eem::Empty, CC430F5_6xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct CC430F6xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - CC430F6xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::AES, Eem::COMP_B, - Eem::Empty, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::Empty, - Eem::Empty, CC430F5_6xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - - -typedef ClockInfo CC430F6xx_ClockInfo_ADC_LCD; -typedef ClockInfo CC430F6xx_ClockInfo_LCD; -typedef ClockInfo CC430F6xx_ClockInfo_ADC; -typedef ClockInfo CC430F6xx_ClockInfo; - - - -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - class MainFlashMemoryType, - class SystemRamMemoryType -> -struct CC430F5_6xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - SmallEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features - > {}; - - - -//Backup ram is defined as second ram area, as this might not be accessible when connecting to device -struct CC430F614x_SystemRamInfo2 : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x80> , Offset<0x1C00>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask> {}; - - -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - class MainFlashMemoryType, - class SystemRamMemoryType -> -struct CC430F614x : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - SmallEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - NoExtendedFeatures, - PowerSettings< - 0x0, // Test reg mask - 0x0, // Test reg value to enable LPMx.5 - 0x0, // Test reg value to disable LPMx.5 - 0x4020, // 3V Test reg mask - 0x4020, // 3V Test reg value to enable LPMx.5 - 0x4020> // 3V Test reg value to disable LPMx.5 - > {}; - - -template -struct CC430F5_6xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType , OffsetType, SegmentSize<0x200>, - BankSize<0x10000>, Banks<2>, NoMask > {}; - -template -struct CC430F5_6xx_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x1C00>, SegmentSize<0x1>, - BankSize<0x0>, BanksType, NoMask> {}; - -template -struct CC430F614x_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x1C80>, SegmentSize<0x1>, - BankSize<0x0>, BanksType, NoMask> {}; - - -typedef CC430F5_6xx_MainFlashMemory, Offset<0x8000> > CC430F5_6xx_Main_32KB; -typedef CC430F5_6xx_MainFlashMemory, Offset<0xC000> > CC430F5_6xx_Main_16KB; -typedef CC430F5_6xx_MainFlashMemory, Offset<0xE000> > CC430F5_6xx_Main_8KB; - -typedef CC430F5_6xx_SystemRamInfo, Banks<2> > CC430F5_6xx_System_4KB; -typedef CC430F5_6xx_SystemRamInfo, Banks<1> > CC430F5_6xx_System_2KB; - -typedef CC430F614x_SystemRamInfo, Banks<2> > CC430F614x_System_4KB; -typedef CC430F614x_SystemRamInfo, Banks<1> > CC430F614x_System_2KB; - - -extern const char CC430F6137[] = "CC430F6137"; -extern const char CC430F6135[] = "CC430F6135"; -extern const char CC430F6127[] = "CC430F6127"; -extern const char CC430F6126[] = "CC430F6126"; -extern const char CC430F6125[] = "CC430F6125"; -extern const char CC430F5137[] = "CC430F5137"; -extern const char CC430F5135[] = "CC430F5135"; -extern const char CC430F5133[] = "CC430F5133"; - -extern const char CC430F6147[] = "CC430F6147"; -extern const char CC430F6145[] = "CC430F6145"; -extern const char CC430F6143[] = "CC430F6143"; -extern const char CC430F5147[] = "CC430F5147"; -extern const char CC430F5145[] = "CC430F5145"; -extern const char CC430F5143[] = "CC430F5143"; -extern const char CC430F5125[] = "CC430F5125"; -extern const char CC430F5123[] = "CC430F5123"; - - -typedef CC430F5_6xx< - CC430F6137, 0x3761, CC430F6xx_ClockInfo_ADC_LCD, CC430F5_6xx_Main_32KB, CC430F5_6xx_System_4KB -> CC430F6137_type; - -typedef CC430F5_6xx< - CC430F6135, 0x3561, CC430F6xx_ClockInfo_ADC_LCD, CC430F5_6xx_Main_16KB, CC430F5_6xx_System_2KB -> CC430F6135_type; - -typedef CC430F5_6xx< - CC430F6127, 0x2761, CC430F6xx_ClockInfo_ADC_LCD, CC430F5_6xx_Main_32KB, CC430F5_6xx_System_4KB -> CC430F6127_type; - -typedef CC430F5_6xx< - CC430F6126, 0x2661, CC430F6xx_ClockInfo_LCD, CC430F5_6xx_Main_32KB, CC430F5_6xx_System_2KB -> CC430F6126_type; - -typedef CC430F5_6xx< - CC430F6125, 0x2561, CC430F6xx_ClockInfo_LCD, CC430F5_6xx_Main_16KB, CC430F5_6xx_System_2KB -> CC430F6125_type; - -typedef CC430F5_6xx< - CC430F5137, 0x3751, CC430F6xx_ClockInfo_ADC, CC430F5_6xx_Main_32KB, CC430F5_6xx_System_4KB -> CC430F5137_type; - -typedef CC430F5_6xx< - CC430F5135, 0x3551, CC430F6xx_ClockInfo_ADC, CC430F5_6xx_Main_16KB, CC430F5_6xx_System_2KB -> CC430F5135_type; - -typedef CC430F5_6xx< - CC430F5133, 0x3351, CC430F6xx_ClockInfo_ADC, CC430F5_6xx_Main_8KB, CC430F5_6xx_System_2KB -> CC430F5133_type; - - - - -typedef CC430F614x< - CC430F6147, 0x8135, CC430F6xx_ClockInfo_ADC_LCD, CC430F5_6xx_Main_32KB, CC430F614x_System_4KB -> CC430F6147_type; - -typedef CC430F614x< - CC430F6145, 0x8136, CC430F6xx_ClockInfo_ADC_LCD, CC430F5_6xx_Main_16KB, CC430F614x_System_2KB -> CC430F6145_type; - -typedef CC430F614x< - CC430F6143, 0x8137, CC430F6xx_ClockInfo_ADC_LCD, CC430F5_6xx_Main_8KB, CC430F614x_System_2KB -> CC430F6143_type; - -typedef CC430F614x< - CC430F5147, 0x8138, CC430F6xx_ClockInfo_ADC, CC430F5_6xx_Main_32KB, CC430F614x_System_4KB -> CC430F5147_type; - -typedef CC430F614x< - CC430F5145, 0x8139, CC430F6xx_ClockInfo_ADC, CC430F5_6xx_Main_16KB, CC430F614x_System_2KB -> CC430F5145_type; - -typedef CC430F614x< - CC430F5143, 0x813A, CC430F6xx_ClockInfo_ADC, CC430F5_6xx_Main_8KB, CC430F614x_System_2KB -> CC430F5143_type; - -typedef CC430F614x< - CC430F5125, 0x813B, CC430F6xx_ClockInfo, CC430F5_6xx_Main_16KB, CC430F614x_System_2KB -> CC430F5125_type; - -typedef CC430F614x< - CC430F5123, 0x813C, CC430F6xx_ClockInfo, CC430F5_6xx_Main_8KB, CC430F614x_System_2KB -> CC430F5123_type; - - -static const DeviceRegistrator regCC430F6137; -static const DeviceRegistrator regCC430F6127; -static const DeviceRegistrator regCC430F6135; -static const DeviceRegistrator regCC430F6126; -static const DeviceRegistrator regCC430F6125; -static const DeviceRegistrator regCC430F5137; -static const DeviceRegistrator regCC430F5135; -static const DeviceRegistrator regCC430F5133; - -static const DeviceRegistrator regCC430F6147; -static const DeviceRegistrator regCC430F6145; -static const DeviceRegistrator regCC430F6143; -static const DeviceRegistrator regCC430F5147; -static const DeviceRegistrator regCC430F5145; -static const DeviceRegistrator regCC430F5143; -static const DeviceRegistrator regCC430F5125; -static const DeviceRegistrator regCC430F5123; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DatabaseImplementation.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DatabaseImplementation.cpp deleted file mode 100644 index 2e26901..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DatabaseImplementation.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * DatabaseImplementation.cpp - * - * Definition of default Eem Timer Name-Value mapping. - * - * Copyright (C) 2011 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. - */ - -#include "DatabaseImplementation.h" - -using namespace TI::DLL430::TemplateDeviceDb; - -//default initializations - when c++0x is used someday, define inline, because intention is more clear when visible in h-file at declaration -const ClockPair EemTimerImpl::Timer::Empty = {"", 0}; -const ClockPair EemTimerImpl::Timer::CRC16 = {"CRC16", 0}; -const ClockPair EemTimerImpl::Timer::WDT_A = {"Watchdog Timer", 1}; -const ClockPair EemTimerImpl::Timer::CCS = {"CCS", 2}; -const ClockPair EemTimerImpl::Timer::USB = {"USB", 3}; -const ClockPair EemTimerImpl::Timer::AES = {"AES128", 4}; - -const ClockPair EemTimerImpl::Timer::TA = {"TimerA", 0}; -const ClockPair EemTimerImpl::Timer::TB = {"TimerB", 0}; - -const ClockPair EemTimerImpl::Timer::TA3 = {"TimerA3", 0}; -const ClockPair EemTimerImpl::Timer::TB3 = {"TimerB3", 0}; - -const ClockPair EemTimerImpl::Timer::BT = {"BasicTimer", 0}; -const ClockPair EemTimerImpl::Timer::BT_RTC = {"BasicTimer/RTC", 0}; - -const ClockPair EemTimerImpl::Timer::TA2_0 = {"Timer0_A2", 5}; -const ClockPair EemTimerImpl::Timer::TA2_1 = {"Timer1_A2", 6}; -const ClockPair EemTimerImpl::Timer::TA2_2 = {"Timer2_A2", 7}; -const ClockPair EemTimerImpl::Timer::TA3_0 = {"Timer0_A3", 8}; -const ClockPair EemTimerImpl::Timer::TA3_1 = {"Timer1_A3", 9}; -const ClockPair EemTimerImpl::Timer::TA3_2 = {"Timer2_A3", 10}; -const ClockPair EemTimerImpl::Timer::TA3_3 = {"Timer3_A3", 11}; -const ClockPair EemTimerImpl::Timer::TA5_0 = {"Timer0_A5", 12}; -const ClockPair EemTimerImpl::Timer::TA5_1 = {"Timer1_A5", 13}; -const ClockPair EemTimerImpl::Timer::TA5_2 = {"Timer2_A5", 14}; -const ClockPair EemTimerImpl::Timer::TA7_0 = {"Timer0_A7", 15}; -const ClockPair EemTimerImpl::Timer::TA7_1 = {"Timer1_A7", 16}; -const ClockPair EemTimerImpl::Timer::TA7_2 = {"Timer2_A7", 17}; - -const ClockPair EemTimerImpl::Timer::TD3_0 = {"Timer0_D3", 18}; -const ClockPair EemTimerImpl::Timer::TD3_1 = {"Timer1_D3", 19}; -const ClockPair EemTimerImpl::Timer::TD3_2 = {"Timer2_D3", 20}; -const ClockPair EemTimerImpl::Timer::TD3_3 = {"Timer3_D3", 21}; -const ClockPair EemTimerImpl::Timer::TB3_0 = {"Timer0_B3", 22}; -const ClockPair EemTimerImpl::Timer::TB3_1 = {"Timer1_B3", 23}; -const ClockPair EemTimerImpl::Timer::TB3_2 = {"Timer2_B3", 24}; -const ClockPair EemTimerImpl::Timer::TB5_0 = {"Timer0_B5", 25}; -const ClockPair EemTimerImpl::Timer::TB5_1 = {"Timer1_B5", 26}; -const ClockPair EemTimerImpl::Timer::TB5_2 = {"Timer2_B5", 27}; -const ClockPair EemTimerImpl::Timer::TB7_0 = {"Timer0_B7", 28}; -const ClockPair EemTimerImpl::Timer::TB7_1 = {"Timer1_B7", 29}; -const ClockPair EemTimerImpl::Timer::TB7_2 = {"Timer2_B7", 30}; - -const ClockPair EemTimerImpl::Timer::FLASH_CTRL = {"Flash Control", 0}; -const ClockPair EemTimerImpl::Timer::FLASH_CTRLER = {"Flash Controller", 0}; - -const ClockPair EemTimerImpl::Timer::USART0 = {"USART0", 0}; -const ClockPair EemTimerImpl::Timer::USART1 = {"USART1", 0}; - -const ClockPair EemTimerImpl::Timer::USCI0 = {"USCI0", 31}; -const ClockPair EemTimerImpl::Timer::USCI1 = {"USCI1", 32}; -const ClockPair EemTimerImpl::Timer::USCI2 = {"USCI2", 33}; -const ClockPair EemTimerImpl::Timer::USCI3 = {"USCI3", 34}; - -const ClockPair EemTimerImpl::Timer::eUSCIA0 = {"eUSCIA0", 35}; -const ClockPair EemTimerImpl::Timer::eUSCIA1 = {"eUSCIA1", 36}; -const ClockPair EemTimerImpl::Timer::eUSCIA2 = {"eUSCIA2", 37}; -const ClockPair EemTimerImpl::Timer::eUSCIA3 = {"eUSCIA3", 38}; -const ClockPair EemTimerImpl::Timer::eUSCIB0 = {"eUSCIB0", 39}; - -const ClockPair EemTimerImpl::Timer::TB_MCLK = {"TimerB/MCLK (Pin)", 0}; -const ClockPair EemTimerImpl::Timer::TA_SMCLK = {"TimerA/SMCLK (Pin)", 0}; -const ClockPair EemTimerImpl::Timer::WDT_ACLK = {"Watchdog Timer/ACLK (Pin)", 0}; - -const ClockPair EemTimerImpl::Timer::MCLKpin = {"MCLK (Pin)", 0}; -const ClockPair EemTimerImpl::Timer::SMCLKpin = {"SMCLK (Pin)", 0}; -const ClockPair EemTimerImpl::Timer::ACLKpin = {"ACLK (Pin)", 0}; - -const ClockPair EemTimerImpl::Timer::RTC = {"RTC", 40}; -const ClockPair EemTimerImpl::Timer::BTRTC = {"BTRTC", 41}; - -const ClockPair EemTimerImpl::Timer::COMP_B = {"Comparator B", 42}; -const ClockPair EemTimerImpl::Timer::COMP_D = {"Comparator D", 43}; -const ClockPair EemTimerImpl::Timer::LCD_B = {"LCDB", 44}; - -const ClockPair EemTimerImpl::Timer::LCD_FREQ = {"LCD Frequency", 0}; - -const ClockPair EemTimerImpl::Timer::APOOL = {"APOOL", 45}; - -const ClockPair EemTimerImpl::Timer::RF1A = {"RF1A", 46}; -const ClockPair EemTimerImpl::Timer::RF1B = {"RF1B", 47}; -const ClockPair EemTimerImpl::Timer::RF2A = {"RF2A", 48}; -const ClockPair EemTimerImpl::Timer::RF2B = {"RF2B", 49}; - -const ClockPair EemTimerImpl::Timer::DAC12_0 = {"DAC12", 50}; -const ClockPair EemTimerImpl::Timer::DAC12_1 = {"DAC12", 51}; -const ClockPair EemTimerImpl::Timer::SD16 = {"SD16", 0}; -const ClockPair EemTimerImpl::Timer::SD16A_4 = {"SD16A", 52}; -const ClockPair EemTimerImpl::Timer::SD24B = {"SD24B", 53}; -const ClockPair EemTimerImpl::Timer::ADC10_A = {"ADC10", 54}; -const ClockPair EemTimerImpl::Timer::ADC10_B = {"ADC10B", 55}; -const ClockPair EemTimerImpl::Timer::ADC12 = {"ADC12", 0}; -const ClockPair EemTimerImpl::Timer::ADC12_A = {"ADC12A", 56}; -const ClockPair EemTimerImpl::Timer::ADC12_B = {"ADC12B", 56}; - - -const ClockName EemClocksImpl::Clocks::Empty = ""; -const ClockName EemClocksImpl::Clocks::TACLK = "TACLK"; -const ClockName EemClocksImpl::Clocks::SMCLK = "SMCLK"; -const ClockName EemClocksImpl::Clocks::ACLK = "ACLK"; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DatabaseImplementation.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DatabaseImplementation.h deleted file mode 100644 index fe5265b..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DatabaseImplementation.h +++ /dev/null @@ -1,844 +0,0 @@ -/* - * DatabaseImplementation.h - * - * Holds all Module implementations which are necessary to create Device for DeciceDb. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_DATABASEIMPLEMENTATION_H -#define TEMPLATE_DEVICE_DB_DATABASEIMPLEMENTATION_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include "TemplateTypes.h" - - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { -/** -\struct IdCodeImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See IdCode - - */ -struct IdCodeImpl -{ - const uint16_t verId_; - const uint16_t verSubId_; - const uint8_t revisison_; - const uint8_t fab_; - const uint16_t self_; - const char config_; - const uint8_t fuses_; - const uint32_t activationKey_; - - IdCodeImpl( - const uint16_t verId, - const uint16_t verSubId, - const uint8_t revisison, - const uint8_t fab, - const uint16_t self, - const char config, - const uint8_t fuses, - const uint32_t activationKey - ) : - verId_(verId), - verSubId_(verSubId), - revisison_(revisison), - fab_(fab), - self_(self), - config_(config), - fuses_(fuses), - activationKey_(activationKey) - {} - -}; - -/** -\struct MatchImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See Match - - */ -struct MatchImpl -{ - const IdCodeImpl value_; - const IdCodeImpl mask_; - - MatchImpl(const IdCodeImpl& value, const IdCodeImpl& mask) : - value_(value), - mask_(mask) - {} -}; - -/** -\fn inline bool operator<(const MatchImpl& lhs, const MatchImpl& rhs); - -\brief Needed as MatchImpl is used as key in the device database (default map sort is less) - - */ -inline bool operator<(const MatchImpl& lhs, const MatchImpl& rhs) -{ - if(lhs.value_.verId_ != rhs.value_.verId_) - return lhs.value_.verId_ < rhs.value_.verId_; - - else if (lhs.value_.verSubId_ != rhs.value_.verSubId_) - return lhs.value_.verSubId_ < rhs.value_.verSubId_; - - else if (lhs.value_.revisison_ != rhs.value_.revisison_) - return lhs.value_.revisison_ < rhs.value_.revisison_; - - else if (lhs.value_.fab_ != rhs.value_.fab_) - return lhs.value_.fab_ < rhs.value_.fab_; - - else if (lhs.value_.self_ != rhs.value_.self_) - return lhs.value_.self_ < rhs.value_.self_; - - else if (lhs.value_.config_ != rhs.value_.config_) - return lhs.value_.config_ < rhs.value_.config_; - - else if (lhs.value_.fuses_ != rhs.value_.fuses_) - return lhs.value_.fuses_ < rhs.value_.fuses_; - - else - return lhs.value_.activationKey_ < rhs.value_.activationKey_; -} - -/** -\fn inline bool operator==(const MatchImpl& lhs, const MatchImpl& rhs). - -\brief Needed to find value to a given match as MatchImpl is used as key in the device database map file. - - */ -inline bool operator== (const MatchImpl& match, const IdCodeImpl& idCode) -{ - return ((idCode.verId_ & match.mask_.verId_) == match.value_.verId_ - && (idCode.verSubId_ & match.mask_.verSubId_) == match.value_.verSubId_ - && (idCode.revisison_ & match.mask_.revisison_) == match.value_.revisison_ - && (idCode.fab_ & match.mask_.fab_) == match.value_.fab_ - && (idCode.self_ & match.mask_.self_) == match.value_.self_ - && (idCode.config_ & match.mask_.config_) == match.value_.config_ - && (idCode.fuses_ & match.mask_.fuses_) == match.value_.fuses_ - && (idCode.activationKey_ & match.mask_.activationKey_) == match.value_.activationKey_); -} - -/** -\struct TriggerImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See Trigger. - - */ -struct TriggerImpl{ - const uint8_t emulation_level_; - const uint8_t mem_; - const uint8_t reg_; - const uint8_t combinations_; - const uint8_t options_; - const uint8_t dma_; - const uint8_t readwrite_; - const uint8_t regOperations_; - const uint8_t compLevel_; - const uint8_t mem_condLevel_; - const uint8_t mem_umaskLevel_; - - TriggerImpl( - const uint8_t emulation_level, - const uint8_t mem, - const uint8_t reg, - const uint8_t combinations, - const uint8_t options, - const uint8_t dma, - const uint8_t readwrite, - const uint8_t regOperations, - const uint8_t compLevel, - const uint8_t mem_condLevel, - const uint8_t mem_umaskLevel - ) : - emulation_level_(emulation_level), - mem_(mem), - reg_(reg), - combinations_(combinations), - options_(options), - dma_(dma), - readwrite_(readwrite), - regOperations_(regOperations), - compLevel_(compLevel), - mem_condLevel_(mem_condLevel), - mem_umaskLevel_(mem_umaskLevel) - {} -}; - -/** -\struct SequencerImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See Sequence. - - */ -struct SequencerImpl{ - const uint8_t states_; - const uint8_t start_; - const uint8_t end_; - const uint8_t reset_; - const uint8_t blocked_; - - SequencerImpl( - const uint8_t states, - const uint8_t start, - const uint8_t end, - const uint8_t reset, - const uint8_t blocked - ) : - states_(states), - start_(start), - end_(end), - reset_(reset), - blocked_(blocked) - {} -}; - -/** -\struct EemInfoImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See EemInfo. - - */ -struct EemInfoImpl -{ - const uint8_t stateStorage_; - const uint8_t cycleCounter_; - const uint8_t cycleCounterOperations_; - const TriggerImpl trigger_; - const SequencerImpl sequencer_; - - EemInfoImpl( - const uint8_t stateStorage, - const uint8_t cycleCounter, - const uint8_t cycleCounterOperations, - const TriggerImpl& trigger, - const SequencerImpl& sequencer - ) : - stateStorage_(stateStorage), - cycleCounter_(cycleCounter), - cycleCounterOperations_(cycleCounterOperations), - trigger_(trigger), - sequencer_(sequencer) - {} -}; - - -/** -\struct VoltageInfoImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See VoltageInfo. - - */ -struct VoltageInfoImpl -{ - const uint16_t vccMin_; - const uint16_t vccMax_; - const uint16_t vccFlashMin_; - const uint16_t vccSecureMin_; - const uint16_t vppSecureMin_; - const uint16_t vppSecureMax_; - const bool hasTestVpp_; - - VoltageInfoImpl( - const uint16_t vccMin, - const uint16_t vccMax, - const uint16_t vccFlashMin, - const uint16_t vccSecureMin, - const uint16_t vppSecureMin, - const uint16_t vppSecureMax, - const bool hasTestVpp - ) : - vccMin_(vccMin), - vccMax_(vccMax), - vccFlashMin_(vccFlashMin), - vccSecureMin_(vccSecureMin), - vppSecureMin_(vppSecureMin), - vppSecureMax_(vppSecureMax), - hasTestVpp_(hasTestVpp) - {} -}; - - -/** -\struct ClockPair. - -\brief POD holding ETW PID - Value Pairs. - -\note See EemTimer. - -*/ -struct ClockPair -{ - const std::string name_; - const uint8_t value_; - typedef std::string name_type; - typedef uint8_t value_type; -}; - - -typedef const std::string ClockName; - -/** -\struct EemTimerImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See EemTimer. - -\note Once using C++0x, you could use std::initializer to initialize the array clockControlModules_ - with one single parameter of type std::array instead of naming 32 single parameters. - Needed as we want to stay as const as possible. - - */ -struct EemTimerImpl -{ - struct Timer - { - static const ClockPair Empty; - static const ClockPair CRC16; - static const ClockPair WDT_A; - static const ClockPair CCS; - static const ClockPair USB; - static const ClockPair AES; - - static const ClockPair TA; - static const ClockPair TB; - - static const ClockPair TA3; - static const ClockPair TB3; - - static const ClockPair BT; - static const ClockPair BT_RTC; - - static const ClockPair TA2_0; - static const ClockPair TA2_1; - static const ClockPair TA2_2; - static const ClockPair TA3_0; - static const ClockPair TA3_1; - static const ClockPair TA3_2; - static const ClockPair TA3_3; - static const ClockPair TA5_0; - static const ClockPair TA5_1; - static const ClockPair TA5_2; - static const ClockPair TA7_0; - static const ClockPair TA7_1; - static const ClockPair TA7_2; - - static const ClockPair TD3_0; - static const ClockPair TD3_1; - static const ClockPair TD3_2; - static const ClockPair TD3_3; - - static const ClockPair TB3_0; - static const ClockPair TB3_1; - static const ClockPair TB3_2; - static const ClockPair TB5_0; - static const ClockPair TB5_1; - static const ClockPair TB5_2; - static const ClockPair TB7_0; - static const ClockPair TB7_1; - static const ClockPair TB7_2; - - static const ClockPair FLASH_CTRL; - static const ClockPair FLASH_CTRLER; - - static const ClockPair USART0; - static const ClockPair USART1; - - static const ClockPair USCI0; - static const ClockPair USCI1; - static const ClockPair USCI2; - static const ClockPair USCI3; - - static const ClockPair eUSCIA0; - static const ClockPair eUSCIA1; - static const ClockPair eUSCIA2; - static const ClockPair eUSCIA3; - static const ClockPair eUSCIB0; - - static const ClockPair TB_MCLK; - static const ClockPair TA_SMCLK; - static const ClockPair WDT_ACLK; - - static const ClockPair MCLKpin; - static const ClockPair SMCLKpin; - static const ClockPair ACLKpin; - - static const ClockPair TACLK; - static const ClockPair SMCLK; - static const ClockPair ACLK; - - static const ClockPair RTC; - static const ClockPair BTRTC; - - static const ClockPair COMP_B; - static const ClockPair COMP_D; - static const ClockPair LCD_B; - - static const ClockPair LCD_FREQ; - - static const ClockPair APOOL; - - static const ClockPair RF1A; - static const ClockPair RF1B; - static const ClockPair RF2A; - static const ClockPair RF2B; - - static const ClockPair DAC12_0; - static const ClockPair DAC12_1; - static const ClockPair SD16; - static const ClockPair SD16A_4; - static const ClockPair SD24B; - static const ClockPair ADC10_A; - static const ClockPair ADC10_B; - static const ClockPair ADC12; - static const ClockPair ADC12_A; - static const ClockPair ADC12_B; - }; - - const ClockPair _0_; const ClockPair _1_; const ClockPair _2_; const ClockPair _3_; - const ClockPair _4_; const ClockPair _5_; const ClockPair _6_; const ClockPair _7_; - const ClockPair _8_; const ClockPair _9_; const ClockPair _10_; const ClockPair _11_; - const ClockPair _12_; const ClockPair _13_; const ClockPair _14_; const ClockPair _15_; - const ClockPair _16_; const ClockPair _17_; const ClockPair _18_; const ClockPair _19_; - const ClockPair _20_; const ClockPair _21_; const ClockPair _22_; const ClockPair _23_; - const ClockPair _24_; const ClockPair _25_; const ClockPair _26_; const ClockPair _27_; - const ClockPair _28_; const ClockPair _29_; const ClockPair _30_; const ClockPair _31_; -protected: - - EemTimerImpl( - const ClockPair& _0, const ClockPair& _1, const ClockPair& _2, const ClockPair& _3, - const ClockPair& _4, const ClockPair& _5, const ClockPair& _6, const ClockPair& _7, - const ClockPair& _8, const ClockPair& _9, const ClockPair& _10, const ClockPair& _11, - const ClockPair& _12, const ClockPair& _13, const ClockPair& _14, const ClockPair& _15, - const ClockPair& _16, const ClockPair& _17, const ClockPair& _18, const ClockPair& _19, - const ClockPair& _20, const ClockPair& _21, const ClockPair& _22, const ClockPair& _23, - const ClockPair& _24, const ClockPair& _25, const ClockPair& _26, const ClockPair& _27, - const ClockPair& _28, const ClockPair& _29, const ClockPair& _30, const ClockPair& _31 - ) : _0_(_0), _1_(_1), _2_(_2), _3_(_3), - _4_(_4), _5_(_5), _6_(_6), _7_(_7), - _8_(_8), _9_(_9), _10_(_10),_11_(_11), - _12_(_12), _13_(_13), _14_(_14), _15_(_15), - _16_(_16), _17_(_17), _18_(_18), _19_(_19), - _20_(_20), _21_(_21), _22_(_22), _23_(_23), - _24_(_24), _25_(_25), _26_(_26),_27_(_27), - _28_(_28), _29_(_29), _30_(_30), _31_(_31) - {} -}; - - -struct EemClocksImpl -{ - struct Clocks - { - static const ClockName Empty; - static const ClockName ACLK; - static const ClockName SMCLK; - static const ClockName TACLK; - }; - - const ClockName _0_; const ClockName _1_; const ClockName _2_; const ClockName _3_; - const ClockName _4_; const ClockName _5_; const ClockName _6_; const ClockName _7_; - const ClockName _8_; const ClockName _9_; const ClockName _10_; const ClockName _11_; - const ClockName _12_; const ClockName _13_; const ClockName _14_; const ClockName _15_; -protected: - - EemClocksImpl( - const ClockName& _0, const ClockName& _1, const ClockName& _2, const ClockName& _3, - const ClockName& _4, const ClockName& _5, const ClockName& _6, const ClockName& _7, - const ClockName& _8, const ClockName& _9, const ClockName& _10, const ClockName& _11, - const ClockName& _12, const ClockName& _13, const ClockName& _14, const ClockName& _15 - ) : _0_(_0), _1_(_1), _2_(_2), _3_(_3), - _4_(_4), _5_(_5), _6_(_6), _7_(_7), - _8_(_8), _9_(_9), _10_(_10),_11_(_11), - _12_(_12), _13_(_13), _14_(_14), _15_(_15) - {} -}; - - -/** -\struct ClockInfoImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See ClockInfo. - - */ -struct ClockInfoImpl -{ - const uint8_t clockControl_; - const uint16_t mclkCntrl0_; - const EemTimerImpl eemTimer_; - const EemClocksImpl eemClockNames_; - ClockInfoImpl(uint8_t clockControl, uint16_t mclkCntrl0, - const EemTimerImpl& eemTimer, const EemClocksImpl& eemClockNames) : - clockControl_(clockControl), - mclkCntrl0_(mclkCntrl0), - eemTimer_(eemTimer), - eemClockNames_(eemClockNames) - {} -}; - - -/** -\struct MemoryMaskImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See MemoryMask. - - */ -struct MemoryMaskImpl -{ - const uint8_t* data_; - const unsigned int size_; - - MemoryMaskImpl(const uint8_t* data, const unsigned int size) : - data_(data), - size_(size) - {} -}; - -/** -\struct MemoryInfoImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See MemoryInfo. - - */ -struct MemoryInfoImpl -{ - const std::string name_; - const uint32_t flags_; - const bool protected_; - const uint32_t size_; - const uint32_t offset_; - const uint32_t seg_size_; - const uint32_t bank_size_; - const uint32_t banks_; - const MemoryMaskImpl memoryMaskImpl_; - const TI::DLL430::MemoryCreatorPtr memoryCreator_; - - MemoryInfoImpl( - const std::string& name, - const uint32_t flags, - const bool isProtected, - const uint32_t size, - const uint32_t offset, - const uint32_t seg_size, - const uint32_t bank_size, - const uint32_t banks, - const MemoryMaskImpl& memoryMaskImpl, - const TI::DLL430::MemoryCreatorPtr memoryCreator - ) : - name_(name), - flags_(flags), - protected_(isProtected), - size_(size), - offset_(offset) , - seg_size_(seg_size) , - bank_size_(bank_size) , - banks_(banks), - memoryMaskImpl_(memoryMaskImpl), - memoryCreator_(memoryCreator) - {} -}; - -/** -\struct FunctionMappingImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See FunctionMapping. - - */ -struct FunctionMappingImpl -{ - typedef std::map FunctionMapping; - const FunctionMapping& GetMap() const {return fcntMap_;} -protected: - FunctionMapping fcntMap_; - - //function to replace single entries, see MSP430Defaults.h - void ReplacePair(const FunctionMapping::key_type& key, const FunctionMapping::mapped_type& value) - { - fcntMap_[key] = value; - } -}; - - - -/** -\struct FuncletMappingImpl. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See FuncletMapping. - - */ -class FuncletMappingImpl -{ -public: - FuncletMappingImpl(FuncletCode erase, FuncletCode write) - { - funclets[FuncletCode::ERASE] = erase; - funclets[FuncletCode::WRITE] = write; - } - - FuncletMappingImpl(FuncletCode erase, FuncletCode write, FuncletCode unlockBsl) - { - funclets[FuncletCode::ERASE] = erase; - funclets[FuncletCode::WRITE] = write; - funclets[FuncletCode::BSLUNLOCK] = unlockBsl; - } - - const std::map& getMap() const - { - return funclets; - } - -private: - std::map funclets; -}; - - -struct PowerSettingsImpl -{ -public: - PowerSettingsImpl(uint32_t powerTestRegMask, - uint32_t testRegEnableLpmx5, - uint32_t testRegDisableLpmx5, - uint16_t powerTestReg3VMask, - uint16_t testReg3VEnableLpmx5, - uint16_t testReg3VDisableLpmx5) - : powerTestRegMask_(powerTestRegMask), - testRegEnableLpmx5_(testRegEnableLpmx5), - testRegDisableLpmx5_(testRegDisableLpmx5), - powerTestReg3VMask_(powerTestReg3VMask), - testReg3VEnableLpmx5_(testReg3VEnableLpmx5), - testReg3VDisableLpmx5_(testReg3VDisableLpmx5){} - - - uint32_t powerTestRegMask_, testRegEnableLpmx5_, testRegDisableLpmx5_; - uint16_t powerTestReg3VMask_, testReg3VEnableLpmx5_, testReg3VDisableLpmx5_; -}; - - -struct FeaturesImpl -{ -public: - FeaturesImpl(ClockSystem clock, bool i2c, bool lcfe, bool quickMemRead, - bool sflldh, bool hasFram, bool noBsl) - : clock_(clock), i2c_(i2c), lcfe_(lcfe), quickMemRead_(quickMemRead), - sflldh_(sflldh), hasFram_(hasFram), noBsl_(noBsl) {} - - ClockSystem clock_; - bool i2c_, lcfe_, quickMemRead_, sflldh_, hasFram_, noBsl_; -}; - - -struct ExtendedFeaturesImpl -{ -public: - ExtendedFeaturesImpl(bool tmr, bool jtag, bool dtc, bool sync, bool instr, bool _1377, bool psach) - : tmr_(tmr), jtag_(jtag), dtc_(dtc), sync_(sync), instr_(instr), _1377_(_1377), psach_(psach) {} - - bool tmr_, jtag_, dtc_, sync_, instr_, _1377_, psach_; -}; - - -/** -\struct DeviceImplementation. - -\brief Non POD data holding struct which can be initialized at once through ctor. - -\note See Device. - -\note Retrieve Memory with help of getMemorySize() and getMemoryAt(). - -\note Contrary to all other implementation types, all templated devices will derive ffrom this one. - Needed to get Memory Modules integrated and have runtime iterable map. Idea would be to have Registration - construct the needed Device (and only that one as soon as we know which device - and handle on the type of - that device in DeviceDbmanagerExt or even throughout the whole program). - -*/ -struct DeviceImplementation -{ -public: - const std::string description_; - const size_t objectDbEntry_; - const uint8_t bits_; - const Psa flags_; - const MatchImpl match_; - const EemInfoImpl eemInfo_; - const VoltageInfoImpl voltageInfo_; - const ClockInfoImpl clockInfo_; - const FunctionMappingImpl fnctMap_; - const FuncletMappingImpl funcletMapping_; - const FeaturesImpl featuresInfo_; - const ExtendedFeaturesImpl extFeaturesInfo_; - const PowerSettingsImpl powerSettings_; - -public: - DeviceImplementation( - const std::string& description, - const size_t objectId, - const uint8_t bits, - const Psa flags, - const MatchImpl& match, - const EemInfoImpl& eemInfo, - const VoltageInfoImpl& voltageInfo, - const ClockInfoImpl& clockInfo, - const FunctionMappingImpl& fnctMap, - const FuncletMappingImpl& funcletMapping, - const FeaturesImpl& featuresInfo, - const ExtendedFeaturesImpl& extFeaturesInfo, - const PowerSettingsImpl& powerSettings - ) - : - description_(description), - objectDbEntry_(objectId), - bits_(bits), - flags_(flags), - match_(match), - eemInfo_(eemInfo), - voltageInfo_(voltageInfo), - clockInfo_(clockInfo), - fnctMap_(fnctMap), - funcletMapping_(funcletMapping), - featuresInfo_(featuresInfo), - extFeaturesInfo_(extFeaturesInfo), - powerSettings_(powerSettings) - { - - } - - /*! - \brief Returns number of memory modules. - - \returns number of memory modules - - */ - unsigned int getMemorySize() const {return DoGetMemorySize();} - - /*! - \brief Returns memory module at specific position. - - \returns memory module - - */ - const MemoryInfoImpl getMemoryAt(unsigned int idx) const {return DoGetMemoryAt(idx);} - - /*! - \brief Return flag enum as uint8_t - - \returns flag as uint8_t - - */ - uint8_t getFlagsAsUint8_t() const {return static_cast(flags_);} - -protected: - virtual unsigned int DoGetMemorySize() const = 0; - virtual const MemoryInfoImpl DoGetMemoryAt(unsigned int idx) const = 0; -}; - - namespace Memory { - //base classes to insure type-safety for memory parameters - class TypeBase{}; - class MappedBase{}; - class ProtectableBase{}; - class SizeBase{}; - class OffsetBase{}; - class SegSizebase{}; - class BankSizebase{}; - class BanksBase{}; - class MaskBase {}; - - /// All known memory module types at the moment. - In case this list should be extendend - /// in device modules, make const ints within a namespace, that way you could alter the "list" within another dependent cpp-file. - /// See and merge with EwtModules - namespace Name { - namespace { - //flash - extern const char main[] = "main"; - extern const char information[] = "information"; - extern const char boot[] = "boot"; - //ROM - extern const char bootCode[] = "bootcode"; - //RAM - extern const char system[] = "system"; - //registers - extern const char cpu[] = "CPU"; - extern const char eem[] = "EEM"; - extern const char sfr[] = "SFR"; - extern const char peripheral8bit[] = "peripheral8bit"; - extern const char peripheral16bit[] = "peripheral16bit"; - extern const char lcd[] = "lcd"; - } //namespace - } //namespace Name - } //namespace Memory -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI - -#endif //TEMPLATE_DEVICE_DB_DATABASEIMPLEMENTATION_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DeviceUnknown.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DeviceUnknown.cpp deleted file mode 100644 index b18dbda..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/DeviceUnknown.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * DeviceUnknown.cpp - * - * Definition unknown device for V2 compability. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430Defaults.h" -#include "Registration.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -extern const char deviceUnknown[] = "DeviceUnknown"; - -typedef ClockInfo NoClockInfo; - -//"null" id -typedef IdCode<0x00, 0x00, 0xFF, 0xFF, 0xFFFF, -1, 0xFF> IdCodeUnknownType; -//just some mask with no masking capability (all 1s) -typedef IdCode<0xFFFF, 0xFFFF, 0xFF, 0xFF, 0xFFFF, -1, 0xFF> MaskUnknownType; -typedef Match MatchUnknownType; - -typedef MemoryInfo< - deviceUnknown, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0> , Offset<0>, SegmentSize<0>, BankSize<0>, Banks<1>, - NoMask - > NoMemoryType; - -typedef Device< - deviceUnknown, - ObjectId<0>, - DefaultBits20Type, - regular, - MatchUnknownType, - LargeEemMode, - VoltageInfo<1800, 3600, 2700, 2500, 6000, 7000, false>, - NoClockInfo, - FunctionMappingXv2, - FuncletMappingNone, - MemoryList > - > DeviceUnknownType; - -static const DeviceRegistrator regDeviceUnknownType; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430AFE2xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430AFE2xx.cpp deleted file mode 100644 index 3c477ed..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430AFE2xx.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * MSP430AFE2xx.cpp - * - * Definition MSP430AFE2xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430AFE2xx_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF, 0x0> MSP430AFE2xxIdMask; - -template -struct MSP430AFE2xx_Match : Match< IdCode<0x5302, 0x0, 0, 0, 0, 0, fuses, 0>, MSP430AFE2xxIdMask> {}; - -template -struct MemoryModel : MemoryList, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< RamSize >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -typedef MemoryModel< Offset<0xF000>, Size<0x1000>, Size<0x100> > MemoryModel1000; -typedef MemoryModel< Offset<0xE000>, Size<0x2000>, Size<0x200> > MemoryModel2000; -typedef MemoryModel< Offset<0xC000>, Size<0x4000>, Size<0x200> > MemoryModel4000; - -typedef Features MSP430AFE2xx_Features; - - -struct FunctionMappingAFE2xx : public FunctionMappingBase -{ - FunctionMappingAFE2xx() - { - FunctionMappingImpl::fcntMap_ = boost::assign::map_list_of - (ID_EemDataExchange, ID_EemDataExchangeAFE2xx); - } -}; - - -template< - const char* description, - const char fuses, - class MemoryModelType -> -struct MSP430AFE2xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430AFE2xx_Match, - LowEemMode, - MSP430F2xxx_DefaultVoltageTestVpp, - MSP430AFE2xx_ClockInfo, - FunctionMappingAFE2xx, - FuncletMapping1_2xx, - MemoryModelType, - MSP430AFE2xx_Features - > {}; - -extern const char MSP430AFE220[] = "MSP430AFE220"; -extern const char MSP430AFE230[] = "MSP430AFE230"; -extern const char MSP430AFE250[] = "MSP430AFE250"; -extern const char MSP430AFE221[] = "MSP430AFE221"; -extern const char MSP430AFE231[] = "MSP430AFE231"; -extern const char MSP430AFE251[] = "MSP430AFE251"; -extern const char MSP430AFE222[] = "MSP430AFE222"; -extern const char MSP430AFE232[] = "MSP430AFE232"; -extern const char MSP430AFE252[] = "MSP430AFE252"; -extern const char MSP430AFE223[] = "MSP430AFE223"; -extern const char MSP430AFE233[] = "MSP430AFE233"; -extern const char MSP430AFE253[] = "MSP430AFE253"; - -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE253; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE233; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE223; - -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE252; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE232; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE222; - -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE251; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE231; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE221; - -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE250; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE230; -static const DeviceRegistrator< MSP430AFE2xx > regMSP430AFE220; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430C092.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430C092.cpp deleted file mode 100644 index 25fa22f..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430C092.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * MSP430C092.cpp - * - * Definition of MSP430C092 devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" -#include "LockableRamMemoryAccess.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x0, 0xFFFFFFFF> MSP430C092IdMask; - -template -struct MSP430C092_Match : Match< - IdCode, - MSP430C092IdMask> {}; - -struct MSP430C0xx_Timer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430C0xx_Timer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::CCS, Eem::APOOL, - Eem::Empty, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430C0xx_Clock; - -typedef MemoryInfo< - Name::main, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x60> , Offset<0x1c00>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask,MemoryCreator -> MSP430C0xx_MainRamMemory; - - -typedef MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x80> , Offset<0x2380>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask -> MSP430C0xx_SystemRamMemory; - - -typedef MemoryInfo< - Name::bootCode, RomType, Mapped, NotProtectable, Bits16Type, - Size<0x7E0> , Offset<0xF800>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430C0xx_BootCodeMemoryInfo; - -extern const char vectorTableNameC092[] = "VectorTable"; -typedef MemoryInfo< - vectorTableNameC092, RomType, Mapped, NotProtectable, Bits16Type, - Size<0x20> , Offset<0xFFE0>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430C0xx_VectorTableMemoryInfo; - -typedef VoltageInfo<900, 1800, 0, 0, 0, 0, false> MSP430C092VoltageInfo; - - -typedef Features MSP430C092_Features; - -template< - const char* description, - const unsigned int versionId -> -struct MSP430C0xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430C092_Match, - ExtraSmallEemMode, - MSP430C092VoltageInfo, - MSP430C0xx_Clock, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430C092_Features - > {}; - -extern const char MSP430C092[] = "MSP430C092"; - -static const DeviceRegistrator< MSP430C0xx > regMSP430C092_type; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430C092EMU.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430C092EMU.cpp deleted file mode 100644 index 4a9def0..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430C092EMU.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * MSP430C092EMU.cpp - * - * Definition of MSP430C092EMU devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" -#include "LockableRamMemoryAccess.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x0, 0xFFFFFFFF> MSP430C092IdMask; - -template -struct MSP430C092_Match : Match< - IdCode, - MSP430C092IdMask> {}; - -struct MSP430C0xx_Timer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430C0xx_Timer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::CCS, Eem::APOOL, - Eem::Empty, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430C0xx_Clock; - -typedef MemoryInfo< - Name::main, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x760> , Offset<0xF880>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask, MemoryCreator -> MSP430C0xx_MainRamMemory; - - -typedef MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x80> , Offset<0x2380>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask -> MSP430C0xx_SystemRamMemory; - -typedef MemoryInfo< - Name::bootCode, RomType, Mapped, NotProtectable, Bits16Type, - Size<0x80> , Offset<0xF800>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430C0xx_BootCodeMemoryInfo; - -extern const char vectorTableNameC092Emu[] = "VectorTable"; -typedef MemoryInfo< - vectorTableNameC092Emu, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x20> , Offset<0xFFE0>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator /*MemoryCreator*/ - > MSP430C0xx_VectorTableMemoryInfo; - -typedef VoltageInfo<900, 1800, 0, 0, 0, 0, false> MSP430C092VoltageInfo; - - -typedef Features MSP430C092_Features; - -template< - const char* description, - const unsigned int versionId -> -struct MSP430C0xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430C092_Match, - ExtraSmallEemMode, - MSP430C092VoltageInfo, - MSP430C0xx_Clock, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430C092_Features - > {}; - -extern const char MSP430C092EMU[] = "MSP430L092"; - -//not official -static const DeviceRegistrator< MSP430C0xx > regMSP430C092EMU_type; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430Defaults.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430Defaults.h deleted file mode 100644 index b4a30f4..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430Defaults.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - * MSP430Defaults.h - * - * Default values to be used when devices are created, e.g. within MSP43054xx.cpp. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_MSP430DEFAULTS_H -#define TEMPLATE_DEVICE_DB_MSP430DEFAULTS_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "Registration.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - -struct FunctionMappingBasic; -struct FunctionMappingX; -struct FunctionMappingXv2; - -enum EMEX_MODE -{ - /// Device has no Emex module. - EMEX_NONE =0, - /// Device Emex module has two breakpoints. - EMEX_LOW = 1, - /// Device Emex module has three breakpoints and range comparison. - EMEX_MEDIUM = 2, - /// Device Emex module has eight breakpoints, range comparison, state storage, and trigger sequencer, - EMEX_HIGH = 3, - EMEX_EXTRA_SMALL_5XX = 4, - EMEX_SMALL_5XX = 5, - EMEX_MEDIUM_5XX =6, - EMEX_LARGE_5XX =7 -}; - -typedef Trigger NoneTrigger; -typedef Trigger LowTrigger; -typedef Trigger MedTrigger; -typedef Trigger HighTrigger; - -typedef Trigger ExtraSmallTrigger; -typedef Trigger SmallTrigger; -typedef Trigger MediumTrigger; -typedef Trigger LargeTrigger; - -typedef Sequencer<0x00, 0x00, 0x00, 0x00, 0x00> SmallSequencer; -typedef Sequencer<0x01, 0x02, 0x00, 0x00, 0x00> MediumSequencer; -typedef Sequencer<0x03, 0x04, 0x00, 0x00, 0x00> LargeSequencer; - -typedef EemInfo<0, 0, 0, NoneTrigger, SmallSequencer> NoneEemMode; -typedef EemInfo<0, 0, 0, LowTrigger, SmallSequencer> LowEemMode; -typedef EemInfo<0, 0, 0, MedTrigger, SmallSequencer> MedEemMode; -typedef EemInfo<0x8, 0, 0, HighTrigger, MediumSequencer> HighEemMode; - -typedef EemInfo<0x00, 0x01, 0x00, ExtraSmallTrigger, SmallSequencer> ExtraSmallEemMode; -typedef EemInfo<0x00, 0x01, 0x00, SmallTrigger, SmallSequencer> SmallEemMode; -typedef EemInfo<0x00, 0x01, 0x00, MediumTrigger, MediumSequencer> MediumEemMode; -typedef EemInfo<0x08, 0x02, 0x01, LargeTrigger, LargeSequencer> LargeEemMode; - -namespace Memory { -typedef MemoryInfo< - Name::peripheral16bit, RegisterType, Mapped, NotProtectable, Bits16Type, - Size<0x100> , Offset<0x0100>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F1_2_4xxx_peripherl16lbitMemoryInfo; - -template -struct MSP430F1_2_4xxx_peripherl8lbitMemoryInfo : MemoryInfo< - Name::peripheral8bit, RegisterType, Mapped, NotProtectable, Bits8Type, - Size<0x100> , Offset<0x0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, Mask> {}; -} //namespace Memory - -struct FunctionMappingBase : public FunctionMappingImpl -{ -}; - -struct FunctionMappingNone : public FunctionMappingBase -{ -}; - -struct FunctionMappingX : public FunctionMappingBase -{ - FunctionMappingX(){ - FunctionMappingImpl::fcntMap_ = boost::assign::map_list_of - (ID_SyncJtag_AssertPor_SaveContext, ID_SyncJtag_AssertPor_SaveContextX) - (ID_SyncJtag_Conditional_SaveContext,ID_SyncJtag_Conditional_SaveContextX) - (ID_RestoreContext_ReleaseJtag,ID_RestoreContext_ReleaseJtagX) - (ID_ReadMemWords,ID_ReadMemWordsX) - (ID_ReadMemQuick,ID_ReadMemQuickX) - (ID_WriteMemWords,ID_WriteMemWordsX) - (ID_EemDataExchange,ID_EemDataExchangeX) - (ID_SingleStep,ID_SingleStepX) - (ID_ReadAllCpuRegs,ID_ReadAllCpuRegsX) - (ID_WriteAllCpuRegs,ID_WriteAllCpuRegsX) - (ID_Psa,ID_PsaX) - (ID_ExecuteFunclet,ID_ExecuteFuncletX) - (ID_GetDcoFrequency,ID_GetDcoFrequencyX) - (ID_WaitForStorage,ID_WaitForStorageX); - } -}; - -struct FunctionMappingXv2 : public FunctionMappingBase -{ - FunctionMappingXv2(){ - FunctionMappingImpl::fcntMap_ = boost::assign::map_list_of - (ID_BlowFuse, ID_BlowFuseXv2) - (ID_SyncJtag_AssertPor_SaveContext, ID_SyncJtag_AssertPor_SaveContextXv2) - (ID_SyncJtag_Conditional_SaveContext,ID_SyncJtag_Conditional_SaveContextXv2) - (ID_RestoreContext_ReleaseJtag,ID_RestoreContext_ReleaseJtagXv2) - (ID_ReadMemBytes,ID_ReadMemWordsXv2) - (ID_ReadMemWords,ID_ReadMemWordsXv2) - (ID_ReadMemQuick,ID_ReadMemQuickXv2) - (ID_WriteMemBytes,ID_WriteMemWordsXv2) - (ID_WriteMemWords,ID_WriteMemWordsXv2) - (ID_EemDataExchange,ID_EemDataExchangeXv2) - (ID_SingleStep,ID_SingleStepXv2) - (ID_ReadAllCpuRegs,ID_ReadAllCpuRegsXv2) - (ID_WriteAllCpuRegs,ID_WriteAllCpuRegsXv2) - (ID_Psa,ID_PsaXv2) - (ID_PollJStateReg,ID_PollJStateRegFR57xx) - (ID_ExecuteFunclet,ID_ExecuteFuncletXv2) - (ID_WaitForStorage,ID_WaitForStorageX); - } -}; - - -struct FunctionMappingXv2FRAM : public FunctionMappingBase -{ - FunctionMappingXv2FRAM(){ - FunctionMappingImpl::fcntMap_ = boost::assign::map_list_of - (ID_BlowFuse, ID_BlowFuseFram) - (ID_SyncJtag_AssertPor_SaveContext, ID_SyncJtag_AssertPor_SaveContextXv2) - (ID_SyncJtag_Conditional_SaveContext,ID_SyncJtag_Conditional_SaveContextXv2) - (ID_RestoreContext_ReleaseJtag,ID_RestoreContext_ReleaseJtagXv2) - (ID_ReadMemBytes,ID_ReadMemWordsXv2) - (ID_ReadMemWords,ID_ReadMemWordsXv2) - (ID_ReadMemQuick,ID_ReadMemQuickXv2) - (ID_WriteMemBytes,ID_WriteMemWordsXv2) - (ID_WriteMemWords,ID_WriteMemWordsXv2) - (ID_EemDataExchange,ID_EemDataExchangeXv2) - (ID_SingleStep,ID_SingleStepXv2) - (ID_ReadAllCpuRegs,ID_ReadAllCpuRegsXv2) - (ID_WriteAllCpuRegs,ID_WriteAllCpuRegsXv2) - (ID_Psa,ID_PsaXv2) - (ID_PollJStateReg,ID_PollJStateRegFR57xx) - (ID_ExecuteFunclet,ID_ExecuteFuncletXv2) - (ID_WaitForStorage,ID_WaitForStorageX); - } -}; - - -struct FuncletMappingNone : FuncletMappingImpl -{ - FuncletMappingNone() - : FuncletMappingImpl(FuncletCode(), FuncletCode()) {} -}; - - -struct FuncletMapping1_2xx : FuncletMappingImpl -{ - FuncletMapping1_2xx() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeDCO, sizeof(eraseFuncletCodeDCO), 4 ), - FuncletCode( writeFuncletCodeDCO, sizeof(writeFuncletCodeDCO), 128 ) ) - {} -}; - - -struct FuncletMappingX1_2xx : FuncletMappingImpl -{ - FuncletMappingX1_2xx() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeXDCO, sizeof(eraseFuncletCodeXDCO), 4 ), - FuncletCode( writeFuncletCodeXDCO, sizeof(writeFuncletCodeXDCO), 256 ) ) - {} -}; - - -struct FuncletMappingXv2 : FuncletMappingImpl -{ - FuncletMappingXv2() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeXv2, sizeof(eraseFuncletCodeXv2) ), - FuncletCode( writeFuncletCodeXv2, sizeof(writeFuncletCodeXv2) ), - FuncletCode( UnlockBslFuncletCodeXv2, sizeof(UnlockBslFuncletCodeXv2)) - ) - {} -}; - -struct FuncletMappingXv2WordMode : FuncletMappingImpl -{ - FuncletMappingXv2WordMode() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeXv2, sizeof(eraseFuncletCodeXv2) ), - FuncletCode( writeFuncletCodeXv2WordMode, sizeof(writeFuncletCodeXv2WordMode) ), - FuncletCode( UnlockBslFuncletCodeXv2, sizeof(UnlockBslFuncletCodeXv2)) - ) - {} -}; - - - -struct FuncletMappingXv2FRAM : FuncletMappingImpl -{ - FuncletMappingXv2FRAM() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeXv2FRAM, sizeof(eraseFuncletCodeXv2FRAM) ), - FuncletCode( writeFuncletCodeXv2FRAM, sizeof(writeFuncletCodeXv2FRAM) ) ) - {} -}; - - -/// One of the following enumerations is returned in device.clockControl -enum DEVICE_CLOCK_CONTROL -{ - /// Device has no clock control. The system clock continue to function when the device is stopped by JTAG. - GCC_NONE, - /// Device has General Clock Control register. - GCC_STANDARD, - /// Device has Extended General Clock Control register and Module Clock Control register 0. - GCC_EXTENDED, -}; - -struct EmptyEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - EmptyEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - - -struct EmptyEemClockNames : EemClocksImpl -{ - typedef EemClocksImpl::Clocks Clock; - EmptyEemClockNames() : EemClocksImpl( - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty - ) - {} -}; - -struct StandardEemClockNames : EemClocksImpl -{ - typedef EemClocksImpl::Clocks Clock; - StandardEemClockNames() : EemClocksImpl( - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::SMCLK, Clock::ACLK, Clock::Empty - ) - {} -}; - -struct TAClkEemClockNames : EemClocksImpl -{ - typedef EemClocksImpl::Clocks Clock; - TAClkEemClockNames() : EemClocksImpl( - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::Empty, Clock::Empty, - Clock::Empty, Clock::Empty, Clock::TACLK, Clock::Empty, - Clock::Empty, Clock::SMCLK, Clock::ACLK, Clock::Empty - ) - {} -}; - -///You can also overwrite parts of a function mapping. See this example code: -/*struct FunctionMappingTest : public FunctionMappingXv2 -{ - FunctionMappingTest() : FunctionMappingXv2() { - ReplacePair(ID_Psa,ID_PsaMy); - } -};*/ - -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_MSP430DEFAULTS_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F11xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F11xx.cpp deleted file mode 100644 index 4932afa..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F11xx.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * MSP430F11xx.cpp - * - * Definition MSP430F11xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430F11xx_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0xFF, 0xFF, 0xFFFF, 0x00, 0x00> MSP430F11x1DIdMask; -typedef IdCode<0xFFFF, 0x00, 0xFF, 0x00, 0xFFFF, 0x00, 0x00> MSP430F11x1AIdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00> MSP430F11x2IdMask; - -typedef Match< IdCode<0x12F1, 0x0, 0x10, 0x40, 0x0, 0,0>, MSP430F11x1DIdMask> MSP430F11x1D_Match; -typedef Match< IdCode<0x12F1, 0x0, 0x13, 0, 0x0, 0,0>, MSP430F11x1AIdMask> MSP430F11x1A_Match; -typedef Match< IdCode<0x3211, 0x0, 0,0,0,0,0>, MSP430F11x2IdMask> MSP430F11x2_Match; - -template< - const char* description, - class MatchType, - class FlashSizeType, - class OffsetType, - class RamSize, - class InfoMemoryType = MSP430F1xxx_InfoFlashMemoryInfo -> -struct MSP430F11xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MatchType, - LowEemMode, - MSP430F1xxx_DefaultVoltageTestVpp, - MSP430F11xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - Features - > {}; - -extern const char MSP430F1121D[] = "MSP430F11x1"; -extern const char MSP430F1121A[] = "MSP430F11x1A"; -extern const char MSP430F1132[] = "MSP430F11x2"; - -typedef MSP430F11xx, Offset<0xF000>, Size<0x100> > MSP430F1121D_type; -typedef MSP430F11xx, Offset<0xF000>, Size<0x100> > MSP430F1121A_type; -typedef MSP430F11xx, Offset<0xE000>, Size<0x100> > MSP430F1132_type; - -static const DeviceRegistrator regMSP430F1121D; -static const DeviceRegistrator regMSP430F1121A; -static const DeviceRegistrator regMSP430F1132; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F12xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F12xx.cpp deleted file mode 100644 index a4673e5..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F12xx.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * MSP430F12xx.cpp - * - * Definition MSP430F12xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00> MSP430F12xIdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00> MSP430F12x2IdMask; - -typedef Match< IdCode<0x23F1, 0x0, 0,0,0,0,0>, MSP430F12xIdMask> MSP430F12x_Match; -typedef Match< IdCode<0x3212, 0x0, 0, 0, 0,0,0>, MSP430F12x2IdMask> MSP430F12x2_Match; - -typedef ClockInfo MSP430F12xx_ClockInfo; - -typedef Features MSP430F12x_Features; -typedef ExtendedFeatures MSP430F12x_ExtFeatures; - -struct FunctionMappingF12x : public FunctionMappingNone -{ - FunctionMappingF12x() { - ReplacePair(ID_ExecuteFunclet, ID_ExecuteFuncletJtag); - ReplacePair(ID_GetDcoFrequency, ID_GetDcoFrequencyJtag); - } -}; - -template< - const char* description, - class MatchType, - class FunctionMappingType, - class FlashSizeType, - class OffsetType, - class Features = MSP430F1xxx_NoI2C, - class ExtendedFeatures = NoExtendedFeatures -> -struct MSP430F12xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MatchType, - LowEemMode, - MSP430F1xxx_DefaultVoltageTestVpp, - MSP430F12xx_ClockInfo, - FunctionMappingType, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo< Size<0x100> >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - Features, - ExtendedFeatures - > {}; - -extern const char MSP430F123[] = "MSP430F12x"; -extern const char MSP430F1232[] = "MSP430F12x2/F11x2"; - -typedef MSP430F12xx< - MSP430F123, MSP430F12x_Match, - FunctionMappingF12x, - Size<0x2000>, Offset<0xE000>, - MSP430F12x_Features, MSP430F12x_ExtFeatures -> MSP430F123_type; - -typedef MSP430F12xx< - MSP430F1232, MSP430F12x2_Match, - FunctionMappingNone, - Size<0x2000>, Offset<0xE000> -> MSP430F1232_type; - -static const DeviceRegistrator regMSP430F123; -static const DeviceRegistrator regMSP430F1232; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F13xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F13xx.cpp deleted file mode 100644 index 56ed767..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F13xx.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - * MSP430F13xx.cpp - * - * Definition MSP430F13xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430F13xx_ClockInfo; - -template< - const char* description, - const unsigned int versionId, - const unsigned int fuses, - class FlashSizeType, - class OffsetType, - class RamSize -> -struct MSP430F13xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F1xxx_Match, - MedEemMode, - MSP430F1xxx_DefaultVoltageNoTestVpp, - MSP430F13xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F1xxx_NoI2C - > {}; - -extern const char MSP430F133[] = "MSP430F133"; -extern const char MSP430F135[] = "MSP430F135"; - -typedef MSP430F13xx, Offset<0xE000>, Size<0x100> > MSP430F133_type; -typedef MSP430F13xx, Offset<0xC000>, Size<0x200> > MSP430F135_type; - -static const DeviceRegistrator regMSP430F133; -static const DeviceRegistrator regMSP430F135; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F14xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F14xx.cpp deleted file mode 100644 index 0b80e73..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F14xx.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * MSP430F14xx.cpp - * - * Definition MSP430F14xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430F14xx_ClockInfo; - -template< - const char* description, - const unsigned int versionId, - const unsigned int fuses, - class FlashSizeType, - class OffsetType, - class RamSize -> -struct MSP430F14xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F1xxx_Match, - MedEemMode, - MSP430F1xxx_DefaultVoltageNoTestVpp, - MSP430F14xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F1xxx_NoI2C - > {}; - -extern const char MSP430F147[] = "MSP430F147"; -extern const char MSP430F148[] = "MSP430F148"; -extern const char MSP430F149[] = "MSP430F149"; -extern const char MSP430F1471[] = "MSP430F1471"; -extern const char MSP430F1481[] = "MSP430F1481"; -extern const char MSP430F1491[] = "MSP430F1491"; - -// description, versionId, fuses, flash size, flash offset, ram size -typedef MSP430F14xx, Offset<0x8000>, Size<0x400> > MSP430F147_type; -typedef MSP430F14xx, Offset<0x4000>, Size<0x800> > MSP430F148_type; -typedef MSP430F14xx, Offset<0x1100>, Size<0x800> > MSP430F149_type; - -typedef MSP430F14xx, Offset<0x8000>, Size<0x1400> > MSP430F1471_type; -typedef MSP430F14xx, Offset<0x4000>, Size<0x2800> > MSP430F1481_type; -typedef MSP430F14xx, Offset<0x1100>, Size<0x1400> > MSP430F1491_type; - -static const DeviceRegistrator regMSP430F147; -static const DeviceRegistrator regMSP430F148; -static const DeviceRegistrator regMSP430F149; - -static const DeviceRegistrator regMSP430F1471; -static const DeviceRegistrator regMSP430F1481; -static const DeviceRegistrator regMSP430F1491; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F15x.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F15x.cpp deleted file mode 100644 index 76c1dd5..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F15x.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * MSP430F15x.cpp - * - * Definition MSP430F15x devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -struct MSP430F15x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F15x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::FLASH_CTRL, Eem::Empty, Eem::USART0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F15x_ClockInfo; - -template< - const char* description, - const unsigned int versionId, - const unsigned int fuses, - class FlashSizeType, - class OffsetType, - class RamSize -> -struct MSP430F15x : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F1xxx_Match, - HighEemMode, - MSP430F1xxx_DefaultVoltageNoTestVpp, - MSP430F15x_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F1xxx_I2C - > {}; - -extern const char MSP430F155[] = "MSP430F155"; -extern const char MSP430F156[] = "MSP430F156"; -extern const char MSP430F157[] = "MSP430F157"; - -typedef MSP430F15x, Offset<0xC000>, Size<0x200> > MSP430F155_type; -typedef MSP430F15x, Offset<0xA000>, Size<0x400> > MSP430F156_type; -typedef MSP430F15x, Offset<0x8000>, Size<0x400> > MSP430F157_type; - -static const DeviceRegistrator regMSP430F155; -static const DeviceRegistrator regMSP430F156; -static const DeviceRegistrator regMSP430F157; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F16xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F16xx.cpp deleted file mode 100644 index 8c9ac98..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F16xx.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - * MSP430F16xx.cpp - * - * Definition MSP430F51xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -template -struct MSP430F16xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - FlashSizeType , OffsetType, SegmentSize<0x200>, BankSize<0x10000>, Banks<1>, - NoMask> {}; - - -struct MSP430F16xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F16xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::FLASH_CTRL, Eem::USART1, Eem::USART0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F16xx_ClockInfo; - -template< - const char* description, - class MatchType, - class FlashSizeType, - class OffsetType, - class RamSize -> -struct MSP430F16x : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MatchType, - HighEemMode, - MSP430F1xxx_DefaultVoltageNoTestVpp, - MSP430F16xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F1xxx_I2C - > {}; - -typedef IdCode<0xFFFF, 0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x07> MSP430F161xIdMask; - -template -struct MSP430F161x_Match : Match< IdCode, MSP430F161xIdMask> {}; - -template< - const char* description, - const unsigned int versionId, - const unsigned int fuses, - class FlashSizeType, - class OffsetType, - class Ram2Size -> -struct MSP430F161x : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F161x_Match, - HighEemMode, - MSP430F1xxx_DefaultVoltageNoTestVpp, - MSP430F16xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, - MSP430F1xxx_InfoFlashMemoryInfo, - MSP430F1xxx_BootFlashMemoryInfo, - MSP430F1xxx_SystemRamInfo< Size<0x800> >, - MSP430F1xxx_SystemRam2Info, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F1xxx_CPUMemoryInfo, - MSP430F1xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F1xxx_I2C -> {}; - -extern const char MSP430F167[] = "MSP430F167"; -extern const char MSP430F168[] = "MSP430F168"; -extern const char MSP430F169[] = "MSP430F169"; -extern const char MSP430F1610[] = "MSP430F1610"; -extern const char MSP430F1611[] = "MSP430F1611"; -extern const char MSP430F1612[] = "MSP430F1612"; - -typedef MSP430F16x, Size<0x8000>, Offset<0x8000>, Size<0x400> > MSP430F167_type; -typedef MSP430F16x, Size<0xC000>, Offset<0x4000>, Size<0x800> > MSP430F168_type; -typedef MSP430F16x, Size<0xEF00>, Offset<0x1100>, Size<0x800> > MSP430F169_type; -typedef MSP430F16x, Size<0xEF00>, Offset<0x1100>, Size<0x800> > MSP430F169_1611based_type; - -typedef MSP430F161x, Offset<0x8000>, Size<0x1400> > MSP430F1610_type; -typedef MSP430F161x, Offset<0x4000>, Size<0x2800> > MSP430F1611_type; -typedef MSP430F161x, Offset<0x2500>, Size<0x1400> > MSP430F1612_type; - -static const DeviceRegistrator regMSP430F167; -static const DeviceRegistrator regMSP430F168; -static const DeviceRegistrator regMSP430F169; - -static const DeviceRegistrator regMSP430F1610; -static const DeviceRegistrator regMSP430F1611; -static const DeviceRegistrator regMSP430F1612; -static const DeviceRegistrator regMSP430F169_1611based; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1_2_4xxx_masks.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1_2_4xxx_masks.cpp deleted file mode 100644 index e815491..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1_2_4xxx_masks.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * MSP430F1_2_4xxx_mask.cpp - * - * Definition of mask for MSP430F1_2_4xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F1_2_4xxx_masks.h" - - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb{ -namespace Memory { - const uint8_t sfrMaskData_33ff13ffffff[SFR_MASK_SIZE] = {0x33, 0xff, 0x13, 0xff, 0xff, 0xff}; - const uint8_t sfrMaskData_33ff1fffffff[SFR_MASK_SIZE] = {0x33, 0xff, 0x1f, 0xff, 0xff, 0xff}; - const uint8_t sfrMaskData_f330d330c030[SFR_MASK_SIZE] = {0xf3, 0x30, 0xd3, 0x30, 0xc0, 0x30}; - const uint8_t sfrMaskData_33801380ffff[SFR_MASK_SIZE] = {0x33, 0x80, 0x13, 0x80, 0xff, 0xff}; - const uint8_t sfrMaskData_33031303ff03[SFR_MASK_SIZE] = {0x33, 0x03, 0x13, 0x03, 0xff, 0x03}; - const uint8_t sfrMaskData_f380d380c0ff[SFR_MASK_SIZE] = {0xf3, 0x80, 0xd3, 0x80, 0xc0, 0xff}; - const uint8_t sfrMaskData_f3b0d3b0c030[SFR_MASK_SIZE] = {0xf3, 0xb0, 0xd3, 0xb0, 0xc0, 0x30}; - const uint8_t sfrMaskData_33801f80ffff[SFR_MASK_SIZE] = {0x33, 0x80, 0x1f, 0x80, 0xff, 0xff}; - const uint8_t sfrMaskData_338f1f1fffff[SFR_MASK_SIZE] = {0x33, 0x8f, 0x1f, 0x1f, 0xff, 0xff}; - const uint8_t sfrMaskData_338f1f8fffff[SFR_MASK_SIZE] = {0x33, 0x8f, 0x1f, 0x8f, 0xff, 0xff}; - const uint8_t sfrMaskData_33bf13bfff30[SFR_MASK_SIZE] = {0x33, 0xbf, 0x13, 0xbf, 0xff, 0x30}; - const uint8_t sfrMaskData_330f1f0fffff[SFR_MASK_SIZE] = {0x33, 0x0f, 0x1f, 0x0f, 0xff, 0xff}; - const uint8_t sfrMaskData_f3ffd3ffc0ff[SFR_MASK_SIZE] = {0xf3, 0xff, 0xd3, 0xff, 0xc0, 0xff}; - const uint8_t sfrMaskData_f3ffdfffc0ff[SFR_MASK_SIZE] = {0xf3, 0xff, 0xdf, 0xff, 0xc0, 0xff}; -} //namespace Memory -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1_2_4xxx_masks.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1_2_4xxx_masks.h deleted file mode 100644 index e4a885f..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1_2_4xxx_masks.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * MSP430F1_2_4xxx_masks.h - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_MSP430F1_2_4XXX_MASK_H -#define TEMPLATE_DEVICE_DB_MSP430F1_2_4XXX_MASK_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include -#include "Registration.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb{ -namespace Memory { - -#define SFR_MASK_SIZE 6 - -extern const uint8_t sfrMaskData_33ff13ffffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_33ff1fffffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_f330d330c030[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_33801380ffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_33031303ff03[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_f380d380c0ff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_f3b0d3b0c030[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_33801f80ffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_338f1f1fffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_338f1f8fffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_33bf13bfff30[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_330f1f0fffff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_f3ffd3ffc0ff[SFR_MASK_SIZE]; -extern const uint8_t sfrMaskData_f3ffdfffc0ff[SFR_MASK_SIZE]; - -typedef MemoryMask sfrMask_33ff13ffffff; -typedef MemoryMask sfrMask_33ff1fffffff; -typedef MemoryMask sfrMask_f330d330c030; -typedef MemoryMask sfrMask_33801380ffff; -typedef MemoryMask sfrMask_33031303ff03; -typedef MemoryMask sfrMask_f380d380c0ff; -typedef MemoryMask sfrMask_f3b0d3b0c030; -typedef MemoryMask sfrMask_33801f80ffff; -typedef MemoryMask sfrMask_338f1f1fffff; -typedef MemoryMask sfrMask_338f1f8fffff; -typedef MemoryMask sfrMask_33bf13bfff30; -typedef MemoryMask sfrMask_330f1f0fffff; -typedef MemoryMask sfrMask_f3ffd3ffc0ff; -typedef MemoryMask sfrMask_f3ffdfffc0ff; - -} //namespace Memory -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //namespace TEMPLATE_DEVICE_DB_MSP430F1_2_4XXX_MASK_H diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1xxx.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1xxx.h deleted file mode 100644 index 12487a3..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F1xxx.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * MSP430F1xxx.h - * - * Default values for MSP430F1xxx familiy - to be used when devices are created, e.g. within MSP43054xx.cpp. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_MSP430F1XXX_H -#define TEMPLATE_DEVICE_DB_MSP430F1XXX_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "SpecialMemoryTypes.h" -#include "MSP430Defaults.h" -#include "MSP430F1_2_4xxx_masks.h" -#include "Registration.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - typedef IdCode<0xFFFF, 0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x0F> MSP430F1xxxIdMask; - - template - struct MSP430F1xxx_Match : Match< IdCode, MSP430F1xxxIdMask> {}; - - namespace Memory { - typedef MemoryInfo< - Name::information, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x100> , Offset<0x1000>, SegmentSize<0x80>, BankSize<0x80>, Banks<2>, - NoMask, MemoryCreator - > MSP430F1xxx_InfoFlashMemoryInfo; - - ///bsl memory - typedef MemoryInfo< - Name::boot, FlashType, Mapped, Protectable, Bits16Type, - Size<0x400> , Offset<0x0c00>, SegmentSize<0x200>, BankSize<0>, Banks<4>, - NoMask, MemoryCreator - > MSP430F1xxx_BootFlashMemoryInfo; - - typedef MemoryInfo< - Name::cpu, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x10> , Offset<0x0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F1xxx_CPUMemoryInfo; - - typedef MemoryInfo< - Name::eem, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x80> , Offset<0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F1xxx_EEMMemoryInfo; - - template - struct MSP430F1xxx_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x200>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - template - struct MSP430F1xxx_SystemRam2Info : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x1100>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - template - struct MSP430F1xxx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - FlashSizeType , OffsetType, SegmentSize<0x200>, BankSize<0x10000>, Banks<1>, - NoMask> {}; - } //namespace Memory - - typedef VoltageInfo<1800, 3600, 2700, 2500, 6000, 7000, true> MSP430F1xxx_DefaultVoltageTestVpp; - typedef VoltageInfo<1800, 3600, 2700, 2500, 6000, 7000, false> MSP430F1xxx_DefaultVoltageNoTestVpp; - - typedef Features MSP430F1xxx_I2C; - typedef Features MSP430F1xxx_NoI2C; - -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_MSP430F1XXX_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F20xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F20xx.cpp deleted file mode 100644 index acd1cb1..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F20xx.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * MSP430F20xx.cpp - * - * Definition MSP430F20xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430F20xx_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00> MSP430F20xxIdMask; - -template -struct MSP430F20xx_Match : Match< IdCode<0x01F2, 0x0, 0, 0, 0, config,0>, MSP430F20xxIdMask> {}; - -template -struct MemoryModel : MemoryList, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< Size<0x80> >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -typedef MemoryModel< Offset<0xFC00>, Size<0x400> > MemoryModel1; -typedef MemoryModel< Offset<0xF800>, Size<0x800> > MemoryModel2; - - -typedef Features MSP430F20xx_Features; - - -template< - const char* description, - const char config, - class MemoryModelType -> -struct MSP430F20xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F20xx_Match, - LowEemMode, - MSP430F2xxx_DefaultVoltageTestVpp, - MSP430F20xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryModelType, - MSP430F20xx_Features - > {}; - -extern const char MSP430F2011[] = "F20x1_G2x0x_G2x1x"; -extern const char MSP430F2012[] = "F20x2_G2x2x_G2x3x"; -extern const char MSP430F2013[] = "MSP430F20x3"; - -static const DeviceRegistrator< MSP430F20xx > regMSP430F2011; -static const DeviceRegistrator< MSP430F20xx > regMSP430F2012; -static const DeviceRegistrator< MSP430F20xx > regMSP430F2013; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F21xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F21xx.cpp deleted file mode 100644 index f35e7d0..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F21xx.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * MSP430F21xx.cpp - * - * Definition MSP430F21xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430F21xx_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00> MSP430F21x1IdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x03> MSP430F21x2IdMask; - -typedef Match< IdCode<0x13F2, 0, 0, 0, 0, 0x1, 0>, MSP430F21x1IdMask> MSP430F21x1_Match; - -template -struct MSP430F21x2_Match : Match< IdCode<0x13F2, 0, 0, 0, 0, 0x2, fuses>, MSP430F21x2IdMask> {}; - - -template -struct MemoryModel : MemoryList, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< RamSize >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -template< - const char* description, - const unsigned int FlashOffset, - const unsigned int FlashSize, - const unsigned int RamSize -> -struct MSP430F21x1 : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F21x1_Match, - LowEemMode, - MSP430F2xxx_DefaultVoltageTestVpp, - MSP430F21xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryModel< Offset, Size, Size > - > {}; - - -template< - const char* description, - const unsigned int fuses, - const unsigned int FlashOffset, - const unsigned int FlashSize, - const unsigned int RamSize -> -struct MSP430F21x2 : Device< - description, - ObjectId<0>, - DefaultBits16Type, - enhanced, - MSP430F21x2_Match, - LowEemMode, - MSP430F2xxx_DefaultVoltageTestVpp, - MSP430F21xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryModel< Offset, Size, Size > - > {}; - -extern const char MSP430F2131[] = "MSP430F21x1"; - -extern const char MSP430F2112[] = "MSP430F2112"; -extern const char MSP430F2122[] = "MSP430F2122"; -extern const char MSP430F2132[] = "MSP430F2132"; - -static const DeviceRegistrator< MSP430F21x1 > regMSP430F2131; - -static const DeviceRegistrator< MSP430F21x2 > regMSP430F2112; -static const DeviceRegistrator< MSP430F21x2 > regMSP430F2122; -static const DeviceRegistrator< MSP430F21x2 > regMSP430F2132; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F22xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F22xx.cpp deleted file mode 100644 index 2d896e1..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F22xx.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * MSP430F22xx.cpp - * - * Definition MSP430F22xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430F22xx_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07> MSP430F22xxIdMask; - -template -struct MSP430F22xx_Match : Match< IdCode<0x27F2, 0, 0, 0, 0, 0, fuses>, MSP430F22xxIdMask> {}; - - -template -struct MemoryModel : MemoryList, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< RamSize >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -typedef MemoryModel< Offset<0xE000>, Size<0x2000>, Size<0x200> > MemoryModel3; -typedef MemoryModel< Offset<0xC000>, Size<0x4000>, Size<0x200> > MemoryModel5; -typedef MemoryModel< Offset<0x8000>, Size<0x8000>, Size<0x400> > MemoryModel7; - -template< - const char* description, - const unsigned int fuses, - class MemoryModel -> -struct MSP430F22xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - enhanced, - MSP430F22xx_Match, - LowEemMode, - MSP430F2xxx_DefaultVoltageTestVpp, - MSP430F22xx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryModel, - DefaultFeatures, - ExtendedFeatures - > {}; - -extern const char MSP430F2232[] = "MSP430F2232"; -extern const char MSP430F2252[] = "MSP430F2252"; -extern const char MSP430F2272[] = "MSP430F2272"; - -extern const char MSP430F2234[] = "MSP430F2234"; -extern const char MSP430F2254[] = "MSP430F2254"; -extern const char MSP430F2274[] = "MSP430F2274"; - -static const DeviceRegistrator< MSP430F22xx > regMSP430F2232; -static const DeviceRegistrator< MSP430F22xx > regMSP430F2252; -static const DeviceRegistrator< MSP430F22xx > regMSP430F2272; -static const DeviceRegistrator< MSP430F22xx > regMSP430F2234; -static const DeviceRegistrator< MSP430F22xx > regMSP430F2254; -static const DeviceRegistrator< MSP430F22xx > regMSP430F2274; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F23xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F23xx.cpp deleted file mode 100644 index e7da995..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F23xx.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * MSP430F23xx.cpp - * - * Definition MSP430F23xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - - -struct MSP430F23x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F23x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::Empty, Eem::Empty, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F23x0_ClockInfo; -typedef ClockInfo MSP430F23x_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03> MSP430F23x0IdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F> MSP430F23xIdMask; - -template -struct MSP430F23x0_Match : Match< IdCode, MSP430F23x0IdMask> {}; - -template -struct MSP430F23x_Match : Match< IdCode, MSP430F23xIdMask> {}; - - -template -struct MemoryModel : MemoryList, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< RamSize >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -typedef MemoryModel< Offset<0xE000>, Size<0x2000>, Size<0x400> > MemoryModel3; -typedef MemoryModel< Offset<0xC000>, Size<0x4000>, Size<0x800> > MemoryModel5; -typedef MemoryModel< Offset<0x8000>, Size<0x8000>, Size<0x800> > MemoryModel7; - -template< - const char* description, - class MatchType, - class EemModeType, - class ClockInfoType, - class MemoryModelType -> -struct MSP430F23xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - enhanced, - MatchType, - EemModeType, - MSP430F2xxx_DefaultVoltageNoTestVpp, - ClockInfoType, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryModelType - > {}; - -extern const char MSP430F233[] = "MSP430F233"; -extern const char MSP430F235[] = "MSP430F235"; - -extern const char MSP430F2330[] = "MSP430F2330"; -extern const char MSP430F2350[] = "MSP430F2350"; -extern const char MSP430F2370[] = "MSP430F2370"; - -typedef MSP430F23xx, MedEemMode, MSP430F23x_ClockInfo, MemoryModel3> MSP430F233_Type; -typedef MSP430F23xx, MedEemMode, MSP430F23x_ClockInfo, MemoryModel5> MSP430F235_Type; - -typedef MSP430F23xx, LowEemMode, MSP430F23x0_ClockInfo, MemoryModel3> MSP430F2330_Type; -typedef MSP430F23xx, LowEemMode, MSP430F23x0_ClockInfo, MemoryModel5> MSP430F2350_Type; -typedef MSP430F23xx, LowEemMode, MSP430F23x0_ClockInfo, MemoryModel7> MSP430F2370_Type; - -static const DeviceRegistrator regMSP430F233; -static const DeviceRegistrator regMSP430F235; -static const DeviceRegistrator regMSP430F2330; -static const DeviceRegistrator regMSP430F2350; -static const DeviceRegistrator regMSP430F2370; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F24_61x.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F24_61x.cpp deleted file mode 100644 index 5a6ea28..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F24_61x.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * MSP430F24_61x.cpp - * - * Definition MSP430F24_61x devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -struct MSP430F24_61x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F24_61x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::FLASH_CTRL, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::BT, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F24_61x_ClockInfo; - - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07> MSP430F24_61xIdMask; - -template -struct MSP430F24_61x_Match : Match< IdCode<0x6FF2, 0, 0, 0, 0, 0, fuses>, MSP430F24_61xIdMask> {}; - -template -struct MemoryModel4kRam : MemoryList, Offset<0x2100> >, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< Size<0x800> >, - MSP430F2xxx_SystemRam2Info< Size<0x1000> >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -template -struct MemoryModel8kRam : MemoryList, Offset<0x3100> >, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< Size<0x800> >, - MSP430F2xxx_SystemRam2Info< Size<0x2000> >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - - -template< - const char* description, - const unsigned int fuses, - class MemoryModelType -> -struct MSP430F24_61x : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F24_61x_Match, - HighEemMode, - MSP430F2xxx_DefaultVoltageNoTestVpp, - MSP430F24_61x_ClockInfo, - FunctionMappingX, - FuncletMappingX1_2xx, - MemoryModelType - > {}; - -extern const char MSP430F2416[] = "MSP430F2416"; -extern const char MSP430F2417[] = "MSP430F2417"; -extern const char MSP430F2418[] = "MSP430F2418"; -extern const char MSP430F2419[] = "MSP430F2419"; - -extern const char MSP430F2616[] = "MSP430F2616"; -extern const char MSP430F2617[] = "MSP430F2617"; -extern const char MSP430F2618[] = "MSP430F2618"; -extern const char MSP430F2619[] = "MSP430F2619"; - - - -typedef MSP430F24_61x< MSP430F2416, 0x7, MemoryModel4kRam<0x16F00> > MSP430F2416_Type; -typedef MSP430F24_61x< MSP430F2417, 0x6, MemoryModel8kRam<0x16F00> > MSP430F2417_Type; -typedef MSP430F24_61x< MSP430F2418, 0x5, MemoryModel8kRam<0x1CF00> > MSP430F2418_Type; -typedef MSP430F24_61x< MSP430F2419, 0x4, MemoryModel4kRam<0x1DF00> > MSP430F2419_Type; - -typedef MSP430F24_61x< MSP430F2616, 0x3, MemoryModel4kRam<0x16F00> > MSP430F2616_Type; -typedef MSP430F24_61x< MSP430F2617, 0x2, MemoryModel8kRam<0x16F00> > MSP430F2617_Type; -typedef MSP430F24_61x< MSP430F2618, 0x1, MemoryModel8kRam<0x1CF00> > MSP430F2618_Type; -typedef MSP430F24_61x< MSP430F2619, 0x0, MemoryModel4kRam<0x1DF00> > MSP430F2619_Type; - - - -static const DeviceRegistrator regMSP430F2416; -static const DeviceRegistrator regMSP430F2417; -static const DeviceRegistrator regMSP430F2418; -static const DeviceRegistrator regMSP430F2419; - -static const DeviceRegistrator regMSP430F2616; -static const DeviceRegistrator regMSP430F2617; -static const DeviceRegistrator regMSP430F2618; -static const DeviceRegistrator regMSP430F2619; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F24xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F24xx.cpp deleted file mode 100644 index ac39baa..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F24xx.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* - * MSP430F24xx.cpp - * - * Definition MSP430F24xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -struct MSP430F24x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F24x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::Empty, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430F24x1_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F24x1_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::Empty, Eem::Empty, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F24x_ClockInfo; -typedef ClockInfo MSP430F24x1_ClockInfo; - - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F> MSP430F24xxIdMask; - -template -struct MSP430F24xx_Match : Match< IdCode<0x49F2, 0, 0, 0, 0, 0, fuses>, MSP430F24xxIdMask> {}; - - -struct MemoryModel2kRam : MemoryList, Offset<0x1100> >, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< Size<0x800> >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - -template -struct MemoryModel4kRam : MemoryList, Offset >, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_BootFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< Size<0x800> >, - MSP430F2xxx_SystemRam2Info< Size<0x1000> >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > > {}; - - -template< - const char* description, - const unsigned int fuses, - class ClockInfoType, - class MemoryModelType -> -struct MSP430F24xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - enhanced, - MSP430F24xx_Match, - MedEemMode, - MSP430F2xxx_DefaultVoltageNoTestVpp, - ClockInfoType, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryModelType - > {}; - -extern const char MSP430F247[] = "MSP430F247"; -extern const char MSP430F248[] = "MSP430F248"; -extern const char MSP430F249[] = "MSP430F249"; -extern const char MSP430F2410[] = "MSP430F2410"; - -extern const char MSP430F2471[] = "MSP430F2471"; -extern const char MSP430F2481[] = "MSP430F2481"; -extern const char MSP430F2491[] = "MSP430F2491"; - -typedef MSP430F24xx< MSP430F247, 0x2, MSP430F24x_ClockInfo, MemoryModel4kRam<0x8000, 0x8000> > MSP430F247_Type; -typedef MSP430F24xx< MSP430F248, 0x1, MSP430F24x_ClockInfo, MemoryModel4kRam<0x4000, 0xC000> > MSP430F248_Type; -typedef MSP430F24xx< MSP430F249, 0x0, MSP430F24x_ClockInfo, MemoryModel2kRam > MSP430F249_Type; -typedef MSP430F24xx< MSP430F2410, 0x8, MSP430F24x_ClockInfo, MemoryModel4kRam<0x2100, 0xDF00> > MSP430F2410_Type; - -typedef MSP430F24xx< MSP430F2471, 0x6, MSP430F24x1_ClockInfo, MemoryModel4kRam<0x8000, 0x8000> > MSP430F2471_Type; -typedef MSP430F24xx< MSP430F2481, 0x5, MSP430F24x1_ClockInfo, MemoryModel4kRam<0x4000, 0xC000> > MSP430F2481_Type; -typedef MSP430F24xx< MSP430F2491, 0x4, MSP430F24x1_ClockInfo, MemoryModel2kRam > MSP430F2491_Type; - -static const DeviceRegistrator regMSP430F247; -static const DeviceRegistrator regMSP430F248; -static const DeviceRegistrator regMSP430F249; -static const DeviceRegistrator regMSP430F2410; - -static const DeviceRegistrator regMSP430F2471; -static const DeviceRegistrator regMSP430F2481; -static const DeviceRegistrator regMSP430F2491; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F2xxx.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F2xxx.h deleted file mode 100644 index 49f1394..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F2xxx.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * MSP430F2xxx.h - * - * Default values for MSP430F2xxx familiy - to be used when devices are created, e.g. within MSP43054xx.cpp. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_MSP430F2XXX_H -#define TEMPLATE_DEVICE_DB_MSP430F2XXX_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "SpecialMemoryTypes.h" -#include "MSP430Defaults.h" -#include "MSP430F1_2_4xxx_masks.h" -#include "Registration.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - namespace Memory { - //protectable due to INFO A - typedef MemoryInfo< - Name::information, FlashType, Mapped, Protectable, Bits16Type, - Size<0x100> , Offset<0x1000>, SegmentSize<0x40>, BankSize<0x40>, Banks<4>, - NoMask, MemoryCreator - > MSP430F2xxx_InfoFlashMemoryInfo; - - - ///bsl memory - typedef MemoryInfo< - Name::boot, FlashType, Mapped, Protectable, Bits16Type, - Size<0x400> , Offset<0x0c00>, SegmentSize<0x200>, BankSize<0>, Banks<4>, - NoMask, MemoryCreator - > MSP430F2xxx_BootFlashMemoryInfo; - - typedef MemoryInfo< - Name::cpu, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x10> , Offset<0x0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F2xxx_CPUMemoryInfo; - - typedef MemoryInfo< - Name::eem, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x80> , Offset<0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F2xxx_EEMMemoryInfo; - - //size is still definable - template - struct MSP430F2xxx_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x200>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - template - struct MSP430F2xxx_SystemRam2Info : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x1100>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - template - struct MSP430F2xxx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - FlashSizeType , OffsetType, SegmentSize<0x200>, BankSize<0x10000>, Banks<1>, - NoMask> {}; - } //namespace Memory - - typedef VoltageInfo<1800, 3600, 2200, 2500, 6000, 7000, true> MSP430F2xxx_DefaultVoltageTestVpp; - typedef VoltageInfo<1800, 3600, 2200, 2500, 6000, 7000, false> MSP430F2xxx_DefaultVoltageNoTestVpp; -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_MSP430F2XXX_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F41xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F41xx.cpp deleted file mode 100644 index 1d8daea..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F41xx.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - * MSP430F41xx.cpp - * - * Definition MSP430F41xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00> MSP430F41xIdMask; -typedef IdCode<0xFFFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00> MSP430F413IdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01> MSP430F41x2IdMask; - -typedef Match< IdCode<0x27F4, 0x0, 0,0,0, 'W', 0x0>, MSP430F41xIdMask> MSP430F41x_Match; -typedef Match< IdCode<0x13F4, 0x0, 0x02,0x40,0, 0x0, 0x0>, MSP430F413IdMask> MSP430F413_Match; - -template -struct MSP430F41x2_Match : Match< IdCode<0x5241, 0x0, 0,0,0,0, fuses>, MSP430F41x2IdMask> {}; - - - -struct MSP430F41x2_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F41x2_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::Empty, Eem::FLASH_CTRLER, Eem::Empty, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::BT_RTC, - Eem::Empty, Eem::TB3, Eem::TA3, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F41x_ClockInfo; -typedef ClockInfo MSP430F41x2_ClockInfo; - - -typedef VoltageInfo<1800, 3600, 2200, 2700, 6000, 7000, true> MSP430F41x2_VoltageInfo; - - -typedef MemoryInfo< - Name::information, FlashType, Mapped, Protectable, Bits16Type, - Size<0x100> , Offset<0x1000>, SegmentSize<0x40>, BankSize<0x40>, Banks<4>, - NoMask, MemoryCreator -> MSP430F41x2_InfoFlashMemoryInfo; - -typedef Features MSP430F413_Features; -typedef ExtendedFeatures MSP430F413_ExtFeatures; - - -struct FunctionMappingF413 : public FunctionMappingNone -{ - FunctionMappingF413() { - ReplacePair(ID_ExecuteFunclet, ID_ExecuteFuncletJtag); - ReplacePair(ID_GetDcoFrequency, ID_GetFllFrequencyJtag); - } -}; - - -template< - const char* description, - const Psa PsaType, - class MatchType, - class VoltageType, - class ClockInfoType, - class FunctionMapping, - class FlashOffset, - class FlashSize, - class RamSize, - class LcdMemorySize, - class InfoMemoryType, - class SFRmaskType, - class Features = MSP430F4xxx_DefaultFeatures, - class ExtendedFeatures = NoExtendedFeatures -> -struct MSP430F41xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - PsaType, - MatchType, - LowEemMode, - VoltageType, - ClockInfoType, - FunctionMapping, - FuncletMapping4xx, - MemoryList, - InfoMemoryType, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo< LcdMemorySize >, - MSP430F4xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo - > >, - Features, - ExtendedFeatures - > {}; - -template -struct MSP430FW42x_F41x : MSP430F41xx, - MSP430F4xxx_InfoFlashMemoryInfo, - sfrMask_33801380ffff> {}; - -template -struct MSP430F41x : MSP430F41xx, - MSP430F4xxx_InfoFlashMemoryInfo, - sfrMask_33801380ffff, - MSP430F413_Features, - MSP430F413_ExtFeatures> {}; - -template -struct MSP430F41x2 : MSP430F41xx, - MSP430F41x2_VoltageInfo, - MSP430F41x2_ClockInfo, - FunctionMapping4xx, - FlashOffset, FlashSize, RamSize, Size<0x20>, - MSP430F41x2_InfoFlashMemoryInfo, - sfrMask_338f1f8fffff, - MSP430F46_7xx_Features > {}; - -extern const char MSP430F413C[] = "MSP430F41x"; -extern const char MSP430F417[] = "MSP430FW42x/F41x"; -extern const char MSP430F4132[] = "MSP430F4132"; -extern const char MSP430F4152[] = "MSP430F4152"; - -typedef MSP430F41x, Size<0x2000>, Size<0x100> > MSP430F413_Type; -typedef MSP430FW42x_F41x, Size<0x8000>, Size<0x400> > MSP430F417_Type; - -typedef MSP430F41x2, Size<0x2000>, Size<0x200> > MSP430F4132_Type; -typedef MSP430F41x2, Size<0x4000>, Size<0x200> > MSP430F4152_Type; - -static const DeviceRegistrator regMSP430F413; -static const DeviceRegistrator regMSP430F417; -static const DeviceRegistrator regMSP430F4132; -static const DeviceRegistrator regMSP430F4152; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F42xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F42xx.cpp deleted file mode 100644 index 913ce8b..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F42xx.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - * MSP430F42xx.cpp - * - * Definition MSP430F42xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x1F> MSP430F42xxIdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07> MSP430F42x0IdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00> MSP430FW42xIdMask; - - -template -struct MSP430F42xx_Match : Match< IdCode, MSP430F42xxIdMask> {}; - -template -struct MSP430F42x0_Match : Match< IdCode, MSP430F42x0IdMask> {}; - -template -struct MSP430FW42x_Match : Match< IdCode, MSP430FW42xIdMask> {}; - - -typedef ClockInfo MSP430F42xx_ClockInfo; - - -typedef VoltageInfo<2700, 3600, 2700, 2700, 6000, 7000, false> MSP430F42xxVoltage; -typedef VoltageInfo<1800, 3600, 2500, 2700, 6000, 7000, false> MSP430F42x0Voltage; - -template -struct MemoryModel : MemoryList, - MSP430F4xxx_InfoFlashMemoryInfo, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo, - MSP430F4xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo> - > {}; - -typedef MemoryModel< Offset<0xE000>, Size<0x2000>, Size<0x100>, Size<0x15>, sfrMask_f380d380c0ff> MemoryModel3; -typedef MemoryModel< Offset<0xC000>, Size<0x4000>, Size<0x200>, Size<0x15>, sfrMask_f380d380c0ff> MemoryModel5; -typedef MemoryModel< Offset<0x8000>, Size<0x8000>, Size<0x400>, Size<0x15>, sfrMask_f380d380c0ff> MemoryModel7; -typedef MemoryModel< Offset<0x1100>, Size<0xEF00>, Size<0x800>, Size<0x15>, sfrMask_33801380ffff> MemoryModel9; - -typedef MemoryModel< Offset<0xE000>, Size<0x2000>, Size<0x100>, Size<0x20>, sfrMask_33801f80ffff> MemoryModel4230; -typedef MemoryModel< Offset<0xC000>, Size<0x4000>, Size<0x100>, Size<0x20>, sfrMask_33801f80ffff> MemoryModel4250; -typedef MemoryModel< Offset<0x8000>, Size<0x8000>, Size<0x100>, Size<0x20>, sfrMask_33801f80ffff> MemoryModel4270; - -template< - const char* description, - const unsigned int versionId, - const unsigned int fuses, - class MemoryModelType -> -struct MSP430F42xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F42xx_Match, - LowEemMode, - MSP430F42xxVoltage, - MSP430F42xx_ClockInfo, - FunctionMapping4xx, - FuncletMapping4xx, - MemoryModelType, - MSP430F4xxx_DefaultFeatures, - MSP430F4xxx_SyncExtFeatures - > {}; - -extern const char MSP430F423[] = "MSP430F423"; -extern const char MSP430F425[] = "MSP430F425"; -extern const char MSP430F427[] = "MSP430F427"; - -extern const char MSP430F423A[] = "MSP430F423A"; -extern const char MSP430F425A[] = "MSP430F425A"; -extern const char MSP430F427A[] = "MSP430F427A"; - -extern const char MSP430FE423[] = "MSP430FE423"; -extern const char MSP430FE425[] = "MSP430FE425"; -extern const char MSP430FE427[] = "MSP430FE427"; - -extern const char MSP430FE423A[] = "MSP430FE423A"; -extern const char MSP430FE425A[] = "MSP430FE425A"; -extern const char MSP430FE427A[] = "MSP430FE427A"; - - -template< - const char* description, - const unsigned int versionId, - const unsigned int fuses, - class MemoryModelType -> -struct MSP430F42x0 : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F42x0_Match, - LowEemMode, - MSP430F42x0Voltage, - MSP430F42xx_ClockInfo, - FunctionMapping4xx, - FuncletMapping4xx, - MemoryModelType, - MSP430F4xxx_DefaultFeatures, - ExtendedFeatures - > {}; - - -extern const char MSP430F4230[] = "MSP430F4230"; -extern const char MSP430F4250[] = "MSP430F4250"; -extern const char MSP430F4270[] = "MSP430F42x0"; - -extern const char MSP430FG4250[] = "MSP430FG4250"; -extern const char MSP430FG4270[] = "MSP430FG42x0"; - -extern const char MSP430FE4232[] = "MSP430FE4232"; -extern const char MSP430FE4252[] = "MSP430FE42x2"; -extern const char MSP430FE4272[] = "MSP430FE4272"; - -template< - const char* description, - const unsigned int versionId, - class MemoryModelType -> -struct MSP430FW42x : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430FW42x_Match, - LowEemMode, - MSP430F4xxx_DefaultVoltageNoTestVpp, - MSP430F42xx_ClockInfo, - FunctionMapping4xx, - FuncletMapping4xx, - MemoryModelType, - MSP430F4xxx_DefaultFeatures, - ExtendedFeatures - > {}; - - -extern const char MSP430FW429[] = "MSP430FW429"; - - - -// description, versionId, fuses, MemoryModel -static const DeviceRegistrator< MSP430F42xx > regMSP430F423; -static const DeviceRegistrator< MSP430F42xx > regMSP430F425; -static const DeviceRegistrator< MSP430F42xx > regMSP430F427; - -static const DeviceRegistrator< MSP430F42xx > regMSP430F423A; -static const DeviceRegistrator< MSP430F42xx > regMSP430F425A; -static const DeviceRegistrator< MSP430F42xx > regMSP430F427A; - -static const DeviceRegistrator< MSP430F42xx > regMSP430FE423; -static const DeviceRegistrator< MSP430F42xx > regMSP430FE425; -static const DeviceRegistrator< MSP430F42xx > regMSP430FE427; - -static const DeviceRegistrator< MSP430F42xx > regMSP430FE423A; -static const DeviceRegistrator< MSP430F42xx > regMSP430FE425A; -static const DeviceRegistrator< MSP430F42xx > regMSP430FE427A; - -//FW42x covered in F41xx.cpp - -static const DeviceRegistrator< MSP430FW42x > regMSP430FW429; - -static const DeviceRegistrator< MSP430F42xx > regMSP430FE4232; -static const DeviceRegistrator< MSP430F42xx > regMSP430FE4252; -static const DeviceRegistrator< MSP430F42xx > regMSP430FE4272; - -static const DeviceRegistrator< MSP430F42x0 > regMSP430F4230; -static const DeviceRegistrator< MSP430F42x0 > regMSP430F4250; -static const DeviceRegistrator< MSP430F42x0 > regMSP430F4270; - -static const DeviceRegistrator< MSP430F42x0 > regMSP430FG4250; -static const DeviceRegistrator< MSP430F42x0 > regMSP430FG4270; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F43xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F43xx.cpp deleted file mode 100644 index 58dfe93..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F43xx.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * MSP430F43xx.cpp - * - * Definition MSP430F43xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F> MSP430F43xxp100IdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00> MSP430F43xxp80IdMask; -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00> MSP430FG43xxIdMask; - -typedef Match< IdCode<0x49F4, 0,0,0,0,0, 0x02>, MSP430F43xxp100IdMask> F43xxp100_Match; -typedef Match< IdCode<0x37F4, 0,0,0,0,0,0>, MSP430F43xxp80IdMask> F43xxp80_Match; -typedef Match< IdCode<0x39F4, 0,0,0,0,'G',0>, MSP430FG43xxIdMask> FG43xx_Match; - - -struct MSP430F43xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F43xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::FLASH_CTRL, Eem::Empty, Eem::USART0, - Eem::Empty, Eem::Empty, Eem::LCD_FREQ, Eem::BT, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - - -typedef ClockInfo MSP430F43xx_ClockInfo; - - -typedef Trigger MSP430F43xx_LowTrigger; -typedef EemInfo<0, 0, 0, MSP430F43xx_LowTrigger, MediumSequencer> FG43xx_EemMode; - -typedef Trigger MSP430F43xx_HighTrigger; -typedef EemInfo<0x8, 0, 0, MSP430F43xx_HighTrigger, MediumSequencer> F43xx_EemMode; - - - -template -struct MemoryModel : MemoryList, - MSP430F4xxx_InfoFlashMemoryInfo, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo, - MSP430F4xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo> - > {}; - - -typedef MemoryModel< Offset<0x8000>, Size<0x8000>, Size<0x400>, Size<0x15> > MemoryModel7; -typedef MemoryModel< Offset<0x1100>, Size<0xEF00>, Size<0x800>, Size<0xD> > MemoryModelG9; - - -template< - const char* description, - class MatchType, - class EemModeType, - class MemoryModelType, - class ExtendedFeatures = MSP430F4xxx_SyncExtFeatures -> -struct MSP430F43xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MatchType, - EemModeType, - MSP430F4xxx_DefaultVoltageNoTestVpp, - MSP430F43xx_ClockInfo, - FunctionMapping4xx, - FuncletMapping4xx, - MemoryModelType, - MSP430F43xx_Features, - ExtendedFeatures - > {}; - - -extern const char MSP430F437[] = "MSP430F43x"; -extern const char MSP430FG439[] = "MSP430FG43x_F43x"; - - -static const DeviceRegistrator< MSP430F43xx > regMSP430F437p80; - -static const DeviceRegistrator< MSP430F43xx > regMSP430F437p100; - -static const DeviceRegistrator< - MSP430F43xx -> regMSP430FG439; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F44xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F44xx.cpp deleted file mode 100644 index 5383a9f..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F44xx.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * MSP430F44xx.cpp - * - * Definition MSP430F44xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0F> MSP430F44xxIdMask; - -typedef Match< IdCode<0x49F4, 0x0, 0,0,0, 0x0, 0x0>, MSP430F44xxIdMask> MSP430F44xx_Match; - - -typedef Trigger MSP430F43x_HighTrigger; -typedef EemInfo<0x8, 0, 0, MSP430F43x_HighTrigger, MediumSequencer> MSP430F43x_High_EemMode; - - -struct MSP430F44xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F44xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::FLASH_CTRL, Eem::USART1, Eem::USART0, - Eem::Empty, Eem::Empty, Eem::LCD_FREQ, Eem::BT, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F44xx_ClockInfo; - - -template -struct MemoryModel : MemoryList, - MSP430F4xxx_InfoFlashMemoryInfo, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo< Size<0x15> >, - MSP430F4xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo> - > {}; - -typedef MemoryModel< Offset<0x1100>, Size<0xEF00>, Size<0x800> > MemoryModel449; - -template< - const char* description, - class MemoryModelType -> -struct MSP430F44xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MSP430F44xx_Match, - MSP430F43x_High_EemMode, - MSP430F4xxx_DefaultVoltageNoTestVpp, - MSP430F44xx_ClockInfo, - FunctionMapping4xx, - FuncletMapping4xx, - MemoryModelType, - MSP430F43xx_Features, - MSP430F4xxx_SyncExtFeatures - > {}; - -extern const char MSP430F449[] = "MSP430F44x"; - -static const DeviceRegistrator< MSP430F44xx > regMSP430F449; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F46xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F46xx.cpp deleted file mode 100644 index 121af96..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F46xx.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - * MSP430F46xx.cpp - * - * Definition MSP430F46xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x03> MSP430FG46xxIdMask; - -template -struct MSP430F46xx_Match : Match< IdCode<0x6FF4, 0x0, 0,0,0, 'G', fuses>, MSP430FG46xxIdMask > {}; - - - -struct MSP430FG46xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FG46xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::ADC12, Eem::FLASH_CTRL, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::LCD_FREQ, Eem::BT, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430FG461x1_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FG461x1_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::Empty, Eem::FLASH_CTRL, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::LCD_FREQ, Eem::BT, - Eem::Empty, Eem::TB, Eem::TA, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430FG46xx_ClockInfo; -typedef ClockInfo MSP430FG461x1_ClockInfo; - -template -struct MSP430F46xx_MemoryModel : MemoryList, Offset >, - MSP430F4xxx_InfoFlashMemoryInfo, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo< Size<0xD> >, - MSP430F4xxx_SystemRamInfo< Size<0x800> >, - MSP430F4xxx_SystemRam2Info< Size >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo - > > {}; - -typedef MSP430F46xx_MemoryModel<0x2100, 0x16F00, 0x1000> MemoryModel16; -typedef MSP430F46xx_MemoryModel<0x3100, 0x16F00, 0x2000> MemoryModel17; -typedef MSP430F46xx_MemoryModel<0x3100, 0x1CF00, 0x2000> MemoryModel18; -typedef MSP430F46xx_MemoryModel<0x2100, 0x1DF00, 0x1000> MemoryModel19; - - -template< - const char* description, - const unsigned int fuses, - class ClockInfoType, - class MemoryModelType -> -struct MSP430F46xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F46xx_Match, - HighEemMode, - MSP430F4xxx_DefaultVoltageNoTestVpp, - ClockInfoType, - FunctionMappingX4xx, - FuncletMappingX4xx, - MemoryModelType, - MSP430F46_7xx_Features - > {}; - - -extern const char MSP430FG4616[] = "MSP430FG4616"; -extern const char MSP430FG4617[] = "MSP430FG4617"; -extern const char MSP430FG4618[] = "MSP430FG4618"; -extern const char MSP430FG4619[] = "MSP430FG4619"; - -extern const char MSP430F4616[] = "MSP430F4616"; -extern const char MSP430F4617[] = "MSP430F4617"; -extern const char MSP430F4618[] = "MSP430F4618"; -extern const char MSP430F4619[] = "MSP430F4619"; - -extern const char MSP430F46161[] = "MSP430F46161"; -extern const char MSP430F46171[] = "MSP430F46171"; -extern const char MSP430F46181[] = "MSP430F46181"; -extern const char MSP430F46191[] = "MSP430F46191"; - - - -typedef MSP430F46xx MSP430FG4616_Type; -typedef MSP430F46xx MSP430FG4617_Type; -typedef MSP430F46xx MSP430FG4618_Type; -typedef MSP430F46xx MSP430FG4619_Type; - -typedef MSP430F46xx MSP430F4616_Type; -typedef MSP430F46xx MSP430F4617_Type; -typedef MSP430F46xx MSP430F4618_Type; -typedef MSP430F46xx MSP430F4619_Type; - -typedef MSP430F46xx MSP430F46161_Type; -typedef MSP430F46xx MSP430F46171_Type; -typedef MSP430F46xx MSP430F46181_Type; -typedef MSP430F46xx MSP430F46191_Type; - - - -static const DeviceRegistrator regMSP430FG4616; -static const DeviceRegistrator regMSP430FG4617; -static const DeviceRegistrator regMSP430FG4618; -static const DeviceRegistrator regMSP430FG4619; - -static const DeviceRegistrator regMSP430F4616; -static const DeviceRegistrator regMSP430F4617; -static const DeviceRegistrator regMSP430F4618; -static const DeviceRegistrator regMSP430F4619; - -static const DeviceRegistrator regMSP430F46161; -static const DeviceRegistrator regMSP430F46171; -static const DeviceRegistrator regMSP430F46181; -static const DeviceRegistrator regMSP430F46191; - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F471xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F471xx.cpp deleted file mode 100644 index c2e7309..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F471xx.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - * MSP430F471xx.cpp - * - * Definition MSP430F46xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F> MSP430F471xxIdMask; - -template -struct MSP430F471xx_Match : Match< IdCode<0x7FF4, 0x0, 0,0,0, 0, fuses>, MSP430F471xxIdMask > {}; - - - -struct MSP430F471xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F471xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::Empty, Eem::FLASH_CTRL, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::BTRTC, - Eem::Empty, Eem::TB3, Eem::TA3, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - - -typedef ClockInfo MSP430F471xx_ClockInfo; - - - -typedef Trigger MSP430F471xx_HighTrigger; -typedef EemInfo<0x8, 0, 0, MSP430F471xx_HighTrigger, MediumSequencer> MSP430F471xx_HighEemMode; - - -typedef MemoryInfo< - Name::information, FlashType, Mapped, Protectable, Bits16Type, - Size<0x100> , Offset<0x1000>, SegmentSize<0x40>, BankSize<0x40>, Banks<4>, - NoMask, MemoryCreator - > MSP430F471xx_InfoFlashMemoryInfo; - - -template -struct MSP430F471xx_MemoryModel : MemoryList, Offset >, - MSP430F471xx_InfoFlashMemoryInfo, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo< Size<0x15> >, - MSP430F4xxx_SystemRamInfo< Size<0x800> >, - MSP430F4xxx_SystemRam2Info< Size >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo - > > {}; - -typedef MSP430F471xx_MemoryModel<0x2000, 0xE000, 0x1000> MemoryModel12; -typedef MSP430F471xx_MemoryModel<0x2100, 0x16F00, 0x1000> MemoryModel16; -typedef MSP430F471xx_MemoryModel<0x3100, 0x16F00, 0x2000> MemoryModel17; -typedef MSP430F471xx_MemoryModel<0x3100, 0x1CF00, 0x2000> MemoryModel18; -typedef MSP430F471xx_MemoryModel<0x2100, 0x1DF00, 0x1000> MemoryModel19; - - -typedef VoltageInfo<1800, 3600, 2200, 2500, 6000, 7000, false> MSP430FX471xxVoltage; - - -template< - const char* description, - const unsigned int fuses, - class MemoryModelType -> -struct MSP430F471xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F471xx_Match, - MSP430F471xx_HighEemMode, - MSP430FX471xxVoltage, - MSP430F471xx_ClockInfo, - FunctionMappingX4xx, - FuncletMappingX4xx, - MemoryModelType, - MSP430F46_7xx_Features - > {}; - - - -extern const char MSP430F47163[] = "MSP430F47163"; -extern const char MSP430F47173[] = "MSP430F47173"; -extern const char MSP430F47183[] = "MSP430F47183"; -extern const char MSP430F47193[] = "MSP430F47193"; - -extern const char MSP430F47126[] = "MSP430F47126"; -extern const char MSP430F47166[] = "MSP430F47166"; -extern const char MSP430F47176[] = "MSP430F47176"; -extern const char MSP430F47186[] = "MSP430F47186"; -extern const char MSP430F47196[] = "MSP430F47196"; - -extern const char MSP430F47127[] = "MSP430F47127"; -extern const char MSP430F47167[] = "MSP430F47167"; -extern const char MSP430F47177[] = "MSP430F47177"; -extern const char MSP430F47187[] = "MSP430F47187"; -extern const char MSP430F47197[] = "MSP430F47197"; - - - -typedef MSP430F471xx MSP430F47163_Type; -typedef MSP430F471xx MSP430F47173_Type; -typedef MSP430F471xx MSP430F47183_Type; -typedef MSP430F471xx MSP430F47193_Type; - -typedef MSP430F471xx MSP430F47126_Type; -typedef MSP430F471xx MSP430F47166_Type; -typedef MSP430F471xx MSP430F47176_Type; -typedef MSP430F471xx MSP430F47186_Type; -typedef MSP430F471xx MSP430F47196_Type; - -typedef MSP430F471xx MSP430F47127_Type; -typedef MSP430F471xx MSP430F47167_Type; -typedef MSP430F471xx MSP430F47177_Type; -typedef MSP430F471xx MSP430F47187_Type; -typedef MSP430F471xx MSP430F47197_Type; - - - -static const DeviceRegistrator regMSP430F47163; -static const DeviceRegistrator regMSP430F47173; -static const DeviceRegistrator regMSP430F47183; -static const DeviceRegistrator regMSP430F47193; - -static const DeviceRegistrator regMSP430F47126; -static const DeviceRegistrator regMSP430F47166; -static const DeviceRegistrator regMSP430F47176; -static const DeviceRegistrator regMSP430F47186; -static const DeviceRegistrator regMSP430F47196; - -static const DeviceRegistrator regMSP430F47127; -static const DeviceRegistrator regMSP430F47167; -static const DeviceRegistrator regMSP430F47177; -static const DeviceRegistrator regMSP430F47187; -static const DeviceRegistrator regMSP430F47197; - - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F47xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F47xx.cpp deleted file mode 100644 index 6024d31..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F47xx.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* - * MSP430F47xx.cpp - * - * Definition MSP430F47xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F4xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07> MSP430F47xxIdMask; - -template -struct MSP430F47xx_Match : Match< IdCode, MSP430F47xxIdMask> {}; - - - -struct MSP430F47x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F47x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::MCLKpin, Eem::SMCLKpin, Eem::ACLKpin, - Eem::Empty, Eem::FLASH_CTRLER, Eem::Empty, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::BT_RTC, - Eem::Empty, Eem::TB3, Eem::TA3, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430F47xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F47xx_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::SD16, Eem::FLASH_CTRL, Eem::USCI1, Eem::USCI0, - Eem::Empty, Eem::Empty, Eem::LCD_FREQ, Eem::BT, - Eem::Empty, Eem::TB_MCLK, Eem::TA_SMCLK, Eem::WDT_ACLK, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F47x_ClockInfo; -typedef ClockInfo MSP430F47xx_ClockInfo; - - -typedef VoltageInfo<1800, 3600, 2200, 2700, 6000, 7000, false> MSP430FX47xVoltage; -typedef VoltageInfo<1800, 3600, 2200, 2500, 6000, 7000, false> MSP430FX47xxVoltage; - -typedef MemoryInfo< - Name::information, FlashType, Mapped, Protectable, Bits16Type, - Size<0x100> , Offset<0x1000>, SegmentSize<0x40>, BankSize<0x40>, Banks<4>, - NoMask, MemoryCreator -> MSP430F47xx_InfoFlashMemoryInfo; - - -template -struct MemoryModel : MemoryList, - MSP430F47xx_InfoFlashMemoryInfo, - MSP430F4xxx_BootFlashMemoryInfo, - MSP430F4xxx_LcdMemoryInfo< Size<0x20> >, - MSP430F4xxx_SystemRamInfo, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F4xxx_CPUMemoryInfo, - MSP430F4xxx_EEMMemoryInfo> - > {}; - -typedef MemoryModel< Offset<0x8000>, Size<0x8000>, Size<0x800> > MemoryModel477; -typedef MemoryModel< Offset<0x4000>, Size<0xC000>, Size<0x800> > MemoryModel478; -typedef MemoryModel< Offset<0x1100>, Size<0xEF00>, Size<0x800> > MemoryModel479; -typedef MemoryModel< Offset<0x1100>, Size<0xEF00>, Size<0xA00> > MemoryModel479x; - -template< - const char* description, - const unsigned int versionId, - const char config, - const unsigned int fuses, - class VoltageType, - class ClockInfoType, - class MemoryModelType, - class ExtendedFeatures = NoExtendedFeatures -> -struct MSP430F47xx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - enhanced, - MSP430F47xx_Match, - LowEemMode, - VoltageType, - ClockInfoType, - FunctionMapping4xx, - FuncletMapping4xx, - MemoryModelType, - MSP430F46_7xx_Features, - ExtendedFeatures - > {}; - -extern const char MSP430F477[] = "MSP430F477"; -extern const char MSP430F478[] = "MSP430F478"; -extern const char MSP430F479[] = "MSP430F479"; - -extern const char MSP430FG477[] = "MSP430FG477"; -extern const char MSP430FG478[] = "MSP430FG478"; -extern const char MSP430FG479[] = "MSP430FG479"; - -extern const char MSP430F4783[] = "MSP430F4783"; -extern const char MSP430F4784[] = "MSP430F4784"; -extern const char MSP430F4793[] = "MSP430F4793"; -extern const char MSP430F4794[] = "MSP430F4794"; - - -typedef MSP430F47xx MSP430F477_Type; -typedef MSP430F47xx MSP430F478_Type; -typedef MSP430F47xx MSP430F479_Type; - -typedef MSP430F47xx MSP430FG477_Type; -typedef MSP430F47xx MSP430FG478_Type; -typedef MSP430F47xx MSP430FG479_Type; - -typedef MSP430F47xx MSP430F4783_Type; - -typedef MSP430F47xx MSP430F4793_Type; - -typedef MSP430F47xx MSP430F4784_Type; - -typedef MSP430F47xx MSP430F4794_Type; - - -static const DeviceRegistrator< MSP430F477_Type > regMSP430F477; -static const DeviceRegistrator< MSP430F478_Type > regMSP430F478; -static const DeviceRegistrator< MSP430F479_Type > regMSP430F479; - -static const DeviceRegistrator< MSP430FG477_Type > regMSP430FG477; -static const DeviceRegistrator< MSP430FG478_Type > regMSP430FG478; -static const DeviceRegistrator< MSP430FG479_Type > regMSP430FG479; - -static const DeviceRegistrator< MSP430F4783_Type > regMSP430F4783; -static const DeviceRegistrator< MSP430F4784_Type > regMSP430F4784; -static const DeviceRegistrator< MSP430F4793_Type > regMSP430F4793; -static const DeviceRegistrator< MSP430F4794_Type > regMSP430F4794; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F4xxx.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F4xxx.h deleted file mode 100644 index 8595c8f..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F4xxx.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * MSP430F4xxx.h - * - * Default values for MSP430F1xxx familiy - to be used when devices are created, e.g. within MSP43054xx.cpp. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_MSP430F4XXX_H -#define TEMPLATE_DEVICE_DB_MSP430F4XXX_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "SpecialMemoryTypes.h" -#include "MSP430Defaults.h" -#include "MSP430F1_2_4xxx_masks.h" -#include "Registration.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - namespace Memory { - typedef MemoryInfo< - Name::information, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x100> , Offset<0x1000>, SegmentSize<0x80>, BankSize<0x80>, Banks<2>, - NoMask, MemoryCreator - > MSP430F4xxx_InfoFlashMemoryInfo; - - ///bsl memory - typedef MemoryInfo< - Name::boot, FlashType, Mapped, Protectable, Bits16Type, - Size<0x400> , Offset<0x0c00>, SegmentSize<0x200>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430F4xxx_BootFlashMemoryInfo; - - typedef MemoryInfo< - Name::cpu, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x10> , Offset<0x0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F4xxx_CPUMemoryInfo; - - typedef MemoryInfo< - Name::eem, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x80> , Offset<0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F4xxx_EEMMemoryInfo; - - template - struct MSP430F4xxx_LcdMemoryInfo : MemoryInfo< - Name::lcd, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x90>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - //size is still definable - template - struct MSP430F4xxx_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x200>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - template - struct MSP430F4xxx_SystemRam2Info : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x1100>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - - template - struct MSP430F4xxx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - FlashSizeType , OffsetType, SegmentSize<0x200>, BankSize<0x10000>, Banks<1>, - NoMask> {}; - } //namespace Memory - - typedef VoltageInfo<1800, 3600, 2700, 2500, 6000, 7000, true> MSP430F4xxx_DefaultVoltageTestVpp; - typedef VoltageInfo<1800, 3600, 2700, 2500, 6000, 7000, false> MSP430F4xxx_DefaultVoltageNoTestVpp; - - typedef Features MSP430F4xxx_DefaultFeatures; - typedef Features MSP430F43xx_Features; - typedef Features MSP430F46_7xx_Features; - - typedef ExtendedFeatures MSP430F4xxx_SyncExtFeatures; - - struct FunctionMapping4xx : public FunctionMappingNone - { - FunctionMapping4xx() { - ReplacePair(ID_GetDcoFrequency, ID_GetFllFrequency); - } - }; - - struct FunctionMappingX4xx : public FunctionMappingX - { - FunctionMappingX4xx() { - ReplacePair(ID_GetDcoFrequency, ID_GetFllFrequencyX); - } - }; - - struct FuncletMapping4xx : FuncletMappingImpl - { - FuncletMapping4xx() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeFLL, sizeof(eraseFuncletCodeFLL), 4 ), - FuncletCode( writeFuncletCodeFLL, sizeof(writeFuncletCodeFLL), 128 ) ) - {} - }; - - struct FuncletMappingX4xx : FuncletMappingImpl - { - FuncletMappingX4xx() - : FuncletMappingImpl( - FuncletCode( eraseFuncletCodeXFLL, sizeof(eraseFuncletCodeXFLL), 4 ), - FuncletCode( writeFuncletCodeXFLL, sizeof(writeFuncletCodeXFLL), 256 ) ) - {} - }; - -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_MSP430F1XXX_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F51xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F51xx.cpp deleted file mode 100644 index bc01d3a..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F51xx.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * MSP430F51xx.cpp - * - * Definition MSP430F51xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -template -struct MSP430F51xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - FlashSizeType , OffsetType, SegmentSize<0x200>, - BankSize<0x8000>, Banks<1>, NoMask> {}; - -struct MSP430F51xx_LargeEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F51xx_LargeEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::ADC10_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::TD3_1, - Eem::TD3_0, Eem::TA3_0, Eem::Empty, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430F51xx_SmallEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F51xx_SmallEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::Empty, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::TD3_1, - Eem::TD3_0, Eem::TA3_0, Eem::Empty, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F51xx_SmallClockInfo; -typedef ClockInfo MSP430F51xx_LargeClockInfo; - - -template< - const char* description, - const unsigned int versionId, - const unsigned int subVersionId, - class ClockInfo, - class FlashSizeType, - class OffsetType, - class RamSize -> -struct MSP430F51xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - SmallEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430F5xxx_SystemRamInfo, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - - -extern const char MSP430F5132[] = "MSP430F5132"; -extern const char MSP430F5152[] = "MSP430F5152"; -extern const char MSP430F5172[] = "MSP430F5172"; - -extern const char MSP430F5131[] = "MSP430F5131"; -extern const char MSP430F5151[] = "MSP430F5151"; -extern const char MSP430F5171[] = "MSP430F5171"; - - -//description, versionId, clock info, flash size, flash offset, ram size -typedef MSP430F51xx, Offset<0xE000>, Size<0x400> > MSP430F5132_type; -typedef MSP430F51xx, Offset<0xC000>, Size<0x800> > MSP430F5152_type; -typedef MSP430F51xx, Offset<0x8000>, Size<0x800> > MSP430F5172_type; - -//description, versionId, clock info, flash size, flash offset, ram size -typedef MSP430F51xx, Offset<0xE000>, Size<0x400> > MSP430F5131_type; -typedef MSP430F51xx, Offset<0xC000>, Size<0x800> > MSP430F5151_type; -typedef MSP430F51xx, Offset<0x8000>, Size<0x800> > MSP430F5171_type; - -static const DeviceRegistrator regMSP430F5132; -static const DeviceRegistrator regMSP430F5152; -static const DeviceRegistrator regMSP430F5172; - -static const DeviceRegistrator regMSP430F5131; -static const DeviceRegistrator regMSP430F5151; -static const DeviceRegistrator regMSP430F5171; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F52xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F52xx.cpp deleted file mode 100644 index 5610adb..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F52xx.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - * MSP430F52xx.cpp - * - * Definition MSP430F52xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -template< const unsigned int nrBanks > -struct MSP430F52xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size< nrBanks * 0x8000> , Offset<0x4400>, SegmentSize<0x200>, - BankSize<0x8000>, Banks, NoMask> {}; - - -struct MSP430F52xx_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x2000> , Offset<0x2400>, SegmentSize<0x1>, - BankSize<0x0>, Banks<4>, NoMask> {}; - - - -const ClockPair MSP430F52xxTimerTA3_1 = {"Timer1_A3", 57}; -const ClockPair MSP430F52xxTimerTA3_2 = {"Timer2_A3", 58}; - - -struct MSP430F52xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F52xx_EemTimer(const ClockPair& adc): EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - adc, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::TB7_0, - MSP430F52xxTimerTA3_2, MSP430F52xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty) - {} -}; - - -struct MSP430F522x_EemTimer : MSP430F52xx_EemTimer { - MSP430F522x_EemTimer() : MSP430F52xx_EemTimer(EemTimerImpl::Timer::ADC12_A) {} -}; - -struct MSP430F521x_EemTimer : MSP430F52xx_EemTimer { - MSP430F521x_EemTimer() : MSP430F52xx_EemTimer(EemTimerImpl::Timer::Empty) {} -}; - - -typedef ClockInfo F522x_ClockInfo; -typedef ClockInfo F521x_ClockInfo; - - -template< - const char* description, - const unsigned int versionId, - class ClockInfo, - const unsigned int nrFlashBanks -> -struct MSP430F52xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F5xxx_Match, - SmallEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430F52xx_SystemRamInfo, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - - -extern const char MSP430F5229[] = "MSP430F5229"; -extern const char MSP430F5228[] = "MSP430F5228"; -extern const char MSP430F5227[] = "MSP430F5227"; -extern const char MSP430F5224[] = "MSP430F5224"; -extern const char MSP430F5223[] = "MSP430F5223"; -extern const char MSP430F5222[] = "MSP430F5222"; -extern const char MSP430F5219[] = "MSP430F5219"; -extern const char MSP430F5218[] = "MSP430F5218"; -extern const char MSP430F5217[] = "MSP430F5217"; -extern const char MSP430F5214[] = "MSP430F5214"; -extern const char MSP430F5213[] = "MSP430F5213"; -extern const char MSP430F5212[] = "MSP430F5212"; - - -static const DeviceRegistrator< MSP430F52xx > regMSP430F5229; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5228; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5227; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5224; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5223; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5222; - -static const DeviceRegistrator< MSP430F52xx > regMSP430F5219; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5218; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5217; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5214; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5213; -static const DeviceRegistrator< MSP430F52xx > regMSP430F5212; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F53xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F53xx.cpp deleted file mode 100644 index 8ff5615..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F53xx.cpp +++ /dev/null @@ -1,371 +0,0 @@ -/* - * MSP430F53xx.cpp - * - * Definition MSP430F53xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "UsbTypes.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -const ClockPair MSP430F53xxTimerTA3_1 = {"Timer1_A3", 57}; -const ClockPair MSP430F53xxTimerTA3_2 = {"Timer2_A3", 58}; - -struct MSP430F53xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F53xx_EemTimer( - const ClockPair& dac, const ClockPair& comp_b, - const ClockPair& adc, const ClockPair& usci3, const ClockPair& usci2) - : EemTimerImpl( - Eem::Empty, Eem::Empty, dac, comp_b, - adc, Eem::RTC, usci3, usci2, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::TB7_0, - MSP430F53xxTimerTA3_2, MSP430F53xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty) - {} -}; - -struct MSP430F5304_EemTimer : MSP430F53xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F5304_EemTimer() : MSP430F53xx_EemTimer( - Eem::Empty, Eem::Empty, Eem::ADC10_A, Eem::Empty, Eem::Empty) - {} -}; - -struct MSP430F530x_EemTimer : MSP430F53xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F530x_EemTimer() : MSP430F53xx_EemTimer( - Eem::Empty, Eem::COMP_B, Eem::ADC10_A, Eem::USCI3, Eem::USCI2) - {} -}; - -struct MSP430F532_4x_EemTimer : MSP430F53xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F532_4x_EemTimer() : MSP430F53xx_EemTimer( - Eem::Empty, Eem::COMP_B, Eem::ADC12_A, Eem::USCI3, Eem::USCI2) - {} -}; - -struct MSP430F533x_EemTimer : MSP430F53xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F533x_EemTimer() : MSP430F53xx_EemTimer( - Eem::DAC12_0, Eem::COMP_B, Eem::ADC12_A, Eem::USCI3, Eem::USCI2) - {} -}; - -struct MSP430F535x_EemTimer : MSP430F53xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F535x_EemTimer() : MSP430F53xx_EemTimer( - Eem::DAC12_0, Eem::COMP_B, Eem::ADC12_A, Eem::Empty, Eem::Empty) - {} -}; - - -typedef ClockInfo MSP430F5304_ClockInfo; -typedef ClockInfo MSP430F530x_ClockInfo; -typedef ClockInfo MSP430F532_4x_ClockInfo; - -typedef ClockInfo MSP430F5333_35_ClockInfo; -typedef ClockInfo MSP430F5336_38_ClockInfo; - -typedef ClockInfo MSP430F535x_ClockInfo; - - - -template -struct MSP430F530x_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType, OffsetType, SegmentSize<0x200>, BankSize<0x8000>, Banks<1>, - NoMask> {}; - - -template -struct MSP430F532_4x_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType, Offset<0x4400>, SegmentSize<0x200>, BankSize<0x8000>, BanksType, - NoMask> {}; - - -template -struct MSP430F533x_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType, Offset<0x8000>, SegmentSize<0x200>, BankSize<0x10000>, BanksType, - NoMask> {}; - -template -struct MSP430F535x_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType, Offset<0x8000>, SegmentSize<0x200>, BankSize<0x20000>, BanksType, - NoMask> {}; - - -template -struct MSP430F53xxMemoryList : MemoryList >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo > > {}; - -template -struct MSP430F535xMemoryList : MemoryList, Banks<1> >, - MSP430F5xxx_SystemRam2Info, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo > > {}; - - -typedef MSP430F53xxMemoryList< - MSP430F530x_MainFlashMemory< Size<0x2000>, Offset<0xE000> >, Size<0x1000> -> MSP430F5304_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F530x_MainFlashMemory< Size<0x4000>, Offset<0xC000> >, Size<0x1000> -> MSP430F5308_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F530x_MainFlashMemory< Size<0x6000>, Offset<0xA000> >, Size<0x1000> -> MSP430F5309_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F530x_MainFlashMemory< Size<0x8000>, Offset<0x8000> >, Size<0x1000> -> MSP430F5310_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F532_4x_MainFlashMemory< Size<0x10000>, Banks<2> >, Size<0x1000> -> MSP430F5340_24_25_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F532_4x_MainFlashMemory< Size<0x18000>, Banks<3> >, Size<0x1800> -> MSP430F5341_26_27_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F532_4x_MainFlashMemory< Size<0x20000>, Banks<4> >, Size<0x2000> -> MSP430F5342_28_29_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F533x_MainFlashMemory< Size<0x20000>, Banks<2> >, Size<0x2000> -> MSP430F5333_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F533x_MainFlashMemory< Size<0x20000>, Banks<2> >, Size<0x4000> -> MSP430F5336_MemoryInfo; - -typedef MSP430F53xxMemoryList< - MSP430F533x_MainFlashMemory< Size<0x40000>, Banks<4> >, Size<0x4000> -> MSP430F5335_38_MemoryInfo; - -typedef MSP430F535xMemoryList< - MSP430F535x_MainFlashMemory< Size<0x60000>, Banks<3> >, Offset<0xF8000>, Size<0x8000> -> MSP430F5358_MemoryInfo; - -typedef MSP430F535xMemoryList< - MSP430F535x_MainFlashMemory< Size<0x80000>, Banks<4> >, Offset<0xF0000>, Size<0x10000> -> MSP430F5359_MemoryInfo; - - - - -template< - const char* description, - const unsigned int versionId, - typename EEMTrigger, - typename ClockInfo, - typename FuncletMapping, - typename MemoryList, - typename PowerSettings = NoPowerSettings -> -struct MSP430F53xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - EEMTrigger, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMapping, - MemoryList, - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures, - PowerSettings> {}; - - -template< - const char* description, - const unsigned int versionId, - typename MemoryList -> -struct MSP430F530x : MSP430F53xx {}; - - -template< - const char* description, - const unsigned int versionId, - typename MemoryList -> -struct MSP430F532_4x : MSP430F53xx {}; - - -template< - const char* description, - const unsigned int versionId, - typename ClockInfo, - typename MemoryList -> -struct MSP430F533x : MSP430F53xx {}; - - -template< - const char* description, - const unsigned int versionId, - typename MemoryList -> -struct MSP430F535x : MSP430F53xx - > {}; - - - - -extern const char MSP430F5304[] = "MSP430F5304"; -extern const char MSP430F5308[] = "MSP430F5308"; -extern const char MSP430F5309[] = "MSP430F5309"; -extern const char MSP430F5310[] = "MSP430F5310"; - -extern const char MSP430F5324[] = "MSP430F5324"; -extern const char MSP430F5325[] = "MSP430F5325"; -extern const char MSP430F5326[] = "MSP430F5326"; -extern const char MSP430F5327[] = "MSP430F5327"; -extern const char MSP430F5328[] = "MSP430F5328"; -extern const char MSP430F5329[] = "MSP430F5329"; - -extern const char MSP430F5333[] = "MSP430F5333"; -extern const char MSP430F5335[] = "MSP430F5335"; -extern const char MSP430F5336[] = "MSP430F5336"; -extern const char MSP430F5338[] = "MSP430F5338"; - -extern const char MSP430F5340[] = "MSP430F5340"; -extern const char MSP430F5341[] = "MSP430F5341"; -extern const char MSP430F5342[] = "MSP430F5342"; - -extern const char MSP430F5358[] = "MSP430F5358"; -extern const char MSP430F5359[] = "MSP430F5359"; - - -typedef MSP430F53xx< - MSP430F5304, 0x8112, SmallEemMode, MSP430F5304_ClockInfo, FuncletMappingXv2, MSP430F5304_MemoryInfo -> MSP430F5304_type; - -typedef MSP430F530x MSP430F5308_type; -typedef MSP430F530x MSP430F5309_type; -typedef MSP430F530x MSP430F5310_type; - -typedef MSP430F532_4x MSP430F5324_type; -typedef MSP430F532_4x MSP430F5325_type; -typedef MSP430F532_4x MSP430F5326_type; -typedef MSP430F532_4x MSP430F5327_type; -typedef MSP430F532_4x MSP430F5328_type; -typedef MSP430F532_4x MSP430F5329_type; - -typedef MSP430F533x MSP430F5333_type; -typedef MSP430F533x MSP430F5335_type; -typedef MSP430F533x MSP430F5336_type; -typedef MSP430F533x MSP430F5338_type; - -typedef MSP430F532_4x MSP430F5340_type; -typedef MSP430F532_4x MSP430F5341_type; -typedef MSP430F532_4x MSP430F5342_type; - -typedef MSP430F535x MSP430F5358_type; -typedef MSP430F535x MSP430F5359_type; - - - -static const DeviceRegistrator regMSP430F5304; -static const DeviceRegistrator regMSP430F5308; -static const DeviceRegistrator regMSP430F5309; -static const DeviceRegistrator regMSP430F5310; - -static const DeviceRegistrator regMSP430F5324; -static const DeviceRegistrator regMSP430F5325; -static const DeviceRegistrator regMSP430F5326; -static const DeviceRegistrator regMSP430F5327; -static const DeviceRegistrator regMSP430F5328; -static const DeviceRegistrator regMSP430F5329; - -static const DeviceRegistrator regMSP430F5333; -static const DeviceRegistrator regMSP430F5335; -static const DeviceRegistrator regMSP430F5336; -static const DeviceRegistrator regMSP430F5338; - -static const DeviceRegistrator regMSP430F5340; -static const DeviceRegistrator regMSP430F5341; -static const DeviceRegistrator regMSP430F5342; - -static const DeviceRegistrator regMSP430F5358; -static const DeviceRegistrator regMSP430F5359; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F54xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F54xx.cpp deleted file mode 100644 index cb7ceea..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F54xx.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - * MSP430F54xx.cpp - * - * Definition MSP430F54xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -const ClockPair MSP430F54xxTimerTA3_1 = {"Timer1_A3", 57}; - -struct LargeEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - LargeEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::ADC12_A, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::Empty, - Eem::TB7_0, MSP430F54xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct SmallUsciEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - SmallUsciEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::ADC12_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::Empty, - Eem::TB7_0, MSP430F54xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - - -typedef ClockInfo LargeClockInfo; // default settings as they are defined in v2 -typedef ClockInfo SmallUsciClockInfo; - -template -struct MSP430F54xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size , Offset<0x5C00>, - SegmentSize<0x200>, BankSize<0x10000>, Banks<4>, NoMask> {}; - -template -struct MSP430F54xxAMemoryList : MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430F5xxx_SystemRamInfo >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > > {}; - -template -struct MSP430F54xxNoBSLMemoryList : MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430F5xxx_SystemRamInfo >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > > {}; - -typedef MSP430F54xxAMemoryList<2> A2FlashBlocks; -typedef MSP430F54xxAMemoryList<3> A3FlashBlocks; -typedef MSP430F54xxAMemoryList<4> A4FlashBlocks; - -typedef ExtendedFeatures MSP430F5438_ExtFeatures; - -template< - const char* description, - const unsigned int versionId, - const unsigned int subVersionId, - typename ClockInfo, - typename MemoryList, - typename ExtendedFeatures = MSP430F5xxx_ExtFeatures -> -struct MSP430F54xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList, - MSP430F5xxx_Features, - ExtendedFeatures - > {}; - -extern const char MSP430F5418[] = "MSP430F5418"; -extern const char MSP430F5419[] = "MSP430F5419"; -extern const char MSP430F5435[] = "MSP430F5435"; -extern const char MSP430F5436[] = "MSP430F5436"; -extern const char MSP430F5437[] = "MSP430F5437"; -extern const char MSP430F5438[] = "MSP430F5438"; - -extern const char MSP430F5418A[] = "MSP430F5418A"; -extern const char MSP430F5419A[] = "MSP430F5419A"; -extern const char MSP430F5435A[] = "MSP430F5435A"; -extern const char MSP430F5436A[] = "MSP430F5436A"; -extern const char MSP430F5437A[] = "MSP430F5437A"; -extern const char MSP430F5438A[] = "MSP430F5438A"; - -extern const char MSP430SL5438A[] = "MSP430SL5438A"; - -//description, versionId, subversionId, clock info, memory with nrFlashBlocks -typedef MSP430F54xx MSP430F5418_type; -typedef MSP430F54xx MSP430F5419_type; - -typedef MSP430F54xx MSP430F5435_type; -typedef MSP430F54xx MSP430F5436_type; - -typedef MSP430F54xx MSP430F5437_type; -typedef MSP430F54xx MSP430F5438_type; - -typedef MSP430F54xx MSP430F5418A_type; -typedef MSP430F54xx MSP430F5419A_type; - -typedef MSP430F54xx MSP430F5435A_type; -typedef MSP430F54xx MSP430F5436A_type; - -typedef MSP430F54xx MSP430F5437A_type; -typedef MSP430F54xx MSP430F5438A_type; - -typedef MSP430F54xx MSP430BT5190_type; - -typedef MSP430F54xx MSP430SL5438A_type; - -static const DeviceRegistrator regMSP430F5418; -static const DeviceRegistrator regMSP430F5419; -static const DeviceRegistrator regMSP430F5435; -static const DeviceRegistrator regMSP430F5436; -static const DeviceRegistrator regMSP430F5437; -static const DeviceRegistrator regMSP430F5438; - -static const DeviceRegistrator regMSP430F5418A; -static const DeviceRegistrator regMSP430F5419A; -static const DeviceRegistrator regMSP430F5435A; -static const DeviceRegistrator regMSP430F5436A; -static const DeviceRegistrator regMSP430F5437A; -static const DeviceRegistrator regMSP430F5438A; - -static const DeviceRegistrator regMSP430BT5190; - -static const DeviceRegistrator regMSP430SL5438A; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F55xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F55xx.cpp deleted file mode 100644 index ba404ef..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F55xx.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/* - * MSP430F55xx.cpp - * - * Definition MSP430F55xx USB and non USB devices. - * - * Copyright (C) 2011 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. - */ - -#include "UsbTypes.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -const ClockPair MSP430F55xxTimerTA3_1 = {"Timer1_A3", 57}; -const ClockPair MSP430F55xxTimerTA3_2 = {"Timer2_A3", 58}; - -struct MSP430F552x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F552x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F55xxTimerTA3_2, MSP430F55xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430F551x_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F551x_EemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::Empty, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F55xxTimerTA3_2, MSP430F55xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430_552x_LargeClockInfo; -typedef ClockInfo MSP430_551x_LargeClockInfo; - - - -template -struct MSP430F55xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType , OffsetType, SegmentSize<0x200>, - BankSize<0x10000>, BanksType, NoMask> {}; - - -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - class FlashSizeType, class FlashOffsetType, class FlashBanksType, - class RamSizeType, class RamBanksType -> -struct MSP430F55xx_type : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - UsbTypeRamInfo, - UsbTypeSystemRamInfo, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - -typedef MSP430_552x_LargeClockInfo ClockInfo_552x; -typedef MSP430_551x_LargeClockInfo ClockInfo_551x; - -//128 KB types -template< - const char* description, - const unsigned int versionId, - class clockInfo -> -struct MSP430F552x_128KB_type : MSP430F55xx_type< - description, versionId, clockInfo, - Size<0x20000>, Offset<0x4400>, Banks<4>, - Size<0x2000>,Banks<4> > {}; - -extern const char MSP430F5529[] = "MSP430F5529"; -extern const char MSP430F5528[] = "MSP430F5528"; -extern const char MSP430F5519[] = "MSP430F5519"; -//description - flash (size, offset, nr banks) - ram info (size, nr banks) - -typedef MSP430F552x_128KB_type MSP430F5529_type; -typedef MSP430F552x_128KB_type MSP430F5528_type; -typedef MSP430F552x_128KB_type MSP430F5519_type; - -static const DeviceRegistrator regMSP430F5529; -static const DeviceRegistrator regMSP430F5528; -static const DeviceRegistrator regMSP430F5519; - -//96 KB types -template< - const char* description, - const unsigned int versionId, - class clockInfo -> -struct MSP430F552x_96KB_type : MSP430F55xx_type< - description, versionId, clockInfo, - Size<0x18000>, Offset<0x4400>, Banks<3>, - Size<0x1800>,Banks<3> > {}; - -extern const char MSP430F5527[] = "MSP430F5527"; -extern const char MSP430F5526[] = "MSP430F5526"; -extern const char MSP430F5517[] = "MSP430F5517"; -//description - flash (size, offset, nr banks) - ram info (size, nr banks) - -typedef MSP430F552x_96KB_type MSP430F5527_type; -typedef MSP430F552x_96KB_type MSP430F5526_type; -typedef MSP430F552x_96KB_type MSP430F5517_type; - -static const DeviceRegistrator regMSP430F5527; -static const DeviceRegistrator regMSP430F5526; -static const DeviceRegistrator regMSP430F5517; - -//64 KB types -template< - const char* description, - const unsigned int versionId, - class clockInfo -> -struct MSP430F552x_64KB_type : MSP430F55xx_type< - description, versionId, clockInfo, - Size<0x10000>, Offset<0x4400>, Banks<2>, - Size<0x1000>,Banks<2> >{}; - -extern const char MSP430F5525[] = "MSP430F5525"; -extern const char MSP430F5524[] = "MSP430F5524"; -extern const char MSP430F5515[] = "MSP430F5515"; -extern const char MSP430F5514[] = "MSP430F5514"; - -//description - flash (size, offset, nr banks) - ram info (size, nr banks) -typedef MSP430F552x_64KB_type MSP430F5525_type; -typedef MSP430F552x_64KB_type MSP430F5524_type; -typedef MSP430F552x_64KB_type MSP430F5515_type; -typedef MSP430F552x_64KB_type MSP430F5514_type; - -static const DeviceRegistrator regMSP430F5525; -static const DeviceRegistrator regMSP430F5524; -static const DeviceRegistrator regMSP430F5515; -static const DeviceRegistrator regMSP430F5514; - -//64 KB types -template< - const char* description, - const unsigned int versionId, - class clockInfo -> -struct MSP430F552x_32KB_type : MSP430F55xx_type< - description, versionId, clockInfo, - Size<0x8000>, Offset<0x8000>, Banks<2>, - Size<0x2000>,Banks<4> > {}; - -extern const char MSP430F5522[] = "MSP430F5522"; -extern const char MSP430F5521[] = "MSP430F5521"; -extern const char MSP430F5513[] = "MSP430F5513"; - -//description - flash (size, offset, nr banks) - ram info (size, nr banks) -typedef MSP430F552x_32KB_type MSP430F5522_type; -typedef MSP430F552x_32KB_type MSP430F5521_type; -typedef MSP430F552x_32KB_type MSP430F5513_type; - -static const DeviceRegistrator regMSP430F5522; -static const DeviceRegistrator regMSP430F5521; -static const DeviceRegistrator regMSP430F5513; - -//tiny usb 5500 - 5510 -typedef MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x1000> , Offset<0x2400>, SegmentSize<0x1>, BankSize<0x2>, Banks<2>, - NoMask -> MSP430F55xx_Tiny_USB_SystemRamInfo; - -template -struct TinyUsb55xxFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - SizeType , OffsetType, SegmentSize<0x200>, - BankSize<0x10000>, Banks<1>, NoMask> {}; - -typedef TinyUsb55xxFlashMemory< - Size<0x8000>, - Offset<0x8000> -> MSP430F55xx_Tiny_USB_32KB_Type; - -typedef TinyUsb55xxFlashMemory< - Size<0x6000>, - Offset<0xA000> -> MSP430F55xx_Tiny_USB_24KB_Type; - -typedef TinyUsb55xxFlashMemory< - Size<0x4000>, - Offset<0xC000> -> MSP430F55xx_Tiny_USB_16KB_Type; - -typedef TinyUsb55xxFlashMemory< - Size<0x2000>, - Offset<0xE000> -> MSP430F55xx_Tiny_USB_8KB_Type; - -//terms small, medium, large are possibly not correct - better proposal? -struct MSP430F550x_LargeEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F550x_LargeEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::ADC10_A, Eem::RTC, Eem::USCI3, Eem::USCI2, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F55xxTimerTA3_2, MSP430F55xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430F550x_MediumEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F550x_MediumEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::ADC10_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F55xxTimerTA3_2, MSP430F55xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430F550x_SmallEemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F550x_SmallEemTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::ADC10_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F55xxTimerTA3_2, MSP430F55xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430F550x_LargeClockInfo; -typedef ClockInfo MSP430F550x_MediumClockInfo; -typedef ClockInfo MSP430F550x_SmallClockInfo; - -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - class FlashMemoryInfoType -> -struct MSP430F55xx_Tiny_USB_type : Device< - description, - ObjectId<0>, - DefaultBits<20>, - regular, - MSP430F5xxx_Match, - SmallEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - -extern const char MSP430F5500[] = "MSP430F5500"; -extern const char MSP430F5501[] = "MSP430F5501"; -extern const char MSP430F5502[] = "MSP430F5502"; -extern const char MSP430F5503[] = "MSP430F5503"; -extern const char MSP430F5504[] = "MSP430F5504"; -extern const char MSP430F5505[] = "MSP430F5505"; -extern const char MSP430F5506[] = "MSP430F5506"; -extern const char MSP430F5507[] = "MSP430F5507"; -extern const char MSP430F5508[] = "MSP430F5508"; -extern const char MSP430F5509[] = "MSP430F5509"; -extern const char MSP430F5510[] = "MSP430F5510"; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5500, 0x803B, - MSP430F550x_MediumClockInfo, MSP430F55xx_Tiny_USB_8KB_Type -> MSP430F5500_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5501, 0x8032, - MSP430F550x_MediumClockInfo, MSP430F55xx_Tiny_USB_16KB_Type -> MSP430F5501_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5502, 0x8033, - MSP430F550x_MediumClockInfo, MSP430F55xx_Tiny_USB_24KB_Type -> MSP430F5502_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5503, 0x8034, - MSP430F550x_MediumClockInfo, MSP430F55xx_Tiny_USB_32KB_Type -> MSP430F5503_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5504, 0x8035, - MSP430F550x_SmallClockInfo, MSP430F55xx_Tiny_USB_8KB_Type -> MSP430F5504_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5505, 0x8036, - MSP430F550x_SmallClockInfo, MSP430F55xx_Tiny_USB_16KB_Type -> MSP430F5505_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5506, 0x8037, - MSP430F550x_SmallClockInfo, MSP430F55xx_Tiny_USB_24KB_Type -> MSP430F5506_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5507, 0x8038, - MSP430F550x_SmallClockInfo, MSP430F55xx_Tiny_USB_32KB_Type -> MSP430F5507_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5508, 0x8039, - MSP430F550x_LargeClockInfo, MSP430F55xx_Tiny_USB_16KB_Type -> MSP430F5508_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5509, 0x803A, - MSP430F550x_LargeClockInfo, MSP430F55xx_Tiny_USB_24KB_Type -> MSP430F5509_type; - -typedef MSP430F55xx_Tiny_USB_type< - MSP430F5510, 0x8031, - MSP430F550x_LargeClockInfo, MSP430F55xx_Tiny_USB_32KB_Type -> MSP430F5510_type; - -static const DeviceRegistrator regMSP430F5500; -static const DeviceRegistrator regMSP430F5501; -static const DeviceRegistrator regMSP430F5502; -static const DeviceRegistrator regMSP430F5503; -static const DeviceRegistrator regMSP430F5504; -static const DeviceRegistrator regMSP430F5505; -static const DeviceRegistrator regMSP430F5506; -static const DeviceRegistrator regMSP430F5507; -static const DeviceRegistrator regMSP430F5508; -static const DeviceRegistrator regMSP430F5509; -static const DeviceRegistrator regMSP430F5510; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F56_66xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F56_66xx.cpp deleted file mode 100644 index fc88af9..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F56_66xx.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/* - * MSP430F56_66xx.cpp - * - * Definition MSP430F56xx/MSP430F56xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "UsbTypes.h" -#include "FlashMemoryAccessBase.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -const ClockPair MSP430F56_66xxTimerTA3_1 = {"Timer1_A3", 57}; -const ClockPair MSP430F56_66xxTimerTA3_2 = {"Timer2_A3", 58}; - -struct LcdDacAcdUsbTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - LcdDacAcdUsbTimer() : EemTimerImpl( - Eem::Empty, Eem::LCD_B, Eem::DAC12_0, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F56_66xxTimerTA3_2, MSP430F56_66xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct LcdAcdUsbTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - LcdAcdUsbTimer() : EemTimerImpl( - Eem::Empty, Eem::LCD_B, Eem::Empty, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F56_66xxTimerTA3_2, MSP430F56_66xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct LcdUsbTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - LcdUsbTimer() : EemTimerImpl( - Eem::Empty, Eem::LCD_B, Eem::Empty, Eem::COMP_B, - Eem::Empty, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F56_66xxTimerTA3_2, MSP430F56_66xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct DacAcdUsbTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - DacAcdUsbTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::DAC12_0, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F56_66xxTimerTA3_2, MSP430F56_66xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct AcdUsbTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - AcdUsbTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::ADC12_A, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F56_66xxTimerTA3_2, MSP430F56_66xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct UsbTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - UsbTimer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_B, - Eem::Empty, Eem::RTC, Eem::Empty, Eem::Empty, - Eem::USCI1, Eem::USCI0, Eem::USB, Eem::TB7_0, - MSP430F56_66xxTimerTA3_2, MSP430F56_66xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -template -struct MSP430F56_66xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size , Offset<0x8000>, SegmentSize<0x200>, - BankSize<0x10000>, Banks, NoMask, - MemoryCreator > {}; - - -template -struct MSP430Fx65x_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size , Offset<0x8000>, SegmentSize<0x200>, - BankSize<0x20000>, Banks, NoMask, - MemoryCreator > {}; - -template< - const char* description, - const unsigned int versionId, - typename ClockInfo, - const unsigned int nrBanks -> -struct MSP430F56_66xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2WordMode, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - UsbTypeRamInfo, - UsbTypeSystemRamInfo, Banks<4> >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - -template< - const char* description, - const unsigned int versionId, - typename ClockInfo, - const unsigned int nrBanks, - typename Ram2OffsetType, - typename Ram2SizeType -> -struct MSP430F565_665x : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2WordMode, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - UsbTypeRamInfo, - UsbTypeSystemRamInfo< Size<0x4000>, Banks<1> >, - MSP430F5xxx_SystemRam2Info< Ram2OffsetType, Ram2SizeType >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures, - PowerSettings< - 0x0, // Test reg mask - 0x0, // Test reg value to enable LPMx.5 - 0x0, // Test reg value to disable LPMx.5 - 0x4020, // 3V Test reg mask - 0x4020, // 3V Test reg value to enable LPMx.5 - 0x4020 // 3V Test reg value to disable LPMx.5 - > - > {}; - -typedef ClockInfo LcdDacAcdUsbClockInfo; -typedef ClockInfo LcdAcdUsbClockInfo; -typedef ClockInfo LcdUsbClockInfo; -typedef ClockInfo DacAcdUsbClockInfo; -typedef ClockInfo AcdUsbClockInfo; -typedef ClockInfo UsbClockInfo; - - -extern const char MSP430F5630[] = "MSP430F5630"; -extern const char MSP430F5631[] = "MSP430F5631"; -extern const char MSP430F5632[] = "MSP430F5632"; -extern const char MSP430F5633[] = "MSP430F5633"; -extern const char MSP430F5634[] = "MSP430F5634"; -extern const char MSP430F5635[] = "MSP430F5635"; -extern const char MSP430F5636[] = "MSP430F5636"; -extern const char MSP430F5637[] = "MSP430F5637"; -extern const char MSP430F5638[] = "MSP430F5638"; - -extern const char MSP430F6630[] = "MSP430F6630"; -extern const char MSP430F6631[] = "MSP430F6631"; -extern const char MSP430F6632[] = "MSP430F6632"; -extern const char MSP430F6633[] = "MSP430F6633"; -extern const char MSP430F6634[] = "MSP430F6634"; -extern const char MSP430F6635[] = "MSP430F6635"; -extern const char MSP430F6636[] = "MSP430F6636"; -extern const char MSP430F6637[] = "MSP430F6637"; -extern const char MSP430F6638[] = "MSP430F6638"; - -extern const char MSP430F5658[] = "MSP430F5658"; -extern const char MSP430F5659[] = "MSP430F5659"; - -extern const char MSP430F6658[] = "MSP430F6658"; -extern const char MSP430F6659[] = "MSP430F6659"; - -//description, versionId, clock info, number flash banks -typedef MSP430F56_66xx MSP430F5630_type; -typedef MSP430F56_66xx MSP430F5631_type; -typedef MSP430F56_66xx MSP430F5632_type; - -typedef MSP430F56_66xx MSP430F5633_type; -typedef MSP430F56_66xx MSP430F5634_type; -typedef MSP430F56_66xx MSP430F5635_type; - -typedef MSP430F56_66xx MSP430F5636_type; -typedef MSP430F56_66xx MSP430F5637_type; -typedef MSP430F56_66xx MSP430F5638_type; - -typedef MSP430F56_66xx MSP430F6630_type; -typedef MSP430F56_66xx MSP430F6631_type; -typedef MSP430F56_66xx MSP430F6632_type; - -typedef MSP430F56_66xx MSP430F6633_type; -typedef MSP430F56_66xx MSP430F6634_type; -typedef MSP430F56_66xx MSP430F6635_type; - -typedef MSP430F56_66xx MSP430F6636_type; -typedef MSP430F56_66xx MSP430F6637_type; -typedef MSP430F56_66xx MSP430F6638_type; - -typedef MSP430F565_665x, Size<0x8000> > MSP430F5658_type; -typedef MSP430F565_665x, Size<0x10000> > MSP430F5659_type; - -typedef MSP430F565_665x, Size<0x8000> > MSP430F6658_type; -typedef MSP430F565_665x, Size<0x10000> > MSP430F6659_type; - -static const DeviceRegistrator regMSP430F5630; -static const DeviceRegistrator regMSP430F5631; -static const DeviceRegistrator regMSP430F5632; -static const DeviceRegistrator regMSP430F5633; -static const DeviceRegistrator regMSP430F5634; -static const DeviceRegistrator regMSP430F5635; -static const DeviceRegistrator regMSP430F5636; -static const DeviceRegistrator regMSP430F5637; -static const DeviceRegistrator regMSP430F5638; - -static const DeviceRegistrator regMSP430F5658; -static const DeviceRegistrator regMSP430F5659; - -static const DeviceRegistrator regMSP430F6630; -static const DeviceRegistrator regMSP430F6631; -static const DeviceRegistrator regMSP430F6632; -static const DeviceRegistrator regMSP430F6633; -static const DeviceRegistrator regMSP430F6634; -static const DeviceRegistrator regMSP430F6635; -static const DeviceRegistrator regMSP430F6636; -static const DeviceRegistrator regMSP430F6637; -static const DeviceRegistrator regMSP430F6638; - -static const DeviceRegistrator regMSP430F6658; -static const DeviceRegistrator regMSP430F6659; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F5xxx.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F5xxx.h deleted file mode 100644 index fa140c0..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F5xxx.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * MSP430F5xxx.h - * - * Default values for MSP430F5xx familiy - to be used when devices are created, e.g. within MSP43054xx.cpp. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_MSP430F5XXX_H -#define TEMPLATE_DEVICE_DB_MSP430F5XXX_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "SpecialMemoryTypes.h" -#include "MSP430Defaults.h" -#include "Registration.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - typedef IdCode<0xFFFF, 0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x0> MSP430F5xxxIdMask; - - template - struct MSP430F5xxx_Match : Match< - IdCode, - MSP430F5xxxIdMask> {}; - - namespace Memory { - //Is there a way to get size automatically within MemoryMask template? - typedef NoMask MSP4305xxx_peripherl16bitMask; - - - //protectable due to INFO A - typedef MemoryInfo< - Name::information, FlashType, Mapped, Protectable, Bits16Type, - Size<0x200> , Offset<0x1800>, SegmentSize<0x80>, BankSize<0x80>, Banks<4>, - NoMask, MemoryCreator - > MSP430F5xxx_InfoFlashMemoryInfo; - - - ///bsl memory - typedef MemoryInfo< - Name::boot, FlashType, Mapped, Protectable, Bits16Type, - Size<0x800> , Offset<0x1000>, SegmentSize<0x200>, BankSize<0>, Banks<4>, - NoMask, MemoryCreator - > MSP430F5xxx_BootFlashMemoryInfo; - - //is bootcode correctly defined? - typedef MemoryInfo< - Name::bootCode, RomType, Mapped, Protectable, Bits16Type, - Size<0x100> , Offset<0x1A00>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430F5xxx_BootCodeMemoryInfo; - - typedef MemoryInfo< - Name::peripheral16bit, RegisterType, Mapped, NotProtectable, Bits16Type, - Size<0x1000> , Offset<0x0000>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - MSP4305xxx_peripherl16bitMask - > MSP430F5xxx_peripherl16lbitMemoryInfo; - - typedef MemoryInfo< - Name::cpu, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x10> , Offset<0x0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F5xxx_CPUMemoryInfo; - - typedef MemoryInfo< - Name::eem, RegisterType, NotMapped, NotProtectable, BitsDeviceDefaultType, - Size<0x80> , Offset<0>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask - > MSP430F5xxx_EEMMemoryInfo; - - - //size is still definable - template - struct MSP430F5xxx_SystemRamInfo : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x1c00>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask> {}; - - template - struct MSP430F5xxx_SystemRam2Info : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , OffsetType, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask> {}; - } //namespace Memory - - typedef VoltageInfo<1800, 3600, 1800, 2500, 6000, 7000, true> MSP430F5xxx_DefaultVoltageTestVpp; - typedef VoltageInfo<1800, 3600, 1800, 2500, 6000, 7000, false> MSP430F5xxx_DefaultVoltageNoTestVpp; - - typedef Features MSP430F5xxx_Features; - typedef ExtendedFeatures MSP430F5xxx_ExtFeatures; -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_MSP430F5XXX_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F64xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F64xx.cpp deleted file mode 100644 index 3ebe7ec..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F64xx.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - * MSP430F64xx.cpp - * - * Definition MSP430F64xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "UsbTypes.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - - -const ClockPair MSP430F64xxTimerTA3_1 = {"Timer1_A3", 57}; -const ClockPair MSP430F64xxTimerTA3_2 = {"Timer2_A3", 58}; - - -struct MSP430F64xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F64xx_EemTimer(const ClockPair& dac, const ClockPair& usci3, const ClockPair& usci2) - : EemTimerImpl( - Eem::Empty, Eem::LCD_B, dac, Eem::COMP_B, - Eem::ADC12_A,Eem::RTC, usci3, usci2, - Eem::USCI1, Eem::USCI0, Eem::Empty, Eem::TB7_0, - MSP430F64xxTimerTA3_2, MSP430F64xxTimerTA3_1, Eem::TA5_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty) - {} -}; - - -struct MSP430F6433_35_EemTimer : MSP430F64xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F6433_35_EemTimer() : MSP430F64xx_EemTimer(Eem::Empty, Eem::USCI3, Eem::USCI2) {} -}; - -struct MSP430F6436_38_EemTimer : MSP430F64xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F6436_38_EemTimer() : MSP430F64xx_EemTimer(Eem::DAC12_0, Eem::USCI3, Eem::USCI2) {} -}; - -struct MSP430F645x_EemTimer : MSP430F64xx_EemTimer -{ - typedef EemTimerImpl::Timer Eem; - MSP430F645x_EemTimer() : MSP430F64xx_EemTimer(Eem::Empty, Eem::Empty, Eem::Empty) {} -}; - -typedef ClockInfo MSP430F6433_35_ClockInfo; -typedef ClockInfo MSP430F6436_38_ClockInfo; -typedef ClockInfo MSP430F645x_ClockInfo; - - -template -struct MSP430F64xx_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size , Offset<0x8000>, SegmentSize<0x200>, - BankSize<0x10000>, Banks, NoMask> {}; - - -template -struct MSP430F645x_MainFlashMemory : MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size , Offset<0x8000>, SegmentSize<0x200>, - BankSize<0x20000>, Banks, NoMask> {}; - - - -template< - const char* description, - const unsigned int versionId, - typename ClockInfo, - const unsigned int nrBanks, - class RamSizeType -> -struct MSP430F64xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2WordMode, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - UsbTypeRamInfo, - UsbTypeSystemRamInfo< RamSizeType, Banks<1> >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - - -template< - const char* description, - const unsigned int versionId, - typename ClockInfo, - const unsigned int nrBanks, - class RamSizeType, - class Ram2OffsetType, - class Ram2SizeType -> -struct MSP430F645x : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2WordMode, - MemoryList, - MSP430F5xxx_InfoFlashMemoryInfo, - MSP430F5xxx_BootFlashMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - UsbTypeRamInfo, - UsbTypeSystemRamInfo< RamSizeType, Banks<1> >, - MSP430F5xxx_SystemRam2Info, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures - > {}; - - - - -extern const char MSP430F6433[] = "MSP430F6433"; -extern const char MSP430F6435[] = "MSP430F6435"; -extern const char MSP430F6436[] = "MSP430F6436"; -extern const char MSP430F6438[] = "MSP430F6438"; -extern const char MSP430F6458[] = "MSP430F6458"; -extern const char MSP430F6459[] = "MSP430F6459"; - - -typedef MSP430F64xx > MSP430F6433_type; -typedef MSP430F64xx > MSP430F6435_type; -typedef MSP430F64xx > MSP430F6436_type; -typedef MSP430F64xx > MSP430F6438_type; - -typedef MSP430F645x, Offset<0xF8000>, Size<0x8000> > MSP430F6458_type; -typedef MSP430F645x, Offset<0xF0000>, Size<0x10000> > MSP430F6459_type; - - -static const DeviceRegistrator regMSP430F6433; -static const DeviceRegistrator regMSP430F6435; -static const DeviceRegistrator regMSP430F6436; -static const DeviceRegistrator regMSP430F6438; -static const DeviceRegistrator regMSP430F6458; -static const DeviceRegistrator regMSP430F6459; - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F67xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F67xx.cpp deleted file mode 100644 index 3eafa6b..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430F67xx.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/* - * MSP430F67xx.cpp - * - * Definition MSP430F67xx devices. - * - * Copyright (C) 2011 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. - */ - -#include "UsbTypes.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -const ClockPair F67xxTimerTA2_3 = {"Timer3_A2", 11}; - -struct MSP430F67xx_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F67xx_EemTimer() - : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::SD24B, - Eem::ADC10_A,Eem::RTC, Eem::eUSCIB0,Eem::eUSCIA1, - Eem::eUSCIA0,Eem::Empty, Eem::Empty, Eem::TA3_0, - Eem::TA2_1, Eem::TA2_2, F67xxTimerTA2_3, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty) - {} -}; - - -typedef ClockInfo F67xx_ClockInfo; - - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x4000> , Offset<0xC000>, SegmentSize<0x200>, - BankSize<0x8000>, Banks<1>, NoMask -> MainFlash_16k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x8000> , Offset<0x8000>, SegmentSize<0x200>, - BankSize<0x8000>, Banks<1>, NoMask -> MainFlash_32k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0xC000> , Offset<0x4000>, SegmentSize<0x200>, - BankSize<0x8000>, Banks<2>, NoMask -> MainFlash_48k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x10000> , Offset<0x4000>, SegmentSize<0x200>, - BankSize<0x8000>, Banks<2>, NoMask -> MainFlash_64k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x18000> , Offset<0x4000>, SegmentSize<0x200>, - BankSize<0x8000>, Banks<3>, NoMask -> MainFlash_96k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x20000> , Offset<0x4000>, SegmentSize<0x200>, - BankSize<0x8000>, Banks<4>, NoMask -> MainFlash_128k; - - -typedef MSP430F5xxx_SystemRamInfo< Size<0x400> > SystemRam_1k; -typedef MSP430F5xxx_SystemRamInfo< Size<0x800> > SystemRam_2k; -typedef MSP430F5xxx_SystemRamInfo< Size<0x1000> > SystemRam_4k; -typedef MSP430F5xxx_SystemRamInfo< Size<0x2000> > SystemRam_8k; - - -template< - const char* description, - const unsigned int versionId, - typename ClockInfo, - class MainFlashInfo, - class RamInfo -> -struct MSP430F67xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F5xxx_Match, - SmallEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures, - PowerSettings< - 0x0, // Test reg mask - 0x0, // Test reg value to enable LPMx.5 - 0x0, // Test reg value to disable LPMx.5 - 0x4020, // 3V Test reg mask - 0x4020, // 3V Test reg value to enable LPMx.5 - 0x4020> // 3V Test reg value to disable LPMx.5 - > {}; - - -extern const char MSP430F6720[] = "MSP430F6720"; -extern const char MSP430F6721[] = "MSP430F6721"; -extern const char MSP430F6722[] = "MSP430F6722"; -extern const char MSP430F6723[] = "MSP430F6723"; -extern const char MSP430F6724[] = "MSP430F6724"; -extern const char MSP430F6725[] = "MSP430F6725"; -extern const char MSP430F6726[] = "MSP430F6726"; - -extern const char MSP430F6730[] = "MSP430F6730"; -extern const char MSP430F6731[] = "MSP430F6731"; -extern const char MSP430F6732[] = "MSP430F6732"; -extern const char MSP430F6733[] = "MSP430F6733"; -extern const char MSP430F6734[] = "MSP430F6734"; -extern const char MSP430F6735[] = "MSP430F6735"; -extern const char MSP430F6736[] = "MSP430F6736"; - - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6734; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6735; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6736; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6724; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6725; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6726; - - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6720; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6721; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6722; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6723; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6730; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6731; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6732; - -static const DeviceRegistrator< - MSP430F67xx -> regMSP430F6733; - - - -const ClockPair F6779eUSCIB1 = {"eUSCIB1", 59}; - -struct MSP430F6779_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F6779_EemTimer() - : EemTimerImpl( - Eem::AES, Eem::eUSCIA3,Eem::eUSCIA2,Eem::SD24B, - Eem::ADC10_A,Eem::RTC, Eem::eUSCIB0,Eem::eUSCIA1, - Eem::eUSCIA0,F6779eUSCIB1,Eem::COMP_B, Eem::TA3_0, - Eem::TA2_1, Eem::TA2_2, F67xxTimerTA2_3, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty) - {} -}; - -typedef ClockInfo F6779_ClockInfo; - - -struct MSP430F67791_EemTimer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430F67791_EemTimer() - : EemTimerImpl( - Eem::Empty, Eem::eUSCIA3,Eem::eUSCIA2,Eem::SD24B, - Eem::ADC10_A,Eem::RTC, Eem::eUSCIB0,Eem::eUSCIA1, - Eem::eUSCIA0,F6779eUSCIB1,Eem::COMP_B, Eem::TA3_0, - Eem::TA2_1, Eem::TA2_2, F67xxTimerTA2_3, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty) - {} -}; - -typedef ClockInfo F67791_ClockInfo; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x80000> , Offset<0xC000>, SegmentSize<0x200>, - BankSize<0x20000>, Banks<4>, NoMask -> MainFlash6779_512k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x40000> , Offset<0xC000>, SegmentSize<0x200>, - BankSize<0x20000>, Banks<2>, NoMask -> MainFlash6779_256k; - -typedef MemoryInfo< - Name::main, FlashType, Mapped, NotProtectable, Bits16Type, - Size<0x20000> , Offset<0xC000>, SegmentSize<0x200>, - BankSize<0x20000>, Banks<1>, NoMask -> MainFlash6779_128k; - -typedef MSP430F5xxx_SystemRamInfo< Size<0x8000> > SystemRam_32k; -typedef MSP430F5xxx_SystemRamInfo< Size<0x4000> > SystemRam_16k; - - -template< - const char* description, - const unsigned int versionId, - class ClockInfo, - class MainFlashInfo, - class RamInfo -> -struct MSP430F6779x : Device< - description, - ObjectId<0>, - DefaultBits20Type, - enhanced, - MSP430F5xxx_Match, - LargeEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfo, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430F5xxx_Features, - MSP430F5xxx_ExtFeatures, - PowerSettings< - 0x0, // Test reg mask - 0x0, // Test reg value to enable LPMx.5 - 0x0, // Test reg value to disable LPMx.5 - 0x4020, // 3V Test reg mask - 0x4020, // 3V Test reg value to enable LPMx.5 - 0x4020> // 3V Test reg value to disable LPMx.5 - > {}; - - -extern const char MSP430F6779[] = "MSP430F6779"; -extern const char MSP430F6778[] = "MSP430F6778"; -extern const char MSP430F6777[] = "MSP430F6777"; -extern const char MSP430F6776[] = "MSP430F6776"; -extern const char MSP430F6775[] = "MSP430F6775"; - -extern const char MSP430F6769[] = "MSP430F6769"; -extern const char MSP430F6768[] = "MSP430F6768"; -extern const char MSP430F6767[] = "MSP430F6767"; -extern const char MSP430F6766[] = "MSP430F6766"; -extern const char MSP430F6765[] = "MSP430F6765"; - -extern const char MSP430F6749[] = "MSP430F6749"; -extern const char MSP430F6748[] = "MSP430F6748"; -extern const char MSP430F6747[] = "MSP430F6747"; -extern const char MSP430F6746[] = "MSP430F6746"; -extern const char MSP430F6745[] = "MSP430F6745"; - - -extern const char MSP430F67791[] = "MSP430F67791"; -extern const char MSP430F67781[] = "MSP430F67781"; -extern const char MSP430F67771[] = "MSP430F67771"; -extern const char MSP430F67761[] = "MSP430F67761"; -extern const char MSP430F67751[] = "MSP430F67751"; - -extern const char MSP430F67691[] = "MSP430F67691"; -extern const char MSP430F67681[] = "MSP430F67681"; -extern const char MSP430F67671[] = "MSP430F67671"; -extern const char MSP430F67661[] = "MSP430F67661"; -extern const char MSP430F67651[] = "MSP430F67651"; - -extern const char MSP430F67491[] = "MSP430F67491"; -extern const char MSP430F67481[] = "MSP430F67481"; -extern const char MSP430F67471[] = "MSP430F67471"; -extern const char MSP430F67461[] = "MSP430F67461"; -extern const char MSP430F67451[] = "MSP430F67451"; - - - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6779; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6769; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6749; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6778; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6768; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6748; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6777; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6767; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6747; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6776; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6766; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6746; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6775; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6765; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F6745; - - - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67791; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67691; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67491; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67781; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67681; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67481; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67771; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67671; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67471; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67761; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67661; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67461; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67751; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67651; - -static const DeviceRegistrator< - MSP430F6779x -> regMSP430F67451; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430FR57xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430FR57xx.cpp deleted file mode 100644 index d3982d5..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430FR57xx.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - * MSP430FR57xx.cpp - * - * Definition MSP430FR57xx. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" -#include "MpuFr5739.h" -#include "FramMemoryAccessBaseFR57.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - - - -struct MSP430FR57xx_EemTimerLarge : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FR57xx_EemTimerLarge() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_D, - Eem::ADC10_B, Eem::RTC, Eem::Empty, Eem::eUSCIB0, - Eem::eUSCIA1, Eem::eUSCIA0, Eem::TB3_0, Eem::TB3_1, - Eem::TB3_2, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430FR57xx_EemTimerLarge_NoADC : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FR57xx_EemTimerLarge_NoADC() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_D, - Eem::Empty, Eem::RTC, Eem::Empty, Eem::eUSCIB0, - Eem::eUSCIA1, Eem::eUSCIA0, Eem::TB3_0, Eem::TB3_1, - Eem::TB3_2, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430FR57xx_EemTimerSmall : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FR57xx_EemTimerSmall() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_D, - Eem::ADC10_B, Eem::RTC, Eem::Empty, Eem::eUSCIB0, - Eem::Empty, Eem::eUSCIA0, Eem::TB3_0, Eem::Empty, - Eem::Empty, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -struct MSP430FR57xx_EemTimerSmall_NoADC : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FR57xx_EemTimerSmall_NoADC() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::COMP_D, - Eem::Empty, Eem::RTC, Eem::Empty, Eem::eUSCIB0, - Eem::Empty, Eem::eUSCIA0, Eem::TB3_0, Eem::Empty, - Eem::Empty, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - - -typedef ClockInfo FR57xx_LargeClockInfo; -typedef ClockInfo FR57xx_LargeClockInfo_NoADC; -typedef ClockInfo FR57xx_SmallClockInfo; -typedef ClockInfo FR57xx_SmallClockInfo_NoADC; - - -typedef Trigger FR57xxTrigger; - - -typedef EemInfo<0x00, 0x01, 0x01, FR57xxTrigger, SmallSequencer> FR57xxEemMode; - - -//protectable due to INFO A -typedef MemoryInfo< - Name::information, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x100> , Offset<0x1800>, SegmentSize<0x01>, BankSize<0x0>, Banks<1>, - NoMask, MemoryCreator > -> MSP430FR57xx_InfoFramMemoryInfo; - - -///bsl memory -typedef MemoryInfo< - Name::boot, RomType, Mapped, NotProtectable, Bits16Type, - Size<0x800> , Offset<0x1000>, SegmentSize<0x01>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator -> MSP430FR57xx_BootFramMemoryInfo; - - -template -struct MSP430FR57xx_MainFramMemory : MemoryInfo< - Name::main, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , OffsetType, SegmentSize<0x01>, - BankSize<0x0>, Banks<1>, NoMask, MemoryCreator > - > {}; - -typedef Features MSP430FR57xx_Features; - -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - const unsigned int FramOffset, - const unsigned int FramSize, - const unsigned int SysRamSize -> -struct MSP430FR57xx_type : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - FR57xxEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingXv2FRAM, - FuncletMappingXv2FRAM, - MemoryList, Offset >, - MSP430FR57xx_InfoFramMemoryInfo, - MSP430FR57xx_BootFramMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430F5xxx_SystemRamInfo< Size >, - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430FR57xx_Features, - NoExtendedFeatures, - PowerSettings<0x00010018, // Test reg mask - 0x00010010, // Test reg value to enable LPMx.5 - 0x00000018, // Test reg value to disable LPMx.5 - 0x4020, // 3V Test reg mask - 0x4020, // 3V Test reg value to enable LPMx.5 - 0x4020> // 3V Test reg value to disable LPMx.5 - > {}; - -extern const char MSP430FR5729[] = "MSP430FR5729"; -extern const char MSP430FR5728[] = "MSP430FR5728"; -extern const char MSP430FR5727[] = "MSP430FR5727"; -extern const char MSP430FR5726[] = "MSP430FR5726"; -extern const char MSP430FR5725[] = "MSP430FR5725"; -extern const char MSP430FR5724[] = "MSP430FR5724"; -extern const char MSP430FR5723[] = "MSP430FR5723"; -extern const char MSP430FR5722[] = "MSP430FR5722"; -extern const char MSP430FR5721[] = "MSP430FR5721"; -extern const char MSP430FR5720[] = "MSP430FR5720"; - -extern const char MSP430FR5739[] = "MSP430FR5739"; -extern const char MSP430FR5738[] = "MSP430FR5738"; -extern const char MSP430FR5737[] = "MSP430FR5737"; -extern const char MSP430FR5736[] = "MSP430FR5736"; -extern const char MSP430FR5735[] = "MSP430FR5735"; -extern const char MSP430FR5734[] = "MSP430FR5734"; -extern const char MSP430FR5733[] = "MSP430FR5733"; -extern const char MSP430FR5732[] = "MSP430FR5732"; -extern const char MSP430FR5731[] = "MSP430FR5731"; -extern const char MSP430FR5730[] = "MSP430FR5730"; - - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5729; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5728; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5727; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5726; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5725; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5724; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5723; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5722; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5721; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5720; - - - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5739; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5738; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5737; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5736; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5735; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5734; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5733; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5732; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5731; - -static const DeviceRegistrator< - MSP430FR57xx_type -> regMSP430FR5730; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430FR59xx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430FR59xx.cpp deleted file mode 100644 index bdd959b..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430FR59xx.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - * MSP430FR59xx.cpp - * - * Definition MSP430FR59xx. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" -#include "MpuFr5969.h" -#include "FramMemoryAccessBase.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - - - -struct MSP430FR59xx_EemTimerLarge : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430FR59xx_EemTimerLarge() : EemTimerImpl( - Eem::TA2_1, Eem::Empty, Eem::AES, Eem::COMP_D, - Eem::ADC12_B, Eem::RTC, Eem::Empty, Eem::eUSCIB0, - Eem::eUSCIA1, Eem::eUSCIA0, Eem::TB7_0, Eem::TA3_0, - Eem::TA3_1, Eem::TA3_2, Eem::TA2_0, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo FR59xx_SmallClockInfo; - -typedef Trigger FR59xxTrigger; - -typedef EemInfo<0x00, 0x01, 0x01, FR59xxTrigger, SmallSequencer> FR59xxEemMode; - - -/* Need datasheet or other source */ - -//protectable due to INFO A -typedef MemoryInfo< - Name::information, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x200> , Offset<0x1800>, SegmentSize<0x01>, BankSize<0x0>, Banks<1>, - NoMask, MemoryCreator > -> MSP430FR59xx_InfoFramMemoryInfo; - - -///bsl memory -typedef MemoryInfo< - Name::boot, RomType, Mapped, NotProtectable, Bits16Type, - Size<0x800> , Offset<0x1000>, SegmentSize<0x01>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator -> MSP430FR59xx_BootFramMemoryInfo; - -typedef Features MSP430FR59xx_Features; - -struct FunctionMappingMSP430FR59xx : public FunctionMappingBase -{ - FunctionMappingMSP430FR59xx(){ - FunctionMappingImpl::fcntMap_ = boost::assign::map_list_of - (ID_BlowFuse, ID_BlowFuseFram) - (ID_SyncJtag_AssertPor_SaveContext, ID_SyncJtag_AssertPor_SaveContextXv2) - (ID_SyncJtag_Conditional_SaveContext,ID_SyncJtag_Conditional_SaveContextXv2) - (ID_RestoreContext_ReleaseJtag,ID_RestoreContext_ReleaseJtagXv2) - (ID_ReadMemBytes,ID_ReadMemWordsXv2) - (ID_ReadMemWords,ID_ReadMemWordsXv2) - (ID_ReadMemQuick,ID_ReadMemQuickXv2) - (ID_WriteMemBytes,ID_WriteMemWordsXv2) - (ID_WriteMemWords,ID_WriteMemWordsXv2) - (ID_EemDataExchange,ID_EemDataExchangeXv2) - (ID_SingleStep,ID_SingleStepXv2) - (ID_ReadAllCpuRegs,ID_ReadAllCpuRegsXv2) - (ID_WriteAllCpuRegs,ID_WriteAllCpuRegsXv2) - (ID_Psa,ID_PsaXv2) - (ID_ExecuteFunclet,ID_ExecuteFuncletXv2) - (ID_WaitForStorage,ID_WaitForStorageX); - } -}; - -struct FunctionMappingMSP430FR69xx : public FunctionMappingBase -{ - FunctionMappingMSP430FR69xx(){ - FunctionMappingImpl::fcntMap_ = boost::assign::map_list_of - (ID_BlowFuse, ID_BlowFuseFram) - (ID_SyncJtag_AssertPor_SaveContext, ID_SyncJtag_AssertPor_SaveContextXv2) - (ID_SyncJtag_Conditional_SaveContext,ID_SyncJtag_Conditional_SaveContextXv2) - (ID_RestoreContext_ReleaseJtag,ID_RestoreContext_ReleaseJtagXv2) - (ID_ReadMemBytes,ID_ReadMemWordsXv2) - (ID_ReadMemWords,ID_ReadMemWordsXv2) - (ID_ReadMemQuick,ID_ReadMemQuickXv2) - (ID_WriteMemBytes,ID_WriteMemWordsXv2) - (ID_WriteMemWords,ID_WriteMemWordsXv2) - (ID_EemDataExchange,ID_EemDataExchangeXv2) - (ID_SingleStep,ID_SingleStepJStateXv2) - (ID_ReadAllCpuRegs,ID_ReadAllCpuRegsXv2) - (ID_WriteAllCpuRegs,ID_WriteAllCpuRegsXv2) - (ID_Psa,ID_PsaXv2) - (ID_ExecuteFunclet,ID_ExecuteFuncletXv2) - (ID_WaitForEem,ID_PollJStateReg) - (ID_WriteFramQuickXv2,ID_WriteMemWordsXv2) // Bug in Havok device - (ID_WaitForStorage,ID_WaitForStorageX); - } -}; - -template -struct MSP430FR6xxx_SystemRam2Info : MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , Offset<0x3C00>, SegmentSize<0x1>, BankSize<0x0>, Banks<1>, - NoMask> {}; - -template -struct MSP430FR59xx_MainFramMemory : MemoryInfo< - Name::main, RamType, Mapped, NotProtectable, Bits16Type, - SizeType , OffsetType, SegmentSize<0x01>, - BankSize<0x0>, Banks<1>, NoMask, MemoryCreator > - > {}; -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - const unsigned int FramOffset, - const unsigned int FramSize, - const unsigned int SysRamSize -> -struct MSP430FR59xx_type : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - FR59xxEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingMSP430FR59xx, - FuncletMappingXv2FRAM, - MemoryList, Offset >, - MSP430FR59xx_InfoFramMemoryInfo, - MSP430FR59xx_BootFramMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430F5xxx_SystemRamInfo< Size >, /*MSP430F5xxx_SystemRamInfo< Size<0x800> >,*/ - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo -// MSP430F5xxx_extendedMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430FR59xx_Features, - NoExtendedFeatures, - PowerSettings<0x00010018, // Test reg mask - 0x00010018, // Test reg value to enable LPMx.5 - 0x00010000, // Test reg value to disable LPMx.5 - 0x4020, // 3V Test reg mask - 0x4020, // 3V Test reg value to enable LPMx.5 - 0x4020> // 3V Test reg value to disable LPMx.5 - > {}; - -template< - const char* description, - const unsigned int versionId, - class ClockInfoType, - const unsigned int FramOffset, - const unsigned int FramSize, - const unsigned int SysRamSize, - const unsigned int SysRam2Size -> -struct MSP430FR69xx_type : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430F5xxx_Match, - FR59xxEemMode, - MSP430F5xxx_DefaultVoltageTestVpp, - ClockInfoType, - FunctionMappingMSP430FR69xx, - FuncletMappingXv2FRAM, - MemoryList, Offset >, - MSP430FR59xx_InfoFramMemoryInfo, - MSP430FR59xx_BootFramMemoryInfo, - MSP430F5xxx_BootCodeMemoryInfo, - MSP430FR6xxx_SystemRam2Info< Size >, - MSP430F5xxx_SystemRamInfo< Size >, /*MSP430F5xxx_SystemRamInfo< Size<0x800> >,*/ - MSP430F5xxx_peripherl16lbitMemoryInfo, - MSP430F5xxx_CPUMemoryInfo, - MSP430F5xxx_EEMMemoryInfo -// MSP430F5xxx_extendedMemoryInfo - > >, //until C++0x, the space between the brackets is important - MSP430FR59xx_Features, - NoExtendedFeatures, - PowerSettings<0x00010018, // Test reg mask - 0x00010018, // Test reg value to enable LPMx.5 - 0x00010000, // Test reg value to disable LPMx.5 - 0xC020, // 3V Test reg mask - 0xC020, // 3V Test reg value to enable LPMx.5 - 0x4020> // 3V Test reg value to disable LPMx.5 - > {}; - -extern const char MSP430FR5969[] = "MSP430FR5969"; -extern const char MSP430FR5949[] = "MSP430FR5949"; -extern const char MSP430FR6989[] = "MSP430FR6989"; - -static const DeviceRegistrator< - MSP430FR59xx_type -> regMSP430FR5969; - -static const DeviceRegistrator< - MSP430FR59xx_type -> regMSP430FR5949 ; - -static const DeviceRegistrator< - MSP430FR69xx_type -> regMSP430FR6989 ; - - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430G2xxx.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430G2xxx.cpp deleted file mode 100644 index 7cd9f26..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430G2xxx.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * MSP430G2xxxx.cpp - * - * Definition MSP430Gxxxx devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F2xxx.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef ClockInfo MSP430G2xxx_ClockInfo; - -typedef IdCode<0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00> MSP430G2xx2_3IdMask; - -typedef Match< IdCode<0x5224, 0,0,0,0,0,0>, MSP430G2xx2_3IdMask> MSP430G2xx2_Match; -typedef Match< IdCode<0x5325, 0,0,0,0,0,0>, MSP430G2xx2_3IdMask> MSP430G2xx3_Match; - -typedef Features MSP430G24_5xx_Features; - -template< - const char* description, - class MatchType, - const unsigned int FlashSize, - const unsigned int FlashOffset, - const unsigned int RamSize, - class Features = DefaultFeatures -> -struct MSP430G2xxx : Device< - description, - ObjectId<0>, - DefaultBits16Type, - regular, - MatchType, - LowEemMode, - MSP430F2xxx_DefaultVoltageTestVpp, - MSP430G2xxx_ClockInfo, - FunctionMappingNone, - FuncletMapping1_2xx, - MemoryList, Offset >, - MSP430F2xxx_InfoFlashMemoryInfo, - MSP430F2xxx_SystemRamInfo< Size >, - MSP430F1_2_4xxx_peripherl16lbitMemoryInfo, - MSP430F1_2_4xxx_peripherl8lbitMemoryInfo, - MSP430F2xxx_CPUMemoryInfo, - MSP430F2xxx_EEMMemoryInfo - > >, //until C++0x, the space between the brackets is important - Features - > {}; - - -extern const char MSP430G2452[] = "MSP430G2xx2"; -extern const char MSP430G2553[] = "MSP430G2xx3"; - -// G2xx1 covered in MSP430F20xx.cpp - -static const DeviceRegistrator< - MSP430G2xxx -> regMSP430G2452; - -static const DeviceRegistrator< - MSP430G2xxx -> regMSP430G2553; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430L092.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430L092.cpp deleted file mode 100644 index 856c7c7..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/MSP430L092.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * MSP430L092.cpp - * - * Definition of MSP430L092 devices. - * - * Copyright (C) 2011 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. - */ - -#include "MSP430F5xxx.h" -#include "LockableRamMemoryAccess.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; -using namespace TemplateDeviceDb::Memory; - -typedef IdCode<0xFFFF, 0xFFFF, 0x00, 0x00, 0x00, 0x00, 0x0, 0xFFFFFFFF> MSP430L092IdMask; - -template -struct MSP430L092_Match : Match< - IdCode, - MSP430L092IdMask> {}; - -struct MSP430L0xx_Timer : EemTimerImpl -{ - typedef EemTimerImpl::Timer Eem; - MSP430L0xx_Timer() : EemTimerImpl( - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::CCS, Eem::APOOL, - Eem::Empty, Eem::TA3_0, Eem::TA3_1, Eem::WDT_A, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty, - Eem::Empty, Eem::Empty, Eem::Empty, Eem::Empty - ) - {} -}; - -typedef ClockInfo MSP430L0xx_Clock; - -typedef MemoryInfo< - Name::main, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x780> , Offset<0x1c00>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask,MemoryCreator -> MSP430L0xx_MainRamMemory; - - -typedef MemoryInfo< - Name::system, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x80> , Offset<0x2380>, SegmentSize<0x1>, - BankSize<0x0>, Banks<1>, NoMask -> MSP430L0xx_SystemRamMemory; - - -typedef MemoryInfo< - Name::bootCode, RomType, Mapped, NotProtectable, Bits16Type, - Size<0x7E0> , Offset<0xF800>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430L0xx_BootCodeMemoryInfo; - -extern const char vectorTableName[] = "VectorTable"; -typedef MemoryInfo< - vectorTableName, RamType, Mapped, NotProtectable, Bits16Type, - Size<0x20> , Offset<0xFFE0>, SegmentSize<0x1>, BankSize<0>, Banks<1>, - NoMask, MemoryCreator - > MSP430L0xx_VectorTableMemoryInfo; - - -typedef VoltageInfo<900, 1800, 0, 0, 0, 0, false> MSP430L092VoltageInfo; - - -typedef Features MSP430L092_Features; - -template< - const char* description, - const unsigned int versionId -> -struct MSP430L0xx : Device< - description, - ObjectId<0>, - DefaultBits20Type, - regular, - MSP430L092_Match, - ExtraSmallEemMode, - MSP430L092VoltageInfo, - MSP430L0xx_Clock, - FunctionMappingXv2, - FuncletMappingXv2, - MemoryList >, //until C++0x, the space between the brackets is important - MSP430L092_Features - > {}; - -extern const char MSP430L092[] = "MSP430L092"; - -static const DeviceRegistrator< MSP430L0xx > regMSP430L092_type; diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Registration.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Registration.cpp deleted file mode 100644 index b33373b..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Registration.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Registration.cpp - * - * Registration of devices at central instance to be accessed by a DeviceDbManager. - * - * Copyright (C) 2011 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. - */ - -#include "Registration.h" - -#include -#include -#include -#include "boost/thread/detail/singleton.hpp" -#include "boost/date_time/posix_time/posix_time.hpp" - -#include - -#include "DatabaseImplementation.h" - -using namespace TI::DLL430; -using namespace TemplateDeviceDb; - -#define DLL430_FLAG_TESTVPP (1 << 7) -#define DLL430_PSA_REGULAR 0 -#define DLL430_PSA_ENHANCED 1 -#define DLL430_PSA_MASK 0x1 -#define DLL430_MEMFLAG_FLASH (0x0 << 8) /**< flash memory (main or information)*/ -#define DLL430_MEMFLAG_ROM (0x1 << 8) /**< read only memory (boot)*/ -#define DLL430_MEMFLAG_RAM (0x2 << 8) /**< random access memory */ -#define DLL430_MEMFLAG_REG (0x3 << 8) /**< registers (peripheral, cpu or eem) */ -#define DLL430_MEMFLAG_MAPPED (1 << 7) /**< memory type is mapped to global device address */ -#define DLL430_MEMFLAG_BITS_MASK 0x7F /**< the lowest 7 bits of the flags are fixed bit width (8/16/20) or target bit width (0) */ - -typedef std::map DeviceMapImpl; -typedef DeviceMapImpl::const_iterator DeviceMapConstIterator; -typedef boost::detail::thread::singleton DeviceMap; -DeviceCreatorBase::DeviceTypePtr currentDevice_; - -Registration::Registration() -{ - -} - -size_t Registration::GetDatabaseSize() const -{ - return DeviceMap::instance().size(); -} - -void Registration::insertDeviceCreator(const MatchImpl& match, DeviceCreatorPtr devCreator) -{ - DeviceMap::instance().insert(std::make_pair(match, devCreator)); -} - -size_t Registration::FindAndPrepareDevice(const IdCodeImpl& idCode) -{ - const DeviceMapImpl& map = DeviceMap::instance(); - - DeviceMapConstIterator it = map.begin(); - for(; it != map.end(); ++it) - { - if(it->first == idCode) - { - break; - } - } - - if(it != map.end() ) - { - Registration::DeviceCreatorPtr creator = (*it).second; - currentDevice_ = (*creator).create(); - return std::distance(map.begin(), it); - } - return -1; -} - -const char* Registration::GetCurrentDeviceDescription() const -{ - return currentDevice_->description_.c_str(); -} - -bool Registration::HasCurrentDeviceVpp() const -{ - return currentDevice_->voltageInfo_.hasTestVpp_; -} - -DeviceInfoPtr Registration::GetDeviceInfo(size_t id) const -{ - using TI::DLL430::DeviceInfo; - - DeviceMapConstIterator it = DeviceMap::instance().begin(); - if(id < DeviceMap::instance().size()) - { - std::advance(it, id); - } - else - { - it = DeviceMap::instance().end(); - } - DeviceInfoPtr info = DeviceInfoPtr(new DeviceInfo); - - if(it == DeviceMap::instance().end()) - { - return info; - } - - const Registration::DeviceCreatorPtr devCreatorPtr = (*it).second; - const DeviceCreatorBase::DeviceTypePtr currDevice = devCreatorPtr->create(); - currentDevice_ = currDevice; - - info->setObjectId(currDevice->objectDbEntry_); - uint8_t bits = currDevice->bits_; - switch (currDevice->flags_ & DLL430_PSA_MASK) - { - case DLL430_PSA_REGULAR: - info->setPsaType(DeviceInfo::PSATYPE_REGULAR); - break; - case DLL430_PSA_ENHANCED: - info->setPsaType(DeviceInfo::PSATYPE_ENHANCED); - break; - } - - info->minVcc(currDevice->voltageInfo_.vccMin_); - info->maxVcc(currDevice->voltageInfo_.vccMax_); - info->minFlashVcc(currDevice->voltageInfo_.vccFlashMin_); - info->minSecureVcc(currDevice->voltageInfo_.vccSecureMin_); - info->minSecureVpp(currDevice->voltageInfo_.vppSecureMin_); - info->maxSecureVpp(currDevice->voltageInfo_.vppSecureMax_); - info->hasTestVpp(currDevice->voltageInfo_.hasTestVpp_); - - info->quickMemRead(currDevice->featuresInfo_.quickMemRead_); - info->hasFram(currDevice->featuresInfo_.hasFram_); - info->clockSystem(currDevice->featuresInfo_.clock_); - info->noBsl(currDevice->featuresInfo_.noBsl_); - info->psach(currDevice->extFeaturesInfo_.psach_); - info->b1377(currDevice->extFeaturesInfo_._1377_); - - info->setDescription(currDevice->description_.c_str()); - - info->powerTestRegMask(currDevice->powerSettings_.powerTestRegMask_); - info->testRegEnableLpmx5(currDevice->powerSettings_.testRegEnableLpmx5_); - info->testRegDisableLpmx5(currDevice->powerSettings_.testRegDisableLpmx5_); - - info->powerTestReg3VMask(currDevice->powerSettings_.powerTestReg3VMask_); - info->testReg3VEnableLpmx5(currDevice->powerSettings_.testReg3VEnableLpmx5_); - info->testReg3VDisableLpmx5(currDevice->powerSettings_.testReg3VDisableLpmx5_); - - for (unsigned int i = 0; i < currDevice->getMemorySize(); ++i) - { - const MemoryInfoImpl& memInfo = currDevice->getMemoryAt(i); - DeviceInfo::memoryInfo* m = new DeviceInfo::memoryInfo; - - m->name.assign(memInfo.name_); - switch (memInfo.flags_ & 0x300) - { - case DLL430_MEMFLAG_FLASH: - m->type = DeviceInfo::MEMTYPE_FLASH; - break; - case DLL430_MEMFLAG_ROM: - m->type = DeviceInfo::MEMTYPE_ROM; - break; - case DLL430_MEMFLAG_RAM: - m->type = DeviceInfo::MEMTYPE_RAM; - break; - case DLL430_MEMFLAG_REG: - m->type = DeviceInfo::MEMTYPE_REGISTER; - break; - } - m->bits = memInfo.flags_ & DLL430_MEMFLAG_BITS_MASK; - if (!m->bits) - m->bits = bits; - - m->size = memInfo.size_; - m->offset = memInfo.offset_; - m->seg_size = memInfo.seg_size_; - m->banks = memInfo.banks_; - m->mask = std::vector(memInfo.memoryMaskImpl_.data_, - memInfo.memoryMaskImpl_.data_ + memInfo.memoryMaskImpl_.size_); - m->memoryCreatorPtr = memInfo.memoryCreator_; - m->mmapped = ((memInfo.flags_ & DLL430_MEMFLAG_MAPPED) != 0); - m->isProtected= memInfo.protected_; - info->addMemoryInfo(m); - } - - const FunctionMappingImpl::FunctionMapping& fcntMap = currDevice->fnctMap_.GetMap(); - if(!fcntMap.empty()) - { - FunctionMappingImpl::FunctionMapping::const_iterator it = fcntMap.begin(); - for (unsigned int i = 0; it != fcntMap.end(); ++it, ++i) - { - info->addFunctionMapping((*it).first, (*it).second); - } - } - - info->setFuncletMap( currDevice->funcletMapping_.getMap() ); - - info->setClockControl(currDevice->clockInfo_.clockControl_); - this->CreateClockModuleNames(info->getWritableClockMapping(), currDevice->clockInfo_.eemTimer_); - this->CreateClockNames(info->getClockNames(), currDevice->clockInfo_.eemClockNames_); - info->setClockModDefault(currDevice->clockInfo_.mclkCntrl0_); - - info->setStateStorage(currDevice->eemInfo_.stateStorage_); - info->setCycleCounter(currDevice->eemInfo_.cycleCounter_); - info->setCycleCounterOperations(currDevice->eemInfo_.cycleCounterOperations_); - info->setEmulationLevel(currDevice->eemInfo_.trigger_.emulation_level_); - info->setSFll(currDevice->featuresInfo_.sflldh_); - info->setTriggerMask(currDevice->eemInfo_.trigger_.mem_umaskLevel_); - - info->setPossibleTrigger(currDevice->eemInfo_.trigger_.mem_,0); /**< number of memory triggers */ - info->setPossibleTrigger(currDevice->eemInfo_.trigger_.reg_,1); /**< number of register-write triggers */ - info->setPossibleTrigger(currDevice->eemInfo_.trigger_.combinations_,2);/**< number of trigger combinations (trigger groups) */ - - info->setTriggerOptionsModes(currDevice->eemInfo_.trigger_.options_); - info->setTriggerDmaModes(currDevice->eemInfo_.trigger_.dma_); - info->setTriggerReadWriteModes(currDevice->eemInfo_.trigger_.readwrite_); - - info->setRegTriggerOperations(currDevice->eemInfo_.trigger_.regOperations_); - - info->setMaxSequencerStates(currDevice->eemInfo_.sequencer_.states_); - - return info; -} - -void Registration::CreateClockModuleNames(DeviceInfo::ClockMapping& clockMapping, const EemTimerImpl& eemTimer) const -{ - assert(clockModulesSize == clockMapping.size()); - - clockMapping[0].first = eemTimer._0_.name_; - clockMapping[0].second = eemTimer._0_.value_; - clockMapping[1].first = eemTimer._1_.name_; - clockMapping[1].second = eemTimer._1_.value_; - clockMapping[2].first = eemTimer._2_.name_; - clockMapping[2].second = eemTimer._2_.value_; - clockMapping[3].first = eemTimer._3_.name_; - clockMapping[3].second = eemTimer._3_.value_; - clockMapping[4].first = eemTimer._4_.name_; - clockMapping[4].second = eemTimer._4_.value_; - clockMapping[5].first = eemTimer._5_.name_; - clockMapping[5].second = eemTimer._5_.value_; - clockMapping[6].first = eemTimer._6_.name_; - clockMapping[6].second = eemTimer._6_.value_; - clockMapping[7].first = eemTimer._7_.name_; - clockMapping[7].second = eemTimer._7_.value_; - clockMapping[8].first = eemTimer._8_.name_; - clockMapping[8].second = eemTimer._8_.value_; - clockMapping[9].first = eemTimer._9_.name_; - clockMapping[9].second = eemTimer._9_.value_; - clockMapping[10].first = eemTimer._10_.name_; - clockMapping[10].second = eemTimer._10_.value_; - clockMapping[11].first = eemTimer._11_.name_; - clockMapping[11].second = eemTimer._11_.value_; - clockMapping[12].first = eemTimer._12_.name_; - clockMapping[12].second = eemTimer._12_.value_; - clockMapping[13].first = eemTimer._13_.name_; - clockMapping[13].second = eemTimer._13_.value_; - clockMapping[14].first = eemTimer._14_.name_; - clockMapping[14].second = eemTimer._14_.value_; - clockMapping[15].first = eemTimer._15_.name_; - clockMapping[15].second = eemTimer._15_.value_; - clockMapping[16].first = eemTimer._16_.name_; - clockMapping[16].second = eemTimer._16_.value_; - clockMapping[17].first = eemTimer._17_.name_; - clockMapping[17].second = eemTimer._17_.value_; - clockMapping[18].first = eemTimer._18_.name_; - clockMapping[18].second = eemTimer._18_.value_; - clockMapping[19].first = eemTimer._19_.name_; - clockMapping[19].second = eemTimer._19_.value_; - clockMapping[20].first = eemTimer._20_.name_; - clockMapping[20].second = eemTimer._20_.value_; - clockMapping[21].first = eemTimer._21_.name_; - clockMapping[21].second = eemTimer._21_.value_; - clockMapping[22].first = eemTimer._22_.name_; - clockMapping[22].second = eemTimer._22_.value_; - clockMapping[23].first = eemTimer._23_.name_; - clockMapping[23].second = eemTimer._23_.value_; - clockMapping[24].first = eemTimer._24_.name_; - clockMapping[24].second = eemTimer._24_.value_; - clockMapping[25].first = eemTimer._25_.name_; - clockMapping[25].second = eemTimer._25_.value_; - clockMapping[26].first = eemTimer._26_.name_; - clockMapping[26].second = eemTimer._26_.value_; - clockMapping[27].first = eemTimer._27_.name_; - clockMapping[27].second = eemTimer._27_.value_; - clockMapping[28].first = eemTimer._28_.name_; - clockMapping[28].second = eemTimer._28_.value_; - clockMapping[29].first = eemTimer._29_.name_; - clockMapping[29].second = eemTimer._29_.value_; - clockMapping[30].first = eemTimer._30_.name_; - clockMapping[30].second = eemTimer._30_.value_; - clockMapping[31].first = eemTimer._31_.name_; - clockMapping[31].second = eemTimer._31_.value_; -} - - -void Registration::CreateClockNames(DeviceInfo::ClockNames& clockNames, const EemClocksImpl& eemClocks) const -{ - clockNames[0] = eemClocks._0_; - clockNames[1] = eemClocks._1_; - clockNames[2] = eemClocks._2_; - clockNames[3] = eemClocks._3_; - clockNames[4] = eemClocks._4_; - clockNames[5] = eemClocks._5_; - clockNames[6] = eemClocks._6_; - clockNames[7] = eemClocks._7_; - clockNames[8] = eemClocks._8_; - clockNames[9] = eemClocks._9_; - clockNames[10] = eemClocks._10_; - clockNames[11] = eemClocks._11_; - clockNames[12] = eemClocks._12_; - clockNames[13] = eemClocks._13_; - clockNames[14] = eemClocks._14_; - clockNames[15] = eemClocks._15_; -} diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Registration.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Registration.h deleted file mode 100644 index c03a08e..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Registration.h +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Registration.h - * - * Basic device creating engine - interface mechanism to create devices and to convert them to be used by MSP430v3.dll. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_REGISTRATION_H -#define TEMPLATE_DEVICE_DB_REGISTRATION_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "DatabaseImplementation.h" - -/** \file Registration.h - \brief This is the interface if you want to add new devices. - \note If you need examples look at MSP430Defaults.h and MSP430F5xxx.cpp. - \note Having an IDE with code completion can help you immensly filling out the device. - \note All templates call their Impl counterparts from DatabaseImplementation.h theirs ctor taking all parameters at once. - */ -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - -template< - const uint16_t verId, - const uint16_t verSubId, - const uint8_t revisison, - const uint8_t fab, - const uint16_t self, - const char config, - const uint8_t fuses, - const uint32_t activationKey = 0 -> -struct IdCode : IdCodeImpl -{ - IdCode() : - IdCodeImpl(verId, verSubId, revisison, fab, self, config, fuses, activationKey) - {} -}; - -template< - class Value, - class Mask -> -struct Match : MatchImpl -{ - typedef Value Value_type; - typedef Mask Mask_type; - - Match() : - MatchImpl(Value_type(), Mask_type()) - {} -}; - -template< - const uint8_t emulation_level, ///< backwards compatible to C-API - const uint8_t mem, ///< number of memory triggers - const uint8_t reg, ///< number of register-write triggers - const uint8_t combinations, ///< number of trigger combinations (trigger groups) - const uint8_t options, ///< number of trigger options modes - const uint8_t dma, ///< number of trigger dma modes - const uint8_t readwrite, ///< number of trigger read/write modes - const uint8_t regTrigOperations,///< number of register trigger operations - const uint8_t compLevel, ///< 0: only ==, 1: == and !=, 2: all comparators - const uint8_t mem_condLevel, ///< number of TRIGx bits - 2 > 0,1,2 - const uint8_t mem_umaskLevel ///< 0: only combinations of 0xFF, 0x00FF( and 0xF0000), 1: all values -> -struct Trigger : TriggerImpl -{ - Trigger() : - TriggerImpl(emulation_level, mem, reg, combinations, - options, dma, readwrite, regTrigOperations, - compLevel, mem_condLevel, mem_umaskLevel) - {} -}; - -template< - const uint8_t states, ///< number of sequencer states (0 means "not present") - const uint8_t start, ///< first trigger combination number - const uint8_t end, ///< last trigger combination number - const uint8_t reset, ///< trigger combination number that resets the sequencer - const uint8_t blocked ///< trigger combination number that is blocked when the sequencer is active -> -struct Sequencer : SequencerImpl -{ - Sequencer() : - SequencerImpl(states, start, end, reset, blocked) - {} -} ; - -template< - const uint8_t stateStorage, ///< depth of available state storage modul. (0 means "not present") - const uint8_t cycleCounter, ///< number of available cycle counters. (0 means "not present") - const uint8_t cycleCounterOps, - class Trigger, - class Sequencer -> -struct EemInfo : EemInfoImpl -{ - typedef Trigger Trigger_type; - typedef Sequencer Sequencer_type; - - EemInfo () : - EemInfoImpl(stateStorage, cycleCounter, cycleCounterOps, Trigger_type(), Sequencer_type()) - {} -}; - -template< - const uint16_t vccMin, - const uint16_t vccMax, - const uint16_t vccFlashMin, - const uint16_t vccSecureMin, - const uint16_t vppSecureMin, - const uint16_t vppSecureMax, - const bool hasTestVpp -> -struct VoltageInfo : VoltageInfoImpl -{ - VoltageInfo () : - VoltageInfoImpl(vccMin, vccMax, vccFlashMin, vccSecureMin, vppSecureMin, vppSecureMax, hasTestVpp) - {} -}; - -template< - const uint8_t clockControl, - const uint16_t mclkCntrl0, - class EemTimer, - class EemClockNames -> -struct ClockInfo : ClockInfoImpl -{ - typedef EemTimer EemTimer_type; - typedef EemClockNames EemClockNames_type; - - ClockInfo() : - ClockInfoImpl(clockControl, mclkCntrl0, EemTimer_type(), EemClockNames()) - {} -}; - - -class MemoryListBase{}; -//Memory list - access elements with use of struct GetAt -template -struct MemoryList : MemoryListBase -{ - typedef List list_type; - - MemoryList() - {} -}; - - -/** -\struct GetAt -\brief Recursive getter for Types out of Tuples. - -\param lastIdx Highest Index within TupleType - -\param TupleType collection of types to iterate - -*/ -template -struct GetAt -{ - const unsigned int idx_; - GetAt(const unsigned int idx) : idx_(idx) - { - assert(idx_ <= lastIdx); - } - const MemoryInfoImpl Do() - { - if(idx_ == lastIdx) return typename boost::tuples::element::type(); - else return GetAt(idx_).Do(); - } - -}; - -/** -\struct GetAt<0, TupleType> -\brief Specialization of recursive getter for Types out of Tuples above. - Returns last (or in this case first) Type from the tuples - needed to break recursion. -\param TupleType collection of types to iterate - -*/ -template -struct GetAt<0, TupleType> -{ - const unsigned int idx_; - GetAt(const unsigned int idx) : idx_(idx) - { - assert(idx_ == 0); - } - const MemoryInfoImpl Do() - { - return typename boost::tuples::element<0, TupleType>::type(); - } -}; - -namespace Memory { - template - struct Type : public SingleUint32, TypeBase {}; - - typedef Type FlashType; - typedef Type RomType; - typedef Type RamType; - typedef Type RegisterType; - - typedef Bits<0> BitsDeviceDefaultType; - typedef Bits<8> Bits8Type; - typedef Bits<16> Bits16Type; - typedef Bits<20> Bits20Type; - - //types to make memory module definitions type safe! - template - struct IsMapped : public SingleBool, MappedBase {}; - - //default types to default file - typedef IsMapped Mapped; - typedef IsMapped NotMapped; - - template - struct IsProtectable : public SingleBool, ProtectableBase {}; - - //default types to default file? - typedef IsProtectable Protectable; - typedef IsProtectable NotProtectable; - - template - struct Size : public SingleUint32, SizeBase {}; - - - template - struct Offset : public SingleUint32, OffsetBase {}; - - - template - struct SegmentSize : public SingleUint32, SegSizebase {}; - - - template - struct BankSize : public SingleUint32, BankSizebase {}; - - - template - struct Banks : public SingleUint32, BanksBase {}; - - - - template - struct MemoryMask : MaskBase - { - const MemoryMaskImpl memoryMask_value; - - MemoryMask() : - memoryMask_value(data, N) - {} - }; - - struct NoMask : MaskBase - { - const MemoryMaskImpl memoryMask_value; - - NoMask() : memoryMask_value(0, 0) {} - }; - - //Use this for registering own MemoryAreaBaseTypes - template - struct MemoryCreator : public TI::DLL430::MemoryCreatorBase - { - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - - virtual bool isImplemented() const {return true;} - virtual TI::DLL430::MemoryAreaBase* operator()( - const std::string& name, TI::DLL430::DeviceHandleV3* devHandle, - uint32_t start, uint32_t end, - uint32_t seg, uint32_t banks, - bool mapped, const bool protectable, TI::DLL430::MemoryManager* mm, uint8_t psa - ) const - { - return new MemoryType( - name,devHandle, - start,end,seg,banks, - mapped,protectable,mm,psa - ); - } - }; - - //don't use this - it's implementation for NoMemoryCreator - template<> - struct MemoryCreator : TI::DLL430::MemoryCreatorBase - { - virtual bool isImplemented() const {return false;} - virtual TI::DLL430::MemoryAreaBase* operator()( - const std::string& name, TI::DLL430::DeviceHandleV3* devHandle, - uint32_t start, uint32_t end, - uint32_t seg, uint32_t banks, - bool mapped, const bool protectable, TI::DLL430::MemoryManager* mm, uint8_t psa - ) const - { - return NULL; - } - }; - - struct NoMemoryCreator : MemoryCreator {}; - } //namespace Memory - - -template< - const char* name, - class TypeType, - class MappedType, - class ProtectableType, - class BitsType, - class SizeType, - class OffsetType, - class SegmentSizeType, - class BankSizeType, - class BanksType, - class MaskType = Memory::NoMask, - class MemoryCreatorType = Memory::NoMemoryCreator -> -struct MemoryInfo : MemoryInfoImpl -{ - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - - typedef MaskType Mask_type; - - MemoryInfo() : - MemoryInfoImpl( - std::string(name), - CreateFlags(TypeType().value, MappedType().value, BitsType().value), - ProtectableType().value, - SizeType().value, - OffsetType().value, - SegmentSizeType().value, - BankSizeType().value, - BanksType().value, - Mask_type().memoryMask_value, - TI::DLL430::MemoryCreatorPtr(new MemoryCreatorType) - ) - {} -}; - - -/// \note device settings used for LPMx.5 -template -struct PowerSettings : PowerSettingsImpl -{ - PowerSettings() : PowerSettingsImpl(powerTestRegMask, enableLpmx5TestReg, disableLpmx5TestReg, powerTestReg3VMask, enableLpmx5TestReg3V, disableLpmx5TestReg3V) {} -}; - -typedef PowerSettings<0, 0, 0 , 0, 0, 0> NoPowerSettings; - - -template -struct Features : FeaturesImpl -{ - Features() : FeaturesImpl(clock, i2c, lcfe, quickMemRead, sflldh, hasFram, noBsl) {} -}; - -typedef Features DefaultFeatures; - - -template -struct ExtendedFeatures : ExtendedFeaturesImpl -{ - ExtendedFeatures() : ExtendedFeaturesImpl(tmr, jtag, dtc, sync, instr, _1377, psach) {} -}; - -typedef ExtendedFeatures NoExtendedFeatures; - - - -template< - const char* description, - class ObjectIdType, - class DefaultBitsType, - const Psa flags, - class MatchType, - class EemInfoType, - class VoltageInfoType, - class ClockInfoType, - class FunctionMappingType, - class FuncletMappingType, - class MemoryListType, - class FeaturesType = DefaultFeatures, - class ExtendedFeaturesType = NoExtendedFeatures, - class PowerSettingsType = NoPowerSettings -> -struct Device : public DeviceImplementation -{ - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); //Note as functionmapping is working via dynamic polymorphie instead of templates, this is correct - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - - typedef MatchType Match_type; - - Device() : DeviceImplementation( - std::string(description), - ObjectIdType().value, - DefaultBitsType().value, - flags, - MatchType(), - EemInfoType(), - VoltageInfoType(), - ClockInfoType(), - FunctionMappingType(), - FuncletMappingType(), - FeaturesType(), - ExtendedFeaturesType(), - PowerSettingsType() - ) - { - - } - //instead of virtual function, use typedefs to get instantiations - virtual unsigned int DoGetMemorySize() const - { - typedef typename MemoryListType::list_type ListType; - return boost::tuples::length::value; - } - - virtual const MemoryInfoImpl DoGetMemoryAt(unsigned int idx) const - { - typedef typename MemoryListType::list_type ListType; - const unsigned int size = boost::tuples::length::value; - assert(idx < size); - return GetAt(idx).Do(); - } -}; - -struct DeviceCreatorBase -{ - typedef boost::shared_ptr DeviceTypePtr; - virtual DeviceTypePtr create() const = 0; -}; - -template -struct DeviceCreator : DeviceCreatorBase -{ - BOOST_STATIC_ASSERT((boost::is_base_of::value)); - virtual DeviceTypePtr create() const {return DeviceTypePtr(new DeviceType); } -}; - - -class Registration -{ -public: - typedef boost::shared_ptr DeviceCreatorPtr; - //as registration acts on module global map, you can use it as RValue - Registration(); - - size_t FindAndPrepareDevice(const IdCodeImpl& match); - DeviceInfoPtr GetDeviceInfo(size_t id) const; - size_t GetDatabaseSize() const; - bool HasCurrentDeviceVpp() const; - const char* GetCurrentDeviceDescription() const; - void insertDeviceCreator(const MatchImpl& id, DeviceCreatorPtr devCreator); -private: - //helper function to copy ClockPairs from eemTimer to CreateClockModuleNames of DeviceInfo - void CreateClockModuleNames(DeviceInfo::ClockMapping& clockMapping, const EemTimerImpl& eemTimer) const; - void CreateClockNames(DeviceInfo::ClockNames& clockNames, const EemClocksImpl& eemClocks) const; -}; - - -template -class DeviceRegistrator -{ -public: - DeviceRegistrator() - { - //Just fill a vector with ids - create heap based object on request to save size - Registration().insertDeviceCreator( - typename DeviceType::Match_type(), - Registration::DeviceCreatorPtr(new DeviceCreator) - ); - } - void Register(){} -}; -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_REGISTRATION_H diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/SpecialMemoryTypes.cpp b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/SpecialMemoryTypes.cpp deleted file mode 100644 index 2c2d957..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/SpecialMemoryTypes.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* - * SpecialMemoryTypes.cpp - * - * Memory Types whith special handling. - * - * Copyright (C) 2011 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. - */ - -#include "SpecialMemoryTypes.h" -#include "DeviceHandleV3.h" -#include "ConfigManagerV3.h" -#include "FetHandleV3.h" -#include "MemoryManagerV3.h" - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { -namespace Memory { - - bool InformationFlashAccess::erase() - { - for ( uint32_t i = 0; i < getBanks(); ++i ) - { - if ( i == getBanks()-1 && isLocked() ) - continue; - - const uint32_t offset = getStart() + i*getSegmentSize(); - if ( !FlashMemoryAccessBase::erase(offset, offset + getSegmentSize()-1) ) - return false; - } - return true; - } - - - - bool BslFlashAccess::doRead(uint32_t address, uint32_t* buffer, size_t count) - { - using namespace std; - - assert(NULL != buffer); - bool success = true; - - const uint32_t lockedStartAddress = getLockedStartAddress(); - const size_t unlockedCount = min( - max(0, lockedStartAddress - address), - count); - const size_t lockedCount = count - unlockedCount; - - if (unlockedCount > 0) - { - success = FlashMemoryAccessBase::doRead(address, buffer, unlockedCount); - address += static_cast(unlockedCount); - buffer += unlockedCount; - } - - if (lockedCount > 0 && success) - { - if (!isLocked()) - physicallyLocked = !doUnlockBslMemory(); - - if(isLocked() || physicallyLocked) - { - success = appendInvalidAccessValues(address, buffer, lockedCount); - } - else - { - success = FlashMemoryAccessBase::doRead(address, buffer , lockedCount); - } - } - - return success; - } - - bool BslFlashAccess::doWrite(uint32_t address, uint32_t* buffer, size_t count) - { - if (isLocked()) - { - err = MEMORY_LOCKED_ERROR; - return false; - } - - physicallyLocked = !doUnlockBslMemory(); - - if (!physicallyLocked) - { - return FlashMemoryAccessBase::doWrite(address, buffer, count); - } - - err = MEMORY_UNLOCK_ERROR; - return false; - } - - bool BslFlashAccess::doWrite (uint32_t address, uint32_t value) - { - return doWrite(address, &value, 1); - } - - //erase segment wise - bool BslFlashAccess::erase() - { - return erase(getStart(), getEnd()); - } - - bool BslFlashAccess::erase(uint32_t start, uint32_t end) - { - if (isLocked()) - { - err = MEMORY_LOCKED_ERROR; - return true; - } - - physicallyLocked = !doUnlockBslMemory(); - - if (!physicallyLocked) - { - return FlashMemoryAccessBase::erase(start, end); - } - - err = MEMORY_UNLOCK_ERROR; - return false; - } - - bool BslFlashAccess::doUnlockBslMemory() - { - bool success = false; - - std::vector bslPe; - const bool readBslPeSuccess = readBslPe(&bslPe); - const bool deviceLocked = readBslPeSuccess && isDeviceLocked(bslPe); - - // get first the status of the memory area -LOCKED/UNLOCKED - if(!deviceLocked) - { - success = true; - } - else - { - const unsigned short sysBslDefaultSize = 0x03; - if(unlockBslPeAndCheck(sysBslDefaultSize)) - { - success = true; - } - else - { - success = false; - /* is not supported by current 5xx BSL's - this->devHandle->getFetHandle()->getConfigManager()->start(); - this->devHandle->getFetHandle()->getConfigManager()->reset(false,10,this->devHandle->getJtagId()); - - MemoryManagerV3* mm = devHandle->getMemoryManager(); - if(!(mm->uploadFunclet(FuncletCode::BSLUNLOCK))) - { - return false; - } - MemoryArea* ram = mm->getMemoryArea("system", 0); - const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::BSLUNLOCK); - - const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); - - HalExecCommand cmd; - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); - el->appendInputData16(static_cast(ram->getStart() & 0xFFFF)); - el->appendInputData16(static_cast(ram->getSize() & 0xFFFF)); - el->appendInputData16(programStartAddress); - el->appendInputData32(0x0); - el->appendInputData32(0x2); - el->appendInputData16(0x0); - el->appendInputData16(0x0); - //Dummy data to trigger execution of unlock BSL funclet funclet - el->appendInputData32(0xDEADBEEF); - - // set value for return length - el->setOutputSize(2); - cmd.elements.push_back(el); - - if (!this->devHandle->send(cmd)) - { - success = false;; - } - - std::vector bslPeBuffer; - - const bool readBackSuccess = readBslPe(&bslPeBuffer); - if(!readBackSuccess || isDeviceLocked(bslPeBuffer)) - { - success = false; - } - else - { - success = true; - }*/ - } - } - return success; - } - - bool BslFlashAccess::appendInvalidAccessValues(uint32_t address, uint32_t* buffer, size_t count) const - { - assert(NULL != buffer); - for(size_t i = 0; i < count/2 ; ++i) - { - buffer[i*2] = 0xff; - buffer[i*2 + 1] = 0x3f; - } - return true; - } - - bool BslFlashAccess::readBslPe(std::vector* bslPeBuffer) const - { - const unsigned short mySysBslc = 0x182; - - bslPeBuffer->resize(2); - const bool readBslPeSuccess = mm->read(mySysBslc, &(*bslPeBuffer)[0], 2); - const bool sendCommandSuccess = readBslPeSuccess && mm->sync(); - - return sendCommandSuccess; - } - - bool BslFlashAccess::unlockBslPeAndCheck(uint32_t bslSize) - { - std::vector bslPeBuffer; - bslPeBuffer.reserve(2); - bslPeBuffer.push_back(bslSize); - bslPeBuffer.push_back(0x00); - - const bool writeBslPeSuccess = mm->write(mySysBslc, &bslPeBuffer[0], mySysBslcSize); - const bool sendCommandSuccess = writeBslPeSuccess && mm->sync(); - const bool readBackSuccess = sendCommandSuccess && readBslPe(&bslPeBuffer); - const bool correctBslSize = (bslPeBuffer.size() == mySysBslcSize) && bslPeBuffer[0] == bslSize; - return readBackSuccess && !isDeviceLocked(bslPeBuffer) && correctBslSize; - } - - bool BslFlashAccess::isDeviceLocked(const std::vector& bslPeBuffer) const - { - if(bslPeBuffer.size() == mySysBslcSize) - { - //it's sufficient to check one byte - const unsigned int sysBslPe = 0x80; - return bslPeBuffer[1] == sysBslPe; - } - return false; - } - - uint32_t BslFlashAccess::getLockedStartAddress() const - { - const uint32_t maxBslSize = 0x03; - std::vector lockStartAddr; - - const bool readBslPeSuccess = readBslPe(&lockStartAddr); - const bool bslSizeValid = lockStartAddr[0] <= maxBslSize; - - if ( !isDeviceLocked(lockStartAddr) ) - { - return getSize(); - } - else if ( bslSizeValid && readBslPeSuccess ) - { - return (maxBslSize - lockStartAddr[0]) * getSegmentSize(); - } - return 0; - } - - - bool BootcodeRomAccess::doRead (uint32_t address, uint32_t* buffer, size_t count) - { - bool omitFirst = (address & 0x1); - if (omitFirst) - { - --address; - ++count; - } - bool omitLast = (count & 1); - if (omitLast) - { - ++count; - } - - HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ReadMemQuick)); - el->appendInputData32(this->getStart() + address); - el->appendInputData32(static_cast(count/2)); - el->setOutputSize(count); - - ReadElement r(buffer, count, omitFirst, omitLast, 0); - this->readMap[this->elements.size()] = r; - this->elements.push_back(el); - return true; - } -}//namespace Memory -}//namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/SpecialMemoryTypes.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/SpecialMemoryTypes.h deleted file mode 100644 index 71c4209..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/SpecialMemoryTypes.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * SpecialMemoryTypes.h - * - * Memory Types whith special handling. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_SPECIAL_MEMORY_TYPES_H -#define TEMPLATE_DEVICE_DB_SPECIAL_MEMORY_TYPES_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -#include -#include -#include - -namespace TI { namespace DLL430 { - class MemoryManager; - - namespace TemplateDeviceDb { namespace Memory { - - class InformationFlashAccess : public TI::DLL430::FlashMemoryAccessBase - { - public: - InformationFlashAccess ( - const std::string& name, - TI::DLL430::DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, - bool mapped, - const bool protectable, - MemoryManager* mm, - uint8_t psa) - : FlashMemoryAccessBase( - name, devHandle, - start, end, seg, banks - , mapped, protectable, mm, psa - ) {} - - virtual unsigned short getFlags() {return isLocked() ? LOCK_INFO_A_FLAG : NO_FLAG;} - - virtual bool erase(); - }; - - class BslFlashAccess : public TI::DLL430::FlashMemoryAccessBase - { - bool physicallyLocked; - - static const unsigned short mySysBslc = 0x182; - static const unsigned short mySysBslcSize = 2; - public: - BslFlashAccess ( - const std::string& name, - TI::DLL430::DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, - bool mapped, - const bool protectable, - MemoryManager* mm, - uint8_t psa) - : FlashMemoryAccessBase( - name, devHandle, - start, end, seg, banks - , mapped, protectable, mm, psa - ), - physicallyLocked(true) - {} - - virtual bool doRead(uint32_t address, uint32_t* buffer, size_t count); - - virtual bool doWrite(uint32_t address, uint32_t* buffer, size_t count); - - virtual bool doWrite (uint32_t address, uint32_t value); - - virtual bool erase (); - - virtual bool erase (uint32_t start, uint32_t end); - - bool doUnlockBslMemory(); - - bool appendInvalidAccessValues(uint32_t address, uint32_t* buffer, size_t count) const; - - bool readBslPe(std::vector* bslPeBuffer) const; - - bool unlockBslPeAndCheck(uint32_t bslSize); - - bool isDeviceLocked(const std::vector& bslPeBuffer) const; - - uint32_t getLockedStartAddress() const; - }; - - //actual Bootcode is flash, but behaves like ROM - class BootcodeRomAccess : public TI::DLL430::ReadonlyMemoryAccess - { - public: - BootcodeRomAccess ( - const std::string& name, - TI::DLL430::DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, - bool mapped, - const bool protectable, - MemoryManager* mm, - uint8_t psa) - : ReadonlyMemoryAccess( - name,devHandle, - start,end,seg,banks, - mapped,protectable,mm,psa - ) - {} - - virtual bool doRead (uint32_t address, uint32_t* buffer, size_t count); - virtual bool doWrite (uint32_t address, uint32_t* buffer, size_t count) { return false; }; - virtual bool doWrite (uint32_t address, uint32_t value) { return false; }; - }; -}//namespace Memory -}//namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_SPECIAL_MEMORY_TYPES_H - diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/TemplateTypes.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/TemplateTypes.h deleted file mode 100644 index c8074d5..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/TemplateTypes.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * TemplateTypes.h - * - * General templates to force type safety. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_TEMPLATETYPES_H -#define TEMPLATE_DEVICE_DB_TEMPLATETYPES_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "Utility.h" - -//default types to default file -//all base files serve as static check opportunity, when template parameters are given - see BOOST_STATIC_ASSERT. -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - template - inline int toInt(const T& t) - { - return static_cast(t); - } - - template - struct SingleUint32 - { - const uint32_t value; - SingleUint32() : value(N) {} - }; - - template - struct SingleUint8 - { - const uint8_t value; - SingleUint8() : value(N) {} - }; - - template - struct SingleSize_t - { - const size_t value; - SingleSize_t() : value(N) {} - }; - - template - struct SingleBool - { - const bool value; - SingleBool() : value(b) {} - }; - - class BitsBase{}; - template - struct Bits : public SingleUint32, BitsBase {}; - - class DefaultBitsBase : BitsBase {}; - template - struct DefaultBits : public SingleUint32, DefaultBitsBase {}; - - //MSP430 device wide defaults set for memory if BitsDeviceDefaultType is chosen - typedef DefaultBits<8> DefaultBits8Type; - typedef DefaultBits<16> DefaultBits16Type; - typedef DefaultBits<20> DefaultBits20Type; - - class ObjectIdBase{}; - template - struct ObjectId : public SingleSize_t, ObjectIdBase {}; -} //namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_TEMPLATETYPES_H diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/UsbTypes.h b/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/UsbTypes.h deleted file mode 100644 index 7a2e55a..0000000 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/UsbTypes.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * UsbAccessType.h - * - * Memory Types whith special handling. - * - * Copyright (C) 2011 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 TEMPLATE_DEVICE_DB_USB_TYPES_H -#define TEMPLATE_DEVICE_DB_USB_TYPES_H - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include -#include "MSP430F5xxx.h" - -namespace TI { - namespace DLL430 { - class DeviceHandleV3; - } -} - -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { - namespace Memory { - namespace Name { - namespace { - extern const char usbram[] = "usbram"; - } - } - } -} - -namespace Tdd = TemplateDeviceDb; -namespace Mem = TemplateDeviceDb::Memory; - -class UsbRamAccess : public TI::DLL430::RandomMemoryAccess -{ -public: - UsbRamAccess ( - const std::string& name, - TI::DLL430::DeviceHandleV3* devHandle, - uint32_t start, - uint32_t end, - uint32_t seg, - uint32_t banks, - bool mapped, - const bool protectable, - MemoryManager* mm, - uint8_t psa) - : RandomMemoryAccess( - name,devHandle, - start,end,seg,banks - ,mapped,protectable,mm,psa - ) {} - - virtual bool doRead (uint32_t address, uint32_t* buffer, size_t count){ - return MemoryAreaBase::doRead (address, buffer, count); - } -}; - -typedef TemplateDeviceDb::MemoryInfo< - Mem::Name::usbram, Mem::RamType, Mem::Mapped, Mem::NotProtectable, Mem::Bits16Type, - Mem::Size<0x800> , Mem::Offset<0x1c00>, Mem::SegmentSize<0x1>, Mem::BankSize<0x0>, Mem::Banks<1>, - Mem::NoMask, Mem::MemoryCreator -> UsbTypeRamInfo; - - -template -struct UsbTypeSystemRamInfo : TemplateDeviceDb::MemoryInfo< - Mem::Name::system, Mem::RamType, Mem::Mapped, - Mem::NotProtectable, Mem::Bits16Type, - SizeType , Mem::Offset<0x2400>, Mem::SegmentSize<0x1>, - Mem::BankSize<0x0>, BanksType, Mem::NoMask> {}; -}//namespace DLL430 -}//namespace TI -#endif //TEMPLATE_DEVICE_DB_USB_TYPES_H - diff --git a/DLL430_v3/src/TI/DLL430/TinyRandomMemoryAccess.cpp b/DLL430_v3/src/TI/DLL430/TinyRandomMemoryAccess.cpp new file mode 100644 index 0000000..dbf8b7d --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/TinyRandomMemoryAccess.cpp @@ -0,0 +1,182 @@ +/* + * TinyRandomMemoryAccess.cpp + * + * Memory class for accessing RAM. + * + * Copyright (C) 2007 - 2016 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. + */ + +#include +#include "TinyRandomMemoryAccess.h" +#include "HalExecCommand.h" +#include "IDeviceHandle.h" + +using namespace TI::DLL430; + +TinyRandomMemoryAccess::TinyRandomMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa) + : MemoryAreaBase(name, devHandle, start, end, seg, banks, mapped, isProtected, psa) + , mm(mm) +{} + +bool TinyRandomMemoryAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count) +{ + if (count + address > this->getSize()) + { + return false; + } + return this->writeBytes(address, buffer, count); +} + + +bool TinyRandomMemoryAccess::read(uint32_t address, uint8_t* buffer, size_t count) +{ + if (address+count > tinyRamCache.size()) + { + return false; + } + if (buffer) + { + for (size_t i = 0; i < count; ++i) + { + buffer[i] = this->tinyRamCache[i+address]; + } + } + return true; +} + + +bool TinyRandomMemoryAccess::writeBytes(uint32_t address, const uint8_t* buffer, size_t count) +{ + for (uint8_t i = 0; i < count; ++i) + { + tinyRamCache[i+address] = buffer[i]; + } + return true; +} + +bool TinyRandomMemoryAccess::doWrite(uint32_t address, uint32_t value) +{ + return this->writeBytes(address, (uint8_t*)&value, 1); +} + +bool TinyRandomMemoryAccess::fillCache() +{ + tinyRamCache.clear(); + tinyRamCache.resize(getSize()); + + // backup tiny ram fist + HalExecElement* readTinyRam = new HalExecElement(this->devHandle->checkHalId(ID_ReadMemWords)); + readTinyRam->appendInputData32(getStart()); + readTinyRam->appendInputData32(getSize()/2); + + HalExecCommand cmdRead; + cmdRead.elements.emplace_back(readTinyRam); + + if (!this->devHandle->send(cmdRead)) + { + return false; + } + for (uint8_t i = 0; i < tinyRamCache.size(); ++i) + { + tinyRamCache[i] = cmdRead.elements[0]->getOutputAt8(i); + } + + // then write save pattern to tiny ram + HalExecElement* writeTinyRam = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); + writeTinyRam->appendInputData32(getStart()); + writeTinyRam->appendInputData32(getSize()/2); + + for (uint8_t i = 0; i < tinyRamCache.size()/2; ++i) + { + writeTinyRam->appendInputData16(0x3FFF); + } + HalExecCommand cmdWrite; + cmdWrite.elements.emplace_back(writeTinyRam); + + if (!this->devHandle->send(cmdWrite)) + { + return false; + } + return true; +} + +bool TinyRandomMemoryAccess::flushCache() const +{ + HalExecElement* writeTinyRam = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); + writeTinyRam->appendInputData32(getStart()); + writeTinyRam->appendInputData32(getSize()/2); + + for (uint8_t i = 0; i < tinyRamCache.size(); ++i) + { + writeTinyRam->appendInputData8(tinyRamCache[i]); + } + + HalExecCommand cmd; + cmd.elements.emplace_back(writeTinyRam); + + if (!this->devHandle->send(cmd)) + { + return false; + } + return true; +} + +bool TinyRandomMemoryAccess::verify(uint32_t address, const uint8_t* buffer, size_t count) +{ + bool status = true; + + if (count + address > tinyRamCache.size()) + { + return false; + } + + for (uint8_t i = 0; i < count; ++i) + { + if (tinyRamCache[i + address] != buffer[i]) + { + status = false; + break; + } + } + + return status; +} diff --git a/DLL430_v3/src/TI/DLL430/TinyRandomMemoryAccess.h b/DLL430_v3/src/TI/DLL430/TinyRandomMemoryAccess.h new file mode 100644 index 0000000..2b04578 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/TinyRandomMemoryAccess.h @@ -0,0 +1,86 @@ +/* + * TinyRandomMemoryAccess.h + * + * Memory class for accessing Tiny RAM. + * + * Copyright (C) 2007 - 2016 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. + */ + +#pragma once + +#include "MemoryAreaBase.h" + +namespace TI +{ + namespace DLL430 + { + class IDeviceHandle; + class TinyRandomMemoryAccess : public MemoryAreaBase + { + public: + TinyRandomMemoryAccess( + MemoryArea::Name name, + IDeviceHandle* devHandle, + uint32_t start, + uint32_t end, + uint32_t seg, + uint32_t banks, + bool mapped, + const bool isProtected, + IMemoryManager* mm, + uint8_t psa); + + virtual bool doWrite(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + virtual bool doWrite(uint32_t address, uint32_t value) OVERRIDE; + + virtual bool read(uint32_t address, uint8_t* buffer, size_t count) OVERRIDE; + + virtual bool erase() OVERRIDE { return true; } + virtual bool erase(uint32_t start, uint32_t end, bool forceUnlock = false) OVERRIDE{ return true; } + + virtual bool fillCache() OVERRIDE; + virtual bool flushCache() const OVERRIDE; + + virtual bool verify(uint32_t address, const uint8_t* buffer, size_t count) OVERRIDE; + + protected: + bool postSync(const HalExecCommand&) OVERRIDE { return true; } + + IMemoryManager* mm; + + private: + bool writeBytes(uint32_t address, const uint8_t* buffer, size_t count); + std::vector tinyRamCache; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/UpdateManagerDummy.cpp b/DLL430_v3/src/TI/DLL430/UpdateManagerDummy.cpp new file mode 100644 index 0000000..8790ca3 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/UpdateManagerDummy.cpp @@ -0,0 +1,65 @@ +/* + * UpdateManagerDummy.cpp + * + * Dummy handling for not correct started or unknown debugger + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include "VersionInfo.h" +#include "UpdateManagerDummy.h" + +using namespace TI::DLL430; +using namespace std; + +UpdateManagerDummy::UpdateManagerDummy(){} + +UpdateManagerDummy::~UpdateManagerDummy(){} + +bool UpdateManagerDummy::isUpdateRequired(TARGET_ARCHITECTURE_t arch) const +{ + return false; +} + +VersionInfo UpdateManagerDummy::getHalVersion() const +{ + return VersionInfo(0, 0, 0, 0); +} + +bool UpdateManagerDummy::firmWareUpdate(const char*, UpdateNotifyCallback, bool*) +{ + throw std::runtime_error("DUMMY_FW_MANAGER_UPDATE"); + return false; +} + +/*EOF*/ diff --git a/DLL430_v3/src/TI/DLL430/UpdateManagerDummy.h b/DLL430_v3/src/TI/DLL430/UpdateManagerDummy.h new file mode 100644 index 0000000..3d94220 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/UpdateManagerDummy.h @@ -0,0 +1,61 @@ +/* + * UpdateManagerDummy.h + * + * Dummy handling for not correct started or unknown debugger + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IUpdateManager.h" +#include "VersionInfo.h" + +namespace TI +{ + namespace DLL430 + { + class UpdateManagerDummy : public IUpdateManager + { + public: + UpdateManagerDummy (); + ~UpdateManagerDummy (); + + VersionInfo getHalVersion () const; + + bool isUpdateRequired(TARGET_ARCHITECTURE_t arch) const; + + bool firmWareUpdate(const char* fname, UpdateNotifyCallback, bool* coreUpdate); + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp b/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp new file mode 100644 index 0000000..aae9628 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp @@ -0,0 +1,1355 @@ +/* + * UpdateManagerFet.cpp + * + * Functionality for updating eZ-FET & MSP-FET debugger + * + * Copyright (C) 2007 - 2011 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. + */ + +#include + +#include +#include +#include + +#include "UpdateManagerFet.h" +#include "VersionInfo.h" +#include "FetHandle.h" +#include "FetHandleManager.h" +#include "ConfigManager.h" +#include "DeviceInfo.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "DeviceHandleMSP430.h" +#include "HidUpdateManager.h" + +#include "Record.h" +#include "MemoryContent.h" +#include "FileReader.h" + +#include "../../../../Bios/include/eZ_FetDcdc.h" +#include "../../../../Bios/include/eZ_FetHal.h" +#include "../../../../Bios/include/eZ_FetHil.h" +#include "../../../../Bios/include/eZ_FetCore.h" +#include "../../../../Bios/include/eZ_FetComChannel.h" +#include "../../../../Bios/include/eZ_FetDcdcController.h" +#include "../../../../Bios/include/eZ_FetDcdcControllerV2x.h" + + +#include "../../../../Bios/include/MSP_FetDcdc.h" +#include "../../../../Bios/include/MSP_FetHal.h" +#include "../../../../Bios/include/MSP_FetHil.h" +#include "../../../../Bios/include/MSP_FetCore.h" +#include "../../../../Bios/include/MSP_FetComChannel.h" +#include "../../../../Bios/include/MSP_FetDcdcController.h" +#include "../../../../Bios/include/MSP_FetDcdcControllerV2x.h" + +//Removed due to license limitations +//#define FPGA_UPDATE + +#ifdef FPGA_UPDATE +#include "../../../../Bios/include/MSP_FetFpgaHal.h" +#endif + +#include "../../../../Bios/include/ConfigureParameters.h" + +using namespace TI::DLL430; +using namespace std; + + +static string UpdateLog; + +UpdateManagerFet::UpdateManagerFet(FetHandle* fetHandle, ConfigManager* configManagerV3, FetHandleManager* fhManager) + : fetHandle(fetHandle) + , configManagerV3(configManagerV3) + , fetHandleManager(fhManager) + , requiredUpdates(0) + , percent(0) + , intCallback(nullptr) +{ +} + + +bool UpdateManagerFet::updateCore(MemoryContent &firmware) +{ + double requiredCoreUpdates = 4.0 + firmware.segments.size(); + double percentCore = 100.0 / requiredCoreUpdates; + + try + { + int currentPid = 0; + string currentDevice; + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + currentPid = MSPBSL_MSP_FET_USB_PID; + currentDevice = "MSP430F6638"; + } + else + { + currentPid = MSPBSL_EZ_FET_USB_PID; + currentDevice = "MSP430F5528"; + } + + UpdateLog.append("----TRACE---------------eZ_FET start BSL update------------------------------;\n"); + + // erase reset vector of core + upCoreErase(); + + if (intCallback) + { + --requiredCoreUpdates; + intCallback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)(100 - (requiredCoreUpdates)*percentCore), 0); + } + + this_thread::sleep_for(chrono::seconds(4)); + + fetHandle->shutdown(); + + if (intCallback) + { + --requiredCoreUpdates; + intCallback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)(100 - (requiredCoreUpdates)*percentCore), 0); + } + + uint32_t countedHidDevices = 0, timeout = 50; + do + { + this_thread::sleep_for(chrono::seconds(1)); + countedHidDevices = HidUpdateManager::countHidDevices(currentPid); + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)(100 - (requiredCoreUpdates)*percentCore), 0); + } + } + while (!countedHidDevices && timeout--); + + if (!countedHidDevices) + { + UpdateLog.append("----TRACE--- Did not find any HIDs\n"); + } + + if (intCallback) + { + --requiredCoreUpdates; + intCallback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)(100 - (requiredCoreUpdates)*percentCore), 0); + } + + UpdateLog.append("----TRACE----fetHandle->shutdown()\n"); + unique_ptr eZ_FET(dynamic_cast(MSPBSL_Factory::getMSPBSL_Connection("DEVICE:" + currentDevice + " VID:0x2047 PID:0x"+ convertPid(currentPid) +""))); + + if (eZ_FET.get() == nullptr) + { + UpdateLog.append("----TRACE----MSPBSL_Factory::getMSPBSL_Connection()\n"); + return false; + } + + UpdateLog.append("----TRACE----unique_ptr eZ_FET\n"); + + if (eZ_FET->loadRAM_BSL(currentPid) != 0) + { + //Reset FET + eZ_FET->closeBslconnection(); + UpdateLog.append("----TRACE----eZ_FET->loadRAM_BSL() != 0 \n"); + return false; + } + + string verString = ""; + eZ_FET->TX_BSL_Version(verString); + UpdateLog.append("----TRACE----eZ_FET->TX_BSL_Version(verString);\n"); + + eZ_FET->massErase(); + UpdateLog.append("----TRACE----eZ_FET->massErase();\n"); + + if (firmware.segments.empty()) + { + UpdateLog.append("----TRACE----firmware.segments.empty()\n"); + return false; + } + + for (size_t i = 0; i < firmware.segments.size(); i++) + { + const DataSegment& seg = firmware.segments[i]; + + vector Buffer(seg.data.size()); + + MSPBSL_CRCEngine crcEngine("5xx_CRC"); + crcEngine.initEngine(0xFFFF); + + for (uint32_t n=0; n < seg.data.size(); n++) + { + Buffer[n]= (seg.data[n] & 0xff); + crcEngine.addByte(seg.data[n] & 0xff); + } + + eZ_FET->RX_DataBlockFast(&Buffer[0], (uint32_t)seg.startAddress&0xfffffffe, (uint16_t)seg.data.size()); + + uint16_t currentCoreCRC[1] = {0}; + eZ_FET->CRC_Check(currentCoreCRC, (uint32_t)seg.startAddress & 0xfffffffe, static_cast(seg.data.size())); + + uint32_t expectedCoreCRC = static_cast(crcEngine.getHighByte()) << 8; + expectedCoreCRC |= (static_cast (crcEngine.getLowByte()) & 0x0000FFFF); + + if (expectedCoreCRC != currentCoreCRC[0]) + { + if (i != 0)// just debug exeption + { + eZ_FET->closeBslconnection(); + UpdateLog.append("----TRACE----eZ_FET end BSL update faild\n"); + return false; + } + } + if (intCallback) + { + --requiredCoreUpdates; + intCallback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)(100 - (requiredCoreUpdates)*percentCore), 0); + } + } + UpdateLog.append("----TRACE---------------eZ_FET end BSL update------------------------------;\n"); + eZ_FET->closeBslconnection(); + } + catch (...) + { + UpdateLog.append("----TRACE----eZ_FET end BSL update failed\n"); + return false; + } + + if (intCallback) + { + --requiredCoreUpdates; + intCallback(BL_DATA_BLOCK_PROGRAMMED, (uint32_t)(100 - (requiredCoreUpdates)*percentCore), 0); + } + return true; +} + + +bool UpdateManagerFet::isUpdateRequired(TARGET_ARCHITECTURE_t arch) const +{ + bool isUpdateRequired = false; + if (checkHalVersion() != 0) + { + isUpdateRequired = true; + } + if (checkCoreVersion() != 0) + { + isUpdateRequired = true; + } + if (checkDcdcLayerVersion() != 0) + { + isUpdateRequired = true; + } + if (checkDcdcSubMcuVersion() != 0) + { + isUpdateRequired = true; + } + if (checkHilVersion() != 0) + { + isUpdateRequired = true; + } + if (checkFpgaVersion() != 0) + { + isUpdateRequired = true; + } + if (checkUartVersion() != 0) + { + isUpdateRequired = true; + } + return isUpdateRequired; +} + + +uint16_t UpdateManagerFet::checkHilVersion() const +{ + //get current hil version from FET + const uint16_t currentHilVersion = fetHandle->getControl()->getHilVersion(); + //get hil CRC from FET + const uint16_t currentHilCrc = fetHandle->getControl()->getFetHilCrc(); + + uint16_t expectedHilVersion = 0; + uint16_t expectedHilCrc = 0; + + Record *image = 0; + uint16_t retVal = 0; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetHilImage, MSP_FetHilImage_address, MSP_FetHilImage_length_of_sections, MSP_FetHilImage_sections); + } + else + { + image = new Record(eZ_FetHilImage, eZ_FetHilImage_address, eZ_FetHilImage_length_of_sections, eZ_FetHilImage_sections); + } + + //if hil versions or CRC's do not match, update hil + if (image && image->getWordAtAdr(0x18F6, &expectedHilVersion) && image->getWordAtAdr(0x18FA, &expectedHilCrc)) + { + if ((expectedHilVersion != currentHilVersion) || (expectedHilCrc != currentHilCrc)) + { + retVal = 1; + } + } + + delete image; + + return retVal; +} + +uint16_t UpdateManagerFet::checkUartVersion() const +{ + uint16_t retVal = 0; + + const uint16_t currentUartVersion = fetHandle->getControl()->getFetComChannelVersion(); + const uint16_t currentFetComChannelCrc= fetHandle->getControl()->getFetComChannelCrc(); + + uint16_t expectedUartVersion = 0; + uint16_t expectedFetComChannelCRC = 0; + + Record *image = 0; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetComChannelImage, MSP_FetComChannelImage_address, MSP_FetComChannelImage_length_of_sections, MSP_FetComChannelImage_sections); + } + else + { + image = new Record(eZ_FetComChannelImage, eZ_FetComChannelImage_address, eZ_FetComChannelImage_length_of_sections, eZ_FetComChannelImage_sections); + } + + if (image && image->getWordAtAdr(0x1984, &expectedUartVersion) && image->getWordAtAdr(0x19FA, &expectedFetComChannelCRC)) + { + if ((expectedUartVersion != currentUartVersion) || (expectedFetComChannelCRC != currentFetComChannelCrc)) + { + retVal = 1; + } + } + + delete image; + + return retVal; +} + +uint16_t UpdateManagerFet::checkFpgaVersion() const +{ + uint16_t retVal = 0; + +#ifdef FPGA_UPDATE + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + const uint16_t currentFpgaVersion = fetHandle->getControl()->getFetFpgaVersion(); + uint16_t expectedFpgaVersion; + + Record fpgaVersion(MSP_FetFpgaHalImage, MSP_FetFpgaHalImage_address, MSP_FetFpgaHalImage_length_of_sections, MSP_FetFpgaHalImage_sections); + + if (fpgaVersion.getWordAtAdr(0x1978, &expectedFpgaVersion)) + { + if (expectedFpgaVersion > currentFpgaVersion) + { + retVal = 1; + } + } + } +#endif + + return retVal; +} + +uint16_t UpdateManagerFet::checkDcdcLayerVersion() const +{ + //get current dcdc layer version from FET + const uint32_t currentDcdcLayerVersion = fetHandle->getControl()->getDcdcLayerVersion(); + //get dcdc layer CRC from FET + const uint16_t currentDcdcCrc= fetHandle->getControl()->getFetDcdcCrc(); + + uint16_t expectedDcdcCrc = 0; + uint16_t expectedDcdcLayerVersion = 0; + + Record *image = 0; + uint16_t retVal = 0; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetDcdcImage, MSP_FetDcdcImage_address, MSP_FetDcdcImage_length_of_sections, MSP_FetDcdcImage_sections); + } + else + { + image = new Record(eZ_FetDcdcImage, eZ_FetDcdcImage_address, eZ_FetDcdcImage_length_of_sections, eZ_FetDcdcImage_sections); + } + + //if hil versions or CRC's do not match, update hil + if (image && image->getWordAtAdr(0x1804, &expectedDcdcLayerVersion) && image->getWordAtAdr(0x187A, &expectedDcdcCrc)) + { + if ((expectedDcdcLayerVersion != currentDcdcLayerVersion) || (expectedDcdcCrc != currentDcdcCrc)) + { + retVal = 1; + } + } + + delete image; + + return retVal; +} + +uint16_t UpdateManagerFet::checkDcdcSubMcuVersion() const +{ + const uint32_t currentDcdcSubMcuVersion = fetHandle->getControl()->getDcdcSubMcuVersion(); + uint16_t expectedDcdcSubMcuVersion = 0; + + Record *image = 0; + uint16_t retVal = 0; + + if (fetHandle->getControl()->getFetToolId() == eZ_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_NO_FLOWCT) + { + image = new Record(eZ_FetDcdcControllerImage, eZ_FetDcdcControllerImage_address, eZ_FetDcdcControllerImage_length_of_sections, eZ_FetDcdcControllerImage_sections); + } + else if (fetHandle->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + image = new Record(eZ_FetDcdcControllerV2xImage, eZ_FetDcdcControllerV2xImage_address, eZ_FetDcdcControllerV2xImage_length_of_sections, eZ_FetDcdcControllerV2xImage_sections); + } + else if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC) + { + image = new Record(MSP_FetDcdcControllerImage, MSP_FetDcdcControllerImage_address, MSP_FetDcdcControllerImage_length_of_sections, MSP_FetDcdcControllerImage_sections); + } + else if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetDcdcControllerV2xImage, MSP_FetDcdcControllerV2xImage_address, MSP_FetDcdcControllerV2xImage_length_of_sections, MSP_FetDcdcControllerV2xImage_sections); + } + + if (image && image->getWordAtAdr(0x1000, &expectedDcdcSubMcuVersion)) + { + //if dcdc sub-mcu versions do not match, update sub-mcu + if (currentDcdcSubMcuVersion != expectedDcdcSubMcuVersion) + { + retVal = 1; + } + } + + delete image; + + return retVal; +} + +uint16_t UpdateManagerFet::checkHalVersion() const +{ + //get hal CRC from FET + const uint16_t currentHalCrc = fetHandle->getControl()->getFetHalCrc(); + uint16_t expectedHalCrc = 0; + + Record *image; + uint16_t retVal = 0; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetHalImage, MSP_FetHalImage_address, MSP_FetHalImage_length_of_sections, MSP_FetHalImage_sections); + } + else + { + image = new Record(eZ_FetHalImage, eZ_FetHalImage_address, eZ_FetHalImage_length_of_sections, eZ_FetHalImage_sections); + } + + if (image->getWordAtAdr(0x197A, &expectedHalCrc)) + { + if (expectedHalCrc != currentHalCrc) + { + retVal = 1; + } + } + + delete image; + + return retVal; +} + + +uint16_t UpdateManagerFet::checkCoreVersion() const +{ + //get current core version from FET + const uint16_t actualFetCoreVersion = fetHandle->getControl()->getFetCoreVersion(); + //get core CRC from FET + const uint16_t currentCoreCrc= fetHandle->getControl()->getFetCoreCrc(); + + uint16_t expectedFetCoreVersion = 0; + uint16_t expectedCoreCrc = 0; + + uint16_t versionLocation = 0; + uint16_t crcLocation = 0; + + Record *image; + uint16_t retVal = 0; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetCoreImage, MSP_FetCoreImage_address, MSP_FetCoreImage_length_of_sections, MSP_FetCoreImage_sections); + versionLocation = 0x8004; + crcLocation = 0x8002; + } + else + { + image = new Record(eZ_FetCoreImage, eZ_FetCoreImage_address, eZ_FetCoreImage_length_of_sections, eZ_FetCoreImage_sections); + versionLocation = 0x4404; + crcLocation = 0x4402; + } + + if (image->getWordAtAdr(versionLocation, &expectedFetCoreVersion) && image->getWordAtAdr(crcLocation, &expectedCoreCrc)) + { + //if core versions or CRC's do not match, update core + if ((expectedFetCoreVersion != actualFetCoreVersion) || (currentCoreCrc != expectedCoreCrc)) + { + retVal = 1; + } + } + + delete image; + + return retVal; +} + +VersionInfo UpdateManagerFet::getHalVersion() const +{ + const std::vector* sw_info = this->fetHandle->getSwVersion(); + const uint16_t currentHalCrc = fetHandle->getControl()->getFetHalCrc(); + uint16_t expectedHalCrc = 0; + + Record *image; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + image = new Record(MSP_FetHalImage, MSP_FetHalImage_address, MSP_FetHalImage_length_of_sections, MSP_FetHalImage_sections); + } + else + { + image = new Record(eZ_FetHalImage, eZ_FetHalImage_address, eZ_FetHalImage_length_of_sections, eZ_FetHalImage_sections); + } + + if (image->getWordAtAdr(0x197A, &expectedHalCrc)) + { + if (expectedHalCrc != currentHalCrc) + { + delete image; + return VersionInfo(1, 0, 0, 0); + } + } + + delete image; + + if (sw_info==nullptr) + { + return VersionInfo(0, 0, 0, 0); + } + if (sw_info->size()<4) + { + return VersionInfo(0, 0, 0, 0); + } + + unsigned char major = sw_info->at(1); + + return VersionInfo((((major&0xC0)>>6)+1), (major&0x3f), sw_info->at(0), + (sw_info->at(3)<<8)+sw_info->at(2)); +} + +bool UpdateManagerFet::updateHal() +{ + bool returnValue = false; + MemoryContent firmware; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetHalImage, MSP_FetHalImage_address, MSP_FetHalImage_length_of_sections, MSP_FetHalImage_sections); + } + else + { + firmware.fromSRec(eZ_FetHalImage, eZ_FetHalImage_address, eZ_FetHalImage_length_of_sections, eZ_FetHalImage_sections); + } + returnValue = updateFirmware(firmware); + if (!returnValue) + { + UpdateLog.append("----TRACE----HalLayer update failed\n"); + } + + return returnValue; +} + +bool UpdateManagerFet::updateHil() +{ + bool returnValue = false; + MemoryContent firmware; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetHilImage, MSP_FetHilImage_address, MSP_FetHilImage_length_of_sections, MSP_FetHilImage_sections); + } + else + { + firmware.fromSRec(eZ_FetHilImage, eZ_FetHilImage_address, eZ_FetHilImage_length_of_sections, eZ_FetHilImage_sections); + } + + returnValue = updateFirmware(firmware); + if (!returnValue) + { + UpdateLog.append("----TRACE----HilLayer update failed\n"); + } + + return returnValue; +} + +bool UpdateManagerFet::updateFpga() +{ + bool returnValue = true; + MemoryContent firmware; +#ifdef FPGA_UPDATE + + firmware.fromSRec(MSP_FetFpgaHalImage, MSP_FetFpgaHalImage_address, MSP_FetFpgaHalImage_length_of_sections, MSP_FetFpgaHalImage_sections); + + if (firmware.segments.empty()) + { + return false; + } + + this->upInit(1); + + if (returnValue && !this->upErase(firmware)) + { + returnValue = false; + } + if (returnValue && !this->upWrite(firmware)) + { + returnValue = false; + } + + // Start the FPGA update + this->upInit(3); + + this_thread::sleep_for(chrono::seconds(1)); + + // Restore the normal HAL module + if (returnValue && !updateHal()) + { + returnValue = false; + } + + if (!returnValue) + { + UpdateLog.append("----TRACE----FPGA update failed\n"); + } +#endif + return returnValue; +} + +bool UpdateManagerFet::updateDcdcLayer() +{ + bool returnValue = false; + MemoryContent firmware; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetDcdcImage, MSP_FetDcdcImage_address, MSP_FetDcdcImage_length_of_sections, MSP_FetDcdcImage_sections); + } + else + { + firmware.fromSRec(eZ_FetDcdcImage, eZ_FetDcdcImage_address, eZ_FetDcdcImage_length_of_sections, eZ_FetDcdcImage_sections); + } + returnValue = updateFirmware(firmware); + if (!returnValue) + { + UpdateLog.append("----TRACE----DcdcLayer update failed \n"); + } + + return returnValue; +} + +bool UpdateManagerFet::updateSubMcu() +{ + bool returnValue = true; + MemoryContent firmware; + + IDeviceHandleManager* dhm = this->fetHandle->getDeviceHandleManager(); + + // Now programm the Sub MCU + this->upInit(2); + + //----------------------------------------- + configManagerV3->setJtagMode(SPYBIWIRE_DCDC); + if (!configManagerV3->start()) + { + UpdateLog.append("----TRACE---- configManagerV3->start() \n"); + } + + // save the device handle to work with + IDeviceHandle* singleDevice = dhm->createDeviceHandle(0, SPYBIWIRE_IF); + + if (singleDevice == nullptr) + { + configManagerV3->stop(); + UpdateLog.append("----TRACE---- singleDevice==NULL \n"); + return false; + } + + if (singleDevice->getJtagId() != 0x89) + { + returnValue = false; + UpdateLog.append("----TRACE---- singleDevice->getJtagId() != 0x89 \n"); + } + + if (returnValue) + { + const long setId = singleDevice->identifyDevice(0, false); + if (setId == -5555) + { + returnValue = false; + UpdateLog.append("----TRACE---- Fuse Blown\n"); + } + else if (setId < 0) + { + returnValue = false; + UpdateLog.append("----TRACE----No device detected\n"); + } + } + + if (returnValue) + { + returnValue = this->programmSubMcu(singleDevice); + if (!returnValue) + { + UpdateLog.append("----TRACE----programm the Sub MCU update failed \n"); + } + + this->upInit(0); + + if (!configManagerV3->stop()) + { + UpdateLog.append("----TRACE----Stop JTAG done failed \n"); + } + } + + + // destroy device handle + dhm->destroyDeviceHandle(singleDevice); + + return returnValue; +} + +bool UpdateManagerFet::updateComChannel() +{ + MemoryContent firmware; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetComChannelImage, MSP_FetComChannelImage_address, MSP_FetComChannelImage_length_of_sections, MSP_FetComChannelImage_sections); + } + else + { + firmware.fromSRec(eZ_FetComChannelImage, eZ_FetComChannelImage_address, eZ_FetComChannelImage_length_of_sections, eZ_FetComChannelImage_sections); + } + + bool returnValue = updateFirmware(firmware); + if (!returnValue) + { + UpdateLog.append("----TRACE----Uart Layer update failed \n"); + } + + return returnValue; +} + +bool UpdateManagerFet::firmWareUpdate(const char* fname, UpdateNotifyCallback callback, bool* coreUpdate) +{ + FetControl* control = this->fetHandle->getControl(); + intCallback = nullptr; + if (control == nullptr) + { + return false; + } + if (callback) + { + intCallback = callback; + } + bool returnValue = true; + + UpdateLog.clear(); + UpdateLog.append("\n\n\n ------------------------Start Firmware update--------------------------- \n"); + + if (intCallback) + { + intCallback(BL_INIT, 0, 0); + intCallback(BL_PROGRAM_FIRMWARE, 0, 0); + } + + if (checkCoreVersion() != 0) + { + *coreUpdate = true; + MemoryContent firmware; + if (control->getFetToolId() == MSP_FET_WITH_DCDC || control->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetCoreImage, MSP_FetCoreImage_address, MSP_FetCoreImage_length_of_sections, MSP_FetCoreImage_sections); + } + else + { + firmware.fromSRec(eZ_FetCoreImage, eZ_FetCoreImage_address, eZ_FetCoreImage_length_of_sections, eZ_FetCoreImage_sections); + } + UpdateLog.append("----TRACE----call updateCore(firmware)\n"); + bool retval = updateCore(firmware); + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100, 0); + } + + if (!retval) + { +#if defined(_WIN32) || defined(_WIN64) + char binaryPath[256] = { 0 }; + uint32_t pathLength = 0; + + pathLength = GetModuleFileName(0, binaryPath, sizeof(binaryPath)); + while (pathLength > 0 && binaryPath[pathLength - 1] != '\\') + { + --pathLength; + } + string logfile = string(binaryPath, pathLength) + "Update.log"; +#else + string logfile = "Update.log"; +#endif + UpdateLog.append("\n---------------------Firmware upate end--------------------------\n"); + + ofstream(logfile.c_str(), ios::app | ios::out) << UpdateLog; + } + + return retval; + } + + // just for core update test do not call during normal debug + if (fname && string(fname).find("CORE_RST_VECTOR_ERASE") != string::npos) + { + upCoreErase(); + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100, 0); + intCallback(BL_UPDATE_DONE, 0, 0); + intCallback(BL_EXIT, 0, 0); + } + UpdateLog.append("----TRACE----CORE_RST_VECTOR_ERASE done\n"); + return true; + } + else if (fname) + { + MemoryContent firmware; + try + { + FileReader::create(fname)->read(&firmware); + } + catch (const std::runtime_error&) + { + UpdateLog.append("----TRACE--- firmware.readFirmware(fname)failed\n"); + return false; + } + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 0, 0); + } + returnValue = updateFirmware(firmware); + if (!returnValue) + { + UpdateLog.append("----TRACE--- returnValue = updateFirmware(firmware) failed\n"); + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100, 0); + intCallback(BL_UPDATE_DONE, 0, 0); + intCallback(BL_EXIT, 0, 0); + } + } + else + { + requiredUpdates = 1; + requiredUpdates += numStepsHalFirmware(); + requiredUpdates += numStepsHilFirmware(); + requiredUpdates += numStepsFpgaFirmware(); + requiredUpdates += numStepsDcdcLayerFirmware(); + requiredUpdates += numStepsSubMcuLayerFirmware(); + requiredUpdates += numStepsComChannelFirmware(); + + percent = 100 / requiredUpdates; + this->upInit(4);// stop vcc supervision + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(requiredUpdates)*percent, 0); + } + //--------------------------------------HalUpdate----------------------------------------------------- + if (isHalUpdateRequired()) + { + returnValue = updateHal(); control->resetCommunication(); + } + else + { + requiredUpdates -= numStepsHalFirmware(); + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(requiredUpdates)*percent, 0); + } + //--------------------------------------HilUpdate----------------------------------------------------- + if (returnValue && isHilUpdateRequired()) + { + returnValue = updateHil(); + + control->resetCommunication(); + } + else + { + requiredUpdates -= numStepsHilFirmware(); + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(requiredUpdates)*percent, 0); + } + + //--------------------------------------FpgaUpdate----------------------------------------------------- + if (returnValue && isFpgaUpdateRequired()) + { + returnValue = updateFpga(); + + control->resetCommunication(); + } + else + { + requiredUpdates -= numStepsFpgaFirmware(); + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, (100-(requiredUpdates)*percent), 0); + } + + //--------------------------------------DcdcLayerUpdate----------------------------------------------------- + if (returnValue && isDcdcLayerUpdateRequired()) + { + returnValue = updateDcdcLayer(); + + control->resetCommunication(); + } + else + { + requiredUpdates -= numStepsDcdcLayerFirmware(); + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(requiredUpdates)*percent, 0); + } + + //--------------------------------------SubMcuUpdate----------------------------------------------------- + if (returnValue && isSubMcuLayerUpdateRequired()) + { + returnValue = updateSubMcu(); + + control->resetCommunication(); + } + else + { + requiredUpdates -= numStepsSubMcuLayerFirmware(); + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(requiredUpdates)*percent, 0); + } + + //--------------------------------------ComChannelUpdate----------------------------------------------------- + if (returnValue && isComChannelUpdateRequired()) + { + returnValue = updateComChannel(); + + control->resetCommunication(); + } + this->upInit(5);// start vcc supervision + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100, 0); + intCallback(BL_UPDATE_DONE, 0, 0); + intCallback(BL_EXIT, 0, 0); + } + } + + + if (!returnValue) + { +#if defined(_WIN32) || defined(_WIN64) + char binaryPath[256] = { 0 }; + uint32_t pathLength = 0; + + pathLength = GetModuleFileName(0, binaryPath, sizeof(binaryPath)); + while (pathLength > 0 && binaryPath[pathLength - 1] != '\\') + { + --pathLength; + } + string logfile = string(binaryPath, pathLength) + "Update.log"; +#else + string logfile = "Update.log"; +#endif + UpdateLog.append("\n---------------------Firmware upate end--------------------------\n"); + + ofstream(logfile.c_str(), ios::app | ios::out) << UpdateLog; + } + return returnValue; +} + +bool UpdateManagerFet::programmSubMcu(IDeviceHandle * singleDevice) +{ + MemoryContent firmware; + + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC) + { + firmware.fromSRec(MSP_FetDcdcControllerImage, MSP_FetDcdcControllerImage_address, MSP_FetDcdcControllerImage_length_of_sections, MSP_FetDcdcControllerImage_sections); + } + else if ( fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(MSP_FetDcdcControllerV2xImage, MSP_FetDcdcControllerV2xImage_address, MSP_FetDcdcControllerV2xImage_length_of_sections, MSP_FetDcdcControllerV2xImage_sections); + } + else if (fetHandle->getControl()->getFetToolId() == eZ_FET_WITH_DCDC_V2x) + { + firmware.fromSRec(eZ_FetDcdcControllerV2xImage, eZ_FetDcdcControllerV2xImage_address, eZ_FetDcdcControllerV2xImage_length_of_sections, eZ_FetDcdcControllerV2xImage_sections); + } + else + { + firmware.fromSRec(eZ_FetDcdcControllerImage, eZ_FetDcdcControllerImage_address, eZ_FetDcdcControllerImage_length_of_sections, eZ_FetDcdcControllerImage_sections); + } + + if (firmware.segments.empty()) + { + return false; + } + if (!singleDevice) + { + UpdateLog.append("----TRACE---- SUB mcu !singleDevice\n"); + return false; + } + IMemoryManager* mm = singleDevice->getMemoryManager(); + + if (!mm) + { + UpdateLog.append("----TRACE---- SUB mcu !mm\n"); + return false; + } + MemoryArea* main = mm->getMemoryArea(MemoryArea::Main); + + singleDevice->reset(); + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(requiredUpdates)*percent, 0); + } + + //erase sub MCU. + bool eraseSubMcuMain = main->erase(); + if (!eraseSubMcuMain) + { + UpdateLog.append("----TRACE---- SUB mcu !eraseSubMcuMain\n"); + return false; + } + + MemoryArea* info = mm->getMemoryArea(MemoryArea::Info); + singleDevice->reset(); + + //erase sub MCU. + bool eraseSubMcuinfo = info->erase(); + if (!eraseSubMcuinfo) + { + UpdateLog.append("----TRACE---- SUB mcu !eraseSubMcuinfo\n"); + return false; + } + + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(--requiredUpdates)*percent, 0); + } + + singleDevice->reset(); + + bool writeSubMcu = true; + for (DataSegment& segment : firmware.segments) + { + if (!mm->write(segment.startAddress, segment.data.data(), segment.data.size()) || !mm->sync()) + { + UpdateLog.append("----TRACE---- SUB mcu !writeSubMcu\n"); + writeSubMcu = false; + break; + } + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100 - (--requiredUpdates)*percent, 0); + } + } + return writeSubMcu; +} + +bool UpdateManagerFet::updateFirmware(const MemoryContent &firmware) +{ + if (firmware.segments.empty()) + { + return false; + } + // start HAL update routine + this->upInit(1); + + if (!this->upErase(firmware)) + { + return false; + } + if (!this->upWrite(firmware)) + { + return false; + } + this->upInit(0); + + // give the firmware time to execute initialisation + this_thread::sleep_for(chrono::seconds(1)); + return true; +} + +void UpdateManagerFet::upInit(unsigned char level) +{ + HalExecCommand updateCmd; + updateCmd.setTimeout(10000); + HalExecElement* el = new HalExecElement(ID_Zero, UpInit); + el->setAddrFlag(false); + el->appendInputData8(level); + + updateCmd.elements.emplace_back(el); + this->fetHandle->send(updateCmd); +} + +bool UpdateManagerFet::upErase(const MemoryContent& firmware) +{ + for (size_t i = 0; i < firmware.segments.size(); ++i) + { + const DataSegment& seg = firmware.segments[i]; + + HalExecElement* el = new HalExecElement(ID_Zero, UpErase); + el->setAddrFlag(false); + + el->appendInputData32(seg.startAddress & 0xfffffffe); + el->appendInputData32(static_cast(seg.data.size())); + + HalExecCommand updateCmd; + updateCmd.setTimeout(40000); + updateCmd.elements.emplace_back(el); + if (this->fetHandle->send(updateCmd)==false) + { + return false; + } + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(--requiredUpdates)*percent, 0); + } + } + return true; +} + +bool UpdateManagerFet::upWrite(const MemoryContent& firmware) +{ + for (size_t i = firmware.segments.size(); i > 0; i--) + { + const DataSegment& seg = firmware.segments[i-1]; + + // create Core telegram -> update write + HalExecElement* el = new HalExecElement(ID_Zero, UpWrite); + // no HAL id needed for update + el->setAddrFlag(false); + + const uint32_t padding = seg.data.size() % 2; + const uint32_t data2send = static_cast(seg.data.size()) + padding; + + // add address data + el->appendInputData32(seg.startAddress&0xfffffffe); + el->appendInputData32(data2send); + + // add update data + for (size_t n = 0; n < seg.data.size(); n++) + { + el->appendInputData8(seg.data[n] & 0xff); + } + for (uint32_t p = 0; p < padding; p++) + { + el->appendInputData8(0xff); + } + + HalExecCommand updateCmd; + updateCmd.setTimeout(45000); + updateCmd.elements.emplace_back(el); + if (this->fetHandle->send(updateCmd)==false) + { + return false; + } + if (intCallback) + { + intCallback(BL_DATA_BLOCK_PROGRAMMED, 100-(--requiredUpdates)*percent, 0); + } + } + return true; +} + +bool UpdateManagerFet::upCoreErase() +{ + FetControl * control=this->fetHandle->getControl(); + // create 0x55 command erase signature + // command forces safecore to search for new core on reset + std::vector data_55; + data_55.push_back(0x03); + data_55.push_back(0x55); + uint8_t id = control->createResponseId(); + data_55.push_back(id); + data_55.push_back(0x00); + + control->sendData(data_55); + control->clearResponse(); + return true; +} + +bool UpdateManagerFet::upCoreWrite() +{ + return true; +} + +//reads back flashed core data and compares it to data in core image +//returns: true, if data on FET and core image are equal +bool UpdateManagerFet::upCoreRead() +{ + return true; +} + +bool UpdateManagerFet::isHalUpdateRequired() +{ + return (getHalVersion().get() == 10000000); +} + +bool UpdateManagerFet::isHilUpdateRequired() +{ + return (checkHilVersion() != 0); +} + +bool UpdateManagerFet::isFpgaUpdateRequired() +{ + return (checkFpgaVersion() != 0); +} + +bool UpdateManagerFet::isDcdcLayerUpdateRequired() +{ + return (checkDcdcLayerVersion() != 0); +} + +bool UpdateManagerFet::isSubMcuLayerUpdateRequired() +{ + return (checkDcdcSubMcuVersion() != 0); +} + +bool UpdateManagerFet::isComChannelUpdateRequired() +{ + return (checkUartVersion() != 0); +} + +uint32_t UpdateManagerFet::numStepsHalFirmware() +{ + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + return MSP_FetHalImage_sections * 2; + } + else + { + return eZ_FetHalImage_sections * 2; + } +} + +uint32_t UpdateManagerFet::numStepsHilFirmware() +{ + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + return MSP_FetHilImage_sections * 2; + } + else + { + return eZ_FetHilImage_sections * 2; + } +} + +uint32_t UpdateManagerFet::numStepsFpgaFirmware() +{ +#ifdef FPGA_UPDATE + return MSP_FetFpgaHalImage_sections * 2; +#else + return 1; +#endif +} + +uint32_t UpdateManagerFet::numStepsDcdcLayerFirmware() +{ + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + return MSP_FetDcdcImage_sections * 2; + } + else + { + return eZ_FetDcdcImage_sections * 2; + } +} + +uint32_t UpdateManagerFet::numStepsSubMcuLayerFirmware() +{ + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC) + { + return MSP_FetDcdcControllerImage_sections + 1; + } + else if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + return MSP_FetDcdcControllerV2xImage_sections + 1; + } + else + { + return eZ_FetDcdcControllerImage_sections + 1; + } +} + +uint32_t UpdateManagerFet::numStepsComChannelFirmware() +{ + if (fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC || fetHandle->getControl()->getFetToolId() == MSP_FET_WITH_DCDC_V2x) + { + return MSP_FetComChannelImage_sections * 2; + } + else + { + return eZ_FetComChannelImage_sections * 2; + } +} + +/*EOF*/ diff --git a/DLL430_v3/src/TI/DLL430/UpdateManagerFet.h b/DLL430_v3/src/TI/DLL430/UpdateManagerFet.h new file mode 100644 index 0000000..5a6a93d --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/UpdateManagerFet.h @@ -0,0 +1,110 @@ +/* + * UpdateManagerFet.h + * + * Functionality for updating eZ-FET & MSP-FET debugger + * + * Copyright (C) 2007 - 2011 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. + */ + +#pragma once + +#include "IUpdateManager.h" + +namespace TI +{ + namespace DLL430 + { + class FetHandle; + class IDeviceHandle; + class FetHandleManager; + class ConfigManager; + class MemoryContent; + + class UpdateManagerFet : public IUpdateManager + { + public: + UpdateManagerFet(FetHandle*, ConfigManager*, FetHandleManager*); + + VersionInfo getHalVersion() const; + + bool isUpdateRequired(TARGET_ARCHITECTURE_t arch) const; + + bool firmWareUpdate(const char* fname, UpdateNotifyCallback callback, bool* coreUpdate); + + private: + uint16_t checkHilVersion() const; + uint16_t checkDcdcLayerVersion() const; + uint16_t checkDcdcSubMcuVersion() const; + uint16_t checkCoreVersion() const; + uint16_t checkUartVersion() const; + uint16_t checkFpgaVersion() const; + + bool updateFirmware(const MemoryContent &firmware); + bool programmSubMcu(IDeviceHandle* singleDevice); + + FetHandle* fetHandle; + ConfigManager* configManagerV3; + FetHandleManager* fetHandleManager; + + void upInit(unsigned char level); + bool upErase(const MemoryContent& firmware); + bool upWrite(const MemoryContent& firmware); + bool upCoreErase(); + bool upCoreWrite(); + bool upCoreRead(); + bool updateCore(MemoryContent &firmware); + bool updateHal(); + bool updateHil(); + bool updateFpga(); + bool updateDcdcLayer(); + bool updateSubMcu(); + bool updateComChannel(); + bool isHalUpdateRequired(); + bool isHilUpdateRequired(); + bool isFpgaUpdateRequired(); + bool isDcdcLayerUpdateRequired(); + bool isSubMcuLayerUpdateRequired(); + bool isComChannelUpdateRequired(); + uint32_t numStepsHalFirmware(); + uint32_t numStepsHilFirmware(); + uint32_t numStepsFpgaFirmware(); + uint32_t numStepsDcdcLayerFirmware(); + uint32_t numStepsSubMcuLayerFirmware(); + uint32_t numStepsComChannelFirmware(); + uint16_t checkHalVersion() const; + uint32_t requiredUpdates; + uint32_t percent; + UpdateNotifyCallback intCallback; + }; + + } +} diff --git a/DLL430_v3/src/TI/DLL430/UpdateManagerMSP_FET430.cpp b/DLL430_v3/src/TI/DLL430/UpdateManagerMSP_FET430.cpp new file mode 100644 index 0000000..d54e4ca --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/UpdateManagerMSP_FET430.cpp @@ -0,0 +1,540 @@ +/* + * UpdateManagerMSP_FET430.cpp + * + * Functionality for updating MSP-FET430UIF debugger + * + * Copyright (C) 2007 - 2011 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. + */ + +#include +#include + +#include "FetHandle.h" +#include "FetHandleManager.h" +#include "ConfigManager.h" +#include "UpdateManagerMSP_FET430.h" +#include "HalExecCommand.h" +#include "FetControl.h" +#include "WatchdogControl.h" +#include "Record.h" +#include "DeviceHandleMSP430.h" +#include "MemoryContent.h" +#include "FileReader.h" + +#include "../../../../Bios/include/UifHal.h" +#include "../../../../Bios/include/UifHalMsp430.h" +#include "../../../../Bios/include/UifBiosCore.h" +#include "../../../../Bios/include/ConfigureParameters.h" + +using namespace TI::DLL430; +using namespace std; + +const static uint32_t coreSignature = 0xFEDF2112; + + +UpdateManagerMSP_FET430::UpdateManagerMSP_FET430(FetHandle* fetHandle, ConfigManager* configManagerV3, TARGET_ARCHITECTURE_t arch) + : fetHandle(fetHandle), configManagerV3(configManagerV3), currentArch(arch), percent(0), requiredUpdates(0) +{ + updateCmd.setTimeout(20000); +} + +UpdateManagerMSP_FET430::~UpdateManagerMSP_FET430(){} + + +bool UpdateManagerMSP_FET430::isUpdateRequired(TARGET_ARCHITECTURE_t arch) const +{ + uint16_t expectedVersionmMajor = 0, expectedVersionmMinor =0; + Record fetHalImage(UifHalImage, UifHalImage_address, UifHalImage_length_of_sections, UifHalImage_sections); + + fetHalImage.getWordAtAdr(0x253C, &expectedVersionmMajor); + fetHalImage.getWordAtAdr(0x253E, &expectedVersionmMinor); + + std::vector sw_info; + + sw_info.push_back(expectedVersionmMajor&0xFF); + sw_info.push_back(expectedVersionmMajor>>8); + sw_info.push_back(expectedVersionmMinor&0xFF); + sw_info.push_back(expectedVersionmMinor>>8); + + unsigned char major=sw_info.at(1); + VersionInfo exptectedHallVersion((((major&0xC0)>>6)+1), (major&0x3f), sw_info.at(0), + (sw_info.at(3)<<8)+sw_info.at(2)); + + bool isUpdateRequired = false; + if (exptectedHallVersion.get() != (getHalVersion().get())) + { + isUpdateRequired = true; + } + if (checkCoreVersion() != 0) + { + isUpdateRequired = true; + } + //This is only a temporarry workaround to pervent the UIF to be updated for MSP432 support + if (TARGET_ARCHITECTURE_t::MSP430 != fetHandle->getControl()->getFetFpgaVersion()) + { + isUpdateRequired = true; + } + return isUpdateRequired; +} + + +uint16_t UpdateManagerMSP_FET430::checkCoreVersion() const +{ + FetControl * control=this->fetHandle->getControl(); + + //get current core version from FET + const uint16_t actualFetCoreVersion = control->getFetCoreVersion(); + uint16_t expectedFetCoreVersion = 0; + + Record fetCoreImage(UifBiosCoreImage, UifBiosCoreImage_address, UifBiosCoreImage_length_of_sections, UifBiosCoreImage_sections); + //get core version from image (core version is stored in address 0x4400) + if (fetCoreImage.getWordAtAdr(0xFDD8, &expectedFetCoreVersion)) + { + //if core versions do not match, update core + if (expectedFetCoreVersion != actualFetCoreVersion) + { + return 1; + } + } + return 0; +} + +VersionInfo UpdateManagerMSP_FET430::getHalVersion() const +{ + const std::vector* sw_info = this->fetHandle->getSwVersion(); + if (sw_info == nullptr) + { + return VersionInfo(0, 0, 0, 0); + } + + if (sw_info->size() < 4) + { + return VersionInfo(0, 0, 0, 0); + } + + unsigned char major = sw_info->at(1); + return VersionInfo((((major & 0xC0) >> 6) + 1), (major & 0x3f), sw_info->at(0), + (sw_info->at(3) << 8) + sw_info->at(2)); +} + + +bool UpdateManagerMSP_FET430::firmWareUpdate(const char* fname, UpdateNotifyCallback callback, bool*) +{ + FetControl* control=this->fetHandle->getControl(); + + if (control == nullptr) + return false; + + const uint32_t biosVersion = getHalVersion().get(); + + // core/HAL communication has changed with version 3.2.0.8 + // and after HAL update the core/HAL communication would not work + // do not update as long as there is no direct core update + if ((biosVersion > 30200000) && (biosVersion < 30200008) && (fname == nullptr)) + { + return false; + } + + // core will be updated through internal image + if (checkCoreVersion() != 0) + { + requiredUpdates = 12; + percent = 100 / requiredUpdates; + if (callback) + { + callback(BL_INIT, 100 - (requiredUpdates * percent), 0); + } + if (!this->upInit(1)) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_ERASE_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + if (!this->upCoreErase()) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_PROGRAM_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + + if (!this->upCoreWrite()) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_PROGRAM_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + + if (!this->upCoreRead()) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_PROGRAM_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + + // create 0x55 command erase signature + // command forces safecore to search for new core on reset + std::vector data_55; + data_55.push_back(0x03); + data_55.push_back(0x55); + uint8_t id=control->createResponseId(); + data_55.push_back(id); + data_55.push_back(0x00); + + control->sendData(data_55); + control->clearResponse(); + + for (int i = 0; i < 8; ++i) + { + this_thread::sleep_for(chrono::seconds(1)); + if (callback) + { + --requiredUpdates; + callback(BL_PROGRAM_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + } + if (callback) + { + callback(BL_EXIT, 100, 0); + } + } + + MemoryContent firmware; + + if (fname) + { + //Do not allow using a file if there is no valid HAL on the UIF + if (biosVersion < 20000000) + { + return false; + } + FileReader::create(fname)->read(&firmware); + } + else + { + /*if (currentArch == MSP432_M4) + { + firmware.fromSRec(UifHalImage, UifHalImage_address, UifHalImage_length_of_sections, UifHalImage_sections); + } + else + {*/ + firmware.fromSRec(UifHalMsp430Image, UifHalMsp430Image_address, UifHalMsp430Image_length_of_sections, UifHalMsp430Image_sections); + //} + } + requiredUpdates = UifHalMsp430Image_sections * 2 + 5; + percent = 100 / requiredUpdates; + // start HAL update routine + if (callback) + { + callback(BL_INIT, 100 - (requiredUpdates * percent), 0); + } + if (!this->upInit(1)) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_ERASE_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + if (!this->upErase(firmware, callback)) + { + return false; + } + if (callback) + { + callback(BL_PROGRAM_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + if (!this->upWrite(firmware, callback)) + { + return false; + } + if (callback) + { + callback(BL_EXIT, 100 - (requiredUpdates * percent), 0); + } + if (!this->upInit(0)) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_EXIT, 100 - (requiredUpdates * percent), 0); + } + + fetHandle->getControl()->resetCommunication(); + + // activate the new HAL (in case of downgrade: change to VCP) + HalExecCommand initCmd; + HalExecElement* el = new HalExecElement(ID_Init); + initCmd.elements.emplace_back(el); + + const bool initFailed = !this->fetHandle->send(initCmd); + + // give the firmware time to execute initialisation + this_thread::sleep_for(chrono::seconds(1)); + if (callback) + { + --requiredUpdates; + callback(BL_EXIT, 100 - (requiredUpdates * percent), 0); + } + + //Only an error if no user specified file is used (ie. init will fail for a downgrade) + if (initFailed && !fname) + { + return false; + } + + if (!initFailed) + { + //Perform a reset to make sure everything is correctly initialized + HalExecElement* el = new HalExecElement(ID_Zero); + el->appendInputData8(STREAM_CORE_ZERO_PUC_RESET); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + fetHandle->send(cmd); + for (int i = 0; i < 2; ++i) + { + this_thread::sleep_for(chrono::seconds(1)); + if (callback) + { + --requiredUpdates; + callback(BL_EXIT, 100 - (requiredUpdates * percent), 0); + } + } + + if (callback) + { + callback(BL_UPDATE_DONE, 100, 0); + } + } + + return true; +} + +bool UpdateManagerMSP_FET430::upInit(unsigned char level) +{ + HalExecElement* el = new HalExecElement(ID_Zero, UpInit); + el->setAddrFlag(false); + el->appendInputData8(level); + + HalExecCommand cmd; + cmd.elements.emplace_back(el); + + return this->fetHandle->send(cmd); +} + +bool UpdateManagerMSP_FET430::upErase(const MemoryContent& firmware, UpdateNotifyCallback callback) +{ + for (size_t i = 0; i < firmware.segments.size(); ++i) + { + const DataSegment& seg = firmware.segments[i]; + HalExecElement* el = new HalExecElement(ID_Zero, UpErase); + el->setAddrFlag(false); + el->appendInputData32(seg.startAddress & 0xfffffffe); + el->appendInputData32(static_cast(seg.data.size())); + + updateCmd.elements.clear(); + updateCmd.elements.emplace_back(el); + if (!this->fetHandle->send(updateCmd)) + { + return false; + } + if (callback) + { + --requiredUpdates; + callback(BL_ERASE_FIRMWARE, 100 - (requiredUpdates * percent), 0); + } + } + return true; +} + +bool UpdateManagerMSP_FET430::upWrite(const MemoryContent& firmware, UpdateNotifyCallback callback) +{ + for (size_t i = 0; i < firmware.segments.size(); ++i) + { + const DataSegment& seg = firmware.segments[i]; + + // create Core telegram -> update write + HalExecElement* el = new HalExecElement(ID_Zero, UpWrite); + // no HAL id needed for update + el->setAddrFlag(false); + + const uint32_t padding = seg.data.size() % 2; + const uint32_t data2send = static_cast(seg.data.size()) + padding; + + // add address data + el->appendInputData32(seg.startAddress&0xfffffffe); + el->appendInputData32(data2send); + + // add update data + for (size_t n=0; n < seg.data.size(); n++) + el->appendInputData8(seg.data[n] & 0xff); + + for (uint32_t p=0 ; p < padding; p++) + el->appendInputData8(0xff); + + updateCmd.elements.clear(); + updateCmd.elements.emplace_back(el); + if (!this->fetHandle->send(updateCmd)) + { + return false; + } + + if (callback) + { + --requiredUpdates; + callback(BL_DATA_BLOCK_PROGRAMMED, 100 - (requiredUpdates * percent), 0); + } + } + + return true; +} + + +bool UpdateManagerMSP_FET430::upCoreErase() +{ + //create erase command + updateCmd.elements.clear(); + HalExecElement* el = new HalExecElement(ID_Zero, UpErase); + el->setAddrFlag(false); + //append start address and length in bytes + el->appendInputData32(0x2500); + el->appendInputData32(0xbb00); + + updateCmd.elements.emplace_back(el); + return this->fetHandle->send(updateCmd); +} + +bool UpdateManagerMSP_FET430::upCoreWrite() +{ + Record fetCoreImage(UifBiosCoreImage, UifBiosCoreImage_address, UifBiosCoreImage_length_of_sections, UifBiosCoreImage_sections); + + updateCmd.elements.clear(); + HalExecElement* el = new HalExecElement(ID_Zero, UpWrite); + el->setAddrFlag(false); + //append flash start-address where following data will be flashed to + el->appendInputData32(0x2500); + //append number of data bytes, including number of sections, section start addresses and core signature + el->appendInputData32((fetCoreImage.getNumOfAllDataWords() + fetCoreImage.getNumOfManageWords() + 2)*2); + //append core signature + el->appendInputData32(coreSignature); + //append number of sections + el->appendInputData16((uint16_t)fetCoreImage.getSectionCount()); + + while (fetCoreImage.hasNextSection()) + { + //append start address and length information of each section + el->appendInputData16((uint16_t)fetCoreImage.getSectionStartAdr()); + el->appendInputData16((uint16_t)fetCoreImage.getSectionLength()); + + while (fetCoreImage.sectionHasNextWord()) + { + el->appendInputData16(fetCoreImage.getNextWord()); + } + fetCoreImage.nextSection(); + } + updateCmd.elements.emplace_back(el); + return this->fetHandle->send(updateCmd); +} + +//reads back flashed core data and compares it to data in core image +//returns: true, if data on FET and core image are equal +bool UpdateManagerMSP_FET430::upCoreRead() +{ + Record fetCoreImage(UifBiosCoreImage, UifBiosCoreImage_address, UifBiosCoreImage_length_of_sections, UifBiosCoreImage_sections); + + updateCmd.elements.clear(); + HalExecElement* el = new HalExecElement(ID_Zero, UpRead); + el->setAddrFlag(false); + //append start address for read access + el->appendInputData32(0x2500); + //append number of data bytes, including number of sections, section start addresses and core signature + el->appendInputData32((fetCoreImage.getNumOfAllDataWords() + fetCoreImage.getNumOfManageWords() + 2)*2); + updateCmd.elements.emplace_back(el); + + if (!this->fetHandle->send(updateCmd)) + { + return false; + } + //compare core signature + if (el->getOutputAt32(0) != coreSignature) + { + return false; + } + //compare number of sections + if (el->getOutputAt16(4) != fetCoreImage.getSectionCount()) + { + return false; + } + uint32_t overhead = 6; + + //compare data of current section, including start adress and length + while (fetCoreImage.hasNextSection()) + { + if (el->getOutputAt16(fetCoreImage.getCurrentPosByte() + overhead) != fetCoreImage.getSectionStartAdr()) + { + return false; + } + overhead += 2; + if (el->getOutputAt16(fetCoreImage.getCurrentPosByte() + overhead) != fetCoreImage.getSectionLength()) + { + return false; + } + overhead += 2; + + while (fetCoreImage.sectionHasNextWord()) + { + if (el->getOutputAt16(fetCoreImage.getCurrentPosByte() + overhead) != fetCoreImage.getNextWord()) + { + return false; + } + } + fetCoreImage.nextSection(); + } + return true; +} +/*EOF*/ diff --git a/DLL430_v3/src/TI/DLL430/DeviceHandleManagerV3.h b/DLL430_v3/src/TI/DLL430/UpdateManagerMSP_FET430.h similarity index 52% rename from DLL430_v3/src/TI/DLL430/DeviceHandleManagerV3.h rename to DLL430_v3/src/TI/DLL430/UpdateManagerMSP_FET430.h index 1671b49..c8b23c8 100644 --- a/DLL430_v3/src/TI/DLL430/DeviceHandleManagerV3.h +++ b/DLL430_v3/src/TI/DLL430/UpdateManagerMSP_FET430.h @@ -1,76 +1,83 @@ /* - * DeviceHandleManagerV3.h + * UpdateManagerMSP_FET430.h * - * Handles one or more device handles via JTAG. + * Functionality for updating MSP-FET430UIF debugger * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DEVICEHANDLEMANAGERV3_H -#define DLL430_DEVICEHANDLEMANAGERV3_H -#include -#include "DeviceHandleV3.h" -#include +#include "IUpdateManager.h" +#include "HalExecCommand.h" namespace TI { namespace DLL430 { - class FetHandleV3; - class DeviceHandleV3; - class DeviceChainInfo; - - class DeviceHandleManagerV3 : public DeviceHandleManager + class FetHandle; + class MemoryContent; + class ConfigManager; + + class UpdateManagerMSP_FET430 : public IUpdateManager { public: - DeviceHandleManagerV3 (FetHandleV3*); - ~DeviceHandleManagerV3 (); + UpdateManagerMSP_FET430(FetHandle*, ConfigManager*, TARGET_ARCHITECTURE_t arch); + ~UpdateManagerMSP_FET430 (); + + VersionInfo getHalVersion () const; - DeviceChainInfoList* getDeviceChainInfo (bool update); + bool isUpdateRequired(TARGET_ARCHITECTURE_t arch) const; - DeviceHandleV3* createDeviceHandle (DeviceChainInfoList::iterator& device, uint32_t deviceCode); // Used with a chain - void destroyDeviceHandle(DeviceHandle* handle); - protected: + bool firmWareUpdate(const char* fname, UpdateNotifyCallback callback, bool* coreUpdate); private: - FetHandleV3* parent; - DeviceChainInfoList list; - }; + uint16_t checkCoreVersion() const; + + FetHandle* fetHandle; + ConfigManager* configManagerV3; - }; -}; + HalExecCommand updateCmd; + + bool upInit(unsigned char level); + bool upErase(const MemoryContent& firmware, UpdateNotifyCallback callback); + bool upWrite(const MemoryContent& firmware, UpdateNotifyCallback callback); + bool upCoreErase(); + bool upCoreWrite(); + bool upCoreRead(); + uint16_t currentArch; + uint32_t percent; + uint32_t requiredUpdates; + }; -#endif /* DLL430_DEVICEHANDLEMANAGERV3_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.cpp b/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.cpp index 02c7e91..17f5756 100644 --- a/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.cpp +++ b/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.cpp @@ -3,50 +3,46 @@ * * IOChannel via CDC (VCOM) over USB communication. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef _MSC_VER -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS //disabling warnings to use secure c-function versions (e.g. strcpy_s) as this is not compatible with none MS development -#endif -#endif +#include #include "UsbCdcIoChannel.h" -#include -#include #include "logging/Logging.h" -#include +#include +#include +#include #if defined(_WIN32) || defined(_WIN64) @@ -55,7 +51,18 @@ extern "C" { #include } - static const std::string portPrefix("\\\\.\\"); +#elif defined(__APPLE__) + +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXPATHLEN 128 +#define MAXNAMELEN 64 #else @@ -64,12 +71,11 @@ extern "C" { using namespace boost::filesystem; - static const std::string portPrefix(""); - #endif using namespace TI::DLL430; using namespace std; +using namespace std::placeholders; using namespace boost::asio; #define XOFF 0x13 @@ -79,75 +85,55 @@ using namespace boost::asio; #define XMASK_ON 0x01 #define XMASK_MASK 0x00 -#ifndef NDEBUG -#define DB_PRINT -#endif -UsbCdcIoChannel::UsbCdcIoChannel(std::string name, std::string id) - : inputReportSize(255) - , actSize(0) - , expSize(0) - , name(name) - , isXoffFlowOn(true) - , status(freeForUse) +UsbCdcIoChannel::UsbCdcIoChannel(const PortInfo& portInfo) + : UsbIoChannel(portInfo) + , inputBuffer(260) , ioService(0) , port(0) , comState(ComStateRcv) + , bytesReceived(0) + , timerEvent(false) + , readEvent(false) + , cancelled(false) { - serial = retrieveSerialFromId(id); retrieveStatus(); } -UsbCdcIoChannel::~UsbCdcIoChannel () +UsbCdcIoChannel::~UsbCdcIoChannel() { this->cleanup(); } - -void UsbCdcIoChannel::enumeratePorts (PortMap & portList, bool open) +void UsbCdcIoChannel::createCdcPortList(const uint16_t vendorId, const uint16_t productId, PortMap& portList) { #if defined(_WIN32) || defined(_WIN64) - typedef boost::array RegistryProperty; + stringstream cdcIdStream; + cdcIdStream << hex << setfill('0') << "USB\\VID_" << setw(4) << vendorId << "&PID_" << setw(4) << productId; - const std::string tiVendorId("VID_2047"); - const std::string cdcClassDev("PID_0010"); ///< product id 0010 means CDC - const std::string cdcId(UsbDevClass() + '\\' + tiVendorId + '&' + cdcClassDev); - - char deviceId[maxBufferLength]; + const int BUFFER_SIZE = 128; - HDEVINFO hDevInfo = ::SetupDiGetClassDevs(NULL, UsbDevClass().c_str(), 0, DIGCF_PRESENT | DIGCF_ALLCLASSES ); + HDEVINFO hDevInfo = ::SetupDiGetClassDevs(nullptr, "USB", 0, DIGCF_PRESENT | DIGCF_ALLCLASSES ); SP_DEVINFO_DATA devInfoData; devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); - - for (int i = 0; ::SetupDiEnumDeviceInfo(hDevInfo,i,&devInfoData); ++i ) - { - deviceId[0]=0; - BOOL result = ::SetupDiGetDeviceInstanceId(hDevInfo,&devInfoData,deviceId,maxBufferLength,NULL); + + for (int i = 0; ::SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData); ++i ) + { + char deviceId[BUFFER_SIZE] = {0}; + BOOL result = ::SetupDiGetDeviceInstanceId(hDevInfo, &devInfoData, deviceId, BUFFER_SIZE, nullptr); //not TI and/or not CDC - if( !result || 0 != cdcId.compare( std::string( deviceId).substr( 0, cdcId.size() ) ) ) - { - continue; - } - else + if (result && string(deviceId).find(cdcIdStream.str()) != string::npos) { DWORD propertyType = 0; - - RegistryProperty property; - ::SetupDiGetDeviceRegistryProperty( - hDevInfo, &devInfoData, SPDRP_FRIENDLYNAME, - &propertyType, &property[0], maxBufferLength, NULL - ); + BYTE property[BUFFER_SIZE] = {0}; + ::SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_FRIENDLYNAME, &propertyType, property, BUFFER_SIZE, nullptr); - std::stringstream sstr; - for(size_t i = 0; i < property.size(); ++i) + stringstream sstr; + for (int k = 0; k < BUFFER_SIZE && property[k] != 0; ++k) { - sstr << property[i]; - if(0 == property[i]) - { - break; - } + sstr << property[k]; } const size_t idBegin = sstr.str().find_last_of('(') + 1; @@ -155,61 +141,232 @@ void UsbCdcIoChannel::enumeratePorts (PortMap & portList, bool open) assert(idEnd > idBegin); const string name = sstr.str().substr(idBegin, idEnd - idBegin); - - UsbCdcIoChannel * cdcElem = new UsbCdcIoChannel(name,deviceId); - portList.insert(std::make_pair(name,cdcElem)); + + if ((name[0] && (sstr.str().compare(0, 19, "MSP Debug Interface") == 0 ))|| (name[0] && (sstr.str().compare(0, 19, "MSP-FET430UIF - CDC") == 0 ))) + { + PortInfo portInfo(name, string("\\\\.\\")+name, PortInfo::CDC, retrieveSerialFromId(deviceId)); + if (name[0] && (sstr.str().compare(0, 19, "MSP Debug Interface") == 0 )) + { + portInfo.useFlowControl = false; + portInfo.useCrc = false; + } + else if (name[0] && (sstr.str().compare(0, 19, "MSP-FET430UIF - CDC") == 0 )) + { + portInfo.useFlowControl = true; + portInfo.useCrc = true; + } + + //if (open) + { + portInfo.status = UsbCdcIoChannel(portInfo).getStatus(); + } + portList[portInfo.name] = portInfo; + } } } ::SetupDiDestroyDeviceInfoList(hDevInfo);//free resources -#else +#elif defined(__APPLE__) + CFMutableDictionaryRef matchingDict; + kern_return_t kernResult; + io_iterator_t iterator; + + matchingDict = IOServiceMatching(kIOSerialBSDServiceValue); + CFDictionarySetValue(matchingDict, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDAllTypes)); + kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iterator); + + if (kernResult != KERN_SUCCESS) { + return; + } - // Implementation based on Debian - path p(string("/dev/serial/by-id/")); - if ( exists(p) && is_directory(p) ) + for (;;) { - const directory_iterator end; - for ( directory_iterator it(p); it != end; ++it ) + io_context_t device = IOIteratorNext(iterator); + if (device == 0) { - const string deviceId = it->path().filename().c_str(); - if ( is_symlink(*it) && - deviceId.find("usb-Texas_Instruments_Texas_Instruments_MSP430-JTAG_") != string::npos ) + if (!IOIteratorIsValid(iterator)) { - char linkPath[255] = {0}; - const int len = readlink( it->path().string().c_str(), linkPath, sizeof(linkPath) ); - if ( len > 0 ) + /* + * Apple documentation advises resetting the iterator if + * it should become invalid during iteration. + */ + IOIteratorReset(iterator); + device = IOIteratorNext(iterator); + if (device == 0) { - string portPath = (linkPath[0] == '/') ? string(linkPath) : p.string() + linkPath; - portList[portPath] = new UsbCdcIoChannel(portPath, deviceId); + break; } } + else + { + break; + } + } + + CFTypeRef bsdPathAsCFString = nullptr; + CFTypeRef vendorIdAsCFNumber = nullptr; + CFTypeRef productIdAsCFNumber = nullptr; + CFTypeRef ttyDeviceAsCFString = nullptr; + CFTypeRef interfaceNumberAsCFNumber = nullptr; + + char ttyDevice[MAXNAMELEN]; + SInt32 interfaceNumber; + char path[MAXPATHLEN]; + SInt32 vID = 0; + SInt32 pID = 0; + + // Get the name of the modem's callout device + bsdPathAsCFString = IORegistryEntryCreateCFProperty(device, CFSTR(kIOCalloutDeviceKey), + kCFAllocatorDefault, 0); + + ttyDeviceAsCFString = IORegistryEntryCreateCFProperty(device, CFSTR(kIOTTYDeviceKey), + kCFAllocatorDefault, 0); + + io_name_t name; + IORegistryEntryGetName(device, name); + + // wander up the hierarchy until we find the level that can give us the + // vendor/product IDs and the product name, if available + io_registry_entry_t parent; + kern_return_t kernResult = IORegistryEntryGetParentEntry(device, kIOServicePlane, &parent); + IOObjectRelease(device); + + while ( kernResult == KERN_SUCCESS && ( !vendorIdAsCFNumber || !productIdAsCFNumber || !interfaceNumberAsCFNumber) ) + { + if (!vendorIdAsCFNumber) + { + vendorIdAsCFNumber = IORegistryEntrySearchCFProperty(parent, + kIOServicePlane, + CFSTR(kUSBVendorID), + kCFAllocatorDefault, 0); + } + + if (!productIdAsCFNumber) + { + productIdAsCFNumber = IORegistryEntrySearchCFProperty(parent, + kIOServicePlane, + CFSTR(kUSBProductID), + kCFAllocatorDefault, 0); + } + + if (!interfaceNumberAsCFNumber) + { + interfaceNumberAsCFNumber = IORegistryEntrySearchCFProperty(parent, + kIOServicePlane, + CFSTR(kUSBInterfaceNumber), + kCFAllocatorDefault, 0); + } + + io_registry_entry_t oldparent = parent; + kernResult = IORegistryEntryGetParentEntry(parent, kIOServicePlane, &parent); + IOObjectRelease(oldparent); + } + + if (interfaceNumberAsCFNumber) + { + CFNumberGetValue((CFNumberRef)interfaceNumberAsCFNumber, kCFNumberSInt32Type, &interfaceNumber); + CFRelease(interfaceNumberAsCFNumber); + if (interfaceNumber != 1) + { + continue; + } + } + + if (ttyDeviceAsCFString) + { + CFStringGetCString((CFStringRef)ttyDeviceAsCFString, ttyDevice, PATH_MAX, kCFStringEncodingUTF8); + CFRelease(ttyDeviceAsCFString); + } + + if (bsdPathAsCFString) + { + CFStringGetCString((CFStringRef)bsdPathAsCFString, path, PATH_MAX, kCFStringEncodingUTF8); + CFRelease(bsdPathAsCFString); + } + + if (vendorIdAsCFNumber) + { + CFNumberGetValue((CFNumberRef)vendorIdAsCFNumber, kCFNumberSInt32Type, &vID); + CFRelease(vendorIdAsCFNumber); + } + + if (productIdAsCFNumber) + { + CFNumberGetValue((CFNumberRef)productIdAsCFNumber, kCFNumberSInt32Type, &pID); + CFRelease(productIdAsCFNumber); + } + + if ((vID == vendorId) && (pID == productId)) + { + PortInfo portInfo(ttyDevice, path, PortInfo::CDC); + if (productId == 0x0010) + { + portInfo.useFlowControl = true; + portInfo.useCrc = true; + } + portInfo.status = UsbCdcIoChannel(portInfo).getStatus(); + portList[portInfo.name] = portInfo; } } - // Use workaround for distributions without /dev/serial/by-id - else +#else + stringstream cdcIdStream; + cdcIdStream << hex << setfill('0') << "usb:v" << setw(4) << vendorId << "p" << setw(4) << productId; + + path p("/sys/class/tty/"); + if (exists(p) && is_directory(p)) { - for (int i = 0; i < 16; ++i) + const directory_iterator end; + for (directory_iterator it(p); it != end; ++it) { - stringstream portName; - portName << "ttyACM" << i; - string portPath = string("/dev/") + portName.str(); - if ( !access(portPath.c_str(), F_OK) ) + string dir = it->path().string(); + if (dir.find("ttyACM") != string::npos) { - portList[portPath] = new UsbCdcIoChannel(portPath, portName.str()); + string modalias; + int interfaceNumber = -1; + + std::ifstream modAliasStream((it->path()/"device/modalias").string().c_str()); + modAliasStream >> modalias; + + std::ifstream ifNumStream((it->path()/"device/bInterfaceNumber").string().c_str()); + ifNumStream >> interfaceNumber; + if (modalias.find(cdcIdStream.str()) == 0 && interfaceNumber == 0) + { + const string filename = it->path().filename().string(); + const string portPath = string("/dev/") + filename; + + PortInfo portInfo(filename, portPath, PortInfo::CDC); + + if (productId == 0x0010) + { + portInfo.useFlowControl = true; + portInfo.useCrc = true; + } + + //if (open) + { + portInfo.status = UsbCdcIoChannel(portInfo).getStatus(); + } + portList[portInfo.name] = portInfo; + } } } } #endif } + +void UsbCdcIoChannel::enumeratePorts (PortMap& portList, bool open) +{ + createCdcPortList(0x2047, 0x0013, portList); //eZ-FET + createCdcPortList(0x2047, 0x0014, portList); //MSP-FET + createCdcPortList(0x2047, 0x0010, portList); //UIF +} + std::string UsbCdcIoChannel::retrieveSerialFromId(const std::string& id) { #if defined(_WIN32) || defined(_WIN64) - std::stringstream sstr(id); - - const size_t idBegin = sstr.str().find_last_of('\\') + 1; - - return sstr.str().substr(idBegin, 16); + const size_t idBegin = id.find_last_of('\\') + 1; + return id.substr(idBegin, 16); #else const size_t begin = id.find_last_of('_') + 1; const size_t end = id.find_last_of('-'); @@ -217,32 +374,29 @@ std::string UsbCdcIoChannel::retrieveSerialFromId(const std::string& id) #endif } -long UsbCdcIoChannel::getStatus() -{ - return status; -} - - bool UsbCdcIoChannel::openPort() { - const std::string dev = portPrefix + name; - - ioService = new boost::asio::io_service; + ioService = new boost::asio::io_context; port = new boost::asio::serial_port(*ioService); + timer = new boost::asio::steady_timer(*ioService); - if ( boost::system::error_code ec = port->open(dev, ec) ) + boost::system::error_code ec; + ec = port->open(portInfo.path, ec); + if (ec != boost::system::error_condition(boost::system::errc::success)) { int retry = 5; - while (ec && --retry ) + while ((ec != boost::system::error_condition(boost::system::errc::success)) + && (--retry )) { - boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(5)); - ec = port->open(dev, ec); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + ec = port->open(portInfo.path, ec); } - if ( ec == boost::system::error_condition(boost::system::errc::permission_denied) ) - status = inUseByAnotherInstance; - - if (ec) + if (ec == boost::system::error_condition(boost::system::errc::permission_denied)) + { + portInfo.status = PortInfo::inUseByAnotherInstance; + } + if (ec != boost::system::error_condition(boost::system::errc::success)) { close(); return false; @@ -251,14 +405,15 @@ bool UsbCdcIoChannel::openPort() return true; } - void UsbCdcIoChannel::retrieveStatus() { - status = freeForUse; + portInfo.status = PortInfo::freeForUse; if (!isOpen()) { openPort(); + //Seeing issues on some platforms (eg. Ubuntu) when port is immediately closed again + std::this_thread::sleep_for(std::chrono::milliseconds(100)); close(); } } @@ -271,216 +426,238 @@ bool UsbCdcIoChannel::open() return false; } - status = freeForUse; + portInfo.status = PortInfo::freeForUse; try { const int baudrate = 460800; +#if defined(__APPLE__) + // Vanilla boost does not provide method to set non-standard baudrates, + // so we have to set it low-level + if (ioctl (port->native_handle(), _IOW('T', 2, speed_t), &baudrate, 1) < 0) + { + return false; + } +#else port->set_option( serial_port::baud_rate( baudrate ) ); +#endif port->set_option( serial_port::flow_control( serial_port::flow_control::none ) ); port->set_option( serial_port::parity( serial_port::parity::none ) ); port->set_option( serial_port::stop_bits( serial_port::stop_bits::one ) ); port->set_option( serial_port::character_size(8) ); } - catch (const boost::system::error_code&) {} - - inputBuffer.resize(inputReportSize+3); + catch (const boost::system::system_error&) + { + return false; + } return true; } -void UsbCdcIoChannel::cleanup () +void UsbCdcIoChannel::cleanup() { + boost::system::error_code ec; if (isOpen()) { - boost::system::error_code ec = port->close(ec); + port->close(ec); } + delete timer; + timer = 0; delete port; port = 0; delete ioService; ioService = 0; } -bool UsbCdcIoChannel::close () +bool UsbCdcIoChannel::close() { cleanup(); return true; } -bool UsbCdcIoChannel::isOpen () + +bool UsbCdcIoChannel::isOpen() const { return port && port->is_open(); } -boost::mutex readWriteMutex; -class AsyncTransferHandler +void UsbCdcIoChannel::cancel() { -public: - AsyncTransferHandler(serial_port& port) : - port(port), - timer(port.get_io_service()), - result(RES_NONE), - bytesTransfered(0) {} - - int read(unsigned char* buf, size_t bufSize, uint32_t timeout) + cancelled = true; + + if (timer && timer->expires_after(boost::asio::chrono::milliseconds(0)) > 0) { - timer.expires_from_now(boost::posix_time::milliseconds(timeout)); - timer.async_wait(boost::bind(&AsyncTransferHandler::onTimeout, this, _1)); + timer->async_wait(std::bind(&UsbCdcIoChannel::onTimer, this, std::placeholders::_1)); + } +} - async_read(port, buffer(buf, bufSize), - boost::bind(&AsyncTransferHandler::onTransferComplete, this, _1, _2) ); - port.get_io_service().reset(); +void UsbCdcIoChannel::setTimer(uint32_t duration) +{ + timerEvent = false; -#if defined(_WIN32) || defined(_WIN64) - while ( result == RES_NONE ) - port.get_io_service().run_one(); + if (timer) + { + boost::system::error_code ec; + timer->expires_after(boost::asio::chrono::milliseconds(duration)); + timer->async_wait(bind(&UsbCdcIoChannel::onTimer, this, std::placeholders::_1)); + } +} - if (result != RES_COMPLETE) - { - readWriteMutex.lock(); - port.cancel(); - readWriteMutex.unlock(); - } - if (result != RES_TIMEOUT) - timer.cancel(); -#else - while ( result == RES_NONE ) - port.get_io_service().run(); -#endif - port.get_io_service().stop(); +void UsbCdcIoChannel::startRead(size_t offset, size_t numBytes) +{ + bytesReceived = 0; + readEvent = false; + async_read(*port, buffer(&inputBuffer[offset], numBytes), bind(&UsbCdcIoChannel::onRead, this, std::placeholders::_1, std::placeholders::_2)); +} - return (result == RES_COMPLETE) ? static_cast(bytesTransfered) : -1; - } -private: - enum Result { RES_NONE, RES_ERROR, RES_TIMEOUT, RES_COMPLETE }; +void UsbCdcIoChannel::onTimer(const boost::system::error_code& ec) +{ + timerEvent = (ec != error::operation_aborted); +} - serial_port& port; - deadline_timer timer; - Result result; - int bytesTransfered; - void onTransferComplete(const boost::system::error_code& ec, size_t numBytes) - { -#ifdef UNIX - timer.cancel(); -#endif - if ( ec != error::operation_aborted && result == RES_NONE ) - result = ec ? RES_ERROR : RES_COMPLETE; +void UsbCdcIoChannel::onRead(const boost::system::error_code& ec, size_t numBytes) +{ + readEvent = (ec != error::operation_aborted); + bytesReceived = numBytes; +} - bytesTransfered = (result == RES_COMPLETE) ? static_cast(numBytes) : -1; - } - void onTimeout(const boost::system::error_code& ec) - { -#ifdef UNIX - port.cancel(); -#endif - if( ec != error::operation_aborted && result == RES_NONE ) - result = ec ? RES_ERROR : RES_TIMEOUT; - } -}; - -int UsbCdcIoChannel::read(HalResponse& resp, uint32_t timeout) +size_t UsbCdcIoChannel::read(HalResponse& resp) { if (!isOpen()) return 0; - if(actSize == 0) - expSize = 6; + size_t actSize = 0; + size_t expSize = 1; - if (expSize > inputBuffer.size()) - inputBuffer.resize(expSize); + setTimer(1000); + startRead(0, expSize); - int bytesRead = -1; - try + while (ioService->run_one()) { - AsyncTransferHandler readHandler(*port); - bytesRead = readHandler.read(&inputBuffer[actSize], expSize-actSize, timeout); - } catch(const std::exception&) {} + if (readEvent) + { + if (bytesReceived > 0) + { + if (actSize == 0) + expSize = inputBuffer[0] + ( (inputBuffer[0] & 0x01) ? 3 : 4); - if (bytesRead < 0) - { - const std::string dev = portPrefix + name; + actSize += bytesReceived; + + if (actSize == expSize) + { + timer->cancel(); + break; + } + } - //Important, test port must be gone before close can be called - boost::system::error_code ec = serial_port(*ioService).open(dev, ec); + startRead(actSize, expSize - actSize); + } - if (ec == boost::system::error_condition(boost::system::errc::no_such_file_or_directory)) + else if (timerEvent) { - if (comState != ComStateDisconnect) + if (wasUnplugged() || cancelled) { - this->close(); + cancelled = false; + port->cancel(); + break; } - comState = ComStateDisconnect; + + setTimer(1000); + } + + if (ioService->stopped()) + { + ioService->restart(); } } - if (bytesRead > 0) + //Let cancelled tasks finish + ioService->run(); + ioService->restart(); + + + if (actSize == expSize) { - if (actSize == 0) - expSize = inputBuffer[0] + ( (inputBuffer[0] & 0x01) ? 3 : 4); + processMessage(actSize, resp); + return actSize; + } + return 0; +} - actSize += static_cast(bytesRead & 0xFFFF); - //Perform sanity check on message size before trying to read it - if (expSize < actSize || (expSize % 2) != 0) - { - resp.setError(HalResponse::Error_Size); - expSize = actSize = 0; - return bytesRead; - } +bool UsbCdcIoChannel::wasUnplugged() +{ +#if defined(_WIN32) || defined(_WIN64) + boost::system::error_code ec; + ec = serial_port(*ioService).open(portInfo.path, ec); + if (ec == boost::system::error_condition(boost::system::errc::no_such_file_or_directory)) + { + comState = ComStateDisconnect; + } +#else + /* + * Workaround for El Capitan with UIF: the above branch triggers sending of SET_LINE_CODING + * Do not trigger SET_LINE_CODING here + */ - if(expSize && actSize == expSize) - { - #ifdef DB_PRINT - Logging::DefaultLogger().PrintReceiveBuffer(&inputBuffer[0], expSize); - #endif // DB_PRINT - - const uint16_t msgSize = expSize; - actSize=0; - expSize=0; - - resp.setType(inputBuffer[1]); - resp.setId(inputBuffer[2] & 0x7f); //Don't mask async bit (0x40) - resp.setIsComplete(inputBuffer[2]); - - if(msgSize >= 2) - { - resp.append(&inputBuffer[1], inputBuffer[0]); - } - - const uint16_t expectedCRC = createCrc(&inputBuffer[0]); - const uint16_t actualCRC = inputBuffer[msgSize-2] + (inputBuffer[msgSize-1] << 8); - if( actualCRC != expectedCRC) - { - resp.setError(HalResponse::Error_CRC); - } + /* Also workaround for Ubuntu 16 with UIF: the above branch triggers sending of SetControlLineState, which we don't want here */ - return bytesRead; + struct stat dev; + if (stat(portInfo.path.c_str(), &dev) != 0) + { + comState = ComStateDisconnect; + } +#endif + return comState == ComStateDisconnect; +} + + +void UsbCdcIoChannel::processMessage(size_t msgSize, HalResponse& resp) +{ +#ifdef DB_PRINT + Logging::DefaultLogger().PrintReceiveBuffer(&inputBuffer[0], static_cast(msgSize)); +#endif // DB_PRINT + + if (portInfo.useCrc) + { + const uint16_t expCrc = createCrc(&inputBuffer[0]); + const uint16_t actCrc = (inputBuffer[msgSize-1] << 8) | inputBuffer[msgSize-2]; + if (actCrc != expCrc) + { + resp.setError(HalResponse::Error_CRC); } } - return 0; + resp.setType(inputBuffer[1]); + resp.setId(inputBuffer[2] & 0x7f); //Don't mask async bit (0x40) + resp.setIsComplete(inputBuffer[2]); + + if (msgSize >= 2) + { + resp.append(&inputBuffer[1], inputBuffer[0]); + } } -enum ComState UsbCdcIoChannel::poll () +enum ComState UsbCdcIoChannel::poll() { return comState; } -int UsbCdcIoChannel::write (const uint8_t* payload, size_t len) +size_t UsbCdcIoChannel::write(const uint8_t* payload, size_t len) { if (!isOpen()) return 0; - int ret_len = static_cast(len); + const size_t ret_len = len; uint8_t report[256] = {0}; @@ -491,20 +668,23 @@ int UsbCdcIoChannel::write (const uint8_t* payload, size_t len) if (!(report[0] & 0x01)) report[len++] = 0x00; - //create crc and append it to data - uint16_t crc = createCrc(report); + if (portInfo.useCrc) + { + //create crc and append it to data + uint16_t crc = createCrc(report); - report[len++] = crc & 0x00ff; - report[len++] = (crc & 0xff00) >> 8; + report[len++] = crc & 0x00ff; + report[len++] = (crc & 0xff00) >> 8; + } size_t n_write = 0; uint8_t send_buf[512]; - if (isXoffFlowOn) + if (portInfo.useFlowControl) { //mask XOFF, XON and MASK in data stream size_t j = 0; - + for (size_t i = 0; i < len; i++) { const uint8_t ch = report[i]; @@ -530,32 +710,32 @@ int UsbCdcIoChannel::write (const uint8_t* payload, size_t len) memcpy(send_buf, report, n_write); } - readWriteMutex.lock(); +#ifdef DB_PRINT + Logging::DefaultLogger().PrintSendBuffer(send_buf, static_cast(n_write)); +#endif // DB_PRINT + boost::system::error_code ec; const size_t nWritten = boost::asio::write(*port, buffer(send_buf, n_write), transfer_all(), ec); - readWriteMutex.unlock(); + if (nWritten != n_write) { return 0; } -#ifdef DB_PRINT - Logging::DefaultLogger().PrintSendBuffer(send_buf, n_write); -#endif // DB_PRINT return ret_len; } -const char* UsbCdcIoChannel::getName () +const char* UsbCdcIoChannel::getName() const { - return name.c_str(); + return portInfo.name.c_str(); } -const char* UsbCdcIoChannel::getInterfaceName () +string UsbCdcIoChannel::getSerial() const { - return name.c_str(); + return portInfo.serial; } -const std::string UsbCdcIoChannel::getSerial() +PortInfo::Status UsbCdcIoChannel::getStatus() const { - return serial; + return portInfo.status; } diff --git a/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.h b/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.h index b6531a9..0b32f51 100644 --- a/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.h +++ b/DLL430_v3/src/TI/DLL430/UsbCdcIoChannel.h @@ -3,46 +3,49 @@ * * IOChannel via CDC (VCOM) over USB communication. * - * Copyright (C) 2007 - 2010 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 + * Copyright (C) 2007 - 2010 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#define _WIN32_WINNT 0x0501 +#pragma once #include "UsbIoChannel.h" #include "HalResponse.h" -#include -#include +#define BOOST_DATE_TIME_NO_LIB +#define BOOST_REGEX_NO_LIB + #include +#include +#include namespace TI { @@ -51,46 +54,50 @@ namespace TI class UsbCdcIoChannel : public UsbIoChannel { public: - - UsbCdcIoChannel (std::string name, std::string id); - ~UsbCdcIoChannel (); + explicit UsbCdcIoChannel(const PortInfo&); + ~UsbCdcIoChannel(); - enum ComState poll (); + ComState poll(); bool open(); - bool isOpen (); - bool close () ; - long getStatus(); + bool isOpen() const; + bool close(); + void cancel(); - int read (HalResponse& resp, uint32_t timeout); - int write (const uint8_t* payload, size_t len); + size_t read(HalResponse& resp); + size_t write(const uint8_t* payload, size_t len); - static void enumeratePorts (PortMap & list, bool open); + static void enumeratePorts(PortMap & list, bool open); - const char* getName (); - const char* getInterfaceName (); - const std::string getSerial(); + const char* getName() const; + std::string getSerial() const; + PortInfo::Status getStatus() const; private: - static const size_t maxBufferLength = 128; - uint16_t inputReportSize; std::vector inputBuffer; - uint16_t actSize; - uint16_t expSize; - std::string name; - bool isXoffFlowOn; - Status status; - boost::asio::io_service* ioService; + boost::asio::io_context* ioService; boost::asio::serial_port* port; + boost::asio::steady_timer* timer; ComState comState; - std::string serial; + size_t bytesReceived; + bool timerEvent; + bool readEvent; + bool cancelled; + + void setTimer(uint32_t duration); + void onTimer(const boost::system::error_code& ec); + + void startRead(size_t offset, size_t numBytes); + void onRead(const boost::system::error_code& ec, size_t numBytes); + + void processMessage(size_t msgSize, HalResponse& resp); + bool wasUnplugged(); + static void createCdcPortList(const uint16_t vendorId, const uint16_t productId, PortMap& portList); bool openPort(); - void cleanup(); void retrieveStatus(); static std::string retrieveSerialFromId(const std::string& id); - static const std::string UsbDevClass() { return "USB"; } }; } } diff --git a/DLL430_v3/src/TI/DLL430/UsbIoChannel.cpp b/DLL430_v3/src/TI/DLL430/UsbIoChannel.cpp index cbc6aef..2d76520 100644 --- a/DLL430_v3/src/TI/DLL430/UsbIoChannel.cpp +++ b/DLL430_v3/src/TI/DLL430/UsbIoChannel.cpp @@ -3,195 +3,73 @@ * * Base class for USB IOChannel devices, e.g. CDC or HID. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "UsbIoChannel.h" #include "HalExecCommand.h" #include "HalExecElement.h" #include "FetControl.h" -#include #include -#include - -#include using namespace TI::DLL430; -bool UsbIoChannel::setObjectDbEntry (size_t entry) +UsbIoChannel::UsbIoChannel(const PortInfo& portInfo) + : portInfo(portInfo) { - struct halObjectDb_entry* dbEntry = NULL; - for (unsigned long i = 0; halObjectDb[i].entry != NULL; ++i) - { - if (i == entry) - dbEntry = halObjectDb[i].entry; - }; - if (dbEntry == NULL) - return false; - - if (this->available.size() > 0) - this->available.clear(); - - /* This is a special function that - by definition -\ - * is always present - */ - unsigned long zeroId = 0; - UsbIoChannel::FetFunction* f = new UsbIoChannel::FetFunction; - - f->callAddress = 0x0000; - f->object = 0; - f->sticky = false; - this->available.insert(zeroId, f); - - //get version and callAdress size from firmware - uint16_t fwVersion = 0; - HalExecCommand zeroIdCmd; - HalExecElement* el = new HalExecElement(ID_Zero); - - el->appendInputData8(STREAM_CORE_ZERO_MACRO_SIZE); // destination: core or macros - el->setOutputSize(2); - - zeroIdCmd.elements.push_back(el); - if (!this->parent->send(zeroIdCmd)) - return false; - - uint16_t entries = el->getOutputAt16(0); - zeroIdCmd.elements.clear(); - el = new HalExecElement(ID_Zero); - el->appendInputData8(STREAM_CORE_ZERO_MACRO_ADDR); - - el->appendInputData16(entries); - el->setInputMinSize(4); - el->setOutputSize(4 + (entries * 4)); - - zeroIdCmd.elements.push_back(el); - if (!this->parent->send(zeroIdCmd)) - return false; - - std::map builtinMap; - for (uint16_t i = 1; i <= entries; ++i) - { - builtinMap[el->getOutputAt16(i * 4)] = el->getOutputAt16((i * 4) + 2) | 0x1; - } - - for (unsigned int i = 0; dbEntry[i].id != 0; ++i) - { - UsbIoChannel::FetFunction* f = new UsbIoChannel::FetFunction; - std::map::iterator bit = builtinMap.find(dbEntry[i].id); - if (bit == builtinMap.end() || fwVersion < dbEntry[i].MSP430.version) - { - // If function is not yet implemented in BIOS or current function in DB - // is newer than in BIOS. Mark function in order to download it later - f->callAddress = (uint16_t)-1; - f->object = dbEntry[i].MSP430.object; - } - else - { - // Function is already implemented in BIOS and has the same version. - f->callAddress = bit->second; - f->object = 0; - } - f->functionId = dbEntry[i].id; - f->sticky = false; - unsigned long id = f->functionId; - this->available.insert(id, f); - } - - return true; } -size_t UsbIoChannel::getFunctionAddress (unsigned long id) +UsbIoChannel::~UsbIoChannel () { - if(id==0) - return 0; - - if (this->available.size() == 0) - this->setObjectDbEntry(0); - - uint16_t halId = static_cast(id & 0xFFFF); - if (this->functionTable) - { - function_map_type::iterator fmit = this->functionTable->find(id); - if (fmit != this->functionTable->end()) - halId = fmit->second; - } - - UsbIoChannel::object_map_type::iterator it = this->available.find(halId); - if (it == this->available.end()) - return (size_t)-1; - UsbIoChannel::FetFunction* f = it->second; - if (id > 0 && f->callAddress == (uint16_t)-1) - return (size_t)-1; - - return id; } uint16_t UsbIoChannel::createCrc(const uint8_t * buf) { - uint16_t crc=0x0000; - uint8_t count=((buf[0]+1)>>1); - if(!(buf[0]&0x01)){ + uint16_t crc = 0x0000; + uint8_t count = ((buf[0]+1) >> 1); + + if (!(buf[0] & 0x01)) + { count++; } - uint16_t short_val; - - for(int i=0;i 1000 #pragma once -#endif -#ifndef DLL430_USBIOCHANNEL_H -#define DLL430_USBIOCHANNEL_H #include "IoChannel.h" -#include -#include - -struct halObjectDb_object; namespace TI { @@ -55,38 +47,39 @@ namespace TI class UsbIoChannel : public IoChannel { - public: - UsbIoChannel () {} - virtual ~UsbIoChannel () {} - virtual bool open() = 0; + public: + enum settings { + Setting_FlowControlMode = 0, + Setting_Baudrate = 1, + Setting_DmaTimeout = 2, + Setting_DTR = 3, + Setting_RTS = 4, + Setting_DSR = 5, + Setting_DataFormat = 6, + Setting_FwUpdateMode = 10, + Setting_FlushBuffer = 11, + }; + + enum flowControl + { + FlowControl_None = 0x00, + FlowControl_XonXoff = 0x01, + FlowControl_Hardware = 0x24, + }; + + explicit UsbIoChannel(const PortInfo&); + virtual ~UsbIoChannel(); std::vector * getHwVersion(); std::vector * getSwVersion(); - bool setObjectDbEntry (size_t entry); - size_t getFunctionAddress (unsigned long id); - protected: - struct FetFunction { - halObjectDb_object* object; //can be 0 - uint16_t functionId; - uint16_t callAddress; - bool sticky; - }; - typedef boost::ptr_map object_map_type; - typedef std::list loaded_list_type; - uint16_t createCrc(const uint8_t * buf); - uint16_t createCrc(const uint8_t * buf, const uint8_t size); - - object_map_type available; - + PortInfo portInfo; private: UsbIoChannel(const UsbIoChannel&); void operator=(const UsbIoChannel&); }; - }; -}; - -#endif /* DLL430_USBIOCHANNEL_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/VersionInfo.cpp b/DLL430_v3/src/TI/DLL430/VersionInfo.cpp index 44a8897..08af18c 100644 --- a/DLL430_v3/src/TI/DLL430/VersionInfo.cpp +++ b/DLL430_v3/src/TI/DLL430/VersionInfo.cpp @@ -3,45 +3,75 @@ * * Formats version string. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include -#include +#include "VersionInfo.h" +#include "../../../version.h" using namespace TI::DLL430; using namespace std; +#define TO_STRING(x) #x +#define MAKE_VERSION_STR(major, minor, patch, build) TO_STRING(major) "." TO_STRING(minor) "." TO_STRING(patch) "." TO_STRING(build) +#define MAKE_FN_NAME(major, minor, patch, build) _MSPDS_FUNCTION_VERSION_##major##_##minor##_##patch##_##build(void) +#define MAKE_FUNCTION_NAME(major, minor, patch, build) MAKE_FN_NAME(major, minor, patch, build) + +static volatile char gVersion[] +#ifdef __APPLE__ + __attribute__((used)) +#endif + = "_MSPDS_VERSION_ " MAKE_VERSION_STR(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD); + +#if defined(__cplusplus) +extern "C" { +#endif + +DLL430_SYMBOL volatile char* +#if !defined(_WIN32) && !defined(_WIN64) +__attribute__((used)) +#else +#endif +MAKE_FUNCTION_NAME(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILD) +{ + return gVersion; +} + +#if defined(__cplusplus) +} +#endif + VersionInfo::VersionInfo (uint8_t major, uint8_t minor, uint8_t patch, uint16_t flavor) : imajor(min(major, (uint8_t)9)) , iminor(min(minor, (uint8_t)99)) @@ -59,4 +89,3 @@ uint32_t VersionInfo::get () const /* a.bb.cc.ddd */ return (this->imajor * 10000000) + (this->iminor * 100000) + (this->patch * 1000) + this->flavor; } - diff --git a/DLL430_v3/include/DLL430/VersionInfo.h b/DLL430_v3/src/TI/DLL430/VersionInfo.h similarity index 79% rename from DLL430_v3/include/DLL430/VersionInfo.h rename to DLL430_v3/src/TI/DLL430/VersionInfo.h index febdd51..ccc7be4 100644 --- a/DLL430_v3/include/DLL430/VersionInfo.h +++ b/DLL430_v3/src/TI/DLL430/VersionInfo.h @@ -3,59 +3,52 @@ * * Creates string out of version number. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_VERSIONINFO_H -#define DLL430_VERSIONINFO_H -#include - -#include namespace TI { namespace DLL430 { /** \brief version information */ - class DLL430_SYMBOL VersionInfo + class VersionInfo { public: VersionInfo (uint8_t major, uint8_t minor = 0, uint8_t patch = 0, uint16_t flavor = 0); virtual ~VersionInfo (); - + /** \brief combined value of major, minor, patch level and flavor * * This combined version value is compatible to the version values of the DLLv2. @@ -64,7 +57,7 @@ namespace TI * \return the combined version value */ virtual uint32_t get () const; - + /** \brief return the major version number * * \return the major version value @@ -88,12 +81,12 @@ namespace TI * \return the flavor version value */ virtual uint16_t getFlavor () const { return this->flavor; }; - + virtual bool operator< (const VersionInfo& v) { return v.get() < this->get(); }; virtual bool operator<= (const VersionInfo& v) { return v.get() <= this->get(); }; virtual bool operator== (const VersionInfo& v) { return v.get() == this->get(); }; virtual bool operator>= (const VersionInfo& v) { return v.get() >= this->get(); }; - virtual bool operator> (const VersionInfo& v) { return v.get() > this->get(); }; + virtual bool operator> (const VersionInfo& v) { return v.get() > this->get(); }; private: uint8_t imajor; @@ -102,7 +95,5 @@ namespace TI uint16_t flavor; }; - }; -}; - -#endif /* DLL430_VERSIONINFO_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/WatchdogControl.cpp b/DLL430_v3/src/TI/DLL430/WatchdogControl.cpp index 4fc225b..7cc255c 100644 --- a/DLL430_v3/src/TI/DLL430/WatchdogControl.cpp +++ b/DLL430_v3/src/TI/DLL430/WatchdogControl.cpp @@ -3,87 +3,78 @@ * * Handles control over watchdog. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "WatchdogControl.h" using namespace TI::DLL430; -WatchdogControl::WatchdogControl (uint16_t addr) +WatchdogControl::WatchdogControl(uint16_t addr) : addr(addr) , value(0) { } -WatchdogControl::~WatchdogControl () -{ -} - -bool WatchdogControl::checkRead (uint16_t wdtCtrl) +bool WatchdogControl::checkRead(uint16_t wdtCtrl) { // watchdog password value: 0x69 for reading - return (((wdtCtrl >> 8) & 0xFF) == 0x69); + return ((wdtCtrl >> 8) & 0xFF) == 0x69; } -bool WatchdogControl::checkWrite (uint16_t wdtCtrl) +void WatchdogControl::set(uint16_t wdtCtrl) { - // watchdog password value: 0x5A for writing - return (((wdtCtrl >> 8) & 0xFF) == 0x5A); + this->value = (wdtCtrl & 0xFF); } -void WatchdogControl::set (uint16_t wdtCtrl) +uint16_t WatchdogControl::get() const { - this->value = (wdtCtrl & 0xFF); + return 0x6900 | this->value; } -uint16_t WatchdogControl::get () +void WatchdogControl::addHoldParamsTo(HalExecElement* el) const { - return (0x69 << 8 | this->value); + el->appendInputData16(this->addr); + el->appendInputData16(0x5A80); } -void WatchdogControl::addParamsTo (HalExecElement* el, bool force_hold) const +void WatchdogControl::addRestoreParamsTo(HalExecElement* el) const { - el->appendInputData16(this->addr); - uint16_t wdtCtrl = 0x5A << 8 | this->value; - // if true set the watchdog hold bit - if (force_hold) - wdtCtrl |= (1 << 7); - - el->appendInputData16(wdtCtrl); + el->appendInputData16(0x5A00 | this->value); } -uint16_t WatchdogControl::getAddress () const +uint16_t WatchdogControl::getAddress() const { return this->addr; } diff --git a/DLL430_v3/src/TI/DLL430/WatchdogControl.h b/DLL430_v3/src/TI/DLL430/WatchdogControl.h index 636c7ec..8051b2f 100644 --- a/DLL430_v3/src/TI/DLL430/WatchdogControl.h +++ b/DLL430_v3/src/TI/DLL430/WatchdogControl.h @@ -3,75 +3,68 @@ * * Handles control over watchdog. * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_WATCHDOGCONTROL_H -#define DLL430_WATCHDOGCONTROL_H -#include #include "HalExecElement.h" namespace TI { namespace DLL430 { + static const uint16_t WDT_ADDR_CPU = 0x0120; + static const uint16_t WDT_ADDR_XV2 = 0x015C; + static const uint16_t WDT_ADDR_FR41XX = 0x01CC; class WatchdogControl { public: - WatchdogControl (uint16_t addr); - ~WatchdogControl (); + explicit WatchdogControl(uint16_t addr); - static bool checkRead (uint16_t wdtCtrl); - static bool checkWrite (uint16_t wdtCtrl); - void set (uint16_t wdtCtrl); - uint16_t get (); + static bool checkRead(uint16_t wdtCtrl); + void set(uint16_t wdtCtrl); + uint16_t get() const; - /** put wdtAddr and wdtCtrl - */ - void addParamsTo (HalExecElement*, bool force_hold = false) const; - - uint16_t getAddress () const; + void addHoldParamsTo(HalExecElement*) const; + void addRestoreParamsTo(HalExecElement*) const; + + uint16_t getAddress() const; private: uint16_t addr; uint8_t value; }; - }; -}; - -#endif /* DLL430_WATCHDOGCONTROL_H */ + } +} diff --git a/DLL430_v3/src/TI/DLL430/WriteProtection.cpp b/DLL430_v3/src/TI/DLL430/WriteProtection.cpp new file mode 100644 index 0000000..ee8a0ea --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/WriteProtection.cpp @@ -0,0 +1,170 @@ +/* + * WriteProtection.cpp + * + * Copyright (C) 2007 - 2014 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. + */ + +#include + +#include "WriteProtection.h" +#include "IMemoryManager.h" + +using namespace TI::DLL430; + +WriteProtection::WriteProtection( + IMemoryManager* mm, + uint32_t Register, + uint16_t Bits, + uint16_t Mask, + uint16_t Pwd +) + : mm(mm) + , Register(Register), Bits(Bits), Mask(Mask), Pwd(Pwd) + , registerValue(0), registerBackup(0) +{} + +bool WriteProtection::disableIfEnabled() +{ + //Must not read again without restoring first + if (registerBackup != registerValue) + { + return false; + } + if (!readSettings()) + { + return false; + } + return (registerValue & Bits) ? disable() : true; +} + +void WriteProtection::restore() +{ + if (registerBackup != registerValue) + { + if (MemoryArea* peripheral = mm->getMemoryArea(MemoryArea::Peripheral16bit, 0)) + { + if (peripheral->write(Register - peripheral->getStart(), registerBackup) && peripheral->sync()) + { + registerValue = registerBackup; + } + } + } +} + +bool WriteProtection::isEnabled() +{ + readSettings(); + return (registerValue & Bits) ? true : false; +} + +bool WriteProtection::readSettings() +{ + bool success = false; + + if (MemoryArea* peripheral = mm->getMemoryArea(MemoryArea::Peripheral16bit, 0)) + { + uint8_t buffer[2] = { 0 }; + success = peripheral->read(Register - peripheral->getStart(), buffer, 2) && peripheral->sync(); + if (success) + { + registerValue = (buffer[0] + (buffer[1] << 8)) & 0xFFFF; + + //Replace pwd read value with write value + if (Pwd != 0) + { + registerValue = (registerValue & Mask) | Pwd; + } + registerBackup = registerValue; + } + } + return success; +} + +bool WriteProtection::disable() +{ + bool success = false; + + if (MemoryArea* peripheral = mm->getMemoryArea(MemoryArea::Peripheral16bit, 0)) + { + const uint16_t newRegisterValue = (registerValue & ~Bits); + success = peripheral->write(Register - peripheral->getStart(), newRegisterValue) && peripheral->sync(); + if (success) + { + registerValue = newRegisterValue; + } + } + return success; +} + +WriteProtection432::WriteProtection432( + IMemoryManager* mm, + uint32_t Register, + uint16_t Bits, + uint16_t Mask, + uint16_t Pwd, + uint32_t unlockAddr + ) + : mm(mm) + , Register(Register), Bits(Bits), Mask(Mask), Pwd(Pwd), Value(0), unlockAddress(unlockAddr) +{ + +} + +bool WriteProtection432::readSettings() +{ + bool success = false; + + if (MemoryArea* eem = mm->getMemoryArea(MemoryArea::Eem, 0)) + { + success = eem->write(unlockAddress - eem->getStart(), Pwd) && eem->sync(); + if (!success) + { + return false; + } + + uint8_t buffer[2] = { 0 }; + success = eem->read(Register - eem->getStart(), buffer, 2) && eem->sync(); + if (success) + { + Value = (buffer[0] + (buffer[1] << 8)) & Mask; + } + } + return success; +} + +bool WriteProtection432::isEnabled() +{ + if (!readSettings()) + return false; + + return (Value & Bits) ? true : false; +} diff --git a/DLL430_v3/src/TI/DLL430/WriteProtection.h b/DLL430_v3/src/TI/DLL430/WriteProtection.h new file mode 100644 index 0000000..6b21a8c --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/WriteProtection.h @@ -0,0 +1,125 @@ +/* + * WriteProtection.h + * + * Copyright (C) 2007 - 2014 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. + */ + +#pragma once + + +namespace TI +{ + namespace DLL430 + { + + class IMemoryManager; + + class IWriteProtection + { + public: + virtual ~IWriteProtection() {} + virtual bool disableIfEnabled() = 0; + virtual void restore() = 0; + virtual bool isEnabled() = 0; + }; + + + class NoWriteProtection : public IWriteProtection + { + public: + explicit NoWriteProtection(IMemoryManager* mm) {} + bool disableIfEnabled() { return true; } + void restore() { return; } + bool isEnabled() { return false; } + }; + + class WriteProtection : public IWriteProtection + { + public: + WriteProtection( + IMemoryManager* mm, + uint32_t Register, + uint16_t Bits, + uint16_t Mask = 0xFFFF, + uint16_t Pwd = 0x0 + ); + + bool disableIfEnabled(); + void restore(); + bool isEnabled(); + + private: + bool readSettings(); + + bool disable(); + + IMemoryManager* mm; + + const uint32_t Register; + const uint16_t Bits; + const uint16_t Mask; + const uint16_t Pwd; + + uint16_t registerValue; + uint16_t registerBackup; + }; + + class WriteProtection432: public IWriteProtection + { + public: + WriteProtection432( + IMemoryManager* mm, + uint32_t Register, + uint16_t Bits, + uint16_t Mask = 0xFFFF, + uint16_t Pwd = 0x0, + uint32_t unlockAddr = 0x0 + ); + + virtual ~WriteProtection432() {} + bool disableIfEnabled() { return true; } + void restore() { return; } + bool isEnabled(); + + private: + bool readSettings(); + + IMemoryManager* mm; + const uint32_t Register; + const uint32_t unlockAddress; + const uint16_t Bits; + const uint16_t Mask; + const uint16_t Pwd; + uint16_t Value; + }; + }; +}; diff --git a/DLL430_v3/src/TI/DLL430/logging/Logging.cpp b/DLL430_v3/src/TI/DLL430/logging/Logging.cpp index 9b2cafa..22b367f 100644 --- a/DLL430_v3/src/TI/DLL430/logging/Logging.cpp +++ b/DLL430_v3/src/TI/DLL430/logging/Logging.cpp @@ -1,40 +1,46 @@ /* * Logging.cpp * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + +#include +#include + #include "Logging.h" -#include + +#ifdef DB_PRINT //#define USE_STDOUT @@ -46,7 +52,7 @@ Debug& TI::DLL430::Logging::DefaultLogger() return defaultLogger; } -Debug::Debug() +Debug::Debug() : filePtr(stdout) { #ifndef USE_STDOUT @@ -57,18 +63,18 @@ Debug::Debug() fprintf(stderr, "File could not be opened\n!"); } -Debug::~Debug() +Debug::~Debug() { if (filePtr) fclose(filePtr); } -void Debug::PrintSendBuffer(const uint8_t *buf, long size) +void Debug::PrintSendBuffer(const uint8_t *buf, long size) { PrintBuffer(buf, size, "send:"); } -void Debug::PrintReceiveBuffer(const uint8_t *buf, long size) +void Debug::PrintReceiveBuffer(const uint8_t *buf, long size) { PrintBuffer(buf, size, "receive:"); } @@ -77,10 +83,20 @@ void Debug::PrintBuffer(const uint8_t *buf, long size, const char *direction) { if (filePtr) { - std::stringstream sstr; + const auto now = std::chrono::system_clock::now(); + const auto timeNow = std::chrono::system_clock::to_time_t(now); + const auto lt = std::localtime(&timeNow); + const auto usSinceEpoch = std::chrono::duration_cast(now.time_since_epoch()).count(); + + static const char* monthNames[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - sstr << "\n" << boost::posix_time::microsec_clock::local_time() << " " - << direction << std::endl << "[" << std::hex; + std::stringstream sstr; + sstr << std::setfill('0') << "\n" + << (1900 + lt->tm_year) << '-' << monthNames[lt->tm_mon % 12] << '-' << std::setw(2) << lt->tm_mday << ' ' + << std::setw(2) << lt->tm_hour << ':' << std::setw(2) << lt->tm_min << ':' << std::setw(2) << lt->tm_sec << '.' + << std::setw(6) << (usSinceEpoch % 1000000) << " " + << direction << " " << std::this_thread::get_id() + << std::endl << "[" << std::hex; for (long i = 0 ; i < size; ++i) { @@ -93,3 +109,5 @@ void Debug::PrintBuffer(const uint8_t *buf, long size, const char *direction) fflush(filePtr); } } + +#endif diff --git a/DLL430_v3/src/TI/DLL430/logging/Logging.h b/DLL430_v3/src/TI/DLL430/logging/Logging.h index 191241d..9623571 100644 --- a/DLL430_v3/src/TI/DLL430/logging/Logging.h +++ b/DLL430_v3/src/TI/DLL430/logging/Logging.h @@ -1,52 +1,43 @@ /* * Logging.h * - * Copyright (C) 2007 - 2011 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 + * Copyright (C) 2007 - 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#if _MSC_VER > 1000 + #pragma once -#endif -#ifndef DLL430_LOGGING_H -#define DLL430_LOGGING_H -#ifdef _MSC_VER -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS //disabling warnings to use secure c-function versions (e.g. strcpy_s) as not compatible none MS development +#ifndef NDEBUG +#define DB_PRINT #endif -#endif - -#include -#include namespace TI { @@ -58,7 +49,7 @@ namespace TI public: void PrintSendBuffer(const uint8_t *buf, long size); void PrintReceiveBuffer(const uint8_t *buf, long size); - + Debug(); ~Debug(); private: @@ -70,5 +61,3 @@ namespace TI } } } - -#endif /* DLL430_LOGGING_H */ diff --git a/DLL430_v3/src/TI/DLL430/pch.cpp b/DLL430_v3/src/TI/DLL430/pch.cpp new file mode 100644 index 0000000..c67b815 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/pch.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2013 - 2014 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. + */ + +#include diff --git a/DLL430_v3/src/TI/DLL430/pch.h b/DLL430_v3/src/TI/DLL430/pch.h new file mode 100644 index 0000000..eaa8194 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/pch.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2013 - 2014 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. + */ + +#if defined(_WIN32) || defined(_WIN64) +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN +#define NOMINMAX +#include + +#define OVERRIDE override +#else +#define OVERRIDE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + diff --git a/DLL430_v3/src/TI/DLL430/warnings/Warnings.cpp b/DLL430_v3/src/TI/DLL430/warnings/Warnings.cpp new file mode 100644 index 0000000..e521aad --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/warnings/Warnings.cpp @@ -0,0 +1,70 @@ +/* + * Warnings.cpp + * + * Copyright (C) 2017 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. + */ + +#include +#include "Warnings.h" +#include "MSP430.h" +#include + +using namespace TI::DLL430; + +Warning* WarningFactory::instance() +{ + static Warning instance; + return &instance; +} + +Warning::Warning() : _callback(nullptr) +{ + +} + +bool Warning::RegisterMessageCallback(MessageCallbackFn callback) +{ + boost::lock_guard lock(_mutex); + _callback = callback; + return true; +} + +void Warning::message(MESSAGE_LEVEL_T level, const char *str) +{ + static std::string msg; + boost::lock_guard lock(_mutex); + msg = str; + if (_callback != nullptr) + { + _callback(level, msg.c_str()); + } +} \ No newline at end of file diff --git a/DLL430_v3/src/TI/DLL430/warnings/Warnings.h b/DLL430_v3/src/TI/DLL430/warnings/Warnings.h new file mode 100644 index 0000000..8f8d061 --- /dev/null +++ b/DLL430_v3/src/TI/DLL430/warnings/Warnings.h @@ -0,0 +1,76 @@ +/* + * Warnings.h + * + * Copyright (C) 2017 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. + */ + +#pragma once +#include +#include "MSP430.h" + +namespace TI +{ + namespace DLL430 + { + + namespace WarningCode + { + const char WARNING_IP_PROTECTION[] = "IP protection is enabled on the device. Not all flash memory locations may be readable or writable"; + const char WARNING_FLASH_VCC[] = "Target device supply voltage is too low for Flash erase/programming"; + const char WARNING_LDO_SUPPLY[] = "On-board LDO is now used to supply the target with power"; + const char WARNING_DCDC_SUPPLY[] = "On-board DCDC logic is now used to supply the target with power"; + }; + + class Warning + { + public: + Warning(); + bool RegisterMessageCallback(MessageCallbackFn callback); + void message(MESSAGE_LEVEL_T level, const char *str); + private: + Warning(const Warning&) {} + Warning& operator =(const Warning&) { return *this; } + MessageCallbackFn _callback; + boost::mutex _mutex; + }; + + class WarningFactory + { + public: + static Warning* instance(); + private: + WarningFactory() {} + WarningFactory(const WarningFactory&) {} + WarningFactory& operator =(const WarningFactory&) { return *this; } + }; + } +} diff --git a/DLL430_v3/version.h b/DLL430_v3/version.h index 7e59e9d..15c63a0 100644 --- a/DLL430_v3/version.h +++ b/DLL430_v3/version.h @@ -3,44 +3,41 @@ * * Holds Version number. * - * Copyright (C) 2011 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 + * Copyright (C) 2011 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 + * 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 + * 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 + * 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 + * 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. + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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 DLL430_VERSION_H -#define DLL430_VERSION_H +#pragma once #define VERSION_MAJOR 3 -#define VERSION_MINOR 2 -#define VERSION_PATCH 5 -#define VERSION_BUILD 4 - -#endif +#define VERSION_MINOR 15 +#define VERSION_PATCH 1 +#define VERSION_BUILD 1 diff --git a/MSPDebugStackOpenSourcePackage_manifest.html b/MSPDebugStackOpenSourcePackage_manifest.html new file mode 100644 index 0000000..db1f86d --- /dev/null +++ b/MSPDebugStackOpenSourcePackage_manifest.html @@ -0,0 +1,653 @@ + + + + + + + + + + + Manifest File + + + + + +
+
+ +
+ +
+
+ +

+MSP Debug Stack Open Source Package Manifest +

+ +

+2020-16-04 +

+ +

+Manifest ID - SRAS00007162 +

+ +
+ +

Legend

+

(explanation of the fields in the Manifest Table below)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Software Name + +The name of the application or file +
+Version + +Version of the application or file +
+License Type + +Type of license(s) under which TI will be providing + +software to the licensee (e.g. BSD-3-Clause, GPL-2.0, TI TSPA License, TI + +Commercial License). The license could be under Commercial terms or Open Source. See Open Source Reference License Disclaimer in + +the Disclaimers Section. Whenever possible, TI will use an SPDX Short Identifier for an Open Source + +License. TI Commercial license terms are not usually included in the manifest and are conveyed through a variety + +of means such as a clickwrap license upon install, + +a signed license agreement and so forth. +
+Location + +The directory name and path on the media or a specific file where the Software is located. Typically fully qualified path names + +are not used and instead the relevant top level directory of the application is given. + +A notation often used in the manifests is [as installed]/directory/*. Note that the asterisk implies that all + +files under that directory are licensed as the License Type field denotes. Any exceptions to this will + +generally be denoted as [as installed]/directory/* except as noted below which means as shown in subsequent rows of + +the manifest. +
+Delivered As + +This field will either be “Source”, “Binary” or “Source + +and Binary” and is the primary form the content of the Software is delivered + +in. If the Software is delivered in an archive format, this field + +applies to the contents of the archive. If the word Limited is used + +with Source, as in “Limited Source” or “Limited Source and Binary” then + +only portions of the Source for the application are provided. +
+Modified by TI + +This field will either be “Yes” or “No”. A “Yes” means + +TI has made changes to the Software. A “No” means TI has not made any + +changes. Note: This field is not applicable for Software “Obtained + +from” TI. +
+Obtained from + +This field specifies from where or from whom TI obtained + +the Software. It may be a URL to an Open Source site, a 3rd + +party licensor, or TI. See Links Disclaimer in the Disclaimers + +Section. +
+ +
+ +

Disclaimers

+ +

Export Control Classification Number (ECCN)

+ +

Any use of ECCNs listed in the Manifest is at the user’s risk + +and without recourse to TI. Your + +company, as the exporter of record, is responsible for determining the + +correct classification of any item at + +the time of export. Any export classification by TI of Software is for + +TI’s internal use only and shall not be construed as a representation + +or warranty + +regarding the proper export classification for such Software or whether + +an export + +license or other documentation is required for exporting such Software

+ +

Links in the Manifest

+ +

Any + +links appearing on this Manifest + +(for example in the “Obtained from” field) were verified at the time + +the Manifest was created. TI makes no guarantee that any listed links + +will + +remain active in the future.

+ +

Open Source License References

+ +

Your company is responsible for confirming the + +applicable license terms for any open source Software + +listed in this Manifest that was not “Obtained from” TI. Any open + +source license + +specified in this Manifest for Software that was + +not “Obtained from” TI is for TI’s internal use only and shall not be + +construed as a representation or warranty regarding the proper open + +source license terms + +for such Software.

+ + +

Export Information

+ +

ECCN for Software included in this release:

+Publicly Available + +
+ + + + + + + +

+ MSP Debug Stack Open Source Package Manifest Table +

+ +

+ See the Legend above for a description of these columns. +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Software NameVersionLicense TypeDelivered AsModified by TI
+ MSP Debug Stack Open Source Package + + 3.15.1.x + + TI Text File, BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\DLL430_v3 +
Obtained from + Texas Instruments +
+ EnergyTrace + + 3.15.1.x + + TI Text File + + Source + + N/A + Location + MSP Debug Stack OS Package\DLL430_v3\src\TI\DLL430\EnergyTrace_TSPA +
Obtained from + Texas Instruments +
+ UIF Firmware + + 0x16 + + BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Bios +
Obtained from + Texas Instruments +
+ eZ-FET Firmware + + 0x1B + + TI Text File, BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Bios +
Obtained from + Texas Instruments +
+ MSP-FET Firmware + + 0x1B + + TI Text File, BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Bios +
Obtained from + Texas Instruments +
+ BSL430_DLL + + N/A + + BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Third Party\BSL430_DLL +
Obtained from + Texas Instruments +
+ BSL430 Firmware + + 0x40 + + BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Third Party\BSL430_Firmware +
Obtained from + Texas Instruments +
+ C Startup Code + + 5271 + + IAR BSD + + Source + + YES + Location + MSP Debug Stack OS Package\Bios\src\dcdc\cstartup_dcdc.s43 +MSP Debug Stack OS Package\Bios\src\hil\ez_fet\cstartup_hil.s43 +MSP Debug Stack OS Package\Bios\src\hil\msp_fet\cstartup_hil.s43 +MSP Debug Stack OS Package\Bios\src\uart\cstartup_uart.s43 +MSP Debug Stack OS Package\Bios\src\fw\fet\cstartup.s43 +MSP Debug Stack OS Package\Bios\src\fw\uifv1\cstartup.s43 +MSP Debug Stack OS Package\Bios\src\fpga_update\cstartup_fpgaUpdate.s43 +
Obtained from + IAR Systems AB +
+ F5xx_F6xx Core Lib Code + + 2.0 + + BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Bios\src\fw\fet\F5xx_F6xx-Core_Lib +
Obtained from + Texas Instruments +
+ USB API + + 1.00 + + BSD-3-Clause + + Source + + N/A + Location + MSP Debug Stack OS Package\Bios\src\fw\fet\USB_API +MSP Debug Stack OS Package\Bios\src\fw\fet\USB_config +
Obtained from + Texas Instruments +
+ pugixml + + 1.7 + + MIT + + Binary + + No + Location + MSP Debug Stack OS Package\Third Party\src\pugixml.cpp +MSP Debug Stack OS Package\Third Party\include\pugixml.hpp +
Obtained from + Pugixml +(http://pugixml.org/) +
+ tinfl + + 1.11 + + unlicense + + Binary + + No + Location + MSP Debug Stack OS Package\Third Party\include\tinfl.c +
Obtained from + Github +(https://github.com/richgel999/miniz) +
+

+ 1 Any links appearing on this manifest were verified at the time it was created. TI makes no guarantee that they will remain active in the future.
+

+

+

+

+ + +

+ +

Credits

+ + + +
+ +

Licenses

+
+

+ MSP Debug Stack Open Source Package Licenses +


+
C Startup Code license
-----------------------------------------------------------------------------------------------------------

/* --------------------------------------------------------------------------
* Copyright 2012, IAR Systems AB.
*
* This source code is the property of IAR Systems. The source code may only
* be used together with the IAR Embedded Workbench. Redistribution and use
* in source and binary forms, with or without modification, is permitted
* provided that the following conditions are met:
*
* - Redistributions of source code, in whole or in part, must retain the
* above copyright notice, this list of conditions and the disclaimer below.
*
* - IAR Systems name may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* ------------------------------------------------------------------------*/








MSP Debug Stack Open Source Package license (components marked with BSD-3-CLAUSE)
-----------------------------------------------------------------------------------------------------------

Copyright (c) 2016, Texas Instruments
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



MSP Debug Stack Open Source Package (components marked with TI Text File)
-----------------------------------------------------------------------------------------------------------

Copyright (c) 2016 Texas Instruments Incorporated - http://www.ti.com/
All rights reserved not granted herein.
Limited License.

Texas Instruments Incorporated grants a world-wide, royalty-free,
non-exclusive license under copyrights and patents it now or hereafter
owns or controls to make, have made, use, import, offer to sell and sell ("Utilize")
this software subject to the terms herein. With respect to the foregoing patent
license, such license is granted solely to the extent that any such patent is necessary
to Utilize the software alone. The patent license shall not apply to any combinations which
include this software, other than combinations with devices manufactured by or for TI ("TI Devices").
No hardware patent is licensed hereunder.

Redistributions must preserve existing copyright notices and reproduce this license (including the
above copyright notice and the disclaimer and (if applicable) source code license limitations below)
in the documentation and/or other materials provided with the distribution

Redistribution and use in binary form, without modification, are permitted provided that the following
conditions are met:

* No reverse engineering, decompilation, or disassembly of this software is permitted with respect to any
software provided in binary form.
* any redistribution and use are licensed by TI for use only with TI Devices.
* Nothing shall obligate TI to provide you with source code for the software licensed and provided to you in object code.

If software source code is provided to you, modification and redistribution of the source code are permitted
provided that the following conditions are met:

* any redistribution and use of the source code, including any resulting derivative works, are licensed by TI for use only with TI Devices.
* any redistribution and use of any object code compiled from the source code and any resulting derivative works, are licensed by TI for use only with TI Devices.

Neither the name of Texas Instruments Incorporated nor the names of its suppliers may be used to endorse or
promote products derived from this software without specific prior written permission.

DISCLAIMER.

THIS SOFTWARE IS PROVIDED BY TI AND TI"S LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL TI AND TI"S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.



















pugixml license
-----------------------------------------------------------------------------------------------------------

Copyright (c) 2006-2015 Arseny Kapoulkine
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.















Tinfl license
-----------------------------------------------------------------------------------------------------------


This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

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 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.

For more information, please refer to

+
+ + +
+ +
+

TI is a global semiconductor design and manufacturing company. Innovate + + with 100,000+ analog ICs and embedded processors, along with software, tools + + and the industry's largest sales/support staff.

+
+ + diff --git a/Makefile b/Makefile index 8bfba83..3225310 100644 --- a/Makefile +++ b/Makefile @@ -1,74 +1,151 @@ -CXX:= g++ - -DEFINES := -DUNIX - -CXXFLAGS := -fPIC -BOOST_DIR := $(PWD)/../boost_1_51_0 -#CXXFLAGS := -fPIC -m32 - -ifdef DEBUG -CXXFLAGS += -g -O0 -else -CXXFLAGS += -Os -DEFINES += -DNDEBUG -endif - -INCLUDES := \ - -I./Bios/include \ - -I./HalObjectDb/include \ - -I./DLL430_v3/include \ - -I./DLL430_v3/include/DLL430 \ - -I./DLL430_v3/src \ - -I./DLL430_v3/src/TI/DLL430 - -LIBDIRS := - - -ifdef BOOST_DIR -INCLUDES += -I$(BOOST_DIR) -LIBDIRS += -L$(BOOST_DIR)/stage/lib -endif - -LIBS := -lboost_thread -lboost_filesystem -lboost_date_time -lboost_system - -SRC := \ - ./HalObjectDb/src/HalObjectDb.cpp \ - ./DLL430_v3/src/DLL430v3_OS_capi.cpp \ - ./DLL430_v3/src/DLL430_plugin.cpp \ - ./DLL430_v3/src/DLL430_OldApiV3.cpp \ - ./DLL430_v3/src/TI/DLL430/EEM/CycleCounter.cpp \ - $(wildcard ./DLL430_v3/src/TI/DLL430/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/BreakpointManager/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/CycleCounter/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/EemRegisters/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/EmulationManager/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Exceptions/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Sequencer/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/StateStorage430/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Trace/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Trigger/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/TriggerCondition/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/TriggerManager/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/EM/VariableWatch/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/logging/*.cpp) \ - $(wildcard ./DLL430_v3/src/TI/DLL430/TemplateDeviceDb/*.cpp) - -OBJS := $(patsubst %.cpp, %.o, $(SRC)) - -OUTPUT := libmsp430.so - -all: $(OBJS) -# $(CXX) $(CXXFLAGS) -shared -Wl,-soname,$(OUTPUT) -o $(OUTPUT) $(OBJS) $(LIBDIRS) -Wl,-Bstatic $(LIBS) -Wl,-Bdynamic -lpthread - $(CXX) $(CXXFLAGS) -shared -Wl,-soname,$(OUTPUT) -o $(OUTPUT) $(OBJS) $(LIBDIRS) -Wl,$(LIBS) -Wl,-Bdynamic -lpthread - -%.o: %.cpp - $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES) $(DEFINES) - -install: - cp $(OUTPUT) /usr/lib/ - -clean: - @for i in $(OBJS); do rm -f $$i; done - @rm -f build.log - - +CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden + +PCH_HEADER := ./DLL430_v3/src/TI/DLL430/pch.h +PCH_COMPILED := ./DLL430_v3/src/TI/DLL430/pch.h.gch + +DEFINES := -DUNIX + +ifdef DEBUG +CXXFLAGS += -g -O0 +else +CXXFLAGS += -Os +DEFINES += -DNDEBUG +endif + +MAKE_PCH += -x c++-header +USE_PCH += -include $(PCH_HEADER) + +export BOOST_DIR +export STATIC +export DEBUG + +INCLUDES := \ + -I./DLL430_v3/src/TI/DLL430 \ + -I./DLL430_v3/include \ + -I./DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA \ + -I./Bios/include \ + -I./ThirdParty/include \ + -I./ThirdParty/BSL430_DLL + + +LIBS := +STATIC_LIBS := + +ifdef STATIC +STATIC_LIBS += -lboost_filesystem -lboost_system -lbsl430 -lboost_date_time -lboost_chrono -lboost_thread +else +LIBS += -lboost_filesystem -lbsl430 -lboost_date_time -lboost_chrono -lboost_thread +endif + +LIBTHIRD := ./ThirdParty/lib64 +LIBDIRS := -L$(LIBTHIRD) + +UNAME_M := $(shell uname -m) +PLATFORM := $(shell uname -s) +ifeq ($(PLATFORM),Linux) + CXX:= g++ + + STATICOUTPUT := linux64 + + OUTPUT := libmsp430.so + DEFINES += -DUNIX + + ifdef STATIC + STATIC_LIBS += -lusb-1.0 + else + LIBS += -lusb-1.0 + endif + + LIBS += -lusb-1.0 -lrt -lpthread + + ifdef BOOST_DIR + INCLUDES += -I$(BOOST_DIR) + LIBDIRS += -L$(BOOST_DIR)/stage/lib + endif + + OUTNAME := -Wl,-soname, + BSTATIC := -Wl,-Bstatic + BDYNAMIC := -Wl,-Bdynamic + + ifeq ($(UNAME_M), aarch64) + LIBS += -L/usr/local/lib/cmake/boost_system-1.92.0 -lhidapi-libusb + else + LIBS += -lboost_system + HIDOBJ := $(LIBTHIRD)/hid-libusb.o + endif +else + CXX:= clang++ + + OUTPUT := libmsp430.dylib + STATICOUTPUT := mac64 + + ifdef STATIC + STATIC_LIBS += -framework CoreFoundation -framework IOKit -lhidapi + else + LIBS += -framework CoreFoundation -framework IOKit -lhidapi + endif + + ifdef BOOST_DIR + INCLUDES += -I$(BOOST_DIR)/include + LIBDIRS += -L$(BOOST_DIR)/lib + endif + + OUTNAME := -install_name + BSTATIC := + BDYNAMIC := + + HIDOBJ := +endif + + +BSLLIB := $(LIBTHIRD)/libbsl430.a + + +SRC := \ + ./DLL430_v3/src/TI/DLL430/EEM/CycleCounter.cpp \ + $(wildcard ./DLL430_v3/src/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/BreakpointManager/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/CycleCounter/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/EemRegisters/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/EmulationManager/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Exceptions/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Sequencer/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/SoftwareBreakpoints/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/StateStorage430/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Trace/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/Trigger/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/TriggerCondition/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/TriggerManager/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EM/VariableWatch/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/EnergyTrace_TSPA/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/logging/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/TemplateDeviceDb/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/DeviceDb/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/MSP432/*.cpp) \ + $(wildcard ./DLL430_v3/src/TI/DLL430/warnings/*.cpp) \ + $(wildcard ./ThirdParty/src/*.cpp) + +OBJS := $(patsubst %.cpp, %.o, $(SRC)) + +all: $(BSLLIB) $(OBJS) + $(CXX) $(CXXFLAGS) -shared $(OUTNAME)$(OUTPUT) -o $(OUTPUT) $(OBJS) $(HIDOBJ) $(LIBDIRS) $(BSTATIC) $(STATIC_LIBS) $(BDYNAMIC) $(LIBS) + rm -f $(STATICOUTPUT).a + ar -rs $(STATICOUTPUT).a $(OBJS) + +$(PCH_COMPILED): $(PCH_HEADER) + $(CXX) $(MAKE_PCH) -o $@ $< $(CXXFLAGS) $(INCLUDES) $(DEFINES) + +%.o: %.cpp $(PCH_COMPILED) + $(CXX) -c -o $@ $< $(USE_PCH) $(CXXFLAGS) $(INCLUDES) $(DEFINES) + +$(BSLLIB): + $(MAKE) -C ./ThirdParty/BSL430_DLL + +install: + cp $(OUTPUT) /usr/local/lib/ + +clean: + $(MAKE) -C ./ThirdParty/BSL430_DLL clean + @for i in $(OBJS); do rm -f $$i; done + @rm -f $(PCH_HEADER).?ch build.log diff --git a/README-BUILD.txt b/README-BUILD.txt new file mode 100644 index 0000000..47eb156 --- /dev/null +++ b/README-BUILD.txt @@ -0,0 +1,169 @@ +Building MSPDebugStack +====================== + +1. Windows +---------- + +1.1 Development environment +--------------------------- + +* You will need to have Microsoft Visual Studio 2017 installed. +* You will need to have a IAR EW430 5.51 or later installed if you want to + build the firmware or BSL. + + +1.2. Dependencies +----------------- + +In order to compile msp430.dll with MSVC you will need: + +* boost + -Download and build (http://www.boost.org) + -Visual Studio users can get pre-built boost binaries from + http://sourceforge.net/projects/boost/files/boost-binaries/ + -Version used in official build is 1.67 + -Only libboost_system-xxx.lib is required + -Visual Studio must be configured to find boost headers and libs + +* hidapi + -Download and build (https://github.com/signal11/hidapi/releases) + -Version used in official build is 0.8.0-rc1 + -hidapi.h must be copied to ThirdParty\include + -hidapi.lib must be copied to ThirdParty\lib + + +To compile the firmware and/or BSL with IAR EW430, the following tools are required: + +* srecord + -Download from http://sourceforge.net/projects/srecord/files/srecord-win32 + -Version used in official build is 1.59 + -srec_cat.exe must be copied to Bios\tools + +* sed + -Any Windows port, for example from http://sourceforge.net/projects/unxutils + -sed.exe must be copied to Bios\tools + + +1.3.1 Building the firmware (optional) +-------------------------------------- + +* Build all projects in Bios\bios_core.eww + +* Build all projects in Bios\eZ_FET_Bios.eww + -Make sure eZ_FET configuration is selected for all projects + +* Build all projects in Bios\MSP-FET_Bios.eww + -Make sure MSP_FET configuration is selected for all projects + +NOTE: Due to the license of DirectC, the required DirectC source is not part + of the OS package and the depending project MSP-FET_FpgaUpdate.ewp is not + built by default. + + To build the MSP-FET_FpgaUpdate project, please download DirectC 2.7 from + http://www.actel.com/download/program_debug/directc/dc27.aspx + and copy the sources to MSPDebugStack/Bios/src/fpga_update/DirectC. See + the README.txt in this directory for details. + + +1.3.2 Building the BSL (optional) +--------------------------------- + +* Build all project configurations in ThirdParty\BSL430_Firmware\BSL.eww + + +1.3.3 Building the DLL +---------------------- + +* Build BSL430_DLL.sln in ThirdParty\BSL430_DLL + +* Build DLL430_v3.sln + +NOTE: Due to the license of DirectC, there is no image for the FPGA update + included in the OS package. To build this image, please refer to 1.3.1. + + + To enable the FPGA update, comment in the line "#define FPGA_UPDATE" in + MSPDebugStack/DLL430_v3/src/TI/DLL430/UpdateManagerFet.cpp. + + +2. Linux +-------- + +2.1 Development environment +--------------------------- + +* You will need the GNU tool chain (GCC 4.8.4 or higher) to use the existing Makefile. + + +2.2. Dependencies +----------------- + +In order to compile the libmsp430.so with GCC you will need: + +* boost + -Download from http://www.boost.org + -Version used in official build is 1.67 + -Only libboost_system.a/so and libboost_filesystem.a/so are required + +* hidapi + -Download and build (https://github.com/signal11/hidapi/releases) + -Version used in official build is 0.8.0-rc1 + -The MSPDebugStack project assumes hidapi being built against libusb-1.0 + (the default used in the Makefile coming with hidapi 0.8.0-rc1) + -hidapi.h must be copied to ThirdParty\include + -hid-libusb.o must be copied to ThirdParty\lib + + +2.3 Building the shared object +------------------------------ + +* run "make STATIC=1" in MSPDebugStack + -If boost is not globally installed, use "make BOOST_DIR=". + The makefile assumes headers in boost/ and libraries in stage/lib/ of the + specified directory. + + -Linking dependencies statically (STATIC=1) is advised if the library will + be copied between machines. A 64bit build is required for use + with existing IDEs. + + +3. OSX +-------- + +2.1 Development environment +--------------------------- + +You will need Clang/LLVM to use the existing Makefile. + +2.2. Dependencies +----------------- + +In order to compile libmsp430.dylib with Clang you will need: + +* boost + -Download from http://www.boost.org + -Version used in official build is 1.67 + -Only libboost_system.a/dylib and libboost_filesystem.a/dylib are required + +* hidapi + -Download and build (https://github.com/signal11/hidapi/releases) + -Version used in official build is 0.8.0-rc1 + -The MSPDebugStack project assumes hidapi being built against libusb-1.0 + (the default used in the Makefile coming with hidapi 0.8.0-rc1) + -hidapi.h must be copied to ThirdParty\include + -libhidapi.a must be copied to ThirdParty\lib64 + + +2.3 Building the shared object +------------------------------ + +2.3 Building the shared object +------------------------------ + +* run "make STATIC=1" in MSPDebugStack + -If boost is not globally installed, use "make BOOST_DIR=". + The makefile assumes headers in include/boost and libraries in lib/ of the + specified directory. + + -Linking dependencies statically (STATIC=1) is advised if the library will + be copied between machines. diff --git a/README.md b/README.md index fb94b18..e701c62 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # About -libMSP430 is a friendly fork-and-fix of the canonocal TI 'MSP430DLLv3' for linux, +libmsp430 is a friendly fork-and-fix of the canonocal TI 'MSP430DLLv3' for linux, which is previously only available as a zip file with a hard to find patch for Debian/Ubuntu. @@ -7,23 +7,26 @@ When trying to use mspdebug using the 'tilib' option on my persoan Linux box, I could not find a working zip of 'MSP430DLLv3' to build, so I collected the patches and posted them in this repo to share. +In this fork of the fork, I manually applied the patches found [here](https://github.com/BuLogics/libMSP430/pull/2) and [here](https://github.com/grahame-student/build_mspdebug/blob/main/libboost-1.74.patch) in addition to some fighting with the remaining compiler error for a few minutes. I then had to updated the codebase to match the upstream version of the source to allow it to work with my specific microcontroller. + # Branches master : our patched branch of MSP430DLLv3 -# instructions +# Instructions 0. check out this repository 1. run './ubuntu_install_prereqes.sh' 2. run ' mspdebug tilib -d /dev/ttyACM0' (assuming your ti device is on ACM0) and verify you have an error loading 'libmsp430.so' on your machine - 3. run 'make' If you are lucky, this should *just work* - 4. run 'make install' to install the driver, so mspdebug can find the lib - 5. Plug in a MSP-FET430UIF device into your machine - 6. run ' mspdebug tilib -d /dev/ttyACM0' (assuming your ti device is on ACM0) + 3. run 'make' If you are lucky, this should *just work* + - NOTE: I ran into a problem building this on my Ubuntu ARM64 machine because it does not package `libboost-system`. If this is also your case, run the `build-boost.sh` script to build and install `libboost-system` to link against + 5. run 'make install' to install the driver, so mspdebug can find the lib + 6. Plug in a MSP-FET430UIF device into your machine + 7. run ' mspdebug tilib -d /dev/ttyACM0' (assuming your ti device is on ACM0) it should work now. -#See Also: +# See Also: - Unnamed TI employee post/patch: : http://e2e.ti.com/support/microcontrollers/msp430/f/166/p/214038/756939.aspx - This mspdebug linux install info: diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL.sln b/ThirdParty/BSL430_DLL/BSL430_DLL.sln new file mode 100644 index 0000000..af99997 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2013 for Windows Desktop +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BSL430_DLL", "BSL430_DLL\BSL430_DLL.vcxproj", "{C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Debug|Win32.Build.0 = Debug|Win32 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Debug|x64.ActiveCfg = Debug|x64 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Debug|x64.Build.0 = Debug|x64 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Release|Win32.ActiveCfg = Release|Win32 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Release|Win32.Build.0 = Release|Win32 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Release|x64.ActiveCfg = Release|x64 + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/BSL430_DLL.vcxproj b/ThirdParty/BSL430_DLL/BSL430_DLL/BSL430_DLL.vcxproj new file mode 100644 index 0000000..7df1e8f --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/BSL430_DLL.vcxproj @@ -0,0 +1,285 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {C57AA8C3-1C6E-4F1A-9E65-8A3BFC896D7A} + Win32Proj + BSL430_DLL + 10.0.17763.0 + + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + false + MultiByte + v141 + + + StaticLibrary + false + MultiByte + v141 + + + + + + + + + + + + + + + + + + + $(LibraryPath) + .lib + $(IncludePath) + $(ProjectName)d + ..\..\lib\ + ..\$(Configuration)\ + + + $(LibraryPath) + .lib + $(IncludePath) + $(ProjectName)d + ..\..\lib64\ + + + $(LibraryPath) + .lib + $(IncludePath) + ..\..\lib\ + ..\$(Configuration)\ + + + $(LibraryPath) + .lib + $(IncludePath) + ..\..\lib64\ + + + + Use + Level3 + Disabled + _WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + Utility_Classes;Physical_Interfaces;Packet_Handlers;Connections;BSL430_DLL;..\..\include;s:\boost_1_67_0\boost_1_67_0\;C:\MSP430\boost\boost_1_67_0 + MultiThreadedDebug + true + true + pch.h + $(IntDir)$(TargetName).pch + false + ProgramDatabase + false + + + Console + true + + + true + true + false + + + %(AdditionalDependencies) + $(TargetPath) + %(AdditionalLibraryDirectories) + + + false + + + + + Use + Level3 + Disabled + _WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + Utility_Classes;Physical_Interfaces;Packet_Handlers;Connections;BSL430_DLL;..\..\include;s:\boost_1_67_0\boost_1_67_0\;C:\MSP430\boost\boost_1_67_0 + MultiThreadedDebug + true + true + pch.h + $(IntDir)$(TargetName).pch + false + ProgramDatabase + false + + + Console + true + + + true + true + false + + + %(AdditionalDependencies) + $(TargetPath) + %(AdditionalLibraryDirectories) + + + false + + + + + Use + Level3 + Full + _WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + true + false + Default + Size + true + ProgramDatabase + true + false + true + true + pch.h + $(IntDir)$(TargetName).pch + Utility_Classes;Physical_Interfaces;Packet_Handlers;Connections;BSL430_DLL;..\..\include;s:\boost_1_67_0\boost_1_67_0\;C:\MSP430\boost\boost_1_67_0 + + + Console + true + + + true + true + false + + + %(AdditionalDependencies) + $(TargetPath) + false + %(AdditionalLibraryDirectories) + + + false + + + + + Use + Level3 + Full + _WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + true + false + Default + Size + true + ProgramDatabase + true + false + true + true + pch.h + $(IntDir)$(TargetName).pch + Utility_Classes;Physical_Interfaces;Packet_Handlers;Connections;BSL430_DLL;..\..\include;s:\boost_1_67_0\boost_1_67_0\;C:\MSP430\boost\boost_1_67_0 + + + Console + true + + + true + true + false + + + %(AdditionalDependencies) + $(TargetPath) + false + %(AdditionalLibraryDirectories) + + + false + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/BSL430_DLL.vcxproj.filters b/ThirdParty/BSL430_DLL/BSL430_DLL/BSL430_DLL.vcxproj.filters new file mode 100644 index 0000000..dab1b9e --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/BSL430_DLL.vcxproj.filters @@ -0,0 +1,129 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {194c4325-48e9-4cfd-9ebd-6dfa5816a5c8} + + + {58e1a238-aed1-4ace-838f-23296b566bf6} + + + {ec54b1c2-bdff-428c-a0e3-baa56e815549} + + + {17500bde-fc6e-4a00-b225-ba91988f4dea} + + + {1cedb7fc-ffdd-4e65-b6d4-6fe41599a81c} + + + {fb04c1eb-5e15-428e-a3b0-e6f221355f7d} + + + {b51158f2-cd5f-44ec-a691-7608c6a65e0f} + + + + + Source Files\BSL Connection Source + + + Source Files\BSL Connection Source + + + Source Files\BSL Connection Source + + + Source Files\BSL Connection Source + + + Source Files\BSL Connection Source + + + Source Files\PacketHandler Source + + + Source Files\PacketHandler Source + + + Source Files\PacketHandler Source + + + Source Files\Phys Connection Source + + + Source Files\Phys Connection Source + + + Source Files + + + Source Files + + + Source Files\BSL Connection Source + + + Source Files + + + + + Header Files\BSL Connection Headers + + + Header Files\BSL Connection Headers + + + Header Files\BSL Connection Headers + + + Header Files\BSL Connection Headers + + + Header Files\BSL Connection Headers + + + Header Files\PacketHandler Headers + + + Header Files\PacketHandler Headers + + + Header Files\PacketHandler Headers + + + Header Files\Phys Connection Headers + + + Header Files\Phys Connection Headers + + + Header Files\Phys Connection Headers + + + Source Files + + + Header Files + + + Header Files + + + Header Files + + + diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection.cpp new file mode 100644 index 0000000..66a457a --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection.cpp @@ -0,0 +1,99 @@ +/* + * MSPBSL_Connection + * + * An interface to define basic BSL functionality across all families + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_Connection.h" +#include "MSPBSL_PacketHandler.h" + +using namespace std; + +/***************************************************************************//** +* MSPBSL_Connection Class Destructor. +* +******************************************************************************/ +MSPBSL_Connection::~MSPBSL_Connection() +{ + delete thePacketHandler; +} + +/***************************************************************************//** +* Gets the Packet Handler used for formatting packets +* +* \return a MSPBSL_PacketHandler class +******************************************************************************/ +MSPBSL_PacketHandler* MSPBSL_Connection::getPacketHandler() +{ + return thePacketHandler; +} + +/***************************************************************************//** +* Sets the Packet Handler used for formatting packets +* +* \param a MSPBSL_PacketHandler class reference to be used to format packets +* +******************************************************************************/ +void MSPBSL_Connection::setPacketHandler(MSPBSL_PacketHandler* handler) +{ + thePacketHandler = handler; +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_Connection::getErrorInformation( uint16_t err ) +{ + + switch( err ) + { + case (GENERAL_BSL_CONNECTION_ERROR): + return "General Connection Error Occured"; + break; + case (UNEXPECTED_VALUE): + return "an unexpected value was received by the BSL connection"; + break; + } + return thePacketHandler->getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection.h new file mode 100644 index 0000000..e9c3198 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection.h @@ -0,0 +1,82 @@ +/* + * MSPBSL_Connection + * + * An interface to define basic BSL functionality across all families + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +//Error header (top 8 bits) definitions +#define MSLBSL_CONNECTION_HEADER 0x0100 +#define getHeader(X) (X&0xFF00) +#define MSPBSL_ConnectionError(X) (MSLBSL_CONNECTION_HEADER | X) + +//Error footer (lower 8 bits) definitions +#define GENERAL_BSL_CONNECTION_ERROR MSPBSL_ConnectionError(0xEE) +#define UNEXPECTED_VALUE MSPBSL_ConnectionError(0x01) + +// General BSL defines +#define BSL_ERROR_HEADER 0x0000 +#define ACKNOWLEDGE 0x00 +#define ACK ACKNOWLEDGE + +class MSPBSL_PacketHandler; + +class MSPBSL_Connection +{ +protected: + MSPBSL_PacketHandler* thePacketHandler; + +public: + MSPBSL_Connection() : thePacketHandler(nullptr) {} + MSPBSL_Connection(const MSPBSL_Connection&) = delete; + MSPBSL_Connection& operator=(const MSPBSL_Connection&) = delete; + virtual ~MSPBSL_Connection(); + + virtual uint16_t massErase() = 0; + virtual uint16_t RX_Password() = 0; + virtual uint16_t RX_Password(uint8_t* password) = 0; + virtual uint16_t TX_BSL_Version(std::string& versionString) = 0; + virtual uint16_t setPC(uint32_t addr) = 0; + virtual uint16_t TX_DataBlock( uint8_t* data, uint32_t startAddr, uint32_t numBytes ) = 0; + virtual uint16_t RX_DataBlock( uint8_t* data, uint32_t startAddr, uint32_t numBytes ) = 0; + + virtual std::string getErrorInformation( uint16_t err ); + + + MSPBSL_PacketHandler* getPacketHandler(); + void setPacketHandler(MSPBSL_PacketHandler* protocol); + +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5438Family.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5438Family.cpp new file mode 100644 index 0000000..199d078 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5438Family.cpp @@ -0,0 +1,116 @@ +/* + * MSPBSL_Connection5438Family + * + * A subclass to add 5438 (non-A) specific connection functions + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_Connection5438Family.h" + +using namespace std; + + +/***************************************************************************//** +* MSPBSL_Connection5438Family Class Constructor. +* +* Creates a 5/6xx General Connection using the supplied parameters +* +* \param initString an initialization string for the connection +* +* \return a MSPBSL_Connection5438Family class +******************************************************************************/ +MSPBSL_Connection5438Family::MSPBSL_Connection5438Family(string initString) : MSPBSL_Connection5xxUART( initString) +{ +} + +/***************************************************************************//** +* MSPBSL_Connection5438Family Class Destructor. +* +******************************************************************************/ +MSPBSL_Connection5438Family::~MSPBSL_Connection5438Family(void) +{ +} + +/***************************************************************************//** +* The 5438 Standard RX Password Command +* +* Creates a databuffer containing a standard 5438 RX Password Command, and passes +* this on to the Packet Handler layer for sending. Note: This command accepts +* no parameters as it sends a default (16x 0xFF) password +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5438Family::RX_Password(void) +{ + uint8_t buf_array[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + return RX_Password( buf_array ); +} + +/***************************************************************************//** +* Thex 5438 Standard RX Password Command +* +* Creates a databuffer containing a standard 5/6xx RX Password Command, and passes +* this on to the Packet Handler layer for sending. Note: This command accepts +* no parameters as it sends a default (16x 0xFF) password +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5438Family::RX_Password(uint8_t* password) +{ + uint8_t passwordPacket[17]; + passwordPacket[0] = RX_PASSWORD_COMMAND; + for( uint8_t i = 0; i < 16; i++ ) + { + passwordPacket[i+1] = password[i]; + } + + return MSPBSL_Connection5xx::sendPacketExpectMessage(passwordPacket, 17); +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_Connection5438Family::getErrorInformation( uint16_t err ) +{ + return MSPBSL_Connection5xxUART::getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5438Family.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5438Family.h new file mode 100644 index 0000000..3e4a4b5 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5438Family.h @@ -0,0 +1,52 @@ +/* + * MSPBSL_Connection5438Family + * + * A subclass to add 5438 (non-A) specific connection functions + * + * Copyright (C) 2012 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. + * +*/ +#pragma once + +#include "MSPBSL_Connection5xxUART.h" + +class MSPBSL_Connection5438Family : public MSPBSL_Connection5xxUART +{ +public: + MSPBSL_Connection5438Family(std::string initString); + virtual ~MSPBSL_Connection5438Family(); + + uint16_t RX_Password(); + uint16_t RX_Password(uint8_t* password); + + virtual std::string getErrorInformation( uint16_t err ); +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xx.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xx.cpp new file mode 100644 index 0000000..6dd9abe --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xx.cpp @@ -0,0 +1,603 @@ +/* + * MSPBSL_Connection 5xx + * + * A class file to impliment the high-level communication interface for 5xx BSL connections + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_Connection5xx.h" +#include "MSPBSL_PhysicalInterfaceSerialUART.h" +#include "MSPBSL_PacketHandler.h" + +using namespace std; + +string BUG_DESIGNATOR = "BUG:"; +string bugList = ""; + +/***************************************************************************//** +* MSPBSL_Connection5xx Class Constructor. +* +* Creates a 5/6xx General Connection using the supplied parameters +* +* \param initString an initialization string for the connection +* +* \return a MSPBSL_Connection5xx class +******************************************************************************/ +MSPBSL_Connection5xx::MSPBSL_Connection5xx(string initString) +{ + // currently no bugs + if( initString.find(BUG_DESIGNATOR) != string::npos) + { + int bugStart = initString.find(BUG_DESIGNATOR)+BUG_DESIGNATOR.size(); + int bugEnd = initString.find(' ', bugStart ); + bugList.append(initString.substr( bugStart, bugEnd-bugStart)); + }// found buglist + +} + +/***************************************************************************//** +* MSPBSL_Connection5xx Class Destructor. +* +******************************************************************************/ +MSPBSL_Connection5xx::~MSPBSL_Connection5xx(void) +{ +} + +/***************************************************************************//** +* The 5/6xx Standard Set PC Command +* +* Creates a databuffer containing a standard 5/6xx Set PC Command, and passes +* this on to the Packet Handler layer for sending +* +* \param addr a 32-bit address where the device should begin to execute +* +* \return the result of packet handler's Packet Transmission. Note: This only +* means the caller knows if the packet was sucessfully sent to the BSL, +* not whether the desired address is executing correctly +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::setPC(uint32_t addr) +{ + uint8_t command[4]; + command[0]=SET_PC_COMMAND; + command[1]=((addr)&0xFF); // AL + command[2]=((addr>>8)&0xFF); // AM + command[3]=((addr>>16)&0xFF); // AH + thePacketHandler->TX_Packet(command, 4); + return ACK; +} + +/***************************************************************************//** +* The 5/6xx Standard Toggle Info Command +* +* Creates a databuffer containing a standard 5/6xx Toggle Info Command, and passes +* this on to the Packet Handler layer for sending +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::toggleInfo(void) +{ + uint8_t command[1]; + command[0]=TOGGLE_INFO_LOCK_COMMAND; + return sendPacketExpectMessage(command, 1); +} + +/***************************************************************************//** +* The 5/6xx Standard Erase Segment Command +* +* Creates a databuffer containing a standard 5/6xx Erase Segment Command, and passes +* this on to the Packet Handler layer for sending +* +* \param addr a 32-bit address which is in the desired segment to erase +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::eraseSegment(uint32_t addr) +{ + uint8_t command[4]; + command[0]=ERASE_SEGMENT_COMMAND; + command[1]=((addr)&0xFF); // AL + command[2]=((addr>>8)&0xFF); // AM + command[3]=((addr>>16)&0xFF); // AH + return sendPacketExpectMessage(command, 4); +} + +/***************************************************************************//** +* The 5/6xx Standard Get Buffer Size Command +* +* Creates a databuffer containing a standard 5/6xx Get Buffer Size Command, and passes +* this on to the Packet Handler layer for sending +* +* \param bufSize a reference to a 16 bit variable in which to write the buffer size +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::TX_BufferSize(uint16_t* bufSize) +{ + uint16_t retValue; + uint8_t command[4]; + uint8_t rxBuf[4]; + command[0]=TX_BUFFER_SIZE_COMMAND; + retValue = thePacketHandler->TX_Packet(command, 1); + if( retValue == OPERATION_SUCCESSFUL ) + { + retValue = thePacketHandler->RX_Packet(rxBuf, 4); + if (retValue == OPERATION_SUCCESSFUL ) + { + if( command[0] == MESSAGE_RESPONSE ) // we have a message + { + retValue = command[1]; // return the message + } + else if( command[0] == DATA_RESPONSE ) // we have the size + { + //parse buffer + *bufSize = ((uint32_t)command[2])<<8; + *bufSize |= ((uint32_t)command[1]); + retValue = OPERATION_SUCCESSFUL; + } + else + { + retValue = UNEXPECTED_VALUE; // panic + } + } + } + return retValue; + +} + +/***************************************************************************//** +* The 5/6xx Standard RX Data Block Fast Command +* +* Creates a databuffer containing a standard 5/6xx RX Data Block Fast Command, and passes +* this on to the Packet Handler layer for sending. Note: This command tells the BSL +* to Receive a data block, so it will send data from the Host +* +* \param data an array of unsigned bytes to send +* \param startAddr the start address in device memory to begin writing these bytes +* \param numBytes the number of bytes in the array +* +* \return the value returned by the connected BSL, or underlying connection layers +* Note: This only means the caller knows if the packet was sucessfully +* sent to the BSL, not whether the data was correctly written +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::RX_DataBlockFast(const uint8_t* data, uint32_t startAddr, uint32_t numBytes ) +{ + uint16_t retValue = ACK; + uint32_t currentStartAddr = startAddr; + uint16_t currentPacketNumBytes; + uint32_t numBytesRemaining = numBytes; + uint16_t currentBytePointer = 0; + uint16_t maxPacketSize = thePacketHandler->getMaxDataSize()-4; + while( numBytesRemaining > 0) + { + if( numBytesRemaining > maxPacketSize ) + { + currentPacketNumBytes = maxPacketSize; + } + else + { + currentPacketNumBytes = (uint16_t)numBytesRemaining; // cast is safe since max Packet size is less than 16 bts + } + uint8_t* txDataBuf = NULL; + txDataBuf = new uint8_t[currentPacketNumBytes+4]; + txDataBuf[0] = RX_DATA_BLOCK_FAST_COMMAND; + txDataBuf[1] = ((currentStartAddr)&0xFF); // AL + txDataBuf[2] = ((currentStartAddr>>8)&0xFF); // AM + txDataBuf[3] = ((currentStartAddr>>16)&0xFF); // AH + for( uint16_t i = 0; i < currentPacketNumBytes; i++,currentBytePointer++ ) + { + txDataBuf[i+4] = data[currentBytePointer]; + + } + retValue = sendPacketExpectNothing(txDataBuf, currentPacketNumBytes+4); + delete [] txDataBuf; + currentStartAddr += currentPacketNumBytes; + numBytesRemaining -= currentPacketNumBytes; + if( retValue != ACK ) + { + return retValue; + } + } // while + + return retValue; + +} + +/***************************************************************************//** +* The 5/6xx Standard RX Data Block Command +* +* Creates a databuffer containing a standard 5/6xx RX Data Block Command, and passes +* this on to the Packet Handler layer for sending. Note: This command tells the BSL +* to Receive a data block, so it will send data from the Host +* +* \param data an array of unsigned bytes to send +* \param startAddr the start address in device memory to begin writing these bytes +* \param numBytes the number of bytes in the array +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::RX_DataBlock(uint8_t* data, uint32_t startAddr, uint32_t numBytes) +{ + uint16_t retValue = ACK; + uint32_t currentStartAddr = startAddr; + uint16_t currentPacketNumBytes; + uint16_t numBytesRemaining = numBytes; + uint16_t currentBytePointer = 0; + uint16_t maxPacketSize = thePacketHandler->getMaxDataSize()-4; + while( numBytesRemaining > 0) + { + if( numBytesRemaining > maxPacketSize ) + { + currentPacketNumBytes = maxPacketSize; + } + else + { + currentPacketNumBytes = (uint16_t)numBytesRemaining; // cast is safe since max Packet size is less than 16 bts + } + uint8_t* txDataBuf = NULL; + txDataBuf = new uint8_t[currentPacketNumBytes+4]; + txDataBuf[0] = RX_DATA_BLOCK_COMMAND; + txDataBuf[1] = ((currentStartAddr)&0xFF); // AL + txDataBuf[2] = ((currentStartAddr>>8)&0xFF); // AM + txDataBuf[3] = ((currentStartAddr>>16)&0xFF); // AH + for( uint16_t i = 0; i < currentPacketNumBytes; i++,currentBytePointer++ ) + { + txDataBuf[i+4] = data[currentBytePointer]; + + } + retValue = sendPacketExpectMessage(txDataBuf, currentPacketNumBytes+4); + delete [] txDataBuf; + currentStartAddr += currentPacketNumBytes; + numBytesRemaining -= currentPacketNumBytes; + if( retValue != ACK ) + { + return retValue; + } + } // while + + return retValue; + +} + +/***************************************************************************//** +* The 5/6xx Standard TX Data Block Command +* +* Sends one or more TX Data Block Commands in order to write all data in the +* supplied array down to memory as requested +* +* \param data an array of unsigned bytes to send +* \param startAddr the start address in device memory to begin writing these bytes +* \param numBytes the number of bytes in the array +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::TX_DataBlock( uint8_t* data, uint32_t startAddr, uint32_t numBytes) +{ + // to do: handle "large" streaming data blocks being TXed + + uint16_t retValue = ACK; + uint16_t maxPacketSize = thePacketHandler->getMaxDataSize(); + uint16_t maxBytesRXed = maxPacketSize-1; // the packet size minus data header = max data + uint16_t totalBytesRxed = 0; + uint16_t bytesReceived; + uint8_t command[6]; + uint16_t TimeOut = 3; + vector rxDataBuf(maxPacketSize); + + if( numBytes > (uint32_t)0xFFFF ) // if we are requesting over a 16 byte number, we must break it up + { + retValue |= TX_DataBlock( (data+0xFFFF), (startAddr+0xFFFF), (numBytes-0xFFFF) ); // use recursion to grab the remaining upper locations + numBytes = 0xFFFF; + } + + command[0]=TX_DATA_BLOCK_COMMAND; + command[1]=((startAddr)&0xFF); // AL + command[2]=((startAddr>>8)&0xFF); // AM + command[3]=((startAddr>>16)&0xFF); // AH + command[4]=((numBytes)&0xFF); // Bytes_Low + command[5]=((numBytes>>8)&0xFF); // Bytes_High + + retValue |= thePacketHandler->TX_Packet(command, 6); + if( retValue == 0x00 ) + { + uint16_t bytesExpected; + if( numBytes > maxBytesRXed) + { + bytesExpected = maxBytesRXed; + } + else + { + bytesExpected = numBytes; + } + bytesExpected++; // +1 for the header + TimeOut = TimeOut * numBytes; + while( totalBytesRxed < numBytes && TimeOut > 0) // to do: recompute bytesExpected each loop! + { + retValue = thePacketHandler->RX_Packet(&rxDataBuf[0], bytesExpected, &bytesReceived); + if (retValue == OPERATION_SUCCESSFUL ) + { + if( rxDataBuf[0] == MESSAGE_RESPONSE ) // we have a message + { + // to do: if the message is a buffer size error, switch reading mode to non-streaming + retValue = rxDataBuf[1]; // return the message + } + else if( rxDataBuf[0] == DATA_RESPONSE ) // we have the data + { + for( uint16_t i = 1; i < bytesReceived; i++,totalBytesRxed++ ) //i = 1 to skip over data header byte + { + data[totalBytesRxed] = rxDataBuf[i]; + } + } + } + TimeOut--; + } // while + } + return retValue; + +} + +/***************************************************************************//** +* The 5/6xx Standard CRC Command +* +* Creates a databuffer containing a standard 5/6xx CRC Command, and passes +* this on to the Packet Handler layer for sending. +* +* \param CRC_Return 32bit variable reference in which the CRC value will be placed +* \param startAddr The start address for CRC computation +* \param numBytes The number of bytes to include in CRC computation +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::CRC_Check(uint16_t* CRC_Return, uint32_t startAddr, uint16_t numBytes) +{ + + uint16_t retValue = ACK; + uint8_t command[6]; + //dataBuffer command(6); + command[0]=CRC_CHECK_COMMAND; + command[1]=((startAddr)&0xFF); // AL + command[2]=((startAddr>>8)&0xFF); // AM + command[3]=((startAddr>>16)&0xFF); // AH + command[4]=((numBytes)&0xFF); // Bytes_Low + command[5]=((numBytes>>8)&0xFF); // Bytes_High + + retValue = thePacketHandler->TX_Packet(command, 6); + if( retValue == OPERATION_SUCCESSFUL ) + { + retValue = thePacketHandler->RX_Packet(command, 3); + if (retValue == OPERATION_SUCCESSFUL ) + { + if( command[0] == MESSAGE_RESPONSE ) // we have a message + { + retValue = command[1]; // return the message + } + else if( command[0] == DATA_RESPONSE ) // we have the CRC + { + + //parse CRC + *CRC_Return = ((uint16_t)command[2])<<8; + *CRC_Return |= ((uint16_t)command[1]); + retValue = ACK; + } + else + { + retValue = GENERAL_BSL_CONNECTION_ERROR; // panic + } + } + } + return retValue; + +} + +/***************************************************************************//** +* The 5/6xx Standard TX BSL Version Command +* +* Creates a databuffer containing a standard 5/6xx TX BSL Version Command, and passes +* this on to the Packet Handler layer for sending. +* +* \param versionString a reference to a string which will store the returned version +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::TX_BSL_Version(string& versionString) +{ + + uint16_t retValue = ACK; + versionString = ""; + uint8_t rxedDataPacket[5]; + uint16_t rxedByteCount; + uint8_t commandPacket[1]; + commandPacket[0] = TX_BSL_VERSION_COMMAND; + retValue = thePacketHandler->TX_Packet(commandPacket, 1); + if( retValue == OPERATION_SUCCESSFUL ) + { + retValue = thePacketHandler->RX_Packet(rxedDataPacket, 5, &rxedByteCount); + if (retValue == OPERATION_SUCCESSFUL ) + { + if( rxedDataPacket[0] == MESSAGE_RESPONSE ) // we have a message + { + retValue = rxedDataPacket[1]; // return the message + } + else if( rxedDataPacket[0] == DATA_RESPONSE ) // we have the Version + { + versionString += (uint8_t)(((rxedDataPacket[1]>>4)&0xF)+48); + versionString += (uint8_t)(((rxedDataPacket[1])&0xF)+48); + versionString += '.'; + versionString += (uint8_t)(((rxedDataPacket[2]>>4)&0xF)+48); + versionString += (uint8_t)(((rxedDataPacket[2])&0xF)+48); + versionString += '.'; + versionString += (uint8_t)(((rxedDataPacket[3]>>4)&0xF)+48); + versionString += (uint8_t)(((rxedDataPacket[3])&0xF)+48); + versionString += '.'; + versionString += (uint8_t)(((rxedDataPacket[4]>>4)&0xF)+48); + versionString += (uint8_t)(((rxedDataPacket[4])&0xF)+48); + for( int i = 0; i < 11; i++) + { + if( (versionString[i] >= 58) && (versionString[i] <= 63)) + { + versionString[i] += 7; + } + } + retValue = OPERATION_SUCCESSFUL; + } + else + { + retValue = GENERAL_BSL_CONNECTION_ERROR; // panic + } + } + } + return retValue; + + return 0; +} + +/***************************************************************************//** +* The 5/6xx Standard RX Password Command +* +* Creates a databuffer containing a standard 5/6xx RX Password Command, and passes +* this on to the Packet Handler layer for sending. Note: This command accepts +* no parameters as it sends a default (32x 0xFF) password +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::RX_Password(void) +{ + uint8_t standardPassword[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + return RX_Password( standardPassword ); + +} + +/***************************************************************************//** +* The 5/6xx Standard RX Password Command +* +* Creates a databuffer containing a standard 5/6xx RX Password Command, and passes +* this on to the Packet Handler layer for sending. +* +* \param pass a databuffer containing the device password +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::RX_Password(uint8_t* password) +{ + uint8_t passwordPacket[33]; + passwordPacket[0] = RX_PASSWORD_COMMAND; + for( uint8_t i = 0; i < 32; i++ ) + { + passwordPacket[i+1] = password[i]; + } + + return sendPacketExpectMessage(passwordPacket, 33); +} + +/***************************************************************************//** +* The 5/6xx Standard Mass Erase Command +* +* Creates a databuffer containing a standard 5/6xx Mass Erase Command, and passes +* this on to the Packet Handler layer for sending. +* +* \return the value returned by the connected BSL, or underlying connection layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::massErase(void) +{ + uint8_t massEraseCommand[1]; + massEraseCommand[0] = MASS_ERASE_COMMAND; + return sendPacketExpectMessage(massEraseCommand, 1); +} + +/***************************************************************************//** +* Sends a Data packet and waits for the BSL to reply with a message +* +* This function transmits a data packet to the BSL, and will expect that +* the BSL should reply with a message +* +* \param packet an array of unsigned bytes containing the data to send +* \param packetSize the number of bytes in the packet +* +* \return the message or error returned by BSL or underlying layers +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::sendPacketExpectMessage(uint8_t* packet, uint16_t packetSize) +{ + uint16_t retValue, tempRX; + uint8_t messageBuf[2]; + retValue = thePacketHandler->TX_Packet(packet, packetSize); + if( retValue == OPERATION_SUCCESSFUL ) + { + retValue = thePacketHandler->RX_Packet(messageBuf, 2, &tempRX ); + if (retValue == OPERATION_SUCCESSFUL ) + { + if( messageBuf[0] == MESSAGE_RESPONSE ) // we have a message + { + retValue = messageBuf[1]; // return the message + } + else + { + retValue = GENERAL_BSL_CONNECTION_ERROR; // panic + } + } + } + + return retValue; +} + +/***************************************************************************//** +* Sends a Data packet and does not expect a message +* +* This function transmits a data packet to the BSL, and will not expect that +* the BSL replies with a message +* +* \param packet an array of unsigned bytes containing the data to send +* \param packetSize the number of bytes in the packet +* +* \return TX status as returned by the underlying layers (0 for success) +******************************************************************************/ +uint16_t MSPBSL_Connection5xx::sendPacketExpectNothing(uint8_t* packet, uint16_t packetSize) +{ + return thePacketHandler->TX_Packet(packet, packetSize); +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_Connection5xx::getErrorInformation( uint16_t err ) +{ + return MSPBSL_Connection::getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xx.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xx.h new file mode 100644 index 0000000..e95d521 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xx.h @@ -0,0 +1,111 @@ +/* + * MSPBSL_Connection 5xx + * + * A class file to impliment the high-level communication interface for 5xx BSL connections + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +#include "MSPBSL_Connection.h" + +//Commands +#define RX_DATA_BLOCK_COMMAND 0x10 +#define RX_DATA_BLOCK_FAST_COMMAND 0x1B +#define RX_PASSWORD_COMMAND 0x11 +#define ERASE_SEGMENT_COMMAND 0x12 +#define TOGGLE_INFO_LOCK_COMMAND 0x13 +//#define RESERVED_COMMAND 0x14 +#define MASS_ERASE_COMMAND 0x15 +#define CRC_CHECK_COMMAND 0x16 +#define SET_PC_COMMAND 0x17 +#define TX_DATA_BLOCK_COMMAND 0x18 +#define TX_BSL_VERSION_COMMAND 0x19 +#define TX_BUFFER_SIZE_COMMAND 0x1A +#define USB_DISCONNECT_COMMAND 0x53 + +//Responses +#define DATA_RESPONSE 0x3A +#define MESSAGE_RESPONSE 0x3B + +//Messages +#define OPERATION_SUCCESSFUL 0x00 +#define FLASH_WRITE_CHECK_FAILED 0x01 +#define FLASH_FAIL_BIT_SET 0x02 +#define VOLTAGE_CHANGE_DURING_PROGRAM 0x03 +#define BSL_LOCKED 0x04 +#define BSL_PASSWORD_ERROR 0x05 +#define BYTE_WRITE_FORBIDDEN 0x06 +#define UNKNOWN_COMMAND 0x07 +#define PACKET_LENGTH_EXCEEDS_BUFFER 0x08 + +// Bugs +#define PASSWORD_BUG_5438 "SHORT_PASS" + +class MSPBSL_Connection5xx : public MSPBSL_Connection +{ +public: + MSPBSL_Connection5xx(std::string initString); + virtual ~MSPBSL_Connection5xx(); + + + + uint16_t massErase(); + uint16_t RX_Password(); + uint16_t RX_Password(uint8_t* password); + uint16_t TX_BSL_Version(std::string& versionString); + + + uint16_t setPC(uint32_t addr); + uint16_t TX_DataBlock( uint8_t* data, uint32_t startAddr, uint32_t numBytes ); + uint16_t RX_DataBlock( uint8_t* data, uint32_t startAddr, uint32_t numBytes ); + uint16_t RX_DataBlockFast( const uint8_t* data, uint32_t startAddr, uint32_t numBytes ); + uint16_t CRC_Check(uint16_t* CRC_Return, uint32_t startAddr, uint16_t numBytes); + uint16_t eraseSegment(uint32_t addr); + uint16_t toggleInfo(); + uint16_t TX_BufferSize(uint16_t* bufSize); + + virtual std::string getErrorInformation( uint16_t err ); + + //uint8_t TX_TXT_File(file) + //uint8_t RX_TXT_File(file) + +protected: + std::string bugList; + uint16_t sendPacketExpectNothing(uint8_t* packet, uint16_t packetSize); + uint16_t sendPacketExpectMessage(uint8_t* packet, uint16_t packetSize); + + + +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUART.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUART.cpp new file mode 100644 index 0000000..087ef43 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUART.cpp @@ -0,0 +1,140 @@ +/* + * MSPBSL_Connection5xxUART + * + * A subclass to add UART specific connection functions + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_Connection5xxUART.h" +#include "MSPBSL_PacketHandler.h" +#include "MSPBSL_PhysicalInterfaceSerialUART.h" + +using namespace std; + +/***************************************************************************//** +* MSPBSL_Connection5xxUSB Constructor. +* +* \return a MSPBSL_Connection5xxUSB class +******************************************************************************/ +MSPBSL_Connection5xxUART::MSPBSL_Connection5xxUART(string initString) : MSPBSL_Connection5xx( initString) +{ +} + +/***************************************************************************//** +* MSPBSL_Connection5xxUSB Destructor. +* +******************************************************************************/ +MSPBSL_Connection5xxUART::~MSPBSL_Connection5xxUART(void) +{ +} + +/***************************************************************************//** +* Sets the Baud Rate +* +* \param baudRate the Baud to set as a raw number ie. 9600 +* +* \return 0 if the set baud rate is successfull, or a non-zero value if error +******************************************************************************/ +uint16_t MSPBSL_Connection5xxUART::setBaudRate(uint32_t baudRate) +{ + string baudString; + uint16_t retValue; + uint8_t packet[2] = {CHANGE_BAUD_RATE_COMMAND, BAUD_9600_NUMBER}; + if( (baudRate == 4800)||(baudRate == BAUD_4800_NUMBER) ) + { + baudString = "BAUD:4800"; + packet[1] = BAUD_4800_NUMBER; + } + else if( (baudRate == 9600)||(baudRate == BAUD_9600_NUMBER) ) + { + baudString = "BAUD:9600"; + packet[1] = BAUD_9600_NUMBER; + } + else if( (baudRate == 19200)||(baudRate == BAUD_19200_NUMBER) ) + { + baudString = "BAUD:19200"; + packet[1] = BAUD_19200_NUMBER; + } + else if( (baudRate == 38400)||(baudRate == BAUD_38400_NUMBER) ) + { + baudString = "BAUD:38400"; + packet[1] = BAUD_38400_NUMBER; + } + else if( (baudRate == 57600)||(baudRate == BAUD_57600_NUMBER) ) + { + baudString = "BAUD:57600"; + packet[1] = BAUD_57600_NUMBER; + } + else if( (baudRate == 115200)||(baudRate == BAUD_115200_NUMBER) ) + { + baudString = "BAUD:115200"; + packet[1] = BAUD_115200_NUMBER; + } + else + { + return UNKNOWN_BAUD_RATE_AS_CONNECTION_PARAM; + } + + retValue = sendPacketExpectNothing( packet, 2); + if( retValue == ACK ) + { + retValue = thePacketHandler->getPhysicalInterface()->physicalInterfaceCommand(baudString); + } + + return retValue; +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_Connection5xxUART::getErrorInformation( uint16_t err ) +{ + switch( err) + { + case( UNKNOWN_BAUD_RATE_AS_CONNECTION_PARAM ): + return "an unknown baudrate was passed as a parameter to the UART Connection Class"; + break; + + } + return MSPBSL_Connection5xx::getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUART.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUART.h new file mode 100644 index 0000000..fd6a258 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUART.h @@ -0,0 +1,67 @@ +/* + * * MSPBSL_Connection5xxUART + * + * A subclass to add UART specific connection functions + * + * Copyright (C) 2012 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. + * +*/ + +#define CHANGE_BAUD_RATE_COMMAND 0x52 + +#define BAUD_4800_NUMBER 0x01 +#define BAUD_9600_NUMBER 0x02 +#define BAUD_19200_NUMBER 0x03 +#define BAUD_38400_NUMBER 0x04 +#define BAUD_57600_NUMBER 0x05 +#define BAUD_115200_NUMBER 0x06 + + +#define UNKNOWN_BAUD_RATE_AS_CONNECTION_PARAM MSPBSL_ConnectionError(0x02) + +#pragma once +#include +#include "MSPBSL_Connection5xx.h" + +class MSPBSL_Connection5xxUART : public MSPBSL_Connection5xx +{ +public: + + MSPBSL_Connection5xxUART(std::string initString); + virtual ~MSPBSL_Connection5xxUART(); + + uint16_t setBaudRate(uint32_t baudRate); + + virtual std::string getErrorInformation( uint16_t err ); + + +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUSB.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUSB.cpp new file mode 100644 index 0000000..5d06e5b --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUSB.cpp @@ -0,0 +1,155 @@ +/* + * MSPBSL_Connection5xxUSB + * + * A subclass to add USB specific connection functions + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_Connection5xxUSB.h" +#include "MSPBSL_PhysicalInterfaceUSB.h" +#include "MSPBSL_PacketHandler.h" + +#include "RAM_BSL_FLASH_MODE_eZ_FET.h" +#include "RAM_BSL_FLASH_MODE_MSP_FET.h" + +using namespace std; + +/***************************************************************************//** +* MSPBSL_Connection5xxUSB Constructor. +* +* \param initString an initialization string for the connection +* +* \return a MSPBSL_Connection5xxUSB class +******************************************************************************/ +MSPBSL_Connection5xxUSB::MSPBSL_Connection5xxUSB(string initString) : MSPBSL_Connection5xx( initString) +{ +} + +/***************************************************************************//** +* MSPBSL_Connection5xxUSB Destructor. +* +******************************************************************************/ +MSPBSL_Connection5xxUSB::~MSPBSL_Connection5xxUSB(void) +{ +} + +void MSPBSL_Connection5xxUSB:: closeBslconnection() +{ + uint8_t usbDisconnct = USB_DISCONNECT_COMMAND; + this->thePacketHandler->TX_Packet(&usbDisconnct,1); + std::this_thread::sleep_for(std::chrono::seconds(5)); +} + +/***************************************************************************//** +* Loads the USB BSL into RAM using the default password +* +* Creates a default 5/6xx password array (32x 0xFF) and calls LoadRAM_BSL with +* that as a parameter +* +* \return the result of the LoadRAM_BSL function call +******************************************************************************/ +uint16_t MSPBSL_Connection5xxUSB::loadRAM_BSL(uint16_t toolPid) +{ + uint8_t buf_array[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + return loadRAM_BSL( buf_array, toolPid ); +} + +/***************************************************************************//** +* USB-specific helper function to load the RAM BSL and start it +* +* This function is included in the 5xx USB class as a convenience function +* it's purpose is to make it simple to unlock a device, load and start the RAM +* BSL, and re-connect to this RAM BSL +* +* \param pass the password to submit to the connected device's BSL +* +* \return an unsigned byte describing the success or failure of the entire operation +* 0: No error, RAM based BSL is loaded, and further communication can +* continue using this class +* >0: one or more errors occured +******************************************************************************/ +#define MSPBSL_EZ_FET_USB_PID 0x0203 +#define MSPBSL_MSP_FET_USB_PID 0x0204 + +uint16_t MSPBSL_Connection5xxUSB::loadRAM_BSL(uint8_t* password, uint16_t toolPid) +{ + uint16_t retValue = RX_Password( password ); + if( retValue != ACK ) + { + return retValue; + } + + if(MSPBSL_EZ_FET_USB_PID == toolPid) + { + retValue = RX_DataBlockFast(RAM_BSL_FLASH_MODE_eZ_FETImage, 0x2500, sizeof RAM_BSL_FLASH_MODE_eZ_FETImage); + if( retValue != ACK ) + { + return retValue; + } + } + if(MSPBSL_MSP_FET_USB_PID == toolPid) + { + retValue = RX_DataBlockFast(RAM_BSL_FLASH_MODE_MSP_FETImage, 0x2500, sizeof RAM_BSL_FLASH_MODE_MSP_FETImage); + if( retValue != ACK ) + { + return retValue; + } + } + + retValue = setPC(0x2504); + if( retValue != ACK ) + { + return retValue; + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + + return ACK; +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_Connection5xxUSB::getErrorInformation( uint16_t err ) +{ + return MSPBSL_Connection5xx::getErrorInformation( err ); +} diff --git a/DLL430_v3/include/wtypes.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUSB.h similarity index 68% rename from DLL430_v3/include/wtypes.h rename to ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUSB.h index f12c80d..205a7b7 100644 --- a/DLL430_v3/include/wtypes.h +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_Connection5xxUSB.h @@ -1,7 +1,9 @@ /* - * wtypes.h + * MSPBSL_Connection5xxUSB * - * Copyright (C) 2004 - 2011 Texas Instruments Incorporated - http://www.ti.com/ + * A subclass to add USB specific connection functions + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without @@ -30,23 +32,25 @@ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +#pragma once + +#include "MSPBSL_Connection5xx.h" -#ifndef WTYPES_H_ -#define WTYPES_H_ +class MSPBSL_Connection5xxUSB : public MSPBSL_Connection5xx +{ +public: -#include + MSPBSL_Connection5xxUSB(std::string initString); + virtual ~MSPBSL_Connection5xxUSB(); -typedef char CHAR; -typedef uint8_t BYTE; -typedef uint16_t WORD; -typedef long LONG; -typedef long long LONGLONG; -typedef unsigned long ULONG; -typedef unsigned int UINT; + uint16_t loadRAM_BSL(uint16_t toolPid); + uint16_t loadRAM_BSL(uint8_t* password, uint16_t toolPid); -#define FALSE 0 -#define TRUE 1 + void closeBslconnection(); -#endif + virtual std::string getErrorInformation( uint16_t err ); +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_ConnectionFRAMFamily.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_ConnectionFRAMFamily.cpp new file mode 100644 index 0000000..46dbc2a --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_ConnectionFRAMFamily.cpp @@ -0,0 +1,109 @@ +/* + * MSPBSL_ConnectionFRAMFamily + * + * A subclass to add FRAM specific connection functions + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_ConnectionFRAMFamily.h" +#include "MSPBSL_PacketHandler.h" +#include "MSPBSL_PhysicalInterface.h" + +using namespace std; + +/***************************************************************************//** +* FRAM General Connection Class Constructor. +* +* Creates a 5/6xx General Connection using the supplied parameters +* +* \param initString an initialization string for the connection +* +* \return a MSPBSL_ConnectionFRAMFamily class +******************************************************************************/ +MSPBSL_ConnectionFRAMFamily::MSPBSL_ConnectionFRAMFamily(string initString) : MSPBSL_Connection5xxUART( initString) +{ +} + +/***************************************************************************//** +* MSPBSL_ConnectionFRAMFamily Class Destructor. +* +******************************************************************************/ +MSPBSL_ConnectionFRAMFamily::~MSPBSL_ConnectionFRAMFamily(void) +{ +} + + +/***************************************************************************//** +* A function to send the mass erase command +* +* This function handles the special case of Mass erase for FRAM devices. +* This means it sends the mass erase, then reinitializes the COM port to 9600 baud +* then unlocks the BSL again using the default password +* +* \return A string describing the error code +******************************************************************************/ +uint16_t MSPBSL_ConnectionFRAMFamily::massErase(void) +{ + uint16_t retValue; + + retValue = MSPBSL_Connection5xx::massErase(); // after a mass erase, the FRAM devices reset themselves + if( retValue != ACK ) + { + return retValue; + } + thePacketHandler->getPhysicalInterface()->physicalInterfaceCommand("BAUD:9600"); + retValue = MSPBSL_Connection5xx::RX_Password(); + if( retValue != ACK ) + { + return retValue; + } + return retValue; +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_ConnectionFRAMFamily::getErrorInformation( uint16_t err ) +{ + return MSPBSL_Connection5xxUART::getErrorInformation( err ); +} diff --git a/DLL430_v3/src/DLL430_plugin.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_ConnectionFRAMFamily.h similarity index 66% rename from DLL430_v3/src/DLL430_plugin.cpp rename to ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_ConnectionFRAMFamily.h index 8b34c25..ca9e53d 100644 --- a/DLL430_v3/src/DLL430_plugin.cpp +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Connections/MSPBSL_ConnectionFRAMFamily.h @@ -1,9 +1,9 @@ /* - * DLL430_plugin.cpp + * MSPBSL_ConnectionFRAMFamily * - * C-port to load dll. + * A subclass to add FRAM specific connection functions * - * Copyright (C) 2007 - 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without @@ -32,26 +32,22 @@ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ -using namespace TI::DLL430; +#pragma once -extern "C" { +#include "MSPBSL_Connection5xxUART.h" -DLL430_SYMBOL -FetHandleManager* createFetHandleManager () +class MSPBSL_ConnectionFRAMFamily : public MSPBSL_Connection5xxUART { - return FetHandleManager::instance(); -} +public: + MSPBSL_ConnectionFRAMFamily(std::string initString); + virtual ~MSPBSL_ConnectionFRAMFamily(); -DLL430_SYMBOL -void destroyFetHandleManager (FetHandleManager* manager) -{ - delete manager; -} + uint16_t massErase(); + + virtual std::string getErrorInformation( uint16_t err ); -} +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/MSPBSL_Factory.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/MSPBSL_Factory.cpp new file mode 100644 index 0000000..7d08594 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/MSPBSL_Factory.cpp @@ -0,0 +1,279 @@ +/* + * MSPBSL_Factory + * + * A factory class designed to create BSL Connections based on standard parameters + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_Factory.h" + +//5xx includes +// Connections +#include "MSPBSL_ConnectionFRAMFamily.h" +#include "MSPBSL_Connection5438Family.h" +#include "MSPBSL_Connection5xxUSB.h" +#include "MSPBSL_Connection5xx.h" +// Packet Handlers +#include "MSPBSL_PacketHandler5xxUART.h" +#include "MSPBSL_PacketHandler5xxUSB.h" +// Physical Connections Handlers +#include "MSPBSL_PhysicalInterfaceSerialUART.h" +#include "MSPBSL_PhysicalInterfaceUSB.h" + +using namespace std; +// to do: eventuall put this in a txt file + +//Official List of acceptable inputs: +// +//5XX_UART +// +//PARITY: +// EVEN +// ODD +// NONE +// +//BUG: +// SHORT_PASSWORD + +#define UART_5XX_STRING "UART_5XX " +#define UART_FRAM_STRING "UART_FRAM " +#define USB_5XX_STRING "USB_5XX " + +#define BUG_SHORT_PASSWORD "SHORT_PASSWORD" + +#define REPLACE_LIST_SIZE 67 +static string replaceList[REPLACE_LIST_SIZE][2] = { { "DEVICE:5438_FAMILY ", "UART_5XX PARITY:NONE BUG:SHORT_PASSWORD "}, + { "DEVICE:5xx_STANDARD_UART ", UART_5XX_STRING}, + { "DEVICE:5xx_STANDARD_USB ", USB_5XX_STRING}, + { "DEVICE:FRAM_STANDARD_UART ", UART_FRAM_STRING}, + // Actual UART 5xx Devices Below + { "DEVICE:MSP430F5438 ", "DEVICE:5438_FAMILY "}, + { "DEVICE:MSP430F5437 ", "DEVICE:5438_FAMILY "}, + { "DEVICE:MSP430F5436 ", "DEVICE:5438_FAMILY "}, + { "DEVICE:MSP430F5435 ", "DEVICE:5438_FAMILY "}, + { "DEVICE:MSP430F5419 ", "DEVICE:5438_FAMILY "}, + { "DEVICE:MSP430F5418 ", "DEVICE:5438_FAMILY "}, + { "DEVICE:MSP430F5438A ", "DEVICE:5xx_STANDARD_UART INVOKE:2 "}, + { "DEVICE:MSP430F5437A ", "DEVICE:5xx_STANDARD_UART INVOKE:2 "}, + { "DEVICE:MSP430F5436A ", "DEVICE:5xx_STANDARD_UART INVOKE:2 "}, + { "DEVICE:MSP430F5435A ", "DEVICE:5xx_STANDARD_UART INVOKE:2 "}, + { "DEVICE:MSP430F5419A ", "DEVICE:5xx_STANDARD_UART INVOKE:2 "}, + { "DEVICE:MSP430F5418A ", "DEVICE:5xx_STANDARD_UART INVOKE:2 "}, + // Actual FRAM Devices below + { "DEVICE:MSP430FR5720 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5721 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5722 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5723 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5724 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5725 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5726 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5727 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5728 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5729 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5730 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5731 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5732 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5733 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5734 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5735 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5736 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5737 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5738 ", "DEVICE:FRAM_STANDARD_UART "}, + { "DEVICE:MSP430FR5739 ", "DEVICE:FRAM_STANDARD_UART "}, + // Actual USB 5xx Devices Below + { "DEVICE:MSP430F5529 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5528 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5527 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5526 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5525 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5524 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5522 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5521 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5519 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5517 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5515 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5514 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5510 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5509 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5508 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5507 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5506 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5505 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5504 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5503 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5502 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5501 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F5500 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6638 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6636 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6635 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6634 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6633 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6632 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6631 ", "DEVICE:5xx_STANDARD_USB "}, + { "DEVICE:MSP430F6630 ", "DEVICE:5xx_STANDARD_USB "}, + +}; // end of device table + +/**************************************************************************//** +* Factory Class Constructor. +* +* Creates a BSL Factory which can supply multiple connections. +* +* \return a MSPBSL_Factory class +******************************************************************************/ +MSPBSL_Factory::MSPBSL_Factory(void) +{ +} + +/**************************************************************************//** +* Factory Class Destructor. +* +* Class Destructor +* +******************************************************************************/ +MSPBSL_Factory::~MSPBSL_Factory(void) +{ +} + +/**************************************************************************//** +* BSL Connection creator +* +* Creates a BSL connection based on the desired parameters in the init string. +* +* \param init a string containing configuration parameters +* +* \return a MSPBSL_Connection class +******************************************************************************/ +MSPBSL_Connection* MSPBSL_Factory::getMSPBSL_Connection(string initString) +{ + initString = MSPBSL_Factory::expandInitString( initString ); + unique_ptr theBSLConnection; + // + if ( (initString.find( UART_5XX_STRING ) !=string::npos) || (initString.find( UART_FRAM_STRING ) !=string::npos)) // if it's a 5xx UART.... + { + if(initString.find( BUG_SHORT_PASSWORD ) !=string::npos ) // short password means 5438 + { + theBSLConnection.reset(new MSPBSL_Connection5438Family(initString)); + } + else if(initString.find( UART_FRAM_STRING ) !=string::npos ) // FRAM Device + { + theBSLConnection.reset(new MSPBSL_ConnectionFRAMFamily(initString)); + } + else // otherwise, any other UART device + { + theBSLConnection.reset(new MSPBSL_Connection5xx(initString)); + } + + MSPBSL_PhysicalInterfaceSerialUART* s = new MSPBSL_PhysicalInterfaceSerialUART( initString ); // Parity handled in object; + MSPBSL_PacketHandler5xxUART* p = new MSPBSL_PacketHandler5xxUART( initString ); + p->setPhysicalInterface( s ); + theBSLConnection->setPacketHandler(p); + } // all 5XX UART BSLs handled + else if (initString.find( USB_5XX_STRING ) !=string::npos) // if it's a 5xx USB.... + { + theBSLConnection.reset(new MSPBSL_Connection5xxUSB(initString)); + unique_ptr s(new MSPBSL_PhysicalInterfaceUSB(initString)); + + int retries = 5; + bool isOpen = s->physicalInterfaceCommand(ENUMERATE_COMMAND) == 0; + while (s && !isOpen && retries-- > 0) + { + std::this_thread::sleep_for(std::chrono::seconds(2)); + isOpen = s->physicalInterfaceCommand(ENUMERATE_COMMAND) == 0; + } + if (!isOpen) + { + return nullptr; + } + + MSPBSL_PacketHandler5xxUSB* p = new MSPBSL_PacketHandler5xxUSB(initString); + p->setPhysicalInterface(s.release()); + theBSLConnection->setPacketHandler(p); + } + return theBSLConnection.release(); +} + +/**************************************************************************//** +* Expand init string. +* +* Mostly used internally by the factory. This takes a initialization string +* and returns the expanded value which is used to initialize the sub-layers +* +* \param init a string containing configuration parameters +* +* +* \return an expanded parameter string +******************************************************************************/ +string MSPBSL_Factory::expandInitString( string init ) +{ + int full_loop = 0; + init += " "; // add string at back since we search for strings with space following (to distinguish between A/non-A versions + do + { + full_loop = 1; + for( unsigned int i = 0; i < REPLACE_LIST_SIZE; i++ ) + { + if( init.find( replaceList[i][0] ) !=string::npos ) + { + full_loop = init.find( replaceList[i][0] ); // using as pointer to location + init.erase( init.find( replaceList[i][0]), replaceList[i][0].size() ); + init.insert( full_loop, replaceList[i][1]); + full_loop = 0; + break; + } + } + + } + while( full_loop == 0); + + return init; +} + +/**************************************************************************//** +* errorCode. +* +* Used to transform an error code into a human readable form +* +* \param error a 16 bit error code +* +* +* \return a string explanation of that error code +******************************************************************************/ +string MSPBSL_Factory::errorCode (uint16_t error ) +{ + return "to do"; +} diff --git a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess.h b/ThirdParty/BSL430_DLL/BSL430_DLL/MSPBSL_Factory.h similarity index 64% rename from DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess.h rename to ThirdParty/BSL430_DLL/BSL430_DLL/MSPBSL_Factory.h index 5ff5c46..695c976 100644 --- a/DLL430_v3/src/TI/DLL430/EM/EemRegisters/EemRegisterAccess.h +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/MSPBSL_Factory.h @@ -1,9 +1,9 @@ /* - * EemRegisterAccess.h + * MSPBSL_Factory * - * Handles access to eem registers through EemMemoryAccess + * A factory class designed to create BSL Connections based on standard parameters * - * Copyright (C) 2007 - 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without @@ -32,25 +32,27 @@ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ +#pragma once -#ifndef DLL430_EEM_REGISTER_ACCESS_H -#define DLL430_EEM_REGISTER_ACCESS_H +#include "Connections/MSPBSL_Connection.h" -#include +class MSPBSL_Factory +{ +public: -namespace TI { namespace DLL430 { + MSPBSL_Factory(); -class EemMemoryAccess; + ~MSPBSL_Factory(); -void setEemRegisterAccess(EemMemoryAccess* ema); + static MSPBSL_Connection* getMSPBSL_Connection(std::string init); -uint32_t readEemRegister(uint32_t reg); + static std::string expandInitString( std::string init ); -void writeEemRegister(uint32_t reg, uint32_t value, bool ignoreCache = false); + static std::string errorCode (uint16_t error ); -}} +}; -#endif diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHander.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHander.cpp new file mode 100644 index 0000000..5675b15 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHander.cpp @@ -0,0 +1,113 @@ +/* + * MSPBSL_PacketHandler + * + * A class designed to define the interface for concrete Packet Handler classes + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_PacketHandler.h" +#include "MSPBSL_PhysicalInterface.h" + +using namespace std; + + +/***************************************************************************//** +* MSPBSL_PacketHandler Class destructor. +* +* Destructor for this class +* +******************************************************************************/ +MSPBSL_PacketHandler::~MSPBSL_PacketHandler() +{ + delete thePhysicalInterface; +} + +/***************************************************************************//** +* Allows an outside class to get access to the Physical Interface. +* +* An outside class might need access to the physical connection used, for +* lower level manipulation (BSL invoke, etc) +* +* \return the Physical Interface used for packet transmission +******************************************************************************/ +MSPBSL_PhysicalInterface* MSPBSL_PacketHandler::getPhysicalInterface() +{ + return thePhysicalInterface; +} + +/***************************************************************************//** +* Sets the Physical Interface layer used for sending packets +* +* Sets the Physical Interface layer to be used by this packet handler +* +* \param con the Physical Interface pointer to use for packet transmission +* +******************************************************************************/ +void MSPBSL_PacketHandler::setPhysicalInterface(MSPBSL_PhysicalInterface* con) +{ + thePhysicalInterface = con; +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_PacketHandler::getErrorInformation( uint16_t err ) +{ + switch( err ) + { + case (GENERAL_PACKET_HANDLER_ERROR): + return "An unknown error has occured with packet handling"; + break; + case (SENT_PACKET_SIZE_ZERO): + return "An attempt was made to send a packet with zero bytes"; + break; + case (SENT_PACKET_SIZE_EXCEEDS_BUFFER): + return "An attempt was made to send a packet which is too big for the sending databuffer"; + break; + case (RECEIVED_PACKET_SIZE_EXCEEDS_BUFFER): + return "a packet was received which is too large for the receiving buffer"; + break; + } + + return thePhysicalInterface->getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler.h new file mode 100644 index 0000000..a80edf3 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler.h @@ -0,0 +1,83 @@ +/* + * MSPBSL_PacketHandler + * + * A class designed to define the interface for concrete Packet Handler classes + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +class MSPBSL_PhysicalInterface; + +//Error header (top 8 bits) definitions +#define MSL_BSL_PACKET_HANDLER_HEADER 0x0200 +#define getHeader(X) (X&0xFF00) +#define MSPBSL_PacketHandlerError(X) (MSL_BSL_PACKET_HANDLER_HEADER | X) + +//Error footer (lower 8 bits) definitions +#define GENERAL_PACKET_HANDLER_ERROR MSPBSL_PacketHandlerError(0xEE) +#define SENT_PACKET_SIZE_ZERO MSPBSL_PacketHandlerError(0x01) +#define SENT_PACKET_SIZE_EXCEEDS_BUFFER MSPBSL_PacketHandlerError(0x02) +#define RECEIVED_PACKET_SIZE_EXCEEDS_BUFFER MSPBSL_PacketHandlerError(0x03) + + +// General BSL defines +#define ACKNOWLEDGE 0x00 +#define ACK ACKNOWLEDGE + +class MSPBSL_PacketHandler +{ +protected: + + MSPBSL_PhysicalInterface* thePhysicalInterface; + +public: + MSPBSL_PacketHandler() : thePhysicalInterface(NULL) {} + MSPBSL_PacketHandler(const MSPBSL_PacketHandler&) = delete; + MSPBSL_PacketHandler& operator=(const MSPBSL_PacketHandler&) = delete; + virtual ~MSPBSL_PacketHandler(); + + virtual uint16_t TX_Packet( uint8_t* buf, uint16_t bufSize ) = 0; + + virtual uint16_t RX_Packet( uint8_t* buf, uint16_t bufSize, uint16_t* numBytesReceived ) = 0; + virtual uint16_t RX_Packet( uint8_t* buf, uint16_t bufSize ) = 0; + + virtual uint16_t getMaxDataSize() = 0; + + virtual std::string getErrorInformation( uint16_t err ); + + MSPBSL_PhysicalInterface* getPhysicalInterface(); + void setPhysicalInterface(MSPBSL_PhysicalInterface* con); + +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUART.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUART.cpp new file mode 100644 index 0000000..a255153 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUART.cpp @@ -0,0 +1,239 @@ +/* + * MSPBSL_PacketHandler5xxUART + * + * A class file to corrrectly form packets for transmission via Serial UART + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_PacketHandler5xxUART.h" +#include "MSPBSL_CRCEngine.h" +#include "MSPBSL_PhysicalInterfaceSerialUART.h" + +using namespace std; + +#define MAX_PACKET_SIZE 260 +#define HANDLER_OVERHEAD 5 +/***************************************************************************//** +* Object Constructor. +* +* Creates a new MSPBSL_PacketHandler5xxUART object according to the +* supplied parameters +* +* \param initString A string containing a list of parameters for this obj +* +* \return a new MSPBSL_PacketHandler5xxUART object +******************************************************************************/ +MSPBSL_PacketHandler5xxUART::MSPBSL_PacketHandler5xxUART(string initString) +{ + //TODO: INIT CRC ENGINE +} + +/***************************************************************************//** +* MSPBSL_PacketHandler5xxUART Class destructor. +* +* Destructor for this class +* +******************************************************************************/ +MSPBSL_PacketHandler5xxUART::~MSPBSL_PacketHandler5xxUART(void) +{ +} + +/***************************************************************************//** +* 5xx UART Packet transmit. +* +* Adds the 5xx UART specific header and footer bytes to a buffer, then sends +* +* \param buf an array of unsigned bytes to send +* \param bufSize the number of bytes in the array +* +* \return 0 if success, or other value indicating and error +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUART::TX_Packet( uint8_t* buf, uint16_t bufSize ) +{ + uint16_t retValue = 0; + uint8_t rxBuf[1]; + uint8_t txBuf[MAX_PACKET_SIZE]; + uint16_t txNumBytes = bufSize + HANDLER_OVERHEAD; + + if ( txNumBytes > MAX_PACKET_SIZE ) + { + return SENT_PACKET_SIZE_EXCEEDS_BUFFER; + } + // TODO: CHANGE TO INIT STRING BASED + MSPBSL_CRCEngine crcEngine("5xx_CRC"); + crcEngine.initEngine( 0xFFFF ); + crcEngine.addBytes(buf,bufSize); + + txBuf[0] = UART_HEADER; + txBuf[1] = (uint8_t)((bufSize )&0xFF); // Low Byte + txBuf[2] = (uint8_t)((bufSize>>8)&0xFF); // High Byte + for( uint16_t i = 0; i < bufSize; i++ ) + { + txBuf[i+3] = buf[i]; + } + txBuf[txNumBytes-1] = (uint8_t)crcEngine.getHighByte(); // CheckSum High Byte + txBuf[txNumBytes-2] = (uint8_t)crcEngine.getLowByte(); // CheckSum Low Byte + + retValue |= thePhysicalInterface->TX_Bytes(txBuf, txNumBytes); + if( retValue != ACK ) + { + return retValue; + } + retValue |= thePhysicalInterface->RX_Bytes( rxBuf, 1); + if( retValue != ACK ) + { + return retValue; + } + return rxBuf[0]; + +} + +/***************************************************************************//** +* 5xx UART Packet receive. +* +* removes and verifies the 5xx UART specific header and footer bytes from +* the buffer. +* +* \param buf an array of unsigned bytes to use as an RX buffer via USB +* \param numBytes the size of the RX buffer +* +* \return 0 if sucessful, or a value indicating the error +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUART::RX_Packet(uint8_t* buf, uint16_t bufSize ) +{ + uint16_t temp; + return MSPBSL_PacketHandler5xxUART::RX_Packet(buf, bufSize, &temp); + +} + +/***************************************************************************//** +* 5xx UART Packet receive. +* +* removes and verifies the 5xx UART specific header and footer bytes from +* the buffer. +* +* \param buf an array of unsigned bytes to use as an RX buffer via USB +* \param numBytes the size of the RX buffer +* \param numBytesReceived a reference to an integer to set to the number of RXed bytes +* +* \return 0 if sucessful, or a value indicating the error +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUART::RX_Packet(uint8_t* buf, uint16_t bufSize, uint16_t* numBytesReceived ) +{ + uint16_t packetSize, rxedCRC, retValue; + uint8_t crcBuf[2]; + // to do: make temp buf for receiving overhead + MSPBSL_CRCEngine crcEngine("5xx_CRC"); + crcEngine.initEngine(0xFFFF); + retValue = thePhysicalInterface->RX_Bytes( buf, 1); + if( retValue != ACK ) + { + return retValue; + } + if( buf[0] != UART_HEADER ) + { + return UART_HEADER_INCORRECT; // header incorrect + } + retValue |= thePhysicalInterface->RX_Bytes( buf, 2); // RX size + if( retValue != ACK ) + { + return retValue; + } + packetSize = buf[0]; + packetSize |= (((uint16_t)(buf[1]))<<8)&0xFF00; + if( packetSize > bufSize ) + { + return RECEIVED_PACKET_SIZE_EXCEEDS_BUFFER; // rxed data too big for RX Buffer! + } + retValue |= thePhysicalInterface->RX_Bytes( buf, packetSize ); + if( retValue != ACK ) + { + return retValue; + } + retValue |= thePhysicalInterface->RX_Bytes( crcBuf, 2); // RX crc + if( retValue != ACK ) + { + return retValue; + } + rxedCRC = crcBuf[0]; + rxedCRC |= (((uint16_t)(crcBuf[1]))<<8)&0xFF00; + *numBytesReceived = packetSize; + if( crcEngine.verify( buf, packetSize, rxedCRC ) ) + { + return ACK; + } + else + { + return UART_CHECKSUM_INCORRECT; // CRC error + } + +} + +/***************************************************************************//** +* 5xx UART getMaxDataSize +* +* returns the maximum amount of data that can be sent in a packet by this handler +* +* \return the data size +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUART::getMaxDataSize() +{ + return (MAX_PACKET_SIZE - HANDLER_OVERHEAD); +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_PacketHandler5xxUART::getErrorInformation( uint16_t err ) +{ + switch( err ) + { + case( UART_HEADER_INCORRECT ): + return "A Packet was received which did not contain the standard UART header 0x80"; + break; + case ( UART_CHECKSUM_INCORRECT ): + return "An incorrect checksum was seen on a recieved packet"; + break; + } + return MSPBSL_PacketHandler::getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUART.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUART.h new file mode 100644 index 0000000..227ba9d --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUART.h @@ -0,0 +1,78 @@ +/* + * MSPBSL_PacketHandler5xxUART + * + * A class file to corrrectly form packets for transmission via Serial UART + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +#include "MSPBSL_PacketHandler.h" + +//UART SPECIFIC CONSTANTS and COMMANDS +#define UART_HEADER 0x80 +#define UART_CHANGE_BAUD_RATE 0x52 +#define UART_BAUD_4800 0x01 +#define UART_BAUD_9600 0x02 +#define UART_BAUD_19200 0x03 +#define UART_BAUD_38400 0x04 +#define UART_BAUD_57600 0x05 +#define UART_BAUD_115200 0x06 + +//UART SPECIFIC RETURN MESSAGES +#define UART_HEADER_INCORRECT MSPBSL_PacketHandlerError(0x04) +#define UART_CHECKSUM_INCORRECT MSPBSL_PacketHandlerError(0x05) +//#define UART_PACKET_SIZE_ZERO MSPBSL_PacketHandlerError(0x06) +//#define UART_PACKET_SIZE_EXCEEDS_BUFFER MSPBSL_PacketHandlerError(0x07) +//#define UART_UNKNOWN_ERROR MSPBSL_PacketHandlerError(0x08) +//#define UART_UNKNOWN_BAUD_RATE MSPBSL_PacketHandlerError(0x09) + +class MSPBSL_PacketHandler5xxUART : public MSPBSL_PacketHandler +{ +public: + + MSPBSL_PacketHandler5xxUART(std::string initString); + + virtual ~MSPBSL_PacketHandler5xxUART(); + + uint16_t TX_Packet( uint8_t* buf, uint16_t bufSize ); + + uint16_t RX_Packet( uint8_t* buf, uint16_t bufSize, uint16_t* numBytesReceived ); + uint16_t RX_Packet( uint8_t* buf, uint16_t bufSize ); + + uint16_t getMaxDataSize(); + + virtual std::string getErrorInformation( uint16_t err ); + +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUSB.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUSB.cpp new file mode 100644 index 0000000..64cafbb --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUSB.cpp @@ -0,0 +1,216 @@ +/* + * MSPBSL_PacketHandler5xxUSB + * + * A class file to corrrectly form packets for transmission via USB + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_PacketHandler5xxUSB.h" +#include "MSPBSL_PhysicalInterface.h" + +using namespace std; + + +#define MAX_PACKET_SIZE 64 +#define HANDLER_OVERHEAD 2 + +/***************************************************************************//** +* MSPBSL_PacketHandler5xxUSB Class Constructor. +* +* \param initString a string containing configuration parameters +* +* \return a MSPBSL_PacketHandler5xxUSB class +******************************************************************************/ +MSPBSL_PacketHandler5xxUSB::MSPBSL_PacketHandler5xxUSB(string initString) +{ +} + +/***************************************************************************//** +* MSPBSL_PacketHandler5xxUSB Class Destructor. +* +******************************************************************************/ +MSPBSL_PacketHandler5xxUSB::~MSPBSL_PacketHandler5xxUSB(void) +{} + +/***************************************************************************//** +* TX Packet. +* +* Transmits a data packet via USB +* +* \param buf an array of unsigned bytes to transmit via USB +* \param numBytes the number of bytes contained in the array +* +* \return 0 if sucessful, or a value indicating the error +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUSB::TX_Packet( uint8_t* buf, uint16_t numBytes ) +{ + + uint8_t txBuf[MAX_PACKET_SIZE]; + for( uint16_t i = 0; i < MAX_PACKET_SIZE; i++ ) + { + txBuf[i] = 0xAC; + } + if ( numBytes == 0 ) + { + return SENT_PACKET_SIZE_ZERO; + } + else if ( numBytes > (MAX_PACKET_SIZE-HANDLER_OVERHEAD ) ) + { + return SENT_PACKET_SIZE_EXCEEDS_BUFFER; + } + txBuf[0] = 63; + txBuf[1] = (uint8_t)numBytes; //type cast is safe due to size check above + for( uint16_t i = 0; i < numBytes; i++ ) + { + txBuf[i+2] = buf[i]; + } + return thePhysicalInterface->TX_Bytes( txBuf, MAX_PACKET_SIZE ); + + /* + uint16_t i; + vector::iterator it; + + if ( buf.size() > (MAX_PACKET_SIZE-HANDLER_OVERHEAD ) ) + { + return PACKET_SIZE_EXCEEDS_BUFFER; + } + + it = buf.begin(); + it = buf.insert ( it , buf.size() ); + //vector::iterator it; + it = buf.begin(); + it = buf.insert ( it , 63 ); + for( i = buf.size(); i < MAX_PACKET_SIZE; i++ ) + { + buf.push_back( 0xAC ); + } + + i = thePhysicalInterface->TX_Bytes(buf); + //buf.clear(); + return i; + */ +} + +/***************************************************************************//** +* RX Packet. +* +* Receives a data packet via USB +* +* \param buf an array of unsigned bytes to use as an RX buffer via USB +* \param numBytes the size of the RX buffer +* +* \return 0 if sucessful, or a value indicating the error +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUSB::RX_Packet(uint8_t* buf, uint16_t bufSize ) +{ + uint16_t temp; + return MSPBSL_PacketHandler5xxUSB::RX_Packet(buf, bufSize, &temp); + +} + +/***************************************************************************//** +* RX Packet. +* +* Receives a data packet via USB +* +* \param buf an array of unsigned bytes to use as an RX buffer via USB +* \param numBytes the size of the RX buffer +* \param numBytesReceived a reference to an integer to set to the number of RXed bytes +* +* \return 0 if sucessful, or a value indicating the error +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUSB::RX_Packet( uint8_t* buf, uint16_t bufSize, uint16_t* numBytesReceived ) +{ + uint8_t rxBuf[MAX_PACKET_SIZE]; + uint16_t retValue = 0; + retValue = thePhysicalInterface->RX_Bytes(rxBuf, MAX_PACKET_SIZE); + if ( retValue != ACK ) + { + return retValue; + } + if( rxBuf[1] > bufSize ) + { + return RECEIVED_PACKET_SIZE_EXCEEDS_BUFFER; // rxed data too big for RX Buffer! + } + for( uint8_t i = 0; i < rxBuf[1]; i++ ) + { + buf[i] = rxBuf[i+2]; + } + *numBytesReceived = rxBuf[1]; + return ACK; + /* + uint16_t i; + //buf.clear(); + buf.resize( 64 ); + thePhysicalInterface->RX_Bytes(buf, 64); + buf.erase( buf.begin() ); + i = buf[0]; + buf.erase( buf.begin() ); + while( buf.size() > i ) + { + buf.pop_back(); + } + + return 0; + */ +} + +/***************************************************************************//** +* 5xx USB getMaxDataSize +* +* returns the maximum amount of data that can be sent in a packet by this handler +* +* \return the data size +******************************************************************************/ +uint16_t MSPBSL_PacketHandler5xxUSB::getMaxDataSize() +{ + return (MAX_PACKET_SIZE - HANDLER_OVERHEAD); +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_PacketHandler5xxUSB::getErrorInformation( uint16_t err ) +{ + return MSPBSL_PacketHandler::getErrorInformation( err ); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUSB.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUSB.h new file mode 100644 index 0000000..47be65e --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Packet_Handlers/MSPBSL_PacketHandler5xxUSB.h @@ -0,0 +1,58 @@ +/* + * MSPBSL_PacketHandler5xxUSB + * + * A class file to corrrectly form packets for transmission via USB + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +#include "MSPBSL_PacketHandler.h" + +class MSPBSL_PacketHandler5xxUSB : public MSPBSL_PacketHandler +{ +public: + + MSPBSL_PacketHandler5xxUSB(std::string initString); + + virtual ~MSPBSL_PacketHandler5xxUSB(); + + uint16_t TX_Packet( uint8_t* buf, uint16_t bufSize ); + uint16_t RX_Packet( uint8_t* buf, uint16_t bufSize, uint16_t* numBytesReceived ); + uint16_t RX_Packet( uint8_t* buf, uint16_t bufSize ); + + uint16_t getMaxDataSize(); + + virtual std::string getErrorInformation( uint16_t err ); +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterface.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterface.h new file mode 100644 index 0000000..785eea7 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterface.h @@ -0,0 +1,125 @@ +/* + * MSPBSL_PhysicalInterface + * + * A virtual class designed to set the abstract interface for a Physical BSL connection + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +//Error header (top 8 bits) definitions +#define MSL_BSL_PHYSICAL_INTERFACE_HEADER 0x0300 +#define getHeader(X) (X&0xFF00) +#define MSPBSL_PhysicalInterfaceError(X) (MSL_BSL_PHYSICAL_INTERFACE_HEADER | X) + +//Error footer (lower 8 bits) definitions +#define GENERAL_PHYSICAL_CONNECTION_ERROR MSPBSL_PhysicalInterfaceError(0xEE) + +// General BSL defines +#define ACKNOWLEDGE 0x00 +#define ACK ACKNOWLEDGE + + +class MSPBSL_PhysicalInterface +{ +public: + +/***************************************************************************//** +* MSPBSL_PhysicalInterface Class destructor. +* +* Destructor for this class +* +******************************************************************************/ + virtual ~MSPBSL_PhysicalInterface(){}; + +/***************************************************************************//** +* Allows each physical interface to decide how it invokes the BSL. +* +* This function is required to do anything, as some BSLs (such as USB) are not +* invoked by any specific controllable action on the part of the physical +* interface. +* +******************************************************************************/ + virtual void invokeBSL() = 0; + +/***************************************************************************//** +* Transfers a buffer of bytes. +* +* Each physical interface must impliment its own specific methods for +* transfering a buffer full of bytes +* +* \param buf a pointer to an array of bytes to send +* \param numBytes the number of bytes in the array +* +* \return the result of the transfer +******************************************************************************/ + virtual uint16_t TX_Bytes( uint8_t* buf, uint16_t numBytes ) = 0; + +/***************************************************************************//** +* Receives a buffer of bytes. +* +* Each physical interface must impliment its own specific methods for receiving +* a buffer full of bytes +* +* \param buf a pointer to an array in which to write the bytes +* \param numBytes the number of bytes to receive +* +* \return the result of the transfer +******************************************************************************/ + virtual uint16_t RX_Bytes( uint8_t* buf, uint16_t numBytes) = 0; + +/***************************************************************************//** +* Reserved for Interface Specific commands. +* +* A physical interface can also impliment additional, specific commands +* +* \param command A string to be interpreted by the specific subclass +* +* \return the result of the command +******************************************************************************/ + virtual uint16_t physicalInterfaceCommand( std::string command ) = 0; + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ + virtual std::string getErrorInformation( uint16_t err ) = 0; + +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceSerialUART.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceSerialUART.cpp new file mode 100644 index 0000000..df42f43 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceSerialUART.cpp @@ -0,0 +1,369 @@ +/* + * MSPBSL_PhysicalInterfaceSerialUART + * + * A class file to allow for serial UART communication with a BSL + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include +#include "MSPBSL_TestResetControl.h" + +using namespace std; +using namespace boost::asio; + +string COM_DESIGNATOR = "COM:"; +string BAUD_DESIGNATOR = "BAUD:"; +string PARITY_DESIGNATOR = "PARITY:"; +string INVOKE_DESIGNATOR = "INVOKE:"; + +#define STANDARD_INVOKE 0x01 +#define BSL_XXXX_INVOKE 0x02 +int invokeMethod = STANDARD_INVOKE; +int baudRate; + +#ifdef _WIN32 +// -> \\.\com12 -> "\\\\.\\COM1" + const char *PORT = "COM1"; +#else + const char *PORT = "dev/ttyS3"; +#endif + +/***************************************************************************//** +* Serial UART Class Constructor. +* +* Creates a serial port UART class for BSL communication. +* +* \param initString a string containing configuration parameters +* Parameters +* COM: The COM port to use +* COM1 (any com number acceptable) +* BAUD: The initial baud rate to start with +* 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000, 256000 +* PARITY: Specifies the Partity bit +* EVEN, ODD, NONE +* INVOKE: Specifies which invoke sequence to use +* 1: 'Classic' invoke for 1/2/4/5xx devices +* 2: Two high TEST toggles before REST high for 5xx devices +* +* +* \return a MSPBSL_PhysicalInterfaceSerialUART class +******************************************************************************/ +MSPBSL_PhysicalInterfaceSerialUART::MSPBSL_PhysicalInterfaceSerialUART(string initString ) +{ + // String format... + // COM:COM1 + // BAUD:9600 + // BUG:xxx,xxx,xxx where xxx can be: + // BSL_XXXX - BSL invoke bug #XXXX + + string Com = "\\\\.\\"; + string Baud = "BAUD:9600"; + string Parity = "EVEN"; + if( initString.find(COM_DESIGNATOR) != string::npos) + { + uint16_t comStart = initString.find(COM_DESIGNATOR)+COM_DESIGNATOR.size(); + uint16_t comEnd = initString.find(' ', comStart ); + Com.append(initString.substr( comStart, comEnd-comStart)); + PORT = &Com[0]; + //Com = initString.substr( (initString.find(COM_DESIGNATOR))+COM_DESIGNATOR.size(), initString.find(" ", initString.find(COM_DESIGNATOR) )); + }// found COM port + else + { + //TODO: search COMs? + } + if( initString.find(PARITY_DESIGNATOR) != string::npos) + { + uint16_t parityStart = initString.find(PARITY_DESIGNATOR)+PARITY_DESIGNATOR.size(); + uint16_t parityEnd = initString.find(' ', parityStart ); + Parity = initString.substr( parityStart, parityEnd-parityStart); + } + if( initString.find(BAUD_DESIGNATOR) != string::npos) + { + //int baudStart = initString.find(BAUD_DESIGNATOR)+BAUD_DESIGNATOR.size(); + uint16_t baudStart = initString.find(BAUD_DESIGNATOR); + uint16_t baudEnd = initString.find(' ', baudStart ); + Baud = initString.substr( baudStart, baudEnd-baudStart); + //Baud = initString.substr( (initString.find(BAUD_DESIGNATOR))+BAUD_DESIGNATOR.size(), initString.find(" ", initString.find(BAUD_DESIGNATOR) )); + }// found COM port + // else default = 9600 + if( initString.find(INVOKE_DESIGNATOR) != string::npos) + { + uint16_t invokeStart = initString.find(INVOKE_DESIGNATOR)+INVOKE_DESIGNATOR.size(); + uint16_t invokeEnd = initString.find(' ', invokeStart ); + string sub = initString.substr( invokeStart, invokeEnd-invokeStart); + invokeMethod = atoi(sub.c_str());; + } + + + //TODO: Catch exception forunknown ports + io_context io; + port = new serial_port( io, PORT ); + port->set_option( serial_port_base::character_size( 8 ) ); + port->set_option( serial_port_base::flow_control( serial_port_base::flow_control::none ) ); + + physicalInterfaceCommand( Baud ); // set Baud Rate + + if( Parity.compare("EVEN")==0 ) + { + port->set_option( serial_port_base::parity( serial_port_base::parity::even ) ); + } + else if( Parity.compare("ODD")==0 ) + { + port->set_option( serial_port_base::parity( serial_port_base::parity::odd ) ); + } + else if( Parity.compare("NONE")==0 ) + { + port->set_option( serial_port_base::parity( serial_port_base::parity::none ) ); + } + //serial_port_base::baud_rate BAUD(9600) + //serial_port_base::character_size CSIZE( 8 ) + //serial_port_base::flow_control FLOW( serial_port_base::flow_control::none ) + //serial_port_base::parity PARITY( serial_port_base::parity::even ) + //serial_port_base::stop_bits STOP( serial_port_base::stop_bits::one ) +} + +/***************************************************************************//** +* MSPBSL_PhysicalInterfaceSerialUART Class destructor. +* +* Destructor for this class +* +******************************************************************************/ +MSPBSL_PhysicalInterfaceSerialUART::~MSPBSL_PhysicalInterfaceSerialUART(void) +{ + delete port; +} + +/***************************************************************************//** +* BSL invoke method. +* +* Causes the BSL to be invoked, using the method chosen during class +* construction. +* +******************************************************************************/ +void MSPBSL_PhysicalInterfaceSerialUART::invokeBSL() +{ + invokeBSL( invokeMethod ); +} + +/***************************************************************************//** +* BSL invoke method. +* +* Causes the BSL to be invoked, using the mrthod given in the parameter +* +* \param method an integer describing the invoke method to use: +* 1 The 'classic' BSL invoke for 1/2/4/5/6xx devices +* 2 Two test toggles before reset high for 5/6xx devices +* +******************************************************************************/ +void MSPBSL_PhysicalInterfaceSerialUART::invokeBSL(uint16_t method) +{ + + port->set_option(RESETControl(LOW_SIGNAL)); + port->set_option(TESTControl(LOW_SIGNAL)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + port->set_option(TESTControl(HIGH_SIGNAL)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + port->set_option(TESTControl(LOW_SIGNAL)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + port->set_option(TESTControl(HIGH_SIGNAL)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + if( method == STANDARD_INVOKE ) + { + port->set_option(RESETControl(HIGH_SIGNAL)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + port->set_option(TESTControl(LOW_SIGNAL)); + } + else if ( method == BSL_XXXX_INVOKE ) + { + port->set_option(TESTControl(LOW_SIGNAL)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + port->set_option(RESETControl(HIGH_SIGNAL)); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(250)); + +} + +/***************************************************************************//** +* Serial UART Transmit routine. +* +* Uses the constructed class to transmit a buffer of bytes +* +* \param buf an array of bytes to send out the interface +* \param numBytes the number of bytes in the array +* +* \return the result of the transfer, 0 meaning success, otherwise an error code +* is returned +******************************************************************************/ +uint16_t MSPBSL_PhysicalInterfaceSerialUART::TX_Bytes( uint8_t* buf, uint16_t numBytes ) +{ + //dataBuffer rx; + if( (write( *port, buffer( buf, numBytes ) )) != numBytes) + { + return ERROR_WRITING_DATA; + // return 0; + } + //to do: check write command and return value + return 0; +} + +/***************************************************************************//** +* Serial UART Receive routine. +* +* Uses the constructed class to receive a given number of bytes +* +* \param buf a reference to the buffer in which to store the received bytes +* \param numBytes The expected number of bytes to receive +* +* \return the result of the transfer, 0 meaning success, otherwise an error code +* is returned +******************************************************************************/ +//#define MAX_BUFFER_SIZE 300 +uint16_t MSPBSL_PhysicalInterfaceSerialUART::RX_Bytes( uint8_t* buf, uint16_t numBytes) +{ + //uint8_t rxBuf[MAX_BUFFER_SIZE]; + //b.resize(numBytes); + + read( *port, buffer( buf, numBytes) ); + // To do: error checking later (timeout?) + //if( (read( *port, buffer( buf, numBytes) )) != 0) + //{ + //return ERROR_READING_DATA; + // return 0; + //} + //for (unsigned int i = 0; i < numBytes; i++) + //{ + // b[i] = rxBuf[i]; + //} + + return 0; +} + +/***************************************************************************//** +* Reserved for Interface Specific commands. +* +* Reserved for specific commands to the Serial UART interface +* +* \param command A string to be interpreted by the Serial UART interface +* +* \return the result of the transfer, 0 meaning success, otherwise an error code +* is returned +******************************************************************************/ +uint16_t MSPBSL_PhysicalInterfaceSerialUART::physicalInterfaceCommand( string command ) +{ + if( command.find(BAUD_DESIGNATOR) != string::npos) + { + //4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000 and 256000 + if( command.compare("BAUD:4800")==0) + { + baudRate = 4800; + } + else if( command.compare("BAUD:9600")==0) + { + baudRate = 9600; + } + else if( command.compare("BAUD:14400")==0) + { + baudRate = 14400; + } + else if( command.compare("BAUD:19200")==0) + { + baudRate = 19200; + } + else if( command.compare("BAUD:38400")==0) + { + baudRate = 38400; + } + else if( command.compare("BAUD:57600")==0) + { + baudRate = 57600; + } + else if( command.compare("BAUD:115200")==0) + { + baudRate = 115200; + } + else if( command.compare("BAUD:128000")==0) + { + baudRate = 128000; + } + else if( command.compare("BAUD:256000")==0) + { + baudRate = 256000; + } + else + { + return UNKNOWN_BAUD_RATE; + } + port->set_option( serial_port_base::baud_rate( baudRate ) ); + //if( (port->set_option( serial_port_base::baud_rate( baudRate ) ))!= 0 ) + //{ + // return ERROR_CHANGING_BAUD_RATE; + //} + }// if baud rate command + + return 0; +} + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_PhysicalInterfaceSerialUART::getErrorInformation( uint16_t err ) +{ + switch ( err ) + { + case (ERROR_WRITING_DATA): + return "Error writing data to the USB BSL, possibly not connected or enumerated"; + break; + case (ERROR_READING_DATA): + return "Error reading data from the USB BSL, possibly not connected or enumerated"; + break; + case (UNKNOWN_BAUD_RATE): + return "Baud Rate unknown to COM Port on Host"; + break; + case (ERROR_CHANGING_BAUD_RATE): + return "Error changing COM Port to specified baud rate"; + break; + } + + return "unknown error number"; +} diff --git a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Utility.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceSerialUART.h similarity index 53% rename from DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Utility.h rename to ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceSerialUART.h index 38cdf5e..7c2bd36 100644 --- a/DLL430_v3/src/TI/DLL430/TemplateDeviceDb/Utility.h +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceSerialUART.h @@ -1,9 +1,9 @@ /* - * Utility.h + * MSPBSL_PhysicalInterfaceSerialUART * - * Utilities like const to non const converters - also has some basic types used by those converter functions. + * A class file to allow for serial UART communication with a BSL * - * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without @@ -32,36 +32,46 @@ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (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 TEMPLATE_DEVICE_DB_UTILITY_H -#define TEMPLATE_DEVICE_DB_UTILITY_H + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ -#if _MSC_VER > 1000 #pragma once -#endif -#include +#include "MSPBSL_PhysicalInterface.h" -namespace TI { namespace DLL430 { namespace TemplateDeviceDb { +#define LOW false +#define HIGH true -/** \fcnt inline const uint32_t CreateFlags(uint32_t type, bool mapped, uint32_t bits) - \brief creates flags out of parameters as the resulting flags isn't very intuitiv. -*/ -inline uint32_t CreateFlags(uint32_t type, bool mapped, uint32_t bits) +#define ERROR_WRITING_DATA MSPBSL_PhysicalInterfaceError(0x01) +#define ERROR_READING_DATA MSPBSL_PhysicalInterfaceError(0x02) +#define UNKNOWN_BAUD_RATE MSPBSL_PhysicalInterfaceError(0x03) +#define ERROR_CHANGING_BAUD_RATE MSPBSL_PhysicalInterfaceError(0x04) + + +class MSPBSL_PhysicalInterfaceSerialUART : public MSPBSL_PhysicalInterface { - return type << 8 | (mapped ? 0x1 << 7 : 0x0) | bits; -} +public: + + MSPBSL_PhysicalInterfaceSerialUART(std::string initString); + MSPBSL_PhysicalInterfaceSerialUART(const MSPBSL_PhysicalInterfaceSerialUART&) = delete; + MSPBSL_PhysicalInterfaceSerialUART& operator=(const MSPBSL_PhysicalInterfaceSerialUART&) = delete; + + virtual ~MSPBSL_PhysicalInterfaceSerialUART(); + + void invokeBSL(); + + void invokeBSL(uint16_t method); + + uint16_t TX_Bytes( uint8_t* buf, uint16_t numBytes ); -/// \enum possible value for PSA. -enum Psa{regular = 0, enhanced = 0x1, mask = 0x1}; + uint16_t RX_Bytes( uint8_t* buf, uint16_t numBytes); -/// Number of clock modules will always be 32. -static const unsigned int clockModulesSize = 32; + uint16_t physicalInterfaceCommand( std::string command ); -}//namespace TemplateDeviceDb -}//namespace DLL430 -}//namespace TI + virtual std::string getErrorInformation( uint16_t err ); -#endif //TEMPLATE_DEVICE_DB_UTILITY_H +private: + boost::asio::io_context io; + boost::asio::serial_port* port; +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceUSB.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceUSB.cpp new file mode 100644 index 0000000..ce13251 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceUSB.cpp @@ -0,0 +1,278 @@ +/* + * MSPBSL_PhysicalInterfaceUSB + * + * A class file to allow for USB communication with a BSL + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_PhysicalInterfaceUSB.h" + +using namespace std; +using namespace::boost::asio; + +//#define MSPBSL_STANDARD_USB_VID 0x2047 // Vendor ID, 0x2047 for Texas Instruments Incorporated (MSP430 Group) +//#define MSPBSL_STANDARD_USB_PID 0x0203 // Product ID (PID), 0x0200 for F552x HID BSL stack + +string VID_DESIGNATOR_HEX = "VID:0x"; +string PID_DESIGNATOR_HEX = "PID:0x"; +string VID_DESIGNATOR = "VID:"; +string PID_DESIGNATOR = "PID:"; + +uint16_t myVID = 0;//MSPBSL_STANDARD_USB_VID; +uint16_t myPID = 0;//MSPBSL_STANDARD_USB_PID; + +/***************************************************************************//** +* USB Connection Class Constructor. +* +* Creates new USB Connection for use in BSL programming, and enumerates USB +* +* \param initString a string containing configuration parameters +* +* +* \return a MSPBSL_PhysicalInterfaceUSB class +******************************************************************************/ +MSPBSL_PhysicalInterfaceUSB::MSPBSL_PhysicalInterfaceUSB(string initString) + : MSPBSL_Device(NULL) +{ + string tempVID = ""; + string tempPID = ""; + + if( initString.find(VID_DESIGNATOR_HEX) != string::npos) + { + int vidStart = initString.find(VID_DESIGNATOR_HEX)+VID_DESIGNATOR_HEX.size(); + int vidEnd = initString.find(' ', vidStart ); + tempVID.append(initString.substr( vidStart, vidEnd-vidStart)); + + std::stringstream ss; + ss << std::hex << tempVID; + ss >> myVID; + } + else if( initString.find(VID_DESIGNATOR) != string::npos) + { + + int vidStart = initString.find(VID_DESIGNATOR)+VID_DESIGNATOR.size(); + int vidEnd = initString.find(' ', vidStart ); + tempVID.append(initString.substr( vidStart, vidEnd-vidStart)); + + std::stringstream ss; + ss << tempVID; + ss >> myVID; + } + + if( initString.find(PID_DESIGNATOR_HEX) != string::npos) + { + + int pidStart = initString.find(PID_DESIGNATOR_HEX)+PID_DESIGNATOR_HEX.size(); + int pidEnd = initString.find(' ', pidStart ); + tempPID.append(initString.substr( pidStart, pidEnd-pidStart)); + + std::stringstream ss; + ss << std::hex << tempPID; + ss >> myPID; + } + else if( initString.find(PID_DESIGNATOR) != string::npos) + { + + int pidStart = initString.find(PID_DESIGNATOR)+PID_DESIGNATOR.size(); + int pidEnd = initString.find(' ', pidStart ); + tempPID.append(initString.substr( pidStart, pidEnd-pidStart)); + + std::stringstream ss; + ss << tempPID; + ss >> myPID; + } +} + +/***************************************************************************//** +* MSPBSL_PhysicalInterfaceUSB Class Destructor. +* +* Class destructor, closes the USB conntection +* +******************************************************************************/ +MSPBSL_PhysicalInterfaceUSB::~MSPBSL_PhysicalInterfaceUSB(void) +{ + hid_close(MSPBSL_Device); +} + +/***************************************************************************//** +* Transfers a buffer of bytes. +* +* Sends a buffer of bytes to a connected BSL via USB +* +* \param buf an array of bytes to send out the interface +* \param numBytes the number of bytes in the array +* +* \return the result of the transfer, 0 meaning success, otherwise an error code +* is returned +******************************************************************************/ +uint16_t MSPBSL_PhysicalInterfaceUSB::TX_Bytes( uint8_t* buf, uint16_t numBytes ) +{ + int res = 0; + if(MSPBSL_Device) + { + res = hid_write(MSPBSL_Device, buf, numBytes); + if (res < 0) + { + return ERROR_WRITING_DATA; + } + return 0; + } + else + { + return ERROR_WRITING_DATA; + } +} + +/***************************************************************************//** +* Receives a buffer of bytes. +* +* Receives a buffer of bytes to a connected BSL via USB +* +* \param b a reference to a buffer to receive the bytes +* \param numBytes the number of bytes to receive +* +* \return the result of the transfer, 0 meaning success, otherwise an error code +* is returned +******************************************************************************/ +uint16_t MSPBSL_PhysicalInterfaceUSB::RX_Bytes( uint8_t* buf, uint16_t numBytes ) +{ + int res = 0; + while (res == 0) + { + if(MSPBSL_Device) + { + res = hid_read(MSPBSL_Device, buf, numBytes); + if (res == 0) + { + //printf("waiting...\n"); + } + if (res < 0) + { + return ERROR_READING_DATA; + } + } + else + { + return ERROR_READING_DATA; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + + return 0; + +} + +/**************************************************************************//** +* Reserved for USB Specific commands. +* +* Used to send USB specific commands to this connection via a string parameter +* +* \param command A string to be interpreted by the USB connection +* "ENUMERATE:" : Causes the interface to enumerate +* "DE-ENUMERATE:" : Causes the interface to de-enumerate +* +* \return the result of the command, 0 meaning success, otherwise an error code +* is returned +******************************************************************************/ +uint16_t MSPBSL_PhysicalInterfaceUSB::physicalInterfaceCommand( string command ) +{ + + if (command.find( ENUMERATE_COMMAND ) !=string::npos) // if we wish to enumerate + { + hid_close(MSPBSL_Device); + MSPBSL_Device = hid_open(myVID,myPID,0); + + if (!MSPBSL_Device) + { + //hid_free_enumeration(hidDevices); + return ERROR_OPENING_DEVICE; + } + else + { + hid_set_nonblocking(MSPBSL_Device, 0); + } + } + + if (command.find(DE_ENUMERATE_COMMAND) != string::npos) // if we wish to enumerate + { + hid_close(MSPBSL_Device); + + if (MSPBSL_Device) + { + return ERROR_CLOSING_DEVICE; + } + } + return 0; +} + +/**************************************************************************//** +* Inherited invoke function, not used. +* +* This function is inherited from the connection class, not currently used +* +******************************************************************************/ +void MSPBSL_PhysicalInterfaceUSB::invokeBSL(){} // not used in USB... possibly use for reconnect? + +/***************************************************************************//** +* An error description function +* +* This function is meant to return a string which fully describes an error code +* which could be returned from any function within this class +* +* \param err the 16 bit error code +* +* \return A string describing the error code +******************************************************************************/ +string MSPBSL_PhysicalInterfaceUSB::getErrorInformation( uint16_t err ) +{ + switch ( err ) + { + case (ERROR_WRITING_DATA): + return "Error writing data to the USB BSL, possibly not connected or enumerated"; + break; + case (ERROR_READING_DATA): + return "Error reading data from the USB BSL, possibly not connected or enumerated"; + break; + case (ERROR_OPENING_DEVICE): + return "Error opening the connection to the USB BSL (enumerate)"; + break; + case (ERROR_CLOSING_DEVICE): + return "Error closing the connection to the USB BSL (de-enumerate)"; + break; + } + return "unknown error number"; +} diff --git a/DLL430_v3/include/DLL430/DeviceChainInfo.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceUSB.h similarity index 57% rename from DLL430_v3/include/DLL430/DeviceChainInfo.h rename to ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceUSB.h index 63f57d7..d1105ed 100644 --- a/DLL430_v3/include/DLL430/DeviceChainInfo.h +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Physical_Interfaces/MSPBSL_PhysicalInterfaceUSB.h @@ -1,9 +1,9 @@ /* - * DebugManager.h + * MSPBSL_PhysicalInterfaceUSB * - * Information about JTAG ports. + * A class file to allow for USB communication with a BSL * - * Copyright (C) 2007 - 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without @@ -32,48 +32,42 @@ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ -#if _MSC_VER > 1000 #pragma once -#endif -#ifndef DLL430_DEVICECHAININFO_H -#define DLL430_DEVICECHAININFO_H -#include +#include + +#include "MSPBSL_PhysicalInterface.h" + +#define ENUMERATE_COMMAND "ENUMERATE:" +#define DE_ENUMERATE_COMMAND "CLOSE:" + -namespace TI +#define ERROR_WRITING_DATA MSPBSL_PhysicalInterfaceError(0x01) +#define ERROR_READING_DATA MSPBSL_PhysicalInterfaceError(0x02) +#define ERROR_OPENING_DEVICE MSPBSL_PhysicalInterfaceError(0x03) +#define ERROR_CLOSING_DEVICE MSPBSL_PhysicalInterfaceError(0x04) + +class MSPBSL_PhysicalInterfaceUSB : public MSPBSL_PhysicalInterface { - namespace DLL430 - { +public: + MSPBSL_PhysicalInterfaceUSB(std::string initString); - class DeviceChainInfo - { - public: - DeviceChainInfo (std::string name, long busId, bool isMSP430, long lenIR); - ~DeviceChainInfo (); - - bool isInUse (); - bool isMSP430 (); - void setInUse (bool); - long getLenIR (); - long getBusId (); - std::string getName (); + virtual ~MSPBSL_PhysicalInterfaceUSB(void); - protected: + void invokeBSL(); - private: - std::string name; - bool inUse; - long busId; - bool MSP430; - /* Lenght of instruction register */ - long lenIR; + uint16_t TX_Bytes( uint8_t* buf, uint16_t numBytes ); - }; + uint16_t RX_Bytes( uint8_t* buf, uint16_t numBytes); - }; -}; + uint16_t physicalInterfaceCommand( std::string command ); + + virtual std::string getErrorInformation( uint16_t err ); -#endif /* DLL430_DEVICECHAININFO_H */ +private: + hid_device* MSPBSL_Device; +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_CRCEngine.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_CRCEngine.cpp new file mode 100644 index 0000000..7c4d8b3 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_CRCEngine.cpp @@ -0,0 +1,148 @@ +/* + * MSPBSL_CRCEngine + * + * A class file to encapsulate the computation of CRCs on the PC side + * + * Copyright (C) 2012 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. + * +*/ + +#include + +#include "MSPBSL_CRCEngine.h" +#include "MSPBSL_PhysicalInterfaceSerialUART.h" + +using namespace std; + +uint16_t crc16Value; + +/**************************************************************************//** +* CRC Engine Class Constructor. +* +* Creates a CRC Engine using the supplied parameters +* +* \param initString an initialization string for the CRC engine +* +* \return a BSL430_CRC_Engine class +******************************************************************************/ +MSPBSL_CRCEngine::MSPBSL_CRCEngine(string initString) +{ +} + +/**************************************************************************//** +* CRC Engine Class Destructor. +* +******************************************************************************/ +MSPBSL_CRCEngine::~MSPBSL_CRCEngine(void) +{ +} + +/**************************************************************************//** +* CRC Engine intializaer. +* +* Initializes the CRC engine +* +* \param seed a 16 bit initialization value +* +******************************************************************************/ +void MSPBSL_CRCEngine::initEngine(uint16_t seed) +{ + crc16Value = seed; +} + +/**************************************************************************//** +* Adds a byte to the ongoing CRC +* +* \param byte a 8 bit value to add to the CRC +* +******************************************************************************/ +void MSPBSL_CRCEngine::addByte(uint8_t byte) +{ + uint8_t x; + x = ((crc16Value>>8) ^ byte) & 0xff; + x ^= x>>4; + crc16Value = (crc16Value << 8) ^ (x << 12) ^ (x <<5) ^ x; +} + +/**************************************************************************//** +* Adds an array of bytes to the ongoing CRC +* +* \param buf a pointer to an 8 bit array to add to the CRC +* \param numBytes the number of bytes to process +* +******************************************************************************/ +void MSPBSL_CRCEngine::addBytes(uint8_t* buf, uint16_t numBytes) +{ + for( uint16_t i = 0; i < numBytes; i++ ) + { + addByte(buf[i]); + } +} + + +/**************************************************************************//** +* Verifies a databuffers integrity using a 16 bit crc value +* +* +* \param buf the data to verify +* \param crc the CRC value to use against the data +* +* \return a non-zero value if the CRC is correct for the data, zero if there is +* a mis-match +******************************************************************************/ +uint16_t MSPBSL_CRCEngine::verify( uint8_t* buf, uint16_t numBytes, uint16_t crc ) +{ + addBytes(buf, numBytes); + return (crc16Value == crc ); +} + +/**************************************************************************//** +* returns the low byte of the 16 bit CRC +* +* \return a 8 bit unsigned value +* +******************************************************************************/ +uint16_t MSPBSL_CRCEngine::getLowByte() +{ + return (uint8_t)(crc16Value&0xFF); +} + +/**************************************************************************//** +* returns the high byte of the 16 bit CRC +* +* \return a 8 bit unsigned value +* +******************************************************************************/ +uint16_t MSPBSL_CRCEngine::getHighByte() +{ + return (uint8_t)((crc16Value>>8)&0xFF); +} diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_CRCEngine.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_CRCEngine.h new file mode 100644 index 0000000..576d5a3 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_CRCEngine.h @@ -0,0 +1,60 @@ +/* + * MSPBSL_CRCEngine + * + * A class file to encapsulate the computation of CRCs on the PC side + * + * Copyright (C) 2012 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. + * +*/ + +#pragma once + +class MSPBSL_CRCEngine +{ +public: + + MSPBSL_CRCEngine(std::string initString); + + ~MSPBSL_CRCEngine(); + + void initEngine(uint16_t seed); + + void addByte(uint8_t byte); + + void addBytes(uint8_t* byte, uint16_t numBytes); + + uint16_t getLowByte(); + + uint16_t getHighByte(); + + uint16_t verify( uint8_t* buf, uint16_t numBytes, uint16_t crc ); +}; diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_TestResetControl.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_TestResetControl.h new file mode 100644 index 0000000..1712fd3 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/MSPBSL_TestResetControl.h @@ -0,0 +1,196 @@ +/* + * MSPBSL_TestResetControl + * + * Configuration classes for use in controling TEST and RESET lines for BSL invoke + * + * Copyright (C) 2012 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. + * +*/ + + +#pragma once + +#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) +# define MSPBSL_ON_WIN +# define BOOST_ASIO_OPTION_STORAGE DCB +#else +# define MSPBSL_ON_LINUX +# define BOOST_ASIO_OPTION_STORAGE termios +#endif + +#define HIGH_SIGNAL 1 +#define LOW_SIGNAL 0 +//------------------------------------------------------------------ +//RESET AND TEST CLASSES +//------------------------------------------------------------------ +//Class for TEST line control + +class TESTControl +{ +private: + uint16_t state; +public: + TESTControl( uint16_t initState ) + { + state = initState; + }; // constructor + boost::system::error_code store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& error ) const + { + #if defined( MSPBSL_ON_WIN ) + if( state ) + { + storage.fRtsControl = RTS_CONTROL_DISABLE; + } + else + { + storage.fRtsControl = RTS_CONTROL_ENABLE; + } + #elif defined ( MSPBSL_ON_LINUX ) + // linux currently untested + //uint16_t flags; + //ioctl(fd, TIOCMGET, &flags); + if( state ) + { + //flags &= ~TIOCM_RTS; + storage.c_cflag &= ~CRTSCTS; + } + else + { + //flags |= TIOCM_RTS; + storage.c_cflag |= CRTSCTS; + } + //tcsetattr( fd, TCSANOW, storage ); + //ioctl(fd, TIOCMSET, &flags); + #endif + return error; + }; // store + + boost::system::error_code load( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& error) + { + #if defined( MSPBSL_ON_WIN ) + if (storage.fRtsControl == RTS_CONTROL_ENABLE) + { + state = 0; + } + else + { + state = 1; + } + + #elif defined ( MSPBSL_ON_LINUX ) + //uint16_t flags; + //ioctl(fd, TIOCMGET, &flags); + //if( flags & TIOCM_RTS ) + if (storage.c_cflag & CRTSCTS) + { + state = 0; + } + else + { + state = 1; + } + #endif + return error; + }; // load + +}; // class TestControl + +class RESETControl +{ +private: + uint16_t state; +public: + RESETControl( uint16_t initState ) + { + state = initState; + }; // constructor + boost::system::error_code store( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& error ) const + { + #if defined( MSPBSL_ON_WIN ) + if( state ) + { + storage.fDtrControl = DTR_CONTROL_ENABLE; + } + else + { + storage.fDtrControl = DTR_CONTROL_DISABLE; + } + #elif defined ( MSPBSL_ON_LINUX ) + // linux currently untested + //uint16_t flags; + //ioctl(fd, TIOCMGET, &flags); + if( state ) + { + //flags |= TIOCM_DTR; + storage.c_cflag &= ~CRTSCTS; + } + else + { + //flags &= ~TIOCM_DTR; + storage.c_cflag |= CRTSCTS; + } + //tcsetattr( fd, TCSANOW, storage ); + //ioctl(fd, TIOCMSET, &flags); + + #endif + return error; + }; // store + + boost::system::error_code load( BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& error) + { + #if defined( MSPBSL_ON_WIN ) + if (storage.fDtrControl == DTR_CONTROL_ENABLE) + { + state = 1; + } + else + { + state = 0; + } + + #elif defined ( MSPBSL_ON_LINUX ) + //uint16_t flags; + //ioctl(fd, TIOCMGET, &flags); + //if( flags & TIOCM_DTR ) + if (storage.c_cflag & CRTSCTS) + { + state = 1; + } + else + { + state = 0; + } + #endif + return error; + }; // load + +}; // class TestControl diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/RAM_BSL_FLASH_MODE_MSP_FET.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/RAM_BSL_FLASH_MODE_MSP_FET.h new file mode 100644 index 0000000..ea680d9 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/RAM_BSL_FLASH_MODE_MSP_FET.h @@ -0,0 +1,302 @@ +/* http://srecord.sourceforge.net/ */ +const uint8_t RAM_BSL_FLASH_MODE_MSP_FETImage[] = +{ +0x54, 0x07, 0x08, 0x40, 0x31, 0x40, 0x90, 0x33, 0xB0, 0x13, 0x64, 0x30, +0x0C, 0x93, 0x00, 0x24, 0xB0, 0x13, 0xDA, 0x2E, 0xFF, 0x3F, 0x12, 0x01, +0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x47, 0x20, 0x04, 0x02, 0x08, 0x01, +0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, +0x3F, 0x95, 0x3F, 0x75, 0x08, 0x25, 0x01, 0x15, 0x01, 0x09, 0x01, 0x81, +0x02, 0x85, 0x3F, 0x95, 0x3F, 0x75, 0x08, 0x25, 0x01, 0x15, 0x01, 0x09, +0x01, 0x91, 0x02, 0xC0, 0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x00, 0x80, +0x32, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x09, 0x21, +0x01, 0x01, 0x00, 0x01, 0x22, 0x24, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, +0x00, 0x01, 0x07, 0x05, 0x01, 0x03, 0x40, 0x00, 0x01, 0xFF, 0x3B, 0x15, +0x4C, 0x43, 0x38, 0x40, 0x5A, 0x24, 0xB2, 0x90, 0xA5, 0xA5, 0x16, 0x24, +0x75, 0x20, 0x1A, 0x42, 0xDA, 0x24, 0x1B, 0x42, 0xDC, 0x24, 0x7A, 0xB0, +0x7F, 0x00, 0x3E, 0x20, 0xB2, 0x90, 0x80, 0x00, 0xE2, 0x24, 0x3A, 0x20, +0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0xB2, 0x40, 0x00, 0xA5, 0x44, 0x01, +0xB2, 0x40, 0xC0, 0xA5, 0x40, 0x01, 0x0D, 0x3C, 0x3E, 0x48, 0x3F, 0x48, +0x1B, 0x15, 0x0D, 0x16, 0x8D, 0x4E, 0x00, 0x00, 0x8D, 0x4F, 0x02, 0x00, +0xB2, 0xB2, 0x44, 0x01, 0xFD, 0x2B, 0x2A, 0x52, 0x0B, 0x63, 0x1E, 0x42, +0xDA, 0x24, 0x1F, 0x42, 0xDC, 0x24, 0x3E, 0x50, 0x80, 0x00, 0x0F, 0x63, +0x0B, 0x9F, 0xEA, 0x2B, 0x02, 0x20, 0x0A, 0x9E, 0xE7, 0x2B, 0x92, 0x42, +0x18, 0x24, 0x40, 0x01, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x1F, 0x42, +0x18, 0x24, 0x3F, 0x50, 0x10, 0x00, 0x82, 0x4F, 0x44, 0x01, 0x82, 0x43, +0xDA, 0x24, 0x82, 0x43, 0xDC, 0x24, 0x82, 0x43, 0xDE, 0x24, 0x82, 0x43, +0xE0, 0x24, 0x82, 0x43, 0xE2, 0x24, 0x31, 0x3C, 0x92, 0x42, 0x18, 0x24, +0x44, 0x01, 0x1F, 0x42, 0x18, 0x24, 0x3F, 0x50, 0x40, 0x00, 0x82, 0x4F, +0x40, 0x01, 0x0B, 0x3C, 0x3E, 0x48, 0x0C, 0x4A, 0x0D, 0x4B, 0xB0, 0x13, +0x46, 0x2D, 0x1A, 0x53, 0x0B, 0x63, 0x4C, 0x93, 0x1E, 0x20, 0x1A, 0x53, +0x0B, 0x63, 0x1E, 0x42, 0xE2, 0x24, 0x0F, 0x43, 0x1E, 0x52, 0xDA, 0x24, +0x1F, 0x62, 0xDC, 0x24, 0x0B, 0x9F, 0x03, 0x28, 0xD6, 0x23, 0x0A, 0x9E, +0xD4, 0x2F, 0x92, 0xB3, 0xDA, 0x24, 0x06, 0x2C, 0x3E, 0x53, 0x3F, 0x63, +0x0A, 0x9E, 0xE2, 0x23, 0x0B, 0x9F, 0xE0, 0x23, 0x7E, 0x48, 0x0C, 0x4A, +0x0D, 0x4B, 0xB0, 0x13, 0x10, 0x2D, 0xE1, 0x3F, 0x6C, 0x42, 0x38, 0x17, +0x10, 0x01, 0x1B, 0x15, 0x1E, 0x42, 0xE4, 0x24, 0x5D, 0x4E, 0x03, 0x00, +0x5F, 0x4E, 0x01, 0x00, 0x5C, 0x4E, 0x02, 0x00, 0x8C, 0x10, 0x0C, 0xDF, +0x6F, 0x4E, 0x7F, 0x80, 0x10, 0x00, 0x1F, 0x24, 0x5F, 0x83, 0x15, 0x24, +0x5F, 0x83, 0x25, 0x24, 0x5F, 0x83, 0x29, 0x24, 0x6F, 0x83, 0x1C, 0x24, +0x5F, 0x83, 0x2A, 0x24, 0x5F, 0x83, 0x0E, 0x24, 0x5F, 0x83, 0x2F, 0x24, +0x5F, 0x83, 0x36, 0x24, 0x6F, 0x83, 0x3B, 0x20, 0x5F, 0x43, 0x2E, 0x52, +0xB0, 0x13, 0x7C, 0x2D, 0x3A, 0x3C, 0xB0, 0x13, 0x8C, 0x2E, 0x37, 0x3C, +0xB0, 0x13, 0x6C, 0x2E, 0xB0, 0x13, 0xC2, 0x2E, 0x32, 0x3C, 0x4F, 0x43, +0x2E, 0x52, 0xB0, 0x13, 0x7C, 0x2D, 0x2D, 0x3C, 0xB0, 0x13, 0xD8, 0x2C, +0xB0, 0x13, 0xC2, 0x2E, 0x28, 0x3C, 0x0E, 0x4C, 0x0F, 0x4D, 0x4C, 0x43, +0xB0, 0x13, 0xAA, 0x30, 0x22, 0x3C, 0xB0, 0x13, 0x06, 0x2E, 0xB0, 0x13, +0xC2, 0x2E, 0x1D, 0x3C, 0x5F, 0x4E, 0x04, 0x00, 0x5E, 0x4E, 0x05, 0x00, +0x8E, 0x10, 0x0E, 0xDF, 0xB0, 0x13, 0x62, 0x2C, 0x14, 0x3C, 0x5F, 0x4E, +0x04, 0x00, 0x5E, 0x4E, 0x05, 0x00, 0x8E, 0x10, 0x0E, 0xDF, 0xB0, 0x13, +0xF6, 0x28, 0x0B, 0x3C, 0x2E, 0x42, 0x3C, 0x40, 0x00, 0x25, 0x0D, 0x43, +0xB0, 0x13, 0xF6, 0x28, 0x04, 0x3C, 0x7C, 0x40, 0x07, 0x00, 0xB0, 0x13, +0xC2, 0x2E, 0x1A, 0x17, 0x10, 0x01, 0xC2, 0x93, 0x80, 0x23, 0x04, 0x34, +0x1F, 0x43, 0xD2, 0xD3, 0x3C, 0x09, 0x03, 0x3C, 0x0F, 0x43, 0xD2, 0xC3, +0x3C, 0x09, 0x5E, 0x42, 0x80, 0x23, 0x7E, 0xB0, 0x60, 0x00, 0x45, 0x20, +0x5D, 0x42, 0x81, 0x23, 0x4D, 0x83, 0x37, 0x24, 0x5D, 0x83, 0x33, 0x24, +0x6D, 0x83, 0x2F, 0x24, 0x6D, 0x83, 0x25, 0x24, 0x5D, 0x83, 0x09, 0x24, +0x6D, 0x83, 0x25, 0x24, 0x5D, 0x83, 0x21, 0x24, 0x5D, 0x83, 0x19, 0x24, +0x5D, 0x83, 0x21, 0x24, 0x30, 0x3C, 0x0F, 0x93, 0x2E, 0x24, 0x5E, 0x42, +0x83, 0x23, 0x5E, 0x83, 0x08, 0x24, 0x5E, 0x83, 0x08, 0x24, 0x7E, 0x80, +0x1F, 0x00, 0x09, 0x24, 0x5E, 0x83, 0x05, 0x24, 0x22, 0x3C, 0x80, 0x00, +0xEA, 0x2F, 0x80, 0x00, 0xA2, 0x2F, 0x80, 0x00, 0x56, 0x30, 0x80, 0x00, +0x90, 0x2F, 0x0F, 0x93, 0x18, 0x24, 0x80, 0x00, 0xA8, 0x2E, 0x80, 0x00, +0x72, 0x30, 0x80, 0x00, 0x7C, 0x2F, 0x80, 0x00, 0x0C, 0x30, 0x80, 0x00, +0x2C, 0x30, 0x80, 0x00, 0xB0, 0x2D, 0x80, 0x00, 0xDE, 0x2D, 0x7E, 0x90, +0x80, 0x00, 0x02, 0x20, 0x80, 0x00, 0x1C, 0x30, 0x7E, 0x90, 0x82, 0x00, +0x02, 0x20, 0x80, 0x00, 0x5C, 0x2A, 0x80, 0x00, 0x8C, 0x30, 0x7B, 0x15, +0x0A, 0x4C, 0x0B, 0x4D, 0x04, 0x4E, 0x06, 0x4F, 0x28, 0x3C, 0x1F, 0x42, +0xDA, 0x24, 0x1F, 0xD2, 0xDC, 0x24, 0x0F, 0x93, 0x04, 0x20, 0x82, 0x4A, +0xDA, 0x24, 0x82, 0x4B, 0xDC, 0x24, 0x08, 0x4A, 0x09, 0x4B, 0x08, 0x54, +0x09, 0x63, 0x82, 0x48, 0xDE, 0x24, 0x82, 0x49, 0xE0, 0x24, 0x08, 0x43, +0x09, 0x43, 0x09, 0x93, 0x27, 0x20, 0x08, 0x94, 0x25, 0x2C, 0x1F, 0x42, +0xE2, 0x24, 0xFF, 0x46, 0x5A, 0x24, 0x92, 0x53, 0xE2, 0x24, 0x1A, 0x53, +0x0B, 0x63, 0x18, 0x53, 0x09, 0x63, 0x7A, 0xB0, 0x7F, 0x00, 0xEF, 0x23, +0xB0, 0x13, 0x76, 0x25, 0x04, 0x88, 0x4C, 0x43, 0xB2, 0x90, 0xA5, 0xA5, +0x16, 0x24, 0x0F, 0x20, 0x1F, 0x42, 0xDA, 0x24, 0x1F, 0xD2, 0xDC, 0x24, +0x0F, 0x93, 0xCD, 0x27, 0x82, 0x9A, 0xDE, 0x24, 0x03, 0x20, 0x82, 0x9B, +0xE0, 0x24, 0xC7, 0x27, 0xB0, 0x13, 0x76, 0x25, 0xEC, 0x3F, 0x6C, 0x42, +0x74, 0x17, 0x10, 0x01, 0x82, 0x43, 0xE8, 0x24, 0xB0, 0x13, 0xC4, 0x30, +0x0F, 0x3C, 0xB0, 0x13, 0x58, 0x2B, 0xD2, 0x93, 0x12, 0x24, 0x0A, 0x20, +0xF2, 0xD2, 0x42, 0x02, 0xC2, 0x93, 0x11, 0x24, 0x05, 0x20, 0xB0, 0x13, +0xB4, 0x2F, 0x4C, 0x4C, 0x82, 0x4C, 0xE8, 0x24, 0x82, 0x93, 0xE8, 0x24, +0xEE, 0x27, 0x27, 0x24, 0xF2, 0xE0, 0x80, 0x00, 0x43, 0x02, 0x5F, 0x42, +0x01, 0x1C, 0x82, 0x4F, 0xE8, 0x24, 0x1F, 0x42, 0xE4, 0x24, 0xFF, 0x90, +0x53, 0x00, 0x00, 0x00, 0x1C, 0x20, 0xB0, 0x13, 0xF2, 0x2E, 0x03, 0x43, +0x3F, 0x40, 0x7E, 0x84, 0x3E, 0x40, 0x1E, 0x00, 0x3F, 0x53, 0x3E, 0x63, +0xFD, 0x2F, 0xB0, 0x13, 0x0A, 0x2F, 0x03, 0x43, 0x3F, 0x40, 0x7E, 0x84, +0x3E, 0x40, 0x1E, 0x00, 0x3F, 0x53, 0x3E, 0x63, 0xFD, 0x2F, 0xB2, 0xD0, +0x00, 0x01, 0x6C, 0x01, 0xB2, 0x40, 0x04, 0xA5, 0x20, 0x01, 0x4C, 0x43, +0x10, 0x01, 0x5C, 0x43, 0x10, 0x01, 0x5B, 0x15, 0x0A, 0x4C, 0x0B, 0x4D, +0x08, 0x4C, 0x09, 0x4D, 0x08, 0x5E, 0x09, 0x63, 0x47, 0x43, 0x04, 0x3C, +0xB0, 0x13, 0xC2, 0x2E, 0x0A, 0x56, 0x0B, 0x63, 0x0B, 0x99, 0x03, 0x28, +0x30, 0x20, 0x0A, 0x98, 0x2E, 0x2C, 0x47, 0x93, 0x2C, 0x20, 0xB0, 0x13, +0xB2, 0x30, 0x3C, 0x53, 0x0D, 0x4C, 0x3D, 0xE3, 0x0D, 0x5D, 0x0D, 0x7D, +0x0E, 0x48, 0x0F, 0x49, 0x0E, 0x8A, 0x0F, 0x7B, 0x0D, 0x9F, 0x03, 0x28, +0x07, 0x20, 0x0C, 0x9E, 0x05, 0x2C, 0xB0, 0x13, 0xB2, 0x30, 0x06, 0x4C, +0x36, 0x53, 0x02, 0x3C, 0x06, 0x48, 0x06, 0x8A, 0x1F, 0x42, 0xE6, 0x24, +0x1F, 0x53, 0x0E, 0x46, 0x0C, 0x4A, 0x0D, 0x4B, 0xB0, 0x13, 0x0A, 0x2B, +0x47, 0x4C, 0x4C, 0x93, 0xD3, 0x23, 0x1F, 0x42, 0xE6, 0x24, 0xFF, 0x40, +0x3A, 0x00, 0x00, 0x00, 0x0C, 0x46, 0x1C, 0x53, 0xB0, 0x13, 0xD8, 0x2F, +0xCB, 0x3F, 0x56, 0x17, 0x10, 0x01, 0xC2, 0x43, 0x12, 0x24, 0xC2, 0x43, +0x11, 0x24, 0xC2, 0x43, 0x00, 0x24, 0xC2, 0x43, 0x01, 0x24, 0xC2, 0x43, +0x3C, 0x09, 0xF2, 0x43, 0x02, 0x24, 0xF2, 0x43, 0x04, 0x24, 0xC2, 0x43, +0x10, 0x24, 0x7E, 0x40, 0x80, 0x00, 0xC2, 0x4E, 0x21, 0x09, 0xC2, 0x4E, +0x23, 0x09, 0xF2, 0x40, 0x8C, 0x00, 0x20, 0x09, 0xF2, 0x40, 0x8C, 0x00, +0x22, 0x09, 0xF2, 0x40, 0x03, 0x00, 0x2F, 0x09, 0xF2, 0x40, 0x03, 0x00, +0x2E, 0x09, 0xC2, 0x4E, 0xC8, 0x23, 0xF2, 0x40, 0x10, 0x00, 0xC9, 0x23, +0xC2, 0x4E, 0xCA, 0x23, 0xC2, 0x4E, 0xCE, 0x23, 0xF2, 0x40, 0x40, 0x00, +0xCF, 0x23, 0xC2, 0x4E, 0x88, 0x23, 0xC2, 0x43, 0x89, 0x23, 0xC2, 0x43, +0x8A, 0x23, 0xF2, 0x40, 0x40, 0x00, 0x8F, 0x23, 0xF2, 0x40, 0x40, 0x00, +0x3C, 0x09, 0xC2, 0x43, 0x3E, 0x09, 0xC2, 0xCE, 0x3E, 0x09, 0x10, 0x01, +0x5E, 0x42, 0x02, 0x24, 0x7E, 0x93, 0x2B, 0x24, 0x7E, 0x90, 0x09, 0x00, +0x06, 0x28, 0x7E, 0x42, 0xF2, 0x82, 0x02, 0x24, 0xD2, 0x43, 0x10, 0x24, +0x14, 0x3C, 0x7E, 0x92, 0x05, 0x2C, 0xF2, 0x43, 0x02, 0x24, 0xC2, 0x43, +0x10, 0x24, 0x0D, 0x3C, 0x7E, 0x42, 0xD2, 0x93, 0x0E, 0x24, 0x05, 0x20, +0xC2, 0x43, 0x02, 0x24, 0xD2, 0x43, 0x10, 0x24, 0x04, 0x3C, 0xF2, 0x43, +0x02, 0x24, 0xC2, 0x43, 0x10, 0x24, 0x4F, 0x43, 0x07, 0x3C, 0x1D, 0x42, +0x06, 0x24, 0xEF, 0x4D, 0x78, 0x23, 0x92, 0x53, 0x06, 0x24, 0x5F, 0x53, +0x4F, 0x9E, 0xF7, 0x2B, 0xC2, 0x4E, 0x21, 0x09, 0x10, 0x01, 0xC2, 0x43, +0x10, 0x24, 0x10, 0x01, 0xF2, 0xB0, 0x0F, 0x00, 0x84, 0x23, 0x0F, 0x20, +0xC2, 0x93, 0x84, 0x23, 0x06, 0x34, 0x5E, 0x42, 0x20, 0x09, 0x7E, 0xF2, +0xC2, 0x4E, 0xEA, 0x24, 0x14, 0x3C, 0x5E, 0x42, 0x22, 0x09, 0x7E, 0xF2, +0xC2, 0x4E, 0xEA, 0x24, 0x0E, 0x3C, 0xC2, 0x93, 0x84, 0x23, 0x06, 0x34, +0x5E, 0x42, 0xC8, 0x23, 0x7E, 0xF2, 0xC2, 0x4E, 0xEA, 0x24, 0x05, 0x3C, +0x5E, 0x42, 0x88, 0x23, 0x7E, 0xF2, 0xC2, 0x4E, 0xEA, 0x24, 0x5E, 0x42, +0xEA, 0x24, 0x42, 0x19, 0x4E, 0x10, 0xC2, 0x4E, 0xEA, 0x24, 0xB0, 0x13, +0xBE, 0x30, 0xE2, 0x43, 0x02, 0x24, 0x3C, 0x40, 0xEA, 0x24, 0x80, 0x00, +0x2A, 0x2E, 0x7B, 0x15, 0x0A, 0x4C, 0x0B, 0x4D, 0x06, 0x4E, 0x08, 0x4F, +0xB0, 0x13, 0x76, 0x25, 0xB2, 0x43, 0x54, 0x01, 0x04, 0x4A, 0x05, 0x4B, +0x07, 0x3C, 0x15, 0x15, 0x0F, 0x16, 0x6E, 0x4F, 0xC2, 0x4E, 0x52, 0x01, +0x14, 0x53, 0x05, 0x63, 0x0E, 0x4A, 0x0F, 0x4B, 0x0E, 0x56, 0x0F, 0x63, +0x05, 0x9F, 0x03, 0x28, 0x08, 0x20, 0x04, 0x9E, 0x06, 0x2C, 0xB2, 0x90, +0xA5, 0xA5, 0x16, 0x24, 0xEC, 0x27, 0x2C, 0x42, 0x04, 0x3C, 0x98, 0x42, +0x54, 0x01, 0x00, 0x00, 0x0C, 0x43, 0x74, 0x17, 0x10, 0x01, 0x3B, 0x15, +0x0A, 0x4C, 0x0B, 0x4D, 0x09, 0x4E, 0x08, 0x4F, 0xB0, 0x13, 0x76, 0x25, +0x0E, 0x4A, 0x0F, 0x4B, 0x0E, 0x59, 0x0F, 0x63, 0x3E, 0x53, 0x3F, 0x63, +0x0B, 0x3C, 0x1F, 0x15, 0x0D, 0x16, 0x69, 0x4D, 0x0C, 0x4E, 0x0C, 0x8A, +0x0D, 0x48, 0x0D, 0x5C, 0xCD, 0x49, 0x00, 0x00, 0x3E, 0x53, 0x3F, 0x63, +0x0F, 0x9B, 0x09, 0x28, 0x02, 0x20, 0x0E, 0x9A, 0x06, 0x28, 0xB2, 0x90, +0xA5, 0xA5, 0x16, 0x24, 0xEC, 0x27, 0x6C, 0x42, 0x01, 0x3C, 0x4C, 0x43, +0x38, 0x17, 0x10, 0x01, 0x5E, 0x42, 0x3E, 0x09, 0x2E, 0xB2, 0x02, 0x28, +0x80, 0x00, 0x22, 0x2C, 0xA2, 0xB3, 0x08, 0x09, 0x02, 0x28, 0x80, 0x00, +0x22, 0x2F, 0xA2, 0xB2, 0x08, 0x09, 0x02, 0x28, 0x80, 0x00, 0x80, 0x30, +0xD2, 0xB3, 0x30, 0x09, 0x02, 0x28, 0x80, 0x00, 0x4C, 0x2E, 0x4E, 0x93, +0x02, 0x34, 0x80, 0x00, 0x7A, 0x29, 0x3E, 0xB0, 0x40, 0x00, 0x02, 0x28, +0x80, 0x00, 0x50, 0x2F, 0x3E, 0xB0, 0x20, 0x00, 0x02, 0x28, 0xB0, 0x13, +0xFC, 0x2F, 0x10, 0x01, 0x21, 0x83, 0x81, 0x43, 0x00, 0x00, 0xB2, 0x40, +0x28, 0x96, 0x00, 0x09, 0x92, 0x42, 0x14, 0x24, 0x12, 0x09, 0xB2, 0x40, +0x00, 0x03, 0x10, 0x09, 0x82, 0x43, 0x14, 0x09, 0x3F, 0x40, 0x4C, 0x01, +0x3F, 0x53, 0xFE, 0x2F, 0x2F, 0x41, 0x0E, 0x4F, 0x1E, 0x53, 0x81, 0x4E, +0x00, 0x00, 0x3F, 0x90, 0xE9, 0x03, 0x05, 0x2C, 0x82, 0x93, 0x14, 0x09, +0xEF, 0x23, 0x92, 0xD3, 0x02, 0x09, 0x21, 0x53, 0x10, 0x01, 0xB2, 0x90, +0xA5, 0xA5, 0x16, 0x24, 0x1A, 0x20, 0x4C, 0x43, 0x92, 0xB3, 0x44, 0x01, +0xFD, 0x2F, 0x92, 0x42, 0x18, 0x24, 0x44, 0x01, 0x1D, 0x42, 0x18, 0x24, +0x2D, 0x53, 0x82, 0x4D, 0x40, 0x01, 0x1F, 0x15, 0x0D, 0x16, 0xCD, 0x43, +0x00, 0x00, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x1F, 0x42, 0x18, 0x24, +0x3F, 0x50, 0x10, 0x00, 0x82, 0x4F, 0x44, 0x01, 0x10, 0x01, 0x6C, 0x42, +0x10, 0x01, 0xF2, 0xD0, 0x10, 0x00, 0x3C, 0x09, 0xF2, 0x40, 0x80, 0x00, +0x23, 0x09, 0x03, 0x3C, 0xF2, 0xF0, 0xFA, 0x00, 0x3E, 0x09, 0xC2, 0x43, +0x10, 0x24, 0x82, 0x43, 0xEA, 0x24, 0xB0, 0x13, 0x3A, 0x27, 0x34, 0x40, +0x80, 0x00, 0x82, 0xC4, 0x20, 0x09, 0x82, 0xC4, 0x22, 0x09, 0xE2, 0xC2, +0x3E, 0x09, 0x82, 0xD4, 0x20, 0x09, 0x82, 0xD4, 0x22, 0x09, 0xD2, 0xB3, +0x3E, 0x09, 0xE8, 0x2F, 0x10, 0x01, 0x21, 0x83, 0x0F, 0x41, 0x0F, 0x53, +0xB0, 0x13, 0xBA, 0x2A, 0x2C, 0x92, 0x04, 0x20, 0x6C, 0x42, 0xB0, 0x13, +0xC2, 0x2E, 0x12, 0x3C, 0x1F, 0x42, 0xE6, 0x24, 0xFF, 0x40, 0x3A, 0x00, +0x00, 0x00, 0x1F, 0x42, 0xE6, 0x24, 0xEF, 0x41, 0x01, 0x00, 0x1F, 0x42, +0xE6, 0x24, 0xDF, 0x41, 0x01, 0x00, 0x02, 0x00, 0x3C, 0x40, 0x03, 0x00, +0xB0, 0x13, 0xD8, 0x2F, 0x21, 0x53, 0x10, 0x01, 0x0A, 0x12, 0x7E, 0x40, +0x3F, 0x00, 0xC2, 0x93, 0xCA, 0x23, 0x12, 0x34, 0xC2, 0x4E, 0x80, 0x1C, +0x3D, 0x40, 0x81, 0x1C, 0x4F, 0x43, 0x06, 0x3C, 0x0A, 0x4C, 0x0A, 0x5F, +0xED, 0x4A, 0x00, 0x00, 0x1D, 0x53, 0x5F, 0x53, 0x4F, 0x9E, 0xF8, 0x2B, +0xF2, 0x40, 0x40, 0x00, 0xCA, 0x23, 0x01, 0x3C, 0x4E, 0x43, 0x4C, 0x4E, +0x3A, 0x41, 0x10, 0x01, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x92, 0x42, +0x18, 0x24, 0x44, 0x01, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x1F, 0x42, +0x18, 0x24, 0x3F, 0x50, 0x06, 0x00, 0x82, 0x4F, 0x40, 0x01, 0xC2, 0x43, +0xE0, 0xFF, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x1F, 0x42, 0x18, 0x24, +0x3F, 0x50, 0x10, 0x00, 0x82, 0x4F, 0x44, 0x01, 0x4C, 0x43, 0x10, 0x01, +0x1B, 0x15, 0xB2, 0x90, 0xA5, 0xA5, 0x16, 0x24, 0x12, 0x20, 0x4F, 0x43, +0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x1D, 0x15, 0x0A, 0x16, 0xCA, 0x4E, +0x00, 0x00, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x1D, 0x15, 0x0A, 0x16, +0x6B, 0x4A, 0x4E, 0x9B, 0x03, 0x24, 0x5F, 0x43, 0x01, 0x3C, 0x6F, 0x42, +0x4C, 0x4F, 0x1A, 0x17, 0x10, 0x01, 0x1B, 0x15, 0xB2, 0x90, 0xA5, 0xA5, +0x16, 0x24, 0x12, 0x20, 0x4F, 0x43, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, +0x1D, 0x15, 0x0A, 0x16, 0x8A, 0x4E, 0x00, 0x00, 0x92, 0xB3, 0x44, 0x01, +0xFD, 0x2F, 0x1D, 0x15, 0x0A, 0x16, 0x2B, 0x4A, 0x0E, 0x9B, 0x03, 0x24, +0x5F, 0x43, 0x01, 0x3C, 0x6F, 0x42, 0x4C, 0x4F, 0x1A, 0x17, 0x10, 0x01, +0x3B, 0x15, 0x0A, 0x4C, 0x48, 0x4F, 0xB0, 0x13, 0x48, 0x30, 0x4C, 0x93, +0x0B, 0x20, 0xB2, 0x90, 0x05, 0x00, 0xE8, 0x24, 0x07, 0x28, 0x0F, 0x4E, +0x1E, 0x42, 0xE8, 0x24, 0x2E, 0x82, 0x0C, 0x4A, 0xB0, 0x13, 0xE6, 0x27, +0x48, 0x93, 0x02, 0x20, 0xB0, 0x13, 0xC2, 0x2E, 0xB0, 0x13, 0x3A, 0x2F, +0x38, 0x17, 0x10, 0x01, 0xC2, 0x93, 0x82, 0x23, 0x11, 0x20, 0x5E, 0x42, +0x84, 0x23, 0x7E, 0xF0, 0x0F, 0x00, 0x0A, 0x24, 0x5E, 0x93, 0x0C, 0x20, +0xC2, 0x93, 0x84, 0x23, 0x03, 0x34, 0xF2, 0xD2, 0xC8, 0x23, 0x02, 0x3C, +0xF2, 0xD2, 0x88, 0x23, 0x80, 0x00, 0x3A, 0x30, 0xB0, 0x13, 0x8C, 0x30, +0x10, 0x01, 0x5E, 0x42, 0x84, 0x23, 0x7E, 0xF0, 0x0F, 0x00, 0x0C, 0x24, +0x5E, 0x93, 0x0C, 0x20, 0xC2, 0x93, 0x84, 0x23, 0x04, 0x34, 0xF2, 0xF0, +0xD7, 0x00, 0xC8, 0x23, 0x03, 0x3C, 0xF2, 0xF0, 0xD7, 0x00, 0x88, 0x23, +0xB0, 0x13, 0x3A, 0x30, 0x10, 0x01, 0xB2, 0x90, 0xA5, 0xA5, 0x16, 0x24, +0x0C, 0x20, 0x4C, 0x43, 0x1F, 0x42, 0x44, 0x01, 0x3F, 0xF0, 0x10, 0x00, +0x1F, 0x52, 0x18, 0x24, 0x3F, 0x50, 0x40, 0x00, 0x82, 0x4F, 0x44, 0x01, +0x10, 0x01, 0x6C, 0x42, 0x10, 0x01, 0x82, 0x4C, 0x06, 0x24, 0x1E, 0x42, +0x86, 0x23, 0x5F, 0x42, 0x02, 0x24, 0x0F, 0x9E, 0x05, 0x28, 0xC2, 0x4E, +0x02, 0x24, 0xC2, 0x43, 0x0E, 0x24, 0x02, 0x3C, 0xD2, 0x43, 0x0E, 0x24, +0x80, 0x00, 0xF8, 0x29, 0xF2, 0xD0, 0x10, 0x00, 0x3C, 0x09, 0xC2, 0x43, +0x23, 0x09, 0xD2, 0x93, 0x10, 0x24, 0x03, 0x20, 0xB0, 0x13, 0xF8, 0x29, +0x02, 0x3C, 0xF2, 0xD2, 0x20, 0x09, 0xD2, 0xC3, 0x30, 0x09, 0x10, 0x01, +0x1B, 0x15, 0x0A, 0x4C, 0x0B, 0x4D, 0xB2, 0x90, 0xA5, 0xA5, 0x16, 0x24, +0x06, 0x20, 0xB0, 0x13, 0x76, 0x25, 0xB0, 0x13, 0xCA, 0x30, 0x4C, 0x43, +0x01, 0x3C, 0x6C, 0x42, 0x1A, 0x17, 0x10, 0x01, 0x1C, 0x42, 0xE4, 0x24, +0x1C, 0x53, 0xB0, 0x13, 0x96, 0x30, 0x4C, 0x93, 0x03, 0x20, 0x4C, 0x43, +0x80, 0x00, 0xC2, 0x2E, 0x7C, 0x40, 0x05, 0x00, 0x80, 0x00, 0xC2, 0x2E, +0xB0, 0x13, 0xBE, 0x30, 0xE2, 0x43, 0x02, 0x24, 0xC2, 0x43, 0xEA, 0x24, +0xD2, 0x42, 0x01, 0x24, 0xEB, 0x24, 0x3C, 0x40, 0xEA, 0x24, 0x80, 0x00, +0x2A, 0x2E, 0x1F, 0x42, 0xE6, 0x24, 0xFF, 0x40, 0x3B, 0x00, 0x00, 0x00, +0x1F, 0x42, 0xE6, 0x24, 0xCF, 0x4C, 0x01, 0x00, 0x2C, 0x43, 0x80, 0x00, +0xD8, 0x2F, 0xB0, 0x13, 0x66, 0x2F, 0xB0, 0x13, 0xC6, 0x2F, 0xB0, 0x13, +0x70, 0x28, 0x5C, 0xB3, 0xFC, 0x2B, 0xB0, 0x13, 0x76, 0x26, 0xF9, 0x3F, +0x03, 0x43, 0xB2, 0x40, 0x28, 0x96, 0x00, 0x09, 0xA2, 0xC3, 0x02, 0x09, +0xB2, 0xC0, 0x00, 0x04, 0x08, 0x09, 0xB2, 0x40, 0x00, 0x96, 0x00, 0x09, +0x10, 0x01, 0xB2, 0x40, 0x28, 0x96, 0x00, 0x09, 0x82, 0x43, 0x02, 0x09, +0xB2, 0xC0, 0x00, 0x01, 0x10, 0x09, 0xB2, 0x40, 0x00, 0x96, 0x00, 0x09, +0x10, 0x01, 0xB0, 0x13, 0xA0, 0x30, 0xB0, 0x13, 0xA0, 0x2B, 0xB0, 0x13, +0x7A, 0x29, 0xB2, 0xF0, 0xF9, 0xFF, 0x08, 0x09, 0xA2, 0xD3, 0x02, 0x09, +0x10, 0x01, 0x92, 0x42, 0x18, 0x24, 0x40, 0x01, 0x1F, 0x42, 0x18, 0x24, +0x3F, 0x50, 0x10, 0x00, 0x82, 0x4F, 0x44, 0x01, 0x4C, 0x43, 0x10, 0x01, +0xD2, 0x43, 0x11, 0x24, 0xF2, 0xD0, 0x10, 0x00, 0x3C, 0x09, 0xF2, 0xC0, +0x40, 0x00, 0x3E, 0x09, 0x82, 0x43, 0x10, 0x09, 0x10, 0x01, 0x82, 0x43, +0xDE, 0x24, 0x82, 0x43, 0xE0, 0x24, 0x82, 0x43, 0xDA, 0x24, 0x82, 0x43, +0xDC, 0x24, 0x82, 0x43, 0xE2, 0x24, 0x10, 0x01, 0xB0, 0x13, 0xB8, 0x30, +0xD2, 0x42, 0x82, 0x23, 0x00, 0x24, 0xB0, 0x13, 0x3A, 0x30, 0xD2, 0x43, +0x12, 0x24, 0x10, 0x01, 0xB0, 0x13, 0xBE, 0x30, 0xF2, 0x40, 0x09, 0x00, +0x02, 0x24, 0x3C, 0x40, 0x5E, 0x25, 0x80, 0x00, 0x2A, 0x2E, 0xB0, 0x13, +0xBE, 0x30, 0xF2, 0x40, 0x29, 0x00, 0x02, 0x24, 0x3C, 0x40, 0x4C, 0x25, +0x80, 0x00, 0x2A, 0x2E, 0x4C, 0x43, 0xC2, 0x93, 0x8A, 0x23, 0x04, 0x34, +0x5C, 0x42, 0x8A, 0x23, 0x7C, 0xF0, 0x7F, 0x00, 0x10, 0x01, 0x32, 0xC2, +0x03, 0x43, 0xB2, 0x40, 0x02, 0x1C, 0xE4, 0x24, 0xB2, 0x40, 0x1B, 0x24, +0xE6, 0x24, 0x10, 0x01, 0xC2, 0x4C, 0x1A, 0x24, 0x3C, 0x40, 0x1A, 0x24, +0xB0, 0x13, 0xA0, 0x2C, 0x4C, 0x93, 0xFA, 0x27, 0x10, 0x01, 0xB0, 0x13, +0xBE, 0x30, 0xF2, 0x40, 0x12, 0x00, 0x02, 0x24, 0x3C, 0x40, 0x16, 0x25, +0x80, 0x00, 0x2A, 0x2E, 0xB0, 0x13, 0xA0, 0x2B, 0xF2, 0xF0, 0x9F, 0x00, +0x3E, 0x09, 0xC2, 0x43, 0x11, 0x24, 0x10, 0x01, 0xB0, 0x13, 0xBE, 0x30, +0xD2, 0x43, 0x02, 0x24, 0x3C, 0x40, 0x00, 0x24, 0x80, 0x00, 0x2A, 0x2E, +0xB0, 0x13, 0xBE, 0x30, 0xE2, 0x43, 0x02, 0x24, 0x3C, 0x40, 0xEA, 0x24, +0x80, 0x00, 0x2A, 0x2E, 0xB0, 0x13, 0xB8, 0x30, 0xD2, 0x42, 0x84, 0x23, +0x01, 0x24, 0x80, 0x00, 0x3A, 0x30, 0xF2, 0x43, 0x02, 0x24, 0xC2, 0x43, +0x10, 0x24, 0xC2, 0x43, 0x21, 0x09, 0x10, 0x01, 0x6C, 0x42, 0xB2, 0x90, +0xA5, 0xA5, 0x16, 0x24, 0x01, 0x20, 0x4C, 0x43, 0x10, 0x01, 0xF2, 0x40, +0x24, 0x00, 0x02, 0x24, 0x3C, 0x40, 0x28, 0x25, 0x80, 0x00, 0x2A, 0x2E, +0xB2, 0x40, 0x80, 0x5A, 0x5C, 0x01, 0x32, 0xC2, 0x03, 0x43, 0x0C, 0x43, +0x10, 0x01, 0xB0, 0x13, 0xB8, 0x30, 0xD2, 0x42, 0x82, 0x23, 0x3F, 0x09, +0x80, 0x00, 0x3A, 0x30, 0xB0, 0x13, 0xA0, 0x30, 0xB2, 0x40, 0x04, 0xA5, +0x20, 0x01, 0x10, 0x01, 0xF2, 0xD2, 0x20, 0x09, 0xF2, 0xD2, 0x22, 0x09, +0x10, 0x01, 0xB2, 0x40, 0xA5, 0xA5, 0x16, 0x24, 0x4C, 0x43, 0x10, 0x01, +0x3F, 0x40, 0xDF, 0x2E, 0x3F, 0x53, 0xFE, 0x2F, 0x10, 0x01, 0xB0, 0x13, +0xE2, 0x2B, 0x80, 0x00, 0xC2, 0x2E, 0x3C, 0x40, 0x3E, 0x00, 0x10, 0x01, +0xF2, 0xD2, 0x22, 0x09, 0x10, 0x01, 0xC2, 0x43, 0x23, 0x09, 0x10, 0x01, +0xC2, 0x43, 0x8A, 0x23, 0x10, 0x01, 0x1B, 0x15, 0x10, 0x01, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, +}; + +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_address[] = +{ +0x00002500, +}; +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_length_of_sections[] = +{ +0x00000D00, +}; +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_sections = 0x00000001; +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_termination = 0x00000000; +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_start = 0x00002500; +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_finish = 0x00003200; +const uint32_t RAM_BSL_FLASH_MODE_MSP_FETImage_length = 0x00000D00; + +#define RAM_BSL_FLASH_MODE_MSP_FETIMAGE_TERMINATION 0x00000000 +#define RAM_BSL_FLASH_MODE_MSP_FETIMAGE_START 0x00002500 +#define RAM_BSL_FLASH_MODE_MSP_FETIMAGE_FINISH 0x00003200 +#define RAM_BSL_FLASH_MODE_MSP_FETIMAGE_LENGTH 0x00000D00 +#define RAM_BSL_FLASH_MODE_MSP_FETIMAGE_SECTIONS 0x00000001 diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/RAM_BSL_FLASH_MODE_eZ_FET.h b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/RAM_BSL_FLASH_MODE_eZ_FET.h new file mode 100644 index 0000000..a1ae144 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/Utility_Classes/RAM_BSL_FLASH_MODE_eZ_FET.h @@ -0,0 +1,302 @@ +/* http://srecord.sourceforge.net/ */ +const uint8_t RAM_BSL_FLASH_MODE_eZ_FETImage[] = +{ +0x54, 0x07, 0x08, 0x40, 0x31, 0x40, 0x90, 0x33, 0xB0, 0x13, 0x16, 0x2F, +0x0C, 0x93, 0x00, 0x24, 0xB0, 0x13, 0x6E, 0x2C, 0xFF, 0x3F, 0x12, 0x01, +0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x47, 0x20, 0x03, 0x02, 0x08, 0x01, +0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, +0x3F, 0x95, 0x3F, 0x75, 0x08, 0x25, 0x01, 0x15, 0x01, 0x09, 0x01, 0x81, +0x02, 0x85, 0x3F, 0x95, 0x3F, 0x75, 0x08, 0x25, 0x01, 0x15, 0x01, 0x09, +0x01, 0x91, 0x02, 0xC0, 0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x00, 0x80, +0x32, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x09, 0x21, +0x01, 0x01, 0x00, 0x01, 0x22, 0x24, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, +0x00, 0x01, 0x07, 0x05, 0x01, 0x03, 0x40, 0x00, 0x01, 0xFF, 0xF2, 0xB0, +0x0F, 0x00, 0x84, 0x23, 0x09, 0x20, 0xC2, 0x93, 0x84, 0x23, 0x03, 0x34, +0x5E, 0x42, 0x20, 0x09, 0x0B, 0x3C, 0x5E, 0x42, 0x22, 0x09, 0x08, 0x3C, +0xC2, 0x93, 0x84, 0x23, 0x03, 0x34, 0x5E, 0x42, 0xC8, 0x23, 0x02, 0x3C, +0x5E, 0x42, 0x88, 0x23, 0x7E, 0xF2, 0xC2, 0x4E, 0xEA, 0x24, 0x5E, 0x42, +0xEA, 0x24, 0x42, 0x19, 0x4E, 0x10, 0xC2, 0x4E, 0xEA, 0x24, 0xB0, 0x13, +0x30, 0x2F, 0x3C, 0x40, 0xEA, 0x24, 0x80, 0x00, 0x7A, 0x2E, 0xF2, 0x43, +0x02, 0x24, 0xC2, 0x43, 0x10, 0x24, 0xC2, 0x43, 0x21, 0x09, 0x10, 0x01, +0xC2, 0x93, 0x82, 0x23, 0x11, 0x20, 0x5E, 0x42, 0x84, 0x23, 0x7E, 0xF0, +0x0F, 0x00, 0x0A, 0x24, 0x5E, 0x93, 0x0E, 0x20, 0xC2, 0x93, 0x84, 0x23, +0x03, 0x34, 0xF2, 0xD2, 0xC8, 0x23, 0x02, 0x3C, 0xF2, 0xD2, 0x88, 0x23, +0x80, 0x00, 0xBE, 0x25, 0xF2, 0xD2, 0x20, 0x09, 0xF2, 0xD2, 0x22, 0x09, +0x10, 0x01, 0xC2, 0x93, 0x80, 0x23, 0x04, 0x34, 0x1F, 0x43, 0xD2, 0xD3, +0x3C, 0x09, 0x03, 0x3C, 0x0F, 0x43, 0xD2, 0xC3, 0x3C, 0x09, 0x5E, 0x42, +0x80, 0x23, 0x7E, 0xB0, 0x60, 0x00, 0x8F, 0x20, 0x5D, 0x42, 0x81, 0x23, +0x4D, 0x83, 0x80, 0x24, 0x5D, 0x83, 0x6B, 0x24, 0x6D, 0x83, 0x67, 0x24, +0x6D, 0x83, 0x45, 0x24, 0x5D, 0x83, 0x09, 0x24, 0x6D, 0x83, 0x52, 0x24, +0x5D, 0x83, 0x46, 0x24, 0x5D, 0x83, 0x33, 0x24, 0x5D, 0x83, 0x54, 0x24, +0x7A, 0x3C, 0x1F, 0xB3, 0x78, 0x28, 0x5E, 0x42, 0x83, 0x23, 0x5E, 0x83, +0x08, 0x24, 0x5E, 0x83, 0x0F, 0x24, 0x7E, 0x80, 0x1F, 0x00, 0x1C, 0x24, +0x5E, 0x83, 0x13, 0x24, 0x6C, 0x3C, 0xC2, 0x43, 0x23, 0x09, 0xF2, 0x40, +0x12, 0x00, 0x02, 0x24, 0x3C, 0x40, 0x16, 0x25, 0x80, 0x00, 0x7A, 0x2E, +0xC2, 0x43, 0x23, 0x09, 0xF2, 0x40, 0x29, 0x00, 0x02, 0x24, 0x3C, 0x40, +0x4C, 0x25, 0x80, 0x00, 0x7A, 0x2E, 0xF2, 0x40, 0x24, 0x00, 0x02, 0x24, +0x3C, 0x40, 0x28, 0x25, 0x80, 0x00, 0x7A, 0x2E, 0xC2, 0x43, 0x23, 0x09, +0xF2, 0x40, 0x09, 0x00, 0x02, 0x24, 0x3C, 0x40, 0x5E, 0x25, 0x80, 0x00, +0x7A, 0x2E, 0x1F, 0xB3, 0x48, 0x28, 0xB0, 0x13, 0x30, 0x2F, 0xC2, 0x43, +0xEA, 0x24, 0xD2, 0x42, 0x01, 0x24, 0xEB, 0x24, 0x3A, 0x3C, 0xF2, 0xD2, +0x22, 0x09, 0xD2, 0x42, 0x82, 0x23, 0x3F, 0x09, 0x80, 0x00, 0xBE, 0x25, +0xF2, 0xD2, 0x22, 0x09, 0xD2, 0x42, 0x82, 0x23, 0x00, 0x24, 0xB0, 0x13, +0xBE, 0x25, 0xD2, 0x43, 0x12, 0x24, 0x10, 0x01, 0xC2, 0x43, 0x23, 0x09, +0xD2, 0x43, 0x02, 0x24, 0x3C, 0x40, 0x00, 0x24, 0x80, 0x00, 0x7A, 0x2E, +0xF2, 0xD2, 0x22, 0x09, 0xD2, 0x42, 0x84, 0x23, 0x01, 0x24, 0x80, 0x00, +0xBE, 0x25, 0x80, 0x00, 0xCC, 0x25, 0x5E, 0x42, 0x84, 0x23, 0x7E, 0xF0, +0x0F, 0x00, 0x0C, 0x24, 0x5E, 0x93, 0x1B, 0x20, 0xC2, 0x93, 0x84, 0x23, +0x04, 0x34, 0xF2, 0xF0, 0xD7, 0x00, 0xC8, 0x23, 0x03, 0x3C, 0xF2, 0xF0, +0xD7, 0x00, 0x88, 0x23, 0x80, 0x00, 0xBE, 0x25, 0x7E, 0x90, 0x80, 0x00, +0x03, 0x20, 0xB0, 0x13, 0x30, 0x2F, 0x43, 0x3F, 0x7E, 0x90, 0x82, 0x00, +0x02, 0x20, 0x80, 0x00, 0x76, 0x25, 0xF2, 0xD2, 0x20, 0x09, 0xF2, 0xD2, +0x22, 0x09, 0x10, 0x01, 0x3B, 0x15, 0x4C, 0x43, 0x3D, 0x40, 0x5A, 0x24, +0xB0, 0x13, 0x44, 0x2F, 0x8D, 0x20, 0x1E, 0x42, 0xDA, 0x24, 0x1F, 0x42, +0xDC, 0x24, 0x7E, 0xB0, 0x7F, 0x00, 0x36, 0x20, 0xB2, 0x90, 0x80, 0x00, +0xE2, 0x24, 0x32, 0x20, 0xB0, 0x13, 0x4C, 0x2F, 0xB2, 0x40, 0x00, 0xA5, +0x44, 0x01, 0xB2, 0x40, 0xC0, 0xA5, 0x40, 0x01, 0x0D, 0x3C, 0x3A, 0x4D, +0x3B, 0x4D, 0x1F, 0x15, 0x08, 0x16, 0x88, 0x4A, 0x00, 0x00, 0x88, 0x4B, +0x02, 0x00, 0xB2, 0xB2, 0x44, 0x01, 0xFD, 0x2B, 0x2E, 0x52, 0x0F, 0x63, +0x1A, 0x42, 0xDA, 0x24, 0x1B, 0x42, 0xDC, 0x24, 0x3A, 0x50, 0x80, 0x00, +0x0B, 0x63, 0x0F, 0x9B, 0xEA, 0x2B, 0x02, 0x20, 0x0E, 0x9A, 0xE7, 0x2B, +0x92, 0x42, 0x18, 0x24, 0x40, 0x01, 0xB0, 0x13, 0x5A, 0x2C, 0x82, 0x43, +0xDA, 0x24, 0x82, 0x43, 0xDC, 0x24, 0x82, 0x43, 0xDE, 0x24, 0x82, 0x43, +0xE0, 0x24, 0x82, 0x43, 0xE2, 0x24, 0x51, 0x3C, 0x92, 0x42, 0x18, 0x24, +0x44, 0x01, 0x1B, 0x42, 0x18, 0x24, 0x3B, 0x50, 0x40, 0x00, 0x82, 0x4B, +0x40, 0x01, 0x08, 0x3C, 0x6C, 0x42, 0x2D, 0x53, 0x1E, 0x53, 0x0F, 0x63, +0x4C, 0x93, 0x41, 0x20, 0x1E, 0x53, 0x0F, 0x63, 0x1A, 0x42, 0xE2, 0x24, +0x0B, 0x43, 0x1A, 0x52, 0xDA, 0x24, 0x1B, 0x62, 0xDC, 0x24, 0x0F, 0x9B, +0x03, 0x28, 0xD9, 0x23, 0x0E, 0x9A, 0xD7, 0x2F, 0x92, 0xB3, 0xDA, 0x24, +0x06, 0x2C, 0x3A, 0x53, 0x3B, 0x63, 0x0E, 0x9A, 0x18, 0x20, 0x0F, 0x9B, +0x16, 0x20, 0x6A, 0x4D, 0xB0, 0x13, 0x44, 0x2F, 0x0F, 0x20, 0xB0, 0x13, +0x3A, 0x2F, 0x1F, 0x15, 0x0B, 0x16, 0xCB, 0x4A, 0x00, 0x00, 0xB0, 0x13, +0x4C, 0x2F, 0x1F, 0x15, 0x0B, 0x16, 0x68, 0x4B, 0x4A, 0x98, 0x03, 0x24, +0x5C, 0x43, 0x01, 0x3C, 0x6C, 0x42, 0x1D, 0x53, 0xD1, 0x3F, 0x2B, 0x4D, +0xB0, 0x13, 0x44, 0x2F, 0xC9, 0x23, 0xB0, 0x13, 0x3A, 0x2F, 0x1F, 0x15, +0x0A, 0x16, 0x8A, 0x4B, 0x00, 0x00, 0xB0, 0x13, 0x4C, 0x2F, 0x1F, 0x15, +0x0A, 0x16, 0x28, 0x4A, 0x0B, 0x98, 0xBD, 0x27, 0x5C, 0x43, 0xBB, 0x3F, +0x6C, 0x42, 0x38, 0x17, 0x10, 0x01, 0x1B, 0x15, 0x1E, 0x42, 0xE4, 0x24, +0x5D, 0x4E, 0x03, 0x00, 0x5F, 0x4E, 0x01, 0x00, 0x5A, 0x4E, 0x02, 0x00, +0x8A, 0x10, 0x0A, 0xDF, 0x0B, 0x4D, 0x6F, 0x4E, 0x7F, 0x80, 0x10, 0x00, +0x20, 0x24, 0x5F, 0x83, 0x12, 0x24, 0x5F, 0x83, 0x35, 0x24, 0x5F, 0x83, +0x39, 0x24, 0x6F, 0x83, 0x1E, 0x24, 0x5F, 0x83, 0x46, 0x24, 0x5F, 0x83, +0x0C, 0x24, 0x5F, 0x83, 0x47, 0x24, 0x5F, 0x83, 0x48, 0x24, 0x6F, 0x83, +0x4D, 0x20, 0x5F, 0x43, 0x0D, 0x3C, 0xB2, 0x40, 0xA5, 0xA5, 0x16, 0x24, +0x1F, 0x3C, 0xB0, 0x13, 0x44, 0x2F, 0x33, 0x20, 0xB0, 0x13, 0x44, 0x27, +0xB0, 0x13, 0x54, 0x2F, 0x17, 0x3C, 0x4F, 0x43, 0x2E, 0x52, 0x0C, 0x4A, +0xB0, 0x13, 0xC0, 0x2D, 0x3D, 0x3C, 0xB0, 0x13, 0x4C, 0x2F, 0x92, 0x42, +0x18, 0x24, 0x44, 0x01, 0xB0, 0x13, 0x4C, 0x2F, 0x1F, 0x42, 0x18, 0x24, +0x3F, 0x50, 0x06, 0x00, 0x82, 0x4F, 0x40, 0x01, 0xC2, 0x43, 0xE0, 0xFF, +0xB0, 0x13, 0x5A, 0x2C, 0x4C, 0x43, 0x28, 0x3C, 0x0E, 0x4A, 0x0F, 0x4D, +0x4C, 0x43, 0xB0, 0x13, 0xA2, 0x2C, 0x22, 0x3C, 0xB0, 0x13, 0x44, 0x2F, +0x0C, 0x20, 0x4C, 0x43, 0x1F, 0x42, 0x44, 0x01, 0x3F, 0xF0, 0x10, 0x00, +0x1F, 0x52, 0x18, 0x24, 0x3F, 0x50, 0x40, 0x00, 0x82, 0x4F, 0x44, 0x01, +0x13, 0x3C, 0x6C, 0x42, 0x11, 0x3C, 0xB0, 0x13, 0x06, 0x2F, 0xB0, 0x13, +0x6A, 0x2B, 0x0E, 0x3C, 0xB0, 0x13, 0x06, 0x2F, 0x04, 0x3C, 0x2E, 0x42, +0x3C, 0x40, 0x00, 0x25, 0x0D, 0x43, 0xB0, 0x13, 0xE4, 0x2B, 0x04, 0x3C, +0x7C, 0x40, 0x07, 0x00, 0xB0, 0x13, 0xBC, 0x2E, 0x1A, 0x17, 0x10, 0x01, +0x82, 0x43, 0xE8, 0x24, 0xC2, 0x43, 0x8A, 0x23, 0xB0, 0x13, 0x6A, 0x2A, +0xD2, 0x93, 0x12, 0x24, 0x0F, 0x20, 0xF2, 0xD2, 0x02, 0x02, 0xC2, 0x93, +0x11, 0x24, 0x0A, 0x20, 0x4F, 0x43, 0xC2, 0x93, 0x8A, 0x23, 0x04, 0x34, +0x5F, 0x42, 0x8A, 0x23, 0x7F, 0xF0, 0x7F, 0x00, 0x82, 0x4F, 0xE8, 0x24, +0x82, 0x93, 0xE8, 0x24, 0xE9, 0x27, 0xE2, 0xE2, 0x02, 0x02, 0x5F, 0x42, +0x01, 0x1C, 0x82, 0x4F, 0xE8, 0x24, 0x1F, 0x42, 0xE4, 0x24, 0xFF, 0x90, +0x53, 0x00, 0x00, 0x00, 0x1C, 0x20, 0xB2, 0x40, 0x28, 0x96, 0x00, 0x09, +0xA2, 0xC3, 0x02, 0x09, 0xB2, 0xC0, 0x00, 0x04, 0x08, 0x09, 0xB0, 0x13, +0xDA, 0x2E, 0xB2, 0x40, 0x28, 0x96, 0x00, 0x09, 0x82, 0x43, 0x02, 0x09, +0xB2, 0xC0, 0x00, 0x01, 0x10, 0x09, 0xB0, 0x13, 0xDA, 0x2E, 0xB2, 0xD0, +0x00, 0x01, 0x6C, 0x01, 0xB2, 0x40, 0x04, 0xA5, 0x20, 0x01, 0x4C, 0x43, +0x10, 0x01, 0x5C, 0x43, 0x10, 0x01, 0x7B, 0x15, 0x0A, 0x4C, 0x0B, 0x4D, +0x04, 0x4E, 0x06, 0x4F, 0x47, 0x43, 0x25, 0x3C, 0x82, 0x4A, 0xDA, 0x24, +0x82, 0x4B, 0xDC, 0x24, 0x08, 0x4A, 0x09, 0x4B, 0x08, 0x54, 0x09, 0x63, +0x82, 0x48, 0xDE, 0x24, 0x82, 0x49, 0xE0, 0x24, 0x08, 0x43, 0x09, 0x43, +0x3D, 0x40, 0x5A, 0x24, 0x1D, 0x52, 0xE2, 0x24, 0x09, 0x93, 0x24, 0x20, +0x08, 0x94, 0x22, 0x2C, 0xFD, 0x46, 0x00, 0x00, 0x92, 0x53, 0xE2, 0x24, +0x1A, 0x53, 0x0B, 0x63, 0x18, 0x53, 0x09, 0x63, 0x1D, 0x53, 0x7A, 0xB0, +0x7F, 0x00, 0xF0, 0x23, 0xB0, 0x13, 0x44, 0x27, 0x04, 0x88, 0xB0, 0x13, +0x44, 0x2F, 0x0F, 0x20, 0x1F, 0x42, 0xDA, 0x24, 0x1F, 0xD2, 0xDC, 0x24, +0x0F, 0x93, 0xD2, 0x27, 0x82, 0x9A, 0xDE, 0x24, 0x03, 0x20, 0x82, 0x9B, +0xE0, 0x24, 0xD0, 0x27, 0xB0, 0x13, 0x44, 0x27, 0xEE, 0x3F, 0x67, 0x42, +0x4C, 0x47, 0x74, 0x17, 0x10, 0x01, 0x5E, 0x42, 0x3E, 0x09, 0x2E, 0xB2, +0x02, 0x28, 0x80, 0x00, 0x00, 0x2E, 0xA2, 0xB3, 0x08, 0x09, 0x02, 0x28, +0x80, 0x00, 0x9C, 0x2E, 0xA2, 0xB2, 0x08, 0x09, 0x08, 0x28, 0x3F, 0x40, +0xDF, 0x2E, 0x3F, 0x53, 0xFE, 0x2F, 0xB2, 0x40, 0x04, 0xA5, 0x20, 0x01, +0x10, 0x01, 0xD2, 0xB3, 0x30, 0x09, 0x10, 0x28, 0xF2, 0xD0, 0x10, 0x00, +0x3C, 0x09, 0xC2, 0x43, 0x23, 0x09, 0xD2, 0x93, 0x10, 0x24, 0x03, 0x20, +0xB0, 0x13, 0xCC, 0x2C, 0x02, 0x3C, 0xF2, 0xD2, 0x20, 0x09, 0xD2, 0xC3, +0x30, 0x09, 0x10, 0x01, 0x4E, 0x93, 0x02, 0x34, 0x80, 0x00, 0xEC, 0x2A, +0x3E, 0xB0, 0x40, 0x00, 0x0B, 0x28, 0xD2, 0x43, 0x11, 0x24, 0xF2, 0xD0, +0x10, 0x00, 0x3C, 0x09, 0xF2, 0xC0, 0x40, 0x00, 0x3E, 0x09, 0x82, 0x43, +0x10, 0x09, 0x10, 0x01, 0x3E, 0xB0, 0x20, 0x00, 0x02, 0x28, 0xB0, 0x13, +0xF2, 0x2E, 0x10, 0x01, 0xC2, 0x43, 0x12, 0x24, 0xC2, 0x43, 0x11, 0x24, +0xC2, 0x43, 0x00, 0x24, 0xC2, 0x43, 0x01, 0x24, 0xC2, 0x43, 0x3C, 0x09, +0xF2, 0x43, 0x02, 0x24, 0xF2, 0x43, 0x04, 0x24, 0xC2, 0x43, 0x10, 0x24, +0x7E, 0x40, 0x80, 0x00, 0xC2, 0x4E, 0x21, 0x09, 0xC2, 0x4E, 0x23, 0x09, +0xF2, 0x40, 0x8C, 0x00, 0x20, 0x09, 0xF2, 0x40, 0x8C, 0x00, 0x22, 0x09, +0xF2, 0x40, 0x03, 0x00, 0x2F, 0x09, 0xF2, 0x40, 0x03, 0x00, 0x2E, 0x09, +0xC2, 0x4E, 0xC8, 0x23, 0xF2, 0x40, 0x10, 0x00, 0xC9, 0x23, 0xC2, 0x4E, +0xCA, 0x23, 0xC2, 0x4E, 0xCE, 0x23, 0xF2, 0x40, 0x40, 0x00, 0xCF, 0x23, +0xC2, 0x4E, 0x88, 0x23, 0xC2, 0x43, 0x89, 0x23, 0xC2, 0x43, 0x8A, 0x23, +0xF2, 0x40, 0x40, 0x00, 0x8F, 0x23, 0xF2, 0x40, 0x40, 0x00, 0x3C, 0x09, +0xC2, 0x43, 0x3E, 0x09, 0xC2, 0xCE, 0x3E, 0x09, 0x10, 0x01, 0x3B, 0x15, +0x0A, 0x4C, 0x0B, 0x4D, 0x08, 0x4E, 0xB0, 0x13, 0x44, 0x27, 0xB2, 0x43, +0x54, 0x01, 0x0C, 0x4A, 0x0D, 0x4B, 0x0C, 0x58, 0x0D, 0x63, 0x0B, 0x9D, +0x03, 0x28, 0x11, 0x20, 0x0A, 0x9C, 0x0F, 0x2C, 0xB0, 0x13, 0x44, 0x2F, +0x24, 0x20, 0x1B, 0x15, 0x0F, 0x16, 0x6E, 0x4F, 0xC2, 0x4E, 0x52, 0x01, +0x1A, 0x53, 0x0B, 0x63, 0x0B, 0x9D, 0xF4, 0x2B, 0x02, 0x20, 0x0A, 0x9C, +0xF1, 0x2B, 0x1E, 0x42, 0x54, 0x01, 0x1F, 0x42, 0xE6, 0x24, 0xFF, 0x40, +0x3A, 0x00, 0x00, 0x00, 0x1F, 0x42, 0xE6, 0x24, 0xCF, 0x4E, 0x01, 0x00, +0x8E, 0x10, 0x1F, 0x42, 0xE6, 0x24, 0xCF, 0x4E, 0x02, 0x00, 0xF2, 0x40, +0x03, 0x00, 0x1A, 0x24, 0xB0, 0x13, 0x24, 0x2F, 0xFD, 0x27, 0x38, 0x17, +0x10, 0x01, 0x6C, 0x42, 0xB0, 0x13, 0xBC, 0x2E, 0xFA, 0x3F, 0x03, 0x43, +0x5B, 0x15, 0x0A, 0x4C, 0x0B, 0x4D, 0x08, 0x4C, 0x09, 0x4D, 0x08, 0x5E, +0x09, 0x63, 0x47, 0x43, 0x04, 0x3C, 0xB0, 0x13, 0xBC, 0x2E, 0x0A, 0x56, +0x0B, 0x63, 0x0B, 0x99, 0x03, 0x28, 0x29, 0x20, 0x0A, 0x98, 0x27, 0x2C, +0x47, 0x93, 0x25, 0x20, 0x0E, 0x48, 0x0F, 0x49, 0x0E, 0x8A, 0x0F, 0x7B, +0x03, 0x20, 0x3E, 0x90, 0x3E, 0x00, 0x03, 0x28, 0x36, 0x40, 0x3D, 0x00, +0x02, 0x3C, 0x06, 0x48, 0x06, 0x8A, 0x1F, 0x42, 0xE6, 0x24, 0x1F, 0x53, +0x0E, 0x46, 0x0C, 0x4A, 0x0D, 0x4B, 0xB0, 0x13, 0x2A, 0x2D, 0x47, 0x4C, +0x4C, 0x93, 0xDD, 0x23, 0x1F, 0x42, 0xE6, 0x24, 0xFF, 0x40, 0x3A, 0x00, +0x00, 0x00, 0x4E, 0x46, 0x5E, 0x53, 0xC2, 0x4E, 0x1A, 0x24, 0xB0, 0x13, +0x24, 0x2F, 0xD3, 0x23, 0xFC, 0x3F, 0x56, 0x17, 0x10, 0x01, 0x92, 0xB3, +0x44, 0x01, 0xFD, 0x2F, 0x1F, 0x42, 0x18, 0x24, 0x3F, 0x50, 0x10, 0x00, +0x82, 0x4F, 0x44, 0x01, 0x10, 0x01, 0x82, 0x43, 0xDE, 0x24, 0x82, 0x43, +0xE0, 0x24, 0x82, 0x43, 0xDA, 0x24, 0x82, 0x43, 0xDC, 0x24, 0x82, 0x43, +0xE2, 0x24, 0x32, 0xC2, 0x03, 0x43, 0xB2, 0x40, 0x02, 0x1C, 0xE4, 0x24, +0xB2, 0x40, 0x1B, 0x24, 0xE6, 0x24, 0xB0, 0x13, 0x5C, 0x29, 0x5C, 0xB3, +0xFC, 0x2B, 0xB0, 0x13, 0x72, 0x28, 0xF9, 0x3F, 0x03, 0x43, 0xB0, 0x13, +0x44, 0x2F, 0x10, 0x20, 0xB0, 0x13, 0x3A, 0x2F, 0x92, 0x42, 0x18, 0x24, +0x44, 0x01, 0x1D, 0x42, 0x18, 0x24, 0x2D, 0x53, 0x82, 0x4D, 0x40, 0x01, +0x1F, 0x15, 0x0D, 0x16, 0xCD, 0x43, 0x00, 0x00, 0x80, 0x00, 0x5A, 0x2C, +0x6C, 0x42, 0x10, 0x01, 0x5E, 0x42, 0x02, 0x24, 0x7E, 0x93, 0x28, 0x24, +0x7E, 0x90, 0x09, 0x00, 0x03, 0x28, 0x7F, 0x42, 0x7E, 0x82, 0x09, 0x3C, +0x7E, 0x92, 0x02, 0x2C, 0x4F, 0x4E, 0x07, 0x3C, 0x7F, 0x42, 0xD2, 0x93, +0x0E, 0x24, 0x03, 0x20, 0x4E, 0x43, 0x5D, 0x43, 0x02, 0x3C, 0x7E, 0x43, +0x4D, 0x43, 0xC2, 0x4D, 0x10, 0x24, 0xC2, 0x4E, 0x02, 0x24, 0x4F, 0x93, +0x0C, 0x24, 0x3E, 0x40, 0x78, 0x23, 0x4D, 0x4F, 0x1C, 0x42, 0x06, 0x24, +0xEE, 0x4C, 0x00, 0x00, 0x92, 0x53, 0x06, 0x24, 0x1E, 0x53, 0x7D, 0x53, +0xF7, 0x23, 0xC2, 0x4F, 0x21, 0x09, 0x10, 0x01, 0xC2, 0x43, 0x10, 0x24, +0x10, 0x01, 0x3B, 0x15, 0x0A, 0x4C, 0x0B, 0x4D, 0x09, 0x4E, 0x08, 0x4F, +0xB0, 0x13, 0x44, 0x27, 0x0E, 0x4A, 0x0F, 0x4B, 0x0E, 0x59, 0x0F, 0x63, +0x3E, 0x53, 0x3F, 0x63, 0x0F, 0x9B, 0x16, 0x28, 0x02, 0x20, 0x0E, 0x9A, +0x13, 0x28, 0xB0, 0x13, 0x44, 0x2F, 0x13, 0x20, 0x1F, 0x15, 0x0D, 0x16, +0x69, 0x4D, 0x0C, 0x4E, 0x0C, 0x8A, 0x0D, 0x48, 0x0D, 0x5C, 0xCD, 0x49, +0x00, 0x00, 0x3E, 0x53, 0x3F, 0x63, 0x0F, 0x9B, 0x03, 0x28, 0xEF, 0x23, +0x0E, 0x9A, 0xED, 0x2F, 0x4C, 0x43, 0x38, 0x17, 0x10, 0x01, 0x6C, 0x42, +0xFC, 0x3F, 0x03, 0x43, 0x81, 0x43, 0x04, 0x00, 0xB2, 0x40, 0x28, 0x96, +0x00, 0x09, 0x92, 0x42, 0x14, 0x24, 0x12, 0x09, 0xB2, 0x40, 0x00, 0x03, +0x10, 0x09, 0x82, 0x43, 0x14, 0x09, 0x3F, 0x40, 0x4C, 0x01, 0x3F, 0x53, +0xFE, 0x2F, 0x1F, 0x41, 0x04, 0x00, 0x0E, 0x4F, 0x1E, 0x53, 0x81, 0x4E, +0x04, 0x00, 0x3F, 0x90, 0xE9, 0x03, 0x05, 0x2C, 0x82, 0x93, 0x14, 0x09, +0xEE, 0x23, 0x92, 0xD3, 0x02, 0x09, 0x10, 0x01, 0x0A, 0x12, 0x4A, 0x4F, +0x6F, 0x42, 0xB0, 0x13, 0x44, 0x2F, 0x01, 0x20, 0x4F, 0x43, 0x4F, 0x93, +0x0B, 0x20, 0xB2, 0x90, 0x05, 0x00, 0xE8, 0x24, 0x07, 0x28, 0x0F, 0x4E, +0x1E, 0x42, 0xE8, 0x24, 0x2E, 0x82, 0xB0, 0x13, 0xE6, 0x29, 0x4F, 0x4C, +0x4A, 0x93, 0x03, 0x20, 0x4C, 0x4F, 0xB0, 0x13, 0xBC, 0x2E, 0x92, 0x42, +0x18, 0x24, 0x40, 0x01, 0xB0, 0x13, 0x60, 0x2C, 0x3A, 0x41, 0x10, 0x01, +0xF2, 0xD0, 0x10, 0x00, 0x3C, 0x09, 0xF2, 0x40, 0x80, 0x00, 0x23, 0x09, +0x03, 0x3C, 0xF2, 0xF0, 0xFA, 0x00, 0x3E, 0x09, 0xC2, 0x43, 0x10, 0x24, +0x82, 0x43, 0xEA, 0x24, 0xB0, 0x13, 0xFE, 0x25, 0x34, 0x40, 0x80, 0x00, +0x82, 0xC4, 0x20, 0x09, 0x82, 0xC4, 0x22, 0x09, 0xE2, 0xC2, 0x3E, 0x09, +0x82, 0xD4, 0x20, 0x09, 0x82, 0xD4, 0x22, 0x09, 0xD2, 0xB3, 0x3E, 0x09, +0xE8, 0x2F, 0x10, 0x01, 0x7E, 0x40, 0x3F, 0x00, 0xC2, 0x93, 0xCA, 0x23, +0x15, 0x34, 0xC2, 0x4E, 0x80, 0x1C, 0x3F, 0x40, 0x81, 0x1C, 0x0D, 0x4C, +0x0D, 0x5E, 0xFF, 0x4C, 0x00, 0x00, 0x1F, 0x53, 0xFF, 0x4C, 0x00, 0x00, +0x1F, 0x53, 0xFF, 0x4C, 0x00, 0x00, 0x1F, 0x53, 0x0C, 0x9D, 0xF5, 0x23, +0xF2, 0x40, 0x40, 0x00, 0xCA, 0x23, 0x01, 0x3C, 0x4E, 0x43, 0x4C, 0x4E, +0x10, 0x01, 0x82, 0x4C, 0x06, 0x24, 0x1E, 0x42, 0x86, 0x23, 0x5F, 0x42, +0x02, 0x24, 0x0F, 0x9E, 0x04, 0x28, 0xC2, 0x4E, 0x02, 0x24, 0x4E, 0x43, +0x01, 0x3C, 0x5E, 0x43, 0xC2, 0x4E, 0x0E, 0x24, 0x80, 0x00, 0xCC, 0x2C, +0x21, 0x83, 0x3F, 0x40, 0xDF, 0x2E, 0x3F, 0x53, 0xFE, 0x2F, 0xB0, 0x13, +0x80, 0x2D, 0xB0, 0x13, 0xEC, 0x2A, 0xB2, 0xF0, 0xF9, 0xFF, 0x08, 0x09, +0xA2, 0xD3, 0x02, 0x09, 0x21, 0x53, 0x10, 0x01, 0x1F, 0x42, 0xE6, 0x24, +0xFF, 0x40, 0x3B, 0x00, 0x00, 0x00, 0x1F, 0x42, 0xE6, 0x24, 0xCF, 0x4C, +0x01, 0x00, 0xE2, 0x43, 0x1A, 0x24, 0xB0, 0x13, 0x24, 0x2F, 0xFD, 0x27, +0x10, 0x01, 0xB2, 0x40, 0x00, 0x96, 0x00, 0x09, 0x03, 0x43, 0x3F, 0x40, +0x7E, 0x84, 0x3E, 0x40, 0x1E, 0x00, 0x3F, 0x53, 0x3E, 0x63, 0xFD, 0x2F, +0x10, 0x01, 0x21, 0x83, 0xB0, 0x13, 0x80, 0x2D, 0xF2, 0xF0, 0x9F, 0x00, +0x3E, 0x09, 0xC2, 0x43, 0x11, 0x24, 0x21, 0x53, 0x10, 0x01, 0x5F, 0x4E, +0x04, 0x00, 0x5E, 0x4E, 0x05, 0x00, 0x8E, 0x10, 0x0E, 0xDF, 0x0C, 0x4A, +0x10, 0x01, 0xB2, 0x40, 0x80, 0x5A, 0x5C, 0x01, 0x32, 0xC2, 0x03, 0x43, +0x0C, 0x43, 0x10, 0x01, 0x3C, 0x40, 0x1A, 0x24, 0xB0, 0x13, 0x40, 0x2E, +0x4C, 0x93, 0x10, 0x01, 0xC2, 0x43, 0x23, 0x09, 0xE2, 0x43, 0x02, 0x24, +0x10, 0x01, 0x4C, 0x43, 0x92, 0xB3, 0x44, 0x01, 0xFD, 0x2F, 0x10, 0x01, +0xB2, 0x90, 0xA5, 0xA5, 0x16, 0x24, 0x10, 0x01, 0x92, 0xB3, 0x44, 0x01, +0xFD, 0x2F, 0x10, 0x01, 0x1B, 0x15, 0x10, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, +}; + +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_address[] = +{ +0x00002500, +}; +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_length_of_sections[] = +{ +0x00000D00, +}; +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_sections = 0x00000001; +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_termination = 0x00000000; +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_start = 0x00002500; +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_finish = 0x00003200; +const uint32_t RAM_BSL_FLASH_MODE_eZ_FETImage_length = 0x00000D00; + +#define RAM_BSL_FLASH_MODE_EZ_FETIMAGE_TERMINATION 0x00000000 +#define RAM_BSL_FLASH_MODE_EZ_FETIMAGE_START 0x00002500 +#define RAM_BSL_FLASH_MODE_EZ_FETIMAGE_FINISH 0x00003200 +#define RAM_BSL_FLASH_MODE_EZ_FETIMAGE_LENGTH 0x00000D00 +#define RAM_BSL_FLASH_MODE_EZ_FETIMAGE_SECTIONS 0x00000001 diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/pch.cpp b/ThirdParty/BSL430_DLL/BSL430_DLL/pch.cpp new file mode 100644 index 0000000..c86338a --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/pch.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2013 - 2014 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. + */ + +#include "pch.h" diff --git a/ThirdParty/BSL430_DLL/BSL430_DLL/pch.h b/ThirdParty/BSL430_DLL/BSL430_DLL/pch.h new file mode 100644 index 0000000..2c26038 --- /dev/null +++ b/ThirdParty/BSL430_DLL/BSL430_DLL/pch.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2013 - 2014 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. + */ + +#if defined(_WIN32) || defined(_WIN64) +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN +#define NOMINMAX +#define _CRT_SECURE_NO_WARNINGS +#define _WIN32_WINNT 0x0501 +#include +#endif + +#include +#include +#include +#include +#include + +#define BOOST_DATE_TIME_NO_LIB +#define BOOST_REGEX_NO_LIB + +#include diff --git a/ThirdParty/BSL430_DLL/Makefile b/ThirdParty/BSL430_DLL/Makefile new file mode 100644 index 0000000..1dc8684 --- /dev/null +++ b/ThirdParty/BSL430_DLL/Makefile @@ -0,0 +1,71 @@ +CXXFLAGS := -fPIC -std=c++0x -fvisibility=hidden -fvisibility-inlines-hidden + +PCH_HEADER := ./BSL430_DLL/pch.h +PCH_COMPILED := ./BSL430_DLL/pch.h.gch + +DEFINES := -DUNIX + +ifdef DEBUG +CXXFLAGS += -g -O0 +else +CXXFLAGS += -Os +DEFINES += -DNDEBUG +endif + +MAKE_PCH := -x c++-header +USE_PCH := -include $(PCH_HEADER) + +INCLUDES := \ + -I../include \ + -I./BSL430_DLL \ + -I./BSL430_DLL/Utility_Classes \ + -I./BSL430_DLL/Physical_Interfaces \ + -I./BSL430_DLL/Packet_Handlers \ + -I./BSL430_DLL/Connections + +SRC := \ + ./BSL430_DLL/MSPBSL_Factory.cpp \ + $(wildcard ./BSL430_DLL/Connections/*.cpp) \ + $(wildcard ./BSL430_DLL/Physical_Interfaces/*.cpp) \ + $(wildcard ./BSL430_DLL/Packet_Handlers/*.cpp) \ + $(wildcard ./BSL430_DLL/Utility_Classes/*.cpp) + +OBJS := $(patsubst %.cpp, %.o, $(SRC)) + +OUTPUT := ../lib64/libbsl430.a + +PLATFORM := $(shell uname -s) +ifeq ($(PLATFORM),Linux) + CXX:= g++ + + ifdef BIT32 + CXXFLAGS += -m32 + OUTPUT := ../lib/libbsl430.a + endif + + ifdef BOOST_DIR + INCLUDES += -I$(BOOST_DIR) + endif +else + CXX:= clang++ + + ifdef BOOST_DIR + INCLUDES += -I$(BOOST_DIR)/include + endif +endif + +all: $(OBJS) + ar -cq $(OUTPUT) $(OBJS) + +$(PCH_COMPILED): $(PCH_HEADER) + $(CXX) $(MAKE_PCH) -c -o $@ $< $(CXXFLAGS) $(INCLUDES) $(DEFINES) + +%.o: %.cpp $(PCH_COMPILED) + $(CXX) -c -o $@ $< $(USE_PCH) $(CXXFLAGS) $(INCLUDES) $(DEFINES) + +install: + cp $(OUTPUT) /usr/lib/ + +clean: + @for i in $(OBJS); do rm -f $$i; done + @rm -f $(OUTPUT) $(PCH_HEADER).?ch build.log diff --git a/ThirdParty/BSL430_Firmware/BSL.ewd b/ThirdParty/BSL430_Firmware/BSL.ewd new file mode 100644 index 0000000..2bf69f8 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL.ewd @@ -0,0 +1,384 @@ + + + + 2 + + 430FET + 1 + 1 + 3.3 + 1 + 1 + + $TOOLKIT_DIR$\config\MSP430F6638.ddf + 3.3 + + $TOOLKIT_DIR$\CONFIG\test.psp.config + $TOOLKIT_DIR$\config\MSP430F5528.ddf + Automatic + RAM_BASED_BSL_FLASH_MODE_eZ_FET + + MSP430 + + 1 + + C-SPY + 4 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + diff --git a/ThirdParty/BSL430_Firmware/BSL.ewp b/ThirdParty/BSL430_Firmware/BSL.ewp new file mode 100644 index 0000000..95229fd --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL.ewp @@ -0,0 +1,4027 @@ + + + + 2 + + RAM_WRITE_ONLY_BSL_MSP_FET + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + RAM_BASED_BSL_FLASH_MODE_MSP_FET + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertBsl.bat $PROJ_DIR$ RAM_BSL_FLASH_MODE_MSP_FET + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + RAM_WRITE_ONLY_BSL_eZ_FET + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + RAM_BASED_BSL_FLASH_MODE_eZ_FET + + MSP430 + + 1 + + General + 12 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + $PROJ_DIR$\tools\convertBsl.bat $PROJ_DIR$ RAM_BSL_FLASH_MODE_eZ_FET + + + + XLINK + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + RAM_WRITE_ONLY_BSL_MSP_FET + RAM_BASED_BSL_FLASH_MODE_MSP_FET + RAM_WRITE_ONLY_BSL_eZ_FET + RAM_BASED_BSL_FLASH_MODE_eZ_FET + + + USB-Headers + + $PROJ_DIR$\defUSB.h + + + $PROJ_DIR$\descriptor.h + + + $PROJ_DIR$\descriptors.h + + + $PROJ_DIR$\device.h + + + $PROJ_DIR$\hal_UCS.h + + + $PROJ_DIR$\Proj_Settings.h + + + $PROJ_DIR$\types.h + + + $PROJ_DIR$\usb.h + + + $PROJ_DIR$\usbapi.h + + + $PROJ_DIR$\UsbHidReq.h + + + $PROJ_DIR$\UsbIsr.h + + + + USB-Source + + $PROJ_DIR$\descriptors.c + + + $PROJ_DIR$\hal_UCS.c + + + $PROJ_DIR$\usb.c + + + $PROJ_DIR$\UsbApi.c + + + $PROJ_DIR$\UsbHidReq.c + + + $PROJ_DIR$\UsbIsr.c + + + + $PROJ_DIR$\BSL430_API.c + + + $PROJ_DIR$\BSL430_Command_Interpreter.c + + + $PROJ_DIR$\BSL430_Low_Level_Init.s43 + + RAM_BASED_BSL_FLASH_MODE_MSP_FET + RAM_BASED_BSL_FLASH_MODE_eZ_FET + + + + $PROJ_DIR$\BSL430_USB_PI.c + + + $PROJ_DIR$\cstartup.s43 + + diff --git a/ThirdParty/BSL430_Firmware/BSL.eww b/ThirdParty/BSL430_Firmware/BSL.eww new file mode 100644 index 0000000..5873d49 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL.eww @@ -0,0 +1,8 @@ + + + + + $WS_DIR$\BSL.ewp + + + diff --git a/ThirdParty/BSL430_Firmware/BSL430_API.c b/ThirdParty/BSL430_Firmware/BSL430_API.c new file mode 100644 index 0000000..b522174 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_API.c @@ -0,0 +1,674 @@ +/* + * Copyright (C) 2012 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. + */ +#include "BSL_Device_File.h" +#include "BSL430_API.h" +#include "BSL430_Command_Definitions.h" + +/******************************************************************************* +* Change Log: +* 2.2.09 LCW removed RAM erase +* Changed mass erase and info segments +* 2.2.09 LCW worked on RAM Loader function +* Changed Password to XOR +* Changed Password addr to 0xFFE0 +* -------------------------------------------------------------------------------- +* Version 3 work begins +* 07.08.09 LCW Removed info erase +* 11.08.09 LCW bugfix in CRC algorithm +* -------------------------------------------------------------------------------- +* Version 4 work begins +* 21.12.09 LCW Removed VPE check +* 15.03.10 LCW Misc comment cleanup for source release +* -------------------------------------------------------------------------------- +* Version 4.1 (no output change, source/comment modified) +* 15.04.10 LCW Changed Version defines to remove warning +* -------------------------------------------------------------------------------- +* Version 5 work begins +* 18.02.11 LCW Added USB BSL Buffering for block write +* disabled GIE at startup +* uncrustified +* VPE check removed from word write +* 13.04.11 LCW Made length varibles unsigned +* -------------------------------------------------------------------------------- +* Version 6 work begins +* 30.10.12 LCW Cleared Lock IO on startup +*******************************************************************************/ +#ifdef RAM_BASED_BSL +# ifdef RAM_WRITE_ONLY_BSL +# error Can NOT have RAM write and RAM based BSL +# endif +# define DEFAULT_STATE (UNLOCKED) +#else +# define DEFAULT_STATE (LOCKED) +#endif + +#ifdef RAM_BASED_BSL +char flushBuffer(void); // buffer flush routine, internal for USB only + +# pragma data_alignment=2 +__no_init unsigned char BlockBuffer[128]; +__no_init unsigned long int BlockBufferStart; +__no_init unsigned long int BlockBufferNext; +__no_init unsigned int BlockBufferPtr; +#endif + +#pragma location = 0x2416 +__no_init volatile unsigned int LockedStatus; + +#pragma location = 0x2418 +__no_init int FwRamKey; + +#define API_VERSION (0x08) +#ifdef RAM_WRITE_ONLY_BSL +# define API_V (API_VERSION + RAM_WRITE_ONLY_BSL) +#else +# define API_V API_VERSION +#endif +const unsigned char BSL430_API_Version @ "BSL430_VERSION_API" = API_V; +#pragma required=BSL430_API_Version + +/******************************************************************************* +* *Function: __low_level_init +* *Description: function used to erase the RAM in device and stop WDT +*******************************************************************************/ +#if __VER__ <= 420 +void +#else +int +#endif +__low_level_init(void) +{ + WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer + __disable_interrupt(); // disable interrupts +#if __VER__ > 420 + return 0; // do not initialize +#endif +} + +/******************************************************************************* +* *Function: BSL430_API_init +* *Description: sets the key for writing to flash, sets device state +*******************************************************************************/ + +void BSL430_API_init() +{ +#ifdef RAM_WRITE_ONLY_BSL + LockedStatus = UNLOCKED; + FwRamKey = FWKEY; +#endif + +#ifdef RAM_BASED_BSL + BlockBufferNext = 0; + BlockBufferStart = 0; + BlockBufferPtr = 0; +#endif +} + +/******************************************************************************* +* *Function: BSL430_lock_BSL +* *Description: Locks the BSL +* *Returns: +* SUCCESSFUL_OPERATION BSL Locked +*******************************************************************************/ + +char BSL430_lock_BSL() +{ + LockedStatus = LOCKED; + return SUCCESSFUL_OPERATION; +} + +/******************************************************************************* +* *Function: BSL430_unlock_BSL +* *Description: Causes the BSL to compare the data buffer against the BSL password +* BSL state will be UNLOCKED if successful +* *Parameters: +* char* data A pointer to an array containing the password +* *Returns: +* SUCCESSFUL_OPERATION All data placed into data array successfully +* BSL_PASSWORD_ERROR Correct Password was not given +*******************************************************************************/ + +char BSL430_unlock_BSL(char* data) +{ + /*int i; + int retValue = 0; + char *interrupts = (char*)INTERRUPT_VECTOR_START; + + for (i = 0; i <= (INTERRUPT_VECTOR_END - INTERRUPT_VECTOR_START); i++, interrupts++) + { + retValue |= *interrupts ^ data[i]; + } + if (retValue == 0) + { +#ifndef RAM_WRITE_ONLY_BSL + volatile int i; + for (i = MASS_ERASE_DELAY - 1; i > 0; i--) ; +#endif*/ + + LockedStatus = UNLOCKED; + return SUCCESSFUL_OPERATION; + + /*} + else + { + BSL430_massErase(); + return BSL_PASSWORD_ERROR; + }*/ +} + +/******************************************************************************* +* *Function: BSL430_toggleInfoLock +* *Description: Toggles the LOCKA bit for writing/erasing info A segment +* *Returns: +* SUCCESSFUL_OPERATION Info A is now open for writing or erasing. +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_toggleInfoLock() +{ + char exceptions; + + if (LockedStatus == UNLOCKED) + { + exceptions = SUCCESSFUL_OPERATION; + FCTL3 = FwRamKey + LOCKA + (FCTL3 & LOCK); // toggle LOCKA bit + } + else + { + exceptions = BSL_LOCKED; + } + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_openMemory +* *Description: Unlocks the Flash for writing +* *Returns: +* SUCCESSFUL_OPERATION Flash is now open for writing. +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_openMemory() +{ + char exceptions = BSL_LOCKED; + + if (LockedStatus == UNLOCKED) + { + exceptions = SUCCESSFUL_OPERATION; +#ifndef RAM_BASED_BSL + FCTL3 = FwRamKey; // Clear Lock bit + FCTL1 = FwRamKey + WRT; // Set write bit +#endif + } + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_closeMemory +* *Description: Locks the Flash against writing +* *Returns: +* SUCCESSFUL_OPERATION Flash is now locked. +*******************************************************************************/ + +char BSL430_closeMemory(void) +{ + FCTL1 = FwRamKey; // Clear WRT bit + FCTL3 = FwRamKey + LOCK; // Set LOCK bit + + return SUCCESSFUL_OPERATION; +} + +/******************************************************************************* +* *Function: BSL430_readMemory +* *Description: Reads an array of bytes from memory into a supplied array +* *Parameters: +* unsigned long addr The address from which the read should begin +* char length The amount of bytes to read +* char* data The array into which the data will be saved +* *Returns: +* SUCCESSFUL_OPERATION All Data placed into data array successfully +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_readMemory(unsigned long addr, unsigned int length, char* data) +{ + unsigned long i; + +#ifdef RAM_BASED_BSL + flushBuffer(); +#endif + char exceptions = SUCCESSFUL_OPERATION; + + for (i = addr + length - 1; i >= addr; i--) + { + if (LockedStatus == UNLOCKED) + { + data[i - addr] = __data20_read_char(i); + } + else + { + return BSL_LOCKED; + } + } + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_crcCheck +* *Description: return a CRC check on the memory specified +* *Parameters: +* unsigned long addr The address from which to start the check +* int length The length of the data area to check +* int* return variable in which to put the return value +* *Returns: +* SUCCESSFUL_OPERATION CRC check done correctly +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +int BSL430_crcCheck(unsigned long addr, unsigned int length, int* result) +{ + unsigned long i; + +#ifdef RAM_BASED_BSL + flushBuffer(); +#endif + CRCINIRES = 0xFFFF; + for (i = addr; i < addr + length; i++) + { + if (LockedStatus == UNLOCKED) + { + CRCDIRB_L = __data20_read_char(i); + } + else + { + return BSL_LOCKED; + } + } + *result = CRCINIRES; + return SUCCESSFUL_OPERATION; + +} + +/******************************************************************************* +* *Function: BSL430_callAddress +* *Description: Loads the Program Counter with the supplied address +* *Parameters: +* unsigned long addr The address to which the function call should go +* *Returns: +* SUCCESSFUL_OPERATION Called location has returned +* BSL_LOCKED Correct Password has not yet been given +* *Note: +* If successful, this function does not return. +*******************************************************************************/ + +char BSL430_callAddress(unsigned long addr) +{ + if (LockedStatus == UNLOCKED) + { +#ifdef RAM_BASED_BSL + flushBuffer(); +#endif + ((void (*)())addr)(); // type cast addr to + // function ptr, call + return SUCCESSFUL_OPERATION; + } + return BSL_LOCKED; // can only be reached if + // BSL is locked +} + +/******************************************************************************* +* *Function: flushBuffer +* *Description: Flushes any remaining data in the buffer +* *Returns: +* SUCCESSFUL_OPERATION Flash is now locked. +*******************************************************************************/ +#ifdef RAM_BASED_BSL +char flushBuffer(void) +{ + unsigned long i; + char exceptions = SUCCESSFUL_OPERATION; + unsigned char* data = &BlockBuffer[0]; + + if (LockedStatus == UNLOCKED) + { + if (((BlockBufferStart & 0x7F) == 0) && (BlockBufferPtr == 128)) //Buffer is full and + // aligned + { + while (FCTL3 & BUSY) ; + FCTL3 = FWKEY; // Clear Lock bit + FCTL1 = FWKEY + BLKWRT + WRT; // Set write/block bit + + for (i = BlockBufferStart; i < BlockBufferStart + 128; i += 4) + { + __data20_write_long(i, *((long*)data)); + data += 4; + while ((FCTL3 & WAIT) == 0) ; + } // for + FCTL1 = FwRamKey; + while (FCTL3 & BUSY) ; + FCTL3 = FwRamKey + LOCK; + } // if + else + { + FCTL3 = FwRamKey; // Clear Lock bit + FCTL1 = FwRamKey + WRT; // Set write bit + for (i = BlockBufferStart; i < BlockBufferStart + BlockBufferPtr; i++) + { + if ((BlockBufferStart & 0x01) || i == BlockBufferStart + BlockBufferPtr - 1) + { + exceptions = BSL430_writeByte(i, *data); + data += 1; + } + else + { + exceptions = BSL430_writeWord(i, *(int *)data); + data += 2; + i++; + } + if (exceptions != SUCCESSFUL_OPERATION) + { + return exceptions; + } // if + } // for + } // else + BlockBufferStart = 0; + BlockBufferNext = 0; + BlockBufferPtr = 0; + } + else + { + exceptions = BSL_LOCKED; + } + return exceptions; +} + +#endif + +/******************************************************************************* +* *Function: BSL430_writeMemory +* *Description: Writes a byte array starting at a given address. +* Note: the function will write in word mode if possible +* (when start address is even) +* *Parameters: +* unsigned long startAddr The address to which the write should begin +* int size The number of bytes to write +* char* data The array of bytes to write (must be even aligned) +* *Returns: +* SUCCESSFUL_OPERATION Bytes written successfully +* MEMORY_WRITE_CHECK_FAILED A byte in data location post-write does not match data +* *parameter +* Note: write stops immediatly after a byte check fails +* BSL_LOCKED Correct Password has not yet been given +* VOLTAGE_CHANGE_DURING_PROGRAM Voltage changed during write (of a single byte/word) +*******************************************************************************/ + +char BSL430_writeMemory(unsigned long startAddr, unsigned int size, char* data) +{ + unsigned long i; + char exceptions = SUCCESSFUL_OPERATION; + + // Note: this function compiles quite differently based on whether the + // BSL is based out of RAM, or not. RAM based BSLs can use buffering + // and perform a block long word write. This is primarily used for + // USB BSLs for performance increase. + // Flash based BSLs will use the second second of code, below + +#ifdef RAM_BASED_BSL + if (LockedStatus == UNLOCKED) + { + if ((BlockBufferStart == 0) || BlockBufferNext == startAddr) + { + // if we are starting, or continuing a block... + if (BlockBufferStart == 0) + { + BlockBufferStart = startAddr; // if starting a new block, reset + // start addr + } + BlockBufferNext = startAddr + size; // always update the next addr for + // streaming + for (i = 0; i < size;) + { + BlockBuffer[BlockBufferPtr++] = *data; // add the incoming data to the buffer + data++; + startAddr++; + i++; // i incrimented here for check below + if (((startAddr) & 0x7F) == 0x00) // we've crossed a 128 byte block + // boundary + { + flushBuffer(); // flush out old buffer, writing... + // begin write on block boundary + return BSL430_writeMemory(startAddr, (size - i), data); + } // if + } // for + } // if buffer start + else + { + // for when data exists in the buffer, but we are jumping to a new place to write... + flushBuffer(); // flush out old buffer, writing.. + return BSL430_writeMemory(startAddr, size, data); // begin buffering new data + } + } // if unlocked + else + { + exceptions = BSL_LOCKED; + } + // Below is the writeMemory function compiled with Flash based BSLs. +#else + for (i = startAddr; i < startAddr + size; i++) + { +# ifndef RAM_WRITE_ONLY_BSL + // if the start address is odd, or we're 1 byte from end... + if ((startAddr & 0x01) || i == startAddr + size - 1) +# endif + { + exceptions = BSL430_writeByte(i, *data); + data += 1; + } +# ifndef RAM_WRITE_ONLY_BSL + // else, we're on an even addr, and have at least 1 word left.. + else + { + exceptions = BSL430_writeWord(i, *(int *)data); + data += 2; + i++; + } + if (exceptions != SUCCESSFUL_OPERATION) + { + return exceptions; + } // if +# endif + } // for +#endif + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_writeByte +* *Description: Writes a byte at a given address +* *Parameters: +* unsigned long addr The address to which the byte should be written +* char data The byte to write +* *Returns: +* SUCCESSFUL_OPERATION Byte written successfully +* MEMORY_WRITE_CHECK_FAILED Byte in data location post-write does not match data +* *parameter +* VOLTAGE_CHANGE_DURING_PROGRAM Voltage changed during write +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_writeByte(unsigned long addr, char data) +{ + char exceptions; + + if (LockedStatus == UNLOCKED) + { + exceptions = SUCCESSFUL_OPERATION; +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + __data20_write_char(addr, data); +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + if (data != __data20_read_char(addr)) + { + exceptions = MEMORY_WRITE_CHECK_FAILED; + } +#ifndef RAM_WRITE_ONLY_BSL +# ifndef DO_NOT_CHECK_VPE + if (FCTL4 & VPE) + { + exceptions = VOLTAGE_CHANGE_DURING_PROGRAM; + } +# endif +#endif + } + else + { + exceptions = BSL_LOCKED; + } + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_writeWord +* *Description: Writes a word at a given address +* *Parameters: +* unsigned long addr The address to which the word should be written +* int data The byte to write +* *Returns: +* SUCCESSFUL_OPERATION Word written successfully +* MEMORY_WRITE_CHECK_FAILED Word in data location post-write does not match data +* *parameter +* VOLTAGE_CHANGE_DURING_PROGRAM Voltage changed during write +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_writeWord(unsigned long addr, int data) +{ + char exceptions; + + if (LockedStatus == UNLOCKED) + { + exceptions = SUCCESSFUL_OPERATION; +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + __data20_write_short(addr, data); +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + if (data != __data20_read_short(addr)) + { + exceptions = MEMORY_WRITE_CHECK_FAILED; + } +#ifndef DO_NOT_CHECK_VPE + if (FCTL4 & VPE) + { + exceptions = VOLTAGE_CHANGE_DURING_PROGRAM; + } +#endif + } + else + { + exceptions = BSL_LOCKED; + } + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_eraseLocation +* *Description: Erases a memory segment which contains a given address +* *Parameters: +* char block_erase currently unused 1: erase block 0: erase segment +* unsigned long addr An address which is within the segment to be erased +* *Returns: +* SUCCESSFUL_OPERATION Segment erased +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_eraseLocation(char block_erase, unsigned long addr) +{ + char exceptions; + + if (LockedStatus == UNLOCKED) + { + exceptions = SUCCESSFUL_OPERATION; +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + FCTL3 = FwRamKey; // Clear Lock bit + FCTL1 = FwRamKey + ERASE; // Set Erase bit + __data20_write_char(addr, 0); // Dummy write to erase Flash seg +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + FCTL3 = FwRamKey + LOCK; // Set LOCK bit + } + else + { + exceptions = BSL_LOCKED; + } + return exceptions; +} + +/******************************************************************************* +* *Function: BSL430_massErase +* *Description: Mass erases the entire MSP430 device +* *Returns: +* SUCCESSFUL_OPERATION Flash erased +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ + +char BSL430_massErase() +{ + char exceptions = SUCCESSFUL_OPERATION; + volatile char *Flash_ptr; // Flash pointer + +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + FCTL3 = FwRamKey; +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + Flash_ptr = (char *)INTERRUPT_VECTOR_START; // Initialize Flash pointer + FCTL1 = FwRamKey + MERAS + ERASE; // Set Mass Erase bit + *Flash_ptr = 0; // Dummy write to erase main flash +#ifdef RAM_BASED_BSL + while (FCTL3 & BUSY) ; +#endif + FCTL3 = FwRamKey + LOCK; // Set LOCK bit + + return exceptions; +} diff --git a/ThirdParty/BSL430_Firmware/BSL430_API.h b/ThirdParty/BSL430_Firmware/BSL430_API.h new file mode 100644 index 0000000..84e4bc7 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_API.h @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2012 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 BSL_430_API_H +#define BSL_430_API_H + +#define LOCKED 0x00 +#define UNLOCKED 0xA5A5 + +// flags for mass erase call +#define MAIN_ONLY 0x00 // normal +#define ERASE_RAM 0x01 // unused in default +#define ERASE_INFO 0x02 // + +// Version definitions +#define FRAM_MEMORY 0x30 + +/******************************************************************************* +* *Function: BSL430_API_init +* *Description: sets the key for writing to flash, sets device state +*******************************************************************************/ +void BSL430_API_init(); + +/******************************************************************************* +* *Function: BSL430_lock_BSL +* *Description: Locks the BSL +* *Returns: +* SUCCESSFUL_OPERATION BSL Locked +*******************************************************************************/ +char BSL430_lock_BSL(); + +/******************************************************************************* +* *Function: BSL430_unlock_BSL +* *Description: Causes the BSL to compare the data buffer against the BSL password +* BSL state will be UNLOCKED if successful +*******************************Parameters: +* char* data A pointer to an array containing the password +*******************************Returns: +* SUCCESSFUL_OPERATION All data placed into data array successfully +* BSL_PASSWORD_ERROR Correct Password was not given +*******************************************************************************/ +char BSL430_unlock_BSL(char* data); + +/******************************************************************************* +* *Function: BSL430_toggleInfoLock +* *Description: Toggles the LOCKA bit for writing/erasing info A segment +* *Returns: +* SUCCESSFUL_OPERATION Info A is now open for writing or erasing. +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_toggleInfoLock(void); + +/******************************************************************************* +* *Function: BSL430_openMemory +* *Description: Unlocks the Flash for writing +* *Returns: +* SUCCESSFUL_OPERATION Flash is now open for writing. +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_openMemory(void); + +/******************************************************************************* +* *Function: BSL430_closeMemory +* *Description: Locks the Flash against writing +* *Returns: +* SUCCESSFUL_OPERATION Flash is now locked. +*******************************************************************************/ +char BSL430_closeMemory(void); + +/******************************************************************************* +* *Function: BSL430_readMemory +* *Description: Reads an array of bytes from memory into a supplied array +* *Parameters: +* unsigned long addr The address from which the read should begin +* char length The amount of bytes to read +* char* data The array into which the data will be saved +*******************************Returns: +* SUCCESSFUL_OPERATION All Data placed into data array successfully +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_readMemory(unsigned long addr, unsigned int length, char* data); + +/******************************************************************************* +* *Function: BSL430_crcCheck +* *Description: return a CRC check on the memory specified +* *Parameters: +* unsigned long addr The address from which to start the check +* int length The length of the data area to check +* int* return variable in which to put the return value +*******************************Returns: +* SUCCESSFUL_OPERATION CRC check done correctly +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +int BSL430_crcCheck(unsigned long addr, unsigned int length, int* result); + +/******************************************************************************* +* *Function: BSL430_callAddress +* *Description: Loads the Program Counter with the supplied address +* *Parameters: +* unsigned long addr The address to which the function call should go +*******************************Returns: +* SUCCESSFUL_OPERATION Called location has returned +* BSL_LOCKED Correct Password has not yet been given +*******************************Note: +* If successful, this function does not return. +*******************************************************************************/ +char BSL430_callAddress(unsigned long addr); + +/******************************************************************************* +* *Function: BSL430_writeMemory +* *Description: Writes a byte array starting at a given address. +* Note: the function will write in word mode if possible +* (when start address is even) +*******************************Parameters: +* unsigned long startAddr The address to which the write should begin +* int size The number of bytes to write +* char* data The array of bytes to write (must be even aligned) +*******************************Returns: +* SUCCESSFUL_OPERATION Bytes written successfully +* MEMORY_WRITE_CHECK_FAILED A byte in data location post-write does not match data +*******************************parameter +* Note: write stops immediatly after a byte check fails +* BSL_LOCKED Correct Password has not yet been given +* VOLTAGE_CHANGE_DURING_PROGRAM Voltage changed during write (of a single byte/word) +*******************************************************************************/ +char BSL430_writeMemory(unsigned long startAddr, unsigned int size, char* data); + +/******************************************************************************* +* *Function: BSL430_writeByte +* *Description: Writes a byte at a given address +* *Parameters: +* unsigned long addr The address to which the byte should be written +* char data The byte to write +*******************************Returns: +* SUCCESSFUL_OPERATION Byte written successfully +* MEMORY_WRITE_CHECK_FAILED Byte in data location post-write does not match data +*******************************parameter +* VOLTAGE_CHANGE_DURING_PROGRAM Voltage changed during write +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_writeByte(unsigned long addr, char data); + +/******************************************************************************* +* *Function: BSL430_writeWord +* *Description: Writes a word at a given address +* *Parameters: +* unsigned long addr The address to which the word should be written +* int data The byte to write +*******************************Returns: +* SUCCESSFUL_OPERATION Word written successfully +* MEMORY_WRITE_CHECK_FAILED Word in data location post-write does not match data +*******************************parameter +* VOLTAGE_CHANGE_DURING_PROGRAM Voltage changed during write +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_writeWord(unsigned long addr, int data); + +/******************************************************************************* +* *Function: BSL430_eraseLocation +* *Description: Erases a memory segment which contains a given address +* *Parameters: +* char block_erase currently unused 1: erase block 0: erase segment +* unsigned long addr An address which is within the segment to be erased +*******************************Returns: +* SUCCESSFUL_OPERATION Segment erased +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_eraseLocation(char block_erase, unsigned long addr); + +/******************************************************************************* +* *Function: BSL430_massErase +* *Description: Mass erases the entire MSP430 device +* *Returns: +* SUCCESSFUL_OPERATION Flash erased +* BSL_LOCKED Correct Password has not yet been given +*******************************************************************************/ +char BSL430_massErase(); + +#endif diff --git a/ThirdParty/BSL430_Firmware/BSL430_Command_Definitions.h b/ThirdParty/BSL430_Firmware/BSL430_Command_Definitions.h new file mode 100644 index 0000000..6bfe779 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_Command_Definitions.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2012 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 BSL_COMMAND_DEFINITIONS_H +#define BSL_COMMAND_DEFINITIONS_H + +//Received commands +#define RX_DATA_BLOCK 0x10 +#define RX_PASSWORD 0x11 +#define ERASE_SEGMENT 0x12 +#define TOGGLE_INFO 0x13 +#define ERASE_BLOCK 0x14 +#define MASS_ERASE 0x15 +#define CRC_CHECK 0x16 +#define LOAD_PC 0x17 +#define TX_DATA_BLOCK 0x18 +#define TX_BSL_VERSION 0x19 +#define TX_BUFFER_SIZE 0x1A +#define RX_DATA_BLOCK_FAST 0x1B + +//Responses +#define BSL_DATA_REPLY 0x3A +#define BSL_MESSAGE_REPLY 0x3B +#define ACK SUCCESSFUL_OPERATION + +// Error Codes +// - From the API +#define SUCCESSFUL_OPERATION 0x00 +#define NO_EXCEPTIONS 0x00 +#define MEMORY_WRITE_CHECK_FAILED 0x01 +#define FLASH_FAIL_BIT_SET 0x02 +#define VOLTAGE_CHANGE_DURING_PROGRAM 0x03 +#define BSL_LOCKED 0x04 +#define BSL_PASSWORD_ERROR 0x05 +#define BYTE_WRITE_FORBIDDEN 0x06 +// - From the Command Interpreter +#define UNKNOWN_COMMAND 0x07 +#define LENGTH_TOO_BIG_FOR_BUFFER 0x08 + +#endif diff --git a/ThirdParty/BSL430_Firmware/BSL430_Command_Interpreter.c b/ThirdParty/BSL430_Firmware/BSL430_Command_Interpreter.c new file mode 100644 index 0000000..1e41ce6 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_Command_Interpreter.c @@ -0,0 +1,343 @@ +/* + * Copyright (C) 2012 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. + */ + +#include "BSL430_Command_Interpreter.h" +#include "BSL430_Command_Definitions.h" +#include "BSL430_API.h" +#include "BSL430_PI.h" +#include "BSL_Device_File.h" + +/******************************************************************************* +* Change Log: +* 2.2.09 LCW worked on RAM Loader function +* -------------------------------------------------------------------------------- +* Version 3 work begins +* 07.08.09 LCW Removed parameter from mass erase +* -------------------------------------------------------------------------------- +* Version 4 work begins +* 23.11.09 LCW Changed to more generic API function calls +* -------------------------------------------------------------------------------- +* Version 5 work begins +* 10.03.10 LCW 'Off by one' error with sending Data fixed +* 15.03.10 LCW Misc comment cleanup for source release +* -------------------------------------------------------------------------------- +* Version 5.1 (no output change, source/comment modified) +* 15.04.10 LCW Changed receiveDataBlock to remove warning +* -------------------------------------------------------------------------------- +* Version 6.0 +* 15.04.10 LCW Made Buffer_Size an unsigned int +* -------------------------------------------------------------------------------- +* Version 6.1 (no output change, source/comment modified) +* 28.02.11 LCW Ran Uncrustify +* -------------------------------------------------------------------------------- +* Version 7.0 +* 13.04.11 LCW Made read length variables an unsigned int, several others as well +*******************************************************************************/ + +void interpretCommand(); +void receiveDataBlock(unsigned long addr, char* data, char fastWrite); +void receivePassword(); +void eraseLocation(char block_erase, unsigned long addr); +void CRC_Check(unsigned long addr, unsigned int length); +void sendDataBlock(unsigned long addr, unsigned int length); +void sendMessage(char message); + +extern __no_init char* BSL430_ReceiveBuffer; +extern __no_init char* BSL430_SendBuffer; +extern __no_init unsigned int BSL430_BufferSize; + +const unsigned char BSL430_Vendor_Version @ "BSL430_VERSION_VENDOR" = 0x54; // Uppercase T in ASCII +const unsigned char BSL430_CI_Version @ "BSL430_VERSION_CI" = 0x07; + +/******************************************************************************* +* *Function: main +* *Description: Initializes the BSL Command Interpreter and begins listening for +* incoming packets +*******************************************************************************/ +#pragma required=BSL430_Vendor_Version +#pragma required=BSL430_CI_Version +void main(void) +{ + unsigned char eventFlags = 0; + volatile int i, ii; + + BSL430_API_init(); + PI_init(); + + while (1) + { + eventFlags = PI_receivePacket(); + if (eventFlags & DATA_RECEIVED) + { + interpretCommand(); + } + } +} + +/******************************************************************************* +* *Function: interpretCommand +* *Description: Interprets the command contained in the data buffer and +* calls the appropriate BSL api function +*******************************************************************************/ + +void interpretCommand() +{ + unsigned char command = BSL430_ReceiveBuffer[0]; + unsigned long addr = BSL430_ReceiveBuffer[1]; + + addr |= ((unsigned long)BSL430_ReceiveBuffer[2]) << 8; + addr |= ((unsigned long)BSL430_ReceiveBuffer[3]) << 16; + switch (command) + { +#ifdef SUPPORTS_RX_DATA_BLOCK_FAST + case RX_DATA_BLOCK_FAST: + receiveDataBlock(addr, &BSL430_ReceiveBuffer[4], 1); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_RX_PASSWORD + case RX_PASSWORD: // Receive password + receivePassword(); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_LOAD_PC + case LOAD_PC: // Load PC + sendMessage(BSL430_callAddress(addr)); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_RX_DATA_BLOCK + case RX_DATA_BLOCK: // Receive data block + receiveDataBlock(addr, &BSL430_ReceiveBuffer[4], 0); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_MASS_ERASE + case MASS_ERASE: // Mass Erase + sendMessage(BSL430_massErase()); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_ERASE_SEGMENT + case ERASE_SEGMENT: // Erase segment + eraseLocation(0, addr); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_TOGGLE_INFO + case TOGGLE_INFO: // Toggle Info lock + sendMessage(BSL430_toggleInfoLock()); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_ERASE_BLOCK + case ERASE_BLOCK: // Erase Block + eraseLocation(1, addr); + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_CRC_CHECK + case CRC_CHECK: // CRC Check + { + unsigned int length; + length = BSL430_ReceiveBuffer[4]; + length |= ((unsigned long)BSL430_ReceiveBuffer[5]) << 8; + CRC_Check(addr, length); + } + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_TX_DATA_BLOCK + case TX_DATA_BLOCK: // Transmit Data Block + { + unsigned int length; + length = BSL430_ReceiveBuffer[4]; + length |= BSL430_ReceiveBuffer[5] << 8; + sendDataBlock(addr, length); + } + break; +#endif + /*----------------------------------------------------------------------------*/ +#ifdef SUPPORTS_TX_BSL_VERSION + case TX_BSL_VERSION: // Transmit BSL Version array + sendDataBlock((unsigned long)(&BSL430_Vendor_Version), 4); + break; +#endif + /*----------------------------------------------------------------------------*/ + default: // unknown command + sendMessage(UNKNOWN_COMMAND); + } +} + +/******************************************************************************* +* *Function: receiveDataBlock +* *Description: Calls the API to write a data block to a given memory location +* *Parameters: +* unsigned long addr Address to which the data should be written +* char* data Pointer to an array of data to write +* char FastWrite If 1, do not send a reply message +*******************************************************************************/ + +void receiveDataBlock(unsigned long addr, char* data, char fastWrite) +{ +#ifndef RAM_WRITE_ONLY_BSL + char returnValue; + returnValue = BSL430_openMemory(); + if ((returnValue == SUCCESSFUL_OPERATION) & (BSL430_BufferSize > 4)) +#endif + { +#ifndef RAM_WRITE_ONLY_BSL + returnValue = BSL430_writeMemory(addr, BSL430_BufferSize - 4, data); +#else + BSL430_writeMemory(addr, BSL430_BufferSize - 4, data); +#endif + } +#ifndef RAM_WRITE_ONLY_BSL + if (!fastWrite) + { + sendMessage(returnValue); + } + BSL430_closeMemory(); +#endif +} + +/******************************************************************************* +* *Function: receivePassword +* *Description: Calls the API to unlock the BSL +*******************************************************************************/ + +void receivePassword() +{ + if (BSL430_unlock_BSL(&BSL430_ReceiveBuffer[1]) == SUCCESSFUL_OPERATION) + { + sendMessage(ACK); + } + else + { + sendMessage(BSL_PASSWORD_ERROR); + } +} + +/******************************************************************************* +* *Function: eraseSegment +* *Description: Calls the API to erase a segment containing the given address +* *Parameters: +* char block_erase If 1, the entire block should be erased +* unsigned long addr Address in the segment to be erased. +*******************************************************************************/ + +void eraseLocation(char block_erase, unsigned long addr) +{ + sendMessage(BSL430_eraseLocation(block_erase, addr)); +} + +/******************************************************************************* +* *Function: CRC_Check +* *Description: Calls the API to perform a CRC check over a given addr+length of data +* *Parameters: +* unsigned long addr Start Addr of CRC +* unsigned int length number of bytes in the CRC +*******************************************************************************/ + +void CRC_Check(unsigned long addr, unsigned int length) +{ + int crcResult; + int crcStatus; + + crcStatus = BSL430_crcCheck(addr, length, &crcResult); + if (crcStatus == BSL_LOCKED) + { + sendMessage(BSL_LOCKED); + } + else + { + BSL430_SendBuffer[0] = BSL_DATA_REPLY; + BSL430_SendBuffer[1] = (char)(crcResult & 0xFF); + BSL430_SendBuffer[2] = (char)((crcResult >> 8) & 0xFF); + PI_sendData(3); + } +} + +/******************************************************************************* +* *Function: sendDataBlock +* *Description: Fills the SendBuffer array with bytes from the given parameters +* Sends the data by calling the PI, or sends an error +* *Parameters: +* unsigned long addr The address from which to begin reading the block +* int length The number of bytes to read +*******************************************************************************/ + +void sendDataBlock(unsigned long addr, unsigned int length) +{ + unsigned long endAddr = addr + length; + unsigned int bytes; + char returnValue = SUCCESSFUL_OPERATION; + + while ((addr < endAddr) & (returnValue == SUCCESSFUL_OPERATION)) + { + if ((endAddr - addr) > PI_getBufferSize() - 1) + { + bytes = PI_getBufferSize() - 1; + } + else + { + bytes = (endAddr - addr); + } + returnValue = BSL430_readMemory(addr, bytes, &BSL430_SendBuffer[1]); + if (returnValue == SUCCESSFUL_OPERATION) + { + BSL430_SendBuffer[0] = BSL_DATA_REPLY; + PI_sendData(bytes + 1); + } + else + { + sendMessage(returnValue); + } + addr += bytes; + } +} + +/******************************************************************************* +* *Function: sendMessage +* *Description: Sends a Reply message with attached information +* *Parameters: +* char message the message to send +*******************************************************************************/ + +void sendMessage(char message) +{ + BSL430_SendBuffer[0] = BSL_MESSAGE_REPLY; + BSL430_SendBuffer[1] = message; + PI_sendData(2); +} diff --git a/ThirdParty/BSL430_Firmware/BSL430_Command_Interpreter.h b/ThirdParty/BSL430_Firmware/BSL430_Command_Interpreter.h new file mode 100644 index 0000000..44fbeb5 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_Command_Interpreter.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2012 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 BSL_COMMAND_INTERPRETER_H +#define BSL_COMMAND_INTERPRETER_H + +// Empty file for possible future use + +#endif diff --git a/ThirdParty/BSL430_Firmware/BSL430_Low_Level_Init.s43 b/ThirdParty/BSL430_Firmware/BSL430_Low_Level_Init.s43 new file mode 100644 index 0000000..88b0f1a --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_Low_Level_Init.s43 @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2012 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. + */ +//************************************************************** +// BSL SW low level functions +//************************************************************** +#include "BSL_Device_File.h" + +#define ARG1 R12 +#define ARG2 R13 +#define ARG3 R14 +#define ARG4 R15 + +#define RET_low R12 +#define RET_high r13 + +EXTERN version_array +EXTERN __program_start + + COMMON ZAREA +;-------------------------------------------------------------- + ;BSL Z-Area +;-------------------------------------------------------------- +BSL_Entry_JMP JMP __program_start ; BSL ENTRY AREA + JMP BSL_ACTION0 + JMP $ ;BSL_ACTION1 unused + JMP $ ;BSL_ACTION2 unused + JMP $ ;BSL_ACTION3 unused + JMP $ ;BSL_ACTION4 unused + JMP $ ;BSL_ACTION5 unused + JMP $ ;BSL_ACTION6 unused + + RSEG ZAREA_CODE +//************************************************************** +// Name :BSL_ACTION0 +// Function :BSL Action 0 is a function caller +// Arguments :r15, Function ID +// - 0: Get Software ID +// - 1: Unlock BSL Flash area +// Returns :r14, Low Word +// :r15, High Word +//************************************************************** +BSL_ACTION0: + CMP #0xDEAD, ARG2 + JNE RETURN_ERROR + CMP #0xBEEF, ARG3 + JNE RETURN_ERROR + JMP RETURN_TO_BSL ; 2 == return to BSL +RETURN_ERROR + CLR RET_low + CLR RET_high + RETA + +//************************************************************** +// Name :RETURN_TO_BSL +// Function :Returns to a BSL function after that function has made +// :an external function call +// Arguments none +// Returns :none +//************************************************************** +RETURN_TO_BSL + POP.W RET_low ; remove first word from return addr + POP.W RET_high ; remove second word from return addr + + RETA ; should now return to the BSL location + +;-------------------------------------------------------------- + ;BSL Signature Area +;-------------------------------------------------------------- + PUBLIC BslEntryLoc ;location of BSL Entry Address + PUBLIC BslProtectVecLoc ;location of BSL_Protect() vector + PUBLIC PBSLSigLoc ;location of primary BSL signature + PUBLIC SBSLSigLoc ;location of secondary BSL signature + PUBLIC PJTAGLOCK_KEY ;location of primary JTAG Lock Key + PUBLIC SJTAGLOCK_KEY ;location of secondary JTAG Lock Key + + PUBLIC BSL_REQ_JTAG_OPEN + PUBLIC BSL_REQ_APP_CALL + +//************************************************************** +// Name :BSL_Protect +// Function :Protects the BSL memory and protects the SYS module +// Arguments :none +// Returns :0 in R12.0 for lock (keep JTAGLOCK_KEY state) +// :1 in R12.0 for unlock (overwrite JTAGLOCK_KEY) : BSL_REQ_JTAG_OPEN +// :0 in R12.1 for no appended call +// :1 in R12.1 for appended call via BSLENTRY : BSL_REQ_APP_CALL +//************************************************************** +BSL_REQ_JTAG_OPEN EQU 0x0001 ;Return Value for BSLUNLOCK Function to open JTAG +BSL_REQ_APP_CALL EQU 0x0002 ;Return Value for BSLUNLOCK Function to Call BSL again + +BSL_Protect: + CLR.W RET_low ; clears JTAG_OPEN, keeping KEY state + BIS #SYSBSLPE+SYSBSLSIZE0+SYSBSLSIZE1 , &SYSBSLC ; protects BSL + mov.w #0x9628, &USBKEYPID + bis.w #PSEIEN, &USBPHYCTL + bit.w #PUR_IN, &USBCNF + jnz REQUEST_BSL ; if PUR_IN set, request BSL + cmp.w #0xFFFF, &0xFFFE ; otherwise, test for blank RESET + jne JUST_RETA ; if not blank, skip delay and start + ;--------------------------------------------------------------------- + ; Delay for USB power-up + mov.w #300, R11 +DELAY_LOOP dec.w R11 + jnz DELAY_LOOP + ;--------------------------------------------------------------------- + bit.w #USBBGVBV, &USBPWRCTL ; test for USB power + jz JUST_RETA ; no power, jump to just start +REQUEST_BSL BIS.W #BSL_REQ_APP_CALL, RET_low +JUST_RETA bic.w #PSEIEN, &USBPHYCTL +#ifdef LOCK_USB_CORRECTLY + mov.w #0x0000, &USBKEYPID ; lock USB Correctly +#else + #ifdef LOCK_USB_LEGACY + mov.b #0x00, &USBKEY + #else + #error "define either legacy or correct USB module closing" + #endif +#endif + RETA + + COMMON BSLSIG + DW 0xFFFF +BslProtectVecLoc DW BSL_Protect ;adress of function +PBSLSigLoc DW 03CA5h ;1st BSL signature +SBSLSigLoc DW 0C35Ah ;2nd BSL signature + DW 0xFFFF +BslEntryLoc DW BSL_Entry_JMP + + COMMON JTAGLOCK_KEY +PJTAGLOCK_KEY DW 0xFFFF ; Primary Key Location +SJTAGLOCK_KEY DW 0xFFFF ; Secondary Key Location + ; set default unlock JTAG with option to lock with writting + ; a value <> 0x0000 or 0xFFFF + END diff --git a/ThirdParty/BSL430_Firmware/BSL430_PI.h b/ThirdParty/BSL430_Firmware/BSL430_PI.h new file mode 100644 index 0000000..3069fca --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_PI.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2012 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 BSL_PI_H +#define BSL_PI_H + +#define RX_PACKET_ONGOING 0x00 +#define DATA_RECEIVED BIT0 +#define RX_ERROR_RECOVERABLE BIT1 +#define RX_ERROR_REINIT BIT2 +#define RX_ERROR_FATAL BIT3 +#define PI_DATA_RECEIVED BIT4 + +#define PI_COMMAND_UPPER 0x50 + +//PI version Signifiers +#define BSL430_TIMER_A_PI 0x00 +#define BSL430_USB_PI 0x30 +#define BSL430_USCIA_PI 0x50 +#define BSL430_eUSCIA_PI 0x70 +#define BSL430_USCIB_I2C_PI 0x090 +#define BSL430_eUSCIB_I2C_PI 0x0A0 +#define BSL430_eUSCI_I2C_UART_PI 0xB0 +/******************************************************************************* +* *Function: init +* *Description: Initialize the peripheral and ports to begin TX/RX +*******************************************************************************/ +void PI_init(); + +/******************************************************************************* +* *Function: PI_receivePacket +* *Description: Reads an entire packet, verifies it, and sends it to the core to be interpreted +* *Returns: +* DATA_RECEIVED A packet has been received and can be processed +* RX_ERROR_RECOVERABLE An error has occured, the function can be called again to +* receive a new packet +*******************************************************************************/ +char PI_receivePacket(); + +/******************************************************************************* +* *Function: PI_sendData +* *Description: Sends the data in the data buffer +* *Parameters: +* int bufSize - the number of bytes to send +*******************************************************************************/ +void PI_sendData(int bufSize); + +/******************************************************************************* +* *Function: PI_getBufferSize +* *Description: Returns the max Data Buffer Size for this PI +* *Returns: max buffer size +*******************************************************************************/ +int PI_getBufferSize(); + +#endif diff --git a/ThirdParty/BSL430_Firmware/BSL430_USB_PI.c b/ThirdParty/BSL430_Firmware/BSL430_USB_PI.c new file mode 100644 index 0000000..d6f66e5 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL430_USB_PI.c @@ -0,0 +1,287 @@ +/* + * Copyright (C) 2012 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. + */ +#include "BSL_Device_File.h" +#include "types.h" // Basic Type declarations +#include "Proj_Settings.h" +#include "usb.h" // USB-specific Data Structures +#include "hal_UCS.h" +#include "USBAPI.h" +#include "USBAPI.h" +#include "BSL430_Command_Interpreter.h" +#include "BSL430_PI.h" +#include "BSL430_API.h" + +void interpretPI_Command(); +#define MAX_BUFFER_SIZE 62 +extern __no_init BYTE bFunctionSuspended; +__no_init char *BSL430_ReceiveBuffer; +__no_init char *BSL430_SendBuffer; +__no_init unsigned int BSL430_BufferSize; +char RAM_Buf[MAX_BUFFER_SIZE+1]; + +// TA PI Commands +#define USBDISCONNECT (PI_COMMAND_UPPER + 0x03) + +#ifndef USBKEYPID_STARTUP_BUGFIX +#error ERROR: Ensure that the USBKEYPID is closed correctly in the low level init file! +#endif + +/******************************************************************************* +Change Log: +-------------------------------------------------------------------------------- +Version 6 work begins +11.10.12 LCW USB bugfixes + Reintroduced USB conf lock bug to keep device behavior the same +-------------------------------------------------------------------------------- +Version 5 work begins +02.03.12 LCW Correctly lock USB conf registers in low level init + LCW Added bugfix check to C file to ensure other devices get fix +-------------------------------------------------------------------------------- +Version 4 work begins +16.03.10 LCW DCORSEL_3 -> DCORSEL_4 + Inlined XT2 startup code + Source code cleanup +*******************************************************************************/ + +#define USB_PI 0x30 +#define USB_PI_VERSION 0x10 +#define PI_VERSION (USB_PI+USB_PI_VERSION) // 0x36 +const unsigned char BSL430_PI_Version @ "BSL430_VERSION_PI" = PI_VERSION; +/******************************************************************************* +*Function: init +*Description: Initialize the peripheral and ports to begin TX/RX +*******************************************************************************/ +#pragma required=BSL430_PI_Version +void PI_init() +{ +#ifdef RAM_BASED_BSL + __disable_interrupt(); + BSL430_ReceiveBuffer = (char*)(ReceiveBuffer)+1; + BSL430_SendBuffer = &RAM_Buf[1]; +#else + volatile unsigned short timeOut = 0; + __disable_interrupt(); + + // Init Leds + GREEN_LED_PORT_DIR |= GREEN_LED; + RED_LED_PORT_DIR |= RED_LED; + + GREEN_LED_PORT &= ~GREEN_LED; + RED_LED_PORT &= ~RED_LED; + + BSL430_ReceiveBuffer = (char*)(ReceiveBuffer)+1; + BSL430_SendBuffer = &RAM_Buf[1]; + + //Set VCore for 1.8 Volt - required by USB module! + + // Open PMM registers for write access + PMMCTL0_H = 0xA5; + + unsigned short level = PMMCTL0_L & (PMMCOREV1 | PMMCOREV0); + while(level < 4) + { + // Set SVM highside to new level and check if a VCore increase is possible + SVSMHCTL = SVMHE | SVSHE | (SVSMHRRL0 * level); + // Wait until SVM highside is settled + while ((PMMIFG & SVSMHDLYIFG) == 0); + // Clear flag + PMMIFG &= ~SVSMHDLYIFG; + // Set also SVS highside to new level + // Vcc is high enough for a Vcore increase + SVSMHCTL |= (SVSHRVL0 * level); + // Wait until SVM highside is settled + while ((PMMIFG & SVSMHDLYIFG) == 0); + // Clear flag + PMMIFG &= ~SVSMHDLYIFG; + //**************flow change for errata workaround ************ + // Set VCore to new level + PMMCTL0_L = PMMCOREV0 * level; + // Set SVM, SVS low side to new level + SVSMLCTL = SVMLE | (SVSMLRRL0 * level)| SVSLE | (SVSLRVL0 * level); + // Wait until SVM, SVS low side is settled + while ((PMMIFG & SVSMLDLYIFG) == 0); + // Clear flag + PMMIFG &= ~SVSMLDLYIFG; + //**************flow change for errata workaround ************ + + // Increment next VCore level + level++; + } + // Lock PMM registers for write access + PMMCTL0_H = 0x00; + + //XT2 Startup + XT2SEL_PORT |= XT2SEL_PINS; + UCSCTL6 |= XT1OFF; + + UCSCTL6 &= ~(XT2OFF + XT2DRIVE0 + XT2DRIVE1); // enalbe XT2 even if not used + while (UCSCTL7 & (DCOFFG + XT2OFFG) && timeOut++ < TIME_OUT_COUNT) + { + UCSCTL7 &= ~(DCOFFG + XT2OFFG); // Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + while(timeOut >= TIME_OUT_COUNT) + { + GREEN_LED_PORT ^= GREEN_LED; + RED_LED_PORT ^= RED_LED; + __delay_cycles(800000); + } + + UCSCTL3 = SELREF__REFOCLK; // REFO for FLL reference + UCSCTL4 = SELA__REFOCLK + SELS__XT2CLK + SELM__DCOCLK; // ACLK = REFOCLK, SMCLK = XT2 ?? used??, MCLK = DCO + UCSCTL5 = DIVA_2; // ACLK/4 + __delay_cycles(800000); + + wUSBPLL = USBPLL_SETCLK_4_0; + + UCSCTL0 = 0x000; // Set DCO to lowest Tap + UCSCTL2= FLLD__2 | ((DCO_SPEED/ACLK_SPEED) - 1); + UCSCTL1= DCORSEL_4; + UCSCTL4 = SELM__DCOCLKDIV + SELS__DCOCLKDIV + SELA__REFOCLK; + + //init USB + USB_init(); + + if (USBPWRCTL & USBBGVBV) + { + USB_enable(); + USB_reset(); + USBCNF |= PUR_EN; // generate rising edge on DP -> the host enumerates our device as full speed device + } +#endif + +} +#ifdef RAM_BASED_BSL +void USB_disconnect() +{ + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + USBCNF &= ~PUR_EN; //disconnect pull up resistor - logical + //disconnect from HOST + USBPWRCTL &= ~VBOFFIE; //disable interrupt VUSBoff + USBKEYPID = 0x9600; //access to configuration registers disabled +} + +void USB_disable() +{ + USBKEYPID = 0x9628; //set KEY and PID to 0x9628 -> access to + //configuration registers enabled + USBCNF = 0; //disable USB module + USBPLLCTL &= ~UPLLEN; //disable PLL + USBKEYPID = 0x9600; //access to configuration registers disabled +} +#endif + +/******************************************************************************* +*Function: PI_receivePacket +*Description: Reads an entire packet, verifies it, and sends it to the core to be interpreted +*Returns: +* DATA_RECEIVED A packet has been received and can be processed +* RX_ERROR_RECOVERABLE An error has occured, the function can be called again to +* receive a new packet +*******************************************************************************/ +char PI_receivePacket() +{ + BSL430_BufferSize = 0; + UsbClearReceiveBuffer(); + while( BSL430_BufferSize == 0 ) + { + UsbHandler(); + if (bEnumerationStatus == ENUMERATION_COMPLETE) // if enumeration completed + { + GREEN_LED_PORT |= GREEN_LED; // turn on Green LED with enumeration + + if (bFunctionSuspended == FALSE) // and device not suspended + { + BSL430_BufferSize = UsbReceiveHID(); + } + } + } + if( BSL430_BufferSize > 0 ) + { + + RED_LED_PORT ^= RED_LED; // Toggle RED LED with each packet RX + + BSL430_BufferSize = *ReceiveBuffer; // first byte is size + if( (BSL430_ReceiveBuffer[0]) == USBDISCONNECT) + { + #ifdef RAM_BASED_BSL + USB_disconnect(); + __delay_cycles(8000001); + USB_disable(); + __delay_cycles(8000001); + UCSCTL6 |= XT2OFF; // Switch off XT2 oscillator + #else + USBKEYPID = 0x9628; // set KEY and PID to 0x9628 -> access to configuration registers enabled + USBPWRCTL = 0; //~VBOFFIE+~UPLLEN; // disable interrupt VUSBoff + USBCNF = 0; + UCSCTL6 |= XT2OFF; // Switch off XT2 oscillator + #endif + PMMCTL0 = PMMPW | PMMSWBOR; // generate BOR for reseting device + } + else + { + return DATA_RECEIVED; + } + } + return 0x00; +} +/******************************************************************************* +*Function: interpretPI_Command +*Description: interprets a PI command +*Parameters: + none +*******************************************************************************/ +void interpretPI_Command() +{} + +/******************************************************************************* +*Function: PI_sendData +*Description: Sends the data in the data buffer +*Parameters: + int bufSize - the number of bytes to send +*******************************************************************************/ +void PI_sendData(int bufSize) +{ + RAM_Buf[0] = bufSize; + while( UsbSendHID((BYTE const*)RAM_Buf) == 0 ); +} +/******************************************************************************* +*Function: PI_getBufferSize +*Description: Returns the max Data Buffer Size for this PI (size of BSL430_SendBuffer) +*Returns: size in bytes of BSL430_SendBuffer +*******************************************************************************/ +int PI_getBufferSize() +{ + return MAX_BUFFER_SIZE; +} diff --git a/ThirdParty/BSL430_Firmware/BSL_Device_File.h b/ThirdParty/BSL430_Firmware/BSL_Device_File.h new file mode 100644 index 0000000..d58c155 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/BSL_Device_File.h @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2012 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. + */ +#include "msp430.h" + +// Vendor ID (VID) for device, TI (MSP430)=0x2047 +// You can use is only in this example. +// You can order your own VID at www.usb.org +#define USB_VID 0x2047 // Vendor ID, 0x2047 for Texas Instruments Incorporated (MSP430 Group) + +#ifdef MSP_FET + #define USB_PID 0x0204 // Product ID (PID), 0x0203 ez-FET, 0x0204 MSP FET +#endif + +#ifdef eZ_FET + #define USB_PID 0x0203 // Product ID (PID), 0x0203 ez-FET, 0x0204 MSP FET +#endif + +// The following defines are here so that the supported crystals can be +// both easily seen, and changed without having to recompute any TBCCR6 values +// When changing these values, be sure to also change the matching SPEED_x_PLL values +// NOTE: Speeds must be in order from highest to lowest! +// NOTE: If only one external frequency is used, +// all SPEED_x_PLL values must be changed to that value! + +//24MHz will be detected +#define SPEED_1 24000000 +#define SPEED_1_PLL USBPLL_SETCLK_24_0; + +//12MHz will be detected +#define SPEED_2 12000000 +#define SPEED_2_PLL USBPLL_SETCLK_12_0; + +//8MHz will be detected +#define SPEED_3 8000000 +#define SPEED_3_PLL USBPLL_SETCLK_8_0; + +//4MHz will be detected +#define SPEED_4 4000000 +#define SPEED_4_PLL USBPLL_SETCLK_4_0; + + +//Device Specific Definitions +#define MASS_ERASE_DELAY 0x8000 +#define INTERRUPT_VECTOR_START 0xFFE0 +#define INTERRUPT_VECTOR_END 0xFFFF +#define SECURE_RAM_START 0x2400 + +//******************* CHANGE BASED ON RAM/FLASH +#define DCO_SPEED 8000000 +#define ACLK_SPEED 32768 + +#define TIMER_CTL TBCTL +#define TIMER_CTL_SETTINGS TBSSEL_2 + MC_2 +#define TIMER_CTL_CLR TBCLR + +#define TIMER_CCTL TBCCTL6 +#define TIMER_CCTL_SETTINGS CM_1 + CCIS_1+ CAP +#define TIMER_CCTL_IFG CCIFG +#define TIMER_CCTL_CM CM_1 + +#define TIMER_CCR TBCCR6 + + +#ifdef MSP_FET + //define xt2 pins fo fets + #define XT2SEL_PORT P7SEL + #define XT2SEL_PINS (BIT2 + BIT3) + + //define LEDS pins fo fets + #define GREEN_LED BIT3 + #define GREEN_LED_PORT P5OUT + #define GREEN_LED_PORT_DIR P5DIR + + #define RED_LED BIT7 + #define RED_LED_PORT P6OUT + #define RED_LED_PORT_DIR P6DIR + + #define TIME_OUT_COUNT 1000 +#endif + +#ifdef eZ_FET + //define xt2 pins fo fets + #define XT2SEL_PORT P5SEL + #define XT2SEL_PINS (BIT2 + BIT3) + + //define LEDS pins fo fets + #define GREEN_LED BIT3 + #define GREEN_LED_PORT P1OUT + #define GREEN_LED_PORT_DIR P1DIR + + #define RED_LED BIT2 + #define RED_LED_PORT P1OUT + #define RED_LED_PORT_DIR P1DIR + + #define TIME_OUT_COUNT 1000 +#endif + +//Device Specific Definitions + +//Device Specific Definitions for commands and bugs +#ifdef RAM_WRITE_ONLY_BSL_DEF + #define RAM_WRITE_ONLY_BSL 0x80 +#endif + +#ifdef FLASH_WRITE_BSL + #define FULL_FLASH_BSL + #define RAM_BASED_BSL 1 +#endif + +#define DO_NOT_CHECK_VPE +#define USBKEYPID_STARTUP_BUGFIX +#define LOCK_USB_CORRECTLY +// Bugfix not implimented, but left in on purpose + +// standard command includes +#ifdef RAM_WRITE_ONLY_BSL + #define SUPPORTS_RX_DATA_BLOCK_FAST + #define SUPPORTS_RX_PASSWORD + #define SUPPORTS_LOAD_PC +#endif + +#ifdef FULL_FLASH_BSL + #define FULL_GENERIC_COMMANDS + #define FLASH_COMMANDS +#endif + +#ifdef FULL_FRAM_BSL + #define FULL_GENERIC_COMMANDS +#endif + +#ifdef FULL_GENERIC_COMMANDS + #define SUPPORTS_RX_DATA_BLOCK_FAST + #define SUPPORTS_RX_PASSWORD + #define SUPPORTS_LOAD_PC + #define SUPPORTS_RX_DATA_BLOCK + #define SUPPORTS_MASS_ERASE + #define SUPPORTS_CRC_CHECK + #define SUPPORTS_TX_DATA_BLOCK + #define SUPPORTS_TX_BSL_VERSION +#endif + +#ifdef FLASH_COMMANDS + #define SUPPORTS_ERASE_SEGMENT + #define SUPPORTS_TOGGLE_INFO +#endif diff --git a/ThirdParty/BSL430_Firmware/CONFIG/lnk430F5509_RAM_AREA.xcl b/ThirdParty/BSL430_Firmware/CONFIG/lnk430F5509_RAM_AREA.xcl new file mode 100644 index 0000000..5c3f9bb --- /dev/null +++ b/ThirdParty/BSL430_Firmware/CONFIG/lnk430F5509_RAM_AREA.xcl @@ -0,0 +1,183 @@ +//***************************************************************** +// +// XLINK command file for IAR Embedded Workbench for MSP430. +// +// This file should be used with the MSP430F5438 microprocessor. +// +// Copyright 1996-2007 IAR Systems. All rights reserved. +// +// Usage: xlink your_file(s) -f lnk430f5438 library +// +// $Revision: 1.30 $ +// +//***************************************************************** + +//***************************************************************** +// +// The memory areas of the MSP430F5438 microprocessor: +// +// Peripheral units: 0 - 01FF +// +// Information memory (FLASH): 1800 - 19FF +// +// Read-write memory (RAM): 1C00 - 5BFF +// +// Read-only memory (FLASH): 5C00 - FF7F +// 10000-45BFF +// +//***************************************************************** + +//***************************************************************** +// +// The following segments are defined in this linker command file: +// +// Data read/write segments (RAM) +// ============================== +// +// segment Restrictions Usage +// ------- ------------ -------------------------- +// DATA16_I < 10000 Data16 initialized variables +// DATA16_Z < 10000 Data16 zero initialized variables +// DATA16_N < 10000 Data16 uninitialized variables +// DATA16_HEAP < 10000 Data16 heap used by malloc and free +// DATA20_I Data20 initialized variables +// DATA20_Z Data20 zero initialized variables +// DATA20_N Data20 uninitialized variables +// DATA20_HEAP Data20 heap used by malloc and free +// CSTACK < 10000 Runtime stack +// +// +// Program and data read-only segments (FLASH) +// =========================================== +// +// segment Restrictions Usage +// ------- ------------ -------------------------- +// INFO Information memory +// CSTART < 10000 Program startup code +// CODE Program code +// ISR_CODE < 10000 Program code for interrupt service routines +// DATA16_C < 10000 Data16 constant data and string literals +// DATA16_ID < 10000 Data16 initializers for DATA16_I +// DATA20_C Data20 constant data and string literals +// DATA20_ID Data20 initializers for DATA20_I +// DIFUNCT < 10000 Dynamic initialization vector used by C++ +// CHECKSUM Checksum byte(s) generated by the -J option +// INTVEC FF80-FFFF Interrupt vectors +// RESET FFFE-FFFF The reset vector +// +//***************************************************************** + + +// --------------------------------------------------------- +// Stack and heap sizes. +// --------------------------------------------------------- + +// Uncomment for command line use +//-D_STACK_SIZE=80 +//-D_DATA16_HEAP_SIZE=80 +//-D_DATA20_HEAP_SIZE=80 + + +// --------------------------------------------------------- +// Define cpu. +// --------------------------------------------------------- + +-cmsp430 + +// --------------------------------------------------------- +// Version Info + +-Z(CONST)BSL430_VERSION_VENDOR=2500-2500 +-Z(CONST)BSL430_VERSION_CI=2501-2501 +-Z(CONST)BSL430_VERSION_API=2502-2502 +-Z(CONST)BSL430_VERSION_PI=2503-2503 + +// --------------------------------------------------------- +// Read-write memory. +// --------------------------------------------------------- + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2400-24FF +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE +-Z(DATA)CSTACK+_STACK_SIZE=3200-3400 + + +// --------------------------------------------------------- +// Read only memory + + +// --------------------------------------------------------- +// Information memory +// --------------------------------------------------------- + +-Z(CODE)INFO=1800-19FF +-Z(CODE)INFOA=1980-19FF +-Z(CODE)INFOB=1900-197F +-Z(CODE)INFOC=1880-18FF +-Z(CODE)INFOD=1800-187F + +// ------------------------------------------------------------------- +// BSL Memory +// ------------------------------------------------------------------- +-Z(CODE)ZAREA=1000-100F +-Z(CODE)ZAREA_CODE=1010-1100 +-Z(CODE)BSL0=1010-11FF +-Z(CODE)BSL1=1200-13FF +-Z(CODE)BSL2=1400-15FF +-Z(CODE)BSL3=1600-17FF + +// --------------------------------------------------------- +// Low memory 0 - 0xFFFF +// --------------------------------------------------------- + +// --------------------------------------------------------- +// Code + +-Z(CODE)CSTART,ISR_CODE=2504-31FF + +// --------------------------------------------------------- +// Constant data + +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=2504-31FF + + +// --------------------------------------------------------- +// All memory 0 - 0xFFFFF +// --------------------------------------------------------- + +// --------------------------------------------------------- +// Code + +-P(CODE)CODE=2504-31FF +//-P(CODE)CODE=1070-17AB +//-P(CODE)VCORE=17AC-17EF + +// --------------------------------------------------------- +// Constant data +-Z(CONST)DATA20_C,DATA20_ID=2504-31FF +//-Z(CONST)DATA20_C,DATA20_ID=1070-17AB + + +// --------------------------------------------------------- +// Interrupt vectors +// --------------------------------------------------------- + +-Z(CODE)INTVEC=FF80-FFFF +-Z(CODE)RESET=FFFE-FFFF + + +// BSL Signatures +-Z(CONST)BSLSIG=0x17F0-17FB + // contains: + // BSL Start Vector 0x17F4 + // BSL Unlock Function Vector 0x17F6 + // BSL Unlock Signature 1 0x17F8 + // BSL Unlock Signature 2 0x17FA +-Z(CONST)JTAGLOCK_KEY=0x17FC-17FF + // if it contains: + // 0x0000 0x0000 or + // 0xFFFF 0xFFFF the JTAG will be unlocked otherwise JTAG is locked + + +// --------------------------------------------------------- +// The end +// --------------------------------------------------------- diff --git a/ThirdParty/BSL430_Firmware/CONFIG/lnk430_BSL_AREA_RAM_2400-33FF.xcl b/ThirdParty/BSL430_Firmware/CONFIG/lnk430_BSL_AREA_RAM_2400-33FF.xcl new file mode 100644 index 0000000..7b9f9b8 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/CONFIG/lnk430_BSL_AREA_RAM_2400-33FF.xcl @@ -0,0 +1,105 @@ +//***************************************************************** +// +// XLINK command file for IAR Embedded Workbench for MSP430. +// +// This file describes the BSL memory locations, and RAM +//***************************************************************** + + +// --------------------------------------------------------- +// Stack and heap sizes. +// --------------------------------------------------------- + +// Uncomment for command line use +//-D_STACK_SIZE=80 +//-D_DATA16_HEAP_SIZE=80 +//-D_DATA20_HEAP_SIZE=80 + + +// --------------------------------------------------------- +// Define cpu. +// --------------------------------------------------------- + +-cmsp430 + +// --------------------------------------------------------- +// Read-write memory. +// --------------------------------------------------------- + +-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2400-33FF +-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE +-Z(DATA)CSTACK+_STACK_SIZE# + + +// --------------------------------------------------------- +// Read only memory +// --------------------------------------------------------- + +// --------------------------------------------------------- +// Version Info + +-Z(CONST)BSL430_VERSION_VENDOR=1010-1010 +-Z(CONST)BSL430_VERSION_CI=1011-1011 +-Z(CONST)BSL430_VERSION_API=1012-1012 +-Z(CONST)BSL430_VERSION_PI=1013-1013 + +// BSL Signatures +-Z(CONST)BSLSIG=0x17F0-17FB + // contains: + // BSL Start Vector + // BSL Unlock Function Vector + // BSL Unlock Signature 1 + // BSL Unlock Signature 2 +-Z(CONST)JTAGLOCK_KEY=0x17FC-17FF + // if it contains: + // 0x0000 0x0000 or + // 0xFFFF 0xFFFF the JTAG will be unlocked otherwise JTAG is locked + + +// --------------------------------------------------------- +// Code + +-Z(CODE)CSTART,ISR_CODE=1010-17EF + +// --------------------------------------------------------- +// Constant data + +-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=1010-17EF + + +// --------------------------------------------------------- +// All memory 0 - 0xFFFFF +// --------------------------------------------------------- + +// ------------------------------------------------------------------- +// BSL Memory +// ------------------------------------------------------------------- +-Z(CODE)ZAREA=1000-100F +-Z(CODE)ZAREA_CODE=1010-17FF +-Z(CODE)BSL0=1010-11FF +-Z(CODE)BSL1=1200-13FF +-Z(CODE)BSL2=1400-15FF +-Z(CODE)BSL3=1600-17EF + +// --------------------------------------------------------- +// Code + +-P(CODE)CODE=1010-17EF +//-P(CODE)CODE=1070-17AB +//-P(CODE)VCORE=17AC-17EF + +// --------------------------------------------------------- +// Constant data +-Z(CONST)DATA20_C,DATA20_ID=1010-17EF + + +// --------------------------------------------------------- +// Interrupt vectors +// --------------------------------------------------------- + +-Z(CODE)INTVEC=FF80-FFFF +-Z(CODE)RESET=FFAE-FFAF + +// --------------------------------------------------------- +// The end +// --------------------------------------------------------- diff --git a/ThirdParty/BSL430_Firmware/Proj_Settings.h b/ThirdParty/BSL430_Firmware/Proj_Settings.h new file mode 100644 index 0000000..3bf3b05 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/Proj_Settings.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2012 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. + */ +/* + \par Documents and books: + \n - Universal Serial Bus Specification Vers. 1.1, www.Usb.org + \n - Device Class Definition for Human Interface Devices (HID) Vers. 1.1, www.Usb.org + \n - Universal Serial Bus Class Definitions for Communication Devices Vers. 1.1, www.Usb.org + \n - USB 2.0 Handbuch fuer Entwickler(German) or USB 2.0 complete(English), Jan Axelson, www.lvr.com + \n - Universal Serial Bus System Architecture, Don Anderson + \n - http://www.microsoft.com/whdc/device/input/HID_HWID.mspx, Hardware IDs for HID Devices + \n - http://msdn2.microsoft.com/en-us/library/aa475772.aspx, USB Interface Association Descriptor + \n - http://msdn2.microsoft.com/en-us/library/aa476422.aspx, Support for Interface Collections + \n - http://msdn2.microsoft.com/en-us/library/aa476412.aspx, Handling CDC and WMCDC Interface Collections + + \par Development tools: + \n - Usb descriptor viewer, www.USB.org, UVCView.x86.exe + \n - Hid device viewer, WindowsDDK, HClient.exe + \n - Usb complience test, www.USB.org, USBCV13.exe + \n - TI USB EEPROM Burner, www.TI.com, sllc259a.zip, + \n - TI TUSB3410 USB I2C Header Generator, www.TI.com, sllc293.zip + \n - TI Apploader Driver, www.TI.com, sllc160.zip +*/ + +#ifndef _Proj_Settings_H_ +#define _Proj_Settings_H_ + +#include "msp430.h" +#include "defUSB.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*----------------------------------------------------------------------------+ +| Firmware Version | +|How to detect version number of the FW running on MSP430? | +|Open ControlPanel->Systems->Hardware->DeviceManager->Ports->Msp430-> | +| ->ApplicationUART->Details | ++----------------------------------------------------------------------------*/ + +#define VER_FW_H 0x01 +#define VER_FW_L 0x08 + +/*----------------------------------------------------------------------------+ +| Switches for different versions | ++----------------------------------------------------------------------------*/ +#define _HID_ // Needed for HID interface +//#define _USE_PLL_ // If defined the PLL is used, otherwise a 48MHz clock needs to be provided at XT2IN +//#define _PLL_USES_XT_ 2 // defines which XT is used by PLL (1 or 2) + +#define _NO_ISR // Do not use USB interrupt, handles it by polling + +#ifdef __cplusplus +} +#endif +#endif /* _Proj_Settings_H_ */ diff --git a/ThirdParty/BSL430_Firmware/UsbApi.c b/ThirdParty/BSL430_Firmware/UsbApi.c new file mode 100644 index 0000000..15c3eee --- /dev/null +++ b/ThirdParty/BSL430_Firmware/UsbApi.c @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2012 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. + */ + +/*----------------------------------------------------------------------------+ +| Include files | ++----------------------------------------------------------------------------*/ +#include "types.h" // Basic Type declarations +#include "usb.h" // USB-specific Data Structures +#include "descriptors.h" +#include "Proj_Settings.h" +#include "USBAPI.h" + +/*----------------------------------------------------------------------------+ +| Global Variables | ++----------------------------------------------------------------------------*/ + +#define ReceiveBuffer (const unsigned char*)(OEP1_X_BUFFER_ADDRESS + 1) + +extern __no_init tEDB0 tEndPoint0DescriptorBlock; +extern __no_init tEDB tInputEndPointDescriptorBlock[]; +extern __no_init tEDB tOutputEndPointDescriptorBlock[]; + + + +//This functin always sends 64 bytes: 1 byte is 0x3f, 2..64byte are data +//returns how many bytes was sent +// +BYTE UsbSendHID(const BYTE* data) +{ + BYTE byte_count; + byte_count = EP_MAX_PACKET_SIZE - 1; + + if(tInputEndPointDescriptorBlock[0].bEPBCTX & EPBCNT_NAK) + { + BYTE i; + BYTE *p; + p = (unsigned char*)IEP1_X_BUFFER_ADDRESS; + *p = EP_MAX_PACKET_SIZE - 1; + p++; + for (i=0; i pointer to buffer with received data +// returned value: how many bytes received (should be always 64) +//BYTE UsbReceiveHID(BYTE **data) +BYTE UsbReceiveHID(VOID) +{ + BYTE byte_count = 0; + if (tOutputEndPointDescriptorBlock[0].bEPBCTX & EPBCNT_NAK) + { + //*data = (unsigned char*)(OEP1_X_BUFFER_ADDRESS + 1); + byte_count = tOutputEndPointDescriptorBlock[0].bEPBCTX & 0x7f; + } + + return byte_count; +} + +//should be called after successed UsbReceiveHID() to make receive buffer ready to receive next data packet +VOID UsbClearReceiveBuffer(VOID) +{ + tOutputEndPointDescriptorBlock[0].bEPBCTX = 0x00; // Clear EP1 X buffer counter, and reset NACK-bit to receive new data +} + +/*----------------------------------------------------------------------------+ +| End of source file | ++----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/UsbHidReq.c b/ThirdParty/BSL430_Firmware/UsbHidReq.c new file mode 100644 index 0000000..85dbd2c --- /dev/null +++ b/ThirdParty/BSL430_Firmware/UsbHidReq.c @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2012 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. + */ + +#include "msp430.h" +#include "types.h" // Basic Type declarations +#include "usb.h" // USB-specific Data Structures +#include "descriptors.h" +#include "Proj_Settings.h" + + +VOID usbClearOEP0ByteCount(VOID); +VOID usbSendDataPacketOnEP0(PBYTE pbBuffer); +VOID usbReceiveDataPacketOnEP0(PBYTE pbBuffer); + + +VOID usbGetHidDescriptor(VOID) +{ + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = 9; + usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroup[startHidDescriptor]); +} + +//---------------------------------------------------------------------------- + +VOID usbGetReportDescriptor(VOID) +{ + wBytesRemainingOnIEP0 = SIZEOF_REPORT_DESCRIPTOR; + usbSendDataPacketOnEP0((PBYTE)&abromReportDescriptor); +} diff --git a/ThirdParty/BSL430_Firmware/UsbHidReq.h b/ThirdParty/BSL430_Firmware/UsbHidReq.h new file mode 100644 index 0000000..55e41b7 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/UsbHidReq.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2012 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 _UsbHidReq_H_ +#define _UsbHidReq_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** +\fn VOID usbGetHidDescriptor(VOID); + +\brief Return Hid descriptor to host over control endpoint +*/ +VOID usbGetHidDescriptor(VOID); + +/** +\fn VOID usbGetReportDescriptor(VOID); + +\brief Return HID report descriptor to host over control endpoint +*/ +VOID usbGetReportDescriptor(VOID); + +/** +\fn VOID usbSetReport(VOID); + +\brief Receive Out-report from host +*/ +VOID usbSetReport(VOID); + +/** +\fn VOID usbGetReport(VOID); + +\brief Return In-report or In-feature-report to host over interrupt endpoint +*/ +VOID usbGetReport(VOID); + +#ifdef __cplusplus +} +#endif +#endif //_UsbHidReq_H_ diff --git a/ThirdParty/BSL430_Firmware/UsbIsr.c b/ThirdParty/BSL430_Firmware/UsbIsr.c new file mode 100644 index 0000000..4572875 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/UsbIsr.c @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2012 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. + */ +/*----------------------------------------------------------------------------+ +| Include files | ++----------------------------------------------------------------------------*/ +#include "msp430.h" +#include "defUSB.h" +#include "types.h" // Basic Type declarations +#include "usb.h" +#include "UsbIsr.h" +#include "Proj_Settings.h" +#include "USBAPI.h" +#include + +/*----------------------------------------------------------------------------+ +| External Variables | ++----------------------------------------------------------------------------*/ +extern __no_init BYTE bFunctionSuspended; + +extern volatile BYTE *pbBytesRemainingOnOEP1; + +extern __no_init tEDB0 tEndPoint0DescriptorBlock; +extern __no_init tEDB tInputEndPointDescriptorBlock[]; +extern __no_init tEDB tOutputEndPointDescriptorBlock[]; + +extern __no_init BYTE bStatusAction; + +/*----------------------------------------------------------------------------+ +| General Subroutines | ++----------------------------------------------------------------------------*/ + +VOID UsbHandler(VOID) +{ + unsigned int localUSBIFG = USBIFG; + + //Check if the setup interrupt is pending. + //We need to check it before other interrupt requests, + //to work around that the Setup Int has lower prio then Input Endp0 + if (localUSBIFG & SETUPIFG) + SetupPacketInterruptHandler(); + else if (USBPWRCTL & VBONIFG) + PWRVBUSonHandler(); + else if (USBPWRCTL & VBOFFIFG) + PWRVBUSoffHandler(); + else if (USBIEPIFG & BIT0) // IEPIFG0 flag = BIT0 + IEP0InterruptHandler(); + else if (localUSBIFG & RSTRIFG) + USB_reset(); + else if (localUSBIFG & SUSRIFG) + USB_suspend(); + else if (localUSBIFG & RESRIFG) + USB_resume(); +} + +/*----------------------------------------------------------------------------+ +| Interrupt Sub-routines | ++----------------------------------------------------------------------------*/ + +VOID SetupPacketInterruptHandler(VOID) +{ + USBCTL |= FRSTE; // Function Reset Connection Enable + + // NAK both input and output endpoints + tEndPoint0DescriptorBlock.bOEPBCNT = EPBCNT_NAK; + + usbProcessNewSetupPacket: + + bStatusAction = STATUS_ACTION_NOTHING; + + // clear out return data buffer + *((unsigned int*)abUsbRequestReturnData) = 0x0000; + + // decode and process the request + usbDecodeAndProcessUsbRequest(); + // Workaround for BUG2145 + asm("mov.w #0x80,R4"); + asm("bic.w R4,&0920h"); + asm("bic.w R4,&0922h"); + + USBIFG &= ~SETUPIFG; // clear the interrupt bit + // Workaround for BUG2145 + asm("bis.w R4,&0920h"); + asm("bis.w R4,&0922h"); + + // check if there is another setup packet pending + // if it is, abandon current one by NAKing both data endpoint 0 + if((USBIFG & STPOWIFG) != 0x00) + { + USBIFG &= ~(STPOWIFG | SETUPIFG); + goto usbProcessNewSetupPacket; + } +} + +//---------------------------------------------------------------------------- +VOID IntDelay(VOID) +{ + __delay_cycles(36002); // delay for 8000 cycles ~1 ms at 8 MHz +} + +//---------------------------------------------------------------------------- +VOID PWRVBUSoffHandler(VOID) +{ + IntDelay(); //delay before reset. Needed to avoid the device started again + // after it loosing power + + //reset device if USB cable plagged off + PMMCTL0 = PMMPW | PMMSWBOR; // generate BOR for reseting device +} + +//---------------------------------------------------------------------------- + +VOID PWRVBUSonHandler(VOID) +{ + IntDelay(); + USB_enable(); + USB_reset(); + + USBPWRCTL &= ~(VBONIFG|VBOFFIFG); // clean pending VBUS ON and OFF interrupts, if any + USBCNF |= PUR_EN; // generate rising edge on DP -> the host enumerates our device as full speed device +} + +//---------------------------------------------------------------------------- +VOID IEP0InterruptHandler(VOID) +{ + USBCTL |= FRSTE; // Function Reset Connection Enable + tEndPoint0DescriptorBlock.bOEPBCNT = 0x00; + + if(bStatusAction == STATUS_ACTION_DATA_IN) + { + usbSendNextPacketOnIEP0(); + } + else + { + tEndPoint0DescriptorBlock.bIEPCNFG |= EPCNF_STALL; // no more data + } + USBIEPIFG &= ~BIT0; //clear interrupt request flag +} + +/*----------------------------------------------------------------------------+ +| Interrupt Service Routines | ++----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ +| Main Routine | ++----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ +| End of source file | ++----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/UsbIsr.h b/ThirdParty/BSL430_Firmware/UsbIsr.h new file mode 100644 index 0000000..ec9b850 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/UsbIsr.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2012 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 _USBISR_H_ +#define _USBISR_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//values of USBVECINT when USB-interrupt occured +#define VECINT_NO_INTERRUPT 0x00 +#define VECINT_PWR_DROP_INTERRUPT 0x02 +#define VECINT_PLL_LOCK_INTERRUPT 0x04 +#define VECINT_PLL_SIGNAL_INTERRUPT 0x06 +#define VECINT_PLL_RANGE_INTERRUPT 0x08 +#define VECINT_PWR_VBUSOn_INTERRUPT 0x0A +#define VECINT_PWR_VBUSOff_INTERRUPT 0x0C +#define VECINT_USB_TIMESTAMP_INTERRUPT 0x10 +#define VECINT_INPUT_ENDPOINT0 0x12 +#define VECINT_OUTPUT_ENDPOINT0 0x14 +#define VECINT_RSTR_INTERRUPT 0x16 +#define VECINT_SUSR_INTERRUPT 0x18 +#define VECINT_RESR_INTERRUPT 0x1A +#define VECINT_SETUP_PACKET_RECEIVED 0x20 +#define VECINT_STPOW_PACKET_RECEIVED 0x22 +#define VECINT_INPUT_ENDPOINT1 0x24 +#define VECINT_INPUT_ENDPOINT2 0x26 +#define VECINT_INPUT_ENDPOINT3 0x28 +#define VECINT_INPUT_ENDPOINT4 0x2A +#define VECINT_INPUT_ENDPOINT5 0x2C +#define VECINT_INPUT_ENDPOINT6 0x2E +#define VECINT_INPUT_ENDPOINT7 0x30 +#define VECINT_OUTPUT_ENDPOINT1 0x32 +#define VECINT_OUTPUT_ENDPOINT2 0x34 +#define VECINT_OUTPUT_ENDPOINT3 0x36 +#define VECINT_OUTPUT_ENDPOINT4 0x38 +#define VECINT_OUTPUT_ENDPOINT5 0x3A +#define VECINT_OUTPUT_ENDPOINT6 0x3C +#define VECINT_OUTPUT_ENDPOINT7 0x3E + + +/** +\fn VOID SetupPacketInterruptHandler(VOID); + +\brief Handle incoming setup packet. + +*/ +VOID SetupPacketInterruptHandler(VOID); + +/** +\fn VOID PWRVBUSonHandler(VOID); + +\brief Handle VBuss on signal. + +*/ +VOID PWRVBUSonHandler(VOID); + +/** +\fn VOID PWRVBUSoffHandler(VOID); + +\brief Handle VBuss off signal. + +*/ +VOID PWRVBUSoffHandler(VOID); + +/** +\fn VOID IEP0InterruptHandler(VOID); + +\brief Handle In-requests from control pipe. + +*/ +VOID IEP0InterruptHandler(VOID); + +/** +\fn VOID OEP0InterruptHandler(VOID); + +\brief Handle Out-requests from control pipe. + +*/ +VOID OEP0InterruptHandler(VOID); + + +#ifdef __cplusplus +} +#endif +#endif /* _USBISR_H_ */ diff --git a/ThirdParty/BSL430_Firmware/cstartup.s43 b/ThirdParty/BSL430_Firmware/cstartup.s43 new file mode 100644 index 0000000..900a2e8 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/cstartup.s43 @@ -0,0 +1,343 @@ +/* -------------------------------------------------------------------------- +* Copyright 2012, IAR Systems AB. +* +* This source code is the property of IAR Systems. The source code may only +* be used together with the IAR Embedded Workbench. Redistribution and use +* in source and binary forms, with or without modification, is permitted +* provided that the following conditions are met: +* +* - Redistributions of source code, in whole or in part, must retain the +* above copyright notice, this list of conditions and the disclaimer below. +* +* - IAR Systems name may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* +* $Revision: 5271 $ +* ------------------------------------------------------------------------*/ +// +// Please define one of the following preprocessor symbols in order to +// customize the system initialization process. +// +// IGNORE_SEG_INIT -- To remove segment initialization. +// IGNORE_DATA16_DATA -- To remove segment initialization for DATA16 data. +// +// Note: In the current version the symbols "IGNORE_SEG_INIT" and +// "IGNORE_DATA16_DATA" will perform the same task. However, both are +// supported in order to be compatible with other IAR Compilers. +// + +#include "macros.m43" +#include "cfi.m43" + +#define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) + + XCFI_NAMES libNames + XCFI_COMMON libCommon, libNames + + +// --------------------------------------------------------- +// Define reset vector. +// + + MODULE ?reset_vector + + RSEG RESET:CONST:NOROOT(1) + PUBLIC ?reset_vector + EXTERN __program_start + +?reset_vector: + DC16 __program_start + + ENDMOD + + +// --------------------------------------------------------- +// The cstartup code -- call __low_level_init, perform initialization, +// call constructors and call main. If main returns the exit system +// is started. +// + MODULE ?cstart + +// +// Ensure that this is build with the same "positions independent +// code" settings as the compiler uses. +// + + XPICRTMODEL + + +// +// Forward declarations of segments. +// + + RSEG HEAP:DATA:NOROOT(1) + RSEG CSTACK:DATA:NOROOT + + RSEG DATA16_Z:DATA:NOROOT + RSEG DATA16_I:DATA:NOROOT + RSEG DATA16_ID:DATA:NOROOT +#if __CORE__==__430X_CORE__ + RSEG DATA20_Z:DATA:NOROOT + RSEG DATA20_I:DATA:NOROOT + RSEG DATA20_ID:DATA:NOROOT +#endif + +// --------------------------------------------------------- +// System initialization. +// + + XRSEGCSTART + PUBLIC __program_start + + EXTERN ?reset_vector + REQUIRE ?reset_vector + +__program_start: + + PUBLIC ?cstart_begin +?cstart_begin: + + // -------------------- + // Turn off the watchdog. + // + // Note: by default, this is disabled. Remove the "#if 0" and + // "#endif" lines to enable it. + // + +#if 0 + +#define WDTPW (0x5A00) +#define WDTHOLD (0x0080) +#define WDTCTL (0x0120) + + MOV #WDTPW + WDTHOLD, &WDTCTL +#endif + + // -------------------- + // Initialize SP to point to the top of the stack. + // + MOV #SFE(CSTACK), SP + + // + // Ensure that main is called. + // + REQUIRE ?cstart_call_main + + +// ----------------------------------------------- +// Call __low_level_init to perform initialization before initializing +// segments and calling main. If the function returns 0 no segment +// initialization should take place. +// +// Link with your own version of __low_level_init to override the +// default action: to do nothing but return 1. +// + + XRSEGCSTART + + PUBLIC ?cstart_call_low_level_init + EXTERN __low_level_init + +?cstart_call_low_level_init: + XCALL #__low_level_init + CMP #0, W0 + JEQ ?cstart_call_main + + +// ----------------------------------------------- +// Segment initialization: +// +// xxx_Z -- uninitialized data that are filled with zeros. +// xxx_I -- initialized data that gets the values from the corresponding +// xxx_ID segment. +// + +#ifndef IGNORE_SEG_INIT + +#ifndef IGNORE_DATA16_DATA + + // + // Clear DATA16_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero + //EXTERN __data16_memzero + +?cstart_init_zero: + //MOV #SFB DATA16_Z, CW0 + //MOV #sizeof DATA16_Z, CW1 + + //XCALL #__data16_memzero + + + // + // Copy DATA16_ID to DATA16_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy + EXTERN __data16_memcpy + +?cstart_init_copy: + MOV #SFB DATA16_I, CW0 + MOV #SFB DATA16_ID, CW1 + +#if CALLING_CONVENTION == 1 + PUSH.W #sizeof DATA16_I + + XCALL #__data16_memcpy + + ADD #2, SP +#else + MOV #sizeof DATA16_I, CW2 + + XCALL #__data16_memcpy +#endif // CALLING_CONVENTION + +#endif // IGNORE_DATA16_DATA + +#if __CORE__==__430X_CORE__ + +#ifndef IGNORE_DATA20_DATA + + // + // Clear DATA20_Z. + // + + XRSEGCSTART + PUBLIC ?cstart_init_zero20 + EXTERN __data20_memzero + +?cstart_init_zero20: + MOVA #SFB DATA20_Z,W0 + MOV.W #LWRD(sizeof DATA20_Z), L1L + MOV.W #HWRD(sizeof DATA20_Z), L1H + + XCALL #__data20_memzero + + + // + // Copy DATA20_ID to DATA20_I + // + + XRSEGCSTART + PUBLIC ?cstart_init_copy20 + EXTERN __data20_memcpy + +?cstart_init_copy20: + MOVA #SFB DATA20_I, CW0 + MOVA #SFB DATA20_ID, CW1 +#if CALLING_CONVENTION == 1 + PUSHX.A #sizeof DATA20_I + + XCALL #__data20_memcpy + + ADD #4, SP +#else + MOV.W #LWRD(sizeof DATA20_I), L1L + MOV.W #HWRD(sizeof DATA20_I), L1H + + XCALL #__data20_memcpy +#endif + +#endif // IGNORE_DATA16_DATA + +#endif + +#endif // IGNORE_SEG_INIT + + + +// ----------------------------------------------- +// Call constructors of static objects. +// + + RSEG DIFUNCT:CONST:NOROOT(1) + XRSEGCSTART + PUBLIC ?cstart_call_ctors + + EXTERN __call_ctors + +?cstart_call_ctors: + +#ifdef REGISTER_MODEL_REG20 + + MOVA #SFB DIFUNCT, CW0 + MOVA #SFE DIFUNCT, CW1 + +#else /* REGISTER_MODEL_REG20 */ + + MOV.W #SFB DIFUNCT, CW0 + MOV.W #SFE DIFUNCT, CW1 + +#endif /* REGISTER_MODEL_REG20 */ + + XCALL #__call_ctors + + +// ----------------------------------------------- +// Call main() with no arguments and then exit using the return value +// of main as the parameter. +// + + XRSEGCSTART + PUBLIC ?cstart_call_main + + EXTERN main + EXTERN exit + +?cstart_call_main: + XCALL #main + jmp $ + // XCALL #exit + + PUBLIC ?cstart_end +?cstart_end: + + // Note: "ENDMOD label" means code that this module is the + // start of the application. + ENDMOD __program_start + + + + +// --------------------------------------------------------- +// __low_level_init +// +// The only action of this default version of __low_level_init is to +// return 1. By doing so it signals that normal initialization of data +// segments should be done. +// +// A customized version of __low_level_init may be created in order to +// perform initialization before initializing segments and calling main +// and/or to skip initialization of data segments under certain +// circumstances. +// +// For further details see sample file lowinit.c +// + + + MODULE lowinit + + PUBLIC __low_level_init + + RSEG CODE:CODE:NOROOT(1) + +__low_level_init: + MOV #1, W0 // By returning 1 this function + XRET // indicates that the normal + // initialization should take place + + ENDMOD + + END diff --git a/ThirdParty/BSL430_Firmware/defUSB.h b/ThirdParty/BSL430_Firmware/defUSB.h new file mode 100644 index 0000000..fdf102b --- /dev/null +++ b/ThirdParty/BSL430_Firmware/defUSB.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2012 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 _defTC0701_H +#define _defTC0701_H + +#include "types.h" + +/*----------------------------------------------------------------------------+ +| Constant Definitions | ++----------------------------------------------------------------------------*/ +#define YES 1 +#define NO 0 + +#define TRUE 1 +#define FALSE 0 + +#define NOERR 0 +#define ERR 1 + +#define NO_ERROR 0 +#define ERROR 1 + +#define DISABLE 0 +#define ENABLE 1 + +/*----------------------------------------------------------------------------+ +| Memory Definitions | ++----------------------------------------------------------------------------*/ +//#define USB_MEMORY_START 0x01C00 +//#define USB_MEMORY_END 0x023FF + +//addresses of USB memory in RAM +#define START_OF_USB_MEMORY 0x1C00 +#define END_OF_USB_MEMORY 0x23FF + +/*----------------------------------------------------------------------------+ +| USB Constants, Type Definition & Macro | ++----------------------------------------------------------------------------*/ + +// USB related Constant +#define MAX_ENDPOINT_NUMBER 0x07 // A maximum of 7 endpoints is available +#define EP0_MAX_PACKET_SIZE 0x08 +#define EP0_PACKET_SIZE 0x08 +#define EP_MAX_PACKET_SIZE 0x40 + +// Base addresses of transmit and receive buffers +#define OEP1_X_BUFFER_ADDRESS 0x1C00 // Input Endpoint 1 X Buffer Base-address +#define OEP1_Y_BUFFER_ADDRESS 0x1C40 // Input Endpoint 1 Y Buffer Base-address +#define IEP1_X_BUFFER_ADDRESS 0x1C80 // Output Endpoint 1 X Buffer Base-address +#define IEP1_Y_BUFFER_ADDRESS 0x1CC0 // Output Endpoint 1 Y Buffer Base-address + +#define OEP2_X_BUFFER_ADDRESS 0x1D00 // Input Endpoint 2 X Buffer Base-address +#define OEP2_Y_BUFFER_ADDRESS 0x1D40 // Input Endpoint 2 Y Buffer Base-address +#define IEP2_X_BUFFER_ADDRESS 0x1D80 // Output Endpoint 2 X Buffer Base-address +#define IEP2_Y_BUFFER_ADDRESS 0x1DC0 // Output Endpoint 2 Y Buffer Base-address + +#define OEP3_X_BUFFER_ADDRESS 0x1E00 // Input Endpoint 2 X Buffer Base-address +#define OEP3_Y_BUFFER_ADDRESS 0x1E40 // Input Endpoint 2 Y Buffer Base-address +#define IEP3_X_BUFFER_ADDRESS 0x1E80 // Output Endpoint 2 X Buffer Base-address +#define IEP3_Y_BUFFER_ADDRESS 0x1EC0 // Output Endpoint 2 Y Buffer Base-address + +#define OEP4_X_BUFFER_ADDRESS 0x1F00 // Input Endpoint 2 X Buffer Base-address +#define OEP4_Y_BUFFER_ADDRESS 0x1F40 // Input Endpoint 2 Y Buffer Base-address +#define IEP4_X_BUFFER_ADDRESS 0x1F80 // Output Endpoint 2 X Buffer Base-address +#define IEP4_Y_BUFFER_ADDRESS 0x1FC0 // Output Endpoint 2 Y Buffer Base-address + +#define OEP5_X_BUFFER_ADDRESS 0x2000 // Input Endpoint 2 X Buffer Base-address +#define OEP5_Y_BUFFER_ADDRESS 0x2040 // Input Endpoint 2 Y Buffer Base-address +#define IEP5_X_BUFFER_ADDRESS 0x2080 // Output Endpoint 2 X Buffer Base-address +#define IEP5_Y_BUFFER_ADDRESS 0x20C0 // Output Endpoint 2 Y Buffer Base-address + +#define OEP6_X_BUFFER_ADDRESS 0x2100 // Input Endpoint 2 X Buffer Base-address +#define OEP6_Y_BUFFER_ADDRESS 0x2140 // Input Endpoint 2 Y Buffer Base-address +#define IEP6_X_BUFFER_ADDRESS 0x2180 // Output Endpoint 2 X Buffer Base-address +#define IEP6_Y_BUFFER_ADDRESS 0x21C0 // Output Endpoint 2 Y Buffer Base-address + +#define OEP7_X_BUFFER_ADDRESS 0x2200 // Input Endpoint 2 X Buffer Base-address +#define OEP7_Y_BUFFER_ADDRESS 0x2240 // Input Endpoint 2 Y Buffer Base-address +#define IEP7_X_BUFFER_ADDRESS 0x2280 // Output Endpoint 2 X Buffer Base-address +#define IEP7_Y_BUFFER_ADDRESS 0x22C0 // Output Endpoint 2 Y Buffer Base-address + +#define X_BUFFER 0 +#define Y_BUFFER 1 + +// addresses of pipes for endpoints +#define EP1_ADDR 0x01 //address for endpoint 1 +#define EP2_ADDR 0x02 //address for endpoint 2 +#define EP3_ADDR 0x03 //address for endpoint 3 +#define EP4_ADDR 0x04 //address for endpoint 4 +#define EP5_ADDR 0x05 //address for endpoint 5 +#define EP6_ADDR 0x06 //address for endpoint 6 +#define EP7_ADDR 0x07 //address for endpoint 7 + +// EDB Data Structure +typedef struct _tEDB +{ + BYTE bEPCNF; // Endpoint Configuration + BYTE bEPBBAX; // Endpoint X Buffer Base Address + BYTE bEPBCTX; // Endpoint X Buffer byte Count + BYTE bSPARE0; // no used + BYTE bSPARE1; // no used + BYTE bEPBBAY; // Endpoint Y Buffer Base Address + BYTE bEPBCTY; // Endpoint Y Buffer byte Count + BYTE bEPSIZXY; // Endpoint XY Buffer Size +} tEDB, *tpEDB; + +typedef struct _tEDB0 +{ + BYTE bIEPCNFG; // Input Endpoint 0 Configuration Register + BYTE bIEPBCNT; // Input Endpoint 0 Buffer Byte Count + BYTE bOEPCNFG; // Output Endpoint 0 Configuration Register + BYTE bOEPBCNT; // Output Endpoint 0 Buffer Byte Count +} tEDB0, *tpEDB0; + +// EndPoint Desciptor Block Bits +#define EPCNF_USBIE 0x04 // USB Interrupt on Transaction Completion. Set By MCU + // 0:No Interrupt, 1:Interrupt on completion +#define EPCNF_STALL 0x08 // USB Stall Condition Indication. Set by UBM + // 0: No Stall, 1:USB Install Condition +#define EPCNF_DBUF 0x10 // Double Buffer Enable. Set by MCU + // 0: Primary Buffer Only(x-buffer only), 1:Toggle Bit Selects Buffer + +#define EPCNF_TOGGLE 0x20 // USB Toggle bit. This bit reflects the toggle sequence bit of DATA0 and DATA1. + +#define EPCNF_UBME 0x80 // UBM Enable or Disable bit. Set or Clear by MCU. + // 0:UBM can't use this endpoint + // 1:UBM can use this endpoint +#define EPBCNT_BYTECNT_MASK 0x7F // MASK for Buffer Byte Count +#define EPBCNT_NAK 0x80 // NAK, 0:No Valid in buffer, 1:Valid packet in buffer + +//definitions for TC0701 USB-module (missed in MSP430TC0701.h) + +#define START_OF_USB_BUFFER 0x1C00 + +// input and output buffers for EP0 +#define USBIEP0BUF 0x2378 +#define USBOEP0BUF 0x2370 + +#endif /*_defTC0701_H */ diff --git a/ThirdParty/BSL430_Firmware/descriptor.h b/ThirdParty/BSL430_Firmware/descriptor.h new file mode 100644 index 0000000..d113c89 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/descriptor.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2012 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. + */ + +// device descriptor structure +typedef struct _tDEVICE_DESCRIPTOR +{ + BYTE bLength; // Length of this descriptor (12h bytes) + BYTE bDescriptorType; // Type code of this descriptor (01h) + WORD bcdUsb; // Release of USB spec (0210h = rev 2.10) + BYTE bDeviceClass; // Device's base class code + BYTE bDeviceSubClass; // Device's sub class code + BYTE bDeviceProtocol; // Device's protocol type code + BYTE bMaxPacketSize0; // End point 0's max packet size (8/16/32/64) + WORD wIdVendor; // Vendor ID for device + WORD wIdProduct; // Product ID for device + WORD wBcdDevice; // Revision level of device + BYTE wManufacturer; // Index of manufacturer name string desc + BYTE wProduct; // Index of product name string desc + BYTE wSerialNumber; // Index of serial number string desc + BYTE bNumConfigurations; // Number of configurations supported +} tDEVICE_DESCRIPTOR, *ptDEVICE_DESCRIPTOR; + +// configuration descriptor structure +typedef struct _tCONFIG_DESCRIPTOR +{ + BYTE bLength; // Length of this descriptor (9h bytes) + BYTE bDescriptorType; // Type code of this descriptor (02h) + WORD wTotalLength; // Size of this config desc plus all interface, + // endpoint, class, and vendor descriptors + BYTE bNumInterfaces; // Number of interfaces in this config + BYTE bConfigurationValue; // Value to use in SetConfiguration command + BYTE bConfiguration; // Index of string desc describing this config + BYTE bAttributes; // See CFG_DESC_ATTR_xxx values below + BYTE bMaxPower; // Power used by this config in 2mA units +} tCONFIG_DESCRIPTOR, *ptCONFIG_DESCRIPTOR; + +// interface descriptor structure +typedef struct _tINTERFACE_DESCRIPTOR +{ + BYTE bLength; // Length of this descriptor (9h bytes) + BYTE bDescriptorType; // Type code of this descriptor (04h) + BYTE bInterfaceNumber; // Zero based index of interface in the configuration + BYTE bAlternateSetting; // Alternate setting number of this interface + BYTE bNumEndpoints; // Number of endpoints in this interface + BYTE bInterfaceClass; // Interface's base class code + BYTE bInterfaceSubClass; // Interface's sub class code + BYTE bInterfaceProtocol; // Interface's protocol type code + BYTE bInterface; // Index of string desc describing this interface +} tINTERFACE_DESCRIPTOR, *ptINTERFACE_DESCRIPTOR; + +// endpoint descriptor structure +typedef struct _tENDPOINT_DESCRIPTOR +{ + BYTE bLength; // Length of this descriptor (7h bytes) + BYTE bDescriptorType; // Type code of this descriptor (05h) + BYTE bEndpointAddress; // See EP_DESC_ADDR_xxx values below + BYTE bAttributes; // See EP_DESC_ATTR_xxx value below + WORD wMaxPacketSize; // Max packet size of endpoint + BYTE bInterval; // Polling interval of endpoint in milliseconds +} tENDPOINT_DESCRIPTOR, *tpENDPOINT_DESCRIPTOR; diff --git a/ThirdParty/BSL430_Firmware/descriptors.c b/ThirdParty/BSL430_Firmware/descriptors.c new file mode 100644 index 0000000..8ee0574 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/descriptors.c @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2012 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. + */ + +/*----------------------------------------------------------------------------+ +| Include files | ++----------------------------------------------------------------------------*/ + +#include "BSL_Device_File.h" +#include "defUSB.h" +#include "types.h" // Basic Type declarations +#include "usb.h" // USB-specific Data Structures +#include "descriptors.h" +#include "Proj_Settings.h" + +/*----------------------------------------------------------------------------+ +| Internal Type Definition & Macro | ++----------------------------------------------------------------------------*/ + +#ifndef RAM_BASED_BSL +BYTE const abromDeviceDescriptor[SIZEOF_DEVICE_DESCRIPTOR] @ 0x107C = { +#endif +#ifdef RAM_BASED_BSL +BYTE const abromDeviceDescriptor[SIZEOF_DEVICE_DESCRIPTOR] @ 0x2516 = { +#endif + SIZEOF_DEVICE_DESCRIPTOR, // Length of this descriptor (12h bytes) + DESC_TYPE_DEVICE, // Type code of this descriptor (01h) + 0x00,0x02, // Release of USB spec (Rev 2.0) + 0x00, // Device's base class code + 0, // Device's sub class code + 0, // Device's protocol type code + EP0_PACKET_SIZE, // End point 0's packet size = 8 + USB_VID&0xFF, USB_VID>>8, // Vendor ID for device, TI=0x0451 + // this is Texas Instruments VID + // you can use is only in this example. + // You can order your own VID at www.usb.org + USB_PID&0xFF, USB_PID>>8, // Product ID for device, + // this ID is to only with this example + VER_FW_L, VER_FW_H, // Revision level of device, Rev=1.00 + 0,// 1, // Index of manufacturer name string desc + 0,// 2, // Index of product name string desc + 0, // No serial number for this device + 1 // Number of configurations supported +}; + + + +BYTE const abromReportDescriptor[SIZEOF_REPORT_DESCRIPTOR]= +//BYTE const abromReportDescriptor[]= +{ + 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0xa1, 0x01, // COLLECTION (Application) + + 0x85, 0x3F, // Report ID + 0x95, 0x3F, // REPORT_COUNT () + 0x75, 0x08, // REPORT_SIZE (8) + 0x25, 0x01, + 0x15, 0x01, + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + + //--------------------------------------------------------------------------- + 0x85, 0x3F, // Report ID + 0x95, 0x3F, // REPORT_COUNT () + 0x75, 0x08, // REPORT_SIZE (8) + 0x25, 0x01, + 0x15, 0x01, + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) + + 0xC0 // end Application Collection +}; + +//#define SIZEOF_REPORT_DESCRIPTOR1 sizeof(abromReportDescriptor) + +BYTE const abromConfigurationDescriptorGroup[wTotalLength] = +{ + // CONFIGURATION DESCRIPTOR (9 bytes) + SIZEOF_CONFIG_DESCRIPTOR, // bLength + DESC_TYPE_CONFIG, // bDescriptorType: 2 + wTotalLength,0x00, // wTotalLength + USB_NUM_CONFIGURATIONS, // bNumInterfaces + 0x01, // bConfigurationValue + 0x00, // iConfiguration Description offset + USB_SUPPORT_BUS_POWERED | USB_SUPPORT_REM_WAKE, // bmAttributes, bus power, remote wakeup + 0x32, // Max. Power Consumption at 2mA unit + + //-------- Descriptor for HID class device ------------------------------------- + // INTERFACE DESCRIPTOR (9 bytes) + SIZEOF_INTERFACE_DESCRIPTOR, // bLength + DESC_TYPE_INTERFACE, // bDescriptorType: 4 + bInterfaceNumberHid, // bInterfaceNumber + 0x00, // bAlternateSetting + 2,//2, // bNumEndpoints + 0x03, // bInterfaceClass: 3 = HID Device + 0, // bInterfaceSubClass: + 0, // bInterfaceProtocol: + 0,//4, // iInterface:1 + + + // HID DESCRIPTOR (9 bytes) + 0x09, // bLength of HID descriptor + 0x21, // HID Descriptor Type: 0x21 + 0x01,0x01, // HID Revision number 1.01 + 0x00, // Target country, nothing specified (00h) + 0x01,//1 // Number of HID classes to follow + 0x22, // bDescriptorType, Report descriptor type + (SIZEOF_REPORT_DESCRIPTOR& 0x0ff), // Total length of report descriptor + (SIZEOF_REPORT_DESCRIPTOR >>8), + + + // ENDPOINT #81 INPUT DESCRIPTOR, (7 bytes) + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength + DESC_TYPE_ENDPOINT, // bDescriptorType + 0x81, //0x81 // bEndpointAddress; bit7=1 for IN, bits 3-0=1 for ep1 + EP_DESC_ATTR_TYPE_INT, // bmAttributes, interrupt transfers + 0x40, 0x00, //0x40, 0x00, // wMaxPacketSize, 8 bytes + 0x1, //1 // bInterval + + + // ENDPOINT #1 OUTPUT DESCRIPTOR, (7 bytes) + SIZEOF_ENDPOINT_DESCRIPTOR, // bLength + DESC_TYPE_ENDPOINT, // bDescriptorType + 0x01, // bEndpointAddress; bit7=1 for IN, bits 3-0=1 for ep1 + EP_DESC_ATTR_TYPE_INT, // bmAttributes, interrupt transfers + 0x40, 0x00, //0x40, 0x00, // wMaxPacketSize, 8 bytes + 0x1, //1 // bInterval + +}; + + +/*----------------------------------------------------------------------------+ +| End of source file | ++----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/descriptors.h b/ThirdParty/BSL430_Firmware/descriptors.h new file mode 100644 index 0000000..ea93bea --- /dev/null +++ b/ThirdParty/BSL430_Firmware/descriptors.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2012 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. + */ + +/*----------------------------------------------------------------------------+ +| Include files | ++----------------------------------------------------------------------------*/ +#include "Proj_Settings.h" + +#define startHidDescriptor 18 + +#define MAX_PACKET_SIZE 0x40 + +//#define USB_STR_INDEX_SERNUM 1 // set to 0 if not SerialNumber String descriptor will be used + // or set to 1 if the serial number from TLV structure should be used + +//Controls whether the remote wakeup feature is supported by this device. +// A value of 0x20 indicates that is it supported (this value is the mask for +// the bmAttributes field in the configuration descriptor). +// A value of zero indicates remote wakeup is not supported. +// Other values are undefined, as they will interfere with bmAttributes. +#define USB_SUPPORT_REM_WAKE 0 //CFG_DESC_ATTR_REMOTE_WAKE + +//Controls whether the application is BUS powered +// (gets the current for its functionality from USB bus) or SELF powered. +// Set 0x80 for BUS powered device +// or set to 0x40 for self powered device +#define USB_SUPPORT_BUS_POWERED CFG_DESC_ATTR_BUS_POWERED + +//#define wTotalLength 53 // wTotalLength, CDC +#define wTotalLength 41 // wTotalLength, HID +#define USB_NUM_CONFIGURATIONS 1 // Number of implemented interfaces +//#define bInterfaceNumberCdc 0 +#define bInterfaceNumberHid 0 + + +#define SIZEOF_REPORT_DESCRIPTOR 64-28 + +extern BYTE const abromDeviceDescriptor[SIZEOF_DEVICE_DESCRIPTOR]; + +extern BYTE const abromConfigurationDescriptorGroup[wTotalLength]; + +extern BYTE const abromReportDescriptor[]; + + +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/hal_UCS.c b/ThirdParty/BSL430_Firmware/hal_UCS.c new file mode 100644 index 0000000..d6b131b --- /dev/null +++ b/ThirdParty/BSL430_Firmware/hal_UCS.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2012 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. + */ + + + +#include "msp430.h" +#include "hal_UCS.h" + +//==================================================================== +/** + * Startup routine for XT2 + * +*/ +void XT2_Start(void) +{ + P5SEL |= 0x0C; // XT2IN/OUT = on + UCSCTL6 &= ~XT2OFF; // enalbe XT2 even if not used + + //while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + while (UCSCTL7 & (DCOFFG /*+XT1LFOFFG+XT1HFOFFG*/ +XT2OFFG)) + { + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG /*+XT1HFOFFG*/ +XT2OFFG); // Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + +} + +//==================================================================== +/** + * Initializes FLL of the UCS + * + * \param fsystem required system frequency (MCLK) in kHz + * \param ratio ratio between fsystem and FLLREFCLK + */ +void Init_FLL(const unsigned int fsystem, const unsigned int ratio) +{ + unsigned int d, dco_div_bits; + // /\ Prevent variables from being "optimized". + + d = ratio; + + dco_div_bits = FLLD__2; // Have at least a divider of 2 + + UCSCTL0 = 0x000; // Set DCO to lowest Tap + + UCSCTL2 &= ~(0x3FF); // Reset FN bits + UCSCTL2= dco_div_bits | (d - 1); + + UCSCTL1= DCORSEL_5 ; + + UCSCTL4 = (UCSCTL4 & ~(SELM_7 + SELS_7)) | (SELM__DCOCLKDIV + SELS__DCOCLKDIV); // selcet DCODIVCLK + +} // End of fll_init() diff --git a/ThirdParty/BSL430_Firmware/hal_UCS.h b/ThirdParty/BSL430_Firmware/hal_UCS.h new file mode 100644 index 0000000..eb68d3a --- /dev/null +++ b/ThirdParty/BSL430_Firmware/hal_UCS.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2012 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 __hal_UCS +#define __hal_UCS + +#define XT1_TO_MCLK UCSCTL4 = (UCSCTL4 & ~(SELM_7)) | (SELM__XT1CLK) /*Select XT1 for MCLK */ +#define XT2_TO_MCLK UCSCTL4 = (UCSCTL4 & ~(SELM_7)) | (SELM__XT2CLK) /* Select XT2 for MCLK */ +#define XT1_TO_SMCLK UCSCTL4 = (UCSCTL4 & ~(SELS_7)) | (SELS__XT1CLK) /* Select XT1 for SMCLK */ +#define XT2_TO_SMCLK UCSCTL4 = (UCSCTL4 & ~(SELS_7)) | (SELS__XT2CLK) /* Select XT2 for SMCLK */ + +//#define MCLK_DIV_1 UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM_0) /* set MCLK/1 */ +//#define MCLK_DIV_2 UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM_1) /* set MCLK/2 */ +//#define SMCLK_DIV_1 UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS_0) /* set SMCLK/1 */ +//#define SMCLK_DIV_2 UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS_1) /* set SMCLK/2 */ + +#define MCLK_DIV(x) UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM__##x) /* set MCLK/x */ +#define SMCLK_DIV(x) UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS__##x) /* set SMCLK/x */ + + +//==================================================================== +/** + * Startup routine for 32kHz Cristal on LFXT1 + * +*/ +void LFXT_Start(void); + +//==================================================================== +/** + * Startup routine for XT1 + * +*/ +void XT1_Start(void); + +//==================================================================== +/** + * Use XT1 in Bypasss mode + * +*/ +void XT1Bypass(void); + +//==================================================================== +/** + * Startup routine for XT2 + * +*/ +void XT2_Start(void); + +//==================================================================== +/** + * Use XT2 in Bypasss mode for MCLK + * +*/ +void XT2Bypass(void); + + +//==================================================================== +/** + * Initializes FLL of the UCS + * + * \param fsystem required system frequency (MCLK) in kHz + * \param ratio ratio between fsystem and FLLREFCLK + */ +void Init_FLL(const unsigned int fsystem, const unsigned int ratio); + + +#endif /* __hal_UCS */ diff --git a/ThirdParty/BSL430_Firmware/tools/convertBsl.bat b/ThirdParty/BSL430_Firmware/tools/convertBsl.bat new file mode 100644 index 0000000..e20208c --- /dev/null +++ b/ThirdParty/BSL430_Firmware/tools/convertBsl.bat @@ -0,0 +1,49 @@ +REM convertBsl.bat +REM +REM Copyright (C) 2007 - 2013 Texas Instruments Incorporated - http://www.ti.com/ +REM +REM +REM Redistribution and use in source and binary forms, with or without +REM modification, are permitted provided that the following conditions +REM are met: +REM +REM Redistributions of source code must retain the above copyright +REM notice, this list of conditions and the following disclaimer. +REM +REM Redistributions in binary form must reproduce the above copyright +REM notice, this list of conditions and the following disclaimer in the +REM documentation and/or other materials provided with the +REM distribution. +REM +REM Neither the name of Texas Instruments Incorporated nor the names of +REM its contributors may be used to endorse or promote products derived +REM from this software without specific prior written permission. +REM +REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +REM A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +REM OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +REM SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +REM LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +REM DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +REM THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +REM (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +REM OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set "TMP=%1%\tools\tmp" +set "SED=%1%\..\..\Bios\tools\sed.exe" +set "SRC=%1\objects\image\%2.txt" +set "DST=%1\..\BSL430_DLL\BSL430_DLL\Utility_Classes\%2.h" +set "TMP_TXT=%TMP%\%2_tmp.txt" +set "TMP_HEADER=%TMP%\%2_tmp.h" + +if not exist %TMP% mkdir %TMP% +%1\..\..\Bios\tools\srec_cat.exe %SRC% -guess -fill 0xFF -within %SRC% -guess -range-padding 2 -exclude 0xFFFE 0x10000 -o %TMP_TXT% -ti_txt +%1\..\..\Bios\tools\srec_cat.exe %TMP_TXT% -guess -o %TMP_HEADER% -ca %2%Image -c_comp + +%SED% -i "s/unsigned char/uint8_t/g;s/unsigned short/uint16_t/g;s/unsigned long/uint32_t/g" %TMP_HEADER% +copy %TMP_HEADER% %DST% + +del %TMP_TXT% +del %TMP_HEADER% diff --git a/ThirdParty/BSL430_Firmware/types.h b/ThirdParty/BSL430_Firmware/types.h new file mode 100644 index 0000000..c4e1550 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/types.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2012 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 _TYPES_H_ +#define _TYPES_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*----------------------------------------------------------------------------+ +| Include files | ++----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ +| Function Prototype | ++----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ +| Type Definition & Macro | ++----------------------------------------------------------------------------*/ +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef short SHORT; +typedef unsigned short USHORT; +typedef long LONG; +typedef unsigned long ULONG; +typedef void VOID; +typedef unsigned long HANDLE; +typedef char * PSTR; +typedef int BOOL; +typedef double DOUBLE; +typedef unsigned char BYTE; +typedef unsigned char* PBYTE; +typedef unsigned int WORD; +typedef unsigned long DWORD; +typedef unsigned long* PDWORD; +#define VOID void + +// DEVICE_REQUEST Structure +typedef struct _tDEVICE_REQUEST +{ + BYTE bmRequestType; // See bit definitions below + BYTE bRequest; // See value definitions below + WORD wValue; // Meaning varies with request type + WORD wIndex; // Meaning varies with request type + WORD wLength; // Number of bytes of data to transfer +} tDEVICE_REQUEST, *ptDEVICE_REQUEST; + + +//---------------------------------------------------------------------------- +typedef enum +{ + STATUS_ACTION_NOTHING, + STATUS_ACTION_DATA_IN, + STATUS_ACTION_DATA_OUT +} tSTATUS_ACTION_LIST; + +typedef enum +{ + DISABLE, + ENABLE +} tSTATUS_EN_DISABLED; + +typedef enum +{ + FALSE, + TRUE +} tBOOL; + +/*----------------------------------------------------------------------------+ +| Constant Definition | ++----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------+ +| End of header file | ++----------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +#endif /* _TYPES_H_ */ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/usb.c b/ThirdParty/BSL430_Firmware/usb.c new file mode 100644 index 0000000..3b6c797 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/usb.c @@ -0,0 +1,630 @@ +/* + * Copyright (C) 2012 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. + */ +/*----------------------------------------------------------------------------+ +| Include files | ++----------------------------------------------------------------------------*/ +#include "types.h" // Basic Type declarations +#include "usb.h" // USB-specific Data Structures +#include "UsbHidReq.h" +#include "descriptors.h" +#include "Proj_Settings.h" + +/*----------------------------------------------------------------------------+ +| Internal Constant Definition | ++----------------------------------------------------------------------------*/ +#define NO_MORE_DATA 0xFF + +/*----------------------------------------------------------------------------+ +| Internal Variables | ++----------------------------------------------------------------------------*/ + +#pragma location = 0x2400 +__no_init BYTE bConfigurationNumber; // Set to 1 when USB device has been + // configured, set to 0 when unconfigured +#pragma location = 0x2401 +__no_init BYTE bInterfaceNumber; // interface number + +#pragma location = 0x2402 +__no_init BYTE wBytesRemainingOnIEP0; // For endpoint zero transmitter only + // Holds count of bytes remaining to be + // transmitted by endpoint 0. A value + // of 0 means that a 0-length data packet + // A value of 0xFFFF means that transfer + // is complete. + +#pragma location = 0x2404 +__no_init BYTE wBytesRemainingOnOEP0; // For endpoint zero transmitter only + // Holds count of bytes remaining to be + // received by endpoint 0. A value + // of 0 means that a 0-length data packet + // A value of 0xFFFF means that transfer + // is complete. + +#pragma location = 0x2406 +__no_init PBYTE pbIEP0Buffer; // A buffer pointer to input end point 0 + // Data sent back to host is copied from + // this pointed memory location + +//#pragma location = 0x240A +__no_init PBYTE pbOEP0Buffer; // A buffer pointer to output end point 0 + // Data sent from host is copied to + // this pointed memory location + +#pragma location = 0x240E +__no_init BYTE bHostAskMoreDataThanAvailable; + +__no_init BYTE abUsbRequestReturnData[USB_RETURN_DATA_LENGTH]; +__no_init BYTE abUsbRequestIncomingData[USB_RETURN_DATA_LENGTH]; + +#pragma location = 0x2410 +__no_init BYTE bStatusAction; + +#pragma location = 0x2411 +__no_init BYTE bFunctionSuspended; // TRUE if function is suspended + +#pragma location = 0x2412 +__no_init BYTE bEnumerationStatus; // will be set to '1' when the USB addr will be assigned + +#pragma location = 0x2414 +__no_init WORD wUSBPLL; // clock settings for PLL + + +/*----------------------------------------------------------------------------+ +| Global Variables | ++----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------+ +| Hardware Related Structure Definition | ++----------------------------------------------------------------------------*/ + +#pragma location = 0x2380 +__no_init tDEVICE_REQUEST tSetupPacket; + +#pragma location = 0x0920 +__no_init tEDB0 tEndPoint0DescriptorBlock; + +#pragma location = 0x23C8 +__no_init tEDB tInputEndPointDescriptorBlock[7]; + +#pragma location = 0x2388 +__no_init tEDB tOutputEndPointDescriptorBlock[7]; + +#pragma location = 0x2378 +__no_init BYTE abIEP0Buffer[EP0_MAX_PACKET_SIZE]; + +#pragma location = 0x2370 +__no_init BYTE abOEP0Buffer[EP0_MAX_PACKET_SIZE]; + +#pragma location = OEP1_X_BUFFER_ADDRESS + __no_init BYTE pbXBufferAddressEp1[EP_MAX_PACKET_SIZE]; + +#pragma location = OEP1_Y_BUFFER_ADDRESS + __no_init BYTE pbYBufferAddressEp1[EP_MAX_PACKET_SIZE]; + +#pragma location = IEP1_X_BUFFER_ADDRESS + __no_init BYTE pbXBufferAddressEp81[EP_MAX_PACKET_SIZE]; + +//---------------------------------------------------------------------------- + + +VOID IntDelay(VOID); + +VOID USB_init(VOID) +{ + //initialize RAM variables + bHostAskMoreDataThanAvailable = 0; + bFunctionSuspended = FALSE; + + // configuration of USB module + USBKEYPID = 0x9628; // set KEY and PID to 0x9628 -> access to configuration registers enabled + USBPWRCTL = 0; // Workaround for USB9 + __no_operation(); // for workaround USB9 + USBPWRCTL = VUSBEN + SLDOEN + SLDOAON /*+ VBOFFIE + VBONIE*/; // keep primary and secondary LDO (3.3 and 1.8 V) enabled + USBPHYCTL = PUSEL; // use DP and DM as USB terminals (not needed because an external PHY is connected to port 9) + IntDelay(); + bEnumerationStatus = 0x00; // Device not enumerated yet +} + +//---------------------------------------------------------------------------- +VOID USB_enable() +{ + volatile unsigned int i; + volatile unsigned int j = 0; + + USBKEYPID = 0x9628; // set KEY and PID to 0x9628 -> access to configuration registers enabled + + USBPLLDIVB = wUSBPLL; // Settings desired frequency + USBPLLCTL = UPFDEN + UPLLEN; // Enable PLL, Phase Freq. Discriminator enable + + //Wait some time till PLL is settled + do { + USBPLLIR = 0x0000; // make sure no interrupts can occur on PLL-module + + __delay_cycles(1001); // For lowest code size use a cycle count that is 3*n + 2 + // where n is any integer greater than 4 (IAR uses other + // instructions when n is less than 5). + if (j++ > 1000) + return ; + }while (USBPLLIR != 0); + USBCNF |= USB_EN; // enable USB module +} + +//---------------------------------------------------------------------------- + +VOID USB_reset(VOID) +{ + bEnumerationStatus = 0x00; // Device not enumerated yet + bFunctionSuspended = FALSE; // Device is not in suspend mode + + bConfigurationNumber = 0x00; // device unconfigured + bInterfaceNumber = 0x00; + + USBCTL = 0; // Function Reset Connection disable + + wBytesRemainingOnIEP0 = NO_MORE_DATA; + wBytesRemainingOnOEP0 = NO_MORE_DATA; + bStatusAction = STATUS_ACTION_NOTHING; + + /* Set settings for EP0 */ + // NAK both 0 endpoints and enable endpoint 0 interrupt + tEndPoint0DescriptorBlock.bIEPBCNT = EPBCNT_NAK; + tEndPoint0DescriptorBlock.bOEPBCNT = EPBCNT_NAK; + tEndPoint0DescriptorBlock.bIEPCNFG = EPCNF_USBIE | EPCNF_UBME | EPCNF_STALL; // 8 byte data packet + tEndPoint0DescriptorBlock.bOEPCNFG = EPCNF_USBIE | EPCNF_UBME | EPCNF_STALL; // 8 byte data packet + + USBOEPIE = BIT0 | BIT1; // enable EP0 and EP1 output IRQ + USBIEPIE = BIT0 | BIT1; // enable EP0 and EP1 input IRQ + + /* Set settings for IEP1 */ + // enable endpoint 1 interrupt, input + tInputEndPointDescriptorBlock[0].bEPCNF = EPCNF_UBME; //single buffering + tInputEndPointDescriptorBlock[0].bEPBBAX = (BYTE)(((IEP1_X_BUFFER_ADDRESS - START_OF_USB_BUFFER) >> 3) & 0x00ff); + tInputEndPointDescriptorBlock[0].bEPBCTX = EPBCNT_NAK; + tInputEndPointDescriptorBlock[0].bEPBCTY = EPBCNT_NAK; + tInputEndPointDescriptorBlock[0].bEPSIZXY = MAX_PACKET_SIZE; + + /* Set settings for OEP1 */ + // enable endpoint 1 interrupt, output + tOutputEndPointDescriptorBlock[0].bEPCNF = EPCNF_UBME ; //no double buffering + tOutputEndPointDescriptorBlock[0].bEPBBAX = (BYTE)(((OEP1_X_BUFFER_ADDRESS - START_OF_USB_BUFFER) >> 3) & 0x00ff); + tOutputEndPointDescriptorBlock[0].bEPBCTX = 0x00; + tOutputEndPointDescriptorBlock[0].bEPSIZXY = MAX_PACKET_SIZE; + + USBCTL = FEN; // enable function + USBIFG = 0; // make sure no interrupts are pending + USBIFG &= ~RSTRIFG; //clear interrupt request flag +} + +//---------------------------------------------------------------------------- + +VOID USB_suspend(VOID) +{ + bFunctionSuspended = TRUE; + USBCTL |= FRSTE; // Function Reset Connection Enable + USBIFG &= ~SUSRIFG; // clear interrupt flag + USBPLLCTL = 0; // disable PLL +} + +//---------------------------------------------------------------------------- + +VOID USB_resume(VOID) +{ + USB_enable(); // enable PLL + USBIFG &= ~(RESRIFG | SUSRIFG); // clear interrupt flags + bFunctionSuspended = FALSE; +} + +//---------------------------------------------------------------------------- + +VOID usbStallEndpoint0(VOID) +{ + tEndPoint0DescriptorBlock.bIEPCNFG |= EPCNF_STALL; + tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_STALL; +} + +//---------------------------------------------------------------------------- + +VOID usbClearOEP0ByteCount(VOID) +{ + tEndPoint0DescriptorBlock.bOEPBCNT = 0x00; +} + +//---------------------------------------------------------------------------- + + +VOID usbStallOEP0(VOID) +{ + // in standard USB request, there is not control write request with data stage + // control write, stall output endpoint 0 + // wLength should be 0 in all cases + tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_STALL; +} + +//---------------------------------------------------------------------------- + +VOID usbSendNextPacketOnIEP0(VOID) +{ + BYTE bPacketSize,bIndex; + + // First check if there are bytes remaining to be transferred + if(wBytesRemainingOnIEP0 != NO_MORE_DATA){ + if(wBytesRemainingOnIEP0 > EP0_PACKET_SIZE){ + // More bytes are remaining than will fit in one packet + // there will be More IN Stage + bPacketSize = EP0_PACKET_SIZE; + wBytesRemainingOnIEP0 -= EP0_PACKET_SIZE; + bStatusAction = STATUS_ACTION_DATA_IN; + + }else if (wBytesRemainingOnIEP0 < EP0_PACKET_SIZE){ + // The remaining data will fit in one packet. + // This case will properly handle wBytesRemainingOnIEP0 == 0 + bPacketSize = (BYTE)wBytesRemainingOnIEP0; + wBytesRemainingOnIEP0 = NO_MORE_DATA; // No more data need to be Txed + bStatusAction = STATUS_ACTION_NOTHING; + + }else{ + bPacketSize = EP0_PACKET_SIZE; + if(bHostAskMoreDataThanAvailable == TRUE){ + wBytesRemainingOnIEP0 = 0; + bStatusAction = STATUS_ACTION_DATA_IN; + }else{ + wBytesRemainingOnIEP0 = NO_MORE_DATA; + bStatusAction = STATUS_ACTION_NOTHING; + } + } + + for(bIndex=0; bIndex= bTemp) + { + wBytesRemainingOnIEP0 = bTemp; + bHostAskMoreDataThanAvailable = FALSE; + } + else + { + bHostAskMoreDataThanAvailable = TRUE; + } + usbSendNextPacketOnIEP0(); +} + +//---------------------------------------------------------------------------- + +VOID usbSendZeroLengthPacketOnIEP0(VOID) +{ + wBytesRemainingOnIEP0 = NO_MORE_DATA; + bStatusAction = STATUS_ACTION_NOTHING; + tEndPoint0DescriptorBlock.bIEPBCNT = 0x00; +} + +//---------------------------------------------------------------------------- + +VOID usbClearEndpointFeature(VOID) +{ + BYTE bEndpointNumber; + + // EP is from EP1 to EP7 while C language start from 0 + bEndpointNumber = (tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM); + if(bEndpointNumber == 0x00) usbSendZeroLengthPacketOnIEP0(); + else{ + if(bEndpointNumber == 1){ + if((tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) == EP_DESC_ADDR_DIR_IN) + { + // input endpoint + tInputEndPointDescriptorBlock[0].bEPCNF &= ~(EPCNF_STALL | EPCNF_TOGGLE); + } + else + { + // output endpoint + tOutputEndPointDescriptorBlock[0].bEPCNF &= ~(EPCNF_STALL | EPCNF_TOGGLE); + } + usbSendZeroLengthPacketOnIEP0(); + } + } +} + +//---------------------------------------------------------------------------- + +VOID usbGetConfiguration(VOID) +{ + usbClearOEP0ByteCount(); // for status stage + wBytesRemainingOnIEP0 = 1; + usbSendDataPacketOnEP0((PBYTE)&bConfigurationNumber); +} + +//---------------------------------------------------------------------------- + +VOID usbGetDeviceDescriptor(VOID) +{ + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = SIZEOF_DEVICE_DESCRIPTOR; + usbSendDataPacketOnEP0((PBYTE) &abromDeviceDescriptor); +} + +//---------------------------------------------------------------------------- + +VOID usbGetConfigurationDescriptor(VOID) +{ + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = sizeof(abromConfigurationDescriptorGroup); + usbSendDataPacketOnEP0((PBYTE)&abromConfigurationDescriptorGroup); +} + +//---------------------------------------------------------------------------- + +VOID usbGetInterface(VOID) +{ + // not fully supported, return one byte, zero + usbClearOEP0ByteCount(); // for status stage + wBytesRemainingOnIEP0 = 0x02; + abUsbRequestReturnData[0] = 0x00; // changed to report alternative setting byte + abUsbRequestReturnData[1] = bInterfaceNumber; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); +} + +//---------------------------------------------------------------------------- + +VOID usbGetDeviceStatus(VOID) +{ + /* for Self Powerd USB device + if((abromConfigurationDescriptorGroup[OFFSET_CONFIG_DESCRIPTOR_POWER] & + CFG_DESC_ATTR_SELF_POWERED) == CFG_DESC_ATTR_SELF_POWERED) + abUsbRequestReturnData[0] = DEVICE_STATUS_SELF_POWER; + */ + + usbClearOEP0ByteCount(); // for status stage + + // Return self power status and remote wakeup status + wBytesRemainingOnIEP0 = 2; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); +} + +//---------------------------------------------------------------------------- + +VOID usbGetEndpointStatus(VOID) +{ + BYTE bEndpointNumber; + + // Endpoint number is bIndexL + bEndpointNumber = tSetupPacket.wIndex & EP_DESC_ADDR_EP_NUM; + + if(bEndpointNumber == 0x00){ + if((tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN) == EP_DESC_ADDR_DIR_IN){ + // input endpoint 0 + abUsbRequestReturnData[0] = (BYTE)(tEndPoint0DescriptorBlock.bIEPCNFG & EPCNF_STALL); + }else{ + // output endpoint 0 + abUsbRequestReturnData[0] = (BYTE)(tEndPoint0DescriptorBlock.bOEPCNFG & EPCNF_STALL); + } + abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; // STALL is on bit 3 + usbClearOEP0ByteCount(); // for status stage + wBytesRemainingOnIEP0 = 0x02; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + }else{ + // EP is from EP1 to EP7 while C language start from 0 + // Firmware should NOT response if specified endpoint is not supported. (charpter 8) + if(tSetupPacket.wIndex & EP_DESC_ADDR_DIR_IN){ + // input endpoint + abUsbRequestReturnData[0] = (BYTE)(tInputEndPointDescriptorBlock[0].bEPCNF & EPCNF_STALL); + }else{ + // output endpoint + abUsbRequestReturnData[0] = (BYTE)(tOutputEndPointDescriptorBlock[0].bEPCNF & EPCNF_STALL); + } + abUsbRequestReturnData[0] = abUsbRequestReturnData[0] >> 3; // STALL is on bit 3 + usbClearOEP0ByteCount(); + wBytesRemainingOnIEP0 = 0x02; + usbSendDataPacketOnEP0((PBYTE)&abUsbRequestReturnData[0]); + } +} + +//---------------------------------------------------------------------------- +VOID usbSetAddress(VOID) +{ + usbStallOEP0(); // control write without data stage + + // bValueL contains device address + // waving verification (Rosty) if(tSetupPacket.wValue < 128){ + // hardware will update the address after status stage + // therefore, firmware can set the address now. + + USBFUNADR = tSetupPacket.wValue; + usbSendZeroLengthPacketOnIEP0(); + + // waving verification (Rosty) }else usbStallEndpoint0(); +} + +//---------------------------------------------------------------------------- + +VOID usbSetConfiguration(VOID) +{ + usbStallOEP0(); // control write without data stage + + // configuration number is in bValueL + // change the code if more than one configuration is supported + bConfigurationNumber = tSetupPacket.wValue; + usbSendZeroLengthPacketOnIEP0(); + + bEnumerationStatus = ENUMERATION_COMPLETE; // set device as enumerated +} + +//---------------------------------------------------------------------------- + +VOID usbSetEndpointFeature(VOID) +{ + BYTE bEndpointNumber; + + // wValue contains feature selector + // bIndexL contains endpoint number + // Endpoint number is in low byte of wIndex + if((tSetupPacket.wValue&0xff) == FEATURE_ENDPOINT_STALL) + { + bEndpointNumber = (BYTE)(tSetupPacket.wIndex) & EP_DESC_ADDR_EP_NUM; + if(bEndpointNumber == 0x00) usbSendZeroLengthPacketOnIEP0(); // do nothing for endpoint 0 + else + { + // Firmware should NOT response if specified endpoint is not supported. (charpter 8) + if(bEndpointNumber == 1 ) + { + if ((BYTE)(tSetupPacket.wIndex) & EP_DESC_ADDR_DIR_IN){ + // input endpoint + tInputEndPointDescriptorBlock[0].bEPCNF |= EPCNF_STALL; + }else{ + // output endpoint + tOutputEndPointDescriptorBlock[0].bEPCNF |= EPCNF_STALL; + } + usbSendZeroLengthPacketOnIEP0(); + } // no response if endpoint is not supported. + } + } + else + { + usbStallEndpoint0(); + } +} + +//---------------------------------------------------------------------------- + +VOID usbSetInterface(VOID) +{ + // bValueL contains alternative setting + // bIndexL contains interface number + // change code if more than one interface is supported + usbStallOEP0(); // control write without data stage + bInterfaceNumber = tSetupPacket.wIndex; + usbSendZeroLengthPacketOnIEP0(); +} + +//---------------------------------------------------------------------------- +VOID usbDecodeAndProcessUsbRequest(VOID) +{ + BOOL InTransaction; + + // copy the MSB of bmRequestType to DIR bit of USBCTL + if((tSetupPacket.bmRequestType & USB_REQ_TYPE_INPUT) != 0x00) + { + InTransaction = TRUE; + USBCTL |= DIR; + } + else + { + InTransaction = FALSE; + USBCTL &= ~DIR; + } + + //decode request + if ((tSetupPacket.bmRequestType & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD) + { + switch (tSetupPacket.bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if (InTransaction == FALSE) break; //exit and stall + switch (tSetupPacket.wValue>>8) + { + case DESC_TYPE_DEVICE: + usbGetDeviceDescriptor(); + return; + case DESC_TYPE_CONFIG: + usbGetConfigurationDescriptor(); + return; + + case DESC_TYPE_REPORT: + usbGetReportDescriptor(); + return; + case DESC_TYPE_HID: + usbGetHidDescriptor(); + return; + } //switch (tSetupPacket.wValue>>8 + break; //USB_REQ_GET_DESCRIPTOR + + case USB_REQ_GET_INTERFACE: + if (InTransaction == FALSE) break; //exit and stall + usbGetInterface(); + return; + case USB_REQ_SET_ADDRESS: + usbSetAddress(); + return; + case USB_REQ_SET_CONFIGURATION: + usbSetConfiguration(); + return; + case USB_REQ_GET_CONFIGURATION: + usbGetConfiguration(); + return; + case USB_REQ_SET_INTERFACE: + usbSetInterface(); + return; + case USB_REQ_SET_FEATURE: + usbSetEndpointFeature(); + return; + case USB_REQ_CLEAR_FEATURE: + usbClearEndpointFeature(); + return; + case USB_REQ_GET_STATUS: + if (tSetupPacket.bmRequestType == (USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_DEVICE)) + { + usbGetDeviceStatus(); + return; + } + + //USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_INTERFACE, + //usbGetInterfaceStatus(); + + if (tSetupPacket.bmRequestType == (USB_REQ_TYPE_INPUT | USB_REQ_TYPE_STANDARD | USB_REQ_TYPE_ENDPOINT)) + { + usbGetEndpointStatus(); + return; + } + }//switch (tSetupPacket.bRequest) + } + usbStallEndpoint0(); +} + + +/*----------------------------------------------------------------------------+ +| End of source file | ++----------------------------------------------------------------------------*/ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/usb.h b/ThirdParty/BSL430_Firmware/usb.h new file mode 100644 index 0000000..5ffd48a --- /dev/null +++ b/ThirdParty/BSL430_Firmware/usb.h @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2012 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 _USB_H_ +#define _USB_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "types.h" +#include "msp430.h" + +/*----------------------------------------------------------------------------+ +| Constant Definition | ++----------------------------------------------------------------------------*/ +#define USB_RETURN_DATA_LENGTH 8 +#define SIZEOF_DEVICE_REQUEST 0x08 + +// Bit definitions for DEVICE_REQUEST.bmRequestType +// Bit 7: Data direction +#define USB_REQ_TYPE_OUTPUT 0x00 // 0 = Host sending data to device +#define USB_REQ_TYPE_INPUT 0x80 // 1 = Device sending data to host + +// Bit 6-5: Type +#define USB_REQ_TYPE_MASK 0x60 // Mask value for bits 6-5 +#define USB_REQ_TYPE_STANDARD 0x00 // 00 = Standard USB request +#define USB_REQ_TYPE_CLASS 0x20 // 01 = Class specific +#define USB_REQ_TYPE_VENDOR 0x40 // 10 = Vendor specific + +// Bit 4-0: Recipient +#define USB_REQ_TYPE_RECIP_MASK 0x1F // Mask value for bits 4-0 +#define USB_REQ_TYPE_DEVICE 0x00 // 00000 = Device +#define USB_REQ_TYPE_INTERFACE 0x01 // 00001 = Interface +#define USB_REQ_TYPE_ENDPOINT 0x02 // 00010 = Endpoint +#define USB_REQ_TYPE_OTHER 0x03 // 00011 = Other + +// Values for DEVICE_REQUEST.bRequest +// Standard Device Requests +#define USB_REQ_GET_STATUS 0 +#define USB_REQ_CLEAR_FEATURE 1 +#define USB_REQ_SET_FEATURE 3 +#define USB_REQ_SET_ADDRESS 5 +#define USB_REQ_GET_DESCRIPTOR 6 +#define USB_REQ_SET_DESCRIPTOR 7 +#define USB_REQ_GET_CONFIGURATION 8 +#define USB_REQ_SET_CONFIGURATION 9 +#define USB_REQ_GET_INTERFACE 10 +#define USB_REQ_SET_INTERFACE 11 +#define USB_REQ_SYNCH_FRAME 12 + +// CDC CLASS Requests +#define USB_CDC_GET_LINE_CODING 0x21 +#define USB_CDC_SET_LINE_CODING 0x20 +#define USB_CDC_SET_CONTROL_LINE_STATE 0x22 + +// HID CLASS Requests +#define USB_HID_REQ 0x81 +#define USB_REQ_GET_REPORT 0x01 +#define USB_REQ_GET_IDLE 0x02 +#define USB_REQ_SET_REPORT 0x09 +#define USB_REQ_SET_IDLE 0x0A +#define USB_REQ_SET_PROTOCOL 0x0B +#define USB_REQ_GET_PROTOCOL 0x03 + +//HID Values for HID Report Types (tSetup.bValueH) +#define USB_REQ_HID_INPUT 0x01 +#define USB_REQ_HID_OUTPUT 0x02 +#define USB_REQ_HID_FEATURE 0x03 + +// Descriptor Type Values +#define DESC_TYPE_DEVICE 1 // Device Descriptor (Type 1) +#define DESC_TYPE_CONFIG 2 // Configuration Descriptor (Type 2) +#define DESC_TYPE_STRING 3 // String Descriptor (Type 3) +#define DESC_TYPE_INTERFACE 4 // Interface Descriptor (Type 4) +#define DESC_TYPE_ENDPOINT 5 // Endpoint Descriptor (Type 5) +#define DESC_TYPE_DEVICE_QUALIFIER 6 // Endpoint Descriptor (Type 6) +#define DESC_TYPE_HUB 0x29 // Hub Descriptor (Type 6) +#define DESC_TYPE_HID 0x21 // HID Descriptor +#define DESC_TYPE_REPORT 0x22 // Report Descriptor +#define DESC_TYPE_PHYSICAL 0x23 // Physical Descriptor + +// Feature Selector Values +#define FEATURE_REMOTE_WAKEUP 1 // Remote wakeup (Type 1) +#define FEATURE_ENDPOINT_STALL 0 // Endpoint stall (Type 0) + +// Device Status Values +#define DEVICE_STATUS_REMOTE_WAKEUP 0x02 +#define DEVICE_STATUS_SELF_POWER 0x01 + +// Maximum descriptor size +#define MAX_DESC_SIZE 256 + +// DEVICE_DESCRIPTOR structure +#define SIZEOF_DEVICE_DESCRIPTOR 0x12 +#define OFFSET_DEVICE_DESCRIPTOR_VID_L 0x08 +#define OFFSET_DEVICE_DESCRIPTOR_VID_H 0x09 +#define OFFSET_DEVICE_DESCRIPTOR_PID_L 0x0A +#define OFFSET_DEVICE_DESCRIPTOR_PID_H 0x0B +#define OFFSET_CONFIG_DESCRIPTOR_POWER 0x07 +#define OFFSET_CONFIG_DESCRIPTOR_CURT 0x08 + +// CONFIG_DESCRIPTOR structure +#define SIZEOF_CONFIG_DESCRIPTOR 0x09 + +// HID DESCRIPTOR structure +#define SIZEOF_HID_DESCRIPTOR 0x09 + +// Bit definitions for CONFIG_DESCRIPTOR.bmAttributes +#define CFG_DESC_ATTR_SELF_POWERED 0x40 // Bit 6: If set, device is self powered +#define CFG_DESC_ATTR_BUS_POWERED 0x80 // Bit 7: If set, device is bus powered +#define CFG_DESC_ATTR_REMOTE_WAKE 0x20 // Bit 5: If set, device supports remote wakeup + +// INTERFACE_DESCRIPTOR structure +#define SIZEOF_INTERFACE_DESCRIPTOR 0x09 + +// ENDPOINT_DESCRIPTOR structure +#define SIZEOF_ENDPOINT_DESCRIPTOR 0x07 + +// Bit definitions for EndpointDescriptor.EndpointAddr +#define EP_DESC_ADDR_EP_NUM 0x0F // Bit 3-0: Endpoint number +#define EP_DESC_ADDR_DIR_IN 0x80 // Bit 7: Direction of endpoint, 1/0 = In/Out + +// Bit definitions for EndpointDescriptor.EndpointFlags +#define EP_DESC_ATTR_TYPE_MASK 0x03 // Mask value for bits 1-0 +#define EP_DESC_ATTR_TYPE_CONT 0x00 // Bit 1-0: 00 = Endpoint does control transfers +#define EP_DESC_ATTR_TYPE_ISOC 0x01 // Bit 1-0: 01 = Endpoint does isochronous transfers +#define EP_DESC_ATTR_TYPE_BULK 0x02 // Bit 1-0: 10 = Endpoint does bulk transfers +#define EP_DESC_ATTR_TYPE_INT 0x03 // Bit 1-0: 11 = Endpoint does interrupt transfers + + +extern __no_init tDEVICE_REQUEST tSetupPacket; +/*extern __no_init tEDB0 tEndPoint0DescriptorBlock; +extern __no_init tEDB* tInputEndPointDescriptorBlock; +extern __no_init tEDB* tOutputEndPointDescriptorBlock;*/ +extern __no_init BYTE abIEP0Buffer[]; +extern __no_init BYTE abOEP0Buffer[]; +extern __no_init BYTE pbXBufferAddressEp1[]; +extern __no_init BYTE pbYBufferAddressEp1[]; +extern __no_init BYTE pbXBufferAddressEp81[]; +extern __no_init BYTE pbYBufferAddressEp81[]; +extern __no_init BYTE pbXBufferAddressEp2[]; +extern __no_init BYTE pbYBufferAddressEp2[]; +extern __no_init BYTE pbXBufferAddressEp82[]; +extern __no_init BYTE pbYBufferAddressEp82[]; + +extern __no_init BYTE wBytesRemainingOnIEP0; + +extern __no_init BYTE abUsbRequestReturnData[]; +extern __no_init BYTE abUsbRequestIncomingData[]; +extern __no_init BYTE bEnumerationStatus; + + +extern __no_init WORD wUSBPLL; // clock settings for PLL + +/** +\fn VOID Init_USB(VOID); + +\brief Init the USB HW interface. + +*/ +VOID USB_init(VOID); + +/** +\fn VOID USB_Enable(WORD freq); + +\brief Init and start the USB PLL. + +*/ +VOID USB_enable(); + +/** +\fn VOID Reset_USB(VOID); + +\brief Reset USB-SIE and global variables. + +*/ +VOID USB_reset(VOID); + +/** +\fn VOID Suspend_USB(VOID); + +\brief Suspend USB. + +*/ +VOID USB_suspend(VOID); + +/** +\fn VOID Resume_USB(VOID); + +\brief Resume USB. + +*/ +VOID USB_resume(VOID); + +/** +\fn VOID usbStallEndpoint0(VOID); + +\brief Send stall handshake for in- and out-endpoint0 (control pipe) + +*/ +VOID usbStallEndpoint0(VOID); + +/** +\fn VOID usbClearOEP0ByteCount(VOID); + +\brief Clear byte counter for endpoint0 (control pipe) + +*/ +VOID usbClearOEP0ByteCount(VOID); + +/** +\fn VOID usbStallOEP0(VOID); + +\brief Send stall handshake for out-endpoint0 (control pipe) + +*/ +VOID usbStallOEP0(VOID); + +/** +\fn VOID usbSendNextPacketOnIEP0(VOID); + +\brief Send further data over control pipe if needed. +\n Function is called from control-in IRQ. Do not call from user application + +*/ +VOID usbSendNextPacketOnIEP0(VOID); + +/** +\fn VOID usbSendDataPacketOnEP0(PBYTE pbBuffer); + +\brief Send data over control pipe to host. +\n Number of bytes to transmit should be set with +\n global varible "wBytesRemainingOnIEP0" before function is called. + +*/ +VOID usbSendDataPacketOnEP0(PBYTE pbBuffer); + +/** +\fn VOID usbReceiveNextPacketOnOEP0(VOID); + +\brief Receive further data from control pipe if needed. +\n Function is called from control-out IRQ. Do not call from user application + +*/ +VOID usbReceiveNextPacketOnOEP0(VOID); + +/** +\fn VOID usbReceiveDataPacketOnEP0(PBYTE pbBuffer); + +\brief Receive data from control pipe. +\n Number of bytes to receive should be set with +\n global varible "wBytesRemainingOnOEP0" before function is called. + +*/ +VOID usbReceiveDataPacketOnEP0(PBYTE pbBuffer); + +/** +\fn VOID usbSendZeroLengthPacketOnIEP0(VOID); + +\brief Send zero length packet on control pipe. + +*/ +VOID usbSendZeroLengthPacketOnIEP0(VOID); + +/** +\fn VOID usbDecodeAndProcessUsbRequest(VOID); + +\brief Decode incoming usb setup packet and call corresponding function +\n usbDecodeAndProcessUsbRequest is called from IRQ. Do not call from user application + +*/ +VOID usbDecodeAndProcessUsbRequest(VOID); + + +#define ENUMERATION_COMPLETE 0x01 + +/*----------------------------------------------------------------------------+ +| End of header file | ++----------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +#endif /* _USB_H */ +/*------------------------ Nothing Below This Line --------------------------*/ diff --git a/ThirdParty/BSL430_Firmware/usbapi.h b/ThirdParty/BSL430_Firmware/usbapi.h new file mode 100644 index 0000000..4ef3016 --- /dev/null +++ b/ThirdParty/BSL430_Firmware/usbapi.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2012 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. + */ + +// send function +BYTE UsbSendHID(const BYTE* data); + +// global pointer to buffer with received data +//extern const BYTE *ReceiveBuffer; +#define ReceiveBuffer (const unsigned char*)(OEP1_X_BUFFER_ADDRESS + 1) + +// Returns: +// gReceiveBuffer -> global pointer to buffer with received data +// returned value: how many bytes received (should be always 64) +BYTE UsbReceiveHID(VOID); + +//should be called after successed UsbReceiveHID() to make receive buffer ready to receive next data packet +VOID UsbClearReceiveBuffer(VOID); + +// This functin shold be called asap in the loop: +// no delay longer then 2 ms during enumeartion and +// no delay longer then 40 ms after enumeration +VOID UsbHandler(VOID); diff --git a/ThirdParty/include/pugiconfig.hpp b/ThirdParty/include/pugiconfig.hpp new file mode 100644 index 0000000..8f610c7 --- /dev/null +++ b/ThirdParty/include/pugiconfig.hpp @@ -0,0 +1,74 @@ +/** + * pugixml parser - version 1.7 + * -------------------------------------------------------- + * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at http://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef HEADER_PUGICONFIG_HPP +#define HEADER_PUGICONFIG_HPP + +// Uncomment this to enable wchar_t mode +// #define PUGIXML_WCHAR_MODE + +// Uncomment this to enable compact mode +// #define PUGIXML_COMPACT + +// Uncomment this to disable XPath +// #define PUGIXML_NO_XPATH + +// Uncomment this to disable STL +// #define PUGIXML_NO_STL + +// Uncomment this to disable exceptions +// #define PUGIXML_NO_EXCEPTIONS + +// Set this to control attributes for public classes/functions, i.e.: +// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL +// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL +// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall +// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead + +// Tune these constants to adjust memory-related behavior +// #define PUGIXML_MEMORY_PAGE_SIZE 32768 +// #define PUGIXML_MEMORY_OUTPUT_STACK 10240 +// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096 + +// Uncomment this to switch to header-only version +// #define PUGIXML_HEADER_ONLY + +// Uncomment this to enable long long support +// #define PUGIXML_HAS_LONG_LONG + +#endif + +/** + * Copyright (c) 2006-2015 Arseny Kapoulkine + * + * 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/ThirdParty/include/pugixml.hpp b/ThirdParty/include/pugixml.hpp new file mode 100644 index 0000000..3d5b2bc --- /dev/null +++ b/ThirdParty/include/pugixml.hpp @@ -0,0 +1,1400 @@ +/** + * pugixml parser - version 1.7 + * -------------------------------------------------------- + * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at http://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef PUGIXML_VERSION +// Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons +# define PUGIXML_VERSION 170 +#endif + +// Include user configuration file (this can define various configuration macros) +#include "pugiconfig.hpp" + +#ifndef HEADER_PUGIXML_HPP +#define HEADER_PUGIXML_HPP + +// Include stddef.h for size_t and ptrdiff_t +#include + +// Include exception header for XPath +#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) +# include +#endif + +// Include STL headers +#ifndef PUGIXML_NO_STL +# include +# include +# include +#endif + +// Macro for deprecated features +#ifndef PUGIXML_DEPRECATED +# if defined(__GNUC__) +# define PUGIXML_DEPRECATED __attribute__((deprecated)) +# elif defined(_MSC_VER) && _MSC_VER >= 1300 +# define PUGIXML_DEPRECATED __declspec(deprecated) +# else +# define PUGIXML_DEPRECATED +# endif +#endif + +// If no API is defined, assume default +#ifndef PUGIXML_API +# define PUGIXML_API +#endif + +// If no API for classes is defined, assume default +#ifndef PUGIXML_CLASS +# define PUGIXML_CLASS PUGIXML_API +#endif + +// If no API for functions is defined, assume default +#ifndef PUGIXML_FUNCTION +# define PUGIXML_FUNCTION PUGIXML_API +#endif + +// If the platform is known to have long long support, enable long long functions +#ifndef PUGIXML_HAS_LONG_LONG +# if __cplusplus >= 201103 +# define PUGIXML_HAS_LONG_LONG +# elif defined(_MSC_VER) && _MSC_VER >= 1400 +# define PUGIXML_HAS_LONG_LONG +# endif +#endif + +// Character interface macros +#ifdef PUGIXML_WCHAR_MODE +# define PUGIXML_TEXT(t) L ## t +# define PUGIXML_CHAR wchar_t +#else +# define PUGIXML_TEXT(t) t +# define PUGIXML_CHAR char +#endif + +namespace pugi +{ + // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE + typedef PUGIXML_CHAR char_t; + +#ifndef PUGIXML_NO_STL + // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE + typedef std::basic_string, std::allocator > string_t; +#endif +} + +// The PugiXML namespace +namespace pugi +{ + // Tree node types + enum xml_node_type + { + node_null, // Empty (null) node handle + node_document, // A document tree's absolute root + node_element, // Element tag, i.e. '' + node_pcdata, // Plain character data, i.e. 'text' + node_cdata, // Character data, i.e. '' + node_comment, // Comment tag, i.e. '' + node_pi, // Processing instruction, i.e. '' + node_declaration, // Document declaration, i.e. '' + node_doctype // Document type declaration, i.e. '' + }; + + // Parsing options + + // Minimal parsing mode (equivalent to turning all other flags off). + // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed. + const unsigned int parse_minimal = 0x0000; + + // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default. + const unsigned int parse_pi = 0x0001; + + // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default. + const unsigned int parse_comments = 0x0002; + + // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default. + const unsigned int parse_cdata = 0x0004; + + // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree. + // This flag is off by default; turning it on usually results in slower parsing and more memory consumption. + const unsigned int parse_ws_pcdata = 0x0008; + + // This flag determines if character and entity references are expanded during parsing. This flag is on by default. + const unsigned int parse_escapes = 0x0010; + + // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. + const unsigned int parse_eol = 0x0020; + + // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. + const unsigned int parse_wconv_attribute = 0x0040; + + // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. + const unsigned int parse_wnorm_attribute = 0x0080; + + // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. + const unsigned int parse_declaration = 0x0100; + + // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default. + const unsigned int parse_doctype = 0x0200; + + // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only + // of whitespace is added to the DOM tree. + // This flag is off by default; turning it on may result in slower parsing and more memory consumption. + const unsigned int parse_ws_pcdata_single = 0x0400; + + // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default. + const unsigned int parse_trim_pcdata = 0x0800; + + // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document + // is a valid document. This flag is off by default. + const unsigned int parse_fragment = 0x1000; + + // The default parsing mode. + // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, + // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. + const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; + + // The full parsing mode. + // Nodes of all types are added to the DOM tree, character/reference entities are expanded, + // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. + const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; + + // These flags determine the encoding of input data for XML document + enum xml_encoding + { + encoding_auto, // Auto-detect input encoding using BOM or < / class xml_object_range + { + public: + typedef It const_iterator; + typedef It iterator; + + xml_object_range(It b, It e): _begin(b), _end(e) + { + } + + It begin() const { return _begin; } + It end() const { return _end; } + + private: + It _begin, _end; + }; + + // Writer interface for node printing (see xml_node::print) + class PUGIXML_CLASS xml_writer + { + public: + virtual ~xml_writer() {} + + // Write memory chunk into stream/file/whatever + virtual void write(const void* data, size_t size) = 0; + }; + + // xml_writer implementation for FILE* + class PUGIXML_CLASS xml_writer_file: public xml_writer + { + public: + // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio + xml_writer_file(void* file); + + virtual void write(const void* data, size_t size); + + private: + void* file; + }; + + #ifndef PUGIXML_NO_STL + // xml_writer implementation for streams + class PUGIXML_CLASS xml_writer_stream: public xml_writer + { + public: + // Construct writer from an output stream object + xml_writer_stream(std::basic_ostream >& stream); + xml_writer_stream(std::basic_ostream >& stream); + + virtual void write(const void* data, size_t size); + + private: + std::basic_ostream >* narrow_stream; + std::basic_ostream >* wide_stream; + }; + #endif + + // A light-weight handle for manipulating attributes in DOM tree + class PUGIXML_CLASS xml_attribute + { + friend class xml_attribute_iterator; + friend class xml_node; + + private: + xml_attribute_struct* _attr; + + typedef void (*unspecified_bool_type)(xml_attribute***); + + public: + // Default constructor. Constructs an empty attribute. + xml_attribute(); + + // Constructs attribute from internal pointer + explicit xml_attribute(xml_attribute_struct* attr); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators (compares wrapped attribute pointers) + bool operator==(const xml_attribute& r) const; + bool operator!=(const xml_attribute& r) const; + bool operator<(const xml_attribute& r) const; + bool operator>(const xml_attribute& r) const; + bool operator<=(const xml_attribute& r) const; + bool operator>=(const xml_attribute& r) const; + + // Check if attribute is empty + bool empty() const; + + // Get attribute name/value, or "" if attribute is empty + const char_t* name() const; + const char_t* value() const; + + // Get attribute value, or the default value if attribute is empty + const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; + + // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty + int as_int(int def = 0) const; + unsigned int as_uint(unsigned int def = 0) const; + double as_double(double def = 0) const; + float as_float(float def = 0) const; + + #ifdef PUGIXML_HAS_LONG_LONG + long long as_llong(long long def = 0) const; + unsigned long long as_ullong(unsigned long long def = 0) const; + #endif + + // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty + bool as_bool(bool def = false) const; + + // Set attribute name/value (returns false if attribute is empty or there is not enough memory) + bool set_name(const char_t* rhs); + bool set_value(const char_t* rhs); + + // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") + bool set_value(int rhs); + bool set_value(unsigned int rhs); + bool set_value(double rhs); + bool set_value(float rhs); + bool set_value(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + bool set_value(long long rhs); + bool set_value(unsigned long long rhs); + #endif + + // Set attribute value (equivalent to set_value without error checking) + xml_attribute& operator=(const char_t* rhs); + xml_attribute& operator=(int rhs); + xml_attribute& operator=(unsigned int rhs); + xml_attribute& operator=(double rhs); + xml_attribute& operator=(float rhs); + xml_attribute& operator=(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + xml_attribute& operator=(long long rhs); + xml_attribute& operator=(unsigned long long rhs); + #endif + + // Get next/previous attribute in the attribute list of the parent node + xml_attribute next_attribute() const; + xml_attribute previous_attribute() const; + + // Get hash value (unique for handles to the same object) + size_t hash_value() const; + + // Get internal pointer + xml_attribute_struct* internal_object() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs); +#endif + + // A light-weight handle for manipulating nodes in DOM tree + class PUGIXML_CLASS xml_node + { + friend class xml_attribute_iterator; + friend class xml_node_iterator; + friend class xml_named_node_iterator; + + protected: + xml_node_struct* _root; + + typedef void (*unspecified_bool_type)(xml_node***); + + public: + // Default constructor. Constructs an empty node. + xml_node(); + + // Constructs node from internal pointer + explicit xml_node(xml_node_struct* p); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators (compares wrapped node pointers) + bool operator==(const xml_node& r) const; + bool operator!=(const xml_node& r) const; + bool operator<(const xml_node& r) const; + bool operator>(const xml_node& r) const; + bool operator<=(const xml_node& r) const; + bool operator>=(const xml_node& r) const; + + // Check if node is empty. + bool empty() const; + + // Get node type + xml_node_type type() const; + + // Get node name, or "" if node is empty or it has no name + const char_t* name() const; + + // Get node value, or "" if node is empty or it has no value + // Note: For text node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes. + const char_t* value() const; + + // Get attribute list + xml_attribute first_attribute() const; + xml_attribute last_attribute() const; + + // Get children list + xml_node first_child() const; + xml_node last_child() const; + + // Get next/previous sibling in the children list of the parent node + xml_node next_sibling() const; + xml_node previous_sibling() const; + + // Get parent node + xml_node parent() const; + + // Get root of DOM tree this node belongs to + xml_node root() const; + + // Get text object for the current node + xml_text text() const; + + // Get child, attribute or next/previous sibling with the specified name + xml_node child(const char_t* name) const; + xml_attribute attribute(const char_t* name) const; + xml_node next_sibling(const char_t* name) const; + xml_node previous_sibling(const char_t* name) const; + + // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast) + xml_attribute attribute(const char_t* name, xml_attribute& hint) const; + + // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA + const char_t* child_value() const; + + // Get child value of child with specified name. Equivalent to child(name).child_value(). + const char_t* child_value(const char_t* name) const; + + // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value) + bool set_name(const char_t* rhs); + bool set_value(const char_t* rhs); + + // Add attribute with specified name. Returns added attribute, or empty attribute on errors. + xml_attribute append_attribute(const char_t* name); + xml_attribute prepend_attribute(const char_t* name); + xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr); + xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr); + + // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors. + xml_attribute append_copy(const xml_attribute& proto); + xml_attribute prepend_copy(const xml_attribute& proto); + xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr); + xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr); + + // Add child node with specified type. Returns added node, or empty node on errors. + xml_node append_child(xml_node_type type = node_element); + xml_node prepend_child(xml_node_type type = node_element); + xml_node insert_child_after(xml_node_type type, const xml_node& node); + xml_node insert_child_before(xml_node_type type, const xml_node& node); + + // Add child element with specified name. Returns added node, or empty node on errors. + xml_node append_child(const char_t* name); + xml_node prepend_child(const char_t* name); + xml_node insert_child_after(const char_t* name, const xml_node& node); + xml_node insert_child_before(const char_t* name, const xml_node& node); + + // Add a copy of the specified node as a child. Returns added node, or empty node on errors. + xml_node append_copy(const xml_node& proto); + xml_node prepend_copy(const xml_node& proto); + xml_node insert_copy_after(const xml_node& proto, const xml_node& node); + xml_node insert_copy_before(const xml_node& proto, const xml_node& node); + + // Move the specified node to become a child of this node. Returns moved node, or empty node on errors. + xml_node append_move(const xml_node& moved); + xml_node prepend_move(const xml_node& moved); + xml_node insert_move_after(const xml_node& moved, const xml_node& node); + xml_node insert_move_before(const xml_node& moved, const xml_node& node); + + // Remove specified attribute + bool remove_attribute(const xml_attribute& a); + bool remove_attribute(const char_t* name); + + // Remove specified child + bool remove_child(const xml_node& n); + bool remove_child(const char_t* name); + + // Parses buffer as an XML document fragment and appends all nodes as children of the current node. + // Copies/converts the buffer, so it may be deleted or changed after the function returns. + // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory. + xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Find attribute using predicate. Returns first attribute for which predicate returned true. + template xml_attribute find_attribute(Predicate pred) const + { + if (!_root) return xml_attribute(); + + for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute()) + if (pred(attrib)) + return attrib; + + return xml_attribute(); + } + + // Find child node using predicate. Returns first child for which predicate returned true. + template xml_node find_child(Predicate pred) const + { + if (!_root) return xml_node(); + + for (xml_node node = first_child(); node; node = node.next_sibling()) + if (pred(node)) + return node; + + return xml_node(); + } + + // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true. + template xml_node find_node(Predicate pred) const + { + if (!_root) return xml_node(); + + xml_node cur = first_child(); + + while (cur._root && cur._root != _root) + { + if (pred(cur)) return cur; + + if (cur.first_child()) cur = cur.first_child(); + else if (cur.next_sibling()) cur = cur.next_sibling(); + else + { + while (!cur.next_sibling() && cur._root != _root) cur = cur.parent(); + + if (cur._root != _root) cur = cur.next_sibling(); + } + } + + return xml_node(); + } + + // Find child node by attribute name/value + xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const; + xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const; + + #ifndef PUGIXML_NO_STL + // Get the absolute node path from root as a text string. + string_t path(char_t delimiter = '/') const; + #endif + + // Search for a node by path consisting of node names and . or .. elements. + xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const; + + // Recursively traverse subtree with xml_tree_walker + bool traverse(xml_tree_walker& walker); + + #ifndef PUGIXML_NO_XPATH + // Select single node by evaluating XPath query. Returns first node from the resulting node set. + xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const; + xpath_node select_node(const xpath_query& query) const; + + // Select node set by evaluating XPath query + xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const; + xpath_node_set select_nodes(const xpath_query& query) const; + + // (deprecated: use select_node instead) Select single node by evaluating XPath query. + xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const; + xpath_node select_single_node(const xpath_query& query) const; + + #endif + + // Print subtree using a writer object + void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; + + #ifndef PUGIXML_NO_STL + // Print subtree to stream + void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; + void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const; + #endif + + // Child nodes iterators + typedef xml_node_iterator iterator; + + iterator begin() const; + iterator end() const; + + // Attribute iterators + typedef xml_attribute_iterator attribute_iterator; + + attribute_iterator attributes_begin() const; + attribute_iterator attributes_end() const; + + // Range-based for support + xml_object_range children() const; + xml_object_range children(const char_t* name) const; + xml_object_range attributes() const; + + // Get node offset in parsed file/string (in char_t units) for debugging purposes + ptrdiff_t offset_debug() const; + + // Get hash value (unique for handles to the same object) + size_t hash_value() const; + + // Get internal pointer + xml_node_struct* internal_object() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs); +#endif + + // A helper for working with text inside PCDATA nodes + class PUGIXML_CLASS xml_text + { + friend class xml_node; + + xml_node_struct* _root; + + typedef void (*unspecified_bool_type)(xml_text***); + + explicit xml_text(xml_node_struct* root); + + xml_node_struct* _data_new(); + xml_node_struct* _data() const; + + public: + // Default constructor. Constructs an empty object. + xml_text(); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Check if text object is empty + bool empty() const; + + // Get text, or "" if object is empty + const char_t* get() const; + + // Get text, or the default value if object is empty + const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; + + // Get text as a number, or the default value if conversion did not succeed or object is empty + int as_int(int def = 0) const; + unsigned int as_uint(unsigned int def = 0) const; + double as_double(double def = 0) const; + float as_float(float def = 0) const; + + #ifdef PUGIXML_HAS_LONG_LONG + long long as_llong(long long def = 0) const; + unsigned long long as_ullong(unsigned long long def = 0) const; + #endif + + // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty + bool as_bool(bool def = false) const; + + // Set text (returns false if object is empty or there is not enough memory) + bool set(const char_t* rhs); + + // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") + bool set(int rhs); + bool set(unsigned int rhs); + bool set(double rhs); + bool set(float rhs); + bool set(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + bool set(long long rhs); + bool set(unsigned long long rhs); + #endif + + // Set text (equivalent to set without error checking) + xml_text& operator=(const char_t* rhs); + xml_text& operator=(int rhs); + xml_text& operator=(unsigned int rhs); + xml_text& operator=(double rhs); + xml_text& operator=(float rhs); + xml_text& operator=(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + xml_text& operator=(long long rhs); + xml_text& operator=(unsigned long long rhs); + #endif + + // Get the data node (node_pcdata or node_cdata) for this object + xml_node data() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs); +#endif + + // Child node iterator (a bidirectional iterator over a collection of xml_node) + class PUGIXML_CLASS xml_node_iterator + { + friend class xml_node; + + private: + mutable xml_node _wrap; + xml_node _parent; + + xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent); + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_node value_type; + typedef xml_node* pointer; + typedef xml_node& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_node_iterator(); + + // Construct an iterator which points to the specified node + xml_node_iterator(const xml_node& node); + + // Iterator operators + bool operator==(const xml_node_iterator& rhs) const; + bool operator!=(const xml_node_iterator& rhs) const; + + xml_node& operator*() const; + xml_node* operator->() const; + + const xml_node_iterator& operator++(); + xml_node_iterator operator++(int); + + const xml_node_iterator& operator--(); + xml_node_iterator operator--(int); + }; + + // Attribute iterator (a bidirectional iterator over a collection of xml_attribute) + class PUGIXML_CLASS xml_attribute_iterator + { + friend class xml_node; + + private: + mutable xml_attribute _wrap; + xml_node _parent; + + xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent); + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_attribute value_type; + typedef xml_attribute* pointer; + typedef xml_attribute& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_attribute_iterator(); + + // Construct an iterator which points to the specified attribute + xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent); + + // Iterator operators + bool operator==(const xml_attribute_iterator& rhs) const; + bool operator!=(const xml_attribute_iterator& rhs) const; + + xml_attribute& operator*() const; + xml_attribute* operator->() const; + + const xml_attribute_iterator& operator++(); + xml_attribute_iterator operator++(int); + + const xml_attribute_iterator& operator--(); + xml_attribute_iterator operator--(int); + }; + + // Named node range helper + class PUGIXML_CLASS xml_named_node_iterator + { + friend class xml_node; + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_node value_type; + typedef xml_node* pointer; + typedef xml_node& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_named_node_iterator(); + + // Construct an iterator which points to the specified node + xml_named_node_iterator(const xml_node& node, const char_t* name); + + // Iterator operators + bool operator==(const xml_named_node_iterator& rhs) const; + bool operator!=(const xml_named_node_iterator& rhs) const; + + xml_node& operator*() const; + xml_node* operator->() const; + + const xml_named_node_iterator& operator++(); + xml_named_node_iterator operator++(int); + + const xml_named_node_iterator& operator--(); + xml_named_node_iterator operator--(int); + + private: + mutable xml_node _wrap; + xml_node _parent; + const char_t* _name; + + xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name); + }; + + // Abstract tree walker class (see xml_node::traverse) + class PUGIXML_CLASS xml_tree_walker + { + friend class xml_node; + + private: + int _depth; + + protected: + // Get current traversal depth + int depth() const; + + public: + xml_tree_walker(); + virtual ~xml_tree_walker(); + + // Callback that is called when traversal begins + virtual bool begin(xml_node& node); + + // Callback that is called for each node traversed + virtual bool for_each(xml_node& node) = 0; + + // Callback that is called when traversal ends + virtual bool end(xml_node& node); + }; + + // Parsing status, returned as part of xml_parse_result object + enum xml_parse_status + { + status_ok = 0, // No error + + status_file_not_found, // File was not found during load_file() + status_io_error, // Error reading from file/stream + status_out_of_memory, // Could not allocate memory + status_internal_error, // Internal error occurred + + status_unrecognized_tag, // Parser could not determine tag type + + status_bad_pi, // Parsing error occurred while parsing document declaration/processing instruction + status_bad_comment, // Parsing error occurred while parsing comment + status_bad_cdata, // Parsing error occurred while parsing CDATA section + status_bad_doctype, // Parsing error occurred while parsing document type declaration + status_bad_pcdata, // Parsing error occurred while parsing PCDATA section + status_bad_start_element, // Parsing error occurred while parsing start element tag + status_bad_attribute, // Parsing error occurred while parsing element attribute + status_bad_end_element, // Parsing error occurred while parsing end element tag + status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag) + + status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer) + + status_no_document_element // Parsing resulted in a document without element nodes + }; + + // Parsing result + struct PUGIXML_CLASS xml_parse_result + { + // Parsing status (see xml_parse_status) + xml_parse_status status; + + // Last parsed offset (in char_t units from start of input data) + ptrdiff_t offset; + + // Source document encoding + xml_encoding encoding; + + // Default constructor, initializes object to failed state + xml_parse_result(); + + // Cast to bool operator + operator bool() const; + + // Get error description + const char* description() const; + }; + + // Document class (DOM tree root) + class PUGIXML_CLASS xml_document: public xml_node + { + private: + char_t* _buffer; + + char _memory[192]; + + // Non-copyable semantics + xml_document(const xml_document&); + xml_document& operator=(const xml_document&); + + void create(); + void destroy(); + + public: + // Default constructor, makes empty document + xml_document(); + + // Destructor, invalidates all node/attribute handles to this document + ~xml_document(); + + // Removes all nodes, leaving the empty document + void reset(); + + // Removes all nodes, then copies the entire contents of the specified document + void reset(const xml_document& proto); + + #ifndef PUGIXML_NO_STL + // Load document from stream. + xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default); + #endif + + // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied. + xml_parse_result load(const char_t* contents, unsigned int options = parse_default); + + // Load document from zero-terminated string. No encoding conversions are applied. + xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default); + + // Load document from file + xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns. + xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). + // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed. + xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). + // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore). + xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details). + void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + + #ifndef PUGIXML_NO_STL + // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details). + void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const; + #endif + + // Save XML to file + bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + + // Get document element + xml_node document_element() const; + }; + +#ifndef PUGIXML_NO_XPATH + // XPath query return type + enum xpath_value_type + { + xpath_type_none, // Unknown type (query failed to compile) + xpath_type_node_set, // Node set (xpath_node_set) + xpath_type_number, // Number + xpath_type_string, // String + xpath_type_boolean // Boolean + }; + + // XPath parsing result + struct PUGIXML_CLASS xpath_parse_result + { + // Error message (0 if no error) + const char* error; + + // Last parsed offset (in char_t units from string start) + ptrdiff_t offset; + + // Default constructor, initializes object to failed state + xpath_parse_result(); + + // Cast to bool operator + operator bool() const; + + // Get error description + const char* description() const; + }; + + // A single XPath variable + class PUGIXML_CLASS xpath_variable + { + friend class xpath_variable_set; + + protected: + xpath_value_type _type; + xpath_variable* _next; + + xpath_variable(xpath_value_type type); + + // Non-copyable semantics + xpath_variable(const xpath_variable&); + xpath_variable& operator=(const xpath_variable&); + + public: + // Get variable name + const char_t* name() const; + + // Get variable type + xpath_value_type type() const; + + // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error + bool get_boolean() const; + double get_number() const; + const char_t* get_string() const; + const xpath_node_set& get_node_set() const; + + // Set variable value; no type conversion is performed, false is returned on type mismatch error + bool set(bool value); + bool set(double value); + bool set(const char_t* value); + bool set(const xpath_node_set& value); + }; + + // A set of XPath variables + class PUGIXML_CLASS xpath_variable_set + { + private: + xpath_variable* _data[64]; + + void _assign(const xpath_variable_set& rhs); + void _swap(xpath_variable_set& rhs); + + xpath_variable* _find(const char_t* name) const; + + static bool _clone(xpath_variable* var, xpath_variable** out_result); + static void _destroy(xpath_variable* var); + + public: + // Default constructor/destructor + xpath_variable_set(); + ~xpath_variable_set(); + + // Copy constructor/assignment operator + xpath_variable_set(const xpath_variable_set& rhs); + xpath_variable_set& operator=(const xpath_variable_set& rhs); + + #if __cplusplus >= 201103 + // Move semantics support + xpath_variable_set(xpath_variable_set&& rhs); + xpath_variable_set& operator=(xpath_variable_set&& rhs); + #endif + + // Add a new variable or get the existing one, if the types match + xpath_variable* add(const char_t* name, xpath_value_type type); + + // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch + bool set(const char_t* name, bool value); + bool set(const char_t* name, double value); + bool set(const char_t* name, const char_t* value); + bool set(const char_t* name, const xpath_node_set& value); + + // Get existing variable by name + xpath_variable* get(const char_t* name); + const xpath_variable* get(const char_t* name) const; + }; + + // A compiled XPath query object + class PUGIXML_CLASS xpath_query + { + private: + void* _impl; + xpath_parse_result _result; + + typedef void (*unspecified_bool_type)(xpath_query***); + + // Non-copyable semantics + xpath_query(const xpath_query&); + xpath_query& operator=(const xpath_query&); + + public: + // Construct a compiled object from XPath expression. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors. + explicit xpath_query(const char_t* query, xpath_variable_set* variables = 0); + + // Constructor + xpath_query(); + + // Destructor + ~xpath_query(); + + #if __cplusplus >= 201103 + // Move semantics support + xpath_query(xpath_query&& rhs); + xpath_query& operator=(xpath_query&& rhs); + #endif + + // Get query expression return type + xpath_value_type return_type() const; + + // Evaluate expression as boolean value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + bool evaluate_boolean(const xpath_node& n) const; + + // Evaluate expression as double value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + double evaluate_number(const xpath_node& n) const; + + #ifndef PUGIXML_NO_STL + // Evaluate expression as string value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + string_t evaluate_string(const xpath_node& n) const; + #endif + + // Evaluate expression as string value in the specified context; performs type conversion if necessary. + // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero). + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty set instead. + size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const; + + // Evaluate expression as node set in the specified context. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead. + xpath_node_set evaluate_node_set(const xpath_node& n) const; + + // Evaluate expression as node set in the specified context. + // Return first node in document order, or empty node if node set is empty. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead. + xpath_node evaluate_node(const xpath_node& n) const; + + // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode) + const xpath_parse_result& result() const; + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + }; + + #ifndef PUGIXML_NO_EXCEPTIONS + // XPath exception class + class PUGIXML_CLASS xpath_exception: public std::exception + { + private: + xpath_parse_result _result; + + public: + // Construct exception from parse result + explicit xpath_exception(const xpath_parse_result& result); + + // Get error message + virtual const char* what() const throw(); + + // Get parse result + const xpath_parse_result& result() const; + }; + #endif + + // XPath node class (either xml_node or xml_attribute) + class PUGIXML_CLASS xpath_node + { + private: + xml_node _node; + xml_attribute _attribute; + + typedef void (*unspecified_bool_type)(xpath_node***); + + public: + // Default constructor; constructs empty XPath node + xpath_node(); + + // Construct XPath node from XML node/attribute + xpath_node(const xml_node& node); + xpath_node(const xml_attribute& attribute, const xml_node& parent); + + // Get node/attribute, if any + xml_node node() const; + xml_attribute attribute() const; + + // Get parent of contained node/attribute + xml_node parent() const; + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators + bool operator==(const xpath_node& n) const; + bool operator!=(const xpath_node& n) const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs); +#endif + + // A fixed-size collection of XPath nodes + class PUGIXML_CLASS xpath_node_set + { + public: + // Collection type + enum type_t + { + type_unsorted, // Not ordered + type_sorted, // Sorted by document order (ascending) + type_sorted_reverse // Sorted by document order (descending) + }; + + // Constant iterator type + typedef const xpath_node* const_iterator; + + // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work + typedef const xpath_node* iterator; + + // Default constructor. Constructs empty set. + xpath_node_set(); + + // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful + xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted); + + // Destructor + ~xpath_node_set(); + + // Copy constructor/assignment operator + xpath_node_set(const xpath_node_set& ns); + xpath_node_set& operator=(const xpath_node_set& ns); + + #if __cplusplus >= 201103 + // Move semantics support + xpath_node_set(xpath_node_set&& rhs); + xpath_node_set& operator=(xpath_node_set&& rhs); + #endif + + // Get collection type + type_t type() const; + + // Get collection size + size_t size() const; + + // Indexing operator + const xpath_node& operator[](size_t index) const; + + // Collection iterators + const_iterator begin() const; + const_iterator end() const; + + // Sort the collection in ascending/descending order by document order + void sort(bool reverse = false); + + // Get first node in the collection by document order + xpath_node first() const; + + // Check if collection is empty + bool empty() const; + + private: + type_t _type; + + xpath_node _storage; + + xpath_node* _begin; + xpath_node* _end; + + void _assign(const_iterator begin, const_iterator end, type_t type); + void _move(xpath_node_set& rhs); + }; +#endif + +#ifndef PUGIXML_NO_STL + // Convert wide string to UTF8 + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const wchar_t* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const std::basic_string, std::allocator >& str); + + // Convert UTF8 to wide string + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const char* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const std::basic_string, std::allocator >& str); +#endif + + // Memory allocation function interface; returns pointer to allocated memory or NULL on failure + typedef void* (*allocation_function)(size_t size); + + // Memory deallocation function interface + typedef void (*deallocation_function)(void* ptr); + + // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions. + void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); + + // Get current memory management functions + allocation_function PUGIXML_FUNCTION get_memory_allocation_function(); + deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); +} + +#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) +namespace std +{ + // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&); +} +#endif + +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&); +} +#endif + +#endif + +// Make sure implementation is included in header-only mode +// Use macro expansion in #include to work around QMake (QTBUG-11923) +#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE) +# define PUGIXML_SOURCE "pugixml.cpp" +# include PUGIXML_SOURCE +#endif + +/** + * Copyright (c) 2006-2015 Arseny Kapoulkine + * + * 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/ThirdParty/include/tinfl.c b/ThirdParty/include/tinfl.c new file mode 100644 index 0000000..d00addf --- /dev/null +++ b/ThirdParty/include/tinfl.c @@ -0,0 +1,592 @@ +/* tinfl.c v1.11 - public domain inflate with zlib header parsing/adler32 checking (inflate-only subset of miniz.c) + See "unlicense" statement at the end of this file. + Rich Geldreich , last updated May 20, 2011 + Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt + + The entire decompressor coroutine is implemented in tinfl_decompress(). The other functions are optional high-level helpers. +*/ +#ifndef TINFL_HEADER_INCLUDED +#define TINFL_HEADER_INCLUDED + +#include + +typedef unsigned char mz_uint8; +typedef signed short mz_int16; +typedef unsigned short mz_uint16; +typedef unsigned int mz_uint32; +typedef unsigned int mz_uint; +typedef unsigned long long mz_uint64; + +#if defined(_M_IX86) || defined(_M_X64) +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 if integer loads and stores to unaligned addresses are acceptable on the target platform (slightly faster). +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif + +#if defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if the processor has 64-bit general purpose registers (enables 64-bit bitbuffer in inflator) +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +// Works around MSVC's spammy "warning C4127: conditional expression is constant" message. +#ifdef _MSC_VER + #define MZ_MACRO_END while (0, 0) +#else + #define MZ_MACRO_END while (0) +#endif + +// Decompression flags used by tinfl_decompress(). +// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. +// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. +// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). +// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. +enum +{ + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 +}; + +// High level decompression functions: +// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. +// On return: +// Function returns a pointer to the decompressed data, or NULL on failure. +// *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. +// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. +// Returns 1 on success or 0 on failure. +typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; + +// Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + +// Return status. +typedef enum +{ + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 +} tinfl_status; + +// Initializes the decompressor to its initial state. +#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + +// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. +// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); + +// Internal/private bits follow. +enum +{ + TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS +}; + +typedef struct +{ + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; +} tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS + #define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF + typedef mz_uint64 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (64) +#else + typedef mz_uint32 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (32) +#endif + +struct tinfl_decompressor_tag +{ + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; +}; + +#endif // #ifdef TINFL_HEADER_INCLUDED + +// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.) + +#ifndef TINFL_HEADER_FILE_ONLY + +#include + +// MZ_MALLOC, etc. are only used by the optional high-level helper functions. +#ifdef MINIZ_NO_MALLOC + #define MZ_MALLOC(x) NULL + #define MZ_FREE(x) x, ((void)0) + #define MZ_REALLOC(p, x) NULL +#else + #define MZ_MALLOC(x) malloc(x) + #define MZ_FREE(x) free(x) + #define MZ_REALLOC(p, x) realloc(p, x) +#endif + +#define MZ_MAX(a,b) (((a)>(b))?(a):(b)) +#define MZ_MIN(a,b) (((a)<(b))?(a):(b)) +#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + #define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) + #define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) +#else + #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) + #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) +#endif + +#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) +#define TINFL_MEMSET(p, c, l) memset(p, c, l) + +#define TINFL_CR_BEGIN switch(r->m_state) { case 0: +#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END +#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END +#define TINFL_CR_FINISH } + +// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never +// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. +#define TINFL_GET_BYTE(state_index, c) do { \ + if (pIn_buf_cur >= pIn_buf_end) { \ + for ( ; ; ) { \ + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ + TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ + if (pIn_buf_cur < pIn_buf_end) { \ + c = *pIn_buf_cur++; \ + break; \ + } \ + } else { \ + c = 0; \ + break; \ + } \ + } \ + } else c = *pIn_buf_cur++; } MZ_MACRO_END + +#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n)) +#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END +#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END + +// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. +// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a +// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the +// bit buffer contains >=15 bits (deflate's max. Huffman code size). +#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ + do { \ + temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ + if (temp >= 0) { \ + code_len = temp >> 9; \ + if ((code_len) && (num_bits >= code_len)) \ + break; \ + } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ + code_len = TINFL_FAST_LOOKUP_BITS; \ + do { \ + temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ + } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \ + } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \ + } while (num_bits < 15); + +// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read +// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully +// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. +// The slow path is only executed at the very end of the input buffer. +#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ + int temp; mz_uint code_len, c; \ + if (num_bits < 15) { \ + if ((pIn_buf_end - pIn_buf_cur) < 2) { \ + TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ + } else { \ + bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \ + } \ + } \ + if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ + code_len = temp >> 9, temp &= 511; \ + else { \ + code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \ + } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END + +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) +{ + static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; + static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static const int s_min_table_sizes[3] = { 257, 1, 4 }; + + tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; + size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; + + // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). + if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; } + + num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start; + TINFL_CR_BEGIN + + bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1; + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1); + counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); + if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4))))); + if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); } + } + + do + { + TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1; + if (r->m_type == 0) + { + TINFL_SKIP_BITS(5, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); } + if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); } + while ((counter) && (num_bits)) + { + TINFL_GET_BITS(51, dist, 8); + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)dist; + counter--; + } + while (counter) + { + size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } + while (pIn_buf_cur >= pIn_buf_end) + { + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) + { + TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); + } + else + { + TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); + } + } + n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); + TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; + } + } + else if (r->m_type == 3) + { + TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); + } + else + { + if (r->m_type == 1) + { + mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; + r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); + for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; + } + else + { + for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; } + MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; } + r->m_table_sizes[2] = 19; + } + for ( ; (int)r->m_type >= 0; r->m_type--) + { + int tree_next, tree_cur; tinfl_huff_table *pTable; + mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree); + for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++; + used_syms = 0, total = 0; next_code[0] = next_code[1] = 0; + for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); } + if ((65536 != total) && (used_syms > 1)) + { + TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); + } + for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) + { + mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue; + cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1); + if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; } + if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } + rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); + for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) + { + tree_cur -= ((rev_code >>= 1) & 1); + if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1]; + } + tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; + } + if (r->m_type == 2) + { + for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) + { + mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; } + if ((dist == 16) && (!counter)) + { + TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); + } + num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16]; + TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s; + } + if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) + { + TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); + } + TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); + } + } + for ( ; ; ) + { + mz_uint8 *pSrc; + for ( ; ; ) + { + if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) + { + TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); + if (counter >= 256) + break; + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)counter; + } + else + { + int sym2; mz_uint code_len; +#if TINFL_USE_64BIT_BITBUF + if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; } +#else + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + counter = sym2; bit_buf >>= code_len; num_bits -= code_len; + if (counter & 256) + break; + +#if !TINFL_USE_64BIT_BITBUF + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + bit_buf >>= code_len; num_bits -= code_len; + + pOut_buf_cur[0] = (mz_uint8)counter; + if (sym2 & 256) + { + pOut_buf_cur++; + counter = sym2; + break; + } + pOut_buf_cur[1] = (mz_uint8)sym2; + pOut_buf_cur += 2; + } + } + if ((counter &= 511) == 256) break; + + num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; } + + TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); + num_extra = s_dist_extra[dist]; dist = s_dist_base[dist]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; } + + dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; + if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) + { + TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); + } + + pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); + + if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) + { + while (counter--) + { + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; + } + continue; + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + else if ((counter >= 9) && (counter <= dist)) + { + const mz_uint8 *pSrc_end = pSrc + (counter & ~7); + do + { + ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; + ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; + pOut_buf_cur += 8; + } while ((pSrc += 8) < pSrc_end); + if ((counter &= 7) < 3) + { + if (counter) + { + pOut_buf_cur[0] = pSrc[0]; + if (counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + continue; + } + } +#endif + do + { + pOut_buf_cur[0] = pSrc[0]; + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur[2] = pSrc[2]; + pOut_buf_cur += 3; pSrc += 3; + } while ((int)(counter -= 3) > 2); + if ((int)counter > 0) + { + pOut_buf_cur[0] = pSrc[0]; + if ((int)counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + } + } + } while (!(r->m_final & 1)); + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; } + } + TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); + TINFL_CR_FINISH + +common_exit: + r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start; + *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; + if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) + { + const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size; + mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552; + while (buf_len) + { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) + { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH; + } + return status; +} + +// Higher level helper functions. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0; + *pOut_len = 0; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + src_buf_ofs += src_buf_size; + *pOut_len += dst_buf_size; + if (status == TINFL_STATUS_DONE) break; + new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; + pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); + if (!pNew_buf) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity; + } + return pBuf; +} + +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp); + status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; +} + +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + int result = 0; + tinfl_decompressor decomp; + mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0; + if (!pDict) + return TINFL_STATUS_FAILED; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + in_buf_ofs += in_buf_size; + if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) + break; + if (status != TINFL_STATUS_HAS_MORE_OUTPUT) + { + result = (status == TINFL_STATUS_DONE); + break; + } + dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); + } + MZ_FREE(pDict); + *pIn_buf_size = in_buf_ofs; + return result; +} + +#endif // #ifndef TINFL_HEADER_FILE_ONLY + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + 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 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. + + For more information, please refer to +*/ diff --git a/ThirdParty/install_thirdparty.bat b/ThirdParty/install_thirdparty.bat deleted file mode 100644 index 0ed505f..0000000 --- a/ThirdParty/install_thirdparty.bat +++ /dev/null @@ -1,196 +0,0 @@ -@echo off - -:: Configure the downloaded files you want to use here but without the file type ending, e.g. boost-1_34_1 NOT boost-1_34_1.zip - -set BOOSTDIR=boost_1_44_0 -:: please set this too - you have to change the '_' to '-' after boost -set BOOSTDIRINCLUDEPREFIX=boost-1_44 -set BJAMDIR=boost-jam-3.1.18 -set INTTYPES=msinttypes-r26 -set MSVC_Ver=msvc - -:: Don't change settings below this line! - -set BOOSTDOWNLOAD=http://sourceforge.net/projects/boost/files/boost/1.44.0 -set BJAMDOWNLOAD=http://sourceforge.net/projects/boost/files/boost-jam/3.1.18 -set INTTYPESDOWNLOAD=http://code.google.com/p/msinttypes/downloads/list - -set LIBDIR=lib -set INCLDUEDIR=include - -set BJAMBUILD=build.bat -set BJAMBINDIR=bin.ntx86 -set BJAMEXE=bjam.exe - -set GENERICBOOSTINCLUDE=%INCLDUEDIR%\boost -::set BOOSTRELEASEPATH=bin.v2\libs\thread\build\%MSVC_Ver%\release\link-static\runtime-link-static\threading-multi - -set INTTYPES_FILES=inttypes.h stdint.h -set UNPROCESSEDINTTYPEFILES=changelog.txt - -echo After installation there will be two further folders, "lib" and "include". -echo Unzipped files will be deleted in order to have a clean environment! - -:: creating lib directory -if not exist %LIBDIR% ( - md %LIBDIR% -) - -:: creating include directory -if not exist %INCLDUEDIR% ( - md %INCLDUEDIR% -) - -:: installing inttypes -echo. -echo Installing inttypes! -echo. - -if not exist %INCLDUEDIR% ( - goto error_no_include -) - -for %%i in (%INTTYPES_FILES%) do ( - if not exist %INCLDUEDIR%\%%i ( - if not exist %%i ( - goto error_no_intfiles - ) else ( - move %%i %INCLDUEDIR% - ) - ) -) - -:: installing bjam -if not exist %BJAMDIR% ( - goto error_no_bjam_dir -) else ( - pushd %BJAMDIR% -) - -if not exist %BJAMBUILD% ( - goto error_no_bjam_bat -) else ( - echo. - echo Building bjam! - echo. - echo. - @echo on - call %BJAMBUILD% - popd - @echo off -) - -:: installing boost -if not exist %BOOSTDIR% ( - goto error_no_boost_dir -) else ( - pushd %BOOSTDIR% -) - -if not exist ../%BJAMDIR%/%BJAMBINDIR%/%BJAMEXE% ( - popd - goto error_no_bjam_exe -) else ( - echo. - echo Building and installing boost! - echo. - @echo on - ..\%BJAMDIR%\%BJAMBINDIR%\%BJAMEXE% clean -:: prefix=.. means, alib directory in the parent dir will be created - ..\%BJAMDIR%\%BJAMBINDIR%\%BJAMEXE% --toolset=%MSVC_Ver% --prefix=.. link=static --threading=multi runtime-link=static stage install - popd - @echo off - if not exist %INCLDUEDIR% goto error_no_include - if not exist %INCLDUEDIR%\%BOOSTDIRINCLUDEPREFIX% goto error_no_boost_include - if not exist %INCLDUEDIR%\%BOOSTDIRINCLUDEPREFIX%\boost goto error_no_boost_boost_include - move %INCLDUEDIR%\%BOOSTDIRINCLUDEPREFIX%\boost %GENERICBOOSTINCLUDE% - rmdir /s /q %INCLDUEDIR%\%BOOSTDIRINCLUDEPREFIX% -) - -goto finished - - -:error_no_bjam_dir -echo. -if exist %BJAMDIR%.zip ( - echo *** You have to unzip %BJAMDIR%.zip! *** -) else ( - echo *** Please download %BJAMDIR%.zip from "%BJAMDOWNLOAD%" - echo and/or change settings of %0! *** -) -goto finsished_error - -:error_no_bjam_bat -echo. -echo *** You're unzipped Version of %BJAMDIR% seems corrupt! *** -echo Unzip %BJAMDIR%.zip again or download bjam from %BJAMDOWNLOAD%! -goto finsished_error - -:error_no_bjam_exe -echo. -echo *** %BJAMDIR%\%BJAMBINDIR%\%BJAMEXE% not found! *** -echo Check path and settings of %0! -goto finsished_error - -:error_no_boost_dir -echo. -if exist %BOOSTDIR%.zip ( - echo *** You have to unzip %BOOSTDIR%.zip! *** -) else ( - echo *** Please download %BOOSTDIR%.zip from "%BOOSTDOWNLOAD%" - echo and/or change settings of %0! *** -) -goto finsished_error - -:error_no_include -echo. -echo *** Path %INCLDUEDIR% not found! *** -echo Script possibly broken. -echo This should not happen. -echo Check paths and configuartion of %0! -goto end - -:error_no_boost_include -echo. -echo *** Path %INCLDUEDIR%\%BOOSTDIRINCLUDEPREFIX% not found! *** -echo Script possibly broken. -echo This should not happen. -echo Somethings possibly wrong with boost installation routine! -echo You have to build and configure manually! -goto end - -:error_no_boost_boost_include -echo. -echo *** Path %INCLDUEDIR%\%BOOSTDIRINCLUDEPREFIX%\boost not found! *** -echo This shouldn't happen. -echo Somethings possibly wrong with boost installation routine! -echo You have to build and configure manually! -goto end - -:error_no_intfiles -echo. -if exist %INTTYPES%.zip ( - echo *** You have to unzip %INTTYPES%.zip! *** -) else ( - echo *** Please download %INTTYPES%.zip from "%INTTYPESDOWNLOAD%" - echo and/or change settings of %0! *** -) -goto finsished_error - -:finsished_error -echo. -echo *** Finished with errors! *** -goto end - -:finished -echo. -echo Finished! -goto end - -:end -Pause - - - - - diff --git a/ThirdParty/src/pugixml.cpp b/ThirdParty/src/pugixml.cpp new file mode 100644 index 0000000..854ff8c --- /dev/null +++ b/ThirdParty/src/pugixml.cpp @@ -0,0 +1,12444 @@ +/** + * pugixml parser - version 1.7 + * -------------------------------------------------------- + * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at http://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef SOURCE_PUGIXML_CPP +#define SOURCE_PUGIXML_CPP + +#include "pugixml.hpp" + +#include +#include +#include +#include +#include + +#ifdef PUGIXML_WCHAR_MODE +# include +#endif + +#ifndef PUGIXML_NO_XPATH +# include +# include +# ifdef PUGIXML_NO_EXCEPTIONS +# include +# endif +#endif + +#ifndef PUGIXML_NO_STL +# include +# include +# include +#endif + +// For placement new +#include + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4127) // conditional expression is constant +# pragma warning(disable: 4324) // structure was padded due to __declspec(align()) +# pragma warning(disable: 4611) // interaction between '_setjmp' and C++ object destruction is non-portable +# pragma warning(disable: 4702) // unreachable code +# pragma warning(disable: 4996) // this function or variable may be unsafe +# pragma warning(disable: 4793) // function compiled as native: presence of '_setjmp' makes a function unmanaged +#endif + +#ifdef __INTEL_COMPILER +# pragma warning(disable: 177) // function was declared but never referenced +# pragma warning(disable: 279) // controlling expression is constant +# pragma warning(disable: 1478 1786) // function was declared "deprecated" +# pragma warning(disable: 1684) // conversion from pointer to same-sized integral type +#endif + +#if defined(__BORLANDC__) && defined(PUGIXML_HEADER_ONLY) +# pragma warn -8080 // symbol is declared but never used; disabling this inside push/pop bracket does not make the warning go away +#endif + +#ifdef __BORLANDC__ +# pragma option push +# pragma warn -8008 // condition is always false +# pragma warn -8066 // unreachable code +#endif + +#ifdef __SNC__ +// Using diag_push/diag_pop does not disable the warnings inside templates due to a compiler bug +# pragma diag_suppress=178 // function was declared but never referenced +# pragma diag_suppress=237 // controlling expression is constant +#endif + +// Inlining controls +#if defined(_MSC_VER) && _MSC_VER >= 1300 +# define PUGI__NO_INLINE __declspec(noinline) +#elif defined(__GNUC__) +# define PUGI__NO_INLINE __attribute__((noinline)) +#else +# define PUGI__NO_INLINE +#endif + +// Branch weight controls +#if defined(__GNUC__) +# define PUGI__UNLIKELY(cond) __builtin_expect(cond, 0) +#else +# define PUGI__UNLIKELY(cond) (cond) +#endif + +// Simple static assertion +#define PUGI__STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; } + +// Digital Mars C++ bug workaround for passing char loaded from memory via stack +#ifdef __DMC__ +# define PUGI__DMC_VOLATILE volatile +#else +# define PUGI__DMC_VOLATILE +#endif + +// Borland C++ bug workaround for not defining ::memcpy depending on header include order (can't always use std::memcpy because some compilers don't have it at all) +#if defined(__BORLANDC__) && !defined(__MEM_H_USING_LIST) +using std::memcpy; +using std::memmove; +using std::memset; +#endif + +// In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features +#if defined(_MSC_VER) && !defined(__S3E__) +# define PUGI__MSVC_CRT_VERSION _MSC_VER +#endif + +#ifdef PUGIXML_HEADER_ONLY +# define PUGI__NS_BEGIN namespace pugi { namespace impl { +# define PUGI__NS_END } } +# define PUGI__FN inline +# define PUGI__FN_NO_INLINE inline +#else +# if defined(_MSC_VER) && _MSC_VER < 1300 // MSVC6 seems to have an amusing bug with anonymous namespaces inside namespaces +# define PUGI__NS_BEGIN namespace pugi { namespace impl { +# define PUGI__NS_END } } +# else +# define PUGI__NS_BEGIN namespace pugi { namespace impl { namespace { +# define PUGI__NS_END } } } +# endif +# define PUGI__FN +# define PUGI__FN_NO_INLINE PUGI__NO_INLINE +#endif + +// uintptr_t +#if !defined(_MSC_VER) || _MSC_VER >= 1600 +# include +#else +namespace pugi +{ +# ifndef _UINTPTR_T_DEFINED + typedef size_t uintptr_t; +# endif + + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +} +#endif + +// Memory allocation +PUGI__NS_BEGIN + PUGI__FN void* default_allocate(size_t size) + { + return malloc(size); + } + + PUGI__FN void default_deallocate(void* ptr) + { + free(ptr); + } + + template + struct xml_memory_management_function_storage + { + static allocation_function allocate; + static deallocation_function deallocate; + }; + + // Global allocation functions are stored in class statics so that in header mode linker deduplicates them + // Without a template<> we'll get multiple definitions of the same static + template allocation_function xml_memory_management_function_storage::allocate = default_allocate; + template deallocation_function xml_memory_management_function_storage::deallocate = default_deallocate; + + typedef xml_memory_management_function_storage xml_memory; +PUGI__NS_END + +// String utilities +PUGI__NS_BEGIN + // Get string length + PUGI__FN size_t strlength(const char_t* s) + { + assert(s); + + #ifdef PUGIXML_WCHAR_MODE + return wcslen(s); + #else + return strlen(s); + #endif + } + + // Compare two strings + PUGI__FN bool strequal(const char_t* src, const char_t* dst) + { + assert(src && dst); + + #ifdef PUGIXML_WCHAR_MODE + return wcscmp(src, dst) == 0; + #else + return strcmp(src, dst) == 0; + #endif + } + + // Compare lhs with [rhs_begin, rhs_end) + PUGI__FN bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count) + { + for (size_t i = 0; i < count; ++i) + if (lhs[i] != rhs[i]) + return false; + + return lhs[count] == 0; + } + + // Get length of wide string, even if CRT lacks wide character support + PUGI__FN size_t strlength_wide(const wchar_t* s) + { + assert(s); + + #ifdef PUGIXML_WCHAR_MODE + return wcslen(s); + #else + const wchar_t* end = s; + while (*end) end++; + return static_cast(end - s); + #endif + } +PUGI__NS_END + +// auto_ptr-like object for exception recovery +PUGI__NS_BEGIN + template struct auto_deleter + { + T* data; + D deleter; + + auto_deleter(T* data_, D deleter_): data(data_), deleter(deleter_) + { + } + + ~auto_deleter() + { + if (data) deleter(data); + } + + T* release() + { + T* result = data; + data = 0; + return result; + } + }; +PUGI__NS_END + +#ifdef PUGIXML_COMPACT +PUGI__NS_BEGIN + class compact_hash_table + { + public: + compact_hash_table(): _items(0), _capacity(0), _count(0) + { + } + + void clear() + { + if (_items) + { + xml_memory::deallocate(_items); + _items = 0; + _capacity = 0; + _count = 0; + } + } + + void** find(const void* key) + { + assert(key); + + if (_capacity == 0) return 0; + + size_t hashmod = _capacity - 1; + size_t bucket = hash(key) & hashmod; + + for (size_t probe = 0; probe <= hashmod; ++probe) + { + item_t& probe_item = _items[bucket]; + + if (probe_item.key == key) + return &probe_item.value; + + if (probe_item.key == 0) + return 0; + + // hash collision, quadratic probing + bucket = (bucket + probe + 1) & hashmod; + } + + assert(!"Hash table is full"); + return 0; + } + + void** insert(const void* key) + { + assert(key); + assert(_capacity != 0 && _count < _capacity - _capacity / 4); + + size_t hashmod = _capacity - 1; + size_t bucket = hash(key) & hashmod; + + for (size_t probe = 0; probe <= hashmod; ++probe) + { + item_t& probe_item = _items[bucket]; + + if (probe_item.key == 0) + { + probe_item.key = key; + _count++; + return &probe_item.value; + } + + if (probe_item.key == key) + return &probe_item.value; + + // hash collision, quadratic probing + bucket = (bucket + probe + 1) & hashmod; + } + + assert(!"Hash table is full"); + return 0; + } + + bool reserve() + { + if (_count + 16 >= _capacity - _capacity / 4) + return rehash(); + + return true; + } + + private: + struct item_t + { + const void* key; + void* value; + }; + + item_t* _items; + size_t _capacity; + + size_t _count; + + bool rehash(); + + static unsigned int hash(const void* key) + { + unsigned int h = static_cast(reinterpret_cast(key)); + + // MurmurHash3 32-bit finalizer + h ^= h >> 16; + h *= 0x85ebca6bu; + h ^= h >> 13; + h *= 0xc2b2ae35u; + h ^= h >> 16; + + return h; + } + }; + + PUGI__FN_NO_INLINE bool compact_hash_table::rehash() + { + compact_hash_table rt; + rt._capacity = (_capacity == 0) ? 32 : _capacity * 2; + rt._items = static_cast(xml_memory::allocate(sizeof(item_t) * rt._capacity)); + + if (!rt._items) + return false; + + memset(rt._items, 0, sizeof(item_t) * rt._capacity); + + for (size_t i = 0; i < _capacity; ++i) + if (_items[i].key) + *rt.insert(_items[i].key) = _items[i].value; + + if (_items) + xml_memory::deallocate(_items); + + _capacity = rt._capacity; + _items = rt._items; + + assert(_count == rt._count); + + return true; + } + +PUGI__NS_END +#endif + +PUGI__NS_BEGIN + static const size_t xml_memory_page_size = + #ifdef PUGIXML_MEMORY_PAGE_SIZE + PUGIXML_MEMORY_PAGE_SIZE + #else + 32768 + #endif + ; + +#ifdef PUGIXML_COMPACT + static const uintptr_t xml_memory_block_alignment = 4; + + static const uintptr_t xml_memory_page_alignment = sizeof(void*); +#else + static const uintptr_t xml_memory_block_alignment = sizeof(void*); + + static const uintptr_t xml_memory_page_alignment = 64; + static const uintptr_t xml_memory_page_pointer_mask = ~(xml_memory_page_alignment - 1); +#endif + + // extra metadata bits + static const uintptr_t xml_memory_page_contents_shared_mask = 32; + static const uintptr_t xml_memory_page_name_allocated_mask = 16; + static const uintptr_t xml_memory_page_value_allocated_mask = 8; + static const uintptr_t xml_memory_page_type_mask = 7; + + // combined masks for string uniqueness + static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask; + static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask; + +#ifdef PUGIXML_COMPACT + #define PUGI__GETPAGE_IMPL(header) (header).get_page() +#else + #define PUGI__GETPAGE_IMPL(header) reinterpret_cast((header) & impl::xml_memory_page_pointer_mask) +#endif + + #define PUGI__GETPAGE(n) PUGI__GETPAGE_IMPL((n)->header) + #define PUGI__NODETYPE(n) static_cast(((n)->header & impl::xml_memory_page_type_mask) + 1) + + struct xml_allocator; + + struct xml_memory_page + { + static xml_memory_page* construct(void* memory) + { + xml_memory_page* result = static_cast(memory); + + result->allocator = 0; + result->prev = 0; + result->next = 0; + result->busy_size = 0; + result->freed_size = 0; + + #ifdef PUGIXML_COMPACT + result->compact_string_base = 0; + result->compact_shared_parent = 0; + result->compact_page_marker = 0; + #endif + + return result; + } + + xml_allocator* allocator; + + xml_memory_page* prev; + xml_memory_page* next; + + size_t busy_size; + size_t freed_size; + + #ifdef PUGIXML_COMPACT + char_t* compact_string_base; + void* compact_shared_parent; + uint32_t* compact_page_marker; + #endif + }; + + struct xml_memory_string_header + { + uint16_t page_offset; // offset from page->data + uint16_t full_size; // 0 if string occupies whole page + }; + + struct xml_allocator + { + xml_allocator(xml_memory_page* root): _root(root), _busy_size(root->busy_size) + { + #ifdef PUGIXML_COMPACT + _hash = 0; + #endif + } + + xml_memory_page* allocate_page(size_t data_size) + { + size_t size = sizeof(xml_memory_page) + data_size; + + // allocate block with some alignment, leaving memory for worst-case padding + void* memory = xml_memory::allocate(size + xml_memory_page_alignment); + if (!memory) return 0; + + // align to next page boundary (note: this guarantees at least 1 usable byte before the page) + char* page_memory = reinterpret_cast((reinterpret_cast(memory) + xml_memory_page_alignment) & ~(xml_memory_page_alignment - 1)); + + // prepare page structure + xml_memory_page* page = xml_memory_page::construct(page_memory); + assert(page); + + page->allocator = _root->allocator; + + // record the offset for freeing the memory block + assert(page_memory > memory && page_memory - static_cast(memory) <= 127); + page_memory[-1] = static_cast(page_memory - static_cast(memory)); + + return page; + } + + static void deallocate_page(xml_memory_page* page) + { + char* page_memory = reinterpret_cast(page); + + xml_memory::deallocate(page_memory - page_memory[-1]); + } + + void* allocate_memory_oob(size_t size, xml_memory_page*& out_page); + + void* allocate_memory(size_t size, xml_memory_page*& out_page) + { + if (PUGI__UNLIKELY(_busy_size + size > xml_memory_page_size)) + return allocate_memory_oob(size, out_page); + + void* buf = reinterpret_cast(_root) + sizeof(xml_memory_page) + _busy_size; + + _busy_size += size; + + out_page = _root; + + return buf; + } + + #ifdef PUGIXML_COMPACT + void* allocate_object(size_t size, xml_memory_page*& out_page) + { + void* result = allocate_memory(size + sizeof(uint32_t), out_page); + if (!result) return 0; + + // adjust for marker + ptrdiff_t offset = static_cast(result) - reinterpret_cast(out_page->compact_page_marker); + + if (PUGI__UNLIKELY(static_cast(offset) >= 256 * xml_memory_block_alignment)) + { + // insert new marker + uint32_t* marker = static_cast(result); + + *marker = static_cast(reinterpret_cast(marker) - reinterpret_cast(out_page)); + out_page->compact_page_marker = marker; + + // since we don't reuse the page space until we reallocate it, we can just pretend that we freed the marker block + // this will make sure deallocate_memory correctly tracks the size + out_page->freed_size += sizeof(uint32_t); + + return marker + 1; + } + else + { + // roll back uint32_t part + _busy_size -= sizeof(uint32_t); + + return result; + } + } + #else + void* allocate_object(size_t size, xml_memory_page*& out_page) + { + return allocate_memory(size, out_page); + } + #endif + + void deallocate_memory(void* ptr, size_t size, xml_memory_page* page) + { + if (page == _root) page->busy_size = _busy_size; + + assert(ptr >= reinterpret_cast(page) + sizeof(xml_memory_page) && ptr < reinterpret_cast(page) + sizeof(xml_memory_page) + page->busy_size); + (void)!ptr; + + page->freed_size += size; + assert(page->freed_size <= page->busy_size); + + if (page->freed_size == page->busy_size) + { + if (page->next == 0) + { + assert(_root == page); + + // top page freed, just reset sizes + page->busy_size = 0; + page->freed_size = 0; + + #ifdef PUGIXML_COMPACT + // reset compact state to maximize efficiency + page->compact_string_base = 0; + page->compact_shared_parent = 0; + page->compact_page_marker = 0; + #endif + + _busy_size = 0; + } + else + { + assert(_root != page); + assert(page->prev); + + // remove from the list + page->prev->next = page->next; + page->next->prev = page->prev; + + // deallocate + deallocate_page(page); + } + } + } + + char_t* allocate_string(size_t length) + { + static const size_t max_encoded_offset = (1 << 16) * xml_memory_block_alignment; + + PUGI__STATIC_ASSERT(xml_memory_page_size <= max_encoded_offset); + + // allocate memory for string and header block + size_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t); + + // round size up to block alignment boundary + size_t full_size = (size + (xml_memory_block_alignment - 1)) & ~(xml_memory_block_alignment - 1); + + xml_memory_page* page; + xml_memory_string_header* header = static_cast(allocate_memory(full_size, page)); + + if (!header) return 0; + + // setup header + ptrdiff_t page_offset = reinterpret_cast(header) - reinterpret_cast(page) - sizeof(xml_memory_page); + + assert(page_offset % xml_memory_block_alignment == 0); + assert(page_offset >= 0 && static_cast(page_offset) < max_encoded_offset); + header->page_offset = static_cast(static_cast(page_offset) / xml_memory_block_alignment); + + // full_size == 0 for large strings that occupy the whole page + assert(full_size % xml_memory_block_alignment == 0); + assert(full_size < max_encoded_offset || (page->busy_size == full_size && page_offset == 0)); + header->full_size = static_cast(full_size < max_encoded_offset ? full_size / xml_memory_block_alignment : 0); + + // round-trip through void* to avoid 'cast increases required alignment of target type' warning + // header is guaranteed a pointer-sized alignment, which should be enough for char_t + return static_cast(static_cast(header + 1)); + } + + void deallocate_string(char_t* string) + { + // this function casts pointers through void* to avoid 'cast increases required alignment of target type' warnings + // we're guaranteed the proper (pointer-sized) alignment on the input string if it was allocated via allocate_string + + // get header + xml_memory_string_header* header = static_cast(static_cast(string)) - 1; + assert(header); + + // deallocate + size_t page_offset = sizeof(xml_memory_page) + header->page_offset * xml_memory_block_alignment; + xml_memory_page* page = reinterpret_cast(static_cast(reinterpret_cast(header) - page_offset)); + + // if full_size == 0 then this string occupies the whole page + size_t full_size = header->full_size == 0 ? page->busy_size : header->full_size * xml_memory_block_alignment; + + deallocate_memory(header, full_size, page); + } + + bool reserve() + { + #ifdef PUGIXML_COMPACT + return _hash->reserve(); + #else + return true; + #endif + } + + xml_memory_page* _root; + size_t _busy_size; + + #ifdef PUGIXML_COMPACT + compact_hash_table* _hash; + #endif + }; + + PUGI__FN_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page) + { + const size_t large_allocation_threshold = xml_memory_page_size / 4; + + xml_memory_page* page = allocate_page(size <= large_allocation_threshold ? xml_memory_page_size : size); + out_page = page; + + if (!page) return 0; + + if (size <= large_allocation_threshold) + { + _root->busy_size = _busy_size; + + // insert page at the end of linked list + page->prev = _root; + _root->next = page; + _root = page; + + _busy_size = size; + } + else + { + // insert page before the end of linked list, so that it is deleted as soon as possible + // the last page is not deleted even if it's empty (see deallocate_memory) + assert(_root->prev); + + page->prev = _root->prev; + page->next = _root; + + _root->prev->next = page; + _root->prev = page; + + page->busy_size = size; + } + + return reinterpret_cast(page) + sizeof(xml_memory_page); + } +PUGI__NS_END + +#ifdef PUGIXML_COMPACT +PUGI__NS_BEGIN + static const uintptr_t compact_alignment_log2 = 2; + static const uintptr_t compact_alignment = 1 << compact_alignment_log2; + + class compact_header + { + public: + compact_header(xml_memory_page* page, unsigned int flags) + { + PUGI__STATIC_ASSERT(xml_memory_block_alignment == compact_alignment); + + ptrdiff_t offset = (reinterpret_cast(this) - reinterpret_cast(page->compact_page_marker)); + assert(offset % compact_alignment == 0 && static_cast(offset) < 256 * compact_alignment); + + _page = static_cast(offset >> compact_alignment_log2); + _flags = static_cast(flags); + } + + void operator&=(uintptr_t mod) + { + _flags &= static_cast(mod); + } + + void operator|=(uintptr_t mod) + { + _flags |= static_cast(mod); + } + + uintptr_t operator&(uintptr_t mod) const + { + return _flags & mod; + } + + xml_memory_page* get_page() const + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + const char* page_marker = reinterpret_cast(this) - (_page << compact_alignment_log2); + const char* page = page_marker - *reinterpret_cast(static_cast(page_marker)); + + return const_cast(reinterpret_cast(static_cast(page))); + } + + private: + unsigned char _page; + unsigned char _flags; + }; + + PUGI__FN xml_memory_page* compact_get_page(const void* object, int header_offset) + { + const compact_header* header = reinterpret_cast(static_cast(object) - header_offset); + + return header->get_page(); + } + + template PUGI__FN_NO_INLINE T* compact_get_value(const void* object) + { + return static_cast(*compact_get_page(object, header_offset)->allocator->_hash->find(object)); + } + + template PUGI__FN_NO_INLINE void compact_set_value(const void* object, T* value) + { + *compact_get_page(object, header_offset)->allocator->_hash->insert(object) = value; + } + + template class compact_pointer + { + public: + compact_pointer(): _data(0) + { + } + + void operator=(const compact_pointer& rhs) + { + *this = rhs + 0; + } + + void operator=(T* value) + { + if (value) + { + // value is guaranteed to be compact-aligned; 'this' is not + // our decoding is based on 'this' aligned to compact alignment downwards (see operator T*) + // so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to + // compensate for arithmetic shift rounding for negative values + ptrdiff_t diff = reinterpret_cast(value) - reinterpret_cast(this); + ptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) - start; + + if (static_cast(offset) <= 253) + _data = static_cast(offset + 1); + else + { + compact_set_value(this, value); + + _data = 255; + } + } + else + _data = 0; + } + + operator T*() const + { + if (_data) + { + if (_data < 255) + { + uintptr_t base = reinterpret_cast(this) & ~(compact_alignment - 1); + + return reinterpret_cast(base + ((_data - 1 + start) << compact_alignment_log2)); + } + else + return compact_get_value(this); + } + else + return 0; + } + + T* operator->() const + { + return *this; + } + + private: + unsigned char _data; + }; + + template class compact_pointer_parent + { + public: + compact_pointer_parent(): _data(0) + { + } + + void operator=(const compact_pointer_parent& rhs) + { + *this = rhs + 0; + } + + void operator=(T* value) + { + if (value) + { + // value is guaranteed to be compact-aligned; 'this' is not + // our decoding is based on 'this' aligned to compact alignment downwards (see operator T*) + // so for negative offsets (e.g. -3) we need to adjust the diff by compact_alignment - 1 to + // compensate for arithmetic shift behavior for negative values + ptrdiff_t diff = reinterpret_cast(value) - reinterpret_cast(this); + ptrdiff_t offset = ((diff + int(compact_alignment - 1)) >> compact_alignment_log2) + 65533; + + if (static_cast(offset) <= 65533) + { + _data = static_cast(offset + 1); + } + else + { + xml_memory_page* page = compact_get_page(this, header_offset); + + if (PUGI__UNLIKELY(page->compact_shared_parent == 0)) + page->compact_shared_parent = value; + + if (page->compact_shared_parent == value) + { + _data = 65534; + } + else + { + compact_set_value(this, value); + + _data = 65535; + } + } + } + else + { + _data = 0; + } + } + + operator T*() const + { + if (_data) + { + if (_data < 65534) + { + uintptr_t base = reinterpret_cast(this) & ~(compact_alignment - 1); + + return reinterpret_cast(base + ((_data - 1 - 65533) << compact_alignment_log2)); + } + else if (_data == 65534) + return static_cast(compact_get_page(this, header_offset)->compact_shared_parent); + else + return compact_get_value(this); + } + else + return 0; + } + + T* operator->() const + { + return *this; + } + + private: + uint16_t _data; + }; + + template class compact_string + { + public: + compact_string(): _data(0) + { + } + + void operator=(const compact_string& rhs) + { + *this = rhs + 0; + } + + void operator=(char_t* value) + { + if (value) + { + xml_memory_page* page = compact_get_page(this, header_offset); + + if (PUGI__UNLIKELY(page->compact_string_base == 0)) + page->compact_string_base = value; + + ptrdiff_t offset = value - page->compact_string_base; + + if (static_cast(offset) < (65535 << 7)) + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + uint16_t* base = reinterpret_cast(static_cast(reinterpret_cast(this) - base_offset)); + + if (*base == 0) + { + *base = static_cast((offset >> 7) + 1); + _data = static_cast((offset & 127) + 1); + } + else + { + ptrdiff_t remainder = offset - ((*base - 1) << 7); + + if (static_cast(remainder) <= 253) + { + _data = static_cast(remainder + 1); + } + else + { + compact_set_value(this, value); + + _data = 255; + } + } + } + else + { + compact_set_value(this, value); + + _data = 255; + } + } + else + { + _data = 0; + } + } + + operator char_t*() const + { + if (_data) + { + if (_data < 255) + { + xml_memory_page* page = compact_get_page(this, header_offset); + + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + const uint16_t* base = reinterpret_cast(static_cast(reinterpret_cast(this) - base_offset)); + assert(*base); + + ptrdiff_t offset = ((*base - 1) << 7) + (_data - 1); + + return page->compact_string_base + offset; + } + else + { + return compact_get_value(this); + } + } + else + return 0; + } + + private: + unsigned char _data; + }; +PUGI__NS_END +#endif + +#ifdef PUGIXML_COMPACT +namespace pugi +{ + struct xml_attribute_struct + { + xml_attribute_struct(impl::xml_memory_page* page): header(page, 0), namevalue_base(0) + { + PUGI__STATIC_ASSERT(sizeof(xml_attribute_struct) == 8); + } + + impl::compact_header header; + + uint16_t namevalue_base; + + impl::compact_string<4, 2> name; + impl::compact_string<5, 3> value; + + impl::compact_pointer prev_attribute_c; + impl::compact_pointer next_attribute; + }; + + struct xml_node_struct + { + xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(page, type - 1), namevalue_base(0) + { + PUGI__STATIC_ASSERT(sizeof(xml_node_struct) == 12); + } + + impl::compact_header header; + + uint16_t namevalue_base; + + impl::compact_string<4, 2> name; + impl::compact_string<5, 3> value; + + impl::compact_pointer_parent parent; + + impl::compact_pointer first_child; + + impl::compact_pointer prev_sibling_c; + impl::compact_pointer next_sibling; + + impl::compact_pointer first_attribute; + }; +} +#else +namespace pugi +{ + struct xml_attribute_struct + { + xml_attribute_struct(impl::xml_memory_page* page): header(reinterpret_cast(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0) + { + } + + uintptr_t header; + + char_t* name; + char_t* value; + + xml_attribute_struct* prev_attribute_c; + xml_attribute_struct* next_attribute; + }; + + struct xml_node_struct + { + xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(reinterpret_cast(page) | (type - 1)), name(0), value(0), parent(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0) + { + } + + uintptr_t header; + + char_t* name; + char_t* value; + + xml_node_struct* parent; + + xml_node_struct* first_child; + + xml_node_struct* prev_sibling_c; + xml_node_struct* next_sibling; + + xml_attribute_struct* first_attribute; + }; +} +#endif + +PUGI__NS_BEGIN + struct xml_extra_buffer + { + char_t* buffer; + xml_extra_buffer* next; + }; + + struct xml_document_struct: public xml_node_struct, public xml_allocator + { + xml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0), extra_buffers(0) + { + #ifdef PUGIXML_COMPACT + _hash = &hash; + #endif + } + + const char_t* buffer; + + xml_extra_buffer* extra_buffers; + + #ifdef PUGIXML_COMPACT + compact_hash_table hash; + #endif + }; + + template inline xml_allocator& get_allocator(const Object* object) + { + assert(object); + + return *PUGI__GETPAGE(object)->allocator; + } + + template inline xml_document_struct& get_document(const Object* object) + { + assert(object); + + return *static_cast(PUGI__GETPAGE(object)->allocator); + } +PUGI__NS_END + +// Low-level DOM operations +PUGI__NS_BEGIN + inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc) + { + xml_memory_page* page; + void* memory = alloc.allocate_object(sizeof(xml_attribute_struct), page); + if (!memory) return 0; + + return new (memory) xml_attribute_struct(page); + } + + inline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type) + { + xml_memory_page* page; + void* memory = alloc.allocate_object(sizeof(xml_node_struct), page); + if (!memory) return 0; + + return new (memory) xml_node_struct(page, type); + } + + inline void destroy_attribute(xml_attribute_struct* a, xml_allocator& alloc) + { + if (a->header & impl::xml_memory_page_name_allocated_mask) + alloc.deallocate_string(a->name); + + if (a->header & impl::xml_memory_page_value_allocated_mask) + alloc.deallocate_string(a->value); + + alloc.deallocate_memory(a, sizeof(xml_attribute_struct), PUGI__GETPAGE(a)); + } + + inline void destroy_node(xml_node_struct* n, xml_allocator& alloc) + { + if (n->header & impl::xml_memory_page_name_allocated_mask) + alloc.deallocate_string(n->name); + + if (n->header & impl::xml_memory_page_value_allocated_mask) + alloc.deallocate_string(n->value); + + for (xml_attribute_struct* attr = n->first_attribute; attr; ) + { + xml_attribute_struct* next = attr->next_attribute; + + destroy_attribute(attr, alloc); + + attr = next; + } + + for (xml_node_struct* child = n->first_child; child; ) + { + xml_node_struct* next = child->next_sibling; + + destroy_node(child, alloc); + + child = next; + } + + alloc.deallocate_memory(n, sizeof(xml_node_struct), PUGI__GETPAGE(n)); + } + + inline void append_node(xml_node_struct* child, xml_node_struct* node) + { + child->parent = node; + + xml_node_struct* head = node->first_child; + + if (head) + { + xml_node_struct* tail = head->prev_sibling_c; + + tail->next_sibling = child; + child->prev_sibling_c = tail; + head->prev_sibling_c = child; + } + else + { + node->first_child = child; + child->prev_sibling_c = child; + } + } + + inline void prepend_node(xml_node_struct* child, xml_node_struct* node) + { + child->parent = node; + + xml_node_struct* head = node->first_child; + + if (head) + { + child->prev_sibling_c = head->prev_sibling_c; + head->prev_sibling_c = child; + } + else + child->prev_sibling_c = child; + + child->next_sibling = head; + node->first_child = child; + } + + inline void insert_node_after(xml_node_struct* child, xml_node_struct* node) + { + xml_node_struct* parent = node->parent; + + child->parent = parent; + + if (node->next_sibling) + node->next_sibling->prev_sibling_c = child; + else + parent->first_child->prev_sibling_c = child; + + child->next_sibling = node->next_sibling; + child->prev_sibling_c = node; + + node->next_sibling = child; + } + + inline void insert_node_before(xml_node_struct* child, xml_node_struct* node) + { + xml_node_struct* parent = node->parent; + + child->parent = parent; + + if (node->prev_sibling_c->next_sibling) + node->prev_sibling_c->next_sibling = child; + else + parent->first_child = child; + + child->prev_sibling_c = node->prev_sibling_c; + child->next_sibling = node; + + node->prev_sibling_c = child; + } + + inline void remove_node(xml_node_struct* node) + { + xml_node_struct* parent = node->parent; + + if (node->next_sibling) + node->next_sibling->prev_sibling_c = node->prev_sibling_c; + else + parent->first_child->prev_sibling_c = node->prev_sibling_c; + + if (node->prev_sibling_c->next_sibling) + node->prev_sibling_c->next_sibling = node->next_sibling; + else + parent->first_child = node->next_sibling; + + node->parent = 0; + node->prev_sibling_c = 0; + node->next_sibling = 0; + } + + inline void append_attribute(xml_attribute_struct* attr, xml_node_struct* node) + { + xml_attribute_struct* head = node->first_attribute; + + if (head) + { + xml_attribute_struct* tail = head->prev_attribute_c; + + tail->next_attribute = attr; + attr->prev_attribute_c = tail; + head->prev_attribute_c = attr; + } + else + { + node->first_attribute = attr; + attr->prev_attribute_c = attr; + } + } + + inline void prepend_attribute(xml_attribute_struct* attr, xml_node_struct* node) + { + xml_attribute_struct* head = node->first_attribute; + + if (head) + { + attr->prev_attribute_c = head->prev_attribute_c; + head->prev_attribute_c = attr; + } + else + attr->prev_attribute_c = attr; + + attr->next_attribute = head; + node->first_attribute = attr; + } + + inline void insert_attribute_after(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node) + { + if (place->next_attribute) + place->next_attribute->prev_attribute_c = attr; + else + node->first_attribute->prev_attribute_c = attr; + + attr->next_attribute = place->next_attribute; + attr->prev_attribute_c = place; + place->next_attribute = attr; + } + + inline void insert_attribute_before(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node) + { + if (place->prev_attribute_c->next_attribute) + place->prev_attribute_c->next_attribute = attr; + else + node->first_attribute = attr; + + attr->prev_attribute_c = place->prev_attribute_c; + attr->next_attribute = place; + place->prev_attribute_c = attr; + } + + inline void remove_attribute(xml_attribute_struct* attr, xml_node_struct* node) + { + if (attr->next_attribute) + attr->next_attribute->prev_attribute_c = attr->prev_attribute_c; + else + node->first_attribute->prev_attribute_c = attr->prev_attribute_c; + + if (attr->prev_attribute_c->next_attribute) + attr->prev_attribute_c->next_attribute = attr->next_attribute; + else + node->first_attribute = attr->next_attribute; + + attr->prev_attribute_c = 0; + attr->next_attribute = 0; + } + + PUGI__FN_NO_INLINE xml_node_struct* append_new_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element) + { + if (!alloc.reserve()) return 0; + + xml_node_struct* child = allocate_node(alloc, type); + if (!child) return 0; + + append_node(child, node); + + return child; + } + + PUGI__FN_NO_INLINE xml_attribute_struct* append_new_attribute(xml_node_struct* node, xml_allocator& alloc) + { + if (!alloc.reserve()) return 0; + + xml_attribute_struct* attr = allocate_attribute(alloc); + if (!attr) return 0; + + append_attribute(attr, node); + + return attr; + } +PUGI__NS_END + +// Helper classes for code generation +PUGI__NS_BEGIN + struct opt_false + { + enum { value = 0 }; + }; + + struct opt_true + { + enum { value = 1 }; + }; +PUGI__NS_END + +// Unicode utilities +PUGI__NS_BEGIN + inline uint16_t endian_swap(uint16_t value) + { + return static_cast(((value & 0xff) << 8) | (value >> 8)); + } + + inline uint32_t endian_swap(uint32_t value) + { + return ((value & 0xff) << 24) | ((value & 0xff00) << 8) | ((value & 0xff0000) >> 8) | (value >> 24); + } + + struct utf8_counter + { + typedef size_t value_type; + + static value_type low(value_type result, uint32_t ch) + { + // U+0000..U+007F + if (ch < 0x80) return result + 1; + // U+0080..U+07FF + else if (ch < 0x800) return result + 2; + // U+0800..U+FFFF + else return result + 3; + } + + static value_type high(value_type result, uint32_t) + { + // U+10000..U+10FFFF + return result + 4; + } + }; + + struct utf8_writer + { + typedef uint8_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + // U+0000..U+007F + if (ch < 0x80) + { + *result = static_cast(ch); + return result + 1; + } + // U+0080..U+07FF + else if (ch < 0x800) + { + result[0] = static_cast(0xC0 | (ch >> 6)); + result[1] = static_cast(0x80 | (ch & 0x3F)); + return result + 2; + } + // U+0800..U+FFFF + else + { + result[0] = static_cast(0xE0 | (ch >> 12)); + result[1] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + result[2] = static_cast(0x80 | (ch & 0x3F)); + return result + 3; + } + } + + static value_type high(value_type result, uint32_t ch) + { + // U+10000..U+10FFFF + result[0] = static_cast(0xF0 | (ch >> 18)); + result[1] = static_cast(0x80 | ((ch >> 12) & 0x3F)); + result[2] = static_cast(0x80 | ((ch >> 6) & 0x3F)); + result[3] = static_cast(0x80 | (ch & 0x3F)); + return result + 4; + } + + static value_type any(value_type result, uint32_t ch) + { + return (ch < 0x10000) ? low(result, ch) : high(result, ch); + } + }; + + struct utf16_counter + { + typedef size_t value_type; + + static value_type low(value_type result, uint32_t) + { + return result + 1; + } + + static value_type high(value_type result, uint32_t) + { + return result + 2; + } + }; + + struct utf16_writer + { + typedef uint16_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + *result = static_cast(ch); + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + uint32_t msh = static_cast(ch - 0x10000) >> 10; + uint32_t lsh = static_cast(ch - 0x10000) & 0x3ff; + + result[0] = static_cast(0xD800 + msh); + result[1] = static_cast(0xDC00 + lsh); + + return result + 2; + } + + static value_type any(value_type result, uint32_t ch) + { + return (ch < 0x10000) ? low(result, ch) : high(result, ch); + } + }; + + struct utf32_counter + { + typedef size_t value_type; + + static value_type low(value_type result, uint32_t) + { + return result + 1; + } + + static value_type high(value_type result, uint32_t) + { + return result + 1; + } + }; + + struct utf32_writer + { + typedef uint32_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + *result = ch; + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + *result = ch; + + return result + 1; + } + + static value_type any(value_type result, uint32_t ch) + { + *result = ch; + + return result + 1; + } + }; + + struct latin1_writer + { + typedef uint8_t* value_type; + + static value_type low(value_type result, uint32_t ch) + { + *result = static_cast(ch > 255 ? '?' : ch); + + return result + 1; + } + + static value_type high(value_type result, uint32_t ch) + { + (void)ch; + + *result = '?'; + + return result + 1; + } + }; + + struct utf8_decoder + { + typedef uint8_t type; + + template static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits) + { + const uint8_t utf8_byte_mask = 0x3f; + + while (size) + { + uint8_t lead = *data; + + // 0xxxxxxx -> U+0000..U+007F + if (lead < 0x80) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + + // process aligned single-byte (ascii) blocks + if ((reinterpret_cast(data) & 3) == 0) + { + // round-trip through void* to silence 'cast increases required alignment of target type' warnings + while (size >= 4 && (*static_cast(static_cast(data)) & 0x80808080) == 0) + { + result = Traits::low(result, data[0]); + result = Traits::low(result, data[1]); + result = Traits::low(result, data[2]); + result = Traits::low(result, data[3]); + data += 4; + size -= 4; + } + } + } + // 110xxxxx -> U+0080..U+07FF + else if (static_cast(lead - 0xC0) < 0x20 && size >= 2 && (data[1] & 0xc0) == 0x80) + { + result = Traits::low(result, ((lead & ~0xC0) << 6) | (data[1] & utf8_byte_mask)); + data += 2; + size -= 2; + } + // 1110xxxx -> U+0800-U+FFFF + else if (static_cast(lead - 0xE0) < 0x10 && size >= 3 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80) + { + result = Traits::low(result, ((lead & ~0xE0) << 12) | ((data[1] & utf8_byte_mask) << 6) | (data[2] & utf8_byte_mask)); + data += 3; + size -= 3; + } + // 11110xxx -> U+10000..U+10FFFF + else if (static_cast(lead - 0xF0) < 0x08 && size >= 4 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80 && (data[3] & 0xc0) == 0x80) + { + result = Traits::high(result, ((lead & ~0xF0) << 18) | ((data[1] & utf8_byte_mask) << 12) | ((data[2] & utf8_byte_mask) << 6) | (data[3] & utf8_byte_mask)); + data += 4; + size -= 4; + } + // 10xxxxxx or 11111xxx -> invalid + else + { + data += 1; + size -= 1; + } + } + + return result; + } + }; + + template struct utf16_decoder + { + typedef uint16_t type; + + template static inline typename Traits::value_type process(const uint16_t* data, size_t size, typename Traits::value_type result, Traits) + { + while (size) + { + uint16_t lead = opt_swap::value ? endian_swap(*data) : *data; + + // U+0000..U+D7FF + if (lead < 0xD800) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + } + // U+E000..U+FFFF + else if (static_cast(lead - 0xE000) < 0x2000) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + } + // surrogate pair lead + else if (static_cast(lead - 0xD800) < 0x400 && size >= 2) + { + uint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1]; + + if (static_cast(next - 0xDC00) < 0x400) + { + result = Traits::high(result, 0x10000 + ((lead & 0x3ff) << 10) + (next & 0x3ff)); + data += 2; + size -= 2; + } + else + { + data += 1; + size -= 1; + } + } + else + { + data += 1; + size -= 1; + } + } + + return result; + } + }; + + template struct utf32_decoder + { + typedef uint32_t type; + + template static inline typename Traits::value_type process(const uint32_t* data, size_t size, typename Traits::value_type result, Traits) + { + while (size) + { + uint32_t lead = opt_swap::value ? endian_swap(*data) : *data; + + // U+0000..U+FFFF + if (lead < 0x10000) + { + result = Traits::low(result, lead); + data += 1; + size -= 1; + } + // U+10000..U+10FFFF + else + { + result = Traits::high(result, lead); + data += 1; + size -= 1; + } + } + + return result; + } + }; + + struct latin1_decoder + { + typedef uint8_t type; + + template static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits) + { + while (size) + { + result = Traits::low(result, *data); + data += 1; + size -= 1; + } + + return result; + } + }; + + template struct wchar_selector; + + template <> struct wchar_selector<2> + { + typedef uint16_t type; + typedef utf16_counter counter; + typedef utf16_writer writer; + typedef utf16_decoder decoder; + }; + + template <> struct wchar_selector<4> + { + typedef uint32_t type; + typedef utf32_counter counter; + typedef utf32_writer writer; + typedef utf32_decoder decoder; + }; + + typedef wchar_selector::counter wchar_counter; + typedef wchar_selector::writer wchar_writer; + + struct wchar_decoder + { + typedef wchar_t type; + + template static inline typename Traits::value_type process(const wchar_t* data, size_t size, typename Traits::value_type result, Traits traits) + { + typedef wchar_selector::decoder decoder; + + return decoder::process(reinterpret_cast(data), size, result, traits); + } + }; + +#ifdef PUGIXML_WCHAR_MODE + PUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length) + { + for (size_t i = 0; i < length; ++i) + result[i] = static_cast(endian_swap(static_cast::type>(data[i]))); + } +#endif +PUGI__NS_END + +PUGI__NS_BEGIN + enum chartype_t + { + ct_parse_pcdata = 1, // \0, &, \r, < + ct_parse_attr = 2, // \0, &, \r, ', " + ct_parse_attr_ws = 4, // \0, &, \r, ', ", \n, tab + ct_space = 8, // \r, \n, space, tab + ct_parse_cdata = 16, // \0, ], >, \r + ct_parse_comment = 32, // \0, -, >, \r + ct_symbol = 64, // Any symbol > 127, a-z, A-Z, 0-9, _, :, -, . + ct_start_symbol = 128 // Any symbol > 127, a-z, A-Z, _, : + }; + + static const unsigned char chartype_table[256] = + { + 55, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 63, 0, 0, // 0-15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31 + 8, 0, 6, 0, 0, 0, 7, 6, 0, 0, 0, 0, 0, 96, 64, 0, // 32-47 + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 0, 1, 0, 48, 0, // 48-63 + 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 64-79 + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 16, 0, 192, // 80-95 + 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 96-111 + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 0, 0, 0, // 112-127 + + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 128+ + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192 + }; + + enum chartypex_t + { + ctx_special_pcdata = 1, // Any symbol >= 0 and < 32 (except \t, \r, \n), &, <, > + ctx_special_attr = 2, // Any symbol >= 0 and < 32 (except \t), &, <, >, " + ctx_start_symbol = 4, // Any symbol > 127, a-z, A-Z, _ + ctx_digit = 8, // 0-9 + ctx_symbol = 16 // Any symbol > 127, a-z, A-Z, 0-9, _, -, . + }; + + static const unsigned char chartypex_table[256] = + { + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 2, 3, 3, // 0-15 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 16-31 + 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 16, 16, 0, // 32-47 + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 3, 0, 3, 0, // 48-63 + + 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 64-79 + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 20, // 80-95 + 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 96-111 + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, // 112-127 + + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, // 128+ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }; + +#ifdef PUGIXML_WCHAR_MODE + #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast(c) < 128 ? table[static_cast(c)] : table[128]) & (ct)) +#else + #define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast(c)] & (ct)) +#endif + + #define PUGI__IS_CHARTYPE(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartype_table) + #define PUGI__IS_CHARTYPEX(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartypex_table) + + PUGI__FN bool is_little_endian() + { + unsigned int ui = 1; + + return *reinterpret_cast(&ui) == 1; + } + + PUGI__FN xml_encoding get_wchar_encoding() + { + PUGI__STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4); + + if (sizeof(wchar_t) == 2) + return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + else + return is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + } + + PUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) + { + // look for BOM in first few bytes + if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be; + if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le; + if (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be; + if (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le; + if (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8; + + // look for <, (contents); + + PUGI__DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3]; + + return guess_buffer_encoding(d0, d1, d2, d3); + } + + PUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) + { + size_t length = size / sizeof(char_t); + + if (is_mutable) + { + out_buffer = static_cast(const_cast(contents)); + out_length = length; + } + else + { + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + if (contents) + memcpy(buffer, contents, length * sizeof(char_t)); + else + assert(length == 0); + + buffer[length] = 0; + + out_buffer = buffer; + out_length = length + 1; + } + + return true; + } + +#ifdef PUGIXML_WCHAR_MODE + PUGI__FN bool need_endian_swap_utf(xml_encoding le, xml_encoding re) + { + return (le == encoding_utf16_be && re == encoding_utf16_le) || (le == encoding_utf16_le && re == encoding_utf16_be) || + (le == encoding_utf32_be && re == encoding_utf32_le) || (le == encoding_utf32_le && re == encoding_utf32_be); + } + + PUGI__FN bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) + { + const char_t* data = static_cast(contents); + size_t length = size / sizeof(char_t); + + if (is_mutable) + { + char_t* buffer = const_cast(data); + + convert_wchar_endian_swap(buffer, data, length); + + out_buffer = buffer; + out_length = length; + } + else + { + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + convert_wchar_endian_swap(buffer, data, length); + buffer[length] = 0; + + out_buffer = buffer; + out_length = length + 1; + } + + return true; + } + + template PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D) + { + const typename D::type* data = static_cast(contents); + size_t data_length = size / sizeof(typename D::type); + + // first pass: get length in wchar_t units + size_t length = D::process(data, data_length, 0, wchar_counter()); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert utf16 input to wchar_t + wchar_writer::value_type obegin = reinterpret_cast(buffer); + wchar_writer::value_type oend = D::process(data, data_length, obegin, wchar_writer()); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) + { + // get native encoding + xml_encoding wchar_encoding = get_wchar_encoding(); + + // fast path: no conversion required + if (encoding == wchar_encoding) + return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + + // only endian-swapping is required + if (need_endian_swap_utf(encoding, wchar_encoding)) + return convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable); + + // source encoding is utf8 + if (encoding == encoding_utf8) + return convert_buffer_generic(out_buffer, out_length, contents, size, utf8_decoder()); + + // source encoding is utf16 + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()); + } + + // source encoding is utf32 + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()); + } + + // source encoding is latin1 + if (encoding == encoding_latin1) + return convert_buffer_generic(out_buffer, out_length, contents, size, latin1_decoder()); + + assert(!"Invalid encoding"); + return false; + } +#else + template PUGI__FN bool convert_buffer_generic(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, D) + { + const typename D::type* data = static_cast(contents); + size_t data_length = size / sizeof(typename D::type); + + // first pass: get length in utf8 units + size_t length = D::process(data, data_length, 0, utf8_counter()); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert utf16 input to utf8 + uint8_t* obegin = reinterpret_cast(buffer); + uint8_t* oend = D::process(data, data_length, obegin, utf8_writer()); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + PUGI__FN size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size) + { + for (size_t i = 0; i < size; ++i) + if (data[i] > 127) + return i; + + return size; + } + + PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) + { + const uint8_t* data = static_cast(contents); + size_t data_length = size; + + // get size of prefix that does not need utf8 conversion + size_t prefix_length = get_latin1_7bit_prefix_length(data, data_length); + assert(prefix_length <= data_length); + + const uint8_t* postfix = data + prefix_length; + size_t postfix_length = data_length - prefix_length; + + // if no conversion is needed, just return the original buffer + if (postfix_length == 0) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + + // first pass: get length in utf8 units + size_t length = prefix_length + latin1_decoder::process(postfix, postfix_length, 0, utf8_counter()); + + // allocate buffer of suitable length + char_t* buffer = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!buffer) return false; + + // second pass: convert latin1 input to utf8 + memcpy(buffer, data, prefix_length); + + uint8_t* obegin = reinterpret_cast(buffer); + uint8_t* oend = latin1_decoder::process(postfix, postfix_length, obegin + prefix_length, utf8_writer()); + + assert(oend == obegin + length); + *oend = 0; + + out_buffer = buffer; + out_length = length + 1; + + return true; + } + + PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) + { + // fast path: no conversion required + if (encoding == encoding_utf8) + return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); + + // source encoding is utf16 + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf16_decoder()); + } + + // source encoding is utf32 + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return (native_encoding == encoding) ? + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()) : + convert_buffer_generic(out_buffer, out_length, contents, size, utf32_decoder()); + } + + // source encoding is latin1 + if (encoding == encoding_latin1) + return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable); + + assert(!"Invalid encoding"); + return false; + } +#endif + + PUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length) + { + // get length in utf8 characters + return wchar_decoder::process(str, length, 0, utf8_counter()); + } + + PUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length) + { + // convert to utf8 + uint8_t* begin = reinterpret_cast(buffer); + uint8_t* end = wchar_decoder::process(str, length, begin, utf8_writer()); + + assert(begin + size == end); + (void)!end; + (void)!size; + } + +#ifndef PUGIXML_NO_STL + PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length) + { + // first pass: get length in utf8 characters + size_t size = as_utf8_begin(str, length); + + // allocate resulting string + std::string result; + result.resize(size); + + // second pass: convert to utf8 + if (size > 0) as_utf8_end(&result[0], size, str, length); + + return result; + } + + PUGI__FN std::basic_string as_wide_impl(const char* str, size_t size) + { + const uint8_t* data = reinterpret_cast(str); + + // first pass: get length in wchar_t units + size_t length = utf8_decoder::process(data, size, 0, wchar_counter()); + + // allocate resulting string + std::basic_string result; + result.resize(length); + + // second pass: convert to wchar_t + if (length > 0) + { + wchar_writer::value_type begin = reinterpret_cast(&result[0]); + wchar_writer::value_type end = utf8_decoder::process(data, size, begin, wchar_writer()); + + assert(begin + length == end); + (void)!end; + } + + return result; + } +#endif + + template + inline bool strcpy_insitu_allow(size_t length, const Header& header, uintptr_t header_mask, char_t* target) + { + // never reuse shared memory + if (header & xml_memory_page_contents_shared_mask) return false; + + size_t target_length = strlength(target); + + // always reuse document buffer memory if possible + if ((header & header_mask) == 0) return target_length >= length; + + // reuse heap memory if waste is not too great + const size_t reuse_threshold = 32; + + return target_length >= length && (target_length < reuse_threshold || target_length - length < target_length / 2); + } + + template + PUGI__FN bool strcpy_insitu(String& dest, Header& header, uintptr_t header_mask, const char_t* source, size_t source_length) + { + if (source_length == 0) + { + // empty string and null pointer are equivalent, so just deallocate old memory + xml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator; + + if (header & header_mask) alloc->deallocate_string(dest); + + // mark the string as not allocated + dest = 0; + header &= ~header_mask; + + return true; + } + else if (dest && strcpy_insitu_allow(source_length, header, header_mask, dest)) + { + // we can reuse old buffer, so just copy the new data (including zero terminator) + memcpy(dest, source, source_length * sizeof(char_t)); + dest[source_length] = 0; + + return true; + } + else + { + xml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator; + + if (!alloc->reserve()) return false; + + // allocate new buffer + char_t* buf = alloc->allocate_string(source_length + 1); + if (!buf) return false; + + // copy the string (including zero terminator) + memcpy(buf, source, source_length * sizeof(char_t)); + buf[source_length] = 0; + + // deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures) + if (header & header_mask) alloc->deallocate_string(dest); + + // the string is now allocated, so set the flag + dest = buf; + header |= header_mask; + + return true; + } + } + + struct gap + { + char_t* end; + size_t size; + + gap(): end(0), size(0) + { + } + + // Push new gap, move s count bytes further (skipping the gap). + // Collapse previous gap. + void push(char_t*& s, size_t count) + { + if (end) // there was a gap already; collapse it + { + // Move [old_gap_end, new_gap_start) to [old_gap_start, ...) + assert(s >= end); + memmove(end - size, end, reinterpret_cast(s) - reinterpret_cast(end)); + } + + s += count; // end of current gap + + // "merge" two gaps + end = s; + size += count; + } + + // Collapse all gaps, return past-the-end pointer + char_t* flush(char_t* s) + { + if (end) + { + // Move [old_gap_end, current_pos) to [old_gap_start, ...) + assert(s >= end); + memmove(end - size, end, reinterpret_cast(s) - reinterpret_cast(end)); + + return s - size; + } + else return s; + } + }; + + PUGI__FN char_t* strconv_escape(char_t* s, gap& g) + { + char_t* stre = s + 1; + + switch (*stre) + { + case '#': // &#... + { + unsigned int ucsc = 0; + + if (stre[1] == 'x') // &#x... (hex code) + { + stre += 2; + + char_t ch = *stre; + + if (ch == ';') return stre; + + for (;;) + { + if (static_cast(ch - '0') <= 9) + ucsc = 16 * ucsc + (ch - '0'); + else if (static_cast((ch | ' ') - 'a') <= 5) + ucsc = 16 * ucsc + ((ch | ' ') - 'a' + 10); + else if (ch == ';') + break; + else // cancel + return stre; + + ch = *++stre; + } + + ++stre; + } + else // &#... (dec code) + { + char_t ch = *++stre; + + if (ch == ';') return stre; + + for (;;) + { + if (static_cast(static_cast(ch) - '0') <= 9) + ucsc = 10 * ucsc + (ch - '0'); + else if (ch == ';') + break; + else // cancel + return stre; + + ch = *++stre; + } + + ++stre; + } + + #ifdef PUGIXML_WCHAR_MODE + s = reinterpret_cast(wchar_writer::any(reinterpret_cast(s), ucsc)); + #else + s = reinterpret_cast(utf8_writer::any(reinterpret_cast(s), ucsc)); + #endif + + g.push(s, stre - s); + return stre; + } + + case 'a': // &a + { + ++stre; + + if (*stre == 'm') // &am + { + if (*++stre == 'p' && *++stre == ';') // & + { + *s++ = '&'; + ++stre; + + g.push(s, stre - s); + return stre; + } + } + else if (*stre == 'p') // &ap + { + if (*++stre == 'o' && *++stre == 's' && *++stre == ';') // ' + { + *s++ = '\''; + ++stre; + + g.push(s, stre - s); + return stre; + } + } + break; + } + + case 'g': // &g + { + if (*++stre == 't' && *++stre == ';') // > + { + *s++ = '>'; + ++stre; + + g.push(s, stre - s); + return stre; + } + break; + } + + case 'l': // &l + { + if (*++stre == 't' && *++stre == ';') // < + { + *s++ = '<'; + ++stre; + + g.push(s, stre - s); + return stre; + } + break; + } + + case 'q': // &q + { + if (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // " + { + *s++ = '"'; + ++stre; + + g.push(s, stre - s); + return stre; + } + break; + } + + default: + break; + } + + return stre; + } + + // Parser utilities + #define PUGI__ENDSWITH(c, e) ((c) == (e) || ((c) == 0 && endch == (e))) + #define PUGI__SKIPWS() { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; } + #define PUGI__OPTSET(OPT) ( optmsk & (OPT) ) + #define PUGI__PUSHNODE(TYPE) { cursor = append_new_node(cursor, alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); } + #define PUGI__POPNODE() { cursor = cursor->parent; } + #define PUGI__SCANFOR(X) { while (*s != 0 && !(X)) ++s; } + #define PUGI__SCANWHILE(X) { while (X) ++s; } + #define PUGI__SCANWHILE_UNROLL(X) { for (;;) { char_t ss = s[0]; if (PUGI__UNLIKELY(!(X))) { break; } ss = s[1]; if (PUGI__UNLIKELY(!(X))) { s += 1; break; } ss = s[2]; if (PUGI__UNLIKELY(!(X))) { s += 2; break; } ss = s[3]; if (PUGI__UNLIKELY(!(X))) { s += 3; break; } s += 4; } } + #define PUGI__ENDSEG() { ch = *s; *s = 0; ++s; } + #define PUGI__THROW_ERROR(err, m) return error_offset = m, error_status = err, static_cast(0) + #define PUGI__CHECK_ERROR(err, m) { if (*s == 0) PUGI__THROW_ERROR(err, m); } + + PUGI__FN char_t* strconv_comment(char_t* s, char_t endch) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment)); + + if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair + { + *s++ = '\n'; // replace first one with 0x0a + + if (*s == '\n') g.push(s, 1); + } + else if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here + { + *g.flush(s) = 0; + + return s + (s[2] == '>' ? 3 : 2); + } + else if (*s == 0) + { + return 0; + } + else ++s; + } + } + + PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata)); + + if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair + { + *s++ = '\n'; // replace first one with 0x0a + + if (*s == '\n') g.push(s, 1); + } + else if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here + { + *g.flush(s) = 0; + + return s + 1; + } + else if (*s == 0) + { + return 0; + } + else ++s; + } + } + + typedef char_t* (*strconv_pcdata_t)(char_t*); + + template struct strconv_pcdata_impl + { + static char_t* parse(char_t* s) + { + gap g; + + char_t* begin = s; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_pcdata)); + + if (*s == '<') // PCDATA ends here + { + char_t* end = g.flush(s); + + if (opt_trim::value) + while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space)) + --end; + + *end = 0; + + return s + 1; + } + else if (opt_eol::value && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair + { + *s++ = '\n'; // replace first one with 0x0a + + if (*s == '\n') g.push(s, 1); + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (*s == 0) + { + char_t* end = g.flush(s); + + if (opt_trim::value) + while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space)) + --end; + + *end = 0; + + return s; + } + else ++s; + } + } + }; + + PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask) + { + PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800); + + switch (((optmask >> 4) & 3) | ((optmask >> 9) & 4)) // get bitmask for flags (eol escapes trim) + { + case 0: return strconv_pcdata_impl::parse; + case 1: return strconv_pcdata_impl::parse; + case 2: return strconv_pcdata_impl::parse; + case 3: return strconv_pcdata_impl::parse; + case 4: return strconv_pcdata_impl::parse; + case 5: return strconv_pcdata_impl::parse; + case 6: return strconv_pcdata_impl::parse; + case 7: return strconv_pcdata_impl::parse; + default: assert(false); return 0; // should not get here + } + } + + typedef char_t* (*strconv_attribute_t)(char_t*, char_t); + + template struct strconv_attribute_impl + { + static char_t* parse_wnorm(char_t* s, char_t end_quote) + { + gap g; + + // trim leading whitespaces + if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + char_t* str = s; + + do ++str; + while (PUGI__IS_CHARTYPE(*str, ct_space)); + + g.push(s, str - s); + } + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space)); + + if (*s == end_quote) + { + char_t* str = g.flush(s); + + do *str-- = 0; + while (PUGI__IS_CHARTYPE(*str, ct_space)); + + return s + 1; + } + else if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + *s++ = ' '; + + if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + char_t* str = s + 1; + while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str; + + g.push(s, str - s); + } + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + + static char_t* parse_wconv(char_t* s, char_t end_quote) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws)); + + if (*s == end_quote) + { + *g.flush(s) = 0; + + return s + 1; + } + else if (PUGI__IS_CHARTYPE(*s, ct_space)) + { + if (*s == '\r') + { + *s++ = ' '; + + if (*s == '\n') g.push(s, 1); + } + else *s++ = ' '; + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + + static char_t* parse_eol(char_t* s, char_t end_quote) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); + + if (*s == end_quote) + { + *g.flush(s) = 0; + + return s + 1; + } + else if (*s == '\r') + { + *s++ = '\n'; + + if (*s == '\n') g.push(s, 1); + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + + static char_t* parse_simple(char_t* s, char_t end_quote) + { + gap g; + + while (true) + { + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); + + if (*s == end_quote) + { + *g.flush(s) = 0; + + return s + 1; + } + else if (opt_escape::value && *s == '&') + { + s = strconv_escape(s, g); + } + else if (!*s) + { + return 0; + } + else ++s; + } + } + }; + + PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask) + { + PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80); + + switch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes) + { + case 0: return strconv_attribute_impl::parse_simple; + case 1: return strconv_attribute_impl::parse_simple; + case 2: return strconv_attribute_impl::parse_eol; + case 3: return strconv_attribute_impl::parse_eol; + case 4: return strconv_attribute_impl::parse_wconv; + case 5: return strconv_attribute_impl::parse_wconv; + case 6: return strconv_attribute_impl::parse_wconv; + case 7: return strconv_attribute_impl::parse_wconv; + case 8: return strconv_attribute_impl::parse_wnorm; + case 9: return strconv_attribute_impl::parse_wnorm; + case 10: return strconv_attribute_impl::parse_wnorm; + case 11: return strconv_attribute_impl::parse_wnorm; + case 12: return strconv_attribute_impl::parse_wnorm; + case 13: return strconv_attribute_impl::parse_wnorm; + case 14: return strconv_attribute_impl::parse_wnorm; + case 15: return strconv_attribute_impl::parse_wnorm; + default: assert(false); return 0; // should not get here + } + } + + inline xml_parse_result make_parse_result(xml_parse_status status, ptrdiff_t offset = 0) + { + xml_parse_result result; + result.status = status; + result.offset = offset; + + return result; + } + + struct xml_parser + { + xml_allocator alloc; + xml_allocator* alloc_state; + char_t* error_offset; + xml_parse_status error_status; + + xml_parser(xml_allocator* alloc_): alloc(*alloc_), alloc_state(alloc_), error_offset(0), error_status(status_ok) + { + } + + ~xml_parser() + { + *alloc_state = alloc; + } + + // DOCTYPE consists of nested sections of the following possible types: + // , , "...", '...' + // + // + // First group can not contain nested groups + // Second group can contain nested groups of the same type + // Third group can contain all other groups + char_t* parse_doctype_primitive(char_t* s) + { + if (*s == '"' || *s == '\'') + { + // quoted string + char_t ch = *s++; + PUGI__SCANFOR(*s == ch); + if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s); + + s++; + } + else if (s[0] == '<' && s[1] == '?') + { + // + s += 2; + PUGI__SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype + if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s); + + s += 2; + } + else if (s[0] == '<' && s[1] == '!' && s[2] == '-' && s[3] == '-') + { + s += 4; + PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype + if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s); + + s += 3; + } + else PUGI__THROW_ERROR(status_bad_doctype, s); + + return s; + } + + char_t* parse_doctype_ignore(char_t* s) + { + size_t depth = 0; + + assert(s[0] == '<' && s[1] == '!' && s[2] == '['); + s += 3; + + while (*s) + { + if (s[0] == '<' && s[1] == '!' && s[2] == '[') + { + // nested ignore section + s += 3; + depth++; + } + else if (s[0] == ']' && s[1] == ']' && s[2] == '>') + { + // ignore section end + s += 3; + + if (depth == 0) + return s; + + depth--; + } + else s++; + } + + PUGI__THROW_ERROR(status_bad_doctype, s); + } + + char_t* parse_doctype_group(char_t* s, char_t endch) + { + size_t depth = 0; + + assert((s[0] == '<' || s[0] == 0) && s[1] == '!'); + s += 2; + + while (*s) + { + if (s[0] == '<' && s[1] == '!' && s[2] != '-') + { + if (s[2] == '[') + { + // ignore + s = parse_doctype_ignore(s); + if (!s) return s; + } + else + { + // some control group + s += 2; + depth++; + } + } + else if (s[0] == '<' || s[0] == '"' || s[0] == '\'') + { + // unknown tag (forbidden), or some primitive group + s = parse_doctype_primitive(s); + if (!s) return s; + } + else if (*s == '>') + { + if (depth == 0) + return s; + + depth--; + s++; + } + else s++; + } + + if (depth != 0 || endch != '>') PUGI__THROW_ERROR(status_bad_doctype, s); + + return s; + } + + char_t* parse_exclamation(char_t* s, xml_node_struct* cursor, unsigned int optmsk, char_t endch) + { + // parse node contents, starting with exclamation mark + ++s; + + if (*s == '-') // 'value = s; // Save the offset. + } + + if (PUGI__OPTSET(parse_eol) && PUGI__OPTSET(parse_comments)) + { + s = strconv_comment(s, endch); + + if (!s) PUGI__THROW_ERROR(status_bad_comment, cursor->value); + } + else + { + // Scan for terminating '-->'. + PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')); + PUGI__CHECK_ERROR(status_bad_comment, s); + + if (PUGI__OPTSET(parse_comments)) + *s = 0; // Zero-terminate this segment at the first terminating '-'. + + s += (s[2] == '>' ? 3 : 2); // Step over the '\0->'. + } + } + else PUGI__THROW_ERROR(status_bad_comment, s); + } + else if (*s == '[') + { + // 'value = s; // Save the offset. + + if (PUGI__OPTSET(parse_eol)) + { + s = strconv_cdata(s, endch); + + if (!s) PUGI__THROW_ERROR(status_bad_cdata, cursor->value); + } + else + { + // Scan for terminating ']]>'. + PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')); + PUGI__CHECK_ERROR(status_bad_cdata, s); + + *s++ = 0; // Zero-terminate this segment. + } + } + else // Flagged for discard, but we still have to scan for the terminator. + { + // Scan for terminating ']]>'. + PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')); + PUGI__CHECK_ERROR(status_bad_cdata, s); + + ++s; + } + + s += (s[1] == '>' ? 2 : 1); // Step over the last ']>'. + } + else PUGI__THROW_ERROR(status_bad_cdata, s); + } + else if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && PUGI__ENDSWITH(s[6], 'E')) + { + s -= 2; + + if (cursor->parent) PUGI__THROW_ERROR(status_bad_doctype, s); + + char_t* mark = s + 9; + + s = parse_doctype_group(s, endch); + if (!s) return s; + + assert((*s == 0 && endch == '>') || *s == '>'); + if (*s) *s++ = 0; + + if (PUGI__OPTSET(parse_doctype)) + { + while (PUGI__IS_CHARTYPE(*mark, ct_space)) ++mark; + + PUGI__PUSHNODE(node_doctype); + + cursor->value = mark; + } + } + else if (*s == 0 && endch == '-') PUGI__THROW_ERROR(status_bad_comment, s); + else if (*s == 0 && endch == '[') PUGI__THROW_ERROR(status_bad_cdata, s); + else PUGI__THROW_ERROR(status_unrecognized_tag, s); + + return s; + } + + char_t* parse_question(char_t* s, xml_node_struct*& ref_cursor, unsigned int optmsk, char_t endch) + { + // load into registers + xml_node_struct* cursor = ref_cursor; + char_t ch = 0; + + // parse node contents, starting with question mark + ++s; + + // read PI target + char_t* target = s; + + if (!PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_pi, s); + + PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol)); + PUGI__CHECK_ERROR(status_bad_pi, s); + + // determine node type; stricmp / strcasecmp is not portable + bool declaration = (target[0] | ' ') == 'x' && (target[1] | ' ') == 'm' && (target[2] | ' ') == 'l' && target + 3 == s; + + if (declaration ? PUGI__OPTSET(parse_declaration) : PUGI__OPTSET(parse_pi)) + { + if (declaration) + { + // disallow non top-level declarations + if (cursor->parent) PUGI__THROW_ERROR(status_bad_pi, s); + + PUGI__PUSHNODE(node_declaration); + } + else + { + PUGI__PUSHNODE(node_pi); + } + + cursor->name = target; + + PUGI__ENDSEG(); + + // parse value/attributes + if (ch == '?') + { + // empty node + if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_pi, s); + s += (*s == '>'); + + PUGI__POPNODE(); + } + else if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + PUGI__SKIPWS(); + + // scan for tag end + char_t* value = s; + + PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>')); + PUGI__CHECK_ERROR(status_bad_pi, s); + + if (declaration) + { + // replace ending ? with / so that 'element' terminates properly + *s = '/'; + + // we exit from this function with cursor at node_declaration, which is a signal to parse() to go to LOC_ATTRIBUTES + s = value; + } + else + { + // store value and step over > + cursor->value = value; + + PUGI__POPNODE(); + + PUGI__ENDSEG(); + + s += (*s == '>'); + } + } + else PUGI__THROW_ERROR(status_bad_pi, s); + } + else + { + // scan for tag end + PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>')); + PUGI__CHECK_ERROR(status_bad_pi, s); + + s += (s[1] == '>' ? 2 : 1); + } + + // store from registers + ref_cursor = cursor; + + return s; + } + + char_t* parse_tree(char_t* s, xml_node_struct* root, unsigned int optmsk, char_t endch) + { + strconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk); + strconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk); + + char_t ch = 0; + xml_node_struct* cursor = root; + char_t* mark = s; + + while (*s != 0) + { + if (*s == '<') + { + ++s; + + LOC_TAG: + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // '<#...' + { + PUGI__PUSHNODE(node_element); // Append a new node to the tree. + + cursor->name = s; + + PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator. + PUGI__ENDSEG(); // Save char in 'ch', terminate & step over. + + if (ch == '>') + { + // end of tag + } + else if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + LOC_ATTRIBUTES: + while (true) + { + PUGI__SKIPWS(); // Eat any whitespace. + + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #... + { + xml_attribute_struct* a = append_new_attribute(cursor, alloc); // Make space for this attribute. + if (!a) PUGI__THROW_ERROR(status_out_of_memory, s); + + a->name = s; // Save the offset. + + PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator. + PUGI__ENDSEG(); // Save char in 'ch', terminate & step over. + + if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + PUGI__SKIPWS(); // Eat any whitespace. + + ch = *s; + ++s; + } + + if (ch == '=') // '<... #=...' + { + PUGI__SKIPWS(); // Eat any whitespace. + + if (*s == '"' || *s == '\'') // '<... #="...' + { + ch = *s; // Save quote char to avoid breaking on "''" -or- '""'. + ++s; // Step over the quote. + a->value = s; // Save the offset. + + s = strconv_attribute(s, ch); + + if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value); + + // After this line the loop continues from the start; + // Whitespaces, / and > are ok, symbols and EOF are wrong, + // everything else will be detected + if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_attribute, s); + } + else PUGI__THROW_ERROR(status_bad_attribute, s); + } + else PUGI__THROW_ERROR(status_bad_attribute, s); + } + else if (*s == '/') + { + ++s; + + if (*s == '>') + { + PUGI__POPNODE(); + s++; + break; + } + else if (*s == 0 && endch == '>') + { + PUGI__POPNODE(); + break; + } + else PUGI__THROW_ERROR(status_bad_start_element, s); + } + else if (*s == '>') + { + ++s; + + break; + } + else if (*s == 0 && endch == '>') + { + break; + } + else PUGI__THROW_ERROR(status_bad_start_element, s); + } + + // !!! + } + else if (ch == '/') // '<#.../' + { + if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_start_element, s); + + PUGI__POPNODE(); // Pop. + + s += (*s == '>'); + } + else if (ch == 0) + { + // we stepped over null terminator, backtrack & handle closing tag + --s; + + if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s); + } + else PUGI__THROW_ERROR(status_bad_start_element, s); + } + else if (*s == '/') + { + ++s; + + char_t* name = cursor->name; + if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s); + + while (PUGI__IS_CHARTYPE(*s, ct_symbol)) + { + if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s); + } + + if (*name) + { + if (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s); + else PUGI__THROW_ERROR(status_end_element_mismatch, s); + } + + PUGI__POPNODE(); // Pop. + + PUGI__SKIPWS(); + + if (*s == 0) + { + if (endch != '>') PUGI__THROW_ERROR(status_bad_end_element, s); + } + else + { + if (*s != '>') PUGI__THROW_ERROR(status_bad_end_element, s); + ++s; + } + } + else if (*s == '?') // 'first_child) continue; + } + } + + if (!PUGI__OPTSET(parse_trim_pcdata)) + s = mark; + + if (cursor->parent || PUGI__OPTSET(parse_fragment)) + { + PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree. + cursor->value = s; // Save the offset. + + s = strconv_pcdata(s); + + PUGI__POPNODE(); // Pop since this is a standalone. + + if (!*s) break; + } + else + { + PUGI__SCANFOR(*s == '<'); // '...<' + if (!*s) break; + + ++s; + } + + // We're after '<' + goto LOC_TAG; + } + } + + // check that last tag is closed + if (cursor != root) PUGI__THROW_ERROR(status_end_element_mismatch, s); + + return s; + } + + #ifdef PUGIXML_WCHAR_MODE + static char_t* parse_skip_bom(char_t* s) + { + unsigned int bom = 0xfeff; + return (s[0] == static_cast(bom)) ? s + 1 : s; + } + #else + static char_t* parse_skip_bom(char_t* s) + { + return (s[0] == '\xef' && s[1] == '\xbb' && s[2] == '\xbf') ? s + 3 : s; + } + #endif + + static bool has_element_node_siblings(xml_node_struct* node) + { + while (node) + { + if (PUGI__NODETYPE(node) == node_element) return true; + + node = node->next_sibling; + } + + return false; + } + + static xml_parse_result parse(char_t* buffer, size_t length, xml_document_struct* xmldoc, xml_node_struct* root, unsigned int optmsk) + { + // early-out for empty documents + if (length == 0) + return make_parse_result(PUGI__OPTSET(parse_fragment) ? status_ok : status_no_document_element); + + // get last child of the root before parsing + xml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c + 0 : 0; + + // create parser on stack + xml_parser parser(static_cast(xmldoc)); + + // save last character and make buffer zero-terminated (speeds up parsing) + char_t endch = buffer[length - 1]; + buffer[length - 1] = 0; + + // skip BOM to make sure it does not end up as part of parse output + char_t* buffer_data = parse_skip_bom(buffer); + + // perform actual parsing + parser.parse_tree(buffer_data, root, optmsk, endch); + + xml_parse_result result = make_parse_result(parser.error_status, parser.error_offset ? parser.error_offset - buffer : 0); + assert(result.offset >= 0 && static_cast(result.offset) <= length); + + if (result) + { + // since we removed last character, we have to handle the only possible false positive (stray <) + if (endch == '<') + return make_parse_result(status_unrecognized_tag, length - 1); + + // check if there are any element nodes parsed + xml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling + 0 : root->first_child+ 0; + + if (!PUGI__OPTSET(parse_fragment) && !has_element_node_siblings(first_root_child_parsed)) + return make_parse_result(status_no_document_element, length - 1); + } + else + { + // roll back offset if it occurs on a null terminator in the source buffer + if (result.offset > 0 && static_cast(result.offset) == length - 1 && endch == 0) + result.offset--; + } + + return result; + } + }; + + // Output facilities + PUGI__FN xml_encoding get_write_native_encoding() + { + #ifdef PUGIXML_WCHAR_MODE + return get_wchar_encoding(); + #else + return encoding_utf8; + #endif + } + + PUGI__FN xml_encoding get_write_encoding(xml_encoding encoding) + { + // replace wchar encoding with utf implementation + if (encoding == encoding_wchar) return get_wchar_encoding(); + + // replace utf16 encoding with utf16 with specific endianness + if (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + // replace utf32 encoding with utf32 with specific endianness + if (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + // only do autodetection if no explicit encoding is requested + if (encoding != encoding_auto) return encoding; + + // assume utf8 encoding + return encoding_utf8; + } + + template PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T) + { + PUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type)); + + typename T::value_type end = D::process(reinterpret_cast(data), length, dest, T()); + + return static_cast(end - dest) * sizeof(*dest); + } + + template PUGI__FN size_t convert_buffer_output_generic(typename T::value_type dest, const char_t* data, size_t length, D, T, bool opt_swap) + { + PUGI__STATIC_ASSERT(sizeof(char_t) == sizeof(typename D::type)); + + typename T::value_type end = D::process(reinterpret_cast(data), length, dest, T()); + + if (opt_swap) + { + for (typename T::value_type i = dest; i != end; ++i) + *i = endian_swap(*i); + } + + return static_cast(end - dest) * sizeof(*dest); + } + +#ifdef PUGIXML_WCHAR_MODE + PUGI__FN size_t get_valid_length(const char_t* data, size_t length) + { + if (length < 1) return 0; + + // discard last character if it's the lead of a surrogate pair + return (sizeof(wchar_t) == 2 && static_cast(static_cast(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length; + } + + PUGI__FN size_t convert_buffer_output(char_t* r_char, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding) + { + // only endian-swapping is required + if (need_endian_swap_utf(encoding, get_wchar_encoding())) + { + convert_wchar_endian_swap(r_char, data, length); + + return length * sizeof(char_t); + } + + // convert to utf8 + if (encoding == encoding_utf8) + return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), utf8_writer()); + + // convert to utf16 + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return convert_buffer_output_generic(r_u16, data, length, wchar_decoder(), utf16_writer(), native_encoding != encoding); + } + + // convert to utf32 + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return convert_buffer_output_generic(r_u32, data, length, wchar_decoder(), utf32_writer(), native_encoding != encoding); + } + + // convert to latin1 + if (encoding == encoding_latin1) + return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), latin1_writer()); + + assert(!"Invalid encoding"); + return 0; + } +#else + PUGI__FN size_t get_valid_length(const char_t* data, size_t length) + { + if (length < 5) return 0; + + for (size_t i = 1; i <= 4; ++i) + { + uint8_t ch = static_cast(data[length - i]); + + // either a standalone character or a leading one + if ((ch & 0xc0) != 0x80) return length - i; + } + + // there are four non-leading characters at the end, sequence tail is broken so might as well process the whole chunk + return length; + } + + PUGI__FN size_t convert_buffer_output(char_t* /* r_char */, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding) + { + if (encoding == encoding_utf16_be || encoding == encoding_utf16_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be; + + return convert_buffer_output_generic(r_u16, data, length, utf8_decoder(), utf16_writer(), native_encoding != encoding); + } + + if (encoding == encoding_utf32_be || encoding == encoding_utf32_le) + { + xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be; + + return convert_buffer_output_generic(r_u32, data, length, utf8_decoder(), utf32_writer(), native_encoding != encoding); + } + + if (encoding == encoding_latin1) + return convert_buffer_output_generic(r_u8, data, length, utf8_decoder(), latin1_writer()); + + assert(!"Invalid encoding"); + return 0; + } +#endif + + class xml_buffered_writer + { + xml_buffered_writer(const xml_buffered_writer&); + xml_buffered_writer& operator=(const xml_buffered_writer&); + + public: + xml_buffered_writer(xml_writer& writer_, xml_encoding user_encoding): writer(writer_), bufsize(0), encoding(get_write_encoding(user_encoding)) + { + PUGI__STATIC_ASSERT(bufcapacity >= 8); + } + + size_t flush() + { + flush(buffer, bufsize); + bufsize = 0; + return 0; + } + + void flush(const char_t* data, size_t size) + { + if (size == 0) return; + + // fast path, just write data + if (encoding == get_write_native_encoding()) + writer.write(data, size * sizeof(char_t)); + else + { + // convert chunk + size_t result = convert_buffer_output(scratch.data_char, scratch.data_u8, scratch.data_u16, scratch.data_u32, data, size, encoding); + assert(result <= sizeof(scratch)); + + // write data + writer.write(scratch.data_u8, result); + } + } + + void write_direct(const char_t* data, size_t length) + { + // flush the remaining buffer contents + flush(); + + // handle large chunks + if (length > bufcapacity) + { + if (encoding == get_write_native_encoding()) + { + // fast path, can just write data chunk + writer.write(data, length * sizeof(char_t)); + return; + } + + // need to convert in suitable chunks + while (length > bufcapacity) + { + // get chunk size by selecting such number of characters that are guaranteed to fit into scratch buffer + // and form a complete codepoint sequence (i.e. discard start of last codepoint if necessary) + size_t chunk_size = get_valid_length(data, bufcapacity); + assert(chunk_size); + + // convert chunk and write + flush(data, chunk_size); + + // iterate + data += chunk_size; + length -= chunk_size; + } + + // small tail is copied below + bufsize = 0; + } + + memcpy(buffer + bufsize, data, length * sizeof(char_t)); + bufsize += length; + } + + void write_buffer(const char_t* data, size_t length) + { + size_t offset = bufsize; + + if (offset + length <= bufcapacity) + { + memcpy(buffer + offset, data, length * sizeof(char_t)); + bufsize = offset + length; + } + else + { + write_direct(data, length); + } + } + + void write_string(const char_t* data) + { + // write the part of the string that fits in the buffer + size_t offset = bufsize; + + while (*data && offset < bufcapacity) + buffer[offset++] = *data++; + + // write the rest + if (offset < bufcapacity) + { + bufsize = offset; + } + else + { + // backtrack a bit if we have split the codepoint + size_t length = offset - bufsize; + size_t extra = length - get_valid_length(data - length, length); + + bufsize = offset - extra; + + write_direct(data - extra, strlength(data) + extra); + } + } + + void write(char_t d0) + { + size_t offset = bufsize; + if (offset > bufcapacity - 1) offset = flush(); + + buffer[offset + 0] = d0; + bufsize = offset + 1; + } + + void write(char_t d0, char_t d1) + { + size_t offset = bufsize; + if (offset > bufcapacity - 2) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + bufsize = offset + 2; + } + + void write(char_t d0, char_t d1, char_t d2) + { + size_t offset = bufsize; + if (offset > bufcapacity - 3) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + bufsize = offset + 3; + } + + void write(char_t d0, char_t d1, char_t d2, char_t d3) + { + size_t offset = bufsize; + if (offset > bufcapacity - 4) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + buffer[offset + 3] = d3; + bufsize = offset + 4; + } + + void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4) + { + size_t offset = bufsize; + if (offset > bufcapacity - 5) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + buffer[offset + 3] = d3; + buffer[offset + 4] = d4; + bufsize = offset + 5; + } + + void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5) + { + size_t offset = bufsize; + if (offset > bufcapacity - 6) offset = flush(); + + buffer[offset + 0] = d0; + buffer[offset + 1] = d1; + buffer[offset + 2] = d2; + buffer[offset + 3] = d3; + buffer[offset + 4] = d4; + buffer[offset + 5] = d5; + bufsize = offset + 6; + } + + // utf8 maximum expansion: x4 (-> utf32) + // utf16 maximum expansion: x2 (-> utf32) + // utf32 maximum expansion: x1 + enum + { + bufcapacitybytes = + #ifdef PUGIXML_MEMORY_OUTPUT_STACK + PUGIXML_MEMORY_OUTPUT_STACK + #else + 10240 + #endif + , + bufcapacity = bufcapacitybytes / (sizeof(char_t) + 4) + }; + + char_t buffer[bufcapacity]; + + union + { + uint8_t data_u8[4 * bufcapacity]; + uint16_t data_u16[2 * bufcapacity]; + uint32_t data_u32[bufcapacity]; + char_t data_char[bufcapacity]; + } scratch; + + xml_writer& writer; + size_t bufsize; + xml_encoding encoding; + }; + + PUGI__FN void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type) + { + while (*s) + { + const char_t* prev = s; + + // While *s is a usual symbol + PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type)); + + writer.write_buffer(prev, static_cast(s - prev)); + + switch (*s) + { + case 0: break; + case '&': + writer.write('&', 'a', 'm', 'p', ';'); + ++s; + break; + case '<': + writer.write('&', 'l', 't', ';'); + ++s; + break; + case '>': + writer.write('&', 'g', 't', ';'); + ++s; + break; + case '"': + writer.write('&', 'q', 'u', 'o', 't', ';'); + ++s; + break; + default: // s is not a usual symbol + { + unsigned int ch = static_cast(*s++); + assert(ch < 32); + + writer.write('&', '#', static_cast((ch / 10) + '0'), static_cast((ch % 10) + '0'), ';'); + } + } + } + } + + PUGI__FN void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags) + { + if (flags & format_no_escapes) + writer.write_string(s); + else + text_output_escaped(writer, s, type); + } + + PUGI__FN void text_output_cdata(xml_buffered_writer& writer, const char_t* s) + { + do + { + writer.write('<', '!', '[', 'C', 'D'); + writer.write('A', 'T', 'A', '['); + + const char_t* prev = s; + + // look for ]]> sequence - we can't output it as is since it terminates CDATA + while (*s && !(s[0] == ']' && s[1] == ']' && s[2] == '>')) ++s; + + // skip ]] if we stopped at ]]>, > will go to the next CDATA section + if (*s) s += 2; + + writer.write_buffer(prev, static_cast(s - prev)); + + writer.write(']', ']', '>'); + } + while (*s); + } + + PUGI__FN void text_output_indent(xml_buffered_writer& writer, const char_t* indent, size_t indent_length, unsigned int depth) + { + switch (indent_length) + { + case 1: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0]); + break; + } + + case 2: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0], indent[1]); + break; + } + + case 3: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0], indent[1], indent[2]); + break; + } + + case 4: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write(indent[0], indent[1], indent[2], indent[3]); + break; + } + + default: + { + for (unsigned int i = 0; i < depth; ++i) + writer.write_buffer(indent, indent_length); + } + } + } + + PUGI__FN void node_output_comment(xml_buffered_writer& writer, const char_t* s) + { + writer.write('<', '!', '-', '-'); + + while (*s) + { + const char_t* prev = s; + + // look for -\0 or -- sequence - we can't output it since -- is illegal in comment body + while (*s && !(s[0] == '-' && (s[1] == '-' || s[1] == 0))) ++s; + + writer.write_buffer(prev, static_cast(s - prev)); + + if (*s) + { + assert(*s == '-'); + + writer.write('-', ' '); + ++s; + } + } + + writer.write('-', '-', '>'); + } + + PUGI__FN void node_output_pi_value(xml_buffered_writer& writer, const char_t* s) + { + while (*s) + { + const char_t* prev = s; + + // look for ?> sequence - we can't output it since ?> terminates PI + while (*s && !(s[0] == '?' && s[1] == '>')) ++s; + + writer.write_buffer(prev, static_cast(s - prev)); + + if (*s) + { + assert(s[0] == '?' && s[1] == '>'); + + writer.write('?', ' ', '>'); + s += 2; + } + } + } + + PUGI__FN void node_output_attributes(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + + for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute) + { + if ((flags & (format_indent_attributes | format_raw)) == format_indent_attributes) + { + writer.write('\n'); + + text_output_indent(writer, indent, indent_length, depth + 1); + } + else + { + writer.write(' '); + } + + writer.write_string(a->name ? a->name + 0 : default_name); + writer.write('=', '"'); + + if (a->value) + text_output(writer, a->value, ctx_special_attr, flags); + + writer.write('"'); + } + } + + PUGI__FN bool node_output_start(xml_buffered_writer& writer, xml_node_struct* node, const char_t* indent, size_t indent_length, unsigned int flags, unsigned int depth) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + const char_t* name = node->name ? node->name + 0 : default_name; + + writer.write('<'); + writer.write_string(name); + + if (node->first_attribute) + node_output_attributes(writer, node, indent, indent_length, flags, depth); + + if (!node->first_child) + { + writer.write(' ', '/', '>'); + + return false; + } + else + { + writer.write('>'); + + return true; + } + } + + PUGI__FN void node_output_end(xml_buffered_writer& writer, xml_node_struct* node) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + const char_t* name = node->name ? node->name + 0 : default_name; + + writer.write('<', '/'); + writer.write_string(name); + writer.write('>'); + } + + PUGI__FN void node_output_simple(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags) + { + const char_t* default_name = PUGIXML_TEXT(":anonymous"); + + switch (PUGI__NODETYPE(node)) + { + case node_pcdata: + text_output(writer, node->value ? node->value + 0 : PUGIXML_TEXT(""), ctx_special_pcdata, flags); + break; + + case node_cdata: + text_output_cdata(writer, node->value ? node->value + 0 : PUGIXML_TEXT("")); + break; + + case node_comment: + node_output_comment(writer, node->value ? node->value + 0 : PUGIXML_TEXT("")); + break; + + case node_pi: + writer.write('<', '?'); + writer.write_string(node->name ? node->name + 0 : default_name); + + if (node->value) + { + writer.write(' '); + node_output_pi_value(writer, node->value); + } + + writer.write('?', '>'); + break; + + case node_declaration: + writer.write('<', '?'); + writer.write_string(node->name ? node->name + 0 : default_name); + node_output_attributes(writer, node, PUGIXML_TEXT(""), 0, flags | format_raw, 0); + writer.write('?', '>'); + break; + + case node_doctype: + writer.write('<', '!', 'D', 'O', 'C'); + writer.write('T', 'Y', 'P', 'E'); + + if (node->value) + { + writer.write(' '); + writer.write_string(node->value); + } + + writer.write('>'); + break; + + default: + assert(!"Invalid node type"); + } + } + + enum indent_flags_t + { + indent_newline = 1, + indent_indent = 2 + }; + + PUGI__FN void node_output(xml_buffered_writer& writer, xml_node_struct* root, const char_t* indent, unsigned int flags, unsigned int depth) + { + size_t indent_length = ((flags & (format_indent | format_indent_attributes)) && (flags & format_raw) == 0) ? strlength(indent) : 0; + unsigned int indent_flags = indent_indent; + + xml_node_struct* node = root; + + do + { + assert(node); + + // begin writing current node + if (PUGI__NODETYPE(node) == node_pcdata || PUGI__NODETYPE(node) == node_cdata) + { + node_output_simple(writer, node, flags); + + indent_flags = 0; + } + else + { + if ((indent_flags & indent_newline) && (flags & format_raw) == 0) + writer.write('\n'); + + if ((indent_flags & indent_indent) && indent_length) + text_output_indent(writer, indent, indent_length, depth); + + if (PUGI__NODETYPE(node) == node_element) + { + indent_flags = indent_newline | indent_indent; + + if (node_output_start(writer, node, indent, indent_length, flags, depth)) + { + node = node->first_child; + depth++; + continue; + } + } + else if (PUGI__NODETYPE(node) == node_document) + { + indent_flags = indent_indent; + + if (node->first_child) + { + node = node->first_child; + continue; + } + } + else + { + node_output_simple(writer, node, flags); + + indent_flags = indent_newline | indent_indent; + } + } + + // continue to the next node + while (node != root) + { + if (node->next_sibling) + { + node = node->next_sibling; + break; + } + + node = node->parent; + + // write closing node + if (PUGI__NODETYPE(node) == node_element) + { + depth--; + + if ((indent_flags & indent_newline) && (flags & format_raw) == 0) + writer.write('\n'); + + if ((indent_flags & indent_indent) && indent_length) + text_output_indent(writer, indent, indent_length, depth); + + node_output_end(writer, node); + + indent_flags = indent_newline | indent_indent; + } + } + } + while (node != root); + + if ((indent_flags & indent_newline) && (flags & format_raw) == 0) + writer.write('\n'); + } + + PUGI__FN bool has_declaration(xml_node_struct* node) + { + for (xml_node_struct* child = node->first_child; child; child = child->next_sibling) + { + xml_node_type type = PUGI__NODETYPE(child); + + if (type == node_declaration) return true; + if (type == node_element) return false; + } + + return false; + } + + PUGI__FN bool is_attribute_of(xml_attribute_struct* attr, xml_node_struct* node) + { + for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute) + if (a == attr) + return true; + + return false; + } + + PUGI__FN bool allow_insert_attribute(xml_node_type parent) + { + return parent == node_element || parent == node_declaration; + } + + PUGI__FN bool allow_insert_child(xml_node_type parent, xml_node_type child) + { + if (parent != node_document && parent != node_element) return false; + if (child == node_document || child == node_null) return false; + if (parent != node_document && (child == node_declaration || child == node_doctype)) return false; + + return true; + } + + PUGI__FN bool allow_move(xml_node parent, xml_node child) + { + // check that child can be a child of parent + if (!allow_insert_child(parent.type(), child.type())) + return false; + + // check that node is not moved between documents + if (parent.root() != child.root()) + return false; + + // check that new parent is not in the child subtree + xml_node cur = parent; + + while (cur) + { + if (cur == child) + return false; + + cur = cur.parent(); + } + + return true; + } + + template + PUGI__FN void node_copy_string(String& dest, Header& header, uintptr_t header_mask, char_t* source, Header& source_header, xml_allocator* alloc) + { + assert(!dest && (header & header_mask) == 0); + + if (source) + { + if (alloc && (source_header & header_mask) == 0) + { + dest = source; + + // since strcpy_insitu can reuse document buffer memory we need to mark both source and dest as shared + header |= xml_memory_page_contents_shared_mask; + source_header |= xml_memory_page_contents_shared_mask; + } + else + strcpy_insitu(dest, header, header_mask, source, strlength(source)); + } + } + + PUGI__FN void node_copy_contents(xml_node_struct* dn, xml_node_struct* sn, xml_allocator* shared_alloc) + { + node_copy_string(dn->name, dn->header, xml_memory_page_name_allocated_mask, sn->name, sn->header, shared_alloc); + node_copy_string(dn->value, dn->header, xml_memory_page_value_allocated_mask, sn->value, sn->header, shared_alloc); + + for (xml_attribute_struct* sa = sn->first_attribute; sa; sa = sa->next_attribute) + { + xml_attribute_struct* da = append_new_attribute(dn, get_allocator(dn)); + + if (da) + { + node_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc); + node_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc); + } + } + } + + PUGI__FN void node_copy_tree(xml_node_struct* dn, xml_node_struct* sn) + { + xml_allocator& alloc = get_allocator(dn); + xml_allocator* shared_alloc = (&alloc == &get_allocator(sn)) ? &alloc : 0; + + node_copy_contents(dn, sn, shared_alloc); + + xml_node_struct* dit = dn; + xml_node_struct* sit = sn->first_child; + + while (sit && sit != sn) + { + if (sit != dn) + { + xml_node_struct* copy = append_new_node(dit, alloc, PUGI__NODETYPE(sit)); + + if (copy) + { + node_copy_contents(copy, sit, shared_alloc); + + if (sit->first_child) + { + dit = copy; + sit = sit->first_child; + continue; + } + } + } + + // continue to the next node + do + { + if (sit->next_sibling) + { + sit = sit->next_sibling; + break; + } + + sit = sit->parent; + dit = dit->parent; + } + while (sit != sn); + } + } + + PUGI__FN void node_copy_attribute(xml_attribute_struct* da, xml_attribute_struct* sa) + { + xml_allocator& alloc = get_allocator(da); + xml_allocator* shared_alloc = (&alloc == &get_allocator(sa)) ? &alloc : 0; + + node_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc); + node_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc); + } + + inline bool is_text_node(xml_node_struct* node) + { + xml_node_type type = PUGI__NODETYPE(node); + + return type == node_pcdata || type == node_cdata; + } + + // get value with conversion functions + template U string_to_integer(const char_t* value, U minneg, U maxpos) + { + U result = 0; + const char_t* s = value; + + while (PUGI__IS_CHARTYPE(*s, ct_space)) + s++; + + bool negative = (*s == '-'); + + s += (*s == '+' || *s == '-'); + + bool overflow = false; + + if (s[0] == '0' && (s[1] | ' ') == 'x') + { + s += 2; + + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + + const char_t* start = s; + + for (;;) + { + if (static_cast(*s - '0') < 10) + result = result * 16 + (*s - '0'); + else if (static_cast((*s | ' ') - 'a') < 6) + result = result * 16 + ((*s | ' ') - 'a' + 10); + else + break; + + s++; + } + + size_t digits = static_cast(s - start); + + overflow = digits > sizeof(U) * 2; + } + else + { + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + + const char_t* start = s; + + for (;;) + { + if (static_cast(*s - '0') < 10) + result = result * 10 + (*s - '0'); + else + break; + + s++; + } + + size_t digits = static_cast(s - start); + + PUGI__STATIC_ASSERT(sizeof(U) == 8 || sizeof(U) == 4 || sizeof(U) == 2); + + const size_t max_digits10 = sizeof(U) == 8 ? 20 : sizeof(U) == 4 ? 10 : 5; + const char_t max_lead = sizeof(U) == 8 ? '1' : sizeof(U) == 4 ? '4' : '6'; + const size_t high_bit = sizeof(U) * 8 - 1; + + overflow = digits >= max_digits10 && !(digits == max_digits10 && (*start < max_lead || (*start == max_lead && result >> high_bit))); + } + + if (negative) + return (overflow || result > minneg) ? 0 - minneg : 0 - result; + else + return (overflow || result > maxpos) ? maxpos : result; + } + + PUGI__FN int get_value_int(const char_t* value) + { + return string_to_integer(value, 0 - static_cast(INT_MIN), INT_MAX); + } + + PUGI__FN unsigned int get_value_uint(const char_t* value) + { + return string_to_integer(value, 0, UINT_MAX); + } + + PUGI__FN double get_value_double(const char_t* value) + { + #ifdef PUGIXML_WCHAR_MODE + return wcstod(value, 0); + #else + return strtod(value, 0); + #endif + } + + PUGI__FN float get_value_float(const char_t* value) + { + #ifdef PUGIXML_WCHAR_MODE + return static_cast(wcstod(value, 0)); + #else + return static_cast(strtod(value, 0)); + #endif + } + + PUGI__FN bool get_value_bool(const char_t* value) + { + // only look at first char + char_t first = *value; + + // 1*, t* (true), T* (True), y* (yes), Y* (YES) + return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y'); + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN long long get_value_llong(const char_t* value) + { + return string_to_integer(value, 0 - static_cast(LLONG_MIN), LLONG_MAX); + } + + PUGI__FN unsigned long long get_value_ullong(const char_t* value) + { + return string_to_integer(value, 0, ULLONG_MAX); + } +#endif + + template + PUGI__FN char_t* integer_to_string(char_t* begin, char_t* end, U value, bool negative) + { + char_t* result = end - 1; + U rest = negative ? 0 - value : value; + + do + { + *result-- = static_cast('0' + (rest % 10)); + rest /= 10; + } + while (rest); + + assert(result >= begin); + (void)begin; + + *result = '-'; + + return result + !negative; + } + + // set value with conversion functions + template + PUGI__FN bool set_value_ascii(String& dest, Header& header, uintptr_t header_mask, char* buf) + { + #ifdef PUGIXML_WCHAR_MODE + char_t wbuf[128]; + assert(strlen(buf) < sizeof(wbuf) / sizeof(wbuf[0])); + + size_t offset = 0; + for (; buf[offset]; ++offset) wbuf[offset] = buf[offset]; + + return strcpy_insitu(dest, header, header_mask, wbuf, offset); + #else + return strcpy_insitu(dest, header, header_mask, buf, strlen(buf)); + #endif + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, int value) + { + char_t buf[64]; + char_t* end = buf + sizeof(buf) / sizeof(buf[0]); + char_t* begin = integer_to_string(buf, end, value, value < 0); + + return strcpy_insitu(dest, header, header_mask, begin, end - begin); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, unsigned int value) + { + char_t buf[64]; + char_t* end = buf + sizeof(buf) / sizeof(buf[0]); + char_t* begin = integer_to_string(buf, end, value, false); + + return strcpy_insitu(dest, header, header_mask, begin, end - begin); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, float value) + { + char buf[128]; + sprintf(buf, "%.9g", value); + + return set_value_ascii(dest, header, header_mask, buf); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, double value) + { + char buf[128]; + sprintf(buf, "%.17g", value); + + return set_value_ascii(dest, header, header_mask, buf); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, bool value) + { + return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"), value ? 4 : 5); + } + +#ifdef PUGIXML_HAS_LONG_LONG + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, long long value) + { + char_t buf[64]; + char_t* end = buf + sizeof(buf) / sizeof(buf[0]); + char_t* begin = integer_to_string(buf, end, value, value < 0); + + return strcpy_insitu(dest, header, header_mask, begin, end - begin); + } + + template + PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, unsigned long long value) + { + char_t buf[64]; + char_t* end = buf + sizeof(buf) / sizeof(buf[0]); + char_t* begin = integer_to_string(buf, end, value, false); + + return strcpy_insitu(dest, header, header_mask, begin, end - begin); + } +#endif + + PUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer) + { + // check input buffer + if (!contents && size) return make_parse_result(status_io_error); + + // get actual encoding + xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size); + + // get private buffer + char_t* buffer = 0; + size_t length = 0; + + if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory); + + // delete original buffer if we performed a conversion + if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents); + + // grab onto buffer if it's our buffer, user is responsible for deallocating contents himself + if (own || buffer != contents) *out_buffer = buffer; + + // store buffer for offset_debug + doc->buffer = buffer; + + // parse + xml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options); + + // remember encoding + res.encoding = buffer_encoding; + + return res; + } + + // we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick + PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result) + { + #if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) + // there are 64-bit versions of fseek/ftell, let's use them + typedef __int64 length_type; + + _fseeki64(file, 0, SEEK_END); + length_type length = _ftelli64(file); + _fseeki64(file, 0, SEEK_SET); + #elif defined(__MINGW32__) && !defined(__NO_MINGW_LFS) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR)) + // there are 64-bit versions of fseek/ftell, let's use them + typedef off64_t length_type; + + fseeko64(file, 0, SEEK_END); + length_type length = ftello64(file); + fseeko64(file, 0, SEEK_SET); + #else + // if this is a 32-bit OS, long is enough; if this is a unix system, long is 64-bit, which is enough; otherwise we can't do anything anyway. + typedef long length_type; + + fseek(file, 0, SEEK_END); + length_type length = ftell(file); + fseek(file, 0, SEEK_SET); + #endif + + // check for I/O errors + if (length < 0) return status_io_error; + + // check for overflow + size_t result = static_cast(length); + + if (static_cast(result) != length) return status_out_of_memory; + + // finalize + out_result = result; + + return status_ok; + } + + // This function assumes that buffer has extra sizeof(char_t) writable bytes after size + PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding) + { + // We only need to zero-terminate if encoding conversion does not do it for us + #ifdef PUGIXML_WCHAR_MODE + xml_encoding wchar_encoding = get_wchar_encoding(); + + if (encoding == wchar_encoding || need_endian_swap_utf(encoding, wchar_encoding)) + { + size_t length = size / sizeof(char_t); + + static_cast(buffer)[length] = 0; + return (length + 1) * sizeof(char_t); + } + #else + if (encoding == encoding_utf8) + { + static_cast(buffer)[size] = 0; + return size + 1; + } + #endif + + return size; + } + + PUGI__FN xml_parse_result load_file_impl(xml_document_struct* doc, FILE* file, unsigned int options, xml_encoding encoding, char_t** out_buffer) + { + if (!file) return make_parse_result(status_file_not_found); + + // get file size (can result in I/O errors) + size_t size = 0; + xml_parse_status size_status = get_file_size(file, size); + if (size_status != status_ok) return make_parse_result(size_status); + + size_t max_suffix_size = sizeof(char_t); + + // allocate buffer for the whole file + char* contents = static_cast(xml_memory::allocate(size + max_suffix_size)); + if (!contents) return make_parse_result(status_out_of_memory); + + // read file in memory + size_t read_size = fread(contents, 1, size, file); + + if (read_size != size) + { + xml_memory::deallocate(contents); + return make_parse_result(status_io_error); + } + + xml_encoding real_encoding = get_buffer_encoding(encoding, contents, size); + + return load_buffer_impl(doc, doc, contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding, true, true, out_buffer); + } + +#ifndef PUGIXML_NO_STL + template struct xml_stream_chunk + { + static xml_stream_chunk* create() + { + void* memory = xml_memory::allocate(sizeof(xml_stream_chunk)); + if (!memory) return 0; + + return new (memory) xml_stream_chunk(); + } + + static void destroy(xml_stream_chunk* chunk) + { + // free chunk chain + while (chunk) + { + xml_stream_chunk* next_ = chunk->next; + + xml_memory::deallocate(chunk); + + chunk = next_; + } + } + + xml_stream_chunk(): next(0), size(0) + { + } + + xml_stream_chunk* next; + size_t size; + + T data[xml_memory_page_size / sizeof(T)]; + }; + + template PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream& stream, void** out_buffer, size_t* out_size) + { + auto_deleter > chunks(0, xml_stream_chunk::destroy); + + // read file to a chunk list + size_t total = 0; + xml_stream_chunk* last = 0; + + while (!stream.eof()) + { + // allocate new chunk + xml_stream_chunk* chunk = xml_stream_chunk::create(); + if (!chunk) return status_out_of_memory; + + // append chunk to list + if (last) last = last->next = chunk; + else chunks.data = last = chunk; + + // read data to chunk + stream.read(chunk->data, static_cast(sizeof(chunk->data) / sizeof(T))); + chunk->size = static_cast(stream.gcount()) * sizeof(T); + + // read may set failbit | eofbit in case gcount() is less than read length, so check for other I/O errors + if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error; + + // guard against huge files (chunk size is small enough to make this overflow check work) + if (total + chunk->size < total) return status_out_of_memory; + total += chunk->size; + } + + size_t max_suffix_size = sizeof(char_t); + + // copy chunk list to a contiguous buffer + char* buffer = static_cast(xml_memory::allocate(total + max_suffix_size)); + if (!buffer) return status_out_of_memory; + + char* write = buffer; + + for (xml_stream_chunk* chunk = chunks.data; chunk; chunk = chunk->next) + { + assert(write + chunk->size <= buffer + total); + memcpy(write, chunk->data, chunk->size); + write += chunk->size; + } + + assert(write == buffer + total); + + // return buffer + *out_buffer = buffer; + *out_size = total; + + return status_ok; + } + + template PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream& stream, void** out_buffer, size_t* out_size) + { + // get length of remaining data in stream + typename std::basic_istream::pos_type pos = stream.tellg(); + stream.seekg(0, std::ios::end); + std::streamoff length = stream.tellg() - pos; + stream.seekg(pos); + + if (stream.fail() || pos < 0) return status_io_error; + + // guard against huge files + size_t read_length = static_cast(length); + + if (static_cast(read_length) != length || length < 0) return status_out_of_memory; + + size_t max_suffix_size = sizeof(char_t); + + // read stream data into memory (guard against stream exceptions with buffer holder) + auto_deleter buffer(xml_memory::allocate(read_length * sizeof(T) + max_suffix_size), xml_memory::deallocate); + if (!buffer.data) return status_out_of_memory; + + stream.read(static_cast(buffer.data), static_cast(read_length)); + + // read may set failbit | eofbit in case gcount() is less than read_length (i.e. line ending conversion), so check for other I/O errors + if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error; + + // return buffer + size_t actual_length = static_cast(stream.gcount()); + assert(actual_length <= read_length); + + *out_buffer = buffer.release(); + *out_size = actual_length * sizeof(T); + + return status_ok; + } + + template PUGI__FN xml_parse_result load_stream_impl(xml_document_struct* doc, std::basic_istream& stream, unsigned int options, xml_encoding encoding, char_t** out_buffer) + { + void* buffer = 0; + size_t size = 0; + xml_parse_status status = status_ok; + + // if stream has an error bit set, bail out (otherwise tellg() can fail and we'll clear error bits) + if (stream.fail()) return make_parse_result(status_io_error); + + // load stream to memory (using seek-based implementation if possible, since it's faster and takes less memory) + if (stream.tellg() < 0) + { + stream.clear(); // clear error flags that could be set by a failing tellg + status = load_stream_data_noseek(stream, &buffer, &size); + } + else + status = load_stream_data_seek(stream, &buffer, &size); + + if (status != status_ok) return make_parse_result(status); + + xml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size); + + return load_buffer_impl(doc, doc, buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding, true, true, out_buffer); + } +#endif + +#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || (defined(__MINGW32__) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR))) + PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode) + { + return _wfopen(path, mode); + } +#else + PUGI__FN char* convert_path_heap(const wchar_t* str) + { + assert(str); + + // first pass: get length in utf8 characters + size_t length = strlength_wide(str); + size_t size = as_utf8_begin(str, length); + + // allocate resulting string + char* result = static_cast(xml_memory::allocate(size + 1)); + if (!result) return 0; + + // second pass: convert to utf8 + as_utf8_end(result, size, str, length); + + // zero-terminate + result[size] = 0; + + return result; + } + + PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode) + { + // there is no standard function to open wide paths, so our best bet is to try utf8 path + char* path_utf8 = convert_path_heap(path); + if (!path_utf8) return 0; + + // convert mode to ASCII (we mirror _wfopen interface) + char mode_ascii[4] = {0}; + for (size_t i = 0; mode[i]; ++i) mode_ascii[i] = static_cast(mode[i]); + + // try to open the utf8 path + FILE* result = fopen(path_utf8, mode_ascii); + + // free dummy buffer + xml_memory::deallocate(path_utf8); + + return result; + } +#endif + + PUGI__FN bool save_file_impl(const xml_document& doc, FILE* file, const char_t* indent, unsigned int flags, xml_encoding encoding) + { + if (!file) return false; + + xml_writer_file writer(file); + doc.save(writer, indent, flags, encoding); + + return ferror(file) == 0; + } + + struct name_null_sentry + { + xml_node_struct* node; + char_t* name; + + name_null_sentry(xml_node_struct* node_): node(node_), name(node_->name) + { + node->name = 0; + } + + ~name_null_sentry() + { + node->name = name; + } + }; +PUGI__NS_END + +namespace pugi +{ + PUGI__FN xml_writer_file::xml_writer_file(void* file_): file(file_) + { + } + + PUGI__FN void xml_writer_file::write(const void* data, size_t size) + { + size_t result = fwrite(data, 1, size, static_cast(file)); + (void)!result; // unfortunately we can't do proper error handling here + } + +#ifndef PUGIXML_NO_STL + PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream >& stream): narrow_stream(&stream), wide_stream(0) + { + } + + PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream >& stream): narrow_stream(0), wide_stream(&stream) + { + } + + PUGI__FN void xml_writer_stream::write(const void* data, size_t size) + { + if (narrow_stream) + { + assert(!wide_stream); + narrow_stream->write(reinterpret_cast(data), static_cast(size)); + } + else + { + assert(wide_stream); + assert(size % sizeof(wchar_t) == 0); + + wide_stream->write(reinterpret_cast(data), static_cast(size / sizeof(wchar_t))); + } + } +#endif + + PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0) + { + } + + PUGI__FN xml_tree_walker::~xml_tree_walker() + { + } + + PUGI__FN int xml_tree_walker::depth() const + { + return _depth; + } + + PUGI__FN bool xml_tree_walker::begin(xml_node&) + { + return true; + } + + PUGI__FN bool xml_tree_walker::end(xml_node&) + { + return true; + } + + PUGI__FN xml_attribute::xml_attribute(): _attr(0) + { + } + + PUGI__FN xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr) + { + } + + PUGI__FN static void unspecified_bool_xml_attribute(xml_attribute***) + { + } + + PUGI__FN xml_attribute::operator xml_attribute::unspecified_bool_type() const + { + return _attr ? unspecified_bool_xml_attribute : 0; + } + + PUGI__FN bool xml_attribute::operator!() const + { + return !_attr; + } + + PUGI__FN bool xml_attribute::operator==(const xml_attribute& r) const + { + return (_attr == r._attr); + } + + PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const + { + return (_attr != r._attr); + } + + PUGI__FN bool xml_attribute::operator<(const xml_attribute& r) const + { + return (_attr < r._attr); + } + + PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const + { + return (_attr > r._attr); + } + + PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const + { + return (_attr <= r._attr); + } + + PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const + { + return (_attr >= r._attr); + } + + PUGI__FN xml_attribute xml_attribute::next_attribute() const + { + return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute(); + } + + PUGI__FN xml_attribute xml_attribute::previous_attribute() const + { + return _attr && _attr->prev_attribute_c->next_attribute ? xml_attribute(_attr->prev_attribute_c) : xml_attribute(); + } + + PUGI__FN const char_t* xml_attribute::as_string(const char_t* def) const + { + return (_attr && _attr->value) ? _attr->value + 0 : def; + } + + PUGI__FN int xml_attribute::as_int(int def) const + { + return (_attr && _attr->value) ? impl::get_value_int(_attr->value) : def; + } + + PUGI__FN unsigned int xml_attribute::as_uint(unsigned int def) const + { + return (_attr && _attr->value) ? impl::get_value_uint(_attr->value) : def; + } + + PUGI__FN double xml_attribute::as_double(double def) const + { + return (_attr && _attr->value) ? impl::get_value_double(_attr->value) : def; + } + + PUGI__FN float xml_attribute::as_float(float def) const + { + return (_attr && _attr->value) ? impl::get_value_float(_attr->value) : def; + } + + PUGI__FN bool xml_attribute::as_bool(bool def) const + { + return (_attr && _attr->value) ? impl::get_value_bool(_attr->value) : def; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN long long xml_attribute::as_llong(long long def) const + { + return (_attr && _attr->value) ? impl::get_value_llong(_attr->value) : def; + } + + PUGI__FN unsigned long long xml_attribute::as_ullong(unsigned long long def) const + { + return (_attr && _attr->value) ? impl::get_value_ullong(_attr->value) : def; + } +#endif + + PUGI__FN bool xml_attribute::empty() const + { + return !_attr; + } + + PUGI__FN const char_t* xml_attribute::name() const + { + return (_attr && _attr->name) ? _attr->name + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* xml_attribute::value() const + { + return (_attr && _attr->value) ? _attr->value + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN size_t xml_attribute::hash_value() const + { + return static_cast(reinterpret_cast(_attr) / sizeof(xml_attribute_struct)); + } + + PUGI__FN xml_attribute_struct* xml_attribute::internal_object() const + { + return _attr; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(const char_t* rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(int rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(unsigned int rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(double rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(float rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(bool rhs) + { + set_value(rhs); + return *this; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN xml_attribute& xml_attribute::operator=(long long rhs) + { + set_value(rhs); + return *this; + } + + PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long long rhs) + { + set_value(rhs); + return *this; + } +#endif + + PUGI__FN bool xml_attribute::set_name(const char_t* rhs) + { + if (!_attr) return false; + + return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN bool xml_attribute::set_value(const char_t* rhs) + { + if (!_attr) return false; + + return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN bool xml_attribute::set_value(int rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + + PUGI__FN bool xml_attribute::set_value(unsigned int rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + + PUGI__FN bool xml_attribute::set_value(double rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + + PUGI__FN bool xml_attribute::set_value(float rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + + PUGI__FN bool xml_attribute::set_value(bool rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN bool xml_attribute::set_value(long long rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } + + PUGI__FN bool xml_attribute::set_value(unsigned long long rhs) + { + if (!_attr) return false; + + return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); + } +#endif + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xml_attribute& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN xml_node::xml_node(): _root(0) + { + } + + PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p) + { + } + + PUGI__FN static void unspecified_bool_xml_node(xml_node***) + { + } + + PUGI__FN xml_node::operator xml_node::unspecified_bool_type() const + { + return _root ? unspecified_bool_xml_node : 0; + } + + PUGI__FN bool xml_node::operator!() const + { + return !_root; + } + + PUGI__FN xml_node::iterator xml_node::begin() const + { + return iterator(_root ? _root->first_child + 0 : 0, _root); + } + + PUGI__FN xml_node::iterator xml_node::end() const + { + return iterator(0, _root); + } + + PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const + { + return attribute_iterator(_root ? _root->first_attribute + 0 : 0, _root); + } + + PUGI__FN xml_node::attribute_iterator xml_node::attributes_end() const + { + return attribute_iterator(0, _root); + } + + PUGI__FN xml_object_range xml_node::children() const + { + return xml_object_range(begin(), end()); + } + + PUGI__FN xml_object_range xml_node::children(const char_t* name_) const + { + return xml_object_range(xml_named_node_iterator(child(name_)._root, _root, name_), xml_named_node_iterator(0, _root, name_)); + } + + PUGI__FN xml_object_range xml_node::attributes() const + { + return xml_object_range(attributes_begin(), attributes_end()); + } + + PUGI__FN bool xml_node::operator==(const xml_node& r) const + { + return (_root == r._root); + } + + PUGI__FN bool xml_node::operator!=(const xml_node& r) const + { + return (_root != r._root); + } + + PUGI__FN bool xml_node::operator<(const xml_node& r) const + { + return (_root < r._root); + } + + PUGI__FN bool xml_node::operator>(const xml_node& r) const + { + return (_root > r._root); + } + + PUGI__FN bool xml_node::operator<=(const xml_node& r) const + { + return (_root <= r._root); + } + + PUGI__FN bool xml_node::operator>=(const xml_node& r) const + { + return (_root >= r._root); + } + + PUGI__FN bool xml_node::empty() const + { + return !_root; + } + + PUGI__FN const char_t* xml_node::name() const + { + return (_root && _root->name) ? _root->name + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN xml_node_type xml_node::type() const + { + return _root ? PUGI__NODETYPE(_root) : node_null; + } + + PUGI__FN const char_t* xml_node::value() const + { + return (_root && _root->value) ? _root->value + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN xml_node xml_node::child(const char_t* name_) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (i->name && impl::strequal(name_, i->name)) return xml_node(i); + + return xml_node(); + } + + PUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const + { + if (!_root) return xml_attribute(); + + for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute) + if (i->name && impl::strequal(name_, i->name)) + return xml_attribute(i); + + return xml_attribute(); + } + + PUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling) + if (i->name && impl::strequal(name_, i->name)) return xml_node(i); + + return xml_node(); + } + + PUGI__FN xml_node xml_node::next_sibling() const + { + return _root ? xml_node(_root->next_sibling) : xml_node(); + } + + PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c) + if (i->name && impl::strequal(name_, i->name)) return xml_node(i); + + return xml_node(); + } + + PUGI__FN xml_attribute xml_node::attribute(const char_t* name_, xml_attribute& hint_) const + { + xml_attribute_struct* hint = hint_._attr; + + // if hint is not an attribute of node, behavior is not defined + assert(!hint || (_root && impl::is_attribute_of(hint, _root))); + + if (!_root) return xml_attribute(); + + // optimistically search from hint up until the end + for (xml_attribute_struct* i = hint; i; i = i->next_attribute) + if (i->name && impl::strequal(name_, i->name)) + { + // update hint to maximize efficiency of searching for consecutive attributes + hint_._attr = i->next_attribute; + + return xml_attribute(i); + } + + // wrap around and search from the first attribute until the hint + // 'j' null pointer check is technically redundant, but it prevents a crash in case the assertion above fails + for (xml_attribute_struct* j = _root->first_attribute; j && j != hint; j = j->next_attribute) + if (j->name && impl::strequal(name_, j->name)) + { + // update hint to maximize efficiency of searching for consecutive attributes + hint_._attr = j->next_attribute; + + return xml_attribute(j); + } + + return xml_attribute(); + } + + PUGI__FN xml_node xml_node::previous_sibling() const + { + if (!_root) return xml_node(); + + if (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c); + else return xml_node(); + } + + PUGI__FN xml_node xml_node::parent() const + { + return _root ? xml_node(_root->parent) : xml_node(); + } + + PUGI__FN xml_node xml_node::root() const + { + return _root ? xml_node(&impl::get_document(_root)) : xml_node(); + } + + PUGI__FN xml_text xml_node::text() const + { + return xml_text(_root); + } + + PUGI__FN const char_t* xml_node::child_value() const + { + if (!_root) return PUGIXML_TEXT(""); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (impl::is_text_node(i) && i->value) + return i->value; + + return PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const + { + return child(name_).child_value(); + } + + PUGI__FN xml_attribute xml_node::first_attribute() const + { + return _root ? xml_attribute(_root->first_attribute) : xml_attribute(); + } + + PUGI__FN xml_attribute xml_node::last_attribute() const + { + return _root && _root->first_attribute ? xml_attribute(_root->first_attribute->prev_attribute_c) : xml_attribute(); + } + + PUGI__FN xml_node xml_node::first_child() const + { + return _root ? xml_node(_root->first_child) : xml_node(); + } + + PUGI__FN xml_node xml_node::last_child() const + { + return _root && _root->first_child ? xml_node(_root->first_child->prev_sibling_c) : xml_node(); + } + + PUGI__FN bool xml_node::set_name(const char_t* rhs) + { + xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; + + if (type_ != node_element && type_ != node_pi && type_ != node_declaration) + return false; + + return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN bool xml_node::set_value(const char_t* rhs) + { + xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; + + if (type_ != node_pcdata && type_ != node_cdata && type_ != node_comment && type_ != node_pi && type_ != node_doctype) + return false; + + return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)); + } + + PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::append_attribute(a._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::prepend_attribute(a._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_after(a._attr, attr._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr) + { + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_before(a._attr, attr._attr, _root); + + a.set_name(name_); + + return a; + } + + PUGI__FN xml_attribute xml_node::append_copy(const xml_attribute& proto) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::append_attribute(a._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_attribute xml_node::prepend_copy(const xml_attribute& proto) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::prepend_attribute(a._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_after(a._attr, attr._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr) + { + if (!proto) return xml_attribute(); + if (!impl::allow_insert_attribute(type())) return xml_attribute(); + if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_attribute(); + + xml_attribute a(impl::allocate_attribute(alloc)); + if (!a) return xml_attribute(); + + impl::insert_attribute_before(a._attr, attr._attr, _root); + impl::node_copy_attribute(a._attr, proto._attr); + + return a; + } + + PUGI__FN xml_node xml_node::append_child(xml_node_type type_) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::append_node(n._root, _root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::prepend_child(xml_node_type type_) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::prepend_node(n._root, _root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_before(n._root, node._root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node) + { + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_after(n._root, node._root); + + if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml")); + + return n; + } + + PUGI__FN xml_node xml_node::append_child(const char_t* name_) + { + xml_node result = append_child(node_element); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::prepend_child(const char_t* name_) + { + xml_node result = prepend_child(node_element); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node) + { + xml_node result = insert_child_after(node_element, node); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node) + { + xml_node result = insert_child_before(node_element, node); + + result.set_name(name_); + + return result; + } + + PUGI__FN xml_node xml_node::append_copy(const xml_node& proto) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::append_node(n._root, _root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::prepend_copy(const xml_node& proto) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::prepend_node(n._root, _root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_after(n._root, node._root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node) + { + xml_node_type type_ = proto.type(); + if (!impl::allow_insert_child(type(), type_)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + xml_node n(impl::allocate_node(alloc, type_)); + if (!n) return xml_node(); + + impl::insert_node_before(n._root, node._root); + impl::node_copy_tree(n._root, proto._root); + + return n; + } + + PUGI__FN xml_node xml_node::append_move(const xml_node& moved) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::append_node(moved._root, _root); + + return moved; + } + + PUGI__FN xml_node xml_node::prepend_move(const xml_node& moved) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::prepend_node(moved._root, _root); + + return moved; + } + + PUGI__FN xml_node xml_node::insert_move_after(const xml_node& moved, const xml_node& node) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + if (moved._root == node._root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::insert_node_after(moved._root, node._root); + + return moved; + } + + PUGI__FN xml_node xml_node::insert_move_before(const xml_node& moved, const xml_node& node) + { + if (!impl::allow_move(*this, moved)) return xml_node(); + if (!node._root || node._root->parent != _root) return xml_node(); + if (moved._root == node._root) return xml_node(); + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return xml_node(); + + // disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers + impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask; + + impl::remove_node(moved._root); + impl::insert_node_before(moved._root, node._root); + + return moved; + } + + PUGI__FN bool xml_node::remove_attribute(const char_t* name_) + { + return remove_attribute(attribute(name_)); + } + + PUGI__FN bool xml_node::remove_attribute(const xml_attribute& a) + { + if (!_root || !a._attr) return false; + if (!impl::is_attribute_of(a._attr, _root)) return false; + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return false; + + impl::remove_attribute(a._attr, _root); + impl::destroy_attribute(a._attr, alloc); + + return true; + } + + PUGI__FN bool xml_node::remove_child(const char_t* name_) + { + return remove_child(child(name_)); + } + + PUGI__FN bool xml_node::remove_child(const xml_node& n) + { + if (!_root || !n._root || n._root->parent != _root) return false; + + impl::xml_allocator& alloc = impl::get_allocator(_root); + if (!alloc.reserve()) return false; + + impl::remove_node(n._root); + impl::destroy_node(n._root, alloc); + + return true; + } + + PUGI__FN xml_parse_result xml_node::append_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + // append_buffer is only valid for elements/documents + if (!impl::allow_insert_child(type(), node_element)) return impl::make_parse_result(status_append_invalid_root); + + // get document node + impl::xml_document_struct* doc = &impl::get_document(_root); + + // disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense + doc->header |= impl::xml_memory_page_contents_shared_mask; + + // get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later) + impl::xml_memory_page* page = 0; + impl::xml_extra_buffer* extra = static_cast(doc->allocate_memory(sizeof(impl::xml_extra_buffer), page)); + (void)page; + + if (!extra) return impl::make_parse_result(status_out_of_memory); + + // add extra buffer to the list + extra->buffer = 0; + extra->next = doc->extra_buffers; + doc->extra_buffers = extra; + + // name of the root has to be NULL before parsing - otherwise closing node mismatches will not be detected at the top level + impl::name_null_sentry sentry(_root); + + return impl::load_buffer_impl(doc, _root, const_cast(contents), size, options, encoding, false, false, &extra->buffer); + } + + PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (i->name && impl::strequal(name_, i->name)) + { + for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) + if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(""))) + return xml_node(i); + } + + return xml_node(); + } + + PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const + { + if (!_root) return xml_node(); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) + if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(""))) + return xml_node(i); + + return xml_node(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN string_t xml_node::path(char_t delimiter) const + { + if (!_root) return string_t(); + + size_t offset = 0; + + for (xml_node_struct* i = _root; i; i = i->parent) + { + offset += (i != _root); + offset += i->name ? impl::strlength(i->name) : 0; + } + + string_t result; + result.resize(offset); + + for (xml_node_struct* j = _root; j; j = j->parent) + { + if (j != _root) + result[--offset] = delimiter; + + if (j->name && *j->name) + { + size_t length = impl::strlength(j->name); + + offset -= length; + memcpy(&result[offset], j->name, length * sizeof(char_t)); + } + } + + assert(offset == 0); + + return result; + } +#endif + + PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const + { + xml_node found = *this; // Current search context. + + if (!_root || !path_ || !path_[0]) return found; + + if (path_[0] == delimiter) + { + // Absolute path; e.g. '/foo/bar' + found = found.root(); + ++path_; + } + + const char_t* path_segment = path_; + + while (*path_segment == delimiter) ++path_segment; + + const char_t* path_segment_end = path_segment; + + while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end; + + if (path_segment == path_segment_end) return found; + + const char_t* next_segment = path_segment_end; + + while (*next_segment == delimiter) ++next_segment; + + if (*path_segment == '.' && path_segment + 1 == path_segment_end) + return found.first_element_by_path(next_segment, delimiter); + else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end) + return found.parent().first_element_by_path(next_segment, delimiter); + else + { + for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling) + { + if (j->name && impl::strequalrange(j->name, path_segment, static_cast(path_segment_end - path_segment))) + { + xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter); + + if (subsearch) return subsearch; + } + } + + return xml_node(); + } + } + + PUGI__FN bool xml_node::traverse(xml_tree_walker& walker) + { + walker._depth = -1; + + xml_node arg_begin = *this; + if (!walker.begin(arg_begin)) return false; + + xml_node cur = first_child(); + + if (cur) + { + ++walker._depth; + + do + { + xml_node arg_for_each = cur; + if (!walker.for_each(arg_for_each)) + return false; + + if (cur.first_child()) + { + ++walker._depth; + cur = cur.first_child(); + } + else if (cur.next_sibling()) + cur = cur.next_sibling(); + else + { + // Borland C++ workaround + while (!cur.next_sibling() && cur != *this && !cur.parent().empty()) + { + --walker._depth; + cur = cur.parent(); + } + + if (cur != *this) + cur = cur.next_sibling(); + } + } + while (cur && cur != *this); + } + + assert(walker._depth == -1); + + xml_node arg_end = *this; + return walker.end(arg_end); + } + + PUGI__FN size_t xml_node::hash_value() const + { + return static_cast(reinterpret_cast(_root) / sizeof(xml_node_struct)); + } + + PUGI__FN xml_node_struct* xml_node::internal_object() const + { + return _root; + } + + PUGI__FN void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const + { + if (!_root) return; + + impl::xml_buffered_writer buffered_writer(writer, encoding); + + impl::node_output(buffered_writer, _root, indent, flags, depth); + + buffered_writer.flush(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN void xml_node::print(std::basic_ostream >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const + { + xml_writer_stream writer(stream); + + print(writer, indent, flags, encoding, depth); + } + + PUGI__FN void xml_node::print(std::basic_ostream >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const + { + xml_writer_stream writer(stream); + + print(writer, indent, flags, encoding_wchar, depth); + } +#endif + + PUGI__FN ptrdiff_t xml_node::offset_debug() const + { + if (!_root) return -1; + + impl::xml_document_struct& doc = impl::get_document(_root); + + // we can determine the offset reliably only if there is exactly once parse buffer + if (!doc.buffer || doc.extra_buffers) return -1; + + switch (type()) + { + case node_document: + return 0; + + case node_element: + case node_declaration: + case node_pi: + return _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1; + + case node_pcdata: + case node_cdata: + case node_comment: + case node_doctype: + return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1; + + default: + return -1; + } + } + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xml_node& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xml_node& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN xml_text::xml_text(xml_node_struct* root): _root(root) + { + } + + PUGI__FN xml_node_struct* xml_text::_data() const + { + if (!_root || impl::is_text_node(_root)) return _root; + + for (xml_node_struct* node = _root->first_child; node; node = node->next_sibling) + if (impl::is_text_node(node)) + return node; + + return 0; + } + + PUGI__FN xml_node_struct* xml_text::_data_new() + { + xml_node_struct* d = _data(); + if (d) return d; + + return xml_node(_root).append_child(node_pcdata).internal_object(); + } + + PUGI__FN xml_text::xml_text(): _root(0) + { + } + + PUGI__FN static void unspecified_bool_xml_text(xml_text***) + { + } + + PUGI__FN xml_text::operator xml_text::unspecified_bool_type() const + { + return _data() ? unspecified_bool_xml_text : 0; + } + + PUGI__FN bool xml_text::operator!() const + { + return !_data(); + } + + PUGI__FN bool xml_text::empty() const + { + return _data() == 0; + } + + PUGI__FN const char_t* xml_text::get() const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? d->value + 0 : PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* xml_text::as_string(const char_t* def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? d->value + 0 : def; + } + + PUGI__FN int xml_text::as_int(int def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_int(d->value) : def; + } + + PUGI__FN unsigned int xml_text::as_uint(unsigned int def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_uint(d->value) : def; + } + + PUGI__FN double xml_text::as_double(double def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_double(d->value) : def; + } + + PUGI__FN float xml_text::as_float(float def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_float(d->value) : def; + } + + PUGI__FN bool xml_text::as_bool(bool def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_bool(d->value) : def; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN long long xml_text::as_llong(long long def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_llong(d->value) : def; + } + + PUGI__FN unsigned long long xml_text::as_ullong(unsigned long long def) const + { + xml_node_struct* d = _data(); + + return (d && d->value) ? impl::get_value_ullong(d->value) : def; + } +#endif + + PUGI__FN bool xml_text::set(const char_t* rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, impl::strlength(rhs)) : false; + } + + PUGI__FN bool xml_text::set(int rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + + PUGI__FN bool xml_text::set(unsigned int rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + + PUGI__FN bool xml_text::set(float rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + + PUGI__FN bool xml_text::set(double rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + + PUGI__FN bool xml_text::set(bool rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN bool xml_text::set(long long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } + + PUGI__FN bool xml_text::set(unsigned long long rhs) + { + xml_node_struct* dn = _data_new(); + + return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; + } +#endif + + PUGI__FN xml_text& xml_text::operator=(const char_t* rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(int rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(unsigned int rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(double rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(float rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(bool rhs) + { + set(rhs); + return *this; + } + +#ifdef PUGIXML_HAS_LONG_LONG + PUGI__FN xml_text& xml_text::operator=(long long rhs) + { + set(rhs); + return *this; + } + + PUGI__FN xml_text& xml_text::operator=(unsigned long long rhs) + { + set(rhs); + return *this; + } +#endif + + PUGI__FN xml_node xml_text::data() const + { + return xml_node(_data()); + } + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xml_text& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xml_text& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN xml_node_iterator::xml_node_iterator() + { + } + + PUGI__FN xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent()) + { + } + + PUGI__FN xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent) + { + } + + PUGI__FN bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const + { + return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root; + } + + PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const + { + return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root; + } + + PUGI__FN xml_node& xml_node_iterator::operator*() const + { + assert(_wrap._root); + return _wrap; + } + + PUGI__FN xml_node* xml_node_iterator::operator->() const + { + assert(_wrap._root); + return const_cast(&_wrap); // BCC32 workaround + } + + PUGI__FN const xml_node_iterator& xml_node_iterator::operator++() + { + assert(_wrap._root); + _wrap._root = _wrap._root->next_sibling; + return *this; + } + + PUGI__FN xml_node_iterator xml_node_iterator::operator++(int) + { + xml_node_iterator temp = *this; + ++*this; + return temp; + } + + PUGI__FN const xml_node_iterator& xml_node_iterator::operator--() + { + _wrap = _wrap._root ? _wrap.previous_sibling() : _parent.last_child(); + return *this; + } + + PUGI__FN xml_node_iterator xml_node_iterator::operator--(int) + { + xml_node_iterator temp = *this; + --*this; + return temp; + } + + PUGI__FN xml_attribute_iterator::xml_attribute_iterator() + { + } + + PUGI__FN xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent) + { + } + + PUGI__FN xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent) + { + } + + PUGI__FN bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const + { + return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root; + } + + PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const + { + return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root; + } + + PUGI__FN xml_attribute& xml_attribute_iterator::operator*() const + { + assert(_wrap._attr); + return _wrap; + } + + PUGI__FN xml_attribute* xml_attribute_iterator::operator->() const + { + assert(_wrap._attr); + return const_cast(&_wrap); // BCC32 workaround + } + + PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++() + { + assert(_wrap._attr); + _wrap._attr = _wrap._attr->next_attribute; + return *this; + } + + PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator++(int) + { + xml_attribute_iterator temp = *this; + ++*this; + return temp; + } + + PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator--() + { + _wrap = _wrap._attr ? _wrap.previous_attribute() : _parent.last_attribute(); + return *this; + } + + PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator--(int) + { + xml_attribute_iterator temp = *this; + --*this; + return temp; + } + + PUGI__FN xml_named_node_iterator::xml_named_node_iterator(): _name(0) + { + } + + PUGI__FN xml_named_node_iterator::xml_named_node_iterator(const xml_node& node, const char_t* name): _wrap(node), _parent(node.parent()), _name(name) + { + } + + PUGI__FN xml_named_node_iterator::xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name): _wrap(ref), _parent(parent), _name(name) + { + } + + PUGI__FN bool xml_named_node_iterator::operator==(const xml_named_node_iterator& rhs) const + { + return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root; + } + + PUGI__FN bool xml_named_node_iterator::operator!=(const xml_named_node_iterator& rhs) const + { + return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root; + } + + PUGI__FN xml_node& xml_named_node_iterator::operator*() const + { + assert(_wrap._root); + return _wrap; + } + + PUGI__FN xml_node* xml_named_node_iterator::operator->() const + { + assert(_wrap._root); + return const_cast(&_wrap); // BCC32 workaround + } + + PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator++() + { + assert(_wrap._root); + _wrap = _wrap.next_sibling(_name); + return *this; + } + + PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator++(int) + { + xml_named_node_iterator temp = *this; + ++*this; + return temp; + } + + PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator--() + { + if (_wrap._root) + _wrap = _wrap.previous_sibling(_name); + else + { + _wrap = _parent.last_child(); + + if (!impl::strequal(_wrap.name(), _name)) + _wrap = _wrap.previous_sibling(_name); + } + + return *this; + } + + PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator--(int) + { + xml_named_node_iterator temp = *this; + --*this; + return temp; + } + + PUGI__FN xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto) + { + } + + PUGI__FN xml_parse_result::operator bool() const + { + return status == status_ok; + } + + PUGI__FN const char* xml_parse_result::description() const + { + switch (status) + { + case status_ok: return "No error"; + + case status_file_not_found: return "File was not found"; + case status_io_error: return "Error reading from file/stream"; + case status_out_of_memory: return "Could not allocate memory"; + case status_internal_error: return "Internal error occurred"; + + case status_unrecognized_tag: return "Could not determine tag type"; + + case status_bad_pi: return "Error parsing document declaration/processing instruction"; + case status_bad_comment: return "Error parsing comment"; + case status_bad_cdata: return "Error parsing CDATA section"; + case status_bad_doctype: return "Error parsing document type declaration"; + case status_bad_pcdata: return "Error parsing PCDATA section"; + case status_bad_start_element: return "Error parsing start element tag"; + case status_bad_attribute: return "Error parsing element attribute"; + case status_bad_end_element: return "Error parsing end element tag"; + case status_end_element_mismatch: return "Start-end tags mismatch"; + + case status_append_invalid_root: return "Unable to append nodes: root is not an element or document"; + + case status_no_document_element: return "No document element found"; + + default: return "Unknown error"; + } + } + + PUGI__FN xml_document::xml_document(): _buffer(0) + { + create(); + } + + PUGI__FN xml_document::~xml_document() + { + destroy(); + } + + PUGI__FN void xml_document::reset() + { + destroy(); + create(); + } + + PUGI__FN void xml_document::reset(const xml_document& proto) + { + reset(); + + for (xml_node cur = proto.first_child(); cur; cur = cur.next_sibling()) + append_copy(cur); + } + + PUGI__FN void xml_document::create() + { + assert(!_root); + + #ifdef PUGIXML_COMPACT + const size_t page_offset = sizeof(uint32_t); + #else + const size_t page_offset = 0; + #endif + + // initialize sentinel page + PUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment - sizeof(void*) + page_offset <= sizeof(_memory)); + + // align upwards to page boundary + void* page_memory = reinterpret_cast((reinterpret_cast(_memory) + (impl::xml_memory_page_alignment - 1)) & ~(impl::xml_memory_page_alignment - 1)); + + // prepare page structure + impl::xml_memory_page* page = impl::xml_memory_page::construct(page_memory); + assert(page); + + page->busy_size = impl::xml_memory_page_size; + + // setup first page marker + #ifdef PUGIXML_COMPACT + // round-trip through void* to avoid 'cast increases required alignment of target type' warning + page->compact_page_marker = reinterpret_cast(static_cast(reinterpret_cast(page) + sizeof(impl::xml_memory_page))); + *page->compact_page_marker = sizeof(impl::xml_memory_page); + #endif + + // allocate new root + _root = new (reinterpret_cast(page) + sizeof(impl::xml_memory_page) + page_offset) impl::xml_document_struct(page); + _root->prev_sibling_c = _root; + + // setup sentinel page + page->allocator = static_cast(_root); + + // verify the document allocation + assert(reinterpret_cast(_root) + sizeof(impl::xml_document_struct) <= _memory + sizeof(_memory)); + } + + PUGI__FN void xml_document::destroy() + { + assert(_root); + + // destroy static storage + if (_buffer) + { + impl::xml_memory::deallocate(_buffer); + _buffer = 0; + } + + // destroy extra buffers (note: no need to destroy linked list nodes, they're allocated using document allocator) + for (impl::xml_extra_buffer* extra = static_cast(_root)->extra_buffers; extra; extra = extra->next) + { + if (extra->buffer) impl::xml_memory::deallocate(extra->buffer); + } + + // destroy dynamic storage, leave sentinel page (it's in static memory) + impl::xml_memory_page* root_page = PUGI__GETPAGE(_root); + assert(root_page && !root_page->prev); + assert(reinterpret_cast(root_page) >= _memory && reinterpret_cast(root_page) < _memory + sizeof(_memory)); + + for (impl::xml_memory_page* page = root_page->next; page; ) + { + impl::xml_memory_page* next = page->next; + + impl::xml_allocator::deallocate_page(page); + + page = next; + } + + #ifdef PUGIXML_COMPACT + // destroy hash table + static_cast(_root)->hash.clear(); + #endif + + _root = 0; + } + +#ifndef PUGIXML_NO_STL + PUGI__FN xml_parse_result xml_document::load(std::basic_istream >& stream, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_stream_impl(static_cast(_root), stream, options, encoding, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load(std::basic_istream >& stream, unsigned int options) + { + reset(); + + return impl::load_stream_impl(static_cast(_root), stream, options, encoding_wchar, &_buffer); + } +#endif + + PUGI__FN xml_parse_result xml_document::load_string(const char_t* contents, unsigned int options) + { + // Force native encoding (skip autodetection) + #ifdef PUGIXML_WCHAR_MODE + xml_encoding encoding = encoding_wchar; + #else + xml_encoding encoding = encoding_utf8; + #endif + + return load_buffer(contents, impl::strlength(contents) * sizeof(char_t), options, encoding); + } + + PUGI__FN xml_parse_result xml_document::load(const char_t* contents, unsigned int options) + { + return load_string(contents, options); + } + + PUGI__FN xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding) + { + reset(); + + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(fopen(path_, "rb"), fclose); + + return impl::load_file_impl(static_cast(_root), file.data, options, encoding, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding) + { + reset(); + + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(impl::open_file_wide(path_, L"rb"), fclose); + + return impl::load_file_impl(static_cast(_root), file.data, options, encoding, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_buffer_impl(static_cast(_root), _root, const_cast(contents), size, options, encoding, false, false, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_buffer_impl(static_cast(_root), _root, contents, size, options, encoding, true, false, &_buffer); + } + + PUGI__FN xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding) + { + reset(); + + return impl::load_buffer_impl(static_cast(_root), _root, contents, size, options, encoding, true, true, &_buffer); + } + + PUGI__FN void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + impl::xml_buffered_writer buffered_writer(writer, encoding); + + if ((flags & format_write_bom) && encoding != encoding_latin1) + { + // BOM always represents the codepoint U+FEFF, so just write it in native encoding + #ifdef PUGIXML_WCHAR_MODE + unsigned int bom = 0xfeff; + buffered_writer.write(static_cast(bom)); + #else + buffered_writer.write('\xef', '\xbb', '\xbf'); + #endif + } + + if (!(flags & format_no_declaration) && !impl::has_declaration(_root)) + { + buffered_writer.write_string(PUGIXML_TEXT("'); + if (!(flags & format_raw)) buffered_writer.write('\n'); + } + + impl::node_output(buffered_writer, _root, indent, flags, 0); + + buffered_writer.flush(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN void xml_document::save(std::basic_ostream >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + xml_writer_stream writer(stream); + + save(writer, indent, flags, encoding); + } + + PUGI__FN void xml_document::save(std::basic_ostream >& stream, const char_t* indent, unsigned int flags) const + { + xml_writer_stream writer(stream); + + save(writer, indent, flags, encoding_wchar); + } +#endif + + PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(fopen(path_, (flags & format_save_file_text) ? "w" : "wb"), fclose); + + return impl::save_file_impl(*this, file.data, indent, flags, encoding); + } + + PUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const + { + using impl::auto_deleter; // MSVC7 workaround + auto_deleter file(impl::open_file_wide(path_, (flags & format_save_file_text) ? L"w" : L"wb"), fclose); + + return impl::save_file_impl(*this, file.data, indent, flags, encoding); + } + + PUGI__FN xml_node xml_document::document_element() const + { + assert(_root); + + for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) + if (PUGI__NODETYPE(i) == node_element) + return xml_node(i); + + return xml_node(); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str) + { + assert(str); + + return impl::as_utf8_impl(str, impl::strlength_wide(str)); + } + + PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const std::basic_string& str) + { + return impl::as_utf8_impl(str.c_str(), str.size()); + } + + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const char* str) + { + assert(str); + + return impl::as_wide_impl(str, strlen(str)); + } + + PUGI__FN std::basic_string PUGIXML_FUNCTION as_wide(const std::string& str) + { + return impl::as_wide_impl(str.c_str(), str.size()); + } +#endif + + PUGI__FN void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate) + { + impl::xml_memory::allocate = allocate; + impl::xml_memory::deallocate = deallocate; + } + + PUGI__FN allocation_function PUGIXML_FUNCTION get_memory_allocation_function() + { + return impl::xml_memory::allocate; + } + + PUGI__FN deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function() + { + return impl::xml_memory::deallocate; + } +} + +#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) +namespace std +{ + // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) + PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_attribute_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_named_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } +} +#endif + +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&) + { + return std::bidirectional_iterator_tag(); + } + + PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_named_node_iterator&) + { + return std::bidirectional_iterator_tag(); + } +} +#endif + +#ifndef PUGIXML_NO_XPATH +// STL replacements +PUGI__NS_BEGIN + struct equal_to + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs == rhs; + } + }; + + struct not_equal_to + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs != rhs; + } + }; + + struct less + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs < rhs; + } + }; + + struct less_equal + { + template bool operator()(const T& lhs, const T& rhs) const + { + return lhs <= rhs; + } + }; + + template void swap(T& lhs, T& rhs) + { + T temp = lhs; + lhs = rhs; + rhs = temp; + } + + template I min_element(I begin, I end, const Pred& pred) + { + I result = begin; + + for (I it = begin + 1; it != end; ++it) + if (pred(*it, *result)) + result = it; + + return result; + } + + template void reverse(I begin, I end) + { + while (end - begin > 1) swap(*begin++, *--end); + } + + template I unique(I begin, I end) + { + // fast skip head + while (end - begin > 1 && *begin != *(begin + 1)) begin++; + + if (begin == end) return begin; + + // last written element + I write = begin++; + + // merge unique elements + while (begin != end) + { + if (*begin != *write) + *++write = *begin++; + else + begin++; + } + + // past-the-end (write points to live element) + return write + 1; + } + + template void copy_backwards(I begin, I end, I target) + { + while (begin != end) *--target = *--end; + } + + template void insertion_sort(I begin, I end, const Pred& pred, T*) + { + assert(begin != end); + + for (I it = begin + 1; it != end; ++it) + { + T val = *it; + + if (pred(val, *begin)) + { + // move to front + copy_backwards(begin, it, it + 1); + *begin = val; + } + else + { + I hole = it; + + // move hole backwards + while (pred(val, *(hole - 1))) + { + *hole = *(hole - 1); + hole--; + } + + // fill hole with element + *hole = val; + } + } + } + + // std variant for elements with == + template void partition(I begin, I middle, I end, const Pred& pred, I* out_eqbeg, I* out_eqend) + { + I eqbeg = middle, eqend = middle + 1; + + // expand equal range + while (eqbeg != begin && *(eqbeg - 1) == *eqbeg) --eqbeg; + while (eqend != end && *eqend == *eqbeg) ++eqend; + + // process outer elements + I ltend = eqbeg, gtbeg = eqend; + + for (;;) + { + // find the element from the right side that belongs to the left one + for (; gtbeg != end; ++gtbeg) + if (!pred(*eqbeg, *gtbeg)) + { + if (*gtbeg == *eqbeg) swap(*gtbeg, *eqend++); + else break; + } + + // find the element from the left side that belongs to the right one + for (; ltend != begin; --ltend) + if (!pred(*(ltend - 1), *eqbeg)) + { + if (*eqbeg == *(ltend - 1)) swap(*(ltend - 1), *--eqbeg); + else break; + } + + // scanned all elements + if (gtbeg == end && ltend == begin) + { + *out_eqbeg = eqbeg; + *out_eqend = eqend; + return; + } + + // make room for elements by moving equal area + if (gtbeg == end) + { + if (--ltend != --eqbeg) swap(*ltend, *eqbeg); + swap(*eqbeg, *--eqend); + } + else if (ltend == begin) + { + if (eqend != gtbeg) swap(*eqbeg, *eqend); + ++eqend; + swap(*gtbeg++, *eqbeg++); + } + else swap(*gtbeg++, *--ltend); + } + } + + template void median3(I first, I middle, I last, const Pred& pred) + { + if (pred(*middle, *first)) swap(*middle, *first); + if (pred(*last, *middle)) swap(*last, *middle); + if (pred(*middle, *first)) swap(*middle, *first); + } + + template void median(I first, I middle, I last, const Pred& pred) + { + if (last - first <= 40) + { + // median of three for small chunks + median3(first, middle, last, pred); + } + else + { + // median of nine + size_t step = (last - first + 1) / 8; + + median3(first, first + step, first + 2 * step, pred); + median3(middle - step, middle, middle + step, pred); + median3(last - 2 * step, last - step, last, pred); + median3(first + step, middle, last - step, pred); + } + } + + template void sort(I begin, I end, const Pred& pred) + { + // sort large chunks + while (end - begin > 32) + { + // find median element + I middle = begin + (end - begin) / 2; + median(begin, middle, end - 1, pred); + + // partition in three chunks (< = >) + I eqbeg, eqend; + partition(begin, middle, end, pred, &eqbeg, &eqend); + + // loop on larger half + if (eqbeg - begin > end - eqend) + { + sort(eqend, end, pred); + end = eqbeg; + } + else + { + sort(begin, eqbeg, pred); + begin = eqend; + } + } + + // insertion sort small chunk + if (begin != end) insertion_sort(begin, end, pred, &*begin); + } +PUGI__NS_END + +// Allocator used for AST and evaluation stacks +PUGI__NS_BEGIN + static const size_t xpath_memory_page_size = + #ifdef PUGIXML_MEMORY_XPATH_PAGE_SIZE + PUGIXML_MEMORY_XPATH_PAGE_SIZE + #else + 4096 + #endif + ; + + static const uintptr_t xpath_memory_block_alignment = sizeof(double) > sizeof(void*) ? sizeof(double) : sizeof(void*); + + struct xpath_memory_block + { + xpath_memory_block* next; + size_t capacity; + + union + { + char data[xpath_memory_page_size]; + double alignment; + }; + }; + + class xpath_allocator + { + xpath_memory_block* _root; + size_t _root_size; + + public: + #ifdef PUGIXML_NO_EXCEPTIONS + jmp_buf* error_handler; + #endif + + xpath_allocator(xpath_memory_block* root, size_t root_size = 0): _root(root), _root_size(root_size) + { + #ifdef PUGIXML_NO_EXCEPTIONS + error_handler = 0; + #endif + } + + void* allocate_nothrow(size_t size) + { + // round size up to block alignment boundary + size = (size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); + + if (_root_size + size <= _root->capacity) + { + void* buf = &_root->data[0] + _root_size; + _root_size += size; + return buf; + } + else + { + // make sure we have at least 1/4th of the page free after allocation to satisfy subsequent allocation requests + size_t block_capacity_base = sizeof(_root->data); + size_t block_capacity_req = size + block_capacity_base / 4; + size_t block_capacity = (block_capacity_base > block_capacity_req) ? block_capacity_base : block_capacity_req; + + size_t block_size = block_capacity + offsetof(xpath_memory_block, data); + + xpath_memory_block* block = static_cast(xml_memory::allocate(block_size)); + if (!block) return 0; + + block->next = _root; + block->capacity = block_capacity; + + _root = block; + _root_size = size; + + return block->data; + } + } + + void* allocate(size_t size) + { + void* result = allocate_nothrow(size); + + if (!result) + { + #ifdef PUGIXML_NO_EXCEPTIONS + assert(error_handler); + longjmp(*error_handler, 1); + #else + throw std::bad_alloc(); + #endif + } + + return result; + } + + void* reallocate(void* ptr, size_t old_size, size_t new_size) + { + // round size up to block alignment boundary + old_size = (old_size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); + new_size = (new_size + xpath_memory_block_alignment - 1) & ~(xpath_memory_block_alignment - 1); + + // we can only reallocate the last object + assert(ptr == 0 || static_cast(ptr) + old_size == &_root->data[0] + _root_size); + + // adjust root size so that we have not allocated the object at all + bool only_object = (_root_size == old_size); + + if (ptr) _root_size -= old_size; + + // allocate a new version (this will obviously reuse the memory if possible) + void* result = allocate(new_size); + assert(result); + + // we have a new block + if (result != ptr && ptr) + { + // copy old data + assert(new_size >= old_size); + memcpy(result, ptr, old_size); + + // free the previous page if it had no other objects + if (only_object) + { + assert(_root->data == result); + assert(_root->next); + + xpath_memory_block* next = _root->next->next; + + if (next) + { + // deallocate the whole page, unless it was the first one + xml_memory::deallocate(_root->next); + _root->next = next; + } + } + } + + return result; + } + + void revert(const xpath_allocator& state) + { + // free all new pages + xpath_memory_block* cur = _root; + + while (cur != state._root) + { + xpath_memory_block* next = cur->next; + + xml_memory::deallocate(cur); + + cur = next; + } + + // restore state + _root = state._root; + _root_size = state._root_size; + } + + void release() + { + xpath_memory_block* cur = _root; + assert(cur); + + while (cur->next) + { + xpath_memory_block* next = cur->next; + + xml_memory::deallocate(cur); + + cur = next; + } + } + }; + + struct xpath_allocator_capture + { + xpath_allocator_capture(xpath_allocator* alloc): _target(alloc), _state(*alloc) + { + } + + ~xpath_allocator_capture() + { + _target->revert(_state); + } + + xpath_allocator* _target; + xpath_allocator _state; + }; + + struct xpath_stack + { + xpath_allocator* result; + xpath_allocator* temp; + }; + + struct xpath_stack_data + { + xpath_memory_block blocks[2]; + xpath_allocator result; + xpath_allocator temp; + xpath_stack stack; + + #ifdef PUGIXML_NO_EXCEPTIONS + jmp_buf error_handler; + #endif + + xpath_stack_data(): result(blocks + 0), temp(blocks + 1) + { + blocks[0].next = blocks[1].next = 0; + blocks[0].capacity = blocks[1].capacity = sizeof(blocks[0].data); + + stack.result = &result; + stack.temp = &temp; + + #ifdef PUGIXML_NO_EXCEPTIONS + result.error_handler = temp.error_handler = &error_handler; + #endif + } + + ~xpath_stack_data() + { + result.release(); + temp.release(); + } + }; +PUGI__NS_END + +// String class +PUGI__NS_BEGIN + class xpath_string + { + const char_t* _buffer; + bool _uses_heap; + size_t _length_heap; + + static char_t* duplicate_string(const char_t* string, size_t length, xpath_allocator* alloc) + { + char_t* result = static_cast(alloc->allocate((length + 1) * sizeof(char_t))); + assert(result); + + memcpy(result, string, length * sizeof(char_t)); + result[length] = 0; + + return result; + } + + xpath_string(const char_t* buffer, bool uses_heap_, size_t length_heap): _buffer(buffer), _uses_heap(uses_heap_), _length_heap(length_heap) + { + } + + public: + static xpath_string from_const(const char_t* str) + { + return xpath_string(str, false, 0); + } + + static xpath_string from_heap_preallocated(const char_t* begin, const char_t* end) + { + assert(begin <= end && *end == 0); + + return xpath_string(begin, true, static_cast(end - begin)); + } + + static xpath_string from_heap(const char_t* begin, const char_t* end, xpath_allocator* alloc) + { + assert(begin <= end); + + size_t length = static_cast(end - begin); + + return length == 0 ? xpath_string() : xpath_string(duplicate_string(begin, length, alloc), true, length); + } + + xpath_string(): _buffer(PUGIXML_TEXT("")), _uses_heap(false), _length_heap(0) + { + } + + void append(const xpath_string& o, xpath_allocator* alloc) + { + // skip empty sources + if (!*o._buffer) return; + + // fast append for constant empty target and constant source + if (!*_buffer && !_uses_heap && !o._uses_heap) + { + _buffer = o._buffer; + } + else + { + // need to make heap copy + size_t target_length = length(); + size_t source_length = o.length(); + size_t result_length = target_length + source_length; + + // allocate new buffer + char_t* result = static_cast(alloc->reallocate(_uses_heap ? const_cast(_buffer) : 0, (target_length + 1) * sizeof(char_t), (result_length + 1) * sizeof(char_t))); + assert(result); + + // append first string to the new buffer in case there was no reallocation + if (!_uses_heap) memcpy(result, _buffer, target_length * sizeof(char_t)); + + // append second string to the new buffer + memcpy(result + target_length, o._buffer, source_length * sizeof(char_t)); + result[result_length] = 0; + + // finalize + _buffer = result; + _uses_heap = true; + _length_heap = result_length; + } + } + + const char_t* c_str() const + { + return _buffer; + } + + size_t length() const + { + return _uses_heap ? _length_heap : strlength(_buffer); + } + + char_t* data(xpath_allocator* alloc) + { + // make private heap copy + if (!_uses_heap) + { + size_t length_ = strlength(_buffer); + + _buffer = duplicate_string(_buffer, length_, alloc); + _uses_heap = true; + _length_heap = length_; + } + + return const_cast(_buffer); + } + + bool empty() const + { + return *_buffer == 0; + } + + bool operator==(const xpath_string& o) const + { + return strequal(_buffer, o._buffer); + } + + bool operator!=(const xpath_string& o) const + { + return !strequal(_buffer, o._buffer); + } + + bool uses_heap() const + { + return _uses_heap; + } + }; +PUGI__NS_END + +PUGI__NS_BEGIN + PUGI__FN bool starts_with(const char_t* string, const char_t* pattern) + { + while (*pattern && *string == *pattern) + { + string++; + pattern++; + } + + return *pattern == 0; + } + + PUGI__FN const char_t* find_char(const char_t* s, char_t c) + { + #ifdef PUGIXML_WCHAR_MODE + return wcschr(s, c); + #else + return strchr(s, c); + #endif + } + + PUGI__FN const char_t* find_substring(const char_t* s, const char_t* p) + { + #ifdef PUGIXML_WCHAR_MODE + // MSVC6 wcsstr bug workaround (if s is empty it always returns 0) + return (*p == 0) ? s : wcsstr(s, p); + #else + return strstr(s, p); + #endif + } + + // Converts symbol to lower case, if it is an ASCII one + PUGI__FN char_t tolower_ascii(char_t ch) + { + return static_cast(ch - 'A') < 26 ? static_cast(ch | ' ') : ch; + } + + PUGI__FN xpath_string string_value(const xpath_node& na, xpath_allocator* alloc) + { + if (na.attribute()) + return xpath_string::from_const(na.attribute().value()); + else + { + xml_node n = na.node(); + + switch (n.type()) + { + case node_pcdata: + case node_cdata: + case node_comment: + case node_pi: + return xpath_string::from_const(n.value()); + + case node_document: + case node_element: + { + xpath_string result; + + xml_node cur = n.first_child(); + + while (cur && cur != n) + { + if (cur.type() == node_pcdata || cur.type() == node_cdata) + result.append(xpath_string::from_const(cur.value()), alloc); + + if (cur.first_child()) + cur = cur.first_child(); + else if (cur.next_sibling()) + cur = cur.next_sibling(); + else + { + while (!cur.next_sibling() && cur != n) + cur = cur.parent(); + + if (cur != n) cur = cur.next_sibling(); + } + } + + return result; + } + + default: + return xpath_string(); + } + } + } + + PUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn) + { + assert(ln->parent == rn->parent); + + // there is no common ancestor (the shared parent is null), nodes are from different documents + if (!ln->parent) return ln < rn; + + // determine sibling order + xml_node_struct* ls = ln; + xml_node_struct* rs = rn; + + while (ls && rs) + { + if (ls == rn) return true; + if (rs == ln) return false; + + ls = ls->next_sibling; + rs = rs->next_sibling; + } + + // if rn sibling chain ended ln must be before rn + return !rs; + } + + PUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn) + { + // find common ancestor at the same depth, if any + xml_node_struct* lp = ln; + xml_node_struct* rp = rn; + + while (lp && rp && lp->parent != rp->parent) + { + lp = lp->parent; + rp = rp->parent; + } + + // parents are the same! + if (lp && rp) return node_is_before_sibling(lp, rp); + + // nodes are at different depths, need to normalize heights + bool left_higher = !lp; + + while (lp) + { + lp = lp->parent; + ln = ln->parent; + } + + while (rp) + { + rp = rp->parent; + rn = rn->parent; + } + + // one node is the ancestor of the other + if (ln == rn) return left_higher; + + // find common ancestor... again + while (ln->parent != rn->parent) + { + ln = ln->parent; + rn = rn->parent; + } + + return node_is_before_sibling(ln, rn); + } + + PUGI__FN bool node_is_ancestor(xml_node_struct* parent, xml_node_struct* node) + { + while (node && node != parent) node = node->parent; + + return parent && node == parent; + } + + PUGI__FN const void* document_buffer_order(const xpath_node& xnode) + { + xml_node_struct* node = xnode.node().internal_object(); + + if (node) + { + if ((get_document(node).header & xml_memory_page_contents_shared_mask) == 0) + { + if (node->name && (node->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return node->name; + if (node->value && (node->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return node->value; + } + + return 0; + } + + xml_attribute_struct* attr = xnode.attribute().internal_object(); + + if (attr) + { + if ((get_document(attr).header & xml_memory_page_contents_shared_mask) == 0) + { + if ((attr->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return attr->name; + if ((attr->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return attr->value; + } + + return 0; + } + + return 0; + } + + struct document_order_comparator + { + bool operator()(const xpath_node& lhs, const xpath_node& rhs) const + { + // optimized document order based check + const void* lo = document_buffer_order(lhs); + const void* ro = document_buffer_order(rhs); + + if (lo && ro) return lo < ro; + + // slow comparison + xml_node ln = lhs.node(), rn = rhs.node(); + + // compare attributes + if (lhs.attribute() && rhs.attribute()) + { + // shared parent + if (lhs.parent() == rhs.parent()) + { + // determine sibling order + for (xml_attribute a = lhs.attribute(); a; a = a.next_attribute()) + if (a == rhs.attribute()) + return true; + + return false; + } + + // compare attribute parents + ln = lhs.parent(); + rn = rhs.parent(); + } + else if (lhs.attribute()) + { + // attributes go after the parent element + if (lhs.parent() == rhs.node()) return false; + + ln = lhs.parent(); + } + else if (rhs.attribute()) + { + // attributes go after the parent element + if (rhs.parent() == lhs.node()) return true; + + rn = rhs.parent(); + } + + if (ln == rn) return false; + + if (!ln || !rn) return ln < rn; + + return node_is_before(ln.internal_object(), rn.internal_object()); + } + }; + + struct duplicate_comparator + { + bool operator()(const xpath_node& lhs, const xpath_node& rhs) const + { + if (lhs.attribute()) return rhs.attribute() ? lhs.attribute() < rhs.attribute() : true; + else return rhs.attribute() ? false : lhs.node() < rhs.node(); + } + }; + + PUGI__FN double gen_nan() + { + #if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24)) + union { float f; uint32_t i; } u[sizeof(float) == sizeof(uint32_t) ? 1 : -1]; + u[0].i = 0x7fc00000; + return u[0].f; + #else + // fallback + const volatile double zero = 0.0; + return zero / zero; + #endif + } + + PUGI__FN bool is_nan(double value) + { + #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) + return !!_isnan(value); + #elif defined(fpclassify) && defined(FP_NAN) + return fpclassify(value) == FP_NAN; + #else + // fallback + const volatile double v = value; + return v != v; + #endif + } + + PUGI__FN const char_t* convert_number_to_string_special(double value) + { + #if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) + if (_finite(value)) return (value == 0) ? PUGIXML_TEXT("0") : 0; + if (_isnan(value)) return PUGIXML_TEXT("NaN"); + return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); + #elif defined(fpclassify) && defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO) + switch (fpclassify(value)) + { + case FP_NAN: + return PUGIXML_TEXT("NaN"); + + case FP_INFINITE: + return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); + + case FP_ZERO: + return PUGIXML_TEXT("0"); + + default: + return 0; + } + #else + // fallback + const volatile double v = value; + + if (v == 0) return PUGIXML_TEXT("0"); + if (v != v) return PUGIXML_TEXT("NaN"); + if (v * 2 == v) return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); + return 0; + #endif + } + + PUGI__FN bool convert_number_to_boolean(double value) + { + return (value != 0 && !is_nan(value)); + } + + PUGI__FN void truncate_zeros(char* begin, char* end) + { + while (begin != end && end[-1] == '0') end--; + + *end = 0; + } + + // gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent +#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) + PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) + { + // get base values + int sign, exponent; + _ecvt_s(buffer, buffer_size, value, DBL_DIG + 1, &exponent, &sign); + + // truncate redundant zeros + truncate_zeros(buffer, buffer + strlen(buffer)); + + // fill results + *out_mantissa = buffer; + *out_exponent = exponent; + } +#else + PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) + { + // get a scientific notation value with IEEE DBL_DIG decimals + sprintf(buffer, "%.*e", DBL_DIG, value); + assert(strlen(buffer) < buffer_size); + (void)!buffer_size; + + // get the exponent (possibly negative) + char* exponent_string = strchr(buffer, 'e'); + assert(exponent_string); + + int exponent = atoi(exponent_string + 1); + + // extract mantissa string: skip sign + char* mantissa = buffer[0] == '-' ? buffer + 1 : buffer; + assert(mantissa[0] != '0' && mantissa[1] == '.'); + + // divide mantissa by 10 to eliminate integer part + mantissa[1] = mantissa[0]; + mantissa++; + exponent++; + + // remove extra mantissa digits and zero-terminate mantissa + truncate_zeros(mantissa, exponent_string); + + // fill results + *out_mantissa = mantissa; + *out_exponent = exponent; + } +#endif + + PUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator* alloc) + { + // try special number conversion + const char_t* special = convert_number_to_string_special(value); + if (special) return xpath_string::from_const(special); + + // get mantissa + exponent form + char mantissa_buffer[32]; + + char* mantissa; + int exponent; + convert_number_to_mantissa_exponent(value, mantissa_buffer, sizeof(mantissa_buffer), &mantissa, &exponent); + + // allocate a buffer of suitable length for the number + size_t result_size = strlen(mantissa_buffer) + (exponent > 0 ? exponent : -exponent) + 4; + char_t* result = static_cast(alloc->allocate(sizeof(char_t) * result_size)); + assert(result); + + // make the number! + char_t* s = result; + + // sign + if (value < 0) *s++ = '-'; + + // integer part + if (exponent <= 0) + { + *s++ = '0'; + } + else + { + while (exponent > 0) + { + assert(*mantissa == 0 || static_cast(static_cast(*mantissa) - '0') <= 9); + *s++ = *mantissa ? *mantissa++ : '0'; + exponent--; + } + } + + // fractional part + if (*mantissa) + { + // decimal point + *s++ = '.'; + + // extra zeroes from negative exponent + while (exponent < 0) + { + *s++ = '0'; + exponent++; + } + + // extra mantissa digits + while (*mantissa) + { + assert(static_cast(*mantissa - '0') <= 9); + *s++ = *mantissa++; + } + } + + // zero-terminate + assert(s < result + result_size); + *s = 0; + + return xpath_string::from_heap_preallocated(result, s); + } + + PUGI__FN bool check_string_to_number_format(const char_t* string) + { + // parse leading whitespace + while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string; + + // parse sign + if (*string == '-') ++string; + + if (!*string) return false; + + // if there is no integer part, there should be a decimal part with at least one digit + if (!PUGI__IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !PUGI__IS_CHARTYPEX(string[1], ctx_digit))) return false; + + // parse integer part + while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string; + + // parse decimal part + if (*string == '.') + { + ++string; + + while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string; + } + + // parse trailing whitespace + while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string; + + return *string == 0; + } + + PUGI__FN double convert_string_to_number(const char_t* string) + { + // check string format + if (!check_string_to_number_format(string)) return gen_nan(); + + // parse string + #ifdef PUGIXML_WCHAR_MODE + return wcstod(string, 0); + #else + return strtod(string, 0); + #endif + } + + PUGI__FN bool convert_string_to_number_scratch(char_t (&buffer)[32], const char_t* begin, const char_t* end, double* out_result) + { + size_t length = static_cast(end - begin); + char_t* scratch = buffer; + + if (length >= sizeof(buffer) / sizeof(buffer[0])) + { + // need to make dummy on-heap copy + scratch = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!scratch) return false; + } + + // copy string to zero-terminated buffer and perform conversion + memcpy(scratch, begin, length * sizeof(char_t)); + scratch[length] = 0; + + *out_result = convert_string_to_number(scratch); + + // free dummy buffer + if (scratch != buffer) xml_memory::deallocate(scratch); + + return true; + } + + PUGI__FN double round_nearest(double value) + { + return floor(value + 0.5); + } + + PUGI__FN double round_nearest_nzero(double value) + { + // same as round_nearest, but returns -0 for [-0.5, -0] + // ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0) + return (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5); + } + + PUGI__FN const char_t* qualified_name(const xpath_node& node) + { + return node.attribute() ? node.attribute().name() : node.node().name(); + } + + PUGI__FN const char_t* local_name(const xpath_node& node) + { + const char_t* name = qualified_name(node); + const char_t* p = find_char(name, ':'); + + return p ? p + 1 : name; + } + + struct namespace_uri_predicate + { + const char_t* prefix; + size_t prefix_length; + + namespace_uri_predicate(const char_t* name) + { + const char_t* pos = find_char(name, ':'); + + prefix = pos ? name : 0; + prefix_length = pos ? static_cast(pos - name) : 0; + } + + bool operator()(xml_attribute a) const + { + const char_t* name = a.name(); + + if (!starts_with(name, PUGIXML_TEXT("xmlns"))) return false; + + return prefix ? name[5] == ':' && strequalrange(name + 6, prefix, prefix_length) : name[5] == 0; + } + }; + + PUGI__FN const char_t* namespace_uri(xml_node node) + { + namespace_uri_predicate pred = node.name(); + + xml_node p = node; + + while (p) + { + xml_attribute a = p.find_attribute(pred); + + if (a) return a.value(); + + p = p.parent(); + } + + return PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent) + { + namespace_uri_predicate pred = attr.name(); + + // Default namespace does not apply to attributes + if (!pred.prefix) return PUGIXML_TEXT(""); + + xml_node p = parent; + + while (p) + { + xml_attribute a = p.find_attribute(pred); + + if (a) return a.value(); + + p = p.parent(); + } + + return PUGIXML_TEXT(""); + } + + PUGI__FN const char_t* namespace_uri(const xpath_node& node) + { + return node.attribute() ? namespace_uri(node.attribute(), node.parent()) : namespace_uri(node.node()); + } + + PUGI__FN char_t* normalize_space(char_t* buffer) + { + char_t* write = buffer; + + for (char_t* it = buffer; *it; ) + { + char_t ch = *it++; + + if (PUGI__IS_CHARTYPE(ch, ct_space)) + { + // replace whitespace sequence with single space + while (PUGI__IS_CHARTYPE(*it, ct_space)) it++; + + // avoid leading spaces + if (write != buffer) *write++ = ' '; + } + else *write++ = ch; + } + + // remove trailing space + if (write != buffer && PUGI__IS_CHARTYPE(write[-1], ct_space)) write--; + + // zero-terminate + *write = 0; + + return write; + } + + PUGI__FN char_t* translate(char_t* buffer, const char_t* from, const char_t* to, size_t to_length) + { + char_t* write = buffer; + + while (*buffer) + { + PUGI__DMC_VOLATILE char_t ch = *buffer++; + + const char_t* pos = find_char(from, ch); + + if (!pos) + *write++ = ch; // do not process + else if (static_cast(pos - from) < to_length) + *write++ = to[pos - from]; // replace + } + + // zero-terminate + *write = 0; + + return write; + } + + PUGI__FN unsigned char* translate_table_generate(xpath_allocator* alloc, const char_t* from, const char_t* to) + { + unsigned char table[128] = {0}; + + while (*from) + { + unsigned int fc = static_cast(*from); + unsigned int tc = static_cast(*to); + + if (fc >= 128 || tc >= 128) + return 0; + + // code=128 means "skip character" + if (!table[fc]) + table[fc] = static_cast(tc ? tc : 128); + + from++; + if (tc) to++; + } + + for (int i = 0; i < 128; ++i) + if (!table[i]) + table[i] = static_cast(i); + + void* result = alloc->allocate_nothrow(sizeof(table)); + + if (result) + { + memcpy(result, table, sizeof(table)); + } + + return static_cast(result); + } + + PUGI__FN char_t* translate_table(char_t* buffer, const unsigned char* table) + { + char_t* write = buffer; + + while (*buffer) + { + char_t ch = *buffer++; + unsigned int index = static_cast(ch); + + if (index < 128) + { + unsigned char code = table[index]; + + // code=128 means "skip character" (table size is 128 so 128 can be a special value) + // this code skips these characters without extra branches + *write = static_cast(code); + write += 1 - (code >> 7); + } + else + { + *write++ = ch; + } + } + + // zero-terminate + *write = 0; + + return write; + } + + inline bool is_xpath_attribute(const char_t* name) + { + return !(starts_with(name, PUGIXML_TEXT("xmlns")) && (name[5] == 0 || name[5] == ':')); + } + + struct xpath_variable_boolean: xpath_variable + { + xpath_variable_boolean(): xpath_variable(xpath_type_boolean), value(false) + { + } + + bool value; + char_t name[1]; + }; + + struct xpath_variable_number: xpath_variable + { + xpath_variable_number(): xpath_variable(xpath_type_number), value(0) + { + } + + double value; + char_t name[1]; + }; + + struct xpath_variable_string: xpath_variable + { + xpath_variable_string(): xpath_variable(xpath_type_string), value(0) + { + } + + ~xpath_variable_string() + { + if (value) xml_memory::deallocate(value); + } + + char_t* value; + char_t name[1]; + }; + + struct xpath_variable_node_set: xpath_variable + { + xpath_variable_node_set(): xpath_variable(xpath_type_node_set) + { + } + + xpath_node_set value; + char_t name[1]; + }; + + static const xpath_node_set dummy_node_set; + + PUGI__FN unsigned int hash_string(const char_t* str) + { + // Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time) + unsigned int result = 0; + + while (*str) + { + result += static_cast(*str++); + result += result << 10; + result ^= result >> 6; + } + + result += result << 3; + result ^= result >> 11; + result += result << 15; + + return result; + } + + template PUGI__FN T* new_xpath_variable(const char_t* name) + { + size_t length = strlength(name); + if (length == 0) return 0; // empty variable names are invalid + + // $$ we can't use offsetof(T, name) because T is non-POD, so we just allocate additional length characters + void* memory = xml_memory::allocate(sizeof(T) + length * sizeof(char_t)); + if (!memory) return 0; + + T* result = new (memory) T(); + + memcpy(result->name, name, (length + 1) * sizeof(char_t)); + + return result; + } + + PUGI__FN xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name) + { + switch (type) + { + case xpath_type_node_set: + return new_xpath_variable(name); + + case xpath_type_number: + return new_xpath_variable(name); + + case xpath_type_string: + return new_xpath_variable(name); + + case xpath_type_boolean: + return new_xpath_variable(name); + + default: + return 0; + } + } + + template PUGI__FN void delete_xpath_variable(T* var) + { + var->~T(); + xml_memory::deallocate(var); + } + + PUGI__FN void delete_xpath_variable(xpath_value_type type, xpath_variable* var) + { + switch (type) + { + case xpath_type_node_set: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_number: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_string: + delete_xpath_variable(static_cast(var)); + break; + + case xpath_type_boolean: + delete_xpath_variable(static_cast(var)); + break; + + default: + assert(!"Invalid variable type"); + } + } + + PUGI__FN bool copy_xpath_variable(xpath_variable* lhs, const xpath_variable* rhs) + { + switch (rhs->type()) + { + case xpath_type_node_set: + return lhs->set(static_cast(rhs)->value); + + case xpath_type_number: + return lhs->set(static_cast(rhs)->value); + + case xpath_type_string: + return lhs->set(static_cast(rhs)->value); + + case xpath_type_boolean: + return lhs->set(static_cast(rhs)->value); + + default: + assert(!"Invalid variable type"); + return false; + } + } + + PUGI__FN bool get_variable_scratch(char_t (&buffer)[32], xpath_variable_set* set, const char_t* begin, const char_t* end, xpath_variable** out_result) + { + size_t length = static_cast(end - begin); + char_t* scratch = buffer; + + if (length >= sizeof(buffer) / sizeof(buffer[0])) + { + // need to make dummy on-heap copy + scratch = static_cast(xml_memory::allocate((length + 1) * sizeof(char_t))); + if (!scratch) return false; + } + + // copy string to zero-terminated buffer and perform lookup + memcpy(scratch, begin, length * sizeof(char_t)); + scratch[length] = 0; + + *out_result = set->get(scratch); + + // free dummy buffer + if (scratch != buffer) xml_memory::deallocate(scratch); + + return true; + } +PUGI__NS_END + +// Internal node set class +PUGI__NS_BEGIN + PUGI__FN xpath_node_set::type_t xpath_get_order(const xpath_node* begin, const xpath_node* end) + { + if (end - begin < 2) + return xpath_node_set::type_sorted; + + document_order_comparator cmp; + + bool first = cmp(begin[0], begin[1]); + + for (const xpath_node* it = begin + 1; it + 1 < end; ++it) + if (cmp(it[0], it[1]) != first) + return xpath_node_set::type_unsorted; + + return first ? xpath_node_set::type_sorted : xpath_node_set::type_sorted_reverse; + } + + PUGI__FN xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev) + { + xpath_node_set::type_t order = rev ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted; + + if (type == xpath_node_set::type_unsorted) + { + xpath_node_set::type_t sorted = xpath_get_order(begin, end); + + if (sorted == xpath_node_set::type_unsorted) + { + sort(begin, end, document_order_comparator()); + + type = xpath_node_set::type_sorted; + } + else + type = sorted; + } + + if (type != order) reverse(begin, end); + + return order; + } + + PUGI__FN xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type) + { + if (begin == end) return xpath_node(); + + switch (type) + { + case xpath_node_set::type_sorted: + return *begin; + + case xpath_node_set::type_sorted_reverse: + return *(end - 1); + + case xpath_node_set::type_unsorted: + return *min_element(begin, end, document_order_comparator()); + + default: + assert(!"Invalid node set type"); + return xpath_node(); + } + } + + class xpath_node_set_raw + { + xpath_node_set::type_t _type; + + xpath_node* _begin; + xpath_node* _end; + xpath_node* _eos; + + public: + xpath_node_set_raw(): _type(xpath_node_set::type_unsorted), _begin(0), _end(0), _eos(0) + { + } + + xpath_node* begin() const + { + return _begin; + } + + xpath_node* end() const + { + return _end; + } + + bool empty() const + { + return _begin == _end; + } + + size_t size() const + { + return static_cast(_end - _begin); + } + + xpath_node first() const + { + return xpath_first(_begin, _end, _type); + } + + void push_back_grow(const xpath_node& node, xpath_allocator* alloc); + + void push_back(const xpath_node& node, xpath_allocator* alloc) + { + if (_end != _eos) + *_end++ = node; + else + push_back_grow(node, alloc); + } + + void append(const xpath_node* begin_, const xpath_node* end_, xpath_allocator* alloc) + { + if (begin_ == end_) return; + + size_t size_ = static_cast(_end - _begin); + size_t capacity = static_cast(_eos - _begin); + size_t count = static_cast(end_ - begin_); + + if (size_ + count > capacity) + { + // reallocate the old array or allocate a new one + xpath_node* data = static_cast(alloc->reallocate(_begin, capacity * sizeof(xpath_node), (size_ + count) * sizeof(xpath_node))); + assert(data); + + // finalize + _begin = data; + _end = data + size_; + _eos = data + size_ + count; + } + + memcpy(_end, begin_, count * sizeof(xpath_node)); + _end += count; + } + + void sort_do() + { + _type = xpath_sort(_begin, _end, _type, false); + } + + void truncate(xpath_node* pos) + { + assert(_begin <= pos && pos <= _end); + + _end = pos; + } + + void remove_duplicates() + { + if (_type == xpath_node_set::type_unsorted) + sort(_begin, _end, duplicate_comparator()); + + _end = unique(_begin, _end); + } + + xpath_node_set::type_t type() const + { + return _type; + } + + void set_type(xpath_node_set::type_t value) + { + _type = value; + } + }; + + PUGI__FN_NO_INLINE void xpath_node_set_raw::push_back_grow(const xpath_node& node, xpath_allocator* alloc) + { + size_t capacity = static_cast(_eos - _begin); + + // get new capacity (1.5x rule) + size_t new_capacity = capacity + capacity / 2 + 1; + + // reallocate the old array or allocate a new one + xpath_node* data = static_cast(alloc->reallocate(_begin, capacity * sizeof(xpath_node), new_capacity * sizeof(xpath_node))); + assert(data); + + // finalize + _begin = data; + _end = data + capacity; + _eos = data + new_capacity; + + // push + *_end++ = node; + } +PUGI__NS_END + +PUGI__NS_BEGIN + struct xpath_context + { + xpath_node n; + size_t position, size; + + xpath_context(const xpath_node& n_, size_t position_, size_t size_): n(n_), position(position_), size(size_) + { + } + }; + + enum lexeme_t + { + lex_none = 0, + lex_equal, + lex_not_equal, + lex_less, + lex_greater, + lex_less_or_equal, + lex_greater_or_equal, + lex_plus, + lex_minus, + lex_multiply, + lex_union, + lex_var_ref, + lex_open_brace, + lex_close_brace, + lex_quoted_string, + lex_number, + lex_slash, + lex_double_slash, + lex_open_square_brace, + lex_close_square_brace, + lex_string, + lex_comma, + lex_axis_attribute, + lex_dot, + lex_double_dot, + lex_double_colon, + lex_eof + }; + + struct xpath_lexer_string + { + const char_t* begin; + const char_t* end; + + xpath_lexer_string(): begin(0), end(0) + { + } + + bool operator==(const char_t* other) const + { + size_t length = static_cast(end - begin); + + return strequalrange(other, begin, length); + } + }; + + class xpath_lexer + { + const char_t* _cur; + const char_t* _cur_lexeme_pos; + xpath_lexer_string _cur_lexeme_contents; + + lexeme_t _cur_lexeme; + + public: + explicit xpath_lexer(const char_t* query): _cur(query) + { + next(); + } + + const char_t* state() const + { + return _cur; + } + + void next() + { + const char_t* cur = _cur; + + while (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur; + + // save lexeme position for error reporting + _cur_lexeme_pos = cur; + + switch (*cur) + { + case 0: + _cur_lexeme = lex_eof; + break; + + case '>': + if (*(cur+1) == '=') + { + cur += 2; + _cur_lexeme = lex_greater_or_equal; + } + else + { + cur += 1; + _cur_lexeme = lex_greater; + } + break; + + case '<': + if (*(cur+1) == '=') + { + cur += 2; + _cur_lexeme = lex_less_or_equal; + } + else + { + cur += 1; + _cur_lexeme = lex_less; + } + break; + + case '!': + if (*(cur+1) == '=') + { + cur += 2; + _cur_lexeme = lex_not_equal; + } + else + { + _cur_lexeme = lex_none; + } + break; + + case '=': + cur += 1; + _cur_lexeme = lex_equal; + + break; + + case '+': + cur += 1; + _cur_lexeme = lex_plus; + + break; + + case '-': + cur += 1; + _cur_lexeme = lex_minus; + + break; + + case '*': + cur += 1; + _cur_lexeme = lex_multiply; + + break; + + case '|': + cur += 1; + _cur_lexeme = lex_union; + + break; + + case '$': + cur += 1; + + if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol)) + { + _cur_lexeme_contents.begin = cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + + if (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname + { + cur++; // : + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_var_ref; + } + else + { + _cur_lexeme = lex_none; + } + + break; + + case '(': + cur += 1; + _cur_lexeme = lex_open_brace; + + break; + + case ')': + cur += 1; + _cur_lexeme = lex_close_brace; + + break; + + case '[': + cur += 1; + _cur_lexeme = lex_open_square_brace; + + break; + + case ']': + cur += 1; + _cur_lexeme = lex_close_square_brace; + + break; + + case ',': + cur += 1; + _cur_lexeme = lex_comma; + + break; + + case '/': + if (*(cur+1) == '/') + { + cur += 2; + _cur_lexeme = lex_double_slash; + } + else + { + cur += 1; + _cur_lexeme = lex_slash; + } + break; + + case '.': + if (*(cur+1) == '.') + { + cur += 2; + _cur_lexeme = lex_double_dot; + } + else if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit)) + { + _cur_lexeme_contents.begin = cur; // . + + ++cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_number; + } + else + { + cur += 1; + _cur_lexeme = lex_dot; + } + break; + + case '@': + cur += 1; + _cur_lexeme = lex_axis_attribute; + + break; + + case '"': + case '\'': + { + char_t terminator = *cur; + + ++cur; + + _cur_lexeme_contents.begin = cur; + while (*cur && *cur != terminator) cur++; + _cur_lexeme_contents.end = cur; + + if (!*cur) + _cur_lexeme = lex_none; + else + { + cur += 1; + _cur_lexeme = lex_quoted_string; + } + + break; + } + + case ':': + if (*(cur+1) == ':') + { + cur += 2; + _cur_lexeme = lex_double_colon; + } + else + { + _cur_lexeme = lex_none; + } + break; + + default: + if (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) + { + _cur_lexeme_contents.begin = cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; + + if (*cur == '.') + { + cur++; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_number; + } + else if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol)) + { + _cur_lexeme_contents.begin = cur; + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + + if (cur[0] == ':') + { + if (cur[1] == '*') // namespace test ncname:* + { + cur += 2; // :* + } + else if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname + { + cur++; // : + + while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + } + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_string; + } + else + { + _cur_lexeme = lex_none; + } + } + + _cur = cur; + } + + lexeme_t current() const + { + return _cur_lexeme; + } + + const char_t* current_pos() const + { + return _cur_lexeme_pos; + } + + const xpath_lexer_string& contents() const + { + assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string); + + return _cur_lexeme_contents; + } + }; + + enum ast_type_t + { + ast_unknown, + ast_op_or, // left or right + ast_op_and, // left and right + ast_op_equal, // left = right + ast_op_not_equal, // left != right + ast_op_less, // left < right + ast_op_greater, // left > right + ast_op_less_or_equal, // left <= right + ast_op_greater_or_equal, // left >= right + ast_op_add, // left + right + ast_op_subtract, // left - right + ast_op_multiply, // left * right + ast_op_divide, // left / right + ast_op_mod, // left % right + ast_op_negate, // left - right + ast_op_union, // left | right + ast_predicate, // apply predicate to set; next points to next predicate + ast_filter, // select * from left where right + ast_string_constant, // string constant + ast_number_constant, // number constant + ast_variable, // variable + ast_func_last, // last() + ast_func_position, // position() + ast_func_count, // count(left) + ast_func_id, // id(left) + ast_func_local_name_0, // local-name() + ast_func_local_name_1, // local-name(left) + ast_func_namespace_uri_0, // namespace-uri() + ast_func_namespace_uri_1, // namespace-uri(left) + ast_func_name_0, // name() + ast_func_name_1, // name(left) + ast_func_string_0, // string() + ast_func_string_1, // string(left) + ast_func_concat, // concat(left, right, siblings) + ast_func_starts_with, // starts_with(left, right) + ast_func_contains, // contains(left, right) + ast_func_substring_before, // substring-before(left, right) + ast_func_substring_after, // substring-after(left, right) + ast_func_substring_2, // substring(left, right) + ast_func_substring_3, // substring(left, right, third) + ast_func_string_length_0, // string-length() + ast_func_string_length_1, // string-length(left) + ast_func_normalize_space_0, // normalize-space() + ast_func_normalize_space_1, // normalize-space(left) + ast_func_translate, // translate(left, right, third) + ast_func_boolean, // boolean(left) + ast_func_not, // not(left) + ast_func_true, // true() + ast_func_false, // false() + ast_func_lang, // lang(left) + ast_func_number_0, // number() + ast_func_number_1, // number(left) + ast_func_sum, // sum(left) + ast_func_floor, // floor(left) + ast_func_ceiling, // ceiling(left) + ast_func_round, // round(left) + ast_step, // process set left with step + ast_step_root, // select root node + + ast_opt_translate_table, // translate(left, right, third) where right/third are constants + ast_opt_compare_attribute // @name = 'string' + }; + + enum axis_t + { + axis_ancestor, + axis_ancestor_or_self, + axis_attribute, + axis_child, + axis_descendant, + axis_descendant_or_self, + axis_following, + axis_following_sibling, + axis_namespace, + axis_parent, + axis_preceding, + axis_preceding_sibling, + axis_self + }; + + enum nodetest_t + { + nodetest_none, + nodetest_name, + nodetest_type_node, + nodetest_type_comment, + nodetest_type_pi, + nodetest_type_text, + nodetest_pi, + nodetest_all, + nodetest_all_in_namespace + }; + + enum predicate_t + { + predicate_default, + predicate_posinv, + predicate_constant, + predicate_constant_one + }; + + enum nodeset_eval_t + { + nodeset_eval_all, + nodeset_eval_any, + nodeset_eval_first + }; + + template struct axis_to_type + { + static const axis_t axis; + }; + + template const axis_t axis_to_type::axis = N; + + class xpath_ast_node + { + private: + // node type + char _type; + char _rettype; + + // for ast_step + char _axis; + + // for ast_step/ast_predicate/ast_filter + char _test; + + // tree node structure + xpath_ast_node* _left; + xpath_ast_node* _right; + xpath_ast_node* _next; + + union + { + // value for ast_string_constant + const char_t* string; + // value for ast_number_constant + double number; + // variable for ast_variable + xpath_variable* variable; + // node test for ast_step (node name/namespace/node type/pi target) + const char_t* nodetest; + // table for ast_opt_translate_table + const unsigned char* table; + } _data; + + xpath_ast_node(const xpath_ast_node&); + xpath_ast_node& operator=(const xpath_ast_node&); + + template static bool compare_eq(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp) + { + xpath_value_type lt = lhs->rettype(), rt = rhs->rettype(); + + if (lt != xpath_type_node_set && rt != xpath_type_node_set) + { + if (lt == xpath_type_boolean || rt == xpath_type_boolean) + return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack)); + else if (lt == xpath_type_number || rt == xpath_type_number) + return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack)); + else if (lt == xpath_type_string || rt == xpath_type_string) + { + xpath_allocator_capture cr(stack.result); + + xpath_string ls = lhs->eval_string(c, stack); + xpath_string rs = rhs->eval_string(c, stack); + + return comp(ls, rs); + } + } + else if (lt == xpath_type_node_set && rt == xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* li = ls.begin(); li != ls.end(); ++li) + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(string_value(*li, stack.result), string_value(*ri, stack.result))) + return true; + } + + return false; + } + else + { + if (lt == xpath_type_node_set) + { + swap(lhs, rhs); + swap(lt, rt); + } + + if (lt == xpath_type_boolean) + return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack)); + else if (lt == xpath_type_number) + { + xpath_allocator_capture cr(stack.result); + + double l = lhs->eval_number(c, stack); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str()))) + return true; + } + + return false; + } + else if (lt == xpath_type_string) + { + xpath_allocator_capture cr(stack.result); + + xpath_string l = lhs->eval_string(c, stack); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(l, string_value(*ri, stack.result))) + return true; + } + + return false; + } + } + + assert(!"Wrong types"); + return false; + } + + static bool eval_once(xpath_node_set::type_t type, nodeset_eval_t eval) + { + return type == xpath_node_set::type_sorted ? eval != nodeset_eval_all : eval == nodeset_eval_any; + } + + template static bool compare_rel(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp) + { + xpath_value_type lt = lhs->rettype(), rt = rhs->rettype(); + + if (lt != xpath_type_node_set && rt != xpath_type_node_set) + return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack)); + else if (lt == xpath_type_node_set && rt == xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* li = ls.begin(); li != ls.end(); ++li) + { + xpath_allocator_capture cri(stack.result); + + double l = convert_string_to_number(string_value(*li, stack.result).c_str()); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture crii(stack.result); + + if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str()))) + return true; + } + } + + return false; + } + else if (lt != xpath_type_node_set && rt == xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + double l = lhs->eval_number(c, stack); + xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri) + { + xpath_allocator_capture cri(stack.result); + + if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str()))) + return true; + } + + return false; + } + else if (lt == xpath_type_node_set && rt != xpath_type_node_set) + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all); + double r = rhs->eval_number(c, stack); + + for (const xpath_node* li = ls.begin(); li != ls.end(); ++li) + { + xpath_allocator_capture cri(stack.result); + + if (comp(convert_string_to_number(string_value(*li, stack.result).c_str()), r)) + return true; + } + + return false; + } + else + { + assert(!"Wrong types"); + return false; + } + } + + static void apply_predicate_boolean(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once) + { + assert(ns.size() >= first); + assert(expr->rettype() != xpath_type_number); + + size_t i = 1; + size_t size = ns.size() - first; + + xpath_node* last = ns.begin() + first; + + // remove_if... or well, sort of + for (xpath_node* it = last; it != ns.end(); ++it, ++i) + { + xpath_context c(*it, i, size); + + if (expr->eval_boolean(c, stack)) + { + *last++ = *it; + + if (once) break; + } + } + + ns.truncate(last); + } + + static void apply_predicate_number(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once) + { + assert(ns.size() >= first); + assert(expr->rettype() == xpath_type_number); + + size_t i = 1; + size_t size = ns.size() - first; + + xpath_node* last = ns.begin() + first; + + // remove_if... or well, sort of + for (xpath_node* it = last; it != ns.end(); ++it, ++i) + { + xpath_context c(*it, i, size); + + if (expr->eval_number(c, stack) == i) + { + *last++ = *it; + + if (once) break; + } + } + + ns.truncate(last); + } + + static void apply_predicate_number_const(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack) + { + assert(ns.size() >= first); + assert(expr->rettype() == xpath_type_number); + + size_t size = ns.size() - first; + + xpath_node* last = ns.begin() + first; + + xpath_context c(xpath_node(), 1, size); + + double er = expr->eval_number(c, stack); + + if (er >= 1.0 && er <= size) + { + size_t eri = static_cast(er); + + if (er == eri) + { + xpath_node r = last[eri - 1]; + + *last++ = r; + } + } + + ns.truncate(last); + } + + void apply_predicate(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, bool once) + { + if (ns.size() == first) return; + + assert(_type == ast_filter || _type == ast_predicate); + + if (_test == predicate_constant || _test == predicate_constant_one) + apply_predicate_number_const(ns, first, _right, stack); + else if (_right->rettype() == xpath_type_number) + apply_predicate_number(ns, first, _right, stack, once); + else + apply_predicate_boolean(ns, first, _right, stack, once); + } + + void apply_predicates(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, nodeset_eval_t eval) + { + if (ns.size() == first) return; + + bool last_once = eval_once(ns.type(), eval); + + for (xpath_ast_node* pred = _right; pred; pred = pred->_next) + pred->apply_predicate(ns, first, stack, !pred->_next && last_once); + } + + bool step_push(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* parent, xpath_allocator* alloc) + { + assert(a); + + const char_t* name = a->name ? a->name + 0 : PUGIXML_TEXT(""); + + switch (_test) + { + case nodetest_name: + if (strequal(name, _data.nodetest) && is_xpath_attribute(name)) + { + ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc); + return true; + } + break; + + case nodetest_type_node: + case nodetest_all: + if (is_xpath_attribute(name)) + { + ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc); + return true; + } + break; + + case nodetest_all_in_namespace: + if (starts_with(name, _data.nodetest) && is_xpath_attribute(name)) + { + ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc); + return true; + } + break; + + default: + ; + } + + return false; + } + + bool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc) + { + assert(n); + + xml_node_type type = PUGI__NODETYPE(n); + + switch (_test) + { + case nodetest_name: + if (type == node_element && n->name && strequal(n->name, _data.nodetest)) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_type_node: + ns.push_back(xml_node(n), alloc); + return true; + + case nodetest_type_comment: + if (type == node_comment) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_type_text: + if (type == node_pcdata || type == node_cdata) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_type_pi: + if (type == node_pi) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_pi: + if (type == node_pi && n->name && strequal(n->name, _data.nodetest)) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_all: + if (type == node_element) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + case nodetest_all_in_namespace: + if (type == node_element && n->name && starts_with(n->name, _data.nodetest)) + { + ns.push_back(xml_node(n), alloc); + return true; + } + break; + + default: + assert(!"Unknown axis"); + } + + return false; + } + + template void step_fill(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc, bool once, T) + { + const axis_t axis = T::axis; + + switch (axis) + { + case axis_attribute: + { + for (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute) + if (step_push(ns, a, n, alloc) & once) + return; + + break; + } + + case axis_child: + { + for (xml_node_struct* c = n->first_child; c; c = c->next_sibling) + if (step_push(ns, c, alloc) & once) + return; + + break; + } + + case axis_descendant: + case axis_descendant_or_self: + { + if (axis == axis_descendant_or_self) + if (step_push(ns, n, alloc) & once) + return; + + xml_node_struct* cur = n->first_child; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + if (cur->first_child) + cur = cur->first_child; + else + { + while (!cur->next_sibling) + { + cur = cur->parent; + + if (cur == n) return; + } + + cur = cur->next_sibling; + } + } + + break; + } + + case axis_following_sibling: + { + for (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling) + if (step_push(ns, c, alloc) & once) + return; + + break; + } + + case axis_preceding_sibling: + { + for (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c) + if (step_push(ns, c, alloc) & once) + return; + + break; + } + + case axis_following: + { + xml_node_struct* cur = n; + + // exit from this node so that we don't include descendants + while (!cur->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->next_sibling; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + if (cur->first_child) + cur = cur->first_child; + else + { + while (!cur->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->next_sibling; + } + } + + break; + } + + case axis_preceding: + { + xml_node_struct* cur = n; + + // exit from this node so that we don't include descendants + while (!cur->prev_sibling_c->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->prev_sibling_c; + + while (cur) + { + if (cur->first_child) + cur = cur->first_child->prev_sibling_c; + else + { + // leaf node, can't be ancestor + if (step_push(ns, cur, alloc) & once) + return; + + while (!cur->prev_sibling_c->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + + if (!node_is_ancestor(cur, n)) + if (step_push(ns, cur, alloc) & once) + return; + } + + cur = cur->prev_sibling_c; + } + } + + break; + } + + case axis_ancestor: + case axis_ancestor_or_self: + { + if (axis == axis_ancestor_or_self) + if (step_push(ns, n, alloc) & once) + return; + + xml_node_struct* cur = n->parent; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + cur = cur->parent; + } + + break; + } + + case axis_self: + { + step_push(ns, n, alloc); + + break; + } + + case axis_parent: + { + if (n->parent) + step_push(ns, n->parent, alloc); + + break; + } + + default: + assert(!"Unimplemented axis"); + } + } + + template void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v) + { + const axis_t axis = T::axis; + + switch (axis) + { + case axis_ancestor: + case axis_ancestor_or_self: + { + if (axis == axis_ancestor_or_self && _test == nodetest_type_node) // reject attributes based on principal node type test + if (step_push(ns, a, p, alloc) & once) + return; + + xml_node_struct* cur = p; + + while (cur) + { + if (step_push(ns, cur, alloc) & once) + return; + + cur = cur->parent; + } + + break; + } + + case axis_descendant_or_self: + case axis_self: + { + if (_test == nodetest_type_node) // reject attributes based on principal node type test + step_push(ns, a, p, alloc); + + break; + } + + case axis_following: + { + xml_node_struct* cur = p; + + while (cur) + { + if (cur->first_child) + cur = cur->first_child; + else + { + while (!cur->next_sibling) + { + cur = cur->parent; + + if (!cur) return; + } + + cur = cur->next_sibling; + } + + if (step_push(ns, cur, alloc) & once) + return; + } + + break; + } + + case axis_parent: + { + step_push(ns, p, alloc); + + break; + } + + case axis_preceding: + { + // preceding:: axis does not include attribute nodes and attribute ancestors (they are the same as parent's ancestors), so we can reuse node preceding + step_fill(ns, p, alloc, once, v); + break; + } + + default: + assert(!"Unimplemented axis"); + } + } + + template void step_fill(xpath_node_set_raw& ns, const xpath_node& xn, xpath_allocator* alloc, bool once, T v) + { + const axis_t axis = T::axis; + const bool axis_has_attributes = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_descendant_or_self || axis == axis_following || axis == axis_parent || axis == axis_preceding || axis == axis_self); + + if (xn.node()) + step_fill(ns, xn.node().internal_object(), alloc, once, v); + else if (axis_has_attributes && xn.attribute() && xn.parent()) + step_fill(ns, xn.attribute().internal_object(), xn.parent().internal_object(), alloc, once, v); + } + + template xpath_node_set_raw step_do(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval, T v) + { + const axis_t axis = T::axis; + const bool axis_reverse = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_preceding || axis == axis_preceding_sibling); + const xpath_node_set::type_t axis_type = axis_reverse ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted; + + bool once = + (axis == axis_attribute && _test == nodetest_name) || + (!_right && eval_once(axis_type, eval)) || + (_right && !_right->_next && _right->_test == predicate_constant_one); + + xpath_node_set_raw ns; + ns.set_type(axis_type); + + if (_left) + { + xpath_node_set_raw s = _left->eval_node_set(c, stack, nodeset_eval_all); + + // self axis preserves the original order + if (axis == axis_self) ns.set_type(s.type()); + + for (const xpath_node* it = s.begin(); it != s.end(); ++it) + { + size_t size = ns.size(); + + // in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes + if (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted); + + step_fill(ns, *it, stack.result, once, v); + if (_right) apply_predicates(ns, size, stack, eval); + } + } + else + { + step_fill(ns, c.n, stack.result, once, v); + if (_right) apply_predicates(ns, 0, stack, eval); + } + + // child, attribute and self axes always generate unique set of nodes + // for other axis, if the set stayed sorted, it stayed unique because the traversal algorithms do not visit the same node twice + if (axis != axis_child && axis != axis_attribute && axis != axis_self && ns.type() == xpath_node_set::type_unsorted) + ns.remove_duplicates(); + + return ns; + } + + public: + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) + { + assert(type == ast_string_constant); + _data.string = value; + } + + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, double value): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) + { + assert(type == ast_number_constant); + _data.number = value; + } + + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) + { + assert(type == ast_variable); + _data.variable = value; + } + + xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0): + _type(static_cast(type)), _rettype(static_cast(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0) + { + } + + xpath_ast_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents): + _type(static_cast(type)), _rettype(xpath_type_node_set), _axis(static_cast(axis)), _test(static_cast(test)), _left(left), _right(0), _next(0) + { + assert(type == ast_step); + _data.nodetest = contents; + } + + xpath_ast_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test): + _type(static_cast(type)), _rettype(xpath_type_node_set), _axis(0), _test(static_cast(test)), _left(left), _right(right), _next(0) + { + assert(type == ast_filter || type == ast_predicate); + } + + void set_next(xpath_ast_node* value) + { + _next = value; + } + + void set_right(xpath_ast_node* value) + { + _right = value; + } + + bool eval_boolean(const xpath_context& c, const xpath_stack& stack) + { + switch (_type) + { + case ast_op_or: + return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack); + + case ast_op_and: + return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack); + + case ast_op_equal: + return compare_eq(_left, _right, c, stack, equal_to()); + + case ast_op_not_equal: + return compare_eq(_left, _right, c, stack, not_equal_to()); + + case ast_op_less: + return compare_rel(_left, _right, c, stack, less()); + + case ast_op_greater: + return compare_rel(_right, _left, c, stack, less()); + + case ast_op_less_or_equal: + return compare_rel(_left, _right, c, stack, less_equal()); + + case ast_op_greater_or_equal: + return compare_rel(_right, _left, c, stack, less_equal()); + + case ast_func_starts_with: + { + xpath_allocator_capture cr(stack.result); + + xpath_string lr = _left->eval_string(c, stack); + xpath_string rr = _right->eval_string(c, stack); + + return starts_with(lr.c_str(), rr.c_str()); + } + + case ast_func_contains: + { + xpath_allocator_capture cr(stack.result); + + xpath_string lr = _left->eval_string(c, stack); + xpath_string rr = _right->eval_string(c, stack); + + return find_substring(lr.c_str(), rr.c_str()) != 0; + } + + case ast_func_boolean: + return _left->eval_boolean(c, stack); + + case ast_func_not: + return !_left->eval_boolean(c, stack); + + case ast_func_true: + return true; + + case ast_func_false: + return false; + + case ast_func_lang: + { + if (c.n.attribute()) return false; + + xpath_allocator_capture cr(stack.result); + + xpath_string lang = _left->eval_string(c, stack); + + for (xml_node n = c.n.node(); n; n = n.parent()) + { + xml_attribute a = n.attribute(PUGIXML_TEXT("xml:lang")); + + if (a) + { + const char_t* value = a.value(); + + // strnicmp / strncasecmp is not portable + for (const char_t* lit = lang.c_str(); *lit; ++lit) + { + if (tolower_ascii(*lit) != tolower_ascii(*value)) return false; + ++value; + } + + return *value == 0 || *value == '-'; + } + } + + return false; + } + + case ast_opt_compare_attribute: + { + const char_t* value = (_right->_type == ast_string_constant) ? _right->_data.string : _right->_data.variable->get_string(); + + xml_attribute attr = c.n.node().attribute(_left->_data.nodetest); + + return attr && strequal(attr.value(), value) && is_xpath_attribute(attr.name()); + } + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_boolean) + return _data.variable->get_boolean(); + + // fallthrough to type conversion + } + + default: + { + switch (_rettype) + { + case xpath_type_number: + return convert_number_to_boolean(eval_number(c, stack)); + + case xpath_type_string: + { + xpath_allocator_capture cr(stack.result); + + return !eval_string(c, stack).empty(); + } + + case xpath_type_node_set: + { + xpath_allocator_capture cr(stack.result); + + return !eval_node_set(c, stack, nodeset_eval_any).empty(); + } + + default: + assert(!"Wrong expression for return type boolean"); + return false; + } + } + } + } + + double eval_number(const xpath_context& c, const xpath_stack& stack) + { + switch (_type) + { + case ast_op_add: + return _left->eval_number(c, stack) + _right->eval_number(c, stack); + + case ast_op_subtract: + return _left->eval_number(c, stack) - _right->eval_number(c, stack); + + case ast_op_multiply: + return _left->eval_number(c, stack) * _right->eval_number(c, stack); + + case ast_op_divide: + return _left->eval_number(c, stack) / _right->eval_number(c, stack); + + case ast_op_mod: + return fmod(_left->eval_number(c, stack), _right->eval_number(c, stack)); + + case ast_op_negate: + return -_left->eval_number(c, stack); + + case ast_number_constant: + return _data.number; + + case ast_func_last: + return static_cast(c.size); + + case ast_func_position: + return static_cast(c.position); + + case ast_func_count: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(_left->eval_node_set(c, stack, nodeset_eval_all).size()); + } + + case ast_func_string_length_0: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(string_value(c.n, stack.result).length()); + } + + case ast_func_string_length_1: + { + xpath_allocator_capture cr(stack.result); + + return static_cast(_left->eval_string(c, stack).length()); + } + + case ast_func_number_0: + { + xpath_allocator_capture cr(stack.result); + + return convert_string_to_number(string_value(c.n, stack.result).c_str()); + } + + case ast_func_number_1: + return _left->eval_number(c, stack); + + case ast_func_sum: + { + xpath_allocator_capture cr(stack.result); + + double r = 0; + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all); + + for (const xpath_node* it = ns.begin(); it != ns.end(); ++it) + { + xpath_allocator_capture cri(stack.result); + + r += convert_string_to_number(string_value(*it, stack.result).c_str()); + } + + return r; + } + + case ast_func_floor: + { + double r = _left->eval_number(c, stack); + + return r == r ? floor(r) : r; + } + + case ast_func_ceiling: + { + double r = _left->eval_number(c, stack); + + return r == r ? ceil(r) : r; + } + + case ast_func_round: + return round_nearest_nzero(_left->eval_number(c, stack)); + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_number) + return _data.variable->get_number(); + + // fallthrough to type conversion + } + + default: + { + switch (_rettype) + { + case xpath_type_boolean: + return eval_boolean(c, stack) ? 1 : 0; + + case xpath_type_string: + { + xpath_allocator_capture cr(stack.result); + + return convert_string_to_number(eval_string(c, stack).c_str()); + } + + case xpath_type_node_set: + { + xpath_allocator_capture cr(stack.result); + + return convert_string_to_number(eval_string(c, stack).c_str()); + } + + default: + assert(!"Wrong expression for return type number"); + return 0; + } + + } + } + } + + xpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack) + { + assert(_type == ast_func_concat); + + xpath_allocator_capture ct(stack.temp); + + // count the string number + size_t count = 1; + for (xpath_ast_node* nc = _right; nc; nc = nc->_next) count++; + + // gather all strings + xpath_string static_buffer[4]; + xpath_string* buffer = static_buffer; + + // allocate on-heap for large concats + if (count > sizeof(static_buffer) / sizeof(static_buffer[0])) + { + buffer = static_cast(stack.temp->allocate(count * sizeof(xpath_string))); + assert(buffer); + } + + // evaluate all strings to temporary stack + xpath_stack swapped_stack = {stack.temp, stack.result}; + + buffer[0] = _left->eval_string(c, swapped_stack); + + size_t pos = 1; + for (xpath_ast_node* n = _right; n; n = n->_next, ++pos) buffer[pos] = n->eval_string(c, swapped_stack); + assert(pos == count); + + // get total length + size_t length = 0; + for (size_t i = 0; i < count; ++i) length += buffer[i].length(); + + // create final string + char_t* result = static_cast(stack.result->allocate((length + 1) * sizeof(char_t))); + assert(result); + + char_t* ri = result; + + for (size_t j = 0; j < count; ++j) + for (const char_t* bi = buffer[j].c_str(); *bi; ++bi) + *ri++ = *bi; + + *ri = 0; + + return xpath_string::from_heap_preallocated(result, ri); + } + + xpath_string eval_string(const xpath_context& c, const xpath_stack& stack) + { + switch (_type) + { + case ast_string_constant: + return xpath_string::from_const(_data.string); + + case ast_func_local_name_0: + { + xpath_node na = c.n; + + return xpath_string::from_const(local_name(na)); + } + + case ast_func_local_name_1: + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); + xpath_node na = ns.first(); + + return xpath_string::from_const(local_name(na)); + } + + case ast_func_name_0: + { + xpath_node na = c.n; + + return xpath_string::from_const(qualified_name(na)); + } + + case ast_func_name_1: + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); + xpath_node na = ns.first(); + + return xpath_string::from_const(qualified_name(na)); + } + + case ast_func_namespace_uri_0: + { + xpath_node na = c.n; + + return xpath_string::from_const(namespace_uri(na)); + } + + case ast_func_namespace_uri_1: + { + xpath_allocator_capture cr(stack.result); + + xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first); + xpath_node na = ns.first(); + + return xpath_string::from_const(namespace_uri(na)); + } + + case ast_func_string_0: + return string_value(c.n, stack.result); + + case ast_func_string_1: + return _left->eval_string(c, stack); + + case ast_func_concat: + return eval_string_concat(c, stack); + + case ast_func_substring_before: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + xpath_string p = _right->eval_string(c, swapped_stack); + + const char_t* pos = find_substring(s.c_str(), p.c_str()); + + return pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string(); + } + + case ast_func_substring_after: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + xpath_string p = _right->eval_string(c, swapped_stack); + + const char_t* pos = find_substring(s.c_str(), p.c_str()); + if (!pos) return xpath_string(); + + const char_t* rbegin = pos + p.length(); + const char_t* rend = s.c_str() + s.length(); + + return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin); + } + + case ast_func_substring_2: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + size_t s_length = s.length(); + + double first = round_nearest(_right->eval_number(c, stack)); + + if (is_nan(first)) return xpath_string(); // NaN + else if (first >= s_length + 1) return xpath_string(); + + size_t pos = first < 1 ? 1 : static_cast(first); + assert(1 <= pos && pos <= s_length + 1); + + const char_t* rbegin = s.c_str() + (pos - 1); + const char_t* rend = s.c_str() + s.length(); + + return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin); + } + + case ast_func_substring_3: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, swapped_stack); + size_t s_length = s.length(); + + double first = round_nearest(_right->eval_number(c, stack)); + double last = first + round_nearest(_right->_next->eval_number(c, stack)); + + if (is_nan(first) || is_nan(last)) return xpath_string(); + else if (first >= s_length + 1) return xpath_string(); + else if (first >= last) return xpath_string(); + else if (last < 1) return xpath_string(); + + size_t pos = first < 1 ? 1 : static_cast(first); + size_t end = last >= s_length + 1 ? s_length + 1 : static_cast(last); + + assert(1 <= pos && pos <= end && end <= s_length + 1); + const char_t* rbegin = s.c_str() + (pos - 1); + const char_t* rend = s.c_str() + (end - 1); + + return (end == s_length + 1 && !s.uses_heap()) ? xpath_string::from_const(rbegin) : xpath_string::from_heap(rbegin, rend, stack.result); + } + + case ast_func_normalize_space_0: + { + xpath_string s = string_value(c.n, stack.result); + + char_t* begin = s.data(stack.result); + char_t* end = normalize_space(begin); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_func_normalize_space_1: + { + xpath_string s = _left->eval_string(c, stack); + + char_t* begin = s.data(stack.result); + char_t* end = normalize_space(begin); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_func_translate: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_string s = _left->eval_string(c, stack); + xpath_string from = _right->eval_string(c, swapped_stack); + xpath_string to = _right->_next->eval_string(c, swapped_stack); + + char_t* begin = s.data(stack.result); + char_t* end = translate(begin, from.c_str(), to.c_str(), to.length()); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_opt_translate_table: + { + xpath_string s = _left->eval_string(c, stack); + + char_t* begin = s.data(stack.result); + char_t* end = translate_table(begin, _data.table); + + return xpath_string::from_heap_preallocated(begin, end); + } + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_string) + return xpath_string::from_const(_data.variable->get_string()); + + // fallthrough to type conversion + } + + default: + { + switch (_rettype) + { + case xpath_type_boolean: + return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); + + case xpath_type_number: + return convert_number_to_string(eval_number(c, stack), stack.result); + + case xpath_type_node_set: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first); + return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result); + } + + default: + assert(!"Wrong expression for return type string"); + return xpath_string(); + } + } + } + } + + xpath_node_set_raw eval_node_set(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval) + { + switch (_type) + { + case ast_op_union: + { + xpath_allocator_capture cr(stack.temp); + + xpath_stack swapped_stack = {stack.temp, stack.result}; + + xpath_node_set_raw ls = _left->eval_node_set(c, swapped_stack, eval); + xpath_node_set_raw rs = _right->eval_node_set(c, stack, eval); + + // we can optimize merging two sorted sets, but this is a very rare operation, so don't bother + rs.set_type(xpath_node_set::type_unsorted); + + rs.append(ls.begin(), ls.end(), stack.result); + rs.remove_duplicates(); + + return rs; + } + + case ast_filter: + { + xpath_node_set_raw set = _left->eval_node_set(c, stack, _test == predicate_constant_one ? nodeset_eval_first : nodeset_eval_all); + + // either expression is a number or it contains position() call; sort by document order + if (_test != predicate_posinv) set.sort_do(); + + bool once = eval_once(set.type(), eval); + + apply_predicate(set, 0, stack, once); + + return set; + } + + case ast_func_id: + return xpath_node_set_raw(); + + case ast_step: + { + switch (_axis) + { + case axis_ancestor: + return step_do(c, stack, eval, axis_to_type()); + + case axis_ancestor_or_self: + return step_do(c, stack, eval, axis_to_type()); + + case axis_attribute: + return step_do(c, stack, eval, axis_to_type()); + + case axis_child: + return step_do(c, stack, eval, axis_to_type()); + + case axis_descendant: + return step_do(c, stack, eval, axis_to_type()); + + case axis_descendant_or_self: + return step_do(c, stack, eval, axis_to_type()); + + case axis_following: + return step_do(c, stack, eval, axis_to_type()); + + case axis_following_sibling: + return step_do(c, stack, eval, axis_to_type()); + + case axis_namespace: + // namespaced axis is not supported + return xpath_node_set_raw(); + + case axis_parent: + return step_do(c, stack, eval, axis_to_type()); + + case axis_preceding: + return step_do(c, stack, eval, axis_to_type()); + + case axis_preceding_sibling: + return step_do(c, stack, eval, axis_to_type()); + + case axis_self: + return step_do(c, stack, eval, axis_to_type()); + + default: + assert(!"Unknown axis"); + return xpath_node_set_raw(); + } + } + + case ast_step_root: + { + assert(!_right); // root step can't have any predicates + + xpath_node_set_raw ns; + + ns.set_type(xpath_node_set::type_sorted); + + if (c.n.node()) ns.push_back(c.n.node().root(), stack.result); + else if (c.n.attribute()) ns.push_back(c.n.parent().root(), stack.result); + + return ns; + } + + case ast_variable: + { + assert(_rettype == _data.variable->type()); + + if (_rettype == xpath_type_node_set) + { + const xpath_node_set& s = _data.variable->get_node_set(); + + xpath_node_set_raw ns; + + ns.set_type(s.type()); + ns.append(s.begin(), s.end(), stack.result); + + return ns; + } + + // fallthrough to type conversion + } + + default: + assert(!"Wrong expression for return type node set"); + return xpath_node_set_raw(); + } + } + + void optimize(xpath_allocator* alloc) + { + if (_left) _left->optimize(alloc); + if (_right) _right->optimize(alloc); + if (_next) _next->optimize(alloc); + + optimize_self(alloc); + } + + void optimize_self(xpath_allocator* alloc) + { + // Rewrite [position()=expr] with [expr] + // Note that this step has to go before classification to recognize [position()=1] + if ((_type == ast_filter || _type == ast_predicate) && + _right->_type == ast_op_equal && _right->_left->_type == ast_func_position && _right->_right->_rettype == xpath_type_number) + { + _right = _right->_right; + } + + // Classify filter/predicate ops to perform various optimizations during evaluation + if (_type == ast_filter || _type == ast_predicate) + { + assert(_test == predicate_default); + + if (_right->_type == ast_number_constant && _right->_data.number == 1.0) + _test = predicate_constant_one; + else if (_right->_rettype == xpath_type_number && (_right->_type == ast_number_constant || _right->_type == ast_variable || _right->_type == ast_func_last)) + _test = predicate_constant; + else if (_right->_rettype != xpath_type_number && _right->is_posinv_expr()) + _test = predicate_posinv; + } + + // Rewrite descendant-or-self::node()/child::foo with descendant::foo + // The former is a full form of //foo, the latter is much faster since it executes the node test immediately + // Do a similar kind of rewrite for self/descendant/descendant-or-self axes + // Note that we only rewrite positionally invariant steps (//foo[1] != /descendant::foo[1]) + if (_type == ast_step && (_axis == axis_child || _axis == axis_self || _axis == axis_descendant || _axis == axis_descendant_or_self) && _left && + _left->_type == ast_step && _left->_axis == axis_descendant_or_self && _left->_test == nodetest_type_node && !_left->_right && + is_posinv_step()) + { + if (_axis == axis_child || _axis == axis_descendant) + _axis = axis_descendant; + else + _axis = axis_descendant_or_self; + + _left = _left->_left; + } + + // Use optimized lookup table implementation for translate() with constant arguments + if (_type == ast_func_translate && _right->_type == ast_string_constant && _right->_next->_type == ast_string_constant) + { + unsigned char* table = translate_table_generate(alloc, _right->_data.string, _right->_next->_data.string); + + if (table) + { + _type = ast_opt_translate_table; + _data.table = table; + } + } + + // Use optimized path for @attr = 'value' or @attr = $value + if (_type == ast_op_equal && + _left->_type == ast_step && _left->_axis == axis_attribute && _left->_test == nodetest_name && !_left->_left && !_left->_right && + (_right->_type == ast_string_constant || (_right->_type == ast_variable && _right->_rettype == xpath_type_string))) + { + _type = ast_opt_compare_attribute; + } + } + + bool is_posinv_expr() const + { + switch (_type) + { + case ast_func_position: + case ast_func_last: + return false; + + case ast_string_constant: + case ast_number_constant: + case ast_variable: + return true; + + case ast_step: + case ast_step_root: + return true; + + case ast_predicate: + case ast_filter: + return true; + + default: + if (_left && !_left->is_posinv_expr()) return false; + + for (xpath_ast_node* n = _right; n; n = n->_next) + if (!n->is_posinv_expr()) return false; + + return true; + } + } + + bool is_posinv_step() const + { + assert(_type == ast_step); + + for (xpath_ast_node* n = _right; n; n = n->_next) + { + assert(n->_type == ast_predicate); + + if (n->_test != predicate_posinv) + return false; + } + + return true; + } + + xpath_value_type rettype() const + { + return static_cast(_rettype); + } + }; + + struct xpath_parser + { + xpath_allocator* _alloc; + xpath_lexer _lexer; + + const char_t* _query; + xpath_variable_set* _variables; + + xpath_parse_result* _result; + + char_t _scratch[32]; + + #ifdef PUGIXML_NO_EXCEPTIONS + jmp_buf _error_handler; + #endif + + void throw_error(const char* message) + { + _result->error = message; + _result->offset = _lexer.current_pos() - _query; + + #ifdef PUGIXML_NO_EXCEPTIONS + longjmp(_error_handler, 1); + #else + throw xpath_exception(*_result); + #endif + } + + void throw_error_oom() + { + #ifdef PUGIXML_NO_EXCEPTIONS + throw_error("Out of memory"); + #else + throw std::bad_alloc(); + #endif + } + + void* alloc_node() + { + void* result = _alloc->allocate_nothrow(sizeof(xpath_ast_node)); + + if (!result) throw_error_oom(); + + return result; + } + + const char_t* alloc_string(const xpath_lexer_string& value) + { + if (value.begin) + { + size_t length = static_cast(value.end - value.begin); + + char_t* c = static_cast(_alloc->allocate_nothrow((length + 1) * sizeof(char_t))); + if (!c) throw_error_oom(); + assert(c); // workaround for clang static analysis + + memcpy(c, value.begin, length * sizeof(char_t)); + c[length] = 0; + + return c; + } + else return 0; + } + + xpath_ast_node* parse_function_helper(ast_type_t type0, ast_type_t type1, size_t argc, xpath_ast_node* args[2]) + { + assert(argc <= 1); + + if (argc == 1 && args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set"); + + return new (alloc_node()) xpath_ast_node(argc == 0 ? type0 : type1, xpath_type_string, args[0]); + } + + xpath_ast_node* parse_function(const xpath_lexer_string& name, size_t argc, xpath_ast_node* args[2]) + { + switch (name.begin[0]) + { + case 'b': + if (name == PUGIXML_TEXT("boolean") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_boolean, xpath_type_boolean, args[0]); + + break; + + case 'c': + if (name == PUGIXML_TEXT("count") && argc == 1) + { + if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set"); + return new (alloc_node()) xpath_ast_node(ast_func_count, xpath_type_number, args[0]); + } + else if (name == PUGIXML_TEXT("contains") && argc == 2) + return new (alloc_node()) xpath_ast_node(ast_func_contains, xpath_type_boolean, args[0], args[1]); + else if (name == PUGIXML_TEXT("concat") && argc >= 2) + return new (alloc_node()) xpath_ast_node(ast_func_concat, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("ceiling") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_ceiling, xpath_type_number, args[0]); + + break; + + case 'f': + if (name == PUGIXML_TEXT("false") && argc == 0) + return new (alloc_node()) xpath_ast_node(ast_func_false, xpath_type_boolean); + else if (name == PUGIXML_TEXT("floor") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_floor, xpath_type_number, args[0]); + + break; + + case 'i': + if (name == PUGIXML_TEXT("id") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_id, xpath_type_node_set, args[0]); + + break; + + case 'l': + if (name == PUGIXML_TEXT("last") && argc == 0) + return new (alloc_node()) xpath_ast_node(ast_func_last, xpath_type_number); + else if (name == PUGIXML_TEXT("lang") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_lang, xpath_type_boolean, args[0]); + else if (name == PUGIXML_TEXT("local-name") && argc <= 1) + return parse_function_helper(ast_func_local_name_0, ast_func_local_name_1, argc, args); + + break; + + case 'n': + if (name == PUGIXML_TEXT("name") && argc <= 1) + return parse_function_helper(ast_func_name_0, ast_func_name_1, argc, args); + else if (name == PUGIXML_TEXT("namespace-uri") && argc <= 1) + return parse_function_helper(ast_func_namespace_uri_0, ast_func_namespace_uri_1, argc, args); + else if (name == PUGIXML_TEXT("normalize-space") && argc <= 1) + return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("not") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_not, xpath_type_boolean, args[0]); + else if (name == PUGIXML_TEXT("number") && argc <= 1) + return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]); + + break; + + case 'p': + if (name == PUGIXML_TEXT("position") && argc == 0) + return new (alloc_node()) xpath_ast_node(ast_func_position, xpath_type_number); + + break; + + case 'r': + if (name == PUGIXML_TEXT("round") && argc == 1) + return new (alloc_node()) xpath_ast_node(ast_func_round, xpath_type_number, args[0]); + + break; + + case 's': + if (name == PUGIXML_TEXT("string") && argc <= 1) + return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]); + else if (name == PUGIXML_TEXT("string-length") && argc <= 1) + return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]); + else if (name == PUGIXML_TEXT("starts-with") && argc == 2) + return new (alloc_node()) xpath_ast_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring-before") && argc == 2) + return new (alloc_node()) xpath_ast_node(ast_func_substring_before, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring-after") && argc == 2) + return new (alloc_node()) xpath_ast_node(ast_func_substring_after, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("substring") && (argc == 2 || argc == 3)) + return new (alloc_node()) xpath_ast_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("sum") && argc == 1) + { + if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set"); + return new (alloc_node()) xpath_ast_node(ast_func_sum, xpath_type_number, args[0]); + } + + break; + + case 't': + if (name == PUGIXML_TEXT("translate") && argc == 3) + return new (alloc_node()) xpath_ast_node(ast_func_translate, xpath_type_string, args[0], args[1]); + else if (name == PUGIXML_TEXT("true") && argc == 0) + return new (alloc_node()) xpath_ast_node(ast_func_true, xpath_type_boolean); + + break; + + default: + break; + } + + throw_error("Unrecognized function or wrong parameter count"); + + return 0; + } + + axis_t parse_axis_name(const xpath_lexer_string& name, bool& specified) + { + specified = true; + + switch (name.begin[0]) + { + case 'a': + if (name == PUGIXML_TEXT("ancestor")) + return axis_ancestor; + else if (name == PUGIXML_TEXT("ancestor-or-self")) + return axis_ancestor_or_self; + else if (name == PUGIXML_TEXT("attribute")) + return axis_attribute; + + break; + + case 'c': + if (name == PUGIXML_TEXT("child")) + return axis_child; + + break; + + case 'd': + if (name == PUGIXML_TEXT("descendant")) + return axis_descendant; + else if (name == PUGIXML_TEXT("descendant-or-self")) + return axis_descendant_or_self; + + break; + + case 'f': + if (name == PUGIXML_TEXT("following")) + return axis_following; + else if (name == PUGIXML_TEXT("following-sibling")) + return axis_following_sibling; + + break; + + case 'n': + if (name == PUGIXML_TEXT("namespace")) + return axis_namespace; + + break; + + case 'p': + if (name == PUGIXML_TEXT("parent")) + return axis_parent; + else if (name == PUGIXML_TEXT("preceding")) + return axis_preceding; + else if (name == PUGIXML_TEXT("preceding-sibling")) + return axis_preceding_sibling; + + break; + + case 's': + if (name == PUGIXML_TEXT("self")) + return axis_self; + + break; + + default: + break; + } + + specified = false; + return axis_child; + } + + nodetest_t parse_node_test_type(const xpath_lexer_string& name) + { + switch (name.begin[0]) + { + case 'c': + if (name == PUGIXML_TEXT("comment")) + return nodetest_type_comment; + + break; + + case 'n': + if (name == PUGIXML_TEXT("node")) + return nodetest_type_node; + + break; + + case 'p': + if (name == PUGIXML_TEXT("processing-instruction")) + return nodetest_type_pi; + + break; + + case 't': + if (name == PUGIXML_TEXT("text")) + return nodetest_type_text; + + break; + + default: + break; + } + + return nodetest_none; + } + + // PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall + xpath_ast_node* parse_primary_expression() + { + switch (_lexer.current()) + { + case lex_var_ref: + { + xpath_lexer_string name = _lexer.contents(); + + if (!_variables) + throw_error("Unknown variable: variable set is not provided"); + + xpath_variable* var = 0; + if (!get_variable_scratch(_scratch, _variables, name.begin, name.end, &var)) + throw_error_oom(); + + if (!var) + throw_error("Unknown variable: variable set does not contain the given name"); + + _lexer.next(); + + return new (alloc_node()) xpath_ast_node(ast_variable, var->type(), var); + } + + case lex_open_brace: + { + _lexer.next(); + + xpath_ast_node* n = parse_expression(); + + if (_lexer.current() != lex_close_brace) + throw_error("Unmatched braces"); + + _lexer.next(); + + return n; + } + + case lex_quoted_string: + { + const char_t* value = alloc_string(_lexer.contents()); + + xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_string_constant, xpath_type_string, value); + _lexer.next(); + + return n; + } + + case lex_number: + { + double value = 0; + + if (!convert_string_to_number_scratch(_scratch, _lexer.contents().begin, _lexer.contents().end, &value)) + throw_error_oom(); + + xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_number_constant, xpath_type_number, value); + _lexer.next(); + + return n; + } + + case lex_string: + { + xpath_ast_node* args[2] = {0}; + size_t argc = 0; + + xpath_lexer_string function = _lexer.contents(); + _lexer.next(); + + xpath_ast_node* last_arg = 0; + + if (_lexer.current() != lex_open_brace) + throw_error("Unrecognized function call"); + _lexer.next(); + + if (_lexer.current() != lex_close_brace) + args[argc++] = parse_expression(); + + while (_lexer.current() != lex_close_brace) + { + if (_lexer.current() != lex_comma) + throw_error("No comma between function arguments"); + _lexer.next(); + + xpath_ast_node* n = parse_expression(); + + if (argc < 2) args[argc] = n; + else last_arg->set_next(n); + + argc++; + last_arg = n; + } + + _lexer.next(); + + return parse_function(function, argc, args); + } + + default: + throw_error("Unrecognizable primary expression"); + + return 0; + } + } + + // FilterExpr ::= PrimaryExpr | FilterExpr Predicate + // Predicate ::= '[' PredicateExpr ']' + // PredicateExpr ::= Expr + xpath_ast_node* parse_filter_expression() + { + xpath_ast_node* n = parse_primary_expression(); + + while (_lexer.current() == lex_open_square_brace) + { + _lexer.next(); + + xpath_ast_node* expr = parse_expression(); + + if (n->rettype() != xpath_type_node_set) throw_error("Predicate has to be applied to node set"); + + n = new (alloc_node()) xpath_ast_node(ast_filter, n, expr, predicate_default); + + if (_lexer.current() != lex_close_square_brace) + throw_error("Unmatched square brace"); + + _lexer.next(); + } + + return n; + } + + // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep + // AxisSpecifier ::= AxisName '::' | '@'? + // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')' + // NameTest ::= '*' | NCName ':' '*' | QName + // AbbreviatedStep ::= '.' | '..' + xpath_ast_node* parse_step(xpath_ast_node* set) + { + if (set && set->rettype() != xpath_type_node_set) + throw_error("Step has to be applied to node set"); + + bool axis_specified = false; + axis_t axis = axis_child; // implied child axis + + if (_lexer.current() == lex_axis_attribute) + { + axis = axis_attribute; + axis_specified = true; + + _lexer.next(); + } + else if (_lexer.current() == lex_dot) + { + _lexer.next(); + + return new (alloc_node()) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0); + } + else if (_lexer.current() == lex_double_dot) + { + _lexer.next(); + + return new (alloc_node()) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0); + } + + nodetest_t nt_type = nodetest_none; + xpath_lexer_string nt_name; + + if (_lexer.current() == lex_string) + { + // node name test + nt_name = _lexer.contents(); + _lexer.next(); + + // was it an axis name? + if (_lexer.current() == lex_double_colon) + { + // parse axis name + if (axis_specified) throw_error("Two axis specifiers in one step"); + + axis = parse_axis_name(nt_name, axis_specified); + + if (!axis_specified) throw_error("Unknown axis"); + + // read actual node test + _lexer.next(); + + if (_lexer.current() == lex_multiply) + { + nt_type = nodetest_all; + nt_name = xpath_lexer_string(); + _lexer.next(); + } + else if (_lexer.current() == lex_string) + { + nt_name = _lexer.contents(); + _lexer.next(); + } + else throw_error("Unrecognized node test"); + } + + if (nt_type == nodetest_none) + { + // node type test or processing-instruction + if (_lexer.current() == lex_open_brace) + { + _lexer.next(); + + if (_lexer.current() == lex_close_brace) + { + _lexer.next(); + + nt_type = parse_node_test_type(nt_name); + + if (nt_type == nodetest_none) throw_error("Unrecognized node type"); + + nt_name = xpath_lexer_string(); + } + else if (nt_name == PUGIXML_TEXT("processing-instruction")) + { + if (_lexer.current() != lex_quoted_string) + throw_error("Only literals are allowed as arguments to processing-instruction()"); + + nt_type = nodetest_pi; + nt_name = _lexer.contents(); + _lexer.next(); + + if (_lexer.current() != lex_close_brace) + throw_error("Unmatched brace near processing-instruction()"); + _lexer.next(); + } + else + throw_error("Unmatched brace near node type test"); + + } + // QName or NCName:* + else + { + if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:* + { + nt_name.end--; // erase * + + nt_type = nodetest_all_in_namespace; + } + else nt_type = nodetest_name; + } + } + } + else if (_lexer.current() == lex_multiply) + { + nt_type = nodetest_all; + _lexer.next(); + } + else throw_error("Unrecognized node test"); + + xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step, set, axis, nt_type, alloc_string(nt_name)); + + xpath_ast_node* last = 0; + + while (_lexer.current() == lex_open_square_brace) + { + _lexer.next(); + + xpath_ast_node* expr = parse_expression(); + + xpath_ast_node* pred = new (alloc_node()) xpath_ast_node(ast_predicate, 0, expr, predicate_default); + + if (_lexer.current() != lex_close_square_brace) + throw_error("Unmatched square brace"); + _lexer.next(); + + if (last) last->set_next(pred); + else n->set_right(pred); + + last = pred; + } + + return n; + } + + // RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step + xpath_ast_node* parse_relative_location_path(xpath_ast_node* set) + { + xpath_ast_node* n = parse_step(set); + + while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash) + { + lexeme_t l = _lexer.current(); + _lexer.next(); + + if (l == lex_double_slash) + n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + + n = parse_step(n); + } + + return n; + } + + // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath + // AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath + xpath_ast_node* parse_location_path() + { + if (_lexer.current() == lex_slash) + { + _lexer.next(); + + xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set); + + // relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path + lexeme_t l = _lexer.current(); + + if (l == lex_string || l == lex_axis_attribute || l == lex_dot || l == lex_double_dot || l == lex_multiply) + return parse_relative_location_path(n); + else + return n; + } + else if (_lexer.current() == lex_double_slash) + { + _lexer.next(); + + xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set); + n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + + return parse_relative_location_path(n); + } + + // else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1 + return parse_relative_location_path(0); + } + + // PathExpr ::= LocationPath + // | FilterExpr + // | FilterExpr '/' RelativeLocationPath + // | FilterExpr '//' RelativeLocationPath + // UnionExpr ::= PathExpr | UnionExpr '|' PathExpr + // UnaryExpr ::= UnionExpr | '-' UnaryExpr + xpath_ast_node* parse_path_or_unary_expression() + { + // Clarification. + // PathExpr begins with either LocationPath or FilterExpr. + // FilterExpr begins with PrimaryExpr + // PrimaryExpr begins with '$' in case of it being a variable reference, + // '(' in case of it being an expression, string literal, number constant or + // function call. + + if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace || + _lexer.current() == lex_quoted_string || _lexer.current() == lex_number || + _lexer.current() == lex_string) + { + if (_lexer.current() == lex_string) + { + // This is either a function call, or not - if not, we shall proceed with location path + const char_t* state = _lexer.state(); + + while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state; + + if (*state != '(') return parse_location_path(); + + // This looks like a function call; however this still can be a node-test. Check it. + if (parse_node_test_type(_lexer.contents()) != nodetest_none) return parse_location_path(); + } + + xpath_ast_node* n = parse_filter_expression(); + + if (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash) + { + lexeme_t l = _lexer.current(); + _lexer.next(); + + if (l == lex_double_slash) + { + if (n->rettype() != xpath_type_node_set) throw_error("Step has to be applied to node set"); + + n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); + } + + // select from location path + return parse_relative_location_path(n); + } + + return n; + } + else if (_lexer.current() == lex_minus) + { + _lexer.next(); + + // precedence 7+ - only parses union expressions + xpath_ast_node* expr = parse_expression_rec(parse_path_or_unary_expression(), 7); + + return new (alloc_node()) xpath_ast_node(ast_op_negate, xpath_type_number, expr); + } + else + return parse_location_path(); + } + + struct binary_op_t + { + ast_type_t asttype; + xpath_value_type rettype; + int precedence; + + binary_op_t(): asttype(ast_unknown), rettype(xpath_type_none), precedence(0) + { + } + + binary_op_t(ast_type_t asttype_, xpath_value_type rettype_, int precedence_): asttype(asttype_), rettype(rettype_), precedence(precedence_) + { + } + + static binary_op_t parse(xpath_lexer& lexer) + { + switch (lexer.current()) + { + case lex_string: + if (lexer.contents() == PUGIXML_TEXT("or")) + return binary_op_t(ast_op_or, xpath_type_boolean, 1); + else if (lexer.contents() == PUGIXML_TEXT("and")) + return binary_op_t(ast_op_and, xpath_type_boolean, 2); + else if (lexer.contents() == PUGIXML_TEXT("div")) + return binary_op_t(ast_op_divide, xpath_type_number, 6); + else if (lexer.contents() == PUGIXML_TEXT("mod")) + return binary_op_t(ast_op_mod, xpath_type_number, 6); + else + return binary_op_t(); + + case lex_equal: + return binary_op_t(ast_op_equal, xpath_type_boolean, 3); + + case lex_not_equal: + return binary_op_t(ast_op_not_equal, xpath_type_boolean, 3); + + case lex_less: + return binary_op_t(ast_op_less, xpath_type_boolean, 4); + + case lex_greater: + return binary_op_t(ast_op_greater, xpath_type_boolean, 4); + + case lex_less_or_equal: + return binary_op_t(ast_op_less_or_equal, xpath_type_boolean, 4); + + case lex_greater_or_equal: + return binary_op_t(ast_op_greater_or_equal, xpath_type_boolean, 4); + + case lex_plus: + return binary_op_t(ast_op_add, xpath_type_number, 5); + + case lex_minus: + return binary_op_t(ast_op_subtract, xpath_type_number, 5); + + case lex_multiply: + return binary_op_t(ast_op_multiply, xpath_type_number, 6); + + case lex_union: + return binary_op_t(ast_op_union, xpath_type_node_set, 7); + + default: + return binary_op_t(); + } + } + }; + + xpath_ast_node* parse_expression_rec(xpath_ast_node* lhs, int limit) + { + binary_op_t op = binary_op_t::parse(_lexer); + + while (op.asttype != ast_unknown && op.precedence >= limit) + { + _lexer.next(); + + xpath_ast_node* rhs = parse_path_or_unary_expression(); + + binary_op_t nextop = binary_op_t::parse(_lexer); + + while (nextop.asttype != ast_unknown && nextop.precedence > op.precedence) + { + rhs = parse_expression_rec(rhs, nextop.precedence); + + nextop = binary_op_t::parse(_lexer); + } + + if (op.asttype == ast_op_union && (lhs->rettype() != xpath_type_node_set || rhs->rettype() != xpath_type_node_set)) + throw_error("Union operator has to be applied to node sets"); + + lhs = new (alloc_node()) xpath_ast_node(op.asttype, op.rettype, lhs, rhs); + + op = binary_op_t::parse(_lexer); + } + + return lhs; + } + + // Expr ::= OrExpr + // OrExpr ::= AndExpr | OrExpr 'or' AndExpr + // AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr + // EqualityExpr ::= RelationalExpr + // | EqualityExpr '=' RelationalExpr + // | EqualityExpr '!=' RelationalExpr + // RelationalExpr ::= AdditiveExpr + // | RelationalExpr '<' AdditiveExpr + // | RelationalExpr '>' AdditiveExpr + // | RelationalExpr '<=' AdditiveExpr + // | RelationalExpr '>=' AdditiveExpr + // AdditiveExpr ::= MultiplicativeExpr + // | AdditiveExpr '+' MultiplicativeExpr + // | AdditiveExpr '-' MultiplicativeExpr + // MultiplicativeExpr ::= UnaryExpr + // | MultiplicativeExpr '*' UnaryExpr + // | MultiplicativeExpr 'div' UnaryExpr + // | MultiplicativeExpr 'mod' UnaryExpr + xpath_ast_node* parse_expression() + { + return parse_expression_rec(parse_path_or_unary_expression(), 0); + } + + xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result) + { + } + + xpath_ast_node* parse() + { + xpath_ast_node* result = parse_expression(); + + if (_lexer.current() != lex_eof) + { + // there are still unparsed tokens left, error + throw_error("Incorrect query"); + } + + return result; + } + + static xpath_ast_node* parse(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result) + { + xpath_parser parser(query, variables, alloc, result); + + #ifdef PUGIXML_NO_EXCEPTIONS + int error = setjmp(parser._error_handler); + + return (error == 0) ? parser.parse() : 0; + #else + return parser.parse(); + #endif + } + }; + + struct xpath_query_impl + { + static xpath_query_impl* create() + { + void* memory = xml_memory::allocate(sizeof(xpath_query_impl)); + if (!memory) return 0; + + return new (memory) xpath_query_impl(); + } + + static void destroy(xpath_query_impl* impl) + { + // free all allocated pages + impl->alloc.release(); + + // free allocator memory (with the first page) + xml_memory::deallocate(impl); + } + + xpath_query_impl(): root(0), alloc(&block) + { + block.next = 0; + block.capacity = sizeof(block.data); + } + + xpath_ast_node* root; + xpath_allocator alloc; + xpath_memory_block block; + }; + + PUGI__FN xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd) + { + if (!impl) return xpath_string(); + + #ifdef PUGIXML_NO_EXCEPTIONS + if (setjmp(sd.error_handler)) return xpath_string(); + #endif + + xpath_context c(n, 1, 1); + + return impl->root->eval_string(c, sd.stack); + } + + PUGI__FN impl::xpath_ast_node* evaluate_node_set_prepare(xpath_query_impl* impl) + { + if (!impl) return 0; + + if (impl->root->rettype() != xpath_type_node_set) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return 0; + #else + xpath_parse_result res; + res.error = "Expression does not evaluate to node set"; + + throw xpath_exception(res); + #endif + } + + return impl->root; + } +PUGI__NS_END + +namespace pugi +{ +#ifndef PUGIXML_NO_EXCEPTIONS + PUGI__FN xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_) + { + assert(_result.error); + } + + PUGI__FN const char* xpath_exception::what() const throw() + { + return _result.error; + } + + PUGI__FN const xpath_parse_result& xpath_exception::result() const + { + return _result; + } +#endif + + PUGI__FN xpath_node::xpath_node() + { + } + + PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_) + { + } + + PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_) + { + } + + PUGI__FN xml_node xpath_node::node() const + { + return _attribute ? xml_node() : _node; + } + + PUGI__FN xml_attribute xpath_node::attribute() const + { + return _attribute; + } + + PUGI__FN xml_node xpath_node::parent() const + { + return _attribute ? _node : _node.parent(); + } + + PUGI__FN static void unspecified_bool_xpath_node(xpath_node***) + { + } + + PUGI__FN xpath_node::operator xpath_node::unspecified_bool_type() const + { + return (_node || _attribute) ? unspecified_bool_xpath_node : 0; + } + + PUGI__FN bool xpath_node::operator!() const + { + return !(_node || _attribute); + } + + PUGI__FN bool xpath_node::operator==(const xpath_node& n) const + { + return _node == n._node && _attribute == n._attribute; + } + + PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const + { + return _node != n._node || _attribute != n._attribute; + } + +#ifdef __BORLANDC__ + PUGI__FN bool operator&&(const xpath_node& lhs, bool rhs) + { + return (bool)lhs && rhs; + } + + PUGI__FN bool operator||(const xpath_node& lhs, bool rhs) + { + return (bool)lhs || rhs; + } +#endif + + PUGI__FN void xpath_node_set::_assign(const_iterator begin_, const_iterator end_, type_t type_) + { + assert(begin_ <= end_); + + size_t size_ = static_cast(end_ - begin_); + + if (size_ <= 1) + { + // deallocate old buffer + if (_begin != &_storage) impl::xml_memory::deallocate(_begin); + + // use internal buffer + if (begin_ != end_) _storage = *begin_; + + _begin = &_storage; + _end = &_storage + size_; + _type = type_; + } + else + { + // make heap copy + xpath_node* storage = static_cast(impl::xml_memory::allocate(size_ * sizeof(xpath_node))); + + if (!storage) + { + #ifdef PUGIXML_NO_EXCEPTIONS + return; + #else + throw std::bad_alloc(); + #endif + } + + memcpy(storage, begin_, size_ * sizeof(xpath_node)); + + // deallocate old buffer + if (_begin != &_storage) impl::xml_memory::deallocate(_begin); + + // finalize + _begin = storage; + _end = storage + size_; + _type = type_; + } + } + +#if __cplusplus >= 201103 + PUGI__FN void xpath_node_set::_move(xpath_node_set& rhs) + { + _type = rhs._type; + _storage = rhs._storage; + _begin = (rhs._begin == &rhs._storage) ? &_storage : rhs._begin; + _end = _begin + (rhs._end - rhs._begin); + + rhs._type = type_unsorted; + rhs._begin = &rhs._storage; + rhs._end = rhs._begin; + } +#endif + + PUGI__FN xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(&_storage), _end(&_storage) + { + } + + PUGI__FN xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_unsorted), _begin(&_storage), _end(&_storage) + { + _assign(begin_, end_, type_); + } + + PUGI__FN xpath_node_set::~xpath_node_set() + { + if (_begin != &_storage) + impl::xml_memory::deallocate(_begin); + } + + PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(type_unsorted), _begin(&_storage), _end(&_storage) + { + _assign(ns._begin, ns._end, ns._type); + } + + PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns) + { + if (this == &ns) return *this; + + _assign(ns._begin, ns._end, ns._type); + + return *this; + } + +#if __cplusplus >= 201103 + PUGI__FN xpath_node_set::xpath_node_set(xpath_node_set&& rhs): _type(type_unsorted), _begin(&_storage), _end(&_storage) + { + _move(rhs); + } + + PUGI__FN xpath_node_set& xpath_node_set::operator=(xpath_node_set&& rhs) + { + if (this == &rhs) return *this; + + if (_begin != &_storage) + impl::xml_memory::deallocate(_begin); + + _move(rhs); + + return *this; + } +#endif + + PUGI__FN xpath_node_set::type_t xpath_node_set::type() const + { + return _type; + } + + PUGI__FN size_t xpath_node_set::size() const + { + return _end - _begin; + } + + PUGI__FN bool xpath_node_set::empty() const + { + return _begin == _end; + } + + PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const + { + assert(index < size()); + return _begin[index]; + } + + PUGI__FN xpath_node_set::const_iterator xpath_node_set::begin() const + { + return _begin; + } + + PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const + { + return _end; + } + + PUGI__FN void xpath_node_set::sort(bool reverse) + { + _type = impl::xpath_sort(_begin, _end, _type, reverse); + } + + PUGI__FN xpath_node xpath_node_set::first() const + { + return impl::xpath_first(_begin, _end, _type); + } + + PUGI__FN xpath_parse_result::xpath_parse_result(): error("Internal error"), offset(0) + { + } + + PUGI__FN xpath_parse_result::operator bool() const + { + return error == 0; + } + + PUGI__FN const char* xpath_parse_result::description() const + { + return error ? error : "No error"; + } + + PUGI__FN xpath_variable::xpath_variable(xpath_value_type type_): _type(type_), _next(0) + { + } + + PUGI__FN const char_t* xpath_variable::name() const + { + switch (_type) + { + case xpath_type_node_set: + return static_cast(this)->name; + + case xpath_type_number: + return static_cast(this)->name; + + case xpath_type_string: + return static_cast(this)->name; + + case xpath_type_boolean: + return static_cast(this)->name; + + default: + assert(!"Invalid variable type"); + return 0; + } + } + + PUGI__FN xpath_value_type xpath_variable::type() const + { + return _type; + } + + PUGI__FN bool xpath_variable::get_boolean() const + { + return (_type == xpath_type_boolean) ? static_cast(this)->value : false; + } + + PUGI__FN double xpath_variable::get_number() const + { + return (_type == xpath_type_number) ? static_cast(this)->value : impl::gen_nan(); + } + + PUGI__FN const char_t* xpath_variable::get_string() const + { + const char_t* value = (_type == xpath_type_string) ? static_cast(this)->value : 0; + return value ? value : PUGIXML_TEXT(""); + } + + PUGI__FN const xpath_node_set& xpath_variable::get_node_set() const + { + return (_type == xpath_type_node_set) ? static_cast(this)->value : impl::dummy_node_set; + } + + PUGI__FN bool xpath_variable::set(bool value) + { + if (_type != xpath_type_boolean) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN bool xpath_variable::set(double value) + { + if (_type != xpath_type_number) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN bool xpath_variable::set(const char_t* value) + { + if (_type != xpath_type_string) return false; + + impl::xpath_variable_string* var = static_cast(this); + + // duplicate string + size_t size = (impl::strlength(value) + 1) * sizeof(char_t); + + char_t* copy = static_cast(impl::xml_memory::allocate(size)); + if (!copy) return false; + + memcpy(copy, value, size); + + // replace old string + if (var->value) impl::xml_memory::deallocate(var->value); + var->value = copy; + + return true; + } + + PUGI__FN bool xpath_variable::set(const xpath_node_set& value) + { + if (_type != xpath_type_node_set) return false; + + static_cast(this)->value = value; + return true; + } + + PUGI__FN xpath_variable_set::xpath_variable_set() + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + _data[i] = 0; + } + + PUGI__FN xpath_variable_set::~xpath_variable_set() + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + _destroy(_data[i]); + } + + PUGI__FN xpath_variable_set::xpath_variable_set(const xpath_variable_set& rhs) + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + _data[i] = 0; + + _assign(rhs); + } + + PUGI__FN xpath_variable_set& xpath_variable_set::operator=(const xpath_variable_set& rhs) + { + if (this == &rhs) return *this; + + _assign(rhs); + + return *this; + } + +#if __cplusplus >= 201103 + PUGI__FN xpath_variable_set::xpath_variable_set(xpath_variable_set&& rhs) + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + { + _data[i] = rhs._data[i]; + rhs._data[i] = 0; + } + } + + PUGI__FN xpath_variable_set& xpath_variable_set::operator=(xpath_variable_set&& rhs) + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + { + _destroy(_data[i]); + + _data[i] = rhs._data[i]; + rhs._data[i] = 0; + } + + return *this; + } +#endif + + PUGI__FN void xpath_variable_set::_assign(const xpath_variable_set& rhs) + { + xpath_variable_set temp; + + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + if (rhs._data[i] && !_clone(rhs._data[i], &temp._data[i])) + return; + + _swap(temp); + } + + PUGI__FN void xpath_variable_set::_swap(xpath_variable_set& rhs) + { + for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) + { + xpath_variable* chain = _data[i]; + + _data[i] = rhs._data[i]; + rhs._data[i] = chain; + } + } + + PUGI__FN xpath_variable* xpath_variable_set::_find(const char_t* name) const + { + const size_t hash_size = sizeof(_data) / sizeof(_data[0]); + size_t hash = impl::hash_string(name) % hash_size; + + // look for existing variable + for (xpath_variable* var = _data[hash]; var; var = var->_next) + if (impl::strequal(var->name(), name)) + return var; + + return 0; + } + + PUGI__FN bool xpath_variable_set::_clone(xpath_variable* var, xpath_variable** out_result) + { + xpath_variable* last = 0; + + while (var) + { + // allocate storage for new variable + xpath_variable* nvar = impl::new_xpath_variable(var->_type, var->name()); + if (!nvar) return false; + + // link the variable to the result immediately to handle failures gracefully + if (last) + last->_next = nvar; + else + *out_result = nvar; + + last = nvar; + + // copy the value; this can fail due to out-of-memory conditions + if (!impl::copy_xpath_variable(nvar, var)) return false; + + var = var->_next; + } + + return true; + } + + PUGI__FN void xpath_variable_set::_destroy(xpath_variable* var) + { + while (var) + { + xpath_variable* next = var->_next; + + impl::delete_xpath_variable(var->_type, var); + + var = next; + } + } + + PUGI__FN xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type) + { + const size_t hash_size = sizeof(_data) / sizeof(_data[0]); + size_t hash = impl::hash_string(name) % hash_size; + + // look for existing variable + for (xpath_variable* var = _data[hash]; var; var = var->_next) + if (impl::strequal(var->name(), name)) + return var->type() == type ? var : 0; + + // add new variable + xpath_variable* result = impl::new_xpath_variable(type, name); + + if (result) + { + result->_next = _data[hash]; + + _data[hash] = result; + } + + return result; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, bool value) + { + xpath_variable* var = add(name, xpath_type_boolean); + return var ? var->set(value) : false; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, double value) + { + xpath_variable* var = add(name, xpath_type_number); + return var ? var->set(value) : false; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, const char_t* value) + { + xpath_variable* var = add(name, xpath_type_string); + return var ? var->set(value) : false; + } + + PUGI__FN bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value) + { + xpath_variable* var = add(name, xpath_type_node_set); + return var ? var->set(value) : false; + } + + PUGI__FN xpath_variable* xpath_variable_set::get(const char_t* name) + { + return _find(name); + } + + PUGI__FN const xpath_variable* xpath_variable_set::get(const char_t* name) const + { + return _find(name); + } + + PUGI__FN xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0) + { + impl::xpath_query_impl* qimpl = impl::xpath_query_impl::create(); + + if (!qimpl) + { + #ifdef PUGIXML_NO_EXCEPTIONS + _result.error = "Out of memory"; + #else + throw std::bad_alloc(); + #endif + } + else + { + using impl::auto_deleter; // MSVC7 workaround + auto_deleter impl(qimpl, impl::xpath_query_impl::destroy); + + qimpl->root = impl::xpath_parser::parse(query, variables, &qimpl->alloc, &_result); + + if (qimpl->root) + { + qimpl->root->optimize(&qimpl->alloc); + + _impl = impl.release(); + _result.error = 0; + } + } + } + + PUGI__FN xpath_query::xpath_query(): _impl(0) + { + } + + PUGI__FN xpath_query::~xpath_query() + { + if (_impl) + impl::xpath_query_impl::destroy(static_cast(_impl)); + } + +#if __cplusplus >= 201103 + PUGI__FN xpath_query::xpath_query(xpath_query&& rhs) + { + _impl = rhs._impl; + _result = rhs._result; + rhs._impl = 0; + rhs._result = xpath_parse_result(); + } + + PUGI__FN xpath_query& xpath_query::operator=(xpath_query&& rhs) + { + if (this == &rhs) return *this; + + if (_impl) + impl::xpath_query_impl::destroy(static_cast(_impl)); + + _impl = rhs._impl; + _result = rhs._result; + rhs._impl = 0; + rhs._result = xpath_parse_result(); + + return *this; + } +#endif + + PUGI__FN xpath_value_type xpath_query::return_type() const + { + if (!_impl) return xpath_type_none; + + return static_cast(_impl)->root->rettype(); + } + + PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const + { + if (!_impl) return false; + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + #ifdef PUGIXML_NO_EXCEPTIONS + if (setjmp(sd.error_handler)) return false; + #endif + + return static_cast(_impl)->root->eval_boolean(c, sd.stack); + } + + PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const + { + if (!_impl) return impl::gen_nan(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + #ifdef PUGIXML_NO_EXCEPTIONS + if (setjmp(sd.error_handler)) return impl::gen_nan(); + #endif + + return static_cast(_impl)->root->eval_number(c, sd.stack); + } + +#ifndef PUGIXML_NO_STL + PUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const + { + impl::xpath_stack_data sd; + + impl::xpath_string r = impl::evaluate_string_impl(static_cast(_impl), n, sd); + + return string_t(r.c_str(), r.length()); + } +#endif + + PUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const + { + impl::xpath_stack_data sd; + + impl::xpath_string r = impl::evaluate_string_impl(static_cast(_impl), n, sd); + + size_t full_size = r.length() + 1; + + if (capacity > 0) + { + size_t size = (full_size < capacity) ? full_size : capacity; + assert(size > 0); + + memcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t)); + buffer[size - 1] = 0; + } + + return full_size; + } + + PUGI__FN xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const + { + impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast(_impl)); + if (!root) return xpath_node_set(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + #ifdef PUGIXML_NO_EXCEPTIONS + if (setjmp(sd.error_handler)) return xpath_node_set(); + #endif + + impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_all); + + return xpath_node_set(r.begin(), r.end(), r.type()); + } + + PUGI__FN xpath_node xpath_query::evaluate_node(const xpath_node& n) const + { + impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast(_impl)); + if (!root) return xpath_node(); + + impl::xpath_context c(n, 1, 1); + impl::xpath_stack_data sd; + + #ifdef PUGIXML_NO_EXCEPTIONS + if (setjmp(sd.error_handler)) return xpath_node(); + #endif + + impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_first); + + return r.first(); + } + + PUGI__FN const xpath_parse_result& xpath_query::result() const + { + return _result; + } + + PUGI__FN static void unspecified_bool_xpath_query(xpath_query***) + { + } + + PUGI__FN xpath_query::operator xpath_query::unspecified_bool_type() const + { + return _impl ? unspecified_bool_xpath_query : 0; + } + + PUGI__FN bool xpath_query::operator!() const + { + return !_impl; + } + + PUGI__FN xpath_node xml_node::select_node(const char_t* query, xpath_variable_set* variables) const + { + xpath_query q(query, variables); + return select_node(q); + } + + PUGI__FN xpath_node xml_node::select_node(const xpath_query& query) const + { + return query.evaluate_node(*this); + } + + PUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const + { + xpath_query q(query, variables); + return select_nodes(q); + } + + PUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const + { + return query.evaluate_node_set(*this); + } + + PUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const + { + xpath_query q(query, variables); + return select_single_node(q); + } + + PUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const + { + return query.evaluate_node(*this); + } +} + +#endif + +#ifdef __BORLANDC__ +# pragma option pop +#endif + +// Intel C++ does not properly keep warning state for function templates, +// so popping warning state at the end of translation unit leads to warnings in the middle. +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) +# pragma warning(pop) +#endif + +// Undefine all local macros (makes sure we're not leaking macros in header-only mode) +#undef PUGI__NO_INLINE +#undef PUGI__UNLIKELY +#undef PUGI__STATIC_ASSERT +#undef PUGI__DMC_VOLATILE +#undef PUGI__MSVC_CRT_VERSION +#undef PUGI__NS_BEGIN +#undef PUGI__NS_END +#undef PUGI__FN +#undef PUGI__FN_NO_INLINE +#undef PUGI__GETPAGE_IMPL +#undef PUGI__GETPAGE +#undef PUGI__NODETYPE +#undef PUGI__IS_CHARTYPE_IMPL +#undef PUGI__IS_CHARTYPE +#undef PUGI__IS_CHARTYPEX +#undef PUGI__ENDSWITH +#undef PUGI__SKIPWS +#undef PUGI__OPTSET +#undef PUGI__PUSHNODE +#undef PUGI__POPNODE +#undef PUGI__SCANFOR +#undef PUGI__SCANWHILE +#undef PUGI__SCANWHILE_UNROLL +#undef PUGI__ENDSEG +#undef PUGI__THROW_ERROR +#undef PUGI__CHECK_ERROR + +#endif + +/** + * Copyright (c) 2006-2015 Arseny Kapoulkine + * + * 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/build-boost.sh b/build-boost.sh new file mode 100755 index 0000000..4944b4e --- /dev/null +++ b/build-boost.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +echo "Building boost_system v1.91.0..." +echo "If you want to build a newer version of boost when one comes out, update the script" + +# Or whatever is the latest boost library +git clone --recursive https://github.com/boostorg/boost.git --depth 1 + +cd boost + +git checkout boost-1.91.0 + +git submodule update --init --recursive --depth 1 + +./bootstrap.sh --prefix=/usr/local + +./b2 --with-system cxxflags="-std=c++11" stage + +sudo ./b2 --with-system install diff --git a/revisions.txt b/revisions.txt index 721485e..3fb00dc 100644 --- a/revisions.txt +++ b/revisions.txt @@ -1,239 +1,886 @@ -Rev 3.2.5.004 +Rev 3.15.1.001 +======================================================================= +04/30/2020 Florian Berenbrinker / Majdouline Najdini + +New features / changes: +-- + - Added missing MSP430 launchpads to the auto-detection function. + - Added backup of TLV data during erase use cases. + +Rev 3.15.0.000 +======================================================================= +01/27/2020 Florian Berenbrinker / Majdouline Najdini + +New device support: +-- + - MSP430FR6005, MSP430FR6007, MSP430FR2672, MSP430FR2673 + +New features / changes: +-- + - Added information to the disable low power mode pop-up message, + about how to enable Ultra Low Power debug / LPMx.5 using MSP430 + Project Settings in CCS. + +Rev 3.14.0.000 +======================================================================= +02/11/2019 Florian Berenbrinker + +New device support: +-- + - MSP430FR2475, MSP430FR2476, MSP430FR2675, MSP430FR2676 + +Bug fixes: +-- + - Fixed open port handling to handle failure on first try + - Fixed MSP-FET BSL I2C speed to be less than 400Khz + +Rev 3.13.1.000 ======================================================================== - 14/9/2012 Alexander Festini/Robert Lessmeier +10/30/2018 Florian Berenbrinker + +Bug fixes: +-- + - Fixed macOS Mojave MSP-FET and eZ-FET USP device detection by using BSDALLTypes - New device support: - MSP430F535x, MSP430F565x, MSP430F635x, MSP430F665x +Rev 3.13.0.001 +======================================================================== +05/15/2018 Fabian Fischer - Changes: - - Removed deprecated functions - MSP430_Identify - MSP430_Breakpoint - MSP430_EEM_Open - MSP430_EEM_Read_Register - MSP430_EEM_Read_Register_Test - MSP430_EEM_Write_Register - MSP430_EEM_Close +New device support: +-- + - MSP430FR2355, MSP430FR2353, MSP430FR2155, MSP430FR2153 - Bug Fixes: - - Improved update stability and behavior in case of a failed update - - Fixed occasional errors after firmware update without power cycle - - Fixed wrong RAM sizes for MSP430FR57xx devices - - Fixed bug where 0x00 was written behind a FRAM write - - Fixed issue where EDI parity could be invalidated on writing -======================================================================== +New features / changes: +-- + - Added API for detecting connected MSP devices automatically + - Added API for retrieving FET and launchpad name + +Bug fixes: +-- + - Fixed an firmware update issue which could prevent the FET from being detected as CDC after a core update -Rev 3.2.4.005 (Bugfix release) + +Rev 3.12.0.004 ======================================================================== - 28/6/2012 Robert Lessmeier/Günther Höne +02/28/2018 Fabian Fischer - New device support: - - No new devices added. - Bug Fixes: - - Able to read Memory location 0x1B00 without generating a BOR - - Improved communication reliability: error exceptions are properly - caught inside the DLL - - Fixed Fuse-blow for 5xx/6xx and FRAM devices - - Fixed regression in LPMx.5 handling +New device support: +-- + - MSP430FR6043, MSP430FR60431, MSP430FR6041, MSP430FR5043, MSP430FR50431, MSP430FR5041 - For further details refer to version 3.2.4.002 -======================================================================== +New features / changes: +-- + - Improved target code download speed by up to 63% (FRAM devices) and 71% (MSP432P devices) + - Issuing message whenever FET power supply switches from LDO to ET circuitry or vice versa + - Added API function to dump device database (MSP430_DumpDeviceDb) + - Added errata handling for DMA4, FLASH31 and CPU20 + +Bug fixes: +-- + - Fixed issuing messages when going through the device db by calling MSP430_Device + - Fixed a possible issue when allocation resources to check for nullpointer + - Fixed overlapping of HIL and BIOS firmware on MSP-FET which could lead to unecessary firmware updates -Rev 3.2.4.002 + +Rev 3.11.0.001 ======================================================================== - 06/6/2012 Florian Berenbrinker - - New device support: - MSP430SL5438A, MSP430F6779(1), - CC430F5123, CC430F5125, CC430F5143, CC430F5145, CC430F5147 - CC430F6143, CC430F6145, CC430F6147 - MSP430FR5969, MSP430FR5949 (Wolverine) - - Bug Fixes: - - Correct DLL database entry for min. flash voltage on 471x devices - - Fixed single stepping issues on L092 - - Fixed DCO calibration Bug, that the original DCO setting was not - restored after debug break(device running slower after read) - - Fixed DLL database entry for the EEM level of the MSP430F5228 - - Fixed disassembly window issues on MSP430FR59xx devices - - Fixed issues with Fast port close/open - - New Features: - - MPU and IP protection are handled by the DLL on all MSP430FRxx - devices -> Access violations will be suppressed by the debugger - - Implement WriteMemoryQuick() function to write directly into the - FRAM memory using JTAG - - Remove write and erase funclets for MSP430FR59xx devices - - Erase is now handled using the JTAG mailbox - - Write is done using the WriteMemoryQuick() function - - Implemented erase mechanism to erase IP protected memory areas - without accessing it - - Enhanced USB-FET VCC startup behavior to be identical compared - to the V2 DLL - - VCC will be activated when the USB connector of the USB-FET - is plugged in - - Enhanced EEM support - - Enhanced state storage implementation to be fully functional - - Implemented cycle counter for counting cycles during a single - run - - Known Limitations: - - On devices with FLL, clock control does not allow to keep - clocks running, while the device is halted and the clock is - sourced by the FLL - Workaround: None - - EEM not fully supported (Sequencer/variable watch) - Workaround: None - - V1.3 of UIF does not work in SBW2 mode with MSP430F6638 - Workaround: None +11/30/2017 Fabian Fischer + +New device support: +-- + - MSP430FR2522, MSP430FR2512, MSP430FR2422 + +New features / changes: +-- + - Added an option on API level to customize JTAG lock key for 5xx devices - see MSP430_Configure() for more details + - Added support for MSP432 I2C and UART BSL on the MSP-FET + - Showing more detailed progress bar during firmware update + - Added FRAM/Flash overwrite functionality on API level + - Added support for new eZ-FET rev. 2.0 tool + - Switching power supply to on-board LDO on new eZ-FET rev. 2.0 tool while Energy Trace is not used + - Disabling write protection on FRAM devices during memory write access + +Bug fixes: +-- + - Fixed a possible race condition during USB communication for eZ430 amd MSP-FET430UIF emulation tool + - Fixed an issue when trying to erase main memory while MPU protection for the vector table is enabled + - Fixed a possible issue when trying to connect to a device which is externally supplied with VCC + - Fixed an issue when trying to erase BSL memory on MSP432 and second info memory on MSP432P4111 + - Fixed an issue when backchannel UART is configured to use even parity + - Fixed an issue which prevented warning messages to update properly + - Fixed memory access to TinyRAM + +Rev 3.10.1.000 ======================================================================== +06/01/2017 Fabian Fischer +New device support: +-- + - MSP430FR2100, MSP430FR2000 -Rev 3.2.3.015 +New features / changes: +-- + +Bug fixes: +-- + - Fixed compiler warnings on Mac + +Rev 3.10.0.003 +======================================================================== +04/07/2017 Fabian Fischer + +New device support: +-- + - MSP430FR6047, MSP430FR60471, MSP430FR6037 + - MSP430FR60371, MSP430FR6045, MSP430FR6035 + - MSP432P411V, MSP432P4011 + - MSP432P401Y, MSP432P401V + +New features / changes: +-- + - Added API function to enable warning during connect if IP protection is enabled on MSP432 device + - Extended API to allow disabling/enabling of interrupts when letting the device run or during single step (MSP432) + - Extended API to set ultra-low power debug options for MSP432 + - Decreased firmware update time by reducing firmware image size + +Bug fixes: +-- + - Fixed possible race condition when using EnergyTrace + - Fixed sector erase issue with BSL memory on MSP432 + +Rev 3.9.2.015 +======================================================================== +02/24/2017 Florian Berenbrinker + +New device support: +-- + - MSP432P411Y, MSP432P4111 + +New features / changes: +-- + - Improve Flash programming performance for MSP432P4xx devices. + - Add support for MSP-FET hardware revsion 2.04. + - Improve EnergyTrace accuracy for new MSP-FET hardware revsion 2.04. + +Bug Fixes: +-- + - Fix fractory reset for MSP432P4xx devices. + - Fix reset issues on eZ-FET lite for MSP430I20xx devices. + - Fix timer clock control handling for MSP430F67xx devices. + +Rev 3.9.1.002 +======================================================================== +11/24/2016 Florian Berenbrinker + +New device support: +-- + - MSP430FR5992 + - MSP430FR5962 + - MSP430FR5964 + +Bug Fixes: +-- + - Fix incorrect clearance of MSP432 datawatchpoints + - Handle exception if no emulation manager was created + +Rev 3.9.0.0920 ======================================================================== - 03/16/2012 Florian Berenbrinker - - New device support: - None - - Bug Fixes: - - Writing to BSL is now working when an erase or erase check, - followed by a reset, was performed before - - Writing to memory with enabled MPU on FRAM devices not - possible anymore - - Fixed a bug causing flash erase and write errors on MSP430F413 - - Size of DEVICE_T struct has been increased to match embedded - v2 DLL - - Port handling has been changed to prevent a port can't be - reopened after closing - - Added fix to prevent possible RAM corruption when reading CPU - registers on 5xx/6xx devices - - New Features: - - Added calibration of clock frequency to ensure exact flash - timings, before Flash erasing or writing - - The UIF now starts up supplying 3V to target - - Known Limitations: - - On devices with FLL, clock control does not allow to keep - clocks running, while the device is halted and the clock is - sourced by the FLL - Workaround: None - - Cycle Counter not functional. - Workaround: None - - EEM not fully supported (Trace/Sequencer/variable watch - Workaround: None - - V1.3 of UIF did not work in SBW2 mode with MSP430F6638 - Workaround: None +08/30/2016 Fabian Fischer + +New features / changes: +-- + - Using binary XML format for device database instead of template files + - Masking interrupts when executing flash loader on MSP432 + - Moved SetVCC and GetVCC from HAL to core in firmware + - Applying BSL entry sequence in case no connection to device could be established + +Bug Fixes: +-- + - Fixed debug probe detection on Mac OS X El Capitan + - Adapt BSL entry sequence according to SYS10 errata + + +Rev 3.8.1.0000 ======================================================================== +07/14/2016 Fabian Fischer + +New features / changes: +-- + - Open MSP432 device in SWD if JTAG pins are unavailable +Bug Fixes: +-- + - Fixed possible issue during programming of MSP432 device after device has executed -Rev 3.2.3.002 +Rev 3.8.0.002 +======================================================================== +05/25/2016 Florian Berenbrinker + +New device support: +-- + - MSP432P401R Rev.B + - MSP430FR2111, MSP430FR2110 + +New features / changes: +-- + - Implement DAP lock and unlock mechanism to support MSP432 DAP secure + - Implement DAP lock automatic detection mechanism + - Implement RAM and Registers backup for MSP432, to support FLASH access during active debug session + - Update MSP432 flash loader to version 2.2.0 + - Implement new Tool ID handling for Launchpads (V1.5) with out RTS and CTS lines + - Enhance UART Backchannel on MSP-FET and eZ-FET to support even and no party + - Change firmware update mechanism. MSPDS and FET firmware version number can be different + - MSPDS is now released under TI-TSPA license. + +Bug Fixes: +-- + - Fixed MSP-FET430UIF connection issue on OS X EL Capitan + - Fixed MSP-FET external voltage regulation. Restart regulation after close + - Fixed crashes on MSPDS unload when using WinXP. Use boost::mutex instead of std:: mutex. + Boost do not use the windows mutex implementation, which was the reason for the unload crashes. + +Rev 3.7.1.0000 +======================================================================== +04/14/2016 Fabian Fischer + +New device support: +-- + - MSP432P401M + +Bug Fixes: +-- + - Fixed possible returning of negative cpu cycles by MSP430_State() + - Fixed possible unintentional device execution of uninitialized RAM after programming device + - Fixed possible issue when restarting CCS Debug Session + +Rev 3.7.0.0012 +======================================================================== +02/19/2016 Florian Berenbrinker + +New device support: +-- + - MSP430FR2311, MSP430FR2310 + - MSP430FR5994 including LEA debug + - MSP432P401R + - MSP430F6779A Family + - I2040 + +New features / changes: +-- + - Native 64 BIT OS X 10.11.3 (El Capitan) support + - Native Linux 64-bit support + - MSP432P401R - support using the MSP-FET + - JTAG and SWD protocol + - Automatic protocol detection + - Integrated FLASH access + - Run Control + - Halt target + - Run or Free Run target + - CPU core register access + - Hardware Breakpoints and Data-Watch-point + - JTAG/SWD lock– Lock device via FLASH mailbox - Unlock via. Factory reset + - EnergyTrace and EnergyTrace+ + - MSP-FET BSL432 support – Empty device with automatic BSL start support only + - Add LEA debug sync. mechanism for MSP430FR599x family + - Add new 32 Bit clock control API for MSP430FR599x family + - Add new API to set MSP target architecture (MSP432 or MSP430) + - Enhance MSPDS structs on API level to enable MSP432P401R support + +Bug Fixes: +-- + - Fixed returned error message when Backchannel UART port is in use during firmware update + - Fixed incorrect module clock control defaults + - Fixed INFO memory lock for I20xx family + - Change Cycle Counter to execute only delta cycle measurements + - Fixed async. close and callback messaging by adding mutex protection + +Rev 3.5.1.001 +08/10/2015 Alexander Festini + +New device support: +-- + - MSP430FR2433 + +Bug Fixes: +-- + - Fixed error handling when reading TI-Txt/Intel Hex files and improved error messages + - Removed references to obsolete libraries (DriverX, HIL.dll) in README.txt + - Fixed overcurrent detection for JTAG lines on MSP-FET + - Fixed issue where flash access during debug could indefinitely trigger + oscillator fault flag when using XT1 in high frequency mode + - Fixed bug that could cause access violation on Windows after unloading msp430.dll + - Fixed possible crash during core and recovery update on some Linux systems + +Rev 3.5.0.000 +======================================================================== +04/16/2015 Florian Berenbrinker + +New device support: +-- + - RF430F5175, RF430F5155, RF430F5144 + - MSP430FR5922(1) + +New features / changes: +-- + - Native 64 BIT OS X 10.9 (Mavericks) support + - OS X support for all FET debuggers (MSP-FET430UIF, MSP-FET, eZ-FET/eZ-FET Lite) + - OS X support for MSP-FET BSL programming in I2C and UART mode + - OS X support for MSP-FET and eZ-FET back channel UART + - OS X EnergyTrace support + - Change to C++ 11 & Visual Studio 2013 + - Remove LPT support including HIL.DLL + - Remove LPMx.5 debug support for all F5xx/F6xx and FR57xx devices due to hardware limitation + - please refer to device errata for more details + +Bug Fixes: +-- + - Fixed that ISR was executed in the background when single stepping + - Fixed that ADC12 was running with a too high clock speed on MSP-FET and eZ-FET + - Fixed that MSP430FR4133 does not automatically resume running after fuse blow + - Fixed that buffer access on system event was not checked against null pointer + - Fixed indistinguishable FG4619 spins in database + - Fixed race condition between EnergyTrace event and EnergyTrace reset + - Fixed that the VMAIFG bit inside the SFR register was set to "1" because of debugger connect + - Fixed firmware to compile without any warnings for all FET debuggers + - Fixed Link dependency to GLIBC_PRIVATE - remove dependency for Linux + +Rev 3.4.3.004 +======================================================================== +11/20/2014 Alexander Festini & Florian Berenbrinker + +New device support: +-- + - RF430FRL152H, RF430FRL153H, RF430FRL154H + - MSP430FR6972, MSP430FR6970, MSP430FR6922, MSP430FR6920, + MSP430FR6872, MSP430FR6870, MSP430FR6822, MSP430FR6820, + MSP430FR5972, MSP430FR5970, MSP430FR5872, MSP430FR5870 + +New features / changes: +-- + - Advanced hardware cycle counter support + - Hardware cycle counters can be freely configured + - Support both cycle counters where available + - Software breakpoints support when MPU is enabled + +Bug Fixes: +-- + - Fixed eZ-FET LED signaling - not according to specification for over-current detection + - Fixed secure device message - Report "Security Fuse has been blown" instead of "Unknown device" + - Fixed endianness in IntelHex offset record + - Fixed clock control module names for MSP430FR413x + - Fixed accidentally changing WDT interval on sync + - Fixed secure device for MSP430FR413x + - Fixed SendJtag mailbox function - Send pattern while Reset line is low + - Fixed ResetXv2 function - Send pattern while Reset line is low + - Fixed Erase for password protected FRAM devices - do segment erase from 0xFF80 to 0x10000 on all FRAM devices + to erase the password and the Reset vector to prevent code execution and to disable the password protection + - Fixed possible deadlock in MSP430_Close function + - Fixed Reset function for MSP430F5438 non A devices. Mailbox is not functional in Reset state on this device + +Rev 3.4.2.007 ======================================================================== - 12/23/2011 Florian Berenbrinker - - New device support: - None - - Bug Fixes: - - All 2xx Special Function Registers are not longer read as 0x3FFF - - Step over certain instructions is now working - - Flash programming at VCC < 2.7V for F1xx/F4xx is now working - - FLL Debug Error, RST after GO is fixed - - C092: Connection to ROM device generates no errors anymore - - Write File API call no longer fails with ERROR_OPERATION_ABORTED - - Fixed FE427A / T103 Problems with FLL clock frequency while - debugging - - Debugger operation sets VMAIFG on MSP430F5438A - - DLL now returns when USB FET is disconnected during FW update - - Known Limitations: - - If you unplug the USB FET during an active debug session, - the session could be interrupted and the IDE could stop working. - - Cycle Counter not functional. - Workaround: None - - EEM not fully supported (Trace/Sequencer/variable watch - Workaround: None - - UIF supply not according to DLLv2 - Workaround: None - - V1.3 of UIF does not work in SBW2 mode with MSP430F6638 - Workaround: None +07/30/2014 Alexander Festini & Florian Berenbrinker + +New device support: +-- + - MSP430FR2033 Family + - MSP430F6736A Family + - MSP430FG6626 Family + +New features / changes: +-- + - Improved EnergyTrace stability on longer runs + - Improved stability during UIF firmware update from v2 to v3 + - SMCLK no longer listed for clock control on MSP430i2040 + - Changed voltage of 3000mV to 3300mV during UIF start-up + - Changed MSP-FET UART lines power up state - UART lines are configured to High-Z during MSP-FET start-up + - Changed MSP-FET UART to only support fixed baud rates - 9600, 14400, 19200, 28800, 38400, 56000, 57600 and 115200 + - MSP-FET BSL support - I2C and UART BSL + - Could be activated via invalid baud rate commands + - 9620 Tristate of all UART/ BSL pins – no current flow into target device + - 9621 Configure UART communication without handshake (default start behaviour) + - 9622 Configure UART communication with handshake + - 9623 Voltage configuration command. Set target VCC hard to 3.3V + - 9601 BSL-Entry sequence + Power up 3.3V (UART BSL) + - 100000(1) BSL-Entry sequence + Power up 3.3V (I2C BSL) + - 400000(1) BSL-Entry sequence + Power up 3.3V (I2C BSL) + - 8001 Enable MSP-FET debugger mode - disable of MSP-FET BSL mode + - During MSP-FET BSL mode the debugger mode is disabled + - Over-current protection of JTAG/I2C/UART and VCC supply lines is switched of in MSP-FET BSL mode + - In MSP-FET UART BSL mode only fixed baud rates are supported - 9600, 14400, 19200, 28800, 38400, 56000, 57600 and 115200 + +Bug Fixes: +-- + - Fixed clock control module definitions For MSP430FR5969/MSP430FR6989 + - Fixed potential race condition in communication with Fet (could get out of sync) + - Fixed potential race condition between events (eg. LPMx.5) and API calls + - Fixed memory leak when receiving asynchronous events (breakpoints, trace, ...) + - Fixed case of hex digits when writing Intel Hex (now upper case) + - Fixed debug access affect LPM current consumption on FR5969 + - Fixed Race conditions during LPM5/breakpoint events + +Rev 3.4.1.000 ======================================================================== +04/24/2014 Alexander Festini / Florian Berenbrinker + +New device support: +-- + - MSP430FG6626 + - MSP430FR4133 Family + - MSP430FR6989 Family + +New features / changes: +-- + - User code erase via JTAG mailbox on MSP430FR4133 family + - MSP-FET backchannel UART support + - Reduced calibration time when setting VCC + +Bug Fixes: +-- + - eZ-FET update fails in Ubuntu 64bit due to modemmanager blocking the port. When installing CCS, debugger + ports will be blacklisted for modemmanager + - Selecting invalid JTAG protocol on eZ-FET returns error instead of silently using SBW + - Prevent MSP-FET from detecting over current when connecting to a target driving the JTAG lines active low + - Added fix to prevent unintended execution of memory content as code during debug + - Restoring software breakpoints after external code download on MSP430L092 + - Fixed typo in device name for MSP430FR5857 + - Removed non-existent timers from clock control settings + - Saving to Intel format did not pad CRC values lower than 0x10 with leading 0 + +Known Limitations: +-- + - On devices with FLL, clock control does not allow to keep clocks running, while the device is halted and + the clock is sourced by the FLL + - V1.3 of UIF does not work in SBW2 mode with 2.2nf cap on reset line + - eZ-FET UART might lose bytes with 115k baud (no handshake enabled) and DMA as data loopback on target device + - MSP-FET EEM access to F149 and L092 devices is only possible with JTAG speed slow + - MSP430FR4133 might not work reliably under debug control when XT1 is used as clock source, because of overwritten + XT1 drive strength register + - MSP430FR4133 might not work reliably under debug control when BSL unlock is executed via DLL/IDE, because of overwritten + DCO CSCTL1 register + +Rev 3.4.0.020 +======================================================================== +01/29/2014 Florian Berenbrinker + +New device support: +-- + - FR6989 PG1.0 / RevD - !! Debug support only, NO EnergyTrace or ULP features !! + - FR5969 PG2.0 / RevE - ULP feature support, but no EnergyTrace support + - FR5969 PG3.0 / RevF Family - Full EnergyTrace and ULP feature support + - F67621, F67641 + - MSP430F6779A Family + +New features / changes: +-- + - Enhanced support for new MSP-FET debuggers - Added EnergyTrace support + - 64 bit JSTATE readout for FR5969 PG2.0 / RevE and FR5969 PG3.0 / RevF family support + - Added MSP-FET BSL firmware project + - Enhanced BSL library to support MSP-FET - load different RAM BSLs for MSP-FET and eZ-FET + - Added DCDC-MCU firmware project to MSP-FET firmware project + - Remove MSP430_GetJTAGID() from DLL API completely + - Enhanced debug flow for FR5969 family + - Enhanced power up mechanism to handle all MSP430 device requirements + +Bug Fixes: +-- + - Debugger-started in "FreeRun" mode has higher current than real free run without debugger + - EnergyTrace - No current update during unknown states + - Wrong CPU ARCH for FR5969 device inside template database + - MSP430_SetVCC() with always on regulation has impact EnergyTrace energy and current calculation + - EnergyTrace accumulated energy output mismatches expected values + - Using emulated breakpoints option in IAR – corrupts RAM memory + - EnergyTrace calibration sporadically produces wrong values + - EnergyTrace fine mode cannot be turned off + - JTAG password unlock not possible in SBW mode + - eZ-FET DCDC PWM width, is too long for first PWM after no load phase + - DLL crashes if memory function is called with read/write length equals zero + - Code placed on the first location of the Info Memory cannot be executed + - MSP-FET FPGA access - HIL timeout does not work as expected + - F14x/F14x1 identification failed + - MSP430_Error_String returns INT instead of string w/o MSP430_Initialize up front + - Power/Mode LEDs on MSP-FET do work not according to spec. + - DLL does not support all MSP430F5259 spins + - EnergyTrace sampling speed too low + - MSP-FET: EnergyTrace current error high - around 10mA + - OpenDevice forced with wrong protocol - works unexpectedly second time + - SFR register mask off by one on odd address - DLL uses old/wrong setPC macro for 1xx-4xx devices + - Connect to running target did not work + - Download/verify error if code size > 250 bytes on FR5969 devices + - MSP-FET Linux sends config. command on CDC 2 (APP UART) channel, which results in NULL pointer + - MSP-FET JTAG pins TDI and TMS not High-Z after power up + - MSP430_Configure call is required to enable energy measurement + - Energy Trace related error messages - message updates required + - Fixed L092 startup bug + - Disable Energy Trace for Wolverine Rev. E + +Known Limitations: +-- + - On devices with FLL, clock control does not allow to keep + clocks running, while the device is halted and the clock is + sourced by the FLL + Workaround: None- + - V1.3 of UIF does not work in SBW2 mode with 2.2nf CAP on Rest line + Workaround: None + - eZ-FET UART might lose bytes with 115kbaut (no handshake enabled) and DMA as data loopback on target device + - MSP-FET EEM access to F149 and L092 devices is only possible with JTAG speed slow + - !BETA! MSP-FET poly FuseBlow in SBW2 is beta software state not release state !BETA! + - MSP-FET UART not implemented - only dummy implementation + +Rev 3.3.1.004 +======================================================================== +09/19/2013 Alexander Festini + +New device support: +-- + -MSP430F5252 + -MSP430F5253 + -MSP430F5254 + -MSP430F5255 + -MSP430F5256 + -MSP430F5257 + -MSP430F5258 + +Rev 3.3.1.003 +======================================================================== +06/28/2013 Florian Berenbrinker + +New device support: +-- + - FR6989 PG1.0 - !! Debug support only, NO EnergyTrace or ULP features !! + - FR5969 PG2.0 - EnergyTrace and ULP feature support + - FR5969 PG1.2 - !! Debug support only, NO EnergyTrace or ULP features !! + - MSP430G2xx4 - DLLv2 eZ430 support update + - MSP430F5259 Family + - MSP430F5249 Family + - MSP430I2040 Family + +New features / changes: +-- + - Enhance support for new eZ-FET debuggers - Add EnergyTrace support - + - 64 bit Jstate readout for FR5969 PG2.0 + - Add eZ-FET & eZ-FET lite BSL firmware project + - Add new Software Breakpoint API, to configure easily Software Breakpoints + - Add DCDC MCU firmware project to eZ-FET firmware project + - Move EnergyTrace files into TI-TSPA license section + - Remove Sobel-Filter form EneryTrace processors ET7 / ET8 + +Bug Fixes: +-- + - Fix Spikes on EnergyTrace current output + - Fix EnergyTrace fine mode cannot be turned off + - Fix Magic pattern is not fully functional + - 0x3FFF when reading upper 16 byte from RAM on FR5969 + - After calling the status = MSP430_Reset(..); TST line high + - Preprocessor define did not work on one file + - Fix UART communication on eZ-FET - unstable if handshake not used + - Fix EnergyTrace calibration produces sporadically wrong values + - Could not set device VCC – COM port blocked by OS + - Fixed Cycle Counter reset + - Clearer error message on communication error (previously “Could not set VCC”) + - Fixed potential timeout on data verification (MSP430F6659 in SBW2) + - Returning correct architecture for MSP430F5969 in DEVICE_T + - Added main flash segment size to DEVICE_T + + +Known Limitations: +-- + - On devices with FLL, clock control does not allow to keep + clocks running, while the device is halted and the clock is + sourced by the FLL + Workaround: None + - V1.3 of UIF does not work in SBW2 mode with 2.2nf CAP on Rest line + Workaround: None + + +Rev 3.3.0.006 +======================================================================== +01/31/2013 Florian Berenbrinker + +New device support: +-- + - Xenon (G2xx5), G2xx4, Haptics (MSP430TCH5E) + +New features / changes: +-- + - Add support for new eZ-FET & eZ-FET light debuggers + - Add new firmware project for for eZ-FET & eZ-FET light debuggers + - Implement HID recovery mechanism for eZ-FET & eZ-FET light debuggers + - Link HID-BSL lib to DLLv3 to handle HID communication + - Add unique Tool ID to eZ-FET & eZ-FET and MSP-FET430UIF + - Create function to scan for multiple debuggers with different PID & VID + - Add Hil_Configure api to configure protocol on low level + - Change update mechanism to handle different debuggers by adding different + update managers + - Remove polling handling form DebugManager by creating new PollingManager + - Change overcurrent detecion on MSP-FET430UIF to shut down power after 60ms + in overcurrent case not after 10ms + - Separate all FW project into hardware specific parts + - Deprecate old Rest function commands/states + - Fix thread race conditions in CDC IO channel class + - remove CDC & FLOW Control for new eZ-FET & eZ-FET light debuggers + +Bug Fixes: +-- + - Improve error message if MSP-FET430UIF FW doesn't match + - Removed C++ headers from include directory + - Clear LPMx.5 debug settings when calling MSP430_Close + - Fix funclet offset addresses, which could cause RAM corruption + +Known Limitations: +-- + - On devices with FLL, clock control does not allow to keep + clocks running, while the device is halted and the clock is + sourced by the FLL + Workaround: None + - V1.3 of UIF does not work in SBW2 mode with 2.2nf CAP on Rest line + Workaround: None +Rev 3.2.5.004 +======================================================================== +14/9/2012 Alexander Festini/Robert Lessmeier -Rev 3.2.2.000 +New device support: +-- + - MSP430F535x, MSP430F565x, MSP430F635x, MSP430F665x + +New features / changes: +-- + - Removed deprecated functions + MSP430_Identify + MSP430_Breakpoint + MSP430_EEM_Open + MSP430_EEM_Read_Register + MSP430_EEM_Read_Register_Test + MSP430_EEM_Write_Register + MSP430_EEM_Close + +Bug Fixes: +-- + - Improved update stability and behavior in case of a failed update + - Fixed occasional errors after firmware update without power cycle + - Fixed wrong RAM sizes for MSP430FR57xx devices + - Fixed bug where 0x00 was written behind a FRAM write + - Fixed issue where EDI parity could be invalidated on writing + +Rev 3.2.4.005 (Bugfix release) ======================================================================== - 11/25/2011 Florian Berenbrinker +28/6/2012 Robert Lessmeier/Günther Höne + +New device support: +-- + - No new devices added. +Bug Fixes: +-- + - Able to read Memory location 0x1B00 without generating a BOR + - Improved communication reliability: error exceptions are properly + caught inside the DLL + - Fixed Fuse-blow for 5xx/6xx and FRAM devices + - Fixed regression in LPMx.5 handling - New device support: - None + For further details refer to version 3.2.4.002 - Bug Fixes: - - LPMx.5 debug is now functional after wakeup from LPMx.5 - - MSP430-Run is working in combination with LPMx.5 - - EEM Register Breakpoint now fully functional on CPUX derivatives - - Fixed stepping issue in upper memory of MSP430FG4619 - - Clock Control now fully functional on AFE devices +Rev 3.2.4.002 +======================================================================== +06/6/2012 Florian Berenbrinker + +New device support: +-- + - MSP430SL5438A, MSP430F6779(1), + - CC430F5123, CC430F5125, CC430F5143, CC430F5145, CC430F5147 + - CC430F6143, CC430F6145, CC430F6147 + - MSP430FR5969, MSP430FR5949 (Wolverine) + +Bug Fixes: +-- + - Correct DLL database entry for min. flash voltage on 471x devices + - Fixed single stepping issues on L092 + - Fixed DCO calibration Bug, that the original DCO setting was not + restored after debug break(device running slower after read) + - Fixed DLL database entry for the EEM level of the MSP430F5228 + - Fixed disassembly window issues on MSP430FR59xx devices + - Fixed issues with Fast port close/open + +New features / changes: +-- + - MPU and IP protection are handled by the DLL on all MSP430FRxx + devices -> Access violations will be suppressed by the debugger + - Implement WriteMemoryQuick() function to write directly into the + FRAM memory using JTAG + - Remove write and erase funclets for MSP430FR59xx devices + - Erase is now handled using the JTAG mailbox + - Write is done using the WriteMemoryQuick() function + - Implemented erase mechanism to erase IP protected memory areas + without accessing it + - Enhanced USB-FET VCC startup behavior to be identical compared + to the V2 DLL + - VCC will be activated when the USB connector of the USB-FET + is plugged in + - Enhanced EEM support + - Enhanced state storage implementation to be fully functional + - Implemented cycle counter for counting cycles during a single + run +Known Limitations: +-- + - On devices with FLL, clock control does not allow to keep + clocks running, while the device is halted and the clock is + sourced by the FLL + Workaround: None + - EEM not fully supported (Sequencer/variable watch) + Workaround: None + - V1.3 of UIF does not work in SBW2 mode with MSP430F6638 + Workaround: None - Known Limitations: - - If you unplug the USB FET during an active debug session, - the session could be interrupted and the IDE could stop working - - Cycle Counter not functional - Workaround: None - - EEM not fully supported (Trace/Sequencer/variable watch) - Workaround: None - - Old UIF version (v1.3) firmware update not fully automated due - due to Hardware limitation - Workaround: An manual reset has to be done during major UIF - update +Rev 3.2.3.015 ======================================================================== +03/16/2012 Florian Berenbrinker + +New device support: +-- + None + +Bug Fixes: +-- + - Writing to BSL is now working when an erase or erase check, + followed by a reset, was performed before + - Writing to memory with enabled MPU on FRAM devices not + possible anymore + - Fixed a bug causing flash erase and write errors on MSP430F413 + - Size of DEVICE_T struct has been increased to match embedded + v2 DLL + - Port handling has been changed to prevent a port can't be + reopened after closing + - Added fix to prevent possible RAM corruption when reading CPU + registers on 5xx/6xx devices + +New features / changes: +-- + - Added calibration of clock frequency to ensure exact flash + timings, before Flash erasing or writing + - The UIF now starts up supplying 3V to target + +Known Limitations: +-- + - On devices with FLL, clock control does not allow to keep + clocks running, while the device is halted and the clock is + sourced by the FLL + Workaround: None + - Cycle Counter not functional. + Workaround: None + - EEM not fully supported (Trace/Sequencer/variable watch + Workaround: None + - V1.3 of UIF did not work in SBW2 mode with MSP430F6638 + Workaround: None +Rev 3.2.3.002 +======================================================================== +12/23/2011 Florian Berenbrinker + +New device support: +-- + None + +Bug Fixes: +-- + - All 2xx Special Function Registers are not longer read as 0x3FFF + - Step over certain instructions is now working + - Flash programming at VCC < 2.7V for F1xx/F4xx is now working + - FLL Debug Error, RST after GO is fixed + - C092: Connection to ROM device generates no errors anymore + - Write File API call no longer fails with ERROR_OPERATION_ABORTED + - Fixed FE427A / T103 Problems with FLL clock frequency while + debugging + - Debugger operation sets VMAIFG on MSP430F5438A + - DLL now returns when USB FET is disconnected during FW update + +Known Limitations: +-- + - If you unplug the USB FET during an active debug session, + the session could be interrupted and the IDE could stop working. + - Cycle Counter not functional. + Workaround: None + - EEM not fully supported (Trace/Sequencer/variable watch + Workaround: None + - UIF supply not according to DLLv2 + Workaround: None + - V1.3 of UIF does not work in SBW2 mode with MSP430F6638 + Workaround: None -Rev 3.2.1.009 +Rev 3.2.2.000 ======================================================================== - 10/18/2011 Florian Berenbrinker - - !NOTE this an all new DLL design! - The DLL version 3.2.1.9 is an all new DLL design compared to - the last DLL version 2.9.4.1. This new DLL includes also a new - UIF-Firmware. Furthermore the USB driver has been changed to a - certified CDC driver. - The DLL is implemented in C++ and follows a object base - design, which is host operating system independent . - The API of the new DLL is the same as for the old one. - DLL functionality keeps the same as in the old V2 DLL. - The new DLL V3 also includes a compiled version of the DLL v2. - For more details please see www.ti.com/mspds - - The new CDC drivers and other imported information about the new UIF - firmware update could be found in MSP430_DLL_Devopers guide, which - is part of this packet. - - New device support: - CC430F6147 - 8 devices - -F6147, F6145, F6143, F5147, F5145, F5143, F5125, F5123 - - Known Limitations: - - LPMx.5 debugging is not fully functional. - - After wakeup from LPMx.5, MSP430_Run is not functional - Workaround: None - - If you unplug the USB FET during an active debug session, - the session could be interrupted and the IDE could stop working - - Cycle Counter not functional - Workaround: None - - EEM not fully supported (Trace/Sequencer/variable watch) - Workaround: None - - EEM Register Breakpoint not fully functional on CPUX derivatives - Workaround: None - - Stepping upper memory of an MSP430FG4619 is not fully functional - in certain cases - Workaround: None - - Old UIF version (v1.3) firmware update not fully automated due - to Hardware limitation - Workaround: An manual reset has to be done during major UIF - update. - - Clock Control not fully functional for AFE devices - Workaround: None +11/25/2011 Florian Berenbrinker + +New device support: +-- + None + +Bug Fixes: +-- + - LPMx.5 debug is now functional after wakeup from LPMx.5 + - MSP430-Run is working in combination with LPMx.5 + - EEM Register Breakpoint now fully functional on CPUX derivatives + - Fixed stepping issue in upper memory of MSP430FG4619 + - Clock Control now fully functional on AFE devices + +Known Limitations: +-- + - If you unplug the USB FET during an active debug session, + the session could be interrupted and the IDE could stop working + - Cycle Counter not functional + Workaround: None + - EEM not fully supported (Trace/Sequencer/variable watch) + Workaround: None + - Old UIF version (v1.3) firmware update not fully automated due + due to Hardware limitation + Workaround: An manual reset has to be done during major UIF + update + +Rev 3.2.1.009 ======================================================================== +10/18/2011 Florian Berenbrinker + + !NOTE this an all new DLL design! + The DLL version 3.2.1.9 is an all new DLL design compared to + the last DLL version 2.9.4.1. This new DLL includes also a new + UIF-Firmware. Furthermore the USB driver has been changed to a + certified CDC driver. + The DLL is implemented in C++ and follows a object base + design, which is host operating system independent . + The API of the new DLL is the same as for the old one. + DLL functionality keeps the same as in the old V2 DLL. + The new DLL V3 also includes a compiled version of the DLL v2. + For more details please see www.ti.com/mspds + + The new CDC drivers and other imported information about the new UIF + firmware update could be found in MSP430_DLL_Devopers guide, which + is part of this packet. + +New device support: +-- + - CC430F6147 - 8 devices + - F6147, F6145, F6143, F5147, F5145, F5143, F5125, F5123 + +Known Limitations: +-- + - LPMx.5 debugging is not fully functional. + - After wakeup from LPMx.5, MSP430_Run is not functional + Workaround: None + - If you unplug the USB FET during an active debug session, + the session could be interrupted and the IDE could stop working + - Cycle Counter not functional + Workaround: None + - EEM not fully supported (Trace/Sequencer/variable watch) + Workaround: None + - EEM Register Breakpoint not fully functional on CPUX derivatives + Workaround: None + - Stepping upper memory of an MSP430FG4619 is not fully functional + in certain cases + Workaround: None + - Old UIF version (v1.3) firmware update not fully automated due + to Hardware limitation + Workaround: An manual reset has to be done during major UIF + update. + - Clock Control not fully functional for AFE devices + Workaround: None